浏览代码

v4.30-9695-beta

dnobori 6 年之前
父节点
当前提交
55d1ac0402
共有 100 个文件被更改,包括 39648 次插入541 次删除
  1. 19 0
      WARNING.TXT
  2. 28 1
      src/BuildUtil/UnixBuildSoftwares.cs
  3. 20 0
      src/BuildUtil/VpnBuilder.cs
  4. 1 1
      src/BuildUtil/VpnBuilderConfig.cs
  5. 10 0
      src/BuildUtil/Win32BuildUtil.cs
  6. 1134 0
      src/Cedar/Admin.c
  7. 37 3
      src/Cedar/Admin.h
  8. 6 0
      src/Cedar/CM.c
  9. 8 7
      src/Cedar/Cedar.h
  10. 4 0
      src/Cedar/CedarType.h
  11. 49 23
      src/Cedar/Client.c
  12. 1 0
      src/Cedar/Client.h
  13. 9 0
      src/Cedar/Command.c
  14. 16 0
      src/Cedar/Connection.c
  15. 5 0
      src/Cedar/Connection.h
  16. 3 0
      src/Cedar/DDNS.c
  17. 2 0
      src/Cedar/DDNS.h
  18. 3 1
      src/Cedar/EtherLog.c
  19. 8 1
      src/Cedar/Hub.c
  20. 2 1
      src/Cedar/Hub.h
  21. 1 1
      src/Cedar/IPsec_EtherIP.c
  22. 25 3
      src/Cedar/IPsec_IPC.c
  23. 18 1
      src/Cedar/IPsec_IPC.h
  24. 5 3
      src/Cedar/IPsec_PPP.c
  25. 38 1
      src/Cedar/Interop_OpenVPN.c
  26. 1 0
      src/Cedar/Interop_OpenVPN.h
  27. 6 0
      src/Cedar/Listener.c
  28. 10 4
      src/Cedar/Nat.c
  29. 846 9
      src/Cedar/Protocol.c
  30. 105 0
      src/Cedar/Protocol.h
  31. 82 30
      src/Cedar/Radius.c
  32. 6 0
      src/Cedar/Radius.h
  33. 9 1
      src/Cedar/Remote.c
  34. 1 0
      src/Cedar/Remote.h
  35. 10 0
      src/Cedar/SM.c
  36. 1 0
      src/Cedar/SMInner.h
  37. 9 0
      src/Cedar/SW.c
  38. 79 26
      src/Cedar/Server.c
  39. 4 0
      src/Cedar/Server.h
  40. 35 20
      src/Cedar/Session.c
  41. 12 1
      src/Cedar/Session.h
  42. 219 101
      src/Cedar/UdpAccel.c
  43. 17 7
      src/Cedar/UdpAccel.h
  44. 2 2
      src/Cedar/VLanWin32.c
  45. 4 4
      src/CurrentBuild.txt
  46. 9861 0
      src/Ham/generated_manual_cn.html
  47. 1636 0
      src/Ham/generated_manual_ja.html
  48. 1058 5
      src/Mayaqua/Encrypt.c
  49. 26 0
      src/Mayaqua/Encrypt.h
  50. 6 0
      src/Mayaqua/FileIO.c
  51. 91 0
      src/Mayaqua/Kernel.c
  52. 2 0
      src/Mayaqua/Kernel.h
  53. 6 1
      src/Mayaqua/MayaType.h
  54. 80 1
      src/Mayaqua/Memory.c
  55. 6 0
      src/Mayaqua/Memory.h
  56. 54 0
      src/Mayaqua/Microsoft.c
  57. 3 0
      src/Mayaqua/Microsoft.h
  58. 467 116
      src/Mayaqua/Network.c
  59. 24 1
      src/Mayaqua/Network.h
  60. 922 72
      src/Mayaqua/Pack.c
  61. 65 19
      src/Mayaqua/Pack.h
  62. 2110 0
      src/Mayaqua/Str.c
  63. 255 0
      src/Mayaqua/Str.h
  64. 2 0
      src/Mayaqua/Table.c
  65. 23 0
      src/Mayaqua/Unix.c
  66. 1 0
      src/Mayaqua/Unix.h
  67. 0 2
      src/SEVPN.sln
  68. 50 14
      src/See/Packet.c
  69. 19 0
      src/WARNING.TXT
  70. 二进制
      src/bin/hamcore/DriverPackages/See/x64/See_x64.sys
  71. 二进制
      src/bin/hamcore/DriverPackages/See/x86/See_x86.sys
  72. 0 17
      src/bin/hamcore/lang.config
  73. 23 26
      src/bin/hamcore/openvpn_sample.ovpn
  74. 14 5
      src/bin/hamcore/strtable_cn.stb
  75. 16 6
      src/bin/hamcore/strtable_en.stb
  76. 5 4
      src/bin/hamcore/strtable_ja.stb
  77. 14648 0
      src/bin/hamcore/vpnserver_api_doc.html
  78. 2 0
      src/bin/hamcore/warning_cn.txt
  79. 2 0
      src/bin/hamcore/warning_en.txt
  80. 2 0
      src/bin/hamcore/warning_ja.txt
  81. 22 0
      src/bin/hamcore/wwwroot/admin/README.md
  82. 1 0
      src/bin/hamcore/wwwroot/admin/default/.gitignore
  83. 16 0
      src/bin/hamcore/wwwroot/admin/default/.vscode/launch.json
  84. 5 0
      src/bin/hamcore/wwwroot/admin/default/.vscode/settings.json
  85. 45 0
      src/bin/hamcore/wwwroot/admin/default/.vscode/tasks.json
  86. 23 0
      src/bin/hamcore/wwwroot/admin/default/hub.html
  87. 4 0
      src/bin/hamcore/wwwroot/admin/default/include_footer.html
  88. 9 0
      src/bin/hamcore/wwwroot/admin/default/include_head.html
  89. 29 0
      src/bin/hamcore/wwwroot/admin/default/include_menu.html
  90. 45 0
      src/bin/hamcore/wwwroot/admin/default/index.html
  91. 97 0
      src/bin/hamcore/wwwroot/admin/default/out_webpack/bundle.js
  92. 10 0
      src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts
  93. 1 0
      src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts.map
  94. 11 0
      src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts
  95. 1 0
      src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts.map
  96. 2 0
      src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts
  97. 1 0
      src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts.map
  98. 4709 0
      src/bin/hamcore/wwwroot/admin/default/package-lock.json
  99. 27 0
      src/bin/hamcore/wwwroot/admin/default/package.json
  100. 201 0
      src/bin/hamcore/wwwroot/admin/default/src/ts/main.ts

+ 19 - 0
WARNING.TXT

@@ -104,6 +104,25 @@ be disabled anytime by setting up so on the VPN-client side.
 
 
 2. VPN Software
+The notes in this section are not specific to SoftEther VPN or VPN Gate, but
+apply to general system software. SoftEther VPN Client, SoftEther VPN Server,
+SoftEther VPN Bridge, and VPN Gate Relay Service will be installed on your
+computer as system services. System services always run in the background.
+System services usually do not appear on the computer display. Then your
+computer system is booted, system services automatically start in the
+background even before you or other users log in. To check whether
+PacketiX-related system service is running, check the process list or the
+background service list of your OS (called as "Services" in Windows, or
+"Daemons" in UNIX.) You can activate, deactivate, start, or stop system
+services using the functions of the OS anytime. PacketiX-related GUI tools for
+managing system services communicate with these system services. After you
+terminate these management GUI tools, PacketiX-related system services will
+continue to run in the background. System services consume CPU time, computer
+power, memory and disk space. Because system services consume power, your
+electricity charges and amount of thermal of your computer increase as result.
+In addition, there is a possibility that the mechanical parts of the life of
+your computer is reduced.
+
 2.1. SoftEther VPN Client
 If you use SoftEther VPN Client on Windows, the Virtual Network Adapter device
 driver will be installed on Windows. The Virtual Network Adapter is

+ 28 - 1
src/BuildUtil/UnixBuildSoftwares.cs

@@ -694,6 +694,9 @@ namespace BuildUtil
 			sr.WriteLine("\t@echo \"You can choose your prefered language of {0} at any time.\"", BuildHelper.GetSoftwareTitle(this.Software));
 			sr.WriteLine("\t@echo \"To switch the current language, open and edit the 'lang.config' file.\"");
 
+			sr.WriteLine("\t@echo");
+			sr.WriteLine("\t@echo");
+			sr.WriteLine("\t@echo \"Note: the administrative password is not set on the VPN Server. Please set your own administrative password as soon as possible by vpncmd or the GUI manager.\"");
 			sr.WriteLine("\t@echo");
 			sr.WriteLine("\t@echo");
 
@@ -707,6 +710,7 @@ namespace BuildUtil
 			sr.WriteLine("\t@echo \"And please execute './vpncmd' to run the SoftEther VPN Command-Line Utility to configure {0}.\"", BuildHelper.GetSoftwareTitle(this.Software));
 #endif
 			sr.WriteLine("\t@echo");
+
 #if !BU_SOFTETHER
 			sr.WriteLine("\t@echo \"Of course, you can use the VPN Server Manager GUI Application for Windows on the other Windows PC in order to configure the {0} remotely.\"", BuildHelper.GetSoftwareTitle(this.Software));
 #else
@@ -715,7 +719,6 @@ namespace BuildUtil
 
 #if !BU_SOFTETHER
 #else
-			sr.WriteLine("\t@echo");
 			sr.WriteLine("\t@echo");
 			sr.WriteLine("\t@echo \"*** For Windows users ***\"");
 			sr.WriteLine("\t@echo \"You can download the SoftEther VPN Server Manager for Windows\"");
@@ -730,6 +733,30 @@ namespace BuildUtil
 			sr.WriteLine("\t@echo");
 #endif
 
+			sr.WriteLine("\t@echo");
+
+			sr.WriteLine("\t@echo");
+#if !BU_SOFTETHER
+			sr.WriteLine("\t@echo \"*** SoftEther VPN Server HTML5 Web Administration Console (NEW) ***\"");
+#else
+			sr.WriteLine("\t@echo \"*** PacketiX VPN Server HTML5 Web Administration Console (NEW) ***\"");
+#endif
+			sr.WriteLine("\t@echo \"This VPN Server / Bridge has the built-in HTML5 Web Administration Console.\"");
+			sr.WriteLine("\t@echo");
+			sr.WriteLine("\t@echo \"After you start the server daemon, you can open the HTML5 Web Administration Console is available at\"");
+			sr.WriteLine("\t@echo");
+#if !BU_SOFTETHER
+			sr.WriteLine("\t@echo \"https://127.0.0.1:8888/\"");
+			sr.WriteLine("\t@echo \"  or\"");
+			sr.WriteLine("\t@echo \"https://ip_address_of_the_vpn_server:8888/\"");
+#else
+			sr.WriteLine("\t@echo \"https://127.0.0.1:5555/\"");
+			sr.WriteLine("\t@echo \"or\"");
+			sr.WriteLine("\t@echo \"https://ip_address_of_the_vpn_server:5555/\"");
+#endif
+			sr.WriteLine("\t@echo");
+			sr.WriteLine("\t@echo \"This HTML5 page is obviously under construction, and your HTML5 development contribution is very appreciated.\"");
+			sr.WriteLine("\t@echo");
 
 			sr.WriteLine("\t@echo \"--------------------------------------------------------------------\"");
 			sr.WriteLine("\t@echo");

+ 20 - 0
src/BuildUtil/VpnBuilder.cs

@@ -552,6 +552,24 @@ namespace BuildUtil
 			}
 		}
 
+		// Delete node_modules file
+		public static void DeleteNodeModulesFilesFromHamCoreBuilder(HamCoreBuilder b)
+		{
+			List<string> removeFiles = new List<string>();
+			foreach (HamCoreBuilderFileEntry f in b.FileList)
+			{
+				string name = f.Name;
+				if (name.IndexOf(@"\node_modules\", StringComparison.InvariantCultureIgnoreCase) != -1)
+				{
+					removeFiles.Add(name);
+				}
+			}
+			foreach (string file in removeFiles)
+			{
+				b.DeleteFile(file);
+			}
+		}
+
 		// Build Hamcore file
 		public static void BuildHamcore()
 		{
@@ -594,6 +612,7 @@ namespace BuildUtil
 			Con.WriteLine("* Building hamcore ...");
 
 			DeleteSVNFilesFromHamCoreBuilder(b);
+			DeleteNodeModulesFilesFromHamCoreBuilder(b);
 
 			try
 			{
@@ -619,6 +638,7 @@ namespace BuildUtil
 			}
 
 			DeleteSVNFilesFromHamCoreBuilder(b);
+			DeleteNodeModulesFilesFromHamCoreBuilder(b);
 
 			try
 			{

+ 1 - 1
src/BuildUtil/VpnBuilderConfig.cs

@@ -421,7 +421,7 @@ namespace BuildUtil
 	{
 		// Windows
 		public static readonly OS Windows = new OS("windows", "Windows",
-			"Windows 98 / 98 SE / ME / NT 4.0 SP6a / 2000 SP4 / XP SP2, SP3 / Vista SP1, SP2 / 7 SP1 / 8 / 8.1 / 10 / Server 2003 SP2 / Server 2008 SP1, SP2 / Hyper-V Server 2008 / Server 2008 R2 SP1 / Hyper-V Server 2008 R2 / Server 2012 / Hyper-V Server 2012 / Server 2012 R2 / Hyper-V Server 2012 R2 / Server 2016",
+			"Windows 98 / 98 SE / ME / NT 4.0 SP6a / 2000 SP4 / XP SP2, SP3 / Vista SP1, SP2 / 7 SP1 / 8 / 8.1 / 10 / Server 2003 SP2 / Server 2008 SP1, SP2 / Hyper-V Server 2008 / Server 2008 R2 SP1 / Hyper-V Server 2008 R2 / Server 2012 / Hyper-V Server 2012 / Server 2012 R2 / Hyper-V Server 2012 R2 / Server 2016 / Server 2019",
 			new Cpu[]
 			{
 				CpuList.intel,

+ 10 - 0
src/BuildUtil/Win32BuildUtil.cs

@@ -581,6 +581,16 @@ namespace BuildUtil
 						return false;
 					}
 
+					if (Str.InStr(srcPath, @"\node_modules\", false))
+					{
+						return false;
+					}
+
+					if (Str.InStr(srcPath, @"\wwwroot\", false))
+					{
+						return true;
+					}
+
 					foreach (string ext in exts)
 					{
 						if (srcPath.EndsWith(ext, StringComparison.InvariantCultureIgnoreCase))

文件差异内容过多而无法显示
+ 1134 - 0
src/Cedar/Admin.c


+ 37 - 3
src/Cedar/Admin.h

@@ -129,6 +129,8 @@ struct ADMIN
 	LIST *LogFileList;			// Accessible log file list
 	UINT ClientBuild;			// Build number of the client
 	RPC_WINVER ClientWinVer;	// Windows version of client
+	UINT MaxJsonRpcRecvSize;	// Max JSON-RPC Receive Size
+	char dummy1[MAX_HUBNAME_LEN + 1];	// hubname buffer (dummy)
 };
 
 // Test
@@ -215,7 +217,8 @@ struct RPC_INT
 // Set Password
 struct RPC_SET_PASSWORD
 {
-	UCHAR HashedPassword[SHA1_SIZE];	// Hashed password
+	UCHAR HashedPassword[SHA1_SIZE];	// Hashed password (for traditional RPC)
+	char PlainTextPassword[MAX_SIZE];	// Plaintext password (for JSON-RPC)
 };
 
 // Server farm configuration *
@@ -228,6 +231,7 @@ struct RPC_FARM
 	char ControllerName[MAX_HOST_NAME_LEN + 1];	// Controller name
 	UINT ControllerPort;				// Controller port
 	UCHAR MemberPassword[SHA1_SIZE];	// Member password
+	char MemberPasswordPlaintext[MAX_SIZE];	// Member password (plaintext)
 	UINT Weight;						// Performance ratio
 	bool ControllerOnly;				// Only controller function
 };
@@ -333,6 +337,7 @@ struct RPC_CREATE_HUB
 	char HubName[MAX_HUBNAME_LEN + 1];	// HUB Name
 	UCHAR HashedPassword[SHA1_SIZE];	// Administrative password
 	UCHAR SecurePassword[SHA1_SIZE];	// Administrator password
+	char AdminPasswordPlainText[MAX_SIZE];	// Password (plaintext)
 	bool Online;						// Online flag
 	RPC_HUB_OPTION HubOption;			// HUB options
 	UINT HubType;						// Type of HUB
@@ -650,6 +655,7 @@ struct RPC_ENUM_SESSION_ITEM
 	char RemoteHostname[MAX_HOST_NAME_LEN + 1];		// Remote server name
 	char Username[MAX_USERNAME_LEN + 1];			// User name
 	UINT Ip;										// IP address (IPv4)
+	IP ClientIP;									// IP address (IPv4 / IPv6)
 	char Hostname[MAX_HOST_NAME_LEN	+ 1];			// Host name
 	UINT MaxNumTcp;									// Maximum number of TCP connections
 	UINT CurrentNumTcp;								// Number of currentl TCP connections
@@ -666,6 +672,8 @@ struct RPC_ENUM_SESSION_ITEM
 	bool IsDormantEnabled;							// Is the dormant state enabled
 	bool IsDormant;									// Is in the dormant state
 	UINT64 LastCommDormant;							// Last comm interval in the dormant state
+	UINT64 CreatedTime;								// Creation date and time
+	UINT64 LastCommTime;							// Last communication date and time
 };
 
 // Disconnect the session
@@ -702,8 +710,9 @@ struct RPC_ENUM_IP_TABLE_ITEM
 {
 	UINT Key;										// Key
 	char SessionName[MAX_SESSION_NAME_LEN + 1];		// Session name
-	UINT Ip;										// IP address
+	UINT Ip;										// IPv4 address
 	IP IpV6;										// IPv6 address
+	IP IpAddress;									// IPv4 / IPv6 Address
 	bool DhcpAllocated;								// Assigned by the DHCP
 	UINT64 CreatedTime;								// Creation date and time
 	UINT64 UpdatedTime;								// Updating date
@@ -990,6 +999,11 @@ struct RPC_AZURE_STATUS
 };
 
 
+// Constants
+#define ADMIN_RPC_MAX_POST_SIZE_BY_SERVER_ADMIN		MAX_PACK_SIZE
+#define ADMIN_RPC_MAX_POST_SIZE_BY_HUB_ADMIN		(8 * 1024 * 1024)
+
+
 // Function prototype
 UINT AdminAccept(CONNECTION *c, PACK *p);
 void HashAdminPassword(void *hash, char *password);
@@ -1014,6 +1028,26 @@ BUF *DownloadFileFromServer(RPC *r, char *server_name, char *filepath, UINT tota
 bool CheckAdminSourceAddress(SOCK *sock, char *hubname);
 void SiEnumSessionMain(SERVER *s, RPC_ENUM_SESSION *t);
 bool SiIsEmptyPassword(void *hash_password);
+void JsonRpcProcPost(CONNECTION *c, SOCK *s, HTTP_HEADER *h, UINT post_data_size);
+void JsonRpcProcGet(CONNECTION *c, SOCK *s, HTTP_HEADER *h, char *url_target);
+void JsonRpcProcOptions(CONNECTION *c, SOCK *s, HTTP_HEADER *h, char *url_target);
+JSON_VALUE *JsonRpcProcRequestObject(ADMIN *admin, CONNECTION *c, SOCK *s, JSON_VALUE *json_req, char *method_name);
+JSON_VALUE *JsonRpcNewError(int code, wchar_t *message);
+JSON_VALUE *JsonRpcNewResponse(PACK *p);
+bool HttpParseBasicAuthHeader(HTTP_HEADER *h, char *username, UINT username_size, char *password, UINT password_size);
+ADMIN *JsonRpcAuthLogin(CEDAR *c, SOCK *sock, HTTP_HEADER *h);
+JSON_VALUE *QueryStringToJsonListValue(char *qs);
+JSON_VALUE *ConstructDummyJsonRpcRequest(char *method_name, JSON_VALUE *p);
+void AdminWebProcPost(CONNECTION *c, SOCK *s, HTTP_HEADER *h, UINT post_data_size, char *url_target);
+void AdminWebProcGet(CONNECTION *c, SOCK *s, HTTP_HEADER *h, char *url_target);
+bool AdminWebHandleFileRequest(ADMIN *a, CONNECTION *c, SOCK *s, HTTP_HEADER *h, char *url_src, char *query_string, char *virtual_root_dir, char *physical_root_dir);
+BUF *AdminWebProcessServerSideInclude(BUF *src_txt, char *filename, UINT depth);
+bool AdminWebSendBody(SOCK *s, UINT status_code, char *status_string, UCHAR *data, UINT data_size, char *content_type, char *add_header_name, char *add_header_value, HTTP_HEADER *request_headers);
+bool AdminWebSend404Error(SOCK *s, HTTP_HEADER *request_headers);
+bool AdminWebSend302Redirect(SOCK *s, char *url, char *query_string, HTTP_HEADER *request_headers);
+BUF *AdminWebTryFindAndReadFile(char *vroot, char *proot, char *url, char *ret_filename, UINT ret_filename_size, bool *is_index_html);
+BUF *AdminWebTryOneFile(char *filename, char *ret_filename, UINT ret_filename_size);
+bool AdminWebSendUnauthorized(SOCK *s, HTTP_HEADER *http_request_headers);
 
 UINT StTest(ADMIN *a, RPC_TEST *t);
 UINT StGetServerInfo(ADMIN *a, RPC_SERVER_INFO *t);
@@ -1387,7 +1421,7 @@ void OutRpcAccess(PACK *p, ACCESS *a);
 void InRpcEnumAccessList(RPC_ENUM_ACCESS_LIST *a, PACK *p);
 void OutRpcEnumAccessList(PACK *p, RPC_ENUM_ACCESS_LIST *a);
 void FreeRpcEnumAccessList(RPC_ENUM_ACCESS_LIST *a);
-void *InRpcAuthData(PACK *p, UINT *authtype);
+void *InRpcAuthData(PACK *p, UINT *authtype, char *username);
 void OutRpcAuthData(PACK *p, void *authdata, UINT authtype);
 void FreeRpcAuthData(void *authdata, UINT authtype);
 void InRpcSetUser(RPC_SET_USER *t, PACK *p);

+ 6 - 0
src/Cedar/CM.c

@@ -9466,6 +9466,12 @@ void CmPrintStatusToListViewEx(LVB *b, RPC_CLIENT_GET_CONNECTION_STATUS *s, bool
 			LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_UNDERLAY_PROTOCOL"), tmp);
 		}
 
+		if (IsEmptyStr(s->ProtocolDetails) == false)
+		{
+			StrToUni(tmp, sizeof(tmp), s->ProtocolDetails);
+			LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_PROTOCOL_DETAILS"), tmp);
+		}
+
 		LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_UDP_ACCEL_ENABLED"), (s->IsUdpAccelerationEnabled ? _UU("CM_ST_YES") : _UU("CM_ST_NO")));
 		LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_UDP_ACCEL_USING"), (s->IsUsingUdpAcceleration ? _UU("CM_ST_YES") : _UU("CM_ST_NO")));
 

+ 8 - 7
src/Cedar/Cedar.h

@@ -126,10 +126,10 @@
 
 
 // Version number
-#define	CEDAR_VER					429
+#define	CEDAR_VER					430
 
 // Build Number
-#define	CEDAR_BUILD					9680
+#define	CEDAR_BUILD					9695
 
 // Beta number
 //#define	BETA_NUMBER					3
@@ -149,11 +149,11 @@
 
 // Specifies the build date
 #define	BUILD_DATE_Y		2019
-#define	BUILD_DATE_M		2
-#define	BUILD_DATE_D		28
-#define	BUILD_DATE_HO		18
-#define	BUILD_DATE_MI		39
-#define	BUILD_DATE_SE		47
+#define	BUILD_DATE_M		7
+#define	BUILD_DATE_D		7
+#define	BUILD_DATE_HO		19
+#define	BUILD_DATE_MI		58
+#define	BUILD_DATE_SE		8
 
 // Tolerable time difference
 #define	ALLOW_TIMESTAMP_DIFF		(UINT64)(3 * 24 * 60 * 60 * 1000)
@@ -438,6 +438,7 @@
 #define	AUTHTYPE_ROOTCERT				3			// Root certificate which is issued by trusted Certificate Authority
 #define	AUTHTYPE_RADIUS					4			// Radius authentication
 #define	AUTHTYPE_NT						5			// Windows NT authentication
+#define	AUTHTYPE_OPENVPN_CERT    		98			// TLS client certificate authentication
 #define	AUTHTYPE_TICKET					99			// Ticket authentication
 
 // Constant of the client side

+ 4 - 0
src/Cedar/CedarType.h

@@ -234,6 +234,9 @@ typedef struct BLACK BLACK;
 typedef struct SEND_SIGNATURE_PARAM SEND_SIGNATURE_PARAM;
 typedef struct UPDATE_CLIENT UPDATE_CLIENT;
 typedef struct UPDATE_CLIENT_SETTING UPDATE_CLIENT_SETTING;
+typedef struct HTTP_MIME_TYPE HTTP_MIME_TYPE;
+typedef struct WS WS;
+typedef struct WSP WSP;
 
 
 // ==============================================================
@@ -673,6 +676,7 @@ typedef struct IPC_ASYNC IPC_ASYNC;
 typedef struct IPC_PARAM IPC_PARAM;
 typedef struct IPC_DHCP_RELESAE_QUEUE IPC_DHCP_RELESAE_QUEUE;
 typedef struct IPC_MSCHAP_V2_AUTHINFO IPC_MSCHAP_V2_AUTHINFO;
+typedef struct IPC_SESSION_SHARED_BUFFER_DATA IPC_SESSION_SHARED_BUFFER_DATA;
 
 
 // ==============================================================

+ 49 - 23
src/Cedar/Client.c

@@ -4083,14 +4083,16 @@ void OutRpcClientEnumCa(PACK *p, RPC_CLIENT_ENUM_CA *e)
 
 	PackAddNum(p, "NumItem", e->NumItem);
 
+	PackSetCurrentJsonGroupName(p, "CAList");
 	for (i = 0;i < e->NumItem;i++)
 	{
 		RPC_CLIENT_ENUM_CA_ITEM *item = e->Items[i];
 		PackAddIntEx(p, "Key", item->Key, i, e->NumItem);
 		PackAddUniStrEx(p, "SubjectName", item->SubjectName, i, e->NumItem);
 		PackAddUniStrEx(p, "IssuerName", item->IssuerName, i, e->NumItem);
-		PackAddInt64Ex(p, "Expires", item->Expires, i, e->NumItem);
+		PackAddTime64Ex(p, "Expires", item->Expires, i, e->NumItem);
 	}
+	PackSetCurrentJsonGroupName(p, NULL);
 }
 
 // RPC_GET_ISSUER
@@ -4361,6 +4363,7 @@ void OutRpcClientEnumSecure(PACK *p, RPC_CLIENT_ENUM_SECURE *e)
 
 	PackAddNum(p, "NumItem", e->NumItem);
 
+	PackSetCurrentJsonGroupName(p, "SecureDeviceList");
 	for (i = 0;i < e->NumItem;i++)
 	{
 		RPC_CLIENT_ENUM_SECURE_ITEM *item = e->Items[i];
@@ -4370,6 +4373,7 @@ void OutRpcClientEnumSecure(PACK *p, RPC_CLIENT_ENUM_SECURE *e)
 		PackAddStrEx(p, "DeviceName", item->DeviceName, i, e->NumItem);
 		PackAddStrEx(p, "Manufacturer", item->Manufacturer, i, e->NumItem);
 	}
+	PackSetCurrentJsonGroupName(p, NULL);
 }
 
 // RPC_USE_SECURE
@@ -4453,11 +4457,13 @@ void OutRpcEnumObjectInSecure(PACK *p, RPC_ENUM_OBJECT_IN_SECURE *e)
 	PackAddNum(p, "NumItem", e->NumItem);
 	PackAddInt(p, "hWnd", e->hWnd);
 
+	PackSetCurrentJsonGroupName(p, "ObjectList");
 	for (i = 0;i < e->NumItem;i++)
 	{
 		PackAddStrEx(p, "ItemName", e->ItemName[i], i, e->NumItem);
 		PackAddIntEx(p, "ItemType", e->ItemType[i], i, e->NumItem);
 	}
+	PackSetCurrentJsonGroupName(p, NULL);
 }
 
 // RPC_CLIENT_CREATE_VLAN
@@ -4577,6 +4583,7 @@ void OutRpcClientEnumVLan(PACK *p, RPC_CLIENT_ENUM_VLAN *v)
 
 	PackAddNum(p, "NumItem", v->NumItem);
 
+	PackSetCurrentJsonGroupName(p, "VLanList");
 	for (i = 0;i < v->NumItem;i++)
 	{
 		RPC_CLIENT_ENUM_VLAN_ITEM *item = v->Items[i];
@@ -4586,6 +4593,7 @@ void OutRpcClientEnumVLan(PACK *p, RPC_CLIENT_ENUM_VLAN *v)
 		PackAddStrEx(p, "MacAddress", item->MacAddress, i, v->NumItem);
 		PackAddStrEx(p, "Version", item->Version, i, v->NumItem);
 	}
+	PackSetCurrentJsonGroupName(p, NULL);
 }
 
 // CLIENT_OPTION
@@ -4651,10 +4659,10 @@ void OutRpcClientOption(PACK *p, CLIENT_OPTION *c)
 	PackAddInt(p, "NumRetry", c->NumRetry);
 	PackAddInt(p, "RetryInterval", c->RetryInterval);
 	PackAddInt(p, "MaxConnection", c->MaxConnection);
-	PackAddInt(p, "UseEncrypt", c->UseEncrypt);
-	PackAddInt(p, "UseCompress", c->UseCompress);
-	PackAddInt(p, "HalfConnection", c->HalfConnection);
-	PackAddInt(p, "NoRoutingTracking", c->NoRoutingTracking);
+	PackAddBool(p, "UseEncrypt", c->UseEncrypt);
+	PackAddBool(p, "UseCompress", c->UseCompress);
+	PackAddBool(p, "HalfConnection", c->HalfConnection);
+	PackAddBool(p, "NoRoutingTracking", c->NoRoutingTracking);
 	PackAddInt(p, "AdditionalConnectionInterval", c->AdditionalConnectionInterval);
 	PackAddInt(p, "ConnectionDisconnectSpan", c->ConnectionDisconnectSpan);
 	PackAddBool(p, "HideStatusWindow", c->HideStatusWindow);
@@ -4866,6 +4874,7 @@ void OutRpcClientEnumAccount(PACK *p, RPC_CLIENT_ENUM_ACCOUNT *e)
 
 	PackAddNum(p, "NumItem", e->NumItem);
 
+	PackSetCurrentJsonGroupName(p, "AccountList");
 	for (i = 0;i < e->NumItem;i++)
 	{
 		RPC_CLIENT_ENUM_ACCOUNT_ITEM *item = e->Items[i];
@@ -4881,10 +4890,11 @@ void OutRpcClientEnumAccount(PACK *p, RPC_CLIENT_ENUM_ACCOUNT *e)
 		PackAddBoolEx(p, "Connected", item->Connected, i, e->NumItem);
 		PackAddIntEx(p, "Port", item->Port, i, e->NumItem);
 		PackAddStrEx(p, "HubName", item->HubName, i, e->NumItem);
-		PackAddInt64Ex(p, "CreateDateTime", item->CreateDateTime, i, e->NumItem);
-		PackAddInt64Ex(p, "UpdateDateTime", item->UpdateDateTime, i, e->NumItem);
-		PackAddInt64Ex(p, "LastConnectDateTime", item->LastConnectDateTime, i, e->NumItem);
+		PackAddTime64Ex(p, "CreateDateTime", item->CreateDateTime, i, e->NumItem);
+		PackAddTime64Ex(p, "UpdateDateTime", item->UpdateDateTime, i, e->NumItem);
+		PackAddTime64Ex(p, "LastConnectDateTime", item->LastConnectDateTime, i, e->NumItem);
 	}
+	PackSetCurrentJsonGroupName(p, NULL);
 }
 
 // RPC_CLIENT_DELETE_ACCOUNT
@@ -4998,9 +5008,9 @@ void OutRpcClientGetAccount(PACK *p, RPC_CLIENT_GET_ACCOUNT *c)
 
 	PackAddData(p, "ShortcutKey", c->ShortcutKey, SHA1_SIZE);
 
-	PackAddInt64(p, "CreateDateTime", c->CreateDateTime);
-	PackAddInt64(p, "UpdateDateTime", c->UpdateDateTime);
-	PackAddInt64(p, "LastConnectDateTime", c->LastConnectDateTime);
+	PackAddTime64(p, "CreateDateTime", c->CreateDateTime);
+	PackAddTime64(p, "UpdateDateTime", c->UpdateDateTime);
+	PackAddTime64(p, "LastConnectDateTime", c->LastConnectDateTime);
 }
 
 // RPC_CLIENT_CONNECT
@@ -5103,6 +5113,7 @@ void InRpcClientGetConnectionStatus(RPC_CLIENT_GET_CONNECTION_STATUS *s, PACK *p
 	s->UseCompress = PackGetInt(p, "UseCompress") ? true : false;
 	s->IsRUDPSession = PackGetInt(p, "IsRUDPSession") ? true : false;
 	PackGetStr(p, "UnderlayProtocol", s->UnderlayProtocol, sizeof(s->UnderlayProtocol));
+	PackGetStr(p, "ProtocolDetails", s->ProtocolDetails, sizeof(s->ProtocolDetails));
 	s->IsUdpAccelerationEnabled = PackGetInt(p, "IsUdpAccelerationEnabled") ? true : false;
 	s->IsUsingUdpAcceleration = PackGetInt(p, "IsUsingUdpAcceleration") ? true : false;
 
@@ -5148,32 +5159,33 @@ void OutRpcClientGetConnectionStatus(PACK *p, RPC_CLIENT_GET_CONNECTION_STATUS *
 
 	PackAddData(p, "SessionKey", c->SessionKey, SHA1_SIZE);
 
-	PackAddInt(p, "Active", c->Active);
-	PackAddInt(p, "Connected", c->Connected);
+	PackAddBool(p, "Active", c->Active);
+	PackAddBool(p, "Connected", c->Connected);
 	PackAddInt(p, "SessionStatus", c->SessionStatus);
 	PackAddInt(p, "ServerPort", c->ServerPort);
 	PackAddInt(p, "ServerProductVer", c->ServerProductVer);
 	PackAddInt(p, "ServerProductBuild", c->ServerProductBuild);
 	PackAddInt(p, "NumConnectionsEatablished", c->NumConnectionsEatablished);
-	PackAddInt(p, "HalfConnection", c->HalfConnection);
-	PackAddInt(p, "QoS", c->QoS);
+	PackAddBool(p, "HalfConnection", c->HalfConnection);
+	PackAddBool(p, "QoS", c->QoS);
 	PackAddInt(p, "MaxTcpConnections", c->MaxTcpConnections);
 	PackAddInt(p, "NumTcpConnections", c->NumTcpConnections);
 	PackAddInt(p, "NumTcpConnectionsUpload", c->NumTcpConnectionsUpload);
 	PackAddInt(p, "NumTcpConnectionsDownload", c->NumTcpConnectionsDownload);
-	PackAddInt(p, "UseEncrypt", c->UseEncrypt);
-	PackAddInt(p, "UseCompress", c->UseCompress);
-	PackAddInt(p, "IsRUDPSession", c->IsRUDPSession);
+	PackAddBool(p, "UseEncrypt", c->UseEncrypt);
+	PackAddBool(p, "UseCompress", c->UseCompress);
+	PackAddBool(p, "IsRUDPSession", c->IsRUDPSession);
 	PackAddStr(p, "UnderlayProtocol", c->UnderlayProtocol);
-	PackAddInt(p, "IsUdpAccelerationEnabled", c->IsUdpAccelerationEnabled);
-	PackAddInt(p, "IsUsingUdpAcceleration", c->IsUsingUdpAcceleration);
+	PackAddStr(p, "ProtocolDetails", c->ProtocolDetails);
+	PackAddBool(p, "IsUdpAccelerationEnabled", c->IsUdpAccelerationEnabled);
+	PackAddBool(p, "IsUsingUdpAcceleration", c->IsUsingUdpAcceleration);
 
 	PackAddBool(p, "IsBridgeMode", c->IsBridgeMode);
 	PackAddBool(p, "IsMonitorMode", c->IsMonitorMode);
 
-	PackAddInt64(p, "StartTime", c->StartTime);
-	PackAddInt64(p, "FirstConnectionEstablisiedTime", c->FirstConnectionEstablisiedTime);
-	PackAddInt64(p, "CurrentConnectionEstablishTime", c->CurrentConnectionEstablishTime);
+	PackAddTime64(p, "StartTime", c->StartTime);
+	PackAddTime64(p, "FirstConnectionEstablisiedTime", c->FirstConnectionEstablisiedTime);
+	PackAddTime64(p, "CurrentConnectionEstablishTime", c->CurrentConnectionEstablishTime);
 	PackAddInt64(p, "TotalSendSize", c->TotalSendSize);
 	PackAddInt64(p, "TotalRecvSize", c->TotalRecvSize);
 	PackAddInt64(p, "TotalSendSizeReal", c->TotalSendSizeReal);
@@ -6124,9 +6136,23 @@ void CiGetSessionStatus(RPC_CLIENT_GET_CONNECTION_STATUS *st, SESSION *s)
 				st->IsRUDPSession = s->IsRUDPSession;
 				// Physical communication protocol
 				StrCpy(st->UnderlayProtocol, sizeof(st->UnderlayProtocol), s->UnderlayProtocol);
+				// Protocol details
+				StrCpy(st->ProtocolDetails, sizeof(st->ProtocolDetails), s->ProtocolDetails);
+				Trim(st->ProtocolDetails);
 				// UDP acceleration function
 				st->IsUdpAccelerationEnabled = s->UseUdpAcceleration;
 				st->IsUsingUdpAcceleration = s->IsUsingUdpAcceleration;
+				if (s->IpcSessionShared != NULL && IsEmptyStr(s->IpcSessionShared->ProtocolDetails) == false)
+				{
+					char tmp[256];
+					StrCpy(tmp, sizeof(tmp), s->IpcSessionShared->ProtocolDetails);
+					Trim(tmp);
+					StrCat(st->ProtocolDetails, sizeof(st->ProtocolDetails), " ");
+					StrCat(st->ProtocolDetails, sizeof(st->ProtocolDetails), tmp);
+
+					st->IsUdpAccelerationEnabled = s->IpcSessionShared->EnableUdpAccel;
+					st->IsUsingUdpAcceleration = s->IpcSessionShared->UsingUdpAccel;
+				}
 				// Session key
 				Copy(st->SessionKey, s->SessionKey, SHA1_SIZE);
 				// Policy

+ 1 - 0
src/Cedar/Client.h

@@ -433,6 +433,7 @@ struct RPC_CLIENT_GET_CONNECTION_STATUS
 	bool UseCompress;						// Use of compression
 	bool IsRUDPSession;						// R-UDP session
 	char UnderlayProtocol[64];				// Physical communication protocol
+	char ProtocolDetails[256];				// Protocol Details
 	bool IsUdpAccelerationEnabled;			// The UDP acceleration is enabled
 	bool IsUsingUdpAcceleration;			// Using the UDP acceleration function
 	char SessionName[MAX_SESSION_NAME_LEN + 1];	// Session name

+ 9 - 0
src/Cedar/Command.c

@@ -14494,6 +14494,12 @@ void CmdPrintStatusToListViewEx(CT *ct, RPC_CLIENT_GET_CONNECTION_STATUS *s, boo
 			CtInsert(ct, _UU("CM_ST_UNDERLAY_PROTOCOL"), tmp);
 		}
 
+		if (IsEmptyStr(s->ProtocolDetails) == false)
+		{
+			StrToUni(tmp, sizeof(tmp), s->ProtocolDetails);
+			CtInsert(ct, _UU("CM_ST_PROTOCOL_DETAILS"), tmp);
+		}
+
 		CtInsert(ct, _UU("CM_ST_UDP_ACCEL_ENABLED"), (s->IsUdpAccelerationEnabled ? _UU("CM_ST_YES") : _UU("CM_ST_NO")));
 		CtInsert(ct, _UU("CM_ST_UDP_ACCEL_USING"), (s->IsUsingUdpAcceleration ? _UU("CM_ST_YES") : _UU("CM_ST_NO")));
 
@@ -21663,6 +21669,9 @@ UINT PsLicenseAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
 
 	FreeParamValueList(o);
 
+	c->Write(c, _UU("SM_LICENSE_WARNING"));
+	c->Write(c, L"\n");
+
 	return 0;
 }
 

+ 16 - 0
src/Cedar/Connection.c

@@ -1267,6 +1267,8 @@ void ConnectionSend(CONNECTION *c, UINT64 now)
 										s->TotalSendSizeReal += b->Size;
 
 										c->CurrentSendQueueSize -= b->Size;
+
+										Free(new_buf);
 									}
 
 									FreeBlock(b);
@@ -1861,6 +1863,18 @@ void ConnectionReceive(CONNECTION *c, CANCEL *c1, CANCEL *c2)
 			{
 				TUBE *t = sock->BulkRecvTube;
 
+				//for testing purpose
+				//if (sock->test_tmp1 == 0) sock->test_tmp1 = now;
+				//if ((sock->test_tmp1 + 5000ULL) <= now)
+				//{
+				//	// bugbug
+				//	if (c->ServerMode == false)
+				//	{
+				//		WHERE;
+				//		Disconnect(sock);
+				//	}
+				//}
+
 				if (s->EnableBulkOnRUDP)
 				{
 					// R-UDP bulk transfer data reception
@@ -2789,6 +2803,8 @@ BLOCK *NewBlock(void *data, UINT size, int compress)
 
 	b = MallocFast(sizeof(BLOCK));
 
+	b->RawFlagRetUdpAccel = 0;
+
 	b->IsFlooding = false;
 
 	b->PriorityQoS = b->Ttl = b->Param1 = 0;

+ 5 - 0
src/Cedar/Connection.h

@@ -252,6 +252,7 @@ struct BLOCK
 	UINT Ttl;						// TTL value (Used only in ICMP NAT of Virtual.c)
 	UINT Param1;					// Parameter 1
 	bool IsFlooding;				// Is flooding packet
+	UCHAR RawFlagRetUdpAccel;		// Raw flag returned by UDP accel
 };
 
 // Connection structure
@@ -305,6 +306,7 @@ struct CONNECTION
 	void *hWndForUI;				// Parent window
 	bool IsInProc;					// In-process
 	char InProcPrefix[64];			// Prefix
+	UINT InProcLayer;				// InProc layer
 	UINT AdditionalConnectionFailedCounter;		// Additional connection failure counter
 	UINT64 LastCounterResetTick;	// Time the counter was reset finally
 	bool WasSstp;					// Processed the SSTP
@@ -314,6 +316,9 @@ struct CONNECTION
 	UINT LastPacketQueueSize;		// The last queue size of packets
 	UINT LastRecvFifoTotalSize;		// The last RecvFifo total size
 	UINT LastRecvBlocksNum;			// The last ReceivedBlocks num
+	bool IsJsonRpc;					// Is JSON-RPC
+	bool JsonRpcAuthed;				// JSON-RPC Authed
+	LISTENER *Listener;				// Listener ref
 };
 
 

+ 3 - 0
src/Cedar/DDNS.c

@@ -134,6 +134,9 @@ void DCGetStatus(DDNS_CLIENT *c, DDNS_CLIENT_STATUS *st)
 		Copy(&st->InternetSetting, &c->InternetSetting, sizeof(INTERNET_SETTING));
 	}
 	Unlock(c->Lock);
+
+	UniStrCpy(st->ErrStr_IPv4, sizeof(st->ErrStr_IPv4), _E(st->Err_IPv4));
+	UniStrCpy(st->ErrStr_IPv6, sizeof(st->ErrStr_IPv6), _E(st->Err_IPv6));
 }
 
 // Set the Internet settings

+ 2 - 0
src/Cedar/DDNS.h

@@ -208,6 +208,8 @@ struct DDNS_REGISTER_PARAM
 struct DDNS_CLIENT_STATUS
 {
 	UINT Err_IPv4, Err_IPv6;				// Last error
+	wchar_t ErrStr_IPv4[MAX_SIZE];
+	wchar_t ErrStr_IPv6[MAX_SIZE];
 	char CurrentHostName[DDNS_MAX_HOSTNAME + 1];	// Current host name
 	char CurrentFqdn[MAX_SIZE];				// Current FQDN
 	char DnsSuffix[MAX_SIZE];				// DNS suffix

+ 3 - 1
src/Cedar/EtherLog.c

@@ -662,6 +662,7 @@ void OutRpcEnumDevice(PACK *p, RPC_ENUM_DEVICE *t)
 
 	PackAddInt(p, "NumItem", t->NumItem);
 
+	PackSetCurrentJsonGroupName(p, "DeviceList");
 	for (i = 0;i < t->NumItem;i++)
 	{
 		RPC_ENUM_DEVICE_ITEM *d = &t->Items[i];
@@ -669,6 +670,7 @@ void OutRpcEnumDevice(PACK *p, RPC_ENUM_DEVICE *t)
 		PackAddStrEx(p, "DeviceName", d->DeviceName, i, t->NumItem);
 		PackAddBoolEx(p, "Active", d->Active, i, t->NumItem);
 	}
+	PackSetCurrentJsonGroupName(p, NULL);
 
 	PackAddBool(p, "IsLicenseSupported", t->IsLicenseSupported);
 }
@@ -709,7 +711,7 @@ void OutRpcElLicenseStatus(PACK *p, RPC_EL_LICENSE_STATUS *t)
 
 	PackAddBool(p, "Valid", t->Valid);
 	PackAddInt64(p, "SystemId", t->SystemId);
-	PackAddInt64(p, "SystemExpires", t->SystemExpires);
+	PackAddTime64(p, "SystemExpires", t->SystemExpires);
 }
 
 // Listener thread

+ 8 - 1
src/Cedar/Hub.c

@@ -159,7 +159,7 @@ UINT num_admin_options = sizeof(admin_options) / sizeof(ADMIN_OPTION);
 
 
 // Create an EAP client for the specified Virtual Hub
-EAP_CLIENT *HubNewEapClient(CEDAR *cedar, char *hubname, char *client_ip_str, char *username)
+EAP_CLIENT *HubNewEapClient(CEDAR *cedar, char *hubname, char *client_ip_str, char *username, char *vpn_protocol_state_str)
 {
 	HUB *hub = NULL;
 	EAP_CLIENT *ret = NULL;
@@ -209,6 +209,11 @@ EAP_CLIENT *HubNewEapClient(CEDAR *cedar, char *hubname, char *client_ip_str, ch
 
 							if (eap != NULL)
 							{
+								if (IsEmptyStr(vpn_protocol_state_str) == false)
+								{
+									StrCpy(eap->In_VpnProtocolState, sizeof(eap->In_VpnProtocolState), vpn_protocol_state_str);
+								}
+
 								if (use_peap == false)
 								{
 									// EAP
@@ -778,6 +783,8 @@ void HubOptionStructToData(RPC_ADMIN_OPTION *ao, HUB_OPTION *o, char *hub_name)
 	{
 		ADMIN_OPTION *a = LIST_DATA(aol, i);
 
+		UniStrCpy(a->Descrption, sizeof(a->Descrption), GetHubAdminOptionHelpString(a->Name));
+
 		Copy(&ao->Items[i], a, sizeof(ADMIN_OPTION));
 
 		Free(a);

+ 2 - 1
src/Cedar/Hub.h

@@ -384,6 +384,7 @@ struct ADMIN_OPTION
 {
 	char Name[MAX_ADMIN_OPTION_NAME_LEN + 1];	// Name
 	UINT Value;									// Data
+	wchar_t Descrption[MAX_SIZE];				// Descrption
 };
 
 // Certificate Revocation List entry
@@ -634,7 +635,7 @@ void CalcTrafficDiff(TRAFFIC *diff, TRAFFIC *old, TRAFFIC *current);
 bool CheckMaxLoggedPacketsPerMinute(SESSION *s, UINT max_packets, UINT64 now);
 void VgsSetUserAgentValue(char *str);
 void VgsSetEmbTag(bool b);
-EAP_CLIENT *HubNewEapClient(CEDAR *cedar, char *hubname, char *client_ip_str, char *username);
+EAP_CLIENT *HubNewEapClient(CEDAR *cedar, char *hubname, char *client_ip_str, char *username, char *vpn_protocol_state_str);
 
 #endif	// HUB_H
 

+ 1 - 1
src/Cedar/IPsec_EtherIP.c

@@ -161,7 +161,7 @@ void EtherIPIpcConnectThread(THREAD *t, void *p)
 			&s->ClientIP, s->ClientPort,
 			&s->ServerIP, s->ServerPort,
 			tmp,
-			s->CryptName, true, mss, NULL);
+			s->CryptName, true, mss, NULL, NULL, IPC_LAYER_2);
 
 		if (ipc != NULL)
 		{

+ 25 - 3
src/Cedar/IPsec_IPC.c

@@ -314,7 +314,7 @@ IPC *NewIPCByParam(CEDAR *cedar, IPC_PARAM *param, UINT *error_code)
 		param->UserName, param->Password, error_code, &param->ClientIp,
 		param->ClientPort, &param->ServerIp, param->ServerPort,
 		param->ClientHostname, param->CryptName,
-		param->BridgeMode, param->Mss, NULL);
+		param->BridgeMode, param->Mss, NULL, param->ClientCertificate, param->Layer);
 
 	return ipc;
 }
@@ -323,7 +323,8 @@ IPC *NewIPCByParam(CEDAR *cedar, IPC_PARAM *param, UINT *error_code)
 IPC *NewIPC(CEDAR *cedar, char *client_name, char *postfix, char *hubname, char *username, char *password,
 			UINT *error_code, IP *client_ip, UINT client_port, IP *server_ip, UINT server_port,
 			char *client_hostname, char *crypt_name,
-			bool bridge_mode, UINT mss, EAP_CLIENT *eap_client)
+			bool bridge_mode, UINT mss, EAP_CLIENT *eap_client, X *client_certificate,
+			UINT layer)
 {
 	IPC *ipc;
 	UINT dummy_int = 0;
@@ -338,6 +339,7 @@ IPC *NewIPC(CEDAR *cedar, char *client_name, char *postfix, char *hubname, char
 	NODE_INFO info;
 	BUF *b;
 	UCHAR mschap_v2_server_response_20[20];
+	UINT64 u64;
 	// Validate arguments
 	if (cedar == NULL || username == NULL || password == NULL || client_hostname == NULL)
 	{
@@ -371,6 +373,12 @@ IPC *NewIPC(CEDAR *cedar, char *client_name, char *postfix, char *hubname, char
 	ipc->Cedar = cedar;
 	AddRef(cedar->ref);
 
+	ipc->Layer = layer;
+	if (ipc->Layer == 0)
+	{
+		ipc->Layer = IPC_LAYER_2;
+	}
+
 	ipc->FlushList = NewTubeFlushList();
 
 	StrCpy(ipc->ClientHostname, sizeof(ipc->ClientHostname), client_hostname);
@@ -416,7 +424,14 @@ IPC *NewIPC(CEDAR *cedar, char *client_name, char *postfix, char *hubname, char
 	FreePack(p);
 
 	// Upload the authentication data
-	p = PackLoginWithPlainPassword(hubname, username, password);
+	if (client_certificate != NULL)
+	{
+		p = PackLoginWithOpenVPNCertificate(hubname, username, client_certificate);
+	}
+	else
+	{
+		p = PackLoginWithPlainPassword(hubname, username, password);
+	}
 	PackAddStr(p, "hello", client_name);
 	PackAddInt(p, "client_ver", cedar->Version);
 	PackAddInt(p, "client_build", cedar->Build);
@@ -451,6 +466,7 @@ IPC *NewIPC(CEDAR *cedar, char *client_name, char *postfix, char *hubname, char
 
 	PackAddStr(p, "inproc_postfix", postfix);
 	PackAddStr(p, "inproc_cryptname", crypt_name);
+	PackAddInt(p, "inproc_layer", ipc->Layer);
 
 	// Node information
 	Zero(&info, sizeof(info));
@@ -532,6 +548,10 @@ IPC *NewIPC(CEDAR *cedar, char *client_name, char *postfix, char *hubname, char
 
 	Debug("IPC: Session = %s, Connection = %s, Mac = %s\n", ipc->SessionName, ipc->ConnectionName, macstr);
 
+	u64 = PackGetInt64(p, "IpcSessionSharedBuffer");
+	ipc->IpcSessionSharedBuffer = (SHARED_BUFFER *)u64;
+	ipc->IpcSessionShared = ipc->IpcSessionSharedBuffer->Data;
+
 	FreePack(p);
 
 	ReleaseSock(a);
@@ -665,6 +685,8 @@ void FreeIPC(IPC *ipc)
 	}
 
 	ReleaseQueue(ipc->IPv4RecviedQueue);
+	
+	ReleaseSharedBuffer(ipc->IpcSessionSharedBuffer);
 
 	Free(ipc);
 }

+ 18 - 1
src/Cedar/IPsec_IPC.h

@@ -119,6 +119,9 @@
 
 #define	IPC_PASSWORD_MSCHAPV2_TAG		"xH7DiNlurDhcYV4a:"
 
+#define IPC_LAYER_2						2
+#define IPC_LAYER_3						3
+
 // ARP table entry
 struct IPC_ARP
 {
@@ -138,6 +141,14 @@ struct IPC_DHCP_RELESAE_QUEUE
 	UCHAR MacAddress[6];
 };
 
+// IPC_SESSION_SHARED_BUFFER_DATA
+struct IPC_SESSION_SHARED_BUFFER_DATA
+{
+	char ProtocolDetails[256];		// Protocol Details
+	bool EnableUdpAccel;
+	bool UsingUdpAccel;
+};
+
 // IPC_PARAM
 struct IPC_PARAM
 {
@@ -156,6 +167,8 @@ struct IPC_PARAM
 	UINT Mss;
 	bool IsL3Mode;
 	bool IsOpenVPN;
+	X *ClientCertificate;
+	UINT Layer;
 };
 
 // IPC_ASYNC object
@@ -200,6 +213,9 @@ struct IPC
 	TUBE_FLUSH_LIST *FlushList;			// Tube Flush List
 	UCHAR MsChapV2_ServerResponse[20];	// Server response
 	DHCP_CLASSLESS_ROUTE_TABLE ClasslessRoute;	// Classless routing table
+	SHARED_BUFFER *IpcSessionSharedBuffer;	// A shared buffer between IPC and Session
+	IPC_SESSION_SHARED_BUFFER_DATA *IpcSessionShared;	// A shared data between IPC and Session
+	UINT Layer;
 };
 
 // MS-CHAPv2 authentication information
@@ -215,7 +231,8 @@ struct IPC_MSCHAP_V2_AUTHINFO
 IPC *NewIPC(CEDAR *cedar, char *client_name, char *postfix, char *hubname, char *username, char *password,
 			UINT *error_code, IP *client_ip, UINT client_port, IP *server_ip, UINT server_port,
 			char *client_hostname, char *crypt_name,
-			bool bridge_mode, UINT mss, EAP_CLIENT *eap_client);
+			bool bridge_mode, UINT mss, EAP_CLIENT *eap_client, X *client_certificate,
+			UINT layer);
 IPC *NewIPCByParam(CEDAR *cedar, IPC_PARAM *param, UINT *error_code);
 IPC *NewIPCBySock(CEDAR *cedar, SOCK *s, void *mac_address);
 void FreeIPC(IPC *ipc);

+ 5 - 3
src/Cedar/IPsec_PPP.c

@@ -299,7 +299,7 @@ void PPPThread(THREAD *thread, void *param)
 
 						IPToStr(client_ip_tmp, sizeof(client_ip_tmp), &p->ClientIP);
 
-						eap = HubNewEapClient(p->Cedar, hub, client_ip_tmp, id);
+						eap = HubNewEapClient(p->Cedar, hub, client_ip_tmp, id, "L3:PPP");
 
 						if (eap)
 						{
@@ -1009,7 +1009,8 @@ PPP_PACKET *PPPProcessRequestPacket(PPP_SESSION *p, PPP_PACKET *req)
 					// Attempt to connect with IPC
 					ipc = NewIPC(p->Cedar, p->ClientSoftwareName, p->Postfix, hub, id, password,
 						&error_code, &p->ClientIP, p->ClientPort, &p->ServerIP, p->ServerPort,
-						p->ClientHostname, p->CryptName, false, p->AdjustMss, p->EapClient);
+						p->ClientHostname, p->CryptName, false, p->AdjustMss, p->EapClient, NULL,
+						IPC_LAYER_3);
 
 					if (ipc != NULL)
 					{
@@ -1142,7 +1143,8 @@ PPP_PACKET *PPPProcessRequestPacket(PPP_SESSION *p, PPP_PACKET *req)
 
 								ipc = NewIPC(p->Cedar, p->ClientSoftwareName, p->Postfix, hub, id, password,
 									&error_code, &p->ClientIP, p->ClientPort, &p->ServerIP, p->ServerPort,
-									p->ClientHostname, p->CryptName, false, p->AdjustMss, NULL);
+									p->ClientHostname, p->CryptName, false, p->AdjustMss, NULL, NULL,
+									IPC_LAYER_3);
 
 								if (ipc != NULL)
 								{

+ 38 - 1
src/Cedar/Interop_OpenVPN.c

@@ -433,7 +433,8 @@ void OvsProcessRecvControlPacket(OPENVPN_SERVER *s, OPENVPN_SESSION *se, OPENVPN
 			// Create an SSL pipe
 			Lock(s->Cedar->lock);
 			{
-				c->SslPipe = NewSslPipe(true, s->Cedar->ServerX, s->Cedar->ServerK, s->Dh);
+				bool cert_verify = true;
+				c->SslPipe = NewSslPipeEx(true, s->Cedar->ServerX, s->Cedar->ServerK, s->Dh, cert_verify, &c->ClientCert);
 			}
 			Unlock(s->Cedar->lock);
 
@@ -703,8 +704,19 @@ void OvsBeginIPCAsyncConnectionIfEmpty(OPENVPN_SERVER *s, OPENVPN_SESSION *se, O
 			p.BridgeMode = true;
 		}
 
+		if (IsEmptyStr(c->ClientKey.Username) || IsEmptyStr(c->ClientKey.Password))
+		{
+			// OpenVPN X.509 certificate authentication is used only when no username / password is specified
+			if (c->ClientCert.X != NULL)
+			{
+				p.ClientCertificate = c->ClientCert.X;
+			}
+		}
+
 		p.IsOpenVPN = true;
 
+		p.Layer = (se->Mode == OPENVPN_MODE_L2) ? IPC_LAYER_2 : IPC_LAYER_3;
+
 		// Calculate the MSS
 		p.Mss = OvsCalcTcpMss(s, se, c);
 		Debug("MSS=%u\n", p.Mss);
@@ -771,6 +783,26 @@ void OvsSetupSessionParameters(OPENVPN_SERVER *s, OPENVPN_SESSION *se, OPENVPN_C
 
 	OvsLog(s, se, c, "LO_OPTION_STR_RECV", data->OptionString);
 
+	if (c->ClientCert.X != NULL)
+	{
+		if (c->ClientCert.X->subject_name != NULL)
+		{
+			OvsLog(s, se, c, "LO_CLIENT_CERT", c->ClientCert.X->subject_name->CommonName);
+		}
+		else
+		{
+			OvsLog(s, se, c, "LO_CLIENT_CERT", "(unknown CN)");
+		}
+	}
+	else if (!c->ClientCert.PreverifyErr)
+	{
+		OvsLog(s, se, c, "LO_CLIENT_NO_CERT");
+	}
+	else
+	{
+		OvsLog(s, se, c, "LO_CLIENT_UNVERIFIED_CERT", c->ClientCert.PreverifyErrMessage);
+	}
+
 	Zero(opt_str, sizeof(opt_str));
 	StrCpy(opt_str, sizeof(opt_str), data->OptionString);
 	if (s->Cedar != NULL && (IsEmptyStr(opt_str) || StartWith(opt_str, "V0 UNDEF") || InStr(opt_str, ",") == false))
@@ -1350,6 +1382,11 @@ void OvsFreeChannel(OPENVPN_CHANNEL *c)
 	FreeMd(c->MdRecv);
 	FreeMd(c->MdSend);
 
+	if (c->ClientCert.X != NULL)
+	{
+		FreeX(c->ClientCert.X);
+	}
+
 	Free(c);
 }
 

+ 1 - 0
src/Cedar/Interop_OpenVPN.h

@@ -248,6 +248,7 @@ struct OPENVPN_CHANNEL
 	bool IsInitiatorServer;								// Whether the channel was started from the server side
 	bool RekeyInitiated;								// Whether re-keying has already started
 	UINT64 NextRekey;
+	struct SslClientCertInfo ClientCert;                // Client certificate and verification data
 };
 
 // OpenVPN session

+ 6 - 0
src/Cedar/Listener.c

@@ -247,6 +247,9 @@ void TCPAcceptedThread(THREAD *t, void *param)
 	// Create a connection
 	c = NewServerConnection(r->Cedar, s, t);
 
+	AddRef(r->ref);
+	c->Listener = r;
+
 	// Register to Cedar as a transient connection
 	AddConnection(c->Cedar, c);
 
@@ -264,8 +267,11 @@ void TCPAcceptedThread(THREAD *t, void *param)
 	ConnectionAccept(c);
 	flag1 = c->flag1;
 
+
 	// Release
 	SLog(r->Cedar, "LS_CONNECTION_END_1", c->Name);
+	ReleaseListener(c->Listener);
+	c->Listener = NULL;
 	ReleaseConnection(c);
 
 	// Release

+ 10 - 4
src/Cedar/Nat.c

@@ -895,18 +895,21 @@ void OutRpcEnumDhcp(PACK *p, RPC_ENUM_DHCP *t)
 	PackAddInt(p, "NumItem", t->NumItem);
 	PackAddStr(p, "HubName", t->HubName);
 
+	PackSetCurrentJsonGroupName(p, "DhcpTable");
+
 	for (i = 0;i < t->NumItem;i++)
 	{
 		RPC_ENUM_DHCP_ITEM *e = &t->Items[i];
 
 		PackAddIntEx(p, "Id", e->Id, i, t->NumItem);
-		PackAddInt64Ex(p, "LeasedTime", e->LeasedTime, i, t->NumItem);
-		PackAddInt64Ex(p, "ExpireTime", e->ExpireTime, i, t->NumItem);
+		PackAddTime64Ex(p, "LeasedTime", e->LeasedTime, i, t->NumItem);
+		PackAddTime64Ex(p, "ExpireTime", e->ExpireTime, i, t->NumItem);
 		PackAddDataEx(p, "MacAddress", e->MacAddress, 6, i, t->NumItem);
 		PackAddIp32Ex(p, "IpAddress", e->IpAddress, i, t->NumItem);
 		PackAddIntEx(p, "Mask", e->Mask, i, t->NumItem);
 		PackAddStrEx(p, "Hostname", e->Hostname, i, t->NumItem);
 	}
+	PackSetCurrentJsonGroupName(p, NULL);
 }
 void FreeRpcEnumDhcp(RPC_ENUM_DHCP *t)
 {
@@ -963,6 +966,8 @@ void OutRpcEnumNat(PACK *p, RPC_ENUM_NAT *t)
 
 	PackAddInt(p, "NumItem", t->NumItem);
 	PackAddStr(p, "HubName", t->HubName);
+
+	PackSetCurrentJsonGroupName(p, "NatTable");
 	for (i = 0;i < t->NumItem;i++)
 	{
 		RPC_ENUM_NAT_ITEM *e = &t->Items[i];
@@ -975,12 +980,13 @@ void OutRpcEnumNat(PACK *p, RPC_ENUM_NAT *t)
 		PackAddIp32Ex(p, "DestIp", e->DestIp, i, t->NumItem);
 		PackAddStrEx(p, "DestHost", e->DestHost, i, t->NumItem);
 		PackAddIntEx(p, "DestPort", e->DestPort, i, t->NumItem);
-		PackAddInt64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumItem);
-		PackAddInt64Ex(p, "LastCommTime", e->LastCommTime, i, t->NumItem);
+		PackAddTime64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumItem);
+		PackAddTime64Ex(p, "LastCommTime", e->LastCommTime, i, t->NumItem);
 		PackAddInt64Ex(p, "SendSize", e->SendSize, i, t->NumItem);
 		PackAddInt64Ex(p, "RecvSize", e->RecvSize, i, t->NumItem);
 		PackAddIntEx(p, "TcpStatus", e->TcpStatus, i, t->NumItem);
 	}
+	PackSetCurrentJsonGroupName(p, NULL);
 }
 void FreeRpcEnumNat(RPC_ENUM_NAT *t)
 {

文件差异内容过多而无法显示
+ 846 - 9
src/Cedar/Protocol.c


+ 105 - 0
src/Cedar/Protocol.h

@@ -105,6 +105,13 @@
 #ifndef	PROTOCOL_H
 #define	PROTOCOL_H
 
+// MIME types
+struct HTTP_MIME_TYPE
+{
+	char *Extension;
+	char *MimeType;
+};
+
 // The parameters that will be passed to the certificate confirmation thread
 struct CHECK_CERT_THREAD_PROC
 {
@@ -195,6 +202,73 @@ struct UPDATE_CLIENT
 #define	PROTO_SUPPRESS_CLIENT_UPDATE_NOTIFICATION_REGKEY	"Software\\" GC_REG_COMPANY_NAME "\\" CEDAR_PRODUCT_STR " VPN\\Client Update Notification"
 #define	PROTO_SUPPRESS_CLIENT_UPDATE_NOTIFICATION_REGVALUE	"Suppress"
 
+// WebSocket
+struct WS
+{
+	SOCK *Sock;
+	WSP *Wsp;
+	REF *Ref;
+	bool Disconnected;
+	UINT MaxBufferSize;
+	UCHAR TmpBuf[65536];
+};
+
+// WebSocket Protocol
+struct WSP
+{
+	UINT MaxBufferSize;
+	FIFO *PhysicalSendFifo;		// WSP -> Network
+	FIFO *PhysicalRecvFifo;		// WSP <- Network
+	FIFO *AppSendFifo;			// APP -> WSP
+	FIFO *AppRecvFifo;			// APP <- WSP
+	bool HasError;
+};
+
+// WebSocket constants
+#define WS_MAX_PAYLOAD_LEN_PER_FRAME	(8 * 1024 * 1024)
+#define WS_SEND_SINGLE_FRAGMENT_SIZE	(32 * 1024)
+
+#define WS_OPCODE_CONTINUE		0x00
+#define WS_OPCODE_TEXT			0x01
+#define WS_OPCODE_BIN			0x02
+#define WS_OPCODE_CLOSE			0x08
+#define WS_OPCODE_PING			0x09
+#define WS_OPCODE_PONG			0x0A
+
+// MVPN constants
+#define MVPN_VERSION_MIN			100
+#define MVPN_VERSION_CURRENT		100
+#define MVPN_MAX_AUTH_RETRY			10
+#define	MVPN_CLIENT_NAME			"Modern VPN Client"
+#define	NVPN_POSTFIX				"MVPN"
+
+// MVPN protocol constants
+#define MVPN_AUTHTYPE_ANONYMOUS				"anonymous"
+#define MVPN_AUTHTYPE_PASSWORD_PLAIN		"password_plain"
+#define MVPN_AUTHTYPE_PASSWORD_MSCHAPV2		"password_mschapv2"
+#define MVPN_AUTHTYPE_CERT					"x509cert"
+
+#define MVPN_HEARTBEAT_INTERVAL_DEFAULT		1234
+#define	MVPN_HEARTBEAT_INTERVAL_MIN			100
+#define	MVPN_HEARTBEAT_INTERVAL_MAX			15000
+
+#define MVPN_DISCONNECT_TIMEOUT_DEFAULT		15000
+#define MVPN_DISCONNECT_TIMEOUT_MIN			5000
+#define MVPN_DISCONNECT_TIMEOUT_MAX			60000
+
+#define MVPN_PACKET_MAGIC_NUMBER		0xCAFEBEEF
+#define MVPN_PACKET_TYPE_ETHERNET		0
+#define MVPN_PACKET_TYPE_IPV4			1
+#define MVPN_PACKET_TYPE_HEARTBEAT		254
+
+
+
+#define MVPN_AUTHTYPE_ALL_SUPPORTED			MVPN_AUTHTYPE_ANONYMOUS "," MVPN_AUTHTYPE_PASSWORD_PLAIN "," MVPN_AUTHTYPE_PASSWORD_MSCHAPV2 "," MVPN_AUTHTYPE_CERT
+
+
+
+
+
 // Function prototype
 UPDATE_CLIENT *NewUpdateClient(UPDATE_NOTIFY_PROC *cb, UPDATE_ISFOREGROUND_PROC *isforeground_cb, void *param, char *family_name, char *software_name, wchar_t *software_title, UINT my_build, UINT64 my_date, char *my_lang, UPDATE_CLIENT_SETTING *current_setting, char *client_id);
 void FreeUpdateClient(UPDATE_CLIENT *c);
@@ -233,6 +307,7 @@ PACK *PackLoginWithAnonymous(char *hubname, char *username);
 PACK *PackLoginWithPassword(char *hubname, char *username, void *secure_password);
 PACK *PackLoginWithPlainPassword(char *hubname, char *username, void *plain_password);
 PACK *PackLoginWithCert(char *hubname, char *username, X *x, void *sign, UINT sign_size);
+PACK *PackLoginWithOpenVPNCertificate(char *hubname, char *username, X *x);
 bool GetMethodFromPack(PACK *p, char *method, UINT size);
 bool GetHubnameAndUsernameFromPack(PACK *p, char *username, UINT username_size,
 								   char *hubname, UINT hubname_size);
@@ -302,6 +377,36 @@ X *FindCertIssuerFromCertList(LIST *o, X *x);
 bool TryGetRootCertChain(LIST *o, X *x, bool auto_save, X **found_root_x);
 bool TryGetParentCertFromCertList(LIST *o, X *x, LIST *found_chain);
 bool DownloadAndSaveIntermediateCertificatesIfNecessary(X *x);
+char *GetMimeTypeFromFileName(char *filename);
+
+void MvpnProcGet(CONNECTION *c, SOCK *s, HTTP_HEADER *h, char *url_target);
+bool MvpnSendReply(SOCK *s, UINT status_code, char *status_string, UCHAR *data, UINT data_size, char *content_type,
+						char *add_header_name, char *add_header_value, HTTP_HEADER *request_headers);
+void MvpnAccept(CONNECTION *c, SOCK *s);
+UINT MvpnDoAccept(CONNECTION *c, WS *w);
+
+
+WS *NewWs(SOCK *s);
+void ReleaseWs(WS *w);
+void CleanupWs(WS *w);
+UINT WsRecvSync(WS *w, void *data, UINT size);
+bool WsRecvSyncAll(WS *w, void *data, UINT size);
+bool WsSendSync(WS *w, void *data, UINT size);
+UINT WsRecvAsync(WS *w, void *data, UINT size);
+UINT WsSendAsync(WS *w, void *data, UINT size);
+bool WsTrySendAsync(WS *w);
+PACK *WsRecvPack(WS *w);
+bool WsSendPack(WS *w, PACK *p);
+PACK *WsNewErrorPack(UINT err);
+char *WsErrorCodeToString(UINT err);
+
+WSP *NewWsp();
+void FreeWsp(WSP *p);
+void WspTry(WSP *p);
+BLOCK *WspTryRecvNextFrame(WSP *p, UINT *read_buffer_size);
+void WspTrySendFrame(WSP *p, UCHAR opcode, void *data, UINT size);
+
+
 
 
 #endif	// PROTOCOL_H

+ 82 - 30
src/Cedar/Radius.c

@@ -314,11 +314,11 @@ bool SendPeapRawPacket(EAP_CLIENT *e, UCHAR *peap_data, UINT peap_size)
 	fragments = NewListFast(NULL);
 	for (num = 0;;num++)
 	{
-		UCHAR tmp[1024];
+		UCHAR tmp[200];
 		EAP_PEAP *send_peap_message;
 		UINT sz;
 
-		sz = ReadBuf(buf, tmp, 1024);
+		sz = ReadBuf(buf, tmp, sizeof(tmp));
 
 		if (sz == 0)
 		{
@@ -690,6 +690,11 @@ void EapSetRadiusGeneralAttributes(RADIUS_PACKET *r, EAP_CLIENT *e)
 
 	Add(r->AvpList, NewRadiusAvp(RADIUS_ATTRIBUTE_NAS_ID, 0, 0, CEDAR_SERVER_STR, StrLen(CEDAR_SERVER_STR)));
 
+	if (IsEmptyStr(e->In_VpnProtocolState) == false)
+	{
+		Add(r->AvpList, NewRadiusAvp(RADIUS_ATTRIBUTE_PROXY_STATE, 0, 0, e->In_VpnProtocolState, StrLen(e->In_VpnProtocolState)));
+	}
+
 	ui = Endian32(2);
 	Add(r->AvpList, NewRadiusAvp(RADIUS_ATTRIBUTE_VENDOR_SPECIFIC, RADIUS_VENDOR_MICROSOFT,
 		RADIUS_MS_NETWORK_ACCESS_SERVER_TYPE, &ui, sizeof(UINT)));
@@ -1011,11 +1016,27 @@ RADIUS_PACKET *EapSendPacketAndRecvResponse(EAP_CLIENT *e, RADIUS_PACKET *r)
 						{
 							RADIUS_AVP *eap_msg = GetRadiusAvp(rp, RADIUS_ATTRIBUTE_EAP_MESSAGE);
 							RADIUS_AVP *vlan_avp = GetRadiusAvp(rp, RADIUS_ATTRIBUTE_VLAN_ID);
+							RADIUS_AVP *framed_interface_id_avp = GetRadiusAvp(rp, RADIUS_ATTRIBUTE_FRAMED_INTERFACE_ID);
 							if (eap_msg != NULL)
 							{
 								e->LastRecvEapId = ((EAP_MESSAGE *)(eap_msg->Data))->Id;
 							}
 
+							if (framed_interface_id_avp != NULL)
+							{
+								// FRAMED_INTERFACE_ID
+								char tmp_str[64];
+								UCHAR mac_address[6];
+
+								Zero(tmp_str, sizeof(tmp_str));
+								Copy(tmp_str, framed_interface_id_avp->Data, MIN(framed_interface_id_avp->DataSize, sizeof(tmp_str) - 1));
+
+								if (StrToMac(mac_address, tmp_str))
+								{
+									Copy(e->LastRecvVirtualMacAddress, mac_address, 6);
+								}
+							}
+
 							if (vlan_avp != NULL)
 							{
 								// VLAN ID
@@ -1746,6 +1767,11 @@ bool RadiusLogin(CONNECTION *c, char *server, UINT port, UCHAR *secret, UINT sec
 		// Try the EAP authentication for RADIUS first
 		EAP_CLIENT *eap = mschap.MsChapV2_EapClient;
 
+		if (IsEmptyStr(opt->In_VpnProtocolState) == false)
+		{
+			StrCpy(eap->In_VpnProtocolState, sizeof(eap->In_VpnProtocolState), opt->In_VpnProtocolState);
+		}
+
 		if (eap->PeapMode == false)
 		{
 			ret = EapClientSendMsChapv2AuthClientResponse(eap, mschap.MsChapV2_ClientResponse,
@@ -1766,6 +1792,8 @@ bool RadiusLogin(CONNECTION *c, char *server, UINT port, UCHAR *secret, UINT sec
 				opt->Out_VLanId = eap->LastRecvVLanId;
 			}
 
+			Copy(opt->Out_VirtualMacAddress, eap->LastRecvVirtualMacAddress, 6);
+
 			return true;
 		}
 		else
@@ -1880,31 +1908,31 @@ bool RadiusLogin(CONNECTION *c, char *server, UINT port, UCHAR *secret, UINT sec
 
 				// Service-Type
 				ui = Endian32(2);
-				RadiusAddValue(p, 6, 0, 0, &ui, sizeof(ui));
+				RadiusAddValue(p, RADIUS_ATTRIBUTE_SERVICE_TYPE, 0, 0, &ui, sizeof(ui));
 
 				// NAS-Port-Type
 				ui = Endian32(5);
-				RadiusAddValue(p, 61, 0, 0, &ui, sizeof(ui));
+				RadiusAddValue(p, RADIUS_ATTRIBUTE_NAS_PORT_TYPE, 0, 0, &ui, sizeof(ui));
 
 				// Tunnel-Type
 				ui = Endian32(1);
-				RadiusAddValue(p, 64, 0, 0, &ui, sizeof(ui));
+				RadiusAddValue(p, RADIUS_ATTRIBUTE_TUNNEL_TYPE, 0, 0, &ui, sizeof(ui));
 
 				// Tunnel-Medium-Type
 				ui = Endian32(1);
-				RadiusAddValue(p, 65, 0, 0, &ui, sizeof(ui));
+				RadiusAddValue(p, RADIUS_ATTRIBUTE_TUNNEL_MEDIUM_TYPE, 0, 0, &ui, sizeof(ui));
 
 				// Called-Station-ID - VPN Hub Name
 				if (IsEmptyStr(hubname) == false)
 				{
-					RadiusAddValue(p, 30, 0, 0, hubname, StrLen(hubname));
+					RadiusAddValue(p, RADIUS_ATTRIBUTE_CALLED_STATION_ID, 0, 0, hubname, StrLen(hubname));
 				}
 
 				// Calling-Station-Id
-				RadiusAddValue(p, 31, 0, 0, client_ip_str, StrLen(client_ip_str));
+				RadiusAddValue(p, RADIUS_ATTRIBUTE_CALLING_STATION_ID, 0, 0, client_ip_str, StrLen(client_ip_str));
 
 				// Tunnel-Client-Endpoint
-				RadiusAddValue(p, 66, 0, 0, client_ip_str, StrLen(client_ip_str));
+				RadiusAddValue(p, RADIUS_ATTRIBUTE_TUNNEL_CLIENT_ENDPOINT, 0, 0, client_ip_str, StrLen(client_ip_str));
 			}
 			else
 			{
@@ -1918,69 +1946,75 @@ bool RadiusLogin(CONNECTION *c, char *server, UINT port, UCHAR *secret, UINT sec
 				// Acct-Session-Id
 				us = Endian16(session_id % 254 + 1);
 				session_id++;
-				RadiusAddValue(p, 44, 0, 0, &us, sizeof(us));
+				RadiusAddValue(p, RADIUS_ATTRIBUTE_ACCT_SESSION_ID, 0, 0, &us, sizeof(us));
 
 				// NAS-IP-Address
 				if (c != NULL && c->FirstSock != NULL && c->FirstSock->IPv6 == false)
 				{
 					ui = IPToUINT(&c->FirstSock->LocalIP);
-					RadiusAddValue(p, 4, 0, 0, &ui, sizeof(ui));
+					RadiusAddValue(p, RADIUS_ATTRIBUTE_NAS_IP, 0, 0, &ui, sizeof(ui));
 				}
 
 				// Service-Type
 				ui = Endian32(2);
-				RadiusAddValue(p, 6, 0, 0, &ui, sizeof(ui));
+				RadiusAddValue(p, RADIUS_ATTRIBUTE_SERVICE_TYPE, 0, 0, &ui, sizeof(ui));
 
 				// MS-RAS-Vendor
-				ui = Endian32(311);
-				RadiusAddValue(p, 26, 311, 9, &ui, sizeof(ui));
+				ui = Endian32(RADIUS_VENDOR_MICROSOFT);
+				RadiusAddValue(p, RADIUS_ATTRIBUTE_VENDOR_SPECIFIC, RADIUS_VENDOR_MICROSOFT, RADIUS_MS_RAS_VENDOR, &ui, sizeof(ui));
 
 				// MS-RAS-Version
-				RadiusAddValue(p, 26, 311, 18, ms_ras_version, StrLen(ms_ras_version));
+				RadiusAddValue(p, RADIUS_ATTRIBUTE_VENDOR_SPECIFIC, RADIUS_VENDOR_MICROSOFT, RADIUS_MS_VERSION, ms_ras_version, StrLen(ms_ras_version));
 
 				// NAS-Port-Type
 				ui = Endian32(5);
-				RadiusAddValue(p, 61, 0, 0, &ui, sizeof(ui));
+				RadiusAddValue(p, RADIUS_ATTRIBUTE_NAS_PORT_TYPE, 0, 0, &ui, sizeof(ui));
 
 				// Tunnel-Type
 				ui = Endian32(1);
-				RadiusAddValue(p, 64, 0, 0, &ui, sizeof(ui));
+				RadiusAddValue(p, RADIUS_ATTRIBUTE_TUNNEL_TYPE, 0, 0, &ui, sizeof(ui));
 
 				// Tunnel-Medium-Type
 				ui = Endian32(1);
-				RadiusAddValue(p, 65, 0, 0, &ui, sizeof(ui));
+				RadiusAddValue(p, RADIUS_ATTRIBUTE_TUNNEL_MEDIUM_TYPE, 0, 0, &ui, sizeof(ui));
 
 				// Called-Station-ID - VPN Hub Name
 				if (IsEmptyStr(hubname) == false)
 				{
-					RadiusAddValue(p, 30, 0, 0, hubname, StrLen(hubname));
+					RadiusAddValue(p, RADIUS_ATTRIBUTE_CALLED_STATION_ID, 0, 0, hubname, StrLen(hubname));
 				}
 
 				// Calling-Station-Id
-				RadiusAddValue(p, 31, 0, 0, client_ip_str, StrLen(client_ip_str));
+				RadiusAddValue(p, RADIUS_ATTRIBUTE_CALLING_STATION_ID, 0, 0, client_ip_str, StrLen(client_ip_str));
 
 				// Tunnel-Client-Endpoint
-				RadiusAddValue(p, 66, 0, 0, client_ip_str, StrLen(client_ip_str));
+				RadiusAddValue(p, RADIUS_ATTRIBUTE_TUNNEL_CLIENT_ENDPOINT, 0, 0, client_ip_str, StrLen(client_ip_str));
 
 				// MS-RAS-Client-Version
-				RadiusAddValue(p, 26, 311, 35, ms_ras_version, StrLen(ms_ras_version));
+				RadiusAddValue(p, RADIUS_ATTRIBUTE_VENDOR_SPECIFIC, RADIUS_VENDOR_MICROSOFT, RADIUS_MS_RAS_CLIENT_VERSION, ms_ras_version, StrLen(ms_ras_version));
 
 				// MS-RAS-Client-Name
-				RadiusAddValue(p, 26, 311, 34, client_ip_str, StrLen(client_ip_str));
+				RadiusAddValue(p, RADIUS_ATTRIBUTE_VENDOR_SPECIFIC, RADIUS_VENDOR_MICROSOFT, RADIUS_MS_RAS_CLIENT_NAME, client_ip_str, StrLen(client_ip_str));
 
 				// MS-CHAP-Challenge
-				RadiusAddValue(p, 26, 311, 11, mschap.MsChapV2_ServerChallenge, sizeof(mschap.MsChapV2_ServerChallenge));
+				RadiusAddValue(p, RADIUS_ATTRIBUTE_VENDOR_SPECIFIC, RADIUS_VENDOR_MICROSOFT, RADIUS_MS_CHAP_CHALLENGE, mschap.MsChapV2_ServerChallenge, sizeof(mschap.MsChapV2_ServerChallenge));
 
 				// MS-CHAP2-Response
 				Zero(ms_chapv2_response, sizeof(ms_chapv2_response));
 				Copy(ms_chapv2_response + 2, mschap.MsChapV2_ClientChallenge, 16);
 				Copy(ms_chapv2_response + 2 + 16 + 8, mschap.MsChapV2_ClientResponse, 24);
-				RadiusAddValue(p, 26, 311, 25, ms_chapv2_response, sizeof(ms_chapv2_response));
+				RadiusAddValue(p, RADIUS_ATTRIBUTE_VENDOR_SPECIFIC, RADIUS_VENDOR_MICROSOFT, RADIUS_MS_CHAP2_RESPONSE, ms_chapv2_response, sizeof(ms_chapv2_response));
 
 				// NAS-ID
 				WriteBuf(p, nas_id->Buf, nas_id->Size);
 			}
 
+			if (IsEmptyStr(opt->In_VpnProtocolState) == false)
+			{
+				// Proxy state as protocol details
+				RadiusAddValue(p, RADIUS_ATTRIBUTE_PROXY_STATE, 0, 0, opt->In_VpnProtocolState, StrLen(opt->In_VpnProtocolState));
+			}
+
 			SeekBuf(p, 0, 0);
 
 			WRITE_USHORT(((UCHAR *)p->Buf) + 2, (USHORT)p->Size);
@@ -2071,6 +2105,9 @@ RECV_RETRY:
 					// Success
 					if (recv_buf[0] == 2)
 					{
+						LIST *o;
+						BUF *buf = NewBufFromMemory(recv_buf, recv_size);
+
 						ret = true;
 
 						if (is_mschap && mschap_v2_server_response_20 != NULL)
@@ -2108,12 +2145,26 @@ RECV_RETRY:
 							}
 						}
 
-						if (opt->In_CheckVLanId)
+						o = RadiusParseOptions(buf);
+						if (o != NULL)
 						{
-							BUF *buf = NewBufFromMemory(recv_buf, recv_size);
-							LIST *o = RadiusParseOptions(buf);
+							DHCP_OPTION *framed_interface_id_option = GetDhcpOption(o, RADIUS_ATTRIBUTE_FRAMED_INTERFACE_ID);
 
-							if (o != NULL)
+							if (framed_interface_id_option != NULL)
+							{
+								char tmp_str[64];
+								UCHAR mac_address[6];
+
+								Zero(tmp_str, sizeof(tmp_str));
+								Copy(tmp_str, framed_interface_id_option->Data, MIN(framed_interface_id_option->Size, sizeof(tmp_str) - 1));
+
+								if (StrToMac(mac_address, tmp_str))
+								{
+									Copy(opt->Out_VirtualMacAddress, mac_address, 6);
+								}
+							}
+
+							if (opt->In_CheckVLanId)
 							{
 								DHCP_OPTION *vlan_option = GetDhcpOption(o, RADIUS_ATTRIBUTE_VLAN_ID);
 
@@ -2132,9 +2183,10 @@ RECV_RETRY:
 								}
 							}
 
-							FreeBuf(buf);
 							FreeDhcpOptions(o);
 						}
+
+						FreeBuf(buf);
 					}
 					break;
 				}

+ 6 - 0
src/Cedar/Radius.h

@@ -133,6 +133,7 @@
 #define	RADIUS_ATTRIBUTE_EAP_MESSAGE				79
 #define	RADIUS_ATTRIBUTE_EAP_AUTHENTICATOR			80
 #define	RADIUS_ATTRIBUTE_VLAN_ID					81
+#define RADIUS_ATTRIBUTE_FRAMED_INTERFACE_ID		96
 #define	RADIUS_MAX_NAS_ID_LEN						253
 
 // RADIUS codes
@@ -327,6 +328,9 @@ struct EAP_CLIENT
 	UCHAR RecvLastCode;
 
 	UINT LastRecvVLanId;
+	UCHAR LastRecvVirtualMacAddress[6];
+
+	char In_VpnProtocolState[64];
 };
 
 void FreeRadiusPacket(RADIUS_PACKET *p);
@@ -365,6 +369,8 @@ struct RADIUS_LOGIN_OPTION
 	UINT Out_VLanId;
 	bool Out_IsRadiusLogin;
 	char NasId[RADIUS_MAX_NAS_ID_LEN + 1];	// NAS-Identifier
+	char Out_VirtualMacAddress[6];
+	char In_VpnProtocolState[64];
 };
 
 // Function prototype

+ 9 - 1
src/Cedar/Remote.c

@@ -112,6 +112,10 @@ void EndRpc(RPC *rpc)
 
 // Release the RPC
 void RpcFree(RPC *rpc)
+{
+	RpcFreeEx(rpc, false);
+}
+void RpcFreeEx(RPC *rpc, bool no_disconnect)
 {
 	// Validate arguments
 	if (rpc == NULL)
@@ -119,7 +123,11 @@ void RpcFree(RPC *rpc)
 		return;
 	}
 
-	Disconnect(rpc->Sock);
+	if (no_disconnect == false)
+	{
+		Disconnect(rpc->Sock);
+	}
+
 	ReleaseSock(rpc->Sock);
 
 	DeleteLock(rpc->Lock);

+ 1 - 0
src/Cedar/Remote.h

@@ -139,6 +139,7 @@ bool RpcIsOk(PACK *p);
 UINT RpcGetError(PACK *p);
 void EndRpc(RPC *rpc);
 void RpcFree(RPC *rpc);
+void RpcFreeEx(RPC *rpc, bool no_disconnect);
 
 #endif	// REMOTE_H
 

+ 10 - 0
src/Cedar/SM.c

@@ -3639,6 +3639,16 @@ void SmLicenseAddDlgOnOk(HWND hWnd, SM_SERVER *s)
 	{
 		RPC_TEST t;
 
+		if (s->LicenseWarnFlag == false)
+		{
+			if (MsgBoxEx(hWnd, MB_ICONINFORMATION | MB_OKCANCEL, _UU("SM_LICENSE_WARNING")) == IDCANCEL)
+			{
+				return;
+			}
+
+			s->LicenseWarnFlag = true;
+		}
+
 		Disable(hWnd, IDOK);
 		Disable(hWnd, IDCANCEL);
 

+ 1 - 0
src/Cedar/SMInner.h

@@ -166,6 +166,7 @@ typedef struct SM_SERVER
 	bool VgsMessageDisplayed;	// Whether to have already displayed a message about VGS
 	WINUI_UPDATE *Update;		// Update notification
 	bool IsInClient;			// Within VPN Client mode
+	bool LicenseWarnFlag;
 } SM_SERVER;
 
 typedef void (SM_STATUS_INIT_PROC)(HWND hWnd, SM_SERVER *p, void *param);

+ 9 - 0
src/Cedar/SW.c

@@ -5732,6 +5732,15 @@ UINT SwWelcomeDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, WIZARD *wiz
 			break;
 		}
 
+		if (MsIsKB3033929RequiredAndMissing())
+		{
+			// KB3033929 is missing
+			if (MsgBoxEx(hWnd, MB_ICONINFORMATION | MB_OKCANCEL, _UU("SW_KB3033929_REQUIRED")) == IDCANCEL)
+			{
+				break;
+			}
+		}
+
 		if (sw->DoubleClickBlocker)
 		{
 			break;

+ 79 - 26
src/Cedar/Server.c

@@ -1115,52 +1115,72 @@ LIST *EnumLogFile(char *hubname)
 
 	// Enumerate in the packet_log
 	Format(tmp, sizeof(tmp), "%s/packet_log", exe_dir);
-	dir = EnumDir(tmp);
-	if (dir != NULL)
+
+	if (hubname == NULL)
 	{
-		UINT i;
-		for (i = 0;i < dir->NumFiles;i++)
+		dir = EnumDir(tmp);
+		if (dir != NULL)
 		{
-			DIRENT *e = dir->File[i];
-
-			if (e->Folder)
+			UINT i;
+			for (i = 0;i < dir->NumFiles;i++)
 			{
-				char dir_name[MAX_PATH];
+				DIRENT *e = dir->File[i];
 
-				if (hubname == NULL || StrCmpi(hubname, e->FileName) == 0)
+				if (e->Folder)
 				{
+					char dir_name[MAX_PATH];
+
 					Format(dir_name, sizeof(dir_name), "packet_log/%s", e->FileName);
+
 					EnumLogFileDir(o, dir_name);
 				}
 			}
+
+			FreeDir(dir);
 		}
+	}
+	else
+	{
+		char dir_name[MAX_PATH];
+
+		Format(dir_name, sizeof(dir_name), "packet_log/%s", hubname);
 
-		FreeDir(dir);
+		EnumLogFileDir(o, dir_name);
 	}
 
 	// Enumerate in the security_log
 	Format(tmp, sizeof(tmp), "%s/security_log", exe_dir);
-	dir = EnumDir(tmp);
-	if (dir != NULL)
+
+	if (hubname == NULL)
 	{
-		UINT i;
-		for (i = 0;i < dir->NumFiles;i++)
+		dir = EnumDir(tmp);
+		if (dir != NULL)
 		{
-			DIRENT *e = dir->File[i];
-
-			if (e->Folder)
+			UINT i;
+			for (i = 0;i < dir->NumFiles;i++)
 			{
-				char dir_name[MAX_PATH];
+				DIRENT *e = dir->File[i];
 
-				if (hubname == NULL || StrCmpi(hubname, e->FileName) == 0)
+				if (e->Folder)
 				{
+					char dir_name[MAX_PATH];
+
 					Format(dir_name, sizeof(dir_name), "security_log/%s", e->FileName);
+
 					EnumLogFileDir(o, dir_name);
 				}
 			}
+
+			FreeDir(dir);
 		}
+	}
+	else
+	{
+		char dir_name[MAX_PATH];
 
-		FreeDir(dir);
+		Format(dir_name, sizeof(dir_name), "security_log/%s", hubname);
+
+		EnumLogFileDir(o, dir_name);
 	}
 
 	return o;
@@ -1871,14 +1891,37 @@ void OutRpcCapsList(PACK *p, CAPSLIST *t)
 		return;
 	}
 
+	PackSetCurrentJsonGroupName(p, "CapsList");
 	for (i = 0;i < LIST_NUM(t->CapsList);i++)
 	{
 		char tmp[MAX_SIZE];
+		char ct_key[MAX_PATH];
+		wchar_t ct_description[MAX_PATH];
+		wchar_t *w;
 		CAPS *c = LIST_DATA(t->CapsList, i);
 
 		Format(tmp, sizeof(tmp), "caps_%s", c->Name);
+
+		Format(ct_key, sizeof(ct_key), "CT_%s", c->Name);
+
+		Zero(ct_description, sizeof(ct_description));
+		w = _UU(ct_key);
+		if (UniIsEmptyStr(w) == false)
+		{
+			UniStrCpy(ct_description, sizeof(ct_description), w);
+		}
+		else
+		{
+			StrToUni(ct_description, sizeof(ct_description), c->Name);
+		}
+
 		PackAddInt(p, tmp, c->Value);
+
+		PackAddStrEx(p, "CapsName", c->Name, i, LIST_NUM(t->CapsList));
+		PackAddIntEx(p, "CapsValue", c->Value, i, LIST_NUM(t->CapsList));
+		PackAddUniStrEx(p, "CapsDescrption", ct_description, i, LIST_NUM(t->CapsList));
 	}
+	PackSetCurrentJsonGroupName(p, NULL);
 }
 void FreeRpcCapsList(CAPSLIST *t)
 {
@@ -6167,6 +6210,9 @@ void SiLoadServerCfg(SERVER *s, FOLDER *f)
 		c->SslAcceptSettings.Tls_Disable1_2 = CfgGetBool(f, "Tls_Disable1_2");
 
 		s->StrictSyslogDatetimeFormat = CfgGetBool(f, "StrictSyslogDatetimeFormat");
+
+		// Disable JSON-RPC Web API
+		s->DisableJsonRpcWebApi = CfgGetBool(f, "DisableJsonRpcWebApi");
 	}
 	Unlock(c->lock);
 
@@ -6484,6 +6530,9 @@ void SiWriteServerCfg(FOLDER *f, SERVER *s)
 		CfgAddBool(f, "DisableSessionReconnect", GetGlobalServerFlag(GSF_DISABLE_SESSION_RECONNECT));
 
 		CfgAddBool(f, "StrictSyslogDatetimeFormat", s->StrictSyslogDatetimeFormat);
+
+		// Disable JSON-RPC Web API
+		CfgAddBool(f, "DisableJsonRpcWebApi", s->DisableJsonRpcWebApi);
 	}
 	Unlock(c->lock);
 }
@@ -7211,7 +7260,7 @@ FARM_MEMBER *SiGetNextFarmMember(SERVER *s, CONNECTION *c, HUB *h)
 				PackAddIntEx(p, "NumTcpConnections", f->NumTcpConnections, i, num);
 				PackAddIntEx(p, "NumHubs", LIST_NUM(f->HubList), i, num);
 				PackAddBoolEx(p, "Me", f->Me, i, num);
-				PackAddInt64Ex(p, "ConnectedTime", f->ConnectedTime, i, num);
+				PackAddTime64Ex(p, "ConnectedTime", f->ConnectedTime, i, num);
 				PackAddInt64Ex(p, "SystemId", f->SystemId, i, num);
 				PackAddBoolEx(p, "DoNotSelect", do_not_select, i, num);
 			}
@@ -7240,7 +7289,7 @@ FARM_MEMBER *SiGetNextFarmMember(SERVER *s, CONNECTION *c, HUB *h)
 			PackAddStr(p, "CipherName", c->CipherName);
 			PackAddStr(p, "ClientStr", c->ClientStr);
 			PackAddInt(p, "ClientVer", c->ClientVer);
-			PackAddInt64(p, "ConnectedTime", Tick64ToTime64(c->ConnectedTick));
+			PackAddTime64(p, "ConnectedTime", Tick64ToTime64(c->ConnectedTick));
 
 			PackAddStr(p, "HubName", h->Name);
 			PackAddBool(p, "StaticHub", h->Type == HUB_TYPE_FARM_STATIC);
@@ -7381,8 +7430,8 @@ void SiCalledEnumHub(SERVER *s, PACK *p, PACK *req)
 
 				PackAddIntEx(p, "NumIpTables", LIST_NUM(h->IpTable), i, num);
 
-				PackAddInt64Ex(p, "LastCommTime", h->LastCommTime, i, num);
-				PackAddInt64Ex(p, "CreatedTime", h->CreatedTime, i, num);
+				PackAddTime64Ex(p, "LastCommTime", h->LastCommTime, i, num);
+				PackAddTime64Ex(p, "CreatedTime", h->CreatedTime, i, num);
 			}
 			Unlock(h->lock);
 		}
@@ -10309,12 +10358,16 @@ void SiFarmServMain(SERVER *server, SOCK *sock, FARM_MEMBER *f)
 				}
 
 				// Receive
-				p = HttpServerRecv(sock);
+				p = HttpServerRecvEx(sock, FIRM_SERV_RECV_PACK_MAX_SIZE);
 
 				t->Response = p;
 				Set(t->CompleteEvent);
 
-				send_noop = false;
+				if (p == NULL)
+                {
+                    Disconnect(sock);
+                    goto DISCONNECTED;
+                }
 			}
 		}
 		while (t != NULL);

+ 4 - 0
src/Cedar/Server.h

@@ -147,6 +147,8 @@ extern char *SERVER_CONFIG_FILE_NAME;
 #define	MEMBER_SELECTOR_CONNECT_TIMEOUT	2000
 #define	MEMBER_SELECTOR_DATA_TIMEOUT	5000
 
+#define FIRM_SERV_RECV_PACK_MAX_SIZE	(100 * 1024 * 1024)
+
 
 // Virtual HUB list hosted by each farm member
 struct HUB_LIST
@@ -360,6 +362,7 @@ struct SERVER
 	volatile UINT NatTGlobalUdpPort;	// NAT-T global UDP port
 
 	bool StrictSyslogDatetimeFormat;	// Make syslog datetime format strict RFC3164
+	bool DisableJsonRpcWebApi;					// Disable JSON-RPC Web API
 };
 
 
@@ -383,6 +386,7 @@ struct RPC_SESSION_STATUS
 	RPC_CLIENT_GET_CONNECTION_STATUS Status;		// Status
 	UINT ClientIp;									// Client IP address
 	UCHAR ClientIp6[16];							// Client IPv6 address
+	IP ClientIpAddress;								// Client IP address (IPv4/IPv6)
 	char ClientHostName[MAX_HOST_NAME_LEN + 1];		// Client host name
 	NODE_INFO NodeInfo;								// Node information
 };

+ 35 - 20
src/Cedar/Session.c

@@ -1257,7 +1257,10 @@ void StopSessionEx(SESSION *s, bool no_wait)
 		// Client mode
 		if (s->Connection)
 		{
-			StopConnection(s->Connection, no_wait);
+			CONNECTION *c = s->Connection;
+			AddRef(c->ref);
+			StopConnection(c, no_wait);
+			ReleaseConnection(c);
 		}
 	}
 	else
@@ -1265,7 +1268,10 @@ void StopSessionEx(SESSION *s, bool no_wait)
 		// Server mode
 		if (s->Connection)
 		{
-			StopConnection(s->Connection, no_wait);
+			CONNECTION *c = s->Connection;
+			AddRef(c->ref);
+			StopConnection(c, no_wait);
+			ReleaseConnection(c);
 		}
 	}
 
@@ -1391,6 +1397,8 @@ void CleanupSession(SESSION *s)
 
 	DeleteCounter(s->LoggingRecordCount);
 
+	ReleaseSharedBuffer(s->IpcSessionSharedBuffer);
+
 	Free(s);
 }
 
@@ -2199,9 +2207,9 @@ void if_free(SESSION *s);
 // Create a server session
 SESSION *NewServerSession(CEDAR *cedar, CONNECTION *c, HUB *h, char *username, POLICY *policy)
 {
-	return NewServerSessionEx(cedar, c, h, username, policy, false);
+	return NewServerSessionEx(cedar, c, h, username, policy, false, NULL);
 }
-SESSION *NewServerSessionEx(CEDAR *cedar, CONNECTION *c, HUB *h, char *username, POLICY *policy, bool inproc_mode)
+SESSION *NewServerSessionEx(CEDAR *cedar, CONNECTION *c, HUB *h, char *username, POLICY *policy, bool inproc_mode, UCHAR *ipc_mac_address)
 {
 	SESSION *s;
 	char name[MAX_SIZE];
@@ -2322,28 +2330,35 @@ SESSION *NewServerSessionEx(CEDAR *cedar, CONNECTION *c, HUB *h, char *username,
 	// Generate a MAC address for IPC
 	if (s->InProcMode)
 	{
-		char tmp[MAX_SIZE];
-		char machine[MAX_SIZE];
-		UCHAR hash[SHA1_SIZE];
+		if (ipc_mac_address != NULL)
+		{
+			Copy(s->IpcMacAddress, ipc_mac_address, 6);
+		}
+		else
+		{
+			char tmp[MAX_SIZE];
+			char machine[MAX_SIZE];
+			UCHAR hash[SHA1_SIZE];
 
-		GetMachineName(machine, sizeof(machine));
+			GetMachineName(machine, sizeof(machine));
 
-		Format(tmp, sizeof(tmp), "%s@%s@%u", machine, h->Name, s->UniqueId);
+			Format(tmp, sizeof(tmp), "%s@%s@%u", machine, h->Name, s->UniqueId);
 
-		StrUpper(tmp);
-		Trim(tmp);
+			StrUpper(tmp);
+			Trim(tmp);
 
-		Hash(hash, tmp, StrLen(tmp), true);
+			Hash(hash, tmp, StrLen(tmp), true);
 
-		s->IpcMacAddress[0] = 0xCA;
-		s->IpcMacAddress[1] = hash[1];
-		s->IpcMacAddress[2] = hash[2];
-		s->IpcMacAddress[3] = hash[3];
-		s->IpcMacAddress[4] = hash[4];
-		s->IpcMacAddress[5] = hash[5];
+			s->IpcMacAddress[0] = 0xCA;
+			s->IpcMacAddress[1] = hash[1];
+			s->IpcMacAddress[2] = hash[2];
+			s->IpcMacAddress[3] = hash[3];
+			s->IpcMacAddress[4] = hash[4];
+			s->IpcMacAddress[5] = hash[5];
 
-		MacToStr(tmp, sizeof(tmp), s->IpcMacAddress);
-		Debug("MAC Address for IPC: %s\n", tmp);
+			MacToStr(tmp, sizeof(tmp), s->IpcMacAddress);
+			Debug("MAC Address for IPC: %s\n", tmp);
+		}
 	}
 
 	return s;

+ 12 - 1
src/Cedar/Session.h

@@ -256,6 +256,7 @@ struct SESSION
 	UINT NumDisconnected;			// Number of socket disconnection
 	bool NoReconnectToSession;		// Disable to reconnect to the session
 	char UnderlayProtocol[64];		// Physical communication protocol
+	char ProtocolDetails[256];		// Protocol Details
 	UINT64 FirstConnectionEstablisiedTime;	// Connection completion time of the first connection
 	UINT64 CurrentConnectionEstablishTime;	// Completion time of this connection
 	UINT NumConnectionsEatablished;	// Number of connections established so far
@@ -265,10 +266,12 @@ struct SESSION
 	bool IsRUDPSession;				// Whether R-UDP session
 	UINT RUdpMss;					// The value of the MSS should be applied while the R-UDP is used
 	bool EnableBulkOnRUDP;			// Allow the bulk transfer in the R-UDP session
+	UINT BulkOnRUDPVersion;			// RUDP Bulk Version
 	bool EnableHMacOnBulkOfRUDP;	// Use the HMAC to sign the bulk transfer of R-UDP session
 	bool EnableUdpRecovery;			// Enable the R-UDP recovery
 
 	bool UseUdpAcceleration;		// Use of UDP acceleration mode
+	UINT UdpAccelerationVersion;		// UDP acceleration version
 	bool UseHMacOnUdpAcceleration;	// Use the HMAC in the UDP acceleration mode
 	UDP_ACCEL *UdpAccel;			// UDP acceleration
 	bool IsUsingUdpAcceleration;	// Flag of whether the UDP acceleration is used
@@ -308,6 +311,11 @@ struct SESSION
 	char FirstTimeHttpRedirectUrl[128];	// URL for redirection only the first time
 	UINT FirstTimeHttpAccessCheckIp;	// IP address for access checking
 
+	UCHAR BulkSendKey[RUDP_BULK_KEY_SIZE_MAX];	// RUDP Bulk Send Key
+	UINT BulkSendKeySize;						// RUDP Bulk Send Key size
+	UCHAR BulkRecvKey[RUDP_BULK_KEY_SIZE_MAX];	// RUDP Bulk Recv Key
+	UINT BulkRecvKeySize;						// RUDP Bulk Recv Key size
+
 	// To examine the maximum number of alowed logging target packets per minute
 	UINT64 MaxLoggedPacketsPerMinuteStartTick;	// Inspection start time
 	UINT CurrentNumPackets;				// Current number of packets
@@ -315,6 +323,9 @@ struct SESSION
 	// Measures for D-Link bug
 	UINT64 LastDLinkSTPPacketSendTick;	// Last D-Link STP packet transmission time
 	UCHAR LastDLinkSTPPacketDataHash[MD5_SIZE];	// Last D-Link STP packet hash
+
+	SHARED_BUFFER *IpcSessionSharedBuffer;	// A shared buffer between IPC and Session
+	IPC_SESSION_SHARED_BUFFER_DATA *IpcSessionShared;	// A shared data between IPC and Session
 };
 
 // Password dialog
@@ -396,7 +407,7 @@ SESSION *NewRpcSession(CEDAR *cedar, CLIENT_OPTION *option);
 SESSION *NewRpcSessionEx(CEDAR *cedar, CLIENT_OPTION *option, UINT *err, char *client_str);
 SESSION *NewRpcSessionEx2(CEDAR *cedar, CLIENT_OPTION *option, UINT *err, char *client_str, void *hWnd);
 SESSION *NewServerSession(CEDAR *cedar, CONNECTION *c, HUB *h, char *username, POLICY *policy);
-SESSION *NewServerSessionEx(CEDAR *cedar, CONNECTION *c, HUB *h, char *username, POLICY *policy, bool inproc_mode);
+SESSION *NewServerSessionEx(CEDAR *cedar, CONNECTION *c, HUB *h, char *username, POLICY *policy, bool inproc_mode, UCHAR *ipc_mac_address);
 void ClientThread(THREAD *t, void *param);
 void ReleaseSession(SESSION *s);
 void CleanupSession(SESSION *s);

+ 219 - 101
src/Cedar/UdpAccel.c

@@ -350,7 +350,7 @@ void UdpAccelSendBlock(UDP_ACCEL *a, BLOCK *b)
 		return;
 	}
 
-	UdpAccelSend(a, b->Buf, b->Size, b->Compressed, a->MaxUdpPacketSize, b->PriorityQoS);
+	UdpAccelSend(a, b->Buf, b->Size, b->Compressed ? 1 : 0, a->MaxUdpPacketSize, b->PriorityQoS);
 }
 
 // Calculate the best MSS
@@ -382,7 +382,7 @@ UINT UdpAccelCalcMss(UDP_ACCEL *a)
 	if (a->PlainTextMode == false)
 	{
 		// IV
-		ret -= UDP_ACCELERATION_PACKET_IV_SIZE;
+		ret -= UDP_ACCELERATION_PACKET_IV_SIZE_V1;
 	}
 
 	// Cookie
@@ -403,7 +403,7 @@ UINT UdpAccelCalcMss(UDP_ACCEL *a)
 	if (a->PlainTextMode == false)
 	{
 		// Verify
-		ret -= UDP_ACCELERATION_PACKET_IV_SIZE;
+		ret -= UDP_ACCELERATION_PACKET_IV_SIZE_V1;
 	}
 
 	// Ethernet header (communication packets)
@@ -419,12 +419,12 @@ UINT UdpAccelCalcMss(UDP_ACCEL *a)
 }
 
 // Send
-void UdpAccelSend(UDP_ACCEL *a, UCHAR *data, UINT data_size, bool compressed, UINT max_size, bool high_priority)
+void UdpAccelSend(UDP_ACCEL *a, UCHAR *data, UINT data_size, UCHAR flag, UINT max_size, bool high_priority)
 {
 	UCHAR tmp[UDP_ACCELERATION_TMP_BUF_SIZE];
 	UCHAR *buf;
 	UINT size;
-	UCHAR key[UDP_ACCELERATION_PACKET_KEY_SIZE];
+	UCHAR key[UDP_ACCELERATION_PACKET_KEY_SIZE_V1];
 	UINT64 ui64;
 	USHORT us;
 	UCHAR c;
@@ -448,27 +448,40 @@ void UdpAccelSend(UDP_ACCEL *a, UCHAR *data, UINT data_size, bool compressed, UI
 	// IV
 	if (a->PlainTextMode == false)
 	{
-		// IV
-		Copy(buf, a->NextIv, UDP_ACCELERATION_PACKET_IV_SIZE);
+		if (a->Version == 2)
+		{
+			// Version 2.0
+			// IV
+			Copy(buf, a->NextIv_V2, UDP_ACCELERATION_PACKET_IV_SIZE_V2);
+
+			buf += UDP_ACCELERATION_PACKET_IV_SIZE_V2;
+			size += UDP_ACCELERATION_PACKET_IV_SIZE_V2;
+		}
+		else
+		{
+			// Version 1.0
+			// IV
+			Copy(buf, a->NextIv, UDP_ACCELERATION_PACKET_IV_SIZE_V1);
 
-		buf += UDP_ACCELERATION_PACKET_IV_SIZE;
-		size += UDP_ACCELERATION_PACKET_IV_SIZE;
+			buf += UDP_ACCELERATION_PACKET_IV_SIZE_V1;
+			size += UDP_ACCELERATION_PACKET_IV_SIZE_V1;
 
-		// Calculate the key
-		UdpAccelCalcKey(key, a->MyKey, a->NextIv);
+			// Calculate the key
+			UdpAccelCalcKey(key, a->MyKey, a->NextIv);
 
-		if (false)
-		{
-			char tmp1[256];
-			char tmp2[256];
-			char tmp3[256];
-			BinToStr(tmp1, sizeof(tmp1), a->MyKey, sizeof(a->MyKey));
-			BinToStr(tmp2, sizeof(tmp2), a->NextIv, UDP_ACCELERATION_PACKET_IV_SIZE);
-			BinToStr(tmp3, sizeof(tmp3), key, sizeof(key));
-			Debug("My Key  : %s\n"
-				  "IV      : %s\n"
-				  "Comm Key: %s\n",
-				  tmp1, tmp2, tmp3);
+			if (false)
+			{
+				char tmp1[256];
+				char tmp2[256];
+				char tmp3[256];
+				BinToStr(tmp1, sizeof(tmp1), a->MyKey, sizeof(a->MyKey));
+				BinToStr(tmp2, sizeof(tmp2), a->NextIv, UDP_ACCELERATION_PACKET_IV_SIZE_V1);
+				BinToStr(tmp3, sizeof(tmp3), key, sizeof(key));
+				Debug("My Key  : %s\n"
+					  "IV      : %s\n"
+					  "Comm Key: %s\n",
+					  tmp1, tmp2, tmp3);
+			}
 		}
 	}
 
@@ -496,8 +509,8 @@ void UdpAccelSend(UDP_ACCEL *a, UCHAR *data, UINT data_size, bool compressed, UI
 	buf += sizeof(USHORT);
 	size += sizeof(USHORT);
 
-	// Compress Flag
-	c = (compressed ? 1 : 0);
+	// Flag
+	c = flag;
 	Copy(buf, &c, sizeof(UCHAR));
 	buf += sizeof(UCHAR);
 	size += sizeof(UCHAR);
@@ -512,37 +525,74 @@ void UdpAccelSend(UDP_ACCEL *a, UCHAR *data, UINT data_size, bool compressed, UI
 
 	if (a->PlainTextMode == false)
 	{
-		static UCHAR zero[UDP_ACCELERATION_PACKET_IV_SIZE] = {0};
-		CRYPT *c;
-
-		current_size = UDP_ACCELERATION_PACKET_IV_SIZE + sizeof(UINT) + sizeof(UINT64) * 2 +
-			sizeof(USHORT) + sizeof(UCHAR) + data_size + UDP_ACCELERATION_PACKET_IV_SIZE;
-
-		if (current_size < max_size)
+		if (a->Version == 2)
 		{
+			// Ver 2
 			// Padding
-			UCHAR pad[UDP_ACCELERATION_MAX_PADDING_SIZE];
-			UINT pad_size = MIN(max_size - current_size, UDP_ACCELERATION_MAX_PADDING_SIZE);
-			pad_size = rand() % pad_size;
+			current_size = UDP_ACCELERATION_PACKET_IV_SIZE_V2 + sizeof(UINT) + sizeof(UINT64) * 2 +
+				sizeof(USHORT) + sizeof(UCHAR) + data_size + UDP_ACCELERATION_PACKET_MAC_SIZE_V2;
 
-			Zero(pad, sizeof(pad));
-			Copy(buf, pad, pad_size);
-			buf += pad_size;
-			size += pad_size;
+			if (current_size < max_size)
+			{
+				UCHAR pad[UDP_ACCELERATION_MAX_PADDING_SIZE];
+				UINT pad_size = MIN(max_size - current_size, UDP_ACCELERATION_MAX_PADDING_SIZE);
+				pad_size = rand() % pad_size;
+				Zero(pad, sizeof(pad));
+				Copy(buf, pad, pad_size);
+				buf += pad_size;
+				size += pad_size;
+			}
+
+			// Encryption by RFC 8439: ChaCha20-Poly1305-IETF Encryption with AEAD
+			Aead_ChaCha20Poly1305_Ietf_Encrypt(tmp + UDP_ACCELERATION_PACKET_IV_SIZE_V2,
+				tmp + UDP_ACCELERATION_PACKET_IV_SIZE_V2,
+				size - UDP_ACCELERATION_PACKET_IV_SIZE_V2,
+				a->MyKey_V2,
+				a->NextIv_V2,
+				NULL, 0);
+
+			// Next Iv
+			Copy(a->NextIv_V2,
+				tmp + UDP_ACCELERATION_PACKET_IV_SIZE_V2 + size - UDP_ACCELERATION_PACKET_IV_SIZE_V2 - UDP_ACCELERATION_PACKET_IV_SIZE_V2, UDP_ACCELERATION_PACKET_IV_SIZE_V2);
+
+			// MAC
+			size += UDP_ACCELERATION_PACKET_MAC_SIZE_V2;
 		}
+		else
+		{
+			// Ver 1
+			static UCHAR zero[UDP_ACCELERATION_PACKET_IV_SIZE_V1] = {0};
+			CRYPT *c;
 
-		// Verify
-		Copy(buf, zero, UDP_ACCELERATION_PACKET_IV_SIZE);
-		buf += UDP_ACCELERATION_PACKET_IV_SIZE;
-		size += UDP_ACCELERATION_PACKET_IV_SIZE;
+			current_size = UDP_ACCELERATION_PACKET_IV_SIZE_V1 + sizeof(UINT) + sizeof(UINT64) * 2 +
+				sizeof(USHORT) + sizeof(UCHAR) + data_size + UDP_ACCELERATION_PACKET_IV_SIZE_V1;
+
+			if (current_size < max_size)
+			{
+				// Padding
+				UCHAR pad[UDP_ACCELERATION_MAX_PADDING_SIZE];
+				UINT pad_size = MIN(max_size - current_size, UDP_ACCELERATION_MAX_PADDING_SIZE);
+				pad_size = rand() % pad_size;
+
+				Zero(pad, sizeof(pad));
+				Copy(buf, pad, pad_size);
+				buf += pad_size;
+				size += pad_size;
+			}
+
+			// Verify
+			Copy(buf, zero, UDP_ACCELERATION_PACKET_IV_SIZE_V1);
+			buf += UDP_ACCELERATION_PACKET_IV_SIZE_V1;
+			size += UDP_ACCELERATION_PACKET_IV_SIZE_V1;
 
-		// Encryption
-		c = NewCrypt(key, UDP_ACCELERATION_PACKET_KEY_SIZE);
-		Encrypt(c, tmp + UDP_ACCELERATION_PACKET_IV_SIZE, tmp + UDP_ACCELERATION_PACKET_IV_SIZE, size - UDP_ACCELERATION_PACKET_IV_SIZE);
-		FreeCrypt(c);
+			// Encryption
+			c = NewCrypt(key, UDP_ACCELERATION_PACKET_KEY_SIZE_V1);
+			Encrypt(c, tmp + UDP_ACCELERATION_PACKET_IV_SIZE_V1, tmp + UDP_ACCELERATION_PACKET_IV_SIZE_V1, size - UDP_ACCELERATION_PACKET_IV_SIZE_V1);
+			FreeCrypt(c);
 
-		// Next Iv
-		Copy(a->NextIv, buf - UDP_ACCELERATION_PACKET_IV_SIZE, UDP_ACCELERATION_PACKET_IV_SIZE);
+			// Next Iv
+			Copy(a->NextIv, buf - UDP_ACCELERATION_PACKET_IV_SIZE_V1, UDP_ACCELERATION_PACKET_IV_SIZE_V1);
+		}
 	}
 
 	// Send
@@ -667,7 +717,7 @@ bool UdpAccelIsSendReady(UDP_ACCEL *a, bool check_keepalive)
 // Process the received packet
 BLOCK *UdpAccelProcessRecvPacket(UDP_ACCEL *a, UCHAR *buf, UINT size, IP *src_ip, UINT src_port)
 {
-	UCHAR key[UDP_ACCELERATION_PACKET_KEY_SIZE];
+	UCHAR key[UDP_ACCELERATION_PACKET_KEY_SIZE_V1];
 	UCHAR *iv;
 	CRYPT *c;
 	UINT64 my_tick, your_tick;
@@ -676,6 +726,7 @@ BLOCK *UdpAccelProcessRecvPacket(UDP_ACCEL *a, UCHAR *buf, UINT size, IP *src_ip
 	UINT pad_size;
 	UCHAR *verify;
 	bool compress_flag;
+	UCHAR raw_flag;
 	BLOCK *b = NULL;
 	UINT cookie;
 	// Validate arguments
@@ -686,36 +737,66 @@ BLOCK *UdpAccelProcessRecvPacket(UDP_ACCEL *a, UCHAR *buf, UINT size, IP *src_ip
 
 	if (a->PlainTextMode == false)
 	{
-		// IV
-		if (size < UDP_ACCELERATION_PACKET_IV_SIZE)
+		if (a->Version == 2)
 		{
-			return NULL;
-		}
-		iv = buf;
-		buf += UDP_ACCELERATION_PACKET_IV_SIZE;
-		size -= UDP_ACCELERATION_PACKET_IV_SIZE;
+			// Version 2.0
+			// IV
+			if (size < UDP_ACCELERATION_PACKET_IV_SIZE_V2)
+			{
+				return NULL;
+			}
+			iv = buf;
+			buf += UDP_ACCELERATION_PACKET_IV_SIZE_V2;
+			size -= UDP_ACCELERATION_PACKET_IV_SIZE_V2;
 
-		// Calculate the key
-		UdpAccelCalcKey(key, a->YourKey, iv);
+			if (size < AEAD_CHACHA20_POLY1305_MAC_SIZE)
+			{
+				return NULL;
+			}
 
-		if (false)
-		{
-			char tmp1[256];
-			char tmp2[256];
-			char tmp3[256];
-			BinToStr(tmp1, sizeof(tmp1), a->YourKey, sizeof(a->YourKey));
-			BinToStr(tmp2, sizeof(tmp2), iv, UDP_ACCELERATION_PACKET_IV_SIZE);
-			BinToStr(tmp3, sizeof(tmp3), key, sizeof(key));
-			Debug("Your Key: %s\n"
-				  "IV      : %s\n"
-				  "Comm Key: %s\n",
-				tmp1, tmp2, tmp3);
+			// Decryption by RFC 8439: ChaCha20-Poly1305-IETF Encryption with AEAD
+			if (Aead_ChaCha20Poly1305_Ietf_Decrypt(buf, buf, size, a->YourKey_V2,
+				iv, NULL, 0) == false)
+			{
+				return NULL;
+			}
+
+			size -= AEAD_CHACHA20_POLY1305_MAC_SIZE;
 		}
+		else
+		{
+			// Version 1.0
+			// IV
+			if (size < UDP_ACCELERATION_PACKET_IV_SIZE_V1)
+			{
+				return NULL;
+			}
+			iv = buf;
+			buf += UDP_ACCELERATION_PACKET_IV_SIZE_V1;
+			size -= UDP_ACCELERATION_PACKET_IV_SIZE_V1;
+
+			// Calculate the key
+			UdpAccelCalcKey(key, a->YourKey, iv);
+
+			if (false)
+			{
+				char tmp1[256];
+				char tmp2[256];
+				char tmp3[256];
+				BinToStr(tmp1, sizeof(tmp1), a->YourKey, sizeof(a->YourKey));
+				BinToStr(tmp2, sizeof(tmp2), iv, UDP_ACCELERATION_PACKET_IV_SIZE_V1);
+				BinToStr(tmp3, sizeof(tmp3), key, sizeof(key));
+				Debug("Your Key: %s\n"
+					  "IV      : %s\n"
+					  "Comm Key: %s\n",
+					tmp1, tmp2, tmp3);
+			}
 
-		// Decryption
-		c = NewCrypt(key, UDP_ACCELERATION_PACKET_KEY_SIZE);
-		Encrypt(c, buf, buf, size);
-		FreeCrypt(c);
+			// Decryption
+			c = NewCrypt(key, UDP_ACCELERATION_PACKET_KEY_SIZE_V1);
+			Encrypt(c, buf, buf, size);
+			FreeCrypt(c);
+		}
 	}
 
 	// Cookie
@@ -759,12 +840,20 @@ BLOCK *UdpAccelProcessRecvPacket(UDP_ACCEL *a, UCHAR *buf, UINT size, IP *src_ip
 	buf += sizeof(USHORT);
 	size -= sizeof(USHORT);
 
-	// compress_flag
+	// flag
 	if (size < sizeof(UCHAR))
 	{
 		return NULL;
 	}
-	compress_flag = *((UCHAR *)buf);
+	if (a->ReadRawFlagMode == false)
+	{
+		compress_flag = *((UCHAR *)buf);
+	}
+	else
+	{
+		raw_flag = *((UCHAR *)buf);
+	}
+
 	buf += sizeof(UCHAR);
 	size -= sizeof(UCHAR);
 
@@ -783,26 +872,29 @@ BLOCK *UdpAccelProcessRecvPacket(UDP_ACCEL *a, UCHAR *buf, UINT size, IP *src_ip
 
 	if (a->PlainTextMode == false)
 	{
-		// padding
-		if (size < UDP_ACCELERATION_PACKET_IV_SIZE)
+		if (a->Version == 1)
 		{
-			return false;
-		}
-		pad_size = size - UDP_ACCELERATION_PACKET_IV_SIZE;
-		buf += pad_size;
-		size -= pad_size;
+			// padding
+			if (size < UDP_ACCELERATION_PACKET_IV_SIZE_V1)
+			{
+				return false;
+			}
+			pad_size = size - UDP_ACCELERATION_PACKET_IV_SIZE_V1;
+			buf += pad_size;
+			size -= pad_size;
 
-		// verify
-		if (size != UDP_ACCELERATION_PACKET_IV_SIZE)
-		{
-			return NULL;
-		}
+			// verify
+			if (size != UDP_ACCELERATION_PACKET_IV_SIZE_V1)
+			{
+				return NULL;
+			}
 
-		verify = buf;
+			verify = buf;
 
-		if (IsZero(verify, UDP_ACCELERATION_PACKET_IV_SIZE) == false)
-		{
-			return NULL;
+			if (IsZero(verify, UDP_ACCELERATION_PACKET_IV_SIZE_V1) == false)
+			{
+				return NULL;
+			}
 		}
 	}
 
@@ -819,7 +911,11 @@ BLOCK *UdpAccelProcessRecvPacket(UDP_ACCEL *a, UCHAR *buf, UINT size, IP *src_ip
 
 	if (inner_size >= 1)
 	{
-		b = NewBlock(Clone(inner_data, inner_size), inner_size, compress_flag ? -1 : 0);
+		b = NewBlock(Clone(inner_data, inner_size), inner_size, a->ReadRawFlagMode == false ? (compress_flag ? -1 : 0) : 0);
+		if (a->ReadRawFlagMode)
+		{
+			b->RawFlagRetUdpAccel = raw_flag;
+		}
 	}
 
 	if (a->LastSetSrcIpAndPortTick < a->LastRecvYourTick)
@@ -851,15 +947,15 @@ BLOCK *UdpAccelProcessRecvPacket(UDP_ACCEL *a, UCHAR *buf, UINT size, IP *src_ip
 // Calculate the key
 void UdpAccelCalcKey(UCHAR *key, UCHAR *common_key, UCHAR *iv)
 {
-	UCHAR tmp[UDP_ACCELERATION_COMMON_KEY_SIZE + UDP_ACCELERATION_PACKET_IV_SIZE];
+	UCHAR tmp[UDP_ACCELERATION_COMMON_KEY_SIZE_V1 + UDP_ACCELERATION_PACKET_IV_SIZE_V1];
 	// Validate arguments
 	if (key == NULL || common_key == NULL || iv == NULL)
 	{
 		return;
 	}
 
-	Copy(tmp, common_key, UDP_ACCELERATION_COMMON_KEY_SIZE);
-	Copy(tmp + UDP_ACCELERATION_COMMON_KEY_SIZE, iv, UDP_ACCELERATION_PACKET_IV_SIZE);
+	Copy(tmp, common_key, UDP_ACCELERATION_COMMON_KEY_SIZE_V1);
+	Copy(tmp + UDP_ACCELERATION_COMMON_KEY_SIZE_V1, iv, UDP_ACCELERATION_PACKET_IV_SIZE_V1);
 
 	HashSha1(key, tmp, sizeof(tmp));
 }
@@ -887,7 +983,9 @@ bool UdpAccelInitServer(UDP_ACCEL *a, UCHAR *client_key, IP *client_ip, UINT cli
 	}
 
 	IPToStr(tmp, sizeof(tmp), client_ip);
-	Debug("UdpAccelInitServer: client_ip=%s, client_port=%u, server_cookie=%u, client_cookie=%u\n", tmp, client_port,
+	Debug("UdpAccelInitServer: ver=%u, client_ip=%s, client_port=%u, server_cookie=%u, client_cookie=%u\n",
+		a->Version,
+		tmp, client_port,
 		a->MyCookie, a->YourCookie);
 
 	if (IsIP6(client_ip) != a->IsIPv6)
@@ -895,7 +993,14 @@ bool UdpAccelInitServer(UDP_ACCEL *a, UCHAR *client_key, IP *client_ip, UINT cli
 		return false;
 	}
 
-	Copy(a->YourKey, client_key, UDP_ACCELERATION_COMMON_KEY_SIZE);
+	if (a->Version == 2)
+	{
+		Copy(a->YourKey_V2, client_key, UDP_ACCELERATION_COMMON_KEY_SIZE_V2);
+	}
+	else
+	{
+		Copy(a->YourKey, client_key, UDP_ACCELERATION_COMMON_KEY_SIZE_V1);
+	}
 
 	Copy(&a->YourIp, client_ip, sizeof(IP));
 	Copy(&a->YourIp2, client_ip_2, sizeof(IP));
@@ -919,14 +1024,22 @@ bool UdpAccelInitClient(UDP_ACCEL *a, UCHAR *server_key, IP *server_ip, UINT ser
 	}
 
 	IPToStr(tmp, sizeof(tmp), server_ip);
-	Debug("UdpAccelInitClient: server_ip=%s, server_port=%u, server_cookie=%u, client_cookie=%u\n", tmp, server_port, server_cookie, client_cookie);
+	Debug("UdpAccelInitClient: ver = %u, server_ip=%s, server_port=%u, server_cookie=%u, client_cookie=%u\n",
+		a->Version, tmp, server_port, server_cookie, client_cookie);
 
 	if (IsIP6(server_ip) != a->IsIPv6)
 	{
 		return false;
 	}
 
-	Copy(a->YourKey, server_key, UDP_ACCELERATION_COMMON_KEY_SIZE);
+	if (a->Version == 2)
+	{
+		Copy(a->YourKey_V2, server_key, UDP_ACCELERATION_COMMON_KEY_SIZE_V2);
+	}
+	else
+	{
+		Copy(a->YourKey, server_key, UDP_ACCELERATION_COMMON_KEY_SIZE_V1);
+	}
 
 	Copy(&a->YourIp, server_ip, sizeof(IP));
 	Copy(&a->YourIp2, server_ip_2, sizeof(IP));
@@ -1008,6 +1121,8 @@ UDP_ACCEL *NewUdpAccel(CEDAR *cedar, IP *ip, bool client_mode, bool random_port,
 
 	a->NoNatT = no_nat_t;
 
+	a->Version = 1;
+
 
 	a->NatT_TranId = Rand64();
 
@@ -1021,6 +1136,8 @@ UDP_ACCEL *NewUdpAccel(CEDAR *cedar, IP *ip, bool client_mode, bool random_port,
 	a->UdpSock = s;
 	Rand(a->MyKey, sizeof(a->MyKey));
 	Rand(a->YourKey, sizeof(a->YourKey));
+	Rand(a->MyKey_V2, sizeof(a->MyKey_V2));
+	Rand(a->YourKey_V2, sizeof(a->YourKey_V2));
 
 	Copy(&a->MyIp, ip, sizeof(IP));
 	a->MyPort = s->LocalPort;
@@ -1035,6 +1152,7 @@ UDP_ACCEL *NewUdpAccel(CEDAR *cedar, IP *ip, bool client_mode, bool random_port,
 	a->RecvBlockQueue = NewQueue();
 
 	Rand(a->NextIv, sizeof(a->NextIv));
+	Rand(a->NextIv_V2, sizeof(a->NextIv_V2));
 
 	do
 	{

+ 17 - 7
src/Cedar/UdpAccel.h

@@ -106,9 +106,14 @@
 #define	UDPACCEL_H
 
 // Constants
-#define	UDP_ACCELERATION_COMMON_KEY_SIZE	20			// Common key size
-#define	UDP_ACCELERATION_PACKET_KEY_SIZE	20			// Key size for the packet
-#define	UDP_ACCELERATION_PACKET_IV_SIZE		20			// IV size for the packet
+#define	UDP_ACCELERATION_COMMON_KEY_SIZE_V1	20			// V1: Common key size
+#define	UDP_ACCELERATION_PACKET_KEY_SIZE_V1	20			// V1: Key size for the packet
+#define	UDP_ACCELERATION_PACKET_IV_SIZE_V1	20			// V1: IV size for the packet
+
+#define	UDP_ACCELERATION_COMMON_KEY_SIZE_V2	128			// V2: Common key size
+#define	UDP_ACCELERATION_PACKET_IV_SIZE_V2	12			// V2: IV size for the packet
+#define UDP_ACCELERATION_PACKET_MAC_SIZE_V2	16			// V2: MAC size for the packet
+
 #define	UDP_ACCELERATION_TMP_BUF_SIZE		2048		// Temporary buffer size
 #define	UDP_ACCELERATION_WINDOW_SIZE_MSEC	(30 * 1000)	// Receive window size (in milliseconds)
 
@@ -142,8 +147,8 @@ struct UDP_ACCEL
 	bool ClientMode;									// Whether client mode
 	bool IsInCedarPortList;								// Whether included in the port list of the Cedar
 	UINT64 Now;											// Current time
-	UCHAR MyKey[UDP_ACCELERATION_COMMON_KEY_SIZE];		// Submit-direction common key
-	UCHAR YourKey[UDP_ACCELERATION_COMMON_KEY_SIZE];	// Receiving-direction common key
+	UCHAR MyKey[UDP_ACCELERATION_COMMON_KEY_SIZE_V1];		// Submit-direction common key
+	UCHAR YourKey[UDP_ACCELERATION_COMMON_KEY_SIZE_V1];	// Receiving-direction common key
 	SOCK *UdpSock;										// UDP socket
 	UINT MyPort;										// My port number
 	UINT YourPort;										// Port number of the other party
@@ -160,7 +165,7 @@ struct UDP_ACCEL
 	UINT64 LastSetSrcIpAndPortTick;						// Opponent's tick ??value at the time of storing the IP address and port number of the opponent at the end
 	UINT64 LastRecvTick;								// Tick when data has received at the end
 	UINT64 NextSendKeepAlive;							// Next time to send a KeepAlive packet
-	UCHAR NextIv[UDP_ACCELERATION_PACKET_IV_SIZE];		// IV to be used next
+	UCHAR NextIv[UDP_ACCELERATION_PACKET_IV_SIZE_V1];		// IV to be used next
 	UINT MyCookie;										// My cookie
 	UINT YourCookie;									// Cookie of the other party
 	bool Inited;										// Initialized flag
@@ -191,6 +196,11 @@ struct UDP_ACCEL
 	UCHAR UdpIpQueryPacketData[16];						// Query packet data (final transmission)
 	UINT UdpIpQueryPacketSize;							// Query packet data size (final transmission)
 	UCHAR UdpHostUniqueKey[SHA1_SIZE];					// Unique key for UDP self endpoint query
+	UINT Version;										// Version
+	UCHAR MyKey_V2[UDP_ACCELERATION_COMMON_KEY_SIZE_V2];	// Submit-direction common key (Ver 2)
+	UCHAR YourKey_V2[UDP_ACCELERATION_COMMON_KEY_SIZE_V2];	// Receiving-direction common key (Ver 2)
+	UCHAR NextIv_V2[UDP_ACCELERATION_PACKET_IV_SIZE_V2];	// IV to be used next (Ver 2)
+	bool ReadRawFlagMode;								// Read raw flag mode
 };
 
 // Function prototype
@@ -203,7 +213,7 @@ void UdpAccelSetTick(UDP_ACCEL *a, UINT64 tick64);
 BLOCK *UdpAccelProcessRecvPacket(UDP_ACCEL *a, UCHAR *buf, UINT size, IP *src_ip, UINT src_port);
 void UdpAccelCalcKey(UCHAR *key, UCHAR *common_key, UCHAR *iv);
 bool UdpAccelIsSendReady(UDP_ACCEL *a, bool check_keepalive);
-void UdpAccelSend(UDP_ACCEL *a, UCHAR *data, UINT data_size, bool compressed, UINT max_size, bool high_priority);
+void UdpAccelSend(UDP_ACCEL *a, UCHAR *data, UINT data_size, UCHAR flag, UINT max_size, bool high_priority);
 void UdpAccelSendBlock(UDP_ACCEL *a, BLOCK *b);
 UINT UdpAccelCalcMss(UDP_ACCEL *a);
 void NatT_GetIpThread(THREAD *thread, void *param);

+ 2 - 2
src/Cedar/VLanWin32.c

@@ -367,8 +367,8 @@ void RouteTrackingMain(SESSION *s)
 			if (IPToUINT(&e->DestIP) == 0 &&
 				IPToUINT(&e->DestMask) == 0)
 			{
-				Debug("e->InterfaceID = %u, t->VLanInterfaceId = %u\n",
-					e->InterfaceID, t->VLanInterfaceId);
+				//Debug("e->InterfaceID = %u, t->VLanInterfaceId = %u\n",
+				//	e->InterfaceID, t->VLanInterfaceId);
 
 				if (e->InterfaceID == t->VLanInterfaceId)
 				{

+ 4 - 4
src/CurrentBuild.txt

@@ -1,4 +1,4 @@
-BUILD_NUMBER 9680
-VERSION 429
-BUILD_NAME rtm
-BUILD_DATE 20190228_183947
+BUILD_NUMBER 9695
+VERSION 430
+BUILD_NAME beta
+BUILD_DATE 20190707_195808

+ 9861 - 0
src/Ham/generated_manual_cn.html

@@ -0,0 +1,9861 @@
+
+
+
+
+
+
+
+
+
+
+------ 1 ------
+
+
+
+
+
+
+
+
+
+		<h3>6.3.1 "About": 显示版本信息</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">About</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					显示版本信息</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					这显示了此命令行管理工具的版本信息。版本信息中包括了 vpncmd 版本号,内部标号和内部标号信息。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>About</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"About" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.2 "ServerInfoGet": 获取服务器信息</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ServerInfoGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取服务器信息</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					这使您可以获取当前连接的 VPN Server 或 VPN Bridge 的服务器信息。服务器信息中包括版本号,内部标号和内部标号信息。您还可以获取当前服务器运行模式的信息和服务器上运行的操作系统信息。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ServerInfoGet</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ServerInfoGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.3 "ServerStatusGet": 获取当前服务器状态</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ServerStatusGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取当前服务器状态</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					这使您可以实时获取当前连接的 VPN Server 或 VPN Bridge 的现状。您可以得到关于数据通信和服务器上存在的不同类型对象数量的统计资料。您可以得到当前计算机所使用的操作系统内存多少的信息。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ServerStatusGet</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ServerStatusGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.4 "ListenerCreate": 创建新的 TCP 监听器</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ListenerCreate</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					创建新的 TCP 监听器</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					这使您可以在服务器上创建一个新的 TCP 监听器。通过建立 TCP 监听器,服务器开始在指定的 TCP/IP 端口连接监听。<BR>已创建的 TCP 监听器可以被 ListenerDelete 命令删除。<BR>您还可以得到一个当前使用 ListenerList 命令登记的 TCP 侦听器列表。<BR>要执行这个命令,您必须有 VPN Server 管理员权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ListenerCreate [port]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ListenerCreate" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>port</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					使用一个整数,指定新添加的 TCP/IP 监听端口号。您也可以使用一个已经被其他程序使用的端口号; 但 VPN Server 将无法使用,直到该程序结束了在端口的使用。指定一个范围从 1 到 65535 的端口号。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.5 "ListenerDelete": 删除 TCP 监听器</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ListenerDelete</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除 TCP 监听器</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					这允许您删除一个在服务器上已注册的 TCP 侦听器。当 TCP 监听器在运行状态,当运行停止时,监听器将被自动删除。<BR>您还可以得到一个当前使用 ListenerList 命令登记的 TCP 监听器列表。<BR>为了执行这个命令,您必须有 VPN Server 管理员权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ListenerDelete [port]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ListenerDelete" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>port</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					使用一个整数,指定要删除的 TCP/IP 监听器端口号。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.6 "ListenerList": 获取 TCP 监听器列表</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ListenerList</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取 TCP 监听器列表</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					这使您可以获取的 TCP 侦听器列表当前服务器上注册。您可以获取有关各种 TCP 监听器的运行状态或错误的信息。<BR>执行这个命令,您必须有 VPN Server 管理员权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>监听器列表</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ListenerList" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.7 "ListenerEnable": 开始 TCP 监听器运行</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ListenerEnable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					开始 TCP 监听器运行</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					这将启动在当前服务器上注册的停止 TCP 监听器的运行。<BR>您还可以得到一个当前使用 ListenerList 命令注册的 TCP 监听器列表。<BR>为了执行这个命令,您必须有 VPN Server 管理员权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ListenerEnable [port]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ListenerEnable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>port</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					使用一个整数,指定要启动的 TCP/IP 监听器端口号。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.8 "ListenerDisable": 停止 TCP 监听器运行</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ListenerDisable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					停止 TCP 监听器运行</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					这将停止在当前服务器上注册的 TCP 监侦听器的运行。<BR>您还可以得到一个当前使用 ListenerList 命令注册的 TCP 监听器列表。<BR>为了执行这个命令,您必须有 VPN Server 管理员权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ListenerDisable [port]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ListenerDisable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>port</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					使用一个整数,指定要停止的 TCP/IP 监听器端口号。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.9 "ServerPasswordSet": 设置 VPN Server 管理员密码</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ServerPasswordSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置 VPN Server 管理员密码</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					这将设置 VPN Server 管理员密码。您可以指定密码为一个参数。如果密码没有指定,将显示提示输入密码和密码确认。如果指定密码为一个参数,这个密码将在屏幕上显示瞬间,这构成了风险。我们建议尽可能避免指定这个参数,使用密码提示输入密码。<BR>为了执行这个命令,您必须有 VPN Server 管理员权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ServerPasswordSet [password]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ServerPasswordSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>password</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定一个新的密码设置。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.10 "ClusterSettingGet": 获取当前 VPN Server 群集配置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ClusterSettingGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取当前 VPN Server 群集配置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					你可以用它来获取当前 VPN Server 的群集配置。<BR>为了执行这个命令,您必须有 VPN Server 管理员权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ClusterSettingGet</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ClusterSettingGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.11 "ClusterSettingStandalone": 设置为独立的 VPN Server 类型</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ClusterSettingStandalone</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置为独立的 VPN Server 类型</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					使用此设置 VPN Server 类型为 [独立服务器]。独立服务器指 VPN Server 在当前状态下不属于任何群集。当 VPN Server 安装后,默认情况下为独立的服务器模式。除非你有特别的计划来配置群集,我们建议 VPN Server 以独立模式运行。<BR>为了执行这个命令,您必须有 VPN Server 管理员权限。<BR>还有,当这个命令执行时,VPN Server 会自动重新启动。<BR>此命令不能在 VPN Bridge 上运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ClusterSettingStandalone</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ClusterSettingStandalone" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.12 "ClusterSettingController": 设置 VPN Server 类型为群集控制器</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ClusterSettingController</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置 VPN Server 类型为群集控制器</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					使用此设置 VPN Server 类型为 [群集控制器]。群集控制器是一个群集的所有成员服务器的中央电脑,群集环境是由多个 VPN Server 构成。一个群集需要一台电脑成为这个角色。在同一群集配置里的其他群集成员服务器,是通过连接到群信控制器作为群集成员开始运行的。 <BR>为了执行这个命令,您必须有 VPN Server 管理员权限。<BR>还有,当这个命令执行时刻,VPN Server 会自动重新启动。<BR>此命令不能在 VPN Bridge 上运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ClusterSettingController [/WEIGHT:weight] [/ONLY:yes|no]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ClusterSettingController" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/WEIGHT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					这设置了这个 VPN Server 的性能标准比值。这是在群集负载平衡中执行的标准值。一般而言,这个值是 100。例如,仅设置一台机器为 200,而其他成员机器为 100,在负载平衡期间,将调节这台机器收到其他成员两倍的连接数。指定 1 或更高的值。如果此参数未指定,将使用 100。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/ONLY</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					通过在这里指定 "yes",VPN Server 在群集里仅作为一个控制器运行,并总是分配一般 VPN Client 连接给到自身以外的成员。此功能用于高负载的环境。如果此参数未指定,"no" 将被使用。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.13 "ClusterSettingMember": VPN Server 类型设置为群集成员</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ClusterSettingMember</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					VPN Server 类型设置为群集成员</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					使用此设置 VPN Server 类型,[群集成员服务器]。一个群集成员服务器是成员的计算机属于群集配置由多个 VPN Server 与另一个中心现有群集控制器。集群成员可以根据需要任意添加到群集。<BR>在设置为群集成员服务器的 VPN Server,群集控制器管理员要为控制器的 IP 地址和端口号使用,需要知道公共 IP 地址和公共端口号 (必要时本 VPN Server) 和密码。<BR>要执行这个命令,您必须拥有 VPN Server 管理员权限。<BR>另外,在执行此命令,VPN Server 会自动重新启动。<BR>此命令不能运行的 VPN Bridge。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ClusterSettingMember [server:port] [/IP:ip] [/PORTS:ports] [/PASSWORD:password] [/WEIGHT:weight]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ClusterSettingMember" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>server:port</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					按照 [主机名:端口号] 的形式,设定目的地群集控制器的主机名,IP 地址,端口号等。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/IP</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定该服务器的公用 IP 地址。如果不指定公用 IP 地址,请设定 "/IP:none"。当 IP 地址没有指定,将自动使用的网络接口的 IP 地址连接到群集控制器。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/PORTS</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定服务器的公开端口一览。该清单必须至少有一个公共端口号设置,也可以设置多个公共端口号。当指定多个端口号,例如 "/PORTS:443,992,8888" 中间用逗号分开。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/PASSWORD</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定连接到目标控制器的密码。它与目标控制器管理密码是相同的。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/WEIGHT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					这设定了一个表现这个 VPN Server 的标准比率值。这是负载平衡集群中执行的标准值。一般而言,这个值是 100。例如,只有一台机器是 200,而其他成员是 100 个单位,将规范这台机器得到像其他许多成员期间两次连接负载平衡。指定 1 或更高的值。如果此参数未指定,将使用 100。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.14 "ClusterMemberList": 获得群集成员名单</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ClusterMemberList</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获得群集成员名单</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					使用此命令时,VPN Server 作为群集控制器操作获得对相同的群集群集成员服务器,包括群集控制器本身的列表。<BR>若需每个成员,下面的信息也被列入。 [类型],[连线开始],[主机名],[点],[会期号码],[TCP 连接数],[虚拟的作业站数目],[使用客户端连接许可证],[使用大桥连接许可证]。<BR>此命令不能运行在 VPN Bridge。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ClusterMemberList</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ClusterMemberList" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.15 "ClusterMemberInfoGet": 会员信息的获取</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ClusterMemberInfoGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					会员信息的获取</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					当 VPN Server 作为群集控制器操作,您就可以通过指定的集的成员服务器 ID 获得在群集成员的信息。<BR>您可以得到有关指定群集成员服务器上的以下信息: ]服务器类型]、],[已建立连接的时间],[IP 地址],[主机名],[点],[公共端口列表],[操作中的虚拟 HUB],[第一虚拟 HUB],[会话数],[TCP 连接数]。<BR>此命令不能运行在 VPN Bridge。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ClusterMemberInfoGet [id]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ClusterMemberInfoGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>id</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定想获信息的取群集成员的 ID。ID 地址可以在 ClusterMemberList 中获得。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.16 "ClusterMemberCertGet": 获得群集成员证书</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ClusterMemberCertGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获得群集成员证书</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					当 VPN Server 作为群集控制器操作,您就可以通过指定的群集这些成员服务器的 ID 的群集成员服务器获取公共 X.509 证书。您可以保存为 X.509 格式文件。<BR>此命令不能在 VPN Bridge 中运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ClusterMemberCertGet [id] [/SAVECERT:cert]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ClusterMemberCertGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>id</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定获取证书所需的群集的成员的 ID。此 ID 可以群集成员使用 ClusterMemberList 中获得。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SAVECERT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定路径以保存您获得的证书。证书被保存为 X.509 格式。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.17 "ClusterConnectionStatusGet": 获得群集控制器的连接状态的信息</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ClusterConnectionStatusGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获得群集控制器的连接状态的信息</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					使用此命令时,VPN Server 作为群集控制器操作来获得连接状态的群集控制器。<BR>您可以得到以下信息: [控制器 IP 地址],[端口号],[连接状态],[连线开始时间],[第一个连接成立时间],[当前连接成立时间],[的连接尝试次数],[成功连接次数],[连接失败次数]。<BR>此命令不能运行在 VPN Bridge。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ClusterConnectionStatusGet</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ClusterConnectionStatusGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.18 "ServerCertGet": 获得 VPN Server 的 SSL 证书</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ServerCertGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获得 VPN Server 的 SSL 证书</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					VPN Server,取得连接客户机所需的 SSL 证书。证书可以保存为 X.509 的格式。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ServerCertGet [cert]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ServerCertGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>cert</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获得的证书指定文件保存路径,以 X.509 的形式保存。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.19 "ServerKeyGet": 获取 VPN Server SSL 证书的密钥</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ServerKeyGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取 VPN Server SSL 证书的密钥</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					VPN Server,为已连接客户提供获得证书的密钥。密钥可以存储为 Base 64 的编码文件。 <BR>为了运行此命令,VPN Server 需要管理员的权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ServerKeyGet [key]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ServerKeyGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>key</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定文件的路径名来存储已获得的密钥。将密钥存储为 Base 64 编码。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.20 "ServerCertSet": VPN Server 的 SSL 证书和密钥的设置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ServerCertSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					VPN Server 的 SSL 证书和密钥的设置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置已连接 VPN Server 的客户端所需的 SSL 证书,以及跟证书相对应的密钥。证书为 X.509 格式,密钥为 Base 64 编码格式。<BR>为了运行此命令,需要有 VPN Server 管理员权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ServerCertSet [/LOADCERT:cert] [/LOADKEY:key]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ServerCertSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/LOADCERT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要使用的 X.509 格式的证书文件。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/LOADKEY</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定格式为 Base 64 编码并且与证书对应的密钥文件。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.21 "ServerCipherGet": 获取 VPN 通信中使用的加密程序</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ServerCipherGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取 VPN 通信中使用的加密程序</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					您可以获取 VPN Server 和客户端之间进行通信时使用的 SSL 加密,电子签名等,以及在 VPN Server 上的程序列表。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ServerCipherGet</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ServerCipherGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.22 "ServerCipherSet": 设置 VPN 通讯中使用的加密程序,</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ServerCipherSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置 VPN 通讯中使用的加密程序,</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					您可以设置 VPN Server 和客户端在通讯中应用的 SSL 加密连接,电子签名等应用程序。<BR>如果您指定程序的名称,以后和 VPN Server 连接的 VPN Client,VPN Bridge 之间的将应用指定程序,数据将被加密。<BR>运行此命令,需要 VPN Server 管理员的权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ServerCipherSet [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ServerCipherSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定设置加密和数字签名的程序。可以使用的程序一览,可以从 ServerCipherGet 指令中获取。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.23 "Debug": 执行调试命令</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">Debug</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					执行调试命令</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在运行的 VPN Server / Bridge 进程上运行调试命令。<BR>此命令在支持人员请求这么做时执行。<BR>错误使用此命令,很可能造成 VPN Server / Bridge 运行崩溃。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>Debug [id] [/ARG:arg]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"Debug" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>id</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定一个调试命令序号。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/ARG</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定一个字符串传递给调试命令。如果该字符串包含空格,并且整个命令都包含在" "内。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.24 "Crash": 出现一个错误的 VPN Server / Bridge 强行终止该进程。</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">Crash</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					出现一个错误的 VPN Server / Bridge 强行终止该进程。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					此命令会在 VPN Server / Bridge 的进程中产生一个严重的错误(内存访问冲突),从而会导致进程崩溃。于是,在服务模式下的 VPN Server / Bridge 将会终止并重启。如果 VPN Server 在用户模式下运行,进程将不会自动重启。<BR>本命令适用于:当 VPN Server / Bridge 处于一个不可恢复的错误或者进程无限循环时。此命令将断开所有 VPN Server / Bridge 上的 VPN 会话。所有在 VPN Server / Bridge 内存中未保存的设置将会丢失。<BR>在运行此命令前,运行"Flush" 命令来把不稳定的数据保存在配置文件中。<BR>要执行此命令,您必须具有 VPN Server / Bridge 的管理员权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>Crash [yes]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"Crash" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>yes</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					确认请输入 "yes"</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.25 "Flush": 保存 VPN Server / Bridge 全部不稳定数据到配置文件。</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">Flush</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					保存 VPN Server / Bridge 全部不稳定数据到配置文件。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					通常,不稳定设置数据会保存在 VPN Server / Bridge 的内存中。它定期以 vpn_server.config 或者 vpn_bridge.config 刷新硬盘。默认周期是 300 秒(5 分钟)。(周期长度可以在配置文件中,通过修改 AutoSaveConfigSpan 进行改变。)数据会在正常关闭 VPN Server / Bridge 时保存。<BR>执行 Flush 命令使 VPN Server / Bridge 立即保存设置至文件。此设置数据将被保存在服务器计算机的磁盘驱动中。在您没有足够时间正常关闭服务器进程的情况下,使用 Flush 命令。<BR>执行此命令,您必须有 VPN Server 管理员权限。<BR>执行此命令,您必须有 VPN Server / Bridge 的管理员权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>Flush</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"Flush" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.26 "KeepEnable": 启动 Internet 保持连接功能</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">KeepEnable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					启动 Internet 保持连接功能</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					启动 [互联网保持连接功能]。启动此功能后,如果一段时间没有通信数据,导致连接将被断开时,会自动发送数据包到任何服务器,互联网服务器一定的间隔,从而可以保持连接。<BR>目标主机名等,可以通过 KeepSet 指令来设置。<BR>VPN Server 或 VPN Bridge 运行此命令时,您必须具有管理员的权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>KeepEnable</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"KeepEnable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.27 "KeepDisable": 禁用保持互联网连接功能</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">KeepDisable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					禁用保持互联网连接功能</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					解除 [保持互联网连接功能]。<BR>VPN Server 或 VPN Bridge 运行此命令,您必须具有管理员权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>KeepDisable</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"KeepDisable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.28 "KeepSet": 设置 Internet 保持连接功能</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">KeepSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置 Internet 保持连接功能</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置 [保持互联网连接功能] 的目标主机名。 如果一段时间没有任何通信数据,连接将被断开时,使用 [保持互联网连接功能 ] 可以,设定时间向 Internet 上的任何服务器发送数据包,从而可以保持您的 Internet 连接。<BR>在此功能中,可以设置目标 [主机名],[端口号],[数据包发送时间间隔],以及 [协议]。<BR>发送的数据包为随机内容,不会讲计算机和个人的识别信息发送。<BR>保持 Internet 连接功能,可以通过 KeepEnable 命令,或使用命令 KeepDisable,实现启用 / 禁用。不可以用 KeepSet 来改变启用 / 禁用的状态。 <BR>VPN Server 或 VPN Bridge 运行此命令,您必须具有管理员权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>KeepSet [/HOST:host:port] [/PROTOCOL:tcp|udp] [/INTERVAL:interval]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"KeepSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/HOST</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					用 [主机:端口] 的格式,来设定目标主机名或 IP 地址和端口号。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/PROTOCOL</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设定 tcp 或 udp。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/INTERVAL</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					以秒为单位设定发送数据包之间的间隔时间。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.29 "KeepGet": 获取保持互联网连接的功能</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">KeepGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取保持互联网连接的功能</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取 [保持互联网连接功能] 的当前设置。可以得到 [主机名],[端口],[数据包发送时间间隔],和 [协议],还包括当前 [保持互联网连接功能] 是否启用的当前状态。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>KeepGet</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"KeepGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.30 "SyslogEnable": 设置发送系统日志功能</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">SyslogEnable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置发送系统日志功能</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					使用 syslog 发送系统日志的使用方法和服务器的设置。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>SyslogEnable [1|2|3] [/HOST:host:port]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"SyslogEnable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>1|2|3</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					使用 syslog 功能 1 - 3 来进行设置。
+1: 发送 syslog 服务器日志。
+2: 发送服务器和虚拟 HUB 安全系统日志。
+3: 服务器,虚拟 HUB 安全和数据包发送系统日志记录枢纽。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/HOST</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					按照 [主机:端口] 的形式,设定系统日志服务器主机名或 IP 地址和端口号。如果省略端口号使用 514。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.31 "SyslogDisable": 禁用发送系统日志的功能</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">SyslogDisable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					禁用发送系统日志的功能</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					解除系统日志的传送功能。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>SyslogDisable</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"SyslogDisable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.32 "SyslogGet": 取得发送系统日志的功能</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">SyslogGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					取得发送系统日志的功能</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取 syslog 发送功能的当前设置。您可以设置系统日志功能的使用方法,可以获取 syslog 服务器的主机名和端口号。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>SyslogGet</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"SyslogGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.33 "ConnectionList": 获取与 VPN Server 相连的 TCP 连接一览</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ConnectionList</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取与 VPN Server 相连的 TCP 连接一览</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					现在,先获取与 VPN Server 连接的 TCP/IP 一览表。但是,VPN 会话作为 TCP/IP 连接不显示。VPN 会话建立的 TCP/IP 连接一览表,何以运用 SessionList 命令获得。<BR>可以获取 [连接名称], [原始连接], [连接时间] 和 [类型]。<BR>要运行此命令,VPN Server 需要管理员权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ConnectionList</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ConnectionList" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.34 "ConnectionGet": 获取连接到 VPN Server 的 TCP 信息一览表</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ConnectionGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取连接到 VPN Server 的 TCP 信息一览表</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取与 VPN Server 连接的 TCP/IP 连接的详细信息。<BR>可以获得 [连接名],[连接种类],[连接主机名],[连接主机 IP],[联机主机端口 TCP],[连接时间],[服务器品牌],[服务器版本],[服务器铭牌号],[客户机品牌],[客户机版本],[客户机铭牌号] 等信息。 <BR>要运行此命令,需要管理员权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ConnectionGet [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ConnectionGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定希望获取信息的连接名称。所有连接的一览表,可以通过 ConnectionList 命令获得。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.35 "ConnectionDisconnect": 断开 VPN Server 和 TCP 的连接</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ConnectionDisconnect</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					断开 VPN Server 和 TCP 的连接</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					强制切断 VPN Server 和指定的 TCP/IP 的连接。<BR>运行此命令,需要管理员权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ConnectionDisconnect [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ConnectionDisconnect" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定希望切断的连接。连接的名称可以从 ConnectionList 命令中获得。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.36 "BridgeDeviceList": 获取可以在当地的网桥上使用的 LAN 卡一览</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">BridgeDeviceList</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取可以在当地的网桥上使用的 LAN 卡一览</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					使用当地网桥连接,获取目标桥中可以使用的设备 (LAN 卡) 列表。<BR>在此显示的设备名字,BridgeCreate 命令都可以使用。<BR>为了运行此命令,需要管理员权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>BridgeDeviceList</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"BridgeDeviceList" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.37 "BridgeList": 获得当地网桥连接列表</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">BridgeList</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获得当地网桥连接列表</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取当地定义的网桥连接列表。<BR>可以获取当地网桥连接的虚拟 HUB 名称,目标太网桥连接器件 (LAN 卡) 的名称,或可以获取设备的名称和工作状态。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>BridgeList</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"BridgeList" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.38 "BridgeCreate": 创建本地的网桥连接</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">BridgeCreate</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					创建本地的网桥连接</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在 VPN Server 上创建新的本地网桥连接的。<BR>当您使用一个本地的网桥,这个虚拟 HUB 和物理以太网设备 (LAN 卡在两层) 之间可以创建网桥连接。<BR>在系统中创建 tap 设备 (虚拟网络接口),可以与虚拟 HUB 建立连接 (tap 设备仅支持 Linux)。<BR>目的地以太网桥设备 (LAN 卡) 可以连接到您的任何运行的 LAN 卡,但是高负荷环境的网桥,建议您准备专用的 LAN 卡。<BR>要运行此命令,需要管理员权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>BridgeCreate [hubname] [/DEVICE:device_name] [/TAP:yes|no]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"BridgeCreate" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>hubname</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定虚拟 HUB 的网桥。虚拟 HUB 列表,可以通过 HubList 命令获得。但是,没有必要一定要选定目前正在运行的虚拟 HUB,即使选定目前没有工作,或不存在的虚拟名称的 HUB,当它真正工作时,它与虚拟本地网桥就会建立连接。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/DEVICE</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设定目标以太网桥设备 (LAN 卡) 的名称,或 tap 设备的名称。以太网设备名单,可以通过运行 BridgeDeviceList 命令得到。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/TAP</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					网桥连接局域网,不使用 LAN 卡,而是使用 tap 设备时,选定 yes,如果您使用的设备指定 (只支持 Linux)。如果省略,默认为 no。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.39 "BridgeDelete": 删除本地网桥连接</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">BridgeDelete</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除本地网桥连接</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除现有的当地网桥连接。当地网桥梁连接的列表,可以通过 BridgeDeviceList 命令得到。<BR>运行此命令,需要服务器管理员权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>BridgeDelete [hubname] [/DEVICE:device_name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"BridgeDelete" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>hubname</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定被删除的当地网桥的虚拟 HUB。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/DEVICE</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定被删除的当地的网桥的设备名 (LAN 卡的名称或 tap 设备的名称)。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.40 "Caps": 获得服务器的功能性能一览表</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">Caps</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获得服务器的功能性能一览表</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					取得现在正在连接使用的 VPN Server 的功能和性能的清单。<BR>VPN Server 的功能和性能取决于服务器的版本。指令清单中的指令也可能因为对方的服务器的功能,而无法工作。因此此命令需调查目标服务器的功能。<BR>如果 VPN Server 的版本比命令行管理工具的版本新,存在不掌握的指令时,其内部的字符串 (变量名),但可能原原本本的表示出来。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>Caps</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"Caps" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.41 "Reboot": VPN Server 服务重新启动</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">Reboot</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					VPN Server 服务重新启动</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					VPN Server 重新启动该服务。<BR>VPN Server 重新启动服务,目前连接的会话和 TCP 连接都将被切断,直道建立新的连接。<BR>此命令,VPN Server,只是重新启动服务程序,而不是重新启动计算机。这种管理的连接也会断开,如果需要请重新建立连接。<BR>此外,/RESETCONFIG:yes 指定参数,并对 VPN Server 的系统内容 (.config) 进行初始化。<BR>要运行此命令,VPN Server需要管理员权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>Reboot [/RESETCONFIG:yes|no]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"Reboot" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/RESETCONFIG</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定 yes,对当前的 VPN Server 的系统内容 (.config) 初始化。请谨慎设置此参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.42 "ConfigGet": 获取 VPN Server 当前系统配置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ConfigGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取 VPN Server 当前系统配置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取 VPN Server 当前 (.config 文件) 系统结构化文本保存的文本文件,你可以检索到 VPN Server 执行这个指令的瞬间状态。<BR>系统内容的文件,如果不指定参数,会在屏幕上直接显示。如果您指定参数保存,会保存为一个指定的文件名。<BR>配置文件可以使用普通的文本编辑器编辑。编辑好的文件要写入 VPN Server,需执行 ConfigSet 命令。<BR>要运行此命令,VPN Server 需要管理员权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ConfigGet [path]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ConfigGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>path</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果你想保存配置文件,请指定文件名。如果没有指定,配置的内容将以画面形式显示在屏幕上。如果配置是多字字符的,请转变成 Unicode (UTF-8) 编码存储。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.43 "ConfigSet": 往 VPN Server 上写入系统配置内容</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ConfigSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					往 VPN Server 上写入系统配置内容</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					往 VPN Server 上写入系统配置内容。这样,您选定的系统配置内容会适用于 VPN Server,VPN Server 程序会自动重启,新的系统配同配置开始工作。<BR>对系统管理者来说,要记录所有的系统配置的文件是比较困难的。因此建议使用 ConfigGet 命令,先获取当前的 VPN Server 的系统配置内容保存成文件,再将此文件加以编辑,然后用 ConfigSet 命令写入 VPN Server。<BR>这个操作,需要对 VPN Server 充分的了解,如果写入了不正确的系统配置信息,系统将发生错误,甚至可能丢失现在的设置内容。请务必小心操作。<BR>执行这个命令,需要 VPN Server 的管理员权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ConfigSet [path]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ConfigSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>path</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定配置文件的名称。如果文件有多种文字,请先变化成 Unicode (UTF-8) 格式。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.44 "RouterList": 获取虚拟 3 层交换机列表</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">RouterList</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取虚拟 3 层交换机列表</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在 VPN Server 上获取 3 层虚拟交换机的清单。获取虚拟 3 层交换机的 [交换机名称],[工作状态],[接口数量],[路由数目] 等信息。<BR>要运行此命令,需要 VPN Server 管理员权限。<BR>此外,此命令不能在 VPN Bridge 中运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>RouterList</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"RouterList" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.45 "RouterAdd": 定义一个新的虚拟 3 层交换机</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">RouterAdd</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					定义一个新的虚拟 3 层交换机</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在 VPN Server 上定义一个新的 3 层虚拟交换机。<BR>要运行此命令,需要 VPN Server 管理员权限。<BR>此外,此命令不能在 VPN Bridge 中运行。<BR><BR>[虚拟 3 层交换机功能的说明]<BR>在这个虚拟 VPN Server 上运行的多个虚拟 HUB 之间,可以通过定义的虚拟 3 层交换机,实现不同 IP 地址之间的路由。<BR><BR>[虚拟 3 层交换机功能的注意事项]<BR>虚拟 3 层交换机功能是基于对网络和 IP 路由熟悉的人或者是网络管理员使用的。如果您使用正常的 VPN 功能,您没有必要使用虚拟 3 层交换机。<BR>如果您使用虚拟 3 层交换机的功能,请您务必要十分熟悉 IP 路由方面的知识,并十分清楚您的设置将对网络产生的影响。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>RouterAdd [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"RouterAdd" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					创建一个新的虚拟 3 层交换机的名称。新创建的名称与现有的名称是不能相同。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.46 "RouterDelete": 删除虚拟 3 层交换机</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">RouterDelete</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除虚拟 3 层交换机</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除在 VPN Server 上已定义的 3 层虚拟交换机。如果选定的虚拟 3 层交换机正在运行,它将停止工作,然后自动删除。<BR>获取虚拟 3 层交换机的清单,可以使用 RouterList 命令。<BR>要运行此命令,需要 VPN Server 管理员权限。<BR>此外,此命令不能在 VPN Bridge 中运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>RouterDelete [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"RouterDelete" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定想要删除的虚拟 3 层交换机的名称。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.47 "RouterStart": 开始运行虚拟 3 层交换机</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">RouterStart</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					开始运行虚拟 3 层交换机</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					VPN Server 上已经存在的虚拟 3 层交换机,如果处于停止工作工作状态,将开始运行。<BR>获取当前的虚拟 3 层交换机清单,可以执行 RouterList 命令。<BR>要运行此命令,需要 VPN Server 管理员权限。<BR>此外,此命令不能在 VPN Bridge 运行。<BR><BR>[虚拟 3 层交换机功能的说明]<BR>在这个虚拟 VPN Server 上运行的多个虚拟 HUB 之间,可以通过定义的虚拟 3 层交换机,实现不同 IP 地址之间的路由。<BR><BR>[虚拟 3 层交换机功能的注意事项]<BR>虚拟 3 层交换机功能是基于对网络和 IP 路由熟悉的人或者是网络管理员使用的。如果您使用正常的 VPN 功能,您没有必要使用虚拟 3 层交换机。<BR>如果您使用虚拟 3 层交换机的功能,请您务必要十分熟悉 IP 路由方面的知识,并十分清楚您的设置将对网络产生的影响。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>RouterStart [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"RouterStart" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定即将启动的虚拟 3 层交换机的名称。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.48 "RouterStop": 停止虚拟 3 层交换机的运行</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">RouterStop</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					停止虚拟 3 层交换机的运行</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在 VPN Server 上已定义的虚拟 3 层交换机,如果正在运行,它将停止运行。<BR>想要获取现有的虚拟 3 层交换机清单,可以运行 RouterList 命令。<BR>要运行此命令,需要 VPN Server 管理员权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>RouterStop [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"RouterStop" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定想要停止运行的虚拟 3 层交换机的名称。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.49 "RouterIfList": 获取在虚拟 3 层交换机中注册的远程接口的清单</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">RouterIfList</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取在虚拟 3 层交换机中注册的远程接口的清单</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果在指定的虚拟 3 层交换机上有已经定义的虚拟远程接口,您将会获取一个虚拟接口列表。<BR>在一个虚拟 3 层交换机上,您可以定义多个虚拟接口和路由表。<BR>虚拟接口与虚拟 HUB 相互关联,当虚拟 HUB 运行时,虚拟接口就像一个虚拟 IP 主机在工作。相对于多个 IP 虚拟 HUB,如果定义分属不同网络的多个远程接口时,IP 路由会自动运行。<BR>要运行此命令,需要 VPN Server 管理员权限。<BR>此外,此命令不能在 VPN Bridge 中运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>RouterIfList [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"RouterIfList" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定虚拟 3 层交换机的名称。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.50 "RouterIfAdd": 在虚拟 3 层交换机上添加一个虚拟远程接口</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">RouterIfAdd</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在虚拟 3 层交换机上添加一个虚拟远程接口</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定的 3 层虚拟交换机,为它添加一个在同一个 VPN Server 上运行的虚拟 HUB 的连接虚拟接口。<BR>一个指定的 3 层虚拟交换机,您可以定义多个虚拟接口和路由表。<BR>虚拟接口与虚拟 HUB 相互关联,当虚拟 HUB 运行时,虚拟接口就像一个虚拟 IP 主机在工作。相对于多个 IP 虚拟 HUB,如果定义分属不同网络的多个远程接口时,IP 路由会自动运行。<BR>虚拟接口的 IP 网络空间,虚拟接口的 IP 地址必须被定义。<BR>虚拟接口必须制定目标连接的虚拟 HUB 的名称。<BR>指定虚拟 HUB 时,也可选定当前不存在的虚拟 HUB。<BR>虚拟接口必须在虚拟 HUB 内有一个 IP 地址。此外,还需指定属于该 IP 地址的 IP 网络的子网掩码。<BR>设置虚拟 HUB 内几个虚拟空间通过交换机的路由网,需在指定的 IP 地址操作。<BR>要运行此命令,需要 VPN Server 管理员权限。<BR>此外,此命令不能在 VPN Bridge 中运行。 <BR>要运行此命令,操作对象的虚拟 3 层交换机必须关闭。如果正在运行中,可用 RouterStop 命令让其停止。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>RouterIfAdd [name] [/HUB:hub] [/IP:ip/mask]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"RouterIfAdd" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定虚拟 3 层交换机的名称。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/HUB</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定新建虚拟接口拟连接的虚拟 HUB 名称。虚拟 HUB 名单,可以通过 HubList 命令获取。但是,目前正在运行的虚拟 HUB 没有必要指定。如果指定了目前没有工作,或不存在的虚拟 HUB,当它开始虚拟工作时,虚拟 3 层交换机将被激活。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/IP</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					按照 [IP 地址/子网掩码] 的格式,设定新添加的接口的的 IP 地址和子网掩码。IP 地址为 192.168.0.1,10 进制,以点区分。子网掩码 255.255.255.0 以点区分,10 进制,也可以设定为如 24 这样的字节数用 10 进制来表示。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.51 "RouterIfDel": 删除虚拟 3 层交换机的虚拟远程接口</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">RouterIfDel</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除虚拟 3 层交换机的虚拟远程接口</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除在指定虚拟交换机中已定义的虚拟接口。<BR>对当前定义的虚拟接口列表,可以通过 RouterIfList 命令得到。<BR>要运行此命令,需要 VPN Server 管理员权限。<BR>此外,此命令不能在 VPN Bridge 中运行。<BR>要运行此命令,虚拟 3 层转化及必须在停止状态。如果不是,可以通过 RouterStop 指令使其停止。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>RouterIfDel [name] [/HUB:hub]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"RouterIfDel" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定虚拟 3 层交换机的名称。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/HUB</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定虚拟接口所连接的虚拟 HUB 的名称。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.52 "RouterTableList": 获取虚拟 3 层交换机的路由列表</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">RouterTableList</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取虚拟 3 层交换机的路由列表</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在指定的虚拟 3 层交换机中,如果有路由表已定义,可以获取一个路由表的列表。<BR>虚拟 3 层交换机的IP 路由引擎,当 IP 数据包的 IP 地址不属于任一个虚拟接口时,将参照这个路由表。<BR>要运行此命令,VPN Server 需要管理员权限。<BR>此外,此命令不能在 VPN Bridge 中运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>RouterTableList [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"RouterTableList" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定虚拟 3 层交换机的名称。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.53 "RouterTableAdd": 添加一个路由表项到虚拟 3 层交换机</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">RouterTableAdd</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					添加一个路由表项到虚拟 3 层交换机</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定新的虚拟 3 层交换机的路由表并添加一个新的路由表项。<BR>虚拟 3 层交换机操作 IP 路由引擎时,IP 数据包的目的 IP 地址不属于任何 IP 接口时,可以参照路由表进行操作。<BR>向虚拟 3 层交换机中添加的路由表项内容必须指定。作为网关,在虚拟 3 层交换机的虚拟接口中,有至少一个属于同一 IP 网络的 IP 地址相同。<BR>要运行此命令,VPN Server 需要管理员权限。<BR>此外,此命令不能在 VPN Bridge 中运行。<BR>要运行此命令虚拟 3 层交换机必须处于停止噢国内工作状态。如果不在停止状态,可以执行 RouterStop 命令令其处于暂停。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>RouterTableAdd [name] [/NETWORK:ip/mask] [/GATEWAY:gwip] [/METRIC:metric]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"RouterTableAdd" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定虚拟 3 层交换机的名称。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/NETWORK</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					按照 [IP 地址/子网掩码] 的格式,设置新添加的路由表的网络地址和子网掩码。网络地址,如 192.168.0.1 的格式,由点分隔,10 进位制。子网掩码如 255.255.255.0,用点分隔,10 进位制,或者像 24 这样从开头 10 进位设定字节数。位长度可为十进制数指定的分隔十进制数字。 如 0.0.0.0/0.0.0.0 将格式设定好,默认为根。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/GATEWAY</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定网关的 IP 地址。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/METRIC</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定度量的值。请使用一个以上的整数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.54 "RouterTableDel": 删除虚拟 3 层交换机的路由表项</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">RouterTableDel</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除虚拟 3 层交换机的路由表项</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定在虚拟 3 层交换机上已定义的路由表项,进行删除。<BR>已定义的路由表项名单,可通过 RouterTableList 命令获取。<BR>要运行此命令,需要 VPN Server 管理员权限。<BR>此外,此命令不能在 VPN Bridge 中运行。<BR>要运行此命令要求虚拟 3 层转换机处于停止状态。如果没有处于停止状态,可以执行 RouterStop 命令,让其暂停。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>RouterTableDel [name] [/NETWORK:ip/mask] [/GATEWAY:gwip] [/METRIC:metric]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"RouterTableDel" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定虚拟 3 层交换机的名称。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/NETWORK</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					按照 [IP 地址/子网掩码] 的格式,选定拟删除的路由表项的网络地址。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/GATEWAY</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定网关的 IP 地址。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/METRIC</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定度量的值。请使用一以上整数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.55 "LogFileList": 获取日志文件列表</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">LogFileList</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取日志文件列表</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					您可以将保存在 VPN Server 上,并有服务器输出的日志文件显示成一个输出列表。通过指定一个文件名,运用 LogFileGet 命令,可以下载该日志文件的内容。<BR>如果 VPN Server 在管理模式下,所有的虚拟 HUB 的数据包日志,安全日志,VPN Server 日志允许您查看或下载。<BR>如果虚拟 HUB 在管理模式下,并处于连接状态,可以查看或下载该数据包日志和安全日志。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>LogFileList</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"LogFileList" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.56 "LogFileGet": 日志文件下载</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">LogFileGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					日志文件下载</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					下载 VPN Server 上存储的日志文件。要下载日志文件,先用 LogFileList 命令获取日志文件列表,然后您就可以执行 LogFileGet 命令来下载。如果与 VPN Server 连接并处于管理模式,所有的虚拟 HUB 的数据包日志,安全日志,VPN Server 允许您查看或下载。如果正在连接的虚拟 HUB 处于管理模式,HUB 管理的虚拟数据包日志,安全日志可查阅,也可以下载。<BR>如果您指定一个作为参数作为文件名,下载的日志文件将被保存为这个文件名。如果你不指定文件将显示在屏幕上。<BR>日志文件的大小有可能非常巨大的,所以一定要小心。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>LogFileGet [name] [/SERVER:server] [/SAVEPATH:savepath]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"LogFileGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定要下载的日志文件名。运行 LogFileList 命令,可以得到一个日志文件的名称列表。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SERVER</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果您要从群集控制器中下载,请指定保存日志文件的服务器名称。运行 LogFileGet 指令可以获得指定服务器。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SAVEPATH</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果你想保存下载的日志文件,请指定文件名。如果没有指定,将显示在屏幕上。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.57 "HubCreate": 创建新的虚拟 HUB</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">HubCreate</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					创建新的虚拟 HUB</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在 VPN Server 上创建一个新的虚拟 HUB。<BR>创建的虚拟 HUB 将立即开始工作。<BR>当 VPN Server,在一个群集中运行,此命令仅对群集控制器有效。新的虚拟 HUB,将作为一个动态的虚拟 HUB。应用 HubSetStatic 命令也可将虚拟 HUB 改为静态的。要想获取已经存储在 VPN Server 上的 HUB,可以运行 HubList 命令获得列表。<BR>要运行此命令,需要 VPN Server 管理员权限。<BR>此外,此命令在 VPN Bridge 和群集管理服务器中不起作用。<BR>在群集上创建虚拟群集控制器 HUB 时,请运行 HubCreateStatic 或者 HubCreateDynamic 命令。(对群集控制器操作时,HubCreate 和 HubCreateDynamic就有相同的功能)。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>HubCreate [name] [/PASSWORD:password]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"HubCreate" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定新创建的枢纽虚拟名称。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/PASSWORD</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果您设置的虚拟 HUB 需要密码,请指定管理员密码。否则,会提示您输入。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.58 "HubCreateDynamic": 创建一个新的动态虚拟 HUB (集群)</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">HubCreateDynamic</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					创建一个新的动态虚拟 HUB (集群)</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在 VPN Server 上创建新的动态虚拟 HUB。<BR>创建的虚拟 HUB 将立即开始工作。<BR>VPN Server,在一个群集中运行时,此命令仅对群集控制器有效。新的虚拟 HUB,将作为一个虚拟的动态 HUB。运行 HubSetStatic 命令可以将虚拟 HUB 可以改为静态的。运行 HubList 命令可以获取当前虚拟 HUB 的列表。<BR>要运行此命令,VPN Server 需要管理员权限。<BR>此外,此命令在 VPN Bridge,群集管理器,独立的服务器在 VPN Server 工作时不起作用。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>HubCreateDynamic [name] [/PASSWORD:password]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"HubCreateDynamic" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定新创建的虚拟 HUB 的名称。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/PASSWORD</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果您设置虚拟 HUB 管理密码,请指定管理员密码。否则,会提示您输入。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.59 "HubCreateStatic": 新创建一个静态虚拟 HUB (集群用)</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">HubCreateStatic</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					新创建一个静态虚拟 HUB (集群用)</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在 VPN Server 上创建一个新的静态虚拟 HUB。<BR>创建的虚拟 HUB 将立即开始工作。<BR>VPN Server 在一个群集中运行时,此命令仅对群集控制器有效。新创建的虚拟 HUB,为一个虚拟的动态 HUB。运行 HubSetStatic 命令可以将虚拟 HUB 改为静态的。如果想得到已经保存在 VPN Server 上的 HUB 列表,可以运行 HubList 命令。<BR>要运行此命令,VPN Server 需要管理员权限。<BR>此外,此命令在 VPN Bridge,群集管理器,独立的服务器在 VPN Server 工作时不起作用。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>HubCreateStatic [name] [/PASSWORD:password]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"HubCreateStatic" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定新创建的虚拟 HUB 的名称。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/PASSWORD</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果您设置虚拟 HUB 管理密码,请指定管理员密码。否则,会提示您输入。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.60 "HubDelete": 删除虚拟 HUB</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">HubDelete</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除虚拟 HUB</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除 VPN Server 上现有的虚拟 HUB。<BR>当您删除虚拟 HUB 后,所有的程序连接将断开,新的程序将不能与它连接。<BR>虚拟 HUB 的所有的设置,用户选项,组选项,证书设置和级联将被删除。<BR>虚拟 HUB 被删除后,将不能恢复。<BR>运行此命令,需要 VPN Server 管理员权限。<BR>此外,此命令在 VPN Bridge,群集管理器,独立的服务器在 VPN Server 工作时不起作用。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>HubDelete [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"HubDelete" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					定要删除的虚拟 HUB 名称。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.61 "HubSetStatic": 将虚拟 HUB 的类型变为静态虚拟型</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">HubSetStatic</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					将虚拟 HUB 的类型变为静态虚拟型</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					使用 VPN Server 运行在群集上时,将虚拟 HUB 类型设定为静态虚拟 HUB。当虚拟 HUB 类型改变时,所有的程序连接将被暂时中断。 <BR>当作为静态虚拟 HUB 工作时,所有的群集成员的服务器上,将生成该名称的虚拟 HUB。每个尝试连接这个虚拟 HUB 的用户,基于各自服务器的负荷状况,确定与这个群集某个成员的连接。<BR>静态虚拟 HUB,举例说,一个企业从互联网上访问局域网,允许数千或数以万计的用户远程访问 VPN Server。<BR>要执行这个命令,您必须有 VPN Server 管理员权限。<BR>此外,此命令在 VPN Bridge,群集管理器,独立的服务器在 VPN Server 工作时不起作用。<BR>此命令不能用于比 5190 更新的服务器。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>HubSetStatic [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"HubSetStatic" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定拟变更成静态虚拟 HUB 的名称。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.62 "HubSetDynamic": 将虚拟 HUB 的类型变为动态虚拟型</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">HubSetDynamic</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					将虚拟 HUB 的类型变为动态虚拟型</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					使用 VPN Server 运行在群集上时,将虚拟 HUB 类型变更为动态。当虚拟 HUB 类型改变时,所有的程序连接会暂时被中断。<BR>当该虚拟 HUB 上没有任何成员时,虚拟 HUB 在任何群集上都不存在。当第一个客户端试图连接到动态的虚拟 HUB 时,负荷最低的服务器启动,托管虚拟 HUB。当第二个和随后的客户端试图连接到同一个虚拟 HUB,它们会自动连接到服务器托管的虚拟 HUB。当所有的客户都从一个特定的动态虚拟 HUB 断开,服务器上将不存在任何实体。<BR>动态虚拟 HUB 的应用很广泛,例如,公司内部每个部门定应一个虚拟 HUB,让员工可以连接到自己所属的虚拟枢纽部门来操作,从而实现集中管理。<BR>要执行这个命令,您必须有 VPN Server 管理员权限。<BR>此外,此命令在 VPN Bridge,群集管理器,独立的服务器在 VPN Server 工作时不起作用。<BR>此命令不能用于比 5190 更新的服务器。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>HubSetDynamic [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"HubSetDynamic" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定拟转变为动态虚拟 HUB 的名称。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.63 "HubList": 获取一个虚拟 HUB 列表</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">HubList</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取一个虚拟 HUB 列表</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在 VPN Server 中获得虚拟 HUB 的清单。对于每一个虚拟 HUB,可以获得 [虚拟 HUB 名称],[状态],[类型],[用户数量],[群数量],[访问数量],[MAC 目录的数量],[IP 目录数],[登陆次数],[上次登录],[最终通信时间]。<BR>但是,如果处于连接状态的虚拟 HUB 在管理模式下,对于匿名用户如果设定为不列举虚拟 HUB,则虚拟 HUB 不会被显示。如果您连接到服务器的管理模式,则所有的虚拟 HUB 会显示清单。<BR>如果你连接到群集控制器以外的其他群集成员,VPN Server 只显示虚拟 HUB 的托管虚拟主机。如果您连接到群集控制器来管理群集,所有虚拟 HUB 将显示。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>HubList</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"HubList" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.64 "Hub": 选择拟管理的虚拟 HUB</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">Hub</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选择拟管理的虚拟 HUB</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选择拟管理的虚拟 HUB。在 VPN Server 中,对目标虚拟 HUB 实行配置管理之前,需要用选择命令选定虚拟 HUB。<BR>当正在连接的 VPN Server 处于管理虚拟 HUB 模式时,您可以选定拟管理的一个虚拟 HUB,而不可以选择其他的虚拟 HUB。与正在连接的 VPN Server 处于服务器管理模式,可以对所有的虚拟 HUB 进行管理。<BR>获取当前的虚拟 HUB 列表,可以执行 HubList 命令。<BR>在 VPN Bridge 中,只可以选择名字中带 "BRIDGE" 的虚拟 HUB。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>Hub [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"Hub" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定拟管理的虚拟 HUB 的名称。如果您没有指定参数,目标虚拟 HUB 的选定将被清除。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.65 "MakeCert": 创建新的 X.509 证书和密钥</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">MakeCert</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					创建新的 X.509 证书和密钥</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					创建新的 X.509 证书和密钥,将其保存为一个文件。<BR>证书公共密钥和秘密密钥的生成算法使用 RSA 1024 位。<BR>作为证书类型,可以创建由根证书 (自签名证书) 和其他证书签名的某个证书。要创建由其他证书签名的证书,需要与用于签名的证书 (X.509格式文件) 相对应的密钥文件 (Base 64 编码)。<BR><BR>创建的证书可以指定名称 (CN),所属机构 (O),组织单位 (OU),国家 (C),州 (ST),当地 (L),序列号,有效期限。<BR>创建的证书以 X.509 格式的文件,密钥文件以 RSA 1024 位的 Base 64 编码文件,被分别保存。<BR><BR>MakeCert 指令是一个工具,它提供创建证书所需的最低功能。如果想创建一个真正的证书,建议使用 OpenSSL 等免费软件和出售的 CA (认证机构) 软件。<BR><BR>※注意: 此指令可以从 PacketiX VPN 命令行管理工具调用。虽然目前以管理模式连接到 VPN Server 和 VPN Client 时可以运行,但要实际运行 RSA 演算,生成证书数据的,是运行此指令的计算机,和以管理模式连接的链接目标计算机没有任何关系。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>MakeCert [/CN:cn] [/O:o] [/OU:ou] [/C:c] [/ST:st] [/L:l] [/SERIAL:serial] [/EXPIRES:expires] [/SIGNCERT:signcert] [/SIGNKEY:signkey] [/SAVECERT:savecert] [/SAVEKEY:savekey]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"MakeCert" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/CN</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定创建证书的名称 (CN) 项目。还可以指定 none。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/O</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定创建证书的所属机构 (O) 项目。还可以指定 none。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/OU</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定创建证书的组织单位 (OU) 项目。还可以指定 none。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/C</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定创建证书的国家 (C) 项目。还可以指定 none。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/ST</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定创建证书的州 (ST) 项目。还可以指定 none。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/L</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定创建证书的当地 (L) 项目。还可以指定 none。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SERIAL</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定创建证书的序列号项目。以 16 进制指定。还可以指定 none。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/EXPIRES</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定创建证书的有效期限。如果指定 none 或 0,将被使用 3650 天 (约 10 年)。最大可以指定 10950 天 (约 30 年)。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SIGNCERT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					根据现有的证书对要创建的证书签名时,指定用来签名的 X.509 形式的证书文件名。如果省略参数,将作为根证书而创建没有签名的新证书。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SIGNKEY</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定与 /SIGNCERT 指定的证书相应的密钥 (RSA,Base 64 的编码)</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SAVECERT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定文件名以保存创建的证书。该证书以包含 RSA 形式的 1024 位公开密钥的 X.509 文件格式被保存。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SAVEKEY</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定文件名保存对应创建的证书的密钥。该密钥以 RSA 形式的 1024 位密钥文件被保存。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.66 "TrafficClient": 在用户模式下,运行网络流量速度测试工具</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">TrafficClient</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在用户模式下,运行网络流量速度测试工具</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					运行通信吞吐量测量工具的客户端程序。<BR>通信吞吐量测量工具,作为 TrafficClient 和 TrafficServer 两个指令使用,可以测量在 IP 网络上连接的 2 台计算机之间可传送的通信吞吐量。在另一台计算机上使用 TrafficServer 指令使通信吞吐量测量工具服务器处于待机状态,用 TrafficClient 指令指定并连接其服务器的主机名或 IP 地址和端口号,测量通信速度。<BR>同时建立多个连接,计算各连接最大限度传送流数据的结果,及在指定时间内能够实际传送的数据的比特数,以此为依据计算通信吞吐量的平均值 (bps),用此方法进行通信速度的测量。通常,用一个 TCP 连接时,由于 TCP 算法的限制,大多数时候只能用比实际的网络吞吐量慢的速度通信。因此,建议测量同时建立多个 TCP 连接进行通信的结果。用此方法测量的吞吐量,以实际上作为 TCP 流到达接收方的数据的比特长度来计算,因此途中产生的数据包丢失和数据包损坏不包括在实际到达的数据包中,因而能够计算出纯粹的网络最大通信带宽的近似值。<BR>用作为测量结构的,在 TCP 内被传输的 TCP 流的大小,来计算在网络上实际传输的数据量的近似值,将其除以时间,计算出比特每秒 (bps)。假定计算的物理网络类型为以太网 (IEEE802.3) ,MAC 帧有效载荷的大小是 1,500 比特 (TCP 的 MSS 是 1,460 比特)。如果指定 /RAW 选项,不会对 TCP/IP 头和 MAC 头的数据量进行更正计算。<BR><BR>※注意: 此指令可以从 PacketiX VPN 命令行管理工具调用。虽然目前以管理模式连接到 VPN Server 和 VPN Client 时可以运行,但要实际进行通信,测量吞吐量的,是运行此指令的计算机,与以管理模式连接的连接目标计算机没有任何关系。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>TrafficClient [host:port] [/NUMTCP:numtcp] [/TYPE:download|upload|full] [/SPAN:span] [/DOUBLE:yes|no] [/RAW:yes|no]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"TrafficClient" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>host:port</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定通信吞吐量测量服务器 (TrafficServer) 待机时的主机名,或 IP 地址和端口号。如果省略端口号,9821 将被使用。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/NUMTCP</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定同时在客户端和服务器进行数据传输的 TCP 连接数量。如果省略,32 将被使用。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/TYPE</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定进行吞吐量测量时的数据传输流方向。指定下列选项之一: "download","upload" 或 "full"。指定 "download",则数据从服务器端向客户端传送。指定 "upload",则数据从客户端向服务器端传送。指定 "full",数据将双向传送。当指定 "full" 时,NUMTCP 的值必须指定是 2 以上的偶数 (同时被连接的 TCP 连接中一半用于下载的方向,而另一半用于上传的方向)。如果省略此参数,将使用 "full"。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SPAN</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					以秒为单位指定为测量吞吐量而进行数据传输时间。如果省略此参数,"15秒" 将被使用。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/DOUBLE</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定 "yes" 时,测量结果的吞吐量将显示为 2 倍。在中途有网络设备等,测量其其网络设备的输入输出合计的吞吐量能力时,此选项被使用。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/RAW</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					通过指定 "yes",不进行修正 TCP/IP 头和 MAC 头的数据量计算。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.67 "TrafficServer": 在服务器模式下,运行网络流量速度测试工具</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">TrafficServer</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在服务器模式下,运行网络流量速度测试工具</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					运行通信吞吐量测量工具的服务器程序。<BR>通信吞吐量测量工具,作为 TrafficClient 和 TrafficServer 两个指令使用,可以测量在 IP 网络上连接的 2 台计算机之间可传送的通信吞吐量。<BR>要使此计算机上的 TCP 端口处于待机状态,等待从另一台计算机的 TrafficClient 连接,启动 TrafficServer 指令并指定端口号。<BR>关于通信吞吐量测量工具的详细情况,输入 TrafficClient /? 将显示。<BR><BR>※注意: 此指令可以从 PacketiX VPN 命令行管理工具调用。虽然目前以管理模式连接 VPN Server 和 VPN Client 时可以运行,但要进行实际通信并测量吞吐量的,是运行此指令的计算机,与用管理模式连接终端的计算机没有任何关系。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>TrafficServer [port]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"TrafficServer" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>port</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					以整数指定等待连接的端口号。被指定的端口,如果已经由另一个程序在使用,或不能打开该端口时,将发生错误。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.68 "Check": 检测 PacketiX VPN 是否能正常运行</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">Check</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					检测 PacketiX VPN 是否能正常运行</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					正在运行 vpncmd 的计算机上,正检测 PacketiX VPN Server / Bridge 的运行平台是否适合。<BR>通过了这一检查的系统,PacketiX VPN 软件有较高的可能性进行正常运行。此外,无法通过此检查的系统,如果使用了 PacketiX VPN 软件可能会发生一些问题。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>Check</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"Check" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.69 "IPsecEnable": 启用或禁用 IPsec VPN Server 功能</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">IPsecEnable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					启用或禁用 IPsec VPN Server 功能</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在 PacketiX VPN Server 上启用或禁用IPsec VPN Server 功能。<BR>如果您禁用了此功能,VPN Server 上的虚拟 HUB 将会接受从 L2TP 兼容的 PC,Mac OS X 和智能手机的远程 VPN 连接,同时也会接受 EtherIP 站点到站点的 VPN 连接。从智能手机上的 VPN 连接,如iPhone、iPad 和 Android, 和从 Mac OS X 和 Windows 上的本地 VPN Client 的连接也都会接受。<BR><BR>要执行此命令,您必须具有 VPN Server 管理员权限。<BR>该命令在 VPN Bridge 上不能运行。<BR>以集群成员运行的 VPN Server 的虚拟 HUB 不能执行此命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>IPsecEnable [/L2TP:yes|no] [/L2TPRAW:yes|no] [/ETHERIP:yes|no] [/PSK:pre-shared-key] [/DEFAULTHUB:default_hub]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"IPsecEnable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/L2TP</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					启用或禁用 L2TP over IPsec 服务器功能。要接受来自 iPhone, iPad, Android, Windows 或者 Mac OS X 的 VPN 连接,请启用本选项。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/L2TPRAW</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					启用或禁用 L2TP 服务器功能 (未加密的原始 L2TP).要接受特殊 VPN 客服端,请启用本选项。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/ETHERIP</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					启用或禁用 EtherIP / L2TPv3 over IPsec服务器功能(为站点到站点 VPN Server 功能). 兼容 EtherIP over IPsec 的路由器产品就可以连接到 VPN Server 上的虚拟 HUB ,并建成二层(以太网)网桥。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/PSK</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定 IPsec 预共享密钥。IPsec 预共享密钥通常称为 "PSK" 或者"秘钥"。指定一个 8 位或者小于 8 位的密钥,并且将它分配给要连接到该 VPN Server 的用户。请注意:Google Android 4.0 有一个漏洞 bug,当预共享密钥是 10 位或以上时,会引发意外行为。介于这种情况,预共享密钥应该是 9 位或小于 9 位。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/DEFAULTHUB</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					为防止遗漏用户名上的 HUB 名,请指定默认的虚拟 HUB。用户应该指定他们的用户名,如 "用户名@目标虚拟 HUB 名" 来连接此 L2TP 服务器。如果指定的虚拟 HUB 被遗漏,那么上述HUB将会作为目标被使用。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.70 "IPsecGet": 获得当前IPsec VPN Server 设置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">IPsecGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获得当前IPsec VPN Server 设置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获得并显示在 PacketiX VPN Server 上的当前 IPsec VPN Server 设置。<BR><BR>要执行此命令,您必须具有 VPN Server 管理员权限。<BR>该命令在 VPN Bridge 上不能运行。<BR>以集群成员运行的 VPN Server 的虚拟 HUB 不能执行此命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>IPsecGet</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"IPsecGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.71 "EtherIpClientAdd": 添加新的 EtherIP / L2TPv3 over IPsec 客户端设置来接受 EtherIP / L2TPv3 客户端设备</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">EtherIpClientAdd</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					添加新的 EtherIP / L2TPv3 over IPsec 客户端设置来接受 EtherIP / L2TPv3 客户端设备</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					添加一个新的设置条目启用 EtherIP / L2TPv3 over IPsec 服务器功能来接受客户端设备。<BR>为了能够通过EtherIP / L2TPv3 over IPsec 服务器功能接受来自路由器的连接,您需要定义两者之间的关系表。这两者分别是表示客户端兼容EtherIP / L2TPv3 over IPsec 路由器的IPsec Phase 1 字符串和目标虚拟 HUB 的名称。<BR>在您使用 EtherIpClientAdd 命令添加了一个连接定义后,这个定义的连接设置将会被应用到, EtherIP / L2TPv3 over IPsec 客户端设备的接入请求会话中。<BR>用户名和密码条目必须要在虚拟 HUB 上注册。一个 EtherIP / L2TPv3 客户端会被认为它使用如上的用户信息的身份连接到虚拟 HUB 。n<BR>为执行此命令,您必须具有 VPN Server 管理员权限。<BR>该命令在 VPN Bridge 上不能运行。<BR>以集群成员运行的 VPN Server 的虚拟 HUB 不能执行此命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>EtherIpClientAdd [ID] [/HUB:hubname] [/USERNAME:username] [/PASSWORD:password]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"EtherIpClientAdd" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>ID</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定一个 ISAKMP Phase 1 ID。这个 ID 必须与 EtherIP / L2TPv3 客户端的ID配置完全相同。如果. EtherIP 客户端用 IP 地址作为Phase 1 ID,您可以指定像 ID 的字符类似的 IP 地址。如果您指定 '*' (星号),它将会是一个与任一不符合其他具体规则的客户端相符合的通配符。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/HUB</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要连接的虚拟 HUB 名称。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/USERNAME</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定连接到目的虚拟 HUB 的用户名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/PASSWORD</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定连接到目的虚拟 HUB 的密码。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.72 "EtherIpClientDelete": 删除一个 EtherIP / L2TPv3 over IPsec 客户端设置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">EtherIpClientDelete</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除一个 EtherIP / L2TPv3 over IPsec 客户端设置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					本命令删除一个通过使用 EtherIP / L2TPv3 over IPsec 功能来接受 VPN Client 的条目。<BR><BR>要执行此命令,您必须具有 VPN Server 管理员权限。<BR>该命令在 VPN Bridge 上不能运行。<BR>以集群成员运行的 VPN Server 的虚拟 HUB 不能执行此命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>EtherIpClientDelete [ID]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"EtherIpClientDelete" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>ID</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定一个要删除的 ISAKMP Phase 1 ID</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.73 "EtherIpClientList": 获得当前 EtherIP / L2TPv3 客户端设备条目定义列表</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">EtherIpClientList</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获得当前 EtherIP / L2TPv3 客户端设备条目定义列表</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					这个命令会获得和显示通过 EtherIP / L2TPv3 over IPsec 功能来接受 VPN Client 条目的列表。<BR><BR>要执行此命令,您必须具有 VPN Server 管理员权限。<BR>该命令在 VPN Bridge 上不能运行。<BR>以集群成员运行的 VPN Server 的虚拟 HUB 不能执行此命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>EtherIpClientList</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"EtherIpClientList" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.74 "OpenVpnEnable": 启用/禁用 OpenVPN 克隆服务器功能</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">OpenVpnEnable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					启用/禁用 OpenVPN 克隆服务器功能</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					本 VPN Server 有 OpenVPN Technologies, Inc. 公司生产的 OpenVPN 软件产品的克隆功能。任何 OpenVPN Client 都可以连接到本 VPN Server。<BR><BR>指定用户名连接到虚拟 HUB 的的方式,使用本克隆服务器功能来为默认虚拟 HUB 的选择规则都与 IPsec 服务器功能相同。详情,请参见 IPsecEnable 命令的帮助。<BR><BR>要执行此命令,您必须具有 VPN Server 管理员权限。<BR>该命令在 VPN Bridge 上不能运行。<BR>以集群成员运行的 VPN Server 的虚拟 HUB 不能执行此命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>OpenVpnEnable [yes|no] [/PORTS:udp_port_list]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"OpenVpnEnable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>yes|no</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定 "yes",启用 OpenVPN 克隆服务器功能。指定 "no" 禁用该功能。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/PORTS</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定UDP端口监听 OpenVPN 。指定多个 UDP 端口可以用空格或者逗号分开来它们,例如: "1194, 2001, 2010, 2012"。OpenVPN 的默认端口是 UDP 1194。您也可以指定任一其他 UDP 端口。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.75 "OpenVpnGet": 获取 OpenVPN 克隆服务器功能的当前设置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">OpenVpnGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取 OpenVPN 克隆服务器功能的当前设置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取并显示 OpenVPN 克隆服务器功能的当前设置。<BR><BR>要执行此命令,您必须具有 VPN Server 管理员权限。<BR>该命令在 VPN Bridge 上不能运行。<BR>以集群成员运行的 VPN Server 的虚拟 HUB 不能执行此命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>OpenVpnGet</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"OpenVpnGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.76 "OpenVpnMakeConfig": 生成 OpenVPN Client 样本设置文件</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">OpenVpnMakeConfig</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					生成 OpenVPN Client 样本设置文件</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					原来,OpenVPN Client 会要求用户手写很难的配置文件。本工具可以帮助您创建一个有用的配置样本。你所需要生成的 OpenVPN Client 配置文件就是运行此命令。<BR><BR>要执行此命令,您必须具有 VPN Server 管理员权限。<BR>该命令在 VPN Bridge 上不能运行。<BR>以集群成员运行的 VPN Server 的虚拟 HUB 不能执行此命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>OpenVpnMakeConfig [ZIP_FileName]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"OpenVpnMakeConfig" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>ZIP_FileName</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定以 ZIP 压缩格式保存的输出文件。如果没指定文件后缀,那么".zip" 后缀就会被添加在文件名上。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.77 "SstpEnable": 启用/禁用 Microsoft SSTP VPN 克隆服务器功能</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">SstpEnable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					启用/禁用 Microsoft SSTP VPN 克隆服务器功能</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					本 VPN Server 拥有植入在微软 Windows Server 2008 / 2012 中的 MS-SSTP VPN Server 的克隆功能。Windows Vista / 7 / 8 / RT 中的标准 MS-SSTP 用户端可以连接本 VPN Server。<BR><BR>[注意]<BR>在 VPN Server 上的 SSL 证书 CN 值必须要和指定给客户端的主机名吻合。并且,该证书必须在 SSTP VPN Client 的信任列表中。详情请参见微软相关文件。<BR>您可以用用 ServerCertRegenerate 命令来取代当前 VPN Server 的证书,形成一个新的,有 CN 值字段的自我认证证书。这样的话,您需要在 SSTP VPN Client 注册这样一个新的自我认证证书作为一个可信任根证书。如果您的确想做这件复杂的事,请考虑购买一个商业权威机构的 SSL 证书,如 VeriSign 或者 GlobalSign。<BR><BR>指定用户名连接到虚拟 HUB 的的方式,使用本克隆服务器功能来为默认虚拟 HUB 的选择规则都与 IPsec 服务器功能相同。详情,请参见 IPsecEnable 命令的帮助。<BR><BR>要执行此命令,您必须具有 VPN Server 管理员权限。<BR>该命令在 VPN Bridge 上不能运行。<BR>以集群成员运行的 VPN Server 的虚拟 HUB 不能执行此命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>SstpEnable [yes|no]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"SstpEnable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>yes|no</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定 "yes",启用Microsoft SSTP VPN 克隆服务器功能。指定 "no" 禁用该功能。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.78 "SstpGet": 获得 Microsoft SSTP VPN 克隆服务器功能的当前设置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">SstpGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获得 Microsoft SSTP VPN 克隆服务器功能的当前设置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获得并显示 Microsoft SSTP VPN 克隆服务器功能的当前设置。<BR><BR>要执行此命令,您必须具有 VPN Server 管理员权限。<BR>该命令在 VPN Bridge 上不能运行。<BR>以集群成员运行的 VPN Server 的虚拟 HUB 不能执行此命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>SstpGet</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"SstpGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.79 "ServerCertRegenerate": 生成一个新的带有指定 CN (Common Name) 的自签名证书,并且在 VPN Server 上注册。</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ServerCertRegenerate</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					生成一个新的带有指定 CN (Common Name) 的自签名证书,并且在 VPN Server 上注册。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					您可以使用此命令,将当前 VPN Server 上的证书替换成一个新的、有 CN (Common Name) 值字段的、自签字证书。n<BR>此命令在您想使用 Microsoft SSTP VPN 克隆服务器功能时很方便。因为在 VPN Server 上 SSL 证书的 CN 值必须要与 SSTP VPN Client 指定的主机名吻合。<BR>详情参见 SstpEnable 命令的帮助。<BR><BR>本命令会删除 VPN Server 上现有的 SSL 证书。这要求事先使用 ServerKeyGet 命令备份当前的 SSL 证书和密钥。<BR><BR>要执行此命令,您必须具有 VPN Server 管理员权限。<BR>该命令在 VPN Bridge 上不能运行。<BR>以集群成员运行的 VPN Server 的虚拟 HUB 不能执行此命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ServerCertRegenerate [CN]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ServerCertRegenerate" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>CN</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定一个新证书要使用的 Common Name(CN)</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.80 "VpnOverIcmpDnsEnable": 启用/禁用 VPN over ICMP / VPN over DNS服务器功能</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">VpnOverIcmpDnsEnable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					启用/禁用 VPN over ICMP / VPN over DNS服务器功能</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					即使有防火墙或者有屏蔽TCP/IP通信的路由器,您也可以只用 ICMP 或者 DNS 数据包建立一个 VPN 。您需要事先启用如下功能。<BR><BR>注意:本功能仅在紧急情况下使用。它在有防火墙或者路由器被错误配置屏蔽 TCP/IP 时,并且 ICMP 和 DNS 都没有被屏蔽的情况下可使用。它不是为长期稳定使用的。<BR><BR>要执行此命令,您必须具有 VPN Server 管理员权限。<BR>该命令在 VPN Bridge 上不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>VpnOverIcmpDnsEnable [/ICMP:yes|no] [/DNS:yes|no]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"VpnOverIcmpDnsEnable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/ICMP</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定 "yes",启用 VPN over ICMP 服务器。指定 "no",禁用。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/DNS</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定 "yes",启用 VPN over DNS服务器。指定 "no",禁用。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.81 "VpnOverIcmpDnsGet": 获取 VPN over ICMP / VPN over DNS 功能的当前设置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">VpnOverIcmpDnsGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取 VPN over ICMP / VPN over DNS 功能的当前设置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获得并显示 VPN over ICMP / VPN over DNS 功能的当前状态。<BR><BR>要执行此命令,您必须具有 VPN Server 管理员权限。<BR>该命令在 VPN Bridge 上不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>VpnOverIcmpDnsGet</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"VpnOverIcmpDnsGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.82 "DynamicDnsGetStatus": 显示动态 DNS 功能的当前状态</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">DynamicDnsGetStatus</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					显示动态 DNS 功能的当前状态</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获得并显示动态 DNS 功能的当前状态。<BR><BR>动态 DNS 会为本 VPN Server 分配一个唯一的和永久的 DNS 主机名。您可以在设置 VPN Client 和 VPN Bridge 时使用该主机名指定的 VPN Server。您不必注册并且保存域名。<BR>同时,如果您的 ISP 分派给您一个动态(不稳定) IP 地址,您的动态 DNS 主机名相应的 IP 地址也将会自动改变。它使您只用动态 IP 地址就可以保持 VPN Server 的运行。<BR>因此,您再也不需要为了维持静态全球 IP 地址,每月花费费用了。<BR>[注意]<BR>要禁止动态 DNS 功能,修改 VPN Server 和配置文件。<BR><BR>"declare root" 指令有"declare DDnsClient"指令。在本指令中,那你可以从错误到正确切换"bool disable",并重启 VPN Server ,这样,动态 DNS 功能就禁用了。<BR><BR>要执行此命令,您必须具有 VPN Server 管理员权限。<BR>该命令在 VPN Bridge 上不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>DynamicDnsGetStatus</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"DynamicDnsGetStatus" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.83 "DynamicDnsSetHostname": 设置动态 DNS 主机名</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">DynamicDnsSetHostname</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置动态 DNS 主机名</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					您可以用本命令更改动态 DNS 功能分配的主机名。当前分配的主机名可以通过使用 DynamicDnsGetStatus 命令来显示。<BR><BR>动态 DNS 为 VPN Server 分配了一个唯一的和永久的 DNS 主机名。您可以在设置 VPN Client 和 VPN Bridge 时使用该主机名指定的 VPN Server。您不必注册并且保存域名。<BR>同时,如果您的 ISP 分派给您一个动态(不稳定) IP 地址,您的动态 DNS 主机名相应的 IP 地址也将会自动改变。它使您只用动态 IP 地址就可以保持 VPN Server 的运行。<BR>因此,您再也不需要为了维持静态全球 IP 地址,每月花费费用了。<BR>[注意]<BR>要禁止动态 DNS 功能,修改 VPN Server 和配置文件。<BR><BR>"declare root" 指令有"declare DDnsClient"指令。在本指令中,那你可以从错误到正确切换"bool disable",并重启 VPN Server,这样,动态 DNS 功能就禁用了。<BR><BR>要执行此命令,您必须具有 VPN Server 管理员权限。<BR>该命令在 VPN Bridge 上不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>DynamicDnsSetHostname [hostname]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"DynamicDnsSetHostname" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>hostname</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定新的主机名,主机名长度最短3个字母,最长为 31 个字母。仅限数字和字母。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.84 "VpnAzureGetStatus": 显示 VPN Azure 功能的当前状态</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">VpnAzureGetStatus</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					显示 VPN Azure 功能的当前状态</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取和显示 VPN Azure 功能的当前状态。<BR><BR>VPN Azure 可以更容易地从你家里的计算机到你办公室的计算机建立一个VPN会话。当一个 VPN 连接建立了,您可以访问您公司专用网络上的任何其他服务器。在办公室的计算机(VPN 服务器)上,你并不需要一个全球 IP 地址。它可以在防火墙或 NAT 后面工作。无需网络管理员的配置。您可以在您的家用电脑使用 Windows 内置的 SSTP VPN 客户端。<BR>VPN Azure 是一个云 VPN 服务由 SoftEther 公司经营。VPN Azure 是免费的,可提供给任何人。访问 http://www.vpnazure.net/ 查看详细信息和如何使用的说明。<BR><BR>VPN Azure 主机名与动态 DNS 设置的主机名相同,但改变的域名后缀为“vpnazure.net”。要改变主机名使用 DynamicDnsSetHostname 命令。<BR><BR>要执行此命令,你必须具有VPN 服务器管理员权限。<BR>此命令不能在 VPN 网桥上运行。<BR>以集群成员运行的 VPN 服务器的虚拟 HUB 不能执行此命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>VpnAzureGetStatus</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"VpnAzureGetStatus" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.3.85 "VpnAzureSetEnable": 启用/禁用 VPN Azure 功能</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">VpnAzureSetEnable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					启用/禁用 VPN Azure 功能</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					启用或禁用 VPN Azure 功能。<BR><BR>VPN Azure 可以更容易地从你家里的计算机到你办公室的计算机建立一个 VPN 会话。当一个 VPN 连接建立了,您可以访问您公司专用网络上的任何其他服务器。<BR>在办公室的计算机(VPN 服务器)上,你并不需要一个全球 IP 地址。它可以在防火墙或 NAT 后面工作。无需网络管理员的配置。您可以在您的家用电脑使用 Windows 内置的 SSTP VPN 客户端。<BR>VPN Azure 是一个云 VPN 服务由 SoftEther 公司经营。VPN Azure 是免费的,可提供给任何人。访问 http://www.vpnazure.net/ 查看详细信息和如何使用的说明。<BR><BR>VPN Azure 主机名与动态 DNS 设置的主机名相同,但改变的域名后缀为“vpnazure.net”。要改变主机名使用 DynamicDnsSetHostname 命令。<BR><BR>要执行此命令,你必须具有 VPN 服务器管理员权限。<BR>此命令不能在 VPN 网桥上运行。<BR>以集群成员运行的 VPN 服务器的虚拟 HUB 不能执行此命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>VpnAzureSetEnable [yes|no]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"VpnAzureSetEnable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>yes|no</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定“yes”,启用 VPN Azure。“no”禁用它。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+
+
+
+
+
+
+
+
+
+
+------ 2 ------
+
+
+
+
+
+
+
+
+
+		<h3>6.4.1 "Online": 虚拟 HUB 的联机</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">Online</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					虚拟 HUB 的联机</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果您正在管理的虚拟 HUB 处于脱机状态,请设置成联机。处于脱机状态的虚拟 HUB,不会接受来自 VPN Client 连接。将虚拟 HUB 设定成联网状态,从而可以接受用户的虚拟连接并提供服务。<BR>此命令,在 VPN Bridge 中不会运行。<BR>此命令在 VPN Server 中的虚拟集群 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>Online</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"Online" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.2 "Offline": 虚拟 HUB 脱机</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">Offline</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					虚拟 HUB 脱机</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果您正在管理的虚拟 HUB 在线,设置成脱机。虚拟 HUB 如果有连接程序,将全部断开。虚拟 HUB 处于脱机状态,不会接受来自 VPN Client 连接。<BR>此命令,在 VPN Bridge 中不会运行。<BR>此命令在 VPN Server 中的虚拟集群 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>Offline</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"Offline" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.3 "SetMaxSession": 设定虚拟 HUB 的最大同时在线用户数量</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">SetMaxSession</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设定虚拟 HUB 的最大同时在线用户数量</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设定现在正在管理的虚拟 HUB 的最大同时在线客户数量。当超过这个数量时,如果从 VPN Client 和 VPN Bridge 连接的时候,超过了最大并发会话数,更多的客户将无法连接。最大同时在线客户数的限制不包括本地的网桥,虚拟的 NAT,级联连接等生成连接不包括在内。<BR>设置同时在线最大数目,可以通过运行 OptionsGet 命令获得。<BR>此命令,在 VPN Bridge 中不会运行。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>SetMaxSession [max_session]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"SetMaxSession" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>max_session</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置最大同时在线客户数,使用整数。当您指定为 0 时,客户数没有限制。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.4 "SetHubPassword": 设置虚拟 HUB 的管理密码</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">SetHubPassword</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置虚拟 HUB 的管理密码</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置目前正在管理的虚拟 HUB 的管理密码。虚拟 HUB,如果设置了管理密码,您可以应用管理密码,虚拟 HUB,VPN Server 的公用事业,虚拟 HUB 连接,您可以通过指定一个连接密码在虚拟 HUB 的管理模式下实现连接。此外,通过 VPN Client 和 VPN Bridge,用户名用 "Administrator" 通过管理员密码,也可以实现连接。<BR>此命令,不能在 VPN Bridge 中运行。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>SetHubPassword [password]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"SetHubPassword" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>password</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设定密码。如果您不指定将被提示输入密码。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.5 "SetEnumAllow": 设定虚拟 HUB 允许向匿名用户显示。</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">SetEnumAllow</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设定虚拟 HUB 允许向匿名用户显示。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					变更虚拟 HUB 的控制选项,对于匿名用户,允许虚拟 HUB 显示。当您设置了此选项,VPN Client 的用户,在 VPN Server 只需输入地址即可显示虚拟 HUB。虚拟 HUB 一创建成功,即可显示。此外,如果执行 SetEnumDeny 命令,可以禁止向匿名用户显示。虚拟 HUB 是在统计创建时设定允许显示与否。<BR>此命令,在 VPN Bridge 中不会运行。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>SetEnumAllow</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"SetEnumAllow" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.6 "SetEnumDeny": 设定虚拟 HUB 禁止向匿名用户显示。</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">SetEnumDeny</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设定虚拟 HUB 禁止向匿名用户显示。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					变更虚拟 HUB 的控制选项,对于匿名用户,禁止虚拟 HUB 显示。当您设置了此选项,VPN Client 的用户,在 VPN Server 输入检索虚拟 HUB,虚拟 HUB 也不会显示。此外,如果执行 SetEnumAllow 命令,可以允许向匿名用户显示。虚拟 HUB 是在统计创建时设定允许显示与否。<BR>此命令,在 VPN Bridge 中不会运行。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>SetEnumDeny</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"SetEnumDeny" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.7 "OptionsGet": 获得虚拟 HUB 的设置选项</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">OptionsGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获得虚拟 HUB 的设置选项</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取虚拟 HUB 的选项设置清单。虚拟 HUB 允许 / 禁止显示设置,最大的同时在线数量,在线 / 离线状态,和集群虚拟环境中 HUB 的类型。<BR>此命令对于一个虚拟集群 HUB 不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>OptionsGet</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"OptionsGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.8 "RadiusServerSet": 使用在用户认证中使用的 RADIUS 服务器设置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">RadiusServerSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					使用在用户认证中使用的 RADIUS 服务器设置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					接受用户当前以 RADIUS 服务器认证模式管理虚拟 HUB ,你需指定外部 RADIUS 服务器,以确认用户名和密码(您可以指定多个主机名,并将它们用逗号或者分号隔开)。<BR>Radius 服务器必须设置为接受来自 VPN Server IP 地址的请求。此外,密码认证协议(PAP)的认证必须被启用。<BR>此命令不能在 VPN Bridge 上运行。<BR>此命令在 VPN Server 以集群运行的虚拟 HUB 上不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>RadiusServerSet [server_name:port] [/SECRET:secret] [/RETRY_INTERVAL:interval]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"RadiusServerSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>server_name:port</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					用 [主机名:端口号] 的格式,指定 RADIUS 服务器的主机名,IP 地址和 UDP 端口号。如果省略端口号则用 1812。您可以指定多个主机名,并将它们用逗号或者分号隔开。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SECRET</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置与 RADIUS 服务器之间的通信 (密码)。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.9 "RadiusServerDelete": 删除应用于用户认证的 RADIUS 服务器设置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">RadiusServerDelete</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除应用于用户认证的 RADIUS 服务器设置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					目前,正在管理的虚拟 HUB,用户以 RADIUS 服务器认证模式连接时,删除外部 RADIUS 服务器设定,使服务器不能验证。目前 RADIUS 服务器的设置,可以运行 RadiusServerGet 命令获得。<BR>此命令,虚拟 VPN Bridge 中不能运行。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>RadiusServerDelete</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"RadiusServerDelete" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.10 "RadiusServerGet": 获取用于用户认证的 RADIUS 服务器设置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">RadiusServerGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取用于用户认证的 RADIUS 服务器设置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					用户使用 RADIUS 服务器身份验证模式连接到现在管理的虚拟 HUB,您可以获取 RADIUS 服务器的当前设置。<BR>此命令,在虚拟 VPN Bridge 中不能运行。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>RadiusServerGet</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"RadiusServerGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.11 "StatusGet": 获取虚拟 HUB 的当前状况</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">StatusGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取虚拟 HUB 的当前状况</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取正在管理的虚拟 HUB 的当前状况,可以获得虚拟 HUB 的种类,连接数量,各种目标数,登陆次数,最后一次登陆时间,最终连接时间,通信的统计数据等。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>StatusGet</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"StatusGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.12 "LogGet": 获取虚拟 HUB 日志的保存设定</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">LogGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取虚拟 HUB 日志的保存设定</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取虚拟 HUB 日志的保存设置。获取安全日志和数据包日志的保存设定,保存对象等信息。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>LogGet</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"LogGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.13 "LogEnable": 启用安全日志或数据包日志</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">LogEnable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					启用安全日志或数据包日志</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					启用现在正在管理的 HUB 的安全日志或数据包日志。<BR>当前的设置,可以通过 LogGet 命令获得。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>LogEnable [security|packet]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"LogEnable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>security|packet</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选择启用日志文件的类型。选定 "security" 或 "packet"。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.14 "LogDisable": 禁用安全日志或数据包日志</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">LogDisable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					禁用安全日志或数据包日志</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					禁止使用现在正在管理的 HUB 的安全日志或数据包日志。<BR>当前的设置,可以通过 LogGet 命令获得。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>LogDisable [security|packet]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"LogDisable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>security|packet</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选择禁用日志文件的类型。选定 "security" 或 "packet"。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.15 "LogSwitchSet": 设定替换日志文件的周期</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">LogSwitchSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设定替换日志文件的周期</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设定现在管理的虚拟 HUB 所保存的安全日志或数据包日志文件的替换周期。替换日志文件的时间是可以设定为 1 秒,1 分钟,1 小时,每天,每月,您也可以设定为不替换。<BR>当前的设置,可以通过 LogGet 命令获得。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>LogSwitchSet [security|packet] [/SWITCH:sec|min|hour|day|month|none]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"LogSwitchSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>security|packet</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选择变更设定的日志文件的类型。 选定 "security" 或 "packet"。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SWITCH</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置替换周期。从 sec,min,hour,day,month,none 中选择。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.16 "LogPacketSaveType": 设置保存为数据包日志文件的数据包种类及保存。</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">LogPacketSaveType</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置保存为数据包日志文件的数据包种类及保存。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					逐项设定保存在在管理的虚拟 HUB 上的,数据包保存内容和数据包的类型。数据包类型包括,[TCP 连接日志],[TCP 数据包日志],[DHCP 数据包记录],[UDP 数据包日志],[ICMP 数据包日志],[IP 数据包日志],[ARP 数据包日志],[以太网数据包日志] 等。<BR>要想获取当前的设置,可以运行 LogGet 命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>LogPacketSaveType [/TYPE:tcpconn|tcpdata|dhcp|udp|icmp|ip|arp|ether] [/SAVE:none|header|full]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"LogPacketSaveType" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/TYPE</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					保存内容对应的数据包类型,从 tcpconn,tcpdata,dhcp,udp,icmp,ip,arp,ether 中选定。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SAVE</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设定日志文件的保存内容。从下列选定:
+none: 不保存
+header: 仅保存标题
+full: 所有数据包</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.17 "CAList": 获取可以信任的机构颁发证书的列表</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CAList</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取可以信任的机构颁发证书的列表</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					管理可以信任的机构颁发的证书。VPN Client 如果用认证模式连接时,可以用保存的证书来验证其提供的证书。<BR>此命令,在虚拟 VPN Bridge 中不能运行。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CAList</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CAList" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.18 "CAAdd": 添加可以信任的机构颁发的证书</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CAAdd</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					添加可以信任的机构颁发的证书</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在虚拟 HUB 管理的可信任的证书颁发机构的证书列表中,添加一个新的证书。如果客户端使用签名认证模式连接,管理中的证书将用来识别客户的证书。<BR>要取得当前的证书列表,可以执行 CAList 命令。<BR>要添加一个证书,必须将证书保存为 X.509 格式保存。<BR>此命令,在虚拟 VPN Bridge 中不能运行。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CAAdd [path]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CAAdd" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>path</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定注册 X.509 证书的文件名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.19 "CADelete": 删除可以信任的机构颁发的证书</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CADelete</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除可以信任的机构颁发的证书</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					从正在管理的可信任机构颁发的证书列表中,删除现有的证书。<BR>如果要获取当前的证书列表,可以执行 CAList 命令。<BR>此命令,在虚拟 VPN Bridge 中不能运行。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CADelete [id]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CADelete" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>id</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定拟删除的证书的 ID。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.20 "CAGet": 获得可信任机构颁发的证书。</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CAGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获得可信任机构颁发的证书。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取虚拟 HUB 目前管理的可信任机构颁布的证书的列表,并将其保存为 X.509 的文件格式。<BR>此命令,在虚拟 VPN Bridge 中不能运行。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CAGet [id] [/SAVECERT:path]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CAGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>id</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					制定获得证书的 ID。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SAVECERT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定文件名以保存获取的证书。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.21 "CascadeList": 获取级联接续列表</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadeList</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取级联接续列表</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取当前虚拟 HUB 上登记的级联名单。<BR>如果您使用虚拟 HUB 级联同一台或另一个虚拟机上的 HUB,这两个层可以级联。<BR><BR>[使用级联的警告]<BR>如果您使用级联多个虚拟 HUB 可以构成 2 层的网桥,如果连接方法错误可能会将连接做成绳状。所以使用级联功能,一定要精心设计。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CascadeList</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadeList" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.22 "CascadeCreate": 创建一个新的级联接续</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadeCreate</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					创建一个新的级联接续</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在当前虚拟 HUB 上创建一个新的级联接续。<BR>如果您使用虚拟 HUB 级联同一个或者另一个虚拟 HUB,可以建立级联接续。<BR>要创建一个级联,作为初始参数,需设定级联的名称,连接的服务器,目标 HUB 的名称和用户名。创建一个新的级联时,用户身份验证类型被初始化为 [匿名认证],代理服务器和服务器证书验证未设置。要更改这些设置,请在创建一个级联之后用 "Cascade" 命名的指令来执行。<BR><BR>[使用级联的警告]<BR>如果您使用级联多个虚拟 HUB 可以构成 2 层的网桥,如果连接方法错误可能会将连接做成绳状。所以使用级联功能,一定要精心设计。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CascadeCreate [name] [/SERVER:hostname:port] [/HUB:hubname] [/USERNAME:username]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadeCreate" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定新创建级联的名称。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SERVER</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					按照 [主机名:端口号] 的格式,设置 VPN Server 的主机名和端口号,您也可以指定 IP 地址。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/HUB</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定目标 VPN Server 内的虚拟 HUB。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/USERNAME</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设定连接到 VPN Server 时所须的用户名认证名称。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.23 "CascadeSet": 对级联连接方的设定</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadeSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					对级联连接方的设定</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					对于虚拟 HUB 目前管理的已经连接的级联,设置连接方的 VPN 主机名和端口号,虚拟 HUB 名,用户名等。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CascadeSet [name] [/SERVER:hostname:port] [/HUB:hubname]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadeSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定级联名称来改变设置。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SERVER</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					按照 [主机名:端口号] 的格式,设置连接方 VPN Server 的主机名和端口号。您也可以指定 IP 地址。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/HUB</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置连接方 VPN Server 内的虚拟 HUB。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.24 "CascadeGet": 获取级联连接的设置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadeGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取级联连接的设置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取当前在虚拟 HUB 上注册的级联的连接设置。<BR>另外,要改变级联的连接设置,可以在您创建一个级联后使用 "Cascade" 开头的命令。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CascadeGet [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadeGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定级联获取它的连接设置。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.25 "CascadeDelete": 删除级联连接</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadeDelete</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除级联连接</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除目前在虚拟 HUB 中注册的级联连接。如果选定的级联连接处于联机状态,则先断开连接,然后删除。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CascadeDelete [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadeDelete" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定您想删除的级联连接的名称。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.26 "CascadeUsernameSet": 设置级联连接的用户名</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadeUsernameSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置级联连接的用户名</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定已在虚拟 HUB 上注册的级联,设定其用户名,当连接到 VPN Server 时,用此用户名来进行身份验证。<BR>此外,您可以指定用户身份验证的种类,或可以指定所需的参数。如果您想更改这些设置,可以运行 CascadeAnonymousSet,CascadePasswordSet,CascadeCertSet 等命令。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CascadeUsernameSet [name] [/USERNAME:username]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadeUsernameSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定级联名称来改变设置。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/USERNAME</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					级联连接到 VPN Server 时,指定用户名要求用户进行身份验证。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.27 "CascadeAnonymousSet": 将级联连接的用户认证类型设置为匿名身份验证</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadeAnonymousSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					将级联连接的用户认证类型设置为匿名身份验证</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定虚拟 HUB 中已经注册的级联,将级联连接到 VPN Server 所需的用户身份验证方法设定为匿名身份验证。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CascadeAnonymousSet [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadeAnonymousSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定级联名称来改变设置。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.28 "CascadePasswordSet": 将级联连接时所需的用户验证设置为密码验证</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadePasswordSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					将级联连接时所需的用户验证设置为密码验证</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定虚拟 HUB 中已经注册的级联,将级联连接到 VPN Server 所需的用户身份验证方法设定为密码验证。密码验证的种类指定为,[标准密码验证] 和 [RADIUS 或 NT域身份验证]。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CascadePasswordSet [name] [/PASSWORD:password] [/TYPE:standard|radius]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadePasswordSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定级联名称来改变设置。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/PASSWORD</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定密码验证所使用的密码。否则,会提示您输入密码。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/TYPE</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					密码验证的类型,指定为 "standard" (标准密码验证),或 "radius" (radius 或 NT 域身份验证)。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.29 "CascadeCertSet": 将级联连接时所需的用户验证设置为客户证书验证</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadeCertSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					将级联连接时所需的用户验证设置为客户证书验证</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定虚拟 HUB 中已经注册的级联,将级联连接到 VPN Server 所需的用户身份验证方法设定为客户证书验证。证书应为 X.509 证书文件格式,并且用变换为 Base 64 密钥文件编码。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CascadeCertSet [name] [/LOADCERT:cert] [/LOADKEY:key]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadeCertSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定级联名称来改变设置。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/LOADCERT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定 X.509 证书名称用来进行证书认证。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/LOADKEY</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定与证书对应的 Base 64 编码的密钥文件。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.30 "CascadeCertGet": 获取级联连接所需的客户端证书</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadeCertGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取级联连接所需的客户端证书</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定当前在虚拟 HUB 上已注册的级联接续,如果您使用客户端证书身份验证,请获取证书,保存为 X.509 格式。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CascadeCertGet [name] [/SAVECERT:cert]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadeCertGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定级联名称获取设置。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SAVECERT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取证书指定文件名保存为 X.509 格式。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.31 "CascadeEncryptEnable": 启用级联通信时加密</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadeEncryptEnable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					启用级联通信时加密</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定已经在当前虚拟 HUB 注册的级联连接,当此连接和 VPN Server 之间通信时,设置通信内容为 SSL 加密。<BR>通常情况下,和 VPN Server 的通信进行 SSL 加密,以防止窃听和篡改信息。您还可以禁用加密。如果您禁用加密,通信的流速将提高,传输数据以明文传输到网络上。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CascadeEncryptEnable [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadeEncryptEnable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定级联名称来改变设置。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.32 "CascadeEncryptDisable": 级联连接通信时,禁用加密</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadeEncryptDisable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					级联连接通信时,禁用加密</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定已经在当前虚拟 HUB 注册的级联连接,当此连接和 VPN Server 之间通信时,设置通信内容为禁止加密。<BR>通常情况下,和 VPN Server 的通信进行 SSL 加密,以防止窃听和篡改信息。您还可以禁用加密。如果您禁用加密,通信的流速将提高,传输数据以明文传输到网络上。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CascadeEncryptDisable [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadeEncryptDisable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定级联名称来改变设置。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.33 "CascadeCompressEnable": 启用级联通信是数据压缩功能</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadeCompressEnable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					启用级联通信是数据压缩功能</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定已经在当前虚拟 HUB 注册的级联连接,当此连接和 VPN Server 之间通信时,设置通信内容为压缩内容。<BR>压缩量最大可以达到 80% 。但是,实行压缩,会给客户端和服务器双方的 CPU 造成很高的负荷。如果网络速度在 10 Mbps 以上,实施压缩后会减少传输流量,可能会适得其反。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CascadeCompressEnable [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadeCompressEnable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定级联名称来改变设置。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.34 "CascadeCompressDisable": 级联通信是数据禁止压缩功能</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadeCompressDisable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					级联通信是数据禁止压缩功能</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定已经在当前虚拟 HUB 注册的级联连接,当此连接和 VPN Server 之间通信时,设置通信内容为禁止压缩。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CascadeCompressDisable [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadeCompressDisable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定级联名称来改变设置。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.35 "CascadeProxyNone": 将级联的连接方法设置为直接与 TCP/IP 连接</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadeProxyNone</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					将级联的连接方法设置为直接与 TCP/IP 连接</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定已经在当前虚拟 HUB 注册的级联连接,当此连接和 VPN Server 之间通信时,设置连接方法为 [直接与 TCP/IP 连接],而不通过代理服务器。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CascadeProxyNone [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadeProxyNone" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定级联名称来改变设置。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.36 "CascadeProxyHttp": 将级联连接方法设定为通过 HTTP 代理服务器</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadeProxyHttp</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					将级联连接方法设定为通过 HTTP 代理服务器</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定已经在当前虚拟 HUB 注册的级联连接,当此连接和 VPN Server 之间通信时,设置连接方法为,[通过 HTTP 代理服务器连接],然后设置要通过的 HTTP 代理服务器的主机名和端口号,用户名和密码 (如果需要)。<BR>使用的 HTTP 代理服务器,必须有适合 HTTPS 通信的连接方式。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CascadeProxyHttp [name] [/SERVER:hostname:port] [/USERNAME:username] [/PASSWORD:password]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadeProxyHttp" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定级联名称来改变设置。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SERVER</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					[主机:端口的形式],通过指定的 HTTP 代理服务器的主机名或 IP 地址和端口号。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/USERNAME</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果连接到 HTTP 代理服务器时需要用户验证,则指定用户名。同时设定密码和参数。 如果没有设定用户名和密码 D参数,则不需要设置用户身份验证。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/PASSWORD</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果连接到 HTTP 代理服务器时需要用户验证,则指定密码。/USERNAME,参数等同时设定。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.37 "CascadeProxySocks": 将级联连接方法设定为通过 SOCKS 代理服务器</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadeProxySocks</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					将级联连接方法设定为通过 SOCKS 代理服务器</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定已经在当前虚拟 HUB 注册的级联连接,当此连接和 VPN Server 之间通信时,设置连接方法为 [通过 SOCKS 代理服务器],设置 SOCKS8 代理服务器的主机名和端口号,用户名和密码 (如果需要)。<BR>SOCKS 服务器,需与 SOCKS 第 4 版想匹配。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CascadeProxySocks [name] [/SERVER:hostname:port] [/USERNAME:username] [/PASSWORD:password]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadeProxySocks" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定级联名称来改变设置。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SERVER</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					按照 [主机名:端口号] 的格式,设定代理服务器主机名或 IP 地址和端口号。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/USERNAME</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果连接到 SOCKS 代理服务器时需要用户验证,则指定用户名。同时设定密码和参数。如果没有设定用户名和密码参数,则不需要设置用户身份验证。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/PASSWORD</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果连接到 SOCKS 代理服务器时需要用户验证,则指定密码。/USERNAME,参数等同时设定。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.38 "CascadeServerCertEnable": 启用级联服务器证书验证选项</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadeServerCertEnable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					启用级联服务器证书验证选项</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定已经在当前虚拟 HUB 注册的级联连接,当此连接和 VPN Server 之间通信时,验证目标连接的 VPN 的服务器提供的 SSL 证书是否可以信任。<BR>如果启用此选项,需要将在目标服务器的证书事先通过 CascadeServerCertSet 指令设置到级联的连接设置中,或者在虚拟 HUB 的可信任证书列表中,运行 CAAdd 指令,将有服务器的 SSL 证书署名的路线证书添加进去。<BR>当启用服务器证书验证选项时,如果 VPN Server 提供的证书不可信,连接将断开,并重试。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CascadeServerCertEnable [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadeServerCertEnable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定级联名称来改变设置。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.39 "CascadeServerCertDisable": 禁用级联服务器证书验证选项</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadeServerCertDisable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					禁用级联服务器证书验证选项</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定已经在当前虚拟 HUB 注册的级联连接,当此连接和 VPN Server 之间通信时,对于连接方提供的 SSL 证书,不需要检查是否可以信任。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CascadeServerCertDisable [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadeServerCertDisable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定级联名称来改变设置。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.40 "CascadeServerCertSet": 设置级联连接的服务器特定证书</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadeServerCertSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置级联连接的服务器特定证书</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定已经在当前虚拟 HUB 注册的级联连接,当此连接和 VPN Server 之间通信时,事先将连接方提供的 SSL 证书注册。<BR>如果启用此选项,需要将在目标服务器的证书事先通过指令设置到级联的连接设置中,或者在虚拟 HUB 的可信任证书列表中,运行 CAAdd 指令,将有服务器的 SSL 证书署名的路线证书添加进去。<BR>当启用服务器证书验证选项时,如果 VPN Server 提供的证书不可信,连接将断开,并重试。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CascadeServerCertSet [name] [/LOADCERT:cert]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadeServerCertSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定级联名称来改变设置。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/LOADCERT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设定文件名保存服务器固有的 X.509 格式的证书。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.41 "CascadeServerCertDelete": 删除级联服务器固有的证书</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadeServerCertDelete</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除级联服务器固有的证书</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定当前虚拟 HUB 中已注册的级联,如果已经注册了服务器证书,将其删除。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CascadeServerCertDelete [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadeServerCertDelete" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定级联名称来改变设置。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.42 "CascadeServerCertGet": 获取级联连接服务器的固有证书</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadeServerCertGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取级联连接服务器的固有证书</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定在当前虚拟 HUB 上已注册的级联,如果此级联中已经注册了服务器固有证书,则获得该证书,并保存为 X.509 格式。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CascadeServerCertGet [name] [/SAVECERT:path]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadeServerCertGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定级联名称来改变设置。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SAVECERT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定名称以 X.509 格式保存服务器的固有证书。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.43 "CascadeDetailSet": 级联通信的高级设置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadeDetailSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					级联通信的高级设置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定在当前虚拟 HUB 上已注册的级联,设置级联和 VPN Server 连接通信时使用的 VPN 自定义的通信协议。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CascadeDetailSet [name] [/MAXTCP:max_connection] [/INTERVAL:interval] [/TTL:disconnect_span] [/HALF:yes|no] [/NOQOS:yes|no]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadeDetailSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定级联名称来改变设置。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/MAXTCP</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					VPN 通信中使用的 TCP 连接的数量,用从 1 到 32 的整数来指定。和 VPN Server 之间的 VPN 数据传输,可以通过使用多个 TCP 连接,提高通信速度。
+注意: 如果您使用高速连接到大约使用 8 根,如果是缓慢的拨号服务器,请使用一根。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/INTERVAL</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果使用多个 TCP 连接进行 VPN 通信时,请设定各个 TCP 连接之间确立连接秒数。默认值为 1 秒。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/TTL</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果您设置每个 TCP 连接的寿命,从连接到断开用秒表示。0 表示寿命未设置。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/HALF</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果启动半双工模式选择 "yes"。使用两根以上的 VPN 连接进行 TCP 通信时,可以使用 "半双工模式"。启动半双工模式后,每个 TCP 可以固定一半连接实现单方向的数据传输。例如,使用 8 根 TCP 连接建立 VPN 通信,使用半双工模式后,会有 4 路 TCP 连接上船数据,剩下的 4 路负责下载数据。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/NOQOS</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					禁用 VoIP/ QoS 对应功能选择 "yes"。通常选择 "no"。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.44 "CascadePolicySet": 设置级联连接的安全协议</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadePolicySet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置级联连接的安全协议</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定当前虚拟 HUB 上已经注册的级联连接,设置级联连接建立时所适用的安全协议。<BR>虚拟 HUB 和别的 VPN Server 进行级联连接时,连接方的虚拟 HUB 中将产生新的级联,运行此命令可以设置级联的安全协议。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>[name] [/NAME:policy_name] [/VALUE:num|yes|no]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadePolicySet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定级联名称来改变设置。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/NAME</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定要更改设置的协议名称。变更协议的名称和可变更的值,可通过运行 PolicyList 命令获得列表。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/VALUE</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设定协议的新值,如果协议是数值,请设定为一个整数。如果是选择型,请选 yes 或 no。 设定的值可以通过运行PolicyList命令来获得。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.45 "PolicyList": 查看安全协议和可以设置的值得列表</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">PolicyList</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					查看安全协议和可以设置的值得列表</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					显示 VPN Server 中的用户,群,级联的安全协议的项目名称,说明,以及可以设定的值的清单。<BR>不指定任何参数的前提下运行 PolicyList 命令,你可以获得被支持的安全协议的名称和说明。<BR>如果用 PolicyList 指令指定名称,您可以获得关于这个协议的详细说明,及值的类型和值的范围。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>PolicyList [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"PolicyList" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定想要显示的协议名称。如果没有指定,所有的名称和安全协议及其说明将被列表的支持。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.46 "CascadeStatusGet": 获取级联的当前状态</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadeStatusGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取级联的当前状态</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定在当前虚拟 HUB 上注册的级联,如果此级联处于连线状态,您将可以获得它的连接状态和其他信息。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CascadeStatusGet [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadeStatusGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定级联名称,以获取信息。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.47 "CascadeRename": 更改级联的名称</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadeRename</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					更改级联的名称</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定在当前虚拟 HUB 上注册的级联,改变它的连接名称。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CascadeRename [name] [/NEW:new_name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadeRename" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要变更的级联的当前名称。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/NEW</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定变更后的新名称。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.48 "CascadeOnline": 设置级联接续的在线状态</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadeOnline</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置级联接续的在线状态</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定在当前虚拟 HUB 上注册的级联,将级联的连接状态设定为连接。级联成功连接后,可以通过连接设定连接到 VPN Server。处于在线状态的级联,除非运行 CascadeOffline 脱机命令,则 VPN Server 始终保持连接。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CascadeOnline [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadeOnline" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定级联名称设定为联机状态。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.49 "CascadeOffline": 将级联设置为脱机状态</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CascadeOffline</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					将级联设置为脱机状态</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定在当前虚拟 HUB 上注册的级联,将级联的连接状态设定为脱机。处于脱机状态的级联,除非运行 CascadeOnline 命令使它连线,否则无法连接到 VPN Server。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CascadeOffline [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CascadeOffline" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定级联名称设置到脱机状态。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.50 "AccessAdd": 添加规则到允许访问列表 (IPv4)</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccessAdd</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					添加规则到允许访问列表 (IPv4)</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在当前虚拟 HUB 的访问列表中,添加新的规则。<BR>访问列表指的是虚拟 HUB 中,对流动的数据包进行筛选的规则,访问列表中可以登录多条规则,每条规则可以定义优先顺序。所有的数据包,按照最初适用的条件,或是通过或是销毁。不符合任何规则的数据包则将被默许通过。您也可以使用AccessAddEx 命令,来生成延迟、时基误差和数据包丢失。<BR>此命令,在 VPN Bridge 中不会运行。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccessAdd [pass|discard] [/MEMO:memo] [/PRIORITY:priority] [/SRCUSERNAME:username] [/DESTUSERNAME:username] [/SRCMAC:mac/mask] [/DESTMAC:mac/mask] [/SRCIP:ip/mask] [/DESTIP:ip/mask] [/PROTOCOL:tcp|udp|icmpv4|icmpv6|ip|num] [/SRCPORT:start-end] [/DESTPORT:start-end] [/TCPSTATE:established|unestablished]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccessAdd" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>pass|discard</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					确定数据包跟规则条件一致时的处理。当您指定 pass 意为通过,指定 discard,意为销毁。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/MEMO</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选定规则的解释 (备忘录)。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/PRIORITY</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					用 1 以上的整数指定优先顺序。数字越小优先级越高。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SRCUSERNAME</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					作为此规则的条件,只有被指定的用户 / 用户組发送的数据包,才适用与此规则。在这种情况下,需指定用户名 / 用户組名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/DESTUSERNAME</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					作为此规则的条件,只有被指定的用户 / 用户組接受的数据包,才适用与此规则。在这种情况下,需指定用户名 / 用户組名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SRCMAC</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					作为规则的条件,指定发送原 MAC 地址。MAC 地址像例子 (00-AC-84-EA-33-BC/FF-FF-FF-FF-FF-00) 一样地 '-' 或 '/' 断开十六进制数写。段落文字能省略。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/DESTMAC</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					作为规则的条件,指定地址 MAC 地址。指定方法,/SRCMAC 参数同样。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SRCIP</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					作为规则条件制定一个源 IPv4 地址。用点把十进制数值分开的 IP 地址/掩码[格式指定一个 IPv4 地址,例如 192.168.0.1 掩码例如 255.255.255.0 为十进制,以点分隔,或者像 24 这样从开始设定字节长度,以十进位。如果设定为 0.0.0.0/0.0.0.0 则显示所有主机。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/DESTIP</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					作为规则的条件必须制定目标 IPv4 地址:用 [IP 地址/掩码]格式制定方法同指定 /SRCIP 参数类似。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/PROTOCOL</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					根据规则的条件,需指定协议类型。IP 协议号或者输入一个十进制数,或者 "tcp" (TCP/IP 协议,第 6 号),"udp" (UDP/IP 协议,第 17 号),"icmpv4" (ICMPv4 协议,第 1 号),"icmpv6" (ICMPv6 协议,第 58 号),"ip" (所有的 IP 协议,0 号) 来指定所有 IP 协议中的关键字。如果选定所有的 IP 协议,则选 0。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SRCPORT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					协议 TCP/IP 或 UDP/IP 的情况下,作为规则需指定源端口号。其他的协议不需要。如果该参数没有指定,则选定所有端口。设定方法,例如 "1-1024" (第 1 到 1024),"23" (只选第 23 只)。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/DESTPORT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					协议 TCP/IP 或 UDP/IP 的情况下,作为规则需指定源端口号。其他的协议不需要。制定方法同指定 /SRCPORT 参数一样。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/TCPSTATE</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					作为规则的条件,指定 TCP 连接的状态。 Established 或指定 Unestablished。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.51 "AccessAddEx": 添加扩展访问列表规则 (IPv4:延迟、时基误差/数据包丢失产生)</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccessAddEx</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					添加扩展访问列表规则 (IPv4:延迟、时基误差/数据包丢失产生)</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在当前管理的虚拟 HUB 的访问列表中,使用此命令添加新的规则。当数据包经由虚拟 HUB 通过时,你可以设置产生延迟、时基误差和数据包丢失。<BR>访问列表是一组文件规则被应用到流过虚拟 HUB 的数据包。您可以在一个访问列表中注册多个规则,你也可以定义每个规则的优先级。检查所有的数据包的规则所指定的条件,在访问列表中注册的规则,由第一个匹配的规则根据规定的操作,它们要么通过要么被丢弃。不匹配任何规则的数据包暗中允许通过。您也可以使用 AccessAddEx 的命令来生成延迟、时基误差和数据包丢失。<BR>此命令不能在 VPN Bridge 上运行。<BR>在以成员服务器群集上运行的 VPN Server 的虚拟 HUB 上,您不能执行此命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccessAddEx [pass|discard] [/MEMO:memo] [/PRIORITY:priority] [/SRCUSERNAME:username] [/DESTUSERNAME:username] [/SRCMAC:mac/mask] [/DESTMAC:mac/mask] [/SRCIP:ip/mask] [/DESTIP:ip/mask] [/PROTOCOL:tcp|udp|icmpv4|icmpv6|ip|num] [/SRCPORT:start-end] [/DESTPORT:start-end] [/SRCUSERNAME:username] [/DESTUSERNAME:username] [/TCPSTATE:established|unestablished] [/DELAY:delay_millisec] [/JITTER:jitter_percent] [/LOSS:loss_percent]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccessAddEx" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>pass|discard</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					当一个数据包匹配此规则条件时,该操作就已决定了。当通过被指定时,则数据包允许通过;当丢弃被指定时,数据包被丢弃。如果动作是通过,延迟、时基误差和数据包丢失的设置被应用。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/MEMO</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定此规则的描述 (备忘录)。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/PRIORITY</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定 1 或以上的整数作为此规则的优先级。数字越小优先级越高。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SRCUSERNAME</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					您可以将此规则仅用于作为规则条件被指定了用户名的用户会话发送的数据包。在这种情况下,请指定该用户名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/DESTUSERNAME</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					您可以将此规则仅用于作为规则条件被指定了用户名的用户会话接收的数据包。在这种情况下,请指定该用户名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SRCMAC</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定目标 MAC 地址作为一个规则。用'-' 或 '/'分隔符和十六进制数字,如 (00-AC-84-EA-33-BC/FF-FF-FF-FF-FF-00) 来指定 MAC 地址。分隔符可跳过。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/DESTMAC</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定目标 MAC 地址作为一个规则。指定方法同指定 /SRCPORT 参数一样。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SRCIP</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定一个源 IPv4 地址作为一个规则条件。用点把十进制数值分开的 [IP 地址/掩码] 格式指定一个 IPv4 地址,例如: 192.168.0.1。对于掩码,您或者可以指定由点分开的十进制数值,例如 255.255.255.0 也可以指定从标头用十进制数值的比特长度,如 24。 如果您指定: 0.0.0.0/0.0.0.0 这表示所有主机。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/DESTIP</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					用 [IP 地址/掩码] 格式指定一个目的 IPv4 地址作为一个规则条件指定方法同指定 /SRCPORT 参数一样。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/PROTOCOL</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定一个协议类型作为一个规则条件。使用十进制数值输入 IP 协议号,或者指定关键字中的一个 "tcp" (TCP/IP 协议,第 6 号),"udp" (UDP/IP 协议,第 17 号),"icmpv4" (ICMPv4 协议,第 1 号),"icmpv6" (ICMPv6 协议,第 58 号)或者, "ip" (所有的 IP 协议,0 号)。指定数字 0,则规则会应用到全部 IP 协议。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SRCPORT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果已指定的协议是 TCP/IP 或 UDP/IP 的话,指定端口号的目的地作为规则条件。其他的协议会被忽略。如果该参数没有指定,那么规则会应用到所有端口号。当指定时,请使用如下方法: "1-1024" (第 1 到 1024),"23" (仅限 23)。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/DESTPORT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果已指定的协议是 TCP/IP 或 UDP/IP 的话,指定目的端口号的目的地作为规则条件。其他协议将被忽略。指定方法同指定 /SRCPORT 参数一样。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/TCPSTATE</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定 TCP 连接状态作为一个规则。使用 Established (已建立的)或 Unestablished(未建立的)。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/DELAY</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					当数据包通过时,设置此数值来生成延迟。以毫秒来指定延迟的时间段。指定 0,意为不会生成延迟。延迟最多为 10000 毫秒、</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/JITTER</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					当数据包通过时,设置此数值来生成时基误差。用 0% 到 100% 之内的范围来指定时基误差波动的频率。指定 0,意为不会生成时基误差。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/LOSS</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					当数据包通过时,设置此数值来生成数据包丢失。用 0% 到 100% 之内的范围来指定丢包的频率。指定 0,意为不会生成丢包。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.52 "AccessAdd6": 添加访问列表规则 (IPv6)</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccessAdd6</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					添加访问列表规则 (IPv6)</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在当前管理的虚拟 HUB 的访问列表中,使用此命令添加新的规则。<BR>访问列表是一组文件规则被应用到流过虚拟 HUB 的数据包。您可以在一个访问列表中注册多个规则,你也可以定义每个规则的优先级。检查所有的数据包的规则所指定的条件,在访问列表中注册的规则,由第一个匹配的规则根据规定的操作,它们要么通过要么被丢弃。不匹配任何规则的数据包暗中允许通过。您也可以使用 AccessAddEx6 的命令来生成延迟、时基误差和数据包丢失。 <BR>此命令不能在 VPN Bridge 上运行。 <BR>在以成员服务器群集上运行的 VPN Server 的虚拟 HUB 上,您不能执行此命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccessAdd6 [pass|discard] [/MEMO:memo] [/PRIORITY:priority] [/SRCUSERNAME:username] [/DESTUSERNAME:username] [/SRCMAC:mac/mask] [/DESTMAC:mac/mask] [/SRCIP:ip/mask] [/DESTIP:ip/mask] [/PROTOCOL:tcp|udp|icmpv4|icmpv6|ip|num] [/SRCPORT:start-end] [/DESTPORT:start-end] [/TCPSTATE: established|unestablished]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccessAdd6" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>pass|discard</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					当一个数据包匹配此规则条件时,该操作就已决定了。当通过被指定时,则数据包允许通过;当丢弃被指定时,数据包被丢弃。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/MEMO</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定此规则的描述。 (备忘录)。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/PRIORITY</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定1或以上的整数作为此规的优先级。数字越小优先级越高。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SRCUSERNAME</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					您可以将此规则仅用于作为规则条件被指定了用户名的用户会话发送的数据包。在这种情况下,请指定该用户名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/DESTUSERNAME</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					您可以将此规则仅用于作为规则条件被指定了用户名的用户会话接收的数据包。在这种情况下,请指定该用户名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SRCMAC</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定目的 MAC 地址作为规则。用分隔符 "-" 或者 ":" 和十六进制的数字,如 00-AC-84-EA-33-BC/FF-FF-FF-FF-FF-00 来指定 MAC 地址。分隔符可以跳过。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/DESTMAC</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定目标 MAC 地址作为一个规则。方法与指定 /SRCMAC 参数同样。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SRCIP</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定一个源 IPv6 地址作为一个规则条件。使用冒号分割十六进制数字的 [IP 地址/掩码] 格式来指定 IPv6 地址。例如 2001:200:0:1:: 对于掩码来讲,您或者可以使用冒号分隔十六位数值的格式,例如 ffff:ffff:ffff:ffff:: 或者您也可以通过用标头的十进制数值像 128,来指定比特长度。如果您要指定 "::/0",意为所有主机。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/DESTIP</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					用 [IP 地址/掩码] 格式指定一个目标 IPv6 地址作为一个规则条件。制定方法同指定/SRCIP参数类似。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/PROTOCOL</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定一个协议类型来作为一个规则条件。输入十进制数值的 IP 协议号或者指定一个关键字 "tcp" (TCP/IP 协议,第 6 号),"udp" (UDP/IP 协议,第 17 号),"icmpv4" (ICMPv4 协议,第 1 号),"icmpv6" (ICMPv6 协议,第 58 号),"ip" (所有的 IP 协议,0 号)。指定]0[,则规则会应用于所有IP协议。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SRCPORT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果指定的协议是 TCP/IP 或 UDP/IP,则指定源端口号作为规则条件。其他协议将被忽略。如果该参数没有指定,规则将会应用到所有端口号。指定时,请使用如下方法 "1-1024" (第 1 到 1024),"23" (仅是第 23 )。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/DESTPORT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果指定的协议是 TCP/IP 或 UDP/IP,则指定目标端口号作为规则条件。其他协议将被忽略。指定方法同指定 /SRCPORT 参数一样。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/TCPSTATE</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定 TCP 连接状态作为一个规则。使用 Established 或 Unestablished。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.53 "AccessAddEx6": 添加扩展访问列表规则 (IPv6,生成延迟,时基误差/数据包丢失)</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccessAddEx6</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					添加扩展访问列表规则 (IPv6,生成延迟,时基误差/数据包丢失)</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在当前管理的虚拟 HUB 的访问列表中,使用此命令添加新的规则。当数据包经由虚拟 HUB 通过时,你可以设置产生延迟、时基误差和数据包丢失。<BR>访问列表是一组文件规则被应用到流过虚拟 HUB 的数据包。您可以在一个访问列表中注册多个规则,你也可以定义每个规则的优先级。检查所有的数据包的规则所指定的条件,在访问列表中注册的规则,由第一个匹配的规则根据规定的操作,它们要么通过要么被丢弃。不匹配任何规则的数据包暗中允许通过。您也可以使用 AccessAddEx6 的命令来生成延迟、时基误差和数据包丢失。 <BR>此命令不能在 VPN Bridge 上运行。 <BR>在以成员服务器群集上运行的 VPN Server 的虚拟 HUB 上,您不能执行此命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccessAddEx6 [pass|discard] [/MEMO:memo] [/PRIORITY:priority] [/SRCUSERNAME:username] [/DESTUSERNAME:username] [/SRCMAC:mac/mask] [/DESTMAC:mac/mask] [/SRCIP:ip/mask] [/DESTIP:ip/mask] [/PROTOCOL:tcp|udp|icmpv4|icmpv6|ip|num] [/SRCPORT:start-end] [/DESTPORT:start-end] [/TCPSTATE: established|unestablished] [/DELAY:delay_millisec] [/JITTER:jitter_percent] [/LOSS:loss_percent]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccessAddEx6" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>pass|discard</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果通过,会产生延迟,抖动和丢包。当一个数据包匹配此规则条件时,该操作就已决定了。当通过被指定时,则数据包允许通过;当丢弃被指定时,数据包被丢弃。如果动作是通过,延迟、时基误差和数据包丢失的设置被应用。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/MEMO</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定此规则的描述(备忘录)。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/PRIORITY</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定1或以上的整数作为此规则的优先级。数字越小优先级越高。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SRCUSERNAME</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					您可以将此规则仅用于作为规则条件被指定了用户名的用户会话发送的数据包。在这种情况下,请指定该用户名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/DESTUSERNAME</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					您可以将此规则仅用于作为规则条件被指定了用户名的用户会话接收的数据包。在这种情况下,请指定该用户名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SRCMAC</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定目标 MAC 地址作为规则。用分隔符]-[或者]:[和十六进制的数字,如 "00-AC-84-EA-33-BC/FF-FF-FF-FF-FF-00" 来指定 MAC 地址。分隔符可以跳过。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/DESTMAC</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定目标 MAC 地址作为一个规则。方法与指定 /SRCMAC 参数同样。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SRCIP</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定一个源 IPv6 地址作为一个规则条件。指定一个源 IPv6 地址作为一个规则条件。对于掩码来讲,您或者可以使用冒号分隔十六位数值的格式,例如 "ffff:ffff:ffff:ffff::" 或者您也可以通过用标头的十进制数值像 "64",来指定比特长度。如果您要指定 "::/0",意为所有主机。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/DESTIP</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					用 [IP 地址/掩码] 格式指定一个目标 IPv6 地址作为一个规则条件。指定方法同指定 /SRCIP 参数类似。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/PROTOCOL</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定一个协议类型来作为一个规则条件。输入十进制数值的IP 协议号或者指定一个关键字 "tcp" (TCP/IP 协议,第 6 号),"udp" (UDP/IP 协议,第 17 号),"icmpv4" (ICMPv4 协议,第 1 号),"icmpv6" (ICMPv6 协议,第 58 号),"ip" (所有的 IP 协议,0 号)。指定 0,则规则会应用于所有 IP 协议。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SRCPORT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果已指定的协议是 TCP/IP 或 UDP/IP 的话,指定端口号的目的地作为规则条件。其他的协议会被忽略。如果该参数没有指定,那么规则会应用到所有端口号。当指定时,请使用如下方法: "1-1024" (第 1 到 1024),"23" (仅限 23)。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/DESTPORT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果指定的协议是 TCP/IP 或 UDP/IP 的话,则指定目标端口号作为规则条件。其他协议会被忽略。如果该参数没有指定,指定方法同指定 /SRCPORT 参数一样。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/TCPSTATE</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定 TCP连接状态作为一个规则。使用已建立的(Established) 或未建立的(Unestablished)。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/DELAY</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					当数据包通过时,设置本数值来产生延迟。以毫秒为单位来指定延迟周期。指定0,意为不产生延迟。延迟最大为 10000 毫秒。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/JITTER</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					当数据包通过时,设置本数值来产生时基误差。当数据包通过时,设置此数值来生成时基误差。用 0% 到 100% 之内的范围来指定时基误差波动的频率。指定 0,意为不会生成时基误差。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/LOSS</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					当数据包通过时,设置本数值来产生数据包丢失。指定 0% 至 100% 来作为丢包的比率范围。指定 0,意为无丢包生成。 </td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.54 "AccessList": 获取访问列表规则</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccessList</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取访问列表规则</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取当前虚拟 HUB 的访问列表中注册的数据包筛选规则一览表。<BR>访问列表,即是虚拟 HUB 内对流动的数据包进行筛选的规则的集合,访问列表中可以登录多条规则,每条规则可以定义优先顺序。通过包过滤规则适用英寸访问列表可以注册一个以上的规则可以定义一个优先考虑每一条规则。所有的数据包,按照最初适用的条件,或是通过或是销毁。不符合任何规则的数据包则将被默许通过。<BR>此命令,在 VPN Bridge 中不会运行。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccessList</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccessList" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.55 "AccessDelete": 从访问列表中删除规则</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccessDelete</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					从访问列表中删除规则</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					从当前虚拟 HUB 中注册的访问列表中,选定数据包过滤规则并加以删除。<BR>要删除规则,需要指定该规则 ID。ID 可以运行 AccessList 获得。<BR>另外不删除而是暂时禁用的规则执行 AccessDisable 命令。<BR>此命令,在 VPN Bridge 中不会运行。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccessDelete [id]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccessDelete" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>id</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要删除的规则的 ID 或唯一 ID。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.56 "AccessEnable": 启用访问列表规则功能</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccessEnable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					启用访问列表规则功能</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					从当前虚拟 HUB 中注册的访问列表中,选定数据包筛选规则并激活。激活的规则用于数据包筛选。<BR>要启用该规则,必须指定它的 ID。您可以使用 AccessList 命令获取 ID。<BR>此命令,在 VPN Bridge 中不会运行。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccessEnable [id]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccessEnable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>id</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定规则的 ID 并激活。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.57 "AccessDisable": 禁用访问列表规则</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccessDisable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					禁用访问列表规则</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					从当前虚拟 HUB 中注册的访问列表中,选定数据包筛选规则并禁用。被禁用的筛选规则将不会被用于数据包筛选。<BR>要禁用的规则,规则必须指定的 ID。<BR>要禁用该规则,必须指定它的 ID。您可以使用 AccessList 命令获取 ID。<BR>此命令,在 VPN Bridge 中不会运行。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccessDisable [id]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccessDisable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>id</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定规则的 ID 并禁用。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.58 "UserList": 获取用户列表</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">UserList</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取用户列表</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取当前虚拟 HUB 中注册的安全帐户数据库信息中的用户清单。<BR>此命令,在 VPN Bridge 中不会运行。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>UserList</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"UserList" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.59 "UserCreate": 创建用户</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">UserCreate</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					创建用户</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在当前虚拟 HUB 中注册的安全帐户数据库中创建一个新用户。<BR>当您创建一个用户,根据用户信息的认证,VPN Client 可以连接到这个虚拟 HUB。<BR>如果您使用 UserCreate 命令创建一个用户,用户身份验证方法是验证密码,注册为一个随机字符串作为密码分配。因此,用户不能直接连接到虚拟 HUB。在创建用户后,则必须运用 UserPasswordSet 命令,设定指定用户的密码。或者使用 UserAnonymousSet 命令,UserCertSet 命令,UserSignedSet 命令,UserRadiusSet 命令,UserNTLMSet 命令来改变用户身份验证方式。<BR>除非真有用户名为 "*" (星号),否则当客户登陆时提供的用户名与已有用户名不一致的情况下,将自动登录为 RADIUS 服务器,或者 NT 控制器来验证。<BR>如果要更改用户信息,可以执行 UserSet 命令。<BR>此命令,在 VPN Bridge 中不会运行。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>UserCreate [name] [/GROUP:group] [/REALNAME:realname] [/NOTE:note]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"UserCreate" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定新创建用户的用户名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/GROUP</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果让用户加入一个用户组,请指定组名。如果你让用户不属于任何组,则设定为 /GROUP:none。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/REALNAME</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定用户的全名。如果不指定,请选 /REALNAME:none。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/NOTE</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定该用户的说明。否则,选择 /NOTE:none。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.60 "UserSet": 更改用户信息</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">UserSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					更改用户信息</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					变更当前虚拟 HUB 中的安全帐户数据库中注册的客户信息。<BR>可以更改的信息,即使创建新用户所需要的 "组名称","全名" 和 "描述" 这三个项目。<BR>要获得用户的名单,请使用 UserList 命令。<BR>此命令,在 VPN Bridge 中不会运行。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>UserSet [name] [/GROUP:group] [/REALNAME:realname] [/NOTE:note]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"UserSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定用户名更改设置。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/GROUP</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果让用户加入一个用户组,请指定组名。如果你让用户不属于任何组,则设定为 /GROUP:none。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/REALNAME</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定用户的全名。如果不指定,请选 /REALNAME:none。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/NOTE</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定该用户的说明。否则,选择 /NOTE:none</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.61 "UserDelete": 删除用户</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">UserDelete</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除用户</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除在虚拟 HUB 中的安全帐户数据库中注册的用户。当你删除一个用户,该用户将无法连接到虚拟 HUB。<BR>如果您使用 UserPolicySet 命令,即使不删除也可暂时禁止用户登录。<BR>要获得用户的名单,请使用 UserList 命令。<BR>此命令,在 VPN Bridge 中不会运行。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>UserDelete [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"UserDelete" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定用户名将其删除。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.62 "UserGet": 获取用户信息</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">UserGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取用户信息</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取在虚拟 HUB 中的安全帐户数据库中注册用户的登录信息。<BR>这个指令可以得到的信息有 "用户名","全名","描述","组的成员","有效期","安全协议","身份验证方法",以及验证参数。<BR>要获得用户的名单,请使用 UserList 命令。<BR>此命令,在 VPN Bridge 中不会运行。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>UserGet [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"UserGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定的用户名来获取信息。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.63 "UserAnonymousSet": 将用户身份验证方法设置为匿名验证</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">UserAnonymousSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					将用户身份验证方法设置为匿名验证</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在虚拟 HUB 中的安全帐户数据库中注册用户的验证方法设定为 "匿名验证"。"匿名验证" 的用户连接到 VPN Client HUB 时,不会有任何用户认证即可以连接到 HUB。匿名身份验证设置适合那些公开的谁都可以连接的 VPN Server。<BR>要获得用户的名单,请使用 UserList 命令。<BR>此命令,在 VPN Bridge 中不会运行。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>UserAnonymousSet [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"UserAnonymousSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定用户名更改设置。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.64 "UserPasswordSet": 将用户身份验证方法设置为密码验证,并设定密码</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">UserPasswordSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					将用户身份验证方法设置为密码验证,并设定密码</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在虚拟 HUB 中的安全帐户数据库中注册用户的验证方法设定为 "密码验证" 所谓 "密码验证" 即所有安全帐户数据库中的用户都设置密码注册。当此用户连接虚拟 HUB 时,会提示输入密码,如果一致,则允许连接。<BR>事实上,由于用户的密码是经过处理以后保存的,因此即使分析原始材料,也不会分析出密码。<BR>要获得用户的名单,请使用 UserList 命令。<BR>此命令,在 VPN Bridge 中不会运行。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>UserPasswordSet [name] [/PASSWORD:password]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"UserPasswordSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定用户名更改设置。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/PASSWORD</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定用户的密码设置。如果您不指定此参数将被提示输入密码。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.65 "UserCertSet": 将用户身份验证方法设置为固有证书验证,并设定证书</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">UserCertSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					将用户身份验证方法设置为固有证书验证,并设定证书</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在虚拟 HUB 中的安全帐户数据库中注册用户的验证方法设定为 "固有证书验证" 所谓 "固有证书验证" 即所有安全帐户数据库中的用户都注册一个 X.509 证书。当此用户连接虚拟 HUB 时,提供的固有证书与登记证书一致,或持有对应证书的密钥,允许是通过验证实现连接。<BR>要获得用户的名单,请使用 UserList 命令。<BR>此命令,在 VPN Bridge 中不会运行。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>UserCertSet [name] [/LOADCERT:cert]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"UserCertSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定的用户名更改设置。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/LOADCERT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定 X.509 证书文件名,这顶用户证书。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.66 "UserCertGet": 获取注册固有证书认证用户的证书</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">UserCertGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取注册固有证书认证用户的证书</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在虚拟 HUB 中的安全帐户数据库中注册用户的 "固有证书认证" 的用户,取得用户的 X.509 证书,并保存。<BR>如果用户未指定 "固有证书认证",则会发生错误。<BR>要获得用户的名单,请使用 UserList 命令。<BR>此命令,在 VPN Bridge 中不会运行。<BR>此命令在集群虚拟 HUB 中不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>UserCertGet [name] [/SAVECERT:cert]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"UserCertGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定的用户名来检索信息。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SAVECERT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定文件名来保存获取的用户的 X.509 证书。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.67 "UserSignedSet": 将用户身份验证方法设置为已签名证明书认证</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">UserSignedSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					将用户身份验证方法设置为已签名证明书认证</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					将已注册在目前管理的虚拟 HUB 的安全帐户数据库的用户认证方法设定为已签名认证书认证。用户以已签名证明书认证的用户名链接虚拟 HUB 时,用户所提交的证明书会被验证是否为虚拟 HUB 认可的证明机构的证明书一览中任意证明书的签名,且客户是否持有与证书相应的密钥,用 RSA 算法验证可以链接的认证法。/n还可以设定成已注册用户希望的证明书的通用名 (CN) 及编号,只有通过了上述验证的证明书的内容与设定值一致的情况下才能许可链接。/n要取得目前注册用户一览,请使用用户名单指令。<BR>此指令,虚拟专用桥不能运行。 <BR>此指令令在群集内作为群集成员服务器操作的 VPN Server 的虚拟 HUB 上不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>UserSignedSet [name] [/CN:cn] [/SERIAL:serial]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"UserSignedSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定更改设定的用户名</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/CN</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果指定此参数,在验证了用户提交的证明书是否由可信赖的证明机构签名后,该证明书的通用名 (CN) 的值,与根据此参数设定的值相比较,只有取得一致的情况下才允许链接。指定 "none" 的情况下不进行确认。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SERIAL</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果指定此参数,在验证了用户提交的证明书是否由可信赖的证明机构签名后,该证明书的序列号的值,与根据此参数设定的值相比较,只有取得一致的情况下才允许链接。指定 "none" 的情况下不进行确认。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.68 "UserRadiusSet": 将用户的认证方法设定为半径认证</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">UserRadiusSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					将用户的认证方法设定为半径认证</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					将在目前管理的虚拟 HUB 的安全帐户数据库上注册的用户认证方法设置为 "半径认证"。用户以被半径认证设置的用户名连接虚拟 HUB 时,用户名和用户输入的密码被发送到半径服务器,半径服务器检查用户名和密码后,如过该认证成功,用户被允许 VPN 连接。<BR>要使用半径认证,需要事先使用 RadiusServerSet 指令把要使用的半径服务器设置为虚拟 HUB。<BR>要获得目前注册的用户列表,请使用 UserList 指令。<BR>此指令,虚拟专用桥不能运行。<BR>此指令令在群集内作为群集成员服务器操作的 VPN Server 的虚拟 HUB 上不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>UserRadiusSet [name] [/ALIAS:alias_name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"UserRadiusSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定更改设定的用户名</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/ALIAS</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果此参数被设置,可以使对半径服务器发送的用户名与虚拟 HUB 上的用户名是不同的。如果没有设置,请指定为 /ALIAS:none (使用虚拟 HUB 上的用户名)。用户名是 "*" 的情况下 /ALIAS 参数被忽略。关于 "*" 用户的描述,输入 UserCreate /HELP 可显示。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.69 "UserNTLMSet": 用户身份验证方法设置为 NT 域认证</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">UserNTLMSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					用户身份验证方法设置为 NT 域认证</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					将在目前管理的虚拟 HUB 的安全帐户数据库上注册的用户认证方法设置为 "NT 域验证"。用户以被 NT 域认证设置的用户名连接虚拟 HUB 时,用户名和用户输入的密码被发送到 Windows NT / 2000 / Server 2003 / Server 2008 域控制器或 Active Directory 服务器,认证服务器检查用户名和密码后,如果认证成功后,该用户的 VPN 连接被允许。要使用 NT 域认证,VPN Server 不要在连接到该域的 Windows NT 4.0,Windows 2000,Windows XP,Windows Server 2003 和 Windows Server 2008 的任何操作系统上运行。详情,请与 VPN Server 管理员咨询。<BR>要获得目前注册的用户列表,请使用 UserList 指令。<BR>此指令,虚拟专用桥不能运行。<BR>此指令令在群集内作为群集成员服务器操作的 VPN Server 的虚拟 HUB 上不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>UserNTLMSet [name] [/ALIAS:alias_name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"UserNTLMSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定更改设定的用户名</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/ALIAS</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果此参数被设置,可以使对 NT 域或 Active Directory 发送的用户名与虚拟 HUB 上的用户名不同。如果没有设置,请指定 /ALIAS:none (使用虚拟 HUB 上的用户名)。用户名是 "*" 的情况下 /ALIAS 参数被忽略。关于 "*" 用户的描述,输入 UserCreate /HELP 可显示。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.70 "UserPolicyRemove": 删除用户的安全策略</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">UserPolicyRemove</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除用户的安全策略</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除在目前管理的虚拟 HUB 的安全帐户数据库上已注册的用户设置的安全策略设置。被删除安全策略设置的用户,适用该用户所属的组的安全策略设置。如果不属于任何组,或改组没有设置安全策略,则遵从默认值 (允许访问: 启用,TCP连接数最大值: 32 个,超时时间: 20 秒)。<BR>要获得目前注册的用户列表,请使用 UserList 命令。<BR>此指令,虚拟专用桥不能运行。 <BR>此指令令在群集内作为群集成员服务器操作的 VPN Server 的虚拟 HUB 上不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>UserPolicyRemove [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"UserPolicyRemove" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定更改设定的用户名</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.71 "UserPolicySet": 设置用户的安全策略</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">UserPolicySet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置用户的安全策略</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					变更在目前管理的虚拟 HUB 的安全帐户数据库上已注册的用户设置的安全策略内容。<BR>当用户未设置安全策略时,设置新的默认安全策略后,更改被指定的值。<BR>要获得当前已注册的用户列表,请使用 UserList 指令。<BR>此指令,虚拟专用桥不能运行。<BR>此指令令在群集内作为群集成员服务器操作的 VPN Server 的虚拟 HUB 上不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>UserPolicySet [name] [/NAME:policy_name] [/VALUE:num|yes|no]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"UserPolicySet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定更改设定的用户名</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/NAME</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要变更值的策略的名称。您可以使用 PolicyList 命令显示策略名称和可设定值的列表。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/VALUE</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定策略的新值。如果其策略是数值型,指定整数。如果是布尔型,指定 "yes" 或 "no"。可以设定的类型和值,可以使用 PolicyList 指令显示。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.72 "UserExpiresSet": 设置用户的有效期限</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">UserExpiresSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置用户的有效期限</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置在目前管理的虚拟 HUB 安全帐户数据库中注册的用户的有效期限。有效期限到期的用户不能连接虚拟 HUB。<BR>要获得当前已注册的用户列表,请使用 UserList 指令。<BR>此指令,虚拟专用桥不能运行。<BR>此指令令在群集内作为群集成员服务器操作的 VPN Server 的虚拟 HUB 上不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>UserExpiresSet [name] [/EXPIRES:expires]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"UserExpiresSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定更改设定的用户名</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/EXPIRES</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定用户有效期限的日期和时间。如 "2005/10/08 19:30:00",以 6 个整数指定年,月,日,时,分,秒,用斜线或冒号分隔。年指定为 4 位数。如果把空格加入到值中,需要把整个值用 "" 围住。可以指定本地时间 (计算机上的命令行管理工具运行的标准时间)。如果指定 /EXPIRES:none,可以解除有效期限。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.73 "GroupList": 获取组列表</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">GroupList</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取组列表</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取在目前管理的虚拟 HUB 的安全帐户数据库中注册的组列表。<BR>此命令用 VPN Bridge 不能运行。<BR>此命令在群集内作为群集成员服务器操作的 VPN Server 的虚拟 HUB 上不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>GroupList</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"GroupList" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.74 "GroupCreate": 创建组</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">GroupCreate</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					创建组</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在目前管理的虚拟 HUB 安全帐户数据库内建立新组。<BR>在组内可以登记多个用户。要在组内注册用户,使用 GroupJoin 命令。<BR>此命令用 VPN Bridge 不能运行。<BR>此命令在群集内作为群集成员服务器操作的 VPN Server 的虚拟 HUB 上不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>GroupCreate [name] [/REALNAME:realname] [/NOTE:note]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"GroupCreate" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要创建的组名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/REALNAME</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定该组的全名。例如,如果组对应于实际的部分或部门名称,指定其名称。如果不指定的情况下,请指定 /REALNAME:none。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/NOTE</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定组的描述。如果不指定的情况下,请指定 /NOTE:none。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.75 "GroupSet": 设置组信息</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">GroupSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置组信息</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置在目前管理的虚拟 HUB 安全帐户数据库中注册的组信息。<BR>要获取当前已注册的组列表,请使用 GroupList 命令。<BR>此命令用 VPN Bridge 不能运行。<BR>此命令在群集内作为群集成员服务器操作的 VPN Server 的虚拟 HUB 上不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>GroupSet [name] [/REALNAME:realname] [/NOTE:note]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"GroupSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定变更设定的组名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/REALNAME</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定该组的全名。例如,如果组对应于实际的部分或部门名称,指定其名称。如果不指定的情况下,请指定 /REALNAME:none。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/NOTE</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定组的描述。如果不指定的情况下,请指定 /NOTE:none。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.76 "GroupDelete": 删除组</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">GroupDelete</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除组</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除目前管理的虚拟 HUB 安全帐户数据库中注册的组。<BR>一旦删除组,该组所属的所有用户将成为未分配的。<BR>要获取当前已注册的组列表,请使用 GroupList 命令。<BR>此命令不能运行的 VPN Bridge。<BR>您不能执行这个虚拟的 VPN 作为在群集成员服务器操作系统服务器花鼓命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>GroupDelete [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"GroupDelete" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定删除的组名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.77 "GroupGet": 获得组信息和所属用户列表</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">GroupGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获得组信息和所属用户列表</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取目前管理的虚拟 HUB 安全帐户数据库中注册的组信息和属于改组的用户列表。<BR>要获取当前已注册的组列表,请使用 GroupList 命令。<BR>此命令用 VPN Bridge 不能运行。<BR>此命令在群集内作为群集成员服务器操作的 VPN Server 的虚拟 HUB 上不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>GroupGet [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"GroupGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定获得信息的组名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.78 "GroupJoin": 用户添加到组</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">GroupJoin</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					用户添加到组</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在目前管理的虚拟 HUB 的安全帐户数据库注册的组内,添加安全帐户数据库内的用户。<BR>目前注册的用户和组的列表,可使用 UserList 命令和 GroupList 命令获取。<BR>此命令用 VPN Bridge 不能运行。<BR>此命令在群集内作为群集成员服务器操作的 VPN Server 的虚拟 HUB 上不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>GroupJoin [name] [/USERNAME:username]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"GroupJoin" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要添加用户的组名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/USERNAME</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定往以 name 指定了的组添加的用户名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.79 "GroupUnjoin": 从组内删除用户</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">GroupUnjoin</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					从组内删除用户</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					从目前管理的虚拟 HUB 安全帐户数据库注册的组中,删除指定用户。用户一旦从组中被删除,该用户成为未分配。<BR>要获取当前组的用户列表,使用 GroupGet 命令。<BR>要获取当前已注册的组列表,使用 GroupList 命令。<BR>此命令用 VPN Bridge 不能运行。<BR>此命令在群集内作为群集成员服务器操作的 VPN Server 的虚拟 HUB 上不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>GroupUnjoin [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"GroupUnjoin" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要从组内删除的用户名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.80 "GroupPolicyRemove": 删除组的安全策略</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">GroupPolicyRemove</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除组的安全策略</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					对在目前管理的虚拟 HUB 的安全帐户数据胡中注册的组,删除其被设置的安全策略的设置。对所属的组及用户本身没有被设置安全策略的用户,遵照默认值 (允许访问: 启用,TCP 连接数的最大值: 32 个,超时时间: 20 秒)。<BR>要获得当前已注册的组列表,使用 GroupList 命令。<BR>此命令用 VPN Bridge 不能运行。<BR>此命令在群集内作为群集成员服务器操作的 VPN Server 的虚拟 HUB 上不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>GroupPolicyRemove [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"GroupPolicyRemove" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定变更设定的组名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.81 "GroupPolicySet": 设置组的安全策略</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">GroupPolicySet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置组的安全策略</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					对在目前管理的虚拟 HUB 的安全帐户数据胡中注册的组,更改其被设置的安全策略的设置。<BR>如组尚未设置安全策略,新的默认安全策略设置后,更改被指定的值。<BR>要获得当前已注册的组列表,使用 GroupList 命令。<BR>此命令用 VPN Bridge 不能运行。<BR>此命令在群集内作为群集成员服务器操作的 VPN Server 的虚拟 HUB 上不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>GroupPolicySet [name] [/NAME:policy_name] [/VALUE:num|yes|no]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"GroupPolicySet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定变更设定的组名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/NAME</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要更改其值的策略名称。您可以使用 PolicyList 命令显示的策略名称和可以设置值的列表。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/VALUE</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定一个新的策略值。如果策略是数值型的情况下,指定一个整数。如果是布尔型的情况下,指定 "yes" 或 "no"。可以设定类型和值,可以使用 PolicyList 指令显示。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.82 "SessionList": 获取连接会话的列表</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">SessionList</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取连接会话的列表</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取目前管理的与虚拟 HUB 连接中的的会话列表。在会话列表中,以下信息将显示为每个连接: [会话名称],[会话场所],[用户名],[连接源主机名称],[TCP 连接],[传输字节数] 和 [传输数据包数]。<BR>如果当前连接的 VPN Server 是群集控制器,管理的虚拟 HUB 是静态的虚拟 HUB,可以得到连接其所有的集群成员的该虚拟 HUB 的会话列表的结合。<BR>在其他情况下,只能获取与目前管理的 VPN Server 实际连接着的会话列表。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>SessionList</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"SessionList" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.83 "SessionGet": 获取会话信息</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">SessionGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取会话信息</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定与当目前管理的虚拟 HUB 连接着的会话,并获得其会话信息。会话信息包括以下内容: 连接源主机名和用户名,版本信息,时间信息,TCP 连接数,通讯参数,会话密钥,输入输出的数据统计资料,和其他客户端和服务器信息等。<BR>要获得当前连接的会话列表,请使用 SessionList 命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>SessionGet [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"SessionGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要获取信息的会话名称。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.84 "SessionDisconnect": 断开会话</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">SessionDisconnect</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					断开会话</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定连接到目前管理的虚拟 HUB 的会话,管理员权限以强制断开其会话。<BR>但是,终端的客户端的设置为通信断开后的自动启动重新连接会话的情况下,可能客户端会重新连接。<BR>要获得当前连接会话列表,请使用 SessionList 命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>SessionDisconnect [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"SessionDisconnect" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要断开的会话名称。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.85 "MacTable": 获取 MAC 地址表数据库</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">MacTable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取 MAC 地址表数据库</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取当前管理的虚拟 HUB 保持的 MAC 地址表的数据库。<BR>MAC 地址表数据库是虚拟 HUB 需要进行交换以太网帧的平台,虚拟 HUB 基于 MAC 地址表的数据库,决定各个以太网帧排序目标会话。MAC 地址数据库自动分析创建虚拟 HUB 流动的通信内容。<BR>指定的会话名称,可以得到与该会话有关的 MAC 地址表项。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>MacTable [session_name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"MacTable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>session_name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果指定作为参数的会话名称,可以只显示与该会话相关联的 MAC 地址表项。如果不指定,则显示所有的项。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.86 "MacDelete": 删除 MAC 地址表项</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">MacDelete</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除 MAC 地址表项</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					操作目前管理的虚拟 HUB 保持的 MAC 地址表数据库,从数据库中删除指定的 MAC 地址项。<BR>要获取目前的 MAC 地址表数据库的内容,请使用 MacTable 命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>MacDelete [id]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"MacDelete" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>id</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要删除的 MAC 地址表项的 ID。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.87 "IpTable": 获取 IP 地址表数据库</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">IpTable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取 IP 地址表数据库</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					目前管理的虚拟 HUB 保持的 IP 地址表的数据库。<BR>IP 地址表数据库是一个自动分析生成通信内容的平台,为使虚拟 HUB 能够掌握哪个会话使用的是哪个 IP 地址,这是经常被使用的虚拟 HUB 安全策略的引擎。<BR>指定的会话名称,可以获取与该会话相关联的 IP 地址表项。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>IpTable [session_name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"IpTable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>session_name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定作为参数的会话名称,可以只显示与该会话相关联的 IP 地址表项。如果不指定,则显示所有的项。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.88 "IpDelete": 删除 IP 地址表项</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">IpDelete</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除 IP 地址表项</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					操作目前管理的虚拟 HUB 保持的 IP 地址表数据库,从数据库中删除指定的 IP 地址项。<BR>要获取目前的 IP 地址表数据库的内容,请使用 IpTable 命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>IpDelete [id]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"IpDelete" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>id</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要删除的 IP 地址表项的 ID。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.89 "SecureNatEnable": 启用虚拟 NAT 和 DHCP 服务器功能 (安全网络功能)</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">SecureNatEnable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					启用虚拟 NAT 和 DHCP 服务器功能 (安全网络功能)</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					使在目前管理的虚拟 HUB 内启动并运行虚拟 NAT 和 DHCP 服务器功能 (安全网络功能)。执行此指令前,必须先使用 SecureNatHostGet 指令,NatGet 指令和 DhcpGet 指令检查当前虚拟 NAT 功能和 DHCP 服务器的设置内容。<BR>一旦启用安全网络的功能,可以在虚拟 HUB 的虚拟网络上使 NAT 路由器 (IP 伪装) 和 DHCP 服务器功能虚拟性的运行。<BR><BR>[有关安全网络功能的警告]<BR>安全网络的功能是面向系统管理员和对具备有关网络的丰富知识的人的功能。<BR>如果正确使用安全网络功能,可能实现通过 VPN 的安全的远程访问。但是如果错误地使用,可能使整个网络处于危险状态。如果不具备全面的的网络知识,没有得到网络管理员许可的情况下,请禁用安全网络功能。关于安全网络功能的详细说明,请参阅 VPN Server 的手册和在线文档。<BR>此命令在群集内作为群集成员服务器操作的 VPN Server 的虚拟 HUB 上不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>SecureNatEnable</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"SecureNatEnable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.90 "SecureNatDisable": 禁用虚拟 NAT 和 DHCP 服务器功能 (安全网络功能)</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">SecureNatDisable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					禁用虚拟 NAT 和 DHCP 服务器功能 (安全网络功能)</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在当前管理的虚拟 HUB 内禁用虚拟 NAT 和 DHCP 服务器功能 (安全网络功能)。一旦执行该命令,虚拟 NAT 功能立即停止,虚拟 DHCP 服务器功能则删除持有的 DHCP 租赁数据并停止该服务。<BR>该指令在作为进群操作的 VPN Server 的虚拟服务器上不能执行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>SecureNatDisable</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"SecureNatDisable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.91 "SecureNatStatusGet": 获取虚拟 NAT 和 DHCP 服务器功能 (安全网络功能) 的工作状态</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">SecureNatStatusGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取虚拟 NAT 和 DHCP 服务器功能 (安全网络功能) 的工作状态</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果在目前管理的虚拟 HUB 内操作虚拟 NAT 和 DHCP 服务器功能 (安全网络功能),获得其操作状态。 <BR>该指令在作为进群操作的 VPN Server 的虚拟服务器上不能执行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>SecureNatStatusGet</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"SecureNatStatusGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.92 "SecureNatHostGet": 获取安全网络功能的虚拟主机的网络接口设置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">SecureNatHostGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取安全网络功能的虚拟主机的网络接口设置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在当前管理的虚拟 HUB 内获取虚拟 NAT 和 DHCP 服务器功能 (安全网络功能) 中的虚拟主机的网络接口设置。<BR>安全网络功能有一枚在虚拟 HUB 内二级市场中的虚拟 LAN 卡,它被赋予了 MAC 地址和 IP 地址。这样,连接到同一个二级市场的其他主机,能够如存在于网络的真实 IP 主机般与安全网络的虚拟主机通信。<BR><BR>[有关安全网络功能的警告]<BR>安全网络的功能是面向系统管理员和对具备有关网络的丰富知识的人的功能。<BR>如果正确使用安全网络功能,可能实现通过 VPN 的安全的远程访问。但是如果错误地使用,可能使整个网络处于危险状态。如果不具备全面的的网络知识,没有得到网络管理员许可的情况下,请禁用安全网络功能。关于安全网络功能的详细说明,请参阅 VPN Server 的手册和在线文档。<BR>此命令在群集内作为群集成员服务器操作的 VPN Server 的虚拟 HUB 上不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>SecureNatHostGet</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"SecureNatHostGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.93 "SecureNatHostSet": 更改安全网络功能的虚拟主机的网络接口设置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">SecureNatHostSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					更改安全网络功能的虚拟主机的网络接口设置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					当前管理的虚拟 HUB 内,更改和保存虚拟 NAT 和 DHCP 服务器功能 (安全网络功能) 的设置项目中的虚拟主机网络接口设置。<BR>安全网络功能有一枚在虚拟 HUB 内二级市场中的虚拟 LAN 卡,它被赋予了 MAC 地址和 IP 地址。这样,连接到同一个二级市场的其他主机,能够如存在于网络的真实 IP 主机般与安全网络的虚拟主机通信。<BR><BR>[有关安全网络功能的警告]<BR>安全网络的功能是面向系统管理员和对具备有关网络的丰富知识的人的功能。<BR>如果正确使用安全网络功能,可能实现通过 VPN 的安全的远程访问。但是如果错误地使用,可能使整个网络处于危险状态。如果不具备全面的的网络知识,没有得到网络管理员许可的情况下,请禁用安全网络功能。关于安全网络功能的详细说明,请参阅 VPN Server 的手册和在线文档。<BR>此命令在群集内作为群集成员服务器操作的 VPN Server 的虚拟 HUB 上不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>SecureNatHostSet [/MAC:mac] [/IP:ip] [/MASK:mask]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"SecureNatHostSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/MAC</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定分配到虚拟接口的 MAC 地址。MAC 地址用诸如 "00-AC-01-23-45-67" 的字符串指定。一但指定 /MAC:none,则不更改将当前的设置。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/IP</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定分配到虚拟接口的 IP 地址。一但指定 /IP:none,则不更改将当前的设置。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/MASK</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定分配到虚拟接口的子网掩码。一但指定 /MASK:none,则不更改将当前的设置。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.94 "NatGet": 获得安全网络功能的虚拟 NAT 功能的设置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">NatGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获得安全网络功能的虚拟 NAT 功能的设置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在当前管理的虚拟 HUB 内,获得虚拟 NAT 和 DHCP 服务器功能 (安全网络功能) 的设置项目中的虚 NAT 设置。<BR>该指令在作为进群操作的 VPN Server 的虚拟服务器上不能执行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>NatGet</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"NatGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.95 "NatEnable": 启用安全网络功能的虚拟 NAT 功能</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">NatEnable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					启用安全网络功能的虚拟 NAT 功能</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在目前管理的虚拟 HUB 内启用虚拟 NAT 功能。<BR>如果使用此指令启动虚拟 NAT 功能,但 SecureNAT 功能没有工作时,则虚拟的 NAT 不工作。要启动 SecureNAT 功能的工作,使用 SecureNatEnable 命令。<BR>该指令在作为进群操作的 VPN Server 的虚拟服务器上不能执行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>NatEnable</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"NatEnable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.96 "NatDisable": 禁用安全网络功能的虚拟 NAT 功能</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">NatDisable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					禁用安全网络功能的虚拟 NAT 功能</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在目前管理的虚拟 HUB 内禁用虚拟 NAT 功能。<BR>该指令在作为进群操作的 VPN Server 的虚拟服务器上不能执行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>NatDisable</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"NatDisable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.97 "NatSet": 更改安全网络功能的虚拟 NAT 功能的设置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">NatSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					更改安全网络功能的虚拟 NAT 功能的设置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					更改目前管理的虚拟 HUB 内的虚拟的 NAT 设置。虚拟的 NAT 设置的内容包括: MTU 值,TCP 会话超时,UDP 会话超时。<BR>该指令在作为进群操作的 VPN Server 的虚拟服务器上不能执行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>NatSet [/MTU:mtu] [/TCPTIMEOUT:tcp_timeout] [/UDPTIMEOUT:udp_timeout] [/LOG:yes|no]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"NatSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/MTU</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					用字节数单位的整数设置 MTU (最大可转让单位的大小)。此值是不包括虚拟 NAT 发送的以太网帧的 MAC 头最大有效载荷长度,默认值是 1500 字节。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/TCPTIMEOUT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置虚拟 NAT 中转 TCP 会话时如果持续多少秒非通信状态即超时并丢弃会话。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/UDPTIMEOUT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置虚拟 NAT 中转 UDP 会话时如果持续多少秒非通信状态即超时并丢弃会话。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/LOG</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定是否将虚拟 NAT 的操作保存在虚拟 HUB 安全日志。指定 "yes" 即保存它,指定 "no" 即不保存。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.98 "NatTable": 获得安全网络功能的虚拟 NAT 功能会话表</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">NatTable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获得安全网络功能的虚拟 NAT 功能会话表</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					虚拟 NAT 功能在目前管理的虚拟 HUB 内运作时,经由虚拟 NAT 获取目前通信中的 TCP 及 UDP 会话表 (NAT 表)。<BR>该指令在作为进群操作的 VPN Server 的虚拟服务器上不能执行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>NatTable</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"NatTable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.99 "DhcpGet": 获得安全网络功能的虚拟 DHCP 服务器功能的设置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">DhcpGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获得安全网络功能的虚拟 DHCP 服务器功能的设置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在当前管理的虚拟 HUB 内获取虚拟 NAT 和 DHCP 服务器功能 (安全网络功能) 的设置项目中的虚拟 DHCP 服务器设置。<BR>该指令在作为进群操作的 VPN Server 的虚拟服务器上不能执行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>DhcpGet</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"DhcpGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.100 "DhcpEnable": 启动安全网络功能的虚拟 DHCP 服务器功能</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">DhcpEnable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					启动安全网络功能的虚拟 DHCP 服务器功能</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在当前管理的虚拟 HUB 内启动虚拟 DHCP 服务器功能。如果使用此指令启动虚拟 DHCP 服务器功能但 SecureNAT 功能不工作的情况下,则虚拟 DHCP 服务器不工作。要启动 SecureNAT 功能,使用 SecureNatEnable 指令。<BR>该指令在作为进群操作的 VPN Server 的虚拟服务器上不能执行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>DhcpEnable</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"DhcpEnable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.101 "DhcpDisable": 禁用安全网络功能的虚拟 DHCP 服务器功能</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">DhcpDisable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					禁用安全网络功能的虚拟 DHCP 服务器功能</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在目前管理的虚拟 HUB 内禁用 DHCP 服务器。<BR>该指令在作为进群操作的 VPN Server 的虚拟服务器上不能执行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>DhcpDisable</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"DhcpDisable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.102 "DhcpSet": 更改安全网络功能的虚拟 DHCP 服务器功能的设置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">DhcpSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					更改安全网络功能的虚拟 DHCP 服务器功能的设置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在现在管理的虚拟 HUB 内,更改虚拟 DHCP 服务器的设置。虚拟 DHCP 服务器设置包括: 分配 IP 地址范围,子网掩码,出租期限,及分配给客户端的选项值。<BR>该指令在作为进群操作的 VPN Server 的虚拟服务器上不能执行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>DhcpSet [/START:start_ip] [/END:end_ip] [/MASK:subnetmask] [/EXPIRE:sec] [/GW:gwip] [/DNS:dns] [/DNS2:dns2] [/DOMAIN:domain] [/LOG:yes|no]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"DhcpSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/START</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定地址范围的开始点,以分发给客户。(例如: 192.168.30.10)</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/END</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定地址范围的结束点,以分发给客户。(例如: 192.168.30.200)</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/MASK</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定对客户指定的子网掩码。(例如: 255.255.255.0)</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/EXPIRE</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					以秒为单位对客户指定租赁 IP 地址时的有效期限</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/GW</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要通知给客户端的默认网关的 IP 地址。如果要与安全网络功能的虚拟 NAT 功能一起启动并使用时,可以指定安全网络的虚拟主机的 IP 地址。如果指定 "0" 或 "none",则不将默认网关通知客户。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/DNS</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定被通知到客户端的主 DNS 服务器的 IP 地址。当 SecureNAT 功能的虚拟 NAT 功能已经启用并正在运行时,您可以为此指定一个 SecureNAT 虚拟主机 IP 地址。如果您指定的是 0 或者 none,那么客户端就不会被 DNS 服务器地址通知。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/DOMAIN</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定域名通知客户。如果指定 none,该域名不通知客户。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/LOG</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定是否将虚拟 DHCP 服务器运行保存为安全日志。指定 "yes" 则保存。此值与虚拟 NAT 功能的日志保存设置是联动的。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.103 "DhcpTable": 获取安全网络功能的虚拟 DHCP 服务器租约表格</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">DhcpTable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取安全网络功能的虚拟 DHCP 服务器租约表格</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在目前管理的虚拟 HUB 内操作 DHCP 服务器功能时,获取分配到 DHCP 服务器持有的客户端的 IP 地址租约表。<BR>该指令在作为进群操作的 VPN Server 的虚拟服务器上不能执行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>DhcpTable</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"DhcpTable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.104 "AdminOptionList": 获取虚拟 HUB 管理选项列表</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AdminOptionList</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取虚拟 HUB 管理选项列表</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取目前管理的虚拟 HUB 设置的虚拟 HUB 管理选项列表。<BR>VPN Server 的管理员委托各个虚拟 HUB 的管理员对虚拟 HUB 进行管理时,为限制其设置范围,使用虚拟 HUB 管理选项。<BR>能够对虚拟 HUB 管理选项进行添加,编辑,删除的,只有掌握着此 VPN Server 全部管理权限的管理员。虚拟 HUB 的管理员可以显示管理选项,但不能更改。<BR>然而,allow_hub_admin_change_option 设置为 1 时,虚拟 HUB 的管理员也可以编辑管理选项。<BR>此命令用 VPN Bridge 不能运行。<BR>此命令在群集内作为群集成员服务器操作的 VPN Server 的虚拟 HUB 上不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AdminOptionList</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AdminOptionList" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.105 "AdminOptionSet": 设置虚拟 HUB 管理选项的价值</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AdminOptionSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置虚拟 HUB 管理选项的价值</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					变更目前管理的虚拟 HUB 设置的虚拟 HUB 管理选项的值。<BR>VPN Server 的管理员委托各个虚拟 HUB 的管理员对虚拟 HUB 进行管理时,为限制其设置范围,使用虚拟 HUB 管理选项。<BR>能够对虚拟 HUB 管理选项进行添加,编辑,删除的,只有掌握着此 VPN Server 全部管理权限的管理员。虚拟 HUB 的管理员可以显示管理选项,但不能更改。<BR>然而,allow_hub_admin_change_option 设置为 1 时,虚拟 HUB 的管理员也可以编辑管理选项。<BR>此命令用 VPN Bridge 不能运行。<BR>此命令在群集内作为群集成员服务器操作的 VPN Server 的虚拟 HUB 上不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AdminOptionSet [name] [/VALUE:value]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AdminOptionSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定更改值的管理选项名。以 AdminOptionList 指令可以获取名单。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/VALUE</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					以整数指定要设定的值。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.106 "ExtOptionList": 获取虚拟 HUB 扩展选项列表</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ExtOptionList</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取虚拟 HUB 扩展选项列表</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取目前管理的虚拟 HUB 设置的虚拟 HUB 扩展选项列表。<BR>虚拟 HUB 扩展选项使你可以对虚拟 HUB 进行更多的配置。똨Å况下,VPN Server 的全球管理员和个人虚拟 HUB 的管理员都可以修改虚拟 HUB 扩展选项。<BR>但是,如果虚拟 HUB 管理选项 deny_hub_admin_change_ext_option 被设置为 1,个人虚拟 HUB 管理员就不能修改虚拟 HUB 扩展选项。<BR>此命令不能在 VPN Bridge 上运行。<BR>以集群成员运行的 VPN Server 的虚拟 HUB 不能执行此命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ExtOptionList</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ExtOptionList" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.107 "ExtOptionSet": 设置虚拟 HUB 扩展选项的值</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">ExtOptionSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置虚拟 HUB 扩展选项的值</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					使用此命令在当前管理的虚拟 HUB 的虚拟 HUB 扩展选项列表设置一个值。<BR>虚拟 HUB 扩展选项使你可以对虚拟 HUB 进行更多的配置。똨Å况下,VPN Server 的全球管理员和个人虚拟 HUB 的管理员都可以修改虚拟 HUB 扩展选项。<BR>但是,如果虚拟 HUB 管理选项 deny_hub_admin_change_ext_option 被设置为 1,个人虚拟 HUB 管理员就不能修改虚拟 HUB 扩展选项。<BR>此命令不能在 VPN Bridge 上运行。 <BR>以集群成员运行的 VPN Server 的虚拟 HUB 不能执行此命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>ExtOptionSet [name] [/VALUE:value]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"ExtOptionSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定您要更改其值的虚拟 HUB 扩展选项的名称。使用 ExtOptionList 命令,你可以得到一个名称列表。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/VALUE</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					以整数指定要设定的值。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.108 "CrlList": 获取无效证书名单列表</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CrlList</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取无效证书名单列表</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取目前管理的虚拟 HUB 设置的无效证书名单列表。<BR>一旦证书注册到无效证书列表内,提交了其证书的客户,将不能用证书认证模式连接虚拟 HUB。<BR>通常情况下,因为泄漏密钥或证书持有人的权限失效时,将该证书作为无效证书注册到虚拟 HUB,而 VPN 客户欲使用该证书连接虚拟 HUB 时会被拒绝用户认证,这种情况下该功能被使用。<BR>此命令用 VPN Bridge 不能运行。<BR>此命令在群集内作为群集成员服务器操作的 VPN Server 的虚拟 HUB 上不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CrlList</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CrlList" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.109 "CrlAdd": 添加无效的证书</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CrlAdd</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					添加无效的证书</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在目前管理的虚拟 HUB 设置的无效的证书名单中添加新的无效证书的定义。<BR>用此指令的参数指定要注册到无效证书列表中的内容。用户用证书认证模式连接到虚拟 HUB 时,如果其证书与无效证书列表中注册的一条以上的内容一致,将拒绝该用户的连接。<BR>与此指令指定的参数定义的所有条件相一致的证书,会被判断为无效。<BR>可以设置该项目为:[名称 (CN)],[所属机构 (O)],[组织单位 (OU)],[国家 (C)],[州 (ST)],[现地 (L)],[序号 (十六进制)],[MD5 摘要值 (十六进制,128 位)],[SHA-1 摘要值 (十六进制,160位)]。摘要值 (哈希值) 的指定,是将证明书指定为事实上的唯一。通常情况下,如果输入 MD5 或 SHA-1摘要值,就不用输入其他项目。<BR>此命令用 VPN Bridge 不能运行。<BR>此命令在群集内作为群集成员服务器操作的 VPN Server 的虚拟 HUB 上不能运行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CrlAdd [/SERIAL:serial] [/MD5:md5] [/SHA1:sha1] [/CN:cn] [/O:o] [/OU:ou] [/C:c] [/ST:st] [/L:l]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CrlAdd" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SERIAL</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					作为条件,在设定证书的序列号 (16 进制) 时,以此此参数指定其值。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/MD5</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					作为条件,在设定证书的 MD5 摘要值 (十六进制,128 位) 时,以此参数指定其值。如果不指定 16 进制 32 个字符 (16 字节) 的参数,则被忽略。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SHA1</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					作为条件,在设定证书的 SHA-1 摘要值的条件 (十六进制,160 位) 时,以此参数指定其值。如不指定十六进制 40 个字符 (20 字节) 的参数,则被忽略。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/CN</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					作为条件,指定证书的名称 (CN) 时,以此参数设定其值。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/O</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					作为条件,指定证书的所属机构 (O) 时,以此参数设定其值。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/OU</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					作为条件,指定证书的组织单位 (OU) 时,以此参数设定其值。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/C</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					作为条件,指定证书的国家 (C) 时,以此参数设定其值。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/ST</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					作为条件,指定证书的州 (ST) 时,以此参数设定其值。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/L</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					作为条件,指定证书的当地 (L) 时,以此参数设定其值。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.110 "CrlDel": 删除无效的证书</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CrlDel</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除无效的证书</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					从目前管理的虚拟 HUB设置的无效证书名单中指定并删除无效证书的定义。<BR>目前注册的无效证书的定义列表,可用 CrlList 指令获取。<BR>该指令虚拟专用桥不能运行。 <BR>该指令在作为进群操作的 VPN Server 的虚拟服务器上不能执行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CrlDel [id]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CrlDel" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>id</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要删除的无效的证书的定义中的 ID。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.111 "CrlGet": 获取无效的证书</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CrlGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取无效的证书</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					从目前管理的虚拟 HUB 设置的无效证书名单中指定无效证书的定义,获取其定义的内容。<BR>目前注册的无效证书的定义列表,可用 CrlList 指令获取。<BR>该指令虚拟专用桥不能运行。<BR>该指令在作为进群操作的 VPN Server 的虚拟服务器上不能执行。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CrlGet [id]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CrlGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>id</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要获取的无效的证书的定义中的 ID。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.112 "AcList": 获取源 IP 地址访问限制列表的规则项目列表</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AcList</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取源 IP 地址访问限制列表的规则项目列表</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					用本命令来获取目前管理的虚拟 HUB 上设置的源 IP 地址限制列表规则的列表。<BR>根据客户端电脑的源 IP 地址,您可以允许或拒绝对该虚拟 HUB 的 VPN 连接。可以定义多个规则,设置每个规则的优先顺序。优先顺序按照从高到低顺序,根据最先与 IP 地址匹配的规则运行,允许或拒绝从客户端的连接。<BR>该命令在 VPN Bridge 上不能运行。<BR>以集群成员运行的 VPN Server 的虚拟 HUB 不能执行此命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AcList</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AcList" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.113 "AcAdd": 添加规则到 IP 地址限制列表(IPv4)</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AcAdd</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					添加规则到 IP 地址限制列表(IPv4)</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在目前管理的虚拟 HUB 设置的 IP 地址限制列表中添加新规则。<BR>当 VPN Client 试图连接虚拟 HUB 时,在此设置的项目决定允许或拒绝来自该客户端的连接。<BR>你可以指定规则项目的内容相匹配的客户端 IP 地址,或者 IP 地址和子网掩码。如果只指定 IP 地址,仅指定一台与该规则相匹配的计算机;如果指定 IP 网络掩码地址和子网掩码地址,该规则匹配的子网范围内的所有计算机均被指定。<BR>可以设置规则的优先顺序。以大于 1 的整数指定优先顺序,值越小则优先顺序越高。<BR>要获取目前注册的源 IP 地址限制列表,使用 AcList 命令。<BR>该命令在 VPN Bridge 上不能运行。<BR>以集群成员运行的 VPN Server 的虚拟 HUB 不能执行此命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AcAdd [allow|deny] [/PRIORITY:priority] [/IP:ip/mask]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AcAdd" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>allow|deny</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设定允许 ("allow") 或拒绝 ("deny") 与规则相一致的来自客户端的连接。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/PRIORITY</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					以大于 1 的整数指定该规则的优先顺序。其值越小则优先顺序越高。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/IP</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					以 "IP 地址/掩码" 的形式指定客户端 IPv4 地址范围。IPv4 地址为 "192.168.0.1" 那样的,指定为用点分隔的十进制数。掩码为 "255.255.255.0" 那样的,指定为用点分隔的十进制数,可以用十进制数指定 24 位从头开始的比特长度,可作为十进制 10 款规定。要指定一个单独的 IPv4 主机,指定掩码为 "32" 或者 "255.255.255.255"</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.114 "AcDel": 源 IP 地址限制列表内的删除规则</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AcDel</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					源 IP 地址限制列表内的删除规则</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					使用本命令删除目前管理的虚拟 HUB 设置的 IP 地址限制列表的规则。<BR>要获取目前注册的 IP 访问控制列表的规则列表,使用AcList命令。<BR>该指令虚拟专用桥不能运行。<BR>该命令在 VPN Bridge 上不能运行。<BR>以集群成员运行的 VPN Server 的虚拟 HUB 不能执行此命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AcDel [id]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AcDel" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>id</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要删除的源 IP 地址限制列表内的规则的 ID。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.4.115 "AcAdd6": 添加规则到源 IP 地址访问限制列表(IPv6)</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AcAdd6</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					添加规则到源 IP 地址访问限制列表(IPv6)</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在目前管理的虚拟 HUB 设置的 IP 地址限制列表中添加新规则。<BR>当 VPN Client 试图连接虚拟 HUB 时,在此设置的项目决定允许或拒绝来自该客户端的连接。<BR>你可以指定规则项目的内容相匹配的客户端 IP 地址,或者 IP 地址和子网掩码。如果只指定 IP 地址,仅指定一台与该规则相匹配的计算机;如果指定 IP 网络掩码地址和子网掩码地址,该规则匹配的子网范围内的所有计算机均被指定。<BR>可以设置规则的优先顺序。以大于 1 的整数指定优先顺序,值越小则优先顺序越高。<BR>要获取目前注册的源 IP 地址限制列表,使用 AcList 命令。<BR>该命令在 VPN Bridge 上不能运行。<BR>以集群成员运行的 VPN Server 的虚拟 HUB 不能执行此命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AcAdd6 [allow|deny] [/PRIORITY:priority] [/IP:ip/mask]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AcAdd6" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>allow|deny</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设定允许 ("allow") 或拒绝 ("deny") 与规则相一致的来自客户端的连接。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/PRIORITY</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					以大于 1 的整数指定该规则的优先顺序。其值越小则优先顺序越高。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/IP</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					以 [IP 地址/掩码] 的形式指定客户端 IPv6 地址范围。IPv6 地址为 2001:200:0:1:: 那样的,指定由冒号分隔的十六进制数。掩码为 ffff:ffff:ffff:ffff:: 那样的,指定由冒号分隔的十六进制数,可以用十进制数指定 64 位从头开始的比特长度,可作为十进制 10 款规定。如果设定为 "::/128" 则显示单一的主机。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+
+
+
+
+
+
+
+
+
+
+------ 3 ------
+
+
+
+
+
+
+
+
+
+		<h3>6.5.1 "About": 显示版本信息</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">About</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					显示版本信息</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					这显示了此命令行管理工具的版本信息。版本信息中包括了 vpncmd 版本号,内部标号和内部标号信息。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>About</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"About" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.2 "VersionGet": 获取 VPN 客户服务的版本信息</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">VersionGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取 VPN 客户服务的版本信息</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取目前管理的 VPN 客户服务程序的版本信息。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>VersionGet</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"VersionGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.3 "PasswordSet": 为连接到 VPN 客户服务的密码的设定</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">PasswordSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					为连接到 VPN 客户服务的密码的设定</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					对 VPN Client 服务,从命令行管理工具及 VPN Client 经理来进行连接控制时,可以要求输入密码。使用此指令,可以设置要求输入的密码。<BR>以只对从远程 (本地主机以外的电脑) 进行操作时要求其输入密码。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>PasswordSet [password] [/REMOTEONLY:yes|no]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"PasswordSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>password</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要设置的密码。如指定为 "none",可以删除密码的设置。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/REMOTEONLY</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果指定 "yes",只对从远程 (本地主机以外的电脑) 进行操作时要求其输入密码,从本地主机连接时,不要求密码。如果省略此参数,则视为 "no"。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.4 "PasswordGet": 获取为连接到 VPN 客户服务的密码的设定</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">PasswordGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取为连接到 VPN 客户服务的密码的设定</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					对 VPN Client 服务,从命令行管理工具及 VPN Client 经理来进行连接控制时,获取是否要求输入密码的设置。<BR>而且,对于要求密码的情况下,获取是否设置只对从远程 (本地主机以外的电脑) 进行操作的情况要求输入密码。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>PasswordGet</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"PasswordGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.5 "CertList": 获取信任的证明机构的证书列表</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CertList</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取信任的证明机构的证书列表</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					VPN Client 管理信用的证明机构的证书列表。已注册的证明机构证书的注册列表,用来进行连接 VPN Server 时的验证服务器证书。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CertList</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CertList" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.6 "CertAdd": 添加信任的证明机构的证书</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CertAdd</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					添加信任的证明机构的证书</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					向 VPN Client 信任的证明机构的证书列表添加新证书。已注册的证明机构证书的注册列表,用来进行连接 VPN Server 时的验证服务器证书。<BR>要获取当前的证书列表,使用 CertList 指令。<BR>要添加证书,该证书需要保存为 X.509 格式的文件。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CertAdd [path]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CertAdd" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>path</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要注册的 X.509 证书的文件名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.7 "CertDelete": 删除信任的证明机构的证书</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CertDelete</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除信任的证明机构的证书</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					从 VPN Client 信任的证明机构的证书列表中删除现有的证书。<BR>要获取当前的证书列表,使用 CertList 命令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CertDelete [id]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CertDelete" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>id</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要删除的证书的 ID。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.8 "CertGet": 获得新任的证明机构的证书</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">CertGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获得新任的证明机构的证书</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取 VPN Client 信任的证明机构的证书列表中的现有证书,以 X.509 格式文件保存。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>CertGet [id] [/SAVECERT:path]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"CertGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>id</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要获取的证书 ID。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SAVECERT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定获取到的证书的保存文件名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.9 "SecureList": 获取可用的智能卡种类列表</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">SecureList</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取可用的智能卡种类列表</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					VPN Client 显示的被支持的智能卡类型的列表。<BR>智能卡类型的列表,目前的计算机上被安装驱动程序,且显示以 VPN 软件支持的设备列表。<BR><BR>如果没有显示目前使用的智能卡型,或许可以通过更新 VPN 软件至新的版本来使用。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>SecureList</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"SecureList" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.10 "SecureSelect": 选择要使用的智能卡种类</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">SecureSelect</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选择要使用的智能卡种类</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					选择 VPN 客户使用的智能卡类型。<BR>可以使用的智能卡种类列表,可用 SecureList 指令获取。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>SecureSelect [id]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"SecureSelect" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>id</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定智能卡种类的 ID。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.11 "SecureGet": 获取使用的智能卡种类的 ID</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">SecureGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取使用的智能卡种类的 ID</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取为当前 VPN 客户的使用而设置的智能卡种类的 ID。通过基于此 ID 上的 SecureList 指令的结果,可以获取当前选择的智能卡类型。<BR>如果当前的智能卡没有被选择,ID 显示是 0。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>SecureGet</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"SecureGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.12 "NicCreate": 新的虚拟 LAN 卡的创建</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">NicCreate</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					新的虚拟 LAN 卡的创建</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					将新的虚拟 LAN 卡添加到系统。可以对虚拟 LAN 卡任意命名。<BR>然而,给虚拟 LAN 卡命名时只能使用英文字母数字,Windows 2000 以上的系统最大可设置 31 个字符,Windows 98,98 SE 和 ME 系统最大可设置 4 个字符。<BR>调用了 NicCreate 指令时,VPN Client 运行的操作系统,将被安装新的虚拟 LAN 卡设备驱动程序。<BR>在此情况下,操作系统可能会显示对话框,确认是否要安装设备驱动程序。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>NicCreate [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"NicCreate" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定虚拟 LAN 卡名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.13 "NicDelete": 删除虚拟 LAN 卡</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">NicDelete</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除虚拟 LAN 卡</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					从系统中删除现有的虚拟 LAN 卡。<BR>当从系统中删除虚拟 LAN 卡,使用此虚拟 LAN 卡的连接将被中断。<BR>而且,位使用被删除的虚拟 LAN 卡而设置的连接设置,自动更改设置为使用别的虚拟 LAN 卡。<BR>当 VPN 客户运行 Windows 2000 以上的操纵系统时,此指令可以被使用。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>NicDelete [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"NicDelete" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定的虚拟 LAN 卡名</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.14 "NicUpgrade": 升级虚拟 LAN 卡设备驱动</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">NicUpgrade</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					升级虚拟 LAN 卡设备驱动</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果现有的虚拟 LAN 卡的设备驱动程序版本太旧,在当前正在运行的 VPN Client 升级到同包附带的最新的设备驱动程序。即使不进行升级,也要重新安装设备驱动程序。<BR>操作系统可能会显示对话框,确认是否要安装设备驱动程序。<BR>此指令,在 VPN Client 正运行 Windows 2000 以上的操作系统时能够使用。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>NicUpgrade [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"NicUpgrade" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定的虚拟 LAN 卡名</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.15 "NicGetSetting": 获取虚拟 LAN 卡的设置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">NicGetSetting</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取虚拟 LAN 卡的设置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取现有的虚拟 LAN 卡的 MAC 地址设置。<BR>当 VPN 客户运行 Windows 2000 以上的操纵系统时,此指令可以被使用。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>NicGetSetting [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"NicGetSetting" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定虚拟 LAN 卡名</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.16 "NicSetSetting": 更改虚拟 LAN 卡设置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">NicSetSetting</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					更改虚拟 LAN 卡设置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					更改现有的虚拟 LAN 卡的 MAC 地址设置。一旦启动该指令,目前运行中的虚拟 LAN 卡设备驱动将被重新启动。<BR>当 VPN 客户运行 Windows 2000 以上的操纵系统时,此指令可以被使用。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>NicSetSetting [name] [/MAC:mac]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"NicSetSetting" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定虚拟 LAN 卡名</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/MAC</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要设置的 MAC 地址。
+MAC 地址请用 6 字节十六进制字符串指定。
+例如: 00:AC:01:23:45:67 或 00-AC-01-23-45-67</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.17 "NicEnable": 启用虚拟 LAN 卡</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">NicEnable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					启用虚拟 LAN 卡</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					启动现有的被禁用的虚拟 LAN 卡。<BR>当 VPN 客户运行 Windows 2000 以上的操纵系统时,此指令可以被使用。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>NicEnable [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"NicEnable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定虚拟 LAN 卡的名称。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.18 "NicDisable": 禁用虚拟 LAN 卡</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">NicDisable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					禁用虚拟 LAN 卡</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					禁用现有的正使用的虚拟 LAN 卡。<BR>当 VPN 客户运行 Windows 2000 以上的操纵系统时,此指令可以被使用。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>NicDisable [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"NicDisable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定虚拟 LAN 卡的名称。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.19 "NicList": 获取虚拟 LAN 卡列表</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">NicList</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取虚拟 LAN 卡列表</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取在当前系统注册的虚拟 LAN 卡列表</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>NicList</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"NicList" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.20 "AccountList": 获取连接设置列表</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountList</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取连接设置列表</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取登录到 VPN Client 的连接设置列表</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountList</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountList" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.21 "AccountCreate": 创建新的连接设置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountCreate</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					创建新的连接设置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在 VPN Client 创建新的连接设置。<BR>要创建连接设置,作为初始参数需要指定加在连接设置名称和连接终端的服务器,及连接终端的虚拟 HUB,用户名上使用的虚拟 LAN 卡名。创建了新的连接设置时,用户认证的类型被初始设置为 [匿名认证],代理服务器的设置和服务器证书的检查选项不被设置。若要更改这些设置和其他的详细设置,创建连接设置后,使用以 "Account" 名字开始的其他指令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountCreate [name] [/SERVER:hostname:port] [/HUB:hubname] [/USERNAME:username] [/NICNAME:nicname]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountCreate" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要创建的连接设置名</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SERVER</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					以 [主机名:端口号] 的形式指定终端 VPN Server 的主机名,端口号。可以通过 IP 地址进行指定。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/HUB</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在终端 VPN Server 上指定虚拟 HUB。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/USERNAME</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定在连接到终端 VPN Server 时用于用户认证的用户名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/NICNAME</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定用于连接的虚拟 LAN 卡名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.22 "AccountSet": 设定连接设置连接终端</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设定连接设置连接终端</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置注册在 VPN 客户的连接设置的终端 VPN Server 主机名和端口号,虚拟 HUB 名,及用于连接的用户名,加在其上使用的虚拟 LAN 卡名。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountSet [name] [/SERVER:hostname:port] [/HUB:hubname]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要更改设置的连接设置名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SERVER</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					以 [主机名:端口号] 的形式指定终端 VPN Server 的主机名,端口号。可以通过 IP 地址进行指定。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/HUB</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定终端的 VPN Server 上的虚拟 HUB。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.23 "AccountGet": 取得连接设置的设置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					取得连接设置的设置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取注册到 VPN Client 的连接设置的连接设置内容。<BR>而且,要改变连接设置的连接设置内容,在创建连接设置后使用其他的以 "Account" 名开始的的指令。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountGet [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要获取的连接设置名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.24 "AccountDelete": 删除连接设置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountDelete</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除连接设置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除注册到 VPN Client 的连接设置。如果指定的连接设置处于在线状态,将会自动断开连接并删除。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountDelete [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountDelete" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要删除的连接设置名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.25 "AccountUsernameSet": 设置用于连接的连接设置的用户名</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountUsernameSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置用于连接的连接设置的用户名</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定注册到 VPN Client 的连接设置,且其连接设置连接到 VPN Server 上时,指定需要进行用户认证的用户名。<BR>而且,在一些情况下有必要指定用户认证的种类和需要的参数。要更改这些信息,可以使用如下指令: AccountAnonymousSet, AccountPasswordSet, AccountCertSet 和 AccountSecureCertSet。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountUsernameSet [name] [/USERNAME:username]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountUsernameSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定更改设置的连接设置名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/USERNAME</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定连接设置连接到 VPN Server 上时需要进行用户认证的用户名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.26 "AccountAnonymousSet": 设定连接设置的用户认证种类为匿名认证</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountAnonymousSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设定连接设置的用户认证种类为匿名认证</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定注册到 VPN Client 的连接设置,把其连接设置连接到 VPN Server 上时的用户认证方法,设置为 [匿名认证]。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountAnonymousSet [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountAnonymousSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定更改设置的连接设置名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.27 "AccountPasswordSet": 设定连接设置的用户证类型为密码认证</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountPasswordSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设定连接设置的用户证类型为密码认证</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定注册到 VPN Client 的连接设置,把其连接设置连接到 VPN Server 上时的用户认证方法,设置为 [密码认证]。指定 [标准密码认证] 和 [RADIUS 或 NT 域认证] 作为密码认证种类。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountPasswordSet [name] [/PASSWORD:password] [/TYPE:standard|radius]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountPasswordSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定更改设置的连接设置名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/PASSWORD</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定密码认证使用的密码。如果不指定,将显示输入密码的提示。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/TYPE</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					作为密码认证类型,指定 "standard" (标准密码认证) 或 "radius" (RADIUS 或 NT 域认证) 的二者之一。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.28 "AccountCertSet": 设置连接设置的用户认证类型为用户证书认证</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountCertSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置连接设置的用户认证类型为用户证书认证</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定注册到 VPN Client 的连接设置,把其连接设置连接到 VPN Server 上时的用户认证方法,设置为 [用户证书认证]。作为该证书,必须指定证书文件为 X.509 格式且私钥文件是 Base 64 编码。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountCertSet [name] [/LOADCERT:cert] [/LOADKEY:key]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountCertSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要更改设置的连接设置名</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/LOADCERT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定以证书认证提交的 X.509 格式证书的文件名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/LOADKEY</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定以对应证书的 Base 64 格式的编码私钥文件名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.29 "AccountCertGet": 获取用于连接设置的客户端证书</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountCertGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取用于连接设置的客户端证书</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					当指定注册到 VPN Client 的连接设置,其连接设置使用使用客户证书认证时,获取作为客户证书提出的证书,并保存该证书文件为 X.509 格式。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountCertGet [name] [/SAVECERT:cert]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountCertGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要获取设置的连接设置名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SAVECERT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定以 X.509 格式保存获取的证书的文件名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.30 "AccountEncryptDisable": 禁用连接设置进行通信时的加密</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountEncryptDisable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					禁用连接设置进行通信时的加密</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					当指定注册到 VPN Client 的连接设置,且其连接设置与 VPN Server 间进行 VPN 连接通信时,将与 VPN Server 间的通信内容以 SSL 设置为不加密。<BR>通常,将与 VPN Server 间的通信以 SSL 加密,是防止信息的窃听和篡改。也可以禁用加密。当禁用加密时,通信量将扩大但是通信数据将以纯文本格式在网络上传输。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountEncryptDisable [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountEncryptDisable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要更改设置的连接设置名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.31 "AccountEncryptEnable": 启用连接设置进行通信的加密</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountEncryptEnable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					启用连接设置进行通信的加密</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					当指定注册到 VPN Client 的连接设置,且其连接设置与 VPN Server 间进行 VPN 连接通信时,将与 VPN Server 间的通信内容以 SSL 设置为加密。<BR>通常,将与 VPN Server 间的通信以 SSL 加密,是防止信息的窃听和篡改。也可以禁用加密。当禁用加密时,通信量将扩大但是通信数据将以纯文本格式在网络上传输。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountEncryptEnable [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountEncryptEnable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要更改设置的连接设置名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.32 "AccountCompressEnable": 启用连接设置进行通信时的数据压缩</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountCompressEnable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					启用连接设置进行通信时的数据压缩</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					当指定注册到 VPN Client 的连接设置,且其连接设置与 VPN Server 间进行 VPN 连接通信时,将与 VPN Server 间的通信内容设置为压缩。<BR>最大可以进行约 80% 的压缩。但是,压缩会使客户端及服务器双方的 CPU 产生较高的负荷。当线路速度为约 10 Mbps 以上时,压缩可能会降低吞吐量,产生反面效果。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountCompressEnable [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountCompressEnable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要更改设置的连接设置名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.33 "AccountCompressDisable": 禁用连接设置进行通信时的数据压缩</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountCompressDisable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					禁用连接设置进行通信时的数据压缩</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					当指定注册到 VPN Client 的连接设置,且其连接设置与 VPN Server 间进行 VPN 连接通信时,将与 VPN Server 间的通信内容设置为不压缩。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountCompressDisable [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountCompressDisable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要更改设置的连接设置名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.34 "AccountProxyNone": 将连接设置的连接方法直接设置为 TCP/IP 连接</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountProxyNone</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					将连接设置的连接方法直接设置为 TCP/IP 连接</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					当指定注册到 VPN Client 的连接设置,将其连接设置与 VPN Server 间进行 VPN 连接时使用的连接方法设置为 [直接 TCP/IP连接],不通过代理服务器。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountProxyNone [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountProxyNone" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要更改设置的连接设置名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.35 "AccountProxyHttp": 将连接设置的连接方法设置为通过 HTTP 代理服务器连接</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountProxyHttp</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					将连接设置的连接方法设置为通过 HTTP 代理服务器连接</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					当指定注册到 VPN Client 的连接设置,将其连接设置与 VPN Server 间进行 VPN 连接时使用的连接方法设置为 [通过 HTTP 代理服务器连接],指定将通过的 HTTP 代理服务器的主机名和端口号,用户名和密码 (如果需要)。<BR>通过 HTTP 代理服务器,必须对应因进行 HTTPS 通信的 CONNECT 方法。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountProxyHttp [name] [/SERVER:hostname:port] [/USERNAME:username] [/PASSWORD:password]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountProxyHttp" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要更改设置的连接设置名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SERVER</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					以 [主机名:端口号] 的形式,指定通过 HTTP 代理服务器的主机名或 IP 地址和端口号。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/PASSWORD</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果因为连接通过 HTTP 代理服务器而需要用户认证时,指定密码。与 /USERNAME 参数一起指定。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.36 "AccountProxySocks": 将连接设置的连接方法设置为通过 SOCKS 代理服务器连接</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountProxySocks</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					将连接设置的连接方法设置为通过 SOCKS 代理服务器连接</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					当指定注册到 VPN Client 的连接设置,将其连接设置与 VPN Server 间进行 VPN 连接时使用的连接方法设置为 [通过 SOCKS 服务器连接],并指定要通过的 SOCKS 代理服务器的主机名和端口号,用户名和密码 (如果需要)。<BR>通过 SOCKS 服务器,必须对应 SOCKS 版本 4。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountProxySocks [name] [/SERVER:hostname:port] [/USERNAME:username] [/PASSWORD:password]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountProxySocks" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要更改设置的连接设置名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SERVER</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					以 [主机名:端口号] 形式,指定要通过的 SOCKS 代理服务器主机名或 IP 地址和端口号。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/PASSWORD</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果因为连接通过 SOCKS 代理服务器而需要用户认证时,指定密码。与 /USERNAME 参数一起指定。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.37 "AccountServerCertEnable": 启用连接设置服务器证书验证选项</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountServerCertEnable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					启用连接设置服务器证书验证选项</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定注册到 VPN Client 的连接设置,其连接设置连接到 VPN Server 时,启动检查连接终端的 VPN Server 提交的 SSL 证书是否可信的选项。<BR>如果启用此选项,可以预先将连接目标服务器的 SSL 证书以 AccountServerCertSet 指令保存在连接设置的设置内,或建议将服务器的 SSL 证书签名了的根证书,以 CertAdd 指令注册到虚拟 HUB 信任的证明机构的证书列表中。如果没有注册,初次连接时可能会显示确认信息。<BR>验证连接设置的服务器证书的选项处于启动状态,连接了的 VPN Server 的证书不可信时,立即解除连接,反复重试。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountServerCertEnable [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountServerCertEnable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要更改设置的连接设置名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.38 "AccountServerCertDisable": 禁用连接设置服务器证书验证选项</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountServerCertDisable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					禁用连接设置服务器证书验证选项</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定注册到 VPN Client 的连接设置,其连接设置与 VPN Server 连接时,禁止检验由目标 VPN Server 提供的 SSL 证明书是否可信的选项。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountServerCertDisable [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountServerCertDisable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要更改设置的连接设置名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.39 "AccountServerCertSet": 设置连接设置的服务器固有证明书</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountServerCertSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置连接设置的服务器固有证明书</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定注册到 VPN Client 的连接设置,其连接设置连接到 VPN Server 时,预先注册与连接目标的 VPN Server 提交的 SSL 证书相同的证书。<BR>如果启动了连接设置的服务器证书验证选项,可以预先将连接目标服务器的 SSL 证书以此指令保存在连接设置的设置内,或需要将服务器的 SSL 证书签名了的根证书,以 CAAdd 指令注册到虚拟 HUB 信任的证明机构的证书列表中。<BR>验证连接设置的服务器证书的选项处于启动状态,连接了的 VPN Server 的证书不可信时,立即解除连接,反复重试。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountServerCertSet [name] [/LOADCERT:cert]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountServerCertSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要更改设置的连接设置名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/LOADCERT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定以 X.509 证书格式保存的设置服务器固有证书的证书文件名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.40 "AccountServerCertDelete": 删除连接设置的服务器固有证书</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountServerCertDelete</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					删除连接设置的服务器固有证书</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定注册到到 VPN Client 的连接设置,且其连接设置注册了服务器固有证书时,删除证书。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountServerCertDelete [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountServerCertDelete" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要更改设置的连接设置名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.41 "AccountServerCertGet": 获取连接设置的服务器固有证明书</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountServerCertGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取连接设置的服务器固有证明书</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定注册到到 VPN Client 的连接设置,且其连接设置注册了服务器固有证书时,获取该证书并以 X.509 格式保存证明书文件。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountServerCertGet [name] [/SAVECERT:path]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountServerCertGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要更改设置的连接设置名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SAVECERT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定以 X.509 证书格式保存的服务器固有证书的证书文件名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.42 "AccountDetailSet": 设置接续设置的高级通信设置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountDetailSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置接续设置的高级通信设置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定注册到 VPN Client 的连接设置,并定制其连接设置与 VPN Server 通信时使用的 VPN 协议的通信设置。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountDetailSet [name] [/MAXTCP:max_connection] [/INTERVAL:additional_interval] [/TTL:disconnect_span] [/HALF:yes|no] [/BRIDGE:yes|no] [/MONITOR:yes|no] [/NOTRACK:yes|no] [/NOQOS:yes|no]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountDetailSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要更改设置的连接设置名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/MAXTCP</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					VPN 通信使用的 TCP 连接数,指定从 1 到 32 的整数。在与 VPN Server 之间的 VPN 通信会话上的数据传送,通过使用多个 TCP 连接,可以提高通信速度。
+注意: 如果连接服务器的线路是高速线路时,建议 8 个左右,如果是拨号等低速线路时,建议 1 个。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/INTERVAL</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					建立多个 TCP 连接进行 VPN 通信时,以秒为单位指定每个 TCP 连接的建立间隔。规定值为 1 秒。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/TTL</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					如果设置的每个 TCP 连接的寿命时,从 TCP 连接的建立到断开的寿命以秒数来指定。如果指定 "0",则寿命未被设置。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/HALF</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					要启动半双工模式,指定 "yes"。将两个以上的 TCP 连接捆绑,进行 VPN 通信时,可以使用 "半双工模式"。启动半双工模式,能够自动将各 TCP 连接的数据传输方向固定各一半。例如,使用 8 个 TCP 连接建立了 VPN 会话时,启动半双工模式,则固定 4 个 TCP 连接为上传方向专用,剩下 4 个 TCP 连接为下载方向专用,进行通信。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/BRIDGE</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					与 VPN Server 以 "桥 / 路由器模式" 连接时,指定 "yes"。使用桥/路由器模式连接时,VPN Client 的虚拟 LAN 卡方将能够与其他网络进行桥或路由。然而,如果用于连接的用户的安全策略禁用桥或路由时,则连接失败。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/MONITOR</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					与 VPN Server 以 "监控模式" 连接时,指定 "yes"。如果使用监测模式连接时,可以接收虚拟 HUB 内传送的所有的数据包。然而,用于连接的用户安全策略不允许监视模式时,则连接失败。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/NOTRACK</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定 "yes",禁用路由器表项调节器。通常情况下,指定 "no"。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/NOQOS</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					禁用 VoIP / QoS 功能时指定 "yes"。通常指定 "no"。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.43 "AccountRename": 更改连接设置名称</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountRename</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					更改连接设置名称</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定在 VPN Client 注册的连接设置,更改其连接设置名称。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountRename [name] [/NEW:new_name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountRename" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要更改名称的连接设置的当前名称。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/NEW</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定变更后的新名称。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.44 "AccountConnect": 使用连接设置,开始连接 VPN Server</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountConnect</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					使用连接设置,开始连接 VPN Server</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定注册到 VPN Client 的连接设置,并启动连接设置连接到 VPN Server 上。处于正在连接中或已连接状态的连接设置,将一直连接 VPN Server,或不断尝试连接 VPN Server,直到使用 AccountDisconnect 指令断开连接。(但是,如果使用 AccountRetrySet 指令指定了重试次数时,连接尝试将在达到被指定次数时中断。)</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountConnect [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountConnect" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要启动的连接设置名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.45 "AccountDisconnect": 断开连接中的连接设置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountDisconnect</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					断开连接中的连接设置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定注册到 VPN Client 的连接设置,其连接设置处于连接处理中或已连接的状态时,立即将其断开。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountDisconnect [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountDisconnect" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要断开的连接设置名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.46 "AccountStatusGet": 获取当前连接设置的状态</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountStatusGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取当前连接设置的状态</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定注册到 VPN Client 的连接设置,且该连接设置当前已连接时,获取其连接状态和和其他信息。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountStatusGet [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountStatusGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要获取信息的连接设置名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.47 "AccountNicSet": 设置连接设置时使用的虚拟 LAN 卡</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountNicSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置连接设置时使用的虚拟 LAN 卡</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					更改注册到 VPN 客户上的现有的连接设置用于连接 VPN Server 的虚拟 LAN 卡名。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountNicSet [name] [/NICNAME:nicname]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountNicSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要更改设置的连接设置名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/NICNAME</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定连接 VPN Server 时使用的虚拟 LAN 卡名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.48 "AccountStatusShow": 设置成在连接到 VPN Server 时显示连接状态和错误的画面</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountStatusShow</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置成在连接到 VPN Server 时显示连接状态和错误的画面</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定注册到 VPN Client 的连接设置且用其连接设置连接到 VPN Server 时,设置在计算机上显示连接状态和错误画面。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountStatusShow [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountStatusShow" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要更改设置的连接设置名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.49 "AccountStatusHide": 设置成在连接到 VPN Server 时不显示连接状态和错误的画面</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountStatusHide</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置成在连接到 VPN Server 时不显示连接状态和错误的画面</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定注册到 VPN Client 的连接设置且用其连接设置连接到 VPN Server 时,设置在计算机上不显示连接状态和错误画面。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountStatusHide [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountStatusHide" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要更改设置的连接设置名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.50 "AccountSecureCertSet": 将连接设置的用户认证类型设置为智能卡认证</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountSecureCertSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					将连接设置的用户认证类型设置为智能卡认证</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定注册到 VPN Client 的连设置,将其连接设置连接到 VPN Server 时的用户认证方法设置为 [智能卡认证]。此外,必须指定存储在智能卡上的证书对象名和密钥对象名。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountSecureCertSet [name] [/CERTNAME:cert] [/KEYNAME:key]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountSecureCertSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要更改设置的连接设置名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/CERTNAME</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定存储在智能卡中的证书对象名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/KEYNAME</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定存储在智能卡中的密钥对象名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.51 "AccountRetrySet": 设置连接设置的连接失败或断开时建立重新连接的次数和间隔</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountRetrySet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置连接设置的连接失败或断开时建立重新连接的次数和间隔</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定注册到 VPN Client 的连接设置,且其连接设置试图连接到 VPN Server 时,还有连接中的与 VPN Server 的通信被断开或连接失败时,指定连接的重试次数和连接重试的间隔。<BR>而且,如果用户认证类型为 [智能卡认证] 时,不管连接重试次数如何设置,都将不进行连接重试。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountRetrySet [name] [/NUM:num_retry] [/INTERVAL:retry_interval]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountRetrySet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要更改设置的连接设置名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/NUM</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定连续进行重新连接的次数。 如指定 "999",重试次数为无限次 (永久连接)。如指定 "0",不进行重新连接。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/INTERVAL</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					重新进行连接时,设置距离上次断开或连接失败后需多少秒开始重新连接处理。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.52 "AccountStartupSet": 设定连接设置的启动连接</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountStartupSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设定连接设置的启动连接</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定注册到 VPN Client 的连接设置,并将其设定为启动连接。设置为启动连接的连接设置,在 VPN Client 服务运行的同时将自动启动连接程序。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountStartupSet [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountStartupSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要更改设置的连接设置名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.53 "AccountStartupRemove": 解除连接设置的启动连接</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountStartupRemove</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					解除连接设置的启动连接</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定注册到 VPN Client 的连接设置,并把其连接设置设置为当前启动连接时,解除启动连接设置。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountStartupRemove [name]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountStartupRemove" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定要更改设置的连接设置名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.54 "AccountExport": 导出连接设置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountExport</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					导出连接设置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定注册到 VPN Client 的连接设置,将其连接设置的内容作为文本文件导出。因为而后要导入被导出的连接设置,可以复制连接设置的内容。而且,因为以文本文件保存,可以用一般的文本编辑器进行编辑。<BR>导出目标文件,以 UTF-8 格式的文本文件保存。还有,如果在文件名称上添加 .vpn 的扩展名,因为能与 Windows 版 VPN Client 连接员产生关联,会很方便。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountExport [name] [/SAVEPATH:savepath]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountExport" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>name</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定导出连接设置的连接设置名。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SAVEPATH</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定保存目标文件名</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.55 "AccountImport": 导入连接设置</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">AccountImport</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					导入连接设置</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					导入由 AccountExport 指令导出的连接设置文件,添加到 VPN 客户。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>AccountImport [path]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"AccountImport" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>path</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定导入源文件名。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.56 "RemoteEnable": 允许 VPN 客户服务的远程管理</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">RemoteEnable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					允许 VPN 客户服务的远程管理</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					对 VPN Client 服务,从本地主机以外的远程计算机上,允许通过命令行管理设施或 VPN Client 管理器员进行连接和管理。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>RemoteEnable</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"RemoteEnable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.57 "RemoteDisable": 禁止 VPN 客户服务的远程管理</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">RemoteDisable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					禁止 VPN 客户服务的远程管理</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					对 VPN Client 服务,从本地主机以外的远程计算机上,禁止通过命令行管理设施或 VPN Client 管理器员进行连接和管理。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>RemoteDisable</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"RemoteDisable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.58 "KeepEnable": 启动 Internet 保持连接功能</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">KeepEnable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					启动 Internet 保持连接功能</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					启动 [互联网保持连接功能]。启动此功能后,如果一段时间没有通信数据,导致连接将被断开时,会自动发送数据包到任何服务器,互联网服务器一定的间隔,从而可以保持连接。<BR>目标主机名等,可以通过 KeepSet 指令来设置。<BR>VPN Server 或 VPN Bridge 运行此命令时,您必须具有管理员的权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>KeepEnable</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"KeepEnable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.59 "KeepDisable": 禁用保持互联网连接功能</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">KeepDisable</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					禁用保持互联网连接功能</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					解除 [保持互联网连接功能]。<BR>VPN Server 或 VPN Bridge 运行此命令,您必须具有管理员权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>KeepDisable</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"KeepDisable" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.60 "KeepSet": 设置 Internet 保持连接功能</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">KeepSet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置 Internet 保持连接功能</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设置 [保持互联网连接功能] 的目标主机名。 如果一段时间没有任何通信数据,连接将被断开时,使用 [保持互联网连接功能 ] 可以,设定时间向 Internet 上的任何服务器发送数据包,从而可以保持您的 Internet 连接。<BR>在此功能中,可以设置目标 [主机名],[端口号],[数据包发送时间间隔],以及 [协议]。<BR>发送的数据包为随机内容,不会讲计算机和个人的识别信息发送。<BR>保持 Internet 连接功能,可以通过 KeepEnable 命令,或使用命令 KeepDisable,实现启用 / 禁用。不可以用 KeepSet 来改变启用 / 禁用的状态。 <BR>VPN Server 或 VPN Bridge 运行此命令,您必须具有管理员权限。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>KeepSet [/HOST:host:port] [/PROTOCOL:tcp|udp] [/INTERVAL:interval]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"KeepSet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/HOST</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					用 [主机:端口] 的格式,来设定目标主机名或 IP 地址和端口号。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/PROTOCOL</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					设定 tcp 或 udp。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/INTERVAL</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					以秒为单位设定发送数据包之间的间隔时间。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.61 "KeepGet": 获取保持互联网连接的功能</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">KeepGet</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取保持互联网连接的功能</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					获取 [保持互联网连接功能] 的当前设置。可以得到 [主机名],[端口],[数据包发送时间间隔],和 [协议],还包括当前 [保持互联网连接功能] 是否启用的当前状态。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>KeepGet</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"KeepGet" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.62 "MakeCert": 创建新的 X.509 证书和密钥</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">MakeCert</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					创建新的 X.509 证书和密钥</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					创建新的 X.509 证书和密钥,将其保存为一个文件。<BR>证书公共密钥和秘密密钥的生成算法使用 RSA 1024 位。<BR>作为证书类型,可以创建由根证书 (自签名证书) 和其他证书签名的某个证书。要创建由其他证书签名的证书,需要与用于签名的证书 (X.509格式文件) 相对应的密钥文件 (Base 64 编码)。<BR><BR>创建的证书可以指定名称 (CN),所属机构 (O),组织单位 (OU),国家 (C),州 (ST),当地 (L),序列号,有效期限。<BR>创建的证书以 X.509 格式的文件,密钥文件以 RSA 1024 位的 Base 64 编码文件,被分别保存。<BR><BR>MakeCert 指令是一个工具,它提供创建证书所需的最低功能。如果想创建一个真正的证书,建议使用 OpenSSL 等免费软件和出售的 CA (认证机构) 软件。<BR><BR>※注意: 此指令可以从 PacketiX VPN 命令行管理工具调用。虽然目前以管理模式连接到 VPN Server 和 VPN Client 时可以运行,但要实际运行 RSA 演算,生成证书数据的,是运行此指令的计算机,和以管理模式连接的链接目标计算机没有任何关系。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>MakeCert [/CN:cn] [/O:o] [/OU:ou] [/C:c] [/ST:st] [/L:l] [/SERIAL:serial] [/EXPIRES:expires] [/SIGNCERT:signcert] [/SIGNKEY:signkey] [/SAVECERT:savecert] [/SAVEKEY:savekey]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"MakeCert" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/CN</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定创建证书的名称 (CN) 项目。还可以指定 none。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/O</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定创建证书的所属机构 (O) 项目。还可以指定 none。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/OU</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定创建证书的组织单位 (OU) 项目。还可以指定 none。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/C</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定创建证书的国家 (C) 项目。还可以指定 none。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/ST</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定创建证书的州 (ST) 项目。还可以指定 none。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/L</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定创建证书的当地 (L) 项目。还可以指定 none。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SERIAL</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定创建证书的序列号项目。以 16 进制指定。还可以指定 none。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/EXPIRES</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定创建证书的有效期限。如果指定 none 或 0,将被使用 3650 天 (约 10 年)。最大可以指定 10950 天 (约 30 年)。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SIGNCERT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					根据现有的证书对要创建的证书签名时,指定用来签名的 X.509 形式的证书文件名。如果省略参数,将作为根证书而创建没有签名的新证书。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SIGNKEY</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定与 /SIGNCERT 指定的证书相应的密钥 (RSA,Base 64 的编码)</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SAVECERT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定文件名以保存创建的证书。该证书以包含 RSA 形式的 1024 位公开密钥的 X.509 文件格式被保存。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SAVEKEY</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定文件名保存对应创建的证书的密钥。该密钥以 RSA 形式的 1024 位密钥文件被保存。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.63 "TrafficClient": 在用户模式下,运行网络流量速度测试工具</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">TrafficClient</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在用户模式下,运行网络流量速度测试工具</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					运行通信吞吐量测量工具的客户端程序。<BR>通信吞吐量测量工具,作为 TrafficClient 和 TrafficServer 两个指令使用,可以测量在 IP 网络上连接的 2 台计算机之间可传送的通信吞吐量。在另一台计算机上使用 TrafficServer 指令使通信吞吐量测量工具服务器处于待机状态,用 TrafficClient 指令指定并连接其服务器的主机名或 IP 地址和端口号,测量通信速度。<BR>同时建立多个连接,计算各连接最大限度传送流数据的结果,及在指定时间内能够实际传送的数据的比特数,以此为依据计算通信吞吐量的平均值 (bps),用此方法进行通信速度的测量。通常,用一个 TCP 连接时,由于 TCP 算法的限制,大多数时候只能用比实际的网络吞吐量慢的速度通信。因此,建议测量同时建立多个 TCP 连接进行通信的结果。用此方法测量的吞吐量,以实际上作为 TCP 流到达接收方的数据的比特长度来计算,因此途中产生的数据包丢失和数据包损坏不包括在实际到达的数据包中,因而能够计算出纯粹的网络最大通信带宽的近似值。<BR>用作为测量结构的,在 TCP 内被传输的 TCP 流的大小,来计算在网络上实际传输的数据量的近似值,将其除以时间,计算出比特每秒 (bps)。假定计算的物理网络类型为以太网 (IEEE802.3) ,MAC 帧有效载荷的大小是 1,500 比特 (TCP 的 MSS 是 1,460 比特)。如果指定 /RAW 选项,不会对 TCP/IP 头和 MAC 头的数据量进行更正计算。<BR><BR>※注意: 此指令可以从 PacketiX VPN 命令行管理工具调用。虽然目前以管理模式连接到 VPN Server 和 VPN Client 时可以运行,但要实际进行通信,测量吞吐量的,是运行此指令的计算机,与以管理模式连接的连接目标计算机没有任何关系。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>TrafficClient [host:port] [/NUMTCP:numtcp] [/TYPE:download|upload|full] [/SPAN:span] [/DOUBLE:yes|no] [/RAW:yes|no]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"TrafficClient" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>host:port</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定通信吞吐量测量服务器 (TrafficServer) 待机时的主机名,或 IP 地址和端口号。如果省略端口号,9821 将被使用。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/NUMTCP</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定同时在客户端和服务器进行数据传输的 TCP 连接数量。如果省略,32 将被使用。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/TYPE</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定进行吞吐量测量时的数据传输流方向。指定下列选项之一: "download","upload" 或 "full"。指定 "download",则数据从服务器端向客户端传送。指定 "upload",则数据从客户端向服务器端传送。指定 "full",数据将双向传送。当指定 "full" 时,NUMTCP 的值必须指定是 2 以上的偶数 (同时被连接的 TCP 连接中一半用于下载的方向,而另一半用于上传的方向)。如果省略此参数,将使用 "full"。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SPAN</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					以秒为单位指定为测量吞吐量而进行数据传输时间。如果省略此参数,"15秒" 将被使用。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/DOUBLE</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定 "yes" 时,测量结果的吞吐量将显示为 2 倍。在中途有网络设备等,测量其其网络设备的输入输出合计的吞吐量能力时,此选项被使用。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/RAW</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					通过指定 "yes",不进行修正 TCP/IP 头和 MAC 头的数据量计算。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.64 "TrafficServer": 在服务器模式下,运行网络流量速度测试工具</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">TrafficServer</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在服务器模式下,运行网络流量速度测试工具</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					运行通信吞吐量测量工具的服务器程序。<BR>通信吞吐量测量工具,作为 TrafficClient 和 TrafficServer 两个指令使用,可以测量在 IP 网络上连接的 2 台计算机之间可传送的通信吞吐量。<BR>要使此计算机上的 TCP 端口处于待机状态,等待从另一台计算机的 TrafficClient 连接,启动 TrafficServer 指令并指定端口号。<BR>关于通信吞吐量测量工具的详细情况,输入 TrafficClient /? 将显示。<BR><BR>※注意: 此指令可以从 PacketiX VPN 命令行管理工具调用。虽然目前以管理模式连接 VPN Server 和 VPN Client 时可以运行,但要进行实际通信并测量吞吐量的,是运行此指令的计算机,与用管理模式连接终端的计算机没有任何关系。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>TrafficServer [port]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"TrafficServer" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>port</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					以整数指定等待连接的端口号。被指定的端口,如果已经由另一个程序在使用,或不能打开该端口时,将发生错误。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.5.65 "Check": 检测 PacketiX VPN 是否能正常运行</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">Check</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					检测 PacketiX VPN 是否能正常运行</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					正在运行 vpncmd 的计算机上,正检测 PacketiX VPN Server / Bridge 的运行平台是否适合。<BR>通过了这一检查的系统,PacketiX VPN 软件有较高的可能性进行正常运行。此外,无法通过此检查的系统,如果使用了 PacketiX VPN 软件可能会发生一些问题。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>Check</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"Check" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+
+
+
+
+
+
+
+
+
+
+------ 4 ------
+
+
+
+
+
+
+
+
+
+		<h3>6.6.1 "About": 显示版本信息</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">About</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					显示版本信息</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					这显示了此命令行管理工具的版本信息。版本信息中包括了 vpncmd 版本号,内部标号和内部标号信息。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>About</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"About" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.6.2 "MakeCert": 创建新的 X.509 证书和密钥</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">MakeCert</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					创建新的 X.509 证书和密钥</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					创建新的 X.509 证书和密钥,将其保存为一个文件。<BR>证书公共密钥和秘密密钥的生成算法使用 RSA 1024 位。<BR>作为证书类型,可以创建由根证书 (自签名证书) 和其他证书签名的某个证书。要创建由其他证书签名的证书,需要与用于签名的证书 (X.509格式文件) 相对应的密钥文件 (Base 64 编码)。<BR><BR>创建的证书可以指定名称 (CN),所属机构 (O),组织单位 (OU),国家 (C),州 (ST),当地 (L),序列号,有效期限。<BR>创建的证书以 X.509 格式的文件,密钥文件以 RSA 1024 位的 Base 64 编码文件,被分别保存。<BR><BR>MakeCert 指令是一个工具,它提供创建证书所需的最低功能。如果想创建一个真正的证书,建议使用 OpenSSL 等免费软件和出售的 CA (认证机构) 软件。<BR><BR>※注意: 此指令可以从 PacketiX VPN 命令行管理工具调用。虽然目前以管理模式连接到 VPN Server 和 VPN Client 时可以运行,但要实际运行 RSA 演算,生成证书数据的,是运行此指令的计算机,和以管理模式连接的链接目标计算机没有任何关系。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>MakeCert [/CN:cn] [/O:o] [/OU:ou] [/C:c] [/ST:st] [/L:l] [/SERIAL:serial] [/EXPIRES:expires] [/SIGNCERT:signcert] [/SIGNKEY:signkey] [/SAVECERT:savecert] [/SAVEKEY:savekey]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"MakeCert" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/CN</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定创建证书的名称 (CN) 项目。还可以指定 none。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/O</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定创建证书的所属机构 (O) 项目。还可以指定 none。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/OU</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定创建证书的组织单位 (OU) 项目。还可以指定 none。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/C</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定创建证书的国家 (C) 项目。还可以指定 none。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/ST</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定创建证书的州 (ST) 项目。还可以指定 none。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/L</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定创建证书的当地 (L) 项目。还可以指定 none。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SERIAL</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定创建证书的序列号项目。以 16 进制指定。还可以指定 none。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/EXPIRES</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定创建证书的有效期限。如果指定 none 或 0,将被使用 3650 天 (约 10 年)。最大可以指定 10950 天 (约 30 年)。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SIGNCERT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					根据现有的证书对要创建的证书签名时,指定用来签名的 X.509 形式的证书文件名。如果省略参数,将作为根证书而创建没有签名的新证书。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SIGNKEY</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定与 /SIGNCERT 指定的证书相应的密钥 (RSA,Base 64 的编码)</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SAVECERT</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定文件名以保存创建的证书。该证书以包含 RSA 形式的 1024 位公开密钥的 X.509 文件格式被保存。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SAVEKEY</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定文件名保存对应创建的证书的密钥。该密钥以 RSA 形式的 1024 位密钥文件被保存。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.6.3 "TrafficClient": 在用户模式下,运行网络流量速度测试工具</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">TrafficClient</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在用户模式下,运行网络流量速度测试工具</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					运行通信吞吐量测量工具的客户端程序。<BR>通信吞吐量测量工具,作为 TrafficClient 和 TrafficServer 两个指令使用,可以测量在 IP 网络上连接的 2 台计算机之间可传送的通信吞吐量。在另一台计算机上使用 TrafficServer 指令使通信吞吐量测量工具服务器处于待机状态,用 TrafficClient 指令指定并连接其服务器的主机名或 IP 地址和端口号,测量通信速度。<BR>同时建立多个连接,计算各连接最大限度传送流数据的结果,及在指定时间内能够实际传送的数据的比特数,以此为依据计算通信吞吐量的平均值 (bps),用此方法进行通信速度的测量。通常,用一个 TCP 连接时,由于 TCP 算法的限制,大多数时候只能用比实际的网络吞吐量慢的速度通信。因此,建议测量同时建立多个 TCP 连接进行通信的结果。用此方法测量的吞吐量,以实际上作为 TCP 流到达接收方的数据的比特长度来计算,因此途中产生的数据包丢失和数据包损坏不包括在实际到达的数据包中,因而能够计算出纯粹的网络最大通信带宽的近似值。<BR>用作为测量结构的,在 TCP 内被传输的 TCP 流的大小,来计算在网络上实际传输的数据量的近似值,将其除以时间,计算出比特每秒 (bps)。假定计算的物理网络类型为以太网 (IEEE802.3) ,MAC 帧有效载荷的大小是 1,500 比特 (TCP 的 MSS 是 1,460 比特)。如果指定 /RAW 选项,不会对 TCP/IP 头和 MAC 头的数据量进行更正计算。<BR><BR>※注意: 此指令可以从 PacketiX VPN 命令行管理工具调用。虽然目前以管理模式连接到 VPN Server 和 VPN Client 时可以运行,但要实际进行通信,测量吞吐量的,是运行此指令的计算机,与以管理模式连接的连接目标计算机没有任何关系。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>TrafficClient [host:port] [/NUMTCP:numtcp] [/TYPE:download|upload|full] [/SPAN:span] [/DOUBLE:yes|no] [/RAW:yes|no]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"TrafficClient" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>host:port</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定通信吞吐量测量服务器 (TrafficServer) 待机时的主机名,或 IP 地址和端口号。如果省略端口号,9821 将被使用。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/NUMTCP</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定同时在客户端和服务器进行数据传输的 TCP 连接数量。如果省略,32 将被使用。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/TYPE</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定进行吞吐量测量时的数据传输流方向。指定下列选项之一: "download","upload" 或 "full"。指定 "download",则数据从服务器端向客户端传送。指定 "upload",则数据从客户端向服务器端传送。指定 "full",数据将双向传送。当指定 "full" 时,NUMTCP 的值必须指定是 2 以上的偶数 (同时被连接的 TCP 连接中一半用于下载的方向,而另一半用于上传的方向)。如果省略此参数,将使用 "full"。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/SPAN</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					以秒为单位指定为测量吞吐量而进行数据传输时间。如果省略此参数,"15秒" 将被使用。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/DOUBLE</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					指定 "yes" 时,测量结果的吞吐量将显示为 2 倍。在中途有网络设备等,测量其其网络设备的输入输出合计的吞吐量能力时,此选项被使用。</td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>/RAW</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					通过指定 "yes",不进行修正 TCP/IP 头和 MAC 头的数据量计算。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.6.4 "TrafficServer": 在服务器模式下,运行网络流量速度测试工具</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">TrafficServer</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					在服务器模式下,运行网络流量速度测试工具</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					运行通信吞吐量测量工具的服务器程序。<BR>通信吞吐量测量工具,作为 TrafficClient 和 TrafficServer 两个指令使用,可以测量在 IP 网络上连接的 2 台计算机之间可传送的通信吞吐量。<BR>要使此计算机上的 TCP 端口处于待机状态,等待从另一台计算机的 TrafficClient 连接,启动 TrafficServer 指令并指定端口号。<BR>关于通信吞吐量测量工具的详细情况,输入 TrafficClient /? 将显示。<BR><BR>※注意: 此指令可以从 PacketiX VPN 命令行管理工具调用。虽然目前以管理模式连接 VPN Server 和 VPN Client 时可以运行,但要进行实际通信并测量吞吐量的,是运行此指令的计算机,与用管理模式连接终端的计算机没有任何关系。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>TrafficServer [port]</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"TrafficServer" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="125"><i>port</i></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					以整数指定等待连接的端口号。被指定的端口,如果已经由另一个程序在使用,或不能打开该端口时,将发生错误。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>
+		<h3>6.6.5 "Check": 检测 PacketiX VPN 是否能正常运行</h3>
+			<table border="1" cellspacing="0" width="100%" id="table1">
+				<tr>
+					<td class="tableStandard" width="125"><b>命令名</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<b><font size="3">Check</font></b></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令的概要</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					检测 PacketiX VPN 是否能正常运行</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>说明</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					正在运行 vpncmd 的计算机上,正检测 PacketiX VPN Server / Bridge 的运行平台是否适合。<BR>通过了这一检查的系统,PacketiX VPN 软件有较高的可能性进行正常运行。此外,无法通过此检查的系统,如果使用了 PacketiX VPN 软件可能会发生一些问题。</td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="125"><b>命令行格式</b></td>
+					<td class="tableStandard" width="453" style="background-color: #FFFFFF">
+					<i>Check</i></td>
+					</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2"><b>					"Check" 命令中可以指定的参数引数的一览:</b></td>
+				</tr>
+				<tr>
+					<td class="tableStandard" width="547" colspan="2" style="background-color: #FFFFFF">这个命令中没有任何应该指定的参数。</td>
+				</tr>
+				</table>
+		<p>&nbsp;</p>

文件差异内容过多而无法显示
+ 1636 - 0
src/Ham/generated_manual_ja.html


+ 1058 - 5
src/Mayaqua/Encrypt.c

@@ -142,6 +142,8 @@
 
 LOCK *openssl_lock = NULL;
 
+int ssl_clientcert_index = 0;
+
 LOCK **ssl_lock_obj = NULL;
 UINT ssl_lock_num;
 static bool openssl_inited = false;
@@ -2456,7 +2458,6 @@ bool RsaVerifyEx(void *data, UINT data_size, void *sign, K *k, UINT bits)
 	UCHAR hash_data[SIGN_HASH_SIZE];
 	UCHAR *decrypt_data;
 	RSA *rsa;
-	UINT rsa_size;
 	// Validate arguments
 	if (data == NULL || sign == NULL || k == NULL || k->private_key != false)
 	{
@@ -2473,16 +2474,15 @@ bool RsaVerifyEx(void *data, UINT data_size, void *sign, K *k, UINT bits)
 		return false;
 	}
 
+	decrypt_data = ZeroMalloc(RSA_size(rsa));
+
 	// Hash the data
 	if (HashForSign(hash_data, sizeof(hash_data), data, data_size) == false)
 	{
+		Free(decrypt_data);
 		return false;
 	}
 
-	rsa_size = RSA_size(rsa);
-	rsa_size = MAX(rsa_size, 1024); // For just in case
-	decrypt_data = ZeroMalloc(rsa_size);
-
 	// Decode the signature
 	if (RSA_public_decrypt(bits / 8, sign, decrypt_data, rsa, RSA_PKCS1_PADDING) <= 0)
 	{
@@ -4137,6 +4137,8 @@ void InitCryptLibrary()
 	ERR_load_crypto_strings();
 	SSL_load_error_strings();
 
+	ssl_clientcert_index = SSL_get_ex_new_index(0, "struct SslClientCertInfo *", NULL, NULL, NULL);
+
 #ifdef	OS_UNIX
 	{
 		char *name1 = "/dev/random";
@@ -5171,5 +5173,1056 @@ static unsigned char *Internal_SHA0(const unsigned char *d, size_t n, unsigned c
 }
 
 
+int GetSslClientCertIndex()
+{
+	return ssl_clientcert_index;
+}
+
+
+
+//// RFC 8439: ChaCha20 and Poly1305 for IETF Protocols
+//// Implementation from libsodium: https://github.com/jedisct1/libsodium
+//// 
+//// SoftEther VPN must support OpenSSL versions between 1.0.2 to the latest version.
+//// Since we are unable to use ChaCha20 and Poly1305 on OpenSSL 1.0.x,
+//// we copied the C implementation from libsodium.
+//// Please note that the C implementation for ChaCha20 and Poly1305 is slow than
+//// the OpenSSL 1.0.0 or later's implementation for ChaCha20 and Poly1305.
+//// 
+//// If OpenSSL 1.1.0 or later is linked, we use OpenSSL's ChaCha20 and Poly1305 implementation.
+
+/*
+ * ISC License
+ *
+ * Copyright (c) 2013-2018
+ * Frank Denis <j at pureftpd dot org>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef	OS_WIN32
+#define inline __inline
+#endif
+
+#define poly1305_block_size 16
+
+#define U32C(v) (v##U)
+#define U32V(v) ((UINT)(v) &U32C(0xFFFFFFFF))
+#define ROTATE(v, c) (ROTL32(v, c))
+#define XOR(v, w) ((v) ^ (w))
+#define PLUS(v, w) (U32V((v) + (w)))
+#define PLUSONE(v) (PLUS((v), 1))
+
+#define QUARTERROUND(a, b, c, d) \
+	a = PLUS(a, b);              \
+	d = ROTATE(XOR(d, a), 16);   \
+	c = PLUS(c, d);              \
+	b = ROTATE(XOR(b, c), 12);   \
+	a = PLUS(a, b);              \
+	d = ROTATE(XOR(d, a), 8);    \
+	c = PLUS(c, d);              \
+	b = ROTATE(XOR(b, c), 7);
+
+#define ROTL32(X, B) rotl32((X), (B))
+static inline UINT
+rotl32(const UINT x, const int b)
+{
+	return (x << b) | (x >> (32 - b));
+}
+
+
+#define LOAD32_LE(SRC) load32_le(SRC)
+
+static inline UINT
+load32_le(const UCHAR src[4])
+{
+	if (IsBigEndian() == false)
+	{
+		UINT w;
+		memcpy(&w, src, sizeof w);
+		return w;
+	}
+	else
+	{
+		UINT w = (UINT) src[0];
+		w |= (UINT) src[1] <<  8;
+		w |= (UINT) src[2] << 16;
+		w |= (UINT) src[3] << 24;
+		return w;
+	}
+}
+
+#define STORE32_LE(DST, W) store32_le((DST), (W))
+static inline void
+store32_le(UCHAR dst[4], UINT w)
+{
+	if (IsBigEndian() == false)
+	{
+		memcpy(dst, &w, sizeof w);
+	}
+	else
+	{
+		dst[0] = (UCHAR) w; w >>= 8;
+		dst[1] = (UCHAR) w; w >>= 8;
+		dst[2] = (UCHAR) w; w >>= 8;
+		dst[3] = (UCHAR) w;
+	}
+}
+
+
+#define LOAD64_LE(SRC) load64_le(SRC)
+static inline UINT64
+load64_le(const UCHAR src[8])
+{
+	if (IsBigEndian() == false)
+	{
+		UINT64 w;
+		memcpy(&w, src, sizeof w);
+		return w;
+	}
+	else
+	{
+		UINT64 w = (UINT64) src[0];
+		w |= (UINT64) src[1] <<  8;
+		w |= (UINT64) src[2] << 16;
+		w |= (UINT64) src[3] << 24;
+		w |= (UINT64) src[4] << 32;
+		w |= (UINT64) src[5] << 40;
+		w |= (UINT64) src[6] << 48;
+		w |= (UINT64) src[7] << 56;
+		return w;
+	}
+}
+
+#define STORE64_LE(DST, W) store64_le((DST), (W))
+static inline void
+store64_le(UCHAR dst[8], UINT64 w)
+{
+	if (IsBigEndian() == false)
+	{
+		memcpy(dst, &w, sizeof w);
+	}
+	else
+	{
+		dst[0] = (UCHAR) w; w >>= 8;
+		dst[1] = (UCHAR) w; w >>= 8;
+		dst[2] = (UCHAR) w; w >>= 8;
+		dst[3] = (UCHAR) w; w >>= 8;
+		dst[4] = (UCHAR) w; w >>= 8;
+		dst[5] = (UCHAR) w; w >>= 8;
+		dst[6] = (UCHAR) w; w >>= 8;
+		dst[7] = (UCHAR) w;
+	}
+}
+
+
+
+typedef struct chacha_ctx {
+	UINT input[16];
+} chacha_ctx;
+
+
+
+
+#define crypto_stream_chacha20_ietf_MESSAGEBYTES_MAX \
+	(64ULL * (1ULL << 32))
+
+typedef struct crypto_onetimeauth_poly1305_state {
+	unsigned char opaque[256];
+} crypto_onetimeauth_poly1305_state;
+
+/* 17 + sizeof(unsigned long long) + 14*sizeof(unsigned long) */
+typedef struct poly1305_state_internal_t {
+	unsigned long      r[5];
+	unsigned long      h[5];
+	unsigned long      pad[4];
+	unsigned long long leftover;
+	unsigned char      buffer[poly1305_block_size];
+	unsigned char      final;
+} poly1305_state_internal_t;
+static void
+chacha_keysetup(chacha_ctx *ctx, const UCHAR *k)
+{
+	ctx->input[0]  = U32C(0x61707865);
+	ctx->input[1]  = U32C(0x3320646e);
+	ctx->input[2]  = U32C(0x79622d32);
+	ctx->input[3]  = U32C(0x6b206574);
+	ctx->input[4]  = LOAD32_LE(k + 0);
+	ctx->input[5]  = LOAD32_LE(k + 4);
+	ctx->input[6]  = LOAD32_LE(k + 8);
+	ctx->input[7]  = LOAD32_LE(k + 12);
+	ctx->input[8]  = LOAD32_LE(k + 16);
+	ctx->input[9]  = LOAD32_LE(k + 20);
+	ctx->input[10] = LOAD32_LE(k + 24);
+	ctx->input[11] = LOAD32_LE(k + 28);
+}
+
+static void
+chacha_ietf_ivsetup(chacha_ctx *ctx, const UCHAR *iv, const UCHAR *counter)
+{
+	ctx->input[12] = counter == NULL ? 0 : LOAD32_LE(counter);
+	ctx->input[13] = LOAD32_LE(iv + 0);
+	ctx->input[14] = LOAD32_LE(iv + 4);
+	ctx->input[15] = LOAD32_LE(iv + 8);
+}
+
+static void
+chacha20_encrypt_bytes(chacha_ctx *ctx, const UCHAR *m, UCHAR *c,
+					   unsigned long long bytes)
+{
+	UINT x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14,
+		x15;
+	UINT j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14,
+		j15;
+	UCHAR     *ctarget = NULL;
+	UCHAR      tmp[64];
+	unsigned int i;
+
+	if (!bytes) {
+		return; /* LCOV_EXCL_LINE */
+	}
+	j0  = ctx->input[0];
+	j1  = ctx->input[1];
+	j2  = ctx->input[2];
+	j3  = ctx->input[3];
+	j4  = ctx->input[4];
+	j5  = ctx->input[5];
+	j6  = ctx->input[6];
+	j7  = ctx->input[7];
+	j8  = ctx->input[8];
+	j9  = ctx->input[9];
+	j10 = ctx->input[10];
+	j11 = ctx->input[11];
+	j12 = ctx->input[12];
+	j13 = ctx->input[13];
+	j14 = ctx->input[14];
+	j15 = ctx->input[15];
+
+	for (;;) {
+		if (bytes < 64) {
+			memset(tmp, 0, 64);
+			for (i = 0; i < bytes; ++i) {
+				tmp[i] = m[i];
+			}
+			m       = tmp;
+			ctarget = c;
+			c       = tmp;
+		}
+		x0  = j0;
+		x1  = j1;
+		x2  = j2;
+		x3  = j3;
+		x4  = j4;
+		x5  = j5;
+		x6  = j6;
+		x7  = j7;
+		x8  = j8;
+		x9  = j9;
+		x10 = j10;
+		x11 = j11;
+		x12 = j12;
+		x13 = j13;
+		x14 = j14;
+		x15 = j15;
+		for (i = 20; i > 0; i -= 2) {
+			QUARTERROUND(x0, x4, x8, x12)
+				QUARTERROUND(x1, x5, x9, x13)
+				QUARTERROUND(x2, x6, x10, x14)
+				QUARTERROUND(x3, x7, x11, x15)
+				QUARTERROUND(x0, x5, x10, x15)
+				QUARTERROUND(x1, x6, x11, x12)
+				QUARTERROUND(x2, x7, x8, x13)
+				QUARTERROUND(x3, x4, x9, x14)
+		}
+		x0  = PLUS(x0, j0);
+		x1  = PLUS(x1, j1);
+		x2  = PLUS(x2, j2);
+		x3  = PLUS(x3, j3);
+		x4  = PLUS(x4, j4);
+		x5  = PLUS(x5, j5);
+		x6  = PLUS(x6, j6);
+		x7  = PLUS(x7, j7);
+		x8  = PLUS(x8, j8);
+		x9  = PLUS(x9, j9);
+		x10 = PLUS(x10, j10);
+		x11 = PLUS(x11, j11);
+		x12 = PLUS(x12, j12);
+		x13 = PLUS(x13, j13);
+		x14 = PLUS(x14, j14);
+		x15 = PLUS(x15, j15);
+
+		x0  = XOR(x0, LOAD32_LE(m + 0));
+		x1  = XOR(x1, LOAD32_LE(m + 4));
+		x2  = XOR(x2, LOAD32_LE(m + 8));
+		x3  = XOR(x3, LOAD32_LE(m + 12));
+		x4  = XOR(x4, LOAD32_LE(m + 16));
+		x5  = XOR(x5, LOAD32_LE(m + 20));
+		x6  = XOR(x6, LOAD32_LE(m + 24));
+		x7  = XOR(x7, LOAD32_LE(m + 28));
+		x8  = XOR(x8, LOAD32_LE(m + 32));
+		x9  = XOR(x9, LOAD32_LE(m + 36));
+		x10 = XOR(x10, LOAD32_LE(m + 40));
+		x11 = XOR(x11, LOAD32_LE(m + 44));
+		x12 = XOR(x12, LOAD32_LE(m + 48));
+		x13 = XOR(x13, LOAD32_LE(m + 52));
+		x14 = XOR(x14, LOAD32_LE(m + 56));
+		x15 = XOR(x15, LOAD32_LE(m + 60));
+
+		j12 = PLUSONE(j12);
+		/* LCOV_EXCL_START */
+		if (!j12) {
+			j13 = PLUSONE(j13);
+		}
+		/* LCOV_EXCL_STOP */
+
+		STORE32_LE(c + 0, x0);
+		STORE32_LE(c + 4, x1);
+		STORE32_LE(c + 8, x2);
+		STORE32_LE(c + 12, x3);
+		STORE32_LE(c + 16, x4);
+		STORE32_LE(c + 20, x5);
+		STORE32_LE(c + 24, x6);
+		STORE32_LE(c + 28, x7);
+		STORE32_LE(c + 32, x8);
+		STORE32_LE(c + 36, x9);
+		STORE32_LE(c + 40, x10);
+		STORE32_LE(c + 44, x11);
+		STORE32_LE(c + 48, x12);
+		STORE32_LE(c + 52, x13);
+		STORE32_LE(c + 56, x14);
+		STORE32_LE(c + 60, x15);
+
+		if (bytes <= 64) {
+			if (bytes < 64) {
+				for (i = 0; i < (unsigned int) bytes; ++i) {
+					ctarget[i] = c[i]; /* ctarget cannot be NULL */
+				}
+			}
+			ctx->input[12] = j12;
+			ctx->input[13] = j13;
+
+			return;
+		}
+		bytes -= 64;
+		c += 64;
+		m += 64;
+	}
+}
+
+static int
+stream_ietf_ext_ref(unsigned char *c, unsigned long long clen,
+					const unsigned char *n, const unsigned char *k)
+{
+	struct chacha_ctx ctx;
+
+	if (!clen) {
+		return 0;
+	}
+	chacha_keysetup(&ctx, k);
+	chacha_ietf_ivsetup(&ctx, n, NULL);
+	memset(c, 0, (UINT)clen);
+	chacha20_encrypt_bytes(&ctx, c, c, clen);
+	Zero(&ctx, sizeof ctx);
+
+	return 0;
+}
+
+int
+crypto_stream_chacha20_ietf(unsigned char *c, unsigned long long clen,
+							const unsigned char *n, const unsigned char *k)
+{
+	return stream_ietf_ext_ref(c, clen, n, k);
+}
+
+static void
+poly1305_init(poly1305_state_internal_t *st, const unsigned char key[32])
+{
+	/* r &= 0xffffffc0ffffffc0ffffffc0fffffff - wiped after finalization */
+	st->r[0] = (LOAD32_LE(&key[0])) & 0x3ffffff;
+	st->r[1] = (LOAD32_LE(&key[3]) >> 2) & 0x3ffff03;
+	st->r[2] = (LOAD32_LE(&key[6]) >> 4) & 0x3ffc0ff;
+	st->r[3] = (LOAD32_LE(&key[9]) >> 6) & 0x3f03fff;
+	st->r[4] = (LOAD32_LE(&key[12]) >> 8) & 0x00fffff;
+
+	/* h = 0 */
+	st->h[0] = 0;
+	st->h[1] = 0;
+	st->h[2] = 0;
+	st->h[3] = 0;
+	st->h[4] = 0;
+
+	/* save pad for later */
+	st->pad[0] = LOAD32_LE(&key[16]);
+	st->pad[1] = LOAD32_LE(&key[20]);
+	st->pad[2] = LOAD32_LE(&key[24]);
+	st->pad[3] = LOAD32_LE(&key[28]);
+
+	st->leftover = 0;
+	st->final    = 0;
+}
+
+static void
+poly1305_blocks(poly1305_state_internal_t *st, const unsigned char *m,
+				unsigned long long bytes)
+{
+	const unsigned long hibit = (st->final) ? 0UL : (1UL << 24); /* 1 << 128 */
+	unsigned long       r0, r1, r2, r3, r4;
+	unsigned long       s1, s2, s3, s4;
+	unsigned long       h0, h1, h2, h3, h4;
+	unsigned long long  d0, d1, d2, d3, d4;
+	unsigned long       c;
+
+	r0 = st->r[0];
+	r1 = st->r[1];
+	r2 = st->r[2];
+	r3 = st->r[3];
+	r4 = st->r[4];
+
+	s1 = r1 * 5;
+	s2 = r2 * 5;
+	s3 = r3 * 5;
+	s4 = r4 * 5;
+
+	h0 = st->h[0];
+	h1 = st->h[1];
+	h2 = st->h[2];
+	h3 = st->h[3];
+	h4 = st->h[4];
+
+	while (bytes >= poly1305_block_size) {
+		/* h += m[i] */
+		h0 += (LOAD32_LE(m + 0)) & 0x3ffffff;
+		h1 += (LOAD32_LE(m + 3) >> 2) & 0x3ffffff;
+		h2 += (LOAD32_LE(m + 6) >> 4) & 0x3ffffff;
+		h3 += (LOAD32_LE(m + 9) >> 6) & 0x3ffffff;
+		h4 += (LOAD32_LE(m + 12) >> 8) | hibit;
+
+		/* h *= r */
+		d0 = ((unsigned long long) h0 * r0) + ((unsigned long long) h1 * s4) +
+			((unsigned long long) h2 * s3) + ((unsigned long long) h3 * s2) +
+			((unsigned long long) h4 * s1);
+		d1 = ((unsigned long long) h0 * r1) + ((unsigned long long) h1 * r0) +
+			((unsigned long long) h2 * s4) + ((unsigned long long) h3 * s3) +
+			((unsigned long long) h4 * s2);
+		d2 = ((unsigned long long) h0 * r2) + ((unsigned long long) h1 * r1) +
+			((unsigned long long) h2 * r0) + ((unsigned long long) h3 * s4) +
+			((unsigned long long) h4 * s3);
+		d3 = ((unsigned long long) h0 * r3) + ((unsigned long long) h1 * r2) +
+			((unsigned long long) h2 * r1) + ((unsigned long long) h3 * r0) +
+			((unsigned long long) h4 * s4);
+		d4 = ((unsigned long long) h0 * r4) + ((unsigned long long) h1 * r3) +
+			((unsigned long long) h2 * r2) + ((unsigned long long) h3 * r1) +
+			((unsigned long long) h4 * r0);
+
+		/* (partial) h %= p */
+		c  = (unsigned long) (d0 >> 26);
+		h0 = (unsigned long) d0 & 0x3ffffff;
+		d1 += c;
+		c  = (unsigned long) (d1 >> 26);
+		h1 = (unsigned long) d1 & 0x3ffffff;
+		d2 += c;
+		c  = (unsigned long) (d2 >> 26);
+		h2 = (unsigned long) d2 & 0x3ffffff;
+		d3 += c;
+		c  = (unsigned long) (d3 >> 26);
+		h3 = (unsigned long) d3 & 0x3ffffff;
+		d4 += c;
+		c  = (unsigned long) (d4 >> 26);
+		h4 = (unsigned long) d4 & 0x3ffffff;
+		h0 += c * 5;
+		c  = (h0 >> 26);
+		h0 = h0 & 0x3ffffff;
+		h1 += c;
+
+		m += poly1305_block_size;
+		bytes -= poly1305_block_size;
+	}
+
+	st->h[0] = h0;
+	st->h[1] = h1;
+	st->h[2] = h2;
+	st->h[3] = h3;
+	st->h[4] = h4;
+}
+
+static void
+poly1305_update(poly1305_state_internal_t *st, const unsigned char *m,
+				unsigned long long bytes)
+{
+	unsigned long long i;
+
+	/* handle leftover */
+	if (st->leftover) {
+		unsigned long long want = (poly1305_block_size - st->leftover);
+
+		if (want > bytes) {
+			want = bytes;
+		}
+		for (i = 0; i < want; i++) {
+			st->buffer[st->leftover + i] = m[i];
+		}
+		bytes -= want;
+		m += want;
+		st->leftover += want;
+		if (st->leftover < poly1305_block_size) {
+			return;
+		}
+		poly1305_blocks(st, st->buffer, poly1305_block_size);
+		st->leftover = 0;
+	}
+
+	/* process full blocks */
+	if (bytes >= poly1305_block_size) {
+		unsigned long long want = (bytes & ~(poly1305_block_size - 1));
+
+		poly1305_blocks(st, m, want);
+		m += want;
+		bytes -= want;
+	}
+
+	/* store leftover */
+	if (bytes) {
+		for (i = 0; i < bytes; i++) {
+			st->buffer[st->leftover + i] = m[i];
+		}
+		st->leftover += bytes;
+	}
+}
+
+static int
+crypto_onetimeauth_poly1305_init(crypto_onetimeauth_poly1305_state *state,
+									   const unsigned char *key)
+{
+	poly1305_init((poly1305_state_internal_t *) (void *) state, key);
+
+	return 0;
+}
+
+static int
+crypto_onetimeauth_poly1305_update(
+	crypto_onetimeauth_poly1305_state *state, const unsigned char *in,
+	unsigned long long inlen)
+{
+	poly1305_update((poly1305_state_internal_t *) (void *) state, in, inlen);
+
+	return 0;
+}
+
+static int
+stream_ietf_ext_ref_xor_ic(unsigned char *c, const unsigned char *m,
+						   unsigned long long mlen, const unsigned char *n,
+						   UINT ic, const unsigned char *k)
+{
+	struct chacha_ctx ctx;
+	UCHAR           ic_bytes[4];
+
+	if (!mlen) {
+		return 0;
+	}
+	STORE32_LE(ic_bytes, ic);
+	chacha_keysetup(&ctx, k);
+	chacha_ietf_ivsetup(&ctx, n, ic_bytes);
+	chacha20_encrypt_bytes(&ctx, m, c, mlen);
+	Zero(&ctx, sizeof ctx);
+
+	return 0;
+}
+
+int
+crypto_stream_chacha20_ietf_xor_ic(unsigned char *c, const unsigned char *m,
+								   unsigned long long mlen,
+								   const unsigned char *n, UINT ic,
+								   const unsigned char *k)
+{
+	return stream_ietf_ext_ref_xor_ic(c, m, mlen, n, ic, k);
+}
+
+
+static void
+poly1305_finish(poly1305_state_internal_t *st, unsigned char mac[16])
+{
+	unsigned long      h0, h1, h2, h3, h4, c;
+	unsigned long      g0, g1, g2, g3, g4;
+	unsigned long long f;
+	unsigned long      mask;
+
+	/* process the remaining block */
+	if (st->leftover) {
+		unsigned long long i = st->leftover;
+
+		st->buffer[i++] = 1;
+		for (; i < poly1305_block_size; i++) {
+			st->buffer[i] = 0;
+		}
+		st->final = 1;
+		poly1305_blocks(st, st->buffer, poly1305_block_size);
+	}
+
+	/* fully carry h */
+	h0 = st->h[0];
+	h1 = st->h[1];
+	h2 = st->h[2];
+	h3 = st->h[3];
+	h4 = st->h[4];
+
+	c  = h1 >> 26;
+	h1 = h1 & 0x3ffffff;
+	h2 += c;
+	c  = h2 >> 26;
+	h2 = h2 & 0x3ffffff;
+	h3 += c;
+	c  = h3 >> 26;
+	h3 = h3 & 0x3ffffff;
+	h4 += c;
+	c  = h4 >> 26;
+	h4 = h4 & 0x3ffffff;
+	h0 += c * 5;
+	c  = h0 >> 26;
+	h0 = h0 & 0x3ffffff;
+	h1 += c;
+
+	/* compute h + -p */
+	g0 = h0 + 5;
+	c  = g0 >> 26;
+	g0 &= 0x3ffffff;
+	g1 = h1 + c;
+	c  = g1 >> 26;
+	g1 &= 0x3ffffff;
+	g2 = h2 + c;
+	c  = g2 >> 26;
+	g2 &= 0x3ffffff;
+	g3 = h3 + c;
+	c  = g3 >> 26;
+	g3 &= 0x3ffffff;
+	g4 = h4 + c - (1UL << 26);
+
+	/* select h if h < p, or h + -p if h >= p */
+	mask = (g4 >> ((sizeof(unsigned long) * 8) - 1)) - 1;
+	g0 &= mask;
+	g1 &= mask;
+	g2 &= mask;
+	g3 &= mask;
+	g4 &= mask;
+	mask = ~mask;
+
+	h0 = (h0 & mask) | g0;
+	h1 = (h1 & mask) | g1;
+	h2 = (h2 & mask) | g2;
+	h3 = (h3 & mask) | g3;
+	h4 = (h4 & mask) | g4;
+
+	/* h = h % (2^128) */
+	h0 = ((h0) | (h1 << 26)) & 0xffffffff;
+	h1 = ((h1 >> 6) | (h2 << 20)) & 0xffffffff;
+	h2 = ((h2 >> 12) | (h3 << 14)) & 0xffffffff;
+	h3 = ((h3 >> 18) | (h4 << 8)) & 0xffffffff;
+
+	/* mac = (h + pad) % (2^128) */
+	f  = (unsigned long long) h0 + st->pad[0];
+	h0 = (unsigned long) f;
+	f  = (unsigned long long) h1 + st->pad[1] + (f >> 32);
+	h1 = (unsigned long) f;
+	f  = (unsigned long long) h2 + st->pad[2] + (f >> 32);
+	h2 = (unsigned long) f;
+	f  = (unsigned long long) h3 + st->pad[3] + (f >> 32);
+	h3 = (unsigned long) f;
+
+	STORE32_LE(mac + 0, (UINT) h0);
+	STORE32_LE(mac + 4, (UINT) h1);
+	STORE32_LE(mac + 8, (UINT) h2);
+	STORE32_LE(mac + 12, (UINT) h3);
+
+	/* zero out the state */
+	Zero((void *) st, sizeof *st);
+}
+
+static int
+crypto_onetimeauth_poly1305_final(
+										crypto_onetimeauth_poly1305_state *state, unsigned char *out)
+{
+	poly1305_finish((poly1305_state_internal_t *) (void *) state, out);
+
+	return 0;
+}
+
+static const unsigned char _pad0[16] = { 0 };
+
+int
+crypto_aead_chacha20poly1305_ietf_encrypt_detached(unsigned char *c,
+												   unsigned char *mac,
+												   unsigned long long *maclen_p,
+												   const unsigned char *m,
+												   unsigned long long mlen,
+												   const unsigned char *ad,
+												   unsigned long long adlen,
+												   const unsigned char *nsec,
+												   const unsigned char *npub,
+												   const unsigned char *k)
+{
+	crypto_onetimeauth_poly1305_state state;
+	unsigned char                     block0[64U];
+	unsigned char                     slen[8U];
+
+	(void) nsec;
+	Zero(block0, sizeof block0);
+	crypto_stream_chacha20_ietf(block0, sizeof block0, npub, k);
+	crypto_onetimeauth_poly1305_init(&state, block0);
+
+	crypto_onetimeauth_poly1305_update(&state, ad, adlen);
+	crypto_onetimeauth_poly1305_update(&state, _pad0, (0x10 - adlen) & 0xf);
+
+	crypto_stream_chacha20_ietf_xor_ic(c, m, mlen, npub, 1U, k);
+
+	crypto_onetimeauth_poly1305_update(&state, c, mlen);
+	crypto_onetimeauth_poly1305_update(&state, _pad0, (0x10 - mlen) & 0xf);
+
+	STORE64_LE(slen, (UINT64) adlen);
+	crypto_onetimeauth_poly1305_update(&state, slen, sizeof slen);
+
+	STORE64_LE(slen, (UINT64) mlen);
+	crypto_onetimeauth_poly1305_update(&state, slen, sizeof slen);
+
+	crypto_onetimeauth_poly1305_final(&state, mac);
+	Zero(&state, sizeof state);
+
+	if (maclen_p != NULL) {
+		*maclen_p = 16;
+	}
+	return 0;
+}
+
+
+
+int
+crypto_aead_chacha20poly1305_ietf_decrypt_detached(unsigned char *m,
+												   unsigned char *nsec,
+												   const unsigned char *c,
+												   unsigned long long clen,
+												   const unsigned char *mac,
+												   const unsigned char *ad,
+												   unsigned long long adlen,
+												   const unsigned char *npub,
+												   const unsigned char *k)
+{
+	crypto_onetimeauth_poly1305_state state;
+	unsigned char                     block0[64U];
+	unsigned char                     slen[8U];
+	unsigned char                     computed_mac[16];
+	unsigned long long                mlen;
+	int                               ret;
+
+	(void) nsec;
+	Zero(block0, sizeof block0);
+	crypto_stream_chacha20_ietf(block0, sizeof block0, npub, k);
+	crypto_onetimeauth_poly1305_init(&state, block0);
+
+	crypto_onetimeauth_poly1305_update(&state, ad, adlen);
+	crypto_onetimeauth_poly1305_update(&state, _pad0, (0x10 - adlen) & 0xf);
+
+	mlen = clen;
+	crypto_onetimeauth_poly1305_update(&state, c, mlen);
+	crypto_onetimeauth_poly1305_update(&state, _pad0, (0x10 - mlen) & 0xf);
+
+	STORE64_LE(slen, (UINT64) adlen);
+	crypto_onetimeauth_poly1305_update(&state, slen, sizeof slen);
+
+	STORE64_LE(slen, (UINT64) mlen);
+	crypto_onetimeauth_poly1305_update(&state, slen, sizeof slen);
+
+	crypto_onetimeauth_poly1305_final(&state, computed_mac);
+	Zero(&state, sizeof state);
+
+	ret = Cmp((void *)computed_mac, (void *)mac, 16);
+	Zero(computed_mac, sizeof computed_mac);
+	if (m == NULL) {
+		return ret;
+	}
+	if (ret != 0) {
+		memset(m, 0, (UINT)mlen);
+		return -1;
+	}
+	crypto_stream_chacha20_ietf_xor_ic(m, c, mlen, npub, 1U, k);
+
+	return 0;
+}
+
+int
+crypto_aead_chacha20poly1305_ietf_decrypt(unsigned char *m,
+										  unsigned long long *mlen_p,
+										  unsigned char *nsec,
+										  const unsigned char *c,
+										  unsigned long long clen,
+										  const unsigned char *ad,
+										  unsigned long long adlen,
+										  const unsigned char *npub,
+										  const unsigned char *k)
+{
+	unsigned long long mlen = 0ULL;
+	int                ret = -1;
+
+	if (clen >= 16) {
+		ret = crypto_aead_chacha20poly1305_ietf_decrypt_detached
+			(m, nsec,
+			c, clen - 16,
+			c + clen - AEAD_CHACHA20_POLY1305_MAC_SIZE,
+			ad, adlen, npub, k);
+	}
+	if (mlen_p != NULL) {
+		if (ret == 0) {
+			mlen = clen - AEAD_CHACHA20_POLY1305_MAC_SIZE;
+		}
+		*mlen_p = mlen;
+	}
+	return ret;
+}
+
+
+int
+crypto_aead_chacha20poly1305_ietf_encrypt(unsigned char *c,
+										  unsigned long long *clen_p,
+										  const unsigned char *m,
+										  unsigned long long mlen,
+										  const unsigned char *ad,
+										  unsigned long long adlen,
+										  const unsigned char *nsec,
+										  const unsigned char *npub,
+										  const unsigned char *k)
+{
+	unsigned long long clen = 0ULL;
+	int                ret;
+
+	ret = crypto_aead_chacha20poly1305_ietf_encrypt_detached(c,
+		c + mlen, NULL,
+		m, mlen,
+		ad, adlen,
+		nsec, npub, k);
+	if (clen_p != NULL) {
+		if (ret == 0) {
+			clen = mlen + AEAD_CHACHA20_POLY1305_MAC_SIZE;
+		}
+		*clen_p = clen;
+	}
+	return ret;
+}
 
+// RFC 8439: ChaCha20-Poly1305-IETF Encryption with AEAD
+void Aead_ChaCha20Poly1305_Ietf_Encrypt(void *dst, void *src, UINT src_size,
+										void *key, void *nonce, void *aad, UINT aad_size)
+{
+#ifdef USE_OPENSSL_AEAD_CHACHA20POLY1305
+	Aead_ChaCha20Poly1305_Ietf_Encrypt_OpenSSL(dst, src, src_size, key, nonce, aad, aad_size);
+#else // USE_OPENSSL_AEAD_CHACHA20POLY1305
+	Aead_ChaCha20Poly1305_Ietf_Encrypt_Embedded(dst, src, src_size, key, nonce, aad, aad_size);
+#endif // USE_OPENSSL_AEAD_CHACHA20POLY1305
+}
+void Aead_ChaCha20Poly1305_Ietf_Encrypt_OpenSSL(void *dst, void *src, UINT src_size,
+												 void *key, void *nonce, void *aad, UINT aad_size)
+{
+#ifdef USE_OPENSSL_AEAD_CHACHA20POLY1305
+	EVP_CIPHER_CTX *ctx;
+	int outlen = 0;
+
+	if ((src_size != 0 && (dst == NULL || src == NULL)) ||
+		key == NULL || nonce == NULL ||
+		(aad_size != 0 && aad == NULL))
+	{
+		Zero(dst, src_size);
+		return;
+	}
+
+	ctx = EVP_CIPHER_CTX_new();
+
+	EVP_EncryptInit_ex(ctx, EVP_chacha20_poly1305(), 0, 0, 0);
+	EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_IVLEN, AEAD_CHACHA20_POLY1305_NONCE_SIZE, 0);
+	EVP_EncryptInit_ex(ctx, NULL, NULL, key, nonce);
+	EVP_EncryptUpdate(ctx, NULL, &outlen, aad, aad_size);
+	EVP_EncryptUpdate(ctx, dst, &outlen, src, src_size);
+	EVP_EncryptFinal_ex(ctx, dst, &outlen);
+	EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, AEAD_CHACHA20_POLY1305_MAC_SIZE,
+		((UCHAR *)dst) + src_size);
+
+	EVP_CIPHER_CTX_free(ctx);
+#endif	// USE_OPENSSL_AEAD_CHACHA20POLY1305
+}
+void Aead_ChaCha20Poly1305_Ietf_Encrypt_Embedded(void *dst, void *src, UINT src_size,
+										void *key, void *nonce, void *aad, UINT aad_size)
+{
+	if ((src_size != 0 && (dst == NULL || src == NULL)) ||
+		key == NULL || nonce == NULL ||
+		(aad_size != 0 && aad == NULL))
+	{
+		Zero(dst, src_size);
+		return;
+	}
+	crypto_aead_chacha20poly1305_ietf_encrypt(dst, NULL, src, src_size, aad, aad_size,
+		NULL, nonce, key);
+}
+
+// RFC 8439: ChaCha20-Poly1305-IETF Decryption with AEAD
+bool Aead_ChaCha20Poly1305_Ietf_Decrypt(void *dst, void *src, UINT src_size, void *key, void *nonce, void *aad, UINT aad_size)
+{
+#ifdef USE_OPENSSL_AEAD_CHACHA20POLY1305
+	return Aead_ChaCha20Poly1305_Ietf_Decrypt_OpenSSL(dst, src, src_size, key,
+		nonce, aad, aad_size);
+#else // USE_OPENSSL_AEAD_CHACHA20POLY1305
+	return Aead_ChaCha20Poly1305_Ietf_Decrypt_Embedded(dst, src, src_size, key,
+		nonce, aad, aad_size);
+#endif // USE_OPENSSL_AEAD_CHACHA20POLY1305
+}
+bool Aead_ChaCha20Poly1305_Ietf_Decrypt_OpenSSL(void *dst, void *src, UINT src_size, void *key,
+												 void *nonce, void *aad, UINT aad_size)
+{
+#ifdef USE_OPENSSL_AEAD_CHACHA20POLY1305
+	EVP_CIPHER_CTX *ctx;
+	int outlen = 0;
+	bool ret = false;
+
+	if ((src_size != 0 && (dst == NULL || src == NULL)) ||
+		key == NULL || nonce == NULL ||
+		(aad_size != 0 && aad == NULL) ||
+		(src_size < AEAD_CHACHA20_POLY1305_MAC_SIZE))
+	{
+		Zero(dst, src_size);
+		return false;
+	}
+
+	ctx = EVP_CIPHER_CTX_new();
+
+	EVP_DecryptInit_ex(ctx, EVP_chacha20_poly1305(), 0, 0, 0);
+	EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_IVLEN, AEAD_CHACHA20_POLY1305_NONCE_SIZE, 0);
+	
+	if (EVP_DecryptInit_ex(ctx, NULL, NULL, key, nonce) == 1)
+	{
+		if (EVP_DecryptUpdate(ctx, NULL, &outlen, aad, aad_size) == 1)
+		{
+			if (EVP_DecryptUpdate(ctx, dst, &outlen, src, src_size - AEAD_CHACHA20_POLY1305_MAC_SIZE) == 1)
+			{
+				EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, AEAD_CHACHA20_POLY1305_MAC_SIZE,
+					((UCHAR *)src) + (src_size - AEAD_CHACHA20_POLY1305_MAC_SIZE));
+
+				if (EVP_DecryptFinal_ex(ctx, dst, &outlen))
+				{
+					ret = true;
+				}
+			}
+		}
+	}
+
+	EVP_CIPHER_CTX_free(ctx);
+
+	return ret;
+#else	// USE_OPENSSL_AEAD_CHACHA20POLY1305
+	return false;
+#endif	// USE_OPENSSL_AEAD_CHACHA20POLY1305
+}
+bool Aead_ChaCha20Poly1305_Ietf_Decrypt_Embedded(void *dst, void *src, UINT src_size, void *key,
+										void *nonce, void *aad, UINT aad_size)
+{
+	int ret;
+	if ((src_size != 0 && (dst == NULL || src == NULL)) ||
+		key == NULL || nonce == NULL ||
+		(aad_size != 0 && aad == NULL) ||
+		(src_size < AEAD_CHACHA20_POLY1305_MAC_SIZE))
+	{
+		Zero(dst, src_size);
+		return false;
+	}
+
+	ret = crypto_aead_chacha20poly1305_ietf_decrypt(
+		dst, NULL, NULL, src, src_size, aad, aad_size, nonce, key);
+
+	if (ret == -1)
+	{
+		return false;
+	}
+
+	return true;
+}
+
+bool Aead_ChaCha20Poly1305_Ietf_IsOpenSSL()
+{
+#ifdef USE_OPENSSL_AEAD_CHACHA20POLY1305
+	return true;
+#else	// USE_OPENSSL_AEAD_CHACHA20POLY1305
+	return false;
+#endif	// USE_OPENSSL_AEAD_CHACHA20POLY1305
+}
+
+// RFC 8439: ChaCha20-Poly1305-IETF AEAD Test
+void Aead_ChaCha20Poly1305_Ietf_Test()
+{
+	char *nonce_hex = "07 00 00 00 40 41 42 43 44 45 46 47";
+	char *plaintext_hex =
+		"4c 61 64 69 65 73 20 61 6e 64 20 47 65 6e 74 6c "
+		"65 6d 65 6e 20 6f 66 20 74 68 65 20 63 6c 61 73 "
+		"73 20 6f 66 20 27 39 39 3a 20 49 66 20 49 20 63 "
+		"6f 75 6c 64 20 6f 66 66 65 72 20 79 6f 75 20 6f "
+		"6e 6c 79 20 6f 6e 65 20 74 69 70 20 66 6f 72 20 "
+		"74 68 65 20 66 75 74 75 72 65 2c 20 73 75 6e 73 "
+		"63 72 65 65 6e 20 77 6f 75 6c 64 20 62 65 20 69 "
+		"74 2e";
+	char *aad_hex = "50 51 52 53 c0 c1 c2 c3 c4 c5 c6 c7";
+	char *key_hex =
+		"80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f "
+		"90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f";
+	BUF *nonce = StrToBin(nonce_hex);
+	BUF *plaintext = StrToBin(plaintext_hex);
+	BUF *aad = StrToBin(aad_hex);
+	BUF *key = StrToBin(key_hex);
+	UINT plaintext_size = plaintext->Size;
+	UCHAR *encrypted = Malloc(plaintext_size + AEAD_CHACHA20_POLY1305_MAC_SIZE);
+	UCHAR *decrypted = Malloc(plaintext_size);
+	char encrypted_hex[MAX_SIZE];
+	char mac_hex[MAX_SIZE];
+
+	Print("Aead_ChaCha20Poly1305_Ietf_Test()\n\n");
+
+	Aead_ChaCha20Poly1305_Ietf_Encrypt(encrypted, plaintext->Buf, plaintext_size,
+		key->Buf, nonce->Buf, aad->Buf, aad->Size);
+
+	BinToStrEx(encrypted_hex, sizeof(encrypted_hex), encrypted, plaintext_size);
+
+	BinToStrEx(mac_hex, sizeof(mac_hex), encrypted + plaintext_size, AEAD_CHACHA20_POLY1305_MAC_SIZE);
+
+	Print("Encrypted:\n%s\n\n", encrypted_hex);
+
+	Print("MAC:\n%s\n\n", mac_hex);
+
+	Print("Please check the results with https://tools.ietf.org/html/rfc8439#section-2.8.2 by your great eyes.\n\n");
+
+	if (Aead_ChaCha20Poly1305_Ietf_Decrypt(decrypted, encrypted, plaintext_size + AEAD_CHACHA20_POLY1305_MAC_SIZE,
+		key->Buf, nonce->Buf, aad->Buf, aad->Size) == false)
+	{
+		Print("Decrypt failed.\n");
+	}
+	else
+	{
+		Print("Decrypt OK.\n");
+		if (Cmp(plaintext->Buf, decrypted, plaintext_size) == 0)
+		{
+			Print("Same OK.\n");
+		}
+		else
+		{
+			Print("Different !!!\n");
+		}
+	}
+
+	FreeBuf(nonce);
+	FreeBuf(plaintext);
+	FreeBuf(aad);
+	FreeBuf(key);
+	Free(encrypted);
+	Free(decrypted);
+}
 

+ 26 - 0
src/Mayaqua/Encrypt.h

@@ -105,6 +105,10 @@
 #ifndef	ENCRYPT_H
 #define	ENCRYPT_H
 
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
+//#define USE_OPENSSL_AEAD_CHACHA20POLY1305
+#endif
+
 // Function of OpenSSL
 void RAND_Init_For_SoftEther();
 void RAND_Free_For_SoftEther();
@@ -132,6 +136,12 @@ void RAND_Free_For_SoftEther();
 #define	AES_IV_SIZE					16			// AES IV size
 #define	AES_MAX_KEY_SIZE			32			// Maximum AES key size
 
+// RFC 8439: ChaCha20 and Poly1305 for IETF Protocols
+#define AEAD_CHACHA20_POLY1305_MAC_SIZE		16	// MAC size
+#define AEAD_CHACHA20_POLY1305_NONCE_SIZE	12	// Nonce size
+#define AEAD_CHACHA20_POLY1305_KEY_SIZE		32	// Key size
+
+
 // IANA definitions taken from IKEv1 Phase 1
 #define SHA1_160						2
 #define SHA2_256						4
@@ -574,6 +584,22 @@ BUF *EasyDecrypt(BUF *src_buf);
 
 void DisableIntelAesAccel();
 
+int GetSslClientCertIndex();
+
+void Aead_ChaCha20Poly1305_Ietf_Encrypt_Embedded(void *dst, void *src, UINT src_size, void *key, void *nonce, void *aad, UINT aad_size);
+bool Aead_ChaCha20Poly1305_Ietf_Decrypt_Embedded(void *dst, void *src, UINT src_size, void *key, void *nonce, void *aad, UINT aad_size);
+
+void Aead_ChaCha20Poly1305_Ietf_Encrypt_OpenSSL(void *dst, void *src, UINT src_size, void *key, void *nonce, void *aad, UINT aad_size);
+bool Aead_ChaCha20Poly1305_Ietf_Decrypt_OpenSSL(void *dst, void *src, UINT src_size, void *key, void *nonce, void *aad, UINT aad_size);
+
+void Aead_ChaCha20Poly1305_Ietf_Encrypt(void *dst, void *src, UINT src_size, void *key, void *nonce, void *aad, UINT aad_size);
+bool Aead_ChaCha20Poly1305_Ietf_Decrypt(void *dst, void *src, UINT src_size, void *key, void *nonce, void *aad, UINT aad_size);
+
+bool Aead_ChaCha20Poly1305_Ietf_IsOpenSSL();
+
+void Aead_ChaCha20Poly1305_Ietf_Test();
+
+
 #ifdef	ENCRYPT_C
 // Inner function
 

+ 6 - 0
src/Mayaqua/FileIO.c

@@ -1292,6 +1292,12 @@ void BuildHamcore(char *dst_filename, char *src_dir, bool unix_only)
 				}
 			}
 
+			if (InStr(rpath, "\\node_modules\\"))
+			{
+				// Exclude node_modules in the hamcore\webroot
+				ok = false;
+			}
+
 			if (ok)
 			{
 				b = ReadDump(s);

+ 91 - 0
src/Mayaqua/Kernel.c

@@ -1622,11 +1622,102 @@ void GetDateTimeStrMilli(char *str, UINT size, SYSTEMTIME *st)
 		st->wMilliseconds);
 }
 
+// Convert string RFC3339 format (example: 2017-09-27T18:25:55.434-9:00) to UINT64
+UINT64 DateTimeStrRFC3339ToSystemTime64(char *str)
+{
+	SYSTEMTIME st;
+	if (DateTimeStrRFC3339ToSystemTime(&st, str))
+	{
+		return SystemToUINT64(&st);
+	}
+	else
+	{
+		return 0;
+	}
+}
+
+// Convert string RFC3339 format (example: 2017-09-27T18:25:55.434-9:00) to SYSTEMTIME
+bool DateTimeStrRFC3339ToSystemTime(SYSTEMTIME *st, char *str)
+{
+	bool ok = false;
+	UINT index_plus;
+	char tmp[MAX_PATH];
+	Zero(st, sizeof(SYSTEMTIME));
+	if (st == NULL || str == NULL)
+	{
+		return false;
+	}
+
+	StrCpy(tmp, sizeof(tmp), str);
+
+	index_plus = SearchStrEx(tmp, "+", 0, false);
+	if (index_plus != INFINITE)
+	{
+		tmp[index_plus] = 0;
+	}
+
+	if (StrLen(tmp) >= 19)
+	{
+		if (tmp[4] == '-' && tmp[7] == '-' && tmp[10] == 'T' && tmp[13] == ':' &&
+			tmp[16] == ':')
+		{
+			char str_year[16], str_month[16], str_day[16], str_hour[16], str_minute[16],
+				 str_second[16], str_msec[16];
+
+			StrCpy(str_year, sizeof(str_year), tmp + 0);
+			str_year[4] = 0;
+
+			StrCpy(str_month, sizeof(str_month), tmp + 5);
+			str_month[2] = 0;
+
+			StrCpy(str_day, sizeof(str_day), tmp + 8);
+			str_day[2] = 0;
+
+			StrCpy(str_hour, sizeof(str_hour), tmp + 11);
+			str_hour[2] = 0;
+
+			StrCpy(str_minute, sizeof(str_minute), tmp + 14);
+			str_minute[2] = 0;
+
+			StrCpy(str_second, sizeof(str_second), tmp + 17);
+			str_second[2] = 0;
+
+			str_msec[0] = 0;
+
+			if (StrLen(tmp) >= 21 && tmp[19] == '.')
+			{
+				StrCpy(str_msec, sizeof(str_msec), tmp + 20);
+				str_msec[StrLen(tmp) - 21] = 0;
+				while (StrLen(str_msec) < 3)
+				{
+					StrCat(str_msec, sizeof(str_msec), "0");
+				}
+				str_msec[3] = 0;
+			}
+
+			st->wYear = ToInt(str_year);
+			st->wMonth = ToInt(str_month);
+			st->wDay = ToInt(str_day);
+			st->wHour = ToInt(str_hour);
+			st->wMinute = ToInt(str_minute);
+			st->wSecond = ToInt(str_second);
+			st->wMilliseconds = ToInt(str_msec);
+
+			NormalizeSystem(st);
+
+			ok = true;
+		}
+	}
+
+	return ok;
+}
+
 // Get the date and time string in RFC3339 format (example: 2017-09-27T18:25:55.434-9:00)
 void GetDateTimeStrRFC3339(char *str, UINT size, SYSTEMTIME *st, int timezone_min){
 	// Validate arguments
 	if (str == NULL || st == NULL)
 	{
+		ClearStr(str, size);
 		return;
 	}
 

+ 2 - 0
src/Mayaqua/Kernel.h

@@ -240,6 +240,8 @@ void GetDateStrEx64(wchar_t *str, UINT size, UINT64 sec64, LOCALE *locale);
 void GetTimeStrMilli64(char *str, UINT size, UINT64 sec64);
 void GetTimeStr64(char *str, UINT size, UINT64 sec64);
 void GetDateTimeStrRFC3339(char *str, UINT size, SYSTEMTIME *st, int timezone_min);
+bool DateTimeStrRFC3339ToSystemTime(SYSTEMTIME *st, char *str);
+UINT64 DateTimeStrRFC3339ToSystemTime64(char *str);
 UINT64 SafeTime64(UINT64 sec64);
 bool Run(char *filename, char *arg, bool hide, bool wait);
 bool RunW(wchar_t *filename, wchar_t *arg, bool hide, bool wait);

+ 6 - 1
src/Mayaqua/MayaType.h

@@ -136,7 +136,7 @@ typedef struct x509_crl_st X509_CRL;
 #define	BUF_SIZE			512
 
 // Support Windows OS list
-#define	SUPPORTED_WINDOWS_LIST		"Windows 98 / 98 SE / ME / NT 4.0 SP6a / 2000 SP4 / XP SP2, SP3 / Vista SP1, SP2 / 7 SP1 / 8 / 8.1 / 10 / Server 2003 SP2 / Server 2008 SP1, SP2 / Hyper-V Server 2008 / Server 2008 R2 SP1 / Hyper-V Server 2008 R2 / Server 2012 / Hyper-V Server 2012 / Server 2012 R2 / Hyper-V Server 2012 R2 / Server 2016"
+#define	SUPPORTED_WINDOWS_LIST		"Windows 98 / 98 SE / ME / NT 4.0 SP6a / 2000 SP4 / XP SP2, SP3 / Vista SP1, SP2 / 7 SP1 / 8 / 8.1 / 10 / Server 2003 SP2 / Server 2008 SP1, SP2 / Hyper-V Server 2008 / Server 2008 R2 SP1 / Hyper-V Server 2008 R2 / Server 2012 / Hyper-V Server 2012 / Server 2012 R2 / Hyper-V Server 2012 R2 / Server 2016 / Server 2019"
 
 // Infinite
 #ifndef	WINDOWS_H
@@ -421,6 +421,9 @@ typedef struct PRAND PRAND;
 // Str.h
 typedef struct TOKEN_LIST TOKEN_LIST;
 typedef struct INI_ENTRY INI_ENTRY;
+typedef struct JSON_OBJECT JSON_OBJECT;
+typedef struct JSON_ARRAY  JSON_ARRAY;
+typedef struct JSON_VALUE  JSON_VALUE;
 
 // Internat.h
 typedef struct UNI_TOKEN_LIST UNI_TOKEN_LIST;
@@ -457,6 +460,8 @@ typedef struct INSTANCE INSTANCE;
 typedef struct VALUE VALUE;
 typedef struct ELEMENT ELEMENT;
 typedef struct PACK PACK;
+typedef struct JSONPACKHINT JSONPACKHINT;
+typedef struct JSONPACKHINT_ITEM JSONPACKHINT_ITEM;
 
 // Cfg.h
 typedef struct FOLDER FOLDER;

+ 80 - 1
src/Mayaqua/Memory.c

@@ -1646,6 +1646,48 @@ bool ReplaceListPointer(LIST *o, void *oldptr, void *newptr)
 	return false;
 }
 
+// New string list
+LIST *NewStrList()
+{
+	return NewListFast(CompareStr);
+}
+
+// Release string list
+void ReleaseStrList(LIST *o)
+{
+	UINT i;
+	if (o == NULL)
+	{
+		return;
+	}
+
+	for (i = 0;i < LIST_NUM(o);i++)
+	{
+		char *s = LIST_DATA(o, i);
+		Free(s);
+	}
+
+	ReleaseList(o);
+}
+
+// Add a string distinct to the string list
+bool AddStrToStrListDistinct(LIST *o, char *str)
+{
+	if (o == NULL || str == NULL)
+	{
+		return false;
+	}
+
+	if (IsInListStr(o, str) == false)
+	{
+		Add(o, CopyStr(str));
+
+		return true;
+	}
+
+	return false;
+}
+
 // Examine whether a string items are present in the list
 bool IsInListStr(LIST *o, char *str)
 {
@@ -3361,6 +3403,43 @@ void WriteBufBuf(BUF *b, BUF *bb)
 	WriteBuf(b, bb->Buf, bb->Size);
 }
 
+// Write the buffer (from the offset) to a buffer
+void WriteBufBufWithOffset(BUF *b, BUF *bb)
+{
+	// Validate arguments
+	if (b == NULL || bb == NULL)
+	{
+		return;
+	}
+
+	WriteBuf(b, ((UCHAR *)bb->Buf) + bb->Current, bb->Size - bb->Current);
+}
+
+// Skip UTF-8 BOM
+bool BufSkipUtf8Bom(BUF *b)
+{
+	if (b == NULL)
+	{
+		return false;
+	}
+
+	SeekBufToBegin(b);
+
+	if (b->Size >= 3)
+	{
+		UCHAR *data = b->Buf;
+
+		if (data[0] == 0xEF && data[1] == 0xBB && data[2] == 0xBF)
+		{
+			SeekBuf(b, 3, 1);
+
+			return true;
+		}
+	}
+
+	return false;
+}
+
 // Read into a buffer from the buffer
 BUF *ReadBufFromBuf(BUF *b, UINT size)
 {
@@ -4226,7 +4305,7 @@ void *InternalReAlloc(void *addr, UINT size)
 	}
 
 #ifndef	DONT_USE_KERNEL_STATUS
-	TrackChangeObjSize((DWORD)addr, size, (DWORD)new_addr);
+	TrackChangeObjSize(POINTER_TO_UINT64(addr), size, POINTER_TO_UINT64(new_addr));
 #endif	// DONT_USE_KERNEL_STATUS
 
 	return new_addr;

+ 6 - 0
src/Mayaqua/Memory.h

@@ -305,7 +305,9 @@ BUF *NewBufFromMemory(void *buf, UINT size);
 void ClearBuf(BUF *b);
 void WriteBuf(BUF *b, void *buf, UINT size);
 void WriteBufBuf(BUF *b, BUF *bb);
+void WriteBufBufWithOffset(BUF *b, BUF *bb);
 UINT ReadBuf(BUF *b, void *buf, UINT size);
+bool BufSkipUtf8Bom(BUF *b);
 BUF *ReadBufFromBuf(BUF *b, UINT size);
 void AdjustBufSize(BUF *b, UINT new_size);
 void SeekBuf(BUF *b, UINT offset, int mode);
@@ -469,5 +471,9 @@ void CleanupSharedBuffer(SHARED_BUFFER *b);
 void AppendBufUtf8(BUF *b, wchar_t *str);
 void AppendBufStr(BUF *b, char *str);
 
+LIST *NewStrList();
+void ReleaseStrList(LIST *o);
+bool AddStrToStrListDistinct(LIST *o, char *str);
+
 #endif	// MEMORY_H
 

+ 54 - 0
src/Mayaqua/Microsoft.c

@@ -3413,6 +3413,60 @@ HANDLE MsCreateUserToken()
 }
 
 
+// Check whether SHA-2 kernel mode signature is supported
+bool MsIsSha2KernelModeSignatureSupported()
+{
+	HINSTANCE hDll;
+	bool ret = false;
+
+	if (MsIsWindows8())
+	{
+		return true;
+	}
+
+	hDll = LoadLibrary("Wintrust.dll");
+	if (hDll == NULL)
+	{
+		return false;
+	}
+
+	if (GetProcAddress(hDll, "CryptCATAdminAcquireContext2") != NULL)
+	{
+		ret = true;
+	}
+
+	FreeLibrary(hDll);
+
+	return ret;
+}
+
+// Check whether KB3033929 is required
+bool MsIsKB3033929RequiredAndMissing()
+{
+	OS_INFO *info = GetOsInfo();
+
+	if (info == NULL)
+	{
+		return false;
+	}
+
+	if (OS_IS_WINDOWS_NT(info->OsType))
+	{
+		if (GET_KETA(info->OsType, 100) == 6)
+		{
+			if (MsIsX64())
+			{
+				if (MsIsSha2KernelModeSignatureSupported() == false)
+				{
+					return true;
+				}
+			}
+		}
+	}
+
+	return false;
+}
+
 // Check the digital signature of the file
 bool MsCheckFileDigitalSignature(HWND hWnd, char *name, bool *danger)
 {

+ 3 - 0
src/Mayaqua/Microsoft.h

@@ -1017,6 +1017,9 @@ bool MsIsInfCatalogRequired();
 bool MsCheckFileDigitalSignature(HWND hWnd, char *name, bool *danger);
 bool MsCheckFileDigitalSignatureW(HWND hWnd, wchar_t *name, bool *danger);
 
+bool MsIsKB3033929RequiredAndMissing();
+bool MsIsSha2KernelModeSignatureSupported();
+
 
 bool MsGetProcessExeName(char *path, UINT size, UINT id);
 bool MsGetProcessExeNameW(wchar_t *path, UINT size, UINT id);

+ 467 - 116
src/Mayaqua/Network.c

@@ -2651,70 +2651,128 @@ void RUDPBulkSend(RUDP_STACK *r, RUDP_SESSION *se, void *data, UINT data_size)
 	UCHAR crypt_key_src[SHA1_SIZE * 2];
 	UCHAR crypt_key[SHA1_SIZE];
 	UINT icmp_type;
-	UCHAR sign[SHA1_SIZE];
-	UCHAR iv[SHA1_SIZE + 1];
 	// Validate arguments
 	if (r == NULL || se == NULL || (data == NULL && data_size != 0))
 	{
 		return;
 	}
 
-	padding_size = Rand32() % 31 + 1;
+	if (se->BulkSendKey->Size == RUDP_BULK_KEY_SIZE_V2)
+	{
+		// Ver 2
+		UCHAR iv[RUDP_BULK_IV_SIZE_V2];
 
-	buf_size = SHA1_SIZE + SHA1_SIZE + sizeof(UINT64) + data_size + padding_size;
-	buf = Malloc(buf_size);
+		padding_size = Rand32() % 31 + 1;
 
-	// SEQ NO
-	WRITE_UINT64(buf + SHA1_SIZE + SHA1_SIZE, se->BulkNextSeqNo);
-	se->BulkNextSeqNo++;
+		// Packet: IV + Encrypted(SEQ_NO + Data + padding) + MAC
+		buf_size = RUDP_BULK_IV_SIZE_V2 + sizeof(UINT64) + data_size + padding_size + RUDP_BULK_MAC_SIZE_V2;
+		buf = Malloc(buf_size);
 
-	// Data
-	Copy(buf + SHA1_SIZE + SHA1_SIZE + sizeof(UINT64), data, data_size);
+		// IV
+		Copy(iv, se->BulkNextIv_V2, RUDP_BULK_IV_SIZE_V2);
+		Copy(buf, iv, RUDP_BULK_IV_SIZE_V2);
 
-	// Padding
-	for (i = 0;i < padding_size;i++)
-	{
-		buf[SHA1_SIZE + SHA1_SIZE + sizeof(UINT64) + data_size + i] = (UCHAR)padding_size;
-	}
+		// SEQ NO
+		WRITE_UINT64(buf + RUDP_BULK_IV_SIZE_V2, se->BulkNextSeqNo);
+		se->BulkNextSeqNo++;
 
-	// Encryption
-	Copy(iv, se->BulkNextIv, SHA1_SIZE);
-	Copy(crypt_key_src + 0, se->BulkSendKey->Data, SHA1_SIZE);
-	Copy(crypt_key_src + SHA1_SIZE, iv, SHA1_SIZE);
-	HashSha1(crypt_key, crypt_key_src, SHA1_SIZE * 2);
-	c = NewCrypt(crypt_key, sizeof(crypt_key));
-	Encrypt(c, buf + SHA1_SIZE + SHA1_SIZE, buf + SHA1_SIZE + SHA1_SIZE, sizeof(UINT64) + data_size + padding_size);
-	FreeCrypt(c);
+		// Data
+		Copy(buf + RUDP_BULK_IV_SIZE_V2 + sizeof(UINT64), data, data_size);
 
-	// IV
-	Copy(buf + SHA1_SIZE, iv, SHA1_SIZE);
+		// Padding
+		for (i = 0;i < padding_size;i++)
+		{
+			buf[RUDP_BULK_IV_SIZE_V2 + sizeof(UINT64) + data_size + i] = (UCHAR)padding_size;
+		}
 
-	// Sign
-	if (se->UseHMac == false)
-	{
-		Copy(buf + 0, se->BulkSendKey->Data, SHA1_SIZE);
-		HashSha1(sign, buf, SHA1_SIZE + SHA1_SIZE + sizeof(UINT64) + data_size + padding_size);
-		Copy(buf + 0, sign, SHA1_SIZE);
+		// Encryption
+		Aead_ChaCha20Poly1305_Ietf_Encrypt(buf + RUDP_BULK_IV_SIZE_V2,
+			buf + RUDP_BULK_IV_SIZE_V2,
+			sizeof(UINT64) + data_size + padding_size,
+			se->BulkSendKey->Data,
+			iv,
+			NULL,
+			0);
+
+		// Next IV
+		Copy(se->BulkNextIv_V2, buf + RUDP_BULK_IV_SIZE_V2 + sizeof(UINT64) + data_size + padding_size - RUDP_BULK_IV_SIZE_V2,
+			RUDP_BULK_IV_SIZE_V2);
+
+		if (r->Protocol == RUDP_PROTOCOL_ICMP)
+		{
+			icmp_type = se->Icmp_Type;
+		}
+		else if (r->Protocol == RUDP_PROTOCOL_DNS)
+		{
+			icmp_type = se->Dns_TranId;
+		}
+		RUDPSendPacket(r, &se->YourIp, se->YourPort, buf, buf_size, icmp_type);
+
+		Free(buf);
 	}
 	else
 	{
-		HMacSha1(buf + 0, se->BulkSendKey->Data, SHA1_SIZE, buf + SHA1_SIZE, SHA1_SIZE + sizeof(UINT64) + data_size + padding_size);
-	}
+		UCHAR sign[SHA1_SIZE];
+		UCHAR iv[SHA1_SIZE];
 
-	// Next IV
-	Copy(se->BulkNextIv, buf + buf_size - SHA1_SIZE, SHA1_SIZE);
+		// Ver 1
+		padding_size = Rand32() % 31 + 1;
 
-	if (r->Protocol == RUDP_PROTOCOL_ICMP)
-	{
-		icmp_type = se->Icmp_Type;
-	}
-	else if (r->Protocol == RUDP_PROTOCOL_DNS)
-	{
-		icmp_type = se->Dns_TranId;
-	}
-	RUDPSendPacket(r, &se->YourIp, se->YourPort, buf, buf_size, icmp_type);
+		buf_size = SHA1_SIZE + SHA1_SIZE + sizeof(UINT64) + data_size + padding_size;
+		buf = Malloc(buf_size);
 
-	Free(buf);
+		// SEQ NO
+		WRITE_UINT64(buf + SHA1_SIZE + SHA1_SIZE, se->BulkNextSeqNo);
+		se->BulkNextSeqNo++;
+
+		// Data
+		Copy(buf + SHA1_SIZE + SHA1_SIZE + sizeof(UINT64), data, data_size);
+
+		// Padding
+		for (i = 0;i < padding_size;i++)
+		{
+			buf[SHA1_SIZE + SHA1_SIZE + sizeof(UINT64) + data_size + i] = (UCHAR)padding_size;
+		}
+
+		// Encryption
+		Copy(iv, se->BulkNextIv, SHA1_SIZE);
+		Copy(crypt_key_src + 0, se->BulkSendKey->Data, SHA1_SIZE);
+		Copy(crypt_key_src + SHA1_SIZE, iv, SHA1_SIZE);
+		HashSha1(crypt_key, crypt_key_src, SHA1_SIZE * 2);
+		c = NewCrypt(crypt_key, sizeof(crypt_key));
+		Encrypt(c, buf + SHA1_SIZE + SHA1_SIZE, buf + SHA1_SIZE + SHA1_SIZE, sizeof(UINT64) + data_size + padding_size);
+		FreeCrypt(c);
+
+		// IV
+		Copy(buf + SHA1_SIZE, iv, SHA1_SIZE);
+
+		// Sign
+		if (se->UseHMac == false)
+		{
+			Copy(buf + 0, se->BulkSendKey->Data, SHA1_SIZE);
+			HashSha1(sign, buf, SHA1_SIZE + SHA1_SIZE + sizeof(UINT64) + data_size + padding_size);
+			Copy(buf + 0, sign, SHA1_SIZE);
+		}
+		else
+		{
+			HMacSha1(buf + 0, se->BulkSendKey->Data, SHA1_SIZE, buf + SHA1_SIZE, SHA1_SIZE + sizeof(UINT64) + data_size + padding_size);
+		}
+
+		// Next IV
+		Copy(se->BulkNextIv, buf + buf_size - SHA1_SIZE, SHA1_SIZE);
+
+		if (r->Protocol == RUDP_PROTOCOL_ICMP)
+		{
+			icmp_type = se->Icmp_Type;
+		}
+		else if (r->Protocol == RUDP_PROTOCOL_DNS)
+		{
+			icmp_type = se->Dns_TranId;
+		}
+		RUDPSendPacket(r, &se->YourIp, se->YourPort, buf, buf_size, icmp_type);
+
+		Free(buf);
+	}
 }
 
 // Start a socket for R-UDP Listening
@@ -2775,14 +2833,20 @@ SOCK *AcceptRUDP(SOCK *s)
 			{
 			case RUDP_PROTOCOL_UDP:
 				StrCpy(ret->UnderlayProtocol, sizeof(ret->UnderlayProtocol), SOCK_UNDERLAY_NAT_T);
+				AddProtocolDetailsStr(ret->ProtocolDetails, sizeof(ret->ProtocolDetails),
+					"RUDP/UDP");
 				break;
 
 			case RUDP_PROTOCOL_DNS:
 				StrCpy(ret->UnderlayProtocol, sizeof(ret->UnderlayProtocol), SOCK_UNDERLAY_DNS);
+				AddProtocolDetailsStr(ret->ProtocolDetails, sizeof(ret->ProtocolDetails),
+					"RUDP/DNS");
 				break;
 
 			case RUDP_PROTOCOL_ICMP:
 				StrCpy(ret->UnderlayProtocol, sizeof(ret->UnderlayProtocol), SOCK_UNDERLAY_ICMP);
+				AddProtocolDetailsStr(ret->ProtocolDetails, sizeof(ret->ProtocolDetails),
+					"RUDP/ICMP");
 				break;
 			}
 
@@ -2835,24 +2899,53 @@ bool RUDPCheckSignOfRecvPacket(RUDP_STACK *r, RUDP_SESSION *se, void *recv_data,
 	}
 
 	// Verification signature (bulk packet)
-	if (se->UseHMac == false)
+	if (se->BulkRecvKey->Size == RUDP_BULK_KEY_SIZE_V2)
 	{
-		Copy(sign, p, SHA1_SIZE);
-		Copy(p, se->BulkRecvKey->Data, SHA1_SIZE);
-		HashSha1(sign2, p, recv_size);
-		Copy(p, sign, SHA1_SIZE);
+		// Ver 2
+		UCHAR *iv = p;
+		// Packet: IV + Encrypted(SEQ_NO + Data + padding) + MAC
+		// IV
+		if (size < RUDP_BULK_IV_SIZE_V2)
+		{
+			return false;
+		}
+		iv = p;
+		p += RUDP_BULK_IV_SIZE_V2;
+		size -= RUDP_BULK_IV_SIZE_V2;
 
-		if (Cmp(sign, sign2, SHA1_SIZE) == 0)
+		// Decrypt
+		if (size < (RUDP_BULK_MAC_SIZE_V2 + 1))
 		{
-			return true;
+			return false;
 		}
+		if (Aead_ChaCha20Poly1305_Ietf_Decrypt(r->TmpBuf, p, size, se->BulkRecvKey->Data, iv, NULL, 0) == false)
+		{
+			return false;
+		}
+		return true;
 	}
-
-	HMacSha1(sign2, se->BulkRecvKey->Data, SHA1_SIZE, p + SHA1_SIZE, size - SHA1_SIZE);
-	if (Cmp(p, sign2, SHA1_SIZE) == 0)
+	else
 	{
-		se->UseHMac = true;
-		return true;
+		// Ver 1
+		if (se->UseHMac == false)
+		{
+			Copy(sign, p, SHA1_SIZE);
+			Copy(p, se->BulkRecvKey->Data, SHA1_SIZE);
+			HashSha1(sign2, p, recv_size);
+			Copy(p, sign, SHA1_SIZE);
+
+			if (Cmp(sign, sign2, SHA1_SIZE) == 0)
+			{
+				return true;
+			}
+		}
+
+		HMacSha1(sign2, se->BulkRecvKey->Data, SHA1_SIZE, p + SHA1_SIZE, size - SHA1_SIZE);
+		if (Cmp(p, sign2, SHA1_SIZE) == 0)
+		{
+			se->UseHMac = true;
+			return true;
+		}
 	}
 
 	return false;
@@ -2886,77 +2979,122 @@ bool RUDPProcessBulkRecvPacket(RUDP_STACK *r, RUDP_SESSION *se, void *recv_data,
 		return false;
 	}
 
-	// Validate the signature
-	if (se->UseHMac == false)
+	if (se->BulkRecvKey->Size == RUDP_BULK_KEY_SIZE_V2)
 	{
-		Copy(sign, p, SHA1_SIZE);
-		Copy(p, se->BulkRecvKey->Data, SHA1_SIZE);
-		HashSha1(sign2, p, recv_size);
-		Copy(p, sign, SHA1_SIZE);
+		// Ver 2
+		// Packet: IV + Encrypted(SEQ_NO + Data + padding) + MAC
+		// IV
+		if (size < RUDP_BULK_IV_SIZE_V2)
+		{
+			WHERE;
+			return false;
+		}
+		iv = p;
+		p += RUDP_BULK_IV_SIZE_V2;
+		size -= RUDP_BULK_IV_SIZE_V2;
 
-		if (Cmp(sign, sign2, SHA1_SIZE) != 0)
+		// Decrypt
+		if (size < (RUDP_BULK_MAC_SIZE_V2 + 1))
 		{
-			HMacSha1(sign2, se->BulkRecvKey->Data, SHA1_SIZE, p + SHA1_SIZE, recv_size - SHA1_SIZE);
+			WHERE;
+			return false;
+		}
+		if (Aead_ChaCha20Poly1305_Ietf_Decrypt(p, p, size, se->BulkRecvKey->Data, iv, NULL, 0) == false)
+		{
+			WHERE;
+			return false;
+		}
 
-			if (Cmp(p, sign2, SHA1_SIZE) != 0)
+		size -= RUDP_BULK_MAC_SIZE_V2;
+
+		// padlen
+		padlen = p[size - 1];
+		if (padlen == 0)
+		{
+			WHERE;
+			return false;
+		}
+		if (size < padlen)
+		{
+			WHERE;
+			return false;
+		}
+		size -= padlen;
+	}
+	else
+	{
+		// Validate the signature
+		if (se->UseHMac == false)
+		{
+			Copy(sign, p, SHA1_SIZE);
+			Copy(p, se->BulkRecvKey->Data, SHA1_SIZE);
+			HashSha1(sign2, p, recv_size);
+			Copy(p, sign, SHA1_SIZE);
+
+			if (Cmp(sign, sign2, SHA1_SIZE) != 0)
 			{
-				return false;
+				HMacSha1(sign2, se->BulkRecvKey->Data, SHA1_SIZE, p + SHA1_SIZE, recv_size - SHA1_SIZE);
+
+				if (Cmp(p, sign2, SHA1_SIZE) != 0)
+				{
+					return false;
+				}
+				else
+				{
+					se->UseHMac = true;
+				}
 			}
 			else
 			{
-				se->UseHMac = true;
 			}
 		}
 		else
 		{
+			HMacSha1(sign2, se->BulkRecvKey->Data, SHA1_SIZE, p + SHA1_SIZE, recv_size - SHA1_SIZE);
+
+			if (Cmp(p, sign2, SHA1_SIZE) != 0)
+			{
+				return false;
+			}
 		}
-	}
-	else
-	{
-		HMacSha1(sign2, se->BulkRecvKey->Data, SHA1_SIZE, p + SHA1_SIZE, recv_size - SHA1_SIZE);
 
-		if (Cmp(p, sign2, SHA1_SIZE) != 0)
+		p += SHA1_SIZE;
+		size -= SHA1_SIZE;
+
+		// IV
+		if (size < SHA1_SIZE)
 		{
 			return false;
 		}
-	}
-
-	p += SHA1_SIZE;
-	size -= SHA1_SIZE;
-
-	// IV
-	if (size < SHA1_SIZE)
-	{
-		return false;
-	}
-	iv = p;
-	p += SHA1_SIZE;
-	size -= SHA1_SIZE;
+		iv = p;
+		p += SHA1_SIZE;
+		size -= SHA1_SIZE;
 
-	// Decrypt
-	if (size < 1)
-	{
-		return false;
-	}
-	Copy(keygen + 0, se->BulkRecvKey->Data, SHA1_SIZE);
-	Copy(keygen + SHA1_SIZE, iv, SHA1_SIZE);
-	HashSha1(key, keygen, sizeof(keygen));
+		// Decrypt
+		if (size < 1)
+		{
+			return false;
+		}
+		Copy(keygen + 0, se->BulkRecvKey->Data, SHA1_SIZE);
+		Copy(keygen + SHA1_SIZE, iv, SHA1_SIZE);
+		HashSha1(key, keygen, sizeof(keygen));
 
-	c = NewCrypt(key, sizeof(key));
-	Encrypt(c, p, p, size);
-	FreeCrypt(c);
+		c = NewCrypt(key, sizeof(key));
+		Encrypt(c, p, p, size);
+		FreeCrypt(c);
 
-	// padlen
-	padlen = p[size - 1];
-	if (padlen == 0)
-	{
-		return false;
-	}
-	if (size < padlen)
-	{
-		return false;
+		// padlen
+		padlen = p[size - 1];
+		if (padlen == 0)
+		{
+			return false;
+		}
+		if (size < padlen)
+		{
+			return false;
+		}
+		size -= padlen;
 	}
-	size -= padlen;
 
 	// SEQ NO
 	seq_no = READ_UINT64(p);
@@ -3769,8 +3907,8 @@ RUDP_SESSION *RUDPNewSession(bool server_mode, IP *my_ip, UINT my_port, IP *your
 	RUDP_SESSION *se;
 	UCHAR key1[SHA1_SIZE];
 	UCHAR key2[SHA1_SIZE];
-	UCHAR bulk_send_key[SHA1_SIZE];
-	UCHAR bulk_recv_key[SHA1_SIZE];
+	UCHAR bulk_send_key[RUDP_BULK_KEY_SIZE_MAX];
+	UCHAR bulk_recv_key[RUDP_BULK_KEY_SIZE_MAX];
 	BUF *b;
 
 	se = ZeroMalloc(sizeof(RUDP_SESSION));
@@ -3856,6 +3994,8 @@ RUDP_SESSION *RUDPNewSession(bool server_mode, IP *my_ip, UINT my_port, IP *your
 	se->BulkRecvKey = NewSharedBuffer(bulk_recv_key, sizeof(bulk_recv_key));
 
 	Rand(se->BulkNextIv, sizeof(se->BulkNextIv));
+	Rand(se->BulkNextIv_V2, sizeof(se->BulkNextIv_V2));
+
 	se->BulkNextSeqNo = 1;
 
 	return se;
@@ -5806,8 +5946,53 @@ int cb_test(int a, X509_STORE_CTX *ctx)
 	return 1;
 }
 
+// Verify client SSL certificate during TLS handshake.
+//
+// (actually, only save the certificate for later authentication in Protocol.c)
+int SslCertVerifyCallback(int preverify_ok, X509_STORE_CTX *ctx)
+{
+	SSL *ssl;
+	struct SslClientCertInfo *clientcert;
+
+	ssl = X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx());
+	clientcert = SSL_get_ex_data(ssl, GetSslClientCertIndex());
+
+	if (clientcert != NULL)
+	{
+		clientcert->PreverifyErr = 0;
+		clientcert->PreverifyErrMessage[0] = '\0';
+		if (!preverify_ok)
+		{
+			char *msg;
+			clientcert->PreverifyErr = X509_STORE_CTX_get_error(ctx);
+			msg = (char *)X509_verify_cert_error_string(clientcert->PreverifyErr);
+			StrCpy(clientcert->PreverifyErrMessage, PREVERIFY_ERR_MESSAGE_SIZE, msg);
+			Debug("SslCertVerifyCallback preverify error: '%s'\n", msg);
+		}
+		else
+		{
+			if (ctx->cert != NULL)
+			{
+				X *tmpX = X509ToX(ctx->cert); // this only wraps ctx->cert, but we need to make a copy
+				X *copyX = CloneX(tmpX);
+				tmpX->do_not_free = true; // do not release inner X509 object
+				FreeX(tmpX);
+				clientcert->X = copyX;
+			}
+		}
+	}
+
+	return 1; /* allow the verification process to continue */
+}
+
 // Create a new SSL pipe
 SSL_PIPE *NewSslPipe(bool server_mode, X *x, K *k, DH_CTX *dh)
+{
+	return NewSslPipeEx(server_mode, x, k, dh, false, NULL);
+}
+
+// Create a new SSL pipe with extended options
+SSL_PIPE *NewSslPipeEx(bool server_mode, X *x, K *k, DH_CTX *dh, bool verify_peer, struct SslClientCertInfo *clientcert)
 {
 	SSL_PIPE *s;
 	SSL *ssl;
@@ -5832,7 +6017,10 @@ SSL_PIPE *NewSslPipe(bool server_mode, X *x, K *k, DH_CTX *dh)
 			SSL_CTX_set_ssl_version(ssl_ctx, SSLv23_client_method());
 		}
 
-		//SSL_CTX_set_verify(ssl_ctx, SSL_VERIFY_PEER, cb_test);
+		if (verify_peer)
+		{
+			SSL_CTX_set_verify(ssl_ctx, SSL_VERIFY_PEER, SslCertVerifyCallback);
+		}
 
 		if (dh != NULL)
 		{
@@ -5845,6 +6033,8 @@ SSL_PIPE *NewSslPipe(bool server_mode, X *x, K *k, DH_CTX *dh)
 		}
 
 		ssl = SSL_new(ssl_ctx);
+
+		SSL_set_ex_data(ssl, GetSslClientCertIndex(), clientcert);
 	}
 	Unlock(openssl_lock);
 
@@ -12654,6 +12844,50 @@ void InitSockSet(SOCKSET *set)
 	Zero(set, sizeof(SOCKSET));
 }
 
+// Receive data and discard all of them
+bool RecvAllWithDiscard(SOCK *sock, UINT size, bool secure)
+{
+	static UCHAR buffer[4096];
+	UINT recv_size, sz, ret;
+	if (sock == NULL)
+	{
+		return false;
+	}
+	if (size == 0)
+	{
+		return true;
+	}
+	if (sock->AsyncMode)
+	{
+		return false;
+	}
+
+	recv_size = 0;
+
+	while (true)
+	{
+		sz = MIN(size - recv_size, sizeof(buffer));
+		ret = Recv(sock, buffer, sz, secure);
+		if (ret == 0)
+		{
+			return false;
+		}
+		if (ret == SOCK_LATER)
+		{
+			// I suppose that this is safe because the RecvAll() function is used only 
+			// if the sock->AsyncMode == true. And the Recv() function may return
+			// SOCK_LATER only if the sock->AsyncMode == false. Therefore the call of 
+			// Recv() function in the RecvAll() function never returns SOCK_LATER.
+			return false;
+		}
+		recv_size += ret;
+		if (recv_size >= size)
+		{
+			return true;
+		}
+	}
+}
+
 // Receive all by TCP
 bool RecvAll(SOCK *sock, void *data, UINT size, bool secure)
 {
@@ -14024,6 +14258,8 @@ SOCK *Accept(SOCK *sock)
 
 	StrCpy(ret->UnderlayProtocol, sizeof(ret->UnderlayProtocol), SOCK_UNDERLAY_NATIVE_V4);
 
+	AddProtocolDetailsStr(ret->ProtocolDetails, sizeof(ret->ProtocolDetails), "IPv4");
+
 	return ret;
 }
 
@@ -14134,6 +14370,8 @@ SOCK *Accept6(SOCK *sock)
 
 	StrCpy(ret->UnderlayProtocol, sizeof(ret->UnderlayProtocol), SOCK_UNDERLAY_NATIVE_V6);
 
+	AddProtocolDetailsStr(ret->ProtocolDetails, sizeof(ret->ProtocolDetails), "IPv6");
+
 	return ret;
 }
 
@@ -15372,6 +15610,8 @@ SOCK *ConnectEx4(char *hostname, UINT port, UINT timeout, bool *cancel_flag, cha
 			if (nat_t_sock != NULL)
 			{
 				StrCpy(nat_t_sock->UnderlayProtocol, sizeof(nat_t_sock->UnderlayProtocol), SOCK_UNDERLAY_NAT_T);
+				AddProtocolDetailsStr(nat_t_sock->ProtocolDetails, sizeof(nat_t_sock->ProtocolDetails),
+					"RUDP");
 			}
 
 			Copy(ret_ip, &ip4, sizeof(IP));
@@ -15599,6 +15839,8 @@ SOCK *ConnectEx4(char *hostname, UINT port, UINT timeout, bool *cancel_flag, cha
 
 				StrCpy(p2.Result_Nat_T_Sock->UnderlayProtocol, sizeof(p2.Result_Nat_T_Sock->UnderlayProtocol),
 					SOCK_UNDERLAY_NAT_T);
+				AddProtocolDetailsStr(p2.Result_Nat_T_Sock->UnderlayProtocol, sizeof(p2.Result_Nat_T_Sock->UnderlayProtocol),
+					"RUDP/UDP");
 
 				Copy(ret_ip, &ip4, sizeof(IP));
 
@@ -15613,6 +15855,8 @@ SOCK *ConnectEx4(char *hostname, UINT port, UINT timeout, bool *cancel_flag, cha
 
 				StrCpy(p4.Result_Nat_T_Sock->UnderlayProtocol, sizeof(p4.Result_Nat_T_Sock->UnderlayProtocol),
 					SOCK_UNDERLAY_DNS);
+				AddProtocolDetailsStr(p4.Result_Nat_T_Sock->UnderlayProtocol, sizeof(p4.Result_Nat_T_Sock->UnderlayProtocol),
+					"RUDP/DNS");
 
 				Copy(ret_ip, &ip4, sizeof(IP));
 
@@ -15623,6 +15867,8 @@ SOCK *ConnectEx4(char *hostname, UINT port, UINT timeout, bool *cancel_flag, cha
 				// Use this if over ICMP success
 				StrCpy(p3.Result_Nat_T_Sock->UnderlayProtocol, sizeof(p3.Result_Nat_T_Sock->UnderlayProtocol),
 					SOCK_UNDERLAY_ICMP);
+				AddProtocolDetailsStr(p3.Result_Nat_T_Sock->UnderlayProtocol, sizeof(p3.Result_Nat_T_Sock->UnderlayProtocol),
+					"RUDP/ICMP");
 
 				Copy(ret_ip, &ip4, sizeof(IP));
 
@@ -15689,6 +15935,9 @@ SOCK *ConnectEx4(char *hostname, UINT port, UINT timeout, bool *cancel_flag, cha
 	StrCpy(sock->UnderlayProtocol, sizeof(sock->UnderlayProtocol),
 		(is_ipv6 ? SOCK_UNDERLAY_NATIVE_V6 : SOCK_UNDERLAY_NATIVE_V4));
 
+	AddProtocolDetailsStr(sock->ProtocolDetails, sizeof(sock->ProtocolDetails),
+		is_ipv6 ? "IPv6" : "IPv4");
+
 	// Host name resolution
 	if (no_get_hostname || (GetHostName(tmp, sizeof(tmp), &current_ip) == false))
 	{
@@ -15737,6 +15986,75 @@ SOCK *ConnectEx4(char *hostname, UINT port, UINT timeout, bool *cancel_flag, cha
 	return sock;
 }
 
+// Get the current accepting IPv4 address
+void TryGetCurrentAcceptingIPv4Address(IP *ip)
+{
+	SOCK *s = ConnectEx(UDP_NAT_T_GET_PRIVATE_IP_TCP_SERVER, 80, 2000);
+
+	if (s != NULL)
+	{
+		Disconnect(s);
+		ReleaseSock(s);
+	}
+
+	if (GetCurrentGlobalIP(ip, false))
+	{
+		return;
+	}
+
+	GetCurrentGlobalIPGuess(ip, false);
+}
+
+// Add a protocol details strings
+void AddProtocolDetailsStr(char *dst, UINT dst_size, char *str)
+{
+	TOKEN_LIST *t1, *t2;
+	UINT i, j;
+	if (dst == NULL || str == NULL)
+	{
+		return;
+	}
+
+	t1 = ParseTokenWithoutNullStr(dst, " ");
+	t2 = ParseTokenWithoutNullStr(str, " ");
+
+	for (i = 0;i < t2->NumTokens;i++)
+	{
+		bool exists = false;
+		for (j = 0;j < t1->NumTokens;j++)
+		{
+			if (StrCmpi(t1->Token[j], t2->Token[i]) == 0)
+			{
+				exists = true;
+				break;
+			}
+		}
+
+		if (exists == false)
+		{
+			StrCat(dst, dst_size, t2->Token[i]);
+			StrCat(dst, dst_size, " ");
+		}
+	}
+
+	FreeToken(t1);
+	FreeToken(t2);
+}
+void AddProtocolDetailsKeyValueStr(char *dst, UINT dst_size, char *key, char *value)
+{
+	char tmp[128];
+	StrCpy(tmp, sizeof(tmp), key);
+	StrCat(tmp, sizeof(tmp), "=");
+	StrCat(tmp, sizeof(tmp), value);
+	AddProtocolDetailsStr(dst, dst_size, tmp);
+}
+void AddProtocolDetailsKeyValueInt(char *dst, UINT dst_size, char *key, UINT value)
+{
+	char tmp[128];
+	ToStr(tmp, value);
+	AddProtocolDetailsKeyValueStr(dst, dst_size, key, tmp);
+}
+
 // Maximize the I/O buffer size of the socket
 void SetSocketSendRecvBufferSize(SOCKET s, UINT size)
 {
@@ -21029,6 +21347,8 @@ SOCK *AcceptReverse(SOCK *s)
 		{
 			StrCpy(ret->UnderlayProtocol, sizeof(ret->UnderlayProtocol), SOCK_UNDERLAY_AZURE);
 
+			AddProtocolDetailsStr(ret->ProtocolDetails, sizeof(ret->ProtocolDetails), "VPNAzure");
+
 			return ret;
 		}
 
@@ -21077,6 +21397,8 @@ SOCK *AcceptInProc(SOCK *s)
 		{
 			StrCpy(ret->UnderlayProtocol, sizeof(ret->UnderlayProtocol), SOCK_UNDERLAY_INPROC);
 
+			AddProtocolDetailsStr(ret->ProtocolDetails, sizeof(ret->ProtocolDetails), "InProc");
+
 			return ret;
 		}
 
@@ -21525,6 +21847,10 @@ void FlushTubeFlushList(TUBE_FLUSH_LIST *f)
 
 // The server receives a PACK from the client
 PACK *HttpServerRecv(SOCK *s)
+{
+	return HttpServerRecvEx(s, 0);
+}
+PACK *HttpServerRecvEx(SOCK *s, UINT max_data_size)
 {
 	BUF *b;
 	PACK *p;
@@ -21533,6 +21859,7 @@ PACK *HttpServerRecv(SOCK *s)
 	UCHAR *tmp;
 	HTTP_VALUE *v;
 	UINT num_noop = 0;
+	if (max_data_size == 0) max_data_size = HTTP_PACK_MAX_SIZE;
 	// Validate arguments
 	if (s == NULL)
 	{
@@ -21563,7 +21890,7 @@ START:
 	}
 
 	size = GetContentLength(h);
-	if (size == 0 || size > HTTP_PACK_MAX_SIZE)
+	if (size == 0 || (size > max_data_size))
 	{
 		FreeHttpHeader(h);
 		goto BAD_REQUEST;
@@ -21924,6 +22251,35 @@ bool HttpSendNotImplemented(SOCK *s, char *method, char *target, char *version)
 	return ret;
 }
 
+// Sending a HTTP body contents
+bool HttpSendBody(SOCK *s, void *data, UINT size, char *contents_type)
+{
+	HTTP_HEADER *h;
+	char date_str[MAX_SIZE];
+	bool ret;
+	if (s == NULL || (size != 0 && data == NULL))
+	{
+		return false;
+	}
+	if (contents_type == NULL)
+	{
+		contents_type = "application/octet-stream";
+	}
+	// Creating a header
+	h = NewHttpHeader("HTTP/1.1", "200", "OK");
+
+	GetHttpDateStr(date_str, sizeof(date_str), SystemTime64());
+	AddHttpValue(h, NewHttpValue("Date", date_str));
+	AddHttpValue(h, NewHttpValue("Content-Type", contents_type));
+	AddHttpValue(h, NewHttpValue("Cache-Control", "no-cache"));
+
+	ret = PostHttp(s, h, data, size);
+
+	FreeHttpHeader(h);
+
+	return ret;
+}
+
 // Sending a 404 Not Found error
 bool HttpSendNotFound(SOCK *s, char *target)
 {
@@ -22321,11 +22677,6 @@ HTTP_HEADER *RecvHttpHeader(SOCK *s)
 			// The colon does not exist
 			goto LABEL_ERROR;
 		}
-		if ((pos + 1) >= StrLen(str))
-		{
-			// There is no data
-			goto LABEL_ERROR;
-		}
 
 		// Divide into the name and the data
 		value_name = Malloc(pos + 1);

+ 24 - 1
src/Mayaqua/Network.h

@@ -306,6 +306,7 @@ struct SOCK
 	UINT CurrentTtl;			// Current TTL value
 	RUDP_STACK *R_UDP_Stack;	// R-UDP stack
 	char UnderlayProtocol[64];	// Underlying protocol
+	char ProtocolDetails[256];		// Protocol Details
 	QUEUE *ReverseAcceptQueue;	// Accept queue for the reverse socket
 	EVENT *ReverseAcceptEvent;	// Accept event for the reverse socket
 	bool IsReverseAcceptedSocket;	// Whether it is a reverse socket
@@ -660,6 +661,12 @@ struct IPBLOCK
 #define	RUDP_TIMEOUT					12000		// Time-out of R-UDP communication
 #define	RUDP_DIRECT_CONNECT_TIMEOUT		5000		// R-UDP direct connection time-out
 #define	RUDP_MAX_SEGMENT_SIZE			512			// Maximum segment size
+#define	RUDP_BULK_KEY_SIZE_MAX			128			// Bulk key size Max
+
+#define	RUDP_BULK_KEY_SIZE_V2			32			// V2: Bulk key size
+#define RUDP_BULK_IV_SIZE_V2			12			// V2: Bulk IV size
+#define RUDP_BULK_MAC_SIZE_V2			16			// V2: Bulk MAC size
+
 // Maximum R-UDP packet size
 #define	RUDP_MAX_PACKET_SIZE			(RUDP_MAX_SEGMENT_SIZE + sizeof(UINT64) * RUDP_MAX_NUM_ACK + SHA1_SIZE * 2 + sizeof(UINT64) * 4 + sizeof(UINT) + 255)
 #define	RUDP_MAX_NUM_ACK				64			// Maximum number of ACKs
@@ -748,6 +755,7 @@ struct RUDP_SESSION
 	UINT64 BulkNextSeqNo;				// Next SEQ NO to the bulk send
 	bool FlushBulkSendTube;				// Flag to be Flush the bulk send Tube
 	UINT64 BulkRecvSeqNoMax;			// Highest sequence number received
+	UCHAR BulkNextIv_V2[RUDP_BULK_IV_SIZE_V2];		// Next IV to the bulk send (Ver 2)
 };
 
 // NAT Traversal Server Information
@@ -1045,11 +1053,13 @@ UINT GetContentLength(HTTP_HEADER *header);
 void GetHttpDateStr(char *str, UINT size, UINT64 t);
 bool HttpSendForbidden(SOCK *s, char *target, char *server_id);
 bool HttpSendNotFound(SOCK *s, char *target);
+bool HttpSendBody(SOCK *s, void *data, UINT size, char *contents_type);
 bool HttpSendNotImplemented(SOCK *s, char *method, char *target, char *version);
 bool HttpSendInvalidHostname(SOCK *s, char *method);
 bool HttpServerSend(SOCK *s, PACK *p);
 bool HttpClientSend(SOCK *s, PACK *p);
 PACK *HttpServerRecv(SOCK *s);
+PACK *HttpServerRecvEx(SOCK *s, UINT max_data_size);
 PACK *HttpClientRecv(SOCK *s);
 
 bool HttpSendServerError(SOCK *s, char *target);
@@ -1307,7 +1317,7 @@ bool SendAll(SOCK *sock, void *data, UINT size, bool secure);
 void SendAdd(SOCK *sock, void *data, UINT size);
 bool SendNow(SOCK *sock, int secure);
 bool RecvAll(SOCK *sock, void *data, UINT size, bool secure);
-bool RecvAllEx(SOCK *sock, void **data_new_ptr, UINT size, bool secure);
+bool RecvAllWithDiscard(SOCK *sock, UINT size, bool secure);
 void InitSockSet(SOCKSET *set);
 void AddSockSet(SOCKSET *set, SOCK *sock);
 CANCEL *NewCancel();
@@ -1433,6 +1443,10 @@ void DebugPrintRoute(ROUTE_ENTRY *e);
 void DebugPrintRouteTable(ROUTE_TABLE *r);
 bool IsIPv6LocalNetworkAddress(IP *ip);
 UINT GetNumWaitThread();
+void AddProtocolDetailsStr(char *dst, UINT dst_size, char *str);
+void AddProtocolDetailsKeyValueStr(char *dst, UINT dst_size, char *key, char *value);
+void AddProtocolDetailsKeyValueInt(char *dst, UINT dst_size, char *key, UINT value);
+void TryGetCurrentAcceptingIPv4Address(IP *ip);
 
 #ifdef	ENABLE_SSL_LOGGING
 void SockEnableSslLogging(SOCK *s);
@@ -1605,7 +1619,16 @@ void Win32WaitForTubes(TUBE **tubes, UINT num, UINT timeout);
 void UnixWaitForTubes(TUBE **tubes, UINT num, UINT timeout);
 #endif	// OS_WIN32
 
+#define PREVERIFY_ERR_MESSAGE_SIZE 100
+// Info on client certificate collected during TLS handshake
+struct SslClientCertInfo {
+	int PreverifyErr;
+	char PreverifyErrMessage[PREVERIFY_ERR_MESSAGE_SIZE];
+	X *X;
+};
+
 SSL_PIPE *NewSslPipe(bool server_mode, X *x, K *k, DH_CTX *dh);
+SSL_PIPE *NewSslPipeEx(bool server_mode, X *x, K *k, DH_CTX *dh, bool verify_peer, struct SslClientCertInfo *clientcert);
 void FreeSslPipe(SSL_PIPE *s);
 bool SyncSslPipe(SSL_PIPE *s);
 

+ 922 - 72
src/Mayaqua/Pack.c

@@ -741,13 +741,13 @@ ELEMENT *NewElement(char *name, UINT type, UINT num_value, VALUE **values)
 	}
 
 	// Memory allocation
-	e = Malloc(sizeof(ELEMENT));
+	e = ZeroMalloc(sizeof(ELEMENT));
 	StrCpy(e->name, sizeof(e->name), name);
 	e->num_value = num_value;
 	e->type = type;
 
 	// Copy of the pointer list to the element
-	e->values = (VALUE **)Malloc(sizeof(VALUE *) * num_value);
+	e->values = (VALUE **)ZeroMalloc(sizeof(VALUE *) * num_value);
 	for (i = 0;i < e->num_value;i++)
 	{
 		e->values[i] = values[i];
@@ -864,6 +864,10 @@ bool AddElement(PACK *p, ELEMENT *e)
 
 	// Adding
 	Add(p->elements, e);
+
+	// Set JsonHint_GroupName
+	StrCpy(e->JsonHint_GroupName, sizeof(e->JsonHint_GroupName), p->CurrentJsonHint_GroupName);
+
 	return true;
 }
 
@@ -885,6 +889,11 @@ void FreePack(PACK *p)
 	}
 	Free(elements);
 
+	if (p->json_subitem_names != NULL)
+	{
+		FreeStrList(p->json_subitem_names);
+	}
+
 	ReleaseList(p->elements);
 	Free(p);
 }
@@ -895,7 +904,7 @@ PACK *NewPack()
 	PACK *p;
 
 	// Memory allocation
-	p = MallocEx(sizeof(PACK), true);
+	p = ZeroMallocEx(sizeof(PACK), true);
 
 	// Creating a List
 	p->elements = NewListFast(ComparePackName);
@@ -921,6 +930,12 @@ K *PackGetK(PACK *p, char *name)
 	}
 
 	k = BufToK(b, true, false, NULL);
+
+	if (k == NULL)
+	{
+		k = BufToK(b, true, true, NULL);
+	}
+
 	FreeBuf(b);
 
 	return k;
@@ -944,49 +959,61 @@ X *PackGetX(PACK *p, char *name)
 	}
 
 	x = BufToX(b, false);
+
+	if (x == NULL)
+	{
+		x = BufToX(b, true);
+	}
+
 	FreeBuf(b);
 
 	return x;
 }
 
 // Add the K to the PACK
-void PackAddK(PACK *p, char *name, K *k)
+ELEMENT *PackAddK(PACK *p, char *name, K *k)
 {
 	BUF *b;
+	ELEMENT *e = NULL;
 	// Validate arguments
 	if (p == NULL || name == NULL || k == NULL)
 	{
-		return;
+		return NULL;
 	}
 
 	b = KToBuf(k, false, NULL);
 	if (b == NULL)
 	{
-		return;
+		return NULL;
 	}
 
-	PackAddBuf(p, name, b);
+	e = PackAddBuf(p, name, b);
 	FreeBuf(b);
+
+	return e;
 }
 
 // Add an X into the PACK
-void PackAddX(PACK *p, char *name, X *x)
+ELEMENT *PackAddX(PACK *p, char *name, X *x)
 {
 	BUF *b;
+	ELEMENT *e = NULL;
 	// Validate arguments
 	if (p == NULL || name == NULL || x == NULL)
 	{
-		return;
+		return NULL;
 	}
 
 	b = XToBuf(x, false);
 	if (b == NULL)
 	{
-		return;
+		return NULL;
 	}
 
-	PackAddBuf(p, name, b);
+	e = PackAddBuf(p, name, b);
 	FreeBuf(b);
+
+	return e;
 }
 
 // Get a buffer from the PACK
@@ -1149,30 +1176,65 @@ bool PackGetBoolEx(PACK *p, char *name, UINT index)
 	return PackGetIntEx(p, name, index) == 0 ? false : true;
 }
 
+// Set CurrentJsonHint_GroupName to PACK
+void PackSetCurrentJsonGroupName(PACK *p, char *json_group_name)
+{
+	if (p == NULL)
+	{
+		return;
+	}
+
+	if (json_group_name == NULL)
+	{
+		ClearStr(p->CurrentJsonHint_GroupName, sizeof(p->CurrentJsonHint_GroupName));
+	}
+	else
+	{
+		StrCpy(p->CurrentJsonHint_GroupName, sizeof(p->CurrentJsonHint_GroupName), json_group_name);
+
+		if (p->json_subitem_names == NULL)
+		{
+			p->json_subitem_names = NewStrList();
+		}
+
+		AddStrToStrListDistinct(p->json_subitem_names, json_group_name);
+	}
+}
+
 // Add a bool type into the PACK
-void PackAddBool(PACK *p, char *name, bool b)
+ELEMENT *PackAddBool(PACK *p, char *name, bool b)
 {
-	PackAddInt(p, name, b ? 1 : 0);
+	ELEMENT *e = PackAddInt(p, name, b ? 1 : 0);
+	if (e != NULL)
+	{
+		e->JsonHint_IsBool = true;
+	}
+	return e;
 }
-void PackAddBoolEx(PACK *p, char *name, bool b, UINT index, UINT total)
+ELEMENT *PackAddBoolEx(PACK *p, char *name, bool b, UINT index, UINT total)
 {
-	PackAddIntEx(p, name, b ? 1 : 0, index, total);
+	ELEMENT *e = PackAddIntEx(p, name, b ? 1 : 0, index, total);
+	if (e != NULL)
+	{
+		e->JsonHint_IsBool = true;
+	}
+	return e;
 }
 
 // Add the IPV6_ADDR to the PACK
-void PackAddIp6AddrEx(PACK *p, char *name, IPV6_ADDR *addr, UINT index, UINT total)
+ELEMENT *PackAddIp6AddrEx(PACK *p, char *name, IPV6_ADDR *addr, UINT index, UINT total)
 {
 	// Validate arguments
 	if (p == NULL || name == NULL || addr == NULL)
 	{
-		return;
+		return NULL;
 	}
 
-	PackAddDataEx(p, name, addr, sizeof(IPV6_ADDR), index, total);
+	return PackAddDataEx(p, name, addr, sizeof(IPV6_ADDR), index, total);
 }
-void PackAddIp6Addr(PACK *p, char *name, IPV6_ADDR *addr)
+ELEMENT *PackAddIp6Addr(PACK *p, char *name, IPV6_ADDR *addr)
 {
-	PackAddIp6AddrEx(p, name, addr, 0, 1);
+	return PackAddIp6AddrEx(p, name, addr, 0, 1);
 }
 
 // Get an IPV6_ADDR from the PACK
@@ -1194,6 +1256,10 @@ bool PackGetIp6Addr(PACK *p, char *name, IPV6_ADDR *addr)
 
 // Add the IP to the PACK
 void PackAddIp32Ex(PACK *p, char *name, UINT ip32, UINT index, UINT total)
+{
+	PackAddIp32Ex2(p, name, ip32, index, total, false);
+}
+void PackAddIp32Ex2(PACK *p, char *name, UINT ip32, UINT index, UINT total, bool is_single)
 {
 	IP ip;
 	// Validate arguments
@@ -1204,32 +1270,45 @@ void PackAddIp32Ex(PACK *p, char *name, UINT ip32, UINT index, UINT total)
 
 	UINTToIP(&ip, ip32);
 
-	PackAddIpEx(p, name, &ip, index, total);
+	PackAddIpEx2(p, name, &ip, index, total, is_single);
 }
 void PackAddIp32(PACK *p, char *name, UINT ip32)
 {
-	PackAddIp32Ex(p, name, ip32, 0, 1);
+	PackAddIp32Ex2(p, name, ip32, 0, 1, true);
 }
 void PackAddIpEx(PACK *p, char *name, IP *ip, UINT index, UINT total)
+{
+	PackAddIpEx2(p, name, ip, index, total, false);
+}
+void PackAddIpEx2(PACK *p, char *name, IP *ip, UINT index, UINT total, bool is_single)
 {
 	UINT i;
 	bool b = false;
 	char tmp[MAX_PATH];
+	ELEMENT *e;
 	// Validate arguments
 	if (p == NULL || name == NULL || ip == NULL)
 	{
 		return;
 	}
+	if (total >= 2)
+	{
+		is_single = false;
+	}
 
 	b = IsIP6(ip);
 
 	Format(tmp, sizeof(tmp), "%s@ipv6_bool", name);
-	PackAddBoolEx(p, tmp, b, index, total);
+	e = PackAddBoolEx(p, tmp, b, index, total);
+	if (e != NULL && is_single) e->JsonHint_IsArray = false;
+	if (e != NULL) e->JsonHint_IsIP = true;
 
 	Format(tmp, sizeof(tmp), "%s@ipv6_array", name);
 	if (b)
 	{
-		PackAddDataEx(p, tmp, ip->ipv6_addr, sizeof(ip->ipv6_addr), index, total);
+		e = PackAddDataEx(p, tmp, ip->ipv6_addr, sizeof(ip->ipv6_addr), index, total);
+		if (e != NULL && is_single) e->JsonHint_IsArray = false;
+		if (e != NULL) e->JsonHint_IsIP = true;
 	}
 	else
 	{
@@ -1237,17 +1316,23 @@ void PackAddIpEx(PACK *p, char *name, IP *ip, UINT index, UINT total)
 
 		Zero(dummy, sizeof(dummy));
 
-		PackAddDataEx(p, tmp, dummy, sizeof(dummy), index, total);
+		e = PackAddDataEx(p, tmp, dummy, sizeof(dummy), index, total);
+		if (e != NULL && is_single) e->JsonHint_IsArray = false;
+		if (e != NULL) e->JsonHint_IsIP = true;
 	}
 
 	Format(tmp, sizeof(tmp), "%s@ipv6_scope_id", name);
 	if (b)
 	{
-		PackAddIntEx(p, tmp, ip->ipv6_scope_id, index, total);
+		e = PackAddIntEx(p, tmp, ip->ipv6_scope_id, index, total);
+		if (e != NULL && is_single) e->JsonHint_IsArray = false;
+		if (e != NULL) e->JsonHint_IsIP = true;
 	}
 	else
 	{
-		PackAddIntEx(p, tmp, 0, index, total);
+		e = PackAddIntEx(p, tmp, 0, index, total);
+		if (e != NULL && is_single) e->JsonHint_IsArray = false;
+		if (e != NULL) e->JsonHint_IsIP = true;
 	}
 
 	i = IPToUINT(ip);
@@ -1257,11 +1342,13 @@ void PackAddIpEx(PACK *p, char *name, IP *ip, UINT index, UINT total)
 		i = Swap32(i);
 	}
 
-	PackAddIntEx(p, name, i, index, total);
+	e = PackAddIntEx(p, name, i, index, total);
+	if (e != NULL && is_single) e->JsonHint_IsArray = false;
+	if (e != NULL) e->JsonHint_IsIP = true;
 }
 void PackAddIp(PACK *p, char *name, IP *ip)
 {
-	PackAddIpEx(p, name, ip, 0, 1);
+	PackAddIpEx2(p, name, ip, 0, 1, true);
 }
 
 // Get an IP from the PACK
@@ -1441,34 +1528,35 @@ bool PackGetStrEx(PACK *p, char *name, char *str, UINT size, UINT index)
 }
 
 // Add the buffer to the PACK (array)
-void PackAddBufEx(PACK *p, char *name, BUF *b, UINT index, UINT total)
+ELEMENT *PackAddBufEx(PACK *p, char *name, BUF *b, UINT index, UINT total)
 {
 	// Validate arguments
 	if (p == NULL || name == NULL || b == NULL || total == 0)
 	{
-		return;
+		return NULL;
 	}
 
-	PackAddDataEx(p, name, b->Buf, b->Size, index, total);
+	return PackAddDataEx(p, name, b->Buf, b->Size, index, total);
 }
 
 // Add the data to the PACK (array)
-void PackAddDataEx(PACK *p, char *name, void *data, UINT size, UINT index, UINT total)
+ELEMENT *PackAddDataEx(PACK *p, char *name, void *data, UINT size, UINT index, UINT total)
 {
 	VALUE *v;
 	ELEMENT *e;
 	// Validate arguments
 	if (p == NULL || data == NULL || name == NULL || total == 0)
 	{
-		return;
+		return NULL;
 	}
 
 	v = NewDataValue(data, size);
 	e = GetElement(p, name, VALUE_DATA);
 	if (e != NULL)
 	{
-		if (e->num_value <= total)
+		if (e->num_value >= total)
 		{
+			FreeValue(e->values[index], VALUE_DATA);
 			e->values[index] = v;
 		}
 		else
@@ -1484,53 +1572,68 @@ void PackAddDataEx(PACK *p, char *name, void *data, UINT size, UINT index, UINT
 		e->type = VALUE_DATA;
 		e->values = ZeroMallocEx(sizeof(VALUE *) * total, true);
 		e->values[index] = v;
-		AddElement(p, e);
+		if (AddElement(p, e) == false)
+		{
+			return NULL;
+		}
 	}
+
+	e->JsonHint_IsArray = true;
+
+	return e;
 }
 
 // Add the buffer to the PACK
-void PackAddBuf(PACK *p, char *name, BUF *b)
+ELEMENT *PackAddBuf(PACK *p, char *name, BUF *b)
 {
 	// Validate arguments
 	if (p == NULL || name == NULL || b == NULL)
 	{
-		return;
+		return NULL;
 	}
 
-	PackAddData(p, name, b->Buf, b->Size);
+	return PackAddData(p, name, b->Buf, b->Size);
 }
 
 // Add the data to the PACK
-void PackAddData(PACK *p, char *name, void *data, UINT size)
+ELEMENT *PackAddData(PACK *p, char *name, void *data, UINT size)
 {
 	VALUE *v;
+	ELEMENT *e;
 	// Validate arguments
 	if (p == NULL || data == NULL || name == NULL)
 	{
-		return;
+		return NULL;
 	}
 
 	v = NewDataValue(data, size);
-	AddElement(p, NewElement(name, VALUE_DATA, 1, &v));
+	e = NewElement(name, VALUE_DATA, 1, &v);
+	if (AddElement(p, e) == false)
+	{
+		return NULL;
+	}
+
+	return e;
 }
 
 // Add a 64 bit integer (array) to the PACK
-void PackAddInt64Ex(PACK *p, char *name, UINT64 i, UINT index, UINT total)
+ELEMENT *PackAddInt64Ex(PACK *p, char *name, UINT64 i, UINT index, UINT total)
 {
 	VALUE *v;
 	ELEMENT *e;
 	// Validate arguments
 	if (p == NULL || name == NULL || total == 0)
 	{
-		return;
+		return NULL;
 	}
 
 	v = NewInt64Value(i);
 	e = GetElement(p, name, VALUE_INT64);
 	if (e != NULL)
 	{
-		if (e->num_value <= total)
+		if (e->num_value >= total)
 		{
+			FreeValue(e->values[index], VALUE_INT64);
 			e->values[index] = v;
 		}
 		else
@@ -1546,27 +1649,36 @@ void PackAddInt64Ex(PACK *p, char *name, UINT64 i, UINT index, UINT total)
 		e->type = VALUE_INT64;
 		e->values = ZeroMallocEx(sizeof(VALUE *) * total, true);
 		e->values[index] = v;
-		AddElement(p, e);
+
+		if (AddElement(p, e) == false)
+		{
+			return NULL;
+		}
 	}
+
+	e->JsonHint_IsArray = true;
+
+	return e;
 }
 
 // Add an integer to the PACK (array)
-void PackAddIntEx(PACK *p, char *name, UINT i, UINT index, UINT total)
+ELEMENT *PackAddIntEx(PACK *p, char *name, UINT i, UINT index, UINT total)
 {
 	VALUE *v;
 	ELEMENT *e;
 	// Validate arguments
 	if (p == NULL || name == NULL || total == 0)
 	{
-		return;
+		return NULL;
 	}
 
 	v = NewIntValue(i);
 	e = GetElement(p, name, VALUE_INT);
 	if (e != NULL)
 	{
-		if (e->num_value <= total)
+		if (e->num_value >= total)
 		{
+			FreeValue(e->values[index], VALUE_INT);
 			e->values[index] = v;
 		}
 		else
@@ -1582,61 +1694,103 @@ void PackAddIntEx(PACK *p, char *name, UINT i, UINT index, UINT total)
 		e->type = VALUE_INT;
 		e->values = ZeroMallocEx(sizeof(VALUE *) * total, true);
 		e->values[index] = v;
-		AddElement(p, e);
+
+		if (AddElement(p, e) == false)
+		{
+			return NULL;
+		}
 	}
+
+	e->JsonHint_IsArray = true;
+
+	return e;
 }
 
+// Add 64 bit integer time value to the PACK
+ELEMENT *PackAddTime64(PACK *p, char *name, UINT64 i)
+{
+	ELEMENT *e = PackAddInt64(p, name, i);
+	if (e != NULL)
+	{
+		e->JsonHint_IsDateTime = true;
+	}
+	return e;
+}
+ELEMENT *PackAddTime64Ex(PACK *p, char *name, UINT64 i, UINT index, UINT total)
+{
+	ELEMENT *e = PackAddInt64Ex(p, name, i, index, total);
+	if (e != NULL)
+	{
+		e->JsonHint_IsDateTime = true;
+	}
+	return e;
+}
+
+
 // Add a 64 bit integer to the PACK
-void PackAddInt64(PACK *p, char *name, UINT64 i)
+ELEMENT *PackAddInt64(PACK *p, char *name, UINT64 i)
 {
 	VALUE *v;
+	ELEMENT *e;
 	// Validate arguments
 	if (p == NULL || name == NULL)
 	{
-		return;
+		return NULL;
 	}
 
 	v = NewInt64Value(i);
-	AddElement(p, NewElement(name, VALUE_INT64, 1, &v));
+	e = NewElement(name, VALUE_INT64, 1, &v);
+	if (AddElement(p, e) == false)
+	{
+		return NULL;
+	}
+	return e;
 }
 
 // Add the number of items to the PACK
-void PackAddNum(PACK *p, char *name, UINT num)
+ELEMENT *PackAddNum(PACK *p, char *name, UINT num)
 {
-	PackAddInt(p, name, num);
+	return PackAddInt(p, name, num);
 }
 
 // Add an integer to the PACK
-void PackAddInt(PACK *p, char *name, UINT i)
+ELEMENT *PackAddInt(PACK *p, char *name, UINT i)
 {
 	VALUE *v;
+	ELEMENT *e = NULL;
 	// Validate arguments
 	if (p == NULL || name == NULL)
 	{
-		return;
+		return NULL;
 	}
 
 	v = NewIntValue(i);
-	AddElement(p, NewElement(name, VALUE_INT, 1, &v));
+	e = NewElement(name, VALUE_INT, 1, &v);
+	if (AddElement(p, e) == false)
+	{
+		return NULL;
+	}
+	return e;
 }
 
 // Add a Unicode string (array) to the PACK
-void PackAddUniStrEx(PACK *p, char *name, wchar_t *unistr, UINT index, UINT total)
+ELEMENT *PackAddUniStrEx(PACK *p, char *name, wchar_t *unistr, UINT index, UINT total)
 {
 	VALUE *v;
 	ELEMENT *e;
 	// Validate arguments
 	if (p == NULL || name == NULL || unistr == NULL || total == 0)
 	{
-		return;
+		return NULL;
 	}
 
 	v = NewUniStrValue(unistr);
 	e = GetElement(p, name, VALUE_UNISTR);
 	if (e != NULL)
 	{
-		if (e->num_value <= total)
+		if (e->num_value >= total)
 		{
+			FreeValue(e->values[index], VALUE_UNISTR);
 			e->values[index] = v;
 		}
 		else
@@ -1652,41 +1806,55 @@ void PackAddUniStrEx(PACK *p, char *name, wchar_t *unistr, UINT index, UINT tota
 		e->type = VALUE_UNISTR;
 		e->values = ZeroMallocEx(sizeof(VALUE *) * total, true);
 		e->values[index] = v;
-		AddElement(p, e);
+		if (AddElement(p, e) == false)
+		{
+			return NULL;
+		}
 	}
+
+	e->JsonHint_IsArray = true;
+
+	return e;
 }
 
 // Add a Unicode string to the PACK
-void PackAddUniStr(PACK *p, char *name, wchar_t *unistr)
+ELEMENT *PackAddUniStr(PACK *p, char *name, wchar_t *unistr)
 {
 	VALUE *v;
+	ELEMENT *e = NULL;
 	// Validate arguments
 	if (p == NULL || name == NULL || unistr == NULL)
 	{
-		return;
+		return NULL;
 	}
 
 	v = NewUniStrValue(unistr);
-	AddElement(p, NewElement(name, VALUE_UNISTR, 1, &v));
+	e = NewElement(name, VALUE_UNISTR, 1, &v);
+	if (AddElement(p, e) == false)
+	{
+		return NULL;
+	}
+	return e;
 }
 
 // Add a string to the PACK (array)
-void PackAddStrEx(PACK *p, char *name, char *str, UINT index, UINT total)
+ELEMENT *PackAddStrEx(PACK *p, char *name, char *str, UINT index, UINT total)
 {
 	VALUE *v;
 	ELEMENT *e;
 	// Validate arguments
 	if (p == NULL || name == NULL || str == NULL || total == 0)
 	{
-		return;
+		return NULL;
 	}
 
 	v = NewStrValue(str);
 	e = GetElement(p, name, VALUE_STR);
 	if (e != NULL)
 	{
-		if (e->num_value <= total)
+		if (e->num_value >= total)
 		{
+			FreeValue(e->values[index], VALUE_STR);
 			e->values[index] = v;
 		}
 		else
@@ -1702,22 +1870,704 @@ void PackAddStrEx(PACK *p, char *name, char *str, UINT index, UINT total)
 		e->type = VALUE_STR;
 		e->values = ZeroMallocEx(sizeof(VALUE *) * total, true);
 		e->values[index] = v;
-		AddElement(p, e);
+		if (AddElement(p, e) == false)
+		{
+			return NULL;
+		}
 	}
+
+	e->JsonHint_IsArray = true;
+
+	return e;
 }
 
 // Add a string to the PACK
-void PackAddStr(PACK *p, char *name, char *str)
+ELEMENT *PackAddStr(PACK *p, char *name, char *str)
 {
 	VALUE *v;
+	ELEMENT *e = NULL;
 	// Validate arguments
 	if (p == NULL || name == NULL || str == NULL)
 	{
-		return;
+		return NULL;
 	}
 
 	v = NewStrValue(str);
-	AddElement(p, NewElement(name, VALUE_STR, 1, &v));
+	e = NewElement(name, VALUE_STR, 1, &v);
+	if (AddElement(p, e) == false)
+	{
+		return NULL;
+	}
+	return e;
+}
+
+// Add an element of PACK array to JSON Array
+void PackArrayElementToJsonArray(JSON_ARRAY *ja, PACK *p, ELEMENT *e, UINT index)
+{
+	if (ja == NULL || p == NULL || e == NULL || index >= e->num_value)
+	{
+		return;
+	}
+
+	switch (e->type)
+	{
+	case VALUE_INT:
+		if (e->JsonHint_IsIP)
+		{
+			if (InStr(e->name, "@") == false)
+			{
+				IP ip;
+				if (PackGetIpEx(p, e->name, &ip, index))
+				{
+					char ip_str[64];
+					IPToStr(ip_str, sizeof(ip_str), &ip);
+					JsonArrayAddStr(ja, ip_str);
+				}
+			}
+		}
+		else if (e->JsonHint_IsBool)
+		{
+			JsonArrayAddBool(ja, PackGetBoolEx(p, e->name, index));
+		}
+		else
+		{
+			JsonArrayAddNumber(ja, PackGetIntEx(p, e->name, index));
+		}
+		break;
+	case VALUE_INT64:
+		if (e->JsonHint_IsIP == false)
+		{
+			if (e->JsonHint_IsDateTime == false)
+			{
+				JsonArrayAddNumber(ja, PackGetInt64Ex(p, e->name, index));
+			}
+			else
+			{
+				char dtstr[64];
+
+				SystemTime64ToJsonStr(dtstr, sizeof(dtstr), PackGetInt64Ex(p, e->name, index));
+				JsonArrayAddStr(ja, dtstr);
+			}
+		}
+		break;
+	case VALUE_DATA:
+		if (e->JsonHint_IsIP == false)
+		{
+			BUF *buf = PackGetBufEx(p, e->name, index);
+			if (buf != NULL)
+			{
+				JsonArrayAddData(ja, buf->Buf, buf->Size);
+				FreeBuf(buf);
+			}
+			else
+			{
+				UCHAR zero = 0;
+				JsonArrayAddData(ja, &zero, 0);
+			}
+		}
+		break;
+	case VALUE_STR:
+		if (e->JsonHint_IsIP == false)
+		{
+			if (e->values[index] != NULL)
+			{
+				JsonArrayAddStr(ja, e->values[index]->Str);
+			}
+			else
+			{
+				JsonArrayAddStr(ja, "");
+			}
+		}
+		break;
+	case VALUE_UNISTR:
+		if (e->JsonHint_IsIP == false)
+		{
+			if (e->values[index] != NULL)
+			{
+				JsonArrayAddUniStr(ja, e->values[index]->UniStr);
+			}
+			else
+			{
+				JsonArrayAddUniStr(ja, L"");
+			}
+		}
+		break;
+	}
+}
+
+// Add an element of PACK to JSON Object
+void PackElementToJsonObject(JSON_OBJECT *o, PACK *p, ELEMENT *e, UINT index)
+{
+	char *suffix;
+	char name[MAX_PATH];
+	if (o == NULL || p == NULL || e == NULL)
+	{
+		return;
+	}
+
+	suffix = DetermineJsonSuffixForPackElement(e);
+
+	if (suffix == NULL)
+	{
+		return;
+	}
+
+	StrCpy(name, sizeof(name), e->name);
+	StrCat(name, sizeof(name), suffix);
+
+	switch (e->type)
+	{
+	case VALUE_INT:
+		if (e->JsonHint_IsIP)
+		{
+			if (InStr(e->name, "@") == false)
+			{
+				IP ip;
+				if (PackGetIpEx(p, e->name, &ip, index))
+				{
+					char ip_str[64];
+					IPToStr(ip_str, sizeof(ip_str), &ip);
+					JsonSetStr(o, name, ip_str);
+				}
+			}
+		}
+		else if (e->JsonHint_IsBool)
+		{
+			JsonSetBool(o, name, PackGetBoolEx(p, e->name, index));
+		}
+		else
+		{
+			JsonSetNumber(o, name, PackGetIntEx(p, e->name, index));
+		}
+		break;
+	case VALUE_INT64:
+		if (e->JsonHint_IsIP == false)
+		{
+			if (e->JsonHint_IsDateTime == false)
+			{
+				JsonSetNumber(o, name, PackGetInt64Ex(p, e->name, index));
+			}
+			else
+			{
+				char dtstr[64];
+
+				SystemTime64ToJsonStr(dtstr, sizeof(dtstr), PackGetInt64Ex(p, e->name, index));
+				JsonSetStr(o, name, dtstr);
+			}
+		}
+		break;
+	case VALUE_DATA:
+		if (e->JsonHint_IsIP == false)
+		{
+			BUF *buf = PackGetBufEx(p, e->name, index);
+			if (buf != NULL)
+			{
+				JsonSetData(o, name, buf->Buf, buf->Size);
+				FreeBuf(buf);
+			}
+			else
+			{
+				UCHAR zero = 0;
+				JsonSetData(o, name, &zero, 0);
+			}
+		}
+		break;
+	case VALUE_STR:
+		if (e->JsonHint_IsIP == false)
+		{
+			if (e->values[index] != NULL)
+			{
+				JsonSetStr(o, name, e->values[index]->Str);
+			}
+			else
+			{
+				JsonSetStr(o, name, "");
+			}
+		}
+		break;
+	case VALUE_UNISTR:
+		if (e->JsonHint_IsIP == false)
+		{
+			if (e->values[index] != NULL)
+			{
+				JsonSetUniStr(o, name, e->values[index]->UniStr);
+			}
+			else
+			{
+				JsonSetUniStr(o, name, L"");
+			}
+		}
+		break;
+	}
+}
+
+// Determine JSON element suffix for PACK element
+char *DetermineJsonSuffixForPackElement(ELEMENT *e)
+{
+	switch (e->type)
+	{
+	case VALUE_INT:
+		if (e->JsonHint_IsIP)
+		{
+			if (InStr(e->name, "@") == false)
+			{
+				return "_ip";
+			}
+		}
+		else if (e->JsonHint_IsBool)
+		{
+			return "_bool";
+		}
+		else
+		{
+			return "_u32";
+		}
+		break;
+	case VALUE_INT64:
+		if (e->JsonHint_IsIP == false)
+		{
+			if (e->JsonHint_IsDateTime == false)
+			{
+				return "_u64";
+			}
+			else
+			{
+				return "_dt";
+			}
+		}
+		break;
+	case VALUE_DATA:
+		if (e->JsonHint_IsIP == false)
+		{
+			return "_bin";
+		}
+		break;
+	case VALUE_STR:
+		if (e->JsonHint_IsIP == false)
+		{
+			return "_str";
+		}
+		break;
+	case VALUE_UNISTR:
+		if (e->JsonHint_IsIP == false)
+		{
+			return "_utf";
+		}
+		break;
+	}
+
+	return NULL;
 }
 
+// Convert JSON to PACK
+PACK *JsonToPack(JSON_VALUE *v)
+{
+	PACK *p = NULL;
+	JSON_OBJECT *jo;
+	if (v == NULL)
+	{
+		return NULL;
+	}
+
+	p = NewPack();
+
+	jo = JsonValueGetObject(v);
+
+	if (jo != NULL)
+	{
+		UINT i;
+		for (i = 0;i < jo->count;i++)
+		{
+			char *name = jo->names[i];
+			JSON_VALUE *value = jo->values[i];
+
+			if (value->type == JSON_TYPE_ARRAY)
+			{
+				UINT j;
+				JSON_ARRAY *ja = value->value.array;
+
+				for (j = 0;j < ja->count;j++)
+				{
+					if (ja->items[j]->type != JSON_TYPE_OBJECT)
+					{
+						JsonTryParseValueAddToPack(p, ja->items[j], name, j, ja->count, false);
+					}
+					else
+					{
+						JSON_VALUE *v = ja->items[j];
+						JSON_OBJECT *o = v->value.object;
+						UINT k;
+
+						for (k = 0;k < o->count;k++)
+						{
+							char *name2 = o->names[k];
+							JSON_VALUE *value2 = o->values[k];
+
+							PackSetCurrentJsonGroupName(p, name);
+							JsonTryParseValueAddToPack(p, value2, name2, j, ja->count, false);
+							PackSetCurrentJsonGroupName(p, NULL);
+						}
+					}
+				}
+			}
+			else
+			{
+				JsonTryParseValueAddToPack(p, value, name, 0, 1, true);
+			}
+		}
+	}
+
+	return p;
+}
+
+ELEMENT *ElementNullSafe(ELEMENT *p)
+{
+	static ELEMENT dummy;
+	if (p == NULL)
+	{
+		Zero(&dummy, sizeof(dummy));
+		return &dummy;
+	}
+	return p;
+}
+
+bool JsonTryParseValueAddToPack(PACK *p, JSON_VALUE *v, char *v_name, UINT index, UINT total, bool is_single)
+{
+	char name[MAX_PATH];
+	bool ok = true;
+	if (p == NULL || v == NULL)
+	{
+		return false;
+	}
+
+	if (TrimEndWith(name, sizeof(name), v_name, "_bool"))
+	{
+		if (v->type == JSON_TYPE_BOOL)
+		{
+			ElementNullSafe(PackAddBoolEx(p, name, MAKEBOOL(v->value.boolean), index, total))->JsonHint_IsArray = !is_single;
+			ok = true;
+		}
+		else if (v->type == JSON_TYPE_NUMBER)
+		{
+			ElementNullSafe(PackAddBoolEx(p, name, MAKEBOOL(v->value.number), index, total))->JsonHint_IsArray = !is_single;
+			ok = true;
+		}
+		else if (v->type == JSON_TYPE_STRING)
+		{
+			ElementNullSafe(PackAddBoolEx(p, name, ToBool(v->value.string), index, total))->JsonHint_IsArray = !is_single;
+			ok = true;
+		}
+	}
+	else if (TrimEndWith(name, sizeof(name), v_name, "_u32"))
+	{
+		if (v->type == JSON_TYPE_BOOL)
+		{
+			ElementNullSafe(PackAddIntEx(p, name, MAKEBOOL(v->value.boolean), index, total))->JsonHint_IsArray = !is_single;
+			ok = true;
+		}
+		else if (v->type == JSON_TYPE_NUMBER)
+		{
+			ElementNullSafe(PackAddIntEx(p, name, (UINT)v->value.number, index, total))->JsonHint_IsArray = !is_single;
+			ok = true;
+		}
+		else if (v->type == JSON_TYPE_STRING)
+		{
+			ElementNullSafe(PackAddIntEx(p, name, ToInt(v->value.string), index, total))->JsonHint_IsArray = !is_single;
+			ok = true;
+		}
+	}
+	else if (TrimEndWith(name, sizeof(name), v_name, "_u64"))
+	{
+		if (v->type == JSON_TYPE_BOOL)
+		{
+			ElementNullSafe(PackAddInt64Ex(p, name, MAKEBOOL(v->value.boolean), index, total))->JsonHint_IsArray = !is_single;
+			ok = true;
+		}
+		else if (v->type == JSON_TYPE_NUMBER)
+		{
+			ElementNullSafe(PackAddInt64Ex(p, name, v->value.number, index, total))->JsonHint_IsArray = !is_single;
+			ok = true;
+		}
+		else if (v->type == JSON_TYPE_STRING)
+		{
+			ElementNullSafe(PackAddInt64Ex(p, name, ToInt64(v->value.string), index, total))->JsonHint_IsArray = !is_single;
+			ok = true;
+		}
+	}
+	else if (TrimEndWith(name, sizeof(name), v_name, "_str"))
+	{
+		if (v->type == JSON_TYPE_BOOL)
+		{
+			ElementNullSafe(PackAddStrEx(p, name, MAKEBOOL(v->value.boolean) ? "true" : "false", index, total))->JsonHint_IsArray = !is_single;
+			ok = true;
+		}
+		else if (v->type == JSON_TYPE_NUMBER)
+		{
+			char tmp[64];
+			ToStr64(tmp, v->value.number);
+			ElementNullSafe(PackAddStrEx(p, name, tmp, index, total))->JsonHint_IsArray = !is_single;
+			ok = true;
+		}
+		else if (v->type == JSON_TYPE_STRING)
+		{
+			ElementNullSafe(PackAddStrEx(p, name, v->value.string, index, total))->JsonHint_IsArray = !is_single;
+			ok = true;
+		}
+	}
+	else if (TrimEndWith(name, sizeof(name), v_name, "_utf"))
+	{
+		if (v->type == JSON_TYPE_BOOL)
+		{
+			ElementNullSafe(PackAddUniStrEx(p, name, MAKEBOOL(v->value.boolean) ? L"true" : L"false", index, total))->JsonHint_IsArray = !is_single;
+			ok = true;
+		}
+		else if (v->type == JSON_TYPE_NUMBER)
+		{
+			char tmp[64];
+			wchar_t tmp2[64];
+			ToStr64(tmp, v->value.number);
+			StrToUni(tmp2, sizeof(tmp2), tmp);
+			ElementNullSafe(PackAddUniStrEx(p, name, tmp2, index, total))->JsonHint_IsArray = !is_single;
+			ok = true;
+		}
+		else if (v->type == JSON_TYPE_STRING)
+		{
+			wchar_t *uni = CopyUtfToUni(v->value.string);
+			ElementNullSafe(PackAddUniStrEx(p, name, uni, index, total))->JsonHint_IsArray = !is_single;
+			Free(uni);
+			ok = true;
+		}
+	}
+	else if (TrimEndWith(name, sizeof(name), v_name, "_bin"))
+	{
+		if (v->type == JSON_TYPE_STRING)
+		{
+			UINT len = StrLen(v->value.string);
+			UCHAR *data = ZeroMalloc(len * 4 + 64);
+			UINT size = B64_Decode(data, v->value.string, len);
+			ElementNullSafe(PackAddDataEx(p, name, data, size, index, total))->JsonHint_IsArray = !is_single;
+			Free(data);
+			ok = true;
+		}
+	}
+	else if (TrimEndWith(name, sizeof(name), v_name, "_dt"))
+	{
+		if (v->type == JSON_TYPE_NUMBER)
+		{
+			ElementNullSafe(PackAddInt64Ex(p, name, v->value.number, index, total))->JsonHint_IsArray = !is_single;
+			ok = true;
+		}
+		else if (v->type == JSON_TYPE_STRING)
+		{
+			UINT64 time = DateTimeStrRFC3339ToSystemTime64(v->value.string);
+			ELEMENT *e = PackAddInt64Ex(p, name, time, index, total);
+			if (e != NULL)
+			{
+				e->JsonHint_IsArray = !is_single;
+				e->JsonHint_IsDateTime = true;
+			}
+			ok = true;
+		}
+	}
+	else if (TrimEndWith(name, sizeof(name), v_name, "_ip"))
+	{
+		if (v->type == JSON_TYPE_STRING)
+		{
+			IP ip;
+			if (StrToIP(&ip, v->value.string))
+			{
+				PackAddIpEx2(p, name, &ip, index, total, is_single);
+				ok = true;
+			}
+		}
+	}
+
+	return ok;
+}
+
+// Convert JSON string to PACK
+PACK *JsonStrToPack(char *str)
+{
+	JSON_VALUE *v = StrToJson(str);
+	PACK *ret;
+
+	if (v == NULL)
+	{
+		return NULL;
+	}
+
+	ret = JsonToPack(v);
+
+	JsonFree(v);
+
+	return ret;
+}
+
+// Convert PACK to JSON string
+char *PackToJsonStr(PACK *p)
+{
+	char *ret;
+	JSON_VALUE *json = PackToJson(p);
+
+	ret = JsonToStr(json);
+
+	JsonFree(json);
+
+	return ret;
+}
+
+// Convert PACK to JSON
+JSON_VALUE *PackToJson(PACK *p)
+{
+	JSON_VALUE *v;
+	JSON_OBJECT *o;
+	UINT i, j, k;
+	LIST *json_group_id_list;
+	if (p == NULL)
+	{
+		return JsonNewObject();
+	}
+
+	// suppress quick sort in the enumeration process
+	GetElement(p, "_dummy_", VALUE_INT);
+
+	json_group_id_list = NewStrList();
+
+	for (i = 0;i < LIST_NUM(p->elements);i++)
+	{
+		ELEMENT *e = LIST_DATA(p->elements, i);
+
+		if (e->num_value >= 2 || e->JsonHint_IsArray)
+		{
+			if (IsEmptyStr(e->JsonHint_GroupName) == false)
+			{
+				AddStrToStrListDistinct(json_group_id_list, e->JsonHint_GroupName);
+			}
+		}
+	}
+
+	for (i = 0;i < LIST_NUM(p->json_subitem_names);i++)
+	{
+		char *group_name = LIST_DATA(p->json_subitem_names, i);
+
+		if (IsEmptyStr(group_name) == false)
+		{
+			AddStrToStrListDistinct(json_group_id_list, group_name);
+		}
+	}
+
+	v = JsonNewObject();
+	o = JsonValueGetObject(v);
+
+	for (k = 0;k < LIST_NUM(json_group_id_list);k++)
+	{
+		char *group_name = LIST_DATA(json_group_id_list, k);
+		UINT array_count = INFINITE;
+		bool ok = true;
+
+		for (i = 0;i < LIST_NUM(p->elements);i++)
+		{
+			ELEMENT *e = LIST_DATA(p->elements, i);
+
+			if (e->num_value >= 2 || e->JsonHint_IsArray)
+			{
+				if (StrCmpi(e->JsonHint_GroupName, group_name) == 0)
+				{
+					if (array_count == INFINITE)
+					{
+						array_count = e->num_value;
+					}
+					else
+					{
+						if (array_count != e->num_value)
+						{
+							ok = false;
+						}
+					}
+				}
+			}
+		}
+
+		if (array_count == INFINITE)
+		{
+			array_count = 0;
+		}
+
+		if (ok)
+		{
+			JSON_VALUE **json_objects = ZeroMalloc(sizeof(void *) * array_count);
+			JSON_VALUE *jav = JsonNewArray();
+			JSON_ARRAY *ja = JsonArray(jav);
+
+			JsonSet(o, group_name, jav);
+
+			for (j = 0;j < array_count;j++)
+			{
+				json_objects[j] = JsonNewObject();
+
+				JsonArrayAdd(ja, json_objects[j]);
+			}
+
+			for (i = 0;i < LIST_NUM(p->elements);i++)
+			{
+				ELEMENT *e = LIST_DATA(p->elements, i);
+
+				if (e->num_value >= 2 || e->JsonHint_IsArray)
+				{
+					if (StrCmpi(e->JsonHint_GroupName, group_name) == 0)
+					{
+						for (j = 0;j < e->num_value;j++)
+						{
+							PackElementToJsonObject(JsonValueGetObject(json_objects[j]),
+								p, e, j);
+						}
+					}
+				}
+			}
+
+			Free(json_objects);
+		}
+	}
+
+	for (i = 0;i < LIST_NUM(p->elements);i++)
+	{
+		ELEMENT *e = LIST_DATA(p->elements, i);
+
+		if (e->num_value >= 2 || e->JsonHint_IsArray)
+		{
+			if (IsEmptyStr(e->JsonHint_GroupName))
+			{
+				char *suffix = DetermineJsonSuffixForPackElement(e);
+
+				if (suffix != NULL)
+				{
+					JSON_VALUE *jav = JsonNewArray();
+					JSON_ARRAY *ja = JsonArray(jav);
+					char name[MAX_PATH];
+
+					for (j = 0;j < e->num_value;j++)
+					{
+						PackArrayElementToJsonArray(ja, p, e, j);
+					}
+
+					StrCpy(name, sizeof(name), e->name);
+					StrCat(name, sizeof(name), suffix);
+
+					JsonSet(o, name, jav);
+				}
+			}
+		}
+		else if (e->num_value == 1)
+		{
+			PackElementToJsonObject(o, p, e, 0);
+		}
+	}
+
+	ReleaseStrList(json_group_id_list);
+
+	return v;
+}
+
+
+
 

+ 65 - 19
src/Mayaqua/Pack.h

@@ -152,12 +152,40 @@ struct ELEMENT
 	UINT num_value;			// Number of values (>=1)
 	UINT type;				// Type
 	VALUE **values;			// List of pointers to the value
+	bool JsonHint_IsArray;
+	bool JsonHint_IsBool;
+	bool JsonHint_IsDateTime;
+	bool JsonHint_IsIP;
+	char JsonHint_GroupName[MAX_ELEMENT_NAME_LEN + 1];
 };
 
+
+
 // PACK object
 struct PACK
 {
 	LIST *elements;			// Element list
+	LIST *json_subitem_names;	// JSON sub-item names
+	char CurrentJsonHint_GroupName[MAX_ELEMENT_NAME_LEN + 1];
+};
+
+
+#define MAX_JSONPACK_HINT_ITEMS			64
+#define JSONPACK_HINT_TYPE_ARRAY		1
+
+// JSON/PACK converter hint element
+struct JSONPACKHINT_ITEM
+{
+	UINT Type;
+	char ArrayNumNameInPack[MAX_ELEMENT_NAME_LEN + 1];
+	char ArrayMembersInPack[MAX_SIZE + 1];
+};
+
+// JSON/PACK converter hint
+struct JSONPACKHINT
+{
+	UINT NumHints;
+	JSONPACKHINT_ITEM Hints[MAX_JSONPACK_HINT_ITEMS];
 };
 
 
@@ -198,21 +226,23 @@ TOKEN_LIST *GetPackElementNames(PACK *p);
 
 X *PackGetX(PACK *p, char *name);
 K *PackGetK(PACK *p, char *name);
-void PackAddX(PACK *p, char *name, X *x);
-void PackAddK(PACK *p, char *name, K *k);
-void PackAddStr(PACK *p, char *name, char *str);
-void PackAddStrEx(PACK *p, char *name, char *str, UINT index, UINT total);
-void PackAddUniStr(PACK *p, char *name, wchar_t *unistr);
-void PackAddUniStrEx(PACK *p, char *name, wchar_t *unistr, UINT index, UINT total);
-void PackAddInt(PACK *p, char *name, UINT i);
-void PackAddNum(PACK *p, char *name, UINT num);
-void PackAddIntEx(PACK *p, char *name, UINT i, UINT index, UINT total);
-void PackAddInt64(PACK *p, char *name, UINT64 i);
-void PackAddInt64Ex(PACK *p, char *name, UINT64 i, UINT index, UINT total);
-void PackAddData(PACK *p, char *name, void *data, UINT size);
-void PackAddDataEx(PACK *p, char *name, void *data, UINT size, UINT index, UINT total);
-void PackAddBuf(PACK *p, char *name, BUF *b);
-void PackAddBufEx(PACK *p, char *name, BUF *b, UINT index, UINT total);
+ELEMENT *PackAddX(PACK *p, char *name, X *x);
+ELEMENT *PackAddK(PACK *p, char *name, K *k);
+ELEMENT *PackAddStr(PACK *p, char *name, char *str);
+ELEMENT *PackAddStrEx(PACK *p, char *name, char *str, UINT index, UINT total);
+ELEMENT *PackAddUniStr(PACK *p, char *name, wchar_t *unistr);
+ELEMENT *PackAddUniStrEx(PACK *p, char *name, wchar_t *unistr, UINT index, UINT total);
+ELEMENT *PackAddInt(PACK *p, char *name, UINT i);
+ELEMENT *PackAddNum(PACK *p, char *name, UINT num);
+ELEMENT *PackAddIntEx(PACK *p, char *name, UINT i, UINT index, UINT total);
+ELEMENT *PackAddInt64(PACK *p, char *name, UINT64 i);
+ELEMENT *PackAddInt64Ex(PACK *p, char *name, UINT64 i, UINT index, UINT total);
+ELEMENT *PackAddTime64(PACK *p, char *name, UINT64 i);
+ELEMENT *PackAddTime64Ex(PACK *p, char *name, UINT64 i, UINT index, UINT total);
+ELEMENT *PackAddData(PACK *p, char *name, void *data, UINT size);
+ELEMENT *PackAddDataEx(PACK *p, char *name, void *data, UINT size, UINT index, UINT total);
+ELEMENT *PackAddBuf(PACK *p, char *name, BUF *b);
+ELEMENT *PackAddBufEx(PACK *p, char *name, BUF *b, UINT index, UINT total);
 bool PackGetStr(PACK *p, char *name, char *str, UINT size);
 bool PackGetStrEx(PACK *p, char *name, char *str, UINT size, UINT index);
 bool PackGetUniStr(PACK *p, char *name, wchar_t *unistr, UINT size);
@@ -231,23 +261,39 @@ bool PackGetDataEx(PACK *p, char *name, void *data, UINT index);
 BUF *PackGetBuf(PACK *p, char *name);
 BUF *PackGetBufEx(PACK *p, char *name, UINT index);
 bool PackGetBool(PACK *p, char *name);
-void PackAddBool(PACK *p, char *name, bool b);
-void PackAddBoolEx(PACK *p, char *name, bool b, UINT index, UINT total);
+ELEMENT *PackAddBool(PACK *p, char *name, bool b);
+ELEMENT *PackAddBoolEx(PACK *p, char *name, bool b, UINT index, UINT total);
 bool PackGetBoolEx(PACK *p, char *name, UINT index);
 void PackAddIp(PACK *p, char *name, IP *ip);
 void PackAddIpEx(PACK *p, char *name, IP *ip, UINT index, UINT total);
+void PackAddIpEx2(PACK *p, char *name, IP *ip, UINT index, UINT total, bool is_single);
 bool PackGetIp(PACK *p, char *name, IP *ip);
 bool PackGetIpEx(PACK *p, char *name, IP *ip, UINT index);
 UINT PackGetIp32(PACK *p, char *name);
 UINT PackGetIp32Ex(PACK *p, char *name, UINT index);
 void PackAddIp32(PACK *p, char *name, UINT ip32);
 void PackAddIp32Ex(PACK *p, char *name, UINT ip32, UINT index, UINT total);
-void PackAddIp6AddrEx(PACK *p, char *name, IPV6_ADDR *addr, UINT index, UINT total);
+void PackAddIp32Ex2(PACK *p, char *name, UINT ip32, UINT index, UINT total, bool is_single);
+ELEMENT *PackAddIp6AddrEx(PACK *p, char *name, IPV6_ADDR *addr, UINT index, UINT total);
 bool PackGetIp6AddrEx(PACK *p, char *name, IPV6_ADDR *addr, UINT index);
-void PackAddIp6Addr(PACK *p, char *name, IPV6_ADDR *addr);
+ELEMENT *PackAddIp6Addr(PACK *p, char *name, IPV6_ADDR *addr);
 bool PackGetIp6Addr(PACK *p, char *name, IPV6_ADDR *addr);
 bool PackGetData2(PACK *p, char *name, void *data, UINT size);
 bool PackGetDataEx2(PACK *p, char *name, void *data, UINT size, UINT index);
 bool PackIsValueExists(PACK *p, char *name);
+void PackSetCurrentJsonGroupName(PACK *p, char *json_group_name);
+ELEMENT *ElementNullSafe(ELEMENT *p);
+
+JSON_VALUE *PackToJson(PACK *p);
+char *PackToJsonStr(PACK *p);
+
+PACK *JsonToPack(JSON_VALUE *v);
+PACK *JsonStrToPack(char *str);
+
+void PackArrayElementToJsonArray(JSON_ARRAY *ja, PACK *p, ELEMENT *e, UINT index);
+void PackElementToJsonObject(JSON_OBJECT *o, PACK *p, ELEMENT *e, UINT index);
+char *DetermineJsonSuffixForPackElement(ELEMENT *e);
+bool JsonTryParseValueAddToPack(PACK *p, JSON_VALUE *v, char *v_name, UINT index, UINT total, bool is_single);
+
 
 #endif	// PACK_H

+ 2110 - 0
src/Mayaqua/Str.c

@@ -108,6 +108,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <wchar.h>
+#include <ctype.h>
 #include <stdarg.h>
 #include <time.h>
 #include <errno.h>
@@ -133,6 +134,60 @@ static BYTESTR bytestr[] =
 	{0, "Bytes"},
 };
 
+// Decode URL string
+char *UrlDecode(char *url_str)
+{
+	UINT i, len;
+	BUF *b;
+	char *ret;
+	if (url_str == NULL)
+	{
+		return NULL;
+	}
+
+	len = StrLen(url_str);
+
+	b = NewBuf();
+
+	for (i = 0;i < len;i++)
+	{
+		char c = url_str[i];
+
+		if (c == '%' && ((i + 2) < len))
+		{
+			char hex_str[8];
+			UINT value;
+
+			hex_str[0] = url_str[i + 1];
+			hex_str[1] = url_str[i + 2];
+			hex_str[2] = 0;
+
+			value = HexToInt(hex_str);
+
+			WriteBufChar(b, (UCHAR)value);
+
+			i += 2;
+			continue;
+		}
+		else
+		{
+			if (c == '+')
+			{
+				c = ' ';
+			}
+			WriteBufChar(b, c);
+		}
+	}
+
+	WriteBufChar(b, 0);
+
+	ret = CopyStr(b->Buf);
+
+	FreeBuf(b);
+
+	return ret;
+}
+
 // Change the case of the string by the bit array
 void SetStrCaseAccordingToBits(char *str, UINT bits)
 {
@@ -1764,6 +1819,73 @@ UINT64 ToInt64(char *str)
 	return ret;
 }
 
+UINT64 Json_ToInt64Ex(char *str, char **endptr, bool *error)
+{
+	UINT i;
+	UINT64 ret = 0;
+	if (error != NULL) *error = true;
+	// Validate arguments
+	if (str == NULL)
+	{
+		if (endptr != NULL)
+		{
+			*endptr = NULL;
+		}
+		return 0;
+	}
+
+	for (i = 0;;i++)
+	{
+		char c = str[i];
+		if (endptr != NULL)
+		{
+			*endptr = &str[i];
+		}
+		if (c == 0)
+		{
+			break;
+		}
+		if ('0' <= c && c <= '9')
+		{
+			ret = ret * (UINT64)10 + (UINT64)(c - '0');
+			if (error != NULL) *error = false;
+		}
+		else
+		{
+			break;
+		}
+	}
+
+	return ret;
+}
+
+// Trim EndWith
+bool TrimEndWith(char *dst, UINT dst_size, char *str, char *key)
+{
+	if (dst == NULL || str == NULL)
+	{
+		ClearStr(dst, dst_size);
+		return false;
+	}
+
+	StrCpy(dst, dst_size, str);
+
+	if (EndWith(str, key))
+	{
+		UINT src_len = StrLen(str);
+		UINT key_len = StrLen(key);
+
+		if (src_len >= key_len)
+		{
+			dst[src_len - key_len] = 0;
+		}
+
+		return true;
+	}
+
+	return false;
+}
+
 // Check whether the str ends with the key
 bool EndWith(char *str, char *key)
 {
@@ -3454,3 +3576,1991 @@ UINT StrLen(char *str)
 }
 
 
+// *** JSON strings support
+// Original source code from Parson ( http://kgabis.github.com/parson/ )
+// Modified by dnobori
+/*
+Parson ( http://kgabis.github.com/parson/ )
+Copyright (c) 2012 - 2017 Krzysztof Gabis
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+
+
+/* Apparently sscanf is not implemented in some "standard" libraries, so don't use it, if you
+* don't have to. */
+#define sscanf THINK_TWICE_ABOUT_USING_SSCANF
+
+#define STARTING_CAPACITY 16
+#define MAX_NESTING       2048
+#define FLOAT_FORMAT      "%1.17g"
+
+#define SIZEOF_TOKEN(a)       (sizeof(a) - 1)
+#define SKIP_CHAR(str)        ((*str)++)
+#define SKIP_WHITESPACES(str) while (isspace((unsigned char)(**str))) { SKIP_CHAR(str); }
+
+static JSON_Malloc_Function parson_malloc = Malloc;
+static JSON_Free_Function parson_free = Free;
+
+#define IS_CONT(b) (((unsigned char)(b) & 0xC0) == 0x80) /* is utf-8 continuation byte */
+
+/* Various */
+static void   remove_comments(char *string, char *start_token, char *end_token);
+static char * parson_strndup(char *string, UINT n);
+static char * parson_strdup(char *string);
+static int    hex_char_to_int(char c);
+static int    parse_utf16_hex(char *string, unsigned int *result);
+static int    num_bytes_in_utf8_sequence(unsigned char c);
+static int    verify_utf8_sequence(unsigned char *string, int *len);
+static int    is_valid_utf8(char *string, UINT string_len);
+static int    is_decimal(char *string, UINT length);
+
+/* JSON Object */
+static JSON_OBJECT * json_object_init(JSON_VALUE *wrapping_value);
+static UINT   json_object_add(JSON_OBJECT *object, char *name, JSON_VALUE *value);
+static UINT   json_object_resize(JSON_OBJECT *object, UINT new_capacity);
+static JSON_VALUE  * json_object_nget_value(JSON_OBJECT *object, char *name, UINT n);
+static void          json_object_free(JSON_OBJECT *object);
+
+/* JSON Array */
+static JSON_ARRAY * json_array_init(JSON_VALUE *wrapping_value);
+static UINT  json_array_add(JSON_ARRAY *array, JSON_VALUE *value);
+static UINT  json_array_resize(JSON_ARRAY *array, UINT new_capacity);
+static void         json_array_free(JSON_ARRAY *array);
+
+/* JSON Value */
+static JSON_VALUE * json_value_init_string_no_copy(char *string);
+
+/* Parser */
+static UINT  skip_quotes(char **string);
+static int          parse_utf16(char **unprocessed, char **processed);
+static char *       process_string(char *input, UINT len);
+static char *       get_quoted_string(char **string);
+static JSON_VALUE * parse_object_value(char **string, UINT nesting);
+static JSON_VALUE * parse_array_value(char **string, UINT nesting);
+static JSON_VALUE * parse_string_value(char **string);
+static JSON_VALUE * parse_boolean_value(char **string);
+static JSON_VALUE * parse_number_value(char **string);
+static JSON_VALUE * parse_null_value(char **string);
+static JSON_VALUE * parse_value(char **string, UINT nesting);
+
+/* Serialization */
+static int    json_serialize_to_buffer_r(JSON_VALUE *value, char *buf, int level, int is_pretty, char *num_buf);
+static int    json_serialize_string(char *string, char *buf);
+static int    append_indent(char *buf, int level);
+static int    append_string(char *buf, char *string);
+
+/* Various */
+static char * parson_strndup(char *string, UINT n) {
+	char *output_string = (char*)parson_malloc(n + 1);
+	if (!output_string) {
+		return NULL;
+	}
+	output_string[n] = '\0';
+	strncpy(output_string, string, n);
+	return output_string;
+}
+
+static char * parson_strdup(char *string) {
+	return parson_strndup(string, StrLen(string));
+}
+
+static int hex_char_to_int(char c) {
+	if (c >= '0' && c <= '9') {
+		return c - '0';
+	}
+	else if (c >= 'a' && c <= 'f') {
+		return c - 'a' + 10;
+	}
+	else if (c >= 'A' && c <= 'F') {
+		return c - 'A' + 10;
+	}
+	return -1;
+}
+
+static int parse_utf16_hex(char *s, unsigned int *result) {
+	int x1, x2, x3, x4;
+	if (s[0] == '\0' || s[1] == '\0' || s[2] == '\0' || s[3] == '\0') {
+		return 0;
+	}
+	x1 = hex_char_to_int(s[0]);
+	x2 = hex_char_to_int(s[1]);
+	x3 = hex_char_to_int(s[2]);
+	x4 = hex_char_to_int(s[3]);
+	if (x1 == -1 || x2 == -1 || x3 == -1 || x4 == -1) {
+		return 0;
+	}
+	*result = (unsigned int)((x1 << 12) | (x2 << 8) | (x3 << 4) | x4);
+	return 1;
+}
+
+static int num_bytes_in_utf8_sequence(unsigned char c) {
+	if (c == 0xC0 || c == 0xC1 || c > 0xF4 || IS_CONT(c)) {
+		return 0;
+	}
+	else if ((c & 0x80) == 0) {    /* 0xxxxxxx */
+		return 1;
+	}
+	else if ((c & 0xE0) == 0xC0) { /* 110xxxxx */
+		return 2;
+	}
+	else if ((c & 0xF0) == 0xE0) { /* 1110xxxx */
+		return 3;
+	}
+	else if ((c & 0xF8) == 0xF0) { /* 11110xxx */
+		return 4;
+	}
+	return 0; /* won't happen */
+}
+
+static int verify_utf8_sequence(unsigned char *string, int *len) {
+	unsigned int cp = 0;
+	*len = num_bytes_in_utf8_sequence(string[0]);
+
+	if (*len == 1) {
+		cp = string[0];
+	}
+	else if (*len == 2 && IS_CONT(string[1])) {
+		cp = string[0] & 0x1F;
+		cp = (cp << 6) | (string[1] & 0x3F);
+	}
+	else if (*len == 3 && IS_CONT(string[1]) && IS_CONT(string[2])) {
+		cp = ((unsigned char)string[0]) & 0xF;
+		cp = (cp << 6) | (string[1] & 0x3F);
+		cp = (cp << 6) | (string[2] & 0x3F);
+	}
+	else if (*len == 4 && IS_CONT(string[1]) && IS_CONT(string[2]) && IS_CONT(string[3])) {
+		cp = string[0] & 0x7;
+		cp = (cp << 6) | (string[1] & 0x3F);
+		cp = (cp << 6) | (string[2] & 0x3F);
+		cp = (cp << 6) | (string[3] & 0x3F);
+	}
+	else {
+		return 0;
+	}
+
+	/* overlong encodings */
+	if ((cp < 0x80 && *len > 1) ||
+		(cp < 0x800 && *len > 2) ||
+		(cp < 0x10000 && *len > 3)) {
+			return 0;
+	}
+
+	/* invalid unicode */
+	if (cp > 0x10FFFF) {
+		return 0;
+	}
+
+	/* surrogate halves */
+	if (cp >= 0xD800 && cp <= 0xDFFF) {
+		return 0;
+	}
+
+	return 1;
+}
+
+static int is_valid_utf8(char *string, UINT string_len) {
+	int len = 0;
+	char *string_end = string + string_len;
+	while (string < string_end) {
+		if (!verify_utf8_sequence((unsigned char*)string, &len)) {
+			return 0;
+		}
+		string += len;
+	}
+	return 1;
+}
+
+static int is_decimal(char *string, UINT length) {
+	if (length > 1 && string[0] == '0' && string[1] != '.') {
+		return 0;
+	}
+	if (length > 2 && !strncmp(string, "-0", 2) && string[2] != '.') {
+		return 0;
+	}
+	while (length--) {
+		if (strchr("xX", string[length])) {
+			return 0;
+		}
+	}
+	return 1;
+}
+
+static void remove_comments(char *string, char *start_token, char *end_token) {
+	int in_string = 0, escaped = 0;
+	UINT i;
+	char *ptr = NULL, current_char;
+	UINT start_token_len = StrLen(start_token);
+	UINT end_token_len = StrLen(end_token);
+	if (start_token_len == 0 || end_token_len == 0) {
+		return;
+	}
+	while ((current_char = *string) != '\0') {
+		if (current_char == '\\' && !escaped) {
+			escaped = 1;
+			string++;
+			continue;
+		}
+		else if (current_char == '\"' && !escaped) {
+			in_string = !in_string;
+		}
+		else if (!in_string && strncmp(string, start_token, start_token_len) == 0) {
+			for (i = 0; i < start_token_len; i++) {
+				string[i] = ' ';
+			}
+			string = string + start_token_len;
+			ptr = strstr(string, end_token);
+			if (!ptr) {
+				return;
+			}
+			for (i = 0; i < (ptr - string) + end_token_len; i++) {
+				string[i] = ' ';
+			}
+			string = ptr + end_token_len - 1;
+		}
+		escaped = 0;
+		string++;
+	}
+}
+
+/* JSON Object */
+static JSON_OBJECT * json_object_init(JSON_VALUE *wrapping_value) {
+	JSON_OBJECT *new_obj = (JSON_OBJECT*)parson_malloc(sizeof(JSON_OBJECT));
+	if (new_obj == NULL) {
+		return NULL;
+	}
+	new_obj->wrapping_value = wrapping_value;
+	new_obj->names = (char**)NULL;
+	new_obj->values = (JSON_VALUE**)NULL;
+	new_obj->capacity = 0;
+	new_obj->count = 0;
+	return new_obj;
+}
+
+static UINT json_object_add(JSON_OBJECT *object, char *name, JSON_VALUE *value) {
+	UINT index = 0;
+	if (object == NULL || name == NULL || value == NULL) {
+		return JSON_RET_ERROR;
+	}
+	if (JsonGet(object, name) != NULL) {
+		return JSON_RET_ERROR;
+	}
+	if (object->count >= object->capacity) {
+		UINT new_capacity = MAX(object->capacity * 2, STARTING_CAPACITY);
+		if (json_object_resize(object, new_capacity) == JSON_RET_ERROR) {
+			return JSON_RET_ERROR;
+		}
+	}
+	index = object->count;
+	object->names[index] = parson_strdup(name);
+	if (object->names[index] == NULL) {
+		return JSON_RET_ERROR;
+	}
+	value->parent = JsonGetWrappingValue(object);
+	object->values[index] = value;
+	object->count++;
+	return JSON_RET_OK;
+}
+
+static UINT json_object_resize(JSON_OBJECT *object, UINT new_capacity) {
+	char **temp_names = NULL;
+	JSON_VALUE **temp_values = NULL;
+
+	if ((object->names == NULL && object->values != NULL) ||
+		(object->names != NULL && object->values == NULL) ||
+		new_capacity == 0) {
+			return JSON_RET_ERROR; /* Shouldn't happen */
+	}
+	temp_names = (char**)parson_malloc(new_capacity * sizeof(char*));
+	if (temp_names == NULL) {
+		return JSON_RET_ERROR;
+	}
+	temp_values = (JSON_VALUE**)parson_malloc(new_capacity * sizeof(JSON_VALUE*));
+	if (temp_values == NULL) {
+		parson_free(temp_names);
+		return JSON_RET_ERROR;
+	}
+	if (object->names != NULL && object->values != NULL && object->count > 0) {
+		memcpy(temp_names, object->names, object->count * sizeof(char*));
+		memcpy(temp_values, object->values, object->count * sizeof(JSON_VALUE*));
+	}
+	parson_free(object->names);
+	parson_free(object->values);
+	object->names = temp_names;
+	object->values = temp_values;
+	object->capacity = new_capacity;
+	return JSON_RET_OK;
+}
+
+static JSON_VALUE * json_object_nget_value(JSON_OBJECT *object, char *name, UINT n) {
+	UINT i, name_length;
+	for (i = 0; i < JsonGetCount(object); i++) {
+		name_length = StrLen(object->names[i]);
+		if (name_length != n) {
+			continue;
+		}
+		if (strncmp(object->names[i], name, n) == 0) {
+			return object->values[i];
+		}
+	}
+	return NULL;
+}
+
+static void json_object_free(JSON_OBJECT *object) {
+	UINT i;
+	for (i = 0; i < object->count; i++) {
+		parson_free(object->names[i]);
+		JsonFree(object->values[i]);
+	}
+	parson_free(object->names);
+	parson_free(object->values);
+	parson_free(object);
+}
+
+/* JSON Array */
+static JSON_ARRAY * json_array_init(JSON_VALUE *wrapping_value) {
+	JSON_ARRAY *new_array = (JSON_ARRAY*)parson_malloc(sizeof(JSON_ARRAY));
+	if (new_array == NULL) {
+		return NULL;
+	}
+	new_array->wrapping_value = wrapping_value;
+	new_array->items = (JSON_VALUE**)NULL;
+	new_array->capacity = 0;
+	new_array->count = 0;
+	return new_array;
+}
+
+static UINT json_array_add(JSON_ARRAY *array, JSON_VALUE *value) {
+	if (array->count >= array->capacity) {
+		UINT new_capacity = MAX(array->capacity * 2, STARTING_CAPACITY);
+		if (json_array_resize(array, new_capacity) == JSON_RET_ERROR) {
+			return JSON_RET_ERROR;
+		}
+	}
+	value->parent = JsonArrayGetWrappingValue(array);
+	array->items[array->count] = value;
+	array->count++;
+	return JSON_RET_OK;
+}
+
+static UINT json_array_resize(JSON_ARRAY *array, UINT new_capacity) {
+	JSON_VALUE **new_items = NULL;
+	if (new_capacity == 0) {
+		return JSON_RET_ERROR;
+	}
+	new_items = (JSON_VALUE**)parson_malloc(new_capacity * sizeof(JSON_VALUE*));
+	if (new_items == NULL) {
+		return JSON_RET_ERROR;
+	}
+	if (array->items != NULL && array->count > 0) {
+		memcpy(new_items, array->items, array->count * sizeof(JSON_VALUE*));
+	}
+	parson_free(array->items);
+	array->items = new_items;
+	array->capacity = new_capacity;
+	return JSON_RET_OK;
+}
+
+static void json_array_free(JSON_ARRAY *array) {
+	UINT i;
+	for (i = 0; i < array->count; i++) {
+		JsonFree(array->items[i]);
+	}
+	parson_free(array->items);
+	parson_free(array);
+}
+
+/* JSON Value */
+static JSON_VALUE * json_value_init_string_no_copy(char *string) {
+	JSON_VALUE *new_value = (JSON_VALUE*)parson_malloc(sizeof(JSON_VALUE));
+	if (!new_value) {
+		return NULL;
+	}
+	new_value->parent = NULL;
+	new_value->type = JSON_TYPE_STRING;
+	new_value->value.string = string;
+	return new_value;
+}
+
+/* Parser */
+static UINT skip_quotes(char **string) {
+	if (**string != '\"') {
+		return JSON_RET_ERROR;
+	}
+	SKIP_CHAR(string);
+	while (**string != '\"') {
+		if (**string == '\0') {
+			return JSON_RET_ERROR;
+		}
+		else if (**string == '\\') {
+			SKIP_CHAR(string);
+			if (**string == '\0') {
+				return JSON_RET_ERROR;
+			}
+		}
+		SKIP_CHAR(string);
+	}
+	SKIP_CHAR(string);
+	return JSON_RET_OK;
+}
+
+static int parse_utf16(char **unprocessed, char **processed) {
+	unsigned int cp, lead, trail;
+	int parse_succeeded = 0;
+	char *processed_ptr = *processed;
+	char *unprocessed_ptr = *unprocessed;
+	unprocessed_ptr++; /* skips u */
+	parse_succeeded = parse_utf16_hex(unprocessed_ptr, &cp);
+	if (!parse_succeeded) {
+		return JSON_RET_ERROR;
+	}
+	if (cp < 0x80) {
+		processed_ptr[0] = (char)cp; /* 0xxxxxxx */
+	}
+	else if (cp < 0x800) {
+		processed_ptr[0] = ((cp >> 6) & 0x1F) | 0xC0; /* 110xxxxx */
+		processed_ptr[1] = ((cp) & 0x3F) | 0x80; /* 10xxxxxx */
+		processed_ptr += 1;
+	}
+	else if (cp < 0xD800 || cp > 0xDFFF) {
+		processed_ptr[0] = ((cp >> 12) & 0x0F) | 0xE0; /* 1110xxxx */
+		processed_ptr[1] = ((cp >> 6) & 0x3F) | 0x80; /* 10xxxxxx */
+		processed_ptr[2] = ((cp) & 0x3F) | 0x80; /* 10xxxxxx */
+		processed_ptr += 2;
+	}
+	else if (cp >= 0xD800 && cp <= 0xDBFF) { /* lead surrogate (0xD800..0xDBFF) */
+		lead = cp;
+		unprocessed_ptr += 4; /* should always be within the buffer, otherwise previous sscanf would fail */
+		if (*unprocessed_ptr++ != '\\' || *unprocessed_ptr++ != 'u') {
+			return JSON_RET_ERROR;
+		}
+		parse_succeeded = parse_utf16_hex(unprocessed_ptr, &trail);
+		if (!parse_succeeded || trail < 0xDC00 || trail > 0xDFFF) { /* valid trail surrogate? (0xDC00..0xDFFF) */
+			return JSON_RET_ERROR;
+		}
+		cp = ((((lead - 0xD800) & 0x3FF) << 10) | ((trail - 0xDC00) & 0x3FF)) + 0x010000;
+		processed_ptr[0] = (((cp >> 18) & 0x07) | 0xF0); /* 11110xxx */
+		processed_ptr[1] = (((cp >> 12) & 0x3F) | 0x80); /* 10xxxxxx */
+		processed_ptr[2] = (((cp >> 6) & 0x3F) | 0x80); /* 10xxxxxx */
+		processed_ptr[3] = (((cp) & 0x3F) | 0x80); /* 10xxxxxx */
+		processed_ptr += 3;
+	}
+	else { /* trail surrogate before lead surrogate */
+		return JSON_RET_ERROR;
+	}
+	unprocessed_ptr += 3;
+	*processed = processed_ptr;
+	*unprocessed = unprocessed_ptr;
+	return JSON_RET_OK;
+}
+
+
+/* Copies and processes passed string up to supplied length.
+Example: "\u006Corem ipsum" -> lorem ipsum */
+static char* process_string(char *input, UINT len) {
+	char *input_ptr = input;
+	UINT initial_size = (len + 1) * sizeof(char);
+	UINT final_size = 0;
+	char *output = NULL, *output_ptr = NULL, *resized_output = NULL;
+	output = (char*)parson_malloc(initial_size);
+	if (output == NULL) {
+		goto error;
+	}
+	output_ptr = output;
+	while ((*input_ptr != '\0') && (UINT)(input_ptr - input) < len) {
+		if (*input_ptr == '\\') {
+			input_ptr++;
+			switch (*input_ptr) {
+			case '\"': *output_ptr = '\"'; break;
+			case '\\': *output_ptr = '\\'; break;
+			case '/':  *output_ptr = '/';  break;
+			case 'b':  *output_ptr = '\b'; break;
+			case 'f':  *output_ptr = '\f'; break;
+			case 'n':  *output_ptr = '\n'; break;
+			case 'r':  *output_ptr = '\r'; break;
+			case 't':  *output_ptr = '\t'; break;
+			case 'u':
+				if (parse_utf16(&input_ptr, &output_ptr) == JSON_RET_ERROR) {
+					goto error;
+				}
+				break;
+			default:
+				goto error;
+			}
+		}
+		else if ((unsigned char)*input_ptr < 0x20) {
+			goto error; /* 0x00-0x19 are invalid characters for json string (http://www.ietf.org/rfc/rfc4627.txt) */
+		}
+		else {
+			*output_ptr = *input_ptr;
+		}
+		output_ptr++;
+		input_ptr++;
+	}
+	*output_ptr = '\0';
+	/* resize to new length */
+	final_size = (UINT)(output_ptr - output) + 1;
+	/* todo: don't resize if final_size == initial_size */
+	resized_output = (char*)parson_malloc(final_size);
+	if (resized_output == NULL) {
+		goto error;
+	}
+	memcpy(resized_output, output, final_size);
+	parson_free(output);
+	return resized_output;
+error:
+	parson_free(output);
+	return NULL;
+}
+
+/* Return processed contents of a string between quotes and
+skips passed argument to a matching quote. */
+static char * get_quoted_string(char **string) {
+	char *string_start = *string;
+	UINT string_len = 0;
+	UINT status = skip_quotes(string);
+	if (status != JSON_RET_OK) {
+		return NULL;
+	}
+	string_len = (UINT)(*string - string_start - 2); /* length without quotes */
+	return process_string(string_start + 1, string_len);
+}
+
+static JSON_VALUE * parse_value(char **string, UINT nesting) {
+	if (nesting > MAX_NESTING) {
+		return NULL;
+	}
+	SKIP_WHITESPACES(string);
+	switch (**string) {
+	case '{':
+		return parse_object_value(string, nesting + 1);
+	case '[':
+		return parse_array_value(string, nesting + 1);
+	case '\"':
+		return parse_string_value(string);
+	case 'f': case 't':
+		return parse_boolean_value(string);
+	case '-':
+	case '0': case '1': case '2': case '3': case '4':
+	case '5': case '6': case '7': case '8': case '9':
+		return parse_number_value(string);
+	case 'n':
+		return parse_null_value(string);
+	default:
+		return NULL;
+	}
+}
+
+static JSON_VALUE * parse_object_value(char **string, UINT nesting) {
+	JSON_VALUE *output_value = JsonNewObject(), *new_value = NULL;
+	JSON_OBJECT *output_object = JsonValueGetObject(output_value);
+	char *new_key = NULL;
+	if (output_value == NULL || **string != '{') {
+		return NULL;
+	}
+	SKIP_CHAR(string);
+	SKIP_WHITESPACES(string);
+	if (**string == '}') { /* empty object */
+		SKIP_CHAR(string);
+		return output_value;
+	}
+	while (**string != '\0') {
+		new_key = get_quoted_string(string);
+		if (new_key == NULL) {
+			JsonFree(output_value);
+			return NULL;
+		}
+		SKIP_WHITESPACES(string);
+		if (**string != ':') {
+			parson_free(new_key);
+			JsonFree(output_value);
+			return NULL;
+		}
+		SKIP_CHAR(string);
+		new_value = parse_value(string, nesting);
+		if (new_value == NULL) {
+			parson_free(new_key);
+			JsonFree(output_value);
+			return NULL;
+		}
+		if (json_object_add(output_object, new_key, new_value) == JSON_RET_ERROR) {
+			parson_free(new_key);
+			JsonFree(new_value);
+			JsonFree(output_value);
+			return NULL;
+		}
+		parson_free(new_key);
+		SKIP_WHITESPACES(string);
+		if (**string != ',') {
+			break;
+		}
+		SKIP_CHAR(string);
+		SKIP_WHITESPACES(string);
+	}
+	SKIP_WHITESPACES(string);
+	if (**string != '}' || /* Trim object after parsing is over */
+		json_object_resize(output_object, JsonGetCount(output_object)) == JSON_RET_ERROR) {
+			JsonFree(output_value);
+			return NULL;
+	}
+	SKIP_CHAR(string);
+	return output_value;
+}
+
+static JSON_VALUE * parse_array_value(char **string, UINT nesting) {
+	JSON_VALUE *output_value = JsonNewArray(), *new_array_value = NULL;
+	JSON_ARRAY *output_array = JsonValueGetArray(output_value);
+	if (!output_value || **string != '[') {
+		return NULL;
+	}
+	SKIP_CHAR(string);
+	SKIP_WHITESPACES(string);
+	if (**string == ']') { /* empty array */
+		SKIP_CHAR(string);
+		return output_value;
+	}
+	while (**string != '\0') {
+		new_array_value = parse_value(string, nesting);
+		if (new_array_value == NULL) {
+			JsonFree(output_value);
+			return NULL;
+		}
+		if (json_array_add(output_array, new_array_value) == JSON_RET_ERROR) {
+			JsonFree(new_array_value);
+			JsonFree(output_value);
+			return NULL;
+		}
+		SKIP_WHITESPACES(string);
+		if (**string != ',') {
+			break;
+		}
+		SKIP_CHAR(string);
+		SKIP_WHITESPACES(string);
+	}
+	SKIP_WHITESPACES(string);
+	if (**string != ']' || /* Trim array after parsing is over */
+		json_array_resize(output_array, JsonArrayGetCount(output_array)) == JSON_RET_ERROR) {
+			JsonFree(output_value);
+			return NULL;
+	}
+	SKIP_CHAR(string);
+	return output_value;
+}
+
+static JSON_VALUE * parse_string_value(char **string) {
+	JSON_VALUE *value = NULL;
+	char *new_string = get_quoted_string(string);
+	if (new_string == NULL) {
+		return NULL;
+	}
+	value = json_value_init_string_no_copy(new_string);
+	if (value == NULL) {
+		parson_free(new_string);
+		return NULL;
+	}
+	return value;
+}
+
+static JSON_VALUE * parse_boolean_value(char **string) {
+	UINT true_token_size = SIZEOF_TOKEN("true");
+	UINT false_token_size = SIZEOF_TOKEN("false");
+	if (strncmp("true", *string, true_token_size) == 0) {
+		*string += true_token_size;
+		return JsonNewBool(1);
+	}
+	else if (strncmp("false", *string, false_token_size) == 0) {
+		*string += false_token_size;
+		return JsonNewBool(0);
+	}
+	return NULL;
+}
+
+static JSON_VALUE * parse_number_value(char **string) {
+	char *end;
+	bool error = false;
+	UINT64 number = 0;
+	number = Json_ToInt64Ex(*string, &end, &error);
+
+	if (error)
+	{
+		return NULL;
+	}
+	*string = end;
+	return JsonNewNumber(number);
+}
+
+static JSON_VALUE * parse_null_value(char **string) {
+	UINT token_size = SIZEOF_TOKEN("null");
+	if (strncmp("null", *string, token_size) == 0) {
+		*string += token_size;
+		return JsonNewNull();
+	}
+	return NULL;
+}
+
+/* Serialization */
+#define APPEND_STRING(str) do { written = append_string(buf, (str));\
+	if (written < 0) { return -1; }\
+	if (buf != NULL) { buf += written; }\
+	written_total += written; } while(0)
+
+#define APPEND_INDENT(level) do { written = append_indent(buf, (level));\
+	if (written < 0) { return -1; }\
+	if (buf != NULL) { buf += written; }\
+	written_total += written; } while(0)
+
+static int json_serialize_to_buffer_r(JSON_VALUE *value, char *buf, int level, int is_pretty, char *num_buf)
+{
+	char *key = NULL, *string = NULL;
+	JSON_VALUE *temp_value = NULL;
+	JSON_ARRAY *array = NULL;
+	JSON_OBJECT *object = NULL;
+	UINT i = 0, count = 0;
+	UINT64 num = 0;
+	int written = -1, written_total = 0;
+	char tmp[32];
+
+	switch (JsonValueGetType(value)) {
+	case JSON_TYPE_ARRAY:
+		array = JsonValueGetArray(value);
+		count = JsonArrayGetCount(array);
+		APPEND_STRING("[");
+		if (count > 0 && is_pretty) {
+			APPEND_STRING("\n");
+		}
+		for (i = 0; i < count; i++) {
+			if (is_pretty) {
+				APPEND_INDENT(level + 1);
+			}
+			temp_value = JsonArrayGet(array, i);
+			written = json_serialize_to_buffer_r(temp_value, buf, level + 1, is_pretty, num_buf);
+			if (written < 0) {
+				return -1;
+			}
+			if (buf != NULL) {
+				buf += written;
+			}
+			written_total += written;
+			if (i < (count - 1)) {
+				APPEND_STRING(",");
+			}
+			if (is_pretty) {
+				APPEND_STRING("\n");
+			}
+		}
+		if (count > 0 && is_pretty) {
+			APPEND_INDENT(level);
+		}
+		APPEND_STRING("]");
+		return written_total;
+	case JSON_TYPE_OBJECT:
+		object = JsonValueGetObject(value);
+		count = JsonGetCount(object);
+		APPEND_STRING("{");
+		if (count > 0 && is_pretty) {
+			APPEND_STRING("\n");
+		}
+		for (i = 0; i < count; i++) {
+			key = JsonGetName(object, i);
+			if (key == NULL) {
+				return -1;
+			}
+			if (is_pretty) {
+				APPEND_INDENT(level + 1);
+			}
+			written = json_serialize_string(key, buf);
+			if (written < 0) {
+				return -1;
+			}
+			if (buf != NULL) {
+				buf += written;
+			}
+			written_total += written;
+			APPEND_STRING(":");
+			if (is_pretty) {
+				APPEND_STRING(" ");
+			}
+			temp_value = JsonGet(object, key);
+			written = json_serialize_to_buffer_r(temp_value, buf, level + 1, is_pretty, num_buf);
+			if (written < 0) {
+				return -1;
+			}
+			if (buf != NULL) {
+				buf += written;
+			}
+			written_total += written;
+			if (i < (count - 1)) {
+				APPEND_STRING(",");
+			}
+			if (is_pretty) {
+				APPEND_STRING("\n");
+			}
+		}
+		if (count > 0 && is_pretty) {
+			APPEND_INDENT(level);
+		}
+		APPEND_STRING("}");
+		return written_total;
+	case JSON_TYPE_STRING:
+		string = JsonValueGetStr(value);
+		if (string == NULL) {
+			return -1;
+		}
+		written = json_serialize_string(string, buf);
+		if (written < 0) {
+			return -1;
+		}
+		if (buf != NULL) {
+			buf += written;
+		}
+		written_total += written;
+		return written_total;
+	case JSON_TYPE_BOOL:
+		if (JsonValueGetBool(value)) {
+			APPEND_STRING("true");
+		}
+		else {
+			APPEND_STRING("false");
+		}
+		return written_total;
+	case JSON_TYPE_NUMBER:
+		num = JsonValueGetNumber(value);
+		if (buf != NULL) {
+			num_buf = buf;
+		}
+		ToStr64(tmp, num);
+		Copy(num_buf, tmp, StrLen(tmp));
+		written = StrLen(tmp);
+		if (buf != NULL) {
+			buf += written;
+		}
+		written_total += written;
+		return written_total;
+	case JSON_TYPE_NULL:
+		APPEND_STRING("null");
+		return written_total;
+	case JSON_TYPE_ERROR:
+		return -1;
+	default:
+		return -1;
+	}
+}
+
+static int json_serialize_string(char *string, char *buf) {
+	UINT i = 0, len = StrLen(string);
+	char c = '\0';
+	int written = -1, written_total = 0;
+	APPEND_STRING("\"");
+	for (i = 0; i < len; i++) {
+		c = string[i];
+		switch (c) {
+		case '\"': APPEND_STRING("\\\""); break;
+		case '\\': APPEND_STRING("\\\\"); break;
+		case '/':  APPEND_STRING("\\/"); break; /* to make json embeddable in xml\/html */
+		case '\b': APPEND_STRING("\\b"); break;
+		case '\f': APPEND_STRING("\\f"); break;
+		case '\n': APPEND_STRING("\\n"); break;
+		case '\r': APPEND_STRING("\\r"); break;
+		case '\t': APPEND_STRING("\\t"); break;
+		case '\x00': APPEND_STRING("\\u0000"); break;
+		case '\x01': APPEND_STRING("\\u0001"); break;
+		case '\x02': APPEND_STRING("\\u0002"); break;
+		case '\x03': APPEND_STRING("\\u0003"); break;
+		case '\x04': APPEND_STRING("\\u0004"); break;
+		case '\x05': APPEND_STRING("\\u0005"); break;
+		case '\x06': APPEND_STRING("\\u0006"); break;
+		case '\x07': APPEND_STRING("\\u0007"); break;
+			/* '\x08' duplicate: '\b' */
+			/* '\x09' duplicate: '\t' */
+			/* '\x0a' duplicate: '\n' */
+		case '\x0b': APPEND_STRING("\\u000b"); break;
+			/* '\x0c' duplicate: '\f' */
+			/* '\x0d' duplicate: '\r' */
+		case '\x0e': APPEND_STRING("\\u000e"); break;
+		case '\x0f': APPEND_STRING("\\u000f"); break;
+		case '\x10': APPEND_STRING("\\u0010"); break;
+		case '\x11': APPEND_STRING("\\u0011"); break;
+		case '\x12': APPEND_STRING("\\u0012"); break;
+		case '\x13': APPEND_STRING("\\u0013"); break;
+		case '\x14': APPEND_STRING("\\u0014"); break;
+		case '\x15': APPEND_STRING("\\u0015"); break;
+		case '\x16': APPEND_STRING("\\u0016"); break;
+		case '\x17': APPEND_STRING("\\u0017"); break;
+		case '\x18': APPEND_STRING("\\u0018"); break;
+		case '\x19': APPEND_STRING("\\u0019"); break;
+		case '\x1a': APPEND_STRING("\\u001a"); break;
+		case '\x1b': APPEND_STRING("\\u001b"); break;
+		case '\x1c': APPEND_STRING("\\u001c"); break;
+		case '\x1d': APPEND_STRING("\\u001d"); break;
+		case '\x1e': APPEND_STRING("\\u001e"); break;
+		case '\x1f': APPEND_STRING("\\u001f"); break;
+		default:
+			if (buf != NULL) {
+				buf[0] = c;
+				buf += 1;
+			}
+			written_total += 1;
+			break;
+		}
+	}
+	APPEND_STRING("\"");
+	return written_total;
+}
+
+static int append_indent(char *buf, int level) {
+	int i;
+	int written = -1, written_total = 0;
+	for (i = 0; i < level; i++) {
+		APPEND_STRING("    ");
+	}
+	return written_total;
+}
+
+static int append_string(char *buf, char *string) {
+	if (buf == NULL) {
+		return (int)strlen(string);
+	}
+	return sprintf(buf, "%s", string);
+}
+
+#undef APPEND_STRING
+#undef APPEND_INDENT
+
+JSON_VALUE * JsonParseString(char *string) {
+	if (string == NULL) {
+		return NULL;
+	}
+	if (string[0] == '\xEF' && string[1] == '\xBB' && string[2] == '\xBF') {
+		string = string + 3; /* Support for UTF-8 BOM */
+	}
+	return parse_value((char**)&string, 0);
+}
+
+JSON_VALUE * JsonParseStringWithComments(char *string) {
+	JSON_VALUE *result = NULL;
+	char *string_mutable_copy = NULL, *string_mutable_copy_ptr = NULL;
+	string_mutable_copy = parson_strdup(string);
+	if (string_mutable_copy == NULL) {
+		return NULL;
+	}
+	remove_comments(string_mutable_copy, "/*", "*/");
+	remove_comments(string_mutable_copy, "//", "\n");
+	string_mutable_copy_ptr = string_mutable_copy;
+	result = parse_value((char**)&string_mutable_copy_ptr, 0);
+	parson_free(string_mutable_copy);
+	return result;
+}
+
+/* JSON Object API */
+
+JSON_VALUE * JsonGet(JSON_OBJECT *object, char *name) {
+	if (object == NULL || name == NULL) {
+		return NULL;
+	}
+	return json_object_nget_value(object, name, StrLen(name));
+}
+
+char * JsonGetStr(JSON_OBJECT *object, char *name) {
+	return JsonValueGetStr(JsonGet(object, name));
+}
+
+UINT64 JsonGetNumber(JSON_OBJECT *object, char *name) {
+	return JsonValueGetNumber(JsonGet(object, name));
+}
+
+JSON_OBJECT * JsonGetObj(JSON_OBJECT *object, char *name) {
+	return JsonValueGetObject(JsonGet(object, name));
+}
+
+JSON_ARRAY * JsonGetArray(JSON_OBJECT *object, char *name) {
+	return JsonValueGetArray(JsonGet(object, name));
+}
+
+bool JsonGetBool(JSON_OBJECT *object, char *name) {
+	return JsonValueGetBool(JsonGet(object, name));
+}
+
+JSON_VALUE * JsonDotGet(JSON_OBJECT *object, char *name) {
+	char *dot_position = strchr(name, '.');
+	if (!dot_position) {
+		return JsonGet(object, name);
+	}
+	object = JsonValueGetObject(json_object_nget_value(object, name, (UINT)(dot_position - name)));
+	return JsonDotGet(object, dot_position + 1);
+}
+
+char * JsonDotGetStr(JSON_OBJECT *object, char *name) {
+	return JsonValueGetStr(JsonDotGet(object, name));
+}
+
+UINT64 JsonDotGetNumber(JSON_OBJECT *object, char *name) {
+	return JsonValueGetNumber(JsonDotGet(object, name));
+}
+
+JSON_OBJECT * JsonDotGetObj(JSON_OBJECT *object, char *name) {
+	return JsonValueGetObject(JsonDotGet(object, name));
+}
+
+JSON_ARRAY * JsonDotGetArray(JSON_OBJECT *object, char *name) {
+	return JsonValueGetArray(JsonDotGet(object, name));
+}
+
+bool JsonDotGetBool(JSON_OBJECT *object, char *name) {
+	return JsonValueGetBool(JsonDotGet(object, name));
+}
+
+UINT JsonGetCount(JSON_OBJECT *object) {
+	return object ? object->count : 0;
+}
+
+char * JsonGetName(JSON_OBJECT *object, UINT index) {
+	if (object == NULL || index >= JsonGetCount(object)) {
+		return NULL;
+	}
+	return object->names[index];
+}
+
+JSON_VALUE * JsonGetValueAt(JSON_OBJECT *object, UINT index) {
+	if (object == NULL || index >= JsonGetCount(object)) {
+		return NULL;
+	}
+	return object->values[index];
+}
+
+JSON_VALUE *JsonGetWrappingValue(JSON_OBJECT *object) {
+	return object->wrapping_value;
+}
+
+int JsonIsExists(JSON_OBJECT *object, char *name) {
+	return JsonGet(object, name) != NULL;
+}
+
+int JsonIsExistsWithValueType(JSON_OBJECT *object, char *name, UINT type) {
+	JSON_VALUE *val = JsonGet(object, name);
+	return val != NULL && JsonValueGetType(val) == type;
+}
+
+int JsonDotIsExists(JSON_OBJECT *object, char *name) {
+	return JsonDotGet(object, name) != NULL;
+}
+
+int JsonDotIsExistsWithValueType(JSON_OBJECT *object, char *name, UINT type) {
+	JSON_VALUE *val = JsonDotGet(object, name);
+	return val != NULL && JsonValueGetType(val) == type;
+}
+
+/* JSON Array API */
+JSON_VALUE * JsonArrayGet(JSON_ARRAY *array, UINT index) {
+	if (array == NULL || index >= JsonArrayGetCount(array)) {
+		return NULL;
+	}
+	return array->items[index];
+}
+
+char * JsonArrayGetStr(JSON_ARRAY *array, UINT index) {
+	return JsonValueGetStr(JsonArrayGet(array, index));
+}
+
+UINT64 JsonArrayGetNumber(JSON_ARRAY *array, UINT index) {
+	return JsonValueGetNumber(JsonArrayGet(array, index));
+}
+
+JSON_OBJECT * JsonArrayGetObj(JSON_ARRAY *array, UINT index) {
+	return JsonValueGetObject(JsonArrayGet(array, index));
+}
+
+JSON_ARRAY * JsonArrayGetArray(JSON_ARRAY *array, UINT index) {
+	return JsonValueGetArray(JsonArrayGet(array, index));
+}
+
+bool JsonArrayGetBool(JSON_ARRAY *array, UINT index) {
+	return JsonValueGetBool(JsonArrayGet(array, index));
+}
+
+UINT JsonArrayGetCount(JSON_ARRAY *array) {
+	return array ? array->count : 0;
+}
+
+JSON_VALUE * JsonArrayGetWrappingValue(JSON_ARRAY *array) {
+	return array->wrapping_value;
+}
+
+/* JSON Value API */
+UINT JsonValueGetType(JSON_VALUE *value) {
+	return value ? value->type : JSON_TYPE_ERROR;
+}
+
+JSON_OBJECT * JsonValueGetObject(JSON_VALUE *value) {
+	if (value == NULL)
+	{
+		return NULL;
+	}
+	return JsonValueGetType(value) == JSON_TYPE_OBJECT ? value->value.object : NULL;
+}
+
+JSON_ARRAY * JsonValueGetArray(JSON_VALUE *value) {
+	return JsonValueGetType(value) == JSON_TYPE_ARRAY ? value->value.array : NULL;
+}
+
+char * JsonValueGetStr(JSON_VALUE *value) {
+	return JsonValueGetType(value) == JSON_TYPE_STRING ? value->value.string : NULL;
+}
+
+UINT64 JsonValueGetNumber(JSON_VALUE *value) {
+	return JsonValueGetType(value) == JSON_TYPE_NUMBER ? value->value.number : 0;
+}
+
+bool JsonValueGetBool(JSON_VALUE *value) {
+	return JsonValueGetType(value) == JSON_TYPE_BOOL ? value->value.boolean : 0;
+}
+
+JSON_VALUE * JsonValueGetParent(JSON_VALUE *value) {
+	return value ? value->parent : NULL;
+}
+
+void JsonFree(JSON_VALUE *value) {
+	if (value == NULL)
+	{
+		return;
+	}
+	switch (JsonValueGetType(value)) {
+	case JSON_TYPE_OBJECT:
+		json_object_free(value->value.object);
+		break;
+	case JSON_TYPE_STRING:
+		parson_free(value->value.string);
+		break;
+	case JSON_TYPE_ARRAY:
+		json_array_free(value->value.array);
+		break;
+	default:
+		break;
+	}
+	parson_free(value);
+}
+
+JSON_VALUE * JsonNewObject(void) {
+	JSON_VALUE *new_value = (JSON_VALUE*)parson_malloc(sizeof(JSON_VALUE));
+	if (!new_value) {
+		return NULL;
+	}
+	new_value->parent = NULL;
+	new_value->type = JSON_TYPE_OBJECT;
+	new_value->value.object = json_object_init(new_value);
+	if (!new_value->value.object) {
+		parson_free(new_value);
+		return NULL;
+	}
+	return new_value;
+}
+
+JSON_VALUE * JsonNewArray(void) {
+	JSON_VALUE *new_value = (JSON_VALUE*)parson_malloc(sizeof(JSON_VALUE));
+	if (!new_value) {
+		return NULL;
+	}
+	new_value->parent = NULL;
+	new_value->type = JSON_TYPE_ARRAY;
+	new_value->value.array = json_array_init(new_value);
+	if (!new_value->value.array) {
+		parson_free(new_value);
+		return NULL;
+	}
+	return new_value;
+}
+
+JSON_VALUE * JsonNewStr(char *string) {
+	char *copy = NULL;
+	JSON_VALUE *value;
+	UINT string_len = 0;
+	if (string == NULL) {
+		return NULL;
+	}
+	string_len = StrLen(string);
+	if (!is_valid_utf8(string, string_len)) {
+		return NULL;
+	}
+	copy = parson_strndup(string, string_len);
+	if (copy == NULL) {
+		return NULL;
+	}
+	value = json_value_init_string_no_copy(copy);
+	if (value == NULL) {
+		parson_free(copy);
+	}
+	return value;
+}
+
+JSON_VALUE * JsonNewNumber(UINT64 number) {
+	JSON_VALUE *new_value = NULL;
+	new_value = (JSON_VALUE*)parson_malloc(sizeof(JSON_VALUE));
+	if (new_value == NULL) {
+		return NULL;
+	}
+	new_value->parent = NULL;
+	new_value->type = JSON_TYPE_NUMBER;
+	new_value->value.number = number;
+	return new_value;
+}
+
+JSON_VALUE * JsonNewBool(int boolean) {
+	JSON_VALUE *new_value = (JSON_VALUE*)parson_malloc(sizeof(JSON_VALUE));
+	if (!new_value) {
+		return NULL;
+	}
+	new_value->parent = NULL;
+	new_value->type = JSON_TYPE_BOOL;
+	new_value->value.boolean = boolean ? 1 : 0;
+	return new_value;
+}
+
+JSON_VALUE * JsonNewNull(void) {
+	JSON_VALUE *new_value = (JSON_VALUE*)parson_malloc(sizeof(JSON_VALUE));
+	if (!new_value) {
+		return NULL;
+	}
+	new_value->parent = NULL;
+	new_value->type = JSON_TYPE_NULL;
+	return new_value;
+}
+
+JSON_VALUE * JsonDeepCopy(JSON_VALUE *value) {
+	UINT i = 0;
+	JSON_VALUE *return_value = NULL, *temp_value_copy = NULL, *temp_value = NULL;
+	char *temp_string = NULL, *temp_key = NULL;
+	char *temp_string_copy = NULL;
+	JSON_ARRAY *temp_array = NULL, *temp_array_copy = NULL;
+	JSON_OBJECT *temp_object = NULL, *temp_object_copy = NULL;
+
+	switch (JsonValueGetType(value)) {
+	case JSON_TYPE_ARRAY:
+		temp_array = JsonValueGetArray(value);
+		return_value = JsonNewArray();
+		if (return_value == NULL) {
+			return NULL;
+		}
+		temp_array_copy = JsonValueGetArray(return_value);
+		for (i = 0; i < JsonArrayGetCount(temp_array); i++) {
+			temp_value = JsonArrayGet(temp_array, i);
+			temp_value_copy = JsonDeepCopy(temp_value);
+			if (temp_value_copy == NULL) {
+				JsonFree(return_value);
+				return NULL;
+			}
+			if (json_array_add(temp_array_copy, temp_value_copy) == JSON_RET_ERROR) {
+				JsonFree(return_value);
+				JsonFree(temp_value_copy);
+				return NULL;
+			}
+		}
+		return return_value;
+	case JSON_TYPE_OBJECT:
+		temp_object = JsonValueGetObject(value);
+		return_value = JsonNewObject();
+		if (return_value == NULL) {
+			return NULL;
+		}
+		temp_object_copy = JsonValueGetObject(return_value);
+		for (i = 0; i < JsonGetCount(temp_object); i++) {
+			temp_key = JsonGetName(temp_object, i);
+			temp_value = JsonGet(temp_object, temp_key);
+			temp_value_copy = JsonDeepCopy(temp_value);
+			if (temp_value_copy == NULL) {
+				JsonFree(return_value);
+				return NULL;
+			}
+			if (json_object_add(temp_object_copy, temp_key, temp_value_copy) == JSON_RET_ERROR) {
+				JsonFree(return_value);
+				JsonFree(temp_value_copy);
+				return NULL;
+			}
+		}
+		return return_value;
+	case JSON_TYPE_BOOL:
+		return JsonNewBool(JsonValueGetBool(value));
+	case JSON_TYPE_NUMBER:
+		return JsonNewNumber(JsonValueGetNumber(value));
+	case JSON_TYPE_STRING:
+		temp_string = JsonValueGetStr(value);
+		if (temp_string == NULL) {
+			return NULL;
+		}
+		temp_string_copy = parson_strdup(temp_string);
+		if (temp_string_copy == NULL) {
+			return NULL;
+		}
+		return_value = json_value_init_string_no_copy(temp_string_copy);
+		if (return_value == NULL) {
+			parson_free(temp_string_copy);
+		}
+		return return_value;
+	case JSON_TYPE_NULL:
+		return JsonNewNull();
+	case JSON_TYPE_ERROR:
+		return NULL;
+	default:
+		return NULL;
+	}
+}
+
+UINT JsonGetSerializationSize(JSON_VALUE *value) {
+	char num_buf[1100]; /* recursively allocating buffer on stack is a bad idea, so let's do it only once */
+	int res = json_serialize_to_buffer_r(value, NULL, 0, 0, num_buf);
+	return res < 0 ? 0 : (UINT)(res + 1);
+}
+
+UINT JsonSerializeToBuffer(JSON_VALUE *value, char *buf, UINT buf_size_in_bytes) {
+	int written = -1;
+	UINT needed_size_in_bytes = JsonGetSerializationSize(value);
+	if (needed_size_in_bytes == 0 || buf_size_in_bytes < needed_size_in_bytes) {
+		return JSON_RET_ERROR;
+	}
+	written = json_serialize_to_buffer_r(value, buf, 0, 0, NULL);
+	if (written < 0) {
+		return JSON_RET_ERROR;
+	}
+	return JSON_RET_OK;
+}
+
+char * JsonSerializeToString(JSON_VALUE *value) {
+	UINT serialization_result = JSON_RET_ERROR;
+	UINT buf_size_bytes = JsonGetSerializationSize(value);
+	char *buf = NULL;
+	if (buf_size_bytes == 0) {
+		return NULL;
+	}
+	buf = (char*)parson_malloc(buf_size_bytes);
+	if (buf == NULL) {
+		return NULL;
+	}
+	serialization_result = JsonSerializeToBuffer(value, buf, buf_size_bytes);
+	if (serialization_result == JSON_RET_ERROR) {
+		JsonFreeString(buf);
+		return NULL;
+	}
+	return buf;
+}
+
+UINT JsonGetSerializationSizePretty(JSON_VALUE *value) {
+	char num_buf[1100]; /* recursively allocating buffer on stack is a bad idea, so let's do it only once */
+	int res = json_serialize_to_buffer_r(value, NULL, 0, 1, num_buf);
+	return res < 0 ? 0 : (UINT)(res + 1);
+}
+
+UINT JsonSerializeToBufferPretty(JSON_VALUE *value, char *buf, UINT buf_size_in_bytes) {
+	int written = -1;
+	UINT needed_size_in_bytes = JsonGetSerializationSizePretty(value);
+	if (needed_size_in_bytes == 0 || buf_size_in_bytes < needed_size_in_bytes) {
+		return JSON_RET_ERROR;
+	}
+	written = json_serialize_to_buffer_r(value, buf, 0, 1, NULL);
+	if (written < 0) {
+		return JSON_RET_ERROR;
+	}
+	return JSON_RET_OK;
+}
+
+JSON_VALUE *StrToJson(char *str)
+{
+	if (str == NULL)
+	{
+		return NULL;
+	}
+
+	return JsonParseString(str);
+}
+
+char *JsonToStr(JSON_VALUE *v)
+{
+	return JsonSerializeToStringPretty(v);
+}
+char * JsonSerializeToStringPretty(JSON_VALUE *value) {
+	UINT serialization_result = JSON_RET_ERROR;
+	UINT buf_size_bytes = JsonGetSerializationSizePretty(value);
+	char *buf = NULL;
+	if (buf_size_bytes == 0) {
+		return NULL;
+	}
+	buf = (char*)parson_malloc(buf_size_bytes);
+	if (buf == NULL) {
+		return NULL;
+	}
+	serialization_result = JsonSerializeToBufferPretty(value, buf, buf_size_bytes);
+	if (serialization_result == JSON_RET_ERROR) {
+		JsonFreeString(buf);
+		return NULL;
+	}
+	return buf;
+}
+
+void JsonFreeString(char *string) {
+	parson_free(string);
+}
+
+UINT JsonArrayDelete(JSON_ARRAY *array, UINT ix) {
+	UINT to_move_bytes = 0;
+	if (array == NULL || ix >= JsonArrayGetCount(array)) {
+		return JSON_RET_ERROR;
+	}
+	JsonFree(JsonArrayGet(array, ix));
+	to_move_bytes = (JsonArrayGetCount(array) - 1 - ix) * sizeof(JSON_VALUE*);
+	memmove(array->items + ix, array->items + ix + 1, to_move_bytes);
+	array->count -= 1;
+	return JSON_RET_OK;
+}
+
+UINT JsonArrayReplace(JSON_ARRAY *array, UINT ix, JSON_VALUE *value) {
+	if (array == NULL || value == NULL || value->parent != NULL || ix >= JsonArrayGetCount(array)) {
+		return JSON_RET_ERROR;
+	}
+	JsonFree(JsonArrayGet(array, ix));
+	value->parent = JsonArrayGetWrappingValue(array);
+	array->items[ix] = value;
+	return JSON_RET_OK;
+}
+
+UINT JsonArrayReplaceStr(JSON_ARRAY *array, UINT i, char* string) {
+	JSON_VALUE *value = JsonNewStr(string);
+	if (value == NULL) {
+		return JSON_RET_ERROR;
+	}
+	if (JsonArrayReplace(array, i, value) == JSON_RET_ERROR) {
+		JsonFree(value);
+		return JSON_RET_ERROR;
+	}
+	return JSON_RET_OK;
+}
+
+UINT JsonArrayReplaceNumber(JSON_ARRAY *array, UINT i, UINT64 number) {
+	JSON_VALUE *value = JsonNewNumber(number);
+	if (value == NULL) {
+		return JSON_RET_ERROR;
+	}
+	if (JsonArrayReplace(array, i, value) == JSON_RET_ERROR) {
+		JsonFree(value);
+		return JSON_RET_ERROR;
+	}
+	return JSON_RET_OK;
+}
+
+UINT JsonArrayReplaceBool(JSON_ARRAY *array, UINT i, int boolean) {
+	JSON_VALUE *value = JsonNewBool(boolean);
+	if (value == NULL) {
+		return JSON_RET_ERROR;
+	}
+	if (JsonArrayReplace(array, i, value) == JSON_RET_ERROR) {
+		JsonFree(value);
+		return JSON_RET_ERROR;
+	}
+	return JSON_RET_OK;
+}
+
+UINT JsonArrayReplaceNull(JSON_ARRAY *array, UINT i) {
+	JSON_VALUE *value = JsonNewNull();
+	if (value == NULL) {
+		return JSON_RET_ERROR;
+	}
+	if (JsonArrayReplace(array, i, value) == JSON_RET_ERROR) {
+		JsonFree(value);
+		return JSON_RET_ERROR;
+	}
+	return JSON_RET_OK;
+}
+
+UINT JsonArrayDeleteAll(JSON_ARRAY *array) {
+	UINT i = 0;
+	if (array == NULL) {
+		return JSON_RET_ERROR;
+	}
+	for (i = 0; i < JsonArrayGetCount(array); i++) {
+		JsonFree(JsonArrayGet(array, i));
+	}
+	array->count = 0;
+	return JSON_RET_OK;
+}
+
+UINT JsonArrayAdd(JSON_ARRAY *array, JSON_VALUE *value) {
+	if (array == NULL || value == NULL || value->parent != NULL) {
+		return JSON_RET_ERROR;
+	}
+	return json_array_add(array, value);
+}
+
+UINT JsonArrayAddStr(JSON_ARRAY *array, char *string) {
+	JSON_VALUE *value = JsonNewStr(string);
+	if (value == NULL) {
+		return JSON_RET_ERROR;
+	}
+	if (JsonArrayAdd(array, value) == JSON_RET_ERROR) {
+		JsonFree(value);
+		return JSON_RET_ERROR;
+	}
+	return JSON_RET_OK;
+}
+
+UINT JsonArrayAddUniStr(JSON_ARRAY *array, wchar_t *string)
+{
+	UINT ret;
+	char *utf8 = CopyUniToUtf(string);
+
+	ret = JsonArrayAddStr(array, utf8);
+
+	Free(utf8);
+	return ret;
+}
+
+UINT JsonArrayAddNumber(JSON_ARRAY *array, UINT64 number) {
+	JSON_VALUE *value = JsonNewNumber(number);
+	if (value == NULL) {
+		return JSON_RET_ERROR;
+	}
+	if (JsonArrayAdd(array, value) == JSON_RET_ERROR) {
+		JsonFree(value);
+		return JSON_RET_ERROR;
+	}
+	return JSON_RET_OK;
+}
+
+UINT JsonArrayAddData(JSON_ARRAY *array, void *data, UINT size)
+{
+	UINT ret;
+	char *b64 = ZeroMalloc(size * 4 + 32);
+	B64_Encode(b64, data, size);
+
+	ret = JsonArrayAddStr(array, b64);
+
+	Free(b64);
+	return ret;
+}
+
+UINT JsonArrayAddBool(JSON_ARRAY *array, int boolean) {
+	JSON_VALUE *value = JsonNewBool(boolean);
+	if (value == NULL) {
+		return JSON_RET_ERROR;
+	}
+	if (JsonArrayAdd(array, value) == JSON_RET_ERROR) {
+		JsonFree(value);
+		return JSON_RET_ERROR;
+	}
+	return JSON_RET_OK;
+}
+
+UINT JsonArrayAddNull(JSON_ARRAY *array) {
+	JSON_VALUE *value = JsonNewNull();
+	if (value == NULL) {
+		return JSON_RET_ERROR;
+	}
+	if (JsonArrayAdd(array, value) == JSON_RET_ERROR) {
+		JsonFree(value);
+		return JSON_RET_ERROR;
+	}
+	return JSON_RET_OK;
+}
+
+UINT JsonSet(JSON_OBJECT *object, char *name, JSON_VALUE *value) {
+	UINT i = 0;
+	JSON_VALUE *old_value;
+	if (object == NULL || name == NULL || value == NULL || value->parent != NULL) {
+		return JSON_RET_ERROR;
+	}
+	old_value = JsonGet(object, name);
+	if (old_value != NULL) { /* free and overwrite old value */
+		JsonFree(old_value);
+		for (i = 0; i < JsonGetCount(object); i++) {
+			if (strcmp(object->names[i], name) == 0) {
+				value->parent = JsonGetWrappingValue(object);
+				object->values[i] = value;
+				return JSON_RET_OK;
+			}
+		}
+	}
+	/* add new key value pair */
+	return json_object_add(object, name, value);
+}
+
+UINT JsonSetData(JSON_OBJECT *object, char *name, void *data, UINT size)
+{
+	UINT ret;
+	char *b64 = ZeroMalloc(size * 4 + 32);
+	B64_Encode(b64, data, size);
+
+	ret = JsonSetStr(object, name, b64);
+
+	Free(b64);
+	return ret;
+}
+
+UINT JsonSetStr(JSON_OBJECT *object, char *name, char *string) {
+	return JsonSet(object, name, JsonNewStr(string));
+}
+
+UINT JsonSetUniStr(JSON_OBJECT *object, char *name, wchar_t *string)
+{
+	UINT ret;
+	char *utf8 = CopyUniToUtf(string);
+
+	ret = JsonSetStr(object, name, utf8);
+
+	Free(utf8);
+	return ret;
+}
+
+UINT JsonSetNumber(JSON_OBJECT *object, char *name, UINT64 number) {
+	return JsonSet(object, name, JsonNewNumber(number));
+}
+
+UINT JsonSetBool(JSON_OBJECT *object, char *name, int boolean) {
+	return JsonSet(object, name, JsonNewBool(boolean));
+}
+
+UINT JsonSetNull(JSON_OBJECT *object, char *name) {
+	return JsonSet(object, name, JsonNewNull());
+}
+
+UINT JsonDotSet(JSON_OBJECT *object, char *name, JSON_VALUE *value) {
+	char *dot_pos = NULL;
+	char *current_name = NULL;
+	JSON_OBJECT *temp_obj = NULL;
+	JSON_VALUE *new_value = NULL;
+	if (object == NULL || name == NULL || value == NULL) {
+		return JSON_RET_ERROR;
+	}
+	dot_pos = strchr(name, '.');
+	if (dot_pos == NULL) {
+		return JsonSet(object, name, value);
+	}
+	else {
+		current_name = parson_strndup(name, (UINT)(dot_pos - name));
+		temp_obj = JsonGetObj(object, current_name);
+		if (temp_obj == NULL) {
+			new_value = JsonNewObject();
+			if (new_value == NULL) {
+				parson_free(current_name);
+				return JSON_RET_ERROR;
+			}
+			if (json_object_add(object, current_name, new_value) == JSON_RET_ERROR) {
+				JsonFree(new_value);
+				parson_free(current_name);
+				return JSON_RET_ERROR;
+			}
+			temp_obj = JsonGetObj(object, current_name);
+		}
+		parson_free(current_name);
+		return JsonDotSet(temp_obj, dot_pos + 1, value);
+	}
+}
+
+UINT JsonDotSetStr(JSON_OBJECT *object, char *name, char *string) {
+	JSON_VALUE *value = JsonNewStr(string);
+	if (value == NULL) {
+		return JSON_RET_ERROR;
+	}
+	if (JsonDotSet(object, name, value) == JSON_RET_ERROR) {
+		JsonFree(value);
+		return JSON_RET_ERROR;
+	}
+	return JSON_RET_OK;
+}
+
+UINT JsonDotSetNumber(JSON_OBJECT *object, char *name, UINT64 number) {
+	JSON_VALUE *value = JsonNewNumber(number);
+	if (value == NULL) {
+		return JSON_RET_ERROR;
+	}
+	if (JsonDotSet(object, name, value) == JSON_RET_ERROR) {
+		JsonFree(value);
+		return JSON_RET_ERROR;
+	}
+	return JSON_RET_OK;
+}
+
+UINT JsonDotSetBool(JSON_OBJECT *object, char *name, int boolean) {
+	JSON_VALUE *value = JsonNewBool(boolean);
+	if (value == NULL) {
+		return JSON_RET_ERROR;
+	}
+	if (JsonDotSet(object, name, value) == JSON_RET_ERROR) {
+		JsonFree(value);
+		return JSON_RET_ERROR;
+	}
+	return JSON_RET_OK;
+}
+
+UINT JsonDotSetNull(JSON_OBJECT *object, char *name) {
+	JSON_VALUE *value = JsonNewNull();
+	if (value == NULL) {
+		return JSON_RET_ERROR;
+	}
+	if (JsonDotSet(object, name, value) == JSON_RET_ERROR) {
+		JsonFree(value);
+		return JSON_RET_ERROR;
+	}
+	return JSON_RET_OK;
+}
+
+UINT JsonDelete(JSON_OBJECT *object, char *name) {
+	UINT i = 0, last_item_index = 0;
+	if (object == NULL || JsonGet(object, name) == NULL) {
+		return JSON_RET_ERROR;
+	}
+	last_item_index = JsonGetCount(object) - 1;
+	for (i = 0; i < JsonGetCount(object); i++) {
+		if (strcmp(object->names[i], name) == 0) {
+			parson_free(object->names[i]);
+			JsonFree(object->values[i]);
+			if (i != last_item_index) { /* Replace key value pair with one from the end */
+				object->names[i] = object->names[last_item_index];
+				object->values[i] = object->values[last_item_index];
+			}
+			object->count -= 1;
+			return JSON_RET_OK;
+		}
+	}
+	return JSON_RET_ERROR; /* No execution path should end here */
+}
+
+UINT JsonDotDelete(JSON_OBJECT *object, char *name) {
+	char *dot_pos = strchr(name, '.');
+	char *current_name = NULL;
+	JSON_OBJECT *temp_obj = NULL;
+	if (dot_pos == NULL) {
+		return JsonDelete(object, name);
+	}
+	else {
+		current_name = parson_strndup(name, (UINT)(dot_pos - name));
+		temp_obj = JsonGetObj(object, current_name);
+		parson_free(current_name);
+		if (temp_obj == NULL) {
+			return JSON_RET_ERROR;
+		}
+		return JsonDotDelete(temp_obj, dot_pos + 1);
+	}
+}
+
+UINT JsonDeleteAll(JSON_OBJECT *object) {
+	UINT i = 0;
+	if (object == NULL) {
+		return JSON_RET_ERROR;
+	}
+	for (i = 0; i < JsonGetCount(object); i++) {
+		parson_free(object->names[i]);
+		JsonFree(object->values[i]);
+	}
+	object->count = 0;
+	return JSON_RET_OK;
+}
+
+UINT JsonValidate(JSON_VALUE *schema, JSON_VALUE *value) {
+	JSON_VALUE *temp_schema_value = NULL, *temp_value = NULL;
+	JSON_ARRAY *schema_array = NULL, *value_array = NULL;
+	JSON_OBJECT *schema_object = NULL, *value_object = NULL;
+	UINT schema_type = JSON_TYPE_ERROR, value_type = JSON_TYPE_ERROR;
+	char *key = NULL;
+	UINT i = 0, count = 0;
+	if (schema == NULL || value == NULL) {
+		return JSON_RET_ERROR;
+	}
+	schema_type = JsonValueGetType(schema);
+	value_type = JsonValueGetType(value);
+	if (schema_type != value_type && schema_type != JSON_TYPE_NULL) { /* null represents all values */
+		return JSON_RET_ERROR;
+	}
+	switch (schema_type) {
+	case JSON_TYPE_ARRAY:
+		schema_array = JsonValueGetArray(schema);
+		value_array = JsonValueGetArray(value);
+		count = JsonArrayGetCount(schema_array);
+		if (count == 0) {
+			return JSON_RET_OK; /* Empty array allows all types */
+		}
+		/* Get first value from array, rest is ignored */
+		temp_schema_value = JsonArrayGet(schema_array, 0);
+		for (i = 0; i < JsonArrayGetCount(value_array); i++) {
+			temp_value = JsonArrayGet(value_array, i);
+			if (JsonValidate(temp_schema_value, temp_value) == JSON_RET_ERROR) {
+				return JSON_RET_ERROR;
+			}
+		}
+		return JSON_RET_OK;
+	case JSON_TYPE_OBJECT:
+		schema_object = JsonValueGetObject(schema);
+		value_object = JsonValueGetObject(value);
+		count = JsonGetCount(schema_object);
+		if (count == 0) {
+			return JSON_RET_OK; /* Empty object allows all objects */
+		}
+		else if (JsonGetCount(value_object) < count) {
+			return JSON_RET_ERROR; /* Tested object mustn't have less name-value pairs than schema */
+		}
+		for (i = 0; i < count; i++) {
+			key = JsonGetName(schema_object, i);
+			temp_schema_value = JsonGet(schema_object, key);
+			temp_value = JsonGet(value_object, key);
+			if (temp_value == NULL) {
+				return JSON_RET_ERROR;
+			}
+			if (JsonValidate(temp_schema_value, temp_value) == JSON_RET_ERROR) {
+				return JSON_RET_ERROR;
+			}
+		}
+		return JSON_RET_OK;
+	case JSON_TYPE_STRING: case JSON_TYPE_NUMBER: case JSON_TYPE_BOOL: case JSON_TYPE_NULL:
+		return JSON_RET_OK; /* equality already tested before switch */
+	case JSON_TYPE_ERROR: default:
+		return JSON_RET_ERROR;
+	}
+}
+
+int JsonCmp(JSON_VALUE *a, JSON_VALUE *b) {
+	JSON_OBJECT *a_object = NULL, *b_object = NULL;
+	JSON_ARRAY *a_array = NULL, *b_array = NULL;
+	char *a_string = NULL, *b_string = NULL;
+	char *key = NULL;
+	UINT a_count = 0, b_count = 0, i = 0;
+	UINT a_type, b_type;
+	UINT64 a_num, b_num;
+	a_type = JsonValueGetType(a);
+	b_type = JsonValueGetType(b);
+	if (a_type != b_type) {
+		return 0;
+	}
+	switch (a_type) {
+	case JSON_TYPE_ARRAY:
+		a_array = JsonValueGetArray(a);
+		b_array = JsonValueGetArray(b);
+		a_count = JsonArrayGetCount(a_array);
+		b_count = JsonArrayGetCount(b_array);
+		if (a_count != b_count) {
+			return 0;
+		}
+		for (i = 0; i < a_count; i++) {
+			if (!JsonCmp(JsonArrayGet(a_array, i),
+				JsonArrayGet(b_array, i))) {
+					return 0;
+			}
+		}
+		return 1;
+	case JSON_TYPE_OBJECT:
+		a_object = JsonValueGetObject(a);
+		b_object = JsonValueGetObject(b);
+		a_count = JsonGetCount(a_object);
+		b_count = JsonGetCount(b_object);
+		if (a_count != b_count) {
+			return 0;
+		}
+		for (i = 0; i < a_count; i++) {
+			key = JsonGetName(a_object, i);
+			if (!JsonCmp(JsonGet(a_object, key),
+				JsonGet(b_object, key))) {
+					return 0;
+			}
+		}
+		return 1;
+	case JSON_TYPE_STRING:
+		a_string = JsonValueGetStr(a);
+		b_string = JsonValueGetStr(b);
+		if (a_string == NULL || b_string == NULL) {
+			return 0; /* shouldn't happen */
+		}
+		return strcmp(a_string, b_string) == 0;
+	case JSON_TYPE_BOOL:
+		return JsonValueGetBool(a) == JsonValueGetBool(b);
+	case JSON_TYPE_NUMBER:
+		a_num = JsonValueGetNumber(a);
+		b_num = JsonValueGetNumber(b);
+		return a_num == b_num;
+	case JSON_TYPE_ERROR:
+		return 1;
+	case JSON_TYPE_NULL:
+		return 1;
+	default:
+		return 1;
+	}
+}
+
+UINT JsonType(JSON_VALUE *value) {
+	return JsonValueGetType(value);
+}
+
+JSON_OBJECT * JsonObject(JSON_VALUE *value) {
+	return JsonValueGetObject(value);
+}
+
+JSON_ARRAY * JsonArray(JSON_VALUE *value) {
+	return JsonValueGetArray(value);
+}
+
+char * JsonString(JSON_VALUE *value) {
+	return JsonValueGetStr(value);
+}
+
+UINT64 JsonNumber(JSON_VALUE *value) {
+	return JsonValueGetNumber(value);
+}
+
+int JsonBool(JSON_VALUE *value) {
+	return JsonValueGetBool(value);
+}
+
+void JsonSetAllocationFunctions(JSON_Malloc_Function malloc_fun, JSON_Free_Function free_fun) {
+	parson_malloc = malloc_fun;
+	parson_free = free_fun;
+}
+
+// SYSTEMTIME to JSON string
+void SystemTimeToJsonStr(char *dst, UINT size, SYSTEMTIME *t)
+{
+	if (dst == NULL)
+	{
+		return;
+	}
+
+	if (t == NULL)
+	{
+		ClearStr(dst, size);
+	}
+	else
+	{
+		GetDateTimeStrRFC3339(dst, size, t, 0);
+	}
+}
+
+// UINT64 System Time to JSON string
+void SystemTime64ToJsonStr(char *dst, UINT size, UINT64 t)
+{
+	SYSTEMTIME st;
+	if (dst == NULL)
+	{
+		return;
+	}
+
+	if (t == 0)
+	{
+		ClearStr(dst, size);
+	}
+
+	UINT64ToSystem(&st, t);
+
+	SystemTimeToJsonStr(dst, size, &st);
+}
+
+
+
+

+ 255 - 0
src/Mayaqua/Str.h

@@ -182,7 +182,9 @@ void BinToStrW(wchar_t *str, UINT str_size, void *data, UINT data_size);
 void PrintBin(void *data, UINT size);
 bool StartWith(char *str, char *key);
 bool EndWith(char *str, char *key);
+bool TrimEndWith(char *dst, UINT dst_size, char *str, char *key);
 UINT64 ToInt64(char *str);
+UINT64 Json_ToInt64Ex(char *str, char **endptr, bool *error);
 void ToStr64(char *str, UINT64 value);
 char *ReplaceFormatStringFor64(char *fmt);
 TOKEN_LIST *ParseCmdLine(char *str);
@@ -241,6 +243,259 @@ LIST *StrToIntList(char *str, bool sorted);
 void NormalizeIntListStr(char *dst, UINT dst_size, char *src, bool sorted, char *separate_str);
 void ClearStr(char *str, UINT str_size);
 void SetStrCaseAccordingToBits(char *str, UINT bits);
+char *UrlDecode(char *url_str);
+
+
+// *** JSON strings support
+// Original source code from Parson ( http://kgabis.github.com/parson/ )
+// Modified by dnobori
+/*
+Parson ( http://kgabis.github.com/parson/ )
+Copyright (c) 2012 - 2017 Krzysztof Gabis
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+
+/* Type definitions */
+typedef union JSON_VALUE_UNION {
+	char        *string;
+	UINT64       number;
+	JSON_OBJECT *object;
+	JSON_ARRAY  *array;
+	int          boolean;
+	int          null;
+} JSON_VALUE_UNION;
+
+struct JSON_VALUE {
+	JSON_VALUE      *parent;
+	UINT  type;
+	JSON_VALUE_UNION value;
+};
+
+struct JSON_OBJECT {
+	JSON_VALUE  *wrapping_value;
+	char       **names;
+	JSON_VALUE **values;
+	UINT       count;
+	UINT       capacity;
+};
+
+struct JSON_ARRAY {
+	JSON_VALUE  *wrapping_value;
+	JSON_VALUE **items;
+	UINT       count;
+	UINT       capacity;
+};
+
+
+enum JSON_TYPES {
+	JSON_TYPE_ERROR = -1,
+	JSON_TYPE_NULL = 1,
+	JSON_TYPE_STRING = 2,
+	JSON_TYPE_NUMBER = 3,
+	JSON_TYPE_OBJECT = 4,
+	JSON_TYPE_ARRAY = 5,
+	JSON_TYPE_BOOL = 6
+};
+//typedef unsigned int UINT;
+
+enum JSON_RETS {
+	JSON_RET_OK = 0,
+	JSON_RET_ERROR = -1
+};
+
+typedef void * (*JSON_Malloc_Function)(UINT);
+typedef void(*JSON_Free_Function)(void *);
+
+/* Call only once, before calling any other function from parson API. If not called, malloc and free
+from stdlib will be used for all allocations */
+void JsonSetAllocationFunctions(JSON_Malloc_Function malloc_fun, JSON_Free_Function free_fun);
+
+/*  Parses first JSON value in a string, returns NULL in case of error */
+JSON_VALUE * JsonParseString(char *string);
+
+/*  Parses first JSON value in a string and ignores comments (/ * * / and //),
+returns NULL in case of error */
+JSON_VALUE * JsonParseStringWithComments(char *string);
+
+/* Serialization */
+UINT      JsonGetSerializationSize(JSON_VALUE *value); /* returns 0 on fail */
+UINT JsonSerializeToBuffer(JSON_VALUE *value, char *buf, UINT buf_size_in_bytes);
+char *      JsonSerializeToString(JSON_VALUE *value);
+
+/* Pretty serialization */
+UINT      JsonGetSerializationSizePretty(JSON_VALUE *value); /* returns 0 on fail */
+UINT JsonSerializeToBufferPretty(JSON_VALUE *value, char *buf, UINT buf_size_in_bytes);
+char *      JsonSerializeToStringPretty(JSON_VALUE *value);
+char *JsonToStr(JSON_VALUE *v);
+
+void        JsonFreeString(char *string); /* frees string from json_serialize_to_string and json_serialize_to_string_pretty */
+
+										  /* Comparing */
+int  JsonCmp(JSON_VALUE *a, JSON_VALUE *b);
+
+/* Validation
+This is *NOT* JSON Schema. It validates json by checking if object have identically
+named fields with matching types.
+For example schema {"name":"", "age":0} will validate
+{"name":"Joe", "age":25} and {"name":"Joe", "age":25, "gender":"m"},
+but not {"name":"Joe"} or {"name":"Joe", "age":"Cucumber"}.
+In case of arrays, only first value in schema is checked against all values in tested array.
+Empty objects ({}) validate all objects, empty arrays ([]) validate all arrays,
+null validates values of every type.
+*/
+UINT JsonValidate(JSON_VALUE *schema, JSON_VALUE *value);
+
+/*
+* JSON Object
+*/
+JSON_VALUE  * JsonGet(JSON_OBJECT *object, char *name);
+char  * JsonGetStr(JSON_OBJECT *object, char *name);
+JSON_OBJECT * JsonGetObj(JSON_OBJECT *object, char *name);
+JSON_ARRAY  * JsonGetArray(JSON_OBJECT *object, char *name);
+UINT64        JsonGetNumber(JSON_OBJECT *object, char *name); /* returns 0 on fail */
+bool          JsonGetBool(JSON_OBJECT *object, char *name); /* returns 0 on fail */
+
+															/* dotget functions enable addressing values with dot notation in nested objects,
+															just like in structs or c++/java/c# objects (e.g. objectA.objectB.value).
+															Because valid names in JSON can contain dots, some values may be inaccessible
+															this way. */
+JSON_VALUE  * JsonDotGet(JSON_OBJECT *object, char *name);
+char  * JsonDotGetStr(JSON_OBJECT *object, char *name);
+JSON_OBJECT * JsonDotGetObj(JSON_OBJECT *object, char *name);
+JSON_ARRAY  * JsonDotGetArray(JSON_OBJECT *object, char *name);
+UINT64        JsonDotGetNumber(JSON_OBJECT *object, char *name); /* returns 0 on fail */
+bool          JsonDotGetBool(JSON_OBJECT *object, char *name); /* returns -1 on fail */
+
+															   /* Functions to get available names */
+UINT        JsonGetCount(JSON_OBJECT *object);
+char  * JsonGetName(JSON_OBJECT *object, UINT index);
+JSON_VALUE  * JsonGetValueAt(JSON_OBJECT *object, UINT index);
+JSON_VALUE  * JsonGetWrappingValue(JSON_OBJECT *object);
+
+/* Functions to check if object has a value with a specific name. Returned value is 1 if object has
+* a value and 0 if it doesn't. dothas functions behave exactly like dotget functions. */
+int JsonIsExists(JSON_OBJECT *object, char *name);
+int JsonIsExistsWithValueType(JSON_OBJECT *object, char *name, UINT type);
+
+int JsonDotIsExists(JSON_OBJECT *object, char *name);
+int JsonDotIsExistsWithValueType(JSON_OBJECT *object, char *name, UINT type);
+
+/* Creates new name-value pair or frees and replaces old value with a new one.
+* json_object_set_value does not copy passed value so it shouldn't be freed afterwards. */
+UINT JsonSet(JSON_OBJECT *object, char *name, JSON_VALUE *value);
+UINT JsonSetStr(JSON_OBJECT *object, char *name, char *string);
+UINT JsonSetUniStr(JSON_OBJECT *object, char *name, wchar_t *string);
+UINT JsonSetNumber(JSON_OBJECT *object, char *name, UINT64 number);
+UINT JsonSetBool(JSON_OBJECT *object, char *name, int boolean);
+UINT JsonSetNull(JSON_OBJECT *object, char *name);
+UINT JsonSetData(JSON_OBJECT *object, char *name, void *data, UINT size);
+
+/* Works like dotget functions, but creates whole hierarchy if necessary.
+* json_object_dotset_value does not copy passed value so it shouldn't be freed afterwards. */
+UINT JsonDotSet(JSON_OBJECT *object, char *name, JSON_VALUE *value);
+UINT JsonDotSetStr(JSON_OBJECT *object, char *name, char *string);
+UINT JsonDotSetNumber(JSON_OBJECT *object, char *name, UINT64 number);
+UINT JsonDotSetBool(JSON_OBJECT *object, char *name, int boolean);
+UINT JsonDotSetNull(JSON_OBJECT *object, char *name);
+
+/* Frees and removes name-value pair */
+UINT JsonDelete(JSON_OBJECT *object, char *name);
+
+/* Works like dotget function, but removes name-value pair only on exact match. */
+UINT JsonDotDelete(JSON_OBJECT *object, char *key);
+
+/* Removes all name-value pairs in object */
+UINT JsonDeleteAll(JSON_OBJECT *object);
+
+/*
+*JSON Array
+*/
+JSON_VALUE  * JsonArrayGet(JSON_ARRAY *array, UINT index);
+char  * JsonArrayGetStr(JSON_ARRAY *array, UINT index);
+JSON_OBJECT * JsonArrayGetObj(JSON_ARRAY *array, UINT index);
+JSON_ARRAY  * JsonArrayGetArray(JSON_ARRAY *array, UINT index);
+UINT64        JsonArrayGetNumber(JSON_ARRAY *array, UINT index); /* returns 0 on fail */
+bool           JsonArrayGetBool(JSON_ARRAY *array, UINT index); /* returns 0 on fail */
+UINT        JsonArrayGetCount(JSON_ARRAY *array);
+JSON_VALUE  * JsonArrayGetWrappingValue(JSON_ARRAY *array);
+
+/* Frees and removes value at given index, does nothing and returns JSONFailure if index doesn't exist.
+* Order of values in array may change during execution.  */
+UINT JsonArrayDelete(JSON_ARRAY *array, UINT i);
+
+/* Frees and removes from array value at given index and replaces it with given one.
+* Does nothing and returns JSONFailure if index doesn't exist.
+* json_array_replace_value does not copy passed value so it shouldn't be freed afterwards. */
+UINT JsonArrayReplace(JSON_ARRAY *array, UINT i, JSON_VALUE *value);
+UINT JsonArrayReplaceStr(JSON_ARRAY *array, UINT i, char* string);
+UINT JsonArrayReplaceNumber(JSON_ARRAY *array, UINT i, UINT64 number);
+UINT JsonArrayReplaceBool(JSON_ARRAY *array, UINT i, int boolean);
+UINT JsonArrayReplaceNull(JSON_ARRAY *array, UINT i);
+
+/* Frees and removes all values from array */
+UINT JsonArrayDeleteAll(JSON_ARRAY *array);
+
+/* Appends new value at the end of array.
+* json_array_append_value does not copy passed value so it shouldn't be freed afterwards. */
+UINT JsonArrayAdd(JSON_ARRAY *array, JSON_VALUE *value);
+UINT JsonArrayAddStr(JSON_ARRAY *array, char *string);
+UINT JsonArrayAddUniStr(JSON_ARRAY *array, wchar_t *string);
+UINT JsonArrayAddNumber(JSON_ARRAY *array, UINT64 number);
+UINT JsonArrayAddData(JSON_ARRAY *array, void *data, UINT size);
+UINT JsonArrayAddBool(JSON_ARRAY *array, int boolean);
+UINT JsonArrayAddNull(JSON_ARRAY *array);
+
+
+/*
+*JSON Value
+*/
+JSON_VALUE * JsonNewObject(void);
+JSON_VALUE * JsonNewArray(void);
+JSON_VALUE * JsonNewStr(char *string); /* copies passed string */
+JSON_VALUE * JsonNewNumber(UINT64 number);
+JSON_VALUE * JsonNewBool(int boolean);
+JSON_VALUE * JsonNewNull(void);
+JSON_VALUE * JsonDeepCopy(JSON_VALUE *value);
+void         JsonFree(JSON_VALUE *value);
+
+UINT JsonValueGetType(JSON_VALUE *value);
+JSON_OBJECT *   JsonValueGetObject(JSON_VALUE *value);
+JSON_ARRAY  *   JsonValueGetArray(JSON_VALUE *value);
+char  *   JsonValueGetStr(JSON_VALUE *value);
+UINT64          JsonValueGetNumber(JSON_VALUE *value);
+bool            JsonValueGetBool(JSON_VALUE *value);
+JSON_VALUE  *   JsonValueGetParent(JSON_VALUE *value);
+
+/* Same as above, but shorter */
+UINT JsonType(JSON_VALUE *value);
+JSON_OBJECT *   JsonObject(JSON_VALUE *value);
+JSON_ARRAY  *   JsonArray(JSON_VALUE *value);
+char  *   JsonString(JSON_VALUE *value);
+UINT64          JsonNumber(JSON_VALUE *value);
+int             JsonBool(JSON_VALUE *value);
+
+void SystemTimeToJsonStr(char *dst, UINT size, SYSTEMTIME *t);
+void SystemTime64ToJsonStr(char *dst, UINT size, UINT64 t);
+
+JSON_VALUE *StrToJson(char *str);
 
 #endif	// STR_H
 

+ 2 - 0
src/Mayaqua/Table.c

@@ -936,6 +936,8 @@ TABLE *ParseTableLine(char *line, char *prefix, UINT prefix_size, LIST *replace_
 			UniReplaceStrEx(tmp, tmp_size, tmp, (wchar_t *)r->name, r->unistr, false);
 		}
 
+		Free(unistr);
+
 		unistr = CopyUniStr(tmp);
 
 		Free(tmp);

+ 23 - 0
src/Mayaqua/Unix.c

@@ -2508,6 +2508,23 @@ UINT UnixGetUID()
 	return (UINT)getuid();
 }
 
+void UnixPrintVpnServerUrlInfo()
+{
+	IP ip;
+
+	TryGetCurrentAcceptingIPv4Address(&ip);
+
+	Print("\nLet's get started by accessing to the following URL from your PC:\n\n"
+		"https://%r:%u/\n"
+		"  or\n"
+		"https://%r/\n\n"
+		"Note: IP address may vary. Specify your server's IP address.\n"
+		"A TLS certificate warning will appear because the server uses self signed certificate by default. That is natural. Continue with ignoring the TLS warning."
+		"\n\n",
+		&ip, GC_DEFAULT_PORT, &ip
+		);
+}
+
 // Start the service
 void UnixStartService(char *name)
 {
@@ -2547,6 +2564,12 @@ void UnixStartService(char *name)
 			UniPrint(_UU("UNIX_SVC_NONROOT"));
 		}
 
+		if (StrCmpi(name, "vpnserver") == 0 || StrCmpi(name, "vpnbridge") == 0)
+		{
+			// Print the IP address information
+			UnixPrintVpnServerUrlInfo();
+		}
+
 		FreeSingleInstance(inst);
 
 		// Create a child process

+ 1 - 0
src/Mayaqua/Unix.h

@@ -250,6 +250,7 @@ void UnixDeleteCtlFile();
 void UnixStopThread(THREAD *t, void *param);
 UINT UnixGetUID();
 void UnixIgnoreSignalForThread(int sig);
+void UnixPrintVpnServerUrlInfo();
 
 bool UnixIsInVmMain();
 bool UnixIsInVm();

+ 0 - 2
src/SEVPN.sln

@@ -16,7 +16,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "hamcore", "hamcore", "{2349
 		bin\hamcore\lang.config = bin\hamcore\lang.config
 		bin\hamcore\strtable_cn.stb = bin\hamcore\strtable_cn.stb
 		bin\hamcore\strtable_en.stb = bin\hamcore\strtable_en.stb
-		bin\hamcore\strtable_ja.stb = bin\hamcore\strtable_ja.stb
 		bin\hamcore\time.htm = bin\hamcore\time.htm
 		bin\hamcore\vpn16.exe = bin\hamcore\vpn16.exe
 	EndProjectSection
@@ -92,7 +91,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Cedar", "Cedar\Cedar.vcproj
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Ham", "Ham\Ham.vcproj", "{1ED5782B-1734-4FC6-AA9E-F7181CDBA8A7}"
 	ProjectSection(ProjectDependencies) = postProject
-		{DB2A0C4F-D685-41DD-91BA-06E9EEA381CF} = {DB2A0C4F-D685-41DD-91BA-06E9EEA381CF}
 		{2928D768-DEC3-40D3-8E51-26E364497C9B} = {2928D768-DEC3-40D3-8E51-26E364497C9B}
 		{384815C3-333C-4CEC-9DCD-B6AB2602EBB9} = {384815C3-333C-4CEC-9DCD-B6AB2602EBB9}
 	EndProjectSection

+ 50 - 14
src/See/Packet.c

@@ -668,6 +668,8 @@ NTSTATUS NPF_IoControl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
 	PUINT				pStats;
 	ULONG				Information = 0;
 
+	BOOLEAN check_ok;
+
     IF_LOUD(DbgPrint("NPF: IoControl\n");)
 		
 	IrpSp = IoGetCurrentIrpStackLocation(Irp);
@@ -686,22 +688,39 @@ NTSTATUS NPF_IoControl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
 			EXIT_FAILURE(0);
 		}
 
-		pStats = (PUINT)(Irp->UserBuffer);
-
-		pStats[3] = 0;
-		pStats[0] = 0;
-		pStats[1] = 0;
-		pStats[2] = 0;		// Not yet supported
+		check_ok = TRUE;
+		__try
+		{
+			ProbeForWrite(Irp->UserBuffer, IrpSp->Parameters.DeviceIoControl.OutputBufferLength, 1);
+		}
+		__except (EXCEPTION_EXECUTE_HANDLER)
+		{
+			check_ok = FALSE;
+		}
 
-		for(i = 0 ; i < NCpu ; i++)
+		if (check_ok == FALSE)
 		{
+			EXIT_FAILURE(0);
+		}
+		else
+		{
+			pStats = (PUINT)(Irp->UserBuffer);
+
+			pStats[3] = 0;
+			pStats[0] = 0;
+			pStats[1] = 0;
+			pStats[2] = 0;		// Not yet supported
+
+			for(i = 0 ; i < NCpu ; i++)
+			{
 
-			pStats[3] += Open->CpuData[i].Accepted;
-			pStats[0] += Open->CpuData[i].Received;
-			pStats[1] += Open->CpuData[i].Dropped;
-			pStats[2] += 0;		// Not yet supported
+				pStats[3] += Open->CpuData[i].Accepted;
+				pStats[0] += Open->CpuData[i].Received;
+				pStats[1] += Open->CpuData[i].Dropped;
+				pStats[2] += 0;		// Not yet supported
+			}
+			EXIT_SUCCESS(4*sizeof(UINT));
 		}
-		EXIT_SUCCESS(4*sizeof(UINT));
 		
 		break;
 		
@@ -711,9 +730,26 @@ NTSTATUS NPF_IoControl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
 			EXIT_FAILURE(0);
 		}
 
-		RtlCopyMemory(Irp->UserBuffer,(Open->ReadEventName.Buffer)+18,26);
+		check_ok = TRUE;
+		__try
+		{
+			ProbeForWrite(Irp->UserBuffer, IrpSp->Parameters.DeviceIoControl.OutputBufferLength, 1);
+		}
+		__except (EXCEPTION_EXECUTE_HANDLER)
+		{
+			check_ok = FALSE;
+		}
+
+		if (check_ok == FALSE)
+		{
+			EXIT_FAILURE(0);
+		}
+		else
+		{
+			RtlCopyMemory(Irp->UserBuffer,(Open->ReadEventName.Buffer)+18,26);
 
-		EXIT_SUCCESS(26);
+			EXIT_SUCCESS(26);
+		}
 
 		break;
 

+ 19 - 0
src/WARNING.TXT

@@ -104,6 +104,25 @@ be disabled anytime by setting up so on the VPN-client side.
 
 
 2. VPN Software
+The notes in this section are not specific to SoftEther VPN or VPN Gate, but
+apply to general system software. SoftEther VPN Client, SoftEther VPN Server,
+SoftEther VPN Bridge, and VPN Gate Relay Service will be installed on your
+computer as system services. System services always run in the background.
+System services usually do not appear on the computer display. Then your
+computer system is booted, system services automatically start in the
+background even before you or other users log in. To check whether
+PacketiX-related system service is running, check the process list or the
+background service list of your OS (called as "Services" in Windows, or
+"Daemons" in UNIX.) You can activate, deactivate, start, or stop system
+services using the functions of the OS anytime. PacketiX-related GUI tools for
+managing system services communicate with these system services. After you
+terminate these management GUI tools, PacketiX-related system services will
+continue to run in the background. System services consume CPU time, computer
+power, memory and disk space. Because system services consume power, your
+electricity charges and amount of thermal of your computer increase as result.
+In addition, there is a possibility that the mechanical parts of the life of
+your computer is reduced.
+
 2.1. SoftEther VPN Client
 If you use SoftEther VPN Client on Windows, the Virtual Network Adapter device
 driver will be installed on Windows. The Virtual Network Adapter is

二进制
src/bin/hamcore/DriverPackages/See/x64/See_x64.sys


二进制
src/bin/hamcore/DriverPackages/See/x86/See_x86.sys


+ 0 - 17
src/bin/hamcore/lang.config

@@ -1,17 +0,0 @@
-# PacketiX VPN / SoftEther VPN Language Setting File
-# 
-# Specify your preferred Language ID on this setting file.
-# The text messages will be displayed in the specified language.
-# 
-# Please note that you must restart a program to apply the modification of
-# this setting-file.
-# 
-# Only one line is acceptable. Any other lines are ignored.
-# 
-# The change of this file will effect after the next execution of a program.
-# 
-# Note for UNIX / Linux Users:
-#  You have to set the LANG environment variable if you want to display
-#  non-English characters. If no LANG environment is set, any multi-byte
-#  characters (i.e. Japanese or Chinese) will not be displayed correctly.
-# 

+ 23 - 26
src/bin/hamcore/openvpn_sample.ovpn

@@ -100,38 +100,35 @@ persist-key
 persist-tun
 client
 verb 3
-auth-user-pass
-
 
 ###############################################################################
-# The certificate file of the destination VPN Server.
+# Authentication with credentials.
 # 
-# The CA certificate file is embedded in the inline format.
-# You can replace this CA contents if necessary.
-# Please note that if the server certificate is not a self-signed, you have to
-# specify the signer's root certificate (CA) here.
+# Comment the line out in case you want to use the certificate authentication.
+
+auth-user-pass
 
-<ca>
-$CA$
-</ca>
 
 
 ###############################################################################
-# The client certificate file (dummy).
-# 
-# In some implementations of OpenVPN Client software
-# (for example: OpenVPN Client for iOS),
-# a pair of client certificate and private key must be included on the
-# configuration file due to the limitation of the client.
-# So this sample configuration file has a dummy pair of client certificate
-# and private key as follows.
-
-<cert>
-$CERT$
-</cert>
-
-<key>
-$KEY$
-</key>
+# Client certificate and key.
+# 
+# A pair of client certificate and private key is required in case you want to
+# use the certificate authentication.
+# 
+# To enable it, uncomment the lines below.
+# Paste your certificate in the <cert> block and the key in the <key> one.
+
+;<cert>
+;-----BEGIN CERTIFICATE-----
+;
+;-----END CERTIFICATE-----
+;</cert>
+
+;<key>
+;-----BEGIN RSA PRIVATE KEY-----
+;
+;-----END RSA PRIVATE KEY-----
+;</key>
 
 

+ 14 - 5
src/bin/hamcore/strtable_cn.stb

@@ -157,11 +157,11 @@ ERR_91						无法断开虚拟 3 层交换机会话。要删除会话,请停
 ERR_92						具有指定名称的虚拟 3 层交换机已存在。指定一个不同的名称。
 ERR_93						找不到指定的虚拟 3 层交换机。
 ERR_94						指定的名称无效。检查名称是否有不能使用的字符
-ERR_95						无法添加虚拟 3 层接口。
-ERR_96						无法删除虚拟 3 层接口。
+ERR_95						无法添加虚拟 3 层接口。Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting interfaces are unable when the Virtual Layer 3 switch is running.
+ERR_96						无法删除虚拟 3 层接口。Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting interfaces are unable when the Virtual Layer 3 switch is running.
 ERR_97						与指定虚拟 3 层交换接口的目标虚拟 HUB 连接的虚拟 3 层接口已在虚拟 3 层交换机中存在。不能在同一个虚拟 3 层交换机中定义超过一个连接到同一个虚拟 HUB 的虚拟 3 层接口。
-ERR_98						无法添加路由表项。
-ERR_99						无法删除路由表项。
+ERR_98						无法添加路由表项。Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting routing table entries are unable when the Virtual Layer 3 switch is running.
+ERR_99						无法删除路由表项。Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting routing table entries are unable when the Virtual Layer 3 switch is running.
 ERR_100						指定的路由表项已存在。
 ERR_101						客户端和服务器的时钟彼此不同步。检查时间设置。
 ERR_102						无法启动此虚拟 3 层交换机。 要启动虚拟 3 层交换机,必须在虚拟 3 层交换机定义至少一个虚拟接口。
@@ -1607,6 +1607,7 @@ SM_LICENSE_NUM_BRIDGE		允许并发 Bridge
 SM_NO_LICENSE_COLUMN		注意: 
 SM_NO_LICENSE				因为没有产品许可证注册,此 VPN Server 通信功能无法运行。
 SM_LICENSE_DELETE_MSG		你确定要从 VPN Server 删除选定的许可证吗?
+SM_LICENSE_WARNING			SoftEther provides Dynamic DNS, NAT Traversal and VPN Azure as academic experiment services. Therefore, there services can be used for free of charge.\r\n\r\nThese services are provided without any warranty. The services may be suspended or discontinued by technical or operational matters. In such occasions, users will not be able to use the services. A user have to understand such risks, and to acknowledge that such risks are borne by a user-self. SoftEther will never be liable to results or damages of use or unable-to-use of the service.
 SM_SYSLOG_0					禁用系统日志发送功能
 SM_SYSLOG_1					经由 Syslog 发送服务器端日志
 SM_SYSLOG_2					经由 Syslog 发送服务器端和虚拟 HUB 安全日志
@@ -1802,6 +1803,9 @@ LS_LICENSE_NOT_VPNSERVER	连接 "%S": 许可证错误。VPN Client 尝试连接
 LS_LICENSE_NOT_VPNCLUSTER	连接 "%S": 许可证错误。此 VPN Server 上注册的许可证是禁止使用当前群集功能的类型,且一个 VPN Client 已尝试在群集模式下连接。您必须重启 VPN Server。
 LS_LICENSE_VIOLATION		连接 "%S": VPN Server 发生违反许可证错误,不接受连接。
 LS_LICENSE_VIOLATION_DETECTED	发现许可证违反错误,一个不同的 VPN Server 与此服务端具有相同的服务端ID "%I64u"。可能是在群集中有两个或以上 VPN Server 正在使用相同的许可证。请检查每一个 VPN Server 的许可证信息。
+LS_API_AUTH_OK			HTTPS API client "%r:%u" (%S): Administration mode: "%S": The embedded HTTPS web server accepted the successful login. Username: "%S", Method: "%S", Path: "%S"
+LS_API_AUTH_ERROR		HTTPS API client "%r:%u" (%S): The embedded HTTPS web server refused a login attempt. Username: "%S", Method: "%S", Path: "%S"
+LS_API_RPC_CALL			HTTPS API client "%r:%u" (%S): The client called a JSON-API. Method: "%S", Returned error code: %u (0 = success), Returned error message: "%s"
 
 
 # (OpenVPN Logs)
@@ -1811,6 +1815,9 @@ LO_PREFIX_CHANNEL		OpenVPN 会话%u (%r:%u -> %r:%u) 通道 %u:
 LO_NEW_CHANNEL			已创创建一个新通道。
 LO_CHANNEL_ESTABLISHED_NEWKEY	通道已建立。(触发器: Re-key完成。)
 LO_OPTION_STR_RECV		接收到的选项字符串:"%S"
+LO_CLIENT_CERT			Client certificate received (subject: CN="%s"), will use certificate authentication.
+LO_CLIENT_UNVERIFIED_CERT		Client certificate was provided but did not pass verification (error="%S"), will use password authentication.
+LO_CLIENT_NO_CERT		Client certificate is not provided, will use password authentication.
 LO_OPTION_STR_SEND		发送选项字符串:"%S"
 LO_NEW_SESSION			已创建新的会话。协议:%S
 LO_INITIATE_REKEY			re-keying 进程已开始。
@@ -1907,6 +1914,7 @@ LH_AUTH_PASSWORD			密码验证
 LH_AUTH_PLAIN_PASSWORD		外部服务器身份验证
 LH_AUTH_CERT				证书验证
 LH_AUTH_TICKET				票证验证
+LH_AUTH_OPENVPN_CERT    OpenVPN certificate authentication
 LH_AUTH_RADIUS_NOT_SUPPORT	连接 "%S": 用户 "%S" 身份验证方法 RADIUS 或 Active Directory (NT 域),但 VPN Server 是 "%S",因为 RADIUS 或 Active Directory (NT 域)不能使用。连接被拒绝。
 LH_AUTH_RADIUS_NOT_SUPPORT_ON_OPEN_SOURCE	"%S" 的连接方法: 用户 "%S" 的身份验证方法被指定为 RADIUS 身份验证或 Active Directory 身份验证 (NT 域验证)。然而,这样一个外部用户身份验证功能尚未在 SoftEther VPN 的开源版本上实施。该连接将被拒绝。
 LH_AUTH_CERT_NOT_SUPPORT_ON_OPEN_SOURCE	"%S" 的连接方法: 用户 "%S" 的身份验证方法被指定为证书认证。然而,证书验证功能尚未在 SoftEther VPN 的开源版本上实施。该连接将被拒绝。
@@ -7013,6 +7021,7 @@ SW_WEB2_TITLE						指定文件夹
 SW_UNINSTALLINFO_URL					http://selinks.org/
 SW_UNINSTALLINFO_PUBLISHER				SoftEther VPN Project
 
+SW_KB3033929_REQUIRED						In Windows 7 and Windows Server 2008 R2, some SoftEther VPN functions require the Microsoft's Windows Update module KB3033929 installed.\r\n\r\nIf KB3033929 is not installed in your Windows, please install it from Windows Update or Microsoft website before installing SoftEther VPN.
 
 SW_COMPONENTS_ABOUT_TAG				关于 %s
 SW_COMPONENTS_REQUIRE_ADMIN			安装需要管理员权限
@@ -7055,7 +7064,7 @@ SW_INSTALLER_CACHE_IS_NOT_SIGNED	目前已安装 SoftEther VPN Client 的这台
 SW_FILE_NOT_FOUNT					没有找到文件 "%s"
 SW_WEB_FINISHED						Web安装工具已创建,并保存为 "%s"。\r\n\r\n请将 ZIP 文件解压缩,并将解压后的文件上传到 Web 服务器,编辑一个HTML文件和一个 inf 文件来适当替换URL。\r\n\r\n部署 Web 安装程序的解释说明在ZIP文件中描述。
 
-SW_VG_CONFIRM_MSG					您想用 SoftEther VPN 客户端安装并激活 VPN Gate P2P 中继功能的插件吗 ?\r\n\r\n本插件可以规避官方防火墙的限制实现通信的稳定性。同时 VPN Gate 的通信经常会消耗一定的网络带宽。所以不推荐在移动连接上使用 VPN Gate。\r\n\r\n请注意,一些国家和地区有规定禁止加密通信绕过官方防火墙。在这种情况下,请您不要在您的计算机上使用 VPN Gate 功能。VPN Gate 主要在日本使用。VPN Gate 仅仅是一个学术研究项目。VPN Gate 受日本法律管辖。使用此软件和服务期间,请您遵守本国相关的法律法规,这是您自己的责任。您将完全承担使用此软件和服务造成的任何损失和责任,不管在日本境内还是境外。
+SW_VG_CONFIRM_MSG					Do you really want to install and activate the VPN Gate P2P Relay Function plug-in module with SoftEther VPN Client?\r\n\r\nThis plug-in will realize the stability of communication to bypass the government censorship firewall. However, the communication of VPN Gate usually consumes some network bandwidth. VPN Gate is not recommended to be used in the mobile connections. \r\n\r\nPlease note that there are some countries and regions which have the regulation to forbid the encrypted communications to bypass government censorship firewalls. In such a case, you must not use the VPN Gate functions on your computer. VPN Gate is intended to be used mainly in Japan. VPN Gate is a research project for just academic purpose only. VPN Gate is governed under the Japanese laws. Other countries' laws are none of our concerns nor responsibilities. By using this software and service, you must observe all concerned laws and rules with your own responsibility. You will be completely liable to any damages and responsibilities which are results of using this software and service, regardless of either inside or outside of Japan's territory.\r\n\r\nVPN Gate Relay Service will be installed on your computer as system services. System services always run in the background. After you terminate these management GUI tools, this system service will continue to run in the background. System services consume CPU time, computer power, memory and disk space.
 
 
 

+ 16 - 6
src/bin/hamcore/strtable_en.stb

@@ -157,11 +157,11 @@ ERR_91					Unable to disconnect the Virtual Layer 3 Switch session. To delete th
 ERR_92					A Virtual Layer 3 Switch with the specified name already exists. Specify a different name.
 ERR_93					Specified Virtual Layer 3 Switch not found.
 ERR_94					The specified name is invalid. Check if the name contains characters that cannot be used.
-ERR_95					Failed to add the Virtual Layer 3 interface.
-ERR_96					Failed to delete the Virtual Layer 3 interface.
+ERR_95					Failed to add the Virtual Layer 3 interface. Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting interfaces are unable when the Virtual Layer 3 switch is running.
+ERR_96					Failed to delete the Virtual Layer 3 interface. Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting interfaces are unable when the Virtual Layer 3 switch is running.
 ERR_97					The Virtual Layer 3 interface that is connecting to the destination Virtual Hub of the specified Virtual Layer 3 interface already exists in the Virtual Layer 3 Switch. No more than one Virtual Layer 3 interface that connects to the same Virtual Hub can be defined in a Virtual Layer 3 Switch.
-ERR_98					Failed to add routing table entry.
-ERR_99					Failed to delete routing table entry.
+ERR_98					Failed to add routing table entry. Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting routing table entries are unable when the Virtual Layer 3 switch is running.
+ERR_99					Failed to delete routing table entry. Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting routing table entries are unable when the Virtual Layer 3 switch is running.
 ERR_100					The specified routing table entry already exists.
 ERR_101					The client clock and the server clock are not synchronized with each other. Check the time settings.
 ERR_102					Unable to start this Virtual Layer 3 Switch. \r\n\r\nTo start the Virtual Layer 3 Switch, at least 1 virtual interface must be defined in the Virtual Layer 3 Switch.
@@ -1594,6 +1594,7 @@ SM_LICENSE_NUM_BRIDGE	Allowed Concurrent Bridges
 SM_NO_LICENSE_COLUMN	Caution: 
 SM_NO_LICENSE			Because there are no product licenses registered, this VPN Server's communication function doesn't operate.
 SM_LICENSE_DELETE_MSG	Are you sure you want to delete the selected license from the VPN Server?
+SM_LICENSE_WARNING		SoftEther provides Dynamic DNS, NAT Traversal and VPN Azure as academic experiment services. Therefore, there services can be used for free of charge.\r\n\r\nThese services are provided without any warranty. The services may be suspended or discontinued by technical or operational matters. In such occasions, users will not be able to use the services. A user have to understand such risks, and to acknowledge that such risks are borne by a user-self. SoftEther will never be liable to results or damages of use or unable-to-use of the service.
 SM_SYSLOG_0				Disable Syslog Send Function
 SM_SYSLOG_1				Send Server Logs by Syslog
 SM_SYSLOG_2				Send Server and Virtual Hub Security Logs by Syslog
@@ -1784,6 +1785,9 @@ LS_LICENSE_NOT_VPNSERVER	Connection "%S": License error occurred. The VPN Client
 LS_LICENSE_NOT_VPNCLUSTER	Connection "%S": License error occurred. The license registered on this VPN Server is of a type that prevents the use of the current clustering function and a VPN Client has attempted connection while operating in Cluster mode. You must restart the VPN Server.
 LS_LICENSE_VIOLATION		Connection "%S": A license violation has occurred on the VPN Server and connections are not being received.
 LS_LICENSE_VIOLATION_DETECTED	A license violation has been detected. A different VPN Server is operating with the same server ID "%I64u" as this VPN Server. It is possible that there are two or more VPN Servers in the cluster that are using the same license. Check the license information of each VPN Server.
+LS_API_AUTH_OK			HTTPS API client "%r:%u" (%S): Administration mode: "%S": The embedded HTTPS web server accepted the successful login. Username: "%S", Method: "%S", Path: "%S"
+LS_API_AUTH_ERROR		HTTPS API client "%r:%u" (%S): The embedded HTTPS web server refused a login attempt. Username: "%S", Method: "%S", Path: "%S"
+LS_API_RPC_CALL			HTTPS API client "%r:%u" (%S): The client called a JSON-API. Method: "%S", Returned error code: %u (0 = success), Returned error message: "%s"
 
 
 # (OpenVPN Logs)
@@ -1793,6 +1797,9 @@ LO_PREFIX_CHANNEL		OpenVPN Session %u (%r:%u -> %r:%u) Channel %u:
 LO_NEW_CHANNEL			A new channel is created.
 LO_CHANNEL_ESTABLISHED_NEWKEY	The channel is established. (Trigger: Re-key completion.)
 LO_OPTION_STR_RECV		Option Strings Received: "%S"
+LO_CLIENT_CERT			Client certificate received (subject: CN="%s"), will use certificate authentication.
+LO_CLIENT_UNVERIFIED_CERT		Client certificate was provided but did not pass verification (error="%S"), will use password authentication.
+LO_CLIENT_NO_CERT		Client certificate is not provided, will use password authentication.
 LO_OPTION_STR_SEND		Option Strings to Send: "%S"
 LO_NEW_SESSION			A new session is created. Protocol: %S
 LO_INITIATE_REKEY		The re-keying process is started.
@@ -1889,6 +1896,7 @@ LH_AUTH_PASSWORD		Password authentication
 LH_AUTH_PLAIN_PASSWORD	External server authentication
 LH_AUTH_CERT			Certificate authentication
 LH_AUTH_TICKET			Ticket authentication
+LH_AUTH_OPENVPN_CERT    OpenVPN certificate authentication
 LH_AUTH_RADIUS_NOT_SUPPORT	Connection "%S": The authentication method of the user "%S" has been specified as RADIUS Authentication or Active Directory Authentication (NT Domain Authentication). However, the edition of the VPN Server is "%S". This edition does not support RADIUS Authentication nor Active Directory Authentication (NT Domain Authentication). The connection will be denied.
 LH_AUTH_RADIUS_NOT_SUPPORT_ON_OPEN_SOURCE	Connection "%S": The authentication method of the user "%S" has been specified as RADIUS Authentication or Active Directory Authentication (NT Domain Authentication). However, such an external user-authentication function hasn't been implemented on the Open-Source version of SoftEther VPN yet. The connection will be denied.
 LH_AUTH_CERT_NOT_SUPPORT_ON_OPEN_SOURCE	Connection "%S": The authentication method of the user "%S" has been specified as Certificate Authentication. However, the Certificate Authentication function hasn't been implemented on the Open-Source version of SoftEther VPN yet. The connection will be denied.
@@ -5697,7 +5705,7 @@ CMD_UserRadiusSet_Prompt_ALIAS	Alias Name for Authentication (Optional):
 
 # UserNTLMSet コマンド
 CMD_UserNTLMSet			Set NT Domain Authentication for User Auth Type
-CMD_UserNTLMSet_Help	Use this to set NT Domain Authentication as the auth type for a user that is registered on the security account database of the currently managed Virtual Hub. When a user connects to a Virtual Hub using a user name that is set for NT Domain authentication, the user name and the user input password is sent to the Windows NT / 2000 / Server 2003 / Server 2008 / Server 2008 R2 / Server 2012 Domain Controller or Active Directory Server where the server checks the user name and password, then if the verification is successful, that user is allowed VPN connection. \nTo use NT Domain authentication, the VPN Server must be operating on a Windows NT 4.0, Windows 2000, Windows XP, Windows Vista, Windows Server 2008, Windows Server 2008 R2 or Windows Server 2012 operating system that is connected to that domain. For details please contact the VPN Server's administrator. \nTo get the list of currently registered users, use the UserList command. \nThis command cannot be run on VPN Bridge. \nYou cannot execute this command for Virtual Hubs of VPN Servers operating as a member server on a cluster.
+CMD_UserNTLMSet_Help	Use this to set NT Domain Authentication as the auth type for a user that is registered on the security account database of the currently managed Virtual Hub. When a user connects to a Virtual Hub using a user name that is set for NT Domain authentication, the user name and the user input password is sent to the Windows NT / 2000 / Server 2003 / Server 2008 / Server 2008 R2 / Server 2012 / Server 2012 R2 / Server 2016 / Server 2019 Domain Controller or Active Directory Server where the server checks the user name and password, then if the verification is successful, that user is allowed VPN connection. \nTo use NT Domain authentication, the VPN Server must be operating on a Windows operating system that is connected to that domain. For details please contact the VPN Server's administrator. \nTo get the list of currently registered users, use the UserList command. \nThis command cannot be run on VPN Bridge. \nYou cannot execute this command for Virtual Hubs of VPN Servers operating as a member server on a cluster.
 CMD_UserNTLMSet_Args	UserNTLMSet [name] [/ALIAS:alias_name]
 CMD_UserNTLMSet_[name]	Specify the user name of the user whose setting you want to change.
 CMD_UserNTLMSet_ALIAS	When this parameter is set, it is possible to make the user name sent to the NT Domain or Active Directory server different to the user name on the Virtual Hub. When this is not set, please specify /ALIAS:none (the user name on the Virtual Hub will be used). If the user name is "*", the /ALIAS parameter will be ignored. To read an explanation of the "*" user, please input UserCreate/HELP to display this information.
@@ -7006,6 +7014,8 @@ SW_WEB2_TITLE								Specify Files
 SW_UNINSTALLINFO_URL						http://selinks.org/
 SW_UNINSTALLINFO_PUBLISHER					SoftEther VPN Project
 
+SW_KB3033929_REQUIRED						In Windows 7 and Windows Server 2008 R2, some SoftEther VPN functions require the Microsoft's Windows Update module KB3033929 installed.\r\n\r\nIf KB3033929 is not installed in your Windows, please install it from Windows Update or Microsoft website before installing SoftEther VPN.
+
 
 SW_COMPONENTS_ABOUT_TAG						About %s
 SW_COMPONENTS_REQUIRE_ADMIN					Installation Requires Administrators Privileges
@@ -7048,7 +7058,7 @@ SW_INSTALLER_CACHE_IS_NOT_SIGNED			The currently installed SoftEther VPN Client
 SW_FILE_NOT_FOUNT							The file "%s" not found.
 SW_WEB_FINISHED								The Web Installer is created and saved as "%s".\r\n\r\nPlease extract inner files from the ZIP file, upload them into the Web server, and edit a HTML file and an inf file to replace URLs appropriately.\r\n\r\nThe explanation to deploy the Web Installer is described on the ZIP file.
 
-SW_VG_CONFIRM_MSG							Do you really want to install and activate the VPN Gate P2P Relay Function plug-in module with SoftEther VPN Client?\r\n\r\nThis plug-in will realize the stability of communication to bypass the government censorship firewall. However, the communication of VPN Gate usually consumes some network bandwidth. VPN Gate is not recommended to be used in the mobile connections. \r\n\r\nPlease note that there are some countries and regions which have the regulation to forbid the encrypted communications to bypass government censorship firewalls. In such a case, you must not use the VPN Gate functions on your computer. VPN Gate is intended to be used mainly in Japan. VPN Gate is a research project for just academic purpose only. VPN Gate is governed under the Japanese laws. Other countries' laws are none of our concerns nor responsibilities. By using this software and service, you must observe all concerned laws and rules with your own responsibility. You will be completely liable to any damages and responsibilities which are results of using this software and service, regardless of either inside or outside of Japan's territory.
+SW_VG_CONFIRM_MSG							Do you really want to install and activate the VPN Gate P2P Relay Function plug-in module with SoftEther VPN Client?\r\n\r\nThis plug-in will realize the stability of communication to bypass the government censorship firewall. However, the communication of VPN Gate usually consumes some network bandwidth. VPN Gate is not recommended to be used in the mobile connections. \r\n\r\nPlease note that there are some countries and regions which have the regulation to forbid the encrypted communications to bypass government censorship firewalls. In such a case, you must not use the VPN Gate functions on your computer. VPN Gate is intended to be used mainly in Japan. VPN Gate is a research project for just academic purpose only. VPN Gate is governed under the Japanese laws. Other countries' laws are none of our concerns nor responsibilities. By using this software and service, you must observe all concerned laws and rules with your own responsibility. You will be completely liable to any damages and responsibilities which are results of using this software and service, regardless of either inside or outside of Japan's territory.\r\n\r\nVPN Gate Relay Service will be installed on your computer as system services. System services always run in the background. After you terminate these management GUI tools, this system service will continue to run in the background. System services consume CPU time, computer power, memory and disk space.
 
 
 

文件差异内容过多而无法显示
+ 5 - 4
src/bin/hamcore/strtable_ja.stb


+ 14648 - 0
src/bin/hamcore/vpnserver_api_doc.html

@@ -0,0 +1,14648 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+	<title>SoftEther VPN Server JSON-RPC Suite Document</title>
+	<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/2.10.0/github-markdown.css">
+	<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.15.0/themes/prism.css">
+</head>
+<body>
+	<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.15.0/prism.js"></script>
+	<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.15.0/components/prism-json.js"></script>
+	<article class="markdown-body">
+<h1 id="softether-vpn-server-json-rpc-api-suite-document">SoftEther VPN Server JSON-RPC API Suite Document</h1>
+<p>This reference describes all JSON-RPC functions available on SoftEther VPN Server.</p>
+<p>You can access to the latest <a href="https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/">SoftEther VPN Server JSON-RPC Document on GitHub</a>.</p>
+<h2 id="what-is-softether-vpn-server-json-rpc-api-suite">What is SoftEther VPN Server JSON-RPC API Suite?</h2>
+<p>The API Suite allows you to easily develop your original SoftEther VPN Server management application to control the VPN Server (e.g. creating users, adding Virtual Hubs, disconnecting a specified VPN sessions).</p>
+<ul>
+<li>Almost all control APIs, which the VPN Server provides, are available as JSON-RPC API.</li>
+<li>You can write your own VPN Server management application in your favorite languages (JavaScript, TypeScript, Java, Python, Ruby, C#, ... etc.)</li>
+<li>If you are planning to develop your own VPN cloud service, the JSON-RPC API is the best choice to realize the automated operations for the VPN Server.</li>
+<li>No need to use any specific API client library since all APIs are provided on the <a href="https://www.jsonrpc.org/specification">JSON-RPC 2.0 Specification</a>. You can use your favorite JSON and HTTPS client library to call any of all APIs in your pure runtime environment.</li>
+<li>Also, the SoftEther VPN Project provides high-quality JSON-RPC client stub libraries which define all of the API client stub codes. These libraries are written in C#, JavaScript and TypeScript. <a href="https://www.npmjs.com/package/vpnrpc">The Node.js Client Library for VPN Server RPC (vpnrpc)</a> package is also available.</li>
+</ul>
+<h2 id="principle">Principle</h2>
+<h3 id="entry-point">Entry point</h3>
+<p>The entry point URL of JSON-RPC is:</p>
+<pre><code>https://&lt;vpn_server_hostname&gt;:&lt;port&gt;/api/
+</code></pre>
+<ul>
+<li>Older versions of SoftEther VPN before June 2019 don't support JSON-RPC APIs.</li>
+<li>If you want to completely disable the JSON-RPC on your VPN Server, set the <code>DisableJsonRpcWebApi</code> variable to <code>true</code> on the <code>vpn_server.config</code>.</li>
+</ul>
+<h3 id="json-rpc-specification">JSON-RPC specification</h3>
+<p>You must use HTTPS 1.1 <code>POST</code> method to call each of JSON-RPC APIs.<br />
+All APIs are based on the <a href="https://www.jsonrpc.org/specification">JSON-RPC 2.0 Specification</a>.</p>
+<ul>
+<li>JSON-RPC Notification is not supported.</li>
+<li>JSON-RPC Batch is not supported.</li>
+</ul>
+<h3 id="vpnrpc-node.js-client-library-package-for-vpn-server-json-rpc">&quot;vpnrpc&quot;: Node.js Client Library package for VPN Server JSON-RPC</h3>
+<p>If you are willing to develop your original JSON-RPC client for SoftEther VPN, you can use the <a href="https://www.npmjs.com/package/vpnrpc">JavaScript Client Library for VPN Server RPC (vpnrpc)</a>.</p>
+<ul>
+<li>You can use the <code>vpnrpc</code> library in JavaScript for both web browsers (e.g. Chrome, FireFox or Edge) and Node.js.</li>
+<li>As a sample code there is the <a href="https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-typescript/sample.ts">sample.ts</a> program in TypeScript. This sample calls all of available JSON-RPC APIs against the specified SoftEther VPN Server. (Note: This sample code is written in TypeScript.)</li>
+</ul>
+<p>You can use the following command to download the <code>vpnrpc</code> library package with Node.js.</p>
+<pre><code>$ npm install --save-dev vpnrpc
+</code></pre>
+<h3 id="vpnrpc.ts-typescript-client-library-for-vpn-server-json-rpc">&quot;vpnrpc.ts&quot;: TypeScript Client Library for VPN Server JSON-RPC</h3>
+<p>If you are willing to develop your original JSON-RPC client for SoftEther VPN, you can use the <a href="https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-typescript/">TypeScript Client Library for VPN Server RPC (vpnrpc.ts)</a>.</p>
+<ul>
+<li>You can use the <a href="https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-typescript/vpnrpc.ts">vpnrpc.ts</a> library in TypeScript / JavaScript for both web browsers (e.g. Chrome, FireFox or Edge) and Node.js.</li>
+<li>As a sample code there is the <a href="https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-typescript/sample.ts">sample.ts</a> program in TypeScript. This sample calls one by one all of available JSON-RPC APIs against the specified SoftEther VPN Server.</li>
+</ul>
+<h3 id="vpnserver-jsonrpc-client-csharp-c-client-library-for-vpn-server-json-rpc">&quot;vpnserver-jsonrpc-client-csharp&quot;: C# Client Library for VPN Server JSON-RPC</h3>
+<p>If you are willing to develop your original JSON-RPC client for SoftEther VPN, you can use the <a href="https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/">vpnserver-jsonrpc-client-csharp C# library</a>.</p>
+<ul>
+<li>The <a href="https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/rpc-stubs/">client library codes for C#</a> is written in pure C# 7.3. It works on .NET Core 2.1 or later on Windows, Linux and macOS. Very comfort with Visual Studio for both Windows or macOS.</li>
+<li>As a sample code there is the <a href="https://github.com/SoftEtherVPN/SoftEtherVPN/blob/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/sample/VpnServerRpcTest.cs">VpnServerRpcTest.cs</a> program in C#. This sample calls one by one all of available JSON-RPC APIs against the specified SoftEther VPN Server.</li>
+</ul>
+<h3 id="https-authentication">HTTPS Authentication</h3>
+<p>You must specify the following HTTPS custom headers for authentication on each of requests.</p>
+<table>
+<thead>
+<tr>
+<th>Value</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>X-VPNADMIN-HUBNAME</code></td>
+<td>The name of the Virtual Hub if you want to connect to the VPN Server as a Virtual Hub Admin Mode. Specify empty string if you want to connect to the VPN Server as the Entire VPN Server Admin Mode.</td>
+</tr>
+<tr>
+<td><code>X-VPNADMIN-PASSWORD</code></td>
+<td>Specify the administration password.</td>
+</tr>
+</tbody>
+</table>
+<ul>
+<li>You can omit the above HTTPS custom authentication headers if you are calling JSON-RPC APIs from the web browser which is already logged in to the VPN Server with HTTPS Basic Authentication. In such usage the credential of HTTPS Basic Authtication will be used.</li>
+</ul>
+<hr />
+<h2 id="table-of-contents">Table of contents</h2>
+<ul>
+<li><a href="#test">Test - Test RPC function</a></li>
+<li><a href="#getserverinfo">GetServerInfo - Get server information</a></li>
+<li><a href="#getserverstatus">GetServerStatus - Get Current Server Status</a></li>
+<li><a href="#createlistener">CreateListener - Create New TCP Listener</a></li>
+<li><a href="#enumlistener">EnumListener - Get List of TCP Listeners</a></li>
+<li><a href="#deletelistener">DeleteListener - Delete TCP Listener</a></li>
+<li><a href="#enablelistener">EnableListener - Enable / Disable TCP Listener</a></li>
+<li><a href="#setserverpassword">SetServerPassword - Set VPN Server Administrator Password</a></li>
+<li><a href="#setfarmsetting">SetFarmSetting - Set the VPN Server clustering configuration</a></li>
+<li><a href="#getfarmsetting">GetFarmSetting - Get Clustering Configuration of Current VPN Server</a></li>
+<li><a href="#getfarminfo">GetFarmInfo - Get Cluster Member Information</a></li>
+<li><a href="#enumfarmmember">EnumFarmMember - Get List of Cluster Members</a></li>
+<li><a href="#getfarmconnectionstatus">GetFarmConnectionStatus - Get Connection Status to Cluster Controller</a></li>
+<li><a href="#setservercert">SetServerCert - Set SSL Certificate and Private Key of VPN Server</a></li>
+<li><a href="#getservercert">GetServerCert - Get SSL Certificate and Private Key of VPN Server</a></li>
+<li><a href="#getservercipher">GetServerCipher - Get the Encrypted Algorithm Used for VPN Communication</a></li>
+<li><a href="#setservercipher">SetServerCipher - Set the Encrypted Algorithm Used for VPN Communication</a></li>
+<li><a href="#createhub">CreateHub - Create New Virtual Hub</a></li>
+<li><a href="#sethub">SetHub - Set the Virtual Hub configuration</a></li>
+<li><a href="#gethub">GetHub - Get the Virtual Hub configuration</a></li>
+<li><a href="#enumhub">EnumHub - Get List of Virtual Hubs</a></li>
+<li><a href="#deletehub">DeleteHub - Delete Virtual Hub</a></li>
+<li><a href="#gethubradius">GetHubRadius - Get Setting of RADIUS Server Used for User Authentication</a></li>
+<li><a href="#sethubradius">SetHubRadius - Set RADIUS Server to use for User Authentication</a></li>
+<li><a href="#enumconnection">EnumConnection - Get List of TCP Connections Connecting to the VPN Server</a></li>
+<li><a href="#disconnectconnection">DisconnectConnection - Disconnect TCP Connections Connecting to the VPN Server</a></li>
+<li><a href="#getconnectioninfo">GetConnectionInfo - Get Information of TCP Connections Connecting to the VPN Server</a></li>
+<li><a href="#sethubonline">SetHubOnline - Switch Virtual Hub to Online or Offline</a></li>
+<li><a href="#gethubstatus">GetHubStatus - Get Current Status of Virtual Hub</a></li>
+<li><a href="#sethublog">SetHubLog - Set the logging configuration of the Virtual Hub</a></li>
+<li><a href="#gethublog">GetHubLog - Get the logging configuration of the Virtual Hub</a></li>
+<li><a href="#addca">AddCa - Add Trusted CA Certificate</a></li>
+<li><a href="#enumca">EnumCa - Get List of Trusted CA Certificates</a></li>
+<li><a href="#getca">GetCa - Get Trusted CA Certificate</a></li>
+<li><a href="#deleteca">DeleteCa - Delete Trusted CA Certificate</a></li>
+<li><a href="#createlink">CreateLink - Create New Cascade Connection</a></li>
+<li><a href="#getlink">GetLink - Get the Cascade Connection Setting</a></li>
+<li><a href="#setlink">SetLink - Change Existing Cascade Connection</a></li>
+<li><a href="#enumlink">EnumLink - Get List of Cascade Connections</a></li>
+<li><a href="#setlinkonline">SetLinkOnline - Switch Cascade Connection to Online Status</a></li>
+<li><a href="#setlinkoffline">SetLinkOffline - Switch Cascade Connection to Offline Status</a></li>
+<li><a href="#deletelink">DeleteLink - Delete Cascade Connection Setting</a></li>
+<li><a href="#renamelink">RenameLink - Change Name of Cascade Connection</a></li>
+<li><a href="#getlinkstatus">GetLinkStatus - Get Current Cascade Connection Status</a></li>
+<li><a href="#addaccess">AddAccess - Add Access List Rule</a></li>
+<li><a href="#deleteaccess">DeleteAccess - Delete Rule from Access List</a></li>
+<li><a href="#enumaccess">EnumAccess - Get Access List Rule List</a></li>
+<li><a href="#setaccesslist">SetAccessList - Replace all access lists on a single bulk API call</a></li>
+<li><a href="#createuser">CreateUser - Create a user</a></li>
+<li><a href="#setuser">SetUser - Change User Settings</a></li>
+<li><a href="#getuser">GetUser - Get User Settings</a></li>
+<li><a href="#deleteuser">DeleteUser - Delete a user</a></li>
+<li><a href="#enumuser">EnumUser - Get List of Users</a></li>
+<li><a href="#creategroup">CreateGroup - Create Group</a></li>
+<li><a href="#setgroup">SetGroup - Set group settings</a></li>
+<li><a href="#getgroup">GetGroup - Get Group Setting (Sync mode)</a></li>
+<li><a href="#deletegroup">DeleteGroup - Delete User from Group</a></li>
+<li><a href="#enumgroup">EnumGroup - Get List of Groups</a></li>
+<li><a href="#enumsession">EnumSession - Get List of Connected VPN Sessions</a></li>
+<li><a href="#getsessionstatus">GetSessionStatus - Get Session Status</a></li>
+<li><a href="#deletesession">DeleteSession - Disconnect Session</a></li>
+<li><a href="#enummactable">EnumMacTable - Get the MAC Address Table Database</a></li>
+<li><a href="#deletemactable">DeleteMacTable - Delete MAC Address Table Entry</a></li>
+<li><a href="#enumiptable">EnumIpTable - Get the IP Address Table Database</a></li>
+<li><a href="#deleteiptable">DeleteIpTable - Delete IP Address Table Entry</a></li>
+<li><a href="#setkeep">SetKeep - Set the Keep Alive Internet Connection Function</a></li>
+<li><a href="#getkeep">GetKeep - Get the Keep Alive Internet Connection Function</a></li>
+<li><a href="#enablesecurenat">EnableSecureNAT - Enable the Virtual NAT and DHCP Server Function (SecureNAT Function)</a></li>
+<li><a href="#disablesecurenat">DisableSecureNAT - Disable the Virtual NAT and DHCP Server Function (SecureNAT Function)</a></li>
+<li><a href="#setsecurenatoption">SetSecureNATOption - Change Settings of SecureNAT Function</a></li>
+<li><a href="#getsecurenatoption">GetSecureNATOption - Get Settings of SecureNAT Function</a></li>
+<li><a href="#enumnat">EnumNAT - Get Virtual NAT Function Session Table of SecureNAT Function</a></li>
+<li><a href="#enumdhcp">EnumDHCP - Get Virtual DHCP Server Function Lease Table of SecureNAT Function</a></li>
+<li><a href="#getsecurenatstatus">GetSecureNATStatus - Get the Operating Status of the Virtual NAT and DHCP Server Function (SecureNAT Function)</a></li>
+<li><a href="#enumethernet">EnumEthernet - Get List of Network Adapters Usable as Local Bridge</a></li>
+<li><a href="#addlocalbridge">AddLocalBridge - Create Local Bridge Connection</a></li>
+<li><a href="#deletelocalbridge">DeleteLocalBridge - Delete Local Bridge Connection</a></li>
+<li><a href="#enumlocalbridge">EnumLocalBridge - Get List of Local Bridge Connection</a></li>
+<li><a href="#getbridgesupport">GetBridgeSupport - Get whether the localbridge function is supported on the current system</a></li>
+<li><a href="#rebootserver">RebootServer - Reboot VPN Server Service</a></li>
+<li><a href="#getcaps">GetCaps - Get List of Server Functions / Capability</a></li>
+<li><a href="#getconfig">GetConfig - Get the current configuration of the VPN Server</a></li>
+<li><a href="#setconfig">SetConfig - Write Configuration File to VPN Server</a></li>
+<li><a href="#getdefaulthubadminoptions">GetDefaultHubAdminOptions - Get Virtual Hub Administration Option default values</a></li>
+<li><a href="#gethubadminoptions">GetHubAdminOptions - Get List of Virtual Hub Administration Options</a></li>
+<li><a href="#sethubadminoptions">SetHubAdminOptions - Set Values of Virtual Hub Administration Options</a></li>
+<li><a href="#gethubextoptions">GetHubExtOptions - Get List of Virtual Hub Extended Options</a></li>
+<li><a href="#sethubextoptions">SetHubExtOptions - Set a Value of Virtual Hub Extended Options</a></li>
+<li><a href="#addl3switch">AddL3Switch - Define New Virtual Layer 3 Switch</a></li>
+<li><a href="#dell3switch">DelL3Switch - Delete Virtual Layer 3 Switch</a></li>
+<li><a href="#enuml3switch">EnumL3Switch - Get List of Virtual Layer 3 Switches</a></li>
+<li><a href="#startl3switch">StartL3Switch - Start Virtual Layer 3 Switch Operation</a></li>
+<li><a href="#stopl3switch">StopL3Switch - Stop Virtual Layer 3 Switch Operation</a></li>
+<li><a href="#addl3if">AddL3If - Add Virtual Interface to Virtual Layer 3 Switch</a></li>
+<li><a href="#dell3if">DelL3If - Delete Virtual Interface of Virtual Layer 3 Switch</a></li>
+<li><a href="#enuml3if">EnumL3If - Get List of Interfaces Registered on the Virtual Layer 3 Switch</a></li>
+<li><a href="#addl3table">AddL3Table - Add Routing Table Entry for Virtual Layer 3 Switch</a></li>
+<li><a href="#dell3table">DelL3Table - Delete Routing Table Entry of Virtual Layer 3 Switch</a></li>
+<li><a href="#enuml3table">EnumL3Table - Get List of Routing Tables of Virtual Layer 3 Switch</a></li>
+<li><a href="#enumcrl">EnumCrl - Get List of Certificates Revocation List</a></li>
+<li><a href="#addcrl">AddCrl - Add a Revoked Certificate</a></li>
+<li><a href="#delcrl">DelCrl - Delete a Revoked Certificate</a></li>
+<li><a href="#getcrl">GetCrl - Get a Revoked Certificate</a></li>
+<li><a href="#setcrl">SetCrl - Change Existing CRL (Certificate Revocation List) Entry</a></li>
+<li><a href="#setaclist">SetAcList - Add Rule to Source IP Address Limit List</a></li>
+<li><a href="#getaclist">GetAcList - Get List of Rule Items of Source IP Address Limit List</a></li>
+<li><a href="#enumlogfile">EnumLogFile - Get List of Log Files</a></li>
+<li><a href="#readlogfile">ReadLogFile - Download a part of Log File</a></li>
+<li><a href="#setsyslog">SetSysLog - Set syslog Send Function</a></li>
+<li><a href="#getsyslog">GetSysLog - Get syslog Send Function</a></li>
+<li><a href="#sethubmsg">SetHubMsg - Set Today's Message of Virtual Hub</a></li>
+<li><a href="#gethubmsg">GetHubMsg - Get Today's Message of Virtual Hub</a></li>
+<li><a href="#crash">Crash - Raise a vital error on the VPN Server / Bridge to terminate the process forcefully</a></li>
+<li><a href="#getadminmsg">GetAdminMsg - Get the message for administrators</a></li>
+<li><a href="#flush">Flush - Save All Volatile Data of VPN Server / Bridge to the Configuration File</a></li>
+<li><a href="#setipsecservices">SetIPsecServices - Enable or Disable IPsec VPN Server Function</a></li>
+<li><a href="#getipsecservices">GetIPsecServices - Get the Current IPsec VPN Server Settings</a></li>
+<li><a href="#addetheripid">AddEtherIpId - Add New EtherIP / L2TPv3 over IPsec Client Setting to Accept EthreIP / L2TPv3 Client Devices</a></li>
+<li><a href="#getetheripid">GetEtherIpId - Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions</a></li>
+<li><a href="#deleteetheripid">DeleteEtherIpId - Delete an EtherIP / L2TPv3 over IPsec Client Setting</a></li>
+<li><a href="#enumetheripid">EnumEtherIpId - Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions</a></li>
+<li><a href="#setopenvpnsstpconfig">SetOpenVpnSstpConfig - Set Settings for OpenVPN Clone Server Function</a></li>
+<li><a href="#getopenvpnsstpconfig">GetOpenVpnSstpConfig - Get the Current Settings of OpenVPN Clone Server Function</a></li>
+<li><a href="#getddnsclientstatus">GetDDnsClientStatus - Show the Current Status of Dynamic DNS Function</a></li>
+<li><a href="#changeddnsclienthostname">ChangeDDnsClientHostname - Set the Dynamic DNS Hostname</a></li>
+<li><a href="#regenerateservercert">RegenerateServerCert - Generate New Self-Signed Certificate with Specified CN (Common Name) and Register on VPN Server</a></li>
+<li><a href="#makeopenvpnconfigfile">MakeOpenVpnConfigFile - Generate a Sample Setting File for OpenVPN Client</a></li>
+<li><a href="#setspeciallistener">SetSpecialListener - Enable / Disable the VPN over ICMP / VPN over DNS Server Function</a></li>
+<li><a href="#getspeciallistener">GetSpecialListener - Get Current Setting of the VPN over ICMP / VPN over DNS Function</a></li>
+<li><a href="#getazurestatus">GetAzureStatus - Show the current status of VPN Azure function</a></li>
+<li><a href="#setazurestatus">SetAzureStatus - Enable / Disable VPN Azure Function</a></li>
+<li><a href="#getddnsinternetsettng">GetDDnsInternetSettng - Get the Proxy Settings for Connecting to the DDNS server</a></li>
+<li><a href="#setddnsinternetsettng">SetDDnsInternetSettng - Set the Proxy Settings for Connecting to the DDNS server</a></li>
+<li><a href="#setvgsconfig">SetVgsConfig - Set the VPN Gate Server Configuration</a></li>
+<li><a href="#getvgsconfig">GetVgsConfig - Get the VPN Gate Server Configuration</a></li>
+</ul>
+<hr />
+<p><a id="test"></a></p>
+<h2 id="test-rpc-api-test-rpc-function">&quot;Test&quot; RPC API - Test RPC function</h2>
+<h3 id="description">Description</h3>
+<p>Test RPC function. Input any integer value to the IntValue_u32 field. Then the server will convert the integer to the string, and return the string in the StrValue_str field.</p>
+<h3 id="input-json-rpc-format">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;Test&quot;,
+  &quot;params&quot;: {
+    &quot;IntValue_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;IntValue_u32&quot;: 0,
+    &quot;Int64Value_u64&quot;: 0,
+    &quot;StrValue_str&quot;: &quot;strvalue&quot;,
+    &quot;UniStrValue_utf&quot;: &quot;unistrvalue&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>IntValue_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>A 32-bit integer field</td>
+</tr>
+<tr>
+<td><code>Int64Value_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>A 64-bit integer field</td>
+</tr>
+<tr>
+<td><code>StrValue_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>An Ascii string field</td>
+</tr>
+<tr>
+<td><code>UniStrValue_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>An UTF-8 string field</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getserverinfo"></a></p>
+<h2 id="getserverinfo-rpc-api-get-server-information">&quot;GetServerInfo&quot; RPC API - Get server information</h2>
+<h3 id="description-1">Description</h3>
+<p>Get server information. This allows you to obtain the server information of the currently connected VPN Server or VPN Bridge. Included in the server information are the version number, build number and build information. You can also obtain information on the current server operation mode and the information of operating system that the server is operating on.</p>
+<h3 id="input-json-rpc-format-1">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetServerInfo&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-1">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;ServerProductName_str&quot;: &quot;serverproductname&quot;,
+    &quot;ServerVersionString_str&quot;: &quot;serverversionstring&quot;,
+    &quot;ServerBuildInfoString_str&quot;: &quot;serverbuildinfostring&quot;,
+    &quot;ServerVerInt_u32&quot;: 0,
+    &quot;ServerBuildInt_u32&quot;: 0,
+    &quot;ServerHostName_str&quot;: &quot;serverhostname&quot;,
+    &quot;ServerType_u32&quot;: 0,
+    &quot;ServerBuildDate_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;ServerFamilyName_str&quot;: &quot;serverfamilyname&quot;,
+    &quot;OsType_u32&quot;: 0,
+    &quot;OsServicePack_u32&quot;: 0,
+    &quot;OsSystemName_str&quot;: &quot;ossystemname&quot;,
+    &quot;OsProductName_str&quot;: &quot;osproductname&quot;,
+    &quot;OsVendorName_str&quot;: &quot;osvendorname&quot;,
+    &quot;OsVersion_str&quot;: &quot;osversion&quot;,
+    &quot;KernelName_str&quot;: &quot;kernelname&quot;,
+    &quot;KernelVersion_str&quot;: &quot;kernelversion&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-1">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>ServerProductName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Server product name</td>
+</tr>
+<tr>
+<td><code>ServerVersionString_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Server version string</td>
+</tr>
+<tr>
+<td><code>ServerBuildInfoString_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Server build information string</td>
+</tr>
+<tr>
+<td><code>ServerVerInt_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Server version integer value</td>
+</tr>
+<tr>
+<td><code>ServerBuildInt_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Server build number integer value</td>
+</tr>
+<tr>
+<td><code>ServerHostName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Server host name</td>
+</tr>
+<tr>
+<td><code>ServerType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Type of server<BR>Values:<BR><code>0</code>: Stand-alone server<BR><code>1</code>: Farm controller server<BR><code>2</code>: Farm member server</td>
+</tr>
+<tr>
+<td><code>ServerBuildDate_dt</code></td>
+<td><code>Date</code></td>
+<td>Build date and time of the server</td>
+</tr>
+<tr>
+<td><code>ServerFamilyName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Family name</td>
+</tr>
+<tr>
+<td><code>OsType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>OS type<BR>Values:<BR><code>1100</code>: Windows 95<BR><code>1200</code>: Windows 98<BR><code>1300</code>: Windows Me<BR><code>1400</code>: Windows (unknown)<BR><code>2100</code>: Windows NT 4.0 Workstation<BR><code>2110</code>: Windows NT 4.0 Server<BR><code>2111</code>: Windows NT 4.0 Server, Enterprise Edition<BR><code>2112</code>: Windows NT 4.0 Terminal Server<BR><code>2113</code>: BackOffice Server 4.5<BR><code>2114</code>: Small Business Server 4.5<BR><code>2200</code>: Windows 2000 Professional<BR><code>2211</code>: Windows 2000 Server<BR><code>2212</code>: Windows 2000 Advanced Server<BR><code>2213</code>: Windows 2000 Datacenter Server<BR><code>2214</code>: BackOffice Server 2000<BR><code>2215</code>: Small Business Server 2000<BR><code>2300</code>: Windows XP Home Edition<BR><code>2301</code>: Windows XP Professional<BR><code>2410</code>: Windows Server 2003 Web Edition<BR><code>2411</code>: Windows Server 2003 Standard Edition<BR><code>2412</code>: Windows Server 2003 Enterprise Edition<BR><code>2413</code>: Windows Server 2003 DataCenter Edition<BR><code>2414</code>: BackOffice Server 2003<BR><code>2415</code>: Small Business Server 2003<BR><code>2500</code>: Windows Vista<BR><code>2510</code>: Windows Server 2008<BR><code>2600</code>: Windows 7<BR><code>2610</code>: Windows Server 2008 R2<BR><code>2700</code>: Windows 8<BR><code>2710</code>: Windows Server 2012<BR><code>2701</code>: Windows 8.1<BR><code>2711</code>: Windows Server 2012 R2<BR><code>2702</code>: Windows 10<BR><code>2712</code>: Windows Server 10<BR><code>2800</code>: Windows 11 or later<BR><code>2810</code>: Windows Server 11 or later<BR><code>3000</code>: Unknown UNIX<BR><code>3100</code>: Linux<BR><code>3200</code>: Solaris<BR><code>3300</code>: Cygwin<BR><code>3400</code>: BSD<BR><code>3500</code>: MacOS X</td>
+</tr>
+<tr>
+<td><code>OsServicePack_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Service pack number</td>
+</tr>
+<tr>
+<td><code>OsSystemName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>OS system name</td>
+</tr>
+<tr>
+<td><code>OsProductName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>OS product name</td>
+</tr>
+<tr>
+<td><code>OsVendorName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>OS vendor name</td>
+</tr>
+<tr>
+<td><code>OsVersion_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>OS version</td>
+</tr>
+<tr>
+<td><code>KernelName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Kernel name</td>
+</tr>
+<tr>
+<td><code>KernelVersion_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Kernel version</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getserverstatus"></a></p>
+<h2 id="getserverstatus-rpc-api-get-current-server-status">&quot;GetServerStatus&quot; RPC API - Get Current Server Status</h2>
+<h3 id="description-2">Description</h3>
+<p>Get Current Server Status. This allows you to obtain in real-time the current status of the currently connected VPN Server or VPN Bridge. You can get statistical information on data communication and the number of different kinds of objects that exist on the server. You can get information on how much memory is being used on the current computer by the OS.</p>
+<h3 id="input-json-rpc-format-2">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetServerStatus&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-2">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;ServerType_u32&quot;: 0,
+    &quot;NumTcpConnections_u32&quot;: 0,
+    &quot;NumTcpConnectionsLocal_u32&quot;: 0,
+    &quot;NumTcpConnectionsRemote_u32&quot;: 0,
+    &quot;NumHubTotal_u32&quot;: 0,
+    &quot;NumHubStandalone_u32&quot;: 0,
+    &quot;NumHubStatic_u32&quot;: 0,
+    &quot;NumHubDynamic_u32&quot;: 0,
+    &quot;NumSessionsTotal_u32&quot;: 0,
+    &quot;NumSessionsLocal_u32&quot;: 0,
+    &quot;NumSessionsRemote_u32&quot;: 0,
+    &quot;NumMacTables_u32&quot;: 0,
+    &quot;NumIpTables_u32&quot;: 0,
+    &quot;NumUsers_u32&quot;: 0,
+    &quot;NumGroups_u32&quot;: 0,
+    &quot;AssignedBridgeLicenses_u32&quot;: 0,
+    &quot;AssignedClientLicenses_u32&quot;: 0,
+    &quot;AssignedBridgeLicensesTotal_u32&quot;: 0,
+    &quot;AssignedClientLicensesTotal_u32&quot;: 0,
+    &quot;Recv.BroadcastBytes_u64&quot;: 0,
+    &quot;Recv.BroadcastCount_u64&quot;: 0,
+    &quot;Recv.UnicastBytes_u64&quot;: 0,
+    &quot;Recv.UnicastCount_u64&quot;: 0,
+    &quot;Send.BroadcastBytes_u64&quot;: 0,
+    &quot;Send.BroadcastCount_u64&quot;: 0,
+    &quot;Send.UnicastBytes_u64&quot;: 0,
+    &quot;Send.UnicastCount_u64&quot;: 0,
+    &quot;CurrentTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;CurrentTick_u64&quot;: 0,
+    &quot;StartTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;TotalMemory_u64&quot;: 0,
+    &quot;UsedMemory_u64&quot;: 0,
+    &quot;FreeMemory_u64&quot;: 0,
+    &quot;TotalPhys_u64&quot;: 0,
+    &quot;UsedPhys_u64&quot;: 0,
+    &quot;FreePhys_u64&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="parameters-2">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>ServerType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Type of server<BR>Values:<BR><code>0</code>: Stand-alone server<BR><code>1</code>: Farm controller server<BR><code>2</code>: Farm member server</td>
+</tr>
+<tr>
+<td><code>NumTcpConnections_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Total number of TCP connections</td>
+</tr>
+<tr>
+<td><code>NumTcpConnectionsLocal_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of Local TCP connections</td>
+</tr>
+<tr>
+<td><code>NumTcpConnectionsRemote_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of remote TCP connections</td>
+</tr>
+<tr>
+<td><code>NumHubTotal_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Total number of HUBs</td>
+</tr>
+<tr>
+<td><code>NumHubStandalone_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Nymber of stand-alone HUB</td>
+</tr>
+<tr>
+<td><code>NumHubStatic_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of static HUBs</td>
+</tr>
+<tr>
+<td><code>NumHubDynamic_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of Dynamic HUBs</td>
+</tr>
+<tr>
+<td><code>NumSessionsTotal_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Total number of sessions</td>
+</tr>
+<tr>
+<td><code>NumSessionsLocal_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of local VPN sessions</td>
+</tr>
+<tr>
+<td><code>NumSessionsRemote_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>The number of remote sessions</td>
+</tr>
+<tr>
+<td><code>NumMacTables_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of MAC table entries (total sum of all Virtual Hubs)</td>
+</tr>
+<tr>
+<td><code>NumIpTables_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of IP table entries (total sum of all Virtual Hubs)</td>
+</tr>
+<tr>
+<td><code>NumUsers_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of users (total sum of all Virtual Hubs)</td>
+</tr>
+<tr>
+<td><code>NumGroups_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of groups (total sum of all Virtual Hubs)</td>
+</tr>
+<tr>
+<td><code>AssignedBridgeLicenses_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of assigned bridge licenses (Useful to make a commercial version)</td>
+</tr>
+<tr>
+<td><code>AssignedClientLicenses_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of assigned client licenses (Useful to make a commercial version)</td>
+</tr>
+<tr>
+<td><code>AssignedBridgeLicensesTotal_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of Assigned bridge license (cluster-wide), useful to make a commercial version</td>
+</tr>
+<tr>
+<td><code>AssignedClientLicensesTotal_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of assigned client licenses (cluster-wide), useful to make a commercial version</td>
+</tr>
+<tr>
+<td><code>Recv.BroadcastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Number of broadcast packets (Recv)</td>
+</tr>
+<tr>
+<td><code>Recv.BroadcastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Broadcast bytes (Recv)</td>
+</tr>
+<tr>
+<td><code>Recv.UnicastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast count (Recv)</td>
+</tr>
+<tr>
+<td><code>Recv.UnicastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Recv)</td>
+</tr>
+<tr>
+<td><code>Send.BroadcastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Number of broadcast packets (Send)</td>
+</tr>
+<tr>
+<td><code>Send.BroadcastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Broadcast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>Send.UnicastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>Send.UnicastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>CurrentTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Current time</td>
+</tr>
+<tr>
+<td><code>CurrentTick_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>64 bit High-Precision Logical System Clock</td>
+</tr>
+<tr>
+<td><code>StartTime_dt</code></td>
+<td><code>Date</code></td>
+<td>VPN Server Start-up time</td>
+</tr>
+<tr>
+<td><code>TotalMemory_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Memory information: Total Memory</td>
+</tr>
+<tr>
+<td><code>UsedMemory_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Memory information: Used Memory</td>
+</tr>
+<tr>
+<td><code>FreeMemory_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Memory information: Free Memory</td>
+</tr>
+<tr>
+<td><code>TotalPhys_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Memory information: Total Phys</td>
+</tr>
+<tr>
+<td><code>UsedPhys_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Memory information: Used Phys</td>
+</tr>
+<tr>
+<td><code>FreePhys_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Memory information: Free Phys</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="createlistener"></a></p>
+<h2 id="createlistener-rpc-api-create-new-tcp-listener">&quot;CreateListener&quot; RPC API - Create New TCP Listener</h2>
+<h3 id="description-3">Description</h3>
+<p>Create New TCP Listener. This allows you to create a new TCP Listener on the server. By creating the TCP Listener the server starts listening for a connection from clients at the specified TCP/IP port number. A TCP Listener that has been created can be deleted by the DeleteListener API. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To execute this API, you must have VPN Server administrator privileges.</p>
+<h3 id="input-json-rpc-format-3">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;CreateListener&quot;,
+  &quot;params&quot;: {
+    &quot;Port_u32&quot;: 0,
+    &quot;Enable_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-3">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;Port_u32&quot;: 0,
+    &quot;Enable_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="parameters-3">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>Port_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Port number (Range: 1 - 65535)</td>
+</tr>
+<tr>
+<td><code>Enable_bool</code></td>
+<td><code>boolean</code></td>
+<td>Active state</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="enumlistener"></a></p>
+<h2 id="enumlistener-rpc-api-get-list-of-tcp-listeners">&quot;EnumListener&quot; RPC API - Get List of TCP Listeners</h2>
+<h3 id="description-4">Description</h3>
+<p>Get List of TCP Listeners. This allows you to get a list of TCP listeners registered on the current server. You can obtain information on whether the various TCP listeners have a status of operating or error. To call this API, you must have VPN Server administrator privileges.</p>
+<h3 id="input-json-rpc-format-4">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;EnumListener&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-4">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;ListenerList&quot;: [
+      {
+        &quot;Ports_u32&quot;: 0,
+        &quot;Enables_bool&quot;: false,
+        &quot;Errors_bool&quot;: false
+      },
+      {
+        &quot;Ports_u32&quot;: 0,
+        &quot;Enables_bool&quot;: false,
+        &quot;Errors_bool&quot;: false
+      },
+      {
+        &quot;Ports_u32&quot;: 0,
+        &quot;Enables_bool&quot;: false,
+        &quot;Errors_bool&quot;: false
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-4">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>ListenerList</code></td>
+<td><code>Array object</code></td>
+<td>List of listener items</td>
+</tr>
+<tr>
+<td><code>Ports_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>TCP port number (range: 1 - 65535)</td>
+</tr>
+<tr>
+<td><code>Enables_bool</code></td>
+<td><code>boolean</code></td>
+<td>Active state</td>
+</tr>
+<tr>
+<td><code>Errors_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag to indicate if the error occurred on the listener port</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="deletelistener"></a></p>
+<h2 id="deletelistener-rpc-api-delete-tcp-listener">&quot;DeleteListener&quot; RPC API - Delete TCP Listener</h2>
+<h3 id="description-5">Description</h3>
+<p>Delete TCP Listener. This allows you to delete a TCP Listener that's registered on the server. When the TCP Listener is in a state of operation, the listener will automatically be deleted when its operation stops. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To call this API, you must have VPN Server administrator privileges.</p>
+<h3 id="input-json-rpc-format-5">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;DeleteListener&quot;,
+  &quot;params&quot;: {
+    &quot;Port_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-5">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;Port_u32&quot;: 0,
+    &quot;Enable_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="parameters-5">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>Port_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Port number (Range: 1 - 65535)</td>
+</tr>
+<tr>
+<td><code>Enable_bool</code></td>
+<td><code>boolean</code></td>
+<td>Active state</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="enablelistener"></a></p>
+<h2 id="enablelistener-rpc-api-enable-disable-tcp-listener">&quot;EnableListener&quot; RPC API - Enable / Disable TCP Listener</h2>
+<h3 id="description-6">Description</h3>
+<p>Enable / Disable TCP Listener. This starts or stops the operation of TCP Listeners registered on the current server. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To call this API, you must have VPN Server administrator privileges.</p>
+<h3 id="input-json-rpc-format-6">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;EnableListener&quot;,
+  &quot;params&quot;: {
+    &quot;Port_u32&quot;: 0,
+    &quot;Enable_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-6">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;Port_u32&quot;: 0,
+    &quot;Enable_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="parameters-6">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>Port_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Port number (Range: 1 - 65535)</td>
+</tr>
+<tr>
+<td><code>Enable_bool</code></td>
+<td><code>boolean</code></td>
+<td>Active state</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="setserverpassword"></a></p>
+<h2 id="setserverpassword-rpc-api-set-vpn-server-administrator-password">&quot;SetServerPassword&quot; RPC API - Set VPN Server Administrator Password</h2>
+<h3 id="description-7">Description</h3>
+<p>Set VPN Server Administrator Password. This sets the VPN Server administrator password. You can specify the password as a parameter. To call this API, you must have VPN Server administrator privileges.</p>
+<h3 id="input-json-rpc-format-7">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetServerPassword&quot;,
+  &quot;params&quot;: {
+    &quot;PlainTextPassword_str&quot;: &quot;plaintextpassword&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-7">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;PlainTextPassword_str&quot;: &quot;plaintextpassword&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-7">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>PlainTextPassword_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The plaintext password</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="setfarmsetting"></a></p>
+<h2 id="setfarmsetting-rpc-api-set-the-vpn-server-clustering-configuration">&quot;SetFarmSetting&quot; RPC API - Set the VPN Server clustering configuration</h2>
+<h3 id="description-8">Description</h3>
+<p>Set the VPN Server clustering configuration. Use this to set the VPN Server type as Standalone Server, Cluster Controller Server or Cluster Member Server. Standalone server means a VPN Server that does not belong to any cluster in its current state. When VPN Server is installed, by default it will be in standalone server mode. Unless you have particular plans to configure a cluster, we recommend the VPN Server be operated in standalone mode. A cluster controller is the central computer of all member servers of a cluster in the case where a clustering environment is made up of multiple VPN Servers. Multiple cluster members can be added to the cluster as required. A cluster requires one computer to serve this role. The other cluster member servers that are configured in the same cluster begin operation as a cluster member by connecting to the cluster controller. To call this API, you must have VPN Server administrator privileges. Also, when this API is executed, VPN Server will automatically restart. This API cannot be called on VPN Bridge.</p>
+<h3 id="input-json-rpc-format-8">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetFarmSetting&quot;,
+  &quot;params&quot;: {
+    &quot;ServerType_u32&quot;: 0,
+    &quot;NumPort_u32&quot;: 0,
+    &quot;Ports_u32&quot;: [
+      1,
+      2,
+      3
+    ],
+    &quot;PublicIp_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;ControllerName_str&quot;: &quot;controllername&quot;,
+    &quot;ControllerPort_u32&quot;: 0,
+    &quot;MemberPasswordPlaintext_str&quot;: &quot;memberpasswordplaintext&quot;,
+    &quot;Weight_u32&quot;: 0,
+    &quot;ControllerOnly_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-8">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;ServerType_u32&quot;: 0,
+    &quot;NumPort_u32&quot;: 0,
+    &quot;Ports_u32&quot;: [
+      1,
+      2,
+      3
+    ],
+    &quot;PublicIp_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;ControllerName_str&quot;: &quot;controllername&quot;,
+    &quot;ControllerPort_u32&quot;: 0,
+    &quot;MemberPasswordPlaintext_str&quot;: &quot;memberpasswordplaintext&quot;,
+    &quot;Weight_u32&quot;: 0,
+    &quot;ControllerOnly_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="parameters-8">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>ServerType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Type of server<BR>Values:<BR><code>0</code>: Stand-alone server<BR><code>1</code>: Farm controller server<BR><code>2</code>: Farm member server</td>
+</tr>
+<tr>
+<td><code>NumPort_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Valid only for Cluster Member servers. Number of the Ports_u32 element.</td>
+</tr>
+<tr>
+<td><code>Ports_u32</code></td>
+<td><code>number[]</code> (uint32)</td>
+<td>Valid only for Cluster Member servers. Specify the list of public port numbers on this server. The list must have at least one public port number set, and it is also possible to set multiple public port numbers.</td>
+</tr>
+<tr>
+<td><code>PublicIp_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Valid only for Cluster Member servers. Specify the public IP address of this server. If you wish to leave public IP address unspecified, specify the empty string. When a public IP address is not specified, the IP address of the network interface used when connecting to the cluster controller will be automatically used.</td>
+</tr>
+<tr>
+<td><code>ControllerName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Valid only for Cluster Member servers. Specify the host name or IP address of the destination cluster controller.</td>
+</tr>
+<tr>
+<td><code>ControllerPort_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Valid only for Cluster Member servers. Specify the TCP port number of the destination cluster controller.</td>
+</tr>
+<tr>
+<td><code>MemberPasswordPlaintext_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Valid only for Cluster Member servers. Specify the password required to connect to the destination controller. It needs to be the same as an administrator password on the destination controller.</td>
+</tr>
+<tr>
+<td><code>Weight_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>This sets a value for the performance standard ratio of this VPN Server. This is the standard value for when load balancing is performed in the cluster. For example, making only one machine 200 while the other members have a status of 100, will regulate that machine to receive twice as many connections as the other members. Specify 1 or higher for the value. If this parameter is left unspecified, 100 will be used.</td>
+</tr>
+<tr>
+<td><code>ControllerOnly_bool</code></td>
+<td><code>boolean</code></td>
+<td>Valid only for Cluster Controller server. By specifying true, the VPN Server will operate only as a controller on the cluster and it will always distribute general VPN Client connections to members other than itself. This function is used in high-load environments.</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getfarmsetting"></a></p>
+<h2 id="getfarmsetting-rpc-api-get-clustering-configuration-of-current-vpn-server">&quot;GetFarmSetting&quot; RPC API - Get Clustering Configuration of Current VPN Server</h2>
+<h3 id="description-9">Description</h3>
+<p>Get Clustering Configuration of Current VPN Server. You can use this to acquire the clustering configuration of the current VPN Server. To call this API, you must have VPN Server administrator privileges.</p>
+<h3 id="input-json-rpc-format-9">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetFarmSetting&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-9">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;ServerType_u32&quot;: 0,
+    &quot;NumPort_u32&quot;: 0,
+    &quot;Ports_u32&quot;: [
+      1,
+      2,
+      3
+    ],
+    &quot;PublicIp_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;ControllerName_str&quot;: &quot;controllername&quot;,
+    &quot;ControllerPort_u32&quot;: 0,
+    &quot;MemberPasswordPlaintext_str&quot;: &quot;memberpasswordplaintext&quot;,
+    &quot;Weight_u32&quot;: 0,
+    &quot;ControllerOnly_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="parameters-9">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>ServerType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Type of server<BR>Values:<BR><code>0</code>: Stand-alone server<BR><code>1</code>: Farm controller server<BR><code>2</code>: Farm member server</td>
+</tr>
+<tr>
+<td><code>NumPort_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Valid only for Cluster Member servers. Number of the Ports_u32 element.</td>
+</tr>
+<tr>
+<td><code>Ports_u32</code></td>
+<td><code>number[]</code> (uint32)</td>
+<td>Valid only for Cluster Member servers. Specify the list of public port numbers on this server. The list must have at least one public port number set, and it is also possible to set multiple public port numbers.</td>
+</tr>
+<tr>
+<td><code>PublicIp_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Valid only for Cluster Member servers. Specify the public IP address of this server. If you wish to leave public IP address unspecified, specify the empty string. When a public IP address is not specified, the IP address of the network interface used when connecting to the cluster controller will be automatically used.</td>
+</tr>
+<tr>
+<td><code>ControllerName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Valid only for Cluster Member servers. Specify the host name or IP address of the destination cluster controller.</td>
+</tr>
+<tr>
+<td><code>ControllerPort_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Valid only for Cluster Member servers. Specify the TCP port number of the destination cluster controller.</td>
+</tr>
+<tr>
+<td><code>MemberPasswordPlaintext_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Valid only for Cluster Member servers. Specify the password required to connect to the destination controller. It needs to be the same as an administrator password on the destination controller.</td>
+</tr>
+<tr>
+<td><code>Weight_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>This sets a value for the performance standard ratio of this VPN Server. This is the standard value for when load balancing is performed in the cluster. For example, making only one machine 200 while the other members have a status of 100, will regulate that machine to receive twice as many connections as the other members. Specify 1 or higher for the value. If this parameter is left unspecified, 100 will be used.</td>
+</tr>
+<tr>
+<td><code>ControllerOnly_bool</code></td>
+<td><code>boolean</code></td>
+<td>Valid only for Cluster Controller server. By specifying true, the VPN Server will operate only as a controller on the cluster and it will always distribute general VPN Client connections to members other than itself. This function is used in high-load environments.</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getfarminfo"></a></p>
+<h2 id="getfarminfo-rpc-api-get-cluster-member-information">&quot;GetFarmInfo&quot; RPC API - Get Cluster Member Information</h2>
+<h3 id="description-10">Description</h3>
+<p>Get Cluster Member Information. When the VPN Server is operating as a cluster controller, you can get information on cluster member servers on that cluster by specifying the IDs of the member servers. You can get the following information about the specified cluster member server: Server Type, Time Connection has been Established, IP Address, Host Name, Points, Public Port List, Number of Operating Virtual Hubs, First Virtual Hub, Number of Sessions and Number of TCP Connections. This API cannot be invoked on VPN Bridge.</p>
+<h3 id="input-json-rpc-format-10">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetFarmInfo&quot;,
+  &quot;params&quot;: {
+    &quot;Id_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-10">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;Id_u32&quot;: 0,
+    &quot;Controller_bool&quot;: false,
+    &quot;ConnectedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;Ip_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;Hostname_str&quot;: &quot;hostname&quot;,
+    &quot;Point_u32&quot;: 0,
+    &quot;NumPort_u32&quot;: 0,
+    &quot;Ports_u32&quot;: [
+      1,
+      2,
+      3
+    ],
+    &quot;ServerCert_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;NumFarmHub_u32&quot;: 0,
+    &quot;HubsList&quot;: [
+      {
+        &quot;HubName_str&quot;: &quot;hubname&quot;,
+        &quot;DynamicHub_bool&quot;: false
+      },
+      {
+        &quot;HubName_str&quot;: &quot;hubname&quot;,
+        &quot;DynamicHub_bool&quot;: false
+      },
+      {
+        &quot;HubName_str&quot;: &quot;hubname&quot;,
+        &quot;DynamicHub_bool&quot;: false
+      }
+    ],
+    &quot;NumSessions_u32&quot;: 0,
+    &quot;NumTcpConnections_u32&quot;: 0,
+    &quot;Weight_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="parameters-10">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>Id_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>ID</td>
+</tr>
+<tr>
+<td><code>Controller_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag if the server is Cluster Controller (false: Cluster Member servers)</td>
+</tr>
+<tr>
+<td><code>ConnectedTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Connection Established Time</td>
+</tr>
+<tr>
+<td><code>Ip_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>IP address</td>
+</tr>
+<tr>
+<td><code>Hostname_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Host name</td>
+</tr>
+<tr>
+<td><code>Point_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Point</td>
+</tr>
+<tr>
+<td><code>NumPort_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of Public Ports</td>
+</tr>
+<tr>
+<td><code>Ports_u32</code></td>
+<td><code>number[]</code> (uint32)</td>
+<td>Public Ports</td>
+</tr>
+<tr>
+<td><code>ServerCert_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Server certificate</td>
+</tr>
+<tr>
+<td><code>NumFarmHub_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of farm HUB</td>
+</tr>
+<tr>
+<td><code>HubsList</code></td>
+<td><code>Array object</code></td>
+<td>The hosted Virtual Hub list</td>
+</tr>
+<tr>
+<td><code>NumSessions_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of hosted VPN sessions</td>
+</tr>
+<tr>
+<td><code>NumTcpConnections_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of TCP connections</td>
+</tr>
+<tr>
+<td><code>Weight_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Performance Standard Ratio</td>
+</tr>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>DynamicHub_bool</code></td>
+<td><code>boolean</code></td>
+<td>Dynamic HUB</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="enumfarmmember"></a></p>
+<h2 id="enumfarmmember-rpc-api-get-list-of-cluster-members">&quot;EnumFarmMember&quot; RPC API - Get List of Cluster Members</h2>
+<h3 id="description-11">Description</h3>
+<p>Get List of Cluster Members. Use this API when the VPN Server is operating as a cluster controller to get a list of the cluster member servers on the same cluster, including the cluster controller itself. For each member, the following information is also listed: Type, Connection Start, Host Name, Points, Number of Session, Number of TCP Connections, Number of Operating Virtual Hubs, Using Client Connection License and Using Bridge Connection License. This API cannot be invoked on VPN Bridge.</p>
+<h3 id="input-json-rpc-format-11">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;EnumFarmMember&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-11">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;NumFarm_u32&quot;: 0,
+    &quot;FarmMemberList&quot;: [
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;Controller_bool&quot;: false,
+        &quot;ConnectedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;Ip_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;Hostname_str&quot;: &quot;hostname&quot;,
+        &quot;Point_u32&quot;: 0,
+        &quot;NumSessions_u32&quot;: 0,
+        &quot;NumTcpConnections_u32&quot;: 0,
+        &quot;NumHubs_u32&quot;: 0,
+        &quot;AssignedClientLicense_u32&quot;: 0,
+        &quot;AssignedBridgeLicense_u32&quot;: 0
+      },
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;Controller_bool&quot;: false,
+        &quot;ConnectedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;Ip_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;Hostname_str&quot;: &quot;hostname&quot;,
+        &quot;Point_u32&quot;: 0,
+        &quot;NumSessions_u32&quot;: 0,
+        &quot;NumTcpConnections_u32&quot;: 0,
+        &quot;NumHubs_u32&quot;: 0,
+        &quot;AssignedClientLicense_u32&quot;: 0,
+        &quot;AssignedBridgeLicense_u32&quot;: 0
+      },
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;Controller_bool&quot;: false,
+        &quot;ConnectedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;Ip_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;Hostname_str&quot;: &quot;hostname&quot;,
+        &quot;Point_u32&quot;: 0,
+        &quot;NumSessions_u32&quot;: 0,
+        &quot;NumTcpConnections_u32&quot;: 0,
+        &quot;NumHubs_u32&quot;: 0,
+        &quot;AssignedClientLicense_u32&quot;: 0,
+        &quot;AssignedBridgeLicense_u32&quot;: 0
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-11">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>NumFarm_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of Cluster Members</td>
+</tr>
+<tr>
+<td><code>FarmMemberList</code></td>
+<td><code>Array object</code></td>
+<td>Cluster Members list</td>
+</tr>
+<tr>
+<td><code>Id_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>ID</td>
+</tr>
+<tr>
+<td><code>Controller_bool</code></td>
+<td><code>boolean</code></td>
+<td>Controller</td>
+</tr>
+<tr>
+<td><code>ConnectedTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Connection time</td>
+</tr>
+<tr>
+<td><code>Ip_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>IP address</td>
+</tr>
+<tr>
+<td><code>Hostname_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Host name</td>
+</tr>
+<tr>
+<td><code>Point_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Point</td>
+</tr>
+<tr>
+<td><code>NumSessions_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of sessions</td>
+</tr>
+<tr>
+<td><code>NumTcpConnections_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of TCP connections</td>
+</tr>
+<tr>
+<td><code>NumHubs_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of HUBs</td>
+</tr>
+<tr>
+<td><code>AssignedClientLicense_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of assigned client licenses</td>
+</tr>
+<tr>
+<td><code>AssignedBridgeLicense_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of assigned bridge licenses</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getfarmconnectionstatus"></a></p>
+<h2 id="getfarmconnectionstatus-rpc-api-get-connection-status-to-cluster-controller">&quot;GetFarmConnectionStatus&quot; RPC API - Get Connection Status to Cluster Controller</h2>
+<h3 id="description-12">Description</h3>
+<p>Get Connection Status to Cluster Controller. Use this API when the VPN Server is operating as a cluster controller to get the status of connection to the cluster controller. You can get the following information: Controller IP Address, Port Number, Connection Status, Connection Start Time, First Connection Established Time, Current Connection Established Time, Number of Connection Attempts, Number of Successful Connections, Number of Failed Connections. This API cannot be invoked on VPN Bridge.</p>
+<h3 id="input-json-rpc-format-12">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetFarmConnectionStatus&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-12">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;Ip_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;Port_u32&quot;: 0,
+    &quot;Online_bool&quot;: false,
+    &quot;LastError_u32&quot;: 0,
+    &quot;StartedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;FirstConnectedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;CurrentConnectedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;NumTry_u32&quot;: 0,
+    &quot;NumConnected_u32&quot;: 0,
+    &quot;NumFailed_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="parameters-12">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>Ip_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>IP address</td>
+</tr>
+<tr>
+<td><code>Port_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Port number</td>
+</tr>
+<tr>
+<td><code>Online_bool</code></td>
+<td><code>boolean</code></td>
+<td>Online state</td>
+</tr>
+<tr>
+<td><code>LastError_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Last error code</td>
+</tr>
+<tr>
+<td><code>StartedTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Connection start time</td>
+</tr>
+<tr>
+<td><code>FirstConnectedTime_dt</code></td>
+<td><code>Date</code></td>
+<td>First connection time</td>
+</tr>
+<tr>
+<td><code>CurrentConnectedTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Connection time of this time</td>
+</tr>
+<tr>
+<td><code>NumTry_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of retries</td>
+</tr>
+<tr>
+<td><code>NumConnected_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of connection count</td>
+</tr>
+<tr>
+<td><code>NumFailed_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Connection failure count</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="setservercert"></a></p>
+<h2 id="setservercert-rpc-api-set-ssl-certificate-and-private-key-of-vpn-server">&quot;SetServerCert&quot; RPC API - Set SSL Certificate and Private Key of VPN Server</h2>
+<h3 id="description-13">Description</h3>
+<p>Set SSL Certificate and Private Key of VPN Server. You can set the SSL certificate that the VPN Server provides to the connected client and the private key for that certificate. The certificate must be in X.509 format and the private key must be Base 64 encoded format. To call this API, you must have VPN Server administrator privileges.</p>
+<h3 id="input-json-rpc-format-13">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetServerCert&quot;,
+  &quot;params&quot;: {
+    &quot;Cert_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;Key_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-13">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;Cert_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;Key_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-13">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>Cert_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>The body of the certificate</td>
+</tr>
+<tr>
+<td><code>Key_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>The body of the private key</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getservercert"></a></p>
+<h2 id="getservercert-rpc-api-get-ssl-certificate-and-private-key-of-vpn-server">&quot;GetServerCert&quot; RPC API - Get SSL Certificate and Private Key of VPN Server</h2>
+<h3 id="description-14">Description</h3>
+<p>Get SSL Certificate and Private Key of VPN Server. Use this to get the SSL certificate private key that the VPN Server provides to the connected client. To call this API, you must have VPN Server administrator privileges.</p>
+<h3 id="input-json-rpc-format-14">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetServerCert&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-14">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;Cert_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;Key_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-14">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>Cert_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>The body of the certificate</td>
+</tr>
+<tr>
+<td><code>Key_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>The body of the private key</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getservercipher"></a></p>
+<h2 id="getservercipher-rpc-api-get-the-encrypted-algorithm-used-for-vpn-communication">&quot;GetServerCipher&quot; RPC API - Get the Encrypted Algorithm Used for VPN Communication</h2>
+<h3 id="description-15">Description</h3>
+<p>Get the Encrypted Algorithm Used for VPN Communication. Use this API to get the current setting of the algorithm used for the electronic signature and encrypted for SSL connection to be used for communication between the VPN Server and the connected client and the list of algorithms that can be used on the VPN Server.</p>
+<h3 id="input-json-rpc-format-15">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetServerCipher&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-15">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;String_str&quot;: &quot;string&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-15">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>String_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>A string value</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="setservercipher"></a></p>
+<h2 id="setservercipher-rpc-api-set-the-encrypted-algorithm-used-for-vpn-communication">&quot;SetServerCipher&quot; RPC API - Set the Encrypted Algorithm Used for VPN Communication</h2>
+<h3 id="description-16">Description</h3>
+<p>Set the Encrypted Algorithm Used for VPN Communication. Use this API to set the algorithm used for the electronic signature and encrypted for SSL connections to be used for communication between the VPN Server and the connected client. By specifying the algorithm name, the specified algorithm will be used later between the VPN Client and VPN Bridge connected to this server and the data will be encrypted. To call this API, you must have VPN Server administrator privileges.</p>
+<h3 id="input-json-rpc-format-16">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetServerCipher&quot;,
+  &quot;params&quot;: {
+    &quot;String_str&quot;: &quot;string&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-16">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;String_str&quot;: &quot;string&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-16">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>String_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>A string value</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="createhub"></a></p>
+<h2 id="createhub-rpc-api-create-new-virtual-hub">&quot;CreateHub&quot; RPC API - Create New Virtual Hub</h2>
+<h3 id="description-17">Description</h3>
+<p>Create New Virtual Hub. Use this to create a new Virtual Hub on the VPN Server. The created Virtual Hub will begin operation immediately. When the VPN Server is operating on a cluster, this API is only valid for the cluster controller. Also, the new Virtual Hub will operate as a dynamic Virtual Hub. You can change it to a static Virtual Hub by using the SetHub API. To get a list of Virtual Hubs that are already on the VPN Server, use the EnumHub API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Servers that are operating as a VPN Bridge or cluster member.</p>
+<h3 id="input-json-rpc-format-17">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;CreateHub&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;AdminPasswordPlainText_str&quot;: &quot;adminpasswordplaintext&quot;,
+    &quot;Online_bool&quot;: false,
+    &quot;MaxSession_u32&quot;: 0,
+    &quot;NoEnum_bool&quot;: false,
+    &quot;HubType_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-17">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;AdminPasswordPlainText_str&quot;: &quot;adminpasswordplaintext&quot;,
+    &quot;Online_bool&quot;: false,
+    &quot;MaxSession_u32&quot;: 0,
+    &quot;NoEnum_bool&quot;: false,
+    &quot;HubType_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="parameters-17">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the name of the Virtual Hub to create / update.</td>
+</tr>
+<tr>
+<td><code>AdminPasswordPlainText_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify an administrator password when the administrator password is going to be set for the Virtual Hub. On the update, leave it to empty string if you don't want to change the password.</td>
+</tr>
+<tr>
+<td><code>Online_bool</code></td>
+<td><code>boolean</code></td>
+<td>Online flag</td>
+</tr>
+<tr>
+<td><code>MaxSession_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Maximum number of VPN sessions</td>
+</tr>
+<tr>
+<td><code>NoEnum_bool</code></td>
+<td><code>boolean</code></td>
+<td>No Enum flag. By enabling this option, the VPN Client user will be unable to enumerate this Virtual Hub even if they send a Virtual Hub enumeration request to the VPN Server.</td>
+</tr>
+<tr>
+<td><code>HubType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Type of the Virtual Hub (Valid only for Clustered VPN Servers)<BR>Values:<BR><code>0</code>: Stand-alone HUB<BR><code>1</code>: Static HUB<BR><code>2</code>: Dynamic HUB</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="sethub"></a></p>
+<h2 id="sethub-rpc-api-set-the-virtual-hub-configuration">&quot;SetHub&quot; RPC API - Set the Virtual Hub configuration</h2>
+<h3 id="description-18">Description</h3>
+<p>Set the Virtual Hub configuration. You can call this API to change the configuration of the specified Virtual Hub. You can set the Virtual Hub online or offline. You can set the maximum number of sessions that can be concurrently connected to the Virtual Hub that is currently being managed. You can set the Virtual Hub administrator password. You can set other parameters for the Virtual Hub. Before call this API, you need to obtain the latest state of the Virtual Hub by using the GetHub API.</p>
+<h3 id="input-json-rpc-format-18">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetHub&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;AdminPasswordPlainText_str&quot;: &quot;adminpasswordplaintext&quot;,
+    &quot;Online_bool&quot;: false,
+    &quot;MaxSession_u32&quot;: 0,
+    &quot;NoEnum_bool&quot;: false,
+    &quot;HubType_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-18">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;AdminPasswordPlainText_str&quot;: &quot;adminpasswordplaintext&quot;,
+    &quot;Online_bool&quot;: false,
+    &quot;MaxSession_u32&quot;: 0,
+    &quot;NoEnum_bool&quot;: false,
+    &quot;HubType_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="parameters-18">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the name of the Virtual Hub to create / update.</td>
+</tr>
+<tr>
+<td><code>AdminPasswordPlainText_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify an administrator password when the administrator password is going to be set for the Virtual Hub. On the update, leave it to empty string if you don't want to change the password.</td>
+</tr>
+<tr>
+<td><code>Online_bool</code></td>
+<td><code>boolean</code></td>
+<td>Online flag</td>
+</tr>
+<tr>
+<td><code>MaxSession_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Maximum number of VPN sessions</td>
+</tr>
+<tr>
+<td><code>NoEnum_bool</code></td>
+<td><code>boolean</code></td>
+<td>No Enum flag. By enabling this option, the VPN Client user will be unable to enumerate this Virtual Hub even if they send a Virtual Hub enumeration request to the VPN Server.</td>
+</tr>
+<tr>
+<td><code>HubType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Type of the Virtual Hub (Valid only for Clustered VPN Servers)<BR>Values:<BR><code>0</code>: Stand-alone HUB<BR><code>1</code>: Static HUB<BR><code>2</code>: Dynamic HUB</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="gethub"></a></p>
+<h2 id="gethub-rpc-api-get-the-virtual-hub-configuration">&quot;GetHub&quot; RPC API - Get the Virtual Hub configuration</h2>
+<h3 id="description-19">Description</h3>
+<p>Get the Virtual Hub configuration. You can call this API to get the current configuration of the specified Virtual Hub. To change the configuration of the Virtual Hub, call the SetHub API.</p>
+<h3 id="input-json-rpc-format-19">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetHub&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-19">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;AdminPasswordPlainText_str&quot;: &quot;adminpasswordplaintext&quot;,
+    &quot;Online_bool&quot;: false,
+    &quot;MaxSession_u32&quot;: 0,
+    &quot;NoEnum_bool&quot;: false,
+    &quot;HubType_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="parameters-19">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the name of the Virtual Hub to create / update.</td>
+</tr>
+<tr>
+<td><code>AdminPasswordPlainText_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify an administrator password when the administrator password is going to be set for the Virtual Hub. On the update, leave it to empty string if you don't want to change the password.</td>
+</tr>
+<tr>
+<td><code>Online_bool</code></td>
+<td><code>boolean</code></td>
+<td>Online flag</td>
+</tr>
+<tr>
+<td><code>MaxSession_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Maximum number of VPN sessions</td>
+</tr>
+<tr>
+<td><code>NoEnum_bool</code></td>
+<td><code>boolean</code></td>
+<td>No Enum flag. By enabling this option, the VPN Client user will be unable to enumerate this Virtual Hub even if they send a Virtual Hub enumeration request to the VPN Server.</td>
+</tr>
+<tr>
+<td><code>HubType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Type of the Virtual Hub (Valid only for Clustered VPN Servers)<BR>Values:<BR><code>0</code>: Stand-alone HUB<BR><code>1</code>: Static HUB<BR><code>2</code>: Dynamic HUB</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="enumhub"></a></p>
+<h2 id="enumhub-rpc-api-get-list-of-virtual-hubs">&quot;EnumHub&quot; RPC API - Get List of Virtual Hubs</h2>
+<h3 id="description-20">Description</h3>
+<p>Get List of Virtual Hubs. Use this to get a list of existing Virtual Hubs on the VPN Server. For each Virtual Hub, you can get the following information: Virtual Hub Name, Status, Type, Number of Users, Number of Groups, Number of Sessions, Number of MAC Tables, Number of IP Tables, Number of Logins, Last Login, and Last Communication. Note that when connecting in Virtual Hub Admin Mode, if in the options of a Virtual Hub that you do not have administrator privileges for, the option Don't Enumerate this Virtual Hub for Anonymous Users is enabled then that Virtual Hub will not be enumerated. If you are connected in Server Admin Mode, then the list of all Virtual Hubs will be displayed. When connecting to and managing a non-cluster-controller cluster member of a clustering environment, only the Virtual Hub currently being hosted by that VPN Server will be displayed. When connecting to a cluster controller for administration purposes, all the Virtual Hubs will be displayed.</p>
+<h3 id="input-json-rpc-format-20">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;EnumHub&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-20">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;NumHub_u32&quot;: 0,
+    &quot;HubList&quot;: [
+      {
+        &quot;HubName_str&quot;: &quot;hubname&quot;,
+        &quot;Online_bool&quot;: false,
+        &quot;HubType_u32&quot;: 0,
+        &quot;NumUsers_u32&quot;: 0,
+        &quot;NumGroups_u32&quot;: 0,
+        &quot;NumSessions_u32&quot;: 0,
+        &quot;NumMacTables_u32&quot;: 0,
+        &quot;NumIpTables_u32&quot;: 0,
+        &quot;LastCommTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;LastLoginTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;CreatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;NumLogin_u32&quot;: 0,
+        &quot;IsTrafficFilled_bool&quot;: false,
+        &quot;Ex.Recv.BroadcastBytes_u64&quot;: 0,
+        &quot;Ex.Recv.BroadcastCount_u64&quot;: 0,
+        &quot;Ex.Recv.UnicastBytes_u64&quot;: 0,
+        &quot;Ex.Recv.UnicastCount_u64&quot;: 0,
+        &quot;Ex.Send.BroadcastBytes_u64&quot;: 0,
+        &quot;Ex.Send.BroadcastCount_u64&quot;: 0,
+        &quot;Ex.Send.UnicastBytes_u64&quot;: 0,
+        &quot;Ex.Send.UnicastCount_u64&quot;: 0
+      },
+      {
+        &quot;HubName_str&quot;: &quot;hubname&quot;,
+        &quot;Online_bool&quot;: false,
+        &quot;HubType_u32&quot;: 0,
+        &quot;NumUsers_u32&quot;: 0,
+        &quot;NumGroups_u32&quot;: 0,
+        &quot;NumSessions_u32&quot;: 0,
+        &quot;NumMacTables_u32&quot;: 0,
+        &quot;NumIpTables_u32&quot;: 0,
+        &quot;LastCommTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;LastLoginTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;CreatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;NumLogin_u32&quot;: 0,
+        &quot;IsTrafficFilled_bool&quot;: false,
+        &quot;Ex.Recv.BroadcastBytes_u64&quot;: 0,
+        &quot;Ex.Recv.BroadcastCount_u64&quot;: 0,
+        &quot;Ex.Recv.UnicastBytes_u64&quot;: 0,
+        &quot;Ex.Recv.UnicastCount_u64&quot;: 0,
+        &quot;Ex.Send.BroadcastBytes_u64&quot;: 0,
+        &quot;Ex.Send.BroadcastCount_u64&quot;: 0,
+        &quot;Ex.Send.UnicastBytes_u64&quot;: 0,
+        &quot;Ex.Send.UnicastCount_u64&quot;: 0
+      },
+      {
+        &quot;HubName_str&quot;: &quot;hubname&quot;,
+        &quot;Online_bool&quot;: false,
+        &quot;HubType_u32&quot;: 0,
+        &quot;NumUsers_u32&quot;: 0,
+        &quot;NumGroups_u32&quot;: 0,
+        &quot;NumSessions_u32&quot;: 0,
+        &quot;NumMacTables_u32&quot;: 0,
+        &quot;NumIpTables_u32&quot;: 0,
+        &quot;LastCommTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;LastLoginTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;CreatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;NumLogin_u32&quot;: 0,
+        &quot;IsTrafficFilled_bool&quot;: false,
+        &quot;Ex.Recv.BroadcastBytes_u64&quot;: 0,
+        &quot;Ex.Recv.BroadcastCount_u64&quot;: 0,
+        &quot;Ex.Recv.UnicastBytes_u64&quot;: 0,
+        &quot;Ex.Recv.UnicastCount_u64&quot;: 0,
+        &quot;Ex.Send.BroadcastBytes_u64&quot;: 0,
+        &quot;Ex.Send.BroadcastCount_u64&quot;: 0,
+        &quot;Ex.Send.UnicastBytes_u64&quot;: 0,
+        &quot;Ex.Send.UnicastCount_u64&quot;: 0
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-20">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>NumHub_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of Virtual Hubs</td>
+</tr>
+<tr>
+<td><code>HubList</code></td>
+<td><code>Array object</code></td>
+<td>Virtual Hubs</td>
+</tr>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The name of the Virtual Hub</td>
+</tr>
+<tr>
+<td><code>Online_bool</code></td>
+<td><code>boolean</code></td>
+<td>Online state</td>
+</tr>
+<tr>
+<td><code>HubType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Type of HUB (Valid only for Clustered VPN Servers)<BR>Values:<BR><code>0</code>: Stand-alone HUB<BR><code>1</code>: Static HUB<BR><code>2</code>: Dynamic HUB</td>
+</tr>
+<tr>
+<td><code>NumUsers_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of users</td>
+</tr>
+<tr>
+<td><code>NumGroups_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of registered groups</td>
+</tr>
+<tr>
+<td><code>NumSessions_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of registered sessions</td>
+</tr>
+<tr>
+<td><code>NumMacTables_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of current MAC table entries</td>
+</tr>
+<tr>
+<td><code>NumIpTables_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of current IP table entries</td>
+</tr>
+<tr>
+<td><code>LastCommTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Last communication date and time</td>
+</tr>
+<tr>
+<td><code>LastLoginTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Last login date and time</td>
+</tr>
+<tr>
+<td><code>CreatedTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Creation date and time</td>
+</tr>
+<tr>
+<td><code>NumLogin_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of accumulated logins</td>
+</tr>
+<tr>
+<td><code>IsTrafficFilled_bool</code></td>
+<td><code>boolean</code></td>
+<td>Whether the traffic information is provided</td>
+</tr>
+<tr>
+<td><code>Ex.Recv.BroadcastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Number of broadcast packets (Recv)</td>
+</tr>
+<tr>
+<td><code>Ex.Recv.BroadcastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Broadcast bytes (Recv)</td>
+</tr>
+<tr>
+<td><code>Ex.Recv.UnicastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast count (Recv)</td>
+</tr>
+<tr>
+<td><code>Ex.Recv.UnicastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Recv)</td>
+</tr>
+<tr>
+<td><code>Ex.Send.BroadcastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Number of broadcast packets (Send)</td>
+</tr>
+<tr>
+<td><code>Ex.Send.BroadcastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Broadcast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>Ex.Send.UnicastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>Ex.Send.UnicastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Send)</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="deletehub"></a></p>
+<h2 id="deletehub-rpc-api-delete-virtual-hub">&quot;DeleteHub&quot; RPC API - Delete Virtual Hub</h2>
+<h3 id="description-21">Description</h3>
+<p>Delete Virtual Hub. Use this to delete an existing Virtual Hub on the VPN Server. If you delete the Virtual Hub, all sessions that are currently connected to the Virtual Hub will be disconnected and new sessions will be unable to connect to the Virtual Hub. Also, this will also delete all the Hub settings, user objects, group objects, certificates and Cascade Connections. Once you delete the Virtual Hub, it cannot be recovered. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Servers that are operating as a VPN Bridge or cluster member.</p>
+<h3 id="input-json-rpc-format-21">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;DeleteHub&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-21">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-21">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="gethubradius"></a></p>
+<h2 id="gethubradius-rpc-api-get-setting-of-radius-server-used-for-user-authentication">&quot;GetHubRadius&quot; RPC API - Get Setting of RADIUS Server Used for User Authentication</h2>
+<h3 id="description-22">Description</h3>
+<p>Get Setting of RADIUS Server Used for User Authentication. Use this to get the current settings for the RADIUS server used when a user connects to the currently managed Virtual Hub using RADIUS Server Authentication Mode. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-22">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetHubRadius&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-22">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;RadiusServerName_str&quot;: &quot;radiusservername&quot;,
+    &quot;RadiusPort_u32&quot;: 0,
+    &quot;RadiusSecret_str&quot;: &quot;radiussecret&quot;,
+    &quot;RadiusRetryInterval_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="parameters-22">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>RadiusServerName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>RADIUS server name</td>
+</tr>
+<tr>
+<td><code>RadiusPort_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>RADIUS port number</td>
+</tr>
+<tr>
+<td><code>RadiusSecret_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Secret key</td>
+</tr>
+<tr>
+<td><code>RadiusRetryInterval_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Radius retry interval</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="sethubradius"></a></p>
+<h2 id="sethubradius-rpc-api-set-radius-server-to-use-for-user-authentication">&quot;SetHubRadius&quot; RPC API - Set RADIUS Server to use for User Authentication</h2>
+<h3 id="description-23">Description</h3>
+<p>Set RADIUS Server to use for User Authentication. To accept users to the currently managed Virtual Hub in RADIUS server authentication mode, you can specify an external RADIUS server that confirms the user name and password. (You can specify multiple hostname by splitting with comma or semicolon.) The RADIUS server must be set to receive requests from IP addresses of this VPN Server. Also, authentication by Password Authentication Protocol (PAP) must be enabled. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-23">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetHubRadius&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;RadiusServerName_str&quot;: &quot;radiusservername&quot;,
+    &quot;RadiusPort_u32&quot;: 0,
+    &quot;RadiusSecret_str&quot;: &quot;radiussecret&quot;,
+    &quot;RadiusRetryInterval_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-23">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;RadiusServerName_str&quot;: &quot;radiusservername&quot;,
+    &quot;RadiusPort_u32&quot;: 0,
+    &quot;RadiusSecret_str&quot;: &quot;radiussecret&quot;,
+    &quot;RadiusRetryInterval_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="parameters-23">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>RadiusServerName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>RADIUS server name</td>
+</tr>
+<tr>
+<td><code>RadiusPort_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>RADIUS port number</td>
+</tr>
+<tr>
+<td><code>RadiusSecret_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Secret key</td>
+</tr>
+<tr>
+<td><code>RadiusRetryInterval_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Radius retry interval</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="enumconnection"></a></p>
+<h2 id="enumconnection-rpc-api-get-list-of-tcp-connections-connecting-to-the-vpn-server">&quot;EnumConnection&quot; RPC API - Get List of TCP Connections Connecting to the VPN Server</h2>
+<h3 id="description-24">Description</h3>
+<p>Get List of TCP Connections Connecting to the VPN Server. Use this to get a list of TCP/IP connections that are currently connecting to the VPN Server. It does not display the TCP connections that have been established as VPN sessions. To get the list of TCP/IP connections that have been established as VPN sessions, you can use the EnumSession API. You can get the following: Connection Name, Connection Source, Connection Start and Type. To call this API, you must have VPN Server administrator privileges.</p>
+<h3 id="input-json-rpc-format-24">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;EnumConnection&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-24">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;NumConnection_u32&quot;: 0,
+    &quot;ConnectionList&quot;: [
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;Hostname_str&quot;: &quot;hostname&quot;,
+        &quot;Ip_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;Port_u32&quot;: 0,
+        &quot;ConnectedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;Type_u32&quot;: 0
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;Hostname_str&quot;: &quot;hostname&quot;,
+        &quot;Ip_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;Port_u32&quot;: 0,
+        &quot;ConnectedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;Type_u32&quot;: 0
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;Hostname_str&quot;: &quot;hostname&quot;,
+        &quot;Ip_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;Port_u32&quot;: 0,
+        &quot;ConnectedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;Type_u32&quot;: 0
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-24">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>NumConnection_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of connections</td>
+</tr>
+<tr>
+<td><code>ConnectionList</code></td>
+<td><code>Array object</code></td>
+<td>Connection list</td>
+</tr>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Connection name</td>
+</tr>
+<tr>
+<td><code>Hostname_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Host name</td>
+</tr>
+<tr>
+<td><code>Ip_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>IP address</td>
+</tr>
+<tr>
+<td><code>Port_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Port number</td>
+</tr>
+<tr>
+<td><code>ConnectedTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Connected time</td>
+</tr>
+<tr>
+<td><code>Type_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Connection type<BR>Values:<BR><code>0</code>: VPN Client<BR><code>1</code>: During initialization<BR><code>2</code>: Login connection<BR><code>3</code>: Additional connection<BR><code>4</code>: RPC for server farm<BR><code>5</code>: RPC for Management<BR><code>6</code>: HUB enumeration<BR><code>7</code>: Password change<BR><code>8</code>: SSTP<BR><code>9</code>: OpenVPN</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="disconnectconnection"></a></p>
+<h2 id="disconnectconnection-rpc-api-disconnect-tcp-connections-connecting-to-the-vpn-server">&quot;DisconnectConnection&quot; RPC API - Disconnect TCP Connections Connecting to the VPN Server</h2>
+<h3 id="description-25">Description</h3>
+<p>Disconnect TCP Connections Connecting to the VPN Server. Use this to forcefully disconnect specific TCP/IP connections that are connecting to the VPN Server. To call this API, you must have VPN Server administrator privileges.</p>
+<h3 id="input-json-rpc-format-25">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;DisconnectConnection&quot;,
+  &quot;params&quot;: {
+    &quot;Name_str&quot;: &quot;name&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-25">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;Name_str&quot;: &quot;name&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-25">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Connection name</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getconnectioninfo"></a></p>
+<h2 id="getconnectioninfo-rpc-api-get-information-of-tcp-connections-connecting-to-the-vpn-server">&quot;GetConnectionInfo&quot; RPC API - Get Information of TCP Connections Connecting to the VPN Server</h2>
+<h3 id="description-26">Description</h3>
+<p>Get Information of TCP Connections Connecting to the VPN Server. Use this to get detailed information of a specific TCP/IP connection that is connecting to the VPN Server. You can get the following information: Connection Name, Connection Type, Source Hostname, Source IP Address, Source Port Number (TCP), Connection Start, Server Product Name, Server Version, Server Build Number, Client Product Name, Client Version, and Client Build Number. To call this API, you must have VPN Server administrator privileges.</p>
+<h3 id="input-json-rpc-format-26">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetConnectionInfo&quot;,
+  &quot;params&quot;: {
+    &quot;Name_str&quot;: &quot;name&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-26">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;Name_str&quot;: &quot;name&quot;,
+    &quot;Type_u32&quot;: 0,
+    &quot;Hostname_str&quot;: &quot;hostname&quot;,
+    &quot;Ip_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;Port_u32&quot;: 0,
+    &quot;ConnectedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;ServerStr_str&quot;: &quot;serverstr&quot;,
+    &quot;ServerVer_u32&quot;: 0,
+    &quot;ServerBuild_u32&quot;: 0,
+    &quot;ClientStr_str&quot;: &quot;clientstr&quot;,
+    &quot;ClientVer_u32&quot;: 0,
+    &quot;ClientBuild_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="parameters-26">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Connection name</td>
+</tr>
+<tr>
+<td><code>Type_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Type<BR>Values:<BR><code>0</code>: VPN Client<BR><code>1</code>: During initialization<BR><code>2</code>: Login connection<BR><code>3</code>: Additional connection<BR><code>4</code>: RPC for server farm<BR><code>5</code>: RPC for Management<BR><code>6</code>: HUB enumeration<BR><code>7</code>: Password change<BR><code>8</code>: SSTP<BR><code>9</code>: OpenVPN</td>
+</tr>
+<tr>
+<td><code>Hostname_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Host name</td>
+</tr>
+<tr>
+<td><code>Ip_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>IP address</td>
+</tr>
+<tr>
+<td><code>Port_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Port number</td>
+</tr>
+<tr>
+<td><code>ConnectedTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Connected time</td>
+</tr>
+<tr>
+<td><code>ServerStr_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Server string</td>
+</tr>
+<tr>
+<td><code>ServerVer_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Server version</td>
+</tr>
+<tr>
+<td><code>ServerBuild_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Server build number</td>
+</tr>
+<tr>
+<td><code>ClientStr_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Client string</td>
+</tr>
+<tr>
+<td><code>ClientVer_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Client version</td>
+</tr>
+<tr>
+<td><code>ClientBuild_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Client build number</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="sethubonline"></a></p>
+<h2 id="sethubonline-rpc-api-switch-virtual-hub-to-online-or-offline">&quot;SetHubOnline&quot; RPC API - Switch Virtual Hub to Online or Offline</h2>
+<h3 id="description-27">Description</h3>
+<p>Switch Virtual Hub to Online or Offline. Use this to set the Virtual Hub to online or offline. A Virtual Hub with an offline status cannot receive VPN connections from clients. When you set the Virtual Hub offline, all sessions will be disconnected. A Virtual Hub with an offline status cannot receive VPN connections from clients. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-27">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetHubOnline&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Online_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-27">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Online_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="parameters-27">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Online_bool</code></td>
+<td><code>boolean</code></td>
+<td>Online / offline flag</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="gethubstatus"></a></p>
+<h2 id="gethubstatus-rpc-api-get-current-status-of-virtual-hub">&quot;GetHubStatus&quot; RPC API - Get Current Status of Virtual Hub</h2>
+<h3 id="description-28">Description</h3>
+<p>Get Current Status of Virtual Hub. Use this to get the current status of the Virtual Hub currently being managed. You can get the following information: Virtual Hub Type, Number of Sessions, Number of Each Type of Object, Number of Logins, Last Login, Last Communication, and Communication Statistical Data.</p>
+<h3 id="input-json-rpc-format-28">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetHubStatus&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-28">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Online_bool&quot;: false,
+    &quot;HubType_u32&quot;: 0,
+    &quot;NumSessions_u32&quot;: 0,
+    &quot;NumSessionsClient_u32&quot;: 0,
+    &quot;NumSessionsBridge_u32&quot;: 0,
+    &quot;NumAccessLists_u32&quot;: 0,
+    &quot;NumUsers_u32&quot;: 0,
+    &quot;NumGroups_u32&quot;: 0,
+    &quot;NumMacTables_u32&quot;: 0,
+    &quot;NumIpTables_u32&quot;: 0,
+    &quot;Recv.BroadcastBytes_u64&quot;: 0,
+    &quot;Recv.BroadcastCount_u64&quot;: 0,
+    &quot;Recv.UnicastBytes_u64&quot;: 0,
+    &quot;Recv.UnicastCount_u64&quot;: 0,
+    &quot;Send.BroadcastBytes_u64&quot;: 0,
+    &quot;Send.BroadcastCount_u64&quot;: 0,
+    &quot;Send.UnicastBytes_u64&quot;: 0,
+    &quot;Send.UnicastCount_u64&quot;: 0,
+    &quot;SecureNATEnabled_bool&quot;: false,
+    &quot;LastCommTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;LastLoginTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;CreatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;NumLogin_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="parameters-28">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Online_bool</code></td>
+<td><code>boolean</code></td>
+<td>Online</td>
+</tr>
+<tr>
+<td><code>HubType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Type of HUB<BR>Values:<BR><code>0</code>: Stand-alone HUB<BR><code>1</code>: Static HUB<BR><code>2</code>: Dynamic HUB</td>
+</tr>
+<tr>
+<td><code>NumSessions_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of sessions</td>
+</tr>
+<tr>
+<td><code>NumSessionsClient_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of sessions (client mode)</td>
+</tr>
+<tr>
+<td><code>NumSessionsBridge_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of sessions (bridge mode)</td>
+</tr>
+<tr>
+<td><code>NumAccessLists_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of Access list entries</td>
+</tr>
+<tr>
+<td><code>NumUsers_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of users</td>
+</tr>
+<tr>
+<td><code>NumGroups_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of groups</td>
+</tr>
+<tr>
+<td><code>NumMacTables_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of MAC table entries</td>
+</tr>
+<tr>
+<td><code>NumIpTables_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of IP table entries</td>
+</tr>
+<tr>
+<td><code>Recv.BroadcastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Number of broadcast packets (Recv)</td>
+</tr>
+<tr>
+<td><code>Recv.BroadcastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Broadcast bytes (Recv)</td>
+</tr>
+<tr>
+<td><code>Recv.UnicastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast count (Recv)</td>
+</tr>
+<tr>
+<td><code>Recv.UnicastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Recv)</td>
+</tr>
+<tr>
+<td><code>Send.BroadcastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Number of broadcast packets (Send)</td>
+</tr>
+<tr>
+<td><code>Send.BroadcastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Broadcast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>Send.UnicastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>Send.UnicastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>SecureNATEnabled_bool</code></td>
+<td><code>boolean</code></td>
+<td>Whether SecureNAT is enabled</td>
+</tr>
+<tr>
+<td><code>LastCommTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Last communication date and time</td>
+</tr>
+<tr>
+<td><code>LastLoginTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Last login date and time</td>
+</tr>
+<tr>
+<td><code>CreatedTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Creation date and time</td>
+</tr>
+<tr>
+<td><code>NumLogin_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of logins</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="sethublog"></a></p>
+<h2 id="sethublog-rpc-api-set-the-logging-configuration-of-the-virtual-hub">&quot;SetHubLog&quot; RPC API - Set the logging configuration of the Virtual Hub</h2>
+<h3 id="description-29">Description</h3>
+<p>Set the logging configuration of the Virtual Hub. Use this to enable or disable a security log or packet logs of the Virtual Hub currently being managed, set the save contents of the packet log for each type of packet to be saved, and set the log file switch cycle for the security log or packet log that the currently managed Virtual Hub saves. There are the following packet types: TCP Connection Log, TCP Packet Log, DHCP Packet Log, UDP Packet Log, ICMP Packet Log, IP Packet Log, ARP Packet Log, and Ethernet Packet Log. To get the current setting, you can use the LogGet API. The log file switch cycle can be changed to switch in every second, every minute, every hour, every day, every month or not switch. To get the current setting, you can use the GetHubLog API.</p>
+<h3 id="input-json-rpc-format-29">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetHubLog&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;SaveSecurityLog_bool&quot;: false,
+    &quot;SecurityLogSwitchType_u32&quot;: 0,
+    &quot;SavePacketLog_bool&quot;: false,
+    &quot;PacketLogSwitchType_u32&quot;: 0,
+    &quot;PacketLogConfig_u32&quot;: [
+      1,
+      2,
+      3
+    ]
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-29">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;SaveSecurityLog_bool&quot;: false,
+    &quot;SecurityLogSwitchType_u32&quot;: 0,
+    &quot;SavePacketLog_bool&quot;: false,
+    &quot;PacketLogSwitchType_u32&quot;: 0,
+    &quot;PacketLogConfig_u32&quot;: [
+      1,
+      2,
+      3
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-29">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>SaveSecurityLog_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag to enable / disable saving the security log</td>
+</tr>
+<tr>
+<td><code>SecurityLogSwitchType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>The log filename switching setting of the security log<BR>Values:<BR><code>0</code>: No switching<BR><code>1</code>: Secondly basis<BR><code>2</code>: Minutely basis<BR><code>3</code>: Hourly basis<BR><code>4</code>: Daily basis<BR><code>5</code>: Monthly basis</td>
+</tr>
+<tr>
+<td><code>SavePacketLog_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag to enable / disable saving the security log</td>
+</tr>
+<tr>
+<td><code>PacketLogSwitchType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>The log filename switching settings of the packet logs<BR>Values:<BR><code>0</code>: No switching<BR><code>1</code>: Secondly basis<BR><code>2</code>: Minutely basis<BR><code>3</code>: Hourly basis<BR><code>4</code>: Daily basis<BR><code>5</code>: Monthly basis</td>
+</tr>
+<tr>
+<td><code>PacketLogConfig_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Specify the save contents of the packet logs (uint * 16 array). The index numbers: TcpConnection = 0, TcpAll = 1, DHCP = 2, UDP = 3, ICMP = 4, IP = 5, ARP = 6, Ethernet = 7.<BR>Values:<BR><code>0</code>: Not save<BR><code>1</code>: Only header<BR><code>2</code>: All payloads</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="gethublog"></a></p>
+<h2 id="gethublog-rpc-api-get-the-logging-configuration-of-the-virtual-hub">&quot;GetHubLog&quot; RPC API - Get the logging configuration of the Virtual Hub</h2>
+<h3 id="description-30">Description</h3>
+<p>Get the logging configuration of the Virtual Hub. Use this to get the configuration for a security log or packet logs of the Virtual Hub currently being managed, get the setting for save contents of the packet log for each type of packet to be saved, and get the log file switch cycle for the security log or packet log that the currently managed Virtual Hub saves. To set the current setting, you can use the SetHubLog API.</p>
+<h3 id="input-json-rpc-format-30">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetHubLog&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-30">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;SaveSecurityLog_bool&quot;: false,
+    &quot;SecurityLogSwitchType_u32&quot;: 0,
+    &quot;SavePacketLog_bool&quot;: false,
+    &quot;PacketLogSwitchType_u32&quot;: 0,
+    &quot;PacketLogConfig_u32&quot;: [
+      1,
+      2,
+      3
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-30">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>SaveSecurityLog_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag to enable / disable saving the security log</td>
+</tr>
+<tr>
+<td><code>SecurityLogSwitchType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>The log filename switching setting of the security log<BR>Values:<BR><code>0</code>: No switching<BR><code>1</code>: Secondly basis<BR><code>2</code>: Minutely basis<BR><code>3</code>: Hourly basis<BR><code>4</code>: Daily basis<BR><code>5</code>: Monthly basis</td>
+</tr>
+<tr>
+<td><code>SavePacketLog_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag to enable / disable saving the security log</td>
+</tr>
+<tr>
+<td><code>PacketLogSwitchType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>The log filename switching settings of the packet logs<BR>Values:<BR><code>0</code>: No switching<BR><code>1</code>: Secondly basis<BR><code>2</code>: Minutely basis<BR><code>3</code>: Hourly basis<BR><code>4</code>: Daily basis<BR><code>5</code>: Monthly basis</td>
+</tr>
+<tr>
+<td><code>PacketLogConfig_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Specify the save contents of the packet logs (uint * 16 array). The index numbers: TcpConnection = 0, TcpAll = 1, DHCP = 2, UDP = 3, ICMP = 4, IP = 5, ARP = 6, Ethernet = 7.<BR>Values:<BR><code>0</code>: Not save<BR><code>1</code>: Only header<BR><code>2</code>: All payloads</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="addca"></a></p>
+<h2 id="addca-rpc-api-add-trusted-ca-certificate">&quot;AddCa&quot; RPC API - Add Trusted CA Certificate</h2>
+<h3 id="description-31">Description</h3>
+<p>Add Trusted CA Certificate. Use this to add a new certificate to a list of CA certificates trusted by the currently managed Virtual Hub. The list of certificate authority certificates that are registered is used to verify certificates when a VPN Client is connected in signed certificate authentication mode. To get a list of the current certificates you can use the EnumCa API. The certificate you add must be saved in the X.509 file format. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.</p>
+<h3 id="input-json-rpc-format-31">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;AddCa&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Cert_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-31">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Cert_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-31">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Cert_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>The body of the X.509 certificate</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="enumca"></a></p>
+<h2 id="enumca-rpc-api-get-list-of-trusted-ca-certificates">&quot;EnumCa&quot; RPC API - Get List of Trusted CA Certificates</h2>
+<h3 id="description-32">Description</h3>
+<p>Get List of Trusted CA Certificates. Here you can manage the certificate authority certificates that are trusted by this currently managed Virtual Hub. The list of certificate authority certificates that are registered is used to verify certificates when a VPN Client is connected in signed certificate authentication mode. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.</p>
+<h3 id="input-json-rpc-format-32">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;EnumCa&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-32">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;CAList&quot;: [
+      {
+        &quot;Key_u32&quot;: 0,
+        &quot;SubjectName_utf&quot;: &quot;subjectname&quot;,
+        &quot;IssuerName_utf&quot;: &quot;issuername&quot;,
+        &quot;Expires_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;
+      },
+      {
+        &quot;Key_u32&quot;: 0,
+        &quot;SubjectName_utf&quot;: &quot;subjectname&quot;,
+        &quot;IssuerName_utf&quot;: &quot;issuername&quot;,
+        &quot;Expires_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;
+      },
+      {
+        &quot;Key_u32&quot;: 0,
+        &quot;SubjectName_utf&quot;: &quot;subjectname&quot;,
+        &quot;IssuerName_utf&quot;: &quot;issuername&quot;,
+        &quot;Expires_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-32">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>CAList</code></td>
+<td><code>Array object</code></td>
+<td>The list of CA</td>
+</tr>
+<tr>
+<td><code>Key_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>The key id of the item</td>
+</tr>
+<tr>
+<td><code>SubjectName_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Subject</td>
+</tr>
+<tr>
+<td><code>IssuerName_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Issuer</td>
+</tr>
+<tr>
+<td><code>Expires_dt</code></td>
+<td><code>Date</code></td>
+<td>Expiration date</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getca"></a></p>
+<h2 id="getca-rpc-api-get-trusted-ca-certificate">&quot;GetCa&quot; RPC API - Get Trusted CA Certificate</h2>
+<h3 id="description-33">Description</h3>
+<p>Get Trusted CA Certificate. Use this to get an existing certificate from the list of CA certificates trusted by the currently managed Virtual Hub and save it as a file in X.509 format. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.</p>
+<h3 id="input-json-rpc-format-33">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetCa&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Key_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-33">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Key_u32&quot;: 0,
+    &quot;Cert_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-33">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Key_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>The key id of the certificate</td>
+</tr>
+<tr>
+<td><code>Cert_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>The body of the X.509 certificate</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="deleteca"></a></p>
+<h2 id="deleteca-rpc-api-delete-trusted-ca-certificate">&quot;DeleteCa&quot; RPC API - Delete Trusted CA Certificate</h2>
+<h3 id="description-34">Description</h3>
+<p>Delete Trusted CA Certificate. Use this to delete an existing certificate from the list of CA certificates trusted by the currently managed Virtual Hub. To get a list of the current certificates you can use the EnumCa API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.</p>
+<h3 id="input-json-rpc-format-34">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;DeleteCa&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Key_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-34">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Key_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="parameters-34">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Key_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Certificate key id to be deleted</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="createlink"></a></p>
+<h2 id="createlink-rpc-api-create-new-cascade-connection">&quot;CreateLink&quot; RPC API - Create New Cascade Connection</h2>
+<h3 id="description-35">Description</h3>
+<p>Create New Cascade Connection. Use this to create a new Cascade Connection on the currently managed Virtual Hub. By using a Cascade Connection, you can connect this Virtual Hub by Cascade Connection to another Virtual Hub that is operating on the same or a different computer. To create a Cascade Connection, you must specify the name of the Cascade Connection, destination server and destination Virtual Hub and user name. When a new Cascade Connection is created, the type of user authentication is initially set as Anonymous Authentication and the proxy server setting and the verification options of the server certificate is not set. To change these settings and other advanced settings after a Cascade Connection has been created, use the other APIs that include the name &quot;Link&quot;. [Warning About Cascade Connections] By connecting using a Cascade Connection you can create a Layer 2 bridge between multiple Virtual Hubs but if the connection is incorrectly configured, a loopback Cascade Connection could inadvertently be created. When using a Cascade Connection function please design the network topology with care. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-35">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;CreateLink&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_Ex_str&quot;: &quot;hubname_ex&quot;,
+    &quot;CheckServerCert_bool&quot;: false,
+    &quot;AccountName_utf&quot;: &quot;clientoption_accountname&quot;,
+    &quot;Hostname_str&quot;: &quot;clientoption_hostname&quot;,
+    &quot;Port_u32&quot;: 0,
+    &quot;ProxyType_u32&quot;: 0,
+    &quot;HubName_str&quot;: &quot;clientoption_hubname&quot;,
+    &quot;MaxConnection_u32&quot;: 0,
+    &quot;UseEncrypt_bool&quot;: false,
+    &quot;UseCompress_bool&quot;: false,
+    &quot;HalfConnection_bool&quot;: false,
+    &quot;AdditionalConnectionInterval_u32&quot;: 0,
+    &quot;ConnectionDisconnectSpan_u32&quot;: 0,
+    &quot;AuthType_u32&quot;: 0,
+    &quot;Username_str&quot;: &quot;clientauth_username&quot;,
+    &quot;HashedPassword_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;PlainPassword_str&quot;: &quot;clientauth_plainpassword&quot;,
+    &quot;ClientX_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;ClientK_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;policy:DHCPFilter_bool&quot;: false,
+    &quot;policy:DHCPNoServer_bool&quot;: false,
+    &quot;policy:DHCPForce_bool&quot;: false,
+    &quot;SecPol_CheckMac_bool&quot;: false,
+    &quot;SecPol_CheckIP_bool&quot;: false,
+    &quot;policy:ArpDhcpOnly_bool&quot;: false,
+    &quot;policy:PrivacyFilter_bool&quot;: false,
+    &quot;policy:NoServer_bool&quot;: false,
+    &quot;policy:NoBroadcastLimiter_bool&quot;: false,
+    &quot;policy:MaxMac_u32&quot;: 0,
+    &quot;policy:MaxIP_u32&quot;: 0,
+    &quot;policy:MaxUpload_u32&quot;: 0,
+    &quot;policy:MaxDownload_u32&quot;: 0,
+    &quot;policy:RSandRAFilter_bool&quot;: false,
+    &quot;SecPol_RAFilter_bool&quot;: false,
+    &quot;policy:DHCPv6Filter_bool&quot;: false,
+    &quot;policy:DHCPv6NoServer_bool&quot;: false,
+    &quot;SecPol_CheckIPv6_bool&quot;: false,
+    &quot;policy:NoServerV6_bool&quot;: false,
+    &quot;policy:MaxIPv6_u32&quot;: 0,
+    &quot;policy:FilterIPv4_bool&quot;: false,
+    &quot;policy:FilterIPv6_bool&quot;: false,
+    &quot;policy:FilterNonIP_bool&quot;: false,
+    &quot;policy:NoIPv6DefaultRouterInRA_bool&quot;: false,
+    &quot;policy:VLanId_u32&quot;: 0,
+    &quot;policy:Ver3_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-35">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_Ex_str&quot;: &quot;hubname_ex&quot;,
+    &quot;Online_bool&quot;: false,
+    &quot;CheckServerCert_bool&quot;: false,
+    &quot;ServerCert_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;AccountName_utf&quot;: &quot;clientoption_accountname&quot;,
+    &quot;Hostname_str&quot;: &quot;clientoption_hostname&quot;,
+    &quot;Port_u32&quot;: 0,
+    &quot;ProxyType_u32&quot;: 0,
+    &quot;ProxyName_str&quot;: &quot;clientoption_proxyname&quot;,
+    &quot;ProxyPort_u32&quot;: 0,
+    &quot;ProxyUsername_str&quot;: &quot;clientoption_proxyusername&quot;,
+    &quot;ProxyPassword_str&quot;: &quot;clientoption_proxypassword&quot;,
+    &quot;HubName_str&quot;: &quot;clientoption_hubname&quot;,
+    &quot;MaxConnection_u32&quot;: 0,
+    &quot;UseEncrypt_bool&quot;: false,
+    &quot;UseCompress_bool&quot;: false,
+    &quot;HalfConnection_bool&quot;: false,
+    &quot;AdditionalConnectionInterval_u32&quot;: 0,
+    &quot;ConnectionDisconnectSpan_u32&quot;: 0,
+    &quot;DisableQoS_bool&quot;: false,
+    &quot;NoTls1_bool&quot;: false,
+    &quot;NoUdpAcceleration_bool&quot;: false,
+    &quot;AuthType_u32&quot;: 0,
+    &quot;Username_str&quot;: &quot;clientauth_username&quot;,
+    &quot;HashedPassword_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;PlainPassword_str&quot;: &quot;clientauth_plainpassword&quot;,
+    &quot;ClientX_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;ClientK_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;policy:DHCPFilter_bool&quot;: false,
+    &quot;policy:DHCPNoServer_bool&quot;: false,
+    &quot;policy:DHCPForce_bool&quot;: false,
+    &quot;SecPol_CheckMac_bool&quot;: false,
+    &quot;SecPol_CheckIP_bool&quot;: false,
+    &quot;policy:ArpDhcpOnly_bool&quot;: false,
+    &quot;policy:PrivacyFilter_bool&quot;: false,
+    &quot;policy:NoServer_bool&quot;: false,
+    &quot;policy:NoBroadcastLimiter_bool&quot;: false,
+    &quot;policy:MaxMac_u32&quot;: 0,
+    &quot;policy:MaxIP_u32&quot;: 0,
+    &quot;policy:MaxUpload_u32&quot;: 0,
+    &quot;policy:MaxDownload_u32&quot;: 0,
+    &quot;policy:RSandRAFilter_bool&quot;: false,
+    &quot;SecPol_RAFilter_bool&quot;: false,
+    &quot;policy:DHCPv6Filter_bool&quot;: false,
+    &quot;policy:DHCPv6NoServer_bool&quot;: false,
+    &quot;SecPol_CheckIPv6_bool&quot;: false,
+    &quot;policy:NoServerV6_bool&quot;: false,
+    &quot;policy:MaxIPv6_u32&quot;: 0,
+    &quot;policy:FilterIPv4_bool&quot;: false,
+    &quot;policy:FilterIPv6_bool&quot;: false,
+    &quot;policy:FilterNonIP_bool&quot;: false,
+    &quot;policy:NoIPv6DefaultRouterInRA_bool&quot;: false,
+    &quot;policy:VLanId_u32&quot;: 0,
+    &quot;policy:Ver3_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="parameters-35">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_Ex_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Online_bool</code></td>
+<td><code>boolean</code></td>
+<td>Online flag</td>
+</tr>
+<tr>
+<td><code>CheckServerCert_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag to enable validation for the server certificate</td>
+</tr>
+<tr>
+<td><code>ServerCert_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>The body of server X.509 certificate to compare. Valid only if the CheckServerCert_bool flag is true.</td>
+</tr>
+<tr>
+<td><code>AccountName_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Client Option Parameters: Specify the name of the Cascade Connection</td>
+</tr>
+<tr>
+<td><code>Hostname_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Client Option Parameters: Specify the hostname of the destination VPN Server. You can also specify by IP address.</td>
+</tr>
+<tr>
+<td><code>Port_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Client Option Parameters: Specify the port number of the destination VPN Server.</td>
+</tr>
+<tr>
+<td><code>ProxyType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Client Option Parameters: The type of the proxy server<BR>Values:<BR><code>0</code>: Direct TCP connection<BR><code>1</code>: Connection via HTTP proxy server<BR><code>2</code>: Connection via SOCKS proxy server</td>
+</tr>
+<tr>
+<td><code>ProxyName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Client Option Parameters: The hostname or IP address of the proxy server name</td>
+</tr>
+<tr>
+<td><code>ProxyPort_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Client Option Parameters: The port number of the proxy server</td>
+</tr>
+<tr>
+<td><code>ProxyUsername_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Client Option Parameters: The username to connect to the proxy server</td>
+</tr>
+<tr>
+<td><code>ProxyPassword_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Client Option Parameters: The password to connect to the proxy server</td>
+</tr>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Client Option Parameters: The Virtual Hub on the destination VPN Server</td>
+</tr>
+<tr>
+<td><code>MaxConnection_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Client Option Parameters: Number of TCP Connections to Use in VPN Communication</td>
+</tr>
+<tr>
+<td><code>UseEncrypt_bool</code></td>
+<td><code>boolean</code></td>
+<td>Client Option Parameters: The flag to enable the encryption on the communication</td>
+</tr>
+<tr>
+<td><code>UseCompress_bool</code></td>
+<td><code>boolean</code></td>
+<td>Client Option Parameters: Enable / Disable Data Compression when Communicating by Cascade Connection</td>
+</tr>
+<tr>
+<td><code>HalfConnection_bool</code></td>
+<td><code>boolean</code></td>
+<td>Client Option Parameters: Specify true when enabling half duplex mode. When using two or more TCP connections for VPN communication, it is possible to use Half Duplex Mode. By enabling half duplex mode it is possible to automatically fix data transmission direction as half and half for each TCP connection. In the case where a VPN using 8 TCP connections is established, for example, when half-duplex is enabled, communication can be fixes so that 4 TCP connections are dedicated to the upload direction and the other 4 connections are dedicated to the download direction.</td>
+</tr>
+<tr>
+<td><code>AdditionalConnectionInterval_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Client Option Parameters: Connection attempt interval when additional connection will be established</td>
+</tr>
+<tr>
+<td><code>ConnectionDisconnectSpan_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Client Option Parameters: Connection Life of Each TCP Connection (0 for no keep-alive)</td>
+</tr>
+<tr>
+<td><code>DisableQoS_bool</code></td>
+<td><code>boolean</code></td>
+<td>Client Option Parameters: Disable QoS Control Function if the value is true</td>
+</tr>
+<tr>
+<td><code>NoTls1_bool</code></td>
+<td><code>boolean</code></td>
+<td>Client Option Parameters: Do not use TLS 1.x of the value is true</td>
+</tr>
+<tr>
+<td><code>NoUdpAcceleration_bool</code></td>
+<td><code>boolean</code></td>
+<td>Client Option Parameters: Do not use UDP acceleration mode if the value is true</td>
+</tr>
+<tr>
+<td><code>AuthType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Authentication type<BR>Values:<BR><code>0</code>: Anonymous authentication<BR><code>1</code>: SHA-0 hashed password authentication<BR><code>2</code>: Plain password authentication<BR><code>3</code>: Certificate authentication</td>
+</tr>
+<tr>
+<td><code>Username_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>User name</td>
+</tr>
+<tr>
+<td><code>HashedPassword_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>SHA-0 Hashed password. Valid only if ClientAuth_AuthType_u32 == SHA0_Hashed_Password (1). The SHA-0 hashed password must be caluclated by the SHA0(UpperCase(username_ascii_string) + password_ascii_string).</td>
+</tr>
+<tr>
+<td><code>PlainPassword_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Plaintext Password. Valid only if ClientAuth_AuthType_u32 == PlainPassword (2).</td>
+</tr>
+<tr>
+<td><code>ClientX_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Client certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3).</td>
+</tr>
+<tr>
+<td><code>ClientK_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Client private key of the certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3).</td>
+</tr>
+<tr>
+<td><code>policy:DHCPFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPNoServer_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPForce_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side.</td>
+</tr>
+<tr>
+<td><code>SecPol_CheckMac_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Prohibit the duplicate MAC address</td>
+</tr>
+<tr>
+<td><code>SecPol_CheckIP_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Prohibit a duplicate IP address (IPv4)</td>
+</tr>
+<tr>
+<td><code>policy:ArpDhcpOnly_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting.</td>
+</tr>
+<tr>
+<td><code>policy:PrivacyFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:NoServer_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4.</td>
+</tr>
+<tr>
+<td><code>policy:NoBroadcastLimiter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting.</td>
+</tr>
+<tr>
+<td><code>policy:MaxMac_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session.</td>
+</tr>
+<tr>
+<td><code>policy:MaxIP_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session.</td>
+</tr>
+<tr>
+<td><code>policy:MaxUpload_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>policy:MaxDownload_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>policy:RSandRAFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection.</td>
+</tr>
+<tr>
+<td><code>SecPol_RAFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter the router advertisement packet (IPv6)</td>
+</tr>
+<tr>
+<td><code>policy:DHCPv6Filter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPv6NoServer_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients.</td>
+</tr>
+<tr>
+<td><code>SecPol_CheckIPv6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Prohibit the duplicate IP address (IPv6)</td>
+</tr>
+<tr>
+<td><code>policy:NoServerV6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6.</td>
+</tr>
+<tr>
+<td><code>policy:MaxIPv6_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session.</td>
+</tr>
+<tr>
+<td><code>policy:FilterIPv4_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:FilterIPv6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:FilterNonIP_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. &quot;Non-IP packet&quot; mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets.</td>
+</tr>
+<tr>
+<td><code>policy:NoIPv6DefaultRouterInRA_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.</td>
+</tr>
+<tr>
+<td><code>policy:VLanId_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing.</td>
+</tr>
+<tr>
+<td><code>policy:Ver3_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Whether version 3.0 (must be true)</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getlink"></a></p>
+<h2 id="getlink-rpc-api-get-the-cascade-connection-setting">&quot;GetLink&quot; RPC API - Get the Cascade Connection Setting</h2>
+<h3 id="description-36">Description</h3>
+<p>Get the Cascade Connection Setting. Use this to get the Connection Setting of a Cascade Connection that is registered on the currently managed Virtual Hub. To change the Connection Setting contents of the Cascade Connection, use the APIs that include the name &quot;Link&quot; after creating the Cascade Connection. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-36">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetLink&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_Ex_str&quot;: &quot;hubname_ex&quot;,
+    &quot;AccountName_utf&quot;: &quot;clientoption_accountname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-36">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_Ex_str&quot;: &quot;hubname_ex&quot;,
+    &quot;Online_bool&quot;: false,
+    &quot;CheckServerCert_bool&quot;: false,
+    &quot;ServerCert_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;AccountName_utf&quot;: &quot;clientoption_accountname&quot;,
+    &quot;Hostname_str&quot;: &quot;clientoption_hostname&quot;,
+    &quot;Port_u32&quot;: 0,
+    &quot;ProxyType_u32&quot;: 0,
+    &quot;ProxyName_str&quot;: &quot;clientoption_proxyname&quot;,
+    &quot;ProxyPort_u32&quot;: 0,
+    &quot;ProxyUsername_str&quot;: &quot;clientoption_proxyusername&quot;,
+    &quot;ProxyPassword_str&quot;: &quot;clientoption_proxypassword&quot;,
+    &quot;HubName_str&quot;: &quot;clientoption_hubname&quot;,
+    &quot;MaxConnection_u32&quot;: 0,
+    &quot;UseEncrypt_bool&quot;: false,
+    &quot;UseCompress_bool&quot;: false,
+    &quot;HalfConnection_bool&quot;: false,
+    &quot;AdditionalConnectionInterval_u32&quot;: 0,
+    &quot;ConnectionDisconnectSpan_u32&quot;: 0,
+    &quot;DisableQoS_bool&quot;: false,
+    &quot;NoTls1_bool&quot;: false,
+    &quot;NoUdpAcceleration_bool&quot;: false,
+    &quot;AuthType_u32&quot;: 0,
+    &quot;Username_str&quot;: &quot;clientauth_username&quot;,
+    &quot;HashedPassword_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;PlainPassword_str&quot;: &quot;clientauth_plainpassword&quot;,
+    &quot;ClientX_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;ClientK_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;policy:DHCPFilter_bool&quot;: false,
+    &quot;policy:DHCPNoServer_bool&quot;: false,
+    &quot;policy:DHCPForce_bool&quot;: false,
+    &quot;SecPol_CheckMac_bool&quot;: false,
+    &quot;SecPol_CheckIP_bool&quot;: false,
+    &quot;policy:ArpDhcpOnly_bool&quot;: false,
+    &quot;policy:PrivacyFilter_bool&quot;: false,
+    &quot;policy:NoServer_bool&quot;: false,
+    &quot;policy:NoBroadcastLimiter_bool&quot;: false,
+    &quot;policy:MaxMac_u32&quot;: 0,
+    &quot;policy:MaxIP_u32&quot;: 0,
+    &quot;policy:MaxUpload_u32&quot;: 0,
+    &quot;policy:MaxDownload_u32&quot;: 0,
+    &quot;policy:RSandRAFilter_bool&quot;: false,
+    &quot;SecPol_RAFilter_bool&quot;: false,
+    &quot;policy:DHCPv6Filter_bool&quot;: false,
+    &quot;policy:DHCPv6NoServer_bool&quot;: false,
+    &quot;SecPol_CheckIPv6_bool&quot;: false,
+    &quot;policy:NoServerV6_bool&quot;: false,
+    &quot;policy:MaxIPv6_u32&quot;: 0,
+    &quot;policy:FilterIPv4_bool&quot;: false,
+    &quot;policy:FilterIPv6_bool&quot;: false,
+    &quot;policy:FilterNonIP_bool&quot;: false,
+    &quot;policy:NoIPv6DefaultRouterInRA_bool&quot;: false,
+    &quot;policy:VLanId_u32&quot;: 0,
+    &quot;policy:Ver3_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="parameters-36">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_Ex_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Online_bool</code></td>
+<td><code>boolean</code></td>
+<td>Online flag</td>
+</tr>
+<tr>
+<td><code>CheckServerCert_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag to enable validation for the server certificate</td>
+</tr>
+<tr>
+<td><code>ServerCert_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>The body of server X.509 certificate to compare. Valid only if the CheckServerCert_bool flag is true.</td>
+</tr>
+<tr>
+<td><code>AccountName_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Client Option Parameters: Specify the name of the Cascade Connection</td>
+</tr>
+<tr>
+<td><code>Hostname_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Client Option Parameters: Specify the hostname of the destination VPN Server. You can also specify by IP address.</td>
+</tr>
+<tr>
+<td><code>Port_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Client Option Parameters: Specify the port number of the destination VPN Server.</td>
+</tr>
+<tr>
+<td><code>ProxyType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Client Option Parameters: The type of the proxy server<BR>Values:<BR><code>0</code>: Direct TCP connection<BR><code>1</code>: Connection via HTTP proxy server<BR><code>2</code>: Connection via SOCKS proxy server</td>
+</tr>
+<tr>
+<td><code>ProxyName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Client Option Parameters: The hostname or IP address of the proxy server name</td>
+</tr>
+<tr>
+<td><code>ProxyPort_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Client Option Parameters: The port number of the proxy server</td>
+</tr>
+<tr>
+<td><code>ProxyUsername_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Client Option Parameters: The username to connect to the proxy server</td>
+</tr>
+<tr>
+<td><code>ProxyPassword_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Client Option Parameters: The password to connect to the proxy server</td>
+</tr>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Client Option Parameters: The Virtual Hub on the destination VPN Server</td>
+</tr>
+<tr>
+<td><code>MaxConnection_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Client Option Parameters: Number of TCP Connections to Use in VPN Communication</td>
+</tr>
+<tr>
+<td><code>UseEncrypt_bool</code></td>
+<td><code>boolean</code></td>
+<td>Client Option Parameters: The flag to enable the encryption on the communication</td>
+</tr>
+<tr>
+<td><code>UseCompress_bool</code></td>
+<td><code>boolean</code></td>
+<td>Client Option Parameters: Enable / Disable Data Compression when Communicating by Cascade Connection</td>
+</tr>
+<tr>
+<td><code>HalfConnection_bool</code></td>
+<td><code>boolean</code></td>
+<td>Client Option Parameters: Specify true when enabling half duplex mode. When using two or more TCP connections for VPN communication, it is possible to use Half Duplex Mode. By enabling half duplex mode it is possible to automatically fix data transmission direction as half and half for each TCP connection. In the case where a VPN using 8 TCP connections is established, for example, when half-duplex is enabled, communication can be fixes so that 4 TCP connections are dedicated to the upload direction and the other 4 connections are dedicated to the download direction.</td>
+</tr>
+<tr>
+<td><code>AdditionalConnectionInterval_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Client Option Parameters: Connection attempt interval when additional connection will be established</td>
+</tr>
+<tr>
+<td><code>ConnectionDisconnectSpan_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Client Option Parameters: Connection Life of Each TCP Connection (0 for no keep-alive)</td>
+</tr>
+<tr>
+<td><code>DisableQoS_bool</code></td>
+<td><code>boolean</code></td>
+<td>Client Option Parameters: Disable QoS Control Function if the value is true</td>
+</tr>
+<tr>
+<td><code>NoTls1_bool</code></td>
+<td><code>boolean</code></td>
+<td>Client Option Parameters: Do not use TLS 1.x of the value is true</td>
+</tr>
+<tr>
+<td><code>NoUdpAcceleration_bool</code></td>
+<td><code>boolean</code></td>
+<td>Client Option Parameters: Do not use UDP acceleration mode if the value is true</td>
+</tr>
+<tr>
+<td><code>AuthType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Authentication type<BR>Values:<BR><code>0</code>: Anonymous authentication<BR><code>1</code>: SHA-0 hashed password authentication<BR><code>2</code>: Plain password authentication<BR><code>3</code>: Certificate authentication</td>
+</tr>
+<tr>
+<td><code>Username_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>User name</td>
+</tr>
+<tr>
+<td><code>HashedPassword_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>SHA-0 Hashed password. Valid only if ClientAuth_AuthType_u32 == SHA0_Hashed_Password (1). The SHA-0 hashed password must be caluclated by the SHA0(UpperCase(username_ascii_string) + password_ascii_string).</td>
+</tr>
+<tr>
+<td><code>PlainPassword_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Plaintext Password. Valid only if ClientAuth_AuthType_u32 == PlainPassword (2).</td>
+</tr>
+<tr>
+<td><code>ClientX_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Client certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3).</td>
+</tr>
+<tr>
+<td><code>ClientK_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Client private key of the certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3).</td>
+</tr>
+<tr>
+<td><code>policy:DHCPFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPNoServer_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPForce_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side.</td>
+</tr>
+<tr>
+<td><code>SecPol_CheckMac_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Prohibit the duplicate MAC address</td>
+</tr>
+<tr>
+<td><code>SecPol_CheckIP_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Prohibit a duplicate IP address (IPv4)</td>
+</tr>
+<tr>
+<td><code>policy:ArpDhcpOnly_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting.</td>
+</tr>
+<tr>
+<td><code>policy:PrivacyFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:NoServer_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4.</td>
+</tr>
+<tr>
+<td><code>policy:NoBroadcastLimiter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting.</td>
+</tr>
+<tr>
+<td><code>policy:MaxMac_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session.</td>
+</tr>
+<tr>
+<td><code>policy:MaxIP_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session.</td>
+</tr>
+<tr>
+<td><code>policy:MaxUpload_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>policy:MaxDownload_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>policy:RSandRAFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection.</td>
+</tr>
+<tr>
+<td><code>SecPol_RAFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter the router advertisement packet (IPv6)</td>
+</tr>
+<tr>
+<td><code>policy:DHCPv6Filter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPv6NoServer_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients.</td>
+</tr>
+<tr>
+<td><code>SecPol_CheckIPv6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Prohibit the duplicate IP address (IPv6)</td>
+</tr>
+<tr>
+<td><code>policy:NoServerV6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6.</td>
+</tr>
+<tr>
+<td><code>policy:MaxIPv6_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session.</td>
+</tr>
+<tr>
+<td><code>policy:FilterIPv4_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:FilterIPv6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:FilterNonIP_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. &quot;Non-IP packet&quot; mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets.</td>
+</tr>
+<tr>
+<td><code>policy:NoIPv6DefaultRouterInRA_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.</td>
+</tr>
+<tr>
+<td><code>policy:VLanId_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing.</td>
+</tr>
+<tr>
+<td><code>policy:Ver3_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Whether version 3.0 (must be true)</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="setlink"></a></p>
+<h2 id="setlink-rpc-api-change-existing-cascade-connection">&quot;SetLink&quot; RPC API - Change Existing Cascade Connection</h2>
+<h3 id="description-37">Description</h3>
+<p>Change Existing Cascade Connection. Use this to alter the setting of an existing Cascade Connection on the currently managed Virtual Hub.</p>
+<h3 id="input-json-rpc-format-37">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetLink&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_Ex_str&quot;: &quot;hubname_ex&quot;,
+    &quot;CheckServerCert_bool&quot;: false,
+    &quot;AccountName_utf&quot;: &quot;clientoption_accountname&quot;,
+    &quot;Hostname_str&quot;: &quot;clientoption_hostname&quot;,
+    &quot;Port_u32&quot;: 0,
+    &quot;ProxyType_u32&quot;: 0,
+    &quot;HubName_str&quot;: &quot;clientoption_hubname&quot;,
+    &quot;MaxConnection_u32&quot;: 0,
+    &quot;UseEncrypt_bool&quot;: false,
+    &quot;UseCompress_bool&quot;: false,
+    &quot;HalfConnection_bool&quot;: false,
+    &quot;AdditionalConnectionInterval_u32&quot;: 0,
+    &quot;ConnectionDisconnectSpan_u32&quot;: 0,
+    &quot;AuthType_u32&quot;: 0,
+    &quot;Username_str&quot;: &quot;clientauth_username&quot;,
+    &quot;HashedPassword_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;PlainPassword_str&quot;: &quot;clientauth_plainpassword&quot;,
+    &quot;ClientX_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;ClientK_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;policy:DHCPFilter_bool&quot;: false,
+    &quot;policy:DHCPNoServer_bool&quot;: false,
+    &quot;policy:DHCPForce_bool&quot;: false,
+    &quot;SecPol_CheckMac_bool&quot;: false,
+    &quot;SecPol_CheckIP_bool&quot;: false,
+    &quot;policy:ArpDhcpOnly_bool&quot;: false,
+    &quot;policy:PrivacyFilter_bool&quot;: false,
+    &quot;policy:NoServer_bool&quot;: false,
+    &quot;policy:NoBroadcastLimiter_bool&quot;: false,
+    &quot;policy:MaxMac_u32&quot;: 0,
+    &quot;policy:MaxIP_u32&quot;: 0,
+    &quot;policy:MaxUpload_u32&quot;: 0,
+    &quot;policy:MaxDownload_u32&quot;: 0,
+    &quot;policy:RSandRAFilter_bool&quot;: false,
+    &quot;SecPol_RAFilter_bool&quot;: false,
+    &quot;policy:DHCPv6Filter_bool&quot;: false,
+    &quot;policy:DHCPv6NoServer_bool&quot;: false,
+    &quot;SecPol_CheckIPv6_bool&quot;: false,
+    &quot;policy:NoServerV6_bool&quot;: false,
+    &quot;policy:MaxIPv6_u32&quot;: 0,
+    &quot;policy:FilterIPv4_bool&quot;: false,
+    &quot;policy:FilterIPv6_bool&quot;: false,
+    &quot;policy:FilterNonIP_bool&quot;: false,
+    &quot;policy:NoIPv6DefaultRouterInRA_bool&quot;: false,
+    &quot;policy:VLanId_u32&quot;: 0,
+    &quot;policy:Ver3_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-37">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_Ex_str&quot;: &quot;hubname_ex&quot;,
+    &quot;Online_bool&quot;: false,
+    &quot;CheckServerCert_bool&quot;: false,
+    &quot;ServerCert_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;AccountName_utf&quot;: &quot;clientoption_accountname&quot;,
+    &quot;Hostname_str&quot;: &quot;clientoption_hostname&quot;,
+    &quot;Port_u32&quot;: 0,
+    &quot;ProxyType_u32&quot;: 0,
+    &quot;ProxyName_str&quot;: &quot;clientoption_proxyname&quot;,
+    &quot;ProxyPort_u32&quot;: 0,
+    &quot;ProxyUsername_str&quot;: &quot;clientoption_proxyusername&quot;,
+    &quot;ProxyPassword_str&quot;: &quot;clientoption_proxypassword&quot;,
+    &quot;HubName_str&quot;: &quot;clientoption_hubname&quot;,
+    &quot;MaxConnection_u32&quot;: 0,
+    &quot;UseEncrypt_bool&quot;: false,
+    &quot;UseCompress_bool&quot;: false,
+    &quot;HalfConnection_bool&quot;: false,
+    &quot;AdditionalConnectionInterval_u32&quot;: 0,
+    &quot;ConnectionDisconnectSpan_u32&quot;: 0,
+    &quot;DisableQoS_bool&quot;: false,
+    &quot;NoTls1_bool&quot;: false,
+    &quot;NoUdpAcceleration_bool&quot;: false,
+    &quot;AuthType_u32&quot;: 0,
+    &quot;Username_str&quot;: &quot;clientauth_username&quot;,
+    &quot;HashedPassword_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;PlainPassword_str&quot;: &quot;clientauth_plainpassword&quot;,
+    &quot;ClientX_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;ClientK_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;policy:DHCPFilter_bool&quot;: false,
+    &quot;policy:DHCPNoServer_bool&quot;: false,
+    &quot;policy:DHCPForce_bool&quot;: false,
+    &quot;SecPol_CheckMac_bool&quot;: false,
+    &quot;SecPol_CheckIP_bool&quot;: false,
+    &quot;policy:ArpDhcpOnly_bool&quot;: false,
+    &quot;policy:PrivacyFilter_bool&quot;: false,
+    &quot;policy:NoServer_bool&quot;: false,
+    &quot;policy:NoBroadcastLimiter_bool&quot;: false,
+    &quot;policy:MaxMac_u32&quot;: 0,
+    &quot;policy:MaxIP_u32&quot;: 0,
+    &quot;policy:MaxUpload_u32&quot;: 0,
+    &quot;policy:MaxDownload_u32&quot;: 0,
+    &quot;policy:RSandRAFilter_bool&quot;: false,
+    &quot;SecPol_RAFilter_bool&quot;: false,
+    &quot;policy:DHCPv6Filter_bool&quot;: false,
+    &quot;policy:DHCPv6NoServer_bool&quot;: false,
+    &quot;SecPol_CheckIPv6_bool&quot;: false,
+    &quot;policy:NoServerV6_bool&quot;: false,
+    &quot;policy:MaxIPv6_u32&quot;: 0,
+    &quot;policy:FilterIPv4_bool&quot;: false,
+    &quot;policy:FilterIPv6_bool&quot;: false,
+    &quot;policy:FilterNonIP_bool&quot;: false,
+    &quot;policy:NoIPv6DefaultRouterInRA_bool&quot;: false,
+    &quot;policy:VLanId_u32&quot;: 0,
+    &quot;policy:Ver3_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="parameters-37">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_Ex_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Online_bool</code></td>
+<td><code>boolean</code></td>
+<td>Online flag</td>
+</tr>
+<tr>
+<td><code>CheckServerCert_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag to enable validation for the server certificate</td>
+</tr>
+<tr>
+<td><code>ServerCert_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>The body of server X.509 certificate to compare. Valid only if the CheckServerCert_bool flag is true.</td>
+</tr>
+<tr>
+<td><code>AccountName_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Client Option Parameters: Specify the name of the Cascade Connection</td>
+</tr>
+<tr>
+<td><code>Hostname_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Client Option Parameters: Specify the hostname of the destination VPN Server. You can also specify by IP address.</td>
+</tr>
+<tr>
+<td><code>Port_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Client Option Parameters: Specify the port number of the destination VPN Server.</td>
+</tr>
+<tr>
+<td><code>ProxyType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Client Option Parameters: The type of the proxy server<BR>Values:<BR><code>0</code>: Direct TCP connection<BR><code>1</code>: Connection via HTTP proxy server<BR><code>2</code>: Connection via SOCKS proxy server</td>
+</tr>
+<tr>
+<td><code>ProxyName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Client Option Parameters: The hostname or IP address of the proxy server name</td>
+</tr>
+<tr>
+<td><code>ProxyPort_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Client Option Parameters: The port number of the proxy server</td>
+</tr>
+<tr>
+<td><code>ProxyUsername_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Client Option Parameters: The username to connect to the proxy server</td>
+</tr>
+<tr>
+<td><code>ProxyPassword_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Client Option Parameters: The password to connect to the proxy server</td>
+</tr>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Client Option Parameters: The Virtual Hub on the destination VPN Server</td>
+</tr>
+<tr>
+<td><code>MaxConnection_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Client Option Parameters: Number of TCP Connections to Use in VPN Communication</td>
+</tr>
+<tr>
+<td><code>UseEncrypt_bool</code></td>
+<td><code>boolean</code></td>
+<td>Client Option Parameters: The flag to enable the encryption on the communication</td>
+</tr>
+<tr>
+<td><code>UseCompress_bool</code></td>
+<td><code>boolean</code></td>
+<td>Client Option Parameters: Enable / Disable Data Compression when Communicating by Cascade Connection</td>
+</tr>
+<tr>
+<td><code>HalfConnection_bool</code></td>
+<td><code>boolean</code></td>
+<td>Client Option Parameters: Specify true when enabling half duplex mode. When using two or more TCP connections for VPN communication, it is possible to use Half Duplex Mode. By enabling half duplex mode it is possible to automatically fix data transmission direction as half and half for each TCP connection. In the case where a VPN using 8 TCP connections is established, for example, when half-duplex is enabled, communication can be fixes so that 4 TCP connections are dedicated to the upload direction and the other 4 connections are dedicated to the download direction.</td>
+</tr>
+<tr>
+<td><code>AdditionalConnectionInterval_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Client Option Parameters: Connection attempt interval when additional connection will be established</td>
+</tr>
+<tr>
+<td><code>ConnectionDisconnectSpan_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Client Option Parameters: Connection Life of Each TCP Connection (0 for no keep-alive)</td>
+</tr>
+<tr>
+<td><code>DisableQoS_bool</code></td>
+<td><code>boolean</code></td>
+<td>Client Option Parameters: Disable QoS Control Function if the value is true</td>
+</tr>
+<tr>
+<td><code>NoTls1_bool</code></td>
+<td><code>boolean</code></td>
+<td>Client Option Parameters: Do not use TLS 1.x of the value is true</td>
+</tr>
+<tr>
+<td><code>NoUdpAcceleration_bool</code></td>
+<td><code>boolean</code></td>
+<td>Client Option Parameters: Do not use UDP acceleration mode if the value is true</td>
+</tr>
+<tr>
+<td><code>AuthType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Authentication type<BR>Values:<BR><code>0</code>: Anonymous authentication<BR><code>1</code>: SHA-0 hashed password authentication<BR><code>2</code>: Plain password authentication<BR><code>3</code>: Certificate authentication</td>
+</tr>
+<tr>
+<td><code>Username_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>User name</td>
+</tr>
+<tr>
+<td><code>HashedPassword_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>SHA-0 Hashed password. Valid only if ClientAuth_AuthType_u32 == SHA0_Hashed_Password (1). The SHA-0 hashed password must be caluclated by the SHA0(UpperCase(username_ascii_string) + password_ascii_string).</td>
+</tr>
+<tr>
+<td><code>PlainPassword_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Plaintext Password. Valid only if ClientAuth_AuthType_u32 == PlainPassword (2).</td>
+</tr>
+<tr>
+<td><code>ClientX_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Client certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3).</td>
+</tr>
+<tr>
+<td><code>ClientK_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Client private key of the certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3).</td>
+</tr>
+<tr>
+<td><code>policy:DHCPFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPNoServer_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPForce_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side.</td>
+</tr>
+<tr>
+<td><code>SecPol_CheckMac_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Prohibit the duplicate MAC address</td>
+</tr>
+<tr>
+<td><code>SecPol_CheckIP_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Prohibit a duplicate IP address (IPv4)</td>
+</tr>
+<tr>
+<td><code>policy:ArpDhcpOnly_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting.</td>
+</tr>
+<tr>
+<td><code>policy:PrivacyFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:NoServer_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4.</td>
+</tr>
+<tr>
+<td><code>policy:NoBroadcastLimiter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting.</td>
+</tr>
+<tr>
+<td><code>policy:MaxMac_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session.</td>
+</tr>
+<tr>
+<td><code>policy:MaxIP_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session.</td>
+</tr>
+<tr>
+<td><code>policy:MaxUpload_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>policy:MaxDownload_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>policy:RSandRAFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection.</td>
+</tr>
+<tr>
+<td><code>SecPol_RAFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter the router advertisement packet (IPv6)</td>
+</tr>
+<tr>
+<td><code>policy:DHCPv6Filter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPv6NoServer_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients.</td>
+</tr>
+<tr>
+<td><code>SecPol_CheckIPv6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Prohibit the duplicate IP address (IPv6)</td>
+</tr>
+<tr>
+<td><code>policy:NoServerV6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6.</td>
+</tr>
+<tr>
+<td><code>policy:MaxIPv6_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session.</td>
+</tr>
+<tr>
+<td><code>policy:FilterIPv4_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:FilterIPv6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:FilterNonIP_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. &quot;Non-IP packet&quot; mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets.</td>
+</tr>
+<tr>
+<td><code>policy:NoIPv6DefaultRouterInRA_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.</td>
+</tr>
+<tr>
+<td><code>policy:VLanId_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing.</td>
+</tr>
+<tr>
+<td><code>policy:Ver3_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Whether version 3.0 (must be true)</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="enumlink"></a></p>
+<h2 id="enumlink-rpc-api-get-list-of-cascade-connections">&quot;EnumLink&quot; RPC API - Get List of Cascade Connections</h2>
+<h3 id="description-38">Description</h3>
+<p>Get List of Cascade Connections. Use this to get a list of Cascade Connections that are registered on the currently managed Virtual Hub. By using a Cascade Connection, you can connect this Virtual Hub by Layer 2 Cascade Connection to another Virtual Hub that is operating on the same or a different computer. [Warning About Cascade Connections] By connecting using a Cascade Connection you can create a Layer 2 bridge between multiple Virtual Hubs but if the connection is incorrectly configured, a loopback Cascade Connection could inadvertently be created. When using a Cascade Connection function please design the network topology with care. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-38">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;EnumLink&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-38">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;NumLink_u32&quot;: 0,
+    &quot;LinkList&quot;: [
+      {
+        &quot;AccountName_utf&quot;: &quot;accountname&quot;,
+        &quot;Online_bool&quot;: false,
+        &quot;Connected_bool&quot;: false,
+        &quot;LastError_u32&quot;: 0,
+        &quot;ConnectedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;Hostname_str&quot;: &quot;hostname&quot;,
+        &quot;TargetHubName_str&quot;: &quot;targethubname&quot;
+      },
+      {
+        &quot;AccountName_utf&quot;: &quot;accountname&quot;,
+        &quot;Online_bool&quot;: false,
+        &quot;Connected_bool&quot;: false,
+        &quot;LastError_u32&quot;: 0,
+        &quot;ConnectedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;Hostname_str&quot;: &quot;hostname&quot;,
+        &quot;TargetHubName_str&quot;: &quot;targethubname&quot;
+      },
+      {
+        &quot;AccountName_utf&quot;: &quot;accountname&quot;,
+        &quot;Online_bool&quot;: false,
+        &quot;Connected_bool&quot;: false,
+        &quot;LastError_u32&quot;: 0,
+        &quot;ConnectedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;Hostname_str&quot;: &quot;hostname&quot;,
+        &quot;TargetHubName_str&quot;: &quot;targethubname&quot;
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-38">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>NumLink_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of cascade connections</td>
+</tr>
+<tr>
+<td><code>LinkList</code></td>
+<td><code>Array object</code></td>
+<td>The list of cascade connections</td>
+</tr>
+<tr>
+<td><code>AccountName_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>The name of cascade connection</td>
+</tr>
+<tr>
+<td><code>Online_bool</code></td>
+<td><code>boolean</code></td>
+<td>Online flag</td>
+</tr>
+<tr>
+<td><code>Connected_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag indicates whether the cascade connection is established</td>
+</tr>
+<tr>
+<td><code>LastError_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>The error last occurred if the cascade connection is in the fail state</td>
+</tr>
+<tr>
+<td><code>ConnectedTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Connection completion time</td>
+</tr>
+<tr>
+<td><code>Hostname_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Host name of the destination VPN server</td>
+</tr>
+<tr>
+<td><code>TargetHubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="setlinkonline"></a></p>
+<h2 id="setlinkonline-rpc-api-switch-cascade-connection-to-online-status">&quot;SetLinkOnline&quot; RPC API - Switch Cascade Connection to Online Status</h2>
+<h3 id="description-39">Description</h3>
+<p>Switch Cascade Connection to Online Status. When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to switch that Cascade Connection to online status. The Cascade Connection that is switched to online status begins the process of connecting to the destination VPN Server in accordance with the Connection Setting. The Cascade Connection that is switched to online status will establish normal connection to the VPN Server or continue to attempt connection until it is switched to offline status. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-39">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetLinkOnline&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;AccountName_utf&quot;: &quot;accountname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-39">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;AccountName_utf&quot;: &quot;accountname&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-39">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>AccountName_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>The name of the cascade connection</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="setlinkoffline"></a></p>
+<h2 id="setlinkoffline-rpc-api-switch-cascade-connection-to-offline-status">&quot;SetLinkOffline&quot; RPC API - Switch Cascade Connection to Offline Status</h2>
+<h3 id="description-40">Description</h3>
+<p>Switch Cascade Connection to Offline Status. When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to switch that Cascade Connection to offline status. The Cascade Connection that is switched to offline will not connect to the VPN Server until next time it is switched to the online status using the SetLinkOnline API You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-40">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetLinkOffline&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;AccountName_utf&quot;: &quot;accountname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-40">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;AccountName_utf&quot;: &quot;accountname&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-40">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>AccountName_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>The name of the cascade connection</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="deletelink"></a></p>
+<h2 id="deletelink-rpc-api-delete-cascade-connection-setting">&quot;DeleteLink&quot; RPC API - Delete Cascade Connection Setting</h2>
+<h3 id="description-41">Description</h3>
+<p>Delete Cascade Connection Setting. Use this to delete a Cascade Connection that is registered on the currently managed Virtual Hub. If the specified Cascade Connection has a status of online, the connections will be automatically disconnected and then the Cascade Connection will be deleted. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-41">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;DeleteLink&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;AccountName_utf&quot;: &quot;accountname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-41">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;AccountName_utf&quot;: &quot;accountname&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-41">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>AccountName_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>The name of the cascade connection</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="renamelink"></a></p>
+<h2 id="renamelink-rpc-api-change-name-of-cascade-connection">&quot;RenameLink&quot; RPC API - Change Name of Cascade Connection</h2>
+<h3 id="description-42">Description</h3>
+<p>Change Name of Cascade Connection. When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to change the name of that Cascade Connection. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-42">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;RenameLink&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;OldAccountName_utf&quot;: &quot;oldaccountname&quot;,
+    &quot;NewAccountName_utf&quot;: &quot;newaccountname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-42">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;OldAccountName_utf&quot;: &quot;oldaccountname&quot;,
+    &quot;NewAccountName_utf&quot;: &quot;newaccountname&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-42">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>OldAccountName_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>The old name of the cascade connection</td>
+</tr>
+<tr>
+<td><code>NewAccountName_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>The new name of the cascade connection</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getlinkstatus"></a></p>
+<h2 id="getlinkstatus-rpc-api-get-current-cascade-connection-status">&quot;GetLinkStatus&quot; RPC API - Get Current Cascade Connection Status</h2>
+<h3 id="description-43">Description</h3>
+<p>Get Current Cascade Connection Status. When a Cascade Connection registered on the currently managed Virtual Hub is specified and that Cascade Connection is currently online, use this to get its connection status and other information. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-43">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetLinkStatus&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_Ex_str&quot;: &quot;hubname_ex&quot;,
+    &quot;AccountName_utf&quot;: &quot;accountname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-43">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_Ex_str&quot;: &quot;hubname_ex&quot;,
+    &quot;AccountName_utf&quot;: &quot;accountname&quot;,
+    &quot;Active_bool&quot;: false,
+    &quot;Connected_bool&quot;: false,
+    &quot;SessionStatus_u32&quot;: 0,
+    &quot;ServerName_str&quot;: &quot;servername&quot;,
+    &quot;ServerPort_u32&quot;: 0,
+    &quot;ServerProductName_str&quot;: &quot;serverproductname&quot;,
+    &quot;ServerProductVer_u32&quot;: 0,
+    &quot;ServerProductBuild_u32&quot;: 0,
+    &quot;ServerX_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;ClientX_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;StartTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;FirstConnectionEstablisiedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;CurrentConnectionEstablishTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;NumConnectionsEatablished_u32&quot;: 0,
+    &quot;HalfConnection_bool&quot;: false,
+    &quot;QoS_bool&quot;: false,
+    &quot;MaxTcpConnections_u32&quot;: 0,
+    &quot;NumTcpConnections_u32&quot;: 0,
+    &quot;NumTcpConnectionsUpload_u32&quot;: 0,
+    &quot;NumTcpConnectionsDownload_u32&quot;: 0,
+    &quot;UseEncrypt_bool&quot;: false,
+    &quot;CipherName_str&quot;: &quot;ciphername&quot;,
+    &quot;UseCompress_bool&quot;: false,
+    &quot;IsRUDPSession_bool&quot;: false,
+    &quot;UnderlayProtocol_str&quot;: &quot;underlayprotocol&quot;,
+    &quot;IsUdpAccelerationEnabled_bool&quot;: false,
+    &quot;IsUsingUdpAcceleration_bool&quot;: false,
+    &quot;SessionName_str&quot;: &quot;sessionname&quot;,
+    &quot;ConnectionName_str&quot;: &quot;connectionname&quot;,
+    &quot;SessionKey_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;TotalSendSize_u64&quot;: 0,
+    &quot;TotalRecvSize_u64&quot;: 0,
+    &quot;TotalSendSizeReal_u64&quot;: 0,
+    &quot;TotalRecvSizeReal_u64&quot;: 0,
+    &quot;IsBridgeMode_bool&quot;: false,
+    &quot;IsMonitorMode_bool&quot;: false,
+    &quot;VLanId_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="parameters-43">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_Ex_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>AccountName_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>The name of the cascade connection</td>
+</tr>
+<tr>
+<td><code>Active_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag whether the cascade connection is enabled</td>
+</tr>
+<tr>
+<td><code>Connected_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag whether the cascade connection is established</td>
+</tr>
+<tr>
+<td><code>SessionStatus_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>The session status<BR>Values:<BR><code>0</code>: Connecting<BR><code>1</code>: Negotiating<BR><code>2</code>: During user authentication<BR><code>3</code>: Connection complete<BR><code>4</code>: Wait to retry<BR><code>5</code>: Idle state</td>
+</tr>
+<tr>
+<td><code>ServerName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The destination VPN server name</td>
+</tr>
+<tr>
+<td><code>ServerPort_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>The port number of the server</td>
+</tr>
+<tr>
+<td><code>ServerProductName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Server product name</td>
+</tr>
+<tr>
+<td><code>ServerProductVer_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Server product version</td>
+</tr>
+<tr>
+<td><code>ServerProductBuild_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Server product build number</td>
+</tr>
+<tr>
+<td><code>ServerX_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Server's X.509 certificate</td>
+</tr>
+<tr>
+<td><code>ClientX_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Client certificate</td>
+</tr>
+<tr>
+<td><code>StartTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Connection start time</td>
+</tr>
+<tr>
+<td><code>FirstConnectionEstablisiedTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Connection completion time of the first connection</td>
+</tr>
+<tr>
+<td><code>CurrentConnectionEstablishTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Connection completion time of this connection</td>
+</tr>
+<tr>
+<td><code>NumConnectionsEatablished_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of connections have been established so far</td>
+</tr>
+<tr>
+<td><code>HalfConnection_bool</code></td>
+<td><code>boolean</code></td>
+<td>Half-connection</td>
+</tr>
+<tr>
+<td><code>QoS_bool</code></td>
+<td><code>boolean</code></td>
+<td>VoIP / QoS</td>
+</tr>
+<tr>
+<td><code>MaxTcpConnections_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Maximum number of the underlying TCP connections</td>
+</tr>
+<tr>
+<td><code>NumTcpConnections_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of current underlying TCP connections</td>
+</tr>
+<tr>
+<td><code>NumTcpConnectionsUpload_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of underlying inbound TCP connections</td>
+</tr>
+<tr>
+<td><code>NumTcpConnectionsDownload_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of underlying outbound TCP connections</td>
+</tr>
+<tr>
+<td><code>UseEncrypt_bool</code></td>
+<td><code>boolean</code></td>
+<td>Use of encryption</td>
+</tr>
+<tr>
+<td><code>CipherName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Cipher algorithm name</td>
+</tr>
+<tr>
+<td><code>UseCompress_bool</code></td>
+<td><code>boolean</code></td>
+<td>Use of compression</td>
+</tr>
+<tr>
+<td><code>IsRUDPSession_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag whether this is a R-UDP session</td>
+</tr>
+<tr>
+<td><code>UnderlayProtocol_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Underlying physical communication protocol</td>
+</tr>
+<tr>
+<td><code>IsUdpAccelerationEnabled_bool</code></td>
+<td><code>boolean</code></td>
+<td>The UDP acceleration is enabled</td>
+</tr>
+<tr>
+<td><code>IsUsingUdpAcceleration_bool</code></td>
+<td><code>boolean</code></td>
+<td>The UDP acceleration is being actually used</td>
+</tr>
+<tr>
+<td><code>SessionName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Session name</td>
+</tr>
+<tr>
+<td><code>ConnectionName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Connection name</td>
+</tr>
+<tr>
+<td><code>SessionKey_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Session key</td>
+</tr>
+<tr>
+<td><code>TotalSendSize_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Total transmitted data size</td>
+</tr>
+<tr>
+<td><code>TotalRecvSize_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Total received data size</td>
+</tr>
+<tr>
+<td><code>TotalSendSizeReal_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Total transmitted data size (no compression)</td>
+</tr>
+<tr>
+<td><code>TotalRecvSizeReal_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Total received data size (no compression)</td>
+</tr>
+<tr>
+<td><code>IsBridgeMode_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag whether the VPN session is Bridge Mode</td>
+</tr>
+<tr>
+<td><code>IsMonitorMode_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag whether the VPN session is Monitor mode</td>
+</tr>
+<tr>
+<td><code>VLanId_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>VLAN ID</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="addaccess"></a></p>
+<h2 id="addaccess-rpc-api-add-access-list-rule">&quot;AddAccess&quot; RPC API - Add Access List Rule</h2>
+<h3 id="description-44">Description</h3>
+<p>Add Access List Rule. Use this to add a new rule to the access list of the currently managed Virtual Hub. The access list is a set of packet file rules that are applied to packets that flow through the Virtual Hub. You can register multiple rules in an access list and you can also define an priority for each rule. All packets are checked for the conditions specified by the rules registered in the access list and based on the operation that is stipulated by the first matching rule, they either pass or are discarded. Packets that do not match any rule are implicitly allowed to pass. You can also use the access list to generate delays, jitters and packet losses. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.</p>
+<h3 id="input-json-rpc-format-44">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;AddAccess&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;AccessListSingle&quot;: [
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;Note_utf&quot;: &quot;note&quot;,
+        &quot;Active_bool&quot;: false,
+        &quot;Priority_u32&quot;: 0,
+        &quot;Discard_bool&quot;: false,
+        &quot;IsIPv6_bool&quot;: false,
+        &quot;SrcIpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SrcSubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+        &quot;DestIpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;DestSubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+        &quot;SrcIpAddress6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;SrcSubnetMask6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DestIpAddress6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DestSubnetMask6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;Protocol_u32&quot;: 0,
+        &quot;SrcPortStart_u32&quot;: 0,
+        &quot;SrcPortEnd_u32&quot;: 0,
+        &quot;DestPortStart_u32&quot;: 0,
+        &quot;DestPortEnd_u32&quot;: 0,
+        &quot;SrcUsername_str&quot;: &quot;srcusername&quot;,
+        &quot;DestUsername_str&quot;: &quot;destusername&quot;,
+        &quot;CheckSrcMac_bool&quot;: false,
+        &quot;SrcMacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;SrcMacMask_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CheckDstMac_bool&quot;: false,
+        &quot;DstMacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DstMacMask_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CheckTcpState_bool&quot;: false,
+        &quot;Established_bool&quot;: false,
+        &quot;Delay_u32&quot;: 0,
+        &quot;Jitter_u32&quot;: 0,
+        &quot;Loss_u32&quot;: 0,
+        &quot;RedirectUrl_str&quot;: &quot;redirecturl&quot;
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-44">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;AccessListSingle&quot;: [
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;Note_utf&quot;: &quot;note&quot;,
+        &quot;Active_bool&quot;: false,
+        &quot;Priority_u32&quot;: 0,
+        &quot;Discard_bool&quot;: false,
+        &quot;IsIPv6_bool&quot;: false,
+        &quot;SrcIpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SrcSubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+        &quot;DestIpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;DestSubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+        &quot;SrcIpAddress6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;SrcSubnetMask6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DestIpAddress6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DestSubnetMask6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;Protocol_u32&quot;: 0,
+        &quot;SrcPortStart_u32&quot;: 0,
+        &quot;SrcPortEnd_u32&quot;: 0,
+        &quot;DestPortStart_u32&quot;: 0,
+        &quot;DestPortEnd_u32&quot;: 0,
+        &quot;SrcUsername_str&quot;: &quot;srcusername&quot;,
+        &quot;DestUsername_str&quot;: &quot;destusername&quot;,
+        &quot;CheckSrcMac_bool&quot;: false,
+        &quot;SrcMacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;SrcMacMask_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CheckDstMac_bool&quot;: false,
+        &quot;DstMacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DstMacMask_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CheckTcpState_bool&quot;: false,
+        &quot;Established_bool&quot;: false,
+        &quot;Delay_u32&quot;: 0,
+        &quot;Jitter_u32&quot;: 0,
+        &quot;Loss_u32&quot;: 0,
+        &quot;RedirectUrl_str&quot;: &quot;redirecturl&quot;
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-44">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>AccessListSingle</code></td>
+<td><code>Array object</code></td>
+<td>Access list (Must be a single item)</td>
+</tr>
+<tr>
+<td><code>Id_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>ID</td>
+</tr>
+<tr>
+<td><code>Note_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Specify a description (note) for this rule</td>
+</tr>
+<tr>
+<td><code>Active_bool</code></td>
+<td><code>boolean</code></td>
+<td>Enabled flag (true: enabled, false: disabled)</td>
+</tr>
+<tr>
+<td><code>Priority_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Specify an integer of 1 or higher to indicate the priority of the rule. Higher priority is given to rules with the lower priority values.</td>
+</tr>
+<tr>
+<td><code>Discard_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag if the rule is DISCARD operation or PASS operation. When a packet matches this rule condition, this operation is decided. When the operation of the rule is PASS, the packet is allowed to pass, otherwise the packet will be discarded.</td>
+</tr>
+<tr>
+<td><code>IsIPv6_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag if the rule is for IPv6. Specify false for IPv4, or specify true for IPv6.</td>
+</tr>
+<tr>
+<td><code>SrcIpAddress_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 address as a rule condition. You must also specify the SrcSubnetMask_ip field.</td>
+</tr>
+<tr>
+<td><code>SrcSubnetMask_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 subnet mask as a rule condition. &quot;0.0.0.0&quot; means all hosts. &quot;255.255.255.255&quot; means one single host.</td>
+</tr>
+<tr>
+<td><code>DestIpAddress_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 address as a rule condition. You must also specify the DestSubnetMask_ip field.</td>
+</tr>
+<tr>
+<td><code>DestSubnetMask_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 subnet mask as a rule condition. &quot;0.0.0.0&quot; means all hosts. &quot;255.255.255.255&quot; means one single host.</td>
+</tr>
+<tr>
+<td><code>SrcIpAddress6_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the SrcSubnetMask6_bin field.</td>
+</tr>
+<tr>
+<td><code>SrcSubnetMask6_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form.</td>
+</tr>
+<tr>
+<td><code>DestIpAddress6_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the DestSubnetMask6_bin field.</td>
+</tr>
+<tr>
+<td><code>DestSubnetMask6_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form.</td>
+</tr>
+<tr>
+<td><code>Protocol_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>The IP protocol number<BR>Values:<BR><code>1</code>: ICMP for IPv4<BR><code>6</code>: TCP<BR><code>17</code>: UDP<BR><code>58</code>: ICMP for IPv6</td>
+</tr>
+<tr>
+<td><code>SrcPortStart_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>The Start Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.</td>
+</tr>
+<tr>
+<td><code>SrcPortEnd_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>The End Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.</td>
+</tr>
+<tr>
+<td><code>DestPortStart_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>The Start Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.</td>
+</tr>
+<tr>
+<td><code>DestPortEnd_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>The End Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.</td>
+</tr>
+<tr>
+<td><code>SrcUsername_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Source user name. You can apply this rule to only the packets sent by a user session of a user name that has been specified as a rule condition. In this case, specify the user name.</td>
+</tr>
+<tr>
+<td><code>DestUsername_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Destination user name. You can apply this rule to only the packets received by a user session of a user name that has been specified as a rule condition. In this case, specify the user name.</td>
+</tr>
+<tr>
+<td><code>CheckSrcMac_bool</code></td>
+<td><code>boolean</code></td>
+<td>Specify true if you want to check the source MAC address.</td>
+</tr>
+<tr>
+<td><code>SrcMacAddress_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Source MAC address (6 bytes), valid only if CheckSrcMac_bool == true.</td>
+</tr>
+<tr>
+<td><code>SrcMacMask_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Source MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true.</td>
+</tr>
+<tr>
+<td><code>CheckDstMac_bool</code></td>
+<td><code>boolean</code></td>
+<td>Specify true if you want to check the destination MAC address.</td>
+</tr>
+<tr>
+<td><code>DstMacAddress_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Destination MAC address (6 bytes), valid only if CheckSrcMac_bool == true.</td>
+</tr>
+<tr>
+<td><code>DstMacMask_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Destination MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true.</td>
+</tr>
+<tr>
+<td><code>CheckTcpState_bool</code></td>
+<td><code>boolean</code></td>
+<td>Specify true if you want to check the state of the TCP connection.</td>
+</tr>
+<tr>
+<td><code>Established_bool</code></td>
+<td><code>boolean</code></td>
+<td>Valid only if CheckTcpState_bool == true. Set this field true to match only TCP-established packets. Set this field false to match only TCP-non established packets.</td>
+</tr>
+<tr>
+<td><code>Delay_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Set this value to generate delays when packets is passing. Specify the delay period in milliseconds. Specify 0 means no delays to generate. The delays must be 10000 milliseconds at most.</td>
+</tr>
+<tr>
+<td><code>Jitter_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Set this value to generate jitters when packets is passing. Specify the ratio of fluctuation of jitters within 0% to 100% range. Specify 0 means no jitters to generate.</td>
+</tr>
+<tr>
+<td><code>Loss_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Set this value to generate packet losses when packets is passing. Specify the ratio of packet losses within 0% to 100% range. Specify 0 means no packet losses to generate.</td>
+</tr>
+<tr>
+<td><code>RedirectUrl_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The specified URL will be mandatory replied to the client as a response for TCP connecting request packets which matches the conditions of this access list entry via this Virtual Hub. To use this setting, you can enforce the web browser of the VPN Client computer to show the specified web site when that web browser tries to access the specific IP address.</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="deleteaccess"></a></p>
+<h2 id="deleteaccess-rpc-api-delete-rule-from-access-list">&quot;DeleteAccess&quot; RPC API - Delete Rule from Access List</h2>
+<h3 id="description-45">Description</h3>
+<p>Delete Rule from Access List. Use this to specify a packet filter rule registered on the access list of the currently managed Virtual Hub and delete it. To delete a rule, you must specify that rule's ID. You can display the ID by using the EnumAccess API. If you wish not to delete the rule but to only temporarily disable it, use the SetAccessList API to set the rule status to disable. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.</p>
+<h3 id="input-json-rpc-format-45">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;DeleteAccess&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Id_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-45">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Id_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="parameters-45">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Id_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>ID</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="enumaccess"></a></p>
+<h2 id="enumaccess-rpc-api-get-access-list-rule-list">&quot;EnumAccess&quot; RPC API - Get Access List Rule List</h2>
+<h3 id="description-46">Description</h3>
+<p>Get Access List Rule List. Use this to get a list of packet filter rules that are registered on access list of the currently managed Virtual Hub. The access list is a set of packet file rules that are applied to packets that flow through the Virtual Hub. You can register multiple rules in an access list and you can also define a priority for each rule. All packets are checked for the conditions specified by the rules registered in the access list and based on the operation that is stipulated by the first matching rule, they either pass or are discarded. Packets that do not match any rule are implicitly allowed to pass. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.</p>
+<h3 id="input-json-rpc-format-46">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;EnumAccess&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-46">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;AccessList&quot;: [
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;Note_utf&quot;: &quot;note&quot;,
+        &quot;Active_bool&quot;: false,
+        &quot;Priority_u32&quot;: 0,
+        &quot;Discard_bool&quot;: false,
+        &quot;IsIPv6_bool&quot;: false,
+        &quot;SrcIpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SrcSubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+        &quot;DestIpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;DestSubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+        &quot;SrcIpAddress6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;SrcSubnetMask6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DestIpAddress6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DestSubnetMask6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;Protocol_u32&quot;: 0,
+        &quot;SrcPortStart_u32&quot;: 0,
+        &quot;SrcPortEnd_u32&quot;: 0,
+        &quot;DestPortStart_u32&quot;: 0,
+        &quot;DestPortEnd_u32&quot;: 0,
+        &quot;SrcUsername_str&quot;: &quot;srcusername&quot;,
+        &quot;DestUsername_str&quot;: &quot;destusername&quot;,
+        &quot;CheckSrcMac_bool&quot;: false,
+        &quot;SrcMacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;SrcMacMask_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CheckDstMac_bool&quot;: false,
+        &quot;DstMacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DstMacMask_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CheckTcpState_bool&quot;: false,
+        &quot;Established_bool&quot;: false,
+        &quot;Delay_u32&quot;: 0,
+        &quot;Jitter_u32&quot;: 0,
+        &quot;Loss_u32&quot;: 0,
+        &quot;RedirectUrl_str&quot;: &quot;redirecturl&quot;
+      },
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;Note_utf&quot;: &quot;note&quot;,
+        &quot;Active_bool&quot;: false,
+        &quot;Priority_u32&quot;: 0,
+        &quot;Discard_bool&quot;: false,
+        &quot;IsIPv6_bool&quot;: false,
+        &quot;SrcIpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SrcSubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+        &quot;DestIpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;DestSubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+        &quot;SrcIpAddress6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;SrcSubnetMask6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DestIpAddress6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DestSubnetMask6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;Protocol_u32&quot;: 0,
+        &quot;SrcPortStart_u32&quot;: 0,
+        &quot;SrcPortEnd_u32&quot;: 0,
+        &quot;DestPortStart_u32&quot;: 0,
+        &quot;DestPortEnd_u32&quot;: 0,
+        &quot;SrcUsername_str&quot;: &quot;srcusername&quot;,
+        &quot;DestUsername_str&quot;: &quot;destusername&quot;,
+        &quot;CheckSrcMac_bool&quot;: false,
+        &quot;SrcMacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;SrcMacMask_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CheckDstMac_bool&quot;: false,
+        &quot;DstMacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DstMacMask_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CheckTcpState_bool&quot;: false,
+        &quot;Established_bool&quot;: false,
+        &quot;Delay_u32&quot;: 0,
+        &quot;Jitter_u32&quot;: 0,
+        &quot;Loss_u32&quot;: 0,
+        &quot;RedirectUrl_str&quot;: &quot;redirecturl&quot;
+      },
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;Note_utf&quot;: &quot;note&quot;,
+        &quot;Active_bool&quot;: false,
+        &quot;Priority_u32&quot;: 0,
+        &quot;Discard_bool&quot;: false,
+        &quot;IsIPv6_bool&quot;: false,
+        &quot;SrcIpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SrcSubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+        &quot;DestIpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;DestSubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+        &quot;SrcIpAddress6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;SrcSubnetMask6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DestIpAddress6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DestSubnetMask6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;Protocol_u32&quot;: 0,
+        &quot;SrcPortStart_u32&quot;: 0,
+        &quot;SrcPortEnd_u32&quot;: 0,
+        &quot;DestPortStart_u32&quot;: 0,
+        &quot;DestPortEnd_u32&quot;: 0,
+        &quot;SrcUsername_str&quot;: &quot;srcusername&quot;,
+        &quot;DestUsername_str&quot;: &quot;destusername&quot;,
+        &quot;CheckSrcMac_bool&quot;: false,
+        &quot;SrcMacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;SrcMacMask_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CheckDstMac_bool&quot;: false,
+        &quot;DstMacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DstMacMask_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CheckTcpState_bool&quot;: false,
+        &quot;Established_bool&quot;: false,
+        &quot;Delay_u32&quot;: 0,
+        &quot;Jitter_u32&quot;: 0,
+        &quot;Loss_u32&quot;: 0,
+        &quot;RedirectUrl_str&quot;: &quot;redirecturl&quot;
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-46">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>AccessList</code></td>
+<td><code>Array object</code></td>
+<td>Access list</td>
+</tr>
+<tr>
+<td><code>Id_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>ID</td>
+</tr>
+<tr>
+<td><code>Note_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Specify a description (note) for this rule</td>
+</tr>
+<tr>
+<td><code>Active_bool</code></td>
+<td><code>boolean</code></td>
+<td>Enabled flag (true: enabled, false: disabled)</td>
+</tr>
+<tr>
+<td><code>Priority_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Specify an integer of 1 or higher to indicate the priority of the rule. Higher priority is given to rules with the lower priority values.</td>
+</tr>
+<tr>
+<td><code>Discard_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag if the rule is DISCARD operation or PASS operation. When a packet matches this rule condition, this operation is decided. When the operation of the rule is PASS, the packet is allowed to pass, otherwise the packet will be discarded.</td>
+</tr>
+<tr>
+<td><code>IsIPv6_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag if the rule is for IPv6. Specify false for IPv4, or specify true for IPv6.</td>
+</tr>
+<tr>
+<td><code>SrcIpAddress_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 address as a rule condition. You must also specify the SrcSubnetMask_ip field.</td>
+</tr>
+<tr>
+<td><code>SrcSubnetMask_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 subnet mask as a rule condition. &quot;0.0.0.0&quot; means all hosts. &quot;255.255.255.255&quot; means one single host.</td>
+</tr>
+<tr>
+<td><code>DestIpAddress_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 address as a rule condition. You must also specify the DestSubnetMask_ip field.</td>
+</tr>
+<tr>
+<td><code>DestSubnetMask_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 subnet mask as a rule condition. &quot;0.0.0.0&quot; means all hosts. &quot;255.255.255.255&quot; means one single host.</td>
+</tr>
+<tr>
+<td><code>SrcIpAddress6_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the SrcSubnetMask6_bin field.</td>
+</tr>
+<tr>
+<td><code>SrcSubnetMask6_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form.</td>
+</tr>
+<tr>
+<td><code>DestIpAddress6_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the DestSubnetMask6_bin field.</td>
+</tr>
+<tr>
+<td><code>DestSubnetMask6_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form.</td>
+</tr>
+<tr>
+<td><code>Protocol_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>The IP protocol number<BR>Values:<BR><code>1</code>: ICMP for IPv4<BR><code>6</code>: TCP<BR><code>17</code>: UDP<BR><code>58</code>: ICMP for IPv6</td>
+</tr>
+<tr>
+<td><code>SrcPortStart_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>The Start Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.</td>
+</tr>
+<tr>
+<td><code>SrcPortEnd_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>The End Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.</td>
+</tr>
+<tr>
+<td><code>DestPortStart_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>The Start Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.</td>
+</tr>
+<tr>
+<td><code>DestPortEnd_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>The End Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.</td>
+</tr>
+<tr>
+<td><code>SrcUsername_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Source user name. You can apply this rule to only the packets sent by a user session of a user name that has been specified as a rule condition. In this case, specify the user name.</td>
+</tr>
+<tr>
+<td><code>DestUsername_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Destination user name. You can apply this rule to only the packets received by a user session of a user name that has been specified as a rule condition. In this case, specify the user name.</td>
+</tr>
+<tr>
+<td><code>CheckSrcMac_bool</code></td>
+<td><code>boolean</code></td>
+<td>Specify true if you want to check the source MAC address.</td>
+</tr>
+<tr>
+<td><code>SrcMacAddress_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Source MAC address (6 bytes), valid only if CheckSrcMac_bool == true.</td>
+</tr>
+<tr>
+<td><code>SrcMacMask_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Source MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true.</td>
+</tr>
+<tr>
+<td><code>CheckDstMac_bool</code></td>
+<td><code>boolean</code></td>
+<td>Specify true if you want to check the destination MAC address.</td>
+</tr>
+<tr>
+<td><code>DstMacAddress_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Destination MAC address (6 bytes), valid only if CheckSrcMac_bool == true.</td>
+</tr>
+<tr>
+<td><code>DstMacMask_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Destination MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true.</td>
+</tr>
+<tr>
+<td><code>CheckTcpState_bool</code></td>
+<td><code>boolean</code></td>
+<td>Specify true if you want to check the state of the TCP connection.</td>
+</tr>
+<tr>
+<td><code>Established_bool</code></td>
+<td><code>boolean</code></td>
+<td>Valid only if CheckTcpState_bool == true. Set this field true to match only TCP-established packets. Set this field false to match only TCP-non established packets.</td>
+</tr>
+<tr>
+<td><code>Delay_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Set this value to generate delays when packets is passing. Specify the delay period in milliseconds. Specify 0 means no delays to generate. The delays must be 10000 milliseconds at most.</td>
+</tr>
+<tr>
+<td><code>Jitter_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Set this value to generate jitters when packets is passing. Specify the ratio of fluctuation of jitters within 0% to 100% range. Specify 0 means no jitters to generate.</td>
+</tr>
+<tr>
+<td><code>Loss_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Set this value to generate packet losses when packets is passing. Specify the ratio of packet losses within 0% to 100% range. Specify 0 means no packet losses to generate.</td>
+</tr>
+<tr>
+<td><code>RedirectUrl_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The specified URL will be mandatory replied to the client as a response for TCP connecting request packets which matches the conditions of this access list entry via this Virtual Hub. To use this setting, you can enforce the web browser of the VPN Client computer to show the specified web site when that web browser tries to access the specific IP address.</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="setaccesslist"></a></p>
+<h2 id="setaccesslist-rpc-api-replace-all-access-lists-on-a-single-bulk-api-call">&quot;SetAccessList&quot; RPC API - Replace all access lists on a single bulk API call</h2>
+<h3 id="description-47">Description</h3>
+<p>Replace all access lists on a single bulk API call. This API removes all existing access list rules on the Virtual Hub, and replace them by new access list rules specified by the parameter.</p>
+<h3 id="input-json-rpc-format-47">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetAccessList&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;AccessList&quot;: [
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;Note_utf&quot;: &quot;note&quot;,
+        &quot;Active_bool&quot;: false,
+        &quot;Priority_u32&quot;: 0,
+        &quot;Discard_bool&quot;: false,
+        &quot;IsIPv6_bool&quot;: false,
+        &quot;SrcIpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SrcSubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+        &quot;DestIpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;DestSubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+        &quot;SrcIpAddress6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;SrcSubnetMask6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DestIpAddress6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DestSubnetMask6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;Protocol_u32&quot;: 0,
+        &quot;SrcPortStart_u32&quot;: 0,
+        &quot;SrcPortEnd_u32&quot;: 0,
+        &quot;DestPortStart_u32&quot;: 0,
+        &quot;DestPortEnd_u32&quot;: 0,
+        &quot;SrcUsername_str&quot;: &quot;srcusername&quot;,
+        &quot;DestUsername_str&quot;: &quot;destusername&quot;,
+        &quot;CheckSrcMac_bool&quot;: false,
+        &quot;SrcMacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;SrcMacMask_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CheckDstMac_bool&quot;: false,
+        &quot;DstMacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DstMacMask_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CheckTcpState_bool&quot;: false,
+        &quot;Established_bool&quot;: false,
+        &quot;Delay_u32&quot;: 0,
+        &quot;Jitter_u32&quot;: 0,
+        &quot;Loss_u32&quot;: 0,
+        &quot;RedirectUrl_str&quot;: &quot;redirecturl&quot;
+      },
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;Note_utf&quot;: &quot;note&quot;,
+        &quot;Active_bool&quot;: false,
+        &quot;Priority_u32&quot;: 0,
+        &quot;Discard_bool&quot;: false,
+        &quot;IsIPv6_bool&quot;: false,
+        &quot;SrcIpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SrcSubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+        &quot;DestIpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;DestSubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+        &quot;SrcIpAddress6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;SrcSubnetMask6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DestIpAddress6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DestSubnetMask6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;Protocol_u32&quot;: 0,
+        &quot;SrcPortStart_u32&quot;: 0,
+        &quot;SrcPortEnd_u32&quot;: 0,
+        &quot;DestPortStart_u32&quot;: 0,
+        &quot;DestPortEnd_u32&quot;: 0,
+        &quot;SrcUsername_str&quot;: &quot;srcusername&quot;,
+        &quot;DestUsername_str&quot;: &quot;destusername&quot;,
+        &quot;CheckSrcMac_bool&quot;: false,
+        &quot;SrcMacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;SrcMacMask_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CheckDstMac_bool&quot;: false,
+        &quot;DstMacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DstMacMask_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CheckTcpState_bool&quot;: false,
+        &quot;Established_bool&quot;: false,
+        &quot;Delay_u32&quot;: 0,
+        &quot;Jitter_u32&quot;: 0,
+        &quot;Loss_u32&quot;: 0,
+        &quot;RedirectUrl_str&quot;: &quot;redirecturl&quot;
+      },
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;Note_utf&quot;: &quot;note&quot;,
+        &quot;Active_bool&quot;: false,
+        &quot;Priority_u32&quot;: 0,
+        &quot;Discard_bool&quot;: false,
+        &quot;IsIPv6_bool&quot;: false,
+        &quot;SrcIpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SrcSubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+        &quot;DestIpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;DestSubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+        &quot;SrcIpAddress6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;SrcSubnetMask6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DestIpAddress6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DestSubnetMask6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;Protocol_u32&quot;: 0,
+        &quot;SrcPortStart_u32&quot;: 0,
+        &quot;SrcPortEnd_u32&quot;: 0,
+        &quot;DestPortStart_u32&quot;: 0,
+        &quot;DestPortEnd_u32&quot;: 0,
+        &quot;SrcUsername_str&quot;: &quot;srcusername&quot;,
+        &quot;DestUsername_str&quot;: &quot;destusername&quot;,
+        &quot;CheckSrcMac_bool&quot;: false,
+        &quot;SrcMacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;SrcMacMask_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CheckDstMac_bool&quot;: false,
+        &quot;DstMacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DstMacMask_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CheckTcpState_bool&quot;: false,
+        &quot;Established_bool&quot;: false,
+        &quot;Delay_u32&quot;: 0,
+        &quot;Jitter_u32&quot;: 0,
+        &quot;Loss_u32&quot;: 0,
+        &quot;RedirectUrl_str&quot;: &quot;redirecturl&quot;
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-47">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;AccessList&quot;: [
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;Note_utf&quot;: &quot;note&quot;,
+        &quot;Active_bool&quot;: false,
+        &quot;Priority_u32&quot;: 0,
+        &quot;Discard_bool&quot;: false,
+        &quot;IsIPv6_bool&quot;: false,
+        &quot;SrcIpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SrcSubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+        &quot;DestIpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;DestSubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+        &quot;SrcIpAddress6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;SrcSubnetMask6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DestIpAddress6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DestSubnetMask6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;Protocol_u32&quot;: 0,
+        &quot;SrcPortStart_u32&quot;: 0,
+        &quot;SrcPortEnd_u32&quot;: 0,
+        &quot;DestPortStart_u32&quot;: 0,
+        &quot;DestPortEnd_u32&quot;: 0,
+        &quot;SrcUsername_str&quot;: &quot;srcusername&quot;,
+        &quot;DestUsername_str&quot;: &quot;destusername&quot;,
+        &quot;CheckSrcMac_bool&quot;: false,
+        &quot;SrcMacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;SrcMacMask_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CheckDstMac_bool&quot;: false,
+        &quot;DstMacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DstMacMask_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CheckTcpState_bool&quot;: false,
+        &quot;Established_bool&quot;: false,
+        &quot;Delay_u32&quot;: 0,
+        &quot;Jitter_u32&quot;: 0,
+        &quot;Loss_u32&quot;: 0,
+        &quot;RedirectUrl_str&quot;: &quot;redirecturl&quot;
+      },
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;Note_utf&quot;: &quot;note&quot;,
+        &quot;Active_bool&quot;: false,
+        &quot;Priority_u32&quot;: 0,
+        &quot;Discard_bool&quot;: false,
+        &quot;IsIPv6_bool&quot;: false,
+        &quot;SrcIpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SrcSubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+        &quot;DestIpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;DestSubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+        &quot;SrcIpAddress6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;SrcSubnetMask6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DestIpAddress6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DestSubnetMask6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;Protocol_u32&quot;: 0,
+        &quot;SrcPortStart_u32&quot;: 0,
+        &quot;SrcPortEnd_u32&quot;: 0,
+        &quot;DestPortStart_u32&quot;: 0,
+        &quot;DestPortEnd_u32&quot;: 0,
+        &quot;SrcUsername_str&quot;: &quot;srcusername&quot;,
+        &quot;DestUsername_str&quot;: &quot;destusername&quot;,
+        &quot;CheckSrcMac_bool&quot;: false,
+        &quot;SrcMacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;SrcMacMask_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CheckDstMac_bool&quot;: false,
+        &quot;DstMacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DstMacMask_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CheckTcpState_bool&quot;: false,
+        &quot;Established_bool&quot;: false,
+        &quot;Delay_u32&quot;: 0,
+        &quot;Jitter_u32&quot;: 0,
+        &quot;Loss_u32&quot;: 0,
+        &quot;RedirectUrl_str&quot;: &quot;redirecturl&quot;
+      },
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;Note_utf&quot;: &quot;note&quot;,
+        &quot;Active_bool&quot;: false,
+        &quot;Priority_u32&quot;: 0,
+        &quot;Discard_bool&quot;: false,
+        &quot;IsIPv6_bool&quot;: false,
+        &quot;SrcIpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SrcSubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+        &quot;DestIpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;DestSubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+        &quot;SrcIpAddress6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;SrcSubnetMask6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DestIpAddress6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DestSubnetMask6_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;Protocol_u32&quot;: 0,
+        &quot;SrcPortStart_u32&quot;: 0,
+        &quot;SrcPortEnd_u32&quot;: 0,
+        &quot;DestPortStart_u32&quot;: 0,
+        &quot;DestPortEnd_u32&quot;: 0,
+        &quot;SrcUsername_str&quot;: &quot;srcusername&quot;,
+        &quot;DestUsername_str&quot;: &quot;destusername&quot;,
+        &quot;CheckSrcMac_bool&quot;: false,
+        &quot;SrcMacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;SrcMacMask_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CheckDstMac_bool&quot;: false,
+        &quot;DstMacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;DstMacMask_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CheckTcpState_bool&quot;: false,
+        &quot;Established_bool&quot;: false,
+        &quot;Delay_u32&quot;: 0,
+        &quot;Jitter_u32&quot;: 0,
+        &quot;Loss_u32&quot;: 0,
+        &quot;RedirectUrl_str&quot;: &quot;redirecturl&quot;
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-47">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>AccessList</code></td>
+<td><code>Array object</code></td>
+<td>Access list</td>
+</tr>
+<tr>
+<td><code>Id_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>ID</td>
+</tr>
+<tr>
+<td><code>Note_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Specify a description (note) for this rule</td>
+</tr>
+<tr>
+<td><code>Active_bool</code></td>
+<td><code>boolean</code></td>
+<td>Enabled flag (true: enabled, false: disabled)</td>
+</tr>
+<tr>
+<td><code>Priority_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Specify an integer of 1 or higher to indicate the priority of the rule. Higher priority is given to rules with the lower priority values.</td>
+</tr>
+<tr>
+<td><code>Discard_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag if the rule is DISCARD operation or PASS operation. When a packet matches this rule condition, this operation is decided. When the operation of the rule is PASS, the packet is allowed to pass, otherwise the packet will be discarded.</td>
+</tr>
+<tr>
+<td><code>IsIPv6_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag if the rule is for IPv6. Specify false for IPv4, or specify true for IPv6.</td>
+</tr>
+<tr>
+<td><code>SrcIpAddress_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 address as a rule condition. You must also specify the SrcSubnetMask_ip field.</td>
+</tr>
+<tr>
+<td><code>SrcSubnetMask_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 subnet mask as a rule condition. &quot;0.0.0.0&quot; means all hosts. &quot;255.255.255.255&quot; means one single host.</td>
+</tr>
+<tr>
+<td><code>DestIpAddress_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 address as a rule condition. You must also specify the DestSubnetMask_ip field.</td>
+</tr>
+<tr>
+<td><code>DestSubnetMask_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 subnet mask as a rule condition. &quot;0.0.0.0&quot; means all hosts. &quot;255.255.255.255&quot; means one single host.</td>
+</tr>
+<tr>
+<td><code>SrcIpAddress6_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the SrcSubnetMask6_bin field.</td>
+</tr>
+<tr>
+<td><code>SrcSubnetMask6_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form.</td>
+</tr>
+<tr>
+<td><code>DestIpAddress6_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the DestSubnetMask6_bin field.</td>
+</tr>
+<tr>
+<td><code>DestSubnetMask6_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form.</td>
+</tr>
+<tr>
+<td><code>Protocol_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>The IP protocol number<BR>Values:<BR><code>1</code>: ICMP for IPv4<BR><code>6</code>: TCP<BR><code>17</code>: UDP<BR><code>58</code>: ICMP for IPv6</td>
+</tr>
+<tr>
+<td><code>SrcPortStart_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>The Start Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.</td>
+</tr>
+<tr>
+<td><code>SrcPortEnd_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>The End Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.</td>
+</tr>
+<tr>
+<td><code>DestPortStart_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>The Start Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.</td>
+</tr>
+<tr>
+<td><code>DestPortEnd_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>The End Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.</td>
+</tr>
+<tr>
+<td><code>SrcUsername_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Source user name. You can apply this rule to only the packets sent by a user session of a user name that has been specified as a rule condition. In this case, specify the user name.</td>
+</tr>
+<tr>
+<td><code>DestUsername_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Destination user name. You can apply this rule to only the packets received by a user session of a user name that has been specified as a rule condition. In this case, specify the user name.</td>
+</tr>
+<tr>
+<td><code>CheckSrcMac_bool</code></td>
+<td><code>boolean</code></td>
+<td>Specify true if you want to check the source MAC address.</td>
+</tr>
+<tr>
+<td><code>SrcMacAddress_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Source MAC address (6 bytes), valid only if CheckSrcMac_bool == true.</td>
+</tr>
+<tr>
+<td><code>SrcMacMask_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Source MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true.</td>
+</tr>
+<tr>
+<td><code>CheckDstMac_bool</code></td>
+<td><code>boolean</code></td>
+<td>Specify true if you want to check the destination MAC address.</td>
+</tr>
+<tr>
+<td><code>DstMacAddress_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Destination MAC address (6 bytes), valid only if CheckSrcMac_bool == true.</td>
+</tr>
+<tr>
+<td><code>DstMacMask_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Destination MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true.</td>
+</tr>
+<tr>
+<td><code>CheckTcpState_bool</code></td>
+<td><code>boolean</code></td>
+<td>Specify true if you want to check the state of the TCP connection.</td>
+</tr>
+<tr>
+<td><code>Established_bool</code></td>
+<td><code>boolean</code></td>
+<td>Valid only if CheckTcpState_bool == true. Set this field true to match only TCP-established packets. Set this field false to match only TCP-non established packets.</td>
+</tr>
+<tr>
+<td><code>Delay_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Set this value to generate delays when packets is passing. Specify the delay period in milliseconds. Specify 0 means no delays to generate. The delays must be 10000 milliseconds at most.</td>
+</tr>
+<tr>
+<td><code>Jitter_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Set this value to generate jitters when packets is passing. Specify the ratio of fluctuation of jitters within 0% to 100% range. Specify 0 means no jitters to generate.</td>
+</tr>
+<tr>
+<td><code>Loss_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Set this value to generate packet losses when packets is passing. Specify the ratio of packet losses within 0% to 100% range. Specify 0 means no packet losses to generate.</td>
+</tr>
+<tr>
+<td><code>RedirectUrl_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The specified URL will be mandatory replied to the client as a response for TCP connecting request packets which matches the conditions of this access list entry via this Virtual Hub. To use this setting, you can enforce the web browser of the VPN Client computer to show the specified web site when that web browser tries to access the specific IP address.</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="createuser"></a></p>
+<h2 id="createuser-rpc-api-create-a-user">&quot;CreateUser&quot; RPC API - Create a user</h2>
+<h3 id="description-48">Description</h3>
+<p>Create a user. Use this to create a new user in the security account database of the currently managed Virtual Hub. By creating a user, the VPN Client can connect to the Virtual Hub by using the authentication information of that user. Note that a user whose user name has been created as &quot;<em>&quot; (a single asterisk character) will automatically be registered as a RADIUS authentication user. For cases where there are users with &quot;</em>&quot; as the name, when a user, whose user name that has been provided when a client connected to a VPN Server does not match existing user names, is able to be authenticated by a RADIUS server or NT domain controller by inputting a user name and password, the authentication settings and security policy settings will follow the setting for the user &quot;*&quot;. To change the user information of a user that has been created, use the SetUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.</p>
+<h3 id="input-json-rpc-format-48">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;CreateUser&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Name_str&quot;: &quot;name&quot;,
+    &quot;Realname_utf&quot;: &quot;realname&quot;,
+    &quot;Note_utf&quot;: &quot;note&quot;,
+    &quot;ExpireTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;AuthType_u32&quot;: 0,
+    &quot;Auth_Password_str&quot;: &quot;auth_password&quot;,
+    &quot;UserX_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;Serial_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;CommonName_utf&quot;: &quot;auth_rootcert_commonname&quot;,
+    &quot;RadiusUsername_utf&quot;: &quot;auth_radius_radiususername&quot;,
+    &quot;NtUsername_utf&quot;: &quot;auth_nt_ntusername&quot;,
+    &quot;UsePolicy_bool&quot;: false,
+    &quot;policy:Access_bool&quot;: false,
+    &quot;policy:DHCPFilter_bool&quot;: false,
+    &quot;policy:DHCPNoServer_bool&quot;: false,
+    &quot;policy:DHCPForce_bool&quot;: false,
+    &quot;policy:NoBridge_bool&quot;: false,
+    &quot;policy:NoRouting_bool&quot;: false,
+    &quot;policy:CheckMac_bool&quot;: false,
+    &quot;policy:CheckIP_bool&quot;: false,
+    &quot;policy:ArpDhcpOnly_bool&quot;: false,
+    &quot;policy:PrivacyFilter_bool&quot;: false,
+    &quot;policy:NoServer_bool&quot;: false,
+    &quot;policy:NoBroadcastLimiter_bool&quot;: false,
+    &quot;policy:MonitorPort_bool&quot;: false,
+    &quot;policy:MaxConnection_u32&quot;: 0,
+    &quot;policy:TimeOut_u32&quot;: 0,
+    &quot;policy:MaxMac_u32&quot;: 0,
+    &quot;policy:MaxIP_u32&quot;: 0,
+    &quot;policy:MaxUpload_u32&quot;: 0,
+    &quot;policy:MaxDownload_u32&quot;: 0,
+    &quot;policy:FixPassword_bool&quot;: false,
+    &quot;policy:MultiLogins_u32&quot;: 0,
+    &quot;policy:NoQoS_bool&quot;: false,
+    &quot;policy:RSandRAFilter_bool&quot;: false,
+    &quot;policy:RAFilter_bool&quot;: false,
+    &quot;policy:DHCPv6Filter_bool&quot;: false,
+    &quot;policy:DHCPv6NoServer_bool&quot;: false,
+    &quot;policy:NoRoutingV6_bool&quot;: false,
+    &quot;policy:CheckIPv6_bool&quot;: false,
+    &quot;policy:NoServerV6_bool&quot;: false,
+    &quot;policy:MaxIPv6_u32&quot;: 0,
+    &quot;policy:NoSavePassword_bool&quot;: false,
+    &quot;policy:AutoDisconnect_u32&quot;: 0,
+    &quot;policy:FilterIPv4_bool&quot;: false,
+    &quot;policy:FilterIPv6_bool&quot;: false,
+    &quot;policy:FilterNonIP_bool&quot;: false,
+    &quot;policy:NoIPv6DefaultRouterInRA_bool&quot;: false,
+    &quot;policy:NoIPv6DefaultRouterInRAWhenIPv6_bool&quot;: false,
+    &quot;policy:VLanId_u32&quot;: 0,
+    &quot;policy:Ver3_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-48">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Name_str&quot;: &quot;name&quot;,
+    &quot;GroupName_str&quot;: &quot;groupname&quot;,
+    &quot;Realname_utf&quot;: &quot;realname&quot;,
+    &quot;Note_utf&quot;: &quot;note&quot;,
+    &quot;CreatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;UpdatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;ExpireTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;AuthType_u32&quot;: 0,
+    &quot;Auth_Password_str&quot;: &quot;auth_password&quot;,
+    &quot;UserX_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;Serial_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;CommonName_utf&quot;: &quot;auth_rootcert_commonname&quot;,
+    &quot;RadiusUsername_utf&quot;: &quot;auth_radius_radiususername&quot;,
+    &quot;NtUsername_utf&quot;: &quot;auth_nt_ntusername&quot;,
+    &quot;NumLogin_u32&quot;: 0,
+    &quot;Recv.BroadcastBytes_u64&quot;: 0,
+    &quot;Recv.BroadcastCount_u64&quot;: 0,
+    &quot;Recv.UnicastBytes_u64&quot;: 0,
+    &quot;Recv.UnicastCount_u64&quot;: 0,
+    &quot;Send.BroadcastBytes_u64&quot;: 0,
+    &quot;Send.BroadcastCount_u64&quot;: 0,
+    &quot;Send.UnicastBytes_u64&quot;: 0,
+    &quot;Send.UnicastCount_u64&quot;: 0,
+    &quot;UsePolicy_bool&quot;: false,
+    &quot;policy:Access_bool&quot;: false,
+    &quot;policy:DHCPFilter_bool&quot;: false,
+    &quot;policy:DHCPNoServer_bool&quot;: false,
+    &quot;policy:DHCPForce_bool&quot;: false,
+    &quot;policy:NoBridge_bool&quot;: false,
+    &quot;policy:NoRouting_bool&quot;: false,
+    &quot;policy:CheckMac_bool&quot;: false,
+    &quot;policy:CheckIP_bool&quot;: false,
+    &quot;policy:ArpDhcpOnly_bool&quot;: false,
+    &quot;policy:PrivacyFilter_bool&quot;: false,
+    &quot;policy:NoServer_bool&quot;: false,
+    &quot;policy:NoBroadcastLimiter_bool&quot;: false,
+    &quot;policy:MonitorPort_bool&quot;: false,
+    &quot;policy:MaxConnection_u32&quot;: 0,
+    &quot;policy:TimeOut_u32&quot;: 0,
+    &quot;policy:MaxMac_u32&quot;: 0,
+    &quot;policy:MaxIP_u32&quot;: 0,
+    &quot;policy:MaxUpload_u32&quot;: 0,
+    &quot;policy:MaxDownload_u32&quot;: 0,
+    &quot;policy:FixPassword_bool&quot;: false,
+    &quot;policy:MultiLogins_u32&quot;: 0,
+    &quot;policy:NoQoS_bool&quot;: false,
+    &quot;policy:RSandRAFilter_bool&quot;: false,
+    &quot;policy:RAFilter_bool&quot;: false,
+    &quot;policy:DHCPv6Filter_bool&quot;: false,
+    &quot;policy:DHCPv6NoServer_bool&quot;: false,
+    &quot;policy:NoRoutingV6_bool&quot;: false,
+    &quot;policy:CheckIPv6_bool&quot;: false,
+    &quot;policy:NoServerV6_bool&quot;: false,
+    &quot;policy:MaxIPv6_u32&quot;: 0,
+    &quot;policy:NoSavePassword_bool&quot;: false,
+    &quot;policy:AutoDisconnect_u32&quot;: 0,
+    &quot;policy:FilterIPv4_bool&quot;: false,
+    &quot;policy:FilterIPv6_bool&quot;: false,
+    &quot;policy:FilterNonIP_bool&quot;: false,
+    &quot;policy:NoIPv6DefaultRouterInRA_bool&quot;: false,
+    &quot;policy:NoIPv6DefaultRouterInRAWhenIPv6_bool&quot;: false,
+    &quot;policy:VLanId_u32&quot;: 0,
+    &quot;policy:Ver3_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="parameters-48">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the user name of the user</td>
+</tr>
+<tr>
+<td><code>GroupName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Assigned group name for the user</td>
+</tr>
+<tr>
+<td><code>Realname_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Optional real name (full name) of the user, allow using any Unicode characters</td>
+</tr>
+<tr>
+<td><code>Note_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Optional User Description</td>
+</tr>
+<tr>
+<td><code>CreatedTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Creation date and time</td>
+</tr>
+<tr>
+<td><code>UpdatedTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Last modified date and time</td>
+</tr>
+<tr>
+<td><code>ExpireTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Expiration date and time</td>
+</tr>
+<tr>
+<td><code>AuthType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Authentication method of the user<BR>Values:<BR><code>0</code>: Anonymous authentication<BR><code>1</code>: Password authentication<BR><code>2</code>: User certificate authentication<BR><code>3</code>: Root certificate which is issued by trusted Certificate Authority<BR><code>4</code>: Radius authentication<BR><code>5</code>: Windows NT authentication</td>
+</tr>
+<tr>
+<td><code>Auth_Password_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>User password, valid only if AuthType_u32 == Password(1). Valid only to create or set operations.</td>
+</tr>
+<tr>
+<td><code>UserX_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>User certificate, valid only if AuthType_u32 == UserCert(2).</td>
+</tr>
+<tr>
+<td><code>Serial_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Certificate Serial Number, optional, valid only if AuthType_u32 == RootCert(3).</td>
+</tr>
+<tr>
+<td><code>CommonName_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Certificate Common Name, optional, valid only if AuthType_u32 == RootCert(3).</td>
+</tr>
+<tr>
+<td><code>RadiusUsername_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Username in RADIUS server, optional, valid only if AuthType_u32 == Radius(4).</td>
+</tr>
+<tr>
+<td><code>NtUsername_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Username in NT Domain server, optional, valid only if AuthType_u32 == NT(5).</td>
+</tr>
+<tr>
+<td><code>NumLogin_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of total logins of the user</td>
+</tr>
+<tr>
+<td><code>Recv.BroadcastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Number of broadcast packets (Recv)</td>
+</tr>
+<tr>
+<td><code>Recv.BroadcastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Broadcast bytes (Recv)</td>
+</tr>
+<tr>
+<td><code>Recv.UnicastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast count (Recv)</td>
+</tr>
+<tr>
+<td><code>Recv.UnicastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Recv)</td>
+</tr>
+<tr>
+<td><code>Send.BroadcastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Number of broadcast packets (Send)</td>
+</tr>
+<tr>
+<td><code>Send.BroadcastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Broadcast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>Send.UnicastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>Send.UnicastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>UsePolicy_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag whether to use security policy</td>
+</tr>
+<tr>
+<td><code>policy:Access_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPNoServer_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPForce_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side.</td>
+</tr>
+<tr>
+<td><code>policy:NoBridge_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible.</td>
+</tr>
+<tr>
+<td><code>policy:NoRouting_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.</td>
+</tr>
+<tr>
+<td><code>policy:CheckMac_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.</td>
+</tr>
+<tr>
+<td><code>policy:CheckIP_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.</td>
+</tr>
+<tr>
+<td><code>policy:ArpDhcpOnly_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting.</td>
+</tr>
+<tr>
+<td><code>policy:PrivacyFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:NoServer_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4.</td>
+</tr>
+<tr>
+<td><code>policy:NoBroadcastLimiter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting.</td>
+</tr>
+<tr>
+<td><code>policy:MonitorPort_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>policy:MaxConnection_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session.</td>
+</tr>
+<tr>
+<td><code>policy:TimeOut_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server.</td>
+</tr>
+<tr>
+<td><code>policy:MaxMac_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session.</td>
+</tr>
+<tr>
+<td><code>policy:MaxIP_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session.</td>
+</tr>
+<tr>
+<td><code>policy:MaxUpload_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>policy:MaxDownload_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>policy:FixPassword_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar.</td>
+</tr>
+<tr>
+<td><code>policy:MultiLogins_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy.</td>
+</tr>
+<tr>
+<td><code>policy:NoQoS_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions.</td>
+</tr>
+<tr>
+<td><code>policy:RSandRAFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection.</td>
+</tr>
+<tr>
+<td><code>policy:RAFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPv6Filter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPv6NoServer_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients.</td>
+</tr>
+<tr>
+<td><code>policy:NoRoutingV6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.</td>
+</tr>
+<tr>
+<td><code>policy:CheckIPv6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.</td>
+</tr>
+<tr>
+<td><code>policy:NoServerV6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6.</td>
+</tr>
+<tr>
+<td><code>policy:MaxIPv6_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session.</td>
+</tr>
+<tr>
+<td><code>policy:NoSavePassword_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using <em>standard</em> password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access.</td>
+</tr>
+<tr>
+<td><code>policy:AutoDisconnect_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access.</td>
+</tr>
+<tr>
+<td><code>policy:FilterIPv4_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:FilterIPv6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:FilterNonIP_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. &quot;Non-IP packet&quot; mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets.</td>
+</tr>
+<tr>
+<td><code>policy:NoIPv6DefaultRouterInRA_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.</td>
+</tr>
+<tr>
+<td><code>policy:NoIPv6DefaultRouterInRAWhenIPv6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.</td>
+</tr>
+<tr>
+<td><code>policy:VLanId_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing.</td>
+</tr>
+<tr>
+<td><code>policy:Ver3_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Whether version 3.0 (must be true)</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="setuser"></a></p>
+<h2 id="setuser-rpc-api-change-user-settings">&quot;SetUser&quot; RPC API - Change User Settings</h2>
+<h3 id="description-49">Description</h3>
+<p>Change User Settings. Use this to change user settings that is registered on the security account database of the currently managed Virtual Hub. The user settings that can be changed using this API are the three items that are specified when a new user is created using the CreateUser API: Group Name, Full Name, and Description. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.</p>
+<h3 id="input-json-rpc-format-49">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetUser&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Name_str&quot;: &quot;name&quot;,
+    &quot;GroupName_str&quot;: &quot;groupname&quot;,
+    &quot;Realname_utf&quot;: &quot;realname&quot;,
+    &quot;Note_utf&quot;: &quot;note&quot;,
+    &quot;ExpireTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;AuthType_u32&quot;: 0,
+    &quot;Auth_Password_str&quot;: &quot;auth_password&quot;,
+    &quot;UserX_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;Serial_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;CommonName_utf&quot;: &quot;auth_rootcert_commonname&quot;,
+    &quot;RadiusUsername_utf&quot;: &quot;auth_radius_radiususername&quot;,
+    &quot;NtUsername_utf&quot;: &quot;auth_nt_ntusername&quot;,
+    &quot;UsePolicy_bool&quot;: false,
+    &quot;policy:Access_bool&quot;: false,
+    &quot;policy:DHCPFilter_bool&quot;: false,
+    &quot;policy:DHCPNoServer_bool&quot;: false,
+    &quot;policy:DHCPForce_bool&quot;: false,
+    &quot;policy:NoBridge_bool&quot;: false,
+    &quot;policy:NoRouting_bool&quot;: false,
+    &quot;policy:CheckMac_bool&quot;: false,
+    &quot;policy:CheckIP_bool&quot;: false,
+    &quot;policy:ArpDhcpOnly_bool&quot;: false,
+    &quot;policy:PrivacyFilter_bool&quot;: false,
+    &quot;policy:NoServer_bool&quot;: false,
+    &quot;policy:NoBroadcastLimiter_bool&quot;: false,
+    &quot;policy:MonitorPort_bool&quot;: false,
+    &quot;policy:MaxConnection_u32&quot;: 0,
+    &quot;policy:TimeOut_u32&quot;: 0,
+    &quot;policy:MaxMac_u32&quot;: 0,
+    &quot;policy:MaxIP_u32&quot;: 0,
+    &quot;policy:MaxUpload_u32&quot;: 0,
+    &quot;policy:MaxDownload_u32&quot;: 0,
+    &quot;policy:FixPassword_bool&quot;: false,
+    &quot;policy:MultiLogins_u32&quot;: 0,
+    &quot;policy:NoQoS_bool&quot;: false,
+    &quot;policy:RSandRAFilter_bool&quot;: false,
+    &quot;policy:RAFilter_bool&quot;: false,
+    &quot;policy:DHCPv6Filter_bool&quot;: false,
+    &quot;policy:DHCPv6NoServer_bool&quot;: false,
+    &quot;policy:NoRoutingV6_bool&quot;: false,
+    &quot;policy:CheckIPv6_bool&quot;: false,
+    &quot;policy:NoServerV6_bool&quot;: false,
+    &quot;policy:MaxIPv6_u32&quot;: 0,
+    &quot;policy:NoSavePassword_bool&quot;: false,
+    &quot;policy:AutoDisconnect_u32&quot;: 0,
+    &quot;policy:FilterIPv4_bool&quot;: false,
+    &quot;policy:FilterIPv6_bool&quot;: false,
+    &quot;policy:FilterNonIP_bool&quot;: false,
+    &quot;policy:NoIPv6DefaultRouterInRA_bool&quot;: false,
+    &quot;policy:NoIPv6DefaultRouterInRAWhenIPv6_bool&quot;: false,
+    &quot;policy:VLanId_u32&quot;: 0,
+    &quot;policy:Ver3_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-49">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Name_str&quot;: &quot;name&quot;,
+    &quot;GroupName_str&quot;: &quot;groupname&quot;,
+    &quot;Realname_utf&quot;: &quot;realname&quot;,
+    &quot;Note_utf&quot;: &quot;note&quot;,
+    &quot;CreatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;UpdatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;ExpireTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;AuthType_u32&quot;: 0,
+    &quot;Auth_Password_str&quot;: &quot;auth_password&quot;,
+    &quot;UserX_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;Serial_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;CommonName_utf&quot;: &quot;auth_rootcert_commonname&quot;,
+    &quot;RadiusUsername_utf&quot;: &quot;auth_radius_radiususername&quot;,
+    &quot;NtUsername_utf&quot;: &quot;auth_nt_ntusername&quot;,
+    &quot;NumLogin_u32&quot;: 0,
+    &quot;Recv.BroadcastBytes_u64&quot;: 0,
+    &quot;Recv.BroadcastCount_u64&quot;: 0,
+    &quot;Recv.UnicastBytes_u64&quot;: 0,
+    &quot;Recv.UnicastCount_u64&quot;: 0,
+    &quot;Send.BroadcastBytes_u64&quot;: 0,
+    &quot;Send.BroadcastCount_u64&quot;: 0,
+    &quot;Send.UnicastBytes_u64&quot;: 0,
+    &quot;Send.UnicastCount_u64&quot;: 0,
+    &quot;UsePolicy_bool&quot;: false,
+    &quot;policy:Access_bool&quot;: false,
+    &quot;policy:DHCPFilter_bool&quot;: false,
+    &quot;policy:DHCPNoServer_bool&quot;: false,
+    &quot;policy:DHCPForce_bool&quot;: false,
+    &quot;policy:NoBridge_bool&quot;: false,
+    &quot;policy:NoRouting_bool&quot;: false,
+    &quot;policy:CheckMac_bool&quot;: false,
+    &quot;policy:CheckIP_bool&quot;: false,
+    &quot;policy:ArpDhcpOnly_bool&quot;: false,
+    &quot;policy:PrivacyFilter_bool&quot;: false,
+    &quot;policy:NoServer_bool&quot;: false,
+    &quot;policy:NoBroadcastLimiter_bool&quot;: false,
+    &quot;policy:MonitorPort_bool&quot;: false,
+    &quot;policy:MaxConnection_u32&quot;: 0,
+    &quot;policy:TimeOut_u32&quot;: 0,
+    &quot;policy:MaxMac_u32&quot;: 0,
+    &quot;policy:MaxIP_u32&quot;: 0,
+    &quot;policy:MaxUpload_u32&quot;: 0,
+    &quot;policy:MaxDownload_u32&quot;: 0,
+    &quot;policy:FixPassword_bool&quot;: false,
+    &quot;policy:MultiLogins_u32&quot;: 0,
+    &quot;policy:NoQoS_bool&quot;: false,
+    &quot;policy:RSandRAFilter_bool&quot;: false,
+    &quot;policy:RAFilter_bool&quot;: false,
+    &quot;policy:DHCPv6Filter_bool&quot;: false,
+    &quot;policy:DHCPv6NoServer_bool&quot;: false,
+    &quot;policy:NoRoutingV6_bool&quot;: false,
+    &quot;policy:CheckIPv6_bool&quot;: false,
+    &quot;policy:NoServerV6_bool&quot;: false,
+    &quot;policy:MaxIPv6_u32&quot;: 0,
+    &quot;policy:NoSavePassword_bool&quot;: false,
+    &quot;policy:AutoDisconnect_u32&quot;: 0,
+    &quot;policy:FilterIPv4_bool&quot;: false,
+    &quot;policy:FilterIPv6_bool&quot;: false,
+    &quot;policy:FilterNonIP_bool&quot;: false,
+    &quot;policy:NoIPv6DefaultRouterInRA_bool&quot;: false,
+    &quot;policy:NoIPv6DefaultRouterInRAWhenIPv6_bool&quot;: false,
+    &quot;policy:VLanId_u32&quot;: 0,
+    &quot;policy:Ver3_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="parameters-49">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the user name of the user</td>
+</tr>
+<tr>
+<td><code>GroupName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Assigned group name for the user</td>
+</tr>
+<tr>
+<td><code>Realname_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Optional real name (full name) of the user, allow using any Unicode characters</td>
+</tr>
+<tr>
+<td><code>Note_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Optional User Description</td>
+</tr>
+<tr>
+<td><code>CreatedTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Creation date and time</td>
+</tr>
+<tr>
+<td><code>UpdatedTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Last modified date and time</td>
+</tr>
+<tr>
+<td><code>ExpireTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Expiration date and time</td>
+</tr>
+<tr>
+<td><code>AuthType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Authentication method of the user<BR>Values:<BR><code>0</code>: Anonymous authentication<BR><code>1</code>: Password authentication<BR><code>2</code>: User certificate authentication<BR><code>3</code>: Root certificate which is issued by trusted Certificate Authority<BR><code>4</code>: Radius authentication<BR><code>5</code>: Windows NT authentication</td>
+</tr>
+<tr>
+<td><code>Auth_Password_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>User password, valid only if AuthType_u32 == Password(1). Valid only to create or set operations.</td>
+</tr>
+<tr>
+<td><code>UserX_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>User certificate, valid only if AuthType_u32 == UserCert(2).</td>
+</tr>
+<tr>
+<td><code>Serial_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Certificate Serial Number, optional, valid only if AuthType_u32 == RootCert(3).</td>
+</tr>
+<tr>
+<td><code>CommonName_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Certificate Common Name, optional, valid only if AuthType_u32 == RootCert(3).</td>
+</tr>
+<tr>
+<td><code>RadiusUsername_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Username in RADIUS server, optional, valid only if AuthType_u32 == Radius(4).</td>
+</tr>
+<tr>
+<td><code>NtUsername_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Username in NT Domain server, optional, valid only if AuthType_u32 == NT(5).</td>
+</tr>
+<tr>
+<td><code>NumLogin_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of total logins of the user</td>
+</tr>
+<tr>
+<td><code>Recv.BroadcastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Number of broadcast packets (Recv)</td>
+</tr>
+<tr>
+<td><code>Recv.BroadcastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Broadcast bytes (Recv)</td>
+</tr>
+<tr>
+<td><code>Recv.UnicastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast count (Recv)</td>
+</tr>
+<tr>
+<td><code>Recv.UnicastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Recv)</td>
+</tr>
+<tr>
+<td><code>Send.BroadcastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Number of broadcast packets (Send)</td>
+</tr>
+<tr>
+<td><code>Send.BroadcastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Broadcast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>Send.UnicastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>Send.UnicastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>UsePolicy_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag whether to use security policy</td>
+</tr>
+<tr>
+<td><code>policy:Access_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPNoServer_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPForce_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side.</td>
+</tr>
+<tr>
+<td><code>policy:NoBridge_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible.</td>
+</tr>
+<tr>
+<td><code>policy:NoRouting_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.</td>
+</tr>
+<tr>
+<td><code>policy:CheckMac_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.</td>
+</tr>
+<tr>
+<td><code>policy:CheckIP_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.</td>
+</tr>
+<tr>
+<td><code>policy:ArpDhcpOnly_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting.</td>
+</tr>
+<tr>
+<td><code>policy:PrivacyFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:NoServer_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4.</td>
+</tr>
+<tr>
+<td><code>policy:NoBroadcastLimiter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting.</td>
+</tr>
+<tr>
+<td><code>policy:MonitorPort_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>policy:MaxConnection_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session.</td>
+</tr>
+<tr>
+<td><code>policy:TimeOut_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server.</td>
+</tr>
+<tr>
+<td><code>policy:MaxMac_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session.</td>
+</tr>
+<tr>
+<td><code>policy:MaxIP_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session.</td>
+</tr>
+<tr>
+<td><code>policy:MaxUpload_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>policy:MaxDownload_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>policy:FixPassword_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar.</td>
+</tr>
+<tr>
+<td><code>policy:MultiLogins_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy.</td>
+</tr>
+<tr>
+<td><code>policy:NoQoS_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions.</td>
+</tr>
+<tr>
+<td><code>policy:RSandRAFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection.</td>
+</tr>
+<tr>
+<td><code>policy:RAFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPv6Filter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPv6NoServer_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients.</td>
+</tr>
+<tr>
+<td><code>policy:NoRoutingV6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.</td>
+</tr>
+<tr>
+<td><code>policy:CheckIPv6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.</td>
+</tr>
+<tr>
+<td><code>policy:NoServerV6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6.</td>
+</tr>
+<tr>
+<td><code>policy:MaxIPv6_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session.</td>
+</tr>
+<tr>
+<td><code>policy:NoSavePassword_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using <em>standard</em> password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access.</td>
+</tr>
+<tr>
+<td><code>policy:AutoDisconnect_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access.</td>
+</tr>
+<tr>
+<td><code>policy:FilterIPv4_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:FilterIPv6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:FilterNonIP_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. &quot;Non-IP packet&quot; mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets.</td>
+</tr>
+<tr>
+<td><code>policy:NoIPv6DefaultRouterInRA_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.</td>
+</tr>
+<tr>
+<td><code>policy:NoIPv6DefaultRouterInRAWhenIPv6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.</td>
+</tr>
+<tr>
+<td><code>policy:VLanId_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing.</td>
+</tr>
+<tr>
+<td><code>policy:Ver3_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Whether version 3.0 (must be true)</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getuser"></a></p>
+<h2 id="getuser-rpc-api-get-user-settings">&quot;GetUser&quot; RPC API - Get User Settings</h2>
+<h3 id="description-50">Description</h3>
+<p>Get User Settings. Use this to get user settings information that is registered on the security account database of the currently managed Virtual Hub. The information that you can get using this API are User Name, Full Name, Group Name, Expiration Date, Security Policy, and Auth Type, as well as parameters that are specified as auth type attributes and the statistical data of that user. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.</p>
+<h3 id="input-json-rpc-format-50">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetUser&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Name_str&quot;: &quot;name&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-50">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Name_str&quot;: &quot;name&quot;,
+    &quot;GroupName_str&quot;: &quot;groupname&quot;,
+    &quot;Realname_utf&quot;: &quot;realname&quot;,
+    &quot;Note_utf&quot;: &quot;note&quot;,
+    &quot;CreatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;UpdatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;ExpireTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;AuthType_u32&quot;: 0,
+    &quot;Auth_Password_str&quot;: &quot;auth_password&quot;,
+    &quot;UserX_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;Serial_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;CommonName_utf&quot;: &quot;auth_rootcert_commonname&quot;,
+    &quot;RadiusUsername_utf&quot;: &quot;auth_radius_radiususername&quot;,
+    &quot;NtUsername_utf&quot;: &quot;auth_nt_ntusername&quot;,
+    &quot;NumLogin_u32&quot;: 0,
+    &quot;Recv.BroadcastBytes_u64&quot;: 0,
+    &quot;Recv.BroadcastCount_u64&quot;: 0,
+    &quot;Recv.UnicastBytes_u64&quot;: 0,
+    &quot;Recv.UnicastCount_u64&quot;: 0,
+    &quot;Send.BroadcastBytes_u64&quot;: 0,
+    &quot;Send.BroadcastCount_u64&quot;: 0,
+    &quot;Send.UnicastBytes_u64&quot;: 0,
+    &quot;Send.UnicastCount_u64&quot;: 0,
+    &quot;UsePolicy_bool&quot;: false,
+    &quot;policy:Access_bool&quot;: false,
+    &quot;policy:DHCPFilter_bool&quot;: false,
+    &quot;policy:DHCPNoServer_bool&quot;: false,
+    &quot;policy:DHCPForce_bool&quot;: false,
+    &quot;policy:NoBridge_bool&quot;: false,
+    &quot;policy:NoRouting_bool&quot;: false,
+    &quot;policy:CheckMac_bool&quot;: false,
+    &quot;policy:CheckIP_bool&quot;: false,
+    &quot;policy:ArpDhcpOnly_bool&quot;: false,
+    &quot;policy:PrivacyFilter_bool&quot;: false,
+    &quot;policy:NoServer_bool&quot;: false,
+    &quot;policy:NoBroadcastLimiter_bool&quot;: false,
+    &quot;policy:MonitorPort_bool&quot;: false,
+    &quot;policy:MaxConnection_u32&quot;: 0,
+    &quot;policy:TimeOut_u32&quot;: 0,
+    &quot;policy:MaxMac_u32&quot;: 0,
+    &quot;policy:MaxIP_u32&quot;: 0,
+    &quot;policy:MaxUpload_u32&quot;: 0,
+    &quot;policy:MaxDownload_u32&quot;: 0,
+    &quot;policy:FixPassword_bool&quot;: false,
+    &quot;policy:MultiLogins_u32&quot;: 0,
+    &quot;policy:NoQoS_bool&quot;: false,
+    &quot;policy:RSandRAFilter_bool&quot;: false,
+    &quot;policy:RAFilter_bool&quot;: false,
+    &quot;policy:DHCPv6Filter_bool&quot;: false,
+    &quot;policy:DHCPv6NoServer_bool&quot;: false,
+    &quot;policy:NoRoutingV6_bool&quot;: false,
+    &quot;policy:CheckIPv6_bool&quot;: false,
+    &quot;policy:NoServerV6_bool&quot;: false,
+    &quot;policy:MaxIPv6_u32&quot;: 0,
+    &quot;policy:NoSavePassword_bool&quot;: false,
+    &quot;policy:AutoDisconnect_u32&quot;: 0,
+    &quot;policy:FilterIPv4_bool&quot;: false,
+    &quot;policy:FilterIPv6_bool&quot;: false,
+    &quot;policy:FilterNonIP_bool&quot;: false,
+    &quot;policy:NoIPv6DefaultRouterInRA_bool&quot;: false,
+    &quot;policy:NoIPv6DefaultRouterInRAWhenIPv6_bool&quot;: false,
+    &quot;policy:VLanId_u32&quot;: 0,
+    &quot;policy:Ver3_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="parameters-50">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the user name of the user</td>
+</tr>
+<tr>
+<td><code>GroupName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Assigned group name for the user</td>
+</tr>
+<tr>
+<td><code>Realname_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Optional real name (full name) of the user, allow using any Unicode characters</td>
+</tr>
+<tr>
+<td><code>Note_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Optional User Description</td>
+</tr>
+<tr>
+<td><code>CreatedTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Creation date and time</td>
+</tr>
+<tr>
+<td><code>UpdatedTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Last modified date and time</td>
+</tr>
+<tr>
+<td><code>ExpireTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Expiration date and time</td>
+</tr>
+<tr>
+<td><code>AuthType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Authentication method of the user<BR>Values:<BR><code>0</code>: Anonymous authentication<BR><code>1</code>: Password authentication<BR><code>2</code>: User certificate authentication<BR><code>3</code>: Root certificate which is issued by trusted Certificate Authority<BR><code>4</code>: Radius authentication<BR><code>5</code>: Windows NT authentication</td>
+</tr>
+<tr>
+<td><code>Auth_Password_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>User password, valid only if AuthType_u32 == Password(1). Valid only to create or set operations.</td>
+</tr>
+<tr>
+<td><code>UserX_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>User certificate, valid only if AuthType_u32 == UserCert(2).</td>
+</tr>
+<tr>
+<td><code>Serial_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Certificate Serial Number, optional, valid only if AuthType_u32 == RootCert(3).</td>
+</tr>
+<tr>
+<td><code>CommonName_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Certificate Common Name, optional, valid only if AuthType_u32 == RootCert(3).</td>
+</tr>
+<tr>
+<td><code>RadiusUsername_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Username in RADIUS server, optional, valid only if AuthType_u32 == Radius(4).</td>
+</tr>
+<tr>
+<td><code>NtUsername_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Username in NT Domain server, optional, valid only if AuthType_u32 == NT(5).</td>
+</tr>
+<tr>
+<td><code>NumLogin_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of total logins of the user</td>
+</tr>
+<tr>
+<td><code>Recv.BroadcastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Number of broadcast packets (Recv)</td>
+</tr>
+<tr>
+<td><code>Recv.BroadcastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Broadcast bytes (Recv)</td>
+</tr>
+<tr>
+<td><code>Recv.UnicastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast count (Recv)</td>
+</tr>
+<tr>
+<td><code>Recv.UnicastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Recv)</td>
+</tr>
+<tr>
+<td><code>Send.BroadcastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Number of broadcast packets (Send)</td>
+</tr>
+<tr>
+<td><code>Send.BroadcastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Broadcast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>Send.UnicastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>Send.UnicastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>UsePolicy_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag whether to use security policy</td>
+</tr>
+<tr>
+<td><code>policy:Access_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPNoServer_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPForce_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side.</td>
+</tr>
+<tr>
+<td><code>policy:NoBridge_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible.</td>
+</tr>
+<tr>
+<td><code>policy:NoRouting_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.</td>
+</tr>
+<tr>
+<td><code>policy:CheckMac_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.</td>
+</tr>
+<tr>
+<td><code>policy:CheckIP_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.</td>
+</tr>
+<tr>
+<td><code>policy:ArpDhcpOnly_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting.</td>
+</tr>
+<tr>
+<td><code>policy:PrivacyFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:NoServer_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4.</td>
+</tr>
+<tr>
+<td><code>policy:NoBroadcastLimiter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting.</td>
+</tr>
+<tr>
+<td><code>policy:MonitorPort_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>policy:MaxConnection_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session.</td>
+</tr>
+<tr>
+<td><code>policy:TimeOut_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server.</td>
+</tr>
+<tr>
+<td><code>policy:MaxMac_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session.</td>
+</tr>
+<tr>
+<td><code>policy:MaxIP_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session.</td>
+</tr>
+<tr>
+<td><code>policy:MaxUpload_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>policy:MaxDownload_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>policy:FixPassword_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar.</td>
+</tr>
+<tr>
+<td><code>policy:MultiLogins_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy.</td>
+</tr>
+<tr>
+<td><code>policy:NoQoS_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions.</td>
+</tr>
+<tr>
+<td><code>policy:RSandRAFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection.</td>
+</tr>
+<tr>
+<td><code>policy:RAFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPv6Filter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPv6NoServer_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients.</td>
+</tr>
+<tr>
+<td><code>policy:NoRoutingV6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.</td>
+</tr>
+<tr>
+<td><code>policy:CheckIPv6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.</td>
+</tr>
+<tr>
+<td><code>policy:NoServerV6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6.</td>
+</tr>
+<tr>
+<td><code>policy:MaxIPv6_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session.</td>
+</tr>
+<tr>
+<td><code>policy:NoSavePassword_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using <em>standard</em> password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access.</td>
+</tr>
+<tr>
+<td><code>policy:AutoDisconnect_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access.</td>
+</tr>
+<tr>
+<td><code>policy:FilterIPv4_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:FilterIPv6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:FilterNonIP_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. &quot;Non-IP packet&quot; mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets.</td>
+</tr>
+<tr>
+<td><code>policy:NoIPv6DefaultRouterInRA_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.</td>
+</tr>
+<tr>
+<td><code>policy:NoIPv6DefaultRouterInRAWhenIPv6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.</td>
+</tr>
+<tr>
+<td><code>policy:VLanId_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing.</td>
+</tr>
+<tr>
+<td><code>policy:Ver3_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Whether version 3.0 (must be true)</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="deleteuser"></a></p>
+<h2 id="deleteuser-rpc-api-delete-a-user">&quot;DeleteUser&quot; RPC API - Delete a user</h2>
+<h3 id="description-51">Description</h3>
+<p>Delete a user. Use this to delete a user that is registered on the security account database of the currently managed Virtual Hub. By deleting the user, that user will no long be able to connect to the Virtual Hub. You can use the SetUser API to set the user's security policy to deny access instead of deleting a user, set the user to be temporarily denied from logging in. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.</p>
+<h3 id="input-json-rpc-format-51">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;DeleteUser&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Name_str&quot;: &quot;name&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-51">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Name_str&quot;: &quot;name&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-51">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>User or group name</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="enumuser"></a></p>
+<h2 id="enumuser-rpc-api-get-list-of-users">&quot;EnumUser&quot; RPC API - Get List of Users</h2>
+<h3 id="description-52">Description</h3>
+<p>Get List of Users. Use this to get a list of users that are registered on the security account database of the currently managed Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.</p>
+<h3 id="input-json-rpc-format-52">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;EnumUser&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-52">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;UserList&quot;: [
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;GroupName_str&quot;: &quot;groupname&quot;,
+        &quot;Realname_utf&quot;: &quot;realname&quot;,
+        &quot;Note_utf&quot;: &quot;note&quot;,
+        &quot;AuthType_u32&quot;: 0,
+        &quot;NumLogin_u32&quot;: 0,
+        &quot;LastLoginTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;DenyAccess_bool&quot;: false,
+        &quot;IsTrafficFilled_bool&quot;: false,
+        &quot;IsExpiresFilled_bool&quot;: false,
+        &quot;Expires_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;Ex.Recv.BroadcastBytes_u64&quot;: 0,
+        &quot;Ex.Recv.BroadcastCount_u64&quot;: 0,
+        &quot;Ex.Recv.UnicastBytes_u64&quot;: 0,
+        &quot;Ex.Recv.UnicastCount_u64&quot;: 0,
+        &quot;Ex.Send.BroadcastBytes_u64&quot;: 0,
+        &quot;Ex.Send.BroadcastCount_u64&quot;: 0,
+        &quot;Ex.Send.UnicastBytes_u64&quot;: 0,
+        &quot;Ex.Send.UnicastCount_u64&quot;: 0
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;GroupName_str&quot;: &quot;groupname&quot;,
+        &quot;Realname_utf&quot;: &quot;realname&quot;,
+        &quot;Note_utf&quot;: &quot;note&quot;,
+        &quot;AuthType_u32&quot;: 0,
+        &quot;NumLogin_u32&quot;: 0,
+        &quot;LastLoginTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;DenyAccess_bool&quot;: false,
+        &quot;IsTrafficFilled_bool&quot;: false,
+        &quot;IsExpiresFilled_bool&quot;: false,
+        &quot;Expires_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;Ex.Recv.BroadcastBytes_u64&quot;: 0,
+        &quot;Ex.Recv.BroadcastCount_u64&quot;: 0,
+        &quot;Ex.Recv.UnicastBytes_u64&quot;: 0,
+        &quot;Ex.Recv.UnicastCount_u64&quot;: 0,
+        &quot;Ex.Send.BroadcastBytes_u64&quot;: 0,
+        &quot;Ex.Send.BroadcastCount_u64&quot;: 0,
+        &quot;Ex.Send.UnicastBytes_u64&quot;: 0,
+        &quot;Ex.Send.UnicastCount_u64&quot;: 0
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;GroupName_str&quot;: &quot;groupname&quot;,
+        &quot;Realname_utf&quot;: &quot;realname&quot;,
+        &quot;Note_utf&quot;: &quot;note&quot;,
+        &quot;AuthType_u32&quot;: 0,
+        &quot;NumLogin_u32&quot;: 0,
+        &quot;LastLoginTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;DenyAccess_bool&quot;: false,
+        &quot;IsTrafficFilled_bool&quot;: false,
+        &quot;IsExpiresFilled_bool&quot;: false,
+        &quot;Expires_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;Ex.Recv.BroadcastBytes_u64&quot;: 0,
+        &quot;Ex.Recv.BroadcastCount_u64&quot;: 0,
+        &quot;Ex.Recv.UnicastBytes_u64&quot;: 0,
+        &quot;Ex.Recv.UnicastCount_u64&quot;: 0,
+        &quot;Ex.Send.BroadcastBytes_u64&quot;: 0,
+        &quot;Ex.Send.BroadcastCount_u64&quot;: 0,
+        &quot;Ex.Send.UnicastBytes_u64&quot;: 0,
+        &quot;Ex.Send.UnicastCount_u64&quot;: 0
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-52">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>UserList</code></td>
+<td><code>Array object</code></td>
+<td>User list</td>
+</tr>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>User name</td>
+</tr>
+<tr>
+<td><code>GroupName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Group name</td>
+</tr>
+<tr>
+<td><code>Realname_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Real name</td>
+</tr>
+<tr>
+<td><code>Note_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Note</td>
+</tr>
+<tr>
+<td><code>AuthType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Authentication method<BR>Values:<BR><code>0</code>: Anonymous authentication<BR><code>1</code>: Password authentication<BR><code>2</code>: User certificate authentication<BR><code>3</code>: Root certificate which is issued by trusted Certificate Authority<BR><code>4</code>: Radius authentication<BR><code>5</code>: Windows NT authentication</td>
+</tr>
+<tr>
+<td><code>NumLogin_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of logins</td>
+</tr>
+<tr>
+<td><code>LastLoginTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Last login date and time</td>
+</tr>
+<tr>
+<td><code>DenyAccess_bool</code></td>
+<td><code>boolean</code></td>
+<td>Access denied</td>
+</tr>
+<tr>
+<td><code>IsTrafficFilled_bool</code></td>
+<td><code>boolean</code></td>
+<td>Flag of whether the traffic variable is set</td>
+</tr>
+<tr>
+<td><code>IsExpiresFilled_bool</code></td>
+<td><code>boolean</code></td>
+<td>Flag of whether expiration date variable is set</td>
+</tr>
+<tr>
+<td><code>Expires_dt</code></td>
+<td><code>Date</code></td>
+<td>Expiration date</td>
+</tr>
+<tr>
+<td><code>Ex.Recv.BroadcastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Number of broadcast packets (Recv)</td>
+</tr>
+<tr>
+<td><code>Ex.Recv.BroadcastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Broadcast bytes (Recv)</td>
+</tr>
+<tr>
+<td><code>Ex.Recv.UnicastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast count (Recv)</td>
+</tr>
+<tr>
+<td><code>Ex.Recv.UnicastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Recv)</td>
+</tr>
+<tr>
+<td><code>Ex.Send.BroadcastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Number of broadcast packets (Send)</td>
+</tr>
+<tr>
+<td><code>Ex.Send.BroadcastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Broadcast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>Ex.Send.UnicastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>Ex.Send.UnicastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Send)</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="creategroup"></a></p>
+<h2 id="creategroup-rpc-api-create-group">&quot;CreateGroup&quot; RPC API - Create Group</h2>
+<h3 id="description-53">Description</h3>
+<p>Create Group. Use this to create a new group in the security account database of the currently managed Virtual Hub. You can register multiple users in a group. To register users in a group use the SetUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.</p>
+<h3 id="input-json-rpc-format-53">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;CreateGroup&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Name_str&quot;: &quot;name&quot;,
+    &quot;Realname_utf&quot;: &quot;realname&quot;,
+    &quot;Note_utf&quot;: &quot;note&quot;,
+    &quot;UsePolicy_bool&quot;: false,
+    &quot;policy:Access_bool&quot;: false,
+    &quot;policy:DHCPFilter_bool&quot;: false,
+    &quot;policy:DHCPNoServer_bool&quot;: false,
+    &quot;policy:DHCPForce_bool&quot;: false,
+    &quot;policy:NoBridge_bool&quot;: false,
+    &quot;policy:NoRouting_bool&quot;: false,
+    &quot;policy:CheckMac_bool&quot;: false,
+    &quot;policy:CheckIP_bool&quot;: false,
+    &quot;policy:ArpDhcpOnly_bool&quot;: false,
+    &quot;policy:PrivacyFilter_bool&quot;: false,
+    &quot;policy:NoServer_bool&quot;: false,
+    &quot;policy:NoBroadcastLimiter_bool&quot;: false,
+    &quot;policy:MonitorPort_bool&quot;: false,
+    &quot;policy:MaxConnection_u32&quot;: 0,
+    &quot;policy:TimeOut_u32&quot;: 0,
+    &quot;policy:MaxMac_u32&quot;: 0,
+    &quot;policy:MaxIP_u32&quot;: 0,
+    &quot;policy:MaxUpload_u32&quot;: 0,
+    &quot;policy:MaxDownload_u32&quot;: 0,
+    &quot;policy:FixPassword_bool&quot;: false,
+    &quot;policy:MultiLogins_u32&quot;: 0,
+    &quot;policy:NoQoS_bool&quot;: false,
+    &quot;policy:RSandRAFilter_bool&quot;: false,
+    &quot;policy:RAFilter_bool&quot;: false,
+    &quot;policy:DHCPv6Filter_bool&quot;: false,
+    &quot;policy:DHCPv6NoServer_bool&quot;: false,
+    &quot;policy:NoRoutingV6_bool&quot;: false,
+    &quot;policy:CheckIPv6_bool&quot;: false,
+    &quot;policy:NoServerV6_bool&quot;: false,
+    &quot;policy:MaxIPv6_u32&quot;: 0,
+    &quot;policy:NoSavePassword_bool&quot;: false,
+    &quot;policy:AutoDisconnect_u32&quot;: 0,
+    &quot;policy:FilterIPv4_bool&quot;: false,
+    &quot;policy:FilterIPv6_bool&quot;: false,
+    &quot;policy:FilterNonIP_bool&quot;: false,
+    &quot;policy:NoIPv6DefaultRouterInRA_bool&quot;: false,
+    &quot;policy:NoIPv6DefaultRouterInRAWhenIPv6_bool&quot;: false,
+    &quot;policy:VLanId_u32&quot;: 0,
+    &quot;policy:Ver3_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-53">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Name_str&quot;: &quot;name&quot;,
+    &quot;Realname_utf&quot;: &quot;realname&quot;,
+    &quot;Note_utf&quot;: &quot;note&quot;,
+    &quot;Recv.BroadcastBytes_u64&quot;: 0,
+    &quot;Recv.BroadcastCount_u64&quot;: 0,
+    &quot;Recv.UnicastBytes_u64&quot;: 0,
+    &quot;Recv.UnicastCount_u64&quot;: 0,
+    &quot;Send.BroadcastBytes_u64&quot;: 0,
+    &quot;Send.BroadcastCount_u64&quot;: 0,
+    &quot;Send.UnicastBytes_u64&quot;: 0,
+    &quot;Send.UnicastCount_u64&quot;: 0,
+    &quot;UsePolicy_bool&quot;: false,
+    &quot;policy:Access_bool&quot;: false,
+    &quot;policy:DHCPFilter_bool&quot;: false,
+    &quot;policy:DHCPNoServer_bool&quot;: false,
+    &quot;policy:DHCPForce_bool&quot;: false,
+    &quot;policy:NoBridge_bool&quot;: false,
+    &quot;policy:NoRouting_bool&quot;: false,
+    &quot;policy:CheckMac_bool&quot;: false,
+    &quot;policy:CheckIP_bool&quot;: false,
+    &quot;policy:ArpDhcpOnly_bool&quot;: false,
+    &quot;policy:PrivacyFilter_bool&quot;: false,
+    &quot;policy:NoServer_bool&quot;: false,
+    &quot;policy:NoBroadcastLimiter_bool&quot;: false,
+    &quot;policy:MonitorPort_bool&quot;: false,
+    &quot;policy:MaxConnection_u32&quot;: 0,
+    &quot;policy:TimeOut_u32&quot;: 0,
+    &quot;policy:MaxMac_u32&quot;: 0,
+    &quot;policy:MaxIP_u32&quot;: 0,
+    &quot;policy:MaxUpload_u32&quot;: 0,
+    &quot;policy:MaxDownload_u32&quot;: 0,
+    &quot;policy:FixPassword_bool&quot;: false,
+    &quot;policy:MultiLogins_u32&quot;: 0,
+    &quot;policy:NoQoS_bool&quot;: false,
+    &quot;policy:RSandRAFilter_bool&quot;: false,
+    &quot;policy:RAFilter_bool&quot;: false,
+    &quot;policy:DHCPv6Filter_bool&quot;: false,
+    &quot;policy:DHCPv6NoServer_bool&quot;: false,
+    &quot;policy:NoRoutingV6_bool&quot;: false,
+    &quot;policy:CheckIPv6_bool&quot;: false,
+    &quot;policy:NoServerV6_bool&quot;: false,
+    &quot;policy:MaxIPv6_u32&quot;: 0,
+    &quot;policy:NoSavePassword_bool&quot;: false,
+    &quot;policy:AutoDisconnect_u32&quot;: 0,
+    &quot;policy:FilterIPv4_bool&quot;: false,
+    &quot;policy:FilterIPv6_bool&quot;: false,
+    &quot;policy:FilterNonIP_bool&quot;: false,
+    &quot;policy:NoIPv6DefaultRouterInRA_bool&quot;: false,
+    &quot;policy:NoIPv6DefaultRouterInRAWhenIPv6_bool&quot;: false,
+    &quot;policy:VLanId_u32&quot;: 0,
+    &quot;policy:Ver3_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="parameters-53">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The group name</td>
+</tr>
+<tr>
+<td><code>Realname_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Optional real name (full name) of the group, allow using any Unicode characters</td>
+</tr>
+<tr>
+<td><code>Note_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Optional, specify a description of the group</td>
+</tr>
+<tr>
+<td><code>Recv.BroadcastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Number of broadcast packets (Recv)</td>
+</tr>
+<tr>
+<td><code>Recv.BroadcastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Broadcast bytes (Recv)</td>
+</tr>
+<tr>
+<td><code>Recv.UnicastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast count (Recv)</td>
+</tr>
+<tr>
+<td><code>Recv.UnicastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Recv)</td>
+</tr>
+<tr>
+<td><code>Send.BroadcastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Number of broadcast packets (Send)</td>
+</tr>
+<tr>
+<td><code>Send.BroadcastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Broadcast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>Send.UnicastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>Send.UnicastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>UsePolicy_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag whether to use security policy</td>
+</tr>
+<tr>
+<td><code>policy:Access_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPNoServer_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPForce_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side.</td>
+</tr>
+<tr>
+<td><code>policy:NoBridge_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible.</td>
+</tr>
+<tr>
+<td><code>policy:NoRouting_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.</td>
+</tr>
+<tr>
+<td><code>policy:CheckMac_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.</td>
+</tr>
+<tr>
+<td><code>policy:CheckIP_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.</td>
+</tr>
+<tr>
+<td><code>policy:ArpDhcpOnly_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting.</td>
+</tr>
+<tr>
+<td><code>policy:PrivacyFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:NoServer_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4.</td>
+</tr>
+<tr>
+<td><code>policy:NoBroadcastLimiter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting.</td>
+</tr>
+<tr>
+<td><code>policy:MonitorPort_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>policy:MaxConnection_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session.</td>
+</tr>
+<tr>
+<td><code>policy:TimeOut_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server.</td>
+</tr>
+<tr>
+<td><code>policy:MaxMac_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session.</td>
+</tr>
+<tr>
+<td><code>policy:MaxIP_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session.</td>
+</tr>
+<tr>
+<td><code>policy:MaxUpload_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>policy:MaxDownload_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>policy:FixPassword_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar.</td>
+</tr>
+<tr>
+<td><code>policy:MultiLogins_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy.</td>
+</tr>
+<tr>
+<td><code>policy:NoQoS_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions.</td>
+</tr>
+<tr>
+<td><code>policy:RSandRAFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection.</td>
+</tr>
+<tr>
+<td><code>policy:RAFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPv6Filter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPv6NoServer_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients.</td>
+</tr>
+<tr>
+<td><code>policy:NoRoutingV6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.</td>
+</tr>
+<tr>
+<td><code>policy:CheckIPv6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.</td>
+</tr>
+<tr>
+<td><code>policy:NoServerV6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6.</td>
+</tr>
+<tr>
+<td><code>policy:MaxIPv6_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session.</td>
+</tr>
+<tr>
+<td><code>policy:NoSavePassword_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using <em>standard</em> password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access.</td>
+</tr>
+<tr>
+<td><code>policy:AutoDisconnect_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access.</td>
+</tr>
+<tr>
+<td><code>policy:FilterIPv4_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:FilterIPv6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:FilterNonIP_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. &quot;Non-IP packet&quot; mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets.</td>
+</tr>
+<tr>
+<td><code>policy:NoIPv6DefaultRouterInRA_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.</td>
+</tr>
+<tr>
+<td><code>policy:NoIPv6DefaultRouterInRAWhenIPv6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.</td>
+</tr>
+<tr>
+<td><code>policy:VLanId_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing.</td>
+</tr>
+<tr>
+<td><code>policy:Ver3_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Whether version 3.0 (must be true)</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="setgroup"></a></p>
+<h2 id="setgroup-rpc-api-set-group-settings">&quot;SetGroup&quot; RPC API - Set group settings</h2>
+<h3 id="description-54">Description</h3>
+<p>Set group settings. Use this to set group settings that is registered on the security account database of the currently managed Virtual Hub. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.</p>
+<h3 id="input-json-rpc-format-54">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetGroup&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Name_str&quot;: &quot;name&quot;,
+    &quot;Realname_utf&quot;: &quot;realname&quot;,
+    &quot;Note_utf&quot;: &quot;note&quot;,
+    &quot;UsePolicy_bool&quot;: false,
+    &quot;policy:Access_bool&quot;: false,
+    &quot;policy:DHCPFilter_bool&quot;: false,
+    &quot;policy:DHCPNoServer_bool&quot;: false,
+    &quot;policy:DHCPForce_bool&quot;: false,
+    &quot;policy:NoBridge_bool&quot;: false,
+    &quot;policy:NoRouting_bool&quot;: false,
+    &quot;policy:CheckMac_bool&quot;: false,
+    &quot;policy:CheckIP_bool&quot;: false,
+    &quot;policy:ArpDhcpOnly_bool&quot;: false,
+    &quot;policy:PrivacyFilter_bool&quot;: false,
+    &quot;policy:NoServer_bool&quot;: false,
+    &quot;policy:NoBroadcastLimiter_bool&quot;: false,
+    &quot;policy:MonitorPort_bool&quot;: false,
+    &quot;policy:MaxConnection_u32&quot;: 0,
+    &quot;policy:TimeOut_u32&quot;: 0,
+    &quot;policy:MaxMac_u32&quot;: 0,
+    &quot;policy:MaxIP_u32&quot;: 0,
+    &quot;policy:MaxUpload_u32&quot;: 0,
+    &quot;policy:MaxDownload_u32&quot;: 0,
+    &quot;policy:FixPassword_bool&quot;: false,
+    &quot;policy:MultiLogins_u32&quot;: 0,
+    &quot;policy:NoQoS_bool&quot;: false,
+    &quot;policy:RSandRAFilter_bool&quot;: false,
+    &quot;policy:RAFilter_bool&quot;: false,
+    &quot;policy:DHCPv6Filter_bool&quot;: false,
+    &quot;policy:DHCPv6NoServer_bool&quot;: false,
+    &quot;policy:NoRoutingV6_bool&quot;: false,
+    &quot;policy:CheckIPv6_bool&quot;: false,
+    &quot;policy:NoServerV6_bool&quot;: false,
+    &quot;policy:MaxIPv6_u32&quot;: 0,
+    &quot;policy:NoSavePassword_bool&quot;: false,
+    &quot;policy:AutoDisconnect_u32&quot;: 0,
+    &quot;policy:FilterIPv4_bool&quot;: false,
+    &quot;policy:FilterIPv6_bool&quot;: false,
+    &quot;policy:FilterNonIP_bool&quot;: false,
+    &quot;policy:NoIPv6DefaultRouterInRA_bool&quot;: false,
+    &quot;policy:NoIPv6DefaultRouterInRAWhenIPv6_bool&quot;: false,
+    &quot;policy:VLanId_u32&quot;: 0,
+    &quot;policy:Ver3_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-54">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Name_str&quot;: &quot;name&quot;,
+    &quot;Realname_utf&quot;: &quot;realname&quot;,
+    &quot;Note_utf&quot;: &quot;note&quot;,
+    &quot;Recv.BroadcastBytes_u64&quot;: 0,
+    &quot;Recv.BroadcastCount_u64&quot;: 0,
+    &quot;Recv.UnicastBytes_u64&quot;: 0,
+    &quot;Recv.UnicastCount_u64&quot;: 0,
+    &quot;Send.BroadcastBytes_u64&quot;: 0,
+    &quot;Send.BroadcastCount_u64&quot;: 0,
+    &quot;Send.UnicastBytes_u64&quot;: 0,
+    &quot;Send.UnicastCount_u64&quot;: 0,
+    &quot;UsePolicy_bool&quot;: false,
+    &quot;policy:Access_bool&quot;: false,
+    &quot;policy:DHCPFilter_bool&quot;: false,
+    &quot;policy:DHCPNoServer_bool&quot;: false,
+    &quot;policy:DHCPForce_bool&quot;: false,
+    &quot;policy:NoBridge_bool&quot;: false,
+    &quot;policy:NoRouting_bool&quot;: false,
+    &quot;policy:CheckMac_bool&quot;: false,
+    &quot;policy:CheckIP_bool&quot;: false,
+    &quot;policy:ArpDhcpOnly_bool&quot;: false,
+    &quot;policy:PrivacyFilter_bool&quot;: false,
+    &quot;policy:NoServer_bool&quot;: false,
+    &quot;policy:NoBroadcastLimiter_bool&quot;: false,
+    &quot;policy:MonitorPort_bool&quot;: false,
+    &quot;policy:MaxConnection_u32&quot;: 0,
+    &quot;policy:TimeOut_u32&quot;: 0,
+    &quot;policy:MaxMac_u32&quot;: 0,
+    &quot;policy:MaxIP_u32&quot;: 0,
+    &quot;policy:MaxUpload_u32&quot;: 0,
+    &quot;policy:MaxDownload_u32&quot;: 0,
+    &quot;policy:FixPassword_bool&quot;: false,
+    &quot;policy:MultiLogins_u32&quot;: 0,
+    &quot;policy:NoQoS_bool&quot;: false,
+    &quot;policy:RSandRAFilter_bool&quot;: false,
+    &quot;policy:RAFilter_bool&quot;: false,
+    &quot;policy:DHCPv6Filter_bool&quot;: false,
+    &quot;policy:DHCPv6NoServer_bool&quot;: false,
+    &quot;policy:NoRoutingV6_bool&quot;: false,
+    &quot;policy:CheckIPv6_bool&quot;: false,
+    &quot;policy:NoServerV6_bool&quot;: false,
+    &quot;policy:MaxIPv6_u32&quot;: 0,
+    &quot;policy:NoSavePassword_bool&quot;: false,
+    &quot;policy:AutoDisconnect_u32&quot;: 0,
+    &quot;policy:FilterIPv4_bool&quot;: false,
+    &quot;policy:FilterIPv6_bool&quot;: false,
+    &quot;policy:FilterNonIP_bool&quot;: false,
+    &quot;policy:NoIPv6DefaultRouterInRA_bool&quot;: false,
+    &quot;policy:NoIPv6DefaultRouterInRAWhenIPv6_bool&quot;: false,
+    &quot;policy:VLanId_u32&quot;: 0,
+    &quot;policy:Ver3_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="parameters-54">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The group name</td>
+</tr>
+<tr>
+<td><code>Realname_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Optional real name (full name) of the group, allow using any Unicode characters</td>
+</tr>
+<tr>
+<td><code>Note_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Optional, specify a description of the group</td>
+</tr>
+<tr>
+<td><code>Recv.BroadcastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Number of broadcast packets (Recv)</td>
+</tr>
+<tr>
+<td><code>Recv.BroadcastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Broadcast bytes (Recv)</td>
+</tr>
+<tr>
+<td><code>Recv.UnicastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast count (Recv)</td>
+</tr>
+<tr>
+<td><code>Recv.UnicastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Recv)</td>
+</tr>
+<tr>
+<td><code>Send.BroadcastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Number of broadcast packets (Send)</td>
+</tr>
+<tr>
+<td><code>Send.BroadcastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Broadcast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>Send.UnicastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>Send.UnicastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>UsePolicy_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag whether to use security policy</td>
+</tr>
+<tr>
+<td><code>policy:Access_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPNoServer_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPForce_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side.</td>
+</tr>
+<tr>
+<td><code>policy:NoBridge_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible.</td>
+</tr>
+<tr>
+<td><code>policy:NoRouting_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.</td>
+</tr>
+<tr>
+<td><code>policy:CheckMac_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.</td>
+</tr>
+<tr>
+<td><code>policy:CheckIP_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.</td>
+</tr>
+<tr>
+<td><code>policy:ArpDhcpOnly_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting.</td>
+</tr>
+<tr>
+<td><code>policy:PrivacyFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:NoServer_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4.</td>
+</tr>
+<tr>
+<td><code>policy:NoBroadcastLimiter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting.</td>
+</tr>
+<tr>
+<td><code>policy:MonitorPort_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>policy:MaxConnection_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session.</td>
+</tr>
+<tr>
+<td><code>policy:TimeOut_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server.</td>
+</tr>
+<tr>
+<td><code>policy:MaxMac_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session.</td>
+</tr>
+<tr>
+<td><code>policy:MaxIP_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session.</td>
+</tr>
+<tr>
+<td><code>policy:MaxUpload_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>policy:MaxDownload_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>policy:FixPassword_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar.</td>
+</tr>
+<tr>
+<td><code>policy:MultiLogins_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy.</td>
+</tr>
+<tr>
+<td><code>policy:NoQoS_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions.</td>
+</tr>
+<tr>
+<td><code>policy:RSandRAFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection.</td>
+</tr>
+<tr>
+<td><code>policy:RAFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPv6Filter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPv6NoServer_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients.</td>
+</tr>
+<tr>
+<td><code>policy:NoRoutingV6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.</td>
+</tr>
+<tr>
+<td><code>policy:CheckIPv6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.</td>
+</tr>
+<tr>
+<td><code>policy:NoServerV6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6.</td>
+</tr>
+<tr>
+<td><code>policy:MaxIPv6_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session.</td>
+</tr>
+<tr>
+<td><code>policy:NoSavePassword_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using <em>standard</em> password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access.</td>
+</tr>
+<tr>
+<td><code>policy:AutoDisconnect_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access.</td>
+</tr>
+<tr>
+<td><code>policy:FilterIPv4_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:FilterIPv6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:FilterNonIP_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. &quot;Non-IP packet&quot; mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets.</td>
+</tr>
+<tr>
+<td><code>policy:NoIPv6DefaultRouterInRA_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.</td>
+</tr>
+<tr>
+<td><code>policy:NoIPv6DefaultRouterInRAWhenIPv6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.</td>
+</tr>
+<tr>
+<td><code>policy:VLanId_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing.</td>
+</tr>
+<tr>
+<td><code>policy:Ver3_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Whether version 3.0 (must be true)</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getgroup"></a></p>
+<h2 id="getgroup-rpc-api-get-group-setting-sync-mode">&quot;GetGroup&quot; RPC API - Get Group Setting (Sync mode)</h2>
+<h3 id="description-55">Description</h3>
+<p>Get Group Setting (Sync mode). Use this to get the setting of a group that is registered on the security account database of the currently managed Virtual Hub. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.</p>
+<h3 id="input-json-rpc-format-55">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetGroup&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Name_str&quot;: &quot;name&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-55">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Name_str&quot;: &quot;name&quot;,
+    &quot;Realname_utf&quot;: &quot;realname&quot;,
+    &quot;Note_utf&quot;: &quot;note&quot;,
+    &quot;Recv.BroadcastBytes_u64&quot;: 0,
+    &quot;Recv.BroadcastCount_u64&quot;: 0,
+    &quot;Recv.UnicastBytes_u64&quot;: 0,
+    &quot;Recv.UnicastCount_u64&quot;: 0,
+    &quot;Send.BroadcastBytes_u64&quot;: 0,
+    &quot;Send.BroadcastCount_u64&quot;: 0,
+    &quot;Send.UnicastBytes_u64&quot;: 0,
+    &quot;Send.UnicastCount_u64&quot;: 0,
+    &quot;UsePolicy_bool&quot;: false,
+    &quot;policy:Access_bool&quot;: false,
+    &quot;policy:DHCPFilter_bool&quot;: false,
+    &quot;policy:DHCPNoServer_bool&quot;: false,
+    &quot;policy:DHCPForce_bool&quot;: false,
+    &quot;policy:NoBridge_bool&quot;: false,
+    &quot;policy:NoRouting_bool&quot;: false,
+    &quot;policy:CheckMac_bool&quot;: false,
+    &quot;policy:CheckIP_bool&quot;: false,
+    &quot;policy:ArpDhcpOnly_bool&quot;: false,
+    &quot;policy:PrivacyFilter_bool&quot;: false,
+    &quot;policy:NoServer_bool&quot;: false,
+    &quot;policy:NoBroadcastLimiter_bool&quot;: false,
+    &quot;policy:MonitorPort_bool&quot;: false,
+    &quot;policy:MaxConnection_u32&quot;: 0,
+    &quot;policy:TimeOut_u32&quot;: 0,
+    &quot;policy:MaxMac_u32&quot;: 0,
+    &quot;policy:MaxIP_u32&quot;: 0,
+    &quot;policy:MaxUpload_u32&quot;: 0,
+    &quot;policy:MaxDownload_u32&quot;: 0,
+    &quot;policy:FixPassword_bool&quot;: false,
+    &quot;policy:MultiLogins_u32&quot;: 0,
+    &quot;policy:NoQoS_bool&quot;: false,
+    &quot;policy:RSandRAFilter_bool&quot;: false,
+    &quot;policy:RAFilter_bool&quot;: false,
+    &quot;policy:DHCPv6Filter_bool&quot;: false,
+    &quot;policy:DHCPv6NoServer_bool&quot;: false,
+    &quot;policy:NoRoutingV6_bool&quot;: false,
+    &quot;policy:CheckIPv6_bool&quot;: false,
+    &quot;policy:NoServerV6_bool&quot;: false,
+    &quot;policy:MaxIPv6_u32&quot;: 0,
+    &quot;policy:NoSavePassword_bool&quot;: false,
+    &quot;policy:AutoDisconnect_u32&quot;: 0,
+    &quot;policy:FilterIPv4_bool&quot;: false,
+    &quot;policy:FilterIPv6_bool&quot;: false,
+    &quot;policy:FilterNonIP_bool&quot;: false,
+    &quot;policy:NoIPv6DefaultRouterInRA_bool&quot;: false,
+    &quot;policy:NoIPv6DefaultRouterInRAWhenIPv6_bool&quot;: false,
+    &quot;policy:VLanId_u32&quot;: 0,
+    &quot;policy:Ver3_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="parameters-55">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The group name</td>
+</tr>
+<tr>
+<td><code>Realname_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Optional real name (full name) of the group, allow using any Unicode characters</td>
+</tr>
+<tr>
+<td><code>Note_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Optional, specify a description of the group</td>
+</tr>
+<tr>
+<td><code>Recv.BroadcastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Number of broadcast packets (Recv)</td>
+</tr>
+<tr>
+<td><code>Recv.BroadcastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Broadcast bytes (Recv)</td>
+</tr>
+<tr>
+<td><code>Recv.UnicastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast count (Recv)</td>
+</tr>
+<tr>
+<td><code>Recv.UnicastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Recv)</td>
+</tr>
+<tr>
+<td><code>Send.BroadcastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Number of broadcast packets (Send)</td>
+</tr>
+<tr>
+<td><code>Send.BroadcastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Broadcast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>Send.UnicastBytes_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>Send.UnicastCount_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Unicast bytes (Send)</td>
+</tr>
+<tr>
+<td><code>UsePolicy_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag whether to use security policy</td>
+</tr>
+<tr>
+<td><code>policy:Access_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPNoServer_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPForce_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side.</td>
+</tr>
+<tr>
+<td><code>policy:NoBridge_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible.</td>
+</tr>
+<tr>
+<td><code>policy:NoRouting_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.</td>
+</tr>
+<tr>
+<td><code>policy:CheckMac_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.</td>
+</tr>
+<tr>
+<td><code>policy:CheckIP_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.</td>
+</tr>
+<tr>
+<td><code>policy:ArpDhcpOnly_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting.</td>
+</tr>
+<tr>
+<td><code>policy:PrivacyFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:NoServer_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4.</td>
+</tr>
+<tr>
+<td><code>policy:NoBroadcastLimiter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting.</td>
+</tr>
+<tr>
+<td><code>policy:MonitorPort_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>policy:MaxConnection_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session.</td>
+</tr>
+<tr>
+<td><code>policy:TimeOut_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server.</td>
+</tr>
+<tr>
+<td><code>policy:MaxMac_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session.</td>
+</tr>
+<tr>
+<td><code>policy:MaxIP_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session.</td>
+</tr>
+<tr>
+<td><code>policy:MaxUpload_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>policy:MaxDownload_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>policy:FixPassword_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar.</td>
+</tr>
+<tr>
+<td><code>policy:MultiLogins_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy.</td>
+</tr>
+<tr>
+<td><code>policy:NoQoS_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions.</td>
+</tr>
+<tr>
+<td><code>policy:RSandRAFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection.</td>
+</tr>
+<tr>
+<td><code>policy:RAFilter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPv6Filter_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:DHCPv6NoServer_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients.</td>
+</tr>
+<tr>
+<td><code>policy:NoRoutingV6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.</td>
+</tr>
+<tr>
+<td><code>policy:CheckIPv6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.</td>
+</tr>
+<tr>
+<td><code>policy:NoServerV6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6.</td>
+</tr>
+<tr>
+<td><code>policy:MaxIPv6_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session.</td>
+</tr>
+<tr>
+<td><code>policy:NoSavePassword_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using <em>standard</em> password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access.</td>
+</tr>
+<tr>
+<td><code>policy:AutoDisconnect_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access.</td>
+</tr>
+<tr>
+<td><code>policy:FilterIPv4_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:FilterIPv6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered.</td>
+</tr>
+<tr>
+<td><code>policy:FilterNonIP_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. &quot;Non-IP packet&quot; mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets.</td>
+</tr>
+<tr>
+<td><code>policy:NoIPv6DefaultRouterInRA_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.</td>
+</tr>
+<tr>
+<td><code>policy:NoIPv6DefaultRouterInRAWhenIPv6_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.</td>
+</tr>
+<tr>
+<td><code>policy:VLanId_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing.</td>
+</tr>
+<tr>
+<td><code>policy:Ver3_bool</code></td>
+<td><code>boolean</code></td>
+<td>Security policy: Whether version 3.0 (must be true)</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="deletegroup"></a></p>
+<h2 id="deletegroup-rpc-api-delete-user-from-group">&quot;DeleteGroup&quot; RPC API - Delete User from Group</h2>
+<h3 id="description-56">Description</h3>
+<p>Delete User from Group. Use this to delete a specified user from the group that is registered on the security account database of the currently managed Virtual Hub. By deleting a user from the group, that user becomes unassigned. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.</p>
+<h3 id="input-json-rpc-format-56">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;DeleteGroup&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Name_str&quot;: &quot;name&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-56">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Name_str&quot;: &quot;name&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-56">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>User or group name</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="enumgroup"></a></p>
+<h2 id="enumgroup-rpc-api-get-list-of-groups">&quot;EnumGroup&quot; RPC API - Get List of Groups</h2>
+<h3 id="description-57">Description</h3>
+<p>Get List of Groups. Use this to get a list of groups that are registered on the security account database of the currently managed Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.</p>
+<h3 id="input-json-rpc-format-57">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;EnumGroup&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-57">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;GroupList&quot;: [
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;Realname_utf&quot;: &quot;realname&quot;,
+        &quot;Note_utf&quot;: &quot;note&quot;,
+        &quot;NumUsers_u32&quot;: 0,
+        &quot;DenyAccess_bool&quot;: false
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;Realname_utf&quot;: &quot;realname&quot;,
+        &quot;Note_utf&quot;: &quot;note&quot;,
+        &quot;NumUsers_u32&quot;: 0,
+        &quot;DenyAccess_bool&quot;: false
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;Realname_utf&quot;: &quot;realname&quot;,
+        &quot;Note_utf&quot;: &quot;note&quot;,
+        &quot;NumUsers_u32&quot;: 0,
+        &quot;DenyAccess_bool&quot;: false
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-57">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>GroupList</code></td>
+<td><code>Array object</code></td>
+<td>Group list</td>
+</tr>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>User name</td>
+</tr>
+<tr>
+<td><code>Realname_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Real name</td>
+</tr>
+<tr>
+<td><code>Note_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Note</td>
+</tr>
+<tr>
+<td><code>NumUsers_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of users</td>
+</tr>
+<tr>
+<td><code>DenyAccess_bool</code></td>
+<td><code>boolean</code></td>
+<td>Access denied</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="enumsession"></a></p>
+<h2 id="enumsession-rpc-api-get-list-of-connected-vpn-sessions">&quot;EnumSession&quot; RPC API - Get List of Connected VPN Sessions</h2>
+<h3 id="description-58">Description</h3>
+<p>Get List of Connected VPN Sessions. Use this to get a list of the sessions connected to the Virtual Hub currently being managed. In the list of sessions, the following information will be obtained for each connection: Session Name, Session Site, User Name, Source Host Name, TCP Connection, Transfer Bytes and Transfer Packets. If the currently connected VPN Server is a cluster controller and the currently managed Virtual Hub is a static Virtual Hub, you can get an all-linked-together list of all sessions connected to that Virtual Hub on all cluster members. In all other cases, only the list of sessions that are actually connected to the currently managed VPN Server will be obtained.</p>
+<h3 id="input-json-rpc-format-58">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;EnumSession&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-58">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;SessionList&quot;: [
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;RemoteSession_bool&quot;: false,
+        &quot;RemoteHostname_str&quot;: &quot;remotehostname&quot;,
+        &quot;Username_str&quot;: &quot;username&quot;,
+        &quot;ClientIP_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;Hostname_str&quot;: &quot;hostname&quot;,
+        &quot;MaxNumTcp_u32&quot;: 0,
+        &quot;CurrentNumTcp_u32&quot;: 0,
+        &quot;PacketSize_u64&quot;: 0,
+        &quot;PacketNum_u64&quot;: 0,
+        &quot;LinkMode_bool&quot;: false,
+        &quot;SecureNATMode_bool&quot;: false,
+        &quot;BridgeMode_bool&quot;: false,
+        &quot;Layer3Mode_bool&quot;: false,
+        &quot;Client_BridgeMode_bool&quot;: false,
+        &quot;Client_MonitorMode_bool&quot;: false,
+        &quot;VLanId_u32&quot;: 0,
+        &quot;UniqueId_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CreatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;LastCommTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;RemoteSession_bool&quot;: false,
+        &quot;RemoteHostname_str&quot;: &quot;remotehostname&quot;,
+        &quot;Username_str&quot;: &quot;username&quot;,
+        &quot;ClientIP_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;Hostname_str&quot;: &quot;hostname&quot;,
+        &quot;MaxNumTcp_u32&quot;: 0,
+        &quot;CurrentNumTcp_u32&quot;: 0,
+        &quot;PacketSize_u64&quot;: 0,
+        &quot;PacketNum_u64&quot;: 0,
+        &quot;LinkMode_bool&quot;: false,
+        &quot;SecureNATMode_bool&quot;: false,
+        &quot;BridgeMode_bool&quot;: false,
+        &quot;Layer3Mode_bool&quot;: false,
+        &quot;Client_BridgeMode_bool&quot;: false,
+        &quot;Client_MonitorMode_bool&quot;: false,
+        &quot;VLanId_u32&quot;: 0,
+        &quot;UniqueId_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CreatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;LastCommTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;RemoteSession_bool&quot;: false,
+        &quot;RemoteHostname_str&quot;: &quot;remotehostname&quot;,
+        &quot;Username_str&quot;: &quot;username&quot;,
+        &quot;ClientIP_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;Hostname_str&quot;: &quot;hostname&quot;,
+        &quot;MaxNumTcp_u32&quot;: 0,
+        &quot;CurrentNumTcp_u32&quot;: 0,
+        &quot;PacketSize_u64&quot;: 0,
+        &quot;PacketNum_u64&quot;: 0,
+        &quot;LinkMode_bool&quot;: false,
+        &quot;SecureNATMode_bool&quot;: false,
+        &quot;BridgeMode_bool&quot;: false,
+        &quot;Layer3Mode_bool&quot;: false,
+        &quot;Client_BridgeMode_bool&quot;: false,
+        &quot;Client_MonitorMode_bool&quot;: false,
+        &quot;VLanId_u32&quot;: 0,
+        &quot;UniqueId_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CreatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;LastCommTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-58">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>SessionList</code></td>
+<td><code>Array object</code></td>
+<td>VPN sessions list</td>
+</tr>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Session name</td>
+</tr>
+<tr>
+<td><code>RemoteSession_bool</code></td>
+<td><code>boolean</code></td>
+<td>Remote session</td>
+</tr>
+<tr>
+<td><code>RemoteHostname_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Remote server name</td>
+</tr>
+<tr>
+<td><code>Username_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>User name</td>
+</tr>
+<tr>
+<td><code>ClientIP_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>IP address</td>
+</tr>
+<tr>
+<td><code>Hostname_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Host name</td>
+</tr>
+<tr>
+<td><code>MaxNumTcp_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Maximum number of underlying TCP connections</td>
+</tr>
+<tr>
+<td><code>CurrentNumTcp_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of current underlying TCP connections</td>
+</tr>
+<tr>
+<td><code>PacketSize_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Packet size transmitted</td>
+</tr>
+<tr>
+<td><code>PacketNum_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Number of packets transmitted</td>
+</tr>
+<tr>
+<td><code>LinkMode_bool</code></td>
+<td><code>boolean</code></td>
+<td>Is a Cascade VPN session</td>
+</tr>
+<tr>
+<td><code>SecureNATMode_bool</code></td>
+<td><code>boolean</code></td>
+<td>Is a SecureNAT VPN session</td>
+</tr>
+<tr>
+<td><code>BridgeMode_bool</code></td>
+<td><code>boolean</code></td>
+<td>Is the VPN session for Local Bridge</td>
+</tr>
+<tr>
+<td><code>Layer3Mode_bool</code></td>
+<td><code>boolean</code></td>
+<td>Is a Layer-3 Switch VPN session</td>
+</tr>
+<tr>
+<td><code>Client_BridgeMode_bool</code></td>
+<td><code>boolean</code></td>
+<td>Is in Bridge Mode</td>
+</tr>
+<tr>
+<td><code>Client_MonitorMode_bool</code></td>
+<td><code>boolean</code></td>
+<td>Is in Monitor Mode</td>
+</tr>
+<tr>
+<td><code>VLanId_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>VLAN ID</td>
+</tr>
+<tr>
+<td><code>UniqueId_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Unique ID of the VPN Session</td>
+</tr>
+<tr>
+<td><code>CreatedTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Creation date and time</td>
+</tr>
+<tr>
+<td><code>LastCommTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Last communication date and time</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getsessionstatus"></a></p>
+<h2 id="getsessionstatus-rpc-api-get-session-status">&quot;GetSessionStatus&quot; RPC API - Get Session Status</h2>
+<h3 id="description-59">Description</h3>
+<p>Get Session Status. Use this to specify a session currently connected to the currently managed Virtual Hub and get the session information. The session status includes the following: source host name and user name, version information, time information, number of TCP connections, communication parameters, session key, statistical information on data transferred, and other client and server information. To get the list of currently connected sessions, use the EnumSession API.</p>
+<h3 id="input-json-rpc-format-59">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetSessionStatus&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Name_str&quot;: &quot;name&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-59">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Name_str&quot;: &quot;name&quot;,
+    &quot;Username_str&quot;: &quot;username&quot;,
+    &quot;RealUsername_str&quot;: &quot;realusername&quot;,
+    &quot;GroupName_str&quot;: &quot;groupname&quot;,
+    &quot;LinkMode_bool&quot;: false,
+    &quot;Client_Ip_Address_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;SessionStatus_ClientHostName_str&quot;: &quot;clienthostname&quot;,
+    &quot;Active_bool&quot;: false,
+    &quot;Connected_bool&quot;: false,
+    &quot;SessionStatus_u32&quot;: 0,
+    &quot;ServerName_str&quot;: &quot;servername&quot;,
+    &quot;ServerPort_u32&quot;: 0,
+    &quot;ServerProductName_str&quot;: &quot;serverproductname&quot;,
+    &quot;ServerProductVer_u32&quot;: 0,
+    &quot;ServerProductBuild_u32&quot;: 0,
+    &quot;StartTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;FirstConnectionEstablisiedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;CurrentConnectionEstablishTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+    &quot;NumConnectionsEatablished_u32&quot;: 0,
+    &quot;HalfConnection_bool&quot;: false,
+    &quot;QoS_bool&quot;: false,
+    &quot;MaxTcpConnections_u32&quot;: 0,
+    &quot;NumTcpConnections_u32&quot;: 0,
+    &quot;NumTcpConnectionsUpload_u32&quot;: 0,
+    &quot;NumTcpConnectionsDownload_u32&quot;: 0,
+    &quot;UseEncrypt_bool&quot;: false,
+    &quot;CipherName_str&quot;: &quot;ciphername&quot;,
+    &quot;UseCompress_bool&quot;: false,
+    &quot;IsRUDPSession_bool&quot;: false,
+    &quot;UnderlayProtocol_str&quot;: &quot;underlayprotocol&quot;,
+    &quot;IsUdpAccelerationEnabled_bool&quot;: false,
+    &quot;IsUsingUdpAcceleration_bool&quot;: false,
+    &quot;SessionName_str&quot;: &quot;sessionname&quot;,
+    &quot;ConnectionName_str&quot;: &quot;connectionname&quot;,
+    &quot;SessionKey_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;TotalSendSize_u64&quot;: 0,
+    &quot;TotalRecvSize_u64&quot;: 0,
+    &quot;TotalSendSizeReal_u64&quot;: 0,
+    &quot;TotalRecvSizeReal_u64&quot;: 0,
+    &quot;IsBridgeMode_bool&quot;: false,
+    &quot;IsMonitorMode_bool&quot;: false,
+    &quot;VLanId_u32&quot;: 0,
+    &quot;ClientProductName_str&quot;: &quot;clientproductname&quot;,
+    &quot;ClientProductVer_u32&quot;: 0,
+    &quot;ClientProductBuild_u32&quot;: 0,
+    &quot;ClientOsName_str&quot;: &quot;clientosname&quot;,
+    &quot;ClientOsVer_str&quot;: &quot;clientosver&quot;,
+    &quot;ClientOsProductId_str&quot;: &quot;clientosproductid&quot;,
+    &quot;ClientHostname_str&quot;: &quot;clienthostname&quot;,
+    &quot;UniqueId_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-59">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>VPN session name</td>
+</tr>
+<tr>
+<td><code>Username_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>User name</td>
+</tr>
+<tr>
+<td><code>RealUsername_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Real user name which was used for the authentication</td>
+</tr>
+<tr>
+<td><code>GroupName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Group name</td>
+</tr>
+<tr>
+<td><code>LinkMode_bool</code></td>
+<td><code>boolean</code></td>
+<td>Is Cascade Session</td>
+</tr>
+<tr>
+<td><code>Client_Ip_Address_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Client IP address</td>
+</tr>
+<tr>
+<td><code>SessionStatus_ClientHostName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Client host name</td>
+</tr>
+<tr>
+<td><code>Active_bool</code></td>
+<td><code>boolean</code></td>
+<td>Operation flag</td>
+</tr>
+<tr>
+<td><code>Connected_bool</code></td>
+<td><code>boolean</code></td>
+<td>Connected flag</td>
+</tr>
+<tr>
+<td><code>SessionStatus_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>State of the client session<BR>Values:<BR><code>0</code>: Connecting<BR><code>1</code>: Negotiating<BR><code>2</code>: During user authentication<BR><code>3</code>: Connection complete<BR><code>4</code>: Wait to retry<BR><code>5</code>: Idle state</td>
+</tr>
+<tr>
+<td><code>ServerName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Server name</td>
+</tr>
+<tr>
+<td><code>ServerPort_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Port number of the server</td>
+</tr>
+<tr>
+<td><code>ServerProductName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Server product name</td>
+</tr>
+<tr>
+<td><code>ServerProductVer_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Server product version</td>
+</tr>
+<tr>
+<td><code>ServerProductBuild_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Server product build number</td>
+</tr>
+<tr>
+<td><code>StartTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Connection start time</td>
+</tr>
+<tr>
+<td><code>FirstConnectionEstablisiedTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Connection completion time of the first connection</td>
+</tr>
+<tr>
+<td><code>CurrentConnectionEstablishTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Connection completion time of this connection</td>
+</tr>
+<tr>
+<td><code>NumConnectionsEatablished_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of connections have been established so far</td>
+</tr>
+<tr>
+<td><code>HalfConnection_bool</code></td>
+<td><code>boolean</code></td>
+<td>Half-connection</td>
+</tr>
+<tr>
+<td><code>QoS_bool</code></td>
+<td><code>boolean</code></td>
+<td>VoIP / QoS</td>
+</tr>
+<tr>
+<td><code>MaxTcpConnections_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Maximum number of the underlying TCP connections</td>
+</tr>
+<tr>
+<td><code>NumTcpConnections_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of current underlying TCP connections</td>
+</tr>
+<tr>
+<td><code>NumTcpConnectionsUpload_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of inbound underlying connections</td>
+</tr>
+<tr>
+<td><code>NumTcpConnectionsDownload_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of outbound underlying connections</td>
+</tr>
+<tr>
+<td><code>UseEncrypt_bool</code></td>
+<td><code>boolean</code></td>
+<td>Use of encryption</td>
+</tr>
+<tr>
+<td><code>CipherName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Cipher algorithm name</td>
+</tr>
+<tr>
+<td><code>UseCompress_bool</code></td>
+<td><code>boolean</code></td>
+<td>Use of compression</td>
+</tr>
+<tr>
+<td><code>IsRUDPSession_bool</code></td>
+<td><code>boolean</code></td>
+<td>Is R-UDP session</td>
+</tr>
+<tr>
+<td><code>UnderlayProtocol_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Physical underlying communication protocol</td>
+</tr>
+<tr>
+<td><code>IsUdpAccelerationEnabled_bool</code></td>
+<td><code>boolean</code></td>
+<td>The UDP acceleration is enabled</td>
+</tr>
+<tr>
+<td><code>IsUsingUdpAcceleration_bool</code></td>
+<td><code>boolean</code></td>
+<td>Using the UDP acceleration function</td>
+</tr>
+<tr>
+<td><code>SessionName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>VPN session name</td>
+</tr>
+<tr>
+<td><code>ConnectionName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Connection name</td>
+</tr>
+<tr>
+<td><code>SessionKey_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Session key</td>
+</tr>
+<tr>
+<td><code>TotalSendSize_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Total transmitted data size</td>
+</tr>
+<tr>
+<td><code>TotalRecvSize_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Total received data size</td>
+</tr>
+<tr>
+<td><code>TotalSendSizeReal_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Total transmitted data size (no compression)</td>
+</tr>
+<tr>
+<td><code>TotalRecvSizeReal_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Total received data size (no compression)</td>
+</tr>
+<tr>
+<td><code>IsBridgeMode_bool</code></td>
+<td><code>boolean</code></td>
+<td>Is Bridge Mode</td>
+</tr>
+<tr>
+<td><code>IsMonitorMode_bool</code></td>
+<td><code>boolean</code></td>
+<td>Is Monitor mode</td>
+</tr>
+<tr>
+<td><code>VLanId_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>VLAN ID</td>
+</tr>
+<tr>
+<td><code>ClientProductName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Client product name</td>
+</tr>
+<tr>
+<td><code>ClientProductVer_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Client version</td>
+</tr>
+<tr>
+<td><code>ClientProductBuild_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Client build number</td>
+</tr>
+<tr>
+<td><code>ClientOsName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Client OS name</td>
+</tr>
+<tr>
+<td><code>ClientOsVer_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Client OS version</td>
+</tr>
+<tr>
+<td><code>ClientOsProductId_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Client OS Product ID</td>
+</tr>
+<tr>
+<td><code>ClientHostname_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Client host name</td>
+</tr>
+<tr>
+<td><code>UniqueId_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Unique ID</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="deletesession"></a></p>
+<h2 id="deletesession-rpc-api-disconnect-session">&quot;DeleteSession&quot; RPC API - Disconnect Session</h2>
+<h3 id="description-60">Description</h3>
+<p>Disconnect Session. Use this to specify a session currently connected to the currently managed Virtual Hub and forcefully disconnect that session using manager privileges. Note that when communication is disconnected by settings on the source client side and the automatically reconnect option is enabled, it is possible that the client will reconnect. To get the list of currently connected sessions, use the EnumSession API.</p>
+<h3 id="input-json-rpc-format-60">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;DeleteSession&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Name_str&quot;: &quot;name&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-60">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Name_str&quot;: &quot;name&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-60">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Session name</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="enummactable"></a></p>
+<h2 id="enummactable-rpc-api-get-the-mac-address-table-database">&quot;EnumMacTable&quot; RPC API - Get the MAC Address Table Database</h2>
+<h3 id="description-61">Description</h3>
+<p>Get the MAC Address Table Database. Use this to get the MAC address table database that is held by the currently managed Virtual Hub. The MAC address table database is a table that the Virtual Hub requires to perform the action of switching Ethernet frames and the Virtual Hub decides the sorting destination session of each Ethernet frame based on the MAC address table database. The MAC address database is built by the Virtual Hub automatically analyzing the contents of the communication.</p>
+<h3 id="input-json-rpc-format-61">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;EnumMacTable&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-61">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;MacTable&quot;: [
+      {
+        &quot;Key_u32&quot;: 0,
+        &quot;SessionName_str&quot;: &quot;sessionname&quot;,
+        &quot;MacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CreatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;UpdatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;RemoteItem_bool&quot;: false,
+        &quot;RemoteHostname_str&quot;: &quot;remotehostname&quot;,
+        &quot;VlanId_u32&quot;: 0
+      },
+      {
+        &quot;Key_u32&quot;: 0,
+        &quot;SessionName_str&quot;: &quot;sessionname&quot;,
+        &quot;MacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CreatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;UpdatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;RemoteItem_bool&quot;: false,
+        &quot;RemoteHostname_str&quot;: &quot;remotehostname&quot;,
+        &quot;VlanId_u32&quot;: 0
+      },
+      {
+        &quot;Key_u32&quot;: 0,
+        &quot;SessionName_str&quot;: &quot;sessionname&quot;,
+        &quot;MacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;CreatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;UpdatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;RemoteItem_bool&quot;: false,
+        &quot;RemoteHostname_str&quot;: &quot;remotehostname&quot;,
+        &quot;VlanId_u32&quot;: 0
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-61">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>MacTable</code></td>
+<td><code>Array object</code></td>
+<td>MAC table</td>
+</tr>
+<tr>
+<td><code>Key_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Key ID</td>
+</tr>
+<tr>
+<td><code>SessionName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Session name</td>
+</tr>
+<tr>
+<td><code>MacAddress_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>MAC address</td>
+</tr>
+<tr>
+<td><code>CreatedTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Creation date and time</td>
+</tr>
+<tr>
+<td><code>UpdatedTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Updating date</td>
+</tr>
+<tr>
+<td><code>RemoteItem_bool</code></td>
+<td><code>boolean</code></td>
+<td>Remote items</td>
+</tr>
+<tr>
+<td><code>RemoteHostname_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Remote host name</td>
+</tr>
+<tr>
+<td><code>VlanId_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>VLAN ID</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="deletemactable"></a></p>
+<h2 id="deletemactable-rpc-api-delete-mac-address-table-entry">&quot;DeleteMacTable&quot; RPC API - Delete MAC Address Table Entry</h2>
+<h3 id="description-62">Description</h3>
+<p>Delete MAC Address Table Entry. Use this API to operate the MAC address table database held by the currently managed Virtual Hub and delete a specified MAC address table entry from the database. To get the contents of the current MAC address table database use the EnumMacTable API.</p>
+<h3 id="input-json-rpc-format-62">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;DeleteMacTable&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Key_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-62">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Key_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="parameters-62">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Key_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Key ID</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="enumiptable"></a></p>
+<h2 id="enumiptable-rpc-api-get-the-ip-address-table-database">&quot;EnumIpTable&quot; RPC API - Get the IP Address Table Database</h2>
+<h3 id="description-63">Description</h3>
+<p>Get the IP Address Table Database. Use this to get the IP address table database that is held by the currently managed Virtual Hub. The IP address table database is a table that is automatically generated by analyzing the contents of communication so that the Virtual Hub can always know which session is using which IP address and it is frequently used by the engine that applies the Virtual Hub security policy. By specifying the session name you can get the IP address table entry that has been associated with that session.</p>
+<h3 id="input-json-rpc-format-63">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;EnumIpTable&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-63">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;IpTable&quot;: [
+      {
+        &quot;Key_u32&quot;: 0,
+        &quot;SessionName_str&quot;: &quot;sessionname&quot;,
+        &quot;IpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;DhcpAllocated_bool&quot;: false,
+        &quot;CreatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;UpdatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;RemoteItem_bool&quot;: false,
+        &quot;RemoteHostname_str&quot;: &quot;remotehostname&quot;
+      },
+      {
+        &quot;Key_u32&quot;: 0,
+        &quot;SessionName_str&quot;: &quot;sessionname&quot;,
+        &quot;IpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;DhcpAllocated_bool&quot;: false,
+        &quot;CreatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;UpdatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;RemoteItem_bool&quot;: false,
+        &quot;RemoteHostname_str&quot;: &quot;remotehostname&quot;
+      },
+      {
+        &quot;Key_u32&quot;: 0,
+        &quot;SessionName_str&quot;: &quot;sessionname&quot;,
+        &quot;IpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;DhcpAllocated_bool&quot;: false,
+        &quot;CreatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;UpdatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;RemoteItem_bool&quot;: false,
+        &quot;RemoteHostname_str&quot;: &quot;remotehostname&quot;
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-63">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>IpTable</code></td>
+<td><code>Array object</code></td>
+<td>MAC table</td>
+</tr>
+<tr>
+<td><code>Key_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Key ID</td>
+</tr>
+<tr>
+<td><code>SessionName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Session name</td>
+</tr>
+<tr>
+<td><code>IpAddress_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>IP address</td>
+</tr>
+<tr>
+<td><code>DhcpAllocated_bool</code></td>
+<td><code>boolean</code></td>
+<td>Assigned by the DHCP</td>
+</tr>
+<tr>
+<td><code>CreatedTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Creation date and time</td>
+</tr>
+<tr>
+<td><code>UpdatedTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Updating date</td>
+</tr>
+<tr>
+<td><code>RemoteItem_bool</code></td>
+<td><code>boolean</code></td>
+<td>Remote items</td>
+</tr>
+<tr>
+<td><code>RemoteHostname_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Remote host name</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="deleteiptable"></a></p>
+<h2 id="deleteiptable-rpc-api-delete-ip-address-table-entry">&quot;DeleteIpTable&quot; RPC API - Delete IP Address Table Entry</h2>
+<h3 id="description-64">Description</h3>
+<p>Delete IP Address Table Entry. Use this API to operate the IP address table database held by the currently managed Virtual Hub and delete a specified IP address table entry from the database. To get the contents of the current IP address table database use the EnumIpTable API.</p>
+<h3 id="input-json-rpc-format-64">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;DeleteIpTable&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Key_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-64">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Key_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="parameters-64">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Key_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Key ID</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="setkeep"></a></p>
+<h2 id="setkeep-rpc-api-set-the-keep-alive-internet-connection-function">&quot;SetKeep&quot; RPC API - Set the Keep Alive Internet Connection Function</h2>
+<h3 id="description-65">Description</h3>
+<p>Set the Keep Alive Internet Connection Function. Use this to set the destination host name etc. of the Keep Alive Internet Connection Function. For network connection environments where connections will automatically be disconnected where there are periods of no communication that are longer than a set period, by using the Keep Alive Internet Connection Function, it is possible to keep alive the Internet connection by sending packets to a nominated server on the Internet at set intervals. When using this API, you can specify the following: Host Name, Port Number, Packet Send Interval, and Protocol. Packets sent to keep alive the Internet connection will have random content and personal information that could identify a computer or user is not sent. You can use the SetKeep API to enable/disable the Keep Alive Internet Connection Function. To execute this API on a VPN Server or VPN Bridge, you must have administrator privileges.</p>
+<h3 id="input-json-rpc-format-65">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetKeep&quot;,
+  &quot;params&quot;: {
+    &quot;UseKeepConnect_bool&quot;: false,
+    &quot;KeepConnectHost_str&quot;: &quot;keepconnecthost&quot;,
+    &quot;KeepConnectPort_u32&quot;: 0,
+    &quot;KeepConnectProtocol_u32&quot;: 0,
+    &quot;KeepConnectInterval_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-65">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;UseKeepConnect_bool&quot;: false,
+    &quot;KeepConnectHost_str&quot;: &quot;keepconnecthost&quot;,
+    &quot;KeepConnectPort_u32&quot;: 0,
+    &quot;KeepConnectProtocol_u32&quot;: 0,
+    &quot;KeepConnectInterval_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="parameters-65">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>UseKeepConnect_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag to enable keep-alive to the Internet</td>
+</tr>
+<tr>
+<td><code>KeepConnectHost_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the host name or IP address of the destination</td>
+</tr>
+<tr>
+<td><code>KeepConnectPort_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Specify the port number of the destination</td>
+</tr>
+<tr>
+<td><code>KeepConnectProtocol_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Protocol type<BR>Values:<BR><code>0</code>: TCP<BR><code>1</code>: UDP</td>
+</tr>
+<tr>
+<td><code>KeepConnectInterval_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Interval Between Packets Sends (Seconds)</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getkeep"></a></p>
+<h2 id="getkeep-rpc-api-get-the-keep-alive-internet-connection-function">&quot;GetKeep&quot; RPC API - Get the Keep Alive Internet Connection Function</h2>
+<h3 id="description-66">Description</h3>
+<p>Get the Keep Alive Internet Connection Function. Use this to get the current setting contents of the Keep Alive Internet Connection Function. In addition to the destination's Host Name, Port Number, Packet Send Interval and Protocol, you can obtain the current enabled/disabled status of the Keep Alive Internet Connection Function.</p>
+<h3 id="input-json-rpc-format-66">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetKeep&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-66">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;UseKeepConnect_bool&quot;: false,
+    &quot;KeepConnectHost_str&quot;: &quot;keepconnecthost&quot;,
+    &quot;KeepConnectPort_u32&quot;: 0,
+    &quot;KeepConnectProtocol_u32&quot;: 0,
+    &quot;KeepConnectInterval_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="parameters-66">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>UseKeepConnect_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag to enable keep-alive to the Internet</td>
+</tr>
+<tr>
+<td><code>KeepConnectHost_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the host name or IP address of the destination</td>
+</tr>
+<tr>
+<td><code>KeepConnectPort_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Specify the port number of the destination</td>
+</tr>
+<tr>
+<td><code>KeepConnectProtocol_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Protocol type<BR>Values:<BR><code>0</code>: TCP<BR><code>1</code>: UDP</td>
+</tr>
+<tr>
+<td><code>KeepConnectInterval_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Interval Between Packets Sends (Seconds)</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="enablesecurenat"></a></p>
+<h2 id="enablesecurenat-rpc-api-enable-the-virtual-nat-and-dhcp-server-function-securenat-function">&quot;EnableSecureNAT&quot; RPC API - Enable the Virtual NAT and DHCP Server Function (SecureNAT Function)</h2>
+<h3 id="description-67">Description</h3>
+<p>Enable the Virtual NAT and DHCP Server Function (SecureNAT Function). Use this to enable the Virtual NAT and DHCP Server function (SecureNAT Function) on the currently managed Virtual Hub and begin its operation. Before executing this API, you must first check the setting contents of the current Virtual NAT function and DHCP Server function using the SetSecureNATOption API and GetSecureNATOption API. By enabling the SecureNAT function, you can virtually operate a NAT router (IP masquerade) and the DHCP Server function on a virtual network on the Virtual Hub. [Warning about SecureNAT Function] The SecureNAT function is recommended only for system administrators and people with a detailed knowledge of networks. If you use the SecureNAT function correctly, it is possible to achieve a safe form of remote access via a VPN. However when used in the wrong way, it can put the entire network in danger. Anyone who does not have a thorough knowledge of networks and anyone who does not have the network administrator's permission must not enable the SecureNAT function. For a detailed explanation of the SecureNAT function, please refer to the VPN Server's manual and online documentation. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-67">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;EnableSecureNAT&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-67">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-67">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="disablesecurenat"></a></p>
+<h2 id="disablesecurenat-rpc-api-disable-the-virtual-nat-and-dhcp-server-function-securenat-function">&quot;DisableSecureNAT&quot; RPC API - Disable the Virtual NAT and DHCP Server Function (SecureNAT Function)</h2>
+<h3 id="description-68">Description</h3>
+<p>Disable the Virtual NAT and DHCP Server Function (SecureNAT Function). Use this to disable the Virtual NAT and DHCP Server function (SecureNAT Function) on the currently managed Virtual Hub. By executing this API the Virtual NAT function immediately stops operating and the Virtual DHCP Server function deletes the DHCP lease database and stops the service. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-68">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;DisableSecureNAT&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-68">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-68">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="setsecurenatoption"></a></p>
+<h2 id="setsecurenatoption-rpc-api-change-settings-of-securenat-function">&quot;SetSecureNATOption&quot; RPC API - Change Settings of SecureNAT Function</h2>
+<h3 id="description-69">Description</h3>
+<p>Change Settings of SecureNAT Function. Use this to change and save the virtual host network interface settings, virtual NAT function settings and virtual DHCP server settings of the Virtual NAT and DHCP Server function (SecureNAT function) on the currently managed Virtual Hub. The SecureNAT function holds one virtual network adapter on the L2 segment inside the Virtual Hub and it has been assigned a MAC address and an IP address. By doing this, another host connected to the same L2 segment is able to communicate with the SecureNAT virtual host as if it is an actual IP host existing on the network. [Warning about SecureNAT Function] The SecureNAT function is recommended only for system administrators and people with a detailed knowledge of networks. If you use the SecureNAT function correctly, it is possible to achieve a safe form of remote access via a VPN. However when used in the wrong way, it can put the entire network in danger. Anyone who does not have a thorough knowledge of networks and anyone who does not have the network administrators permission must not enable the SecureNAT function. For a detailed explanation of the SecureNAT function, please refer to the VPN Server's manual and online documentation. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-69">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetSecureNATOption&quot;,
+  &quot;params&quot;: {
+    &quot;RpcHubName_str&quot;: &quot;rpchubname&quot;,
+    &quot;MacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;Ip_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;Mask_ip&quot;: &quot;255.255.255.255&quot;,
+    &quot;UseNat_bool&quot;: false,
+    &quot;Mtu_u32&quot;: 0,
+    &quot;NatTcpTimeout_u32&quot;: 0,
+    &quot;NatUdpTimeout_u32&quot;: 0,
+    &quot;UseDhcp_bool&quot;: false,
+    &quot;DhcpLeaseIPStart_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;DhcpLeaseIPEnd_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;DhcpSubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+    &quot;DhcpExpireTimeSpan_u32&quot;: 0,
+    &quot;DhcpGatewayAddress_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;DhcpDnsServerAddress_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;DhcpDnsServerAddress2_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;DhcpDomainName_str&quot;: &quot;dhcpdomainname&quot;,
+    &quot;SaveLog_bool&quot;: false,
+    &quot;ApplyDhcpPushRoutes_bool&quot;: false,
+    &quot;DhcpPushRoutes_str&quot;: &quot;dhcppushroutes&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-69">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;RpcHubName_str&quot;: &quot;rpchubname&quot;,
+    &quot;MacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;Ip_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;Mask_ip&quot;: &quot;255.255.255.255&quot;,
+    &quot;UseNat_bool&quot;: false,
+    &quot;Mtu_u32&quot;: 0,
+    &quot;NatTcpTimeout_u32&quot;: 0,
+    &quot;NatUdpTimeout_u32&quot;: 0,
+    &quot;UseDhcp_bool&quot;: false,
+    &quot;DhcpLeaseIPStart_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;DhcpLeaseIPEnd_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;DhcpSubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+    &quot;DhcpExpireTimeSpan_u32&quot;: 0,
+    &quot;DhcpGatewayAddress_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;DhcpDnsServerAddress_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;DhcpDnsServerAddress2_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;DhcpDomainName_str&quot;: &quot;dhcpdomainname&quot;,
+    &quot;SaveLog_bool&quot;: false,
+    &quot;ApplyDhcpPushRoutes_bool&quot;: false,
+    &quot;DhcpPushRoutes_str&quot;: &quot;dhcppushroutes&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-69">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>RpcHubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Target Virtual HUB name</td>
+</tr>
+<tr>
+<td><code>MacAddress_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>MAC address</td>
+</tr>
+<tr>
+<td><code>Ip_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>IP address</td>
+</tr>
+<tr>
+<td><code>Mask_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Subnet mask</td>
+</tr>
+<tr>
+<td><code>UseNat_bool</code></td>
+<td><code>boolean</code></td>
+<td>Use flag of the Virtual NAT function</td>
+</tr>
+<tr>
+<td><code>Mtu_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>MTU value (Standard: 1500)</td>
+</tr>
+<tr>
+<td><code>NatTcpTimeout_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>NAT TCP timeout in seconds</td>
+</tr>
+<tr>
+<td><code>NatUdpTimeout_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>NAT UDP timeout in seconds</td>
+</tr>
+<tr>
+<td><code>UseDhcp_bool</code></td>
+<td><code>boolean</code></td>
+<td>Using flag of DHCP function</td>
+</tr>
+<tr>
+<td><code>DhcpLeaseIPStart_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Specify the start point of the address band to be distributed to the client. (Example: 192.168.30.10)</td>
+</tr>
+<tr>
+<td><code>DhcpLeaseIPEnd_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Specify the end point of the address band to be distributed to the client. (Example: 192.168.30.200)</td>
+</tr>
+<tr>
+<td><code>DhcpSubnetMask_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Specify the subnet mask to be specified for the client. (Example: 255.255.255.0)</td>
+</tr>
+<tr>
+<td><code>DhcpExpireTimeSpan_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Specify the expiration date in second units for leasing an IP address to a client.</td>
+</tr>
+<tr>
+<td><code>DhcpGatewayAddress_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Specify the IP address of the default gateway to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify 0 or none, then the client will not be notified of the default gateway.</td>
+</tr>
+<tr>
+<td><code>DhcpDnsServerAddress_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Specify the IP address of the primary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address.</td>
+</tr>
+<tr>
+<td><code>DhcpDnsServerAddress2_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Specify the IP address of the secondary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address.</td>
+</tr>
+<tr>
+<td><code>DhcpDomainName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the domain name to be notified to the client. If you specify none, then the client will not be notified of the domain name.</td>
+</tr>
+<tr>
+<td><code>SaveLog_bool</code></td>
+<td><code>boolean</code></td>
+<td>Specify whether or not to save the Virtual DHCP Server operation in the Virtual Hub security log. Specify true to save it. This value is interlinked with the Virtual NAT Function log save setting.</td>
+</tr>
+<tr>
+<td><code>ApplyDhcpPushRoutes_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag to enable the DhcpPushRoutes_str field.</td>
+</tr>
+<tr>
+<td><code>DhcpPushRoutes_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the static routing table to push. Example: &quot;192.168.5.0/255.255.255.0/192.168.4.254, 10.0.0.0/255.0.0.0/192.168.4.253&quot; Split multiple entries (maximum: 64 entries) by comma or space characters. Each entry must be specified in the &quot;IP network address/subnet mask/gateway IP address&quot; format. This Virtual DHCP Server can push the classless static routes (RFC 3442) with DHCP reply messages to VPN clients. Whether or not a VPN client can recognize the classless static routes (RFC 3442) depends on the target VPN client software. SoftEther VPN Client and OpenVPN Client are supporting the classless static routes. On L2TP/IPsec and MS-SSTP protocols, the compatibility depends on the implementation of the client software. You can realize the split tunneling if you clear the default gateway field on the Virtual DHCP Server options. On the client side, L2TP/IPsec and MS-SSTP clients need to be configured not to set up the default gateway for the split tunneling usage. You can also push the classless static routes (RFC 3442) by your existing external DHCP server. In that case, disable the Virtual DHCP Server function on SecureNAT, and you need not to set up the classless routes on this API. See the RFC 3442 to understand the classless routes.</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getsecurenatoption"></a></p>
+<h2 id="getsecurenatoption-rpc-api-get-settings-of-securenat-function">&quot;GetSecureNATOption&quot; RPC API - Get Settings of SecureNAT Function</h2>
+<h3 id="description-70">Description</h3>
+<p>Get Settings of SecureNAT Function. This API get the registered settings for the SecureNAT function which is set by the SetSecureNATOption API.</p>
+<h3 id="input-json-rpc-format-70">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetSecureNATOption&quot;,
+  &quot;params&quot;: {
+    &quot;RpcHubName_str&quot;: &quot;rpchubname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-70">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;RpcHubName_str&quot;: &quot;rpchubname&quot;,
+    &quot;MacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;Ip_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;Mask_ip&quot;: &quot;255.255.255.255&quot;,
+    &quot;UseNat_bool&quot;: false,
+    &quot;Mtu_u32&quot;: 0,
+    &quot;NatTcpTimeout_u32&quot;: 0,
+    &quot;NatUdpTimeout_u32&quot;: 0,
+    &quot;UseDhcp_bool&quot;: false,
+    &quot;DhcpLeaseIPStart_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;DhcpLeaseIPEnd_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;DhcpSubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+    &quot;DhcpExpireTimeSpan_u32&quot;: 0,
+    &quot;DhcpGatewayAddress_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;DhcpDnsServerAddress_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;DhcpDnsServerAddress2_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;DhcpDomainName_str&quot;: &quot;dhcpdomainname&quot;,
+    &quot;SaveLog_bool&quot;: false,
+    &quot;ApplyDhcpPushRoutes_bool&quot;: false,
+    &quot;DhcpPushRoutes_str&quot;: &quot;dhcppushroutes&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-70">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>RpcHubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Target Virtual HUB name</td>
+</tr>
+<tr>
+<td><code>MacAddress_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>MAC address</td>
+</tr>
+<tr>
+<td><code>Ip_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>IP address</td>
+</tr>
+<tr>
+<td><code>Mask_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Subnet mask</td>
+</tr>
+<tr>
+<td><code>UseNat_bool</code></td>
+<td><code>boolean</code></td>
+<td>Use flag of the Virtual NAT function</td>
+</tr>
+<tr>
+<td><code>Mtu_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>MTU value (Standard: 1500)</td>
+</tr>
+<tr>
+<td><code>NatTcpTimeout_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>NAT TCP timeout in seconds</td>
+</tr>
+<tr>
+<td><code>NatUdpTimeout_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>NAT UDP timeout in seconds</td>
+</tr>
+<tr>
+<td><code>UseDhcp_bool</code></td>
+<td><code>boolean</code></td>
+<td>Using flag of DHCP function</td>
+</tr>
+<tr>
+<td><code>DhcpLeaseIPStart_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Specify the start point of the address band to be distributed to the client. (Example: 192.168.30.10)</td>
+</tr>
+<tr>
+<td><code>DhcpLeaseIPEnd_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Specify the end point of the address band to be distributed to the client. (Example: 192.168.30.200)</td>
+</tr>
+<tr>
+<td><code>DhcpSubnetMask_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Specify the subnet mask to be specified for the client. (Example: 255.255.255.0)</td>
+</tr>
+<tr>
+<td><code>DhcpExpireTimeSpan_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Specify the expiration date in second units for leasing an IP address to a client.</td>
+</tr>
+<tr>
+<td><code>DhcpGatewayAddress_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Specify the IP address of the default gateway to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify 0 or none, then the client will not be notified of the default gateway.</td>
+</tr>
+<tr>
+<td><code>DhcpDnsServerAddress_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Specify the IP address of the primary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address.</td>
+</tr>
+<tr>
+<td><code>DhcpDnsServerAddress2_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Specify the IP address of the secondary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address.</td>
+</tr>
+<tr>
+<td><code>DhcpDomainName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the domain name to be notified to the client. If you specify none, then the client will not be notified of the domain name.</td>
+</tr>
+<tr>
+<td><code>SaveLog_bool</code></td>
+<td><code>boolean</code></td>
+<td>Specify whether or not to save the Virtual DHCP Server operation in the Virtual Hub security log. Specify true to save it. This value is interlinked with the Virtual NAT Function log save setting.</td>
+</tr>
+<tr>
+<td><code>ApplyDhcpPushRoutes_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag to enable the DhcpPushRoutes_str field.</td>
+</tr>
+<tr>
+<td><code>DhcpPushRoutes_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the static routing table to push. Example: &quot;192.168.5.0/255.255.255.0/192.168.4.254, 10.0.0.0/255.0.0.0/192.168.4.253&quot; Split multiple entries (maximum: 64 entries) by comma or space characters. Each entry must be specified in the &quot;IP network address/subnet mask/gateway IP address&quot; format. This Virtual DHCP Server can push the classless static routes (RFC 3442) with DHCP reply messages to VPN clients. Whether or not a VPN client can recognize the classless static routes (RFC 3442) depends on the target VPN client software. SoftEther VPN Client and OpenVPN Client are supporting the classless static routes. On L2TP/IPsec and MS-SSTP protocols, the compatibility depends on the implementation of the client software. You can realize the split tunneling if you clear the default gateway field on the Virtual DHCP Server options. On the client side, L2TP/IPsec and MS-SSTP clients need to be configured not to set up the default gateway for the split tunneling usage. You can also push the classless static routes (RFC 3442) by your existing external DHCP server. In that case, disable the Virtual DHCP Server function on SecureNAT, and you need not to set up the classless routes on this API. See the RFC 3442 to understand the classless routes.</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="enumnat"></a></p>
+<h2 id="enumnat-rpc-api-get-virtual-nat-function-session-table-of-securenat-function">&quot;EnumNAT&quot; RPC API - Get Virtual NAT Function Session Table of SecureNAT Function</h2>
+<h3 id="description-71">Description</h3>
+<p>Get Virtual NAT Function Session Table of SecureNAT Function. Use this to get the table of TCP and UDP sessions currently communicating via the Virtual NAT (NAT table) in cases when the Virtual NAT function is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-71">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;EnumNAT&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-71">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;NatTable&quot;: [
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;Protocol_u32&quot;: 0,
+        &quot;SrcIp_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SrcHost_str&quot;: &quot;srchost&quot;,
+        &quot;SrcPort_u32&quot;: 0,
+        &quot;DestIp_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;DestHost_str&quot;: &quot;desthost&quot;,
+        &quot;DestPort_u32&quot;: 0,
+        &quot;CreatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;LastCommTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;SendSize_u64&quot;: 0,
+        &quot;RecvSize_u64&quot;: 0,
+        &quot;TcpStatus_u32&quot;: 0
+      },
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;Protocol_u32&quot;: 0,
+        &quot;SrcIp_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SrcHost_str&quot;: &quot;srchost&quot;,
+        &quot;SrcPort_u32&quot;: 0,
+        &quot;DestIp_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;DestHost_str&quot;: &quot;desthost&quot;,
+        &quot;DestPort_u32&quot;: 0,
+        &quot;CreatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;LastCommTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;SendSize_u64&quot;: 0,
+        &quot;RecvSize_u64&quot;: 0,
+        &quot;TcpStatus_u32&quot;: 0
+      },
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;Protocol_u32&quot;: 0,
+        &quot;SrcIp_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SrcHost_str&quot;: &quot;srchost&quot;,
+        &quot;SrcPort_u32&quot;: 0,
+        &quot;DestIp_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;DestHost_str&quot;: &quot;desthost&quot;,
+        &quot;DestPort_u32&quot;: 0,
+        &quot;CreatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;LastCommTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;SendSize_u64&quot;: 0,
+        &quot;RecvSize_u64&quot;: 0,
+        &quot;TcpStatus_u32&quot;: 0
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-71">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Virtual Hub Name</td>
+</tr>
+<tr>
+<td><code>NatTable</code></td>
+<td><code>Array object</code></td>
+<td>NAT item</td>
+</tr>
+<tr>
+<td><code>Id_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>ID</td>
+</tr>
+<tr>
+<td><code>Protocol_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Protocol<BR>Values:<BR><code>0</code>: TCP<BR><code>1</code>: UDP<BR><code>2</code>: DNS<BR><code>3</code>: ICMP</td>
+</tr>
+<tr>
+<td><code>SrcIp_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Source IP address</td>
+</tr>
+<tr>
+<td><code>SrcHost_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Source host name</td>
+</tr>
+<tr>
+<td><code>SrcPort_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Source port number</td>
+</tr>
+<tr>
+<td><code>DestIp_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Destination IP address</td>
+</tr>
+<tr>
+<td><code>DestHost_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Destination host name</td>
+</tr>
+<tr>
+<td><code>DestPort_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Destination port number</td>
+</tr>
+<tr>
+<td><code>CreatedTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Connection time</td>
+</tr>
+<tr>
+<td><code>LastCommTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Last communication time</td>
+</tr>
+<tr>
+<td><code>SendSize_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Transmission size</td>
+</tr>
+<tr>
+<td><code>RecvSize_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>Receive size</td>
+</tr>
+<tr>
+<td><code>TcpStatus_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>TCP state<BR>Values:<BR><code>0</code>: Connecting<BR><code>1</code>: Send the RST (Connection failure or disconnected)<BR><code>2</code>: Connection complete<BR><code>3</code>: Connection established<BR><code>4</code>: Wait for socket disconnection</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="enumdhcp"></a></p>
+<h2 id="enumdhcp-rpc-api-get-virtual-dhcp-server-function-lease-table-of-securenat-function">&quot;EnumDHCP&quot; RPC API - Get Virtual DHCP Server Function Lease Table of SecureNAT Function</h2>
+<h3 id="description-72">Description</h3>
+<p>Get Virtual DHCP Server Function Lease Table of SecureNAT Function. Use this to get the lease table of IP addresses, held by the Virtual DHCP Server, that are assigned to clients in cases when the Virtual NAT function is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-72">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;EnumDHCP&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-72">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;DhcpTable&quot;: [
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;LeasedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;ExpireTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;MacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;IpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;Mask_u32&quot;: 0,
+        &quot;Hostname_str&quot;: &quot;hostname&quot;
+      },
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;LeasedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;ExpireTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;MacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;IpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;Mask_u32&quot;: 0,
+        &quot;Hostname_str&quot;: &quot;hostname&quot;
+      },
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;LeasedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;ExpireTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;,
+        &quot;MacAddress_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+        &quot;IpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;Mask_u32&quot;: 0,
+        &quot;Hostname_str&quot;: &quot;hostname&quot;
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-72">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Virtual Hub Name</td>
+</tr>
+<tr>
+<td><code>DhcpTable</code></td>
+<td><code>Array object</code></td>
+<td>DHCP Item</td>
+</tr>
+<tr>
+<td><code>Id_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>ID</td>
+</tr>
+<tr>
+<td><code>LeasedTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Lease time</td>
+</tr>
+<tr>
+<td><code>ExpireTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Expiration date</td>
+</tr>
+<tr>
+<td><code>MacAddress_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>MAC address</td>
+</tr>
+<tr>
+<td><code>IpAddress_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>IP address</td>
+</tr>
+<tr>
+<td><code>Mask_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Subnet mask</td>
+</tr>
+<tr>
+<td><code>Hostname_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Host name</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getsecurenatstatus"></a></p>
+<h2 id="getsecurenatstatus-rpc-api-get-the-operating-status-of-the-virtual-nat-and-dhcp-server-function-securenat-function">&quot;GetSecureNATStatus&quot; RPC API - Get the Operating Status of the Virtual NAT and DHCP Server Function (SecureNAT Function)</h2>
+<h3 id="description-73">Description</h3>
+<p>Get the Operating Status of the Virtual NAT and DHCP Server Function (SecureNAT Function). Use this to get the operating status of the Virtual NAT and DHCP Server function (SecureNAT Function) when it is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-73">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetSecureNATStatus&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-73">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;NumTcpSessions_u32&quot;: 0,
+    &quot;NumUdpSessions_u32&quot;: 0,
+    &quot;NumIcmpSessions_u32&quot;: 0,
+    &quot;NumDnsSessions_u32&quot;: 0,
+    &quot;NumDhcpClients_u32&quot;: 0,
+    &quot;IsKernelMode_bool&quot;: false,
+    &quot;IsRawIpMode_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="parameters-73">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Virtual Hub Name</td>
+</tr>
+<tr>
+<td><code>NumTcpSessions_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of TCP sessions</td>
+</tr>
+<tr>
+<td><code>NumUdpSessions_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Ntmber of UDP sessions</td>
+</tr>
+<tr>
+<td><code>NumIcmpSessions_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Nymber of ICMP sessions</td>
+</tr>
+<tr>
+<td><code>NumDnsSessions_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of DNS sessions</td>
+</tr>
+<tr>
+<td><code>NumDhcpClients_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of DHCP clients</td>
+</tr>
+<tr>
+<td><code>IsKernelMode_bool</code></td>
+<td><code>boolean</code></td>
+<td>Whether the NAT is operating in the Kernel Mode</td>
+</tr>
+<tr>
+<td><code>IsRawIpMode_bool</code></td>
+<td><code>boolean</code></td>
+<td>Whether the NAT is operating in the Raw IP Mode</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="enumethernet"></a></p>
+<h2 id="enumethernet-rpc-api-get-list-of-network-adapters-usable-as-local-bridge">&quot;EnumEthernet&quot; RPC API - Get List of Network Adapters Usable as Local Bridge</h2>
+<h3 id="description-74">Description</h3>
+<p>Get List of Network Adapters Usable as Local Bridge. Use this to get a list of Ethernet devices (network adapters) that can be used as a bridge destination device as part of a Local Bridge connection. If possible, network connection name is displayed. You can use a device displayed here by using the AddLocalBridge API. To call this API, you must have VPN Server administrator privileges.</p>
+<h3 id="input-json-rpc-format-74">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;EnumEthernet&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-74">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;EthList&quot;: [
+      {
+        &quot;DeviceName_str&quot;: &quot;devicename&quot;,
+        &quot;NetworkConnectionName_utf&quot;: &quot;networkconnectionname&quot;
+      },
+      {
+        &quot;DeviceName_str&quot;: &quot;devicename&quot;,
+        &quot;NetworkConnectionName_utf&quot;: &quot;networkconnectionname&quot;
+      },
+      {
+        &quot;DeviceName_str&quot;: &quot;devicename&quot;,
+        &quot;NetworkConnectionName_utf&quot;: &quot;networkconnectionname&quot;
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-74">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>EthList</code></td>
+<td><code>Array object</code></td>
+<td>Ethernet Network Adapters list</td>
+</tr>
+<tr>
+<td><code>DeviceName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Device name</td>
+</tr>
+<tr>
+<td><code>NetworkConnectionName_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Network connection name (description)</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="addlocalbridge"></a></p>
+<h2 id="addlocalbridge-rpc-api-create-local-bridge-connection">&quot;AddLocalBridge&quot; RPC API - Create Local Bridge Connection</h2>
+<h3 id="description-75">Description</h3>
+<p>Create Local Bridge Connection. Use this to create a new Local Bridge connection on the VPN Server. By using a Local Bridge, you can configure a Layer 2 bridge connection between a Virtual Hub operating on this VPN server and a physical Ethernet Device (Network Adapter). You can create a tap device (virtual network interface) on the system and connect a bridge between Virtual Hubs (the tap device is only supported by Linux versions). It is possible to establish a bridge to an operating network adapter of your choice for the bridge destination Ethernet device (network adapter), but in high load environments, we recommend you prepare a network adapter dedicated to serve as a bridge. To call this API, you must have VPN Server administrator privileges.</p>
+<h3 id="input-json-rpc-format-75">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;AddLocalBridge&quot;,
+  &quot;params&quot;: {
+    &quot;DeviceName_str&quot;: &quot;devicename&quot;,
+    &quot;HubNameLB_str&quot;: &quot;hubnamelb&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-75">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;DeviceName_str&quot;: &quot;devicename&quot;,
+    &quot;HubNameLB_str&quot;: &quot;hubnamelb&quot;,
+    &quot;Online_bool&quot;: false,
+    &quot;Active_bool&quot;: false,
+    &quot;TapMode_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="parameters-75">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>DeviceName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Physical Ethernet device name</td>
+</tr>
+<tr>
+<td><code>HubNameLB_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Online_bool</code></td>
+<td><code>boolean</code></td>
+<td>Online flag</td>
+</tr>
+<tr>
+<td><code>Active_bool</code></td>
+<td><code>boolean</code></td>
+<td>Running flag</td>
+</tr>
+<tr>
+<td><code>TapMode_bool</code></td>
+<td><code>boolean</code></td>
+<td>Specify true if you are using a tap device rather than a network adapter for the bridge destination (only supported for Linux versions).</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="deletelocalbridge"></a></p>
+<h2 id="deletelocalbridge-rpc-api-delete-local-bridge-connection">&quot;DeleteLocalBridge&quot; RPC API - Delete Local Bridge Connection</h2>
+<h3 id="description-76">Description</h3>
+<p>Delete Local Bridge Connection. Use this to delete an existing Local Bridge connection. To get a list of current Local Bridge connections use the EnumLocalBridge API. To call this API, you must have VPN Server administrator privileges.</p>
+<h3 id="input-json-rpc-format-76">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;DeleteLocalBridge&quot;,
+  &quot;params&quot;: {
+    &quot;DeviceName_str&quot;: &quot;devicename&quot;,
+    &quot;HubNameLB_str&quot;: &quot;hubnamelb&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-76">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;DeviceName_str&quot;: &quot;devicename&quot;,
+    &quot;HubNameLB_str&quot;: &quot;hubnamelb&quot;,
+    &quot;Online_bool&quot;: false,
+    &quot;Active_bool&quot;: false,
+    &quot;TapMode_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="parameters-76">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>DeviceName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Physical Ethernet device name</td>
+</tr>
+<tr>
+<td><code>HubNameLB_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Online_bool</code></td>
+<td><code>boolean</code></td>
+<td>Online flag</td>
+</tr>
+<tr>
+<td><code>Active_bool</code></td>
+<td><code>boolean</code></td>
+<td>Running flag</td>
+</tr>
+<tr>
+<td><code>TapMode_bool</code></td>
+<td><code>boolean</code></td>
+<td>Specify true if you are using a tap device rather than a network adapter for the bridge destination (only supported for Linux versions).</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="enumlocalbridge"></a></p>
+<h2 id="enumlocalbridge-rpc-api-get-list-of-local-bridge-connection">&quot;EnumLocalBridge&quot; RPC API - Get List of Local Bridge Connection</h2>
+<h3 id="description-77">Description</h3>
+<p>Get List of Local Bridge Connection. Use this to get a list of the currently defined Local Bridge connections. You can get the Local Bridge connection Virtual Hub name and the bridge destination Ethernet device (network adapter) name or tap device name, as well as the operating status.</p>
+<h3 id="input-json-rpc-format-77">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;EnumLocalBridge&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-77">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;LocalBridgeList&quot;: [
+      {
+        &quot;DeviceName_str&quot;: &quot;devicename&quot;,
+        &quot;HubNameLB_str&quot;: &quot;hubnamelb&quot;,
+        &quot;Online_bool&quot;: false,
+        &quot;Active_bool&quot;: false,
+        &quot;TapMode_bool&quot;: false
+      },
+      {
+        &quot;DeviceName_str&quot;: &quot;devicename&quot;,
+        &quot;HubNameLB_str&quot;: &quot;hubnamelb&quot;,
+        &quot;Online_bool&quot;: false,
+        &quot;Active_bool&quot;: false,
+        &quot;TapMode_bool&quot;: false
+      },
+      {
+        &quot;DeviceName_str&quot;: &quot;devicename&quot;,
+        &quot;HubNameLB_str&quot;: &quot;hubnamelb&quot;,
+        &quot;Online_bool&quot;: false,
+        &quot;Active_bool&quot;: false,
+        &quot;TapMode_bool&quot;: false
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-77">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>LocalBridgeList</code></td>
+<td><code>Array object</code></td>
+<td>Local Bridge list</td>
+</tr>
+<tr>
+<td><code>DeviceName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Physical Ethernet device name</td>
+</tr>
+<tr>
+<td><code>HubNameLB_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Online_bool</code></td>
+<td><code>boolean</code></td>
+<td>Online flag</td>
+</tr>
+<tr>
+<td><code>Active_bool</code></td>
+<td><code>boolean</code></td>
+<td>Running flag</td>
+</tr>
+<tr>
+<td><code>TapMode_bool</code></td>
+<td><code>boolean</code></td>
+<td>Specify true if you are using a tap device rather than a network adapter for the bridge destination (only supported for Linux versions).</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getbridgesupport"></a></p>
+<h2 id="getbridgesupport-rpc-api-get-whether-the-localbridge-function-is-supported-on-the-current-system">&quot;GetBridgeSupport&quot; RPC API - Get whether the localbridge function is supported on the current system</h2>
+<h3 id="description-78">Description</h3>
+<p>Get whether the localbridge function is supported on the current system.</p>
+<h3 id="input-json-rpc-format-78">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetBridgeSupport&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-78">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;IsBridgeSupportedOs_bool&quot;: false,
+    &quot;IsWinPcapNeeded_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="parameters-78">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>IsBridgeSupportedOs_bool</code></td>
+<td><code>boolean</code></td>
+<td>Whether the OS supports the Local Bridge function</td>
+</tr>
+<tr>
+<td><code>IsWinPcapNeeded_bool</code></td>
+<td><code>boolean</code></td>
+<td>Whether WinPcap is necessary to install</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="rebootserver"></a></p>
+<h2 id="rebootserver-rpc-api-reboot-vpn-server-service">&quot;RebootServer&quot; RPC API - Reboot VPN Server Service</h2>
+<h3 id="description-79">Description</h3>
+<p>Reboot VPN Server Service. Use this to restart the VPN Server service. When you restart the VPN Server, all currently connected sessions and TCP connections will be disconnected and no new connections will be accepted until the restart process has completed. By using this API, only the VPN Server service program will be restarted and the physical computer that VPN Server is operating on does not restart. This management session will also be disconnected, so you will need to reconnect to continue management. Also, by specifying the &quot;IntValue&quot; parameter to &quot;1&quot;, the contents of the configuration file (.config) held by the current VPN Server will be initialized. To call this API, you must have VPN Server administrator privileges.</p>
+<h3 id="input-json-rpc-format-79">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;RebootServer&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-79">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;IntValue_u32&quot;: 0,
+    &quot;Int64Value_u64&quot;: 0,
+    &quot;StrValue_str&quot;: &quot;strvalue&quot;,
+    &quot;UniStrValue_utf&quot;: &quot;unistrvalue&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-79">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>IntValue_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>A 32-bit integer field</td>
+</tr>
+<tr>
+<td><code>Int64Value_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>A 64-bit integer field</td>
+</tr>
+<tr>
+<td><code>StrValue_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>An Ascii string field</td>
+</tr>
+<tr>
+<td><code>UniStrValue_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>An UTF-8 string field</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getcaps"></a></p>
+<h2 id="getcaps-rpc-api-get-list-of-server-functions-capability">&quot;GetCaps&quot; RPC API - Get List of Server Functions / Capability</h2>
+<h3 id="description-80">Description</h3>
+<p>Get List of Server Functions / Capability. Use this get a list of functions and capability of the VPN Server currently connected and being managed. The function and capability of VPN Servers are different depending on the operating VPN server's edition and version. Using this API, you can find out the capability of the target VPN Server and report it.</p>
+<h3 id="input-json-rpc-format-80">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetCaps&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-80">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;CapsList&quot;: [
+      {
+        &quot;CapsName_str&quot;: &quot;capsname&quot;,
+        &quot;CapsValue_u32&quot;: 0,
+        &quot;CapsDescrption_utf&quot;: &quot;capsdescrption&quot;
+      },
+      {
+        &quot;CapsName_str&quot;: &quot;capsname&quot;,
+        &quot;CapsValue_u32&quot;: 0,
+        &quot;CapsDescrption_utf&quot;: &quot;capsdescrption&quot;
+      },
+      {
+        &quot;CapsName_str&quot;: &quot;capsname&quot;,
+        &quot;CapsValue_u32&quot;: 0,
+        &quot;CapsDescrption_utf&quot;: &quot;capsdescrption&quot;
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-80">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>CapsList</code></td>
+<td><code>Array object</code></td>
+<td>Caps list of the VPN Server</td>
+</tr>
+<tr>
+<td><code>CapsName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Name</td>
+</tr>
+<tr>
+<td><code>CapsValue_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Value</td>
+</tr>
+<tr>
+<td><code>CapsDescrption_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Descrption</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getconfig"></a></p>
+<h2 id="getconfig-rpc-api-get-the-current-configuration-of-the-vpn-server">&quot;GetConfig&quot; RPC API - Get the current configuration of the VPN Server</h2>
+<h3 id="description-81">Description</h3>
+<p>Get the current configuration of the VPN Server. Use this to get a text file (.config file) that contains the current configuration contents of the VPN server. You can get the status on the VPN Server at the instant this API is executed. You can edit the configuration file by using a regular text editor. To write an edited configuration to the VPN Server, use the SetConfig API. To call this API, you must have VPN Server administrator privileges.</p>
+<h3 id="input-json-rpc-format-81">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetConfig&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-81">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;FileName_str&quot;: &quot;filename&quot;,
+    &quot;FileData_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-81">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>FileName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>File name (valid only for returning from the server)</td>
+</tr>
+<tr>
+<td><code>FileData_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>File data</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="setconfig"></a></p>
+<h2 id="setconfig-rpc-api-write-configuration-file-to-vpn-server">&quot;SetConfig&quot; RPC API - Write Configuration File to VPN Server</h2>
+<h3 id="description-82">Description</h3>
+<p>Write Configuration File to VPN Server. Use this to write the configuration file to the VPN Server. By executing this API, the contents of the specified configuration file will be applied to the VPN Server and the VPN Server program will automatically restart and upon restart, operate according to the new configuration contents. Because it is difficult for an administrator to write all the contents of a configuration file, we recommend you use the GetConfig API to get the current contents of the VPN Server configuration and save it to file. You can then edit these contents in a regular text editor and then use the SetConfig API to rewrite the contents to the VPN Server. This API is for people with a detailed knowledge of the VPN Server and if an incorrectly configured configuration file is written to the VPN Server, it not only could cause errors, it could also result in the lost of the current setting data. Take special care when carrying out this action. To call this API, you must have VPN Server administrator privileges.</p>
+<h3 id="input-json-rpc-format-82">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetConfig&quot;,
+  &quot;params&quot;: {
+    &quot;FileData_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-82">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;FileName_str&quot;: &quot;filename&quot;,
+    &quot;FileData_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-82">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>FileName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>File name (valid only for returning from the server)</td>
+</tr>
+<tr>
+<td><code>FileData_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>File data</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getdefaulthubadminoptions"></a></p>
+<h2 id="getdefaulthubadminoptions-rpc-api-get-virtual-hub-administration-option-default-values">&quot;GetDefaultHubAdminOptions&quot; RPC API - Get Virtual Hub Administration Option default values</h2>
+<h3 id="description-83">Description</h3>
+<p>Get Virtual Hub Administration Option default values.</p>
+<h3 id="input-json-rpc-format-83">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetDefaultHubAdminOptions&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-83">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;AdminOptionList&quot;: [
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;Value_u32&quot;: 0,
+        &quot;Descrption_utf&quot;: &quot;descrption&quot;
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;Value_u32&quot;: 0,
+        &quot;Descrption_utf&quot;: &quot;descrption&quot;
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;Value_u32&quot;: 0,
+        &quot;Descrption_utf&quot;: &quot;descrption&quot;
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-83">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Virtual HUB name</td>
+</tr>
+<tr>
+<td><code>AdminOptionList</code></td>
+<td><code>Array object</code></td>
+<td>List data</td>
+</tr>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Name</td>
+</tr>
+<tr>
+<td><code>Value_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Data</td>
+</tr>
+<tr>
+<td><code>Descrption_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Descrption</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="gethubadminoptions"></a></p>
+<h2 id="gethubadminoptions-rpc-api-get-list-of-virtual-hub-administration-options">&quot;GetHubAdminOptions&quot; RPC API - Get List of Virtual Hub Administration Options</h2>
+<h3 id="description-84">Description</h3>
+<p>Get List of Virtual Hub Administration Options. Use this to get a list of Virtual Hub administration options that are set on the currently managed Virtual Hub. The purpose of the Virtual Hub administration options is for the VPN Server Administrator to set limits for the setting ranges when the administration of the Virtual Hub is to be trusted to each Virtual Hub administrator. Only an administrator with administration privileges for this entire VPN Server is able to add, edit and delete the Virtual Hub administration options. The Virtual Hub administrators are unable to make changes to the administration options, however they are able to view them. There is an exception however. If allow_hub_admin_change_option is set to &quot;1&quot;, even Virtual Hub administrators are able to edit the administration options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member.</p>
+<h3 id="input-json-rpc-format-84">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetHubAdminOptions&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-84">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;AdminOptionList&quot;: [
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;Value_u32&quot;: 0,
+        &quot;Descrption_utf&quot;: &quot;descrption&quot;
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;Value_u32&quot;: 0,
+        &quot;Descrption_utf&quot;: &quot;descrption&quot;
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;Value_u32&quot;: 0,
+        &quot;Descrption_utf&quot;: &quot;descrption&quot;
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-84">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Virtual HUB name</td>
+</tr>
+<tr>
+<td><code>AdminOptionList</code></td>
+<td><code>Array object</code></td>
+<td>List data</td>
+</tr>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Name</td>
+</tr>
+<tr>
+<td><code>Value_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Data</td>
+</tr>
+<tr>
+<td><code>Descrption_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Descrption</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="sethubadminoptions"></a></p>
+<h2 id="sethubadminoptions-rpc-api-set-values-of-virtual-hub-administration-options">&quot;SetHubAdminOptions&quot; RPC API - Set Values of Virtual Hub Administration Options</h2>
+<h3 id="description-85">Description</h3>
+<p>Set Values of Virtual Hub Administration Options. Use this to change the values of Virtual Hub administration options that are set on the currently managed Virtual Hub. The purpose of the Virtual Hub administration options is for the VPN Server Administrator to set limits for the setting ranges when the administration of the Virtual Hub is to be trusted to each Virtual Hub administrator. Only an administrator with administration privileges for this entire VPN Server is able to add, edit and delete the Virtual Hub administration options. The Virtual Hub administrators are unable to make changes to the administration options, however they are able to view them. There is an exception however. If allow_hub_admin_change_option is set to &quot;1&quot;, even Virtual Hub administrators are able to edit the administration options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member.</p>
+<h3 id="input-json-rpc-format-85">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetHubAdminOptions&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;AdminOptionList&quot;: [
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;Value_u32&quot;: 0,
+        &quot;Descrption_utf&quot;: &quot;descrption&quot;
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;Value_u32&quot;: 0,
+        &quot;Descrption_utf&quot;: &quot;descrption&quot;
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;Value_u32&quot;: 0,
+        &quot;Descrption_utf&quot;: &quot;descrption&quot;
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-85">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;AdminOptionList&quot;: [
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;Value_u32&quot;: 0,
+        &quot;Descrption_utf&quot;: &quot;descrption&quot;
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;Value_u32&quot;: 0,
+        &quot;Descrption_utf&quot;: &quot;descrption&quot;
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;Value_u32&quot;: 0,
+        &quot;Descrption_utf&quot;: &quot;descrption&quot;
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-85">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Virtual HUB name</td>
+</tr>
+<tr>
+<td><code>AdminOptionList</code></td>
+<td><code>Array object</code></td>
+<td>List data</td>
+</tr>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Name</td>
+</tr>
+<tr>
+<td><code>Value_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Data</td>
+</tr>
+<tr>
+<td><code>Descrption_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Descrption</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="gethubextoptions"></a></p>
+<h2 id="gethubextoptions-rpc-api-get-list-of-virtual-hub-extended-options">&quot;GetHubExtOptions&quot; RPC API - Get List of Virtual Hub Extended Options</h2>
+<h3 id="description-86">Description</h3>
+<p>Get List of Virtual Hub Extended Options. Use this to get a Virtual Hub Extended Options List that is set on the currently managed Virtual Hub. Virtual Hub Extended Option enables you to configure more detail settings of the Virtual Hub. By default, both VPN Server's global administrators and individual Virtual Hub's administrators can modify the Virtual Hub Extended Options. However, if the deny_hub_admin_change_ext_option is set to 1 on the Virtual Hub Admin Options, the individual Virtual Hub's administrators cannot modify the Virtual Hub Extended Options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member.</p>
+<h3 id="input-json-rpc-format-86">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetHubExtOptions&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-86">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;AdminOptionList&quot;: [
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;Value_u32&quot;: 0,
+        &quot;Descrption_utf&quot;: &quot;descrption&quot;
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;Value_u32&quot;: 0,
+        &quot;Descrption_utf&quot;: &quot;descrption&quot;
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;Value_u32&quot;: 0,
+        &quot;Descrption_utf&quot;: &quot;descrption&quot;
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-86">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Virtual HUB name</td>
+</tr>
+<tr>
+<td><code>AdminOptionList</code></td>
+<td><code>Array object</code></td>
+<td>List data</td>
+</tr>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Name</td>
+</tr>
+<tr>
+<td><code>Value_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Data</td>
+</tr>
+<tr>
+<td><code>Descrption_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Descrption</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="sethubextoptions"></a></p>
+<h2 id="sethubextoptions-rpc-api-set-a-value-of-virtual-hub-extended-options">&quot;SetHubExtOptions&quot; RPC API - Set a Value of Virtual Hub Extended Options</h2>
+<h3 id="description-87">Description</h3>
+<p>Set a Value of Virtual Hub Extended Options. Use this to set a value in the Virtual Hub Extended Options List that is set on the currently managed Virtual Hub. Virtual Hub Extended Option enables you to configure more detail settings of the Virtual Hub. By default, both VPN Server's global administrators and individual Virtual Hub's administrators can modify the Virtual Hub Extended Options. However, if the deny_hub_admin_change_ext_option is set to 1 on the Virtual Hub Admin Options, the individual Virtual Hub's administrators cannot modify the Virtual Hub Extended Options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member.</p>
+<h3 id="input-json-rpc-format-87">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetHubExtOptions&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;AdminOptionList&quot;: [
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;Value_u32&quot;: 0,
+        &quot;Descrption_utf&quot;: &quot;descrption&quot;
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;Value_u32&quot;: 0,
+        &quot;Descrption_utf&quot;: &quot;descrption&quot;
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;Value_u32&quot;: 0,
+        &quot;Descrption_utf&quot;: &quot;descrption&quot;
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-87">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;AdminOptionList&quot;: [
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;Value_u32&quot;: 0,
+        &quot;Descrption_utf&quot;: &quot;descrption&quot;
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;Value_u32&quot;: 0,
+        &quot;Descrption_utf&quot;: &quot;descrption&quot;
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;Value_u32&quot;: 0,
+        &quot;Descrption_utf&quot;: &quot;descrption&quot;
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-87">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Virtual HUB name</td>
+</tr>
+<tr>
+<td><code>AdminOptionList</code></td>
+<td><code>Array object</code></td>
+<td>List data</td>
+</tr>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Name</td>
+</tr>
+<tr>
+<td><code>Value_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Data</td>
+</tr>
+<tr>
+<td><code>Descrption_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Descrption</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="addl3switch"></a></p>
+<h2 id="addl3switch-rpc-api-define-new-virtual-layer-3-switch">&quot;AddL3Switch&quot; RPC API - Define New Virtual Layer 3 Switch</h2>
+<h3 id="description-88">Description</h3>
+<p>Define New Virtual Layer 3 Switch. Use this to define a new Virtual Layer 3 Switch on the VPN Server. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network.</p>
+<h3 id="input-json-rpc-format-88">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;AddL3Switch&quot;,
+  &quot;params&quot;: {
+    &quot;Name_str&quot;: &quot;name&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-88">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;Name_str&quot;: &quot;name&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-88">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Layer-3 Switch name</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="dell3switch"></a></p>
+<h2 id="dell3switch-rpc-api-delete-virtual-layer-3-switch">&quot;DelL3Switch&quot; RPC API - Delete Virtual Layer 3 Switch</h2>
+<h3 id="description-89">Description</h3>
+<p>Delete Virtual Layer 3 Switch. Use this to delete an existing Virtual Layer 3 Switch that is defined on the VPN Server. When the specified Virtual Layer 3 Switch is operating, it will be automatically deleted after operation stops. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge.</p>
+<h3 id="input-json-rpc-format-89">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;DelL3Switch&quot;,
+  &quot;params&quot;: {
+    &quot;Name_str&quot;: &quot;name&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-89">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;Name_str&quot;: &quot;name&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-89">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Layer-3 Switch name</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="enuml3switch"></a></p>
+<h2 id="enuml3switch-rpc-api-get-list-of-virtual-layer-3-switches">&quot;EnumL3Switch&quot; RPC API - Get List of Virtual Layer 3 Switches</h2>
+<h3 id="description-90">Description</h3>
+<p>Get List of Virtual Layer 3 Switches. Use this to define a new Virtual Layer 3 Switch on the VPN Server. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network.</p>
+<h3 id="input-json-rpc-format-90">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;EnumL3Switch&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-90">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;L3SWList&quot;: [
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;NumInterfaces_u32&quot;: 0,
+        &quot;NumTables_u32&quot;: 0,
+        &quot;Active_bool&quot;: false,
+        &quot;Online_bool&quot;: false
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;NumInterfaces_u32&quot;: 0,
+        &quot;NumTables_u32&quot;: 0,
+        &quot;Active_bool&quot;: false,
+        &quot;Online_bool&quot;: false
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;NumInterfaces_u32&quot;: 0,
+        &quot;NumTables_u32&quot;: 0,
+        &quot;Active_bool&quot;: false,
+        &quot;Online_bool&quot;: false
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-90">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>L3SWList</code></td>
+<td><code>Array object</code></td>
+<td>Layer-3 switch list</td>
+</tr>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Name of the layer-3 switch</td>
+</tr>
+<tr>
+<td><code>NumInterfaces_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of layer-3 switch virtual interfaces</td>
+</tr>
+<tr>
+<td><code>NumTables_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Number of routing tables</td>
+</tr>
+<tr>
+<td><code>Active_bool</code></td>
+<td><code>boolean</code></td>
+<td>Activated flag</td>
+</tr>
+<tr>
+<td><code>Online_bool</code></td>
+<td><code>boolean</code></td>
+<td>Online flag</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="startl3switch"></a></p>
+<h2 id="startl3switch-rpc-api-start-virtual-layer-3-switch-operation">&quot;StartL3Switch&quot; RPC API - Start Virtual Layer 3 Switch Operation</h2>
+<h3 id="description-91">Description</h3>
+<p>Start Virtual Layer 3 Switch Operation. Use this to start the operation of an existing Virtual Layer 3 Switch defined on the VPN Server whose operation is currently stopped. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network.</p>
+<h3 id="input-json-rpc-format-91">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;StartL3Switch&quot;,
+  &quot;params&quot;: {
+    &quot;Name_str&quot;: &quot;name&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-91">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;Name_str&quot;: &quot;name&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-91">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Layer-3 Switch name</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="stopl3switch"></a></p>
+<h2 id="stopl3switch-rpc-api-stop-virtual-layer-3-switch-operation">&quot;StopL3Switch&quot; RPC API - Stop Virtual Layer 3 Switch Operation</h2>
+<h3 id="description-92">Description</h3>
+<p>Stop Virtual Layer 3 Switch Operation. Use this to stop the operation of an existing Virtual Layer 3 Switch defined on the VPN Server whose operation is currently operating. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges.</p>
+<h3 id="input-json-rpc-format-92">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;StopL3Switch&quot;,
+  &quot;params&quot;: {
+    &quot;Name_str&quot;: &quot;name&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-92">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;Name_str&quot;: &quot;name&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-92">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Layer-3 Switch name</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="addl3if"></a></p>
+<h2 id="addl3if-rpc-api-add-virtual-interface-to-virtual-layer-3-switch">&quot;AddL3If&quot; RPC API - Add Virtual Interface to Virtual Layer 3 Switch</h2>
+<h3 id="description-93">Description</h3>
+<p>Add Virtual Interface to Virtual Layer 3 Switch. Use this to add to a specified Virtual Layer 3 Switch, a virtual interface that connects to a Virtual Hub operating on the same VPN Server. You can define multiple virtual interfaces and routing tables for a single Virtual Layer 3 Switch. A virtual interface is associated to a virtual Hub and operates as a single IP host on the Virtual Hub when that Virtual Hub is operating. When multiple virtual interfaces that respectively belong to a different IP network of a different Virtual Hub are defined, IP routing will be automatically performed between these interfaces. You must define the IP network space that the virtual interface belongs to and the IP address of the interface itself. Also, you must specify the name of the Virtual Hub that the interface will connect to. You can specify a Virtual Hub that currently doesn't exist for the Virtual Hub name. The virtual interface must have one IP address in the Virtual Hub. You also must specify the subnet mask of an IP network that the IP address belongs to. Routing via the Virtual Layer 3 Switches of IP spaces of multiple virtual Hubs operates based on the IP address is specified here. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API.</p>
+<h3 id="input-json-rpc-format-93">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;AddL3If&quot;,
+  &quot;params&quot;: {
+    &quot;Name_str&quot;: &quot;name&quot;,
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;IpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;SubnetMask_ip&quot;: &quot;255.255.255.255&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-93">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;Name_str&quot;: &quot;name&quot;,
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;IpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;SubnetMask_ip&quot;: &quot;255.255.255.255&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-93">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>L3 switch name</td>
+</tr>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Virtual HUB name</td>
+</tr>
+<tr>
+<td><code>IpAddress_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>IP address</td>
+</tr>
+<tr>
+<td><code>SubnetMask_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Subnet mask</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="dell3if"></a></p>
+<h2 id="dell3if-rpc-api-delete-virtual-interface-of-virtual-layer-3-switch">&quot;DelL3If&quot; RPC API - Delete Virtual Interface of Virtual Layer 3 Switch</h2>
+<h3 id="description-94">Description</h3>
+<p>Delete Virtual Interface of Virtual Layer 3 Switch. Use this to delete a virtual interface already defined in the specified Virtual Layer 3 Switch. You can get a list of the virtual interfaces currently defined, by using the EnumL3If API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API.</p>
+<h3 id="input-json-rpc-format-94">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;DelL3If&quot;,
+  &quot;params&quot;: {
+    &quot;Name_str&quot;: &quot;name&quot;,
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-94">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;Name_str&quot;: &quot;name&quot;,
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;IpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;SubnetMask_ip&quot;: &quot;255.255.255.255&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-94">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>L3 switch name</td>
+</tr>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Virtual HUB name</td>
+</tr>
+<tr>
+<td><code>IpAddress_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>IP address</td>
+</tr>
+<tr>
+<td><code>SubnetMask_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Subnet mask</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="enuml3if"></a></p>
+<h2 id="enuml3if-rpc-api-get-list-of-interfaces-registered-on-the-virtual-layer-3-switch">&quot;EnumL3If&quot; RPC API - Get List of Interfaces Registered on the Virtual Layer 3 Switch</h2>
+<h3 id="description-95">Description</h3>
+<p>Get List of Interfaces Registered on the Virtual Layer 3 Switch. Use this to get a list of virtual interfaces when virtual interfaces have been defined on a specified Virtual Layer 3 Switch. You can define multiple virtual interfaces and routing tables for a single Virtual Layer 3 Switch. A virtual interface is associated to a virtual Hub and operates as a single IP host on the Virtual Hub when that Virtual Hub is operating. When multiple virtual interfaces that respectively belong to a different IP network of a different Virtual Hub are defined, IP routing will be automatically performed between these interfaces. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge.</p>
+<h3 id="input-json-rpc-format-95">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;EnumL3If&quot;,
+  &quot;params&quot;: {
+    &quot;Name_str&quot;: &quot;name&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-95">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;Name_str&quot;: &quot;name&quot;,
+    &quot;L3IFList&quot;: [
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;HubName_str&quot;: &quot;hubname&quot;,
+        &quot;IpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SubnetMask_ip&quot;: &quot;255.255.255.255&quot;
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;HubName_str&quot;: &quot;hubname&quot;,
+        &quot;IpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SubnetMask_ip&quot;: &quot;255.255.255.255&quot;
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;HubName_str&quot;: &quot;hubname&quot;,
+        &quot;IpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SubnetMask_ip&quot;: &quot;255.255.255.255&quot;
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-95">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Layer-3 switch name</td>
+</tr>
+<tr>
+<td><code>L3IFList</code></td>
+<td><code>Array object</code></td>
+<td>Layer-3 interface list</td>
+</tr>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>L3 switch name</td>
+</tr>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Virtual HUB name</td>
+</tr>
+<tr>
+<td><code>IpAddress_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>IP address</td>
+</tr>
+<tr>
+<td><code>SubnetMask_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Subnet mask</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="addl3table"></a></p>
+<h2 id="addl3table-rpc-api-add-routing-table-entry-for-virtual-layer-3-switch">&quot;AddL3Table&quot; RPC API - Add Routing Table Entry for Virtual Layer 3 Switch</h2>
+<h3 id="description-96">Description</h3>
+<p>Add Routing Table Entry for Virtual Layer 3 Switch. Here you can add a new routing table entry to the routing table of the specified Virtual Layer 3 Switch. If the destination IP address of the IP packet does not belong to any IP network that belongs to a virtual interface, the IP routing engine of the Virtual Layer 3 Switch will reference the routing table and execute routing. You must specify the contents of the routing table entry to be added to the Virtual Layer 3 Switch. You must specify any IP address that belongs to the same IP network in the virtual interface of this Virtual Layer 3 Switch as the gateway address. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API.</p>
+<h3 id="input-json-rpc-format-96">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;AddL3Table&quot;,
+  &quot;params&quot;: {
+    &quot;Name_str&quot;: &quot;name&quot;,
+    &quot;NetworkAddress_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;SubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+    &quot;GatewayAddress_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;Metric_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-96">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;Name_str&quot;: &quot;name&quot;,
+    &quot;NetworkAddress_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;SubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+    &quot;GatewayAddress_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;Metric_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="parameters-96">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>L3 switch name</td>
+</tr>
+<tr>
+<td><code>NetworkAddress_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Network address</td>
+</tr>
+<tr>
+<td><code>SubnetMask_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Subnet mask</td>
+</tr>
+<tr>
+<td><code>GatewayAddress_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Gateway address</td>
+</tr>
+<tr>
+<td><code>Metric_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Metric</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="dell3table"></a></p>
+<h2 id="dell3table-rpc-api-delete-routing-table-entry-of-virtual-layer-3-switch">&quot;DelL3Table&quot; RPC API - Delete Routing Table Entry of Virtual Layer 3 Switch</h2>
+<h3 id="description-97">Description</h3>
+<p>Delete Routing Table Entry of Virtual Layer 3 Switch. Use this to delete a routing table entry that is defined in the specified Virtual Layer 3 Switch. You can get a list of the already defined routing table entries by using the EnumL3Table API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API.</p>
+<h3 id="input-json-rpc-format-97">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;DelL3Table&quot;,
+  &quot;params&quot;: {
+    &quot;Name_str&quot;: &quot;name&quot;,
+    &quot;NetworkAddress_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;SubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+    &quot;GatewayAddress_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;Metric_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-97">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;Name_str&quot;: &quot;name&quot;,
+    &quot;NetworkAddress_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;SubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+    &quot;GatewayAddress_ip&quot;: &quot;192.168.0.1&quot;,
+    &quot;Metric_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="parameters-97">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>L3 switch name</td>
+</tr>
+<tr>
+<td><code>NetworkAddress_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Network address</td>
+</tr>
+<tr>
+<td><code>SubnetMask_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Subnet mask</td>
+</tr>
+<tr>
+<td><code>GatewayAddress_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Gateway address</td>
+</tr>
+<tr>
+<td><code>Metric_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Metric</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="enuml3table"></a></p>
+<h2 id="enuml3table-rpc-api-get-list-of-routing-tables-of-virtual-layer-3-switch">&quot;EnumL3Table&quot; RPC API - Get List of Routing Tables of Virtual Layer 3 Switch</h2>
+<h3 id="description-98">Description</h3>
+<p>Get List of Routing Tables of Virtual Layer 3 Switch. Use this to get a list of routing tables when routing tables have been defined on a specified Virtual Layer 3 Switch. If the destination IP address of the IP packet does not belong to any IP network that belongs to a virtual interface, the IP routing engine of the Virtual Layer 3 Switch will reference this routing table and execute routing. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge.</p>
+<h3 id="input-json-rpc-format-98">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;EnumL3Table&quot;,
+  &quot;params&quot;: {
+    &quot;Name_str&quot;: &quot;name&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-98">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;Name_str&quot;: &quot;name&quot;,
+    &quot;L3Table&quot;: [
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;NetworkAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+        &quot;GatewayAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;Metric_u32&quot;: 0
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;NetworkAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+        &quot;GatewayAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;Metric_u32&quot;: 0
+      },
+      {
+        &quot;Name_str&quot;: &quot;name&quot;,
+        &quot;NetworkAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SubnetMask_ip&quot;: &quot;255.255.255.255&quot;,
+        &quot;GatewayAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;Metric_u32&quot;: 0
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-98">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>L3 switch name</td>
+</tr>
+<tr>
+<td><code>L3Table</code></td>
+<td><code>Array object</code></td>
+<td>Routing table item list</td>
+</tr>
+<tr>
+<td><code>Name_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>L3 switch name</td>
+</tr>
+<tr>
+<td><code>NetworkAddress_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Network address</td>
+</tr>
+<tr>
+<td><code>SubnetMask_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Subnet mask</td>
+</tr>
+<tr>
+<td><code>GatewayAddress_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Gateway address</td>
+</tr>
+<tr>
+<td><code>Metric_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Metric</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="enumcrl"></a></p>
+<h2 id="enumcrl-rpc-api-get-list-of-certificates-revocation-list">&quot;EnumCrl&quot; RPC API - Get List of Certificates Revocation List</h2>
+<h3 id="description-99">Description</h3>
+<p>Get List of Certificates Revocation List. Use this to get a Certificates Revocation List that is set on the currently managed Virtual Hub. By registering certificates in the Certificates Revocation List, the clients who provide these certificates will be unable to connect to this Virtual Hub using certificate authentication mode. Normally with this function, in cases where the security of a private key has been compromised or where a person holding a certificate has been stripped of their privileges, by registering that certificate as invalid on the Virtual Hub, it is possible to deny user authentication when that certificate is used by a client to connect to the Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-99">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;EnumCrl&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-99">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;CRLList&quot;: [
+      {
+        &quot;Key_u32&quot;: 0,
+        &quot;CrlInfo_utf&quot;: &quot;crlinfo&quot;
+      },
+      {
+        &quot;Key_u32&quot;: 0,
+        &quot;CrlInfo_utf&quot;: &quot;crlinfo&quot;
+      },
+      {
+        &quot;Key_u32&quot;: 0,
+        &quot;CrlInfo_utf&quot;: &quot;crlinfo&quot;
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-99">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>CRLList</code></td>
+<td><code>Array object</code></td>
+<td>CRL list</td>
+</tr>
+<tr>
+<td><code>Key_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Key ID</td>
+</tr>
+<tr>
+<td><code>CrlInfo_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>The contents of the CRL item</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="addcrl"></a></p>
+<h2 id="addcrl-rpc-api-add-a-revoked-certificate">&quot;AddCrl&quot; RPC API - Add a Revoked Certificate</h2>
+<h3 id="description-100">Description</h3>
+<p>Add a Revoked Certificate. Use this to add a new revoked certificate definition in the Certificate Revocation List that is set on the currently managed Virtual Hub. Specify the contents to be registered in the Certificate Revocation List by using the parameters of this API. When a user connects to a Virtual Hub in certificate authentication mode and that certificate matches 1 or more of the contents registered in the certificates revocation list, the user is denied connection. A certificate that matches all the conditions that are defined by the parameters specified by this API will be judged as invalid. The items that can be set are as follows: Name (CN), Organization (O), Organization Unit (OU), Country (C), State (ST), Locale (L), Serial Number (hexadecimal), MD5 Digest Value (hexadecimal, 128 bit), and SHA-1 Digest Value (hexadecimal, 160 bit). For the specification of a digest value (hash value) a certificate is optionally specified depending on the circumstances. Normally when a MD5 or SHA-1 digest value is input, it is not necessary to input the other items. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-100">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;AddCrl&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;CommonName_utf&quot;: &quot;commonname&quot;,
+    &quot;Organization_utf&quot;: &quot;organization&quot;,
+    &quot;Unit_utf&quot;: &quot;unit&quot;,
+    &quot;Country_utf&quot;: &quot;country&quot;,
+    &quot;State_utf&quot;: &quot;state&quot;,
+    &quot;Local_utf&quot;: &quot;local&quot;,
+    &quot;Serial_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;DigestMD5_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;DigestSHA1_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-100">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Key_u32&quot;: 0,
+    &quot;CommonName_utf&quot;: &quot;commonname&quot;,
+    &quot;Organization_utf&quot;: &quot;organization&quot;,
+    &quot;Unit_utf&quot;: &quot;unit&quot;,
+    &quot;Country_utf&quot;: &quot;country&quot;,
+    &quot;State_utf&quot;: &quot;state&quot;,
+    &quot;Local_utf&quot;: &quot;local&quot;,
+    &quot;Serial_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;DigestMD5_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;DigestSHA1_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-100">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Key_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Key ID</td>
+</tr>
+<tr>
+<td><code>CommonName_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>CN, optional</td>
+</tr>
+<tr>
+<td><code>Organization_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>O, optional</td>
+</tr>
+<tr>
+<td><code>Unit_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>OU, optional</td>
+</tr>
+<tr>
+<td><code>Country_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>C, optional</td>
+</tr>
+<tr>
+<td><code>State_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>ST, optional</td>
+</tr>
+<tr>
+<td><code>Local_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>L, optional</td>
+</tr>
+<tr>
+<td><code>Serial_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Serial, optional</td>
+</tr>
+<tr>
+<td><code>DigestMD5_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>MD5 Digest, optional</td>
+</tr>
+<tr>
+<td><code>DigestSHA1_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>SHA1 Digest, optional</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="delcrl"></a></p>
+<h2 id="delcrl-rpc-api-delete-a-revoked-certificate">&quot;DelCrl&quot; RPC API - Delete a Revoked Certificate</h2>
+<h3 id="description-101">Description</h3>
+<p>Delete a Revoked Certificate. Use this to specify and delete a revoked certificate definition from the certificate revocation list that is set on the currently managed Virtual Hub. To get the list of currently registered revoked certificate definitions, use the EnumCrl API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-101">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;DelCrl&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Key_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-101">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Key_u32&quot;: 0,
+    &quot;CommonName_utf&quot;: &quot;commonname&quot;,
+    &quot;Organization_utf&quot;: &quot;organization&quot;,
+    &quot;Unit_utf&quot;: &quot;unit&quot;,
+    &quot;Country_utf&quot;: &quot;country&quot;,
+    &quot;State_utf&quot;: &quot;state&quot;,
+    &quot;Local_utf&quot;: &quot;local&quot;,
+    &quot;Serial_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;DigestMD5_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;DigestSHA1_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-101">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Key_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Key ID</td>
+</tr>
+<tr>
+<td><code>CommonName_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>CN, optional</td>
+</tr>
+<tr>
+<td><code>Organization_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>O, optional</td>
+</tr>
+<tr>
+<td><code>Unit_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>OU, optional</td>
+</tr>
+<tr>
+<td><code>Country_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>C, optional</td>
+</tr>
+<tr>
+<td><code>State_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>ST, optional</td>
+</tr>
+<tr>
+<td><code>Local_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>L, optional</td>
+</tr>
+<tr>
+<td><code>Serial_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Serial, optional</td>
+</tr>
+<tr>
+<td><code>DigestMD5_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>MD5 Digest, optional</td>
+</tr>
+<tr>
+<td><code>DigestSHA1_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>SHA1 Digest, optional</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getcrl"></a></p>
+<h2 id="getcrl-rpc-api-get-a-revoked-certificate">&quot;GetCrl&quot; RPC API - Get a Revoked Certificate</h2>
+<h3 id="description-102">Description</h3>
+<p>Get a Revoked Certificate. Use this to specify and get the contents of a revoked certificate definition from the Certificates Revocation List that is set on the currently managed Virtual Hub. To get the list of currently registered revoked certificate definitions, use the EnumCrl API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-102">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetCrl&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Key_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-102">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Key_u32&quot;: 0,
+    &quot;CommonName_utf&quot;: &quot;commonname&quot;,
+    &quot;Organization_utf&quot;: &quot;organization&quot;,
+    &quot;Unit_utf&quot;: &quot;unit&quot;,
+    &quot;Country_utf&quot;: &quot;country&quot;,
+    &quot;State_utf&quot;: &quot;state&quot;,
+    &quot;Local_utf&quot;: &quot;local&quot;,
+    &quot;Serial_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;DigestMD5_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;DigestSHA1_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-102">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Key_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Key ID</td>
+</tr>
+<tr>
+<td><code>CommonName_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>CN, optional</td>
+</tr>
+<tr>
+<td><code>Organization_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>O, optional</td>
+</tr>
+<tr>
+<td><code>Unit_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>OU, optional</td>
+</tr>
+<tr>
+<td><code>Country_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>C, optional</td>
+</tr>
+<tr>
+<td><code>State_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>ST, optional</td>
+</tr>
+<tr>
+<td><code>Local_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>L, optional</td>
+</tr>
+<tr>
+<td><code>Serial_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Serial, optional</td>
+</tr>
+<tr>
+<td><code>DigestMD5_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>MD5 Digest, optional</td>
+</tr>
+<tr>
+<td><code>DigestSHA1_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>SHA1 Digest, optional</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="setcrl"></a></p>
+<h2 id="setcrl-rpc-api-change-existing-crl-certificate-revocation-list-entry">&quot;SetCrl&quot; RPC API - Change Existing CRL (Certificate Revocation List) Entry</h2>
+<h3 id="description-103">Description</h3>
+<p>Change Existing CRL (Certificate Revocation List) Entry. Use this to alter an existing revoked certificate definition in the Certificate Revocation List that is set on the currently managed Virtual Hub. Specify the contents to be registered in the Certificate Revocation List by using the parameters of this API. When a user connects to a Virtual Hub in certificate authentication mode and that certificate matches 1 or more of the contents registered in the certificates revocation list, the user is denied connection. A certificate that matches all the conditions that are defined by the parameters specified by this API will be judged as invalid. The items that can be set are as follows: Name (CN), Organization (O), Organization Unit (OU), Country (C), State (ST), Locale (L), Serial Number (hexadecimal), MD5 Digest Value (hexadecimal, 128 bit), and SHA-1 Digest Value (hexadecimal, 160 bit). For the specification of a digest value (hash value) a certificate is optionally specified depending on the circumstances. Normally when a MD5 or SHA-1 digest value is input, it is not necessary to input the other items. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-103">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetCrl&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-103">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Key_u32&quot;: 0,
+    &quot;CommonName_utf&quot;: &quot;commonname&quot;,
+    &quot;Organization_utf&quot;: &quot;organization&quot;,
+    &quot;Unit_utf&quot;: &quot;unit&quot;,
+    &quot;Country_utf&quot;: &quot;country&quot;,
+    &quot;State_utf&quot;: &quot;state&quot;,
+    &quot;Local_utf&quot;: &quot;local&quot;,
+    &quot;Serial_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;DigestMD5_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;,
+    &quot;DigestSHA1_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-103">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Key_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Key ID</td>
+</tr>
+<tr>
+<td><code>CommonName_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>CN, optional</td>
+</tr>
+<tr>
+<td><code>Organization_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>O, optional</td>
+</tr>
+<tr>
+<td><code>Unit_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>OU, optional</td>
+</tr>
+<tr>
+<td><code>Country_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>C, optional</td>
+</tr>
+<tr>
+<td><code>State_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>ST, optional</td>
+</tr>
+<tr>
+<td><code>Local_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>L, optional</td>
+</tr>
+<tr>
+<td><code>Serial_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Serial, optional</td>
+</tr>
+<tr>
+<td><code>DigestMD5_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>MD5 Digest, optional</td>
+</tr>
+<tr>
+<td><code>DigestSHA1_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>SHA1 Digest, optional</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="setaclist"></a></p>
+<h2 id="setaclist-rpc-api-add-rule-to-source-ip-address-limit-list">&quot;SetAcList&quot; RPC API - Add Rule to Source IP Address Limit List</h2>
+<h3 id="description-104">Description</h3>
+<p>Add Rule to Source IP Address Limit List. Use this to add a new rule to the Source IP Address Limit List that is set on the currently managed Virtual Hub. The items set here will be used to decide whether to allow or deny connection from a VPN Client when this client attempts connection to the Virtual Hub. You can specify a client IP address, or IP address or mask to match the rule as the contents of the rule item. By specifying an IP address only, there will only be one specified computer that will match the rule, but by specifying an IP net mask address or subnet mask address, all the computers in the range of that subnet will match the rule. You can specify the priority for the rule. You can specify an integer of 1 or greater for the priority and the smaller the number, the higher the priority. To get a list of the currently registered Source IP Address Limit List, use the GetAcList API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-104">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetAcList&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;ACList&quot;: [
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;Priority_u32&quot;: 0,
+        &quot;Deny_bool&quot;: false,
+        &quot;Masked_bool&quot;: false,
+        &quot;IpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SubnetMask_ip&quot;: &quot;255.255.255.255&quot;
+      },
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;Priority_u32&quot;: 0,
+        &quot;Deny_bool&quot;: false,
+        &quot;Masked_bool&quot;: false,
+        &quot;IpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SubnetMask_ip&quot;: &quot;255.255.255.255&quot;
+      },
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;Priority_u32&quot;: 0,
+        &quot;Deny_bool&quot;: false,
+        &quot;Masked_bool&quot;: false,
+        &quot;IpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SubnetMask_ip&quot;: &quot;255.255.255.255&quot;
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-104">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;ACList&quot;: [
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;Priority_u32&quot;: 0,
+        &quot;Deny_bool&quot;: false,
+        &quot;Masked_bool&quot;: false,
+        &quot;IpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SubnetMask_ip&quot;: &quot;255.255.255.255&quot;
+      },
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;Priority_u32&quot;: 0,
+        &quot;Deny_bool&quot;: false,
+        &quot;Masked_bool&quot;: false,
+        &quot;IpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SubnetMask_ip&quot;: &quot;255.255.255.255&quot;
+      },
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;Priority_u32&quot;: 0,
+        &quot;Deny_bool&quot;: false,
+        &quot;Masked_bool&quot;: false,
+        &quot;IpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SubnetMask_ip&quot;: &quot;255.255.255.255&quot;
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-104">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>ACList</code></td>
+<td><code>Array object</code></td>
+<td>Source IP Address Limit List</td>
+</tr>
+<tr>
+<td><code>Id_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>ID</td>
+</tr>
+<tr>
+<td><code>Priority_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Priority</td>
+</tr>
+<tr>
+<td><code>Deny_bool</code></td>
+<td><code>boolean</code></td>
+<td>Deny access</td>
+</tr>
+<tr>
+<td><code>Masked_bool</code></td>
+<td><code>boolean</code></td>
+<td>Set true if you want to specify the SubnetMask_ip item.</td>
+</tr>
+<tr>
+<td><code>IpAddress_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>IP address</td>
+</tr>
+<tr>
+<td><code>SubnetMask_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Subnet mask, valid only if Masked_bool == true</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getaclist"></a></p>
+<h2 id="getaclist-rpc-api-get-list-of-rule-items-of-source-ip-address-limit-list">&quot;GetAcList&quot; RPC API - Get List of Rule Items of Source IP Address Limit List</h2>
+<h3 id="description-105">Description</h3>
+<p>Get List of Rule Items of Source IP Address Limit List. Use this to get a list of Source IP Address Limit List rules that is set on the currently managed Virtual Hub. You can allow or deny VPN connections to this Virtual Hub according to the client computer's source IP address. You can define multiple rules and set a priority for each rule. The search proceeds from the rule with the highest order or priority and based on the action of the rule that the IP address first matches, the connection from the client is either allowed or denied. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-105">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetAcList&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-105">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;ACList&quot;: [
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;Priority_u32&quot;: 0,
+        &quot;Deny_bool&quot;: false,
+        &quot;Masked_bool&quot;: false,
+        &quot;IpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SubnetMask_ip&quot;: &quot;255.255.255.255&quot;
+      },
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;Priority_u32&quot;: 0,
+        &quot;Deny_bool&quot;: false,
+        &quot;Masked_bool&quot;: false,
+        &quot;IpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SubnetMask_ip&quot;: &quot;255.255.255.255&quot;
+      },
+      {
+        &quot;Id_u32&quot;: 0,
+        &quot;Priority_u32&quot;: 0,
+        &quot;Deny_bool&quot;: false,
+        &quot;Masked_bool&quot;: false,
+        &quot;IpAddress_ip&quot;: &quot;192.168.0.1&quot;,
+        &quot;SubnetMask_ip&quot;: &quot;255.255.255.255&quot;
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-105">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>ACList</code></td>
+<td><code>Array object</code></td>
+<td>Source IP Address Limit List</td>
+</tr>
+<tr>
+<td><code>Id_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>ID</td>
+</tr>
+<tr>
+<td><code>Priority_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Priority</td>
+</tr>
+<tr>
+<td><code>Deny_bool</code></td>
+<td><code>boolean</code></td>
+<td>Deny access</td>
+</tr>
+<tr>
+<td><code>Masked_bool</code></td>
+<td><code>boolean</code></td>
+<td>Set true if you want to specify the SubnetMask_ip item.</td>
+</tr>
+<tr>
+<td><code>IpAddress_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>IP address</td>
+</tr>
+<tr>
+<td><code>SubnetMask_ip</code></td>
+<td><code>string</code> (IP address)</td>
+<td>Subnet mask, valid only if Masked_bool == true</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="enumlogfile"></a></p>
+<h2 id="enumlogfile-rpc-api-get-list-of-log-files">&quot;EnumLogFile&quot; RPC API - Get List of Log Files</h2>
+<h3 id="description-106">Description</h3>
+<p>Get List of Log Files. Use this to display a list of log files outputted by the VPN Server that have been saved on the VPN Server computer. By specifying a log file file name displayed here and calling it using the ReadLogFile API you can download the contents of the log file. If you are connected to the VPN Server in server admin mode, you can display or download the packet logs and security logs of all Virtual Hubs and the server log of the VPN Server. When connected in Virtual Hub Admin Mode, you are able to view or download only the packet log and security log of the Virtual Hub that is the target of management.</p>
+<h3 id="input-json-rpc-format-106">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;EnumLogFile&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-106">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;LogFiles&quot;: [
+      {
+        &quot;ServerName_str&quot;: &quot;servername&quot;,
+        &quot;FilePath_str&quot;: &quot;filepath&quot;,
+        &quot;FileSize_u32&quot;: 0,
+        &quot;UpdatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;
+      },
+      {
+        &quot;ServerName_str&quot;: &quot;servername&quot;,
+        &quot;FilePath_str&quot;: &quot;filepath&quot;,
+        &quot;FileSize_u32&quot;: 0,
+        &quot;UpdatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;
+      },
+      {
+        &quot;ServerName_str&quot;: &quot;servername&quot;,
+        &quot;FilePath_str&quot;: &quot;filepath&quot;,
+        &quot;FileSize_u32&quot;: 0,
+        &quot;UpdatedTime_dt&quot;: &quot;2020-08-01T12:24:36.123&quot;
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-106">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>LogFiles</code></td>
+<td><code>Array object</code></td>
+<td>Log file list</td>
+</tr>
+<tr>
+<td><code>ServerName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Server name</td>
+</tr>
+<tr>
+<td><code>FilePath_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>File path</td>
+</tr>
+<tr>
+<td><code>FileSize_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>File size</td>
+</tr>
+<tr>
+<td><code>UpdatedTime_dt</code></td>
+<td><code>Date</code></td>
+<td>Last write date</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="readlogfile"></a></p>
+<h2 id="readlogfile-rpc-api-download-a-part-of-log-file">&quot;ReadLogFile&quot; RPC API - Download a part of Log File</h2>
+<h3 id="description-107">Description</h3>
+<p>Download a part of Log File. Use this to download the log file that is saved on the VPN Server computer. To download the log file first get the list of log files using the EnumLogFile API and then download the log file using the ReadLogFile API. If you are connected to the VPN Server in server admin mode, you can display or download the packet logs and security logs of all Virtual Hubs and the server log of the VPN Server. When connected in Virtual Hub Admin Mode, you are able to view or download only the packet log and security log of the Virtual Hub that is the target of management.</p>
+<h3 id="input-json-rpc-format-107">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;ReadLogFile&quot;,
+  &quot;params&quot;: {
+    &quot;FilePath_str&quot;: &quot;filepath&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-107">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;ServerName_str&quot;: &quot;servername&quot;,
+    &quot;FilePath_str&quot;: &quot;filepath&quot;,
+    &quot;Offset_u32&quot;: 0,
+    &quot;Buffer_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-107">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>ServerName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Server name</td>
+</tr>
+<tr>
+<td><code>FilePath_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>File Path</td>
+</tr>
+<tr>
+<td><code>Offset_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Offset to download. You have to call the ReadLogFile API multiple times to download the entire log file with requesting a part of the file by specifying the Offset_u32 field.</td>
+</tr>
+<tr>
+<td><code>Buffer_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Received buffer</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="setsyslog"></a></p>
+<h2 id="setsyslog-rpc-api-set-syslog-send-function">&quot;SetSysLog&quot; RPC API - Set syslog Send Function</h2>
+<h3 id="description-108">Description</h3>
+<p>Set syslog Send Function. Use this to set the usage of syslog send function and which syslog server to use.</p>
+<h3 id="input-json-rpc-format-108">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetSysLog&quot;,
+  &quot;params&quot;: {
+    &quot;SaveType_u32&quot;: 0,
+    &quot;Hostname_str&quot;: &quot;hostname&quot;,
+    &quot;Port_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-108">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;SaveType_u32&quot;: 0,
+    &quot;Hostname_str&quot;: &quot;hostname&quot;,
+    &quot;Port_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="parameters-108">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>SaveType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>The behavior of the syslog function<BR>Values:<BR><code>0</code>: Do not use syslog<BR><code>1</code>: Only server log<BR><code>2</code>: Server and Virtual HUB security log<BR><code>3</code>: Server, Virtual HUB security, and packet log</td>
+</tr>
+<tr>
+<td><code>Hostname_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the host name or IP address of the syslog server</td>
+</tr>
+<tr>
+<td><code>Port_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Specify the port number of the syslog server</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getsyslog"></a></p>
+<h2 id="getsyslog-rpc-api-get-syslog-send-function">&quot;GetSysLog&quot; RPC API - Get syslog Send Function</h2>
+<h3 id="description-109">Description</h3>
+<p>Get syslog Send Function. This allows you to get the current setting contents of the syslog send function. You can get the usage setting of the syslog function and the host name and port number of the syslog server to use.</p>
+<h3 id="input-json-rpc-format-109">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetSysLog&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-109">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;SaveType_u32&quot;: 0,
+    &quot;Hostname_str&quot;: &quot;hostname&quot;,
+    &quot;Port_u32&quot;: 0
+  }
+}
+</code></pre>
+<h3 id="parameters-109">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>SaveType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>The behavior of the syslog function<BR>Values:<BR><code>0</code>: Do not use syslog<BR><code>1</code>: Only server log<BR><code>2</code>: Server and Virtual HUB security log<BR><code>3</code>: Server, Virtual HUB security, and packet log</td>
+</tr>
+<tr>
+<td><code>Hostname_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the host name or IP address of the syslog server</td>
+</tr>
+<tr>
+<td><code>Port_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Specify the port number of the syslog server</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="sethubmsg"></a></p>
+<h2 id="sethubmsg-rpc-api-set-todays-message-of-virtual-hub">&quot;SetHubMsg&quot; RPC API - Set Today's Message of Virtual Hub</h2>
+<h3 id="description-110">Description</h3>
+<p>Set Today's Message of Virtual Hub. The message will be displayed on VPN Client UI when a user will establish a connection to the Virtual Hub.</p>
+<h3 id="input-json-rpc-format-110">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetHubMsg&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Msg_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-110">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Msg_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-110">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Msg_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Message (Unicode strings acceptable)</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="gethubmsg"></a></p>
+<h2 id="gethubmsg-rpc-api-get-todays-message-of-virtual-hub">&quot;GetHubMsg&quot; RPC API - Get Today's Message of Virtual Hub</h2>
+<h3 id="description-111">Description</h3>
+<p>Get Today's Message of Virtual Hub. The message will be displayed on VPN Client UI when a user will establish a connection to the Virtual Hub.</p>
+<h3 id="input-json-rpc-format-111">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetHubMsg&quot;,
+  &quot;params&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-111">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Msg_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-111">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Msg_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Message (Unicode strings acceptable)</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="crash"></a></p>
+<h2 id="crash-rpc-api-raise-a-vital-error-on-the-vpn-server-bridge-to-terminate-the-process-forcefully">&quot;Crash&quot; RPC API - Raise a vital error on the VPN Server / Bridge to terminate the process forcefully</h2>
+<h3 id="description-112">Description</h3>
+<p>Raise a vital error on the VPN Server / Bridge to terminate the process forcefully. This API will raise a fatal error (memory access violation) on the VPN Server / Bridge running process in order to crash the process. As the result, VPN Server / Bridge will be terminated and restarted if it is running as a service mode. If the VPN Server is running as a user mode, the process will not automatically restarted. This API is for a situation when the VPN Server / Bridge is under a non-recoverable error or the process is in an infinite loop. This API will disconnect all VPN Sessions on the VPN Server / Bridge. All unsaved settings in the memory of VPN Server / Bridge will be lost. Before run this API, call the Flush API to try to save volatile data to the configuration file. To execute this API, you must have VPN Server / VPN Bridge administrator privileges.</p>
+<h3 id="input-json-rpc-format-112">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;Crash&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-112">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;IntValue_u32&quot;: 0,
+    &quot;Int64Value_u64&quot;: 0,
+    &quot;StrValue_str&quot;: &quot;strvalue&quot;,
+    &quot;UniStrValue_utf&quot;: &quot;unistrvalue&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-112">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>IntValue_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>A 32-bit integer field</td>
+</tr>
+<tr>
+<td><code>Int64Value_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>A 64-bit integer field</td>
+</tr>
+<tr>
+<td><code>StrValue_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>An Ascii string field</td>
+</tr>
+<tr>
+<td><code>UniStrValue_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>An UTF-8 string field</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getadminmsg"></a></p>
+<h2 id="getadminmsg-rpc-api-get-the-message-for-administrators">&quot;GetAdminMsg&quot; RPC API - Get the message for administrators</h2>
+<h3 id="description-113">Description</h3>
+<p>Get the message for administrators.</p>
+<h3 id="input-json-rpc-format-113">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetAdminMsg&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-113">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;Msg_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-113">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>The Virtual Hub name</td>
+</tr>
+<tr>
+<td><code>Msg_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Message (Unicode strings acceptable)</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="flush"></a></p>
+<h2 id="flush-rpc-api-save-all-volatile-data-of-vpn-server-bridge-to-the-configuration-file">&quot;Flush&quot; RPC API - Save All Volatile Data of VPN Server / Bridge to the Configuration File</h2>
+<h3 id="description-114">Description</h3>
+<p>Save All Volatile Data of VPN Server / Bridge to the Configuration File. The number of configuration file bytes will be returned as the &quot;IntValue&quot; parameter. Normally, the VPN Server / VPN Bridge retains the volatile configuration data in memory. It is flushed to the disk as vpn_server.config or vpn_bridge.config periodically. The period is 300 seconds (5 minutes) by default. (The period can be altered by modifying the AutoSaveConfigSpan item in the configuration file.) The data will be saved on the timing of shutting down normally of the VPN Server / Bridge. Execute the Flush API to make the VPN Server / Bridge save the settings to the file immediately. The setting data will be stored on the disk drive of the server computer. Use the Flush API in a situation that you do not have an enough time to shut down the server process normally. To call this API, you must have VPN Server administrator privileges. To execute this API, you must have VPN Server / VPN Bridge administrator privileges.</p>
+<h3 id="input-json-rpc-format-114">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;Flush&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-114">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;IntValue_u32&quot;: 0,
+    &quot;Int64Value_u64&quot;: 0,
+    &quot;StrValue_str&quot;: &quot;strvalue&quot;,
+    &quot;UniStrValue_utf&quot;: &quot;unistrvalue&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-114">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>IntValue_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>A 32-bit integer field</td>
+</tr>
+<tr>
+<td><code>Int64Value_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>A 64-bit integer field</td>
+</tr>
+<tr>
+<td><code>StrValue_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>An Ascii string field</td>
+</tr>
+<tr>
+<td><code>UniStrValue_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>An UTF-8 string field</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="setipsecservices"></a></p>
+<h2 id="setipsecservices-rpc-api-enable-or-disable-ipsec-vpn-server-function">&quot;SetIPsecServices&quot; RPC API - Enable or Disable IPsec VPN Server Function</h2>
+<h3 id="description-115">Description</h3>
+<p>Enable or Disable IPsec VPN Server Function. Enable or Disable IPsec VPN Server Function on the VPN Server. If you enable this function, Virtual Hubs on the VPN Server will be able to accept Remote-Access VPN connections from L2TP-compatible PCs, Mac OS X and Smartphones, and also can accept EtherIP Site-to-Site VPN Connection. VPN Connections from Smartphones suchlike iPhone, iPad and Android, and also from native VPN Clients on Mac OS X and Windows can be accepted. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-115">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetIPsecServices&quot;,
+  &quot;params&quot;: {
+    &quot;L2TP_Raw_bool&quot;: false,
+    &quot;L2TP_IPsec_bool&quot;: false,
+    &quot;EtherIP_IPsec_bool&quot;: false,
+    &quot;IPsec_Secret_str&quot;: &quot;ipsec_secret&quot;,
+    &quot;L2TP_DefaultHub_str&quot;: &quot;l2tp_defaulthub&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-115">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;L2TP_Raw_bool&quot;: false,
+    &quot;L2TP_IPsec_bool&quot;: false,
+    &quot;EtherIP_IPsec_bool&quot;: false,
+    &quot;IPsec_Secret_str&quot;: &quot;ipsec_secret&quot;,
+    &quot;L2TP_DefaultHub_str&quot;: &quot;l2tp_defaulthub&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-115">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>L2TP_Raw_bool</code></td>
+<td><code>boolean</code></td>
+<td>Enable or Disable the L2TP Server Function (Raw L2TP with No Encryptions). To accept special VPN clients, enable this option.</td>
+</tr>
+<tr>
+<td><code>L2TP_IPsec_bool</code></td>
+<td><code>boolean</code></td>
+<td>Enable or Disable the L2TP over IPsec Server Function. To accept VPN connections from iPhone, iPad, Android, Windows or Mac OS X, enable this option.</td>
+</tr>
+<tr>
+<td><code>EtherIP_IPsec_bool</code></td>
+<td><code>boolean</code></td>
+<td>Enable or Disable the EtherIP / L2TPv3 over IPsec Server Function (for site-to-site VPN Server function). Router Products which are compatible with EtherIP over IPsec can connect to Virtual Hubs on the VPN Server and establish Layer-2 (Ethernet) Bridging.</td>
+</tr>
+<tr>
+<td><code>IPsec_Secret_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the IPsec Pre-Shared Key. An IPsec Pre-Shared Key is also called as &quot;PSK&quot; or &quot;secret&quot;. Specify it equal or less than 8 letters, and distribute it to every users who will connect to the VPN Server. Please note: Google Android 4.0 has a bug which a Pre-Shared Key with 10 or more letters causes a unexpected behavior. For that reason, the letters of a Pre-Shared Key should be 9 or less characters.</td>
+</tr>
+<tr>
+<td><code>L2TP_DefaultHub_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the default Virtual HUB in a case of omitting the name of HUB on the Username. Users should specify their username such as &quot;Username@Target Virtual HUB Name&quot; to connect this L2TP Server. If the designation of the Virtual Hub is omitted, the above HUB will be used as the target.</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getipsecservices"></a></p>
+<h2 id="getipsecservices-rpc-api-get-the-current-ipsec-vpn-server-settings">&quot;GetIPsecServices&quot; RPC API - Get the Current IPsec VPN Server Settings</h2>
+<h3 id="description-116">Description</h3>
+<p>Get the Current IPsec VPN Server Settings. Get and view the current IPsec VPN Server settings on the VPN Server. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-116">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetIPsecServices&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-116">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;L2TP_Raw_bool&quot;: false,
+    &quot;L2TP_IPsec_bool&quot;: false,
+    &quot;EtherIP_IPsec_bool&quot;: false,
+    &quot;IPsec_Secret_str&quot;: &quot;ipsec_secret&quot;,
+    &quot;L2TP_DefaultHub_str&quot;: &quot;l2tp_defaulthub&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-116">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>L2TP_Raw_bool</code></td>
+<td><code>boolean</code></td>
+<td>Enable or Disable the L2TP Server Function (Raw L2TP with No Encryptions). To accept special VPN clients, enable this option.</td>
+</tr>
+<tr>
+<td><code>L2TP_IPsec_bool</code></td>
+<td><code>boolean</code></td>
+<td>Enable or Disable the L2TP over IPsec Server Function. To accept VPN connections from iPhone, iPad, Android, Windows or Mac OS X, enable this option.</td>
+</tr>
+<tr>
+<td><code>EtherIP_IPsec_bool</code></td>
+<td><code>boolean</code></td>
+<td>Enable or Disable the EtherIP / L2TPv3 over IPsec Server Function (for site-to-site VPN Server function). Router Products which are compatible with EtherIP over IPsec can connect to Virtual Hubs on the VPN Server and establish Layer-2 (Ethernet) Bridging.</td>
+</tr>
+<tr>
+<td><code>IPsec_Secret_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the IPsec Pre-Shared Key. An IPsec Pre-Shared Key is also called as &quot;PSK&quot; or &quot;secret&quot;. Specify it equal or less than 8 letters, and distribute it to every users who will connect to the VPN Server. Please note: Google Android 4.0 has a bug which a Pre-Shared Key with 10 or more letters causes a unexpected behavior. For that reason, the letters of a Pre-Shared Key should be 9 or less characters.</td>
+</tr>
+<tr>
+<td><code>L2TP_DefaultHub_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the default Virtual HUB in a case of omitting the name of HUB on the Username. Users should specify their username such as &quot;Username@Target Virtual HUB Name&quot; to connect this L2TP Server. If the designation of the Virtual Hub is omitted, the above HUB will be used as the target.</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="addetheripid"></a></p>
+<h2 id="addetheripid-rpc-api-add-new-etherip-l2tpv3-over-ipsec-client-setting-to-accept-ethreip-l2tpv3-client-devices">&quot;AddEtherIpId&quot; RPC API - Add New EtherIP / L2TPv3 over IPsec Client Setting to Accept EthreIP / L2TPv3 Client Devices</h2>
+<h3 id="description-117">Description</h3>
+<p>Add New EtherIP / L2TPv3 over IPsec Client Setting to Accept EthreIP / L2TPv3 Client Devices. Add a new setting entry to enable the EtherIP / L2TPv3 over IPsec Server Function to accept client devices. In order to accept connections from routers by the EtherIP / L2TPv3 over IPsec Server Function, you have to define the relation table between an IPsec Phase 1 string which is presented by client devices of EtherIP / L2TPv3 over IPsec compatible router, and the designation of the destination Virtual Hub. After you add a definition entry by AddEtherIpId API, the defined connection setting to the Virtual Hub will be applied on the login-attepting session from an EtherIP / L2TPv3 over IPsec client device. The username and password in an entry must be registered on the Virtual Hub. An EtherIP / L2TPv3 client will be regarded as it connected the Virtual HUB with the identification of the above user information. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-117">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;AddEtherIpId&quot;,
+  &quot;params&quot;: {
+    &quot;Id_str&quot;: &quot;id&quot;,
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;UserName_str&quot;: &quot;username&quot;,
+    &quot;Password_str&quot;: &quot;password&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-117">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;Id_str&quot;: &quot;id&quot;,
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;UserName_str&quot;: &quot;username&quot;,
+    &quot;Password_str&quot;: &quot;password&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-117">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>Id_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify an ISAKMP Phase 1 ID. The ID must be exactly same as a ID in the configuration of the EtherIP / L2TPv3 Client. You can specify IP address as well as characters as ID, if the EtherIP Client uses IP address as Phase 1 ID. If you specify '*' (asterisk), it will be a wildcard to match any clients which doesn't match other explicit rules.</td>
+</tr>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the name of the Virtual Hub to connect.</td>
+</tr>
+<tr>
+<td><code>UserName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the username to login to the destination Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>Password_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the password to login to the destination Virtual Hub.</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getetheripid"></a></p>
+<h2 id="getetheripid-rpc-api-get-the-current-list-of-etherip-l2tpv3-client-device-entry-definitions">&quot;GetEtherIpId&quot; RPC API - Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions</h2>
+<h3 id="description-118">Description</h3>
+<p>Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions. This API gets and shows the list of entries to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-118">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetEtherIpId&quot;,
+  &quot;params&quot;: {
+    &quot;Id_str&quot;: &quot;id&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-118">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;Id_str&quot;: &quot;id&quot;,
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;UserName_str&quot;: &quot;username&quot;,
+    &quot;Password_str&quot;: &quot;password&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-118">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>Id_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify an ISAKMP Phase 1 ID. The ID must be exactly same as a ID in the configuration of the EtherIP / L2TPv3 Client. You can specify IP address as well as characters as ID, if the EtherIP Client uses IP address as Phase 1 ID. If you specify '*' (asterisk), it will be a wildcard to match any clients which doesn't match other explicit rules.</td>
+</tr>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the name of the Virtual Hub to connect.</td>
+</tr>
+<tr>
+<td><code>UserName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the username to login to the destination Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>Password_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the password to login to the destination Virtual Hub.</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="deleteetheripid"></a></p>
+<h2 id="deleteetheripid-rpc-api-delete-an-etherip-l2tpv3-over-ipsec-client-setting">&quot;DeleteEtherIpId&quot; RPC API - Delete an EtherIP / L2TPv3 over IPsec Client Setting</h2>
+<h3 id="description-119">Description</h3>
+<p>Delete an EtherIP / L2TPv3 over IPsec Client Setting. This API deletes an entry to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-119">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;DeleteEtherIpId&quot;,
+  &quot;params&quot;: {
+    &quot;Id_str&quot;: &quot;id&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-119">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;Id_str&quot;: &quot;id&quot;,
+    &quot;HubName_str&quot;: &quot;hubname&quot;,
+    &quot;UserName_str&quot;: &quot;username&quot;,
+    &quot;Password_str&quot;: &quot;password&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-119">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>Id_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify an ISAKMP Phase 1 ID. The ID must be exactly same as a ID in the configuration of the EtherIP / L2TPv3 Client. You can specify IP address as well as characters as ID, if the EtherIP Client uses IP address as Phase 1 ID. If you specify '*' (asterisk), it will be a wildcard to match any clients which doesn't match other explicit rules.</td>
+</tr>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the name of the Virtual Hub to connect.</td>
+</tr>
+<tr>
+<td><code>UserName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the username to login to the destination Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>Password_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the password to login to the destination Virtual Hub.</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="enumetheripid"></a></p>
+<h2 id="enumetheripid-rpc-api-get-the-current-list-of-etherip-l2tpv3-client-device-entry-definitions">&quot;EnumEtherIpId&quot; RPC API - Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions</h2>
+<h3 id="description-120">Description</h3>
+<p>Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions. This API gets and shows the list of entries to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-120">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;EnumEtherIpId&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-120">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;Settings&quot;: [
+      {
+        &quot;Id_str&quot;: &quot;id&quot;,
+        &quot;HubName_str&quot;: &quot;hubname&quot;,
+        &quot;UserName_str&quot;: &quot;username&quot;,
+        &quot;Password_str&quot;: &quot;password&quot;
+      },
+      {
+        &quot;Id_str&quot;: &quot;id&quot;,
+        &quot;HubName_str&quot;: &quot;hubname&quot;,
+        &quot;UserName_str&quot;: &quot;username&quot;,
+        &quot;Password_str&quot;: &quot;password&quot;
+      },
+      {
+        &quot;Id_str&quot;: &quot;id&quot;,
+        &quot;HubName_str&quot;: &quot;hubname&quot;,
+        &quot;UserName_str&quot;: &quot;username&quot;,
+        &quot;Password_str&quot;: &quot;password&quot;
+      }
+    ]
+  }
+}
+</code></pre>
+<h3 id="parameters-120">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>Settings</code></td>
+<td><code>Array object</code></td>
+<td>Setting list</td>
+</tr>
+<tr>
+<td><code>Id_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify an ISAKMP Phase 1 ID. The ID must be exactly same as a ID in the configuration of the EtherIP / L2TPv3 Client. You can specify IP address as well as characters as ID, if the EtherIP Client uses IP address as Phase 1 ID. If you specify '*' (asterisk), it will be a wildcard to match any clients which doesn't match other explicit rules.</td>
+</tr>
+<tr>
+<td><code>HubName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the name of the Virtual Hub to connect.</td>
+</tr>
+<tr>
+<td><code>UserName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the username to login to the destination Virtual Hub.</td>
+</tr>
+<tr>
+<td><code>Password_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify the password to login to the destination Virtual Hub.</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="setopenvpnsstpconfig"></a></p>
+<h2 id="setopenvpnsstpconfig-rpc-api-set-settings-for-openvpn-clone-server-function">&quot;SetOpenVpnSstpConfig&quot; RPC API - Set Settings for OpenVPN Clone Server Function</h2>
+<h3 id="description-121">Description</h3>
+<p>Set Settings for OpenVPN Clone Server Function. The VPN Server has the clone functions of OpenVPN software products by OpenVPN Technologies, Inc. Any OpenVPN Clients can connect to this VPN Server. The manner to specify a username to connect to the Virtual Hub, and the selection rule of default Hub by using this clone server functions are same to the IPsec Server functions. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-121">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetOpenVpnSstpConfig&quot;,
+  &quot;params&quot;: {
+    &quot;EnableOpenVPN_bool&quot;: false,
+    &quot;OpenVPNPortList_str&quot;: &quot;openvpnportlist&quot;,
+    &quot;EnableSSTP_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-121">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;EnableOpenVPN_bool&quot;: false,
+    &quot;OpenVPNPortList_str&quot;: &quot;openvpnportlist&quot;,
+    &quot;EnableSSTP_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="parameters-121">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>EnableOpenVPN_bool</code></td>
+<td><code>boolean</code></td>
+<td>Specify true to enable the OpenVPN Clone Server Function. Specify false to disable.</td>
+</tr>
+<tr>
+<td><code>OpenVPNPortList_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify UDP ports to listen for OpenVPN. Multiple UDP ports can be specified with splitting by space or comma letters, for example: &quot;1194, 2001, 2010, 2012&quot;. The default port for OpenVPN is UDP 1194. You can specify any other UDP ports.</td>
+</tr>
+<tr>
+<td><code>EnableSSTP_bool</code></td>
+<td><code>boolean</code></td>
+<td>pecify true to enable the Microsoft SSTP VPN Clone Server Function. Specify false to disable.</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getopenvpnsstpconfig"></a></p>
+<h2 id="getopenvpnsstpconfig-rpc-api-get-the-current-settings-of-openvpn-clone-server-function">&quot;GetOpenVpnSstpConfig&quot; RPC API - Get the Current Settings of OpenVPN Clone Server Function</h2>
+<h3 id="description-122">Description</h3>
+<p>Get the Current Settings of OpenVPN Clone Server Function. Get and show the current settings of OpenVPN Clone Server Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-122">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetOpenVpnSstpConfig&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-122">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;EnableOpenVPN_bool&quot;: false,
+    &quot;OpenVPNPortList_str&quot;: &quot;openvpnportlist&quot;,
+    &quot;EnableSSTP_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="parameters-122">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>EnableOpenVPN_bool</code></td>
+<td><code>boolean</code></td>
+<td>Specify true to enable the OpenVPN Clone Server Function. Specify false to disable.</td>
+</tr>
+<tr>
+<td><code>OpenVPNPortList_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Specify UDP ports to listen for OpenVPN. Multiple UDP ports can be specified with splitting by space or comma letters, for example: &quot;1194, 2001, 2010, 2012&quot;. The default port for OpenVPN is UDP 1194. You can specify any other UDP ports.</td>
+</tr>
+<tr>
+<td><code>EnableSSTP_bool</code></td>
+<td><code>boolean</code></td>
+<td>pecify true to enable the Microsoft SSTP VPN Clone Server Function. Specify false to disable.</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getddnsclientstatus"></a></p>
+<h2 id="getddnsclientstatus-rpc-api-show-the-current-status-of-dynamic-dns-function">&quot;GetDDnsClientStatus&quot; RPC API - Show the Current Status of Dynamic DNS Function</h2>
+<h3 id="description-123">Description</h3>
+<p>Show the Current Status of Dynamic DNS Function. Get and show the current status of the Dynamic DNS function. The Dynamic DNS assigns a unique and permanent DNS hostname for this VPN Server. You can use that hostname to specify this VPN Server on the settings for VPN Client and VPN Bridge. You need not to register and keep a domain name. Also, if your ISP assignes you a dynamic (not-fixed) IP address, the corresponding IP address of your Dynamic DNS hostname will be automatically changed. It enables you to keep running the VPN Server by using only a dynamic IP address. Therefore, you need not any longer to keep static global IP addresses with expenses monthly costs. [Caution] To disable the Dynamic DNS Function, modify the configuration file of VPN Server. The &quot;declare root&quot; directive has the &quot;declare DDnsClient&quot; directive. In this directive, you can switch &quot;bool Disable&quot; from false to true, and reboot the VPN Server, then the Dynamic DNS Function will be disabled. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge.</p>
+<h3 id="input-json-rpc-format-123">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetDDnsClientStatus&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-123">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;Err_IPv4_u32&quot;: 0,
+    &quot;ErrStr_IPv4_utf&quot;: &quot;errstr_ipv4&quot;,
+    &quot;Err_IPv6_u32&quot;: 0,
+    &quot;ErrStr_IPv6_utf&quot;: &quot;errstr_ipv6&quot;,
+    &quot;CurrentHostName_str&quot;: &quot;currenthostname&quot;,
+    &quot;CurrentFqdn_str&quot;: &quot;currentfqdn&quot;,
+    &quot;DnsSuffix_str&quot;: &quot;dnssuffix&quot;,
+    &quot;CurrentIPv4_str&quot;: &quot;currentipv4&quot;,
+    &quot;CurrentIPv6_str&quot;: &quot;currentipv6&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-123">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>Err_IPv4_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Last error code (IPv4)</td>
+</tr>
+<tr>
+<td><code>ErrStr_IPv4_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Last error string (IPv4)</td>
+</tr>
+<tr>
+<td><code>Err_IPv6_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Last error code (IPv6)</td>
+</tr>
+<tr>
+<td><code>ErrStr_IPv6_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>Last error string (IPv6)</td>
+</tr>
+<tr>
+<td><code>CurrentHostName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Current DDNS host name</td>
+</tr>
+<tr>
+<td><code>CurrentFqdn_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Current FQDN of the DDNS hostname</td>
+</tr>
+<tr>
+<td><code>DnsSuffix_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>DDNS suffix</td>
+</tr>
+<tr>
+<td><code>CurrentIPv4_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Current IPv4 address of the VPN Server</td>
+</tr>
+<tr>
+<td><code>CurrentIPv6_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Current IPv6 address of the VPN Server</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="changeddnsclienthostname"></a></p>
+<h2 id="changeddnsclienthostname-rpc-api-set-the-dynamic-dns-hostname">&quot;ChangeDDnsClientHostname&quot; RPC API - Set the Dynamic DNS Hostname</h2>
+<h3 id="description-124">Description</h3>
+<p>Set the Dynamic DNS Hostname. You must specify the new hostname on the StrValue_str field. You can use this API to change the hostname assigned by the Dynamic DNS function. The currently assigned hostname can be showen by the GetDDnsClientStatus API. The Dynamic DNS assigns a unique and permanent DNS hostname for this VPN Server. You can use that hostname to specify this VPN Server on the settings for VPN Client and VPN Bridge. You need not to register and keep a domain name. Also, if your ISP assignes you a dynamic (not-fixed) IP address, the corresponding IP address of your Dynamic DNS hostname will be automatically changed. It enables you to keep running the VPN Server by using only a dynamic IP address. Therefore, you need not any longer to keep static global IP addresses with expenses monthly costs. [Caution] To disable the Dynamic DNS Function, modify the configuration file of VPN Server. The &quot;declare root&quot; directive has the &quot;declare DDnsClient&quot; directive. In this directive, you can switch &quot;bool Disable&quot; from false to true, and reboot the VPN Server, then the Dynamic DNS Function will be disabled. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge.</p>
+<h3 id="input-json-rpc-format-124">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;ChangeDDnsClientHostname&quot;,
+  &quot;params&quot;: {
+    &quot;StrValue_str&quot;: &quot;strvalue&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-124">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;IntValue_u32&quot;: 0,
+    &quot;Int64Value_u64&quot;: 0,
+    &quot;StrValue_str&quot;: &quot;strvalue&quot;,
+    &quot;UniStrValue_utf&quot;: &quot;unistrvalue&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-124">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>IntValue_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>A 32-bit integer field</td>
+</tr>
+<tr>
+<td><code>Int64Value_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>A 64-bit integer field</td>
+</tr>
+<tr>
+<td><code>StrValue_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>An Ascii string field</td>
+</tr>
+<tr>
+<td><code>UniStrValue_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>An UTF-8 string field</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="regenerateservercert"></a></p>
+<h2 id="regenerateservercert-rpc-api-generate-new-self-signed-certificate-with-specified-cn-common-name-and-register-on-vpn-server">&quot;RegenerateServerCert&quot; RPC API - Generate New Self-Signed Certificate with Specified CN (Common Name) and Register on VPN Server</h2>
+<h3 id="description-125">Description</h3>
+<p>Generate New Self-Signed Certificate with Specified CN (Common Name) and Register on VPN Server. You can specify the new CN (common name) value on the StrValue_str field. You can use this API to replace the current certificate on the VPN Server to a new self-signed certificate which has the CN (Common Name) value in the fields. This API is convenient if you are planning to use Microsoft SSTP VPN Clone Server Function. Because of the value of CN (Common Name) on the SSL certificate of VPN Server must match to the hostname specified on the SSTP VPN client. This API will delete the existing SSL certificate of the VPN Server. It is recommended to backup the current SSL certificate and private key by using the GetServerCert API beforehand. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-125">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;RegenerateServerCert&quot;,
+  &quot;params&quot;: {
+    &quot;StrValue_str&quot;: &quot;strvalue&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-125">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;IntValue_u32&quot;: 0,
+    &quot;Int64Value_u64&quot;: 0,
+    &quot;StrValue_str&quot;: &quot;strvalue&quot;,
+    &quot;UniStrValue_utf&quot;: &quot;unistrvalue&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-125">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>IntValue_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>A 32-bit integer field</td>
+</tr>
+<tr>
+<td><code>Int64Value_u64</code></td>
+<td><code>number</code> (uint64)</td>
+<td>A 64-bit integer field</td>
+</tr>
+<tr>
+<td><code>StrValue_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>An Ascii string field</td>
+</tr>
+<tr>
+<td><code>UniStrValue_utf</code></td>
+<td><code>string</code> (UTF8)</td>
+<td>An UTF-8 string field</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="makeopenvpnconfigfile"></a></p>
+<h2 id="makeopenvpnconfigfile-rpc-api-generate-a-sample-setting-file-for-openvpn-client">&quot;MakeOpenVpnConfigFile&quot; RPC API - Generate a Sample Setting File for OpenVPN Client</h2>
+<h3 id="description-126">Description</h3>
+<p>Generate a Sample Setting File for OpenVPN Client. Originally, the OpenVPN Client requires a user to write a very difficult configuration file manually. This API helps you to make a useful configuration sample. What you need to generate the configuration file for the OpenVPN Client is to run this API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-126">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;MakeOpenVpnConfigFile&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-126">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;ServerName_str&quot;: &quot;servername&quot;,
+    &quot;FilePath_str&quot;: &quot;filepath&quot;,
+    &quot;Offset_u32&quot;: 0,
+    &quot;Buffer_bin&quot;: &quot;SGVsbG8gV29ybGQ=&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-126">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>ServerName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Server name</td>
+</tr>
+<tr>
+<td><code>FilePath_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>File Path</td>
+</tr>
+<tr>
+<td><code>Offset_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Offset to download. You have to call the ReadLogFile API multiple times to download the entire log file with requesting a part of the file by specifying the Offset_u32 field.</td>
+</tr>
+<tr>
+<td><code>Buffer_bin</code></td>
+<td><code>string</code> (Base64 binary)</td>
+<td>Received buffer</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="setspeciallistener"></a></p>
+<h2 id="setspeciallistener-rpc-api-enable-disable-the-vpn-over-icmp-vpn-over-dns-server-function">&quot;SetSpecialListener&quot; RPC API - Enable / Disable the VPN over ICMP / VPN over DNS Server Function</h2>
+<h3 id="description-127">Description</h3>
+<p>Enable / Disable the VPN over ICMP / VPN over DNS Server Function. You can establish a VPN only with ICMP or DNS packets even if there is a firewall or routers which blocks TCP/IP communications. You have to enable the following functions beforehand. Warning: Use this function for emergency only. It is helpful when a firewall or router is misconfigured to blocks TCP/IP, but either ICMP or DNS is not blocked. It is not for long-term stable using. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge.</p>
+<h3 id="input-json-rpc-format-127">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetSpecialListener&quot;,
+  &quot;params&quot;: {
+    &quot;VpnOverIcmpListener_bool&quot;: false,
+    &quot;VpnOverDnsListener_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-127">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;VpnOverIcmpListener_bool&quot;: false,
+    &quot;VpnOverDnsListener_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="parameters-127">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>VpnOverIcmpListener_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag to activate the VPN over ICMP server function</td>
+</tr>
+<tr>
+<td><code>VpnOverDnsListener_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag to activate the VPN over DNS function</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getspeciallistener"></a></p>
+<h2 id="getspeciallistener-rpc-api-get-current-setting-of-the-vpn-over-icmp-vpn-over-dns-function">&quot;GetSpecialListener&quot; RPC API - Get Current Setting of the VPN over ICMP / VPN over DNS Function</h2>
+<h3 id="description-128">Description</h3>
+<p>Get Current Setting of the VPN over ICMP / VPN over DNS Function. Get and show the current VPN over ICMP / VPN over DNS Function status. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge.</p>
+<h3 id="input-json-rpc-format-128">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetSpecialListener&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-128">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;VpnOverIcmpListener_bool&quot;: false,
+    &quot;VpnOverDnsListener_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="parameters-128">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>VpnOverIcmpListener_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag to activate the VPN over ICMP server function</td>
+</tr>
+<tr>
+<td><code>VpnOverDnsListener_bool</code></td>
+<td><code>boolean</code></td>
+<td>The flag to activate the VPN over DNS function</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getazurestatus"></a></p>
+<h2 id="getazurestatus-rpc-api-show-the-current-status-of-vpn-azure-function">&quot;GetAzureStatus&quot; RPC API - Show the current status of VPN Azure function</h2>
+<h3 id="description-129">Description</h3>
+<p>Show the current status of VPN Azure function. Get and show the current status of the VPN Azure function. VPN Azure makes it easier to establish a VPN Session from your home PC to your office PC. While a VPN connection is established, you can access to any other servers on the private network of your company. You don't need a global IP address on the office PC (VPN Server). It can work behind firewalls or NATs. No network administrator's configuration required. You can use the built-in SSTP-VPN Client of Windows in your home PC. VPN Azure is a cloud VPN service operated by SoftEther Corporation. VPN Azure is free of charge and available to anyone. Visit <a href="http://www.vpnazure.net/">http://www.vpnazure.net/</a> to see details and how-to-use instructions. The VPN Azure hostname is same to the hostname of the Dynamic DNS setting, but altering the domain suffix to &quot;vpnazure.net&quot;. To change the hostname use the ChangeDDnsClientHostname API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-129">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetAzureStatus&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-129">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;IsEnabled_bool&quot;: false,
+    &quot;IsConnected_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="parameters-129">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>IsEnabled_bool</code></td>
+<td><code>boolean</code></td>
+<td>Whether VPN Azure Function is Enabled</td>
+</tr>
+<tr>
+<td><code>IsConnected_bool</code></td>
+<td><code>boolean</code></td>
+<td>Whether connection to VPN Azure Cloud Server is established</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="setazurestatus"></a></p>
+<h2 id="setazurestatus-rpc-api-enable-disable-vpn-azure-function">&quot;SetAzureStatus&quot; RPC API - Enable / Disable VPN Azure Function</h2>
+<h3 id="description-130">Description</h3>
+<p>Enable / Disable VPN Azure Function. Enable or disable the VPN Azure function. VPN Azure makes it easier to establish a VPN Session from your home PC to your office PC. While a VPN connection is established, you can access to any other servers on the private network of your company. You don't need a global IP address on the office PC (VPN Server). It can work behind firewalls or NATs. No network administrator's configuration required. You can use the built-in SSTP-VPN Client of Windows in your home PC. VPN Azure is a cloud VPN service operated by SoftEther Corporation. VPN Azure is free of charge and available to anyone. Visit <a href="http://www.vpnazure.net/">http://www.vpnazure.net/</a> to see details and how-to-use instructions. The VPN Azure hostname is same to the hostname of the Dynamic DNS setting, but altering the domain suffix to &quot;vpnazure.net&quot;. To change the hostname use the ChangeDDnsClientHostname API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.</p>
+<h3 id="input-json-rpc-format-130">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetAzureStatus&quot;,
+  &quot;params&quot;: {
+    &quot;IsEnabled_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-130">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;IsEnabled_bool&quot;: false,
+    &quot;IsConnected_bool&quot;: false
+  }
+}
+</code></pre>
+<h3 id="parameters-130">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>IsEnabled_bool</code></td>
+<td><code>boolean</code></td>
+<td>Whether VPN Azure Function is Enabled</td>
+</tr>
+<tr>
+<td><code>IsConnected_bool</code></td>
+<td><code>boolean</code></td>
+<td>Whether connection to VPN Azure Cloud Server is established</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="getddnsinternetsettng"></a></p>
+<h2 id="getddnsinternetsettng-rpc-api-get-the-proxy-settings-for-connecting-to-the-ddns-server">&quot;GetDDnsInternetSettng&quot; RPC API - Get the Proxy Settings for Connecting to the DDNS server</h2>
+<h3 id="description-131">Description</h3>
+<p>Get the Proxy Settings for Connecting to the DDNS server.</p>
+<h3 id="input-json-rpc-format-131">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;GetDDnsInternetSettng&quot;,
+  &quot;params&quot;: {}
+}
+</code></pre>
+<h3 id="output-json-rpc-format-131">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;ProxyType_u32&quot;: 0,
+    &quot;ProxyHostName_str&quot;: &quot;proxyhostname&quot;,
+    &quot;ProxyPort_u32&quot;: 0,
+    &quot;ProxyUsername_str&quot;: &quot;proxyusername&quot;,
+    &quot;ProxyPassword_str&quot;: &quot;proxypassword&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-131">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>ProxyType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Type of proxy server<BR>Values:<BR><code>0</code>: Direct TCP connection<BR><code>1</code>: Connection via HTTP proxy server<BR><code>2</code>: Connection via SOCKS proxy server</td>
+</tr>
+<tr>
+<td><code>ProxyHostName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Proxy server host name</td>
+</tr>
+<tr>
+<td><code>ProxyPort_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Proxy server port number</td>
+</tr>
+<tr>
+<td><code>ProxyUsername_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Proxy server user name</td>
+</tr>
+<tr>
+<td><code>ProxyPassword_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Proxy server password</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p><a id="setddnsinternetsettng"></a></p>
+<h2 id="setddnsinternetsettng-rpc-api-set-the-proxy-settings-for-connecting-to-the-ddns-server">&quot;SetDDnsInternetSettng&quot; RPC API - Set the Proxy Settings for Connecting to the DDNS server</h2>
+<h3 id="description-132">Description</h3>
+<p>Set the Proxy Settings for Connecting to the DDNS server.</p>
+<h3 id="input-json-rpc-format-132">Input JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;method&quot;: &quot;SetDDnsInternetSettng&quot;,
+  &quot;params&quot;: {
+    &quot;ProxyType_u32&quot;: 0,
+    &quot;ProxyHostName_str&quot;: &quot;proxyhostname&quot;,
+    &quot;ProxyPort_u32&quot;: 0,
+    &quot;ProxyUsername_str&quot;: &quot;proxyusername&quot;,
+    &quot;ProxyPassword_str&quot;: &quot;proxypassword&quot;
+  }
+}
+</code></pre>
+<h3 id="output-json-rpc-format-132">Output JSON-RPC Format</h3>
+<pre><code class="language-json">{
+  &quot;jsonrpc&quot;: &quot;2.0&quot;,
+  &quot;id&quot;: &quot;rpc_call_id&quot;,
+  &quot;result&quot;: {
+    &quot;ProxyType_u32&quot;: 0,
+    &quot;ProxyHostName_str&quot;: &quot;proxyhostname&quot;,
+    &quot;ProxyPort_u32&quot;: 0,
+    &quot;ProxyUsername_str&quot;: &quot;proxyusername&quot;,
+    &quot;ProxyPassword_str&quot;: &quot;proxypassword&quot;
+  }
+}
+</code></pre>
+<h3 id="parameters-132">Parameters</h3>
+<table>
+<thead>
+<tr>
+<th>Name</th>
+<th>Type</th>
+<th>Descrption</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>ProxyType_u32</code></td>
+<td><code>number</code> (enum)</td>
+<td>Type of proxy server<BR>Values:<BR><code>0</code>: Direct TCP connection<BR><code>1</code>: Connection via HTTP proxy server<BR><code>2</code>: Connection via SOCKS proxy server</td>
+</tr>
+<tr>
+<td><code>ProxyHostName_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Proxy server host name</td>
+</tr>
+<tr>
+<td><code>ProxyPort_u32</code></td>
+<td><code>number</code> (uint32)</td>
+<td>Proxy server port number</td>
+</tr>
+<tr>
+<td><code>ProxyUsername_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Proxy server user name</td>
+</tr>
+<tr>
+<td><code>ProxyPassword_str</code></td>
+<td><code>string</code> (ASCII)</td>
+<td>Proxy server password</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p>Automatically generated at 2019-06-29 21:13:00 by vpnserver-jsonrpc-codegen.<br />
+Copyright (c) 2014-2019 <a href="https://www.softether.org/">SoftEther VPN Project</a> under the Apache License 2.0.</p>
+
+	</article>
+</body>
+</html>

+ 2 - 0
src/bin/hamcore/warning_cn.txt

@@ -24,6 +24,8 @@ SoftEther VPN 具有 UDP 加速功能。如果一个 VPN 是由两个站点组
 
 
 2. VPN 软件
+The notes in this section are not specific to SoftEther VPN or VPN Gate, but apply to general system software. SoftEther VPN Client, SoftEther VPN Server, SoftEther VPN Bridge, and VPN Gate Relay Service will be installed on your computer as system services. System services always run in the background. System services usually do not appear on the computer display. Then your computer system is booted, system services automatically start in the background even before you or other users log in. To check whether PacketiX-related system service is running, check the process list or the background service list of your OS (called as "Services" in Windows, or "Daemons" in UNIX.) You can activate, deactivate, start, or stop system services using the functions of the OS anytime. PacketiX-related GUI tools for managing system services communicate with these system services. After you terminate these management GUI tools, PacketiX-related system services will continue to run in the background. System services consume CPU time, computer power, memory and disk space. Because system services consume power, your electricity charges and amount of thermal of your computer increase as result. In addition, there is a possibility that the mechanical parts of the life of your computer is reduced.
+
 2.1. SoftEther VPN 客户端
 如果您在 Windows 上使用 SoftEther VPN 客户端,虚拟网络适配器设备驱动程序将安装在 Windows 上。虚拟网络适配器作为一个内核模式驱动程序实施在 Windows 上。驱动程序是数字签名的,由 VeriSign , Inc 所签发的证书,还由 Symantec Corporation (赛门铁克公司) 签署。问你要确保安装驱动程序的一条消息可能会弹出在屏幕上。如果可能的话, SoftEther VPN 客户端可能会响应消息。SoftEther VPN 客户端还优化了在 Windows 上 MMCSS (多媒体类计划程序服务) 的配置。您以后可以撤消 MMCSS 的优化。
 

+ 2 - 0
src/bin/hamcore/warning_en.txt

@@ -24,6 +24,8 @@ SoftEther VPN has the UDP Acceleration Function. If a VPN consists of two sites
 
 
 2. VPN Software
+The notes in this section are not specific to SoftEther VPN or VPN Gate, but apply to general system software. SoftEther VPN Client, SoftEther VPN Server, SoftEther VPN Bridge, and VPN Gate Relay Service will be installed on your computer as system services. System services always run in the background. System services usually do not appear on the computer display. Then your computer system is booted, system services automatically start in the background even before you or other users log in. To check whether PacketiX-related system service is running, check the process list or the background service list of your OS (called as "Services" in Windows, or "Daemons" in UNIX.) You can activate, deactivate, start, or stop system services using the functions of the OS anytime. PacketiX-related GUI tools for managing system services communicate with these system services. After you terminate these management GUI tools, PacketiX-related system services will continue to run in the background. System services consume CPU time, computer power, memory and disk space. Because system services consume power, your electricity charges and amount of thermal of your computer increase as result. In addition, there is a possibility that the mechanical parts of the life of your computer is reduced.
+
 2.1. SoftEther VPN Client
 If you use SoftEther VPN Client on Windows, the Virtual Network Adapter device driver will be installed on Windows. The Virtual Network Adapter is implemented as a kernel-mode driver for Windows. The driver is digitally-signed by a certificate issued by VeriSign, Inc. and also sub-signed by Symantec Corporation. A message to ask you want to sure install the driver might be popped up on the screen. SoftEther VPN Client may response the message if possible. SoftEther VPN Client also optimizes the configuration of MMCSS (Multimedia Class Scheduler Service) on Windows. You can undo the optimizations of MMCSS afterwards.
 

+ 2 - 0
src/bin/hamcore/warning_ja.txt

@@ -24,6 +24,8 @@ SoftEther VPN には UDP 高速化機能が搭載されています。VPN を構
 
 
 2. VPN ソフトウェアについて
+この節で述べる注意事項は、SoftEther VPN および VPN Gate 特有のものではなく、一般的なシステムソフトウェアに当てはまる事項です。VPN ソフトウェアを構成する SoftEther VPN Client, SoftEther VPN Server および SoftEther VPN Bridge ならびに VPN Gate 中継サービスは、バックグラウンドで動作するシステムサービスとしてコンピュータにインストールされます。システムサービスは、通常、ディスプレイに表示されません。また、システムを起動した際に自動的に、ユーザーによるログイン前であっても、バックグラウンドで動作を開始します。システムサービスが稼働しているかどうかを確認するためには、プロセス一覧を確認するか、お使いの OS のバックグラウンドサービス一覧 (Windows においては「サービス」、UNIX においては「デーモン」と呼称されます。) を確認してください。また、OS の有する機能を用いて、システムサービスを有効化、無効化、開始または停止することができます。システムサービスを管理するための GUI ツールは、システムサービスとの間で通信を行ないます。これらの管理 GUI ツールを終了しても、システムサービスは継続してバックグラウンドで動作し続けます。システムサービスは、CPU 時間、コンピュータの消費電力、メモリおよびディスクの容量を消費します。システムサービスは、電力を消費するため、コンピュータに係る電気料金や発熱が増加する可能性があります。さらに、コンピュータの機械部分の寿命が短くなる可能性もあります。
+
 2.1. SoftEther VPN Client
 SoftEther VPN Client を Windows で使用する場合は、仮想 LAN カードをコンピュータにインストールする必要があります。仮想 LAN カードは Windows 上で動作するカーネルモードドライバとして実装されています。当該ドライバは VeriSign 社の発行する証明書によってデジタル署名されており、Symantec 社による副署名もされています。ドライバのインストール時には本当にドライバをインストールするかどうかの確認メッセージが表示される場合があります。SoftEther VPN Client は可能な場合は自動的に当該確認メッセージに応答します。SoftEther VPN Client はインストール時に通信を最適化するため Windows の MMCSS (Multimedia Class Scheduler Service) の設定を最適化します。MMCSS の設定の最適化は後から元に戻すことができます。
 

+ 22 - 0
src/bin/hamcore/wwwroot/admin/README.md

@@ -0,0 +1,22 @@
+# About "admin" directory (for developers)
+This `bin/hamcore/wwwroot/admin/` directory is the web contents root of the embedded HTML5 web administration console: `http://<vpn_server_host>:<port>/admin/`.
+
+Currently there is only the `default/` sub directory. It is corresponding to `http://<vpn_server_host>:<port>/admin/default/`.
+
+
+The `/admin/index.html` file always redirects all clients to the `/admin/default/`.
+
+
+If you are willing to develop the web-based administration console you have two choices:
+
+1. Modify and improve the `/admin/default/` project.
+
+
+2. Create your entirely new web project in the `/admin/NEW_PATH_HERE/` directory. You can choose the unique directory name instead of `NEW_PATH_HERE` on the above directory path.
+  
+
+If you want to create an independent new web project, the choice #2 is the best way. You can do anything freely in your new directory. In such a case, please edit the `/admin/index.html` not to redirect to the `/admin/default/index.html` automatically. Instead, put the list of the systems for each of sub directories in the `/admin/index.html` so that the user can choose which system to use.
+
+
+  
+

+ 1 - 0
src/bin/hamcore/wwwroot/admin/default/.gitignore

@@ -0,0 +1 @@
+node_modules/

+ 16 - 0
src/bin/hamcore/wwwroot/admin/default/.vscode/launch.json

@@ -0,0 +1,16 @@
+{
+    "version": "0.2.0",
+    "configurations": [
+        {
+            "type": "chrome",
+            "request": "launch",
+            "trace": true,
+            "sourceMaps": true,
+            "name": "Launch Chrome",
+            "preLaunchTask": "webpack build",
+            "file": "${workspaceFolder}/index.html",
+            "webRoot": "${workspaceFolder}",
+            "internalConsoleOptions": "openOnSessionStart"
+        }
+    ]
+}

+ 5 - 0
src/bin/hamcore/wwwroot/admin/default/.vscode/settings.json

@@ -0,0 +1,5 @@
+{
+    "files.associations": {
+        "tsconfig_webpack.json": "jsonc"
+    }
+}

+ 45 - 0
src/bin/hamcore/wwwroot/admin/default/.vscode/tasks.json

@@ -0,0 +1,45 @@
+{
+    "version": "2.0.0",
+    "tasks": [
+        {
+            "label": "webpack build",
+            "type": "npm",
+            "script": "build",
+            "problemMatcher": [],
+            "group": {
+                "kind": "build",
+                "isDefault": true
+            }
+        },
+        {
+            "label": "webpack watch",
+            "type": "npm",
+            "script": "watch",
+            "isBackground": true,
+            "problemMatcher": {
+                "pattern": {
+                    "regexp": "^$"
+                },
+                "background": {
+                    "activeOnStart": true,
+                    "beginsPattern": ".*Version: webpack.*",
+                    "endsPattern": ".*\\[built\\]"
+                },
+            }
+        },
+        {
+            "label": "tsc build",
+            "type": "typescript",
+            "tsconfig": "tsconfig.json",
+        },
+        {
+            "label": "tsc watch",
+            "type": "typescript",
+            "tsconfig": "tsconfig.json",
+            "option": "watch",
+            "problemMatcher": [
+                "$tsc-watch"
+            ]
+        }
+    ]
+}

+ 23 - 0
src/bin/hamcore/wwwroot/admin/default/hub.html

@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<!--#include file="include_head.html" -->
+    <body>
+<!--#include file="include_menu.html" -->
+<div class="container theme-showcase" role="main">
+        <H2><div id="HUB_NAME"></div></H2>
+
+        <button class="btn btn-lg btn-danger" onclick="JS.DeleteVirtualHub(location.search);">Delete this Virtual Hub</button>
+
+        <H3>List of Users</H3>
+        <ul id="USERS_LIST"></ul>
+
+        <H3>List of Active VPN Sessions</H3>
+        <ul id="SESSIONS_LIST"></ul>
+<!--#include file="include_footer.html" -->
+</div>
+    </body>
+    <script>
+        JS.HubAdminPage(location.search);
+    </script>
+</html>
+

+ 4 - 0
src/bin/hamcore/wwwroot/admin/default/include_footer.html

@@ -0,0 +1,4 @@
+<p> </p>
+<p> </p>
+<hr />
+<p>Copyright (c) SoftEther VPN Project under the Apache License 2.0.</p>

+ 9 - 0
src/bin/hamcore/wwwroot/admin/default/include_head.html

@@ -0,0 +1,9 @@
+<head>
+    <title>SoftEther VPN Server HTML5 Web Administration Console (Under construction!)</title>
+    <script src="out_webpack/bundle.js"></script>
+    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" crossorigin="anonymous">
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" crossorigin="anonymous">
+    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" crossorigin="anonymous"></script>
+    <link href="theme.css" rel="stylesheet">
+</head>

+ 29 - 0
src/bin/hamcore/wwwroot/admin/default/include_menu.html

@@ -0,0 +1,29 @@
+<!-- Fixed navbar -->
+<nav class="navbar navbar-inverse navbar-fixed-top">
+    <div class="container">
+        <div class="navbar-header">
+            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar"
+                aria-expanded="false" aria-controls="navbar">
+                <span class="sr-only">Toggle navigation</span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+            </button>
+            <a class="navbar-brand" href="./">SoftEther VPN Server Web Admin Console</a>
+        </div>
+        <div id="navbar" class="navbar-collapse collapse">
+            <ul class="nav navbar-nav">
+                <li><a href="/api/">JSON-RPC API Reference</a></li>
+                <li class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"
+                        aria-expanded="false">About <span class="caret"></span></a>
+                    <ul class="dropdown-menu">
+                        <li><a href="https://github.com/SoftEtherVPN/SoftEtherVPN">SoftEther VPN on GitHub</a></li>
+                        <li><a href="https://www.softether.org/">SoftEther.org Web Site</a></li>
+                    </ul>
+                </li>
+            </ul>
+        </div>
+        <!--/.nav-collapse -->
+    </div>
+</nav>

+ 45 - 0
src/bin/hamcore/wwwroot/admin/default/index.html

@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html>
+<!--#include file="include_head.html" -->
+    <body>
+<!--#include file="include_menu.html" -->
+<div class="container theme-showcase" role="main">
+        <H2>SoftEther VPN Server HTML5 Ajax-based Web Administration Console<BR>(Under construction!)</H2>
+        <p>This is the sample of HTML5 Ajax-based VPN Server Web Administration Console.</p>
+        <p>The purpose of this HTML5 admin page is to make administrators easy to set up and manage the running VPN Servers.</p>
+        <h3>Authentication for this page</h3>
+        <p>You must supply the HTTP basic authentication credential as following.</p>
+        <ul>
+            <li>To login to the VPN server as the entire server administrator, specify empty or "administrator" as the username field,
+            and specify the server administrative password as the password field.</li>
+            <li>To login to a particular Virtual Hub as the hub administrator, specify the hub name as the username field, and specify
+            the hub administrative password as the password field.</li>
+        </ul>
+
+        <h3>Your HTML5 development contribution is very appreciated</h3>
+        <p>This HTML5 page is obviously under construction, and providing very minimum functions as sample.<BR>This initial page is written by Daiyuu Nobori (the core developer of SoftEther VPN). He is obviously lack of HTML5 development ability.<BR>Please kindly consider to contribute for <strong><a href="https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/src/bin/hamcore/wwwroot/admin/">SoftEther VPN's development on GitHub.</a></strong> Your code will help every people running SoftEther VPN Server.</p>
+
+        <p>This HTML5 page's JavaScript codes directly call <strong><a href="/api/">SoftEther VPN Server JSON-RPC API</a></strong> on the running VPN Server from the web browser.<BR>You can also call the <strong><a href="/api/">SoftEther VPN Server JSON-RPC API</a></strong> remotely from your original application. (JavaScript, TypeScript, C#, Java, Python, Ruby, etc.)</p>
+            <p><a href="/api/"><strong>The insanely kindness API reference</strong></a> is available.</p>
+
+        <H3>List of Virtual Hubs</H3>
+        <ul id="HUB_LIST"></ul>
+
+        <H3>Create new Virtual Hub</H3>
+        Virtual Hub Name:<BR>
+        <input id="NEW_HUB_NAME" /> <button class="btn btn-lg btn-primary" onclick="JS.CreateNewHub($('#NEW_HUB_NAME').val(), '#HUB_LIST')">Create</button>
+
+        <H3>VPN Server Information</H3>
+        <ul id="VPN_SERVER_INFO"></ul>
+
+        <H3>VPN Server Status</H3>
+        <ul id="VPN_SERVER_STATUS"></ul>
+<!--#include file="include_footer.html" -->
+        </div>
+    </body>
+    <script>
+        JS.ShowVpnServerInfo("#VPN_SERVER_INFO", "#VPN_SERVER_STATUS");
+        JS.ListVirtualHubs("#HUB_LIST");
+    </script>
+</html>
+

文件差异内容过多而无法显示
+ 97 - 0
src/bin/hamcore/wwwroot/admin/default/out_webpack/bundle.js


+ 10 - 0
src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts

@@ -0,0 +1,10 @@
+import "core-js/es/promise";
+import "core-js/es/string";
+import "whatwg-fetch";
+/** API test for 'Test', test RPC function */
+export declare function Test_Test(): Promise<void>;
+export declare function ListVirtualHubs(id: string): Promise<void>;
+export declare function ShowVpnServerInfo(idInfo: string, idStatus: string): Promise<void>;
+export declare function CreateNewHub(hubName: string, idList: string): Promise<void>;
+export declare function HubAdminPage(queryString: string): Promise<void>;
+//# sourceMappingURL=index.d.ts.map

+ 1 - 0
src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts.map

@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ts/index.ts"],"names":[],"mappings":"AAOA,OAAO,oBAAoB,CAAC;AAC5B,OAAO,mBAAmB,CAAC;AAC3B,OAAO,cAAc,CAAC;AAwBtB,6CAA6C;AAC7C,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAY/C;AAED,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY/D;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBvF;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BjF;AAED,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBrE"}

+ 11 - 0
src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts

@@ -0,0 +1,11 @@
+import "core-js/es/promise";
+import "core-js/es/string";
+import "whatwg-fetch";
+/** API test for 'Test', test RPC function */
+export declare function Test_Test(): Promise<void>;
+export declare function ListVirtualHubs(id: string): Promise<void>;
+export declare function ShowVpnServerInfo(idInfo: string, idStatus: string): Promise<void>;
+export declare function CreateNewHub(hubName: string, idList: string): Promise<void>;
+export declare function DeleteVirtualHub(queryString: string): Promise<void>;
+export declare function HubAdminPage(queryString: string): Promise<void>;
+//# sourceMappingURL=main.d.ts.map

+ 1 - 0
src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts.map

@@ -0,0 +1 @@
+{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/ts/main.ts"],"names":[],"mappings":"AAOA,OAAO,oBAAoB,CAAC;AAC5B,OAAO,mBAAmB,CAAC;AAC3B,OAAO,cAAc,CAAC;AAwBtB,6CAA6C;AAC7C,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAY/C;AAED,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY/D;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBvF;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BjF;AAcD,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBzE;AAED,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDrE"}

+ 2 - 0
src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts

@@ -0,0 +1,2 @@
+export {};
+//# sourceMappingURL=vpnadmin.d.ts.map

+ 1 - 0
src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts.map

@@ -0,0 +1 @@
+{"version":3,"file":"vpnadmin.d.ts","sourceRoot":"","sources":["../../src/ts/vpnadmin.ts"],"names":[],"mappings":""}

+ 4709 - 0
src/bin/hamcore/wwwroot/admin/default/package-lock.json

@@ -0,0 +1,4709 @@
+{
+  "name": "default",
+  "version": "1.0.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "@babel/code-frame": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+      "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+      "dev": true,
+      "requires": {
+        "@babel/highlight": "^7.0.0"
+      }
+    },
+    "@babel/highlight": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+      "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.0.0",
+        "esutils": "^2.0.2",
+        "js-tokens": "^4.0.0"
+      }
+    },
+    "@types/jquery": {
+      "version": "3.3.29",
+      "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.3.29.tgz",
+      "integrity": "sha512-FhJvBninYD36v3k6c+bVk1DSZwh7B5Dpb/Pyk3HKVsiohn0nhbefZZ+3JXbWQhFyt0MxSl2jRDdGQPHeOHFXrQ==",
+      "dev": true,
+      "requires": {
+        "@types/sizzle": "*"
+      }
+    },
+    "@types/sizzle": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz",
+      "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==",
+      "dev": true
+    },
+    "@webassemblyjs/ast": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz",
+      "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/helper-module-context": "1.8.5",
+        "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
+        "@webassemblyjs/wast-parser": "1.8.5"
+      }
+    },
+    "@webassemblyjs/floating-point-hex-parser": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz",
+      "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-api-error": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz",
+      "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-buffer": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz",
+      "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-code-frame": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz",
+      "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/wast-printer": "1.8.5"
+      }
+    },
+    "@webassemblyjs/helper-fsm": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz",
+      "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-module-context": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz",
+      "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.8.5",
+        "mamacro": "^0.0.3"
+      }
+    },
+    "@webassemblyjs/helper-wasm-bytecode": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz",
+      "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-wasm-section": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz",
+      "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.8.5",
+        "@webassemblyjs/helper-buffer": "1.8.5",
+        "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
+        "@webassemblyjs/wasm-gen": "1.8.5"
+      }
+    },
+    "@webassemblyjs/ieee754": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz",
+      "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==",
+      "dev": true,
+      "requires": {
+        "@xtuc/ieee754": "^1.2.0"
+      }
+    },
+    "@webassemblyjs/leb128": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz",
+      "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==",
+      "dev": true,
+      "requires": {
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "@webassemblyjs/utf8": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz",
+      "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==",
+      "dev": true
+    },
+    "@webassemblyjs/wasm-edit": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz",
+      "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.8.5",
+        "@webassemblyjs/helper-buffer": "1.8.5",
+        "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
+        "@webassemblyjs/helper-wasm-section": "1.8.5",
+        "@webassemblyjs/wasm-gen": "1.8.5",
+        "@webassemblyjs/wasm-opt": "1.8.5",
+        "@webassemblyjs/wasm-parser": "1.8.5",
+        "@webassemblyjs/wast-printer": "1.8.5"
+      }
+    },
+    "@webassemblyjs/wasm-gen": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz",
+      "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.8.5",
+        "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
+        "@webassemblyjs/ieee754": "1.8.5",
+        "@webassemblyjs/leb128": "1.8.5",
+        "@webassemblyjs/utf8": "1.8.5"
+      }
+    },
+    "@webassemblyjs/wasm-opt": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz",
+      "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.8.5",
+        "@webassemblyjs/helper-buffer": "1.8.5",
+        "@webassemblyjs/wasm-gen": "1.8.5",
+        "@webassemblyjs/wasm-parser": "1.8.5"
+      }
+    },
+    "@webassemblyjs/wasm-parser": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz",
+      "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.8.5",
+        "@webassemblyjs/helper-api-error": "1.8.5",
+        "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
+        "@webassemblyjs/ieee754": "1.8.5",
+        "@webassemblyjs/leb128": "1.8.5",
+        "@webassemblyjs/utf8": "1.8.5"
+      }
+    },
+    "@webassemblyjs/wast-parser": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz",
+      "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.8.5",
+        "@webassemblyjs/floating-point-hex-parser": "1.8.5",
+        "@webassemblyjs/helper-api-error": "1.8.5",
+        "@webassemblyjs/helper-code-frame": "1.8.5",
+        "@webassemblyjs/helper-fsm": "1.8.5",
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "@webassemblyjs/wast-printer": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz",
+      "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.8.5",
+        "@webassemblyjs/wast-parser": "1.8.5",
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "@xtuc/ieee754": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+      "dev": true
+    },
+    "@xtuc/long": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+      "dev": true
+    },
+    "acorn": {
+      "version": "6.1.1",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz",
+      "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==",
+      "dev": true
+    },
+    "acorn-dynamic-import": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz",
+      "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==",
+      "dev": true
+    },
+    "ajv": {
+      "version": "6.10.0",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz",
+      "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==",
+      "dev": true,
+      "requires": {
+        "fast-deep-equal": "^2.0.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      }
+    },
+    "ajv-errors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
+      "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
+      "dev": true
+    },
+    "ajv-keywords": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz",
+      "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==",
+      "dev": true
+    },
+    "ansi-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+      "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+      "dev": true
+    },
+    "ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "dev": true,
+      "requires": {
+        "color-convert": "^1.9.0"
+      }
+    },
+    "anymatch": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+      "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+      "dev": true,
+      "requires": {
+        "micromatch": "^3.1.4",
+        "normalize-path": "^2.1.1"
+      },
+      "dependencies": {
+        "braces": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.1"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "fill-range": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+          "dev": true,
+          "requires": {
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.1.0"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "micromatch": {
+          "version": "3.1.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "dev": true,
+          "requires": {
+            "arr-diff": "^4.0.0",
+            "array-unique": "^0.3.2",
+            "braces": "^2.3.1",
+            "define-property": "^2.0.2",
+            "extend-shallow": "^3.0.2",
+            "extglob": "^2.0.4",
+            "fragment-cache": "^0.2.1",
+            "kind-of": "^6.0.2",
+            "nanomatch": "^1.2.9",
+            "object.pick": "^1.3.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
+          }
+        },
+        "normalize-path": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+          "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+          "dev": true,
+          "requires": {
+            "remove-trailing-separator": "^1.0.1"
+          }
+        },
+        "to-regex-range": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+          "dev": true,
+          "requires": {
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1"
+          }
+        }
+      }
+    },
+    "aproba": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
+      "dev": true
+    },
+    "argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "dev": true,
+      "requires": {
+        "sprintf-js": "~1.0.2"
+      }
+    },
+    "arr-diff": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+      "dev": true
+    },
+    "arr-flatten": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+      "dev": true
+    },
+    "arr-union": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+      "dev": true
+    },
+    "array-unique": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+      "dev": true
+    },
+    "asn1.js": {
+      "version": "4.10.1",
+      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
+      "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.0.0",
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "assert": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
+      "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
+      "dev": true,
+      "requires": {
+        "object-assign": "^4.1.1",
+        "util": "0.10.3"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+          "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+          "dev": true
+        },
+        "util": {
+          "version": "0.10.3",
+          "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+          "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+          "dev": true,
+          "requires": {
+            "inherits": "2.0.1"
+          }
+        }
+      }
+    },
+    "assign-symbols": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+      "dev": true
+    },
+    "async-each": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
+      "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
+      "dev": true
+    },
+    "atob": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+      "dev": true
+    },
+    "balanced-match": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+      "dev": true
+    },
+    "base": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+      "dev": true,
+      "requires": {
+        "cache-base": "^1.0.1",
+        "class-utils": "^0.3.5",
+        "component-emitter": "^1.2.1",
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.1",
+        "mixin-deep": "^1.2.0",
+        "pascalcase": "^0.1.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "base64-js": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
+      "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==",
+      "dev": true
+    },
+    "big.js": {
+      "version": "5.2.2",
+      "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+      "dev": true
+    },
+    "binary-extensions": {
+      "version": "1.13.1",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
+      "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
+      "dev": true
+    },
+    "bluebird": {
+      "version": "3.5.5",
+      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz",
+      "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==",
+      "dev": true
+    },
+    "bn.js": {
+      "version": "4.11.8",
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
+      "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
+      "dev": true
+    },
+    "brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "requires": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "braces": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "dev": true,
+      "requires": {
+        "fill-range": "^7.0.1"
+      }
+    },
+    "brorand": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
+      "dev": true
+    },
+    "browserify-aes": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+      "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+      "dev": true,
+      "requires": {
+        "buffer-xor": "^1.0.3",
+        "cipher-base": "^1.0.0",
+        "create-hash": "^1.1.0",
+        "evp_bytestokey": "^1.0.3",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "browserify-cipher": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+      "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
+      "dev": true,
+      "requires": {
+        "browserify-aes": "^1.0.4",
+        "browserify-des": "^1.0.0",
+        "evp_bytestokey": "^1.0.0"
+      }
+    },
+    "browserify-des": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
+      "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
+      "dev": true,
+      "requires": {
+        "cipher-base": "^1.0.1",
+        "des.js": "^1.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "browserify-rsa": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
+      "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "randombytes": "^2.0.1"
+      }
+    },
+    "browserify-sign": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
+      "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.1",
+        "browserify-rsa": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "create-hmac": "^1.1.2",
+        "elliptic": "^6.0.0",
+        "inherits": "^2.0.1",
+        "parse-asn1": "^5.0.0"
+      }
+    },
+    "browserify-zlib": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+      "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
+      "dev": true,
+      "requires": {
+        "pako": "~1.0.5"
+      }
+    },
+    "buffer": {
+      "version": "4.9.1",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
+      "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
+      "dev": true,
+      "requires": {
+        "base64-js": "^1.0.2",
+        "ieee754": "^1.1.4",
+        "isarray": "^1.0.0"
+      }
+    },
+    "buffer-from": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
+      "dev": true
+    },
+    "buffer-xor": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
+      "dev": true
+    },
+    "builtin-modules": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+      "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+      "dev": true
+    },
+    "builtin-status-codes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
+      "dev": true
+    },
+    "cacache": {
+      "version": "11.3.2",
+      "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz",
+      "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==",
+      "dev": true,
+      "requires": {
+        "bluebird": "^3.5.3",
+        "chownr": "^1.1.1",
+        "figgy-pudding": "^3.5.1",
+        "glob": "^7.1.3",
+        "graceful-fs": "^4.1.15",
+        "lru-cache": "^5.1.1",
+        "mississippi": "^3.0.0",
+        "mkdirp": "^0.5.1",
+        "move-concurrently": "^1.0.1",
+        "promise-inflight": "^1.0.1",
+        "rimraf": "^2.6.2",
+        "ssri": "^6.0.1",
+        "unique-filename": "^1.1.1",
+        "y18n": "^4.0.0"
+      }
+    },
+    "cache-base": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+      "dev": true,
+      "requires": {
+        "collection-visit": "^1.0.0",
+        "component-emitter": "^1.2.1",
+        "get-value": "^2.0.6",
+        "has-value": "^1.0.0",
+        "isobject": "^3.0.1",
+        "set-value": "^2.0.0",
+        "to-object-path": "^0.3.0",
+        "union-value": "^1.0.0",
+        "unset-value": "^1.0.0"
+      }
+    },
+    "camelcase": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+      "dev": true
+    },
+    "chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      }
+    },
+    "chokidar": {
+      "version": "2.1.6",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz",
+      "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==",
+      "dev": true,
+      "requires": {
+        "anymatch": "^2.0.0",
+        "async-each": "^1.0.1",
+        "braces": "^2.3.2",
+        "fsevents": "^1.2.7",
+        "glob-parent": "^3.1.0",
+        "inherits": "^2.0.3",
+        "is-binary-path": "^1.0.0",
+        "is-glob": "^4.0.0",
+        "normalize-path": "^3.0.0",
+        "path-is-absolute": "^1.0.0",
+        "readdirp": "^2.2.1",
+        "upath": "^1.1.1"
+      },
+      "dependencies": {
+        "braces": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.1"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "fill-range": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+          "dev": true,
+          "requires": {
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.1.0"
+          }
+        },
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          }
+        },
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        },
+        "to-regex-range": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+          "dev": true,
+          "requires": {
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1"
+          }
+        }
+      }
+    },
+    "chownr": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz",
+      "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==",
+      "dev": true
+    },
+    "chrome-trace-event": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz",
+      "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "cipher-base": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+      "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "class-utils": {
+      "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+      "dev": true,
+      "requires": {
+        "arr-union": "^3.1.0",
+        "define-property": "^0.2.5",
+        "isobject": "^3.0.0",
+        "static-extend": "^0.1.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        }
+      }
+    },
+    "cliui": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
+      "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
+      "dev": true,
+      "requires": {
+        "string-width": "^2.1.1",
+        "strip-ansi": "^4.0.0",
+        "wrap-ansi": "^2.0.0"
+      }
+    },
+    "code-point-at": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+      "dev": true
+    },
+    "collection-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+      "dev": true,
+      "requires": {
+        "map-visit": "^1.0.0",
+        "object-visit": "^1.0.0"
+      }
+    },
+    "color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "dev": true,
+      "requires": {
+        "color-name": "1.1.3"
+      }
+    },
+    "color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+      "dev": true
+    },
+    "commander": {
+      "version": "2.20.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
+      "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
+      "dev": true
+    },
+    "commondir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+      "dev": true
+    },
+    "component-emitter": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
+      "dev": true
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+      "dev": true
+    },
+    "concat-stream": {
+      "version": "1.6.2",
+      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+      "dev": true,
+      "requires": {
+        "buffer-from": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.2.2",
+        "typedarray": "^0.0.6"
+      }
+    },
+    "console-browserify": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
+      "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
+      "dev": true,
+      "requires": {
+        "date-now": "^0.1.4"
+      }
+    },
+    "constants-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
+      "dev": true
+    },
+    "copy-concurrently": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
+      "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
+      "dev": true,
+      "requires": {
+        "aproba": "^1.1.1",
+        "fs-write-stream-atomic": "^1.0.8",
+        "iferr": "^0.1.5",
+        "mkdirp": "^0.5.1",
+        "rimraf": "^2.5.4",
+        "run-queue": "^1.0.0"
+      }
+    },
+    "copy-descriptor": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+      "dev": true
+    },
+    "core-js": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.3.tgz",
+      "integrity": "sha512-PWZ+ZfuaKf178BIAg+CRsljwjIMRV8MY00CbZczkR6Zk5LfkSkjGoaab3+bqRQWVITNZxQB7TFYz+CFcyuamvA=="
+    },
+    "core-util-is": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+      "dev": true
+    },
+    "create-ecdh": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
+      "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "elliptic": "^6.0.0"
+      }
+    },
+    "create-hash": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+      "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+      "dev": true,
+      "requires": {
+        "cipher-base": "^1.0.1",
+        "inherits": "^2.0.1",
+        "md5.js": "^1.3.4",
+        "ripemd160": "^2.0.1",
+        "sha.js": "^2.4.0"
+      }
+    },
+    "create-hmac": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+      "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+      "dev": true,
+      "requires": {
+        "cipher-base": "^1.0.3",
+        "create-hash": "^1.1.0",
+        "inherits": "^2.0.1",
+        "ripemd160": "^2.0.0",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
+      }
+    },
+    "cross-spawn": {
+      "version": "6.0.5",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+      "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+      "dev": true,
+      "requires": {
+        "nice-try": "^1.0.4",
+        "path-key": "^2.0.1",
+        "semver": "^5.5.0",
+        "shebang-command": "^1.2.0",
+        "which": "^1.2.9"
+      }
+    },
+    "crypto-browserify": {
+      "version": "3.12.0",
+      "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+      "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
+      "dev": true,
+      "requires": {
+        "browserify-cipher": "^1.0.0",
+        "browserify-sign": "^4.0.0",
+        "create-ecdh": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "create-hmac": "^1.1.0",
+        "diffie-hellman": "^5.0.0",
+        "inherits": "^2.0.1",
+        "pbkdf2": "^3.0.3",
+        "public-encrypt": "^4.0.0",
+        "randombytes": "^2.0.0",
+        "randomfill": "^1.0.3"
+      }
+    },
+    "cyclist": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz",
+      "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=",
+      "dev": true
+    },
+    "date-now": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
+      "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
+      "dev": true
+    },
+    "debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "requires": {
+        "ms": "2.0.0"
+      }
+    },
+    "decamelize": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+      "dev": true
+    },
+    "decode-uri-component": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+      "dev": true
+    },
+    "define-property": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+      "dev": true,
+      "requires": {
+        "is-descriptor": "^1.0.2",
+        "isobject": "^3.0.1"
+      },
+      "dependencies": {
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "des.js": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
+      "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "detect-file": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+      "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
+      "dev": true
+    },
+    "diff": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+      "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+      "dev": true
+    },
+    "diffie-hellman": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+      "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "miller-rabin": "^4.0.0",
+        "randombytes": "^2.0.0"
+      }
+    },
+    "domain-browser": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
+      "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
+      "dev": true
+    },
+    "duplexify": {
+      "version": "3.7.1",
+      "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
+      "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "^1.0.0",
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.0.0",
+        "stream-shift": "^1.0.0"
+      }
+    },
+    "elliptic": {
+      "version": "6.4.1",
+      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz",
+      "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.4.0",
+        "brorand": "^1.0.1",
+        "hash.js": "^1.0.0",
+        "hmac-drbg": "^1.0.0",
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0",
+        "minimalistic-crypto-utils": "^1.0.0"
+      }
+    },
+    "emojis-list": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
+      "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
+      "dev": true
+    },
+    "end-of-stream": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+      "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+      "dev": true,
+      "requires": {
+        "once": "^1.4.0"
+      }
+    },
+    "enhanced-resolve": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz",
+      "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "memory-fs": "^0.4.0",
+        "tapable": "^1.0.0"
+      }
+    },
+    "errno": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
+      "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
+      "dev": true,
+      "requires": {
+        "prr": "~1.0.1"
+      }
+    },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+      "dev": true
+    },
+    "eslint-scope": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
+      "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
+      "dev": true,
+      "requires": {
+        "esrecurse": "^4.1.0",
+        "estraverse": "^4.1.1"
+      }
+    },
+    "esprima": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+      "dev": true
+    },
+    "esrecurse": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
+      "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+      "dev": true,
+      "requires": {
+        "estraverse": "^4.1.0"
+      }
+    },
+    "estraverse": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+      "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+      "dev": true
+    },
+    "esutils": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+      "dev": true
+    },
+    "events": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz",
+      "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==",
+      "dev": true
+    },
+    "evp_bytestokey": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+      "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+      "dev": true,
+      "requires": {
+        "md5.js": "^1.3.4",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "execa": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
+      "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+      "dev": true,
+      "requires": {
+        "cross-spawn": "^6.0.0",
+        "get-stream": "^4.0.0",
+        "is-stream": "^1.1.0",
+        "npm-run-path": "^2.0.0",
+        "p-finally": "^1.0.0",
+        "signal-exit": "^3.0.0",
+        "strip-eof": "^1.0.0"
+      }
+    },
+    "expand-brackets": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+      "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+      "dev": true,
+      "requires": {
+        "debug": "^2.3.3",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "posix-character-classes": "^0.1.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "expand-tilde": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+      "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+      "dev": true,
+      "requires": {
+        "homedir-polyfill": "^1.0.1"
+      }
+    },
+    "extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+      "dev": true,
+      "requires": {
+        "assign-symbols": "^1.0.0",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "extglob": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+      "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+      "dev": true,
+      "requires": {
+        "array-unique": "^0.3.2",
+        "define-property": "^1.0.0",
+        "expand-brackets": "^2.1.4",
+        "extend-shallow": "^2.0.1",
+        "fragment-cache": "^0.2.1",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "fast-deep-equal": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+      "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+      "dev": true
+    },
+    "fast-json-stable-stringify": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
+      "dev": true
+    },
+    "figgy-pudding": {
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz",
+      "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==",
+      "dev": true
+    },
+    "fill-range": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "dev": true,
+      "requires": {
+        "to-regex-range": "^5.0.1"
+      }
+    },
+    "find-cache-dir": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
+      "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
+      "dev": true,
+      "requires": {
+        "commondir": "^1.0.1",
+        "make-dir": "^2.0.0",
+        "pkg-dir": "^3.0.0"
+      }
+    },
+    "find-up": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+      "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+      "dev": true,
+      "requires": {
+        "locate-path": "^3.0.0"
+      }
+    },
+    "findup-sync": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
+      "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
+      "dev": true,
+      "requires": {
+        "detect-file": "^1.0.0",
+        "is-glob": "^3.1.0",
+        "micromatch": "^3.0.4",
+        "resolve-dir": "^1.0.1"
+      },
+      "dependencies": {
+        "braces": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.1"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "fill-range": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+          "dev": true,
+          "requires": {
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.1.0"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "is-glob": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "^2.1.0"
+          }
+        },
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "micromatch": {
+          "version": "3.1.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "dev": true,
+          "requires": {
+            "arr-diff": "^4.0.0",
+            "array-unique": "^0.3.2",
+            "braces": "^2.3.1",
+            "define-property": "^2.0.2",
+            "extend-shallow": "^3.0.2",
+            "extglob": "^2.0.4",
+            "fragment-cache": "^0.2.1",
+            "kind-of": "^6.0.2",
+            "nanomatch": "^1.2.9",
+            "object.pick": "^1.3.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
+          }
+        },
+        "to-regex-range": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+          "dev": true,
+          "requires": {
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1"
+          }
+        }
+      }
+    },
+    "flush-write-stream": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
+      "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.3.6"
+      }
+    },
+    "for-in": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+      "dev": true
+    },
+    "fragment-cache": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+      "dev": true,
+      "requires": {
+        "map-cache": "^0.2.2"
+      }
+    },
+    "from2": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
+      "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.0.0"
+      }
+    },
+    "fs-write-stream-atomic": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
+      "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "iferr": "^0.1.5",
+        "imurmurhash": "^0.1.4",
+        "readable-stream": "1 || 2"
+      }
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+      "dev": true
+    },
+    "fsevents": {
+      "version": "1.2.9",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz",
+      "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "nan": "^2.12.1",
+        "node-pre-gyp": "^0.12.0"
+      },
+      "dependencies": {
+        "abbrev": {
+          "version": "1.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "ansi-regex": {
+          "version": "2.1.1",
+          "bundled": true,
+          "dev": true
+        },
+        "aproba": {
+          "version": "1.2.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "are-we-there-yet": {
+          "version": "1.1.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "delegates": "^1.0.0",
+            "readable-stream": "^2.0.6"
+          }
+        },
+        "balanced-match": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true
+        },
+        "brace-expansion": {
+          "version": "1.1.11",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "balanced-match": "^1.0.0",
+            "concat-map": "0.0.1"
+          }
+        },
+        "chownr": {
+          "version": "1.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "code-point-at": {
+          "version": "1.1.0",
+          "bundled": true,
+          "dev": true
+        },
+        "concat-map": {
+          "version": "0.0.1",
+          "bundled": true,
+          "dev": true
+        },
+        "console-control-strings": {
+          "version": "1.1.0",
+          "bundled": true,
+          "dev": true
+        },
+        "core-util-is": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "debug": {
+          "version": "4.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "deep-extend": {
+          "version": "0.6.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "delegates": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "detect-libc": {
+          "version": "1.0.3",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "fs-minipass": {
+          "version": "1.2.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "minipass": "^2.2.1"
+          }
+        },
+        "fs.realpath": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "gauge": {
+          "version": "2.7.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "aproba": "^1.0.3",
+            "console-control-strings": "^1.0.0",
+            "has-unicode": "^2.0.0",
+            "object-assign": "^4.1.0",
+            "signal-exit": "^3.0.0",
+            "string-width": "^1.0.1",
+            "strip-ansi": "^3.0.1",
+            "wide-align": "^1.1.0"
+          }
+        },
+        "glob": {
+          "version": "7.1.3",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "has-unicode": {
+          "version": "2.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "iconv-lite": {
+          "version": "0.4.24",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3"
+          }
+        },
+        "ignore-walk": {
+          "version": "3.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "minimatch": "^3.0.4"
+          }
+        },
+        "inflight": {
+          "version": "1.0.6",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "once": "^1.3.0",
+            "wrappy": "1"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "bundled": true,
+          "dev": true
+        },
+        "ini": {
+          "version": "1.3.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "number-is-nan": "^1.0.0"
+          }
+        },
+        "isarray": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "minimatch": {
+          "version": "3.0.4",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "brace-expansion": "^1.1.7"
+          }
+        },
+        "minimist": {
+          "version": "0.0.8",
+          "bundled": true,
+          "dev": true
+        },
+        "minipass": {
+          "version": "2.3.5",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "safe-buffer": "^5.1.2",
+            "yallist": "^3.0.0"
+          }
+        },
+        "minizlib": {
+          "version": "1.2.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "minipass": "^2.2.1"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.1",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "minimist": "0.0.8"
+          }
+        },
+        "ms": {
+          "version": "2.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "needle": {
+          "version": "2.3.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "debug": "^4.1.0",
+            "iconv-lite": "^0.4.4",
+            "sax": "^1.2.4"
+          }
+        },
+        "node-pre-gyp": {
+          "version": "0.12.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "detect-libc": "^1.0.2",
+            "mkdirp": "^0.5.1",
+            "needle": "^2.2.1",
+            "nopt": "^4.0.1",
+            "npm-packlist": "^1.1.6",
+            "npmlog": "^4.0.2",
+            "rc": "^1.2.7",
+            "rimraf": "^2.6.1",
+            "semver": "^5.3.0",
+            "tar": "^4"
+          }
+        },
+        "nopt": {
+          "version": "4.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "abbrev": "1",
+            "osenv": "^0.1.4"
+          }
+        },
+        "npm-bundled": {
+          "version": "1.0.6",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "npm-packlist": {
+          "version": "1.4.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ignore-walk": "^3.0.1",
+            "npm-bundled": "^1.0.1"
+          }
+        },
+        "npmlog": {
+          "version": "4.1.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "are-we-there-yet": "~1.1.2",
+            "console-control-strings": "~1.1.0",
+            "gauge": "~2.7.3",
+            "set-blocking": "~2.0.0"
+          }
+        },
+        "number-is-nan": {
+          "version": "1.0.1",
+          "bundled": true,
+          "dev": true
+        },
+        "object-assign": {
+          "version": "4.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "once": {
+          "version": "1.4.0",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "wrappy": "1"
+          }
+        },
+        "os-homedir": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "os-tmpdir": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "osenv": {
+          "version": "0.1.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "os-homedir": "^1.0.0",
+            "os-tmpdir": "^1.0.0"
+          }
+        },
+        "path-is-absolute": {
+          "version": "1.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "process-nextick-args": {
+          "version": "2.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "rc": {
+          "version": "1.2.8",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "deep-extend": "^0.6.0",
+            "ini": "~1.3.0",
+            "minimist": "^1.2.0",
+            "strip-json-comments": "~2.0.1"
+          },
+          "dependencies": {
+            "minimist": {
+              "version": "1.2.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            }
+          }
+        },
+        "readable-stream": {
+          "version": "2.3.6",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
+          }
+        },
+        "rimraf": {
+          "version": "2.6.3",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.1.2",
+          "bundled": true,
+          "dev": true
+        },
+        "safer-buffer": {
+          "version": "2.1.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "sax": {
+          "version": "1.2.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "semver": {
+          "version": "5.7.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "set-blocking": {
+          "version": "2.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "signal-exit": {
+          "version": "3.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "code-point-at": "^1.0.0",
+            "is-fullwidth-code-point": "^1.0.0",
+            "strip-ansi": "^3.0.0"
+          }
+        },
+        "string_decoder": {
+          "version": "1.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "safe-buffer": "~5.1.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        },
+        "strip-json-comments": {
+          "version": "2.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "tar": {
+          "version": "4.4.8",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "chownr": "^1.1.1",
+            "fs-minipass": "^1.2.5",
+            "minipass": "^2.3.4",
+            "minizlib": "^1.1.1",
+            "mkdirp": "^0.5.0",
+            "safe-buffer": "^5.1.2",
+            "yallist": "^3.0.2"
+          }
+        },
+        "util-deprecate": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "wide-align": {
+          "version": "1.1.3",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "string-width": "^1.0.2 || 2"
+          }
+        },
+        "wrappy": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true
+        },
+        "yallist": {
+          "version": "3.0.3",
+          "bundled": true,
+          "dev": true
+        }
+      }
+    },
+    "get-caller-file": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
+      "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
+      "dev": true
+    },
+    "get-stream": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+      "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+      "dev": true,
+      "requires": {
+        "pump": "^3.0.0"
+      }
+    },
+    "get-value": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+      "dev": true
+    },
+    "glob": {
+      "version": "7.1.4",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
+      "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+      "dev": true,
+      "requires": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.0.4",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      }
+    },
+    "glob-parent": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+      "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+      "dev": true,
+      "requires": {
+        "is-glob": "^3.1.0",
+        "path-dirname": "^1.0.0"
+      },
+      "dependencies": {
+        "is-glob": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "^2.1.0"
+          }
+        }
+      }
+    },
+    "global-modules": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+      "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+      "dev": true,
+      "requires": {
+        "global-prefix": "^1.0.1",
+        "is-windows": "^1.0.1",
+        "resolve-dir": "^1.0.0"
+      }
+    },
+    "global-prefix": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+      "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
+      "dev": true,
+      "requires": {
+        "expand-tilde": "^2.0.2",
+        "homedir-polyfill": "^1.0.1",
+        "ini": "^1.3.4",
+        "is-windows": "^1.0.1",
+        "which": "^1.2.14"
+      }
+    },
+    "graceful-fs": {
+      "version": "4.1.15",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
+      "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
+      "dev": true
+    },
+    "has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+      "dev": true
+    },
+    "has-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+      "dev": true,
+      "requires": {
+        "get-value": "^2.0.6",
+        "has-values": "^1.0.0",
+        "isobject": "^3.0.0"
+      }
+    },
+    "has-values": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+      "dev": true,
+      "requires": {
+        "is-number": "^3.0.0",
+        "kind-of": "^4.0.0"
+      },
+      "dependencies": {
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "kind-of": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "hash-base": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
+      "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "hash.js": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+      "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.3",
+        "minimalistic-assert": "^1.0.1"
+      }
+    },
+    "hmac-drbg": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+      "dev": true,
+      "requires": {
+        "hash.js": "^1.0.3",
+        "minimalistic-assert": "^1.0.0",
+        "minimalistic-crypto-utils": "^1.0.1"
+      }
+    },
+    "homedir-polyfill": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
+      "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
+      "dev": true,
+      "requires": {
+        "parse-passwd": "^1.0.0"
+      }
+    },
+    "https-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
+      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
+      "dev": true
+    },
+    "ieee754": {
+      "version": "1.1.13",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
+      "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==",
+      "dev": true
+    },
+    "iferr": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
+      "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
+      "dev": true
+    },
+    "import-local": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz",
+      "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
+      "dev": true,
+      "requires": {
+        "pkg-dir": "^3.0.0",
+        "resolve-cwd": "^2.0.0"
+      }
+    },
+    "imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+      "dev": true
+    },
+    "indexof": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
+      "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
+      "dev": true
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "dev": true,
+      "requires": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "inherits": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+      "dev": true
+    },
+    "ini": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+      "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+      "dev": true
+    },
+    "interpret": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz",
+      "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==",
+      "dev": true
+    },
+    "invert-kv": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
+      "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
+      "dev": true
+    },
+    "is-accessor-descriptor": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-binary-path": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+      "dev": true,
+      "requires": {
+        "binary-extensions": "^1.0.0"
+      }
+    },
+    "is-buffer": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+      "dev": true
+    },
+    "is-data-descriptor": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-descriptor": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+      "dev": true,
+      "requires": {
+        "is-accessor-descriptor": "^0.1.6",
+        "is-data-descriptor": "^0.1.4",
+        "kind-of": "^5.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+          "dev": true
+        }
+      }
+    },
+    "is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+      "dev": true
+    },
+    "is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+      "dev": true
+    },
+    "is-fullwidth-code-point": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+      "dev": true
+    },
+    "is-glob": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+      "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+      "dev": true,
+      "requires": {
+        "is-extglob": "^2.1.1"
+      }
+    },
+    "is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "dev": true
+    },
+    "is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.1"
+      }
+    },
+    "is-stream": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+      "dev": true
+    },
+    "is-windows": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+      "dev": true
+    },
+    "is-wsl": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+      "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
+      "dev": true
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+      "dev": true
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+      "dev": true
+    },
+    "isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+      "dev": true
+    },
+    "jquery": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz",
+      "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==",
+      "dev": true
+    },
+    "js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+      "dev": true
+    },
+    "js-yaml": {
+      "version": "3.13.1",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+      "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+      "dev": true,
+      "requires": {
+        "argparse": "^1.0.7",
+        "esprima": "^4.0.0"
+      }
+    },
+    "json-parse-better-errors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+      "dev": true
+    },
+    "json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true
+    },
+    "json5": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+      "dev": true,
+      "requires": {
+        "minimist": "^1.2.0"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        }
+      }
+    },
+    "kind-of": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+      "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+      "dev": true
+    },
+    "lcid": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
+      "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
+      "dev": true,
+      "requires": {
+        "invert-kv": "^2.0.0"
+      }
+    },
+    "loader-runner": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz",
+      "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==",
+      "dev": true
+    },
+    "loader-utils": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
+      "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
+      "dev": true,
+      "requires": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^2.0.0",
+        "json5": "^1.0.1"
+      }
+    },
+    "locate-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+      "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+      "dev": true,
+      "requires": {
+        "p-locate": "^3.0.0",
+        "path-exists": "^3.0.0"
+      }
+    },
+    "lru-cache": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+      "dev": true,
+      "requires": {
+        "yallist": "^3.0.2"
+      }
+    },
+    "make-dir": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+      "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+      "dev": true,
+      "requires": {
+        "pify": "^4.0.1",
+        "semver": "^5.6.0"
+      }
+    },
+    "mamacro": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz",
+      "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==",
+      "dev": true
+    },
+    "map-age-cleaner": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
+      "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
+      "dev": true,
+      "requires": {
+        "p-defer": "^1.0.0"
+      }
+    },
+    "map-cache": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+      "dev": true
+    },
+    "map-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+      "dev": true,
+      "requires": {
+        "object-visit": "^1.0.0"
+      }
+    },
+    "md5.js": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+      "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+      "dev": true,
+      "requires": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "mem": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz",
+      "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==",
+      "dev": true,
+      "requires": {
+        "map-age-cleaner": "^0.1.1",
+        "mimic-fn": "^2.0.0",
+        "p-is-promise": "^2.0.0"
+      }
+    },
+    "memory-fs": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
+      "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+      "dev": true,
+      "requires": {
+        "errno": "^0.1.3",
+        "readable-stream": "^2.0.1"
+      }
+    },
+    "micromatch": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+      "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+      "dev": true,
+      "requires": {
+        "braces": "^3.0.1",
+        "picomatch": "^2.0.5"
+      }
+    },
+    "miller-rabin": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+      "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.0.0",
+        "brorand": "^1.0.1"
+      }
+    },
+    "mimic-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+      "dev": true
+    },
+    "minimalistic-assert": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+      "dev": true
+    },
+    "minimalistic-crypto-utils": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
+      "dev": true
+    },
+    "minimatch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+      "dev": true,
+      "requires": {
+        "brace-expansion": "^1.1.7"
+      }
+    },
+    "minimist": {
+      "version": "0.0.8",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+      "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+      "dev": true
+    },
+    "mississippi": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
+      "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
+      "dev": true,
+      "requires": {
+        "concat-stream": "^1.5.0",
+        "duplexify": "^3.4.2",
+        "end-of-stream": "^1.1.0",
+        "flush-write-stream": "^1.0.0",
+        "from2": "^2.1.0",
+        "parallel-transform": "^1.1.0",
+        "pump": "^3.0.0",
+        "pumpify": "^1.3.3",
+        "stream-each": "^1.1.0",
+        "through2": "^2.0.0"
+      }
+    },
+    "mixin-deep": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+      "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+      "dev": true,
+      "requires": {
+        "for-in": "^1.0.2",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "mkdirp": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+      "dev": true,
+      "requires": {
+        "minimist": "0.0.8"
+      }
+    },
+    "move-concurrently": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
+      "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
+      "dev": true,
+      "requires": {
+        "aproba": "^1.1.1",
+        "copy-concurrently": "^1.0.0",
+        "fs-write-stream-atomic": "^1.0.8",
+        "mkdirp": "^0.5.1",
+        "rimraf": "^2.5.4",
+        "run-queue": "^1.0.3"
+      }
+    },
+    "ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+      "dev": true
+    },
+    "nan": {
+      "version": "2.14.0",
+      "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
+      "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==",
+      "dev": true,
+      "optional": true
+    },
+    "nanomatch": {
+      "version": "1.2.13",
+      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+      "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+      "dev": true,
+      "requires": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "fragment-cache": "^0.2.1",
+        "is-windows": "^1.0.2",
+        "kind-of": "^6.0.2",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      }
+    },
+    "neo-async": {
+      "version": "2.6.1",
+      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
+      "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==",
+      "dev": true
+    },
+    "nice-try": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+      "dev": true
+    },
+    "node-libs-browser": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz",
+      "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==",
+      "dev": true,
+      "requires": {
+        "assert": "^1.1.1",
+        "browserify-zlib": "^0.2.0",
+        "buffer": "^4.3.0",
+        "console-browserify": "^1.1.0",
+        "constants-browserify": "^1.0.0",
+        "crypto-browserify": "^3.11.0",
+        "domain-browser": "^1.1.1",
+        "events": "^3.0.0",
+        "https-browserify": "^1.0.0",
+        "os-browserify": "^0.3.0",
+        "path-browserify": "0.0.0",
+        "process": "^0.11.10",
+        "punycode": "^1.2.4",
+        "querystring-es3": "^0.2.0",
+        "readable-stream": "^2.3.3",
+        "stream-browserify": "^2.0.1",
+        "stream-http": "^2.7.2",
+        "string_decoder": "^1.0.0",
+        "timers-browserify": "^2.0.4",
+        "tty-browserify": "0.0.0",
+        "url": "^0.11.0",
+        "util": "^0.11.0",
+        "vm-browserify": "0.0.4"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "1.4.1",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+          "dev": true
+        }
+      }
+    },
+    "normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "dev": true
+    },
+    "npm-run-path": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+      "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+      "dev": true,
+      "requires": {
+        "path-key": "^2.0.0"
+      }
+    },
+    "number-is-nan": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+      "dev": true
+    },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+      "dev": true
+    },
+    "object-copy": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+      "dev": true,
+      "requires": {
+        "copy-descriptor": "^0.1.0",
+        "define-property": "^0.2.5",
+        "kind-of": "^3.0.3"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "object-visit": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.0"
+      }
+    },
+    "object.pick": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.1"
+      }
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "dev": true,
+      "requires": {
+        "wrappy": "1"
+      }
+    },
+    "os-browserify": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+      "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
+      "dev": true
+    },
+    "os-locale": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
+      "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
+      "dev": true,
+      "requires": {
+        "execa": "^1.0.0",
+        "lcid": "^2.0.0",
+        "mem": "^4.0.0"
+      }
+    },
+    "p-defer": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
+      "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
+      "dev": true
+    },
+    "p-finally": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+      "dev": true
+    },
+    "p-is-promise": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz",
+      "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==",
+      "dev": true
+    },
+    "p-limit": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz",
+      "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==",
+      "dev": true,
+      "requires": {
+        "p-try": "^2.0.0"
+      }
+    },
+    "p-locate": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+      "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+      "dev": true,
+      "requires": {
+        "p-limit": "^2.0.0"
+      }
+    },
+    "p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+      "dev": true
+    },
+    "pako": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz",
+      "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==",
+      "dev": true
+    },
+    "parallel-transform": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz",
+      "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=",
+      "dev": true,
+      "requires": {
+        "cyclist": "~0.2.2",
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.1.5"
+      }
+    },
+    "parse-asn1": {
+      "version": "5.1.4",
+      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz",
+      "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==",
+      "dev": true,
+      "requires": {
+        "asn1.js": "^4.0.0",
+        "browserify-aes": "^1.0.0",
+        "create-hash": "^1.1.0",
+        "evp_bytestokey": "^1.0.0",
+        "pbkdf2": "^3.0.3",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "parse-passwd": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+      "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
+      "dev": true
+    },
+    "pascalcase": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+      "dev": true
+    },
+    "path-browserify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
+      "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
+      "dev": true
+    },
+    "path-dirname": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+      "dev": true
+    },
+    "path-exists": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+      "dev": true
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+      "dev": true
+    },
+    "path-key": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+      "dev": true
+    },
+    "path-parse": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+      "dev": true
+    },
+    "pbkdf2": {
+      "version": "3.0.17",
+      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
+      "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==",
+      "dev": true,
+      "requires": {
+        "create-hash": "^1.1.2",
+        "create-hmac": "^1.1.4",
+        "ripemd160": "^2.0.1",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
+      }
+    },
+    "picomatch": {
+      "version": "2.0.7",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz",
+      "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==",
+      "dev": true
+    },
+    "pify": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+      "dev": true
+    },
+    "pkg-dir": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
+      "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+      "dev": true,
+      "requires": {
+        "find-up": "^3.0.0"
+      }
+    },
+    "posix-character-classes": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+      "dev": true
+    },
+    "process": {
+      "version": "0.11.10",
+      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
+      "dev": true
+    },
+    "process-nextick-args": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+      "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
+      "dev": true
+    },
+    "promise-inflight": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
+      "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
+      "dev": true
+    },
+    "prr": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
+      "dev": true
+    },
+    "public-encrypt": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
+      "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "browserify-rsa": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "parse-asn1": "^5.0.0",
+        "randombytes": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "pump": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
+      }
+    },
+    "pumpify": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
+      "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
+      "dev": true,
+      "requires": {
+        "duplexify": "^3.6.0",
+        "inherits": "^2.0.3",
+        "pump": "^2.0.0"
+      },
+      "dependencies": {
+        "pump": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
+          "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+          "dev": true,
+          "requires": {
+            "end-of-stream": "^1.1.0",
+            "once": "^1.3.1"
+          }
+        }
+      }
+    },
+    "punycode": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+      "dev": true
+    },
+    "querystring": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+      "dev": true
+    },
+    "querystring-es3": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
+      "dev": true
+    },
+    "randombytes": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "randomfill": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+      "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+      "dev": true,
+      "requires": {
+        "randombytes": "^2.0.5",
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "readable-stream": {
+      "version": "2.3.6",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+      "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+      "dev": true,
+      "requires": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "readdirp": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
+      "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.11",
+        "micromatch": "^3.1.10",
+        "readable-stream": "^2.0.2"
+      },
+      "dependencies": {
+        "braces": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.1"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "fill-range": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+          "dev": true,
+          "requires": {
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.1.0"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "micromatch": {
+          "version": "3.1.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "dev": true,
+          "requires": {
+            "arr-diff": "^4.0.0",
+            "array-unique": "^0.3.2",
+            "braces": "^2.3.1",
+            "define-property": "^2.0.2",
+            "extend-shallow": "^3.0.2",
+            "extglob": "^2.0.4",
+            "fragment-cache": "^0.2.1",
+            "kind-of": "^6.0.2",
+            "nanomatch": "^1.2.9",
+            "object.pick": "^1.3.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
+          }
+        },
+        "to-regex-range": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+          "dev": true,
+          "requires": {
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1"
+          }
+        }
+      }
+    },
+    "regex-not": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^3.0.2",
+        "safe-regex": "^1.1.0"
+      }
+    },
+    "remove-trailing-separator": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+      "dev": true
+    },
+    "repeat-element": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
+      "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
+      "dev": true
+    },
+    "repeat-string": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+      "dev": true
+    },
+    "require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+      "dev": true
+    },
+    "require-main-filename": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+      "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+      "dev": true
+    },
+    "resolve": {
+      "version": "1.11.0",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz",
+      "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==",
+      "dev": true,
+      "requires": {
+        "path-parse": "^1.0.6"
+      }
+    },
+    "resolve-cwd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
+      "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
+      "dev": true,
+      "requires": {
+        "resolve-from": "^3.0.0"
+      }
+    },
+    "resolve-dir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+      "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+      "dev": true,
+      "requires": {
+        "expand-tilde": "^2.0.0",
+        "global-modules": "^1.0.0"
+      }
+    },
+    "resolve-from": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+      "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+      "dev": true
+    },
+    "resolve-url": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+      "dev": true
+    },
+    "ret": {
+      "version": "0.1.15",
+      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+      "dev": true
+    },
+    "rimraf": {
+      "version": "2.6.3",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+      "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+      "dev": true,
+      "requires": {
+        "glob": "^7.1.3"
+      }
+    },
+    "ripemd160": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+      "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+      "dev": true,
+      "requires": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1"
+      }
+    },
+    "run-queue": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
+      "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
+      "dev": true,
+      "requires": {
+        "aproba": "^1.1.1"
+      }
+    },
+    "safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true
+    },
+    "safe-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+      "dev": true,
+      "requires": {
+        "ret": "~0.1.10"
+      }
+    },
+    "schema-utils": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+      "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+      "dev": true,
+      "requires": {
+        "ajv": "^6.1.0",
+        "ajv-errors": "^1.0.0",
+        "ajv-keywords": "^3.1.0"
+      }
+    },
+    "semver": {
+      "version": "5.7.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
+      "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+      "dev": true
+    },
+    "serialize-javascript": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz",
+      "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==",
+      "dev": true
+    },
+    "set-blocking": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+      "dev": true
+    },
+    "set-value": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+      "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^2.0.1",
+        "is-extendable": "^0.1.1",
+        "is-plain-object": "^2.0.3",
+        "split-string": "^3.0.1"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "setimmediate": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+      "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
+      "dev": true
+    },
+    "sha.js": {
+      "version": "2.4.11",
+      "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+      "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "shebang-command": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+      "dev": true,
+      "requires": {
+        "shebang-regex": "^1.0.0"
+      }
+    },
+    "shebang-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+      "dev": true
+    },
+    "signal-exit": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+      "dev": true
+    },
+    "snapdragon": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+      "dev": true,
+      "requires": {
+        "base": "^0.11.1",
+        "debug": "^2.2.0",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "map-cache": "^0.2.2",
+        "source-map": "^0.5.6",
+        "source-map-resolve": "^0.5.0",
+        "use": "^3.1.0"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "snapdragon-node": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+      "dev": true,
+      "requires": {
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.0",
+        "snapdragon-util": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "snapdragon-util": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.2.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "source-list-map": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+      "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
+      "dev": true
+    },
+    "source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+      "dev": true
+    },
+    "source-map-resolve": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
+      "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
+      "dev": true,
+      "requires": {
+        "atob": "^2.1.1",
+        "decode-uri-component": "^0.2.0",
+        "resolve-url": "^0.2.1",
+        "source-map-url": "^0.4.0",
+        "urix": "^0.1.0"
+      }
+    },
+    "source-map-support": {
+      "version": "0.5.12",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz",
+      "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==",
+      "dev": true,
+      "requires": {
+        "buffer-from": "^1.0.0",
+        "source-map": "^0.6.0"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "source-map-url": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+      "dev": true
+    },
+    "split-string": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^3.0.0"
+      }
+    },
+    "sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+      "dev": true
+    },
+    "ssri": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
+      "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
+      "dev": true,
+      "requires": {
+        "figgy-pudding": "^3.5.1"
+      }
+    },
+    "static-extend": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+      "dev": true,
+      "requires": {
+        "define-property": "^0.2.5",
+        "object-copy": "^0.1.0"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        }
+      }
+    },
+    "stream-browserify": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
+      "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
+      "dev": true,
+      "requires": {
+        "inherits": "~2.0.1",
+        "readable-stream": "^2.0.2"
+      }
+    },
+    "stream-each": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
+      "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "^1.1.0",
+        "stream-shift": "^1.0.0"
+      }
+    },
+    "stream-http": {
+      "version": "2.8.3",
+      "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
+      "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
+      "dev": true,
+      "requires": {
+        "builtin-status-codes": "^3.0.0",
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.3.6",
+        "to-arraybuffer": "^1.0.0",
+        "xtend": "^4.0.0"
+      }
+    },
+    "stream-shift": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
+      "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
+      "dev": true
+    },
+    "string-width": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+      "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+      "dev": true,
+      "requires": {
+        "is-fullwidth-code-point": "^2.0.0",
+        "strip-ansi": "^4.0.0"
+      }
+    },
+    "string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "strip-ansi": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+      "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "^3.0.0"
+      }
+    },
+    "strip-eof": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+      "dev": true
+    },
+    "supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "dev": true,
+      "requires": {
+        "has-flag": "^3.0.0"
+      }
+    },
+    "tapable": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
+      "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
+      "dev": true
+    },
+    "terser": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-4.0.0.tgz",
+      "integrity": "sha512-dOapGTU0hETFl1tCo4t56FN+2jffoKyER9qBGoUFyZ6y7WLoKT0bF+lAYi6B6YsILcGF3q1C2FBh8QcKSCgkgA==",
+      "dev": true,
+      "requires": {
+        "commander": "^2.19.0",
+        "source-map": "~0.6.1",
+        "source-map-support": "~0.5.10"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "terser-webpack-plugin": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.3.0.tgz",
+      "integrity": "sha512-W2YWmxPjjkUcOWa4pBEv4OP4er1aeQJlSo2UhtCFQCuRXEHjOFscO8VyWHj9JLlA0RzQb8Y2/Ta78XZvT54uGg==",
+      "dev": true,
+      "requires": {
+        "cacache": "^11.3.2",
+        "find-cache-dir": "^2.0.0",
+        "is-wsl": "^1.1.0",
+        "loader-utils": "^1.2.3",
+        "schema-utils": "^1.0.0",
+        "serialize-javascript": "^1.7.0",
+        "source-map": "^0.6.1",
+        "terser": "^4.0.0",
+        "webpack-sources": "^1.3.0",
+        "worker-farm": "^1.7.0"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "through2": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+      "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+      "dev": true,
+      "requires": {
+        "readable-stream": "~2.3.6",
+        "xtend": "~4.0.1"
+      }
+    },
+    "timers-browserify": {
+      "version": "2.0.10",
+      "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz",
+      "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==",
+      "dev": true,
+      "requires": {
+        "setimmediate": "^1.0.4"
+      }
+    },
+    "to-arraybuffer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
+      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
+      "dev": true
+    },
+    "to-object-path": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "to-regex": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+      "dev": true,
+      "requires": {
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "regex-not": "^1.0.2",
+        "safe-regex": "^1.1.0"
+      }
+    },
+    "to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "dev": true,
+      "requires": {
+        "is-number": "^7.0.0"
+      }
+    },
+    "ts-loader": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-6.0.1.tgz",
+      "integrity": "sha512-9H5ErTIw5t73sdSoFE0hX0RO45B7cdDA4pW1VIQ2wNFAhxSpZcAlv2fwMcfv6SAYLoI7uGwHuzC5dECzmzqtzA==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.3.0",
+        "enhanced-resolve": "^4.0.0",
+        "loader-utils": "^1.0.2",
+        "micromatch": "^4.0.0",
+        "semver": "^6.0.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.0.tgz",
+          "integrity": "sha512-kCqEOOHoBcFs/2Ccuk4Xarm/KiWRSLEX9CAZF8xkJ6ZPlIoTZ8V5f7J16vYLJqDbR7KrxTJpR2lqjIEm2Qx9cQ==",
+          "dev": true
+        }
+      }
+    },
+    "tslib": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
+      "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
+      "dev": true
+    },
+    "tslint": {
+      "version": "5.16.0",
+      "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz",
+      "integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "builtin-modules": "^1.1.1",
+        "chalk": "^2.3.0",
+        "commander": "^2.12.1",
+        "diff": "^3.2.0",
+        "glob": "^7.1.1",
+        "js-yaml": "^3.13.0",
+        "minimatch": "^3.0.4",
+        "mkdirp": "^0.5.1",
+        "resolve": "^1.3.2",
+        "semver": "^5.3.0",
+        "tslib": "^1.8.0",
+        "tsutils": "^2.29.0"
+      }
+    },
+    "tsutils": {
+      "version": "2.29.0",
+      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
+      "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.8.1"
+      }
+    },
+    "tty-browserify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
+      "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
+      "dev": true
+    },
+    "typedarray": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+      "dev": true
+    },
+    "typescript": {
+      "version": "3.4.5",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz",
+      "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==",
+      "dev": true
+    },
+    "union-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+      "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+      "dev": true,
+      "requires": {
+        "arr-union": "^3.1.0",
+        "get-value": "^2.0.6",
+        "is-extendable": "^0.1.1",
+        "set-value": "^0.4.3"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "set-value": {
+          "version": "0.4.3",
+          "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+          "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+          "dev": true,
+          "requires": {
+            "extend-shallow": "^2.0.1",
+            "is-extendable": "^0.1.1",
+            "is-plain-object": "^2.0.1",
+            "to-object-path": "^0.3.0"
+          }
+        }
+      }
+    },
+    "unique-filename": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
+      "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
+      "dev": true,
+      "requires": {
+        "unique-slug": "^2.0.0"
+      }
+    },
+    "unique-slug": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz",
+      "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==",
+      "dev": true,
+      "requires": {
+        "imurmurhash": "^0.1.4"
+      }
+    },
+    "unset-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+      "dev": true,
+      "requires": {
+        "has-value": "^0.3.1",
+        "isobject": "^3.0.0"
+      },
+      "dependencies": {
+        "has-value": {
+          "version": "0.3.1",
+          "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+          "dev": true,
+          "requires": {
+            "get-value": "^2.0.3",
+            "has-values": "^0.1.4",
+            "isobject": "^2.0.0"
+          },
+          "dependencies": {
+            "isobject": {
+              "version": "2.1.0",
+              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+              "dev": true,
+              "requires": {
+                "isarray": "1.0.0"
+              }
+            }
+          }
+        },
+        "has-values": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+          "dev": true
+        }
+      }
+    },
+    "upath": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz",
+      "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==",
+      "dev": true
+    },
+    "uri-js": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
+      "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+      "dev": true,
+      "requires": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "urix": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+      "dev": true
+    },
+    "url": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+      "dev": true,
+      "requires": {
+        "punycode": "1.3.2",
+        "querystring": "0.2.0"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "1.3.2",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
+          "dev": true
+        }
+      }
+    },
+    "use": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
+      "dev": true
+    },
+    "util": {
+      "version": "0.11.1",
+      "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
+      "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3"
+      }
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+      "dev": true
+    },
+    "v8-compile-cache": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz",
+      "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==",
+      "dev": true
+    },
+    "vm-browserify": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
+      "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
+      "dev": true,
+      "requires": {
+        "indexof": "0.0.1"
+      }
+    },
+    "vpnrpc": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/vpnrpc/-/vpnrpc-1.0.1.tgz",
+      "integrity": "sha512-CuKEueMphsIEcODTBCE+29DChRkcL0LvP9qrVMzdHkC1pM/DF96nFxuZ8oInJ9ELrsLvf+777brpipfcKsGV9Q==",
+      "dev": true
+    },
+    "watchpack": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz",
+      "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==",
+      "dev": true,
+      "requires": {
+        "chokidar": "^2.0.2",
+        "graceful-fs": "^4.1.2",
+        "neo-async": "^2.5.0"
+      }
+    },
+    "webpack": {
+      "version": "4.32.2",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.32.2.tgz",
+      "integrity": "sha512-F+H2Aa1TprTQrpodRAWUMJn7A8MgDx82yQiNvYMaj3d1nv3HetKU0oqEulL9huj8enirKi8KvEXQ3QtuHF89Zg==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.8.5",
+        "@webassemblyjs/helper-module-context": "1.8.5",
+        "@webassemblyjs/wasm-edit": "1.8.5",
+        "@webassemblyjs/wasm-parser": "1.8.5",
+        "acorn": "^6.0.5",
+        "acorn-dynamic-import": "^4.0.0",
+        "ajv": "^6.1.0",
+        "ajv-keywords": "^3.1.0",
+        "chrome-trace-event": "^1.0.0",
+        "enhanced-resolve": "^4.1.0",
+        "eslint-scope": "^4.0.0",
+        "json-parse-better-errors": "^1.0.2",
+        "loader-runner": "^2.3.0",
+        "loader-utils": "^1.1.0",
+        "memory-fs": "~0.4.1",
+        "micromatch": "^3.1.8",
+        "mkdirp": "~0.5.0",
+        "neo-async": "^2.5.0",
+        "node-libs-browser": "^2.0.0",
+        "schema-utils": "^1.0.0",
+        "tapable": "^1.1.0",
+        "terser-webpack-plugin": "^1.1.0",
+        "watchpack": "^1.5.0",
+        "webpack-sources": "^1.3.0"
+      },
+      "dependencies": {
+        "braces": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.1"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "fill-range": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+          "dev": true,
+          "requires": {
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.1.0"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "micromatch": {
+          "version": "3.1.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "dev": true,
+          "requires": {
+            "arr-diff": "^4.0.0",
+            "array-unique": "^0.3.2",
+            "braces": "^2.3.1",
+            "define-property": "^2.0.2",
+            "extend-shallow": "^3.0.2",
+            "extglob": "^2.0.4",
+            "fragment-cache": "^0.2.1",
+            "kind-of": "^6.0.2",
+            "nanomatch": "^1.2.9",
+            "object.pick": "^1.3.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
+          }
+        },
+        "to-regex-range": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+          "dev": true,
+          "requires": {
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1"
+          }
+        }
+      }
+    },
+    "webpack-cli": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.2.tgz",
+      "integrity": "sha512-FLkobnaJJ+03j5eplxlI0TUxhGCOdfewspIGuvDVtpOlrAuKMFC57K42Ukxqs1tn8947/PM6tP95gQc0DCzRYA==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.1",
+        "cross-spawn": "^6.0.5",
+        "enhanced-resolve": "^4.1.0",
+        "findup-sync": "^2.0.0",
+        "global-modules": "^1.0.0",
+        "import-local": "^2.0.0",
+        "interpret": "^1.1.0",
+        "loader-utils": "^1.1.0",
+        "supports-color": "^5.5.0",
+        "v8-compile-cache": "^2.0.2",
+        "yargs": "^12.0.5"
+      }
+    },
+    "webpack-sources": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz",
+      "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==",
+      "dev": true,
+      "requires": {
+        "source-list-map": "^2.0.0",
+        "source-map": "~0.6.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "whatwg-fetch": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz",
+      "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q=="
+    },
+    "which": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+      "dev": true,
+      "requires": {
+        "isexe": "^2.0.0"
+      }
+    },
+    "which-module": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+      "dev": true
+    },
+    "worker-farm": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz",
+      "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==",
+      "dev": true,
+      "requires": {
+        "errno": "~0.1.7"
+      }
+    },
+    "wrap-ansi": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+      "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+      "dev": true,
+      "requires": {
+        "string-width": "^1.0.1",
+        "strip-ansi": "^3.0.1"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+          "dev": true,
+          "requires": {
+            "number-is-nan": "^1.0.0"
+          }
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+          "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+          "dev": true,
+          "requires": {
+            "code-point-at": "^1.0.0",
+            "is-fullwidth-code-point": "^1.0.0",
+            "strip-ansi": "^3.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        }
+      }
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+      "dev": true
+    },
+    "xtend": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+      "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
+      "dev": true
+    },
+    "y18n": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
+      "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
+      "dev": true
+    },
+    "yallist": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
+      "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
+      "dev": true
+    },
+    "yargs": {
+      "version": "12.0.5",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
+      "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
+      "dev": true,
+      "requires": {
+        "cliui": "^4.0.0",
+        "decamelize": "^1.2.0",
+        "find-up": "^3.0.0",
+        "get-caller-file": "^1.0.1",
+        "os-locale": "^3.0.0",
+        "require-directory": "^2.1.1",
+        "require-main-filename": "^1.0.1",
+        "set-blocking": "^2.0.0",
+        "string-width": "^2.0.0",
+        "which-module": "^2.0.0",
+        "y18n": "^3.2.1 || ^4.0.0",
+        "yargs-parser": "^11.1.1"
+      }
+    },
+    "yargs-parser": {
+      "version": "11.1.1",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
+      "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
+      "dev": true,
+      "requires": {
+        "camelcase": "^5.0.0",
+        "decamelize": "^1.2.0"
+      }
+    }
+  }
+}

+ 27 - 0
src/bin/hamcore/wwwroot/admin/default/package.json

@@ -0,0 +1,27 @@
+{
+  "name": "default",
+  "version": "1.0.0",
+  "description": "",
+  "main": "index.js",
+  "scripts": {
+    "build": "node_modules/.bin/webpack -d",
+    "watch": "node_modules/.bin/webpack -d --watch"
+  },
+  "keywords": [],
+  "author": "",
+  "license": "ISC",
+  "devDependencies": {
+    "@types/jquery": "^3.3.29",
+    "jquery": "^3.4.1",
+    "ts-loader": "^6.0.1",
+    "tslint": "^5.16.0",
+    "typescript": "^3.4.5",
+    "vpnrpc": "^1.0.1",
+    "webpack": "^4.32.2",
+    "webpack-cli": "^3.3.2"
+  },
+  "dependencies": {
+    "core-js": "^3.1.3",
+    "whatwg-fetch": "^3.0.0"
+  }
+}

+ 201 - 0
src/bin/hamcore/wwwroot/admin/default/src/ts/main.ts

@@ -0,0 +1,201 @@
+// Test sample code for SoftEther VPN Server JSON-RPC Stub
+// Runs on both web browsers and Node.js
+// 
+// Licensed under the Apache License 2.0
+// Copyright (c) 2014-2018 SoftEther VPN Project
+
+// On the web browser uncomment below imports as necessary to support old browsers.
+import "core-js/es/promise";
+import "core-js/es/string";
+import "whatwg-fetch";
+
+import $ = require('jquery');
+
+// Import the vpnrpc.ts RPC stub.
+import * as VPN from "vpnrpc/dist/vpnrpc";
+
+// Output JSON-RPC request / reply strings to the debug console.
+VPN.VpnServerRpc.SetDebugMode(true);
+
+let api: VPN.VpnServerRpc;
+// Creating the VpnServerRpc class instance here.
+if (VPN.VpnServerRpc.IsNodeJS() === false) // // Determine if this JavaScript environment is on the Node.js or not
+{
+    // On the web browser. We do not need to specify any hostname, port or credential as the web browser already knows it.
+    api = new VPN.VpnServerRpc();
+}
+else
+{
+    // On the Node.js. We need to specify the target VPN Server's hostname, port and credential.
+    api = new VPN.VpnServerRpc("127.0.0.1", 443, "", "PASSWORD_HERE", false);
+}
+
+
+/** API test for 'Test', test RPC function */
+export async function Test_Test(): Promise<void>
+{
+    console.log("Begin: Test_Test");
+    let a: VPN.VpnRpcTest = new VPN.VpnRpcTest(
+        {
+            IntValue_u32: 12345,
+        });
+    let b: VPN.VpnRpcTest = await api.Test(a);
+    console.log(b);
+    console.log("End: Test_Test");
+    console.log("-----");
+    console.log();
+}
+
+export async function ListVirtualHubs(id: string): Promise<void>
+{
+    let ul: JQuery<HTMLElement> = $(id);
+
+    ul.children().remove();
+
+    let hubList = await api.EnumHub();
+
+    hubList.HubList.forEach(hub =>
+    {
+        ul.append("<li><strong><a href='./hub.html?" + hub.HubName_str + "'>" + hub.HubName_str + "</a></strong><br>" + ConcatKeysToHtml(hub) + "</li>");
+    });
+}
+
+export async function ShowVpnServerInfo(idInfo: string, idStatus: string): Promise<void>
+{
+    let infoList = $(idInfo);
+    let statusList = $(idStatus);
+
+    let serverInfo = await api.GetServerInfo();
+
+    let serverStatus = await api.GetServerStatus();
+
+    Object.keys(serverInfo).forEach(key =>
+    {
+        infoList.append("<li>" + key + ": \"" + (<any>serverInfo)[key] + "\"</li>");
+    });
+
+    Object.keys(serverStatus).forEach(key =>
+    {
+        statusList.append("<li>" + key + ": \"" + (<any>serverStatus)[key] + "\"</li>");
+    });
+}
+
+export async function CreateNewHub(hubName: string, idList: string): Promise<void>
+{
+    if (hubName == null || hubName == "")
+    {
+        alert("Virtual Hub name is empty.");
+        return;
+    }
+
+    try
+    {
+        let param: VPN.VpnRpcCreateHub = new VPN.VpnRpcCreateHub(
+            {
+                HubName_str: hubName,
+                Online_bool: true,
+                HubType_u32: VPN.VpnRpcHubType.Standalone,
+            });
+        
+        await api.CreateHub(param);
+      
+        ListVirtualHubs(idList);
+
+        alert("The Virtual Hub '" + hubName + "' is created.");
+    }
+    catch (ex)
+    {
+        alert(ex);
+    }
+}
+
+function ConcatKeysToHtml(obj: any): string
+{
+    let ret: string = "";
+
+    Object.keys(obj).forEach(key =>
+    {
+        ret += key + ": \"" + (<any>obj)[key] + "\"<BR>";
+    });
+
+    return ret;
+}
+
+export async function DeleteVirtualHub(queryString: string): Promise<void>
+{
+    let hubNameInput = queryString;
+    if (hubNameInput.length >= 1 && hubNameInput.charAt(0) == "?") hubNameInput = hubNameInput.substring(1);
+
+    try
+    {
+        let deleteHubParam: VPN.VpnRpcDeleteHub = new VPN.VpnRpcDeleteHub(
+            {
+                HubName_str: hubNameInput,
+            });
+
+        await api.DeleteHub(deleteHubParam);
+
+        alert("The Virtual Hub '" + hubNameInput + "' is deleted.");
+
+        window.location.href = "./";
+    }
+    catch (ex)
+    {
+        alert(ex);
+    }
+}
+
+export async function HubAdminPage(queryString: string): Promise<void>
+{
+    let hubNameInput = queryString;
+    if (hubNameInput.length >= 1 && hubNameInput.charAt(0) == "?") hubNameInput = hubNameInput.substring(1);
+
+    try
+    {
+        let getHubParam: VPN.VpnRpcCreateHub = new VPN.VpnRpcCreateHub(
+            {
+                HubName_str: hubNameInput,
+            });
+        
+        let hubInfo = await api.GetHub(getHubParam);
+
+        $("#HUB_NAME").append("Virtual Hub \"" + hubInfo.HubName_str + "\"");
+
+        // User list
+        let enumUserParam: VPN.VpnRpcEnumUser = new VPN.VpnRpcEnumUser(
+            {
+                HubName_str: hubInfo.HubName_str,
+            });
+        
+        let enumUserRet = await api.EnumUser(enumUserParam);
+
+        let userListHtmlItem = $("#USERS_LIST");
+
+        enumUserRet.UserList.forEach(user =>
+        {
+            userListHtmlItem.append("<li><strong>" + user.Name_str + "</strong><BR>" + ConcatKeysToHtml(user) + "</li>");
+        });
+
+        // Sessions list
+        let enumSessionParam: VPN.VpnRpcEnumSession = new VPN.VpnRpcEnumSession(
+            {
+                HubName_str: hubInfo.HubName_str,
+            });
+
+        let enumSessionsRet = await api.EnumSession(enumSessionParam);
+
+        let sessionListHtmlItem = $("#SESSIONS_LIST");
+
+        enumSessionsRet.SessionList.forEach(session =>
+        {
+            sessionListHtmlItem.append("<li><strong>" + session.Name_str + "</strong><br>" + ConcatKeysToHtml(session) + "</li>");
+        });
+    }
+    catch (ex)
+    {
+        alert(ex);
+    }
+}
+
+
+

部分文件因为文件数量过多而无法显示