Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/SoftEtherVPN/SoftEtherVPN_Stable.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordnobori <da.git@softether.co.jp>2019-07-07 15:25:52 +0300
committerdnobori <da.git@softether.co.jp>2019-07-07 15:25:52 +0300
commit55d1ac0402a2f9cc546566485ad07cb1f8321b5d (patch)
tree186053d28d88e53a05968d54d948a679940c7ff0
parent92837bc8b46e244f3101c1d6425c171997ce79b1 (diff)
v4.30-9695-betav4.30-9695-beta
-rw-r--r--WARNING.TXT19
-rw-r--r--src/BuildUtil/UnixBuildSoftwares.cs29
-rw-r--r--src/BuildUtil/VpnBuilder.cs20
-rw-r--r--src/BuildUtil/VpnBuilderConfig.cs2
-rw-r--r--src/BuildUtil/Win32BuildUtil.cs10
-rw-r--r--src/Cedar/Admin.c1466
-rw-r--r--src/Cedar/Admin.h40
-rw-r--r--src/Cedar/CM.c6
-rw-r--r--src/Cedar/Cedar.h15
-rw-r--r--src/Cedar/CedarType.h4
-rw-r--r--src/Cedar/Client.c72
-rw-r--r--src/Cedar/Client.h1
-rw-r--r--src/Cedar/Command.c9
-rw-r--r--src/Cedar/Connection.c16
-rw-r--r--src/Cedar/Connection.h5
-rw-r--r--src/Cedar/DDNS.c3
-rw-r--r--src/Cedar/DDNS.h2
-rw-r--r--src/Cedar/EtherLog.c4
-rw-r--r--src/Cedar/Hub.c9
-rw-r--r--src/Cedar/Hub.h3
-rw-r--r--src/Cedar/IPsec_EtherIP.c2
-rw-r--r--src/Cedar/IPsec_IPC.c28
-rw-r--r--src/Cedar/IPsec_IPC.h19
-rw-r--r--src/Cedar/IPsec_PPP.c8
-rw-r--r--src/Cedar/Interop_OpenVPN.c39
-rw-r--r--src/Cedar/Interop_OpenVPN.h1
-rw-r--r--src/Cedar/Listener.c6
-rw-r--r--src/Cedar/Nat.c14
-rw-r--r--src/Cedar/Protocol.c2773
-rw-r--r--src/Cedar/Protocol.h105
-rw-r--r--src/Cedar/Radius.c112
-rw-r--r--src/Cedar/Radius.h6
-rw-r--r--src/Cedar/Remote.c10
-rw-r--r--src/Cedar/Remote.h1
-rw-r--r--src/Cedar/SM.c10
-rw-r--r--src/Cedar/SMInner.h1
-rw-r--r--src/Cedar/SW.c9
-rw-r--r--src/Cedar/Server.c105
-rw-r--r--src/Cedar/Server.h4
-rw-r--r--src/Cedar/Session.c55
-rw-r--r--src/Cedar/Session.h13
-rw-r--r--src/Cedar/UdpAccel.c320
-rw-r--r--src/Cedar/UdpAccel.h24
-rw-r--r--src/Cedar/VLanWin32.c4
-rw-r--r--src/CurrentBuild.txt8
-rw-r--r--src/Ham/generated_manual_cn.html9861
-rw-r--r--src/Ham/generated_manual_ja.html9862
-rw-r--r--src/Mayaqua/Encrypt.c1063
-rw-r--r--src/Mayaqua/Encrypt.h26
-rw-r--r--src/Mayaqua/FileIO.c6
-rw-r--r--src/Mayaqua/Kernel.c91
-rw-r--r--src/Mayaqua/Kernel.h2
-rw-r--r--src/Mayaqua/MayaType.h7
-rw-r--r--src/Mayaqua/Memory.c81
-rw-r--r--src/Mayaqua/Memory.h6
-rw-r--r--src/Mayaqua/Microsoft.c54
-rw-r--r--src/Mayaqua/Microsoft.h3
-rw-r--r--src/Mayaqua/Network.c583
-rw-r--r--src/Mayaqua/Network.h25
-rw-r--r--src/Mayaqua/Pack.c994
-rw-r--r--src/Mayaqua/Pack.h84
-rw-r--r--src/Mayaqua/Str.c2110
-rw-r--r--src/Mayaqua/Str.h255
-rw-r--r--src/Mayaqua/Table.c2
-rw-r--r--src/Mayaqua/Unix.c23
-rw-r--r--src/Mayaqua/Unix.h1
-rw-r--r--src/SEVPN.sln2
-rw-r--r--src/See/Packet.c64
-rw-r--r--src/WARNING.TXT19
-rw-r--r--src/bin/hamcore/DriverPackages/See/x64/See_x64.sysbin49864 -> 52424 bytes
-rw-r--r--src/bin/hamcore/DriverPackages/See/x86/See_x86.sysbin54984 -> 57032 bytes
-rw-r--r--src/bin/hamcore/lang.config17
-rw-r--r--src/bin/hamcore/openvpn_sample.ovpn49
-rw-r--r--src/bin/hamcore/strtable_cn.stb19
-rw-r--r--src/bin/hamcore/strtable_en.stb22
-rw-r--r--src/bin/hamcore/strtable_ja.stb24
-rw-r--r--src/bin/hamcore/vpnserver_api_doc.html14648
-rw-r--r--src/bin/hamcore/warning_cn.txt2
-rw-r--r--src/bin/hamcore/warning_en.txt2
-rw-r--r--src/bin/hamcore/warning_ja.txt2
-rw-r--r--src/bin/hamcore/wwwroot/admin/README.md22
-rw-r--r--src/bin/hamcore/wwwroot/admin/default/.gitignore1
-rw-r--r--src/bin/hamcore/wwwroot/admin/default/.vscode/launch.json16
-rw-r--r--src/bin/hamcore/wwwroot/admin/default/.vscode/settings.json5
-rw-r--r--src/bin/hamcore/wwwroot/admin/default/.vscode/tasks.json45
-rw-r--r--src/bin/hamcore/wwwroot/admin/default/hub.html23
-rw-r--r--src/bin/hamcore/wwwroot/admin/default/include_footer.html4
-rw-r--r--src/bin/hamcore/wwwroot/admin/default/include_head.html9
-rw-r--r--src/bin/hamcore/wwwroot/admin/default/include_menu.html29
-rw-r--r--src/bin/hamcore/wwwroot/admin/default/index.html45
-rw-r--r--src/bin/hamcore/wwwroot/admin/default/out_webpack/bundle.js2144
-rw-r--r--src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts10
-rw-r--r--src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts.map1
-rw-r--r--src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts11
-rw-r--r--src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts.map1
-rw-r--r--src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts2
-rw-r--r--src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts.map1
-rw-r--r--src/bin/hamcore/wwwroot/admin/default/package-lock.json4709
-rw-r--r--src/bin/hamcore/wwwroot/admin/default/package.json27
-rw-r--r--src/bin/hamcore/wwwroot/admin/default/src/ts/main.ts201
-rw-r--r--src/bin/hamcore/wwwroot/admin/default/theme.css18
-rw-r--r--src/bin/hamcore/wwwroot/admin/default/tsconfig.json68
-rw-r--r--src/bin/hamcore/wwwroot/admin/default/tsconfig_webpack.json68
-rw-r--r--src/bin/hamcore/wwwroot/admin/default/tslint.json20
-rw-r--r--src/bin/hamcore/wwwroot/admin/default/webpack.config.js38
-rw-r--r--src/bin/hamcore/wwwroot/admin/index.html15
-rw-r--r--src/bin/hamcore/wwwroot/index.html57
-rw-r--r--src/bin/vpnweb.cabbin206819 -> 206821 bytes
-rw-r--r--src/bin/vpnweb.ocxbin341816 -> 341816 bytes
-rw-r--r--src/makefiles/freebsd_32bit.mak2
-rw-r--r--src/makefiles/freebsd_64bit.mak2
-rw-r--r--src/makefiles/linux_32bit.mak2
-rw-r--r--src/makefiles/linux_64bit.mak2
-rw-r--r--src/makefiles/macos_32bit.mak2
-rw-r--r--src/makefiles/macos_64bit.mak2
-rw-r--r--src/makefiles/openbsd_32bit.mak2
-rw-r--r--src/makefiles/openbsd_64bit.mak2
-rw-r--r--src/makefiles/solaris_32bit.mak2
-rw-r--r--src/makefiles/solaris_64bit.mak2
-rw-r--r--src/vpnweb/vpnweb.h2
-rw-r--r--src/vpnweb/vpnweb_i.c2
-rw-r--r--src/vpnweb/vpnweb_p.c2
122 files changed, 52275 insertions, 762 deletions
diff --git a/WARNING.TXT b/WARNING.TXT
index 01c37e0a..f562dcec 100644
--- a/WARNING.TXT
+++ b/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
diff --git a/src/BuildUtil/UnixBuildSoftwares.cs b/src/BuildUtil/UnixBuildSoftwares.cs
index fcf502fa..ad353210 100644
--- a/src/BuildUtil/UnixBuildSoftwares.cs
+++ b/src/BuildUtil/UnixBuildSoftwares.cs
@@ -696,6 +696,9 @@ namespace BuildUtil
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");
sr.WriteLine("\t@echo \"*** How to start the {0} Service ***\"", BuildHelper.GetSoftwareTitle(this.Software));
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
@@ -716,7 +720,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\"");
sr.WriteLine("\t@echo \"from the http://www.softether-download.com/ web site.\"");
@@ -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");
diff --git a/src/BuildUtil/VpnBuilder.cs b/src/BuildUtil/VpnBuilder.cs
index 801e1cd3..7c135793 100644
--- a/src/BuildUtil/VpnBuilder.cs
+++ b/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
{
diff --git a/src/BuildUtil/VpnBuilderConfig.cs b/src/BuildUtil/VpnBuilderConfig.cs
index f84f7c0a..ee9573b2 100644
--- a/src/BuildUtil/VpnBuilderConfig.cs
+++ b/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,
diff --git a/src/BuildUtil/Win32BuildUtil.cs b/src/BuildUtil/Win32BuildUtil.cs
index e621b231..3d80fe2d 100644
--- a/src/BuildUtil/Win32BuildUtil.cs
+++ b/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))
diff --git a/src/Cedar/Admin.c b/src/Cedar/Admin.c
index 3ff53474..f622f67b 100644
--- a/src/Cedar/Admin.c
+++ b/src/Cedar/Admin.c
@@ -373,6 +373,1140 @@ CAPSLIST *ScGetCapsEx(RPC *rpc)
return t;
}
+// Process server side include
+BUF *AdminWebProcessServerSideInclude(BUF *src_txt, char *filename, UINT depth)
+{
+ char *src_str;
+ UINT src_str_size;
+ UINT i, len;
+ BUF *ret = NULL;
+ UINT pos = 0;
+ char dirname[MAX_PATH];
+ if (src_txt == NULL || filename == NULL || depth >= 4)
+ {
+ return CloneBuf(src_txt);
+ }
+ if (EndWith(filename, ".html") == false)
+ {
+ // We process only .html files
+ return CloneBuf(src_txt);
+ }
+
+ GetDirNameFromFilePath(dirname, sizeof(dirname), filename);
+
+ src_str_size = src_txt->Size + 1;
+ src_str = ZeroMalloc(src_str_size);
+
+ Copy(src_str, src_txt->Buf, src_txt->Size);
+
+ len = StrLen(src_str);
+
+ ret = NewBuf();
+
+ for (i = 0;i < len;i++)
+ {
+ char *start_tag = "<!--#include file=";
+ bool is_ssi = false;
+
+ if (StartWith(src_str + i, start_tag))
+ {
+ UINT a = i + StrLen(start_tag);
+
+ if (src_str[a] == '\"' || src_str[a] == '\'')
+ {
+ char delimier = src_str[a];
+ char delimier_str[2];
+ UINT b;
+
+ delimier_str[0] = delimier;
+ delimier_str[1] = 0;
+ b = SearchStrEx(src_str, delimier_str, i + StrLen(start_tag) + 1, true);
+
+ if ((b != INFINITE) && (b >= i + StrLen(start_tag) + 1) && ((b - (i + StrLen(start_tag) + 1)) < 32))
+ {
+ char inc_filename[MAX_PATH];
+ char *end_tag = "-->";
+ UINT x;
+
+ Zero(inc_filename, sizeof(inc_filename));
+
+ StrCpy(inc_filename, sizeof(inc_filename), src_str + i + StrLen(start_tag) + 1);
+ inc_filename[b - (i + StrLen(start_tag) + 1)] = 0;
+
+ x = SearchStrEx(src_str, end_tag, b + 1, true);
+
+ if ((x != INFINITE) && (x >= (b + 1)))
+ {
+ BUF *inc_buf;
+ char full_inc_filename[MAX_PATH];
+
+ if (StartWith(inc_filename, "/"))
+ {
+ Format(full_inc_filename, sizeof(full_inc_filename), "|wwwroot/%s", inc_filename + 1);
+ }
+ else
+ {
+ StrCpy(full_inc_filename, sizeof(full_inc_filename), dirname);
+ StrCat(full_inc_filename, sizeof(full_inc_filename), "/");
+ StrCat(full_inc_filename, sizeof(full_inc_filename), inc_filename);
+ }
+
+ Debug("dirname = %s, full_inc_filename (src) = %s\n\n", dirname, full_inc_filename);
+ NormalizePath(full_inc_filename, sizeof(full_inc_filename), full_inc_filename);
+
+ if (StartWith(full_inc_filename, "|wwwroot/") == false
+ && StartWith(full_inc_filename, "|wwwroot\\") == false)
+ {
+ char tmp[MAX_PATH];
+ Format(tmp, sizeof(tmp), "|wwwroot/%s", full_inc_filename);
+ StrCpy(full_inc_filename, sizeof(full_inc_filename), tmp);
+ }
+
+ Debug("inc_filename = %s\nfull_inc_filename = %s\n\n", inc_filename, full_inc_filename);
+
+ inc_buf = ReadDump(full_inc_filename);
+
+ if (inc_buf != NULL)
+ {
+ BUF *inc_buf2;
+
+ inc_buf2 = AdminWebProcessServerSideInclude(inc_buf, full_inc_filename, depth + 1);
+
+ BufSkipUtf8Bom(inc_buf2);
+ WriteBufBufWithOffset(ret, inc_buf2);
+
+ FreeBuf(inc_buf);
+ FreeBuf(inc_buf2);
+ }
+ else
+ {
+ Debug("Loading SSI '%s' error.\n", inc_buf);
+ }
+
+ i = (x + StrLen(end_tag) - 1);
+
+ is_ssi = true;
+ }
+ }
+ }
+ }
+
+ if (is_ssi == false)
+ {
+ WriteBufChar(ret, src_str[i]);
+ }
+ }
+
+ Free(src_str);
+
+ return ret;
+}
+
+// Handle the file request
+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)
+{
+ bool ret = false;
+ char url[MAX_PATH];
+ UINT i, len;
+ if (a == NULL || c == NULL || s == NULL || h == NULL || url == NULL || query_string == NULL ||
+ virtual_root_dir == NULL || physical_root_dir == NULL)
+ {
+ return false;
+ }
+
+ StrCpy(url, sizeof(url), url_src);
+
+ len = StrLen(url);
+ for (i = 0;i < len;i++)
+ {
+ if (url[i] == '\\')
+ {
+ url[i] = '/';
+ }
+ }
+
+ // Is dangerous URL?
+ if (InStr(url, "..") || InStr(url, "//") || InStr(url, "\\\\") || InStr(url, "/\\") || InStr(url, "\\/"))
+ {
+ ret = AdminWebSend404Error(s, h);
+ }
+ else
+ {
+ char filename[MAX_PATH];
+ bool is_index_file = false;
+
+ BUF *b = AdminWebTryFindAndReadFile(virtual_root_dir, physical_root_dir, url,
+ filename, sizeof(filename), &is_index_file);
+
+ if (b == NULL)
+ {
+ ret = AdminWebSend404Error(s, h);
+ }
+ else
+ {
+ if (is_index_file && EndWith(url, "/") == false)
+ {
+ char url2[MAX_PATH];
+ StrCpy(url2, sizeof(url2), url);
+ StrCat(url2, sizeof(url2), "/");
+ ret = AdminWebSend302Redirect(s, url2, query_string, h);
+ }
+ else if (is_index_file == false && EndWith(url, "/"))
+ {
+ char url2[MAX_PATH];
+ TrimEndWith(url2, sizeof(url2), url, "/");
+ ret = AdminWebSend302Redirect(s, url2, query_string, h);
+ }
+ else
+ {
+ BUF *b2 = AdminWebProcessServerSideInclude(b, filename, 0);
+ char *mime = GetMimeTypeFromFileName(filename);
+
+ if (mime == NULL)
+ {
+ mime = "application/octet-stream";
+ }
+
+ ret = AdminWebSendBody(s, 200, "OK", b2->Buf, b2->Size, mime, NULL, NULL, h);
+
+ FreeBuf(b2);
+ }
+ FreeBuf(b);
+ }
+ }
+
+ return ret;
+}
+
+// Try to find a file, and if exists return the file contents
+BUF *AdminWebTryFindAndReadFile(char *vroot, char *proot, char *url, char *ret_filename, UINT ret_filename_size, bool *is_index_html)
+{
+ char tmp[MAX_PATH];
+ char tmp2[MAX_PATH];
+ UINT vroot_len;
+ UINT url_len;
+ char relative_path[MAX_PATH];
+ BUF *b;
+ if (vroot == NULL || proot == NULL || url == NULL || ret_filename == NULL || is_index_html == NULL)
+ {
+ return NULL;
+ }
+
+ *is_index_html = false;
+
+ if (StartWith(url, vroot) == false)
+ {
+ return NULL;
+ }
+
+ vroot_len = StrLen(vroot);
+ url_len = StrLen(url);
+
+ StrCpy(relative_path, sizeof(relative_path), url + vroot_len);
+
+ if (StartWith(relative_path, "/"))
+ {
+ char tmp3[MAX_PATH];
+
+ StrCpy(tmp3, sizeof(tmp3), relative_path + 1);
+ StrCpy(relative_path, sizeof(relative_path), tmp3);
+ }
+
+ CombinePath(tmp, sizeof(tmp), proot, relative_path);
+
+ // index.html
+ CombinePath(tmp2, sizeof(tmp2), tmp, "index.html");
+ b = AdminWebTryOneFile(tmp2, ret_filename, ret_filename_size);
+ if (b != NULL)
+ {
+ *is_index_html = true;
+ return b;
+ }
+
+ // dirname/filename
+ StrCpy(tmp2, sizeof(tmp2), tmp);
+ b = AdminWebTryOneFile(tmp2, ret_filename, ret_filename_size);
+ if (b != NULL)
+ {
+ return b;
+ }
+
+ return NULL;
+}
+BUF *AdminWebTryOneFile(char *filename, char *ret_filename, UINT ret_filename_size)
+{
+ BUF *b;
+ if (filename == NULL || ret_filename == NULL)
+ {
+ return NULL;
+ }
+
+ b = ReadDump(filename);
+ if (b == NULL)
+ {
+ return NULL;
+ }
+
+ StrCpy(ret_filename, ret_filename_size, filename);
+
+ return b;
+}
+
+// Send a 401 Unauthorized error
+bool AdminWebSendUnauthorized(SOCK *s, HTTP_HEADER *http_request_headers)
+{
+ char *http_401_str = "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\r\n<html><head>\r\n<title>401 Unauthorized</title>\r\n</head><body>\r\n<h1>" CEDAR_SERVER_STR ": Administrative authentication required.</h1>\r\n<p>This VPN Server could not verify that you are authorized to access to the \r\nserver in administrative mode.</p>\r\n<p><strong>For web browser logins:<br></strong>You must supply the HTTP basic \r\nauthentication credential as following.</p>\r\n<ul>\r\n\t<li>To login to the VPN server as the entire server administrator, specify empty or &quot;administrator&quot; as the username field, and specify the server administrative \r\n\tpassword as the password field.<br></li>\r\n\t<li>To login to a particular Virtual Hub as the hub administrator, specify \r\n\tthe hub name as the username field, and specify the hub administrative \r\n\tpassword as the password field.</li>\r\n</ul>\r\n<p><strong>For JSON-RPC client logins:<br></strong>Instead to HTTP basic \r\nauthentication, you can also specify the HTTP header parameters as following.</p>\r\n<ul>\r\n\t<li>X-VPNADMIN-HUBNAME: Empty to login to the VPN Server as the entire \r\n\tserver administrator, or specify the target Virtual Hub name as the hub \r\n\tadministrator.</li>\r\n\t<li>X-VPNADMIN-PASSWORD: Specify the administrative password.</li>\r\n</ul>\r\n</body></html>\r\n";
+ bool ret;
+ // Validate arguments
+ if (s == NULL || http_request_headers == NULL)
+ {
+ return false;
+ }
+
+ // Creating a Data
+ ret = AdminWebSendBody(s, 401, "Unauthorized", http_401_str, StrLen(http_401_str), HTTP_CONTENT_TYPE,
+ "WWW-Authenticate",
+ "Basic realm=\"Username 'administrator' for entire VPN Server privilege, or specify Virtual Hub name as the username for specified Virtual Hub administrative privilege.\"",
+ http_request_headers);
+
+ return ret;
+}
+
+// Send reply
+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)
+{
+ HTTP_HEADER *h;
+ char date_str[MAX_SIZE];
+ char error_code_str[16];
+ bool ret = false;
+ HTTP_VALUE *origin;
+ if (s == NULL || status_string == NULL || (data_size != 0 && data == NULL) || request_headers == NULL)
+ {
+ return false;
+ }
+ if (content_type == NULL)
+ {
+ content_type = "text/html; charset=utf-8";
+ }
+
+ ToStr(error_code_str, status_code);
+ GetHttpDateStr(date_str, sizeof(date_str), SystemTime64());
+
+ h = NewHttpHeader("HTTP/1.1", error_code_str, status_string);
+
+ if (StrCmpi(request_headers->Method, "OPTIONS") == 0)
+ {
+ AddHttpValue(h, NewHttpValue("Allow", "OPTIONS, GET, POST"));
+ }
+
+ AddHttpValue(h, NewHttpValue("Cache-Control", "no-cache"));
+ AddHttpValue(h, NewHttpValue("Content-Type", content_type));
+ AddHttpValue(h, NewHttpValue("Date", date_str));
+ AddHttpValue(h, NewHttpValue("Connection", "Keep-Alive"));
+ AddHttpValue(h, NewHttpValue("Access-Control-Allow-Methods", "OPTIONS,GET,POST"));
+ AddHttpValue(h, NewHttpValue("Access-Control-Allow-Headers", "X-VPNADMIN-HUBNAME,X-VPNADMIN-PASSWORD"));
+ AddHttpValue(h, NewHttpValue("Access-Control-Allow-Credentials", "true"));
+
+ origin = GetHttpValue(request_headers, "Origin");
+ if (origin != NULL)
+ {
+ AddHttpValue(h, NewHttpValue("Access-Control-Allow-Origin", origin->Data));
+ }
+
+ if (add_header_name != NULL && add_header_value != NULL)
+ {
+ AddHttpValue(h, NewHttpValue(add_header_name, add_header_value));
+ }
+
+ ret = PostHttp(s, h, data, data_size);
+
+ FreeHttpHeader(h);
+
+ return ret;
+}
+
+// Send 404 error
+bool AdminWebSend404Error(SOCK *s, HTTP_HEADER *request_headers)
+{
+ char *body = "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\r\n<html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL was not found on this server.</p></body></html>\r\n";
+ if (s == NULL || request_headers == NULL)
+ {
+ return false;
+ }
+
+ return AdminWebSendBody(s, 404, "Not Found", body, StrLen(body), NULL, NULL, NULL, request_headers);
+}
+
+// Send 302 redirect
+bool AdminWebSend302Redirect(SOCK *s, char *url, char *query_string, HTTP_HEADER *request_headers)
+{
+ bool ret = false;
+ char *txt;
+ UINT txt_size;
+ char *url2;
+ UINT url2_size;
+ char *body = "<html><head><title>Object moved</title></head><body>\r\n<h2>Object moved to <a href=\"$URL$\">here</a>.</h2>\r\n</body></html>";
+ if (s == NULL || url == NULL || request_headers == NULL)
+ {
+ return false;
+ }
+
+ url2_size = (StrSize(url) + StrSize(query_string) + MAX_SIZE) * 2;
+ url2 = ZeroMalloc(url2_size);
+
+ StrCpy(url2, url2_size, url);
+ if (IsEmptyStr(query_string) == false)
+ {
+ StrCat(url2, url2_size, "?");
+ StrCat(url2, url2_size, query_string);
+ }
+
+ txt_size = (StrSize(body) + StrSize(url2) + MAX_SIZE) * 2;
+ txt = ZeroMalloc(txt_size);
+
+ ReplaceStrEx(txt, txt_size, body, "$URL$", url2, false);
+
+ ret = AdminWebSendBody(s, 302, "Found", txt, StrLen(txt), NULL, "Location", url2, request_headers);
+
+ Free(txt);
+
+ Free(url2);
+
+ return ret;
+}
+
+// "/admin" web page POST handler
+void AdminWebProcPost(CONNECTION *c, SOCK *s, HTTP_HEADER *h, UINT post_data_size, char *url_target)
+{
+ ADMIN *a;
+ UCHAR *data;
+ char url[MAX_PATH];
+ char query_string[MAX_SIZE];
+ UINT i;
+ if (c == NULL || s == NULL || h == NULL || url_target == NULL)
+ {
+ return;
+ }
+
+ a = JsonRpcAuthLogin(c->Cedar, s, h);
+ if (a == NULL)
+ {
+ RecvAllWithDiscard(s, post_data_size, s->SecureMode);
+ AdminWebSendUnauthorized(s, h);
+ return;
+ }
+
+ if (post_data_size > a->MaxJsonRpcRecvSize)
+ {
+ Disconnect(s);
+ return;
+ }
+
+ data = ZeroMalloc(post_data_size + 1);
+
+ if (RecvAll(s, data, post_data_size, s->SecureMode))
+ {
+ c->JsonRpcAuthed = true;
+
+ // Divide url_target into URL and query string
+ StrCpy(url, sizeof(url), url_target);
+ Zero(query_string, sizeof(query_string));
+ i = SearchStr(url, "?", 0);
+ if (i != INFINITE)
+ {
+ StrCpy(query_string, sizeof(query_string), url + i + 1);
+ url[i] = 0;
+ }
+
+ AdminWebHandleFileRequest(a, c, s, h, url, query_string, "/admin", "|wwwroot/admin");
+ }
+
+ Free(data);
+ Free(a);
+}
+
+// "/admin" web page GET handler
+void AdminWebProcGet(CONNECTION *c, SOCK *s, HTTP_HEADER *h, char *url_target)
+{
+ ADMIN *a;
+ char url[MAX_PATH];
+ char query_string[MAX_SIZE];
+ UINT i;
+ if (c == NULL || s == NULL || h == NULL || url_target == NULL)
+ {
+ return;
+ }
+
+ a = JsonRpcAuthLogin(c->Cedar, s, h);
+ if (a == NULL)
+ {
+ AdminWebSendUnauthorized(s, h);
+ return;
+ }
+
+ c->JsonRpcAuthed = true;
+
+ // Divide url_target into URL and query string
+ StrCpy(url, sizeof(url), url_target);
+ Zero(query_string, sizeof(query_string));
+ i = SearchStr(url, "?", 0);
+ if (i != INFINITE)
+ {
+ StrCpy(query_string, sizeof(query_string), url + i + 1);
+ url[i] = 0;
+ }
+
+ AdminWebHandleFileRequest(a, c, s, h, url, query_string, "/admin", "|wwwroot/admin");
+
+ Free(a);
+}
+
+// New JSON-RPC Result
+JSON_VALUE *JsonRpcNewResponse(PACK *p)
+{
+ JSON_VALUE *jv;
+ JSON_OBJECT *jo;
+ JSON_VALUE *jv2;
+
+ if (p == NULL)
+ {
+ return NULL;
+ }
+
+ jv = JsonNewObject();
+ jo = JsonValueGetObject(jv);
+
+ jv2 = PackToJson(p);
+
+ JsonSet(jo, "result", jv2);
+
+ return jv;
+}
+
+// New JSON-RPC Error
+JSON_VALUE *JsonRpcNewError(int code, wchar_t *message)
+{
+ wchar_t msg[MAX_PATH];
+ JSON_VALUE *jv;
+ JSON_OBJECT *jo;
+ JSON_VALUE *jv2;
+ JSON_OBJECT *jo2;
+
+ if (UniIsEmptyStr(message))
+ {
+ UniFormat(msg, sizeof(msg), L"Error code %u", code);
+ }
+ else
+ {
+ UniFormat(msg, sizeof(msg), L"Error code %u: %s", code, message);
+ }
+
+ jv = JsonNewObject();
+ jo = JsonValueGetObject(jv);
+
+ jv2 = JsonNewObject();
+ jo2 = JsonValueGetObject(jv2);
+
+ JsonSet(jo, "error", jv2);
+
+ JsonSetNumber(jo2, "code", (UINT64)code);
+ JsonSetUniStr(jo2, "message", msg);
+
+ return jv;
+}
+
+// JSON-RPC process request object
+JSON_VALUE *JsonRpcProcRequestObject(ADMIN *admin, CONNECTION *c, SOCK *s, JSON_VALUE *json_req, char *method_name)
+{
+ PACK *pack_request;
+ JSON_VALUE *ret = NULL;
+ if (c == NULL || s == NULL || json_req == NULL || admin == NULL)
+ {
+ return NULL;
+ }
+
+ pack_request = JsonToPack(json_req);
+
+ PackAddStr(pack_request, "function_name", method_name);
+
+ if (pack_request != NULL)
+ {
+ RPC *rpc;
+ PACK *pack_response;
+ UINT err;
+
+ // RPC Server
+ rpc = StartRpcServer(s, AdminDispatch, admin);
+
+ admin->Rpc = rpc;
+
+ pack_response = CallRpcDispatcher(rpc, pack_request);
+
+ if (pack_response == NULL)
+ {
+ pack_response = PackError(ERR_NOT_SUPPORTED);
+ }
+
+ RpcFreeEx(rpc, true);
+
+ FreePack(pack_request);
+
+ // Construct response object
+ err = GetErrorFromPack(pack_response);
+ if (err != 0)
+ {
+ // Return the error
+ ret = JsonRpcNewError(err, _E(err));
+ }
+ else
+ {
+ // Return the PACK
+ ret = JsonRpcNewResponse(pack_response);
+ }
+
+ SLog(admin->Server->Cedar, "LS_API_RPC_CALL",
+ &s->RemoteIP, s->RemotePort, s->RemoteHostname,
+ method_name, err, _E(err));
+
+ FreePack(pack_response);
+ }
+
+ return ret;
+}
+
+// JSON-RPC HTTP user authentication
+bool HttpParseBasicAuthHeader(HTTP_HEADER *h, char *username, UINT username_size, char *password, UINT password_size)
+{
+ bool ret = false;
+ HTTP_VALUE *auth_value;
+ HTTP_VALUE *vpnadmin_hubname;
+ HTTP_VALUE *vpnadmin_password;
+ if (h == NULL || username == NULL || password == NULL)
+ {
+ return false;
+ }
+
+ auth_value = GetHttpValue(h, "Authorization");
+ vpnadmin_hubname = GetHttpValue(h, "X-VPNADMIN-HUBNAME");
+ vpnadmin_password = GetHttpValue(h, "X-VPNADMIN-PASSWORD");
+
+ if (vpnadmin_password != NULL)
+ {
+ if (vpnadmin_hubname == NULL)
+ {
+ StrCpy(username, username_size, "");
+ }
+ else
+ {
+ StrCpy(username, username_size, vpnadmin_hubname->Data);
+ }
+
+ StrCpy(password, password_size, vpnadmin_password->Data);
+
+ ret = true;
+ }
+
+ if (ret == false && auth_value != NULL)
+ {
+ char key[32], value[MAX_SIZE];
+
+ if (GetKeyAndValue(auth_value->Data, key, sizeof(key), value, sizeof(value), " \t"))
+ {
+ if (StrCmpi(key, "Basic") == 0 && IsEmptyStr(value) == false)
+ {
+ UINT b64_dest_size = StrSize(value) * 2 + 256;
+ char *b64_dest = ZeroMalloc(b64_dest_size);
+
+ Decode64(b64_dest, value);
+
+ if (IsEmptyStr(b64_dest) == false)
+ {
+ if (b64_dest[0] == ':')
+ {
+ // Empty username
+ StrCpy(username, username_size, "");
+ StrCpy(password, password_size, b64_dest + 1);
+ ret = true;
+ }
+ else
+ {
+ if (GetKeyAndValue(b64_dest, username, username_size, password, password_size, ":"))
+ {
+ ret = true;
+ }
+ }
+ }
+
+ Free(b64_dest);
+ }
+ }
+ }
+
+ return ret;
+}
+
+// JSON-RPC Login
+ADMIN *JsonRpcAuthLogin(CEDAR *c, SOCK *sock, HTTP_HEADER *h)
+{
+ ADMIN *a = NULL;
+ char username[MAX_HUBNAME_LEN + 1];
+ char password[MAX_PASSWORD_LEN + 1];
+ SERVER *s;
+ char empty_pw_hash[SHA1_SIZE];
+
+ if (c == NULL || h == NULL || sock == NULL)
+ {
+ return NULL;
+ }
+
+ s = c->Server;
+
+ HashAdminPassword(empty_pw_hash, "");
+
+ Zero(username, sizeof(username));
+ Zero(password, sizeof(password));
+
+ if (HttpParseBasicAuthHeader(h, username, sizeof(username), password, sizeof(password)))
+ {
+ char pw_hash[SHA1_SIZE];
+ bool is_server_admin = false;
+ bool is_hub_admin = false;
+ char hub_name[MAX_HUBNAME_LEN + 1];
+
+ HashAdminPassword(pw_hash, password);
+
+ Zero(hub_name, sizeof(hub_name));
+
+ // Check if the server administrator password is empty. If yes, login always success.
+ if (Cmp(s->HashedPassword, empty_pw_hash, SHA1_SIZE) == 0)
+ {
+ is_server_admin = true;
+ }
+ else
+ {
+ if (IsEmptyStr(username) || StrCmpi(username, ADMINISTRATOR_USERNAME) == 0)
+ {
+ // If the username is empty or 'administrator', verify with the server admin password.
+ if (Cmp(s->HashedPassword, pw_hash, SHA1_SIZE) == 0)
+ {
+ is_server_admin = true;
+ }
+ }
+ }
+
+ if (is_server_admin == false)
+ {
+ HUB *h;
+ // Hub admin mode
+ LockHubList(c);
+ {
+ h = GetHub(c, username);
+ }
+ UnlockHubList(c);
+
+ if (h != NULL)
+ {
+ Lock(h->lock);
+ {
+ if (Cmp(pw_hash, h->HashedPassword, SHA1_SIZE) == 0)
+ {
+ is_hub_admin = true;
+
+ StrCpy(hub_name, sizeof(hub_name), h->Name);
+ }
+ }
+ Unlock(h->lock);
+
+ ReleaseHub(h);
+ }
+ }
+
+ if (is_server_admin || is_hub_admin)
+ {
+ if (CheckAdminSourceAddress(sock, hub_name))
+ {
+ a = ZeroMalloc(sizeof(ADMIN));
+
+ a->Server = s;
+ a->ServerAdmin = is_server_admin;
+ a->ClientBuild = c->Build;
+
+ if (is_hub_admin)
+ {
+ StrCpy(a->dummy1, sizeof(a->dummy1), hub_name);
+ a->HubName = a->dummy1;
+ }
+ }
+ }
+ }
+
+ if (a != NULL)
+ {
+ char admin_mode[256];
+ if (a->ServerAdmin)
+ {
+ a->MaxJsonRpcRecvSize = ADMIN_RPC_MAX_POST_SIZE_BY_SERVER_ADMIN;
+ }
+ else
+ {
+ a->MaxJsonRpcRecvSize = ADMIN_RPC_MAX_POST_SIZE_BY_HUB_ADMIN;
+ }
+
+ if (IsEmptyStr(a->HubName))
+ {
+ StrCpy(admin_mode, sizeof(admin_mode),
+ "Entire VPN Server Admin Mode");
+ }
+ else
+ {
+ Format(admin_mode, sizeof(admin_mode),
+ "Virtual Hub Admin Mode for '%s'",
+ a->HubName);
+ }
+
+ SLog(s->Cedar, "LS_API_AUTH_OK",
+ &sock->RemoteIP, sock->RemotePort, sock->RemoteHostname,
+ admin_mode, username, h->Method, h->Target);
+ }
+ else
+ {
+ SLog(s->Cedar, "LS_API_AUTH_ERROR",
+ &sock->RemoteIP, sock->RemotePort, sock->RemoteHostname,
+ username, h->Method, h->Target);
+ }
+
+
+ return a;
+}
+
+// Query string to JSON list value
+JSON_VALUE *QueryStringToJsonListValue(char *qs)
+{
+ TOKEN_LIST *t;
+ UINT i;
+ LIST *distinct_list = NULL;
+ JSON_VALUE *v = NULL;
+ JSON_OBJECT *o = NULL;
+ if (qs == NULL)
+ {
+ return NULL;
+ }
+
+ t = ParseTokenWithoutNullStr(qs, "&");
+ if (t == NULL)
+ {
+ return NULL;
+ }
+
+ distinct_list = NewStrList();
+
+ v = JsonNewObject();
+ o = JsonValueGetObject(v);
+
+ for (i = 0;i < t->NumTokens;i++)
+ {
+ char *token = t->Token[i];
+ UINT pos;
+
+ pos = SearchStr(token, "=", 0);
+ if (pos != INFINITE)
+ {
+ char *key_decoded;
+ char *value_decoded;
+ char *key = CopyStr(token);
+ char *value = CopyStr(token + pos + 1);
+
+ key[pos] = 0;
+ key_decoded = UrlDecode(key);
+ value_decoded = UrlDecode(value);
+
+ if (key_decoded != NULL && value_decoded != NULL)
+ {
+ if (AddStrToStrListDistinct(distinct_list, key_decoded))
+ {
+ JsonSetStr(o, key_decoded, value_decoded);
+ }
+ }
+
+ Free(value_decoded);
+ Free(key_decoded);
+ Free(key);
+ Free(value);
+ }
+ }
+
+ FreeToken(t);
+
+ FreeStrList(distinct_list);
+
+ return v;
+}
+
+// Construct new JSON-RPC dummy request
+JSON_VALUE *ConstructDummyJsonRpcRequest(char *method_name, JSON_VALUE *p)
+{
+ JSON_VALUE *ret;
+ JSON_OBJECT *ret_object;
+ UCHAR rand[16];
+ char id_str[64];
+
+ Rand(rand, sizeof(rand));
+
+ BinToStr(id_str, sizeof(id_str), rand, sizeof(rand));
+
+ ret = JsonNewObject();
+ ret_object = JsonObject(ret);
+
+ JsonSetStr(ret_object, "jsonrpc", "2.0");
+ JsonSetStr(ret_object, "method", method_name);
+ JsonSet(ret_object, "params", p);
+ JsonSetStr(ret_object, "id", id_str);
+
+ return ret;
+}
+
+// JSON-RPC Options Dispatch
+void JsonRpcProcOptions(CONNECTION *c, SOCK *s, HTTP_HEADER *h, char *url_target)
+{
+ if (c == NULL || s == NULL || h == NULL || url_target == NULL)
+ {
+ return;
+ }
+
+ c->JsonRpcAuthed = true;
+
+
+ AdminWebSendBody(s, 200, "OK", NULL, 0, NULL, NULL, NULL, h);
+}
+
+// JSON-RPC GET Dispatch
+void JsonRpcProcGet(CONNECTION *c, SOCK *s, HTTP_HEADER *h, char *url_target)
+{
+ ADMIN *a;
+ char url[MAX_PATH];
+ char query_string[MAX_SIZE];
+ UINT i;
+ bool reply_sent = false;
+ if (c == NULL || s == NULL || h == NULL || url_target == NULL)
+ {
+ return;
+ }
+
+ a = JsonRpcAuthLogin(c->Cedar, s, h);
+ if (a == NULL)
+ {
+ AdminWebSendUnauthorized(s, h);
+ return;
+ }
+
+ c->JsonRpcAuthed = true;
+
+
+ // Divide url_target into URL and query string
+ StrCpy(url, sizeof(url), url_target);
+ Zero(query_string, sizeof(query_string));
+ i = SearchStr(url, "?", 0);
+ if (i != INFINITE)
+ {
+ StrCpy(query_string, sizeof(query_string), url + i + 1);
+ url[i] = 0;
+ }
+
+ if (StartWith(url, "/api/"))
+ {
+ // Call a method
+ JSON_VALUE *params_value = NULL;
+ JSON_OBJECT *params_object = NULL;
+ UINT i;
+ char method_name[MAX_PATH];
+
+ StrCpy(method_name, sizeof(method_name), url + 5);
+
+ i = SearchStr(method_name, "/", 0);
+ if (i != INFINITE)
+ {
+ method_name[i] = 0;
+ }
+
+ if (IsEmptyStr(method_name) == false)
+ {
+ // Call a method
+ params_value = QueryStringToJsonListValue(query_string);
+
+ if (params_value != NULL)
+ {
+ JSON_VALUE *json_ret = NULL;
+ char id[96];
+ char *ret_str = NULL;
+
+ GetDateTimeStrMilli64(id, sizeof(id), LocalTime64());
+
+ params_object = JsonObject(params_value);
+
+ // Process the request
+ json_ret = JsonRpcProcRequestObject(a, c, s, params_value, method_name);
+
+ if (json_ret == NULL)
+ {
+ json_ret = JsonRpcNewError(ERR_INTERNAL_ERROR, L"Internal error");
+ }
+
+ JsonSetStr(JsonObject(json_ret), "jsonrpc", "2.0");
+ JsonSetStr(JsonObject(json_ret), "id", id);
+
+ ret_str = JsonToStr(json_ret);
+
+ AdminWebSendBody(s, 200, "OK", ret_str, StrLen(ret_str), "text/plain; charset=UTF-8", NULL, NULL, h);
+
+ Free(ret_str);
+ JsonFree(json_ret);
+ JsonFree(params_value);
+ }
+ }
+ }
+
+
+ if (reply_sent == false)
+ {
+ BUF *html_buf = ReadDump("|vpnserver_api_doc.html");
+
+ if (html_buf != NULL)
+ {
+ AdminWebSendBody(s, 200, "OK", html_buf->Buf, html_buf->Size, "text/html; charset=UTF-8", NULL, NULL, h);
+
+ FreeBuf(html_buf);
+ }
+ else
+ {
+ AdminWebSend404Error(s, h);
+ }
+ }
+
+ if (a->LogFileList != NULL)
+ {
+ FreeEnumLogFile(a->LogFileList);
+ }
+ Free(a);
+}
+
+// JSON-RPC POST Dispatch
+void JsonRpcProcPost(CONNECTION *c, SOCK *s, HTTP_HEADER *h, UINT post_data_size)
+{
+ ADMIN *a;
+ UCHAR *data;
+ if (c == NULL || s == NULL || h == NULL)
+ {
+ return;
+ }
+
+ a = JsonRpcAuthLogin(c->Cedar, s, h);
+ if (a == NULL)
+ {
+ RecvAllWithDiscard(s, post_data_size, s->SecureMode);
+ AdminWebSendUnauthorized(s, h);
+ return;
+ }
+
+ if (post_data_size > a->MaxJsonRpcRecvSize)
+ {
+ Disconnect(s);
+ return;
+ }
+
+ data = ZeroMalloc(post_data_size + 1);
+
+ if (RecvAll(s, data, post_data_size, s->SecureMode))
+ {
+ // Parse JSON
+ JSON_VALUE *json_req = StrToJson(data);
+ JSON_OBJECT *json_req_object = JsonObject(json_req);
+ JSON_VALUE *json_ret = NULL;
+ char *res = NULL;
+ char *request_id = NULL;
+ char *method_name = NULL;
+
+ c->JsonRpcAuthed = true;
+
+
+ if (json_req == NULL || json_req_object == NULL)
+ {
+ // Parse error
+ json_ret = JsonRpcNewError(ERR_INVALID_PARAMETER, L"Parameter is invalid: JSON-RPC Parse Error");
+ }
+ else
+ {
+ // check the JSON-RPC version
+ char *ver_str = JsonGetStr(json_req_object, "jsonrpc");
+ if (StrCmpi(ver_str, "2.0") != 0)
+ {
+ // Invalid version
+ json_ret = JsonRpcNewError(ERR_INVALID_PARAMETER, L"JSON-RPC version is invalid");
+ }
+ else
+ {
+ JSON_VALUE *params_value = NULL;
+ JSON_OBJECT *params_object = NULL;
+
+ // Get Request ID
+ request_id = JsonGetStr(json_req_object, "id");
+
+ // Get method name
+ method_name = JsonGetStr(json_req_object, "method");
+
+ // Get parameters
+ params_value = JsonGet(json_req_object, "params");
+ params_object = JsonObject(params_value);
+
+ if (IsEmptyStr(method_name))
+ {
+ // method is empty
+ json_ret = JsonRpcNewError(ERR_INVALID_PARAMETER, L"JSON-RPC method name is empty");
+ }
+ else if (params_value == NULL || params_object == NULL)
+ {
+ // params is empty
+ json_ret = JsonRpcNewError(ERR_INVALID_PARAMETER, L"JSON-RPC parameter is empty");
+ }
+ else
+ {
+ // Process the request
+ json_ret = JsonRpcProcRequestObject(a, c, s, params_value, method_name);
+ }
+ }
+ }
+
+ if (json_ret == NULL)
+ {
+ json_ret = JsonRpcNewError(ERR_INTERNAL_ERROR, L"Internal error");
+ }
+
+ JsonSetStr(JsonObject(json_ret), "jsonrpc", "2.0");
+ if (request_id == NULL)
+ {
+ request_id = "0";
+ }
+ JsonSetStr(JsonObject(json_ret), "id", request_id);
+
+ res = JsonToStr(json_ret);
+
+ AdminWebSendBody(s, 200, "OK", res, StrLen(res), "application/json", NULL, NULL, h);
+
+ Free(res);
+
+ JsonFree(json_ret);
+ JsonFree(json_req);
+ }
+
+ Free(data);
+
+ if (a->LogFileList != NULL)
+ {
+ FreeEnumLogFile(a->LogFileList);
+ }
+ Free(a);
+}
+
// Dispatch routine for Administration RPC
PACK *AdminDispatch(RPC *rpc, char *name, PACK *p)
{
@@ -1103,11 +2237,6 @@ UINT StMakeOpenVpnConfigFile(ADMIN *a, RPC_READ_LOG_FILE *t)
UCHAR *zero_buffer;
UINT zero_buffer_size = 128 * 1024;
char name_tmp[MAX_SIZE];
- X *dummy_x = NULL;
- K *dummy_private_k = NULL;
- K *dummy_public_k = NULL;
- BUF *dummy_x_buf = NULL;
- BUF *dummy_k_buf = NULL;
zero_buffer = ZeroMalloc(zero_buffer_size);
@@ -1145,34 +2274,6 @@ UINT StMakeOpenVpnConfigFile(ADMIN *a, RPC_READ_LOG_FILE *t)
WriteBufChar(x_buf, 0);
SeekBufToBegin(x_buf);
- // Generate a dummy certificate
- if (x != NULL)
- {
- if (RsaGen(&dummy_private_k, &dummy_public_k, x->bits))
- {
- NAME *name;
- wchar_t cn[128];
-
- UniToStr64(cn, Rand64());
-
- name = NewName(cn, cn, cn, L"US", NULL, NULL);
-
- dummy_x = NewRootX(dummy_public_k, dummy_private_k, name, GetDaysUntil2038Ex(), NULL);
-
- FreeName(name);
-
- dummy_x_buf = XToBuf(dummy_x, true);
- SeekBufToEnd(dummy_x_buf);
- WriteBufChar(dummy_x_buf, 0);
- SeekBufToBegin(dummy_x_buf);
-
- dummy_k_buf = KToBuf(dummy_private_k, true, NULL);
- SeekBufToEnd(dummy_k_buf);
- WriteBufChar(dummy_k_buf, 0);
- SeekBufToBegin(dummy_k_buf);
- }
- }
-
FreeX(x);
Zero(hostname, sizeof(hostname));
Zero(tag_before_hostname, sizeof(tag_before_hostname));
@@ -1290,18 +2391,6 @@ UINT StMakeOpenVpnConfigFile(ADMIN *a, RPC_READ_LOG_FILE *t)
"$CA$", x_buf->Buf, false);
}
- if (dummy_x_buf != NULL)
- {
- ReplaceStrEx((char *)config_l3_buf->Buf, config_l3_buf->Size, (char *)config_l3_buf->Buf,
- "$CERT$", dummy_x_buf->Buf, false);
- }
-
- if (dummy_k_buf != NULL)
- {
- ReplaceStrEx((char *)config_l3_buf->Buf, config_l3_buf->Size, (char *)config_l3_buf->Buf,
- "$KEY$", dummy_k_buf->Buf, false);
- }
-
Format(name_tmp, sizeof(name_tmp), "%sopenvpn_remote_access_l3.ovpn", my_hostname);
ZipAddFileSimple(p, name_tmp, LocalTime64(), 0, config_l3_buf->Buf, StrLen(config_l3_buf->Buf));
@@ -1322,18 +2411,6 @@ UINT StMakeOpenVpnConfigFile(ADMIN *a, RPC_READ_LOG_FILE *t)
"$CA$", x_buf->Buf, false);
}
- if (dummy_x_buf != NULL)
- {
- ReplaceStrEx((char *)config_l2_buf->Buf, config_l2_buf->Size, (char *)config_l2_buf->Buf,
- "$CERT$", dummy_x_buf->Buf, false);
- }
-
- if (dummy_k_buf != NULL)
- {
- ReplaceStrEx((char *)config_l2_buf->Buf, config_l2_buf->Size, (char *)config_l2_buf->Buf,
- "$KEY$", dummy_k_buf->Buf, false);
- }
-
Format(name_tmp, sizeof(name_tmp), "%sopenvpn_site_to_site_bridge_l2.ovpn", my_hostname);
ZipAddFileSimple(p, name_tmp, LocalTime64(), 0, config_l2_buf->Buf, StrLen(config_l2_buf->Buf));
@@ -1354,13 +2431,6 @@ UINT StMakeOpenVpnConfigFile(ADMIN *a, RPC_READ_LOG_FILE *t)
FreeBuf(readme_pdf_buf);
FreeBuf(x_buf);
- FreeX(dummy_x);
- FreeK(dummy_private_k);
- FreeK(dummy_public_k);
-
- FreeBuf(dummy_k_buf);
- FreeBuf(dummy_x_buf);
-
Free(zero_buffer);
}
@@ -1954,8 +3024,20 @@ UINT StReadLogFile(ADMIN *a, RPC_READ_LOG_FILE *t)
// Check the permission to read the log file
if (a->LogFileList == NULL)
{
- // Cache not found
- return ERR_OBJECT_NOT_FOUND;
+ // Enum the log files first
+ RPC_ENUM_LOG_FILE elf;
+ UINT elf_ret;
+
+ Zero(&elf, sizeof(elf));
+
+ elf_ret = StEnumLogFile(a, &elf);
+
+ FreeRpcEnumLogFile(&elf);
+
+ if (elf_ret != ERR_NO_ERROR)
+ {
+ return elf_ret;
+ }
}
if (CheckLogFileNameFromEnumList(a->LogFileList, logfilename, servername) == false)
{
@@ -2020,6 +3102,10 @@ UINT StReadLogFile(ADMIN *a, RPC_READ_LOG_FILE *t)
ALog(a, NULL, "LA_READ_LOG_FILE", servername, logfilename);
}
+ StrCpy(t->FilePath, sizeof(t->FilePath), logfilename);
+ StrCpy(t->ServerName, sizeof(t->ServerName), servername);
+ t->Offset = offset;
+
return ERR_NO_ERROR;
}
@@ -2310,7 +3396,7 @@ UINT StSetCrl(ADMIN *a, RPC_CRL *t)
if (crl == NULL)
{
- ret = ERR_INTERNAL_ERROR;
+ ret = ERR_OBJECT_NOT_FOUND;
}
else
{
@@ -2379,7 +3465,7 @@ UINT StGetCrl(ADMIN *a, RPC_CRL *t)
if (crl == NULL)
{
- ret = ERR_INTERNAL_ERROR;
+ ret = ERR_OBJECT_NOT_FOUND;
}
else
{
@@ -2439,7 +3525,7 @@ UINT StDelCrl(ADMIN *a, RPC_CRL *t)
if (crl == NULL)
{
- ret = ERR_INTERNAL_ERROR;
+ ret = ERR_OBJECT_NOT_FOUND;
}
else
{
@@ -3336,6 +4422,7 @@ UINT StGetHubAdminOptions(ADMIN *a, RPC_ADMIN_OPTION *t)
StrCpy(e->Name, sizeof(e->Name), a->Name);
e->Value = a->Value;
+ UniStrCpy(e->Descrption, sizeof(e->Descrption), GetHubAdminOptionHelpString(e->Name));
}
}
UnlockList(h->AdminOptionList);
@@ -3368,6 +4455,7 @@ UINT StGetDefaultHubAdminOptions(ADMIN *a, RPC_ADMIN_OPTION *t)
StrCpy(a->Name, sizeof(a->Name), admin_options[i].Name);
a->Value = admin_options[i].Value;
+ UniStrCpy(a->Descrption, sizeof(a->Descrption), GetHubAdminOptionHelpString(a->Name));
}
return ERR_NO_ERROR;
@@ -3872,6 +4960,7 @@ UINT SiEnumIpTable(SERVER *s, char *hubname, RPC_ENUM_IP_TABLE *t)
StrCpy(e->SessionName, sizeof(e->SessionName), table->Session->Name);
e->Ip = IPToUINT(&table->Ip);
Copy(&e->IpV6, &table->Ip, sizeof(IP));
+ Copy(&e->IpAddress, &table->Ip, sizeof(IP));
e->DhcpAllocated = table->DhcpAllocated;
e->CreatedTime = TickToTime(table->CreatedTime);
e->UpdatedTime = TickToTime(table->UpdatedTime);
@@ -4323,6 +5412,8 @@ UINT StGetSessionStatus(ADMIN *a, RPC_SESSION_STATUS *t)
Copy(&t->ClientIp6, &s->Connection->ClientIp.ipv6_addr, sizeof(t->ClientIp6));
}
+ CopyIP(&t->ClientIpAddress, &s->Connection->ClientIp);
+
StrCpy(t->ClientHostName, sizeof(t->ClientHostName), s->Connection->ClientHostname);
}
}
@@ -5485,30 +6576,33 @@ UINT StSetAccessList(ADMIN *a, RPC_ENUM_ACCESS_LIST *t)
UINT i;
// Confirm whether the access list of form which cannot handle by the old client already exists
- if (a->ClientBuild < 6560)
+ if (a->ClientBuild != 0)
{
- for (i = 0;i < LIST_NUM(h->AccessList);i++)
+ if (a->ClientBuild < 6560)
{
- ACCESS *access = LIST_DATA(h->AccessList, i);
- if (access->IsIPv6 ||
- access->Jitter != 0 || access->Loss != 0 || access->Delay != 0)
+ for (i = 0;i < LIST_NUM(h->AccessList);i++)
{
- ret = ERR_VERSION_INVALID;
- break;
+ ACCESS *access = LIST_DATA(h->AccessList, i);
+ if (access->IsIPv6 ||
+ access->Jitter != 0 || access->Loss != 0 || access->Delay != 0)
+ {
+ ret = ERR_VERSION_INVALID;
+ break;
+ }
}
}
- }
- if (a->ClientBuild < 8234)
- {
- for (i = 0;i < LIST_NUM(h->AccessList);i++)
+ if (a->ClientBuild < 8234)
{
- ACCESS *access = LIST_DATA(h->AccessList, i);
-
- if (IsEmptyStr(access->RedirectUrl) == false)
+ for (i = 0;i < LIST_NUM(h->AccessList);i++)
{
- ret = ERR_VERSION_INVALID;
- break;
+ ACCESS *access = LIST_DATA(h->AccessList, i);
+
+ if (IsEmptyStr(access->RedirectUrl) == false)
+ {
+ ret = ERR_VERSION_INVALID;
+ break;
+ }
}
}
}
@@ -6612,6 +7706,7 @@ UINT StGetCa(ADMIN *a, RPC_HUB_GET_CA *t)
FreeRpcHubGetCa(t);
Zero(t, sizeof(RPC_HUB_GET_CA));
+ t->Key = key;
StrCpy(t->HubName, sizeof(t->HubName), hubname);
CHECK_RIGHT;
@@ -7207,6 +8302,7 @@ UINT StGetSecureNATStatus(ADMIN *a, RPC_NAT_STATUS *t)
ReleaseHub(h);
+ StrCpy(t->HubName, sizeof(t->HubName), hubname);
ret = ERR_NO_ERROR;
return ret;
@@ -7446,8 +8542,8 @@ UINT StGetSecureNATOption(ADMIN *a, VH_OPTION *t)
}
Zero(t, sizeof(VH_OPTION));
- StrCpy(t->HubName, sizeof(t->HubName), hubname);
Copy(t, h->SecureNATOption, sizeof(VH_OPTION));
+ StrCpy(t->HubName, sizeof(t->HubName), hubname);
t->ApplyDhcpPushRoutes = true;
ReleaseHub(h);
@@ -8058,6 +9154,13 @@ UINT StSetHub(ADMIN *a, RPC_CREATE_HUB *t)
return ERR_NOT_SUPPORTED;
}
+ // For JSON-RPC
+ if (StrLen(t->AdminPasswordPlainText) != 0)
+ {
+ Hash(t->HashedPassword, t->AdminPasswordPlainText, StrLen(t->AdminPasswordPlainText), true);
+ HashPassword(t->SecurePassword, ADMINISTRATOR_USERNAME, t->AdminPasswordPlainText);
+ }
+
if (IsZero(t->HashedPassword, sizeof(t->HashedPassword)) == false &&
IsZero(t->SecurePassword, sizeof(t->SecurePassword)) == false)
{
@@ -8228,6 +9331,15 @@ UINT StCreateHub(ADMIN *a, RPC_CREATE_HUB *t)
ALog(a, NULL, "LA_CREATE_HUB", t->HubName);
+ // For JSON-RPC
+ if ((IsZero(t->HashedPassword, sizeof(t->HashedPassword)) &&
+ IsZero(t->SecurePassword, sizeof(t->SecurePassword))) ||
+ StrLen(t->AdminPasswordPlainText) != 0)
+ {
+ Hash(t->HashedPassword, t->AdminPasswordPlainText, StrLen(t->AdminPasswordPlainText), true);
+ HashPassword(t->SecurePassword, ADMINISTRATOR_USERNAME, t->AdminPasswordPlainText);
+ }
+
h = NewHub(c, t->HubName, &o);
Copy(h->HashedPassword, t->HashedPassword, SHA1_SIZE);
Copy(h->SecurePassword, t->SecurePassword, SHA1_SIZE);
@@ -8636,6 +9748,15 @@ UINT StSetFarmSetting(ADMIN *a, RPC_FARM *t)
return ERR_NOT_SUPPORTED;
}
+ if (IsZero(t->MemberPassword, sizeof(t->MemberPassword)))
+ {
+ if (IsEmptyStr(t->MemberPasswordPlaintext) == false)
+ {
+ // For JSON-RPC
+ HashAdminPassword(t->MemberPassword, t->MemberPasswordPlaintext);
+ }
+ }
+
ALog(a, NULL, "LA_SET_FARM_SETTING");
IncrementServerConfigRevision(a->Server);
@@ -8652,6 +9773,12 @@ UINT StSetServerPassword(ADMIN *a, RPC_SET_PASSWORD *t)
SERVER_ADMIN_ONLY;
+ if (IsZero(t->HashedPassword, sizeof(t->HashedPassword)))
+ {
+ // For JSON-RPC
+ HashAdminPassword(t->HashedPassword, t->PlainTextPassword);
+ }
+
Copy(a->Server->HashedPassword, t->HashedPassword, SHA1_SIZE);
ALog(a, NULL, "LA_SET_SERVER_PASSWORD");
@@ -9016,6 +10143,8 @@ void InDDnsClientStatus(DDNS_CLIENT_STATUS *t, PACK *p)
PackGetStr(p, "DnsSuffix", t->DnsSuffix, sizeof(t->DnsSuffix));
PackGetStr(p, "CurrentIPv4", t->CurrentIPv4, sizeof(t->CurrentIPv4));
PackGetStr(p, "CurrentIPv6", t->CurrentIPv6, sizeof(t->CurrentIPv6));
+ PackGetUniStr(p, "ErrStr_IPv4", t->ErrStr_IPv4, sizeof(t->ErrStr_IPv4));
+ PackGetUniStr(p, "ErrStr_IPv6", t->ErrStr_IPv6, sizeof(t->ErrStr_IPv6));
}
void OutDDnsClientStatus(PACK *p, DDNS_CLIENT_STATUS *t)
{
@@ -9032,6 +10161,8 @@ void OutDDnsClientStatus(PACK *p, DDNS_CLIENT_STATUS *t)
PackAddStr(p, "DnsSuffix", t->DnsSuffix);
PackAddStr(p, "CurrentIPv4", t->CurrentIPv4);
PackAddStr(p, "CurrentIPv6", t->CurrentIPv6);
+ PackAddUniStr(p, "ErrStr_IPv4", t->ErrStr_IPv4);
+ PackAddUniStr(p, "ErrStr_IPv6", t->ErrStr_IPv6);
}
// INTERNET_SETTING
@@ -9183,6 +10314,7 @@ void OutRpcEnumEtherIpId(PACK *p, RPC_ENUM_ETHERIP_ID *t)
PackAddInt(p, "NumItem", t->NumItem);
+ PackSetCurrentJsonGroupName(p, "Settings");
for (i = 0;i < t->NumItem;i++)
{
ETHERIP_ID *e = &t->IdList[i];
@@ -9192,6 +10324,7 @@ void OutRpcEnumEtherIpId(PACK *p, RPC_ENUM_ETHERIP_ID *t)
PackAddStrEx(p, "UserName", e->UserName, i, t->NumItem);
PackAddStrEx(p, "Password", e->Password, i, t->NumItem);
}
+ PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumEtherIpId(RPC_ENUM_ETHERIP_ID *t)
{
@@ -9362,6 +10495,7 @@ void OutRpcEnumEthVLan(PACK *p, RPC_ENUM_ETH_VLAN *t)
return;
}
+ PackSetCurrentJsonGroupName(p, "Devices");
for (i = 0;i < t->NumItem;i++)
{
RPC_ENUM_ETH_VLAN_ITEM *e = &t->Items[i];
@@ -9374,6 +10508,7 @@ void OutRpcEnumEthVLan(PACK *p, RPC_ENUM_ETH_VLAN *t)
PackAddBoolEx(p, "Support", e->Support, i, t->NumItem);
PackAddBoolEx(p, "Enabled", e->Enabled, i, t->NumItem);
}
+ PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumEthVLan(RPC_ENUM_ETH_VLAN *t)
{
@@ -9421,6 +10556,7 @@ void OutRpcEnumLogFile(PACK *p, RPC_ENUM_LOG_FILE *t)
PackAddInt(p, "NumItem", t->NumItem);
+ PackSetCurrentJsonGroupName(p, "LogFiles");
for (i = 0;i < t->NumItem;i++)
{
RPC_ENUM_LOG_FILE_ITEM *e = &t->Items[i];
@@ -9428,8 +10564,9 @@ void OutRpcEnumLogFile(PACK *p, RPC_ENUM_LOG_FILE *t)
PackAddStrEx(p, "FilePath", e->FilePath, i, t->NumItem);
PackAddStrEx(p, "ServerName", e->ServerName, i, t->NumItem);
PackAddIntEx(p, "FileSize", e->FileSize, i, t->NumItem);
- PackAddInt64Ex(p, "UpdatedTime", e->UpdatedTime, i, t->NumItem);
+ PackAddTime64Ex(p, "UpdatedTime", e->UpdatedTime, i, t->NumItem);
}
+ PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumLogFile(RPC_ENUM_LOG_FILE *t)
{
@@ -9564,12 +10701,13 @@ void InRpcAcList(RPC_AC_LIST *t, PACK *p)
o = NewAcList();
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
- num = PackGetInt(p, "NumItem");
+ num = PackGetIndexCount(p, "IpAddress");
for (i = 0;i < num;i++)
{
AC *ac = ZeroMalloc(sizeof(AC));
+ ac->Id = PackGetIntEx(p, "Id", i);
ac->Deny = PackGetBoolEx(p, "Deny", i);
PackGetIpEx(p, "IpAddress", &ac->IpAddress, i);
ac->Masked = PackGetBoolEx(p, "Masked", i);
@@ -9605,10 +10743,12 @@ void OutRpcAcList(PACK *p, RPC_AC_LIST *t)
PackAddStr(p, "HubName", t->HubName);
+ PackSetCurrentJsonGroupName(p, "ACList");
for (i = 0;i < num;i++)
{
AC *ac = LIST_DATA(o, i);
+ PackAddIntEx(p, "Id", ac->Id, i, num);
PackAddBoolEx(p, "Deny", ac->Deny, i, num);
PackAddIpEx(p, "IpAddress", &ac->IpAddress, i, num);
PackAddBoolEx(p, "Masked", ac->Masked, i, num);
@@ -9617,6 +10757,7 @@ void OutRpcAcList(PACK *p, RPC_AC_LIST *t)
PackAddIntEx(p, "Priority", ac->Priority, i, num);
}
+ PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcAcList(RPC_AC_LIST *t)
{
@@ -9687,6 +10828,7 @@ void OutRpcEnumCrl(PACK *p, RPC_ENUM_CRL *t)
PackAddStr(p, "HubName", t->HubName);
PackAddInt(p, "NumItem", t->NumItem);
+ PackSetCurrentJsonGroupName(p, "CRLList");
for (i = 0;i < t->NumItem;i++)
{
RPC_ENUM_CRL_ITEM *e = &t->Items[i];
@@ -9694,6 +10836,7 @@ void OutRpcEnumCrl(PACK *p, RPC_ENUM_CRL *t)
PackAddIntEx(p, "Key", e->Key, i, t->NumItem);
PackAddUniStrEx(p, "CrlInfo", e->CrlInfo, i, t->NumItem);
}
+ PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumCrl(RPC_ENUM_CRL *t)
{
@@ -9866,6 +11009,7 @@ void OutRpcEnumL3Table(PACK *p, RPC_ENUM_L3TABLE *t)
PackAddInt(p, "NumItem", t->NumItem);
PackAddStr(p, "Name", t->Name);
+ PackSetCurrentJsonGroupName(p, "L3Table");
for (i = 0;i < t->NumItem;i++)
{
RPC_L3TABLE *e = &t->Items[i];
@@ -9875,6 +11019,7 @@ void OutRpcEnumL3Table(PACK *p, RPC_ENUM_L3TABLE *t)
PackAddIp32Ex(p, "GatewayAddress", e->GatewayAddress, i, t->NumItem);
PackAddIntEx(p, "Metric", e->Metric, i, t->NumItem);
}
+ PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumL3Table(RPC_ENUM_L3TABLE *t)
{
@@ -9948,6 +11093,7 @@ void OutRpcEnumL3If(PACK *p, RPC_ENUM_L3IF *t)
PackAddInt(p, "NumItem", t->NumItem);
PackAddStr(p, "Name", t->Name);
+ PackSetCurrentJsonGroupName(p, "L3IFList");
for (i = 0;i < t->NumItem;i++)
{
RPC_L3IF *f = &t->Items[i];
@@ -9956,6 +11102,7 @@ void OutRpcEnumL3If(PACK *p, RPC_ENUM_L3IF *t)
PackAddIp32Ex(p, "IpAddress", f->IpAddress, i, t->NumItem);
PackAddIp32Ex(p, "SubnetMask", f->SubnetMask, i, t->NumItem);
}
+ PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumL3If(RPC_ENUM_L3IF *t)
{
@@ -10056,6 +11203,7 @@ void OutRpcEnumL3Sw(PACK *p, RPC_ENUM_L3SW *t)
PackAddInt(p, "NumItem", t->NumItem);
+ PackSetCurrentJsonGroupName(p, "L3SWList");
for (i = 0;i < t->NumItem;i++)
{
RPC_ENUM_L3SW_ITEM *s = &t->Items[i];
@@ -10066,6 +11214,7 @@ void OutRpcEnumL3Sw(PACK *p, RPC_ENUM_L3SW *t)
PackAddBoolEx(p, "Active", s->Active, i, t->NumItem);
PackAddBoolEx(p, "Online", s->Online, i, t->NumItem);
}
+ PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumL3Sw(RPC_ENUM_L3SW *t)
{
@@ -10110,12 +11259,14 @@ void OutRpcEnumEth(PACK *p, RPC_ENUM_ETH *t)
PackAddInt(p, "NumItem", t->NumItem);
+ PackSetCurrentJsonGroupName(p, "EthList");
for (i = 0;i < t->NumItem;i++)
{
RPC_ENUM_ETH_ITEM *e = &t->Items[i];
PackAddStrEx(p, "DeviceName", e->DeviceName, i, t->NumItem);
PackAddUniStrEx(p, "NetworkConnectionName", e->NetworkConnectionName, i, t->NumItem);
}
+ PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumEth(RPC_ENUM_ETH *t)
{
@@ -10191,6 +11342,7 @@ void OutRpcEnumLocalBridge(PACK *p, RPC_ENUM_LOCALBRIDGE *t)
PackAddInt(p, "NumItem", t->NumItem);
+ PackSetCurrentJsonGroupName(p, "LocalBridgeList");
for (i = 0;i < t->NumItem;i++)
{
RPC_LOCALBRIDGE *e = &t->Items[i];
@@ -10201,6 +11353,7 @@ void OutRpcEnumLocalBridge(PACK *p, RPC_ENUM_LOCALBRIDGE *t)
PackAddBoolEx(p, "Active", e->Active, i, t->NumItem);
PackAddBoolEx(p, "TapMode", e->TapMode, i, t->NumItem);
}
+ PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumLocalBridge(RPC_ENUM_LOCALBRIDGE *t)
{
@@ -10430,8 +11583,11 @@ void SiEnumLocalSession(SERVER *s, char *hubname, RPC_ENUM_SESSION *t)
StrCpy(e->Name, sizeof(e->Name), s->Name);
StrCpy(e->Username, sizeof(e->Username), s->Username);
e->Ip = IPToUINT(&s->Connection->ClientIp);
+ CopyIP(&e->ClientIP, &s->Connection->ClientIp);
StrCpy(e->Hostname, sizeof(e->Hostname), s->Connection->ClientHostname);
e->MaxNumTcp = s->MaxConnection;
+ e->CreatedTime = Tick64ToTime64(s->CreatedTime);
+ e->LastCommTime = Tick64ToTime64(s->LastCommTime);
e->LinkMode = s->LinkModeServer;
e->SecureNATMode = s->SecureNATMode;
e->BridgeMode = s->BridgeMode;
@@ -10527,6 +11683,8 @@ void OutRpcEnumLicenseKey(PACK *p, RPC_ENUM_LICENSE_KEY *t)
}
PackAddInt(p, "NumItem", t->NumItem);
+
+ PackSetCurrentJsonGroupName(p, "LicenseKeyList");
for (i = 0;i < t->NumItem;i++)
{
RPC_ENUM_LICENSE_KEY_ITEM *e = &t->Items[i];
@@ -10535,12 +11693,13 @@ void OutRpcEnumLicenseKey(PACK *p, RPC_ENUM_LICENSE_KEY *t)
PackAddStrEx(p, "LicenseKey", e->LicenseKey, i, t->NumItem);
PackAddStrEx(p, "LicenseId", e->LicenseId, i, t->NumItem);
PackAddStrEx(p, "LicenseName", e->LicenseName, i, t->NumItem);
- PackAddInt64Ex(p, "Expires", e->Expires, i, t->NumItem);
+ PackAddTime64Ex(p, "Expires", e->Expires, i, t->NumItem);
PackAddIntEx(p, "Status", e->Status, i, t->NumItem);
PackAddIntEx(p, "ProductId", e->ProductId, i, t->NumItem);
PackAddInt64Ex(p, "SystemId", e->SystemId, i, t->NumItem);
PackAddIntEx(p, "SerialId", e->SerialId, i, t->NumItem);
}
+ PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumLicenseKey(RPC_ENUM_LICENSE_KEY *t)
{
@@ -10590,17 +11749,17 @@ void OutRpcLicenseStatus(PACK *p, RPC_LICENSE_STATUS *t)
PackAddInt(p, "EditionId", t->EditionId);
PackAddStr(p, "EditionStr", t->EditionStr);
PackAddInt64(p, "SystemId", t->SystemId);
- PackAddInt64(p, "SystemExpires", t->SystemExpires);
+ PackAddTime64(p, "SystemExpires", t->SystemExpires);
PackAddInt(p, "NumClientConnectLicense", t->NumClientConnectLicense);
PackAddInt(p, "NumBridgeConnectLicense", t->NumBridgeConnectLicense);
// v3.0
PackAddBool(p, "NeedSubscription", t->NeedSubscription);
PackAddBool(p, "AllowEnterpriseFunction", t->AllowEnterpriseFunction);
- PackAddInt64(p, "SubscriptionExpires", t->SubscriptionExpires);
+ PackAddTime64(p, "SubscriptionExpires", t->SubscriptionExpires);
PackAddBool(p, "IsSubscriptionExpired", t->IsSubscriptionExpired);
PackAddInt(p, "NumUserCreationLicense", t->NumUserCreationLicense);
- PackAddInt64(p, "ReleaseDate", t->ReleaseDate);
+ PackAddTime64(p, "ReleaseDate", t->ReleaseDate);
}
// RPC_ADMIN_OPTION
@@ -10614,7 +11773,7 @@ void InRpcAdminOption(RPC_ADMIN_OPTION *t, PACK *p)
}
Zero(t, sizeof(RPC_ADMIN_OPTION));
- t->NumItem = PackGetInt(p, "NumItem");
+ t->NumItem = PackGetIndexCount(p, "Name");
t->Items = ZeroMalloc(sizeof(ADMIN_OPTION) * t->NumItem);
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
@@ -10625,6 +11784,7 @@ void InRpcAdminOption(RPC_ADMIN_OPTION *t, PACK *p)
PackGetStrEx(p, "Name", o->Name, sizeof(o->Name), i);
o->Value = PackGetIntEx(p, "Value", i);
+ PackGetUniStrEx(p, "Descrption", o->Descrption, sizeof(o->Descrption), i);
}
}
void OutRpcAdminOption(PACK *p, RPC_ADMIN_OPTION *t)
@@ -10640,13 +11800,16 @@ void OutRpcAdminOption(PACK *p, RPC_ADMIN_OPTION *t)
PackAddStr(p, "HubName", t->HubName);
+ PackSetCurrentJsonGroupName(p, "AdminOptionList");
for (i = 0;i < t->NumItem;i++)
{
ADMIN_OPTION *o = &t->Items[i];
PackAddStrEx(p, "Name", o->Name, i, t->NumItem);
PackAddIntEx(p, "Value", o->Value, i, t->NumItem);
+ PackAddUniStrEx(p, "Descrption", o->Descrption, i, t->NumItem);
}
+ PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcAdminOption(RPC_ADMIN_OPTION *t)
{
@@ -10813,7 +11976,7 @@ void OutRpcServerInfo(PACK *p, RPC_SERVER_INFO *t)
PackAddInt(p, "ServerBuildInt", t->ServerBuildInt);
PackAddStr(p, "ServerHostName", t->ServerHostName);
PackAddInt(p, "ServerType", t->ServerType);
- PackAddInt64(p, "ServerBuildDate", t->ServerBuildDate);
+ PackAddTime64(p, "ServerBuildDate", t->ServerBuildDate);
PackAddStr(p, "ServerFamilyName", t->ServerFamilyName);
OutRpcOsInfo(p, &t->OsInfo);
}
@@ -10888,13 +12051,13 @@ void OutRpcServerStatus(PACK *p, RPC_SERVER_STATUS *t)
PackAddInt(p, "NumIpTables", t->NumIpTables);
PackAddInt(p, "NumUsers", t->NumUsers);
PackAddInt(p, "NumGroups", t->NumGroups);
- PackAddInt64(p, "CurrentTime", t->CurrentTime);
+ PackAddTime64(p, "CurrentTime", t->CurrentTime);
PackAddInt64(p, "CurrentTick", t->CurrentTick);
PackAddInt(p, "AssignedBridgeLicenses", t->AssignedBridgeLicenses);
PackAddInt(p, "AssignedClientLicenses", t->AssignedClientLicenses);
PackAddInt(p, "AssignedBridgeLicensesTotal", t->AssignedBridgeLicensesTotal);
PackAddInt(p, "AssignedClientLicensesTotal", t->AssignedClientLicensesTotal);
- PackAddInt64(p, "StartTime", t->StartTime);
+ PackAddTime64(p, "StartTime", t->StartTime);
OutRpcTraffic(p, &t->Traffic);
@@ -10957,12 +12120,14 @@ void OutRpcListenerList(PACK *p, RPC_LISTENER_LIST *t)
return;
}
+ PackSetCurrentJsonGroupName(p, "ListenerList");
for (i = 0;i < t->NumPort;i++)
{
PackAddIntEx(p, "Ports", t->Ports[i], i, t->NumPort);
PackAddBoolEx(p, "Enables", t->Enables[i], i, t->NumPort);
PackAddBoolEx(p, "Errors", t->Errors[i], i, t->NumPort);
}
+ PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcListenerList(RPC_LISTENER_LIST *t)
{
@@ -11031,6 +12196,7 @@ void InRpcSetPassword(RPC_SET_PASSWORD *t, PACK *p)
Zero(t, sizeof(RPC_SET_PASSWORD));
PackGetData2(p, "HashedPassword", t->HashedPassword, sizeof(t->HashedPassword));
+ PackGetStr(p, "PlainTextPassword", t->PlainTextPassword, sizeof(t->PlainTextPassword));
}
void OutRpcSetPassword(PACK *p, RPC_SET_PASSWORD *t)
{
@@ -11041,6 +12207,7 @@ void OutRpcSetPassword(PACK *p, RPC_SET_PASSWORD *t)
}
PackAddData(p, "HashedPassword", t->HashedPassword, sizeof(t->HashedPassword));
+ PackAddStr(p, "PlainTextPassword", t->PlainTextPassword);
}
// RPC_FARM
@@ -11065,6 +12232,7 @@ void InRpcFarm(RPC_FARM *t, PACK *p)
PackGetStr(p, "ControllerName", t->ControllerName, sizeof(t->ControllerName));
t->ControllerPort = PackGetInt(p, "ControllerPort");
PackGetData2(p, "MemberPassword", t->MemberPassword, sizeof(t->MemberPassword));
+ PackGetStr(p, "MemberPasswordPlaintext", t->MemberPasswordPlaintext, sizeof(t->MemberPasswordPlaintext));
t->Weight = PackGetInt(p, "Weight");
t->ControllerOnly = PackGetBool(p, "ControllerOnly");
}
@@ -11086,6 +12254,7 @@ void OutRpcFarm(PACK *p, RPC_FARM *t)
PackAddStr(p, "ControllerName", t->ControllerName);
PackAddInt(p, "ControllerPort", t->ControllerPort);
PackAddData(p, "MemberPassword", t->MemberPassword, sizeof(t->MemberPassword));
+ PackAddStr(p, "MemberPasswordPlaintext", t->MemberPasswordPlaintext);
PackAddInt(p, "Weight", t->Weight);
PackAddBool(p, "ControllerOnly", t->ControllerOnly);
}
@@ -11171,7 +12340,7 @@ void OutRpcFarmInfo(PACK *p, RPC_FARM_INFO *t)
PackAddInt(p, "Id", t->Id);
PackAddBool(p, "Controller", t->Controller);
- PackAddInt64(p, "ConnectedTime", t->ConnectedTime);
+ PackAddTime64(p, "ConnectedTime", t->ConnectedTime);
PackAddIp32(p, "Ip", t->Ip);
PackAddStr(p, "Hostname", t->Hostname);
PackAddInt(p, "Point", t->Point);
@@ -11180,11 +12349,15 @@ void OutRpcFarmInfo(PACK *p, RPC_FARM_INFO *t)
PackAddIntEx(p, "Ports", t->Ports[i], i, t->NumPort);
}
PackAddX(p, "ServerCert", t->ServerCert);
+
+ PackSetCurrentJsonGroupName(p, "HubsList");
for (i = 0;i < t->NumFarmHub;i++)
{
PackAddStrEx(p, "HubName", t->FarmHubs[i].HubName, i, t->NumFarmHub);
PackAddBoolEx(p, "DynamicHub", t->FarmHubs[i].DynamicHub, i, t->NumFarmHub);
}
+ PackSetCurrentJsonGroupName(p, NULL);
+
PackAddInt(p, "NumSessions", t->NumSessions);
PackAddInt(p, "NumTcpConnections", t->NumTcpConnections);
PackAddInt(p, "Weight", t->Weight);
@@ -11241,13 +12414,14 @@ void OutRpcEnumFarm(PACK *p, RPC_ENUM_FARM *t)
return;
}
+ PackSetCurrentJsonGroupName(p, "FarmMemberList");
for (i = 0;i < t->NumFarm;i++)
{
RPC_ENUM_FARM_ITEM *e = &t->Farms[i];
PackAddIntEx(p, "Id", e->Id, i, t->NumFarm);
PackAddBoolEx(p, "Controller", e->Controller, i, t->NumFarm);
- PackAddInt64Ex(p, "ConnectedTime", e->ConnectedTime, i, t->NumFarm);
+ PackAddTime64Ex(p, "ConnectedTime", e->ConnectedTime, i, t->NumFarm);
PackAddIp32Ex(p, "Ip", e->Ip, i, t->NumFarm);
PackAddStrEx(p, "Hostname", e->Hostname, i, t->NumFarm);
PackAddIntEx(p, "Point", e->Point, i, t->NumFarm);
@@ -11257,6 +12431,7 @@ void OutRpcEnumFarm(PACK *p, RPC_ENUM_FARM *t)
PackAddIntEx(p, "AssignedClientLicense", e->AssignedClientLicense, i, t->NumFarm);
PackAddIntEx(p, "AssignedBridgeLicense", e->AssignedBridgeLicense, i, t->NumFarm);
}
+ PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumFarm(RPC_ENUM_FARM *t)
{
@@ -11302,9 +12477,9 @@ void OutRpcFarmConnectionStatus(PACK *p, RPC_FARM_CONNECTION_STATUS *t)
PackAddInt(p, "Port", t->Port);
PackAddBool(p, "Online", t->Online);
PackAddInt(p, "LastError", t->LastError);
- PackAddInt64(p, "StartedTime", t->StartedTime);
- PackAddInt64(p, "CurrentConnectedTime", t->CurrentConnectedTime);
- PackAddInt64(p, "FirstConnectedTime", t->FirstConnectedTime);
+ PackAddTime64(p, "StartedTime", t->StartedTime);
+ PackAddTime64(p, "CurrentConnectedTime", t->CurrentConnectedTime);
+ PackAddTime64(p, "FirstConnectedTime", t->FirstConnectedTime);
PackAddInt(p, "NumConnected", t->NumConnected);
PackAddInt(p, "NumTry", t->NumTry);
PackAddInt(p, "NumFailed", t->NumFailed);
@@ -11402,6 +12577,7 @@ void InRpcCreateHub(RPC_CREATE_HUB *t, PACK *p)
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
PackGetData2(p, "HashedPassword", t->HashedPassword, sizeof(t->HashedPassword));
PackGetData2(p, "SecurePassword", t->SecurePassword, sizeof(t->SecurePassword));
+ PackGetStr(p, "AdminPasswordPlainText", t->AdminPasswordPlainText, sizeof(t->AdminPasswordPlainText));
t->Online = PackGetBool(p, "Online");
InRpcHubOption(&t->HubOption, p);
t->HubType = PackGetInt(p, "HubType");
@@ -11418,6 +12594,7 @@ void OutRpcCreateHub(PACK *p, RPC_CREATE_HUB *t)
PackAddData(p, "HashedPassword", t->HashedPassword, sizeof(t->HashedPassword));
PackAddData(p, "SecurePassword", t->SecurePassword, sizeof(t->SecurePassword));
PackAddBool(p, "Online", t->Online);
+ PackAddStr(p, "AdminPasswordPlainText", t->AdminPasswordPlainText);
OutRpcHubOption(p, &t->HubOption);
PackAddInt(p, "HubType", t->HubType);
}
@@ -11466,6 +12643,7 @@ void OutRpcEnumHub(PACK *p, RPC_ENUM_HUB *t)
return;
}
+ PackSetCurrentJsonGroupName(p, "HubList");
for (i = 0;i < t->NumHub;i++)
{
RPC_ENUM_HUB_ITEM *e = &t->Hubs[i];
@@ -11478,14 +12656,15 @@ void OutRpcEnumHub(PACK *p, RPC_ENUM_HUB *t)
PackAddIntEx(p, "NumGroups", e->NumGroups, i, t->NumHub);
PackAddIntEx(p, "NumMacTables", e->NumMacTables, i, t->NumHub);
PackAddIntEx(p, "NumIpTables", e->NumIpTables, i, t->NumHub);
- PackAddInt64Ex(p, "LastCommTime", e->LastCommTime, i, t->NumHub);
- PackAddInt64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumHub);
- PackAddInt64Ex(p, "LastLoginTime", e->LastLoginTime, i, t->NumHub);
+ PackAddTime64Ex(p, "LastCommTime", e->LastCommTime, i, t->NumHub);
+ PackAddTime64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumHub);
+ PackAddTime64Ex(p, "LastLoginTime", e->LastLoginTime, i, t->NumHub);
PackAddIntEx(p, "NumLogin", e->NumLogin, i, t->NumHub);
PackAddBoolEx(p, "IsTrafficFilled", e->IsTrafficFilled, i, t->NumHub);
OutRpcTrafficEx(&e->Traffic, p, i, t->NumHub);
}
+ PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumHub(RPC_ENUM_HUB *t)
{
@@ -11556,6 +12735,7 @@ void OutRpcEnumConnection(PACK *p, RPC_ENUM_CONNECTION *t)
return;
}
+ PackSetCurrentJsonGroupName(p, "ConnectionList");
for (i = 0;i < t->NumConnection;i++)
{
RPC_ENUM_CONNECTION_ITEM *e = &t->Connections[i];
@@ -11564,9 +12744,10 @@ void OutRpcEnumConnection(PACK *p, RPC_ENUM_CONNECTION *t)
PackAddIntEx(p, "Port", e->Port, i, t->NumConnection);
PackAddStrEx(p, "Name", e->Name, i, t->NumConnection);
PackAddStrEx(p, "Hostname", e->Hostname, i, t->NumConnection);
- PackAddInt64Ex(p, "ConnectedTime", e->ConnectedTime, i, t->NumConnection);
+ PackAddTime64Ex(p, "ConnectedTime", e->ConnectedTime, i, t->NumConnection);
PackAddIntEx(p, "Type", e->Type, i, t->NumConnection);
}
+ PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumConnetion(RPC_ENUM_CONNECTION *t)
{
@@ -11636,7 +12817,7 @@ void OutRpcConnectionInfo(PACK *p, RPC_CONNECTION_INFO *t)
PackAddStr(p, "Name", t->Name);
PackAddIp32(p, "Ip", t->Ip);
PackAddInt(p, "Port", t->Port);
- PackAddInt64(p, "ConnectedTime", t->ConnectedTime);
+ PackAddTime64(p, "ConnectedTime", t->ConnectedTime);
PackAddStr(p, "Hostname", t->Hostname);
PackAddStr(p, "ServerStr", t->ServerStr);
PackAddStr(p, "ClientStr", t->ClientStr);
@@ -11721,9 +12902,9 @@ void OutRpcHubStatus(PACK *p, RPC_HUB_STATUS *t)
PackAddInt(p, "NumIpTables", t->NumIpTables);
PackAddBool(p, "SecureNATEnabled", t->SecureNATEnabled);
OutRpcTraffic(p, &t->Traffic);
- PackAddInt64(p, "LastCommTime", t->LastCommTime);
- PackAddInt64(p, "CreatedTime", t->CreatedTime);
- PackAddInt64(p, "LastLoginTime", t->LastLoginTime);
+ PackAddTime64(p, "LastCommTime", t->LastCommTime);
+ PackAddTime64(p, "CreatedTime", t->CreatedTime);
+ PackAddTime64(p, "LastLoginTime", t->LastLoginTime);
PackAddInt(p, "NumLogin", t->NumLogin);
}
@@ -11838,6 +13019,7 @@ void OutRpcHubEnumCa(PACK *p, RPC_HUB_ENUM_CA *t)
}
PackAddStr(p, "HubName", t->HubName);
+ PackSetCurrentJsonGroupName(p, "CAList");
for (i = 0;i < t->NumCa;i++)
{
RPC_HUB_ENUM_CA_ITEM *e = &t->Ca[i];
@@ -11845,8 +13027,9 @@ void OutRpcHubEnumCa(PACK *p, RPC_HUB_ENUM_CA *t)
PackAddIntEx(p, "Key", e->Key, i, t->NumCa);
PackAddUniStrEx(p, "SubjectName", e->SubjectName, i, t->NumCa);
PackAddUniStrEx(p, "IssuerName", e->IssuerName, i, t->NumCa);
- PackAddInt64Ex(p, "Expires", e->Expires, i, t->NumCa);
+ PackAddTime64Ex(p, "Expires", e->Expires, i, t->NumCa);
}
+ PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcHubEnumCa(RPC_HUB_ENUM_CA *t)
{
@@ -12013,6 +13196,7 @@ void InRpcEnumLink(RPC_ENUM_LINK *t, PACK *p)
e->ConnectedTime = PackGetInt64Ex(p, "ConnectedTime", i);
e->Connected = PackGetBoolEx(p, "Connected", i);
e->LastError = PackGetIntEx(p, "LastError", i);
+ PackGetStrEx(p, "LinkHubName", e->HubName, sizeof(e->HubName), i);
}
}
void OutRpcEnumLink(PACK *p, RPC_ENUM_LINK *t)
@@ -12026,6 +13210,7 @@ void OutRpcEnumLink(PACK *p, RPC_ENUM_LINK *t)
PackAddStr(p, "HubName", t->HubName);
+ PackSetCurrentJsonGroupName(p, "LinkList");
for (i = 0;i < t->NumLink;i++)
{
RPC_ENUM_LINK_ITEM *e = &t->Links[i];
@@ -12034,10 +13219,12 @@ void OutRpcEnumLink(PACK *p, RPC_ENUM_LINK *t)
PackAddStrEx(p, "ConnectedHubName", e->HubName, i, t->NumLink);
PackAddStrEx(p, "Hostname", e->Hostname, i, t->NumLink);
PackAddBoolEx(p, "Online", e->Online, i, t->NumLink);
- PackAddInt64Ex(p, "ConnectedTime", e->ConnectedTime, i, t->NumLink);
+ PackAddTime64Ex(p, "ConnectedTime", e->ConnectedTime, i, t->NumLink);
PackAddBoolEx(p, "Connected", e->Connected, i, t->NumLink);
PackAddIntEx(p, "LastError", e->LastError, i, t->NumLink);
+ PackAddStrEx(p, "TargetHubName", e->HubName, i, t->NumLink);
}
+ PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumLink(RPC_ENUM_LINK *t)
{
@@ -12311,12 +13498,14 @@ void OutRpcEnumAccessList(PACK *p, RPC_ENUM_ACCESS_LIST *a)
}
PackAddStr(p, "HubName", a->HubName);
+ PackSetCurrentJsonGroupName(p, "AccessList");
for (i = 0;i < a->NumAccess;i++)
{
ACCESS *e = &a->Accesses[i];
OutRpcAccessEx(p, e, i, a->NumAccess);
}
+ PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumAccessList(RPC_ENUM_ACCESS_LIST *a)
{
@@ -12330,7 +13519,7 @@ void FreeRpcEnumAccessList(RPC_ENUM_ACCESS_LIST *a)
}
// AUTHDATA
-void *InRpcAuthData(PACK *p, UINT *authtype)
+void *InRpcAuthData(PACK *p, UINT *authtype, char *username)
{
wchar_t tmp[MAX_SIZE];
AUTHPASSWORD *pw;
@@ -12339,6 +13528,7 @@ void *InRpcAuthData(PACK *p, UINT *authtype)
AUTHRADIUS *radius;
AUTHNT *nt;
BUF *b;
+ char plain_pw[MAX_SIZE];
// Validate arguments
if (p == NULL)
{
@@ -12357,6 +13547,16 @@ void *InRpcAuthData(PACK *p, UINT *authtype)
pw = ZeroMalloc(sizeof(AUTHPASSWORD));
PackGetData2(p, "HashedKey", pw->HashedKey, sizeof(pw->HashedKey));
PackGetData2(p, "NtLmSecureHash", pw->NtLmSecureHash, sizeof(pw->NtLmSecureHash));
+
+ if (PackGetStr(p, "Auth_Password", plain_pw, sizeof(plain_pw)))
+ {
+ if (IsZero(pw->HashedKey, sizeof(pw->HashedKey)))
+ {
+ HashPassword(pw->HashedKey, username, plain_pw);
+ GenerateNtPasswordHash(pw->NtLmSecureHash, plain_pw);
+ }
+ }
+
return pw;
case AUTHTYPE_USERCERT:
@@ -12474,7 +13674,7 @@ void InRpcSetUser(RPC_SET_USER *t, PACK *p)
t->CreatedTime = PackGetInt64(p, "CreatedTime");
t->UpdatedTime = PackGetInt64(p, "UpdatedTime");
t->ExpireTime = PackGetInt64(p, "ExpireTime");
- t->AuthData = InRpcAuthData(p, &t->AuthType);
+ t->AuthData = InRpcAuthData(p, &t->AuthType, t->Name);
t->NumLogin = PackGetInt(p, "NumLogin");
InRpcTraffic(&t->Traffic, p);
@@ -12498,9 +13698,9 @@ void OutRpcSetUser(PACK *p, RPC_SET_USER *t)
PackAddStr(p, "GroupName", t->GroupName);
PackAddUniStr(p, "Realname", t->Realname);
PackAddUniStr(p, "Note", t->Note);
- PackAddInt64(p, "CreatedTime", t->CreatedTime);
- PackAddInt64(p, "UpdatedTime", t->UpdatedTime);
- PackAddInt64(p, "ExpireTime", t->ExpireTime);
+ PackAddTime64(p, "CreatedTime", t->CreatedTime);
+ PackAddTime64(p, "UpdatedTime", t->UpdatedTime);
+ PackAddTime64(p, "ExpireTime", t->ExpireTime);
OutRpcAuthData(p, t->AuthData, t->AuthType);
PackAddInt(p, "NumLogin", t->NumLogin);
OutRpcTraffic(p, &t->Traffic);
@@ -12571,6 +13771,7 @@ void OutRpcEnumUser(PACK *p, RPC_ENUM_USER *t)
}
PackAddStr(p, "HubName", t->HubName);
+ PackSetCurrentJsonGroupName(p, "UserList");
for (i = 0;i < t->NumUser;i++)
{
RPC_ENUM_USER_ITEM *e = &t->Users[i];
@@ -12580,7 +13781,7 @@ void OutRpcEnumUser(PACK *p, RPC_ENUM_USER *t)
PackAddUniStrEx(p, "Realname", e->Realname, i, t->NumUser);
PackAddUniStrEx(p, "Note", e->Note, i, t->NumUser);
PackAddIntEx(p, "AuthType", e->AuthType, i, t->NumUser);
- PackAddInt64Ex(p, "LastLoginTime", e->LastLoginTime, i, t->NumUser);
+ PackAddTime64Ex(p, "LastLoginTime", e->LastLoginTime, i, t->NumUser);
PackAddIntEx(p, "NumLogin", e->NumLogin, i, t->NumUser);
PackAddBoolEx(p, "DenyAccess", e->DenyAccess, i, t->NumUser);
@@ -12588,8 +13789,9 @@ void OutRpcEnumUser(PACK *p, RPC_ENUM_USER *t)
OutRpcTrafficEx(&e->Traffic, p, i, t->NumUser);
PackAddBoolEx(p, "IsExpiresFilled", e->IsExpiresFilled, i, t->NumUser);
- PackAddInt64Ex(p, "Expires", e->Expires, i, t->NumUser);
+ PackAddTime64Ex(p, "Expires", e->Expires, i, t->NumUser);
}
+ PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumUser(RPC_ENUM_USER *t)
{
@@ -12686,6 +13888,7 @@ void OutRpcEnumGroup(PACK *p, RPC_ENUM_GROUP *t)
PackAddStr(p, "HubName", t->HubName);
+ PackSetCurrentJsonGroupName(p, "GroupList");
for (i = 0;i < t->NumGroup;i++)
{
RPC_ENUM_GROUP_ITEM *e = &t->Groups[i];
@@ -12696,6 +13899,7 @@ void OutRpcEnumGroup(PACK *p, RPC_ENUM_GROUP *t)
PackAddIntEx(p, "NumUsers", e->NumUsers, i, t->NumGroup);
PackAddBoolEx(p, "DenyAccess", e->DenyAccess, i, t->NumGroup);
}
+ PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumGroup(RPC_ENUM_GROUP *t)
{
@@ -12755,6 +13959,7 @@ void InRpcEnumSession(RPC_ENUM_SESSION *t, PACK *p)
PackGetStrEx(p, "Name", e->Name, sizeof(e->Name), i);
PackGetStrEx(p, "Username", e->Username, sizeof(e->Username), i);
e->Ip = PackGetIntEx(p, "Ip", i);
+ PackGetIpEx(p, "ClientIP", &e->ClientIP, i);
PackGetStrEx(p, "Hostname", e->Hostname, sizeof(e->Hostname), i);
e->MaxNumTcp = PackGetIntEx(p, "MaxNumTcp", i);
e->CurrentNumTcp = PackGetIntEx(p, "CurrentNumTcp", i);
@@ -12773,6 +13978,8 @@ void InRpcEnumSession(RPC_ENUM_SESSION *t, PACK *p)
e->IsDormantEnabled = PackGetBoolEx(p, "IsDormantEnabled", i);
e->IsDormant = PackGetBoolEx(p, "IsDormant", i);
e->LastCommDormant = PackGetInt64Ex(p, "LastCommDormant", i);
+ e->CreatedTime = PackGetInt64Ex(p, "CreatedTime", i);
+ e->LastCommTime = PackGetInt64Ex(p, "LastCommTime", i);
}
}
void OutRpcEnumSession(PACK *p, RPC_ENUM_SESSION *t)
@@ -12785,6 +13992,7 @@ void OutRpcEnumSession(PACK *p, RPC_ENUM_SESSION *t)
}
PackAddStr(p, "HubName", t->HubName);
+ PackSetCurrentJsonGroupName(p, "SessionList");
for (i = 0;i < t->NumSession;i++)
{
RPC_ENUM_SESSION_ITEM *e = &t->Sessions[i];
@@ -12792,6 +14000,7 @@ void OutRpcEnumSession(PACK *p, RPC_ENUM_SESSION *t)
PackAddStrEx(p, "Name", e->Name, i, t->NumSession);
PackAddStrEx(p, "Username", e->Username, i, t->NumSession);
PackAddIp32Ex(p, "Ip", e->Ip, i, t->NumSession);
+ PackAddIpEx(p, "ClientIP", &e->ClientIP, i, t->NumSession);
PackAddStrEx(p, "Hostname", e->Hostname, i, t->NumSession);
PackAddIntEx(p, "MaxNumTcp", e->MaxNumTcp, i, t->NumSession);
PackAddIntEx(p, "CurrentNumTcp", e->CurrentNumTcp, i, t->NumSession);
@@ -12809,8 +14018,11 @@ void OutRpcEnumSession(PACK *p, RPC_ENUM_SESSION *t)
PackAddDataEx(p, "UniqueId", e->UniqueId, sizeof(e->UniqueId), i, t->NumSession);
PackAddBoolEx(p, "IsDormantEnabled", e->IsDormantEnabled, i, t->NumSession);
PackAddBoolEx(p, "IsDormant", e->IsDormant, i, t->NumSession);
- PackAddInt64Ex(p, "LastCommDormant", e->LastCommDormant, i, t->NumSession);
+ PackAddTime64Ex(p, "LastCommDormant", e->LastCommDormant, i, t->NumSession);
+ PackAddTime64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumSession);
+ PackAddTime64Ex(p, "LastCommTime", e->LastCommTime, i, t->NumSession);
}
+ PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumSession(RPC_ENUM_SESSION *t)
{
@@ -12941,6 +14153,7 @@ void InRpcSessionStatus(RPC_SESSION_STATUS *t, PACK *p)
t->ClientIp = PackGetIp32(p, "SessionStatus_ClientIp");
PackGetData2(p, "SessionStatus_ClientIp6", t->ClientIp6, sizeof(t->ClientIp6));
PackGetStr(p, "SessionStatus_ClientHostName", t->ClientHostName, sizeof(t->ClientHostName));
+ PackGetIp(p, "Client_Ip_Address", &t->ClientIpAddress);
InRpcClientGetConnectionStatus(&t->Status, p);
InRpcNodeInfo(&t->NodeInfo, p);
@@ -12961,6 +14174,7 @@ void OutRpcSessionStatus(PACK *p, RPC_SESSION_STATUS *t)
PackAddIp32(p, "SessionStatus_ClientIp", t->ClientIp);
PackAddData(p, "SessionStatus_ClientIp6", t->ClientIp6, sizeof(t->ClientIp6));
PackAddStr(p, "SessionStatus_ClientHostName", t->ClientHostName);
+ PackAddIp(p, "Client_Ip_Address", &t->ClientIpAddress);
OutRpcClientGetConnectionStatus(p, &t->Status);
OutRpcNodeInfo(p, &t->NodeInfo);
@@ -13041,6 +14255,7 @@ void OutRpcEnumMacTable(PACK *p, RPC_ENUM_MAC_TABLE *t)
PackAddStr(p, "HubName", t->HubName);
+ PackSetCurrentJsonGroupName(p, "MacTable");
for (i = 0;i < t->NumMacTable;i++)
{
RPC_ENUM_MAC_TABLE_ITEM *e = &t->MacTables[i];
@@ -13049,11 +14264,12 @@ void OutRpcEnumMacTable(PACK *p, RPC_ENUM_MAC_TABLE *t)
PackAddStrEx(p, "SessionName", e->SessionName, i, t->NumMacTable);
PackAddDataEx(p, "MacAddress", e->MacAddress, sizeof(e->MacAddress), i, t->NumMacTable);
PackAddIntEx(p, "VlanId", e->VlanId, i, t->NumMacTable);
- PackAddInt64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumMacTable);
- PackAddInt64Ex(p, "UpdatedTime", e->UpdatedTime, i, t->NumMacTable);
+ PackAddTime64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumMacTable);
+ PackAddTime64Ex(p, "UpdatedTime", e->UpdatedTime, i, t->NumMacTable);
PackAddBoolEx(p, "RemoteItem", e->RemoteItem, i, t->NumMacTable);
PackAddStrEx(p, "RemoteHostname", e->RemoteHostname, i, t->NumMacTable);
}
+ PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumMacTable(RPC_ENUM_MAC_TABLE *t)
{
@@ -13092,6 +14308,7 @@ void InRpcEnumIpTable(RPC_ENUM_IP_TABLE *t, PACK *p)
{
UINTToIP(&e->IpV6, e->Ip);
}
+ PackGetIp(p, "IpAddress", &e->IpAddress);
e->DhcpAllocated = PackGetBoolEx(p, "DhcpAllocated", i);
e->CreatedTime = PackGetInt64Ex(p, "CreatedTime", i);
e->UpdatedTime = PackGetInt64Ex(p, "UpdatedTime", i);
@@ -13110,6 +14327,7 @@ void OutRpcEnumIpTable(PACK *p, RPC_ENUM_IP_TABLE *t)
PackAddStr(p, "HubName", t->HubName);
+ PackSetCurrentJsonGroupName(p, "IpTable");
for (i = 0;i < t->NumIpTable;i++)
{
RPC_ENUM_IP_TABLE_ITEM *e = &t->IpTables[i];
@@ -13118,12 +14336,14 @@ void OutRpcEnumIpTable(PACK *p, RPC_ENUM_IP_TABLE *t)
PackAddStrEx(p, "SessionName", e->SessionName, i, t->NumIpTable);
PackAddIp32Ex(p, "Ip", e->Ip, i, t->NumIpTable);
PackAddIpEx(p, "IpV6", &e->IpV6, i, t->NumIpTable);
+ PackAddIpEx(p, "IpAddress", &e->IpAddress, i, t->NumIpTable);
PackAddBoolEx(p, "DhcpAllocated", e->DhcpAllocated, i, t->NumIpTable);
- PackAddInt64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumIpTable);
- PackAddInt64Ex(p, "UpdatedTime", e->UpdatedTime, i, t->NumIpTable);
+ PackAddTime64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumIpTable);
+ PackAddTime64Ex(p, "UpdatedTime", e->UpdatedTime, i, t->NumIpTable);
PackAddBoolEx(p, "RemoteItem", e->RemoteItem, i, t->NumIpTable);
PackAddStrEx(p, "RemoteHostname", e->RemoteHostname, i, t->NumIpTable);
}
+ PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumIpTable(RPC_ENUM_IP_TABLE *t)
{
diff --git a/src/Cedar/Admin.h b/src/Cedar/Admin.h
index ca260270..59a9f2cf 100644
--- a/src/Cedar/Admin.h
+++ b/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);
diff --git a/src/Cedar/CM.c b/src/Cedar/CM.c
index a42bb48f..97bd28e4 100644
--- a/src/Cedar/CM.c
+++ b/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")));
diff --git a/src/Cedar/Cedar.h b/src/Cedar/Cedar.h
index f99e9350..d746c4bb 100644
--- a/src/Cedar/Cedar.h
+++ b/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
diff --git a/src/Cedar/CedarType.h b/src/Cedar/CedarType.h
index 13ea74e5..040790f0 100644
--- a/src/Cedar/CedarType.h
+++ b/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;
// ==============================================================
diff --git a/src/Cedar/Client.c b/src/Cedar/Client.c
index 30bc6e4a..d3234ed4 100644
--- a/src/Cedar/Client.c
+++ b/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
diff --git a/src/Cedar/Client.h b/src/Cedar/Client.h
index f57e32e8..6790a91a 100644
--- a/src/Cedar/Client.h
+++ b/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
diff --git a/src/Cedar/Command.c b/src/Cedar/Command.c
index 71568d43..5b2c67e8 100644
--- a/src/Cedar/Command.c
+++ b/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;
}
diff --git a/src/Cedar/Connection.c b/src/Cedar/Connection.c
index ebd8a6cb..5bdb0a34 100644
--- a/src/Cedar/Connection.c
+++ b/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;
diff --git a/src/Cedar/Connection.h b/src/Cedar/Connection.h
index 96b7627f..2b1f8091 100644
--- a/src/Cedar/Connection.h
+++ b/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
};
diff --git a/src/Cedar/DDNS.c b/src/Cedar/DDNS.c
index c9056dd7..66373dd4 100644
--- a/src/Cedar/DDNS.c
+++ b/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
diff --git a/src/Cedar/DDNS.h b/src/Cedar/DDNS.h
index 3c935d27..d3e1363d 100644
--- a/src/Cedar/DDNS.h
+++ b/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
diff --git a/src/Cedar/EtherLog.c b/src/Cedar/EtherLog.c
index 36bf0932..ea290915 100644
--- a/src/Cedar/EtherLog.c
+++ b/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
diff --git a/src/Cedar/Hub.c b/src/Cedar/Hub.c
index 7dc3de39..da339c2a 100644
--- a/src/Cedar/Hub.c
+++ b/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);
diff --git a/src/Cedar/Hub.h b/src/Cedar/Hub.h
index 5334dbfd..884c5c3e 100644
--- a/src/Cedar/Hub.h
+++ b/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
diff --git a/src/Cedar/IPsec_EtherIP.c b/src/Cedar/IPsec_EtherIP.c
index 7c7d6222..1db912c1 100644
--- a/src/Cedar/IPsec_EtherIP.c
+++ b/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)
{
diff --git a/src/Cedar/IPsec_IPC.c b/src/Cedar/IPsec_IPC.c
index 705a9539..82831784 100644
--- a/src/Cedar/IPsec_IPC.c
+++ b/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);
}
diff --git a/src/Cedar/IPsec_IPC.h b/src/Cedar/IPsec_IPC.h
index 4a733297..2340788e 100644
--- a/src/Cedar/IPsec_IPC.h
+++ b/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);
diff --git a/src/Cedar/IPsec_PPP.c b/src/Cedar/IPsec_PPP.c
index d47a5f08..5d04f099 100644
--- a/src/Cedar/IPsec_PPP.c
+++ b/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)
{
diff --git a/src/Cedar/Interop_OpenVPN.c b/src/Cedar/Interop_OpenVPN.c
index 4c6d8771..dbb203e9 100644
--- a/src/Cedar/Interop_OpenVPN.c
+++ b/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);
}
diff --git a/src/Cedar/Interop_OpenVPN.h b/src/Cedar/Interop_OpenVPN.h
index 8db9beca..b23eca5e 100644
--- a/src/Cedar/Interop_OpenVPN.h
+++ b/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
diff --git a/src/Cedar/Listener.c b/src/Cedar/Listener.c
index 5da5ade6..f57dcf2a 100644
--- a/src/Cedar/Listener.c
+++ b/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
diff --git a/src/Cedar/Nat.c b/src/Cedar/Nat.c
index c5f782b8..c5e35af8 100644
--- a/src/Cedar/Nat.c
+++ b/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)
{
diff --git a/src/Cedar/Protocol.c b/src/Cedar/Protocol.c
index 7febcf84..5fd8c12c 100644
--- a/src/Cedar/Protocol.c
+++ b/src/Cedar/Protocol.c
@@ -106,6 +106,726 @@
static UCHAR ssl_packet_start[3] = {0x17, 0x03, 0x00};
+// MIME list from https://www.freeformatter.com/mime-types-list.html
+static HTTP_MIME_TYPE http_mime_types[] =
+{
+ {".x3d", "application/vnd.hzn-3d-crossword"},
+ {".3gp", "video/3gpp"},
+ {".3g2", "video/3gpp2"},
+ {".mseq", "application/vnd.mseq"},
+ {".pwn", "application/vnd.3m.post-it-notes"},
+ {".plb", "application/vnd.3gpp.pic-bw-large"},
+ {".psb", "application/vnd.3gpp.pic-bw-small"},
+ {".pvb", "application/vnd.3gpp.pic-bw-var"},
+ {".tcap", "application/vnd.3gpp2.tcap"},
+ {".7z", "application/x-7z-compressed"},
+ {".abw", "application/x-abiword"},
+ {".ace", "application/x-ace-compressed"},
+ {".acc", "application/vnd.americandynamics.acc"},
+ {".acu", "application/vnd.acucobol"},
+ {".atc", "application/vnd.acucorp"},
+ {".adp", "audio/adpcm"},
+ {".aab", "application/x-authorware-bin"},
+ {".aam", "application/x-authorware-map"},
+ {".aas", "application/x-authorware-seg"},
+ {".air", "application/vnd.adobe.air-application-installer-package+zip"},
+ {".swf", "application/x-shockwave-flash"},
+ {".fxp", "application/vnd.adobe.fxp"},
+ {".pdf", "application/pdf"},
+ {".ppd", "application/vnd.cups-ppd"},
+ {".dir", "application/x-director"},
+ {".xdp", "application/vnd.adobe.xdp+xml"},
+ {".xfdf", "application/vnd.adobe.xfdf"},
+ {".aac", "audio/x-aac"},
+ {".ahead", "application/vnd.ahead.space"},
+ {".azf", "application/vnd.airzip.filesecure.azf"},
+ {".azs", "application/vnd.airzip.filesecure.azs"},
+ {".azw", "application/vnd.amazon.ebook"},
+ {".ami", "application/vnd.amiga.ami"},
+ {".apk", "application/vnd.android.package-archive"},
+ {".cii", "application/vnd.anser-web-certificate-issue-initiation"},
+ {".fti", "application/vnd.anser-web-funds-transfer-initiation"},
+ {".atx", "application/vnd.antix.game-component"},
+ {".dmg", "application/x-apple-diskimage"},
+ {".mpkg", "application/vnd.apple.installer+xml"},
+ {".aw", "application/applixware"},
+ {".les", "application/vnd.hhe.lesson-player"},
+ {".swi", "application/vnd.aristanetworks.swi"},
+ {".s", "text/x-asm"},
+ {".atomcat", "application/atomcat+xml"},
+ {".atomsvc", "application/atomsvc+xml"},
+ {".atom", "application/atom+xml"},
+ {".ac", "application/pkix-attr-cert"},
+ {".aif", "audio/x-aiff"},
+ {".avi", "video/x-msvideo"},
+ {".aep", "application/vnd.audiograph"},
+ {".dxf", "image/vnd.dxf"},
+ {".dwf", "model/vnd.dwf"},
+ {".par", "text/plain-bas"},
+ {".bcpio", "application/x-bcpio"},
+ {".bin", "application/octet-stream"},
+ {".bmp", "image/bmp"},
+ {".torrent", "application/x-bittorrent"},
+ {".cod", "application/vnd.rim.cod"},
+ {".mpm", "application/vnd.blueice.multipass"},
+ {".bmi", "application/vnd.bmi"},
+ {".sh", "application/x-sh"},
+ {".btif", "image/prs.btif"},
+ {".rep", "application/vnd.businessobjects"},
+ {".bz", "application/x-bzip"},
+ {".bz2", "application/x-bzip2"},
+ {".csh", "application/x-csh"},
+ {".c", "text/x-c"},
+ {".cdxml", "application/vnd.chemdraw+xml"},
+ {".css", "text/css"},
+ {".cdx", "chemical/x-cdx"},
+ {".cml", "chemical/x-cml"},
+ {".csml", "chemical/x-csml"},
+ {".cdbcmsg", "application/vnd.contact.cmsg"},
+ {".cla", "application/vnd.claymore"},
+ {".c4g", "application/vnd.clonk.c4group"},
+ {".sub", "image/vnd.dvb.subtitle"},
+ {".cdmia", "application/cdmi-capability"},
+ {".cdmic", "application/cdmi-container"},
+ {".cdmid", "application/cdmi-domain"},
+ {".cdmio", "application/cdmi-object"},
+ {".cdmiq", "application/cdmi-queue"},
+ {".c11amc", "application/vnd.cluetrust.cartomobile-config"},
+ {".c11amz", "application/vnd.cluetrust.cartomobile-config-pkg"},
+ {".ras", "image/x-cmu-raster"},
+ {".dae", "model/vnd.collada+xml"},
+ {".csv", "text/csv"},
+ {".cpt", "application/mac-compactpro"},
+ {".wmlc", "application/vnd.wap.wmlc"},
+ {".cgm", "image/cgm"},
+ {".ice", "x-conference/x-cooltalk"},
+ {".cmx", "image/x-cmx"},
+ {".xar", "application/vnd.xara"},
+ {".cmc", "application/vnd.cosmocaller"},
+ {".cpio", "application/x-cpio"},
+ {".clkx", "application/vnd.crick.clicker"},
+ {".clkk", "application/vnd.crick.clicker.keyboard"},
+ {".clkp", "application/vnd.crick.clicker.palette"},
+ {".clkt", "application/vnd.crick.clicker.template"},
+ {".clkw", "application/vnd.crick.clicker.wordbank"},
+ {".wbs", "application/vnd.criticaltools.wbs+xml"},
+ {".cryptonote", "application/vnd.rig.cryptonote"},
+ {".cif", "chemical/x-cif"},
+ {".cmdf", "chemical/x-cmdf"},
+ {".cu", "application/cu-seeme"},
+ {".cww", "application/prs.cww"},
+ {".curl", "text/vnd.curl"},
+ {".dcurl", "text/vnd.curl.dcurl"},
+ {".mcurl", "text/vnd.curl.mcurl"},
+ {".scurl", "text/vnd.curl.scurl"},
+ {".car", "application/vnd.curl.car"},
+ {".pcurl", "application/vnd.curl.pcurl"},
+ {".cmp", "application/vnd.yellowriver-custom-menu"},
+ {".dssc", "application/dssc+der"},
+ {".xdssc", "application/dssc+xml"},
+ {".deb", "application/x-debian-package"},
+ {".uva", "audio/vnd.dece.audio"},
+ {".uvi", "image/vnd.dece.graphic"},
+ {".uvh", "video/vnd.dece.hd"},
+ {".uvm", "video/vnd.dece.mobile"},
+ {".uvu", "video/vnd.uvvu.mp4"},
+ {".uvp", "video/vnd.dece.pd"},
+ {".uvs", "video/vnd.dece.sd"},
+ {".uvv", "video/vnd.dece.video"},
+ {".dvi", "application/x-dvi"},
+ {".seed", "application/vnd.fdsn.seed"},
+ {".dtb", "application/x-dtbook+xml"},
+ {".res", "application/x-dtbresource+xml"},
+ {".ait", "application/vnd.dvb.ait"},
+ {".svc", "application/vnd.dvb.service"},
+ {".eol", "audio/vnd.digital-winds"},
+ {".djvu", "image/vnd.djvu"},
+ {".dtd", "application/xml-dtd"},
+ {".mlp", "application/vnd.dolby.mlp"},
+ {".wad", "application/x-doom"},
+ {".dpg", "application/vnd.dpgraph"},
+ {".dra", "audio/vnd.dra"},
+ {".dfac", "application/vnd.dreamfactory"},
+ {".dts", "audio/vnd.dts"},
+ {".dtshd", "audio/vnd.dts.hd"},
+ {".dwg", "image/vnd.dwg"},
+ {".geo", "application/vnd.dynageo"},
+ {".es", "application/ecmascript"},
+ {".mag", "application/vnd.ecowin.chart"},
+ {".mmr", "image/vnd.fujixerox.edmics-mmr"},
+ {".rlc", "image/vnd.fujixerox.edmics-rlc"},
+ {".exi", "application/exi"},
+ {".mgz", "application/vnd.proteus.magazine"},
+ {".epub", "application/epub+zip"},
+ {".eml", "message/rfc822"},
+ {".nml", "application/vnd.enliven"},
+ {".xpr", "application/vnd.is-xpr"},
+ {".xif", "image/vnd.xiff"},
+ {".xfdl", "application/vnd.xfdl"},
+ {".emma", "application/emma+xml"},
+ {".ez2", "application/vnd.ezpix-album"},
+ {".ez3", "application/vnd.ezpix-package"},
+ {".fst", "image/vnd.fst"},
+ {".fvt", "video/vnd.fvt"},
+ {".fbs", "image/vnd.fastbidsheet"},
+ {".fe_launch", "application/vnd.denovo.fcselayout-link"},
+ {".f4v", "video/x-f4v"},
+ {".flv", "video/x-flv"},
+ {".fpx", "image/vnd.fpx"},
+ {".npx", "image/vnd.net-fpx"},
+ {".flx", "text/vnd.fmi.flexstor"},
+ {".fli", "video/x-fli"},
+ {".ftc", "application/vnd.fluxtime.clip"},
+ {".fdf", "application/vnd.fdf"},
+ {".f", "text/x-fortran"},
+ {".mif", "application/vnd.mif"},
+ {".fm", "application/vnd.framemaker"},
+ {".fh", "image/x-freehand"},
+ {".fsc", "application/vnd.fsc.weblaunch"},
+ {".fnc", "application/vnd.frogans.fnc"},
+ {".ltf", "application/vnd.frogans.ltf"},
+ {".ddd", "application/vnd.fujixerox.ddd"},
+ {".xdw", "application/vnd.fujixerox.docuworks"},
+ {".xbd", "application/vnd.fujixerox.docuworks.binder"},
+ {".oas", "application/vnd.fujitsu.oasys"},
+ {".oa2", "application/vnd.fujitsu.oasys2"},
+ {".oa3", "application/vnd.fujitsu.oasys3"},
+ {".fg5", "application/vnd.fujitsu.oasysgp"},
+ {".bh2", "application/vnd.fujitsu.oasysprs"},
+ {".spl", "application/x-futuresplash"},
+ {".fzs", "application/vnd.fuzzysheet"},
+ {".g3", "image/g3fax"},
+ {".gmx", "application/vnd.gmx"},
+ {".gtw", "model/vnd.gtw"},
+ {".txd", "application/vnd.genomatix.tuxedo"},
+ {".ggb", "application/vnd.geogebra.file"},
+ {".ggt", "application/vnd.geogebra.tool"},
+ {".gdl", "model/vnd.gdl"},
+ {".gex", "application/vnd.geometry-explorer"},
+ {".gxt", "application/vnd.geonext"},
+ {".g2w", "application/vnd.geoplan"},
+ {".g3w", "application/vnd.geospace"},
+ {".gsf", "application/x-font-ghostscript"},
+ {".bdf", "application/x-font-bdf"},
+ {".gtar", "application/x-gtar"},
+ {".texinfo", "application/x-texinfo"},
+ {".gnumeric", "application/x-gnumeric"},
+ {".kml", "application/vnd.google-earth.kml+xml"},
+ {".kmz", "application/vnd.google-earth.kmz"},
+ {".gqf", "application/vnd.grafeq"},
+ {".gif", "image/gif"},
+ {".gv", "text/vnd.graphviz"},
+ {".gac", "application/vnd.groove-account"},
+ {".ghf", "application/vnd.groove-help"},
+ {".gim", "application/vnd.groove-identity-message"},
+ {".grv", "application/vnd.groove-injector"},
+ {".gtm", "application/vnd.groove-tool-message"},
+ {".tpl", "application/vnd.groove-tool-template"},
+ {".vcg", "application/vnd.groove-vcard"},
+ {".h261", "video/h261"},
+ {".h263", "video/h263"},
+ {".h264", "video/h264"},
+ {".hpid", "application/vnd.hp-hpid"},
+ {".hps", "application/vnd.hp-hps"},
+ {".hdf", "application/x-hdf"},
+ {".rip", "audio/vnd.rip"},
+ {".hbci", "application/vnd.hbci"},
+ {".jlt", "application/vnd.hp-jlyt"},
+ {".pcl", "application/vnd.hp-pcl"},
+ {".hpgl", "application/vnd.hp-hpgl"},
+ {".hvs", "application/vnd.yamaha.hv-script"},
+ {".hvd", "application/vnd.yamaha.hv-dic"},
+ {".hvp", "application/vnd.yamaha.hv-voice"},
+ {".sfd-hdstx", "application/vnd.hydrostatix.sof-data"},
+ {".stk", "application/hyperstudio"},
+ {".hal", "application/vnd.hal+xml"},
+ {".htm", "text/html; charset=utf-8"},
+ {".html", "text/html; charset=utf-8"},
+ {".irm", "application/vnd.ibm.rights-management"},
+ {".sc", "application/vnd.ibm.secure-container"},
+ {".ics", "text/calendar"},
+ {".icc", "application/vnd.iccprofile"},
+ {".ico", "image/x-icon"},
+ {".igl", "application/vnd.igloader"},
+ {".ief", "image/ief"},
+ {".ivp", "application/vnd.immervision-ivp"},
+ {".ivu", "application/vnd.immervision-ivu"},
+ {".rif", "application/reginfo+xml"},
+ {".3dml", "text/vnd.in3d.3dml"},
+ {".spot", "text/vnd.in3d.spot"},
+ {".igs", "model/iges"},
+ {".i2g", "application/vnd.intergeo"},
+ {".cdy", "application/vnd.cinderella"},
+ {".xpw", "application/vnd.intercon.formnet"},
+ {".fcs", "application/vnd.isac.fcs"},
+ {".ipfix", "application/ipfix"},
+ {".cer", "application/pkix-cert"},
+ {".pki", "application/pkixcmp"},
+ {".crl", "application/pkix-crl"},
+ {".pkipath", "application/pkix-pkipath"},
+ {".igm", "application/vnd.insors.igm"},
+ {".rcprofile", "application/vnd.ipunplugged.rcprofile"},
+ {".irp", "application/vnd.irepository.package+xml"},
+ {".jad", "text/vnd.sun.j2me.app-descriptor"},
+ {".jar", "application/java-archive"},
+ {".class", "application/java-vm"},
+ {".jnlp", "application/x-java-jnlp-file"},
+ {".ser", "application/java-serialized-object"},
+ {".java", "text/x-java-source"},
+ {".js", "application/javascript"},
+ {".json", "application/json"},
+ {".joda", "application/vnd.joost.joda-archive"},
+ {".jpm", "video/jpm"},
+ {".jpg", "image/jpeg"},
+ {".jpeg", "image/jpeg"},
+ {".pjpeg", "image/pjpeg"},
+ {".jpgv", "video/jpeg"},
+ {".ktz", "application/vnd.kahootz"},
+ {".mmd", "application/vnd.chipnuts.karaoke-mmd"},
+ {".karbon", "application/vnd.kde.karbon"},
+ {".chrt", "application/vnd.kde.kchart"},
+ {".kfo", "application/vnd.kde.kformula"},
+ {".flw", "application/vnd.kde.kivio"},
+ {".kon", "application/vnd.kde.kontour"},
+ {".kpr", "application/vnd.kde.kpresenter"},
+ {".ksp", "application/vnd.kde.kspread"},
+ {".kwd", "application/vnd.kde.kword"},
+ {".htke", "application/vnd.kenameaapp"},
+ {".kia", "application/vnd.kidspiration"},
+ {".kne", "application/vnd.kinar"},
+ {".sse", "application/vnd.kodak-descriptor"},
+ {".lasxml", "application/vnd.las.las+xml"},
+ {".latex", "application/x-latex"},
+ {".lbd", "application/vnd.llamagraphics.life-balance.desktop"},
+ {".lbe", "application/vnd.llamagraphics.life-balance.exchange+xml"},
+ {".jam", "application/vnd.jam"},
+ {"0.123", "application/vnd.lotus-1-2-3"},
+ {".apr", "application/vnd.lotus-approach"},
+ {".pre", "application/vnd.lotus-freelance"},
+ {".nsf", "application/vnd.lotus-notes"},
+ {".org", "application/vnd.lotus-organizer"},
+ {".scm", "application/vnd.lotus-screencam"},
+ {".lwp", "application/vnd.lotus-wordpro"},
+ {".lvp", "audio/vnd.lucent.voice"},
+ {".m3u", "audio/x-mpegurl"},
+ {".m4v", "video/x-m4v"},
+ {".hqx", "application/mac-binhex40"},
+ {".portpkg", "application/vnd.macports.portpkg"},
+ {".mgp", "application/vnd.osgeo.mapguide.package"},
+ {".mrc", "application/marc"},
+ {".mrcx", "application/marcxml+xml"},
+ {".mxf", "application/mxf"},
+ {".nbp", "application/vnd.wolfram.player"},
+ {".ma", "application/mathematica"},
+ {".mathml", "application/mathml+xml"},
+ {".mbox", "application/mbox"},
+ {".mc1", "application/vnd.medcalcdata"},
+ {".mscml", "application/mediaservercontrol+xml"},
+ {".cdkey", "application/vnd.mediastation.cdkey"},
+ {".mwf", "application/vnd.mfer"},
+ {".mfm", "application/vnd.mfmp"},
+ {".msh", "model/mesh"},
+ {".mads", "application/mads+xml"},
+ {".mets", "application/mets+xml"},
+ {".mods", "application/mods+xml"},
+ {".meta4", "application/metalink4+xml"},
+ {".mcd", "application/vnd.mcd"},
+ {".flo", "application/vnd.micrografx.flo"},
+ {".igx", "application/vnd.micrografx.igx"},
+ {".es3", "application/vnd.eszigno3+xml"},
+ {".mdb", "application/x-msaccess"},
+ {".asf", "video/x-ms-asf"},
+ {".exe", "application/x-msdownload"},
+ {".cil", "application/vnd.ms-artgalry"},
+ {".cab", "application/vnd.ms-cab-compressed"},
+ {".ims", "application/vnd.ms-ims"},
+ {".application", "application/x-ms-application"},
+ {".clp", "application/x-msclip"},
+ {".mdi", "image/vnd.ms-modi"},
+ {".eot", "application/vnd.ms-fontobject"},
+ {".xls", "application/vnd.ms-excel"},
+ {".xlam", "application/vnd.ms-excel.addin.macroenabled.12"},
+ {".xlsb", "application/vnd.ms-excel.sheet.binary.macroenabled.12"},
+ {".xltm", "application/vnd.ms-excel.template.macroenabled.12"},
+ {".xlsm", "application/vnd.ms-excel.sheet.macroenabled.12"},
+ {".chm", "application/vnd.ms-htmlhelp"},
+ {".crd", "application/x-mscardfile"},
+ {".lrm", "application/vnd.ms-lrm"},
+ {".mvb", "application/x-msmediaview"},
+ {".mny", "application/x-msmoney"},
+ {".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"},
+ {".sldx", "application/vnd.openxmlformats-officedocument.presentationml.slide"},
+ {".ppsx", "application/vnd.openxmlformats-officedocument.presentationml.slideshow"},
+ {".potx", "application/vnd.openxmlformats-officedocument.presentationml.template"},
+ {".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},
+ {".xltx", "application/vnd.openxmlformats-officedocument.spreadsheetml.template"},
+ {".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"},
+ {".dotx", "application/vnd.openxmlformats-officedocument.wordprocessingml.template"},
+ {".obd", "application/x-msbinder"},
+ {".thmx", "application/vnd.ms-officetheme"},
+ {".onetoc", "application/onenote"},
+ {".pya", "audio/vnd.ms-playready.media.pya"},
+ {".pyv", "video/vnd.ms-playready.media.pyv"},
+ {".ppt", "application/vnd.ms-powerpoint"},
+ {".ppam", "application/vnd.ms-powerpoint.addin.macroenabled.12"},
+ {".sldm", "application/vnd.ms-powerpoint.slide.macroenabled.12"},
+ {".pptm", "application/vnd.ms-powerpoint.presentation.macroenabled.12"},
+ {".ppsm", "application/vnd.ms-powerpoint.slideshow.macroenabled.12"},
+ {".potm", "application/vnd.ms-powerpoint.template.macroenabled.12"},
+ {".mpp", "application/vnd.ms-project"},
+ {".pub", "application/x-mspublisher"},
+ {".scd", "application/x-msschedule"},
+ {".xap", "application/x-silverlight-app"},
+ {".stl", "application/vnd.ms-pki.stl"},
+ {".cat", "application/vnd.ms-pki.seccat"},
+ {".vsd", "application/vnd.visio"},
+ {".vsdx", "application/vnd.visio2013"},
+ {".wm", "video/x-ms-wm"},
+ {".wma", "audio/x-ms-wma"},
+ {".wax", "audio/x-ms-wax"},
+ {".wmx", "video/x-ms-wmx"},
+ {".wmd", "application/x-ms-wmd"},
+ {".wpl", "application/vnd.ms-wpl"},
+ {".wmz", "application/x-ms-wmz"},
+ {".wmv", "video/x-ms-wmv"},
+ {".wvx", "video/x-ms-wvx"},
+ {".wmf", "application/x-msmetafile"},
+ {".trm", "application/x-msterminal"},
+ {".doc", "application/msword"},
+ {".docm", "application/vnd.ms-word.document.macroenabled.12"},
+ {".dotm", "application/vnd.ms-word.template.macroenabled.12"},
+ {".wri", "application/x-mswrite"},
+ {".wps", "application/vnd.ms-works"},
+ {".xbap", "application/x-ms-xbap"},
+ {".xps", "application/vnd.ms-xpsdocument"},
+ {".mid", "audio/midi"},
+ {".mpy", "application/vnd.ibm.minipay"},
+ {".afp", "application/vnd.ibm.modcap"},
+ {".rms", "application/vnd.jcp.javame.midlet-rms"},
+ {".tmo", "application/vnd.tmobile-livetv"},
+ {".prc", "application/x-mobipocket-ebook"},
+ {".mbk", "application/vnd.mobius.mbk"},
+ {".dis", "application/vnd.mobius.dis"},
+ {".plc", "application/vnd.mobius.plc"},
+ {".mqy", "application/vnd.mobius.mqy"},
+ {".msl", "application/vnd.mobius.msl"},
+ {".txf", "application/vnd.mobius.txf"},
+ {".daf", "application/vnd.mobius.daf"},
+ {".fly", "text/vnd.fly"},
+ {".mpc", "application/vnd.mophun.certificate"},
+ {".mpn", "application/vnd.mophun.application"},
+ {".mj2", "video/mj2"},
+ {".mpga", "audio/mpeg"},
+ {".mxu", "video/vnd.mpegurl"},
+ {".mpeg", "video/mpeg"},
+ {".m21", "application/mp21"},
+ {".mp4a", "audio/mp4"},
+ {".mp4", "video/mp4"},
+ {".mp4", "application/mp4"},
+ {".m3u8", "application/vnd.apple.mpegurl"},
+ {".mus", "application/vnd.musician"},
+ {".msty", "application/vnd.muvee.style"},
+ {".mxml", "application/xv+xml"},
+ {".ngdat", "application/vnd.nokia.n-gage.data"},
+ {".n-gage", "application/vnd.nokia.n-gage.symbian.install"},
+ {".ncx", "application/x-dtbncx+xml"},
+ {".nc", "application/x-netcdf"},
+ {".nlu", "application/vnd.neurolanguage.nlu"},
+ {".dna", "application/vnd.dna"},
+ {".nnd", "application/vnd.noblenet-directory"},
+ {".nns", "application/vnd.noblenet-sealer"},
+ {".nnw", "application/vnd.noblenet-web"},
+ {".rpst", "application/vnd.nokia.radio-preset"},
+ {".rpss", "application/vnd.nokia.radio-presets"},
+ {".n3", "text/n3"},
+ {".edm", "application/vnd.novadigm.edm"},
+ {".edx", "application/vnd.novadigm.edx"},
+ {".ext", "application/vnd.novadigm.ext"},
+ {".gph", "application/vnd.flographit"},
+ {".ecelp4800", "audio/vnd.nuera.ecelp4800"},
+ {".ecelp7470", "audio/vnd.nuera.ecelp7470"},
+ {".ecelp9600", "audio/vnd.nuera.ecelp9600"},
+ {".oda", "application/oda"},
+ {".ogx", "application/ogg"},
+ {".oga", "audio/ogg"},
+ {".ogv", "video/ogg"},
+ {".dd2", "application/vnd.oma.dd2+xml"},
+ {".oth", "application/vnd.oasis.opendocument.text-web"},
+ {".opf", "application/oebps-package+xml"},
+ {".qbo", "application/vnd.intu.qbo"},
+ {".oxt", "application/vnd.openofficeorg.extension"},
+ {".osf", "application/vnd.yamaha.openscoreformat"},
+ {".weba", "audio/webm"},
+ {".webm", "video/webm"},
+ {".odc", "application/vnd.oasis.opendocument.chart"},
+ {".otc", "application/vnd.oasis.opendocument.chart-template"},
+ {".odb", "application/vnd.oasis.opendocument.database"},
+ {".odf", "application/vnd.oasis.opendocument.formula"},
+ {".odft", "application/vnd.oasis.opendocument.formula-template"},
+ {".odg", "application/vnd.oasis.opendocument.graphics"},
+ {".otg", "application/vnd.oasis.opendocument.graphics-template"},
+ {".odi", "application/vnd.oasis.opendocument.image"},
+ {".oti", "application/vnd.oasis.opendocument.image-template"},
+ {".odp", "application/vnd.oasis.opendocument.presentation"},
+ {".otp", "application/vnd.oasis.opendocument.presentation-template"},
+ {".ods", "application/vnd.oasis.opendocument.spreadsheet"},
+ {".ots", "application/vnd.oasis.opendocument.spreadsheet-template"},
+ {".odt", "application/vnd.oasis.opendocument.text"},
+ {".odm", "application/vnd.oasis.opendocument.text-master"},
+ {".ott", "application/vnd.oasis.opendocument.text-template"},
+ {".ktx", "image/ktx"},
+ {".sxc", "application/vnd.sun.xml.calc"},
+ {".stc", "application/vnd.sun.xml.calc.template"},
+ {".sxd", "application/vnd.sun.xml.draw"},
+ {".std", "application/vnd.sun.xml.draw.template"},
+ {".sxi", "application/vnd.sun.xml.impress"},
+ {".sti", "application/vnd.sun.xml.impress.template"},
+ {".sxm", "application/vnd.sun.xml.math"},
+ {".sxw", "application/vnd.sun.xml.writer"},
+ {".sxg", "application/vnd.sun.xml.writer.global"},
+ {".stw", "application/vnd.sun.xml.writer.template"},
+ {".otf", "application/x-font-otf"},
+ {".osfpvg", "application/vnd.yamaha.openscoreformat.osfpvg+xml"},
+ {".dp", "application/vnd.osgi.dp"},
+ {".pdb", "application/vnd.palm"},
+ {".p", "text/x-pascal"},
+ {".paw", "application/vnd.pawaafile"},
+ {".pclxl", "application/vnd.hp-pclxl"},
+ {".efif", "application/vnd.picsel"},
+ {".pcx", "image/x-pcx"},
+ {".psd", "image/vnd.adobe.photoshop"},
+ {".prf", "application/pics-rules"},
+ {".pic", "image/x-pict"},
+ {".chat", "application/x-chat"},
+ {".p10", "application/pkcs10"},
+ {".p12", "application/x-pkcs12"},
+ {".p7m", "application/pkcs7-mime"},
+ {".p7s", "application/pkcs7-signature"},
+ {".p7r", "application/x-pkcs7-certreqresp"},
+ {".p7b", "application/x-pkcs7-certificates"},
+ {".p8", "application/pkcs8"},
+ {".plf", "application/vnd.pocketlearn"},
+ {".pnm", "image/x-portable-anymap"},
+ {".pbm", "image/x-portable-bitmap"},
+ {".pcf", "application/x-font-pcf"},
+ {".pfr", "application/font-tdpfr"},
+ {".pgn", "application/x-chess-pgn"},
+ {".pgm", "image/x-portable-graymap"},
+ {".png", "image/png"},
+ {".png", "image/x-citrix-png"},
+ {".png", "image/x-png"},
+ {".ppm", "image/x-portable-pixmap"},
+ {".pskcxml", "application/pskc+xml"},
+ {".pml", "application/vnd.ctc-posml"},
+ {".ai", "application/postscript"},
+ {".pfa", "application/x-font-type1"},
+ {".pbd", "application/vnd.powerbuilder6"},
+ {".pgp", "application/pgp-encrypted"},
+ {".pgp", "application/pgp-signature"},
+ {".box", "application/vnd.previewsystems.box"},
+ {".ptid", "application/vnd.pvi.ptid1"},
+ {".pls", "application/pls+xml"},
+ {".str", "application/vnd.pg.format"},
+ {".ei6", "application/vnd.pg.osasli"},
+ {".dsc", "text/prs.lines.tag"},
+ {".psf", "application/x-font-linux-psf"},
+ {".qps", "application/vnd.publishare-delta-tree"},
+ {".wg", "application/vnd.pmi.widget"},
+ {".qxd", "application/vnd.quark.quarkxpress"},
+ {".esf", "application/vnd.epson.esf"},
+ {".msf", "application/vnd.epson.msf"},
+ {".ssf", "application/vnd.epson.ssf"},
+ {".qam", "application/vnd.epson.quickanime"},
+ {".qfx", "application/vnd.intu.qfx"},
+ {".qt", "video/quicktime"},
+ {".rar", "application/x-rar-compressed"},
+ {".ram", "audio/x-pn-realaudio"},
+ {".rmp", "audio/x-pn-realaudio-plugin"},
+ {".rsd", "application/rsd+xml"},
+ {".rm", "application/vnd.rn-realmedia"},
+ {".bed", "application/vnd.realvnc.bed"},
+ {".mxl", "application/vnd.recordare.musicxml"},
+ {".musicxml", "application/vnd.recordare.musicxml+xml"},
+ {".rnc", "application/relax-ng-compact-syntax"},
+ {".rdz", "application/vnd.data-vision.rdz"},
+ {".rdf", "application/rdf+xml"},
+ {".rp9", "application/vnd.cloanto.rp9"},
+ {".jisp", "application/vnd.jisp"},
+ {".rtf", "application/rtf"},
+ {".rtx", "text/richtext"},
+ {".link66", "application/vnd.route66.link66+xml"},
+ {".rss", "application/rss+xml"},
+ {".shf", "application/shf+xml"},
+ {".st", "application/vnd.sailingtracker.track"},
+ {".svg", "image/svg+xml"},
+ {".sus", "application/vnd.sus-calendar"},
+ {".sru", "application/sru+xml"},
+ {".setpay", "application/set-payment-initiation"},
+ {".setreg", "application/set-registration-initiation"},
+ {".sema", "application/vnd.sema"},
+ {".semd", "application/vnd.semd"},
+ {".semf", "application/vnd.semf"},
+ {".see", "application/vnd.seemail"},
+ {".snf", "application/x-font-snf"},
+ {".spq", "application/scvp-vp-request"},
+ {".spp", "application/scvp-vp-response"},
+ {".scq", "application/scvp-cv-request"},
+ {".scs", "application/scvp-cv-response"},
+ {".sdp", "application/sdp"},
+ {".etx", "text/x-setext"},
+ {".movie", "video/x-sgi-movie"},
+ {".ifm", "application/vnd.shana.informed.formdata"},
+ {".itp", "application/vnd.shana.informed.formtemplate"},
+ {".iif", "application/vnd.shana.informed.interchange"},
+ {".ipk", "application/vnd.shana.informed.package"},
+ {".tfi", "application/thraud+xml"},
+ {".shar", "application/x-shar"},
+ {".rgb", "image/x-rgb"},
+ {".slt", "application/vnd.epson.salt"},
+ {".aso", "application/vnd.accpac.simply.aso"},
+ {".imp", "application/vnd.accpac.simply.imp"},
+ {".twd", "application/vnd.simtech-mindmapper"},
+ {".csp", "application/vnd.commonspace"},
+ {".saf", "application/vnd.yamaha.smaf-audio"},
+ {".mmf", "application/vnd.smaf"},
+ {".spf", "application/vnd.yamaha.smaf-phrase"},
+ {".teacher", "application/vnd.smart.teacher"},
+ {".svd", "application/vnd.svd"},
+ {".rq", "application/sparql-query"},
+ {".srx", "application/sparql-results+xml"},
+ {".gram", "application/srgs"},
+ {".grxml", "application/srgs+xml"},
+ {".ssml", "application/ssml+xml"},
+ {".skp", "application/vnd.koan"},
+ {".sgml", "text/sgml"},
+ {".sdc", "application/vnd.stardivision.calc"},
+ {".sda", "application/vnd.stardivision.draw"},
+ {".sdd", "application/vnd.stardivision.impress"},
+ {".smf", "application/vnd.stardivision.math"},
+ {".sdw", "application/vnd.stardivision.writer"},
+ {".sgl", "application/vnd.stardivision.writer-global"},
+ {".sm", "application/vnd.stepmania.stepchart"},
+ {".sit", "application/x-stuffit"},
+ {".sitx", "application/x-stuffitx"},
+ {".sdkm", "application/vnd.solent.sdkm+xml"},
+ {".xo", "application/vnd.olpc-sugar"},
+ {".au", "audio/basic"},
+ {".wqd", "application/vnd.wqd"},
+ {".sis", "application/vnd.symbian.install"},
+ {".smi", "application/smil+xml"},
+ {".xsm", "application/vnd.syncml+xml"},
+ {".bdm", "application/vnd.syncml.dm+wbxml"},
+ {".xdm", "application/vnd.syncml.dm+xml"},
+ {".sv4cpio", "application/x-sv4cpio"},
+ {".sv4crc", "application/x-sv4crc"},
+ {".sbml", "application/sbml+xml"},
+ {".tsv", "text/tab-separated-values"},
+ {".tiff", "image/tiff"},
+ {".tao", "application/vnd.tao.intent-module-archive"},
+ {".tar", "application/x-tar"},
+ {".tcl", "application/x-tcl"},
+ {".tex", "application/x-tex"},
+ {".tfm", "application/x-tex-tfm"},
+ {".tei", "application/tei+xml"},
+ {".txt", "text/plain; charset=utf-8"},
+ {".md", "text/markdown; charset=utf-8"},
+ {".dxp", "application/vnd.spotfire.dxp"},
+ {".sfs", "application/vnd.spotfire.sfs"},
+ {".tsd", "application/timestamped-data"},
+ {".tpt", "application/vnd.trid.tpt"},
+ {".mxs", "application/vnd.triscape.mxs"},
+ {".t", "text/troff"},
+ {".tra", "application/vnd.trueapp"},
+ {".ttf", "application/x-font-ttf"},
+ {".ttl", "text/turtle"},
+ {".umj", "application/vnd.umajin"},
+ {".uoml", "application/vnd.uoml+xml"},
+ {".unityweb", "application/vnd.unity"},
+ {".ufd", "application/vnd.ufdl"},
+ {".uri", "text/uri-list"},
+ {".utz", "application/vnd.uiq.theme"},
+ {".ustar", "application/x-ustar"},
+ {".uu", "text/x-uuencode"},
+ {".vcs", "text/x-vcalendar"},
+ {".vcf", "text/x-vcard"},
+ {".vcd", "application/x-cdlink"},
+ {".vsf", "application/vnd.vsf"},
+ {".wrl", "model/vrml"},
+ {".vcx", "application/vnd.vcx"},
+ {".mts", "model/vnd.mts"},
+ {".vtu", "model/vnd.vtu"},
+ {".vis", "application/vnd.visionary"},
+ {".viv", "video/vnd.vivo"},
+ {".ccxml", "application/ccxml+xml"},
+ {".vxml", "application/voicexml+xml"},
+ {".src", "application/x-wais-source"},
+ {".wbxml", "application/vnd.wap.wbxml"},
+ {".wbmp", "image/vnd.wap.wbmp"},
+ {".wav", "audio/x-wav"},
+ {".davmount", "application/davmount+xml"},
+ {".woff", "application/x-font-woff"},
+ {".wspolicy", "application/wspolicy+xml"},
+ {".webp", "image/webp"},
+ {".wtb", "application/vnd.webturbo"},
+ {".wgt", "application/widget"},
+ {".hlp", "application/winhlp"},
+ {".wml", "text/vnd.wap.wml"},
+ {".wmls", "text/vnd.wap.wmlscript"},
+ {".wmlsc", "application/vnd.wap.wmlscriptc"},
+ {".wpd", "application/vnd.wordperfect"},
+ {".stf", "application/vnd.wt.stf"},
+ {".wsdl", "application/wsdl+xml"},
+ {".xbm", "image/x-xbitmap"},
+ {".xpm", "image/x-xpixmap"},
+ {".xwd", "image/x-xwindowdump"},
+ {".der", "application/x-x509-ca-cert"},
+ {".fig", "application/x-xfig"},
+ {".xhtml", "application/xhtml+xml"},
+ {".xml", "application/xml"},
+ {".xdf", "application/xcap-diff+xml"},
+ {".xenc", "application/xenc+xml"},
+ {".xer", "application/patch-ops-error+xml"},
+ {".rl", "application/resource-lists+xml"},
+ {".rs", "application/rls-services+xml"},
+ {".rld", "application/resource-lists-diff+xml"},
+ {".xslt", "application/xslt+xml"},
+ {".xop", "application/xop+xml"},
+ {".xpi", "application/x-xpinstall"},
+ {".xspf", "application/xspf+xml"},
+ {".xul", "application/vnd.mozilla.xul+xml"},
+ {".xyz", "chemical/x-xyz"},
+ {".yaml", "text/yaml"},
+ {".yang", "application/yang"},
+ {".yin", "application/yin+xml"},
+ {".zir", "application/vnd.zul"},
+ {".zip", "application/zip"},
+ {".zmm", "application/vnd.handheld-entertainment+xml"},
+ {".zaz", "application/vnd.zzazz.deck+xml"},
+};
+
+// Get HTTP MIME type from filename
+char *GetMimeTypeFromFileName(char *filename)
+{
+ UINT i;
+ UINT num = sizeof(http_mime_types) / sizeof(HTTP_MIME_TYPE);
+ if (filename == NULL)
+ {
+ return NULL;
+ }
+
+ for (i = 0;i < num;i++)
+ {
+ HTTP_MIME_TYPE *a = &http_mime_types[i];
+
+ if (EndWith(filename, a->Extension))
+ {
+ return a->MimeType;
+ }
+ }
+
+ return NULL;
+}
+
// Download and save intermediate certificates if necessary
bool DownloadAndSaveIntermediateCertificatesIfNecessary(X *x)
{
@@ -1260,6 +1980,7 @@ bool ServerAccept(CONNECTION *c)
UINT authtype;
POLICY *policy;
UINT assigned_vlan_id = 0;
+ UCHAR assigned_ipc_mac_address[6];
HUB *hub;
SESSION *s = NULL;
UINT64 user_expires = 0;
@@ -1268,12 +1989,17 @@ bool ServerAccept(CONNECTION *c)
bool half_connection;
UINT adjust_mss;
bool use_udp_acceleration_client;
+ UINT client_udp_acceleration_max_version = 1;
+ UINT udp_acceleration_version = 1;
+ UINT client_rudp_bulk_max_version = 1;
+ UINT rudp_bulk_version = 1;
bool support_hmac_on_udp_acceleration_client = false;
bool support_udp_accel_fast_disconnect_detect;
bool use_hmac_on_udp_acceleration = false;
bool supress_return_pack_error = false;
IP udp_acceleration_client_ip;
- UCHAR udp_acceleration_client_key[UDP_ACCELERATION_COMMON_KEY_SIZE];
+ UCHAR udp_acceleration_client_key[UDP_ACCELERATION_COMMON_KEY_SIZE_V1];
+ UCHAR udp_acceleration_client_key_v2[UDP_ACCELERATION_COMMON_KEY_SIZE_V2];
UINT udp_acceleration_client_port;
bool use_fast_rc4;
bool admin_mode = false;
@@ -1329,11 +2055,14 @@ bool ServerAccept(CONNECTION *c)
Zero(ctoken_hash_str, sizeof(ctoken_hash_str));
+ Zero(assigned_ipc_mac_address, sizeof(assigned_ipc_mac_address));
+
Zero(mschap_v2_server_response_20, sizeof(mschap_v2_server_response_20));
Zero(&udp_acceleration_client_ip, sizeof(udp_acceleration_client_ip));
udp_acceleration_client_port = 0;
Zero(udp_acceleration_client_key, sizeof(udp_acceleration_client_key));
+ Zero(udp_acceleration_client_key_v2, sizeof(udp_acceleration_client_key_v2));
Zero(&winver, sizeof(winver));
@@ -1376,6 +2105,11 @@ bool ServerAccept(CONNECTION *c)
error_detail_2 = NULL;
if (ServerDownloadSignature(c, &error_detail_2) == false)
{
+ if (c->Type == CONNECTION_TYPE_ADMIN_RPC)
+ {
+ c->Err = ERR_NO_ERROR;
+ }
+
if (error_detail_2 == NULL)
{
error_detail = "ServerDownloadSignature";
@@ -1639,6 +2373,16 @@ bool ServerAccept(CONNECTION *c)
client_id = PackGetInt(p, "client_id");
adjust_mss = PackGetInt(p, "adjust_mss");
use_udp_acceleration_client = PackGetBool(p, "use_udp_acceleration");
+ client_udp_acceleration_max_version = PackGetInt(p, "udp_acceleration_max_version");
+ if (client_udp_acceleration_max_version == 0)
+ {
+ client_udp_acceleration_max_version = 1;
+ }
+ client_rudp_bulk_max_version = PackGetInt(p, "rudp_bulk_max_version");
+ if (client_rudp_bulk_max_version == 0)
+ {
+ client_rudp_bulk_max_version = 1;
+ }
support_hmac_on_udp_acceleration_client = PackGetBool(p, "support_hmac_on_udp_acceleration");
support_udp_accel_fast_disconnect_detect = PackGetBool(p, "support_udp_accel_fast_disconnect_detect");
support_bulk_on_rudp = PackGetBool(p, "support_bulk_on_rudp");
@@ -1659,6 +2403,7 @@ bool ServerAccept(CONNECTION *c)
PackGetStr(p, "inproc_postfix", c->InProcPrefix, sizeof(c->InProcPrefix));
Zero(tmp, sizeof(tmp));
PackGetStr(p, "inproc_cryptname", tmp, sizeof(tmp));
+ c->InProcLayer = PackGetInt(p, "inproc_layer");
if (c->FirstSock != NULL)
{
@@ -1666,6 +2411,10 @@ bool ServerAccept(CONNECTION *c)
{
Format(c->FirstSock->UnderlayProtocol, sizeof(c->FirstSock->UnderlayProtocol),
SOCK_UNDERLAY_INPROC_EX, c->InProcPrefix);
+
+ AddProtocolDetailsStr(c->FirstSock->UnderlayProtocol,
+ sizeof(c->FirstSock->UnderlayProtocol),
+ c->InProcPrefix);
}
}
@@ -1683,6 +2432,9 @@ bool ServerAccept(CONNECTION *c)
}
use_udp_acceleration_client = false;
+
+ Format(radius_login_opt.In_VpnProtocolState, sizeof(radius_login_opt.In_VpnProtocolState),
+ "L%u:%s", c->InProcLayer, c->InProcPrefix);
}
else
{
@@ -1696,12 +2448,15 @@ bool ServerAccept(CONNECTION *c)
{
c->CipherName = CopyStr(c->FirstSock->CipherName);
}
+
+ Format(radius_login_opt.In_VpnProtocolState, sizeof(radius_login_opt.In_VpnProtocolState),
+ "L%u:%s", IPC_LAYER_2, "SEVPN");
}
if (support_bulk_on_rudp && c->FirstSock != NULL && c->FirstSock->IsRUDPSocket &&
c->FirstSock->BulkRecvKey != NULL && c->FirstSock->BulkSendKey != NULL)
{
- // RAllow UDP bulk transfer if the client side supports
+ // Allow UDP bulk transfer if the client side supports
// in the case of using R-UDP Socket
enable_bulk_on_rudp = true;
@@ -1716,9 +2471,11 @@ bool ServerAccept(CONNECTION *c)
if (use_udp_acceleration_client)
{
+ PackGetData2(p, "udp_acceleration_client_key", udp_acceleration_client_key, UDP_ACCELERATION_COMMON_KEY_SIZE_V1);
+ PackGetData2(p, "udp_acceleration_client_key_v2", udp_acceleration_client_key_v2, UDP_ACCELERATION_COMMON_KEY_SIZE_V2);
+
// Get the parameters for the UDP acceleration function
- if (PackGetIp(p, "udp_acceleration_client_ip", &udp_acceleration_client_ip) == false ||
- PackGetData2(p, "udp_acceleration_client_key", udp_acceleration_client_key, UDP_ACCELERATION_COMMON_KEY_SIZE) == false)
+ if (PackGetIp(p, "udp_acceleration_client_ip", &udp_acceleration_client_ip) == false)
{
use_udp_acceleration_client = false;
}
@@ -1786,6 +2543,9 @@ bool ServerAccept(CONNECTION *c)
case AUTHTYPE_TICKET:
authtype_str = _UU("LH_AUTH_TICKET");
break;
+ case AUTHTYPE_OPENVPN_CERT:
+ authtype_str = _UU("LH_AUTH_OPENVPN_CERT");
+ break;
}
IPToStr(ip1, sizeof(ip1), &c->FirstSock->RemoteIP);
IPToStr(ip2, sizeof(ip2), &c->FirstSock->LocalIP);
@@ -2119,6 +2879,50 @@ bool ServerAccept(CONNECTION *c)
}
break;
+ case AUTHTYPE_OPENVPN_CERT:
+ // For OpenVPN; mostly same as CLIENT_AUTHTYPE_CERT, but without
+ // signature verification, because it was already performed during TLS handshake.
+ if (c->IsInProc)
+ {
+ // Certificate authentication
+ cert_size = PackGetDataSize(p, "cert");
+ if (cert_size >= 1 && cert_size <= 100000)
+ {
+ cert_buf = ZeroMalloc(cert_size);
+ if (PackGetData(p, "cert", cert_buf))
+ {
+ BUF *b = NewBuf();
+ X *x;
+ WriteBuf(b, cert_buf, cert_size);
+ x = BufToX(b, false);
+ if (x != NULL && x->is_compatible_bit)
+ {
+ Debug("Got to SamAuthUserByCert %s\n", username); // XXX
+ // Check whether the certificate is valid.
+ auth_ret = SamAuthUserByCert(hub, username, x);
+ if (auth_ret)
+ {
+ // Copy the certificate
+ c->ClientX = CloneX(x);
+ }
+ }
+ FreeX(x);
+ FreeBuf(b);
+ }
+ Free(cert_buf);
+ }
+ }
+ else
+ {
+ // OpenVPN certificate authentication cannot be used directly by external clients
+ Unlock(hub->lock);
+ ReleaseHub(hub);
+ FreePack(p);
+ c->Err = ERR_AUTHTYPE_NOT_SUPPORTED;
+ goto CLEANUP;
+ }
+ break;
+
default:
// Unknown authentication method
Unlock(hub->lock);
@@ -2206,6 +3010,12 @@ bool ServerAccept(CONNECTION *c)
}
}
+ // Check the assigned MAC Address
+ if (radius_login_opt.Out_IsRadiusLogin)
+ {
+ Copy(assigned_ipc_mac_address, radius_login_opt.Out_VirtualMacAddress, 6);
+ }
+
if (StrCmpi(username, ADMINISTRATOR_USERNAME) != 0)
{
// Get the policy
@@ -2892,15 +3702,16 @@ bool ServerAccept(CONNECTION *c)
// VLAN ID
if (assigned_vlan_id != 0)
{
- if (policy->VLanId == 0)
- {
- policy->VLanId = assigned_vlan_id;
- }
+ if (policy->VLanId == 0)
+ {
+ policy->VLanId = assigned_vlan_id;
}
+ }
// Create a Session
StrLower(username);
- s = NewServerSessionEx(c->Cedar, c, hub, username, policy, c->IsInProc);
+ s = NewServerSessionEx(c->Cedar, c, hub, username, policy, c->IsInProc,
+ (c->IsInProc && IsZero(assigned_ipc_mac_address, 6) == false) ? assigned_ipc_mac_address : NULL);
s->EnableUdpRecovery = enable_udp_recovery;
s->LocalHostSession = local_host_session;
@@ -2914,6 +3725,8 @@ bool ServerAccept(CONNECTION *c)
s->IsRUDPSession = true;
s->RUdpMss = c->FirstSock->RUDP_OptimizedMss;
Debug("Optimized MSS Value for R-UDP: %u\n", s->RUdpMss);
+ AddProtocolDetailsKeyValueInt(s->ProtocolDetails, sizeof(s->ProtocolDetails),
+ "RUDP_MSS", s->RUdpMss);
}
if (enable_bulk_on_rudp)
@@ -2927,6 +3740,8 @@ bool ServerAccept(CONNECTION *c)
StrCpy(s->UnderlayProtocol, sizeof(s->UnderlayProtocol), c->FirstSock->UnderlayProtocol);
+ AddProtocolDetailsStr(s->ProtocolDetails, sizeof(s->ProtocolDetails), c->FirstSock->ProtocolDetails);
+
if (server != NULL)
{
s->NoSendSignature = server->NoSendSignature;
@@ -2955,6 +3770,28 @@ bool ServerAccept(CONNECTION *c)
s->UseUdpAcceleration = true;
s->UdpAccelFastDisconnectDetect = support_udp_accel_fast_disconnect_detect;
+
+ // TODO: determine UDP Accel version
+ udp_acceleration_version = 1;
+ if (client_udp_acceleration_max_version >= 2)
+ {
+ udp_acceleration_version = 2;
+ }
+ }
+
+ // TODO: determine RUDP Bulk version
+ if (client_rudp_bulk_max_version >= 2)
+ {
+ rudp_bulk_version = 2;
+ }
+
+ s->BulkOnRUDPVersion = rudp_bulk_version;
+
+ if (s->EnableBulkOnRUDP)
+ {
+ AddProtocolDetailsKeyValueInt(s->ProtocolDetails, sizeof(s->ProtocolDetails),
+ "RUDP_Bulk_Ver",
+ s->BulkOnRUDPVersion);
}
if (hub->Option != NULL && hub->Option->DisableUdpAcceleration)
@@ -2978,6 +3815,7 @@ bool ServerAccept(CONNECTION *c)
Debug("UseUdpAcceleration = %u\n", s->UseUdpAcceleration);
Debug("UseHMacOnUdpAcceleration = %u\n", s->UseHMacOnUdpAcceleration);
+ Debug("UdpAccelerationVersion = %u\n", s->UdpAccelerationVersion);
if (s->UseUdpAcceleration)
{
@@ -2993,7 +3831,11 @@ bool ServerAccept(CONNECTION *c)
}
else
{
- if (UdpAccelInitServer(s->UdpAccel, udp_acceleration_client_key, &udp_acceleration_client_ip, udp_acceleration_client_port,
+ s->UdpAccel->Version = udp_acceleration_version;
+
+ if (UdpAccelInitServer(s->UdpAccel,
+ s->UdpAccel->Version == 2 ? udp_acceleration_client_key_v2 : udp_acceleration_client_key,
+ &udp_acceleration_client_ip, udp_acceleration_client_port,
&c->FirstSock->RemoteIP) == false)
{
Debug("UdpAccelInitServer Failed.\n");
@@ -3008,6 +3850,21 @@ bool ServerAccept(CONNECTION *c)
}
s->UdpAccel->UseHMac = s->UseHMacOnUdpAcceleration;
+
+ AddProtocolDetailsKeyValueInt(s->ProtocolDetails, sizeof(s->ProtocolDetails),
+ "UDPAccel_Ver",
+ s->UdpAccel->Version);
+
+ if (s->UdpAccel->Version >= 2)
+ {
+ AddProtocolDetailsStr(s->ProtocolDetails, sizeof(s->ProtocolDetails),
+ Aead_ChaCha20Poly1305_Ietf_IsOpenSSL() ?
+ "ChachaPoly_OpenSSL" : "ChachaPoly_Self");
+ }
+
+ AddProtocolDetailsKeyValueInt(s->ProtocolDetails, sizeof(s->ProtocolDetails),
+ "UDPAccel_MSS",
+ UdpAccelCalcMss(s->UdpAccel));
}
}
@@ -3018,6 +3875,8 @@ bool ServerAccept(CONNECTION *c)
if (s->AdjustMss != 0)
{
Debug("AdjustMSS: %u\n", s->AdjustMss);
+ AddProtocolDetailsKeyValueInt(s->ProtocolDetails, sizeof(s->ProtocolDetails),
+ "AdjustMSS", s->AdjustMss);
}
s->IsBridgeMode = (policy->NoBridge == false) || (policy->NoRouting == false);
@@ -3064,7 +3923,8 @@ bool ServerAccept(CONNECTION *c)
char ip[128];
IPToStr(ip, sizeof(ip), &c->FirstSock->RemoteIP);
HLog(hub, "LH_NEW_SESSION", c->Name, s->Name, ip, c->FirstSock->RemotePort,
- c->FirstSock->UnderlayProtocol);
+ c->FirstSock->UnderlayProtocol,
+ c->FirstSock->ProtocolDetails);
}
c->Session = s;
@@ -3088,7 +3948,7 @@ bool ServerAccept(CONNECTION *c)
s->QoS = qos;
s->NoReconnectToSession = no_reconnect_to_session;
- s->VLanId = policy->VLanId;
+ s->VLanId = policy->VLanId;
// User name
s->Username = CopyStr(username);
@@ -3489,6 +4349,30 @@ bool ServerAccept(CONNECTION *c)
// Add the socket of this connection to the connection list of the session (TCP)
sock = c->FirstSock;
+
+ if (sock->IsRUDPSocket && sock->BulkRecvKey != NULL && sock->BulkSendKey != NULL)
+ {
+ if (s->BulkRecvKeySize != 0 && s->BulkSendKeySize != 0)
+ {
+ // Restore R-UDP bulk send/recv keys for additional connections
+ Copy(sock->BulkRecvKey->Data, s->BulkRecvKey, s->BulkRecvKeySize);
+ sock->BulkRecvKey->Size = s->BulkRecvKeySize;
+ Copy(sock->BulkSendKey->Data, s->BulkSendKey, s->BulkSendKeySize);
+ sock->BulkSendKey->Size = s->BulkSendKeySize;
+
+ if (false)
+ {
+ char tmp1[128];
+ char tmp2[128];
+ BinToStr(tmp1, sizeof(tmp1), s->BulkRecvKey, s->BulkRecvKeySize);
+ BinToStr(tmp2, sizeof(tmp2), s->BulkSendKey, s->BulkSendKeySize);
+ Debug("Restore: s->BulkRecvKey->Size = %u, s->BulkSendKey->Size = %u\n",
+ s->BulkRecvKeySize, s->BulkSendKeySize);
+ Debug("Restore:\n%s\n%s\n\n", tmp1, tmp2);
+ }
+ }
+ }
+
ts = NewTcpSock(sock);
SetTimeout(sock, CONNECTING_TIMEOUT);
direction = TCP_BOTH;
@@ -4393,6 +5277,30 @@ bool ClientAdditionalConnect(CONNECTION *c, THREAD *t)
Debug("Additional Connect Succeed!\n");
+ if (s->IsRUDPSocket && s->BulkRecvKey != NULL && s->BulkSendKey != NULL)
+ {
+ // Restore R-UDP bulk send/recv keys for additional connections
+ if (c->Session->BulkRecvKeySize != 0 && c->Session->BulkSendKeySize != 0)
+ {
+ Copy(s->BulkRecvKey->Data, c->Session->BulkRecvKey, c->Session->BulkRecvKeySize);
+ s->BulkRecvKey->Size = c->Session->BulkRecvKeySize;
+
+ Copy(s->BulkSendKey->Data, c->Session->BulkSendKey, c->Session->BulkSendKeySize);
+ s->BulkSendKey->Size = c->Session->BulkSendKeySize;
+
+ if (false)
+ {
+ char tmp1[128];
+ char tmp2[128];
+ BinToStr(tmp1, sizeof(tmp1), s->BulkRecvKey->Data, s->BulkRecvKey->Size);
+ BinToStr(tmp2, sizeof(tmp2), s->BulkSendKey->Data, s->BulkSendKey->Size);
+ Debug("Restore: s->BulkRecvKey->Size = %u, s->BulkSendKey->Size = %u\n",
+ s->BulkRecvKey->Size, s->BulkSendKey->Size);
+ Debug("Restore:\n%s\n%s\n\n", tmp1, tmp2);
+ }
+ }
+ }
+
// Success the additional connection
// Add to the TcpSockList of the connection
ts = NewTcpSock(s);
@@ -5128,9 +6036,14 @@ REDIRECTED:
// Physical communication protocol
StrCpy(c->Session->UnderlayProtocol, sizeof(c->Session->UnderlayProtocol), s->UnderlayProtocol);
+ AddProtocolDetailsStr(c->Session->ProtocolDetails, sizeof(c->Session->ProtocolDetails), s->ProtocolDetails);
+
if (c->Session->IsAzureSession)
{
StrCpy(c->Session->UnderlayProtocol, sizeof(c->Session->UnderlayProtocol), SOCK_UNDERLAY_AZURE);
+
+ AddProtocolDetailsStr(c->Session->ProtocolDetails, sizeof(c->Session->ProtocolDetails),
+ "VPNAzure");
}
if (c->Protocol == CONNECTION_UDP)
@@ -5174,28 +6087,62 @@ REDIRECTED:
if (s != NULL && s->IsRUDPSocket && s->BulkRecvKey != NULL && s->BulkSendKey != NULL)
{
// Bulk transfer on R-UDP
+ sess->EnableHMacOnBulkOfRUDP = PackGetBool(p, "enable_hmac_on_bulk_of_rudp");
+ sess->BulkOnRUDPVersion = PackGetInt(p, "rudp_bulk_version");
+
if (PackGetBool(p, "enable_bulk_on_rudp"))
{
// Receive the key
- UCHAR key_send[SHA1_SIZE];
- UCHAR key_recv[SHA1_SIZE];
+ UCHAR key_send[RUDP_BULK_KEY_SIZE_MAX];
+ UCHAR key_recv[RUDP_BULK_KEY_SIZE_MAX];
+
+ UINT key_size = SHA1_SIZE;
+
+ if (sess->BulkOnRUDPVersion == 2)
+ {
+ key_size = RUDP_BULK_KEY_SIZE_V2;
+ }
- if (PackGetData2(p, "bulk_on_rudp_send_key", key_send, SHA1_SIZE) &&
- PackGetData2(p, "bulk_on_rudp_recv_key", key_recv, SHA1_SIZE))
+ if (PackGetData2(p, "bulk_on_rudp_send_key", key_send, key_size) &&
+ PackGetData2(p, "bulk_on_rudp_recv_key", key_recv, key_size))
{
sess->EnableBulkOnRUDP = true;
- Copy(s->BulkSendKey->Data, key_send, SHA1_SIZE);
- Copy(s->BulkRecvKey->Data, key_recv, SHA1_SIZE);
+ Copy(s->BulkSendKey->Data, key_send, key_size);
+ Copy(s->BulkRecvKey->Data, key_recv, key_size);
+
+ s->BulkSendKey->Size = key_size;
+ s->BulkRecvKey->Size = key_size;
+
+ // Backup R-UDP bulk send/recv keys for additional connections
+ Copy(sess->BulkSendKey, s->BulkSendKey->Data, s->BulkSendKey->Size);
+ sess->BulkSendKeySize = s->BulkSendKey->Size;
+
+ Copy(sess->BulkRecvKey, s->BulkRecvKey->Data, s->BulkRecvKey->Size);
+ sess->BulkRecvKeySize = s->BulkRecvKey->Size;
+
+ if (false)
+ {
+ char tmp1[128];
+ char tmp2[128];
+ BinToStr(tmp1, sizeof(tmp1), sess->BulkRecvKey, sess->BulkSendKeySize);
+ BinToStr(tmp2, sizeof(tmp2), sess->BulkSendKey, sess->BulkRecvKeySize);
+ Debug("Backup: sess->BulkRecvKeySize = %u, sess->BulkSendKeySize = %u\n",
+ sess->BulkRecvKeySize, sess->BulkSendKeySize);
+ Debug("Backup:\n%s\n%s\n\n", tmp1, tmp2);
+ }
+
+ AddProtocolDetailsKeyValueInt(sess->ProtocolDetails, sizeof(sess->ProtocolDetails),
+ "RUDP_Bulk_Ver",
+ sess->BulkOnRUDPVersion);
}
}
-
- sess->EnableHMacOnBulkOfRUDP = PackGetBool(p, "enable_hmac_on_bulk_of_rudp");
}
Debug("EnableBulkOnRUDP = %u\n", sess->EnableBulkOnRUDP);
Debug("EnableHMacOnBulkOfRUDP = %u\n", sess->EnableHMacOnBulkOfRUDP);
Debug("EnableUdpRecovery = %u\n", sess->EnableUdpRecovery);
+ Debug("BulkOnRUDPVersion = %u\n", sess->BulkOnRUDPVersion);
sess->UseUdpAcceleration = false;
sess->IsUsingUdpAcceleration = false;
@@ -5209,8 +6156,14 @@ REDIRECTED:
if (PackGetBool(p, "use_udp_acceleration"))
{
+ UINT udp_acceleration_version = PackGetInt(p, "udp_acceleration_version");
IP udp_acceleration_server_ip;
+ if (udp_acceleration_version == 0)
+ {
+ udp_acceleration_version = 1;
+ }
+
sess->UdpAccelFastDisconnectDetect = PackGetBool(p, "udp_accel_fast_disconnect_detect");
if (PackGetIp(p, "udp_acceleration_server_ip", &udp_acceleration_server_ip))
@@ -5224,46 +6177,71 @@ REDIRECTED:
if (udp_acceleration_server_port != 0)
{
- UCHAR udp_acceleration_server_key[UDP_ACCELERATION_COMMON_KEY_SIZE];
+ UCHAR udp_acceleration_server_key[UDP_ACCELERATION_COMMON_KEY_SIZE_V1];
+ UCHAR udp_acceleration_server_key_v2[UDP_ACCELERATION_COMMON_KEY_SIZE_V2];
+ UINT server_cookie = PackGetInt(p, "udp_acceleration_server_cookie");
+ UINT client_cookie = PackGetInt(p, "udp_acceleration_client_cookie");
+ bool encryption = PackGetBool(p, "udp_acceleration_use_encryption");
+
+ Zero(udp_acceleration_server_key, sizeof(udp_acceleration_server_key));
+ Zero(udp_acceleration_server_key_v2, sizeof(udp_acceleration_server_key_v2));
+
+ PackGetData2(p, "udp_acceleration_server_key", udp_acceleration_server_key, UDP_ACCELERATION_COMMON_KEY_SIZE_V1);
+ PackGetData2(p, "udp_acceleration_server_key_v2", udp_acceleration_server_key_v2, UDP_ACCELERATION_COMMON_KEY_SIZE_V2);
- if (PackGetData2(p, "udp_acceleration_server_key", udp_acceleration_server_key, UDP_ACCELERATION_COMMON_KEY_SIZE))
+ if (server_cookie != 0 && client_cookie != 0)
{
- UINT server_cookie = PackGetInt(p, "udp_acceleration_server_cookie");
- UINT client_cookie = PackGetInt(p, "udp_acceleration_client_cookie");
- bool encryption = PackGetBool(p, "udp_acceleration_use_encryption");
+ IP remote_ip;
+
+ Copy(&remote_ip, &s->RemoteIP, sizeof(IP));
+
+ if (IsZeroIp(&c->Session->AzureRealServerGlobalIp) == false)
+ {
+ Copy(&remote_ip, &c->Session->AzureRealServerGlobalIp, sizeof(IP));
+ }
- if (server_cookie != 0 && client_cookie != 0)
+ sess->UdpAccel->Version = 1;
+ if (udp_acceleration_version == 2)
{
- IP remote_ip;
+ sess->UdpAccel->Version = 2;
+ }
- Copy(&remote_ip, &s->RemoteIP, sizeof(IP));
+ if (UdpAccelInitClient(sess->UdpAccel,
+ sess->UdpAccel->Version == 2 ? udp_acceleration_server_key_v2 : udp_acceleration_server_key,
+ &udp_acceleration_server_ip, udp_acceleration_server_port,
+ server_cookie, client_cookie, &remote_ip) == false)
+ {
+ Debug("UdpAccelInitClient failed.\n");
+ }
+ else
+ {
+ sess->UseUdpAcceleration = true;
- if (IsZeroIp(&c->Session->AzureRealServerGlobalIp) == false)
- {
- Copy(&remote_ip, &c->Session->AzureRealServerGlobalIp, sizeof(IP));
- }
+ sess->UdpAccel->FastDetect = sess->UdpAccelFastDisconnectDetect;
- if (UdpAccelInitClient(sess->UdpAccel, udp_acceleration_server_key,
- &udp_acceleration_server_ip, udp_acceleration_server_port,
- server_cookie, client_cookie, &remote_ip) == false)
- {
- Debug("UdpAccelInitClient failed.\n");
- }
- else
- {
- sess->UseUdpAcceleration = true;
+ sess->UdpAccel->PlainTextMode = !encryption;
- sess->UdpAccel->FastDetect = sess->UdpAccelFastDisconnectDetect;
+ sess->UseHMacOnUdpAcceleration = PackGetBool(p, "use_hmac_on_udp_acceleration");
- sess->UdpAccel->PlainTextMode = !encryption;
+ if (sess->UseHMacOnUdpAcceleration)
+ {
+ sess->UdpAccel->UseHMac = true;
+ }
- sess->UseHMacOnUdpAcceleration = PackGetBool(p, "use_hmac_on_udp_acceleration");
+ AddProtocolDetailsKeyValueInt(sess->ProtocolDetails, sizeof(sess->ProtocolDetails),
+ "UDPAccel_Ver",
+ sess->UdpAccel->Version);
- if (sess->UseHMacOnUdpAcceleration)
- {
- sess->UdpAccel->UseHMac = true;
- }
+ if (sess->UdpAccel->Version >= 2)
+ {
+ AddProtocolDetailsStr(sess->ProtocolDetails, sizeof(sess->ProtocolDetails),
+ Aead_ChaCha20Poly1305_Ietf_IsOpenSSL() ?
+ "ChachaPoly_OpenSSL" : "ChachaPoly_Self");
}
+
+ AddProtocolDetailsKeyValueInt(sess->ProtocolDetails, sizeof(sess->ProtocolDetails),
+ "UDPAccel_MSS",
+ UdpAccelCalcMss(sess->UdpAccel));
}
}
}
@@ -5502,15 +6480,25 @@ PACK *PackWelcome(SESSION *s)
// Virtual HUB name
PackAddStr(p, "IpcHubName", s->Hub->Name);
+
+ // Shared Buffer
+ s->IpcSessionSharedBuffer = NewSharedBuffer(NULL, sizeof(IPC_SESSION_SHARED_BUFFER_DATA));
+ AddRef(s->IpcSessionSharedBuffer->Ref);
+
+ s->IpcSessionShared = s->IpcSessionSharedBuffer->Data;
+
+ PackAddInt64(p, "IpcSessionSharedBuffer", (UINT64)s->IpcSessionSharedBuffer);
}
if (s->UdpAccel != NULL)
{
// UDP acceleration function
PackAddBool(p, "use_udp_acceleration", true);
+ PackAddInt(p, "udp_acceleration_version", s->UdpAccel->Version);
PackAddIp(p, "udp_acceleration_server_ip", &s->UdpAccel->MyIp);
PackAddInt(p, "udp_acceleration_server_port", s->UdpAccel->MyPort);
- PackAddData(p, "udp_acceleration_server_key", s->UdpAccel->MyKey, UDP_ACCELERATION_COMMON_KEY_SIZE);
+ PackAddData(p, "udp_acceleration_server_key", s->UdpAccel->MyKey, UDP_ACCELERATION_COMMON_KEY_SIZE_V1);
+ PackAddData(p, "udp_acceleration_server_key_v2", s->UdpAccel->MyKey_V2, UDP_ACCELERATION_COMMON_KEY_SIZE_V2);
PackAddInt(p, "udp_acceleration_server_cookie", s->UdpAccel->MyCookie);
PackAddInt(p, "udp_acceleration_client_cookie", s->UdpAccel->YourCookie);
PackAddBool(p, "udp_acceleration_use_encryption", !s->UdpAccel->PlainTextMode);
@@ -5523,9 +6511,46 @@ PACK *PackWelcome(SESSION *s)
// Allow bulk transfer on R-UDP
PackAddBool(p, "enable_bulk_on_rudp", true);
PackAddBool(p, "enable_hmac_on_bulk_of_rudp", s->EnableHMacOnBulkOfRUDP);
+ PackAddInt(p, "rudp_bulk_version", s->BulkOnRUDPVersion);
+
+ if (s->BulkOnRUDPVersion == 2)
+ {
+ PackAddData(p, "bulk_on_rudp_send_key", s->Connection->FirstSock->BulkRecvKey->Data, RUDP_BULK_KEY_SIZE_V2);
+ s->Connection->FirstSock->BulkRecvKey->Size = RUDP_BULK_KEY_SIZE_V2;
+
+ PackAddData(p, "bulk_on_rudp_recv_key", s->Connection->FirstSock->BulkSendKey->Data, RUDP_BULK_KEY_SIZE_V2);
+ s->Connection->FirstSock->BulkSendKey->Size = RUDP_BULK_KEY_SIZE_V2;
+ }
+ else
+ {
+ PackAddData(p, "bulk_on_rudp_send_key", s->Connection->FirstSock->BulkRecvKey->Data, SHA1_SIZE);
+ s->Connection->FirstSock->BulkRecvKey->Size = SHA1_SIZE;
+
+ PackAddData(p, "bulk_on_rudp_recv_key", s->Connection->FirstSock->BulkSendKey->Data, SHA1_SIZE);
+ s->Connection->FirstSock->BulkSendKey->Size = SHA1_SIZE;
+ }
+
+ // Backup R-UDP bulk send/recv keys for additional connections
+ Copy(s->BulkSendKey, s->Connection->FirstSock->BulkSendKey->Data,
+ s->Connection->FirstSock->BulkSendKey->Size);
+
+ s->BulkSendKeySize = s->Connection->FirstSock->BulkSendKey->Size;
+
+ Copy(s->BulkRecvKey, s->Connection->FirstSock->BulkRecvKey->Data,
+ s->Connection->FirstSock->BulkRecvKey->Size);
- PackAddData(p, "bulk_on_rudp_send_key", s->Connection->FirstSock->BulkRecvKey->Data, SHA1_SIZE);
- PackAddData(p, "bulk_on_rudp_recv_key", s->Connection->FirstSock->BulkSendKey->Data, SHA1_SIZE);
+ s->BulkRecvKeySize = s->Connection->FirstSock->BulkRecvKey->Size;
+
+ if (false)
+ {
+ char tmp1[128];
+ char tmp2[128];
+ BinToStr(tmp1, sizeof(tmp1), s->BulkRecvKey, s->BulkSendKeySize);
+ BinToStr(tmp2, sizeof(tmp2), s->BulkSendKey, s->BulkRecvKeySize);
+ Debug("Backup: s->BulkRecvKeySize = %u, s->BulkSendKeySize = %u\n",
+ s->BulkRecvKeySize, s->BulkSendKeySize);
+ Debug("Backup:\n%s\n%s\n\n", tmp1, tmp2);
+ }
}
if (s->IsAzureSession)
@@ -5544,11 +6569,11 @@ PACK *PackWelcome(SESSION *s)
}
#define PACK_ADD_POLICY_BOOL(name, value) \
- PackAddInt(p, "policy:" name, y->value == false ? 0 : 1)
+ PackAddBool(p, "policy:" name, y->value == false ? 0 : 1)
#define PACK_ADD_POLICY_UINT(name, value) \
PackAddInt(p, "policy:" name, y->value)
#define PACK_GET_POLICY_BOOL(name, value) \
- y->value = (PackGetInt(p, "policy:" name) == 0 ? false : true)
+ y->value = (PackGetBool(p, "policy:" name))
#define PACK_GET_POLICY_UINT(name, value) \
y->value = PackGetInt(p, "policy:" name)
@@ -5902,6 +6927,8 @@ bool ClientUploadAuth(CONNECTION *c)
PackAddBool(p, "use_udp_acceleration", true);
+ PackAddInt(p, "udp_acceleration_version", c->Session->UdpAccel->Version);
+
Copy(&my_ip, &c->Session->UdpAccel->MyIp, sizeof(IP));
if (IsLocalHostIP(&my_ip))
{
@@ -5917,11 +6944,15 @@ bool ClientUploadAuth(CONNECTION *c)
PackAddIp(p, "udp_acceleration_client_ip", &my_ip);
PackAddInt(p, "udp_acceleration_client_port", c->Session->UdpAccel->MyPort);
- PackAddData(p, "udp_acceleration_client_key", c->Session->UdpAccel->MyKey, UDP_ACCELERATION_COMMON_KEY_SIZE);
+ PackAddData(p, "udp_acceleration_client_key", c->Session->UdpAccel->MyKey, UDP_ACCELERATION_COMMON_KEY_SIZE_V1);
+ PackAddData(p, "udp_acceleration_client_key_v2", c->Session->UdpAccel->MyKey_V2, UDP_ACCELERATION_COMMON_KEY_SIZE_V2);
PackAddBool(p, "support_hmac_on_udp_acceleration", true);
PackAddBool(p, "support_udp_accel_fast_disconnect_detect", true);
+ PackAddInt(p, "udp_acceleration_max_version", 2);
}
+ PackAddInt(p, "rudp_bulk_max_version", 2);
+
// Brand string for the connection limit
{
char *branded_ctos = _SS("BRANDED_C_TO_S");
@@ -6033,15 +7064,20 @@ bool ServerDownloadSignature(CONNECTION *c, char **error_detail_str)
SERVER *server;
char *vpn_http_target = HTTP_VPN_TARGET2;
bool check_hostname = false;
+ bool disable_json_api = false;
// Validate arguments
if (c == NULL)
{
return false;
}
+ server = c->Cedar->Server;
+
+ disable_json_api = server->DisableJsonRpcWebApi;
+
+
- server = c->Cedar->Server;
s = c->FirstSock;
@@ -6064,6 +7100,10 @@ bool ServerDownloadSignature(CONNECTION *c, char **error_detail_str)
if (h == NULL)
{
c->Err = ERR_CLIENT_IS_NOT_VPN;
+ if (c->IsJsonRpc)
+ {
+ c->Err = ERR_DISCONNECTED;
+ }
return false;
}
@@ -6099,6 +7139,43 @@ bool ServerDownloadSignature(CONNECTION *c, char **error_detail_str)
{
// Receive the data since it's POST
data_size = GetContentLength(h);
+
+ if (disable_json_api == false)
+ {
+ if (StrCmpi(h->Target, "/api") == 0 || StrCmpi(h->Target, "/api/") == 0)
+ {
+ c->IsJsonRpc = true;
+ c->Type = CONNECTION_TYPE_ADMIN_RPC;
+
+ JsonRpcProcPost(c, s, h, data_size);
+
+ FreeHttpHeader(h);
+
+ if (c->JsonRpcAuthed)
+ {
+ num = 0;
+ }
+
+ continue;
+ }
+ else if (StartWith(h->Target, "/admin"))
+ {
+ c->IsJsonRpc = true;
+ c->Type = CONNECTION_TYPE_ADMIN_RPC;
+
+ AdminWebProcPost(c, s, h, data_size, h->Target);
+
+ FreeHttpHeader(h);
+
+ if (c->JsonRpcAuthed)
+ {
+ num = 0;
+ }
+
+ continue;
+ }
+ }
+
if ((data_size > MAX_WATERMARK_SIZE || data_size < SizeOfWaterMark()) && (data_size != StrLen(HTTP_VPN_TARGET_POSTDATA)))
{
// Data is too large
@@ -6131,7 +7208,7 @@ bool ServerDownloadSignature(CONNECTION *c, char **error_detail_str)
{
// Compare posted data with the WaterMark
if ((data_size == StrLen(HTTP_VPN_TARGET_POSTDATA) && (Cmp(data, HTTP_VPN_TARGET_POSTDATA, data_size) == 0))
- || (Cmp(data, WaterMark, SizeOfWaterMark()) == 0))
+ || ((data_size >= SizeOfWaterMark()) && Cmp(data, WaterMark, SizeOfWaterMark()) == 0))
{
// Check the WaterMark
Free(data);
@@ -6147,6 +7224,25 @@ bool ServerDownloadSignature(CONNECTION *c, char **error_detail_str)
}
}
}
+ else if (StrCmpi(h->Method, "OPTIONS") == 0)
+ {
+ if (disable_json_api == false)
+ {
+ if (StrCmpi(h->Target, "/api") == 0 || StrCmpi(h->Target, "/api/") == 0 || StartWith(h->Target, "/admin"))
+ {
+ c->IsJsonRpc = true;
+ c->Type = CONNECTION_TYPE_ADMIN_RPC;
+
+ JsonRpcProcOptions(c, s, h, h->Target);
+
+ FreeHttpHeader(h);
+
+ num = 0;
+
+ continue;
+ }
+ }
+ }
else if (StrCmpi(h->Method, "SSTP_DUPLEX_POST") == 0 && (server->DisableSSTPServer == false || s->IsReverseAcceptedSocket
) &&
GetServerCapsBool(server, "b_support_sstp") && GetNoSstp() == false)
@@ -6202,50 +7298,27 @@ bool ServerDownloadSignature(CONNECTION *c, char **error_detail_str)
{
// Root directory
SERVER *s = c->Cedar->Server;
- bool is_free = false;
*error_detail_str = "HTTP_ROOT";
{
- if (is_free == false)
+ BUF *b = ReadDump("|wwwroot\\index.html");
+
+ if (b != NULL)
{
- // Other than free version
- HttpSendForbidden(c->FirstSock, h->Target, "");
+ FreeHttpHeader(h);
+ h = NewHttpHeader("HTTP/1.1", "202", "OK");
+ AddHttpValue(h, NewHttpValue("Content-Type", HTTP_CONTENT_TYPE4));
+ AddHttpValue(h, NewHttpValue("Connection", "Keep-Alive"));
+ AddHttpValue(h, NewHttpValue("Keep-Alive", HTTP_KEEP_ALIVE));
+
+ PostHttp(c->FirstSock, h, b->Buf, b->Size);
+
+ FreeBuf(b);
}
else
{
- // Free version
- BUF *b = ReadDump("|free.htm");
-
- if (b != NULL)
- {
- char *src = ZeroMalloc(b->Size + 1);
- UINT dst_size = b->Size * 2 + 64;
- char *dst = ZeroMalloc(dst_size);
- char host[MAX_PATH];
- char portstr[64];
-
- GetMachineName(host, sizeof(host));
- ToStr(portstr, c->FirstSock->LocalPort);
-
- Copy(src, b->Buf, b->Size);
- ReplaceStrEx(dst, dst_size, src,
- "$HOST$", host, false);
- ReplaceStrEx(dst, dst_size, dst,
- "$PORT$", portstr, false);
-
- FreeHttpHeader(h);
- h = NewHttpHeader("HTTP/1.1", "202", "OK");
- AddHttpValue(h, NewHttpValue("Content-Type", HTTP_CONTENT_TYPE4));
- AddHttpValue(h, NewHttpValue("Connection", "Keep-Alive"));
- AddHttpValue(h, NewHttpValue("Keep-Alive", HTTP_KEEP_ALIVE));
- PostHttp(c->FirstSock, h, dst, StrLen(dst));
-
- Free(src);
- Free(dst);
-
- FreeBuf(b);
- }
+ HttpSendForbidden(c->FirstSock, h->Target, "");
}
}
}
@@ -6307,6 +7380,56 @@ bool ServerDownloadSignature(CONNECTION *c, char **error_detail_str)
if (b == false)
{
+ if (disable_json_api == false)
+ {
+ if (StartWith(h->Target, "/api?") || StartWith(h->Target, "/api/") || StrCmpi(h->Target, "/api") == 0)
+ {
+ c->IsJsonRpc = true;
+ c->Type = CONNECTION_TYPE_ADMIN_RPC;
+
+ JsonRpcProcGet(c, s, h, h->Target);
+
+ if (c->JsonRpcAuthed)
+ {
+ num = 0;
+ }
+
+ FreeHttpHeader(h);
+
+ continue;
+ }
+ else if (StartWith(h->Target, "/admin"))
+ {
+ c->IsJsonRpc = true;
+ c->Type = CONNECTION_TYPE_ADMIN_RPC;
+
+ AdminWebProcGet(c, s, h, h->Target);
+
+ if (c->JsonRpcAuthed)
+ {
+ num = 0;
+ }
+
+ FreeHttpHeader(h);
+
+ continue;
+ }
+ }
+
+ if (false) // TODO
+ {
+ if (StrCmpi(h->Target, "/mvpn") == 0 || StrCmpi(h->Target, "/mvpn/") == 0)
+ {
+ MvpnProcGet(c, s, h, h->Target);
+
+ FreeHttpHeader(h);
+ continue;
+ }
+ }
+ }
+
+ if (b == false)
+ {
// Not Found
HttpSendNotFound(s, h->Target);
@@ -6517,6 +7640,7 @@ SOCK *ClientConnectGetSocket(CONNECTION *c, bool additional_connect, bool no_tls
if (s != NULL)
{
StrCpy(s->UnderlayProtocol, sizeof(s->UnderlayProtocol), SOCK_UNDERLAY_NAT_T);
+ AddProtocolDetailsStr(s->UnderlayProtocol, sizeof(s->UnderlayProtocol), "NAT-T");
}
}
if (s == NULL)
@@ -7225,6 +8349,45 @@ PACK *PackLoginWithPlainPassword(char *hubname, char *username, void *plain_pass
return p;
}
+// Generate a packet of OpenVPN certificate login
+PACK *PackLoginWithOpenVPNCertificate(char *hubname, char *username, X *x)
+{
+ PACK *p;
+ char cn_username[128];
+ BUF *cert_buf = NULL;
+ // Validate arguments
+ if (hubname == NULL || username == NULL || x == NULL)
+ {
+ return NULL;
+ }
+
+ p = NewPack();
+ PackAddStr(p, "method", "login");
+ PackAddStr(p, "hubname", hubname);
+
+ if (IsEmptyStr(username))
+ {
+ if (x->subject_name == NULL)
+ {
+ return NULL;
+ }
+ UniToStr(cn_username, sizeof(cn_username), x->subject_name->CommonName);
+ PackAddStr(p, "username", cn_username);
+ }
+ else
+ {
+ PackAddStr(p, "username", username);
+ }
+
+ PackAddInt(p, "authtype", AUTHTYPE_OPENVPN_CERT);
+
+ cert_buf = XToBuf(x, false);
+ PackAddBuf(p, "cert", cert_buf);
+ FreeBuf(cert_buf);
+
+ return p;
+}
+
// Create a packet of password authentication login
PACK *PackLoginWithPassword(char *hubname, char *username, void *secure_password)
{
@@ -7295,3 +8458,1429 @@ void GenerateRC4KeyPair(RC4_KEY_PAIR *k)
Rand(k->ServerToClientKey, sizeof(k->ServerToClientKey));
}
+// MVPN GET Procedure (WebSocket)
+void MvpnProcGet(CONNECTION *c, SOCK *s, HTTP_HEADER *h, char *url_target)
+{
+ HTTP_VALUE *req_upgrade;
+ HTTP_VALUE *req_version;
+ HTTP_VALUE *req_key;
+ char response_key[64];
+ UINT client_ws_version = 0;
+ char *bad_request_body = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\"http://www.w3.org/TR/html4/strict.dtd\">\r\n<HTML><HEAD><TITLE>Bad Request</TITLE>\r\n<META HTTP-EQUIV=\"Content-Type\" Content=\"text/html; charset=us-ascii\"></HEAD>\r\n<BODY><h2>Bad Request</h2>\r\n<hr><p>HTTP Error 400. The request is badly formed.</p>\r\n</BODY></HTML>";
+ if (c == NULL || s == NULL || h == NULL || url_target == NULL)
+ {
+ return;
+ }
+
+ req_upgrade = GetHttpValue(h, "Upgrade");
+ if (req_upgrade == NULL || StrCmpi(req_upgrade->Data, "websocket") != 0)
+ {
+ MvpnSendReply(s, 400, "Bad Request", bad_request_body, StrLen(bad_request_body),
+ NULL, NULL, NULL, h);
+ return;
+ }
+
+ req_version = GetHttpValue(h, "Sec-WebSocket-Version");
+ if (req_version != NULL) client_ws_version = ToInt(req_version->Data);
+ if (client_ws_version != 13)
+ {
+ MvpnSendReply(s, 400, "Bad Request", NULL, 0,
+ NULL, "Sec-WebSocket-Version", "13", h);
+ return;
+ }
+
+ Zero(response_key, sizeof(response_key));
+ req_key = GetHttpValue(h, "Sec-WebSocket-Key");
+ if (req_key != NULL)
+ {
+ char tmp[MAX_SIZE];
+ UCHAR hash[SHA1_SIZE];
+ StrCpy(tmp, sizeof(tmp), req_key->Data);
+ StrCat(tmp, sizeof(tmp), "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
+ HashSha1(hash, tmp, StrLen(tmp));
+ B64_Encode(response_key, hash, SHA1_SIZE);
+ }
+ else
+ {
+ MvpnSendReply(s, 400, "Bad Request", NULL, 0,
+ NULL, "Sec-WebSocket-Version", "13", h);
+ return;
+ }
+
+ MvpnSendReply(s, 101, "Switching Protocols", NULL, 0, NULL,
+ "Sec-WebSocket-Accept", response_key, h);
+
+ MvpnAccept(c, s);
+}
+
+// MVPN Send Reply
+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)
+{
+ HTTP_HEADER *h;
+ char date_str[MAX_SIZE];
+ char error_code_str[16];
+ bool ret = false;
+ HTTP_VALUE *origin;
+ HTTP_VALUE *upgrade;
+ HTTP_VALUE *req_connection;
+ if (s == NULL || status_string == NULL || (data_size != 0 && data == NULL) || request_headers == NULL)
+ {
+ return false;
+ }
+ if (content_type == NULL)
+ {
+ content_type = "text/html; charset=utf-8";
+ }
+
+ req_connection = GetHttpValue(request_headers, "Connection");
+
+ ToStr(error_code_str, status_code);
+ GetHttpDateStr(date_str, sizeof(date_str), SystemTime64());
+
+ h = NewHttpHeader("HTTP/1.1", error_code_str, status_string);
+
+ AddHttpValue(h, NewHttpValue("Cache-Control", "no-cache"));
+ if (data_size != 0)
+ {
+ AddHttpValue(h, NewHttpValue("Content-Type", content_type));
+ }
+ AddHttpValue(h, NewHttpValue("Date", date_str));
+ if (req_connection != NULL)
+ {
+ AddHttpValue(h, NewHttpValue("Connection", req_connection->Data));
+ }
+ else
+ {
+ AddHttpValue(h, NewHttpValue("Connection", "Keep-Alive"));
+ }
+ AddHttpValue(h, NewHttpValue("Access-Control-Allow-Headers", "content-type"));
+ AddHttpValue(h, NewHttpValue("Access-Control-Allow-Headers", "authorization"));
+ AddHttpValue(h, NewHttpValue("Access-Control-Allow-Headers", "x-websocket-extensions"));
+ AddHttpValue(h, NewHttpValue("Access-Control-Allow-Headers", "x-websocket-version"));
+ AddHttpValue(h, NewHttpValue("Access-Control-Allow-Headers", "x-websocket-protocol"));
+ AddHttpValue(h, NewHttpValue("Access-Control-Allow-Credentials", "true"));
+
+ origin = GetHttpValue(request_headers, "Origin");
+ if (origin != NULL)
+ {
+ AddHttpValue(h, NewHttpValue("Access-Control-Allow-Origin", origin->Data));
+ }
+
+ upgrade = GetHttpValue(request_headers, "Upgrade");
+ if (upgrade != NULL)
+ {
+ AddHttpValue(h, NewHttpValue("Upgrade", upgrade->Data));
+ }
+
+ if (add_header_name != NULL && add_header_value != NULL)
+ {
+ AddHttpValue(h, NewHttpValue(add_header_name, add_header_value));
+ }
+
+ ret = PostHttp(s, h, data, data_size);
+
+ FreeHttpHeader(h);
+
+ return ret;
+}
+
+// MVPN Accept
+void MvpnAccept(CONNECTION *c, SOCK *s)
+{
+ WS *w;
+ UINT err;
+ if (c == NULL || s == NULL)
+ {
+ return;
+ }
+
+ w = NewWs(s);
+
+ err = MvpnDoAccept(c, w);
+
+ //while (true)
+ //{
+ // UINT r;
+ // Zero(data, sizeof(data));
+ // r = WsRecvSyncAll(w, data, 7);
+ // if (!r)
+ // {
+ // break;
+ // }
+ // Print("WS_Recv: %s\n", data);
+ // r = WsSendSync(w, data, 7);
+ // if (!r)
+ // {
+ // break;
+ // }
+ // Print("WS_Send: %s\n", data);
+ //}
+
+ ReleaseWs(w);
+}
+
+// New WebSocket
+WS *NewWs(SOCK *s)
+{
+ WS *w;
+ if (s == NULL)
+ {
+ return NULL;
+ }
+
+ w = ZeroMalloc(sizeof(WS));
+
+ w->Ref = NewRef();
+
+ w->MaxBufferSize = MAX_BUFFERING_PACKET_SIZE;
+ w->Sock = s;
+ AddRef(w->Sock->ref);
+
+ w->Wsp = NewWsp();
+
+ return w;
+}
+
+// Release WebSocket
+void ReleaseWs(WS *w)
+{
+ if (w == NULL)
+ {
+ return;
+ }
+
+ if (Release(w->Ref) == 0)
+ {
+ CleanupWs(w);
+ }
+}
+
+void CleanupWs(WS *w)
+{
+ if (w == NULL)
+ {
+ return;
+ }
+
+ if (w->Sock != NULL)
+ {
+ Disconnect(w->Sock);
+ ReleaseSock(w->Sock);
+ }
+
+ FreeWsp(w->Wsp);
+
+ Free(w);
+}
+
+// WebSocket: Send a frame in sync mode
+bool WsSendSync(WS *w, void *data, UINT size)
+{
+ UCHAR *send_buf;
+ UINT send_buf_size;
+ if (size == 0)
+ {
+ return !w->Disconnected;
+ }
+ if (w == NULL || data == NULL)
+ {
+ return false;
+ }
+ if (w->Disconnected || w->Wsp->HasError)
+ {
+ Disconnect(w->Sock);
+ return false;
+ }
+
+ WriteFifo(w->Wsp->AppSendFifo, data, size);
+ WspTry(w->Wsp);
+ if (w->Wsp->HasError == false)
+ {
+ send_buf = FifoPtr(w->Wsp->PhysicalSendFifo);
+ send_buf_size = FifoSize(w->Wsp->PhysicalSendFifo);
+ if (SendAll(w->Sock, send_buf, send_buf_size, w->Sock->SecureMode))
+ {
+ ReadFifo(w->Wsp->PhysicalSendFifo, NULL, send_buf_size);
+ return true;
+ }
+ }
+
+ w->Disconnected = true;
+ Disconnect(w->Sock);
+
+ return false;
+}
+
+// WebSocket: Send a frame in async mode
+UINT WsSendAsync(WS *w, void *data, UINT size)
+{
+ bool disconnected = false;
+ UINT ret = 0;
+ if (size == 0)
+ {
+ return !w->Disconnected;
+ }
+ if (w == NULL || data == NULL)
+ {
+ return 0;
+ }
+ if (w->Disconnected || w->Wsp->HasError)
+ {
+ Disconnect(w->Sock);
+ return 0;
+ }
+
+ if (FifoSize(w->Wsp->PhysicalSendFifo) > w->Wsp->MaxBufferSize)
+ {
+ return INFINITE;
+ }
+
+ WriteFifo(w->Wsp->AppSendFifo, data, size);
+
+ if (WsTrySendAsync(w) == false)
+ {
+ ret = 0;
+ }
+ else
+ {
+ ret = size;
+ }
+
+ if (ret == 0)
+ {
+ w->Disconnected = true;
+ Disconnect(w->Sock);
+ }
+
+ return ret;
+}
+
+// WebSocket: Send buffered streams in async mode
+bool WsTrySendAsync(WS *w)
+{
+ bool ret = false;
+ if (w == NULL)
+ {
+ return false;
+ }
+ if (w->Disconnected || w->Wsp->HasError)
+ {
+ Disconnect(w->Sock);
+ return false;
+ }
+
+ WspTry(w->Wsp);
+
+ if (w->Wsp->HasError == false)
+ {
+ while (true)
+ {
+ UINT send_size = FifoSize(w->Wsp->PhysicalSendFifo);
+ UINT r;
+ if (send_size == 0)
+ {
+ ret = true;
+ break;
+ }
+
+ r = Send(w->Sock, FifoPtr(w->Wsp->PhysicalSendFifo), send_size, w->Sock->SecureMode);
+
+ if (r == INFINITE)
+ {
+ ret = true;
+ break;
+ }
+ else if (r == 0)
+ {
+ ret = false;
+ break;
+ }
+ else
+ {
+ ReadFifo(w->Wsp->PhysicalSendFifo, NULL, r);
+ }
+ }
+ }
+ else
+ {
+ ret = false;
+ }
+
+ if (ret == 0)
+ {
+ w->Disconnected = true;
+ Disconnect(w->Sock);
+ }
+
+ return ret;
+}
+
+// WebSocket: Receive a frame in async mode
+UINT WsRecvAsync(WS *w, void *data, UINT size)
+{
+ bool disconnected = false;
+ UINT ret = 0;
+ if (w == NULL || data == NULL || size == 0)
+ {
+ return 0;
+ }
+ if (w->Disconnected || w->Wsp->HasError)
+ {
+ Disconnect(w->Sock);
+ return 0;
+ }
+
+ // Receive all arrived data from the socket
+ while (FifoSize(w->Wsp->PhysicalRecvFifo) < w->MaxBufferSize)
+ {
+ UINT r;
+
+ r = Recv(w->Sock, w->TmpBuf, sizeof(w->TmpBuf), w->Sock->SecureMode);
+ if (r == 0)
+ {
+ // Disconnected
+ disconnected = true;
+ break;
+ }
+ else if (r == INFINITE)
+ {
+ // Pending
+ break;
+ }
+ else
+ {
+ // Received some data
+ WriteFifo(w->Wsp->PhysicalRecvFifo, w->TmpBuf, r);
+ }
+ }
+
+ if (disconnected == false)
+ {
+ UINT sz;
+ WspTry(w->Wsp);
+ if (w->Wsp->HasError)
+ {
+ disconnected = true;
+ }
+ else
+ {
+ sz = FifoSize(w->Wsp->AppRecvFifo);
+ if (sz >= 1)
+ {
+ if (sz > size)
+ {
+ sz = size;
+ }
+ ReadFifo(w->Wsp->AppRecvFifo, data, sz);
+ ret = sz;
+ }
+ else
+ {
+ ret = INFINITE;
+ }
+ }
+ }
+
+ if (disconnected)
+ {
+ w->Disconnected = true;
+ Disconnect(w->Sock);
+ ret = 0;
+ }
+
+ return ret;
+}
+
+// WebSocket: Receive a frame in sync mode until fulfill the buffer
+bool WsRecvSyncAll(WS *w, void *data, UINT size)
+{
+ UINT recv_size;
+ if (w == NULL || data == NULL || size == 0)
+ {
+ return false;
+ }
+
+ recv_size = 0;
+
+ while (true)
+ {
+ UINT sz, ret;
+
+ sz = size - recv_size;
+ ret = WsRecvSync(w, (UCHAR *)data + recv_size, sz);
+ if (ret == 0)
+ {
+ return false;
+ }
+ recv_size += ret;
+ if (recv_size >= size)
+ {
+ return true;
+ }
+ }
+}
+
+// WebSocket: Receive a frame in sync mode
+UINT WsRecvSync(WS *w, void *data, UINT size)
+{
+ if (w == NULL || data == NULL || size == 0)
+ {
+ return 0;
+ }
+ if (w->Disconnected || w->Wsp->HasError)
+ {
+ Disconnect(w->Sock);
+ return 0;
+ }
+
+ while (w->Disconnected == false || w->Wsp->HasError == false)
+ {
+ UINT r;
+ UINT sz;
+ WspTry(w->Wsp);
+ if (w->Wsp->HasError)
+ {
+ break;
+ }
+ sz = FifoSize(w->Wsp->AppRecvFifo);
+ if (sz >= 1)
+ {
+ if (sz > size)
+ {
+ sz = size;
+ }
+ ReadFifo(w->Wsp->AppRecvFifo, data, sz);
+ return sz;
+ }
+ r = Recv(w->Sock, w->TmpBuf, sizeof(w->TmpBuf), w->Sock->SecureMode);
+ if (r == 0)
+ {
+ break;
+ }
+ WriteFifo(w->Wsp->PhysicalRecvFifo, w->TmpBuf, r);
+ }
+
+ w->Disconnected = true;
+ Disconnect(w->Sock);
+
+ return 0;
+}
+
+// New WebSocket protocol
+WSP *NewWsp()
+{
+ WSP *p = ZeroMalloc(sizeof(WSP));
+
+ p->AppRecvFifo = NewFifo();
+ p->AppSendFifo = NewFifo();
+ p->PhysicalRecvFifo = NewFifo();
+ p->PhysicalSendFifo = NewFifo();
+
+ p->MaxBufferSize = MAX_BUFFERING_PACKET_SIZE;
+
+ return p;
+}
+
+// Free WebSocket protocol
+void FreeWsp(WSP *p)
+{
+ if (p == NULL)
+ {
+ return;
+ }
+
+ ReleaseFifo(p->AppRecvFifo);
+ ReleaseFifo(p->AppSendFifo);
+ ReleaseFifo(p->PhysicalRecvFifo);
+ ReleaseFifo(p->PhysicalSendFifo);
+
+ Free(p);
+}
+
+// WebSocket protocol: Try to interpret send/recv buffers
+void WspTry(WSP *p)
+{
+ if (p == NULL)
+ {
+ return;
+ }
+
+ // Physical -> App
+ while (p->HasError == false)
+ {
+ UINT read_buffer_size;
+ BLOCK *b = WspTryRecvNextFrame(p, &read_buffer_size);
+ if (b == NULL)
+ {
+ // No more frames
+ break;
+ }
+
+ if (b->Param1 == WS_OPCODE_CONTINUE || b->Param1 == WS_OPCODE_TEXT || b->Param1 == WS_OPCODE_BIN)
+ {
+ WriteFifo(p->AppRecvFifo, b->Buf, b->Size);
+ }
+ else if (b->Param1 == WS_OPCODE_PING)
+ {
+ if (FifoSize(p->PhysicalSendFifo) <= p->MaxBufferSize)
+ {
+ WspTrySendFrame(p, WS_OPCODE_PONG, b->Buf, b->Size);
+ }
+ }
+ else if (b->Param1 == WS_OPCODE_PONG)
+ {
+ }
+ else
+ {
+ // Error: disconnect
+ p->HasError = true;
+ }
+
+ ReadFifo(p->PhysicalRecvFifo, NULL, read_buffer_size);
+
+ FreeBlock(b);
+ }
+
+ // App -> Physical
+ while (p->HasError == false)
+ {
+ UINT size;
+ UCHAR *data;
+
+ size = FifoSize(p->AppSendFifo);
+ if (size == 0)
+ {
+ // No more data
+ break;
+ }
+
+ if (size > WS_SEND_SINGLE_FRAGMENT_SIZE)
+ {
+ size = WS_SEND_SINGLE_FRAGMENT_SIZE;
+ }
+ data = FifoPtr(p->AppSendFifo);
+
+ WspTrySendFrame(p, WS_OPCODE_BIN, data, size);
+
+ ReadFifo(p->AppSendFifo, NULL, size);
+ }
+}
+
+// WebSocket protocol: Try to send a single frame
+void WspTrySendFrame(WSP *p, UCHAR opcode, void *data, UINT size)
+{
+ BUF *b;
+ UCHAR flag_and_opcode;
+ if (p == NULL || (size != 0 && data == NULL))
+ {
+ return;
+ }
+ if (p->HasError)
+ {
+ return;
+ }
+
+ b = NewBuf();
+
+ flag_and_opcode = 0x80 | (opcode & 0x0F);
+ WriteBufChar(b, flag_and_opcode);
+
+ if (size <= 125)
+ {
+ WriteBufChar(b, size);
+ }
+ else if (size <= 65536)
+ {
+ WriteBufChar(b, 126);
+ WriteBufShort(b, size);
+ }
+ else
+ {
+ WriteBufChar(b, 127);
+ WriteBufInt64(b, size);
+ }
+
+ WriteBuf(b, data, size);
+
+ WriteFifo(p->PhysicalSendFifo, b->Buf, b->Size);
+
+ FreeBuf(b);
+}
+
+// WebSocket protocol: Try to receive a single frame
+BLOCK *WspTryRecvNextFrame(WSP *p, UINT *read_buffer_size)
+{
+ BLOCK *b;
+ UCHAR *buf;
+ UCHAR *buf_pos0;
+ UINT sz;
+ UCHAR flag_and_opcode;
+ UCHAR mask_and_payload_len;
+ UCHAR mask_flag;
+ UINT payload_len;
+ UCHAR mask_key[4];
+ UCHAR *ret_data;
+ if (p == NULL || read_buffer_size == NULL)
+ {
+ return NULL;
+ }
+ if (p->HasError)
+ {
+ return NULL;
+ }
+
+ buf = buf_pos0 = FifoPtr(p->PhysicalRecvFifo);
+ sz = FifoSize(p->PhysicalRecvFifo);
+
+ if (sz < 1)
+ {
+ return NULL;
+ }
+ flag_and_opcode = *buf;
+ buf += 1;
+ sz -= 1;
+
+ if (sz < 1)
+ {
+ return NULL;
+ }
+ mask_and_payload_len = *buf;
+ buf += 1;
+ sz -= 1;
+
+ mask_flag = mask_and_payload_len & 0x80;
+ payload_len = mask_and_payload_len & 0x7F;
+ if (payload_len == 126)
+ {
+ if (sz < sizeof(USHORT))
+ {
+ return NULL;
+ }
+ payload_len = READ_USHORT(buf);
+ buf += sizeof(USHORT);
+ sz -= sizeof(USHORT);
+ }
+ else if (payload_len == 127)
+ {
+ UINT64 u64;
+ if (sz < sizeof(UINT64))
+ {
+ return NULL;
+ }
+ u64 = READ_UINT64(buf);
+ buf += sizeof(UINT64);
+ sz -= sizeof(UINT64);
+ if (u64 > 0x7FFFFFFF)
+ {
+ p->HasError = true;
+ return NULL;
+ }
+ payload_len = (UINT)u64;
+ }
+
+ if (payload_len > WS_MAX_PAYLOAD_LEN_PER_FRAME)
+ {
+ p->HasError = true;
+ return NULL;
+ }
+
+ if (mask_flag)
+ {
+ if (sz < 4)
+ {
+ return NULL;
+ }
+ Copy(mask_key, buf, 4);
+ buf += 4;
+ sz -= 4;
+ }
+
+ if (payload_len >= 1 && sz < payload_len)
+ {
+ return NULL;
+ }
+
+ ret_data = Clone(buf, payload_len);
+ sz -= payload_len;
+ buf += payload_len;
+
+ if (mask_flag)
+ {
+ UINT i;
+ for (i = 0;i < payload_len;i++)
+ {
+ ret_data[i] ^= mask_key[i % 4];
+ }
+ }
+
+ b = NewBlock(ret_data, payload_len, 0);
+ b->Param1 = (flag_and_opcode & 0xF);
+
+ *read_buffer_size = (UINT)(buf - buf_pos0);
+
+ return b;
+}
+
+// WebSocket: Receive a PACK serialized with JSON
+PACK *WsRecvPack(WS *w)
+{
+ USHORT us;
+ UINT size;
+ UCHAR *buf;
+ PACK *p = NULL;
+ if (w == NULL)
+ {
+ return NULL;
+ }
+
+ if (WsRecvSyncAll(w, &us, sizeof(us)))
+ {
+ size = Endian16(us);
+
+ buf = ZeroMalloc(size + 1);
+
+ if (WsRecvSyncAll(w, buf, size))
+ {
+ p = JsonStrToPack(buf);
+ }
+
+ Free(buf);
+ }
+
+ return p;
+}
+
+// WebSocket: Send a PACK serialized with JSON
+bool WsSendPack(WS *w, PACK *p)
+{
+ BUF *b;
+ char *json_str;
+ bool ret = false;
+ if (w == NULL || p == NULL)
+ {
+ return false;
+ }
+
+ json_str = PackToJsonStr(p);
+ if (json_str == NULL)
+ {
+ return false;
+ }
+
+ b = NewBuf();
+
+ WriteBufShort(b, StrLen(json_str));
+ WriteBuf(b, json_str, StrLen(json_str));
+
+ ret = WsSendSync(w, b->Buf, b->Size);
+
+ FreeBuf(b);
+
+ Free(json_str);
+
+ return ret;
+}
+
+// WebSocket: new error pack
+PACK *WsNewErrorPack(UINT err)
+{
+ PACK *p = NewPack();
+ char *error_code_str = WsErrorCodeToString(err);
+ wchar_t *error_message = _E(err);
+
+ PackAddStr(p, "Error", error_code_str);
+ PackAddUniStr(p, "ErrorMessage", error_message);
+
+ return p;
+}
+
+// MVPN: convert error code to string
+char *WsErrorCodeToString(UINT err)
+{
+ char *ret = "e_unknown";
+ switch (err)
+ {
+ case ERR_NO_ERROR:
+ ret = "ok";
+ break;
+ case ERR_PROTOCOL_ERROR:
+ ret = "e_protocol";
+ break;
+ case ERR_INTERNAL_ERROR:
+ ret = "e_internal";
+ break;
+ case ERR_DISCONNECTED:
+ case ERR_AUTO_DISCONNECTED:
+ ret = "e_disconnected";
+ break;
+ case ERR_ACCESS_DENIED:
+ ret = "e_access_denied";
+ break;
+ case ERR_HUB_NOT_FOUND:
+ ret = "e_network_not_found";
+ break;
+ case ERR_HUB_STOPPING:
+ ret = "e_network_disabled";
+ break;
+ case ERR_AUTH_FAILED:
+ ret = "e_auth_failed";
+ break;
+ case ERR_SESSION_TIMEOUT:
+ ret = "e_timeout";
+ break;
+ case ERR_USER_CANCEL:
+ ret = "e_user_cancel";
+ break;
+ case ERR_AUTHTYPE_NOT_SUPPORTED:
+ ret = "e_auth_method_not_supported";
+ break;
+ case ERR_TOO_MANY_CONNECTION:
+ ret = "e_too_many_connection";
+ break;
+ case ERR_HUB_IS_BUSY:
+ ret = "e_too_many_session";
+ break;
+ case ERR_TOO_MANY_USER_SESSION:
+ ret = "e_too_many_user_session";
+ break;
+ case ERR_OBJECT_NOT_FOUND:
+ ret = "e_object_not_found";
+ break;
+ case ERR_NOT_SUPPORTED:
+ case ERR_NOT_SUPPORTED_AUTH_ON_OPENSOURCE:
+ ret = "e_not_supported";
+ break;
+ case ERR_INVALID_PARAMETER:
+ ret = "e_invalid_parameter";
+ break;
+ case ERR_NULL_PASSWORD_LOCAL_ONLY:
+ ret = "e_empty_password_local_only";
+ break;
+ case ERR_MONITOR_MODE_DENIED:
+ ret = "e_mirror_mode_denied";
+ break;
+ case ERR_BRIDGE_MODE_DENIED:
+ ret = "e_bridge_mode_denied";
+ break;
+ case ERR_IP_ADDRESS_DENIED:
+ ret = "e_client_ip_address_denied";
+ break;
+ case ERR_MSCHAP2_PASSWORD_NEED_RESET:
+ ret = "e_user_password_must_reset";
+ break;
+ }
+ return ret;
+}
+
+// MVPN processing a client
+UINT MvpnDoAccept(CONNECTION *c, WS *w)
+{
+ UINT ret = ERR_INTERNAL_ERROR;
+ PACK *client_hello = NULL;
+ UINT client_ver = 0;
+ char client_impl[256];
+ UCHAR client_nonce[128];
+ char client_hub_name[MAX_HUBNAME_LEN + 1];
+ UINT server_ver = 0;
+ char server_impl[256];
+ UCHAR server_nonce[128];
+ PACK *server_hello = NULL;
+ UINT auth_ret = ERR_INTERNAL_ERROR;
+ IPC *ipc = NULL;
+ UINT i;
+ UINT heartbeat_interval = 0;
+ UINT disconnect_timeout = 0;
+ bool use_udp_acceleration = false;
+ IP client_udp_acceleration_ip = {0};
+ UINT client_udp_acceleration_port = 0;
+ UCHAR client_udp_acceleration_key[UDP_ACCELERATION_COMMON_KEY_SIZE_V2] = {0};
+ UDP_ACCEL *udp_accel = NULL;
+
+ if (c == NULL || w == NULL)
+ {
+ return ERR_INTERNAL_ERROR;
+ }
+
+ Rand(server_nonce, sizeof(server_nonce));
+
+ // Phase 1: Receive a Client Hello packet
+ client_hello = WsRecvPack(w);
+ if (client_hello == NULL)
+ {
+ ret = ERR_PROTOCOL_ERROR;
+ goto LABEL_CLEANUP;
+ }
+ client_ver = PackGetInt(client_hello, "MvpnProtocolVersion");
+ if (client_ver < MVPN_VERSION_MIN)
+ {
+ ret = ERR_PROTOCOL_ERROR;
+ goto LABEL_CLEANUP;
+ }
+ server_ver = MIN(MVPN_VERSION_CURRENT, client_ver);
+ if (PackGetData2(client_hello, "Nonce", client_nonce, 128) == false)
+ {
+ ret = ERR_PROTOCOL_ERROR;
+ goto LABEL_CLEANUP;
+ }
+ if (PackGetStr(client_hello, "Implementation", client_impl, sizeof(client_impl)) == false)
+ {
+ ret = ERR_PROTOCOL_ERROR;
+ goto LABEL_CLEANUP;
+ }
+ heartbeat_interval = PackGetInt(client_hello, "HeartBeatInterval");
+
+ if (heartbeat_interval == 0) heartbeat_interval = MVPN_HEARTBEAT_INTERVAL_DEFAULT;
+ heartbeat_interval = MAKESURE(heartbeat_interval, MVPN_HEARTBEAT_INTERVAL_MIN, MVPN_HEARTBEAT_INTERVAL_MAX);
+
+ disconnect_timeout = PackGetInt(client_hello, "DisconnectTimeout");
+ if (disconnect_timeout == 0) disconnect_timeout = MVPN_DISCONNECT_TIMEOUT_DEFAULT;
+ disconnect_timeout = MAKESURE(disconnect_timeout, MVPN_DISCONNECT_TIMEOUT_MIN, MVPN_DISCONNECT_TIMEOUT_MAX);
+
+ heartbeat_interval = MIN(heartbeat_interval, disconnect_timeout / 2);
+
+ use_udp_acceleration = PackGetBool(client_hello, "UseUdpAcceleration");
+ if (use_udp_acceleration)
+ {
+ client_udp_acceleration_port = PackGetInt(client_hello, "UdpAccelerationClientPort");
+ if (client_udp_acceleration_port == 0 ||
+ PackGetIp(client_hello, "UdpAccelerationClientIp", &client_udp_acceleration_ip) == false ||
+ PackGetData2(client_hello, "UdpAccelerationClientKey", client_udp_acceleration_key, sizeof(client_udp_acceleration_key)) == false)
+ {
+ use_udp_acceleration = false;
+ }
+ }
+
+
+ Zero(client_hub_name, sizeof(client_hub_name));
+ PackGetStr(client_hello, "NetworkName", client_hub_name, sizeof(client_hub_name));
+
+ // Phase 2: Send a Server Hello packet
+ server_hello = WsNewErrorPack(ERR_NO_ERROR);
+ StrCpy(server_impl, sizeof(server_impl), "Test Server");
+ PackAddInt(server_hello, "MvpnProtocolVersion", server_ver);
+ PackAddData(server_hello, "Nonce", server_nonce, 128);
+ PackAddStr(server_hello, "Implementation", server_impl);
+ PackAddStr(server_hello, "SupportedAuthMethod", MVPN_AUTHTYPE_ALL_SUPPORTED);
+ if (WsSendPack(w, server_hello) == false)
+ {
+ ret = ERR_DISCONNECTED;
+ goto LABEL_CLEANUP;
+ }
+
+ // Phase 3: Receive a Client Auth packet
+ for (i = 0;i < MVPN_MAX_AUTH_RETRY;i++)
+ {
+ bool auth_finish = false;
+ PACK *client_auth = NULL;
+ char auth_method[64] = {0};
+ char auth_username[MAX_USERNAME_LEN + 1];
+ IPC *ipc_tmp = NULL;
+ IPC_PARAM ipc_param;
+ UINT ipc_error_code = 0;
+ UINT mss = INFINITE;
+
+ auth_ret = ERR_INTERNAL_ERROR;
+
+ client_auth = WsRecvPack(w);
+ if (client_auth == NULL)
+ {
+ auth_ret = ERR_PROTOCOL_ERROR;
+ goto LABEL_EXIT_AUTH_RETRY;
+ }
+
+ PackGetStr(client_auth, "AuthMethod", auth_method, sizeof(auth_method));
+ if (IsEmptyStr(auth_method))
+ {
+ auth_ret = ERR_PROTOCOL_ERROR;
+ goto LABEL_EXIT_AUTH_RETRY;
+ }
+
+ PackGetStr(client_auth, "AuthUsername", auth_username, sizeof(auth_username));
+ if (IsEmptyStr(auth_method))
+ {
+ auth_ret = ERR_PROTOCOL_ERROR;
+ goto LABEL_EXIT_AUTH_RETRY;
+ }
+
+ Zero(&ipc_param, sizeof(ipc_param));
+ StrCpy(ipc_param.ClientName, sizeof(ipc_param.ClientName), MVPN_CLIENT_NAME);
+
+ if (IsEmptyStr(client_impl) == false)
+ {
+ StrCat(ipc_param.ClientName, sizeof(ipc_param.ClientName), " - ");
+ StrCat(ipc_param.ClientName, sizeof(ipc_param.ClientName), client_impl);
+ }
+
+ StrCpy(ipc_param.Postfix, sizeof(ipc_param.Postfix), NVPN_POSTFIX);
+ StrCpy(ipc_param.HubName, sizeof(ipc_param.HubName), client_hub_name);
+ StrCpy(ipc_param.UserName, sizeof(ipc_param.UserName), auth_username);
+ CopyIP(&ipc_param.ClientIp, &w->Sock->RemoteIP);
+ ipc_param.ClientPort, w->Sock->RemotePort;
+ CopyIP(&ipc_param.ServerIp, &w->Sock->LocalIP);
+ ipc_param.ServerPort, w->Sock->LocalPort;
+ StrCpy(ipc_param.ClientHostname, sizeof(ipc_param.ClientHostname), w->Sock->RemoteHostname);
+ StrCpy(ipc_param.CryptName, sizeof(ipc_param.CryptName), w->Sock->CipherName);
+ ipc_param.Layer = IPC_LAYER_3; // TODO
+ ipc_param.BridgeMode = false; // TODO
+
+ // MSS
+ if (udp_accel != NULL) mss = MIN(mss, UdpAccelCalcMss(udp_accel));
+ if (mss == INFINITE)
+ {
+ mss = 0;
+ }
+ ipc_param.Mss = mss;
+
+ if (StrCmpi(auth_method, MVPN_AUTHTYPE_ANONYMOUS) == 0)
+ {
+ // Anonymous
+ }
+ else if (StrCmpi(auth_method, MVPN_AUTHTYPE_PASSWORD_PLAIN) == 0)
+ {
+ // Plaintext
+ char pw[MAX_PASSWORD_LEN + 1];
+ PackGetStr(client_auth, "AuthPlainPassword", pw, sizeof(pw));
+ StrCpy(ipc_param.Password, sizeof(ipc_param.Password), pw);
+ }
+ else
+ {
+ // Unknown auth method
+ auth_ret = ERR_AUTHTYPE_NOT_SUPPORTED;
+ goto LABEL_EXIT_AUTH_RETRY;
+ }
+
+ ipc_tmp = NewIPCByParam(c->Cedar, &ipc_param, &ipc_error_code);
+
+ if (ipc_tmp == NULL)
+ {
+ auth_ret = ipc_error_code;
+ goto LABEL_EXIT_AUTH_RETRY;
+ }
+ else
+ {
+ ipc = ipc_tmp;
+ auth_finish = true;
+ }
+
+ auth_ret = ERR_NO_ERROR;
+
+LABEL_EXIT_AUTH_RETRY:
+ if (auth_ret != ERR_NO_ERROR)
+ {
+ // Phase 4: Send a Server Auth Response
+ PACK *error_pack = WsNewErrorPack(auth_ret);
+ UINT remain_retry = MVPN_MAX_AUTH_RETRY - 1 - i;
+ PackAddInt(error_pack, "RetryAllowedCount", remain_retry);
+ WsSendPack(w, error_pack);
+ FreePack(error_pack);
+ }
+ FreePack(client_auth);
+ if (auth_finish)
+ {
+ break;
+ }
+ }
+
+ if (ipc != NULL)
+ {
+ AddProtocolDetailsStr(ipc->IpcSessionShared->ProtocolDetails, sizeof(ipc->IpcSessionShared->ProtocolDetails),
+ "ModernVPN");
+ AddProtocolDetailsKeyValueStr(ipc->IpcSessionShared->ProtocolDetails, sizeof(ipc->IpcSessionShared->ProtocolDetails),
+ "Transport", "TCP_WebSocket");
+ }
+
+ if (ipc != NULL && use_udp_acceleration)
+ {
+ udp_accel = NewUdpAccel(c->Cedar, (c->FirstSock->IsRUDPSocket ? NULL : &c->FirstSock->LocalIP),
+ false, false, false);
+
+ udp_accel->Version = 2;
+
+ udp_accel->FastDetect = true;
+ udp_accel->ReadRawFlagMode = true;
+
+ if (UdpAccelInitServer(udp_accel, client_udp_acceleration_key,
+ &client_udp_acceleration_ip, client_udp_acceleration_port, NULL) == false)
+ {
+ FreeUdpAccel(udp_accel);
+ udp_accel = NULL;
+ }
+ }
+
+ if (ipc != NULL)
+ {
+ // Phase 4: Send auth OK response
+ PACK *ok_pack = WsNewErrorPack(ERR_NO_ERROR);
+ PackAddInt(ok_pack, "HeartBeatInterval", heartbeat_interval);
+ PackAddInt(ok_pack, "DisconnectTimeout", disconnect_timeout);
+ PackAddStr(ok_pack, "NetworkName", ipc->HubName);
+ if (udp_accel != NULL)
+ {
+ PackAddBool(ok_pack, "UseUdpAcceleration", true);
+ PackAddIp(ok_pack, "UdpAccelerationServerIp", &udp_accel->MyIp);
+ PackAddInt(ok_pack, "UdpAccelerationServerPort", udp_accel->MyPort);
+ PackAddData(ok_pack, "UdpAccelerationServerKey", udp_accel->MyKey_V2, sizeof(udp_accel->MyKey_V2));
+ PackAddInt(ok_pack, "UdpAccelerationServerCookie", udp_accel->MyCookie);
+ PackAddInt(ok_pack, "UdpAccelerationClientCookie", udp_accel->YourCookie);
+ }
+ else
+ {
+ PackAddBool(ok_pack, "UseUdpAcceleration", false);
+ }
+ WsSendPack(w, ok_pack);
+ FreePack(ok_pack);
+
+ // Session main loop
+ if (true)
+ {
+ SOCK *sock = w->Sock;
+ SOCK_EVENT *sock_event = NewSockEvent();
+ FIFO *send_fifo = NewFifo();
+ FIFO *recv_fifo = NewFifo();
+ bool has_error = false;
+ UINT magic_number = Endian32(MVPN_PACKET_MAGIC_NUMBER);
+ UINT64 last_sent_heartbeat = 0;
+ UINT tmp_buf_size = 256000;
+ UCHAR *tmp_buf = ZeroMalloc(tmp_buf_size);
+ UINT64 last_comm_recv = Tick64();
+
+ SetTimeout(sock, TIMEOUT_INFINITE);
+ JoinSockToSockEvent(sock, sock_event);
+ if (udp_accel != NULL)
+ {
+ JoinSockToSockEvent(udp_accel->UdpSock, sock_event);
+ }
+ IPCSetSockEventWhenRecvL2Packet(ipc, sock_event);
+
+ while (true)
+ {
+ UINT next_interval = INFINITE;
+ UINT send_ret = 0;
+ UINT64 now = Tick64();
+ UINT r;
+
+ if (udp_accel != NULL)
+ {
+ UdpAccelSetTick(udp_accel, now);
+ UdpAccelPoll(udp_accel);
+ ipc->IpcSessionShared->EnableUdpAccel = true;
+ ipc->IpcSessionShared->UsingUdpAccel = UdpAccelIsSendReady(udp_accel, true);
+ }
+ else
+ {
+ ipc->IpcSessionShared->EnableUdpAccel = false;
+ ipc->IpcSessionShared->UsingUdpAccel = false;
+ }
+
+ // Send heartbeat
+ if (last_sent_heartbeat == 0 || (last_sent_heartbeat + (UINT64)heartbeat_interval) <= now)
+ {
+ last_sent_heartbeat = now;
+ if (FifoSize(send_fifo) <= MAX_BUFFERING_PACKET_SIZE)
+ {
+ UCHAR packet_type = MVPN_PACKET_TYPE_HEARTBEAT;
+ USHORT packet_size = 0;
+ WriteFifo(send_fifo, &magic_number, 4);
+ WriteFifo(send_fifo, &packet_type, 1);
+ WriteFifo(send_fifo, &packet_size, 2);
+ }
+ }
+
+ // IPC --> send_fifo or UDP accelerator
+ while (true)
+ {
+ BLOCK *l2_packet = IPCRecvL2(ipc);
+ UCHAR packet_type;
+ USHORT packet_size;
+ if (l2_packet == NULL)
+ {
+ break;
+ }
+ if (UdpAccelIsSendReady(udp_accel, true))
+ {
+ // Send via UDP accelerator
+ UdpAccelSend(udp_accel, l2_packet->Buf, l2_packet->Size,
+ MVPN_PACKET_TYPE_ETHERNET, udp_accel->MaxUdpPacketSize,
+ false);
+ }
+ else
+ {
+ // Send via WebSocket
+ if (FifoSize(send_fifo) <= MAX_BUFFERING_PACKET_SIZE)
+ {
+ packet_size = Endian16(l2_packet->Size);
+ packet_type = MVPN_PACKET_TYPE_ETHERNET;
+ WriteFifo(send_fifo, &magic_number, 4);
+ WriteFifo(send_fifo, &packet_type, 1);
+ WriteFifo(send_fifo, &packet_size, 2);
+ WriteFifo(send_fifo, l2_packet->Buf, (USHORT)l2_packet->Size);
+ }
+ }
+ FreeBlock(l2_packet);
+ }
+
+ // send_fifo --> MVPN Client
+ while (FifoSize(send_fifo) >= 1)
+ {
+ UINT r = WsSendAsync(w, ((UCHAR *)send_fifo->p) + send_fifo->pos, send_fifo->size);
+ if (r == 0)
+ {
+ has_error = true;
+ break;
+ }
+ else if (r == INFINITE)
+ {
+ break;
+ }
+ else
+ {
+ ReadFifo(send_fifo, NULL, r);
+ }
+ }
+
+ if (WsTrySendAsync(w) == false)
+ {
+ has_error = true;
+ }
+
+ // MVPN Client --> recv_fifo
+ while (FifoSize(recv_fifo) <= MAX_BUFFERING_PACKET_SIZE)
+ {
+ r = WsRecvAsync(w, tmp_buf, tmp_buf_size);
+ if (r == 0)
+ {
+ has_error = true;
+ break;
+ }
+ else if (r == INFINITE)
+ {
+ break;
+ }
+ else
+ {
+ //Debug("recv %u\n", r);
+ WriteFifo(recv_fifo, tmp_buf, r);
+ }
+ }
+
+ // recv_fifo --> IPC
+ while (true)
+ {
+ UINT u32;
+ UINT packet_size;
+ UCHAR packet_type;
+ UCHAR *packet_data;
+ if (FifoSize(recv_fifo) < 7)
+ {
+ break;
+ }
+ packet_size = READ_USHORT(FifoPtr(recv_fifo) + 5);
+ if (FifoSize(recv_fifo) < (7 + packet_size))
+ {
+ break;
+ }
+
+ ReadFifo(recv_fifo, &u32, 4);
+ if (u32 != magic_number)
+ {
+ break;
+ }
+
+ ReadFifo(recv_fifo, &packet_type, 1);
+ ReadFifo(recv_fifo, NULL, 2);
+
+ packet_data = Malloc(packet_size);
+
+ ReadFifo(recv_fifo, packet_data, packet_size);
+
+ if (packet_type == MVPN_PACKET_TYPE_ETHERNET)
+ {
+ IPCSendL2(ipc, packet_data, packet_size);
+ }
+
+ Free(packet_data);
+
+ last_comm_recv = now;
+ }
+
+ // UDP Accel --> IPC
+ if (udp_accel != NULL)
+ {
+ while (true)
+ {
+ UINT packet_size;
+ UCHAR packet_type;
+ UCHAR *packet_data;
+ BLOCK *b = GetNext(udp_accel->RecvBlockQueue);
+ if (b == NULL)
+ {
+ break;
+ }
+
+ packet_type = b->RawFlagRetUdpAccel;
+ packet_data = b->Buf;
+ packet_size = b->Size;
+
+ if (packet_type == MVPN_PACKET_TYPE_ETHERNET)
+ {
+ IPCSendL2(ipc, packet_data, packet_size);
+ }
+
+ FreeBlock(b);
+ }
+ }
+
+ if (IsIPCConnected(ipc) == false)
+ {
+ has_error = true;
+ }
+
+ if (now > (last_comm_recv + (UINT64)disconnect_timeout))
+ {
+ has_error = true;
+ }
+
+ IPCProcessInterrupts(ipc);
+
+ if (has_error)
+ {
+ break;
+ }
+
+ // Wait until the next event occurs
+ next_interval = GetNextIntervalForInterrupt(ipc->Interrupt);
+ next_interval = MIN(next_interval, SELECT_TIME);
+ next_interval = MIN(next_interval, (UINT)((last_sent_heartbeat + (UINT64)heartbeat_interval) - now));
+ WaitSockEvent(sock_event, next_interval);
+ }
+
+ ReleaseSockEvent(sock_event);
+ ReleaseFifo(send_fifo);
+ ReleaseFifo(recv_fifo);
+ Free(tmp_buf);
+ }
+ }
+
+LABEL_CLEANUP:
+ if (ret != ERR_NO_ERROR)
+ {
+ PACK *ret_pack = WsNewErrorPack(ret);
+ WsSendPack(w, ret_pack);
+ FreePack(ret_pack);
+ }
+ FreeUdpAccel(udp_accel);
+ FreeIPC(ipc);
+ FreePack(client_hello);
+ FreePack(server_hello);
+
+ return 0;
+}
+
+
+
+
+
+
+
+
diff --git a/src/Cedar/Protocol.h b/src/Cedar/Protocol.h
index 94db6240..3ee86867 100644
--- a/src/Cedar/Protocol.h
+++ b/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
diff --git a/src/Cedar/Radius.c b/src/Cedar/Radius.c
index 689ef65b..bcbac5d4 100644
--- a/src/Cedar/Radius.c
+++ b/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;
}
diff --git a/src/Cedar/Radius.h b/src/Cedar/Radius.h
index 286f24a8..712b6003 100644
--- a/src/Cedar/Radius.h
+++ b/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
diff --git a/src/Cedar/Remote.c b/src/Cedar/Remote.c
index cbcae112..5cc45630 100644
--- a/src/Cedar/Remote.c
+++ b/src/Cedar/Remote.c
@@ -113,13 +113,21 @@ 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)
{
return;
}
- Disconnect(rpc->Sock);
+ if (no_disconnect == false)
+ {
+ Disconnect(rpc->Sock);
+ }
+
ReleaseSock(rpc->Sock);
DeleteLock(rpc->Lock);
diff --git a/src/Cedar/Remote.h b/src/Cedar/Remote.h
index 4052c678..b0b6be3c 100644
--- a/src/Cedar/Remote.h
+++ b/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
diff --git a/src/Cedar/SM.c b/src/Cedar/SM.c
index 26b957d9..8741c505 100644
--- a/src/Cedar/SM.c
+++ b/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);
diff --git a/src/Cedar/SMInner.h b/src/Cedar/SMInner.h
index f8d09b17..b9982ded 100644
--- a/src/Cedar/SMInner.h
+++ b/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);
diff --git a/src/Cedar/SW.c b/src/Cedar/SW.c
index f022dd90..e1f7ef62 100644
--- a/src/Cedar/SW.c
+++ b/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;
diff --git a/src/Cedar/Server.c b/src/Cedar/Server.c
index 98bfa571..31f4cb67 100644
--- a/src/Cedar/Server.c
+++ b/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);
diff --git a/src/Cedar/Server.h b/src/Cedar/Server.h
index 55bf6016..4618eee5 100644
--- a/src/Cedar/Server.h
+++ b/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
};
diff --git a/src/Cedar/Session.c b/src/Cedar/Session.c
index 5116ff70..6a44a1ab 100644
--- a/src/Cedar/Session.c
+++ b/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;
diff --git a/src/Cedar/Session.h b/src/Cedar/Session.h
index 4a74b0f8..d2704994 100644
--- a/src/Cedar/Session.h
+++ b/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);
diff --git a/src/Cedar/UdpAccel.c b/src/Cedar/UdpAccel.c
index a9597bf7..dc9b0c33 100644
--- a/src/Cedar/UdpAccel.c
+++ b/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
{
diff --git a/src/Cedar/UdpAccel.h b/src/Cedar/UdpAccel.h
index 0c9dc32e..876c55e6 100644
--- a/src/Cedar/UdpAccel.h
+++ b/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);
diff --git a/src/Cedar/VLanWin32.c b/src/Cedar/VLanWin32.c
index 6cdc22ec..dae66a99 100644
--- a/src/Cedar/VLanWin32.c
+++ b/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)
{
diff --git a/src/CurrentBuild.txt b/src/CurrentBuild.txt
index 2be2e762..3d94c7e4 100644
--- a/src/CurrentBuild.txt
+++ b/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
diff --git a/src/Ham/generated_manual_cn.html b/src/Ham/generated_manual_cn.html
new file mode 100644
index 00000000..4ccc1725
--- /dev/null
+++ b/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>
diff --git a/src/Ham/generated_manual_ja.html b/src/Ham/generated_manual_ja.html
new file mode 100644
index 00000000..2c456a28
--- /dev/null
+++ b/src/Ham/generated_manual_ja.html
@@ -0,0 +1,9862 @@
+
+
+
+
+
+
+
+
+
+
+------ 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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 ã®ç¾åœ¨ã®çŠ¶æ…‹ã‚’リアルタイムã«å–å¾—ã—ã¾ã™ã€‚サーãƒãƒ¼ä¸Šã«å­˜åœ¨ã™ã‚‹å„種オブジェクトã®å€‹æ•°ã‚„ã€ãƒ‡ãƒ¼ã‚¿é€šä¿¡ã®çµ±è¨ˆæƒ…å ±ãªã©ã‚’å–å¾—ã§ãã¾ã™ã€‚ã¾ãŸã€OS ã«ã‚ˆã£ã¦ã¯ç¾åœ¨ã‚³ãƒ³ãƒ”ュータã§ä½¿ç”¨ã•ã‚Œã¦ã„るメモリé‡ãªã©ã‚’å–å¾—ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚</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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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>ãªãŠã€ç¾åœ¨ã®ç™»éŒ²ã•ã‚Œã¦ã„ã‚‹ TCP リスナーã®ä¸€è¦§ã¯ã€ListenerList コマンドã§å–å¾—ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<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>ãªãŠã€ç¾åœ¨ã®ç™»éŒ²ã•ã‚Œã¦ã„ã‚‹ TCP リスナーã®ä¸€è¦§ã¯ã€ListenerList コマンドã§å–å¾—ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<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>ListenerList</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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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>ãªãŠã€ç¾åœ¨ã®ç™»éŒ²ã•ã‚Œã¦ã„ã‚‹ TCP リスナーã®ä¸€è¦§ã¯ã€ListenerList コマンドã§å–å¾—ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<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>ãªãŠã€ç¾åœ¨ã®ç™»éŒ²ã•ã‚Œã¦ã„ã‚‹ TCP リスナーã®ä¸€è¦§ã¯ã€ListenerList コマンドã§å–å¾—ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 をインストールã—ãŸçŠ¶æ…‹ã§ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ã‚¹ã‚¿ãƒ³ãƒ‰ã‚¢ãƒ­ãƒ³ã‚µãƒ¼ãƒãƒ¼ãƒ¢ãƒ¼ãƒ‰ã«ãªã‚Šã¾ã™ã€‚特ã«ã‚¯ãƒ©ã‚¹ã‚¿ã‚’構æˆã™ã‚‹äºˆå®šãŒãªã„å ´åˆã¯ã€ã‚¹ã‚¿ãƒ³ãƒ‰ã‚¢ãƒ­ãƒ³ã‚µãƒ¼ãƒãƒ¼ãƒ¢ãƒ¼ãƒ‰ã§å‹•ä½œã•ã›ã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™ã€‚<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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 ã§ã‚¯ãƒ©ã‚¹ã‚¿ãƒªãƒ³ã‚°ã‚’構築ã™ã‚‹å ´åˆã«ãŠã‘ã‚‹ã€å„クラスタメンãƒã‚µãƒ¼ãƒãƒ¼ã®ä¸­å¿ƒã¨ãªã‚‹ã‚³ãƒ³ãƒ”ュータã§ã€ã‚¯ãƒ©ã‚¹ã‚¿å†…ã« 1 å°å¿…è¦ã§ã™ã€‚åŒä¸€ã‚¯ãƒ©ã‚¹ã‚¿ã‚’構æˆã™ã‚‹ä»–ã®ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¡ãƒ³ãƒã‚µãƒ¼ãƒãƒ¼ã¯ã€ã‚¯ãƒ©ã‚¹ã‚¿ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ©ã«æŽ¥ç¶šã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã‚¯ãƒ©ã‚¹ã‚¿ãƒ¡ãƒ³ãƒã¨ã—ã¦ã®å‹•ä½œã‚’開始ã—ã¾ã™ã€‚<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 ã§ã™ã€‚ãŸã¨ãˆã°ã€ä»–ã®ãƒ¡ãƒ³ãƒãŒ 100 ã®çŠ¶æ…‹ã§ã€1 å°ã ã‘ 200 ã«ã™ã‚‹ã¨ã€ä»–ã®ãƒ¡ãƒ³ãƒã® 2 å€æŽ¥ç¶šã‚’å—ã‘æŒã¤ã‚ˆã†ã«ãƒ­ãƒ¼ãƒ‰ãƒãƒ©ãƒ³ã‚·ãƒ³ã‚°æ™‚ã«èª¿æ•´ã•ã‚Œã¾ã™ã€‚値㯠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 アドレスã¨ãƒãƒ¼ãƒˆç•ªå·ã€ã“ã® VPN Server ã®å…¬é–‹ IP アドレスãŠã‚ˆã³å…¬é–‹ãƒãƒ¼ãƒˆç•ªå· (å¿…è¦ãªå ´åˆ)ã€ãŠã‚ˆã³ãƒ‘スワードをå•ã„åˆã‚ã›ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚<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">
+ ã“ã®ã‚µãƒ¼ãƒãƒ¼ã®å…¬é–‹ãƒãƒ¼ãƒˆç•ªå·ã®ä¸€è¦§ã‚’指定ã—ã¾ã™ã€‚公開ãƒãƒ¼ãƒˆç•ªå·ã¯ã€å°‘ãªãã¨ã‚‚ 1 ã¤ä»¥ä¸Šè¨­å®šã™ã‚‹å¿…è¦ãŒã‚ã‚Šã€è¤‡æ•°å€‹è¨­å®šã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚ãã®å ´åˆã¯ã€"/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 ã®çŠ¶æ…‹ã§ã€1 å°ã ã‘ 200 ã«ã™ã‚‹ã¨ã€ä»–ã®ãƒ¡ãƒ³ãƒã® 2 å€ã®æŽ¥ç¶šã‚’å—ã‘æŒã¤ã‚ˆã†ã«èª¿æ•´ã•ã‚Œã¾ã™ã€‚値㯠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 コãƒã‚¯ã‚·ãƒ§ãƒ³æ•°]ã€[動作仮想 HUB æ•°]ã€[消費クライアント接続ライセンス]ã€[消費ブリッジ接続ライセンス] ã®ä¸€è¦§ã‚‚å–å¾—ã—ã¾ã™ã€‚<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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 æ•°]ã€[1 個目ã®ä»®æƒ³ 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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 ãŒæŽ¥ç¶šã—ãŸã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«å¯¾ã—ã¦æ示ã™ã‚‹ SSL 証明書ã®ç§˜å¯†éµã‚’å–å¾—ã—ã¾ã™ã€‚秘密éµã¯ã€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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 ãŒãƒ¡ãƒ¢ãƒªå†…ã«ä¿æœ‰ã—ã¦ã„る未ä¿å­˜ã®ãƒ‡ãƒ¼ã‚¿ã¯ã™ã¹ã¦å¤±ã‚ã‚Œã¾ã™ã€‚<BR>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹å‰ã«ã€Flush コマンドを実行ã—ã¦VPN Server / Bridge ã®æœªä¿å­˜ã®è¨­å®šãƒ‡ãƒ¼ã‚¿ã‚’設定ファイルã«å¼·åˆ¶ä¿å­˜ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚<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 / 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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.3.26 "KeepEnable": インターãƒãƒƒãƒˆæŽ¥ç¶šã®ç¶­æŒæ©Ÿèƒ½ã®æœ‰åŠ¹åŒ–</h3>
+ <table border="1" cellspacing="0" width="100%" 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">
+ インターãƒãƒƒãƒˆæŽ¥ç¶šã®ç¶­æŒæ©Ÿèƒ½ã®æœ‰åŠ¹åŒ–</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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.3.28 "KeepSet": インターãƒãƒƒãƒˆæŽ¥ç¶šã®ç¶­æŒæ©Ÿèƒ½ã®è¨­å®š</h3>
+ <table border="1" cellspacing="0" width="100%" 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">
+ インターãƒãƒƒãƒˆæŽ¥ç¶šã®ç¶­æŒæ©Ÿèƒ½ã®è¨­å®š</td>
+ </tr>
+ <tr>
+ <td class="tableStandard" width="125"><b>説明</b></td>
+ <td class="tableStandard" width="453" style="background-color: #FFFFFF">
+ [インターãƒãƒƒãƒˆæŽ¥ç¶šã®ç¶­æŒæ©Ÿèƒ½] ã®æŽ¥ç¶šå…ˆãƒ›ã‚¹ãƒˆåãªã©ã®è¨­å®šã‚’è¡Œãªã„ã¾ã™ã€‚一定期間無通信状態ãŒç¶šãã¨è‡ªå‹•çš„ã«æŽ¥ç¶šãŒåˆ‡æ–­ã•ã‚Œã‚‹ã‚ˆã†ãªãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶šç’°å¢ƒã§ã€[インターãƒãƒƒãƒˆæŽ¥ç¶šã®ç¶­æŒæ©Ÿèƒ½] を使用ã™ã‚‹ã¨ã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆä¸Šã®ä»»æ„ã®ã‚µãƒ¼ãƒãƒ¼ã«å¯¾ã—ã¦ã€ä¸€å®šé–“éš”ã”ã¨ã«ãƒ‘ケットをé€ä¿¡ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šã‚’維æŒã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<BR>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã§ã¯ã€é€šä¿¡å…ˆã® [ホストå]ã€[ãƒãƒ¼ãƒˆç•ªå·]ã€[パケットé€å‡ºé–“éš”]ã€ãŠã‚ˆã³ [プロトコル] を指定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<BR>インターãƒãƒƒãƒˆæŽ¥ç¶šç¶­æŒã®ãŸã‚ã«é€ä¿¡ã•ã‚Œã‚‹ãƒ‘ケットã¯ã€ãƒ©ãƒ³ãƒ€ãƒ ãªå†…容ã§ã‚ã‚Šã€ã‚³ãƒ³ãƒ”ュータやユーザーを識別ã™ã‚‹å€‹äººæƒ…å ±ãªã©ãŒé€ä¿¡ã•ã‚Œã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“。<BR>インターãƒãƒƒãƒˆæŽ¥ç¶šã®ç¶­æŒæ©Ÿèƒ½ã¯ã€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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.3.30 "SyslogEnable": syslog é€ä¿¡æ©Ÿèƒ½ã®è¨­å®š</h3>
+ <table border="1" cellspacing="0" width="100%" 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">
+ syslog é€ä¿¡æ©Ÿèƒ½ã®è¨­å®š</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>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 セキュリティログを syslog ã§é€ä¿¡ã€‚
+3: サーãƒãƒ¼ã€ä»®æƒ³ HUB セキュリティãŠã‚ˆã³ãƒ‘ケットログを syslog ã§é€ä¿¡ã€‚</td>
+ </tr>
+ <tr>
+ <td class="tableStandard" width="125"><i>/HOST</i></td>
+ <td class="tableStandard" width="453" style="background-color: #FFFFFF">
+ [ホストå:ãƒãƒ¼ãƒˆç•ªå·] ã®å½¢å¼ã§ã€syslog サーãƒãƒ¼ã®ãƒ›ã‚¹ãƒˆåã€ã¾ãŸã¯ IP アドレスã¨ãƒãƒ¼ãƒˆç•ªå·ã‚’指定ã—ã¾ã™ã€‚ãƒãƒ¼ãƒˆç•ªå·ã‚’çœç•¥ã™ã‚‹ã¨ 514 を使用ã—ã¾ã™ã€‚</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.3.31 "SyslogDisable": syslog é€ä¿¡æ©Ÿèƒ½ã®ç„¡åŠ¹åŒ–</h3>
+ <table border="1" cellspacing="0" width="100%" 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">
+ syslog é€ä¿¡æ©Ÿèƒ½ã®ç„¡åŠ¹åŒ–</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>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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.3.32 "SyslogGet": syslog é€ä¿¡æ©Ÿèƒ½ã®å–å¾—</h3>
+ <table border="1" cellspacing="0" width="100%" 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">
+ syslog é€ä¿¡æ©Ÿèƒ½ã®å–å¾—</td>
+ </tr>
+ <tr>
+ <td class="tableStandard" width="125"><b>説明</b></td>
+ <td class="tableStandard" width="453" style="background-color: #FFFFFF">
+ syslog é€ä¿¡æ©Ÿèƒ½ã®ç¾åœ¨ã®è¨­å®šå†…容をå–å¾—ã—ã¾ã™ã€‚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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã«ã¯ã€VPN Server ã®ç®¡ç†è€…権é™ãŒå¿…è¦ã§ã™ã€‚</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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã«ã¯ã€VPN Server ã®ç®¡ç†è€…権é™ãŒå¿…è¦ã§ã™ã€‚</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">
+ ローカルブリッジ接続ã§ã€ãƒ–リッジ先ã®ãƒ‡ãƒã‚¤ã‚¹ã¨ã—ã¦ä½¿ç”¨ã§ãã‚‹ Ethernet デãƒã‚¤ã‚¹ (LAN カード) ã®ä¸€è¦§ã‚’å–å¾—ã—ã¾ã™ã€‚<BR>ã“ã“ã§è¡¨ç¤ºã•ã‚Œã‚‹ãƒ‡ãƒã‚¤ã‚¹åã¯ã€BridgeCreate コマンドã§ä½¿ç”¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<BR>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã«ã¯ã€VPN Server ã®ç®¡ç†è€…権é™ãŒå¿…è¦ã§ã™ã€‚</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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 åã¨ã€ãƒ–リッジ先㮠Ethernet デãƒã‚¤ã‚¹ (LAN カード) åã€ã¾ãŸã¯ tap デãƒã‚¤ã‚¹åãŠã‚ˆã³å‹•ä½œçŠ¶æ³ãŒå–å¾—ã§ãã¾ã™ã€‚</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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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>ローカルブリッジを使用ã™ã‚‹ã¨ã€ã“ã® VPN Server 上ã§å‹•ä½œã™ã‚‹ä»®æƒ³ HUB ã¨ã€ç‰©ç†çš„㪠Ethernet デãƒã‚¤ã‚¹ (LAN カード) ã¨ã®é–“ã§ãƒ¬ã‚¤ãƒ¤ 2 ブリッジ接続を構æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<BR>システム㫠tap デãƒã‚¤ã‚¹ (仮想ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹) を作æˆã—ã€ä»®æƒ³ HUB ã¨ã®é–“ã§ãƒ–リッジ接続ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ (tap デãƒã‚¤ã‚¹ã¯ Linux 版ã®ã¿ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™)。<BR>ブリッジ先㮠Ethernet デãƒã‚¤ã‚¹ (LAN カード) ã«ã¯ã€ç¨¼åƒä¸­ã®ä»»æ„ã® LAN カードã¨ã®é–“ã§ãƒ–リッジã§ãã¾ã™ãŒã€é«˜è² è·ç’°å¢ƒã«ãŠã„ã¦ã¯ãƒ–リッジ専用㫠LAN カードを用æ„ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚<BR>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã«ã¯ã€VPN Server ã®ç®¡ç†è€…権é™ãŒå¿…è¦ã§ã™ã€‚</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 åを指定ã™ã‚‹ã¨ã€ãã®ä»®æƒ³ HUB ãŒå®Ÿéš›ã«å‹•ä½œã‚’開始ã—ãŸéš›ã«ãƒ­ãƒ¼ã‚«ãƒ«ãƒ–リッジ接続ãŒæœ‰åŠ¹ã«ãªã‚Šã¾ã™ã€‚</td>
+ </tr>
+ <tr>
+ <td class="tableStandard" width="125"><i>/DEVICE</i></td>
+ <td class="tableStandard" width="453" style="background-color: #FFFFFF">
+ ブリッジ先㮠Ethernet デãƒã‚¤ã‚¹ (LAN カード) åã€ã¾ãŸã¯ tap デãƒã‚¤ã‚¹åを指定ã—ã¾ã™ã€‚Ethernet デãƒã‚¤ã‚¹åã®ä¸€è¦§ã¯ã€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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã«ã¯ã€VPN Server ã®ç®¡ç†è€…権é™ãŒå¿…è¦ã§ã™ã€‚</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 ã®æ©Ÿèƒ½ã‚„能力ã¯ã€å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã®ã‚¨ãƒ‡ã‚£ã‚·ãƒ§ãƒ³ã‚„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ã‚ˆã£ã¦ç•°ãªã‚Šã¾ã™ã€‚コマンドライン管ç†ãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£ã«ã‚るコマンドã§ã‚‚ã€æŽ¥ç¶šå…ˆã® VPN Server ã®æ©Ÿèƒ½ã‚„能力ã«ã‚ˆã£ã¦ã¯å‹•ä½œã—ãªã„å ´åˆãŒã‚ã‚Šã¾ã™ã€‚ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€æŽ¥ç¶šå…ˆã® 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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 サービスプログラムã®ã¿ãŒå†èµ·å‹•ã•ã‚Œã€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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 スイッãƒã®åå‰ã‚’指定ã—ã¾ã™ã€‚æ—¢ã«å­˜åœ¨ã™ã‚‹ä»®æƒ³ãƒ¬ã‚¤ãƒ¤ 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>1 ã¤ã®ä»®æƒ³ãƒ¬ã‚¤ãƒ¤ 3 スイッãƒã«ã¯ã€è¤‡æ•°å€‹ã®ä»®æƒ³ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹ã¨ãƒ«ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ãƒ†ãƒ¼ãƒ–ルを定義ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<BR>仮想インターフェイスã¯ä»®æƒ³ HUB ã«é–¢é€£ä»˜ã‘られã€ä»®æƒ³ HUB ãŒå‹•ä½œã—ã¦ã„ã‚‹ã¨ãã«ã€ä»®æƒ³ HUB 内㧠1 å°ã® IP ホストã®ã‚ˆã†ã«å‹•ä½œã—ã¾ã™ã€‚複数ã®ä»®æƒ³ HUB ã«å¯¾ã—ã¦ã€ãã‚Œãžã‚Œåˆ¥ã€…ã® 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>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>1 ã¤ã®ä»®æƒ³ãƒ¬ã‚¤ãƒ¤ 3 スイッãƒã«ã¯ã€è¤‡æ•°å€‹ã®ä»®æƒ³ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹ã¨ãƒ«ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ãƒ†ãƒ¼ãƒ–ルを定義ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<BR>仮想インターフェイスã¯ä»®æƒ³ HUB ã«é–¢é€£ä»˜ã‘られã€ä»®æƒ³ HUB ãŒå‹•ä½œã—ã¦ã„ã‚‹ã¨ãã«ã€ä»®æƒ³ HUB 内㧠1 å°ã® IP ホストã®ã‚ˆã†ã«å‹•ä½œã—ã¾ã™ã€‚複数ã®ä»®æƒ³ HUB ã«å¯¾ã—ã¦ã€ãã‚Œãžã‚Œåˆ¥ã€…ã® IP ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«æ‰€å±žã™ã‚‹ä»®æƒ³ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹ãŒå®šç¾©ã•ã‚Œã¦ã„ã‚‹ã¨ãã€ãれらã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹é–“㧠IP ルーティングãŒè‡ªå‹•çš„ã«è¡Œã‚ã‚Œã¾ã™ã€‚<BR>仮想インターフェイスãŒæ‰€å±žã™ã‚‹ IP ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ç©ºé–“ã¨ã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹è‡ªèº«ã® IP アドレスを定義ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚<BR>ã¾ãŸã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹ãŒæŽ¥ç¶šã™ã‚‹å…ˆã®ä»®æƒ³ HUB åを指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚<BR>仮想 HUB åã«ã¯ç¾åœ¨å­˜åœ¨ã—ã¦ã„ãªã„仮想 HUB を指定ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚<BR>仮想インターフェイスã¯ã€ä»®æƒ³ HUB 内㧠1 ã¤ã® IP アドレスをæŒã¤å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã¾ãŸã€ãã® IP アドレスã®å±žã™ã‚‹ IP ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®ã‚µãƒ–ãƒãƒƒãƒˆãƒžã‚¹ã‚¯ã‚’指定ã™ã‚‹å¿…è¦ã‚‚ã‚ã‚Šã¾ã™ã€‚<BR>複数ã®ä»®æƒ³ HUB 内㮠IP 空間åŒå£«ã®ä»®æƒ³ãƒ¬ã‚¤ãƒ¤ 3 スイッãƒã‚’経由ã—ãŸãƒ«ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã¯ã€ã“ã“ã§æŒ‡å®šã—㟠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 åを指定ã™ã‚‹ã¨ã€ãã®ä»®æƒ³ 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">
+ 指定ã—ãŸä»®æƒ³ãƒ¬ã‚¤ãƒ¤ 3 スイッãƒå†…ã«ã€ã™ã§ã«å®šç¾©ã•ã‚Œã¦ã„る仮想インターフェイスを削除ã—ã¾ã™ã€‚<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 アドレスãŒã€å„仮想インターフェイスã®æ‰€å±žã™ã‚‹ 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">
+ メトリック値を指定ã—ã¾ã™ã€‚1 以上ã®æ•´æ•°ã§æŒ‡å®šã—ã¦ãã ã•ã„。</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">
+ メトリック値を指定ã—ã¾ã™ã€‚1 以上ã®æ•´æ•°ã§æŒ‡å®šã—ã¦ãã ã•ã„。</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 ã®ã‚³ãƒ³ãƒ”ュータ上ã«ä¿å­˜ã•ã‚Œã¦ã„ã‚‹ã€VPN Server ãŒå‡ºåŠ›ã—ãŸãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã®ä¸€è¦§ã‚’表示ã—ã¾ã™ã€‚ã“ã“ã§è¡¨ç¤ºã•ã‚Œã‚‹ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ•ã‚¡ã‚¤ãƒ«åを指定ã—㦠LogFileGet コマンドを呼ã³å‡ºã™ã“ã¨ã«ã‚ˆã‚Šã€ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã®å†…容をダウンロードã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚<BR>VPN Server ã«ã‚µãƒ¼ãƒãƒ¼ç®¡ç†ãƒ¢ãƒ¼ãƒ‰ã§æŽ¥ç¶šã—ã¦ã„ã‚‹å ´åˆã¯ã€ã™ã¹ã¦ã®ä»®æƒ³ HUB ã®ãƒ‘ケットログã€ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒ­ã‚°ã€ãŠã‚ˆã³ VPN Server ã®ã‚µãƒ¼ãƒãƒ¼ ログを表示ã¾ãŸã¯ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<BR>仮想 HUB 管ç†ãƒ¢ãƒ¼ãƒ‰ã§æŽ¥ç¶šã—ã¦ã„ã‚‹å ´åˆã¯ã€ç®¡ç†å¯¾è±¡ã®ä»®æƒ³ 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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 ãŠã‚ˆã³ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¡ãƒ³ãƒã‚µãƒ¼ãƒãƒ¼ã¨ã—ã¦å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã§ã¯å‹•ä½œã—ã¾ã›ã‚“。<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">
+ 作æˆã™ã‚‹ä»®æƒ³ 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.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 ã«å¤‰æ›´ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ã™ã§ã« 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>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 を削除ã™ã‚‹ã¨ã€ç¾åœ¨ä»®æƒ³ HUB ã«æŽ¥ç¶šã—ã¦ã„るセッションãŒã™ã¹ã¦åˆ‡æ–­ã•ã‚Œã€æ–°ãŸãªã‚»ãƒƒã‚·ãƒ§ãƒ³ãŒä»®æƒ³ 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 ã®ç¨®é¡žã‚’スタティック仮想 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 ã®ç¨®é¡žã‚’スタティック仮想 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 ã®ç¨®é¡žã‚’変更ã™ã‚‹ã¨ã€ç¾åœ¨ä»®æƒ³ HUB ã«æŽ¥ç¶šã—ã¦ã„ã‚‹ã™ã¹ã¦ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã¯ä¸€æ—¦åˆ‡æ–­ã•ã‚Œã¾ã™ã€‚<BR>スタティック仮想 HUB ã¨ã—ã¦å‹•ä½œã—ã¦ã„る仮想 HUB ãŒã‚ã‚‹å ´åˆã€ã™ã¹ã¦ã®ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¡ãƒ³ãƒã‚µãƒ¼ãƒãƒ¼ä¸Šã§ã€ãã®åå‰ã®ä»®æƒ³ HUB ãŒç”Ÿæˆã•ã‚Œã¾ã™ã€‚ãã®ä»®æƒ³ HUB ã«æŽ¥ç¶šã—よã†ã¨ã—ãŸãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã€å„サーãƒãƒ¼ã®è² è·çŠ¶æ³ã‚’å…ƒã«ã—ãŸã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã«ã‚ˆã£ã¦ã€ãã®ä»®æƒ³ HUB をホスティングã—ã¦ã„ã‚‹ã€ã„ãšã‚Œã‹ã®ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¡ãƒ³ãƒã«æŽ¥ç¶šã•ã‚Œã¾ã™ã€‚<BR>スタティック仮想 HUB ã¯ã€ä¸€ä¾‹ã¨ã—ã¦ã€ä¼æ¥­ã«ãŠã‘るインターãƒãƒƒãƒˆã‹ã‚‰ç¤¾å†… LAN ã¸ã®ãƒªãƒ¢ãƒ¼ãƒˆã‚¢ã‚¯ã‚»ã‚¹ç”¨é€”ã«ãŠã„ã¦ã€åŒæ™‚ã«æ•°åƒï½žæ•°ä¸‡å˜ä½ã®å¤§é‡ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒåŒæ™‚ã«æŽ¥ç¶šã™ã‚‹å¯èƒ½æ€§ãŒã‚るリモートアクセス VPN 用ã«åˆ©ç”¨ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚<BR>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã«ã¯ã€VPN Server ã®ç®¡ç†è€…権é™ãŒå¿…è¦ã§ã™ã€‚<BR>ã¾ãŸã€ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ VPN Bridge ãŠã‚ˆã³ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¡ãƒ³ãƒã‚µãƒ¼ãƒãƒ¼ã€ã¾ãŸã¯ã‚¹ã‚¿ãƒ³ãƒ‰ã‚¢ãƒ­ãƒ³ã‚µãƒ¼ãƒãƒ¼ã¨ã—ã¦å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã§ã¯å‹•ä½œã—ã¾ã›ã‚“。<BR>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ãƒ“ルド 5190 より新ã—ã„ VPN Server ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。</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 ã«è¨­å®šã™ã‚‹ä»®æƒ³ HUB ã®åå‰ã‚’指定ã—ã¾ã™ã€‚</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.3.62 "HubSetDynamic": 仮想 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">HubSetDynamic</font></b></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">
+ VPN Server ãŒã‚¯ãƒ©ã‚¹ã‚¿å†…ã§å‹•ä½œã—ã¦ã„ã‚‹å ´åˆã€ä»®æƒ³ HUB ã®ç¨®é¡žã‚’ã€ãƒ€ã‚¤ãƒŠãƒŸãƒƒã‚¯ä»®æƒ³ HUB ã«è¨­å®šã—ã¾ã™ã€‚仮想 HUB ã®ç¨®é¡žã‚’変更ã™ã‚‹ã¨ã€ç¾åœ¨ä»®æƒ³ HUB ã«æŽ¥ç¶šã—ã¦ã„ã‚‹ã™ã¹ã¦ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã¯ä¸€æ—¦åˆ‡æ–­ã•ã‚Œã¾ã™ã€‚<BR>クラスタ内ã«å®šç¾©ã•ã‚Œã¦ã„るダイナミック仮想 HUB ã«ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒ 1 å°ã‚‚接続ã—ã¦ã„ãªã„ã¨ãã€ãã®ä»®æƒ³ HUB ã¯ã©ã®ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¡ãƒ³ãƒä¸Šã«ã‚‚存在ã—ã¾ã›ã‚“。ダイナミック仮想 HUB ã« 1 å°ç›®ã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒæŽ¥ç¶šã—よã†ã¨ã™ã‚‹ã¨ã€ã‚¯ãƒ©ã‚¹ã‚¿å†…ã§æœ€ã‚‚è² è·ã®ä½Žã„サーãƒãƒ¼ãŒãã®ä»®æƒ³ HUB をホスティングã—ã¾ã™ã€‚2 å°ç›®ä»¥é™ã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒãã®ä»®æƒ³ HUB ã«æŽ¥ç¶šã—よã†ã¨ã™ã‚‹ã¨ã€ä»®æƒ³ HUB をホスティングã—ã¦ã„るサーãƒãƒ¼ã«è‡ªå‹•çš„ã«æŽ¥ç¶šã—ã¾ã™ã€‚å„ダイナミック仮想 HUB ã¯ã€ã™ã¹ã¦ã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒåˆ‡æ–­ã™ã‚‹ã¨ã€ã©ã®ã‚µãƒ¼ãƒãƒ¼ã«ã‚‚実体ãŒå­˜åœ¨ã—ãªã„状態ã«æˆ»ã‚Šã¾ã™ã€‚<BR>ダイナミック仮想 HUB ã®å¿œç”¨ä¾‹ã¯å¹…広ãã€ãŸã¨ãˆã°ç¤¾å†…ã«ãŠã„ã¦éƒ¨èª²æ¯Žã«ä»®æƒ³ HUB を定義ã—ã¦ãŠãã€å„社員ãŒè‡ªåˆ†ãŒæ‰€å±žã—ã¦ã„る部課ã®ä»®æƒ³ HUB ã«æŽ¥ç¶šã—ã¦ä½œæ¥­ã‚’è¡Œã†ã¨ã„ã£ãŸã“ã¨ã‚’ã€å˜ä¸€ã®ã‚¯ãƒ©ã‚¹ã‚¿ã‚’設置ã™ã‚‹ã ã‘ã§ã€é›†ä¸­ç®¡ç†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<BR>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã«ã¯ã€VPN Server ã®ç®¡ç†è€…権é™ãŒå¿…è¦ã§ã™ã€‚<BR>ã¾ãŸã€ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ VPN Bridge ãŠã‚ˆã³ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¡ãƒ³ãƒã‚µãƒ¼ãƒãƒ¼ã€ã¾ãŸã¯ã‚¹ã‚¿ãƒ³ãƒ‰ã‚¢ãƒ­ãƒ³ã‚µãƒ¼ãƒãƒ¼ã¨ã—ã¦å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã§ã¯å‹•ä½œã—ã¾ã›ã‚“。<BR>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ãƒ“ルド 5190 より新ã—ã„ VPN Server ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。</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 ã«è¨­å®šã™ã‚‹ä»®æƒ³ 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 ã¯åˆ—挙ã•ã‚Œã¾ã›ã‚“。サーãƒãƒ¼ç®¡ç†ãƒ¢ãƒ¼ãƒ‰ã§æŽ¥ç¶šã—ã¦ã„ã‚‹å ´åˆã¯ã€ã™ã¹ã¦ã®ä»®æƒ³ 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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 ã‚’ Hub コマンドã§é¸æŠžã—ã¦ãŠãå¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚<BR>VPN Server ã«ä»®æƒ³ HUB 管ç†ãƒ¢ãƒ¼ãƒ‰ã§æŽ¥ç¶šã—ã¦ã„る状態ã§ã¯ã€ç®¡ç†å¯¾è±¡ã¨ãªã£ã¦ã„ã‚‹ 1 ã¤ã®ä»®æƒ³ 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 bit ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚<BR>証明書ã®ç¨®é¡žã¨ã—ã¦ã€ãƒ«ãƒ¼ãƒˆè¨¼æ˜Žæ›¸ (自己署å証明書) ã¨ä»–ã®è¨¼æ˜Žæ›¸ã«ã‚ˆã£ã¦ç½²åã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã®ã©ã¡ã‚‰ã§ã‚‚作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ä»–ã®è¨¼æ˜Žæ›¸ã«ã‚ˆã£ã¦ç½²åã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã‚’作æˆã™ã‚‹ãŸã‚ã«ã¯ã€ç½²åã«ä½¿ç”¨ã™ã‚‹è¨¼æ˜Žæ›¸ (X.509 å½¢å¼ã®ãƒ•ã‚¡ã‚¤ãƒ«) ã¨å¯¾å¿œã™ã‚‹ç§˜å¯†éµãƒ•ã‚¡ã‚¤ãƒ« (Base 64 エンコード) ãŒå¿…è¦ã§ã™ã€‚<BR><BR>作æˆã™ã‚‹è¨¼æ˜Žæ›¸ã«ã¯ã€åå‰ (CN)ã€æ‰€å±žæ©Ÿé–¢ (O)ã€çµ„ç¹”å˜ä½ (OU)ã€å›½ (C)ã€éƒ½é“府県 (ST)ã€ãƒ­ãƒ¼ã‚«ãƒ« (L)ã€ã‚·ãƒªã‚¢ãƒ«ç•ªå·ã€æœ‰åŠ¹æœŸé™ã‚’指定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<BR>作æˆã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã¯ X.509 å½¢å¼ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¨ã—ã¦ã€ç§˜å¯†éµãƒ•ã‚¡ã‚¤ãƒ«ã¯ RSA 1024 bit å½¢å¼ã® 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 bit ã®å…¬é–‹éµã‚’å«ã‚“ã  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 bit ã®ç§˜å¯†éµãƒ•ã‚¡ã‚¤ãƒ«ã¨ã—ã¦ä¿å­˜ã•ã‚Œã¾ã™ã€‚</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 ã® 2 ã¤ã®ã‚³ãƒžãƒ³ãƒ‰ã¨ã—ã¦åˆ©ç”¨ã—ã€IP ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã§æŽ¥ç¶šã•ã‚ŒãŸ 2 å°ã®ã‚³ãƒ³ãƒ”ュータã®é–“ã§ä¼é€ã™ã‚‹ã“ã¨ãŒã§ãる通信スループットを計測ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã™ã§ã«åˆ¥ã®ã‚³ãƒ³ãƒ”ュータ上ã§ã€TrafficServer コマンドを用ã„ã¦é€šä¿¡ã‚¹ãƒ«ãƒ¼ãƒ—ット測定ツールサーãƒãƒ¼ã‚’å¾…æ©Ÿã•ã›ã¦ãŠãã€TrafficClient コマンドã§ã€ãã®ã‚µãƒ¼ãƒãƒ¼ã®ãƒ›ã‚¹ãƒˆåã¾ãŸã¯ IP アドレスã¨ãƒãƒ¼ãƒˆç•ªå·ã‚’指定ã—ã¦æŽ¥ç¶šã—ã€é€šä¿¡é€Ÿåº¦ã‚’測定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<BR>通信速度ã®æ¸¬å®šã¯ã€åŒæ™‚ã«è¤‡æ•°æœ¬ã® TCP コãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’確立ã—ã€ãã‚Œãžã‚Œã®ã‚³ãƒã‚¯ã‚·ãƒ§ãƒ³ã§æœ€å¤§é™ã«ã‚¹ãƒˆãƒªãƒ¼ãƒ ãƒ‡ãƒ¼ã‚¿ã‚’ä¼é€ã—ãŸçµæžœã€æŒ‡å®šã•ã‚ŒãŸæ™‚間内ã«å®Ÿéš›ã«ä¼é€ã™ã‚‹ã“ã¨ãŒã§ããŸãƒ‡ãƒ¼ã‚¿ã®ãƒ“ット数を計算ã—ã€ãれを元ã«é€šä¿¡ã‚¹ãƒ«ãƒ¼ãƒ—ットã®å¹³å‡å€¤ (bps) を算出ã™ã‚‹æ–¹æ³•ã§è¡Œã‚ã‚Œã¾ã™ã€‚通常ã€1 本㮠TCP コãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’用ã„ãŸå ´åˆã¯ TCP ã®ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ä¸Šã®é™ç•Œã«ã‚ˆã‚Šã€å®Ÿéš›ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¹ãƒ«ãƒ¼ãƒ—ットよりもé…ã„速度ã§ã—ã‹é€šä¿¡ã§ããªã„å ´åˆãŒå¤šã„ãŸã‚ã€è¤‡æ•°æœ¬ã® TCP コãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’åŒæ™‚ã«ç¢ºç«‹ã—ã¦é€šä¿¡ã—ãŸçµæžœã‚’測定ã™ã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™ã€‚ã“ã®æ¸¬å®šæ–¹æ³•ã«ã‚ˆã£ã¦è¨ˆæ¸¬ã•ã‚ŒãŸã‚¹ãƒ«ãƒ¼ãƒ—ットã¯å®Ÿéš›ã« TCP ã§ã‚¹ãƒˆãƒªãƒ¼ãƒ ã¨ã—ã¦å—ä¿¡å´ã«å±Šã„ãŸãƒ‡ãƒ¼ã‚¿ã®ãƒ“ット長ã‹ã‚‰è¨ˆç®—ã•ã‚Œã‚‹ãŸã‚ã€é€”中ã§ç™ºç”Ÿã—ãŸãƒ‘ケットロスやデータ破æã—ãŸãƒ‘ケットã¯ã€å®Ÿéš›ã«å±Šã„ãŸãƒ‘ケットã«ã¯å«ã¾ã‚Œãšã€ç´”粋ãªãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®æœ€å¤§é€šä¿¡å¯èƒ½å¸¯åŸŸå¹…ã«è¿‘ã„値を算出ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<BR>測定çµæžœã¨ã—㦠TCP 内ã§ä¼é€ã•ã‚ŒãŸã‚¹ãƒˆãƒªãƒ¼ãƒ ã‚µã‚¤ã‚ºã‹ã‚‰ã€å®Ÿéš›ã«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã‚’æµã‚ŒãŸãƒ‡ãƒ¼ã‚¿é‡ã®è¿‘似値を計算ã—ã€ãれを時間ã§å‰²ã£ã¦ãƒ“ット毎秒 (bps) を算出ã—ã¾ã™ã€‚物ç†çš„ãªãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®ç¨®é¡žã¯ Ethernet (IEEE802.3) ã§ã€MAC フレームã®ãƒšã‚¤ãƒ­ãƒ¼ãƒ‰ã‚µã‚¤ã‚ºã¯ 1,500 Bytes (TCP ã® MSS 㯠1,460 Bytes) ã¨ä»®å®šã—ã¦è¨ˆç®—ãŒè¡Œã‚ã‚Œã¾ã™ã€‚/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" ã®ã†ã¡ 1 ã¤ã‚’指定ã—ã¾ã™ã€‚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 ã® 2 ã¤ã®ã‚³ãƒžãƒ³ãƒ‰ã¨ã—ã¦åˆ©ç”¨ã—ã€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 ソフトウェアãŒæ­£ã—ã動作ã™ã‚‹å¯èƒ½æ€§ãŒé«˜ã„ã¨æ€ã‚ã‚Œã¾ã™ã€‚<BR>ã¾ãŸã€ã“ã®ãƒã‚§ãƒƒã‚¯ã‚’通éŽã§ããªã„システム上ã§ã¯ã€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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.3.69 "IPsecEnable": IPsec 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">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 サーãƒãƒ¼æ©Ÿèƒ½ã®æœ‰åŠ¹åŒ– / 無効化</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 サーãƒãƒ¼æ©Ÿèƒ½ã‚’有効化 / 無効化ã—ã¾ã™ã€‚<BR>IPsec VPN サーãƒãƒ¼æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹ã¨ã€VPN Server 上ã®ä»®æƒ³ HUB ã¯ã€IPsec / L2TP / EtherIP / L2TPv3 ã«å¯¾å¿œã—㟠PC ã‚„ Mac OS Xã€ã‚¹ãƒžãƒ¼ãƒˆãƒ•ã‚©ãƒ³ã€ãƒ«ãƒ¼ã‚¿ç­‰ã‹ã‚‰ã® 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>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">
+ IPsec を用ã„ãªã„ L2TP サーãƒãƒ¼æ©Ÿèƒ½ã‚’有効ã¾ãŸã¯ç„¡åŠ¹ã«è¨­å®šã—ã¾ã™ã€‚特殊ãªã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‹ã‚‰ã®æŽ¥ç¶šã‚’å—付ã‘ã‚‹å ´åˆã®ã¿æœ‰åŠ¹ã«ã—ã¦ãã ã•ã„。</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 サーãƒãƒ¼æ©Ÿèƒ½) を有効ã¾ãŸã¯ç„¡åŠ¹ã«è¨­å®šã—ã¾ã™ã€‚EtherIP / L2TPv3 over IPsec ã«å¯¾å¿œã—ãŸå¸‚販ã®ãƒ«ãƒ¼ã‚¿è£½å“ã¯ã€ã“ã® VPN Server ã®ä»®æƒ³ HUB ã«ãƒ¬ã‚¤ãƒ¤ 2 (Ethernet) ã§ãƒ–リッジ接続ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚</td>
+ </tr>
+ <tr>
+ <td class="tableStandard" width="125"><i>/PSK</i></td>
+ <td class="tableStandard" width="453" style="background-color: #FFFFFF">
+ IPsec 事å‰å…±æœ‰éµã‚’設定ã—ã¾ã™ã€‚IPsec 事å‰å…±æœ‰éµã¯ã€ã€ŒPSK (Pre-Shared Key)ã€ã¾ãŸã¯ã€Œã‚·ãƒ¼ã‚¯ãƒ¬ãƒƒãƒˆã€ã¨å‘¼ã°ã‚Œã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚8 文字程度ã§è¨­å®šã—ã€VPN を利用ã™ã‚‹ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«é…布ã—ã¦ãã ã•ã„。Google Android 4.0 ã«ã¯ãƒã‚°ãŒã‚ã‚Šã€PSK ã®æ–‡å­—数㌠10 文字を超ãˆãŸå ´åˆã¯ VPN 通信ã«å¤±æ•—ã™ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚ãã®ãŸã‚ã€PSK ã®æ–‡å­—数㯠9 文字以下ã«ã™ã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™ã€‚</td>
+ </tr>
+ <tr>
+ <td class="tableStandard" width="125"><i>/DEFAULTHUB</i></td>
+ <td class="tableStandard" width="453" style="background-color: #FFFFFF">
+ 接続時ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åã«ãŠã„ã¦ä»®æƒ³ HUB åãŒçœç•¥ã•ã‚ŒãŸå ´åˆã«æŽ¥ç¶šã™ã‚‹ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®ä»®æƒ³ HUB ã®åå‰ã‚’指定ã—ã¾ã™ã€‚通常ã€L2TP, OpenVPN ãŠã‚ˆã³ MS-SSTP VPN 接続時ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼å㯠"仮想HUBå\ユーザーå" ã¾ãŸã¯ "ユーザーå@仮想HUBå" ã®ã‚ˆã†ã«æŒ‡å®šã•ã‚Œã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã‚‚ã—ユーザーãŒä»®æƒ³ HUB åã®æŒ‡å®šã‚’çœç•¥ã—ãŸå ´åˆã¯ã€DEFAULTHUB パラメータã¨ã—ã¦æŒ‡å®šã•ã‚Œã¦ã„る仮想 HUB ãŒãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®ä»®æƒ³ HUB ã¨ã—ã¦é¸æŠžã•ã‚Œã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.3.70 "IPsecGet": IPsec 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">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 サーãƒãƒ¼æ©Ÿèƒ½ã®ç¾åœ¨ã®è¨­å®šã®å–å¾—</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 サーãƒãƒ¼æ©Ÿèƒ½ã®ç¾åœ¨ã®è¨­å®šã‚’å–å¾—ã—ã¦è¡¨ç¤ºã—ã¾ã™ã€‚<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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.3.71 "EtherIpClientAdd": 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">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 サーãƒãƒ¼æ©Ÿèƒ½ã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãƒ‡ãƒã‚¤ã‚¹ã‹ã‚‰ã®æŽ¥ç¶šã‚’å—付ã‘ã‚‹ãŸã‚ã®æŽ¥ç¶šè¨­å®šã®è¿½åŠ </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 対応ルータ㌠VPN Server ã«æŽ¥ç¶šã™ã‚‹éš›ã® IPsec Phase 1 文字列ã¨ã€æŽ¥ç¶šå…ˆã®ä»®æƒ³ HUB ã®æƒ…å ±ã®å¯¾å¿œè¡¨ã‚’定義ã—ã¦ãŠãå¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚<BR>EtherIpClientAdd コマンドを用ã„ã¦å®šç¾©ã‚’追加ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€EtherIP / L2TPv3 over IPsec クライアントãŒã“ã® VPN Server ã«æŽ¥ç¶šã—よã†ã¨ã—ãŸéš›ã® ISAKMP (IKE) Phase 1 ã®ã‚¤ãƒ‹ã‚·ã‚¨ãƒ¼ã‚¿ ID 文字列ãŒå®šç¾©ã«ä¸€è‡´ã™ã‚‹å ´åˆã«ã€å®šç¾©ã•ã‚Œã¦ã„る仮想 HUB ã¸ã®æŽ¥ç¶šè¨­å®šãŒé©ç”¨ã•ã‚Œã¾ã™ã€‚<BR>ユーザーåã¨ãƒ‘スワードã¯ã€ä»®æƒ³ HUB ã«ç™»éŒ²ã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚EtherIP / L2TPv3 クライアントã¯ã€ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã§å…¥åŠ›ã•ã‚ŒãŸæƒ…å ±ã§è­˜åˆ¥ã•ã‚Œã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®æ¨©é™ã§ä»®æƒ³ HUB ã«æŽ¥ç¶šã—ãŸã‚‚ã®ã¨ã¿ãªã•ã‚Œã¾ã™ã€‚<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>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 ã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã®ãƒ«ãƒ¼ã‚¿ã®æŽ¥ç¶šè¨­å®šã§è¨­å®šã™ã‚‹ã‚‚ã®ã¨åŒä¸€ã®æ–‡å­—列を指定ã—ã¦ãã ã•ã„。文字列ã®ã»ã‹ã€ID ã®ç¨®é¡žãŒ IP アドレスã®å ´åˆã¯ 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 サーãƒãƒ¼æ©Ÿèƒ½ã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãƒ‡ãƒã‚¤ã‚¹ã‹ã‚‰ã®æŽ¥ç¶šã‚’å—付ã‘ã‚‹ãŸã‚ã®æŽ¥ç¶šè¨­å®šã®å®šç¾©æ¸ˆã¿é …目を削除ã—ã¾ã™ã€‚<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 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">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 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 サーãƒãƒ¼æ©Ÿèƒ½ã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãƒ‡ãƒã‚¤ã‚¹ã‹ã‚‰ã®æŽ¥ç¶šã‚’å—付ã‘ã‚‹ãŸã‚ã®æŽ¥ç¶šè¨­å®šã®å®šç¾©æ¸ˆã¿ä¸€è¦§ã‚’表示ã—ã¾ã™ã€‚<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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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">
+ PacketiX VPN Server ã«ã¯ OpenVPN 社㮠OpenVPN ソフトウェア製å“ã¨åŒç­‰ã® VPN サーãƒãƒ¼æ©Ÿèƒ½ãŒæ­è¼‰ã•ã‚Œã¦ã„ã¾ã™ã€‚OpenVPN サーãƒãƒ¼æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹ã¨ã€OpenVPN クライアントã‹ã‚‰ OpenVPN サーãƒãƒ¼ã«æŽ¥ç¶šã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚<BR><BR>OpenVPN 互æ›ã‚µãƒ¼ãƒãƒ¼æ©Ÿèƒ½ã§ä»®æƒ³ 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">
+ OpenVPN 互æ›ã‚µãƒ¼ãƒãƒ¼æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹å ´åˆã¯ yesã€ç„¡åŠ¹ã«ã™ã‚‹å ´åˆã¯ no を指定ã—ã¾ã™ã€‚</td>
+ </tr>
+ <tr>
+ <td class="tableStandard" width="125"><i>/PORTS</i></td>
+ <td class="tableStandard" width="453" style="background-color: #FFFFFF">
+ OpenVPN サービスをæä¾›ã™ã‚‹ UDP ãƒãƒ¼ãƒˆã®ä¸€è¦§ã‚’指定ã—ã¦ãã ã•ã„。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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.3.76 "OpenVpnMakeConfig": OpenVPN 互æ›ã‚µãƒ¼ãƒãƒ¼æ©Ÿèƒ½ã«æŽ¥ç¶šå¯èƒ½ãªã‚µãƒ³ãƒ—ル㮠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">OpenVpnMakeConfig</font></b></td>
+ </tr>
+ <tr>
+ <td class="tableStandard" width="125"><b>コマンドã®æ¦‚è¦</b></td>
+ <td class="tableStandard" width="453" style="background-color: #FFFFFF">
+ OpenVPN 互æ›ã‚µãƒ¼ãƒãƒ¼æ©Ÿèƒ½ã«æŽ¥ç¶šå¯èƒ½ãªã‚µãƒ³ãƒ—ル㮠OpenVPN 設定ファイルã®ç”Ÿæˆ</td>
+ </tr>
+ <tr>
+ <td class="tableStandard" width="125"><b>説明</b></td>
+ <td class="tableStandard" width="453" style="background-color: #FFFFFF">
+ 本æ¥ã€OpenVPN クライアントを使ã†ãŸã‚ã«ã¯è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã‚’手動ã§è¨˜è¿°ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ãŒã€ã“ã‚Œã¯é›£æ˜“度ãŒé«˜ã„作業ã§ã™ã€‚ã—ã‹ã—ã€ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’使用ã™ã‚Œã°ã“ã® VPN Server ã«æŽ¥ç¶šã™ã‚‹ã“ã¨ãŒã§ãる基本的㪠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>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">
+ PacketiX VPN Server ã«ã¯ Microsoft 社㮠Windows Server 2008 / 2012 製å“ã«æ­è¼‰ã•ã‚Œã¦ã„ã‚‹ MS-SSTP VPN サーãƒãƒ¼æ©Ÿèƒ½ã¨äº’æ›æ€§ãŒã‚る機能ãŒæ­è¼‰ã•ã‚Œã¦ã„ã¾ã™ã€‚Microsoft SSTP VPN 互æ›ã‚µãƒ¼ãƒãƒ¼æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹ã¨ã€Windows Vista / 7 / 8 / RT ã«æ¨™æº–æ­è¼‰ã® MS-SSTP クライアントã‹ã‚‰ã“ã® VPN Server ã«æŽ¥ç¶šã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚<BR><BR>[ã”注æ„]<BR>VPN Server ã® SSL 証明書㮠CN ã®å€¤ãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã§æŒ‡å®šã™ã‚‹ãƒ›ã‚¹ãƒˆåã¨ä¸€è‡´ã—ã€ã‹ã¤ãã®è¨¼æ˜Žæ›¸ãŒä¿¡é ¼ã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚詳ã—ã㯠Microsoft 社ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’å‚ç…§ã—ã¦ãã ã•ã„。<BR>指定ã•ã‚ŒãŸ CN ã®å€¤ã‚’æŒã¤æ–°ã—ã„ SSL 証明書 (自己署å証明書) を生æˆã—㦠VPN Server ã®ç¾åœ¨ã®è¨¼æ˜Žæ›¸ã¨ç½®æ›ã™ã‚‹ãŸã‚ã«ã¯ã€ServerCertRegenerate コマンドを使用ã—ã¦ãã ã•ã„。ã“ã®å ´åˆã¯ã€å½“該証明書を SSTP VPN クライアントã®ã‚³ãƒ³ãƒ”ュータã®ä¿¡é ¼ã•ã‚Œã‚‹ãƒ«ãƒ¼ãƒˆè¨¼æ˜Žæ›¸ã¨ã—ã¦ç™»éŒ²ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®ã‚ˆã†ãªæ‰‹é–“ã‚’ã‹ã‘ãŸããªã„å ´åˆã¯ã€ä»£ã‚ã‚Šã« VeriSign ã‚„ GlobalSign 社ãªã©ã®å¸‚販ã®è¨¼æ˜Žæ›¸æ¥­è€…ã® SSL 証明書ã®å–得を検討ã—ã¦ãã ã•ã„。<BR><BR>Microsoft SSTP VPN 互æ›ã‚µãƒ¼ãƒãƒ¼æ©Ÿèƒ½ã§ä»®æƒ³ 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">
+ Microsoft SSTP VPN 互æ›ã‚µãƒ¼ãƒãƒ¼æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹å ´åˆã¯ yesã€ç„¡åŠ¹ã«ã™ã‚‹å ´åˆã¯ 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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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">
+ PacketiX VPN Server ã® SSL-VPN 機能ã§æ示ã•ã‚Œã‚‹ã‚µãƒ¼ãƒãƒ¼è¨¼æ˜Žæ›¸ã‚’ã€æ–°ãŸã«ä½œæˆã™ã‚‹è¨¼æ˜Žæ›¸ã«ç½®ãæ›ãˆã¾ã™ã€‚æ–°ãŸãªè¨¼æ˜Žæ›¸ã¯è‡ªå·±ç½²å証明書ã¨ã—ã¦ç”Ÿæˆã•ã‚Œã€CN (Common Name) ã®å€¤ã‚’ä»»æ„ã®æ–‡å­—列ã«è¨­å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<BR><BR>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€Microsoft SSTP VPN 互æ›ã‚µãƒ¼ãƒãƒ¼æ©Ÿèƒ½ã‚’使用ã—よã†ã¨ã™ã‚‹å ´åˆã«ä¾¿åˆ©ã§ã™ã€‚ãªãœãªã‚‰ã°ã€SSTP VPN クライアント (Windows Vista / 7 / 8 / RT ã«æ¨™æº–æ­è¼‰) ã¯æŽ¥ç¶šå…ˆã® VPN Server ã®æ示ã™ã‚‹ SSL 証明書㮠CN (Common Name) ã®å€¤ãŒæŽ¥ç¶šå…ˆã¨ã—ã¦æŒ‡å®šã•ã‚Œã¦ã„るホストå文字列ã¨å®Œå…¨ã«ä¸€è‡´ã™ã‚‹ã‹ã©ã†ã‹ã‚’検証ã—ã€ã‚‚ã—一致ã—ãªã„å ´åˆã¯æŽ¥ç¶šã‚’キャンセルã™ã‚‹ãŸã‚ã§ã™ã€‚<BR>詳ã—ã㯠SstpEnable コマンドã®ãƒ˜ãƒ«ãƒ—ã‚’å‚ç…§ã—ã¦ãã ã•ã„。<BR><BR>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€æ—¢å­˜ã® VPN Server ã® SSL 証明書を削除ã—ã¾ã™ã€‚ServerCertGet コマンドãŠã‚ˆã³ ServerKeyGet コマンドを用ã„ã¦ã€ç¾åœ¨ã®è¨¼æ˜Žæ›¸ã¨ç§˜å¯†éµã‚’ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã—ã¦ãŠãã“ã¨ã‚’推奨ã—ã¾ã™ã€‚<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>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 (Ping) ã¾ãŸã¯ DNS パケットã®é€šä¿¡ãŒå¯èƒ½ã§ã‚ã‚Œã°ã€VPN Server 㨠VPN Client ã¨ã®é–“㧠VPN 通信を行ã†ã“ã¨ãŒã§ãã¾ã™ã€‚ãã®ãŸã‚ã«ã¯ã€äºˆã‚ VPN over ICMP / VPN over DNS サーãƒãƒ¼æ©Ÿèƒ½ã‚’有効ã«ã—ã¦ãŠãå¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚<BR><BR>警告: ã“ã®æ©Ÿèƒ½ã¯ãƒ•ã‚¡ã‚¤ã‚¢ã‚¦ã‚©ãƒ¼ãƒ«ã‚„ルータ等ãŒä¸€æ™‚çš„ã«ä¸èª¿ã¨ãªã£ã¦ãŠã‚Š ICMP ã¾ãŸã¯ DNS ã®ã¿å®‰å®šã—ãŸé€šä¿¡ãŒå¯èƒ½ãªç’°å¢ƒã§ VPN 通信を確立ã™ã‚‹ãŸã‚ã®æ©Ÿèƒ½ã§ã‚。緊急時ãªã©ã«ã¯æœ‰ç›Šã§ã™ãŒã€é•·æœŸé–“ã®åˆ©ç”¨ã«ã¯é©ã—ãªã„å ´åˆãŒã‚ã‚Šã¾ã™ã€‚<BR><BR>接続元㮠VPN Client ã¾ãŸã¯ VPN Bridge ã¯å†…部ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 4.0 以é™ãŒå¿…è¦ã§ã™ã€‚<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">
+ VPN over ICMP サーãƒãƒ¼ã‚’有効ã«ã™ã‚‹ã«ã¯ yesã€ç„¡åŠ¹ã«ã™ã‚‹ã«ã¯ no を指定ã—ã¾ã™ã€‚</td>
+ </tr>
+ <tr>
+ <td class="tableStandard" width="125"><i>/DNS</i></td>
+ <td class="tableStandard" width="453" style="background-color: #FFFFFF">
+ VPN over DNS サーãƒãƒ¼ã‚’有効ã«ã™ã‚‹ã«ã¯ yesã€ç„¡åŠ¹ã«ã™ã‚‹ã«ã¯ 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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 ã® IP アドレスã®ä»£ã‚ã‚Šã« DNS ホストåã«ã‚ˆã£ã¦ VPN Server を指定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<BR>ã¾ãŸã€IP アドレスãŒå¤‰åŒ–ã™ã‚‹å¯èƒ½æ€§ãŒã‚る一般的㪠ISP を用ã„㦠VPN Server をインターãƒãƒƒãƒˆã«æŽ¥ç¶šã™ã‚‹å ´åˆã§ã‚‚ã€IP アドレスãŒå¤‰åŒ–ã™ã‚Œã°è‡ªå‹•çš„ã« DNS ホストå対応ã™ã‚‹ IP アドレスãŒæ›´æ–°ã•ã‚Œã¾ã™ã®ã§ã€å¯å¤‰ IP アドレスã§ã‚‚ VPN Server ã‚’é‹ç”¨ã™ã‚‹ã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚<BR>ã“ã‚Œã«ã‚ˆã‚Šã€é«˜ä¾¡ãªæœˆé¡æ–™é‡‘ãŒå¿…è¦ãªå›ºå®šã‚°ãƒ­ãƒ¼ãƒãƒ« IP アドレスã®ã‚µãƒ¼ãƒ“スを契約ã™ã‚‹å¿…è¦ãŒãªããªã‚Šã¾ã™ã€‚<BR><BR>[注æ„]<BR>ダイナミック DNS 機能を無効ã«ã™ã‚‹ã«ã¯ã€VPN Server ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã‚’編集ã—ã¾ã™ã€‚<BR>"declare root" ディレクティブ内㫠"declare DDnsClient" ディレクティブãŒã‚ã‚Šã¾ã™ã€‚ã“ã®ä¸­ã«ã‚ã‚‹ "bool Disable" ã®å€¤ã‚’ true ã«è¨­å®šã—㦠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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 機能㧠VPN Server ãŒä½¿ç”¨ã™ã‚‹ãƒ›ã‚¹ãƒˆåを設定ã—ã¾ã™ã€‚ç¾åœ¨å‰²å½“ã¦ã‚‰ã‚Œã¦ã„るホストå㯠DynamicDnsGetStatus コマンドã§ç¢ºèªã§ãã¾ã™ã€‚<BR><BR>ダイナミック DNS ã«ã‚ˆã‚‹ã€VPN Server コンピュータã«æ°¸ç¶šçš„ãªå›ºæœ‰ã® DNS ホストåãŒå‰²å½“ã¦ã‚‰ã‚Œã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã‚Šç‹¬è‡ªã§ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚’所有ã—ã¦ã„ãªãã¦ã‚‚ã€VPN Client ã‚„ VPN Bridge ãªã©ã®è¨­å®šç”»é¢ä¸ŠãŒ VPN Server ã® IP アドレスã®ä»£ã‚ã‚Šã« DNS ホストåã«ã‚ˆã£ã¦ VPN Server を指定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<BR>ã¾ãŸã€IP アドレスãŒå¤‰åŒ–ã™ã‚‹å¯èƒ½æ€§ãŒã‚る一般的㪠ISP を用ã„㦠VPN Server をインターãƒãƒƒãƒˆã«æŽ¥ç¶šã™ã‚‹å ´åˆã§ã‚‚ã€IP アドレスãŒå¤‰åŒ–ã™ã‚Œã°è‡ªå‹•çš„ã« DNS ホストå対応ã™ã‚‹ IP アドレスãŒæ›´æ–°ã•ã‚Œã¾ã™ã®ã§ã€å¯å¤‰ IP アドレスã§ã‚‚ VPN Server ã‚’é‹ç”¨ã™ã‚‹ã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚<BR>ã“ã‚Œã«ã‚ˆã‚Šã€é«˜ä¾¡ãªæœˆé¡æ–™é‡‘ãŒå¿…è¦ãªå›ºå®šã‚°ãƒ­ãƒ¼ãƒãƒ« IP アドレスã®ã‚µãƒ¼ãƒ“スを契約ã™ã‚‹å¿…è¦ãŒãªããªã‚Šã¾ã™ã€‚<BR><BR>[注æ„]<BR>ダイナミック DNS 機能を無効ã«ã™ã‚‹ã«ã¯ã€VPN Server ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã‚’編集ã—ã¾ã™ã€‚<BR>"declare root" ディレクティブ内㫠"declare DDnsClient" ディレクティブãŒã‚ã‚Šã¾ã™ã€‚ã“ã®ä¸­ã«ã‚ã‚‹ "bool Disable" ã®å€¤ã‚’ true ã«è¨­å®šã—㦠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 接続中ã¯ä¼šç¤¾ã®ãƒ‘ソコンを経由ã—ã¦ã€ç¤¾å†… LAN ã®ä»–ã®ã‚µãƒ¼ãƒãƒ¼ã«ã‚‚アクセスã§ãã¾ã™ã€‚<BR>会社ã®ãƒ‘ソコン (VPN Server) ã«ã¯ã‚°ãƒ­ãƒ¼ãƒãƒ« IP アドレスã¯ä¸è¦ã§ã™ã€‚ファイアウォールや NAT ã®å†…å´ã§ã‚ã£ã¦ã‚‚動作ã—ã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ç®¡ç†è€…ã«ã‚ˆã‚‹è¨­å®šã¯ä¸€åˆ‡å¿…è¦ã‚ã‚Šã¾ã›ã‚“。VPN クライアントã¨ãªã‚‹è‡ªå®…ã®ãƒ‘ソコンã§ã¯ã€Windows ã«æ¨™æº–付属㮠SSTP VPN クライアントを使用ã§ãã¾ã™ã€‚<BR>VPN Azure ã¯ã€PacketiX VPN Server ã‚’ãŠä½¿ã„ã®æ–¹ã¯ã©ãªãŸã§ã‚‚ç„¡æ–™ã§åˆ©ç”¨ã§ãるクラウド VPN サービスã§ã™ã€‚ソフトイーサ株å¼ä¼šç¤¾ã«ã‚ˆã£ã¦é‹å–¶ã•ã‚Œã¦ã„ã¾ã™ã€‚使ã„方㯠http://www.vpnazure.net/ ã«æŽ²è¼‰ã•ã‚Œã¦ã„ã¾ã™ã€‚<BR><BR>VPN Azure ホストåã¯ãƒ€ã‚¤ãƒŠãƒŸãƒƒã‚¯ DNS サービスã®ãƒ›ã‚¹ãƒˆåã®ãƒ‰ãƒ¡ã‚¤ãƒ³éƒ¨åˆ†ã‚’ "vpnazure.net" ã«å¤‰æ›´ã—ãŸã‚‚ã®ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ホストåを変更ã™ã‚‹ã«ã¯ DynamicDnsSetHostname コマンドを使用ã—ã¦ãã ã•ã„。<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>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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 接続中ã¯ä¼šç¤¾ã®ãƒ‘ソコンを経由ã—ã¦ã€ç¤¾å†… LAN ã®ä»–ã®ã‚µãƒ¼ãƒãƒ¼ã«ã‚‚アクセスã§ãã¾ã™ã€‚<BR>会社ã®ãƒ‘ソコン (VPN Server) ã«ã¯ã‚°ãƒ­ãƒ¼ãƒãƒ« IP アドレスã¯ä¸è¦ã§ã™ã€‚ファイアウォールや NAT ã®å†…å´ã§ã‚ã£ã¦ã‚‚動作ã—ã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ç®¡ç†è€…ã«ã‚ˆã‚‹è¨­å®šã¯ä¸€åˆ‡å¿…è¦ã‚ã‚Šã¾ã›ã‚“。VPN クライアントã¨ãªã‚‹è‡ªå®…ã®ãƒ‘ソコンã§ã¯ã€Windows ã«æ¨™æº–付属㮠SSTP VPN クライアントを使用ã§ãã¾ã™ã€‚<BR>VPN Azure ã¯ã€PacketiX VPN Server ã‚’ãŠä½¿ã„ã®æ–¹ã¯ã©ãªãŸã§ã‚‚ç„¡æ–™ã§åˆ©ç”¨ã§ãるクラウド VPN サービスã§ã™ã€‚ソフトイーサ株å¼ä¼šç¤¾ã«ã‚ˆã£ã¦é‹å–¶ã•ã‚Œã¦ã„ã¾ã™ã€‚使ã„方㯠http://www.vpnazure.net/ ã«æŽ²è¼‰ã•ã‚Œã¦ã„ã¾ã™ã€‚<BR><BR>VPN Azure ホストåã¯ãƒ€ã‚¤ãƒŠãƒŸãƒƒã‚¯ DNS サービスã®ãƒ›ã‚¹ãƒˆåã®ãƒ‰ãƒ¡ã‚¤ãƒ³éƒ¨åˆ†ã‚’ "vpnazure.net" ã«å¤‰æ›´ã—ãŸã‚‚ã®ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ホストåを変更ã™ã‚‹ã«ã¯ DynamicDnsSetHostname コマンドを使用ã—ã¦ãã ã•ã„。<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>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">
+ VPN Azure 機能を有効ã«ã™ã‚‹ã«ã¯ yesã€ç„¡åŠ¹ã«ã™ã‚‹ã«ã¯ 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 接続をå—ã‘付ã‘ã¾ã›ã‚“。仮想 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>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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 接続をå—ã‘付ã‘ã¾ã›ã‚“。<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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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ã€ã‚«ã‚¹ã‚±ãƒ¼ãƒ‰æŽ¥ç¶šãªã©ã«ã‚ˆã£ã¦ä»®æƒ³ HUB 内ã«ç”Ÿæˆã•ã‚Œã‚‹ã‚»ãƒƒã‚·ãƒ§ãƒ³ã¯å«ã¾ã‚Œã¾ã›ã‚“。<BR>ç¾åœ¨ã®æœ€å¤§åŒæ™‚接続セッション数ã®è¨­å®šã¯ã€OptionsGet コマンドã«ã‚ˆã£ã¦å–å¾—ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<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>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 管ç†ãƒ¢ãƒ¼ãƒ‰ã§ãƒ‘スワードを指定ã—ã¦æŽ¥ç¶šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã¾ãŸã€VPN Client ã‚„ VPN Bridge ãªã©ã‹ã‚‰ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼åã‚’ "Administrator"ã€ãƒ‘スワードを仮想 HUB ã®ç®¡ç†è€…パスワードã«æŒ‡å®šã—㦠VPN 接続ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚<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>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 を列挙ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚ã¾ãŸã€SetEnumDeny コマンドを使用ã™ã‚‹ã¨ã€åŒ¿åユーザーã¸ã®åˆ—挙をç¦æ­¢ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚仮想 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>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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 コマンドを使用ã™ã‚‹ã¨ã€åŒ¿åユーザーã¸ã®åˆ—挙を許å¯ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<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>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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ã‚¯ãƒ©ã‚¹ã‚¿ã¨ã—ã¦å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã®ä»®æƒ³ 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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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">
+ ç¾åœ¨ç®¡ç†ã—ã¦ã„る仮想 HUB ã«ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒ RADIUS サーãƒãƒ¼èªè¨¼ãƒ¢ãƒ¼ãƒ‰ã§æŽ¥ç¶šã—ãŸå ´åˆã«ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼åã¨ãƒ‘スワードを確èªã™ã‚‹ãŸã‚ã®å¤–部㮠RADIUS サーãƒãƒ¼ã‚’指定ã—ã¾ã™ã€‚<BR>Radius サーãƒãƒ¼ã¯ã€ã“ã® VPN Server ã® IP アドレスã‹ã‚‰ã®è¦æ±‚ã‚’å—ã‘付ã‘るよã†ã«è¨­å®šã—ã¦ãŠãå¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã¾ãŸã€Password Authentication Protocol (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 èªè¨¼ã‚’使用ã§ããªã„よã†ã«ã—ã¾ã™ã€‚ç¾åœ¨ã® RADIUS サーãƒãƒ¼ã«é–¢ã™ã‚‹è¨­å®šã¯ã€RadiusServerGet コマンドã§å–å¾—ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<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>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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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">
+ ç¾åœ¨ç®¡ç†ã—ã¦ã„る仮想 HUB ã«ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒ RADIUS サーãƒãƒ¼èªè¨¼ãƒ¢ãƒ¼ãƒ‰ã§æŽ¥ç¶šã—ãŸå ´åˆã«ä½¿ç”¨ã™ã‚‹ RADIUS サーãƒãƒ¼ã«ã¤ã„ã¦ã®ç¾åœ¨ã®è¨­å®šã‚’å–å¾—ã—ã¾ã™ã€‚<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>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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 時間å˜ä½ã€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 パケットログ]ã€[Ethernet パケットログ] ãŒã‚ã‚Šã¾ã™ã€‚<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">
+ ç¾åœ¨ç®¡ç†ã—ã¦ã„る仮想 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>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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 ãŒä¿¡é ¼ã™ã‚‹è¨¼æ˜Žæ©Ÿé–¢ã®è¨¼æ˜Žæ›¸ä¸€è¦§ã«ã€æ–°ã—ã„証明書を追加ã—ã¾ã™ã€‚登録ã•ã‚Œã¦ã„る証明機関ã®è¨¼æ˜Žæ›¸ä¸€è¦§ã¯ã€VPN Client ãŒã€ç½²å済ã¿è¨¼æ˜Žæ›¸èªè¨¼ãƒ¢ãƒ¼ãƒ‰ã§æŽ¥ç¶šã—ã¦ããŸéš›ã®è¨¼æ˜Žæ›¸ã®æ¤œè¨¼ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚<BR>ç¾åœ¨ã®è¨¼æ˜Žæ›¸ä¸€è¦§ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€CAList コマンドを使用ã—ã¾ã™ã€‚<BR>証明書を追加ã™ã‚‹ã«ã¯ã€ãã®è¨¼æ˜Žæ›¸ãŒ X.509 å½¢å¼ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¨ã—ã¦ä¿å­˜ã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚<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>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">
+ ç¾åœ¨ç®¡ç†ã—ã¦ã„る仮想 HUB ãŒä¿¡é ¼ã™ã‚‹è¨¼æ˜Žæ©Ÿé–¢ã®è¨¼æ˜Žæ›¸ä¸€è¦§ã‹ã‚‰ã€æ—¢å­˜ã®è¨¼æ˜Žæ›¸ã‚’削除ã—ã¾ã™ã€‚<BR>ç¾åœ¨ã®è¨¼æ˜Žæ›¸ä¸€è¦§ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€CAList コマンドを使用ã—ã¾ã™ã€‚<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>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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ã‚¯ãƒ©ã‚¹ã‚¿å†…ã§ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¡ãƒ³ãƒã‚µãƒ¼ãƒãƒ¼ã¨ã—ã¦å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã®ä»®æƒ³ 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 ã«ã€ãƒ¬ã‚¤ãƒ¤ 2 カスケード接続ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<BR><BR>[カスケード接続ã«ãŠã‘る警告]<BR>カスケード接続を使用ã™ã‚‹ã¨ã€è¤‡æ•°ã®ä»®æƒ³ HUB é–“ã§ã®ãƒ¬ã‚¤ãƒ¤ 2 ブリッジãŒå¯èƒ½ã§ã™ãŒã€æŽ¥ç¶šæ–¹æ³•ã‚’é–“é•ãˆã‚‹ã¨ã€ãƒ«ãƒ¼ãƒ—状ã®ã‚«ã‚¹ã‚±ãƒ¼ãƒ‰æŽ¥ç¶šã‚’作æˆã—ã¦ã—ã¾ã†å ´åˆãŒã‚ã‚Šã¾ã™ã€‚カスケード接続機能を使用ã™ã‚‹éš›ã«ã¯ã€æ…Žé‡ã«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒˆãƒãƒ­ã‚¸ã‚’設計ã—ã¦ãã ã•ã„。<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>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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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><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>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 Server ã®ãƒ›ã‚¹ãƒˆåã¨ãƒãƒ¼ãƒˆç•ªå·ã€ä»®æƒ³ HUB åã€ãŠã‚ˆã³æŽ¥ç¶šã«ä½¿ç”¨ã™ã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼åを設定ã—ã¾ã™ã€‚<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>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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ã‚¯ãƒ©ã‚¹ã‚¿ã¨ã—ã¦å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã®ä»®æƒ³ 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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ã‚¯ãƒ©ã‚¹ã‚¿ã¨ã—ã¦å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã®ä»®æƒ³ 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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ã‚¯ãƒ©ã‚¹ã‚¿ã¨ã—ã¦å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã®ä»®æƒ³ 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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ã‚¯ãƒ©ã‚¹ã‚¿ã¨ã—ã¦å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã®ä»®æƒ³ 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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ã‚¯ãƒ©ã‚¹ã‚¿ã¨ã—ã¦å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã®ä»®æƒ³ 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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ã‚¯ãƒ©ã‚¹ã‚¿ã¨ã—ã¦å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã®ä»®æƒ³ 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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ã‚¯ãƒ©ã‚¹ã‚¿ã¨ã—ã¦å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã®ä»®æƒ³ 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 ã¨ã®é–“㧠VPN 接続を行ãªã£ã¦é€šä¿¡ã‚’ã™ã‚‹éš›ã«ã€VPN Server ã¨ã®é–“ã®é€šä¿¡å†…容を SSL ã§æš—å·åŒ–ã™ã‚‹ã‚ˆã†ã«è¨­å®šã—ã¾ã™ã€‚<BR>通常ã¯ã€VPN Server ã¨ã®é–“ã®é€šä¿¡ã‚’ SSL ã§æš—å·åŒ–ã—ã¦ã€æƒ…å ±ã®ç›—è´ã‚„改ã–んを防止ã—ã¾ã™ã€‚æš—å·åŒ–を無効ã«ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚æš—å·åŒ–を無効ã«ã™ã‚‹ã¨ã€é€šä¿¡ã®ã‚¹ãƒ«ãƒ¼ãƒ—ットãŒå‘上ã—ã¾ã™ãŒã€é€šä¿¡ãƒ‡ãƒ¼ã‚¿ã¯å¹³æ–‡ã§ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã‚’æµã‚Œã¾ã™ã€‚<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>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 ã¨ã®é–“㧠VPN 接続を行ãªã£ã¦é€šä¿¡ã‚’ã™ã‚‹éš›ã« VPN Server ã¨ã®é–“ã®é€šä¿¡å†…容を暗å·åŒ–ã—ãªã„よã†ã«è¨­å®šã—ã¾ã™ã€‚<BR>通常ã¯ã€VPN Server ã¨ã®é–“ã®é€šä¿¡ã‚’ SSL ã§æš—å·åŒ–ã—ã¦ã€æƒ…å ±ã®ç›—è´ã‚„改ã–んを防止ã—ã¾ã™ã€‚æš—å·åŒ–を無効ã«ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚æš—å·åŒ–を無効ã«ã™ã‚‹ã¨ã€é€šä¿¡ã®ã‚¹ãƒ«ãƒ¼ãƒ—ットãŒå‘上ã—ã¾ã™ãŒã€é€šä¿¡ãƒ‡ãƒ¼ã‚¿ã¯å¹³æ–‡ã§ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã‚’æµã‚Œã¾ã™ã€‚<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>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 ã¨ã®é–“㧠VPN 接続を行ãªã£ã¦é€šä¿¡ã‚’ã™ã‚‹éš›ã«ã€VPN Server ã¨ã®é–“ã®é€šä¿¡å†…容を圧縮ã™ã‚‹ã‚ˆã†ã«è¨­å®šã—ã¾ã™ã€‚<BR>最大ã§ç´„ 80 % 程度ã®åœ§ç¸®ã‚’è¡Œã†ã“ã¨ãŒã§ãã¾ã™ã€‚ãŸã ã—ã€åœ§ç¸®ã‚’è¡Œã†ã¨ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŠã‚ˆã³ã‚µãƒ¼ãƒãƒ¼ã®ä¸¡æ–¹ã§ CPU è² è·ãŒé«˜ããªã‚Šã¾ã™ã€‚回線速度ãŒç´„ 10 Mbps 以上ã®å ´åˆã¯ã€åœ§ç¸®ã‚’è¡Œã†ã¨ã‚¹ãƒ«ãƒ¼ãƒ—ットãŒä½Žä¸‹ã—ã€é€†åŠ¹æžœã¨ãªã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚<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>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 ã¨ã®é–“㧠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>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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ã‚¯ãƒ©ã‚¹ã‚¿ã¨ã—ã¦å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã®ä»®æƒ³ 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 通信をã™ã‚‹ãŸã‚ã® CONNECT メソッドã«å¯¾å¿œã—ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚<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>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 プロキシサーãƒãƒ¼ã«æŽ¥ç¶šã™ã‚‹ãŸã‚ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼èªè¨¼ãŒå¿…è¦ãªå ´åˆã€ãƒ¦ãƒ¼ã‚¶ãƒ¼åを指定ã—ã¾ã™ã€‚ã¾ãŸã€åŒæ™‚ã« /PASSWORD パラメータも指定ã—ã¾ã™ã€‚/USERNAME 㨠/PASSWORD パラメータãŒæŒ‡å®šã•ã‚Œãªã„å ´åˆã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼èªè¨¼ãƒ‡ãƒ¼ã‚¿ã‚’設定ã—ã¾ã›ã‚“。</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 プロキシサーãƒãƒ¼çµŒç”±æŽ¥ç¶š] ã«è¨­å®šã—ã€çµŒç”±ã™ã‚‹ SOCKS プロキシサーãƒãƒ¼ã®ãƒ›ã‚¹ãƒˆåã¨ãƒãƒ¼ãƒˆç•ªå·ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼åã¨ãƒ‘スワード (å¿…è¦ãªå ´åˆ) を指定ã—ã¾ã™ã€‚<BR>経由ã™ã‚‹ SOCKS サーãƒãƒ¼ã¯ã€SOCKS ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 4 ã«å¯¾å¿œã—ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚<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>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">
+ [ホストå:ãƒãƒ¼ãƒˆç•ªå·] ã®å½¢å¼ã§ã€çµŒç”±ã™ã‚‹ SOCKS プロキシサーãƒãƒ¼ã®ãƒ›ã‚¹ãƒˆåã€ã¾ãŸã¯ IP アドレスã¨ãƒãƒ¼ãƒˆç•ªå·ã‚’指定ã—ã¾ã™ã€‚</td>
+ </tr>
+ <tr>
+ <td class="tableStandard" width="125"><i>/USERNAME</i></td>
+ <td class="tableStandard" width="453" style="background-color: #FFFFFF">
+ 経由ã™ã‚‹ SOCKS プロキシサーãƒãƒ¼ã«æŽ¥ç¶šã™ã‚‹ãŸã‚ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼èªè¨¼ãŒå¿…è¦ãªå ´åˆã€ãƒ¦ãƒ¼ã‚¶ãƒ¼åを指定ã—ã¾ã™ã€‚ã¾ãŸã€åŒæ™‚ã« /PASSWORD パラメータも指定ã—ã¾ã™ã€‚/USERNAME 㨠/PASSWORD パラメータãŒæŒ‡å®šã•ã‚Œãªã„å ´åˆã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼èªè¨¼ãƒ‡ãƒ¼ã‚¿ã‚’設定ã—ã¾ã›ã‚“。</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 Server ã®æ示ã™ã‚‹ SSL 証明書ãŒä¿¡é ¼ã§ãã‚‹ã‹ã©ã†ã‹æ¤œæŸ»ã™ã‚‹ã‚ªãƒ—ションを有効ã«ã—ã¾ã™ã€‚<BR>ã“ã®ã‚ªãƒ—ションãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹å ´åˆã€æŽ¥ç¶šå…ˆã‚µãƒ¼ãƒãƒ¼ã® SSL 証明書をã‚らã‹ã˜ã‚ CascadeServerCertSet コマンドã§ã‚«ã‚¹ã‚±ãƒ¼ãƒ‰æŽ¥ç¶šè¨­å®šå†…ã«ä¿å­˜ã—ã¦ãŠãã‹ã€ã¾ãŸã¯ä»®æƒ³ HUB ã®ä¿¡é ¼ã™ã‚‹è¨¼æ˜Žæ©Ÿé–¢ã®è¨¼æ˜Žæ›¸ä¸€è¦§ã«ã€ã‚µãƒ¼ãƒãƒ¼ã® SSL 証明書を署åã—ãŸãƒ«ãƒ¼ãƒˆè¨¼æ˜Žæ›¸ã‚’ CAAdd コマンドãªã©ã§ç™»éŒ²ã—ã¦ãŠãå¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚<BR>カスケード接続ã®ã€ã‚µãƒ¼ãƒãƒ¼è¨¼æ˜Žæ›¸ã®æ¤œè¨¼ã‚ªãƒ—ションãŒæœ‰åŠ¹ã«ãªã£ã¦ã„る状態ã§æŽ¥ç¶šã—㟠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>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 ã«å¯¾ã—ã¦æŽ¥ç¶šã™ã‚‹éš›ã«ã€æŽ¥ç¶šå…ˆã® VPN Server ã®æ示ã™ã‚‹ SSL 証明書ãŒã€ä¿¡é ¼ã§ãã‚‹ã‹ã©ã†ã‹æ¤œæŸ»ã™ã‚‹ã‚ªãƒ—ションを無効ã«ã—ã¾ã™ã€‚<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>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 ã«å¯¾ã—ã¦æŽ¥ç¶šã™ã‚‹éš›ã«ã€æŽ¥ç¶šå…ˆã® VPN Server ã®æ示ã™ã‚‹ SSL 証明書ã¨åŒã˜è¨¼æ˜Žæ›¸ã‚’ã‚らã‹ã˜ã‚登録ã—ã¾ã™ã€‚<BR>カスケード接続ã®ã€ã‚µãƒ¼ãƒãƒ¼è¨¼æ˜Žæ›¸ã®æ¤œè¨¼ã‚ªãƒ—ションãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹å ´åˆã€æŽ¥ç¶šå…ˆã‚µãƒ¼ãƒãƒ¼ã® SSL 証明書をã€ã‚らã‹ã˜ã‚ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã§ã‚«ã‚¹ã‚±ãƒ¼ãƒ‰æŽ¥ç¶šè¨­å®šå†…ã«ä¿å­˜ã—ã¦ãŠãã‹ã€ã¾ãŸã¯ä»®æƒ³ HUB ã®ä¿¡é ¼ã™ã‚‹è¨¼æ˜Žæ©Ÿé–¢ã®è¨¼æ˜Žæ›¸ä¸€è¦§ã«ã€ã‚µãƒ¼ãƒãƒ¼ã® SSL 証明書を署åã—ãŸãƒ«ãƒ¼ãƒˆè¨¼æ˜Žæ›¸ã‚’ CAAdd コマンドãªã©ã§ç™»éŒ²ã—ã¦ãŠãå¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚<BR>カスケード接続ã®ã€ã‚µãƒ¼ãƒãƒ¼è¨¼æ˜Žæ›¸ã®æ¤œè¨¼ã‚ªãƒ—ションãŒæœ‰åŠ¹ã«ãªã£ã¦ã„る状態ã§æŽ¥ç¶šã—㟠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>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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ã‚¯ãƒ©ã‚¹ã‚¿ã¨ã—ã¦å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã®ä»®æƒ³ 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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ã‚¯ãƒ©ã‚¹ã‚¿ã¨ã—ã¦å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã®ä»®æƒ³ 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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ã‚¯ãƒ©ã‚¹ã‚¿ã¨ã—ã¦å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã®ä»®æƒ³ 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 本程度をã€ãƒ€ã‚¤ãƒ¤ãƒ«ã‚¢ãƒƒãƒ—ç­‰ã®ä½Žé€Ÿãªå ´åˆã¯ 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" を指定ã—ã¾ã™ã€‚2 本以上㮠TCP コãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’æŸã­ã¦ VPN 通信を行ã†éš›ã€ã€ŒåŠäºŒé‡ãƒ¢ãƒ¼ãƒ‰ã€ã‚’使用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚åŠäºŒé‡ãƒ¢ãƒ¼ãƒ‰ã‚’有効ã«ã™ã‚‹ã¨ã€è‡ªå‹•çš„ã«å„ 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 ã«ç™»éŒ²ã•ã‚Œã¦ã„るカスケード接続を指定ã—ã€ãã®ã‚«ã‚¹ã‚±ãƒ¼ãƒ‰æŽ¥ç¶šãŒç¢ºç«‹ã—ãŸéš›ã«ã€ä»®æƒ³ HUB ã§ç”Ÿæˆã•ã‚Œã‚‹ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«é©ç”¨ã™ã‚‹ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒãƒªã‚·ãƒ¼ã®å†…容を変更ã—ã¾ã™ã€‚<BR>仮想 HUB ãŒåˆ¥ã® VPN Server ã«ã‚«ã‚¹ã‚±ãƒ¼ãƒ‰æŽ¥ç¶šã™ã‚‹ã¨ã€ã‚«ã‚¹ã‚±ãƒ¼ãƒ‰æŽ¥ç¶šå…ƒã®ä»®æƒ³ HUB ã«ã¯ã€Œã‚«ã‚¹ã‚±ãƒ¼ãƒ‰ã‚»ãƒƒã‚·ãƒ§ãƒ³ã€ãŒæ–°ã—ã生æˆã•ã‚Œã¾ã™ã€‚ãã®ã‚«ã‚¹ã‚±ãƒ¼ãƒ‰ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«è¨­å®šã™ã‚‹ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒãƒªã‚·ãƒ¼ã®å†…容をã€ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã§è¨­å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<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>[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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ã‚¯ãƒ©ã‚¹ã‚¿ã¨ã—ã¦å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã®ä»®æƒ³ 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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ã‚¯ãƒ©ã‚¹ã‚¿ã¨ã—ã¦å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã®ä»®æƒ³ 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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ã‚¯ãƒ©ã‚¹ã‚¿ã¨ã—ã¦å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã®ä»®æƒ³ 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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ã‚¯ãƒ©ã‚¹ã‚¿ã¨ã—ã¦å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã®ä»®æƒ³ 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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ã‚¯ãƒ©ã‚¹ã‚¿å†…ã§ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¡ãƒ³ãƒã‚µãƒ¼ãƒãƒ¼ã¨ã—ã¦å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã®ä»®æƒ³ 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 ã®ã‚ˆã†ã« 16 進数㨠"-" ã‹ ":" ã®åŒºåˆ‡ã‚Šæ–‡å­—を使用ã—ã¦æŒ‡å®šã—ã¾ã™ã€‚区切り文字ã¯çœç•¥ã§ãã¾ã™ã€‚</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アドレス/マスク" ã®å½¢å¼ã§æŒ‡å®šã—ã¾ã™ã€‚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>/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 プロトコル番å·ã‚’ 10 進数ã§å…¥åŠ›ã™ã‚‹ã‹ã€"tcp" (TCP/IP プロトコルã€6 番)ã€"udp" (UDP/IP プロトコルã€17番)ã€"icmpv4" (ICMPv4 プロトコルã€1 番)ã€"icmpv6" (ICMPv6 プロトコルã€58 番)ã€"ip" (ã™ã¹ã¦ã® IP プロトコルã€0 番) ã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã‚’指定ã—ã¾ã™ã€‚ã™ã¹ã¦ã® 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 ã®ã‚¢ã‚¯ã‚»ã‚¹ãƒªã‚¹ãƒˆã«ã€æ–°ã—ã„ルールを追加ã—ã¾ã™ã€‚通éŽæ™‚ã«é…延・ジッタ・パケットロスを発生ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<BR>アクセスリストã¨ã¯ã€ä»®æƒ³ 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>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">
+ パケットãŒã€ã“ã®ãƒ«ãƒ¼ãƒ«ã®æ¡ä»¶ã«ä¸€è‡´ã—ãŸå ´åˆã®å‹•ä½œã‚’決定ã—ã¾ã™ã€‚pass を指定ã™ã‚‹ã¨ [通éŽ] ã‚’ã€discard を指定ã™ã‚‹ã¨ [破棄] ã‚’æ„味ã—ã¾ã™ã€‚é…延・ジッタ・パケットロス設定ã¯ã€pass ã®å ´åˆã®ã¿é©ç”¨ã•ã‚Œã¾ã™ã€‚</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 ã®ã‚ˆã†ã« 16 進数㨠"-" ã‹ ":" ã®åŒºåˆ‡ã‚Šæ–‡å­—を使用ã—ã¦æŒ‡å®šã—ã¾ã™ã€‚区切り文字ã¯çœç•¥ã§ãã¾ã™ã€‚</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アドレス/マスク" ã®å½¢å¼ã§æŒ‡å®šã—ã¾ã™ã€‚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>/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 プロトコル番å·ã‚’ 10 進数ã§å…¥åŠ›ã™ã‚‹ã‹ã€"tcp" (TCP/IP プロトコルã€6 番)ã€"udp" (UDP/IP プロトコルã€17番)ã€"icmpv4" (ICMPv4 プロトコルã€1 番)ã€"icmpv6" (ICMPv6 プロトコルã€58 番)ã€"ip" (ã™ã¹ã¦ã® IP プロトコルã€0 番) ã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã‚’指定ã—ã¾ã™ã€‚ã™ã¹ã¦ã® 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>
+ <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] [/SRCUSERNAME:username] [/DESTUSERNAME:username] [/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">
+ パケットãŒã€ã“ã®ãƒ«ãƒ¼ãƒ«ã®æ¡ä»¶ã«ä¸€è‡´ã—ãŸå ´åˆã®å‹•ä½œã‚’決定ã—ã¾ã™ã€‚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 ã®ã‚ˆã†ã« 16 進数㨠"-" ã‹ ":" ã®åŒºåˆ‡ã‚Šæ–‡å­—を使用ã—ã¦æŒ‡å®šã—ã¾ã™ã€‚区切り文字ã¯çœç•¥ã§ãã¾ã™ã€‚</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:: ã®ã‚ˆã†ã« 16 進数をコロンã§åŒºåˆ‡ã£ã¦æŒ‡å®šã—ã¾ã™ã€‚マスク㯠ffff:ffff:ffff:ffff:: ã®ã‚ˆã†ã« IPv6 å½¢å¼ã§åŒºåˆ‡ã£ã¦æŒ‡å®šã™ã‚‹ã‹ã€64 ã®ã‚ˆã†ã«å…ˆé ­ã‹ã‚‰ã®ãƒ“ット長を 10 進数ã§æŒ‡å®šã—ã¾ã™ã€‚å˜ä¸€ã® IPv6 ホストを指定ã™ã‚‹ã«ã¯ã€ãƒžã‚¹ã‚¯ã‚’ ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff ã¾ãŸã¯ 128 ã¨ã—ã¦æŒ‡å®šã—ã¾ã™ã€‚ã™ã¹ã¦ã® IPv6 ホストを指定ã™ã‚‹ã«ã¯ã€"::/0" ã¨æŒ‡å®šã—ã¾ã™ã€‚</td>
+ </tr>
+ <tr>
+ <td class="tableStandard" width="125"><i>/DESTIP</i></td>
+ <td class="tableStandard" width="453" style="background-color: #FFFFFF">
+ ルールã®æ¡ä»¶ã¨ã—ã¦ã€å®›å…ˆ IPv6 アドレスを "IPアドレス/マスク" ã®å½¢å¼ã§æŒ‡å®šã—ã¾ã™ã€‚指定方法㯠/SRCIP パラメータã¨åŒæ§˜ã§ã™ã€‚</td>
+ </tr>
+ <tr>
+ <td class="tableStandard" width="125"><i>/PROTOCOL</i></td>
+ <td class="tableStandard" width="453" style="background-color: #FFFFFF">
+ ルールã®æ¡ä»¶ã¨ã—ã¦ã€ãƒ—ロトコルã®ç¨®é¡žã‚’指定ã—ã¾ã™ã€‚IP プロトコル番å·ã‚’ 10 進数ã§å…¥åŠ›ã™ã‚‹ã‹ã€"tcp" (TCP/IP プロトコルã€6 番)ã€"udp" (UDP/IP プロトコルã€17番)ã€"icmpv4" (ICMPv4 プロトコルã€1 番)ã€"icmpv6" (ICMPv6 プロトコルã€58 番)ã€"ip" (ã™ã¹ã¦ã® IP プロトコルã€0 番) ã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã‚’指定ã—ã¾ã™ã€‚ã™ã¹ã¦ã® 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.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 ã®ã‚¢ã‚¯ã‚»ã‚¹ãƒªã‚¹ãƒˆã«ã€æ–°ã—ã„ルールを追加ã—ã¾ã™ã€‚通éŽæ™‚ã«é…延・ジッタ・パケットロスを発生ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<BR>アクセスリストã¨ã¯ã€ä»®æƒ³ 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>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] [/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> "AccessAddEx6" コマンドã§æŒ‡å®šã™ã‚‹ã“ã¨ãŒã§ãるパラメータ引数ã®ä¸€è¦§:</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 を指定ã™ã‚‹ã¨ [破棄] ã‚’æ„味ã—ã¾ã™ã€‚é…延・ジッタ・パケットロス設定ã¯ã€pass ã®å ´åˆã®ã¿é©ç”¨ã•ã‚Œã¾ã™ã€‚</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 ã®ã‚ˆã†ã« 16 進数㨠"-" ã‹ ":" ã®åŒºåˆ‡ã‚Šæ–‡å­—を使用ã—ã¦æŒ‡å®šã—ã¾ã™ã€‚区切り文字ã¯çœç•¥ã§ãã¾ã™ã€‚</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:: ã®ã‚ˆã†ã« 16 進数をコロンã§åŒºåˆ‡ã£ã¦æŒ‡å®šã—ã¾ã™ã€‚マスク㯠ffff:ffff:ffff:ffff:: ã®ã‚ˆã†ã« IPv6 å½¢å¼ã§åŒºåˆ‡ã£ã¦æŒ‡å®šã™ã‚‹ã‹ã€64 ã®ã‚ˆã†ã«å…ˆé ­ã‹ã‚‰ã®ãƒ“ット長を 10 進数ã§æŒ‡å®šã—ã¾ã™ã€‚å˜ä¸€ã® IPv6 ホストを指定ã™ã‚‹ã«ã¯ã€ãƒžã‚¹ã‚¯ã‚’ ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff ã¾ãŸã¯ 128 ã¨ã—ã¦æŒ‡å®šã—ã¾ã™ã€‚ã™ã¹ã¦ã® IPv6 ホストを指定ã™ã‚‹ã«ã¯ã€"::/0" ã¨æŒ‡å®šã—ã¾ã™ã€‚</td>
+ </tr>
+ <tr>
+ <td class="tableStandard" width="125"><i>/DESTIP</i></td>
+ <td class="tableStandard" width="453" style="background-color: #FFFFFF">
+ ルールã®æ¡ä»¶ã¨ã—ã¦ã€å®›å…ˆ IPv6 アドレスを "IPアドレス/マスク" ã®å½¢å¼ã§æŒ‡å®šã—ã¾ã™ã€‚指定方法㯠/SRCIP パラメータã¨åŒæ§˜ã§ã™ã€‚</td>
+ </tr>
+ <tr>
+ <td class="tableStandard" width="125"><i>/PROTOCOL</i></td>
+ <td class="tableStandard" width="453" style="background-color: #FFFFFF">
+ ルールã®æ¡ä»¶ã¨ã—ã¦ã€ãƒ—ロトコルã®ç¨®é¡žã‚’指定ã—ã¾ã™ã€‚IP プロトコル番å·ã‚’ 10 進数ã§å…¥åŠ›ã™ã‚‹ã‹ã€"tcp" (TCP/IP プロトコルã€6 番)ã€"udp" (UDP/IP プロトコルã€17番)ã€"icmpv4" (ICMPv4 プロトコルã€1 番)ã€"icmpv6" (ICMPv6 プロトコルã€58 番)ã€"ip" (ã™ã¹ã¦ã® IP プロトコルã€0 番) ã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã‚’指定ã—ã¾ã™ã€‚ã™ã¹ã¦ã® 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>
+ <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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ã‚¯ãƒ©ã‚¹ã‚¿å†…ã§ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¡ãƒ³ãƒã‚µãƒ¼ãƒãƒ¼ã¨ã—ã¦å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã®ä»®æƒ³ 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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ã‚¯ãƒ©ã‚¹ã‚¿å†…ã§ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¡ãƒ³ãƒã‚µãƒ¼ãƒãƒ¼ã¨ã—ã¦å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã®ä»®æƒ³ 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 を指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ID 㯠AccessList コマンドã§è¡¨ç¤ºã§ãã¾ã™ã€‚<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>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 を指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ID 㯠AccessList コマンドã§è¡¨ç¤ºã§ãã¾ã™ã€‚<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>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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ã‚¯ãƒ©ã‚¹ã‚¿å†…ã§ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¡ãƒ³ãƒã‚µãƒ¼ãƒãƒ¼ã¨ã—ã¦å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã®ä»®æƒ³ 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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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>ãŸã ã—ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼åã‚’ "*" (アスタリスク 1 文字) ã¨ã—ã¦ä½œæˆã—ãŸãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã€è‡ªå‹•çš„ã« RADIUS èªè¨¼ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¨ã—ã¦ç™»éŒ²ã•ã‚Œã¾ã™ã€‚"*" ã¨ã„ã†åå‰ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒå­˜åœ¨ã™ã‚‹å ´åˆã«é™ã‚Šã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒ VPN Server ã«æŽ¥ç¶šã—ãŸéš›ã«æ示ã—ãŸãƒ¦ãƒ¼ã‚¶ãƒ¼åãŒæ—¢å­˜ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åã¨ä¸€è‡´ã—ãªã„ユーザーã¯ã€ãã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒå…¥åŠ›ã—ãŸãƒ¦ãƒ¼ã‚¶ãƒ¼åã¨ãƒ‘スワードã«ã‚ˆã£ã¦ã€RADIUS サーãƒãƒ¼ã¾ãŸã¯ NT ドメインコントローラã«ã‚ˆã£ã¦èªè¨¼ã•ã‚Œã‚‹ã“ã¨ãŒã§ãã€ãã®å ´åˆã®èªè¨¼è¨­å®šã‚„セキュリティãƒãƒªã‚·ãƒ¼ã®è¨­å®šã¯ "*" ユーザーã«è¨­å®šã«æº–æ‹ ã—ã¾ã™ã€‚<BR>一度作æˆã—ãŸãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼æƒ…報を変更ã™ã‚‹ã«ã¯ã€UserSet コマンドを使用ã—ã¾ã™ã€‚<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>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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã§å¤‰æ›´ã§ãるユーザーã®æƒ…å ±ã¯ã€UserCreate コマンドã§ã€æ–°ã—ãユーザーを作æˆã™ã‚‹ã¨ãã«æŒ‡å®šã™ã‚‹ã€Œã‚°ãƒ«ãƒ¼ãƒ—åã€ã€ã€Œæœ¬åã€ãŠã‚ˆã³ã€Œèª¬æ˜Žã€ã® 3 é …ç›®ã§ã™ã€‚<BR>ç¾åœ¨ç™»éŒ²ã•ã‚Œã¦ã„るユーザーã®ä¸€è¦§ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€UserList コマンドを使用ã—ã¦ãã ã•ã„。<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>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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ã‚¯ãƒ©ã‚¹ã‚¿å†…ã§ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¡ãƒ³ãƒã‚µãƒ¼ãƒãƒ¼ã¨ã—ã¦å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã®ä»®æƒ³ 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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ã‚¯ãƒ©ã‚¹ã‚¿å†…ã§ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¡ãƒ³ãƒã‚µãƒ¼ãƒãƒ¼ã¨ã—ã¦å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã®ä»®æƒ³ 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 ã®ã€ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ç™»éŒ²ã•ã‚Œã¦ã„るユーザーã®èªè¨¼æ–¹æ³•ã‚’「匿åèªè¨¼ã€ã«è¨­å®šã—ã¾ã™ã€‚匿åèªè¨¼ã«è¨­å®šã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åã§ä»®æƒ³ HUB ã«æŽ¥ç¶šã—㟠VPN Client ã¯ã€ã„ã‹ãªã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼èªè¨¼ã‚‚å—ã‘ãšã«ç„¡æ¡ä»¶ã§ä»®æƒ³ HUB ã«æŽ¥ç¶šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚匿åèªè¨¼æ©Ÿèƒ½ã¯ã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆãªã©ã§åºƒã誰ã§ã‚‚接続ã§ãるよã†ãªè¨­å®šã§å…¬é–‹ã™ã‚‹ VPN Server ã«æœ€é©ã§ã™ã€‚<BR>ç¾åœ¨ç™»éŒ²ã•ã‚Œã¦ã„るユーザーã®ä¸€è¦§ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€UserList コマンドを使用ã—ã¦ãã ã•ã„。<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>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 ã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å†…ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ オブジェクトã«å¯¾ã—ã¦ä»»æ„ã®ãƒ‘スワードを設定ã—ã¦ãŠãã€ãã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åã§ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒä»®æƒ³ HUB ã«æŽ¥ç¶šã—よã†ã¨ã—ãŸéš›ã«ãƒ‘スワードã®å…¥åŠ›ã‚’求ã‚ã€ãã®ãƒ‘スワードãŒä¸€è‡´ã—ãŸå ´åˆã«æŽ¥ç¶šã‚’許å¯ã™ã‚‹èªè¨¼æ–¹æ³•ã§ã™ã€‚<BR>実際ã«ã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ‘スワードã¯ãƒãƒƒã‚·ãƒ¥åŒ–ã•ã‚Œä¿å­˜ã•ã‚Œã‚‹ã®ã§ã€VPN Server ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã‚’解æžã—ã¦ã‚‚å…ƒã®ãƒ‘スワードã¯ã‚ã‹ã‚Šã¾ã›ã‚“。<BR>ç¾åœ¨ç™»éŒ²ã•ã‚Œã¦ã„るユーザーã®ä¸€è¦§ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€UserList コマンドを使用ã—ã¦ãã ã•ã„。<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>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 ã®ã€ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ç™»éŒ²ã•ã‚Œã¦ã„るユーザーã®èªè¨¼æ–¹æ³•ã‚’「固有証明書èªè¨¼ã€ã«è¨­å®šã—ã¾ã™ã€‚固有証明書èªè¨¼ã¨ã¯ã€ä»®æƒ³ HUB ã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å†…ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ オブジェクトã«å¯¾ã—㦠1 ã¤ã® X.509 証明書を設定ã—ã¦ãŠãã€ãã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åã§ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒä»®æƒ³ HUB ã«æŽ¥ç¶šã—よã†ã¨ã—ãŸéš›ã«ã€æ示ã—ãŸè¨¼æ˜Žæ›¸ãŒç™»éŒ²ã•ã‚Œã¦ã„る証明書ã¨ä¸€è‡´ã—ã€ã‹ã¤ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒãã®è¨¼æ˜Žæ›¸ã«å¯¾å¿œã™ã‚‹ç§˜å¯†éµã‚’ä¿æŒã—ã¦ã„ã‚‹ã‹ã‚’ RSA アルゴリズムã§æ¤œè¨¼ã™ã‚‹ã“ã¨ã«ã‚ˆã£ã¦æŽ¥ç¶šã‚’許å¯ã™ã‚‹èªè¨¼æ–¹æ³•ã§ã™ã€‚<BR>ç¾åœ¨ç™»éŒ²ã•ã‚Œã¦ã„るユーザーã®ä¸€è¦§ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€UserList コマンドを使用ã—ã¦ãã ã•ã„。<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>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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ã‚¯ãƒ©ã‚¹ã‚¿å†…ã§ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¡ãƒ³ãƒã‚µãƒ¼ãƒãƒ¼ã¨ã—ã¦å‹•ä½œã—ã¦ã„ã‚‹ VPN Server ã®ä»®æƒ³ 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 アルゴリズムã§æ¤œè¨¼ã™ã‚‹ã“ã¨ã«ã‚ˆã£ã¦æŽ¥ç¶šã‚’許å¯ã™ã‚‹èªè¨¼æ–¹æ³•ã§ã™ã€‚<BR>ã¾ãŸã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã”ã¨ã«æœŸå¾…ã™ã‚‹è¨¼æ˜Žæ›¸ã® Common Name (CN)ã€ãŠã‚ˆã³ã‚·ãƒªã‚¢ãƒ«ç•ªå·ã‚’登録ã—ã¦ãŠãã€å‰è¨˜ã®æ¤œè¨¼ã‚’通éŽã—ãŸå¾Œè¨¼æ˜Žæ›¸ã®å†…容ãŒè¨­å®šã•ã‚ŒãŸå€¤ã«ä¸€è‡´ã—ãŸå ´åˆã«ã®ã¿æŽ¥ç¶šã‚’許å¯ã™ã‚‹ã‚ˆã†ã«ã™ã‚‹è¨­å®šã‚‚å¯èƒ½ã§ã™ã€‚<BR>ç¾åœ¨ç™»éŒ²ã•ã‚Œã¦ã„るユーザーã®ä¸€è¦§ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€UserList コマンドを使用ã—ã¦ãã ã•ã„。<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>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">
+ ã“ã®ãƒ‘ラメータを指定ã—ãŸå ´åˆã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒæ示ã—ãŸè¨¼æ˜Žæ›¸ãŒä¿¡é ¼ã§ãる証明機関ã«ã‚ˆã£ã¦ç½²åã•ã‚Œã¦ã„ã‚‹ã‹ã©ã†ã‹ã‚’検証ã—ãŸå¾Œã«ã€ãã®è¨¼æ˜Žæ›¸ã® Common Name (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": ユーザーã®èªè¨¼æ–¹æ³•ã‚’ 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">UserRadiusSet</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 èªè¨¼ã«è¨­å®šã•ã‚Œã¦ã„るユーザーåã§ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒä»®æƒ³ HUB ã«æŽ¥ç¶šã—ãŸéš›ã«ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼åã¨ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒå…¥åŠ›ã—ãŸãƒ‘スワード㌠RADIUS サーãƒãƒ¼ã«é€ä¿¡ã•ã‚Œã€RADIUS サーãƒãƒ¼ãŒãƒ¦ãƒ¼ã‚¶ãƒ¼åã¨ãƒ‘スワードã®ãƒã‚§ãƒƒã‚¯ã‚’è¡Œã£ãŸå¾Œã«èªè¨¼ãŒæˆåŠŸã™ã‚‹ã¨ã€ãã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã® VPN 接続ãŒè¨±å¯ã•ã‚Œã¾ã™ã€‚<BR>Radius èªè¨¼ã‚’使用ã™ã‚‹ã«ã¯ã€ã‚らã‹ã˜ã‚ RadiusServerSet コマンドを使用ã—ã¦ä½¿ç”¨ã™ã‚‹ RADIUS サーãƒãƒ¼ã‚’仮想 HUB ã«è¨­å®šã—ã¦ãŠãå¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚<BR>ç¾åœ¨ç™»éŒ²ã•ã‚Œã¦ã„るユーザーã®ä¸€è¦§ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€UserList コマンドを使用ã—ã¦ãã ã•ã„。<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>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">
+ ã“ã®ãƒ‘ラメータãŒè¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€RADIUS サーãƒãƒ¼ã«å¯¾ã—ã¦é€ä¿¡ã•ã‚Œã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼åã‚’ã€ä»®æƒ³ 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 / Server 2008 R2 / Server 2012 ã®ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ©ã€ã¾ãŸã¯ Active Directory サーãƒãƒ¼ã«é€ä¿¡ã•ã‚Œã€èªè¨¼ã‚µãƒ¼ãƒãƒ¼ãŒãƒ¦ãƒ¼ã‚¶ãƒ¼åã¨ãƒ‘スワードã®ãƒã‚§ãƒƒã‚¯ã‚’è¡Œã£ãŸå¾Œã«èªè¨¼ãŒæˆåŠŸã™ã‚‹ã¨ã€ãã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã® VPN 接続ãŒè¨±å¯ã•ã‚Œã¾ã™ã€‚<BR>NT ドメインèªè¨¼ã‚’使用ã™ã‚‹ã«ã¯ã€VPN Server ãŒãã®ãƒ‰ãƒ¡ã‚¤ãƒ³ã«æŽ¥ç¶šã•ã‚Œã¦ã„ã‚‹ Windows NT 4.0, Windows 2000, Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008, Windows 7, Windows Server 2008 R2, Windows 8, Windows Server 2012 ã®ã„ãšã‚Œã‹ã®ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ä¸Šã§å‹•ä½œã—ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚詳ã—ã㯠VPN Server ã®ç®¡ç†è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。<BR>ç¾åœ¨ç™»éŒ²ã•ã‚Œã¦ã„るユーザーã®ä¸€è¦§ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€UserList コマンドを使用ã—ã¦ãã ã•ã„。<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>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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€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>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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€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>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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€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>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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 Server ã®ä»®æƒ³ HUB ã§ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“。</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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 ㌠Ethernet フレームã®ã‚¹ã‚¤ãƒƒãƒãƒ³ã‚°å‹•ä½œã‚’è¡Œã†ãŸã‚ã«å¿…è¦ãªãƒ†ãƒ¼ãƒ–ルã§ã€ä»®æƒ³ HUB 㯠MAC アドレステーブルデータベースã«åŸºã¥ã„ã¦ã€å„ Ethernet フレームã®æŒ¯ã‚Šåˆ†ã‘先セッションを決定ã—ã¾ã™ã€‚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 アドレステーブルデータベースã¯ã€ã©ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ãŒã©ã® IP アドレスを使用ã—ã¦ã„ã‚‹ã‹ã‚’常ã«ä»®æƒ³ HUB ãŒæŠŠæ¡ã™ã‚‹ãŸã‚ã«ã€è‡ªå‹•çš„ã«é€šä¿¡å†…容を分æžã—ã¦ç”Ÿæˆã•ã‚Œã‚‹ãƒ†ãƒ¼ãƒ–ルã§ã€ä»®æƒ³ 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 サーãƒãƒ¼æ©Ÿèƒ½ (SecureNAT 機能) ã®æœ‰åŠ¹åŒ–</h3>
+ <table border="1" cellspacing="0" width="100%" 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 サーãƒãƒ¼æ©Ÿèƒ½ (SecureNAT 機能) ã®æœ‰åŠ¹åŒ–</td>
+ </tr>
+ <tr>
+ <td class="tableStandard" width="125"><b>説明</b></td>
+ <td class="tableStandard" width="453" style="background-color: #FFFFFF">
+ ç¾åœ¨ç®¡ç†ã—ã¦ã„る仮想 HUB 内ã§ã€ä»®æƒ³ NAT ãŠã‚ˆã³ DHCP サーãƒãƒ¼æ©Ÿèƒ½ (SecureNAT 機能) を有効化ã—ã€å‹•ä½œã‚’開始ã—ã¾ã™ã€‚ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹å‰ã«ã€å¿…ãš SecureNatHostGet コマンドã€NatGet コマンドãŠã‚ˆã³ DhcpGet コマンドã§ã€ç¾åœ¨ã®ä»®æƒ³ NAT 機能ãŠã‚ˆã³ DHCP サーãƒãƒ¼æ©Ÿèƒ½ã®è¨­å®šå†…容を確èªã—ã¦ãã ã•ã„。<BR>SecureNAT 機能を有効ã«ã™ã‚‹ã¨ã€ä»®æƒ³ HUB 内ã®ä»®æƒ³ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«ãŠã„㦠NAT ルータ (IP マスカレード) ã‚„ DHCP サーãƒãƒ¼æ©Ÿèƒ½ã‚’仮想的ã«å‹•ä½œã•ã›ã‚‹ã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚<BR><BR>[SecureNAT 機能ã«é–¢ã™ã‚‹è­¦å‘Š]<BR>SecureNAT 機能ã¯ã‚·ã‚¹ãƒ†ãƒ ç®¡ç†è€…ã‚„ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«é–¢ã—ã¦è©³ã—ã„知識ã®ã‚ã‚‹æ–¹å‘ã‘ã®æ©Ÿèƒ½ã§ã™ã€‚<BR>SecureNAT 機能を正ã—ã使用ã™ã‚‹ã¨ã€VPN を経由ã—ãŸå®‰å…¨ãªãƒªãƒ¢ãƒ¼ãƒˆã‚¢ã‚¯ã‚»ã‚¹ãŒå®Ÿç¾ã§ãã¾ã™ã€‚ã—ã‹ã—ã€èª¤ã£ãŸæ–¹æ³•ã§ä½¿ç”¨ã™ã‚‹ã¨ã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯å…¨ä½“ã‚’å±é™ºãªçŠ¶æ…‹ã«ã™ã‚‹å¯èƒ½æ€§ã‚‚ã‚ã‚Šã¾ã™ã€‚ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«é–¢ã™ã‚‹å分ãªçŸ¥è­˜ã‚’ãŠæŒã¡ã§ãªã„å ´åˆã‚„ã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ç®¡ç†è€…ã®è¨±å¯ã‚’å¾—ã¦ã„ãªã„å ´åˆã¯ã€SecureNAT 機能を有効ã«ã—ãªã„ã§ãã ã•ã„。SecureNAT 機能ã«é–¢ã™ã‚‹è©³ã—ã„説明ã¯ã€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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.4.90 "SecureNatDisable": 仮想 NAT ãŠã‚ˆã³ DHCP サーãƒãƒ¼æ©Ÿèƒ½ (SecureNAT 機能) ã®ç„¡åŠ¹åŒ–</h3>
+ <table border="1" cellspacing="0" width="100%" 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 サーãƒãƒ¼æ©Ÿèƒ½ (SecureNAT 機能) ã®ç„¡åŠ¹åŒ–</td>
+ </tr>
+ <tr>
+ <td class="tableStandard" width="125"><b>説明</b></td>
+ <td class="tableStandard" width="453" style="background-color: #FFFFFF">
+ ç¾åœ¨ç®¡ç†ã—ã¦ã„る仮想 HUB 内ã§ã€ä»®æƒ³ NAT ãŠã‚ˆã³ DHCP サーãƒãƒ¼æ©Ÿèƒ½ (SecureNAT 機能) を無効化ã—ã¾ã™ã€‚ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã¨ã€ä»®æƒ³ NAT 機能ã¯ç›´ã¡ã«å‹•ä½œã‚’åœæ­¢ã—ã€ä»®æƒ³ DHCP サーãƒãƒ¼æ©Ÿèƒ½ã¯ä¿æŒã—ã¦ã„ã‚‹ DHCP リースデータベースを削除ã—サービスをåœæ­¢ã—ã¾ã™ã€‚<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>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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.4.91 "SecureNatStatusGet": 仮想 NAT ãŠã‚ˆã³ DHCP サーãƒãƒ¼æ©Ÿèƒ½ (SecureNAT 機能) ã®å‹•ä½œçŠ¶æ³ã®å–å¾—</h3>
+ <table border="1" cellspacing="0" width="100%" 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 サーãƒãƒ¼æ©Ÿèƒ½ (SecureNAT 機能) ã®å‹•ä½œçŠ¶æ³ã®å–å¾—</td>
+ </tr>
+ <tr>
+ <td class="tableStandard" width="125"><b>説明</b></td>
+ <td class="tableStandard" width="453" style="background-color: #FFFFFF">
+ ç¾åœ¨ç®¡ç†ã—ã¦ã„る仮想 HUB 内ã§ã€ä»®æƒ³ NAT ãŠã‚ˆã³ DHCP サーãƒãƒ¼æ©Ÿèƒ½ (SecureNAT 機能) ãŒå‹•ä½œã—ã¦ã„ã‚‹å ´åˆã¯ã€ãã®å‹•ä½œçŠ¶æ³ã‚’å–å¾—ã—ã¾ã™ã€‚<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>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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.4.92 "SecureNatHostGet": SecureNAT 機能ã®ä»®æƒ³ãƒ›ã‚¹ãƒˆã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹è¨­å®šã®å–å¾—</h3>
+ <table border="1" cellspacing="0" width="100%" 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">
+ SecureNAT 機能ã®ä»®æƒ³ãƒ›ã‚¹ãƒˆã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹è¨­å®šã®å–å¾—</td>
+ </tr>
+ <tr>
+ <td class="tableStandard" width="125"><b>説明</b></td>
+ <td class="tableStandard" width="453" style="background-color: #FFFFFF">
+ ç¾åœ¨ç®¡ç†ã—ã¦ã„る仮想 HUB 内ã§ã€ä»®æƒ³ NAT ãŠã‚ˆã³ DHCP サーãƒãƒ¼æ©Ÿèƒ½ (SecureNAT 機能) ã®è¨­å®šé …ç›®ã®å†…ã€ä»®æƒ³ãƒ›ã‚¹ãƒˆã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹ã®è¨­å®šã‚’å–å¾—ã—ã¾ã™ã€‚<BR>SecureNAT 機能ã¯ã€ä»®æƒ³ HUB ã®å†…部ã§ã€L2 セグメント内㧠1 æžšã®ä»®æƒ³çš„㪠LAN カードをæŒã¡ã€MAC アドレス㨠IP アドレスを割り当ã¦ã‚‰ã‚Œã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã£ã¦ã€åŒä¸€ L2 セグメントã«æŽ¥ç¶šã—ã¦ã„ã‚‹ä»–ã®ãƒ›ã‚¹ãƒˆã¯ã€ã¾ã‚‹ã§å®Ÿéš›ã® IP ホストãŒãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã«å­˜åœ¨ã—ã¦ã„ã‚‹ã‹ã®ã‚ˆã†ã« SecureNAT ã®ä»®æƒ³ãƒ›ã‚¹ãƒˆã¨é€šä¿¡ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚<BR><BR>[SecureNAT 機能ã«é–¢ã™ã‚‹è­¦å‘Š]<BR>SecureNAT 機能ã¯ã‚·ã‚¹ãƒ†ãƒ ç®¡ç†è€…ã‚„ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«é–¢ã—ã¦è©³ã—ã„知識ã®ã‚ã‚‹æ–¹å‘ã‘ã®æ©Ÿèƒ½ã§ã™ã€‚<BR>SecureNAT 機能を正ã—ã使用ã™ã‚‹ã¨ã€VPN を経由ã—ãŸå®‰å…¨ãªãƒªãƒ¢ãƒ¼ãƒˆã‚¢ã‚¯ã‚»ã‚¹ãŒå®Ÿç¾ã§ãã¾ã™ã€‚ã—ã‹ã—ã€èª¤ã£ãŸæ–¹æ³•ã§ä½¿ç”¨ã™ã‚‹ã¨ã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯å…¨ä½“ã‚’å±é™ºãªçŠ¶æ…‹ã«ã™ã‚‹å¯èƒ½æ€§ã‚‚ã‚ã‚Šã¾ã™ã€‚ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«é–¢ã™ã‚‹å分ãªçŸ¥è­˜ã‚’ãŠæŒã¡ã§ãªã„å ´åˆã‚„ã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ç®¡ç†è€…ã®è¨±å¯ã‚’å¾—ã¦ã„ãªã„å ´åˆã¯ã€SecureNAT 機能を有効ã«ã—ãªã„ã§ãã ã•ã„。SecureNAT 機能ã«é–¢ã™ã‚‹è©³ã—ã„説明ã¯ã€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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.4.93 "SecureNatHostSet": SecureNAT 機能ã®ä»®æƒ³ãƒ›ã‚¹ãƒˆã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹è¨­å®šã®å¤‰æ›´</h3>
+ <table border="1" cellspacing="0" width="100%" 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">
+ SecureNAT 機能ã®ä»®æƒ³ãƒ›ã‚¹ãƒˆã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹è¨­å®šã®å¤‰æ›´</td>
+ </tr>
+ <tr>
+ <td class="tableStandard" width="125"><b>説明</b></td>
+ <td class="tableStandard" width="453" style="background-color: #FFFFFF">
+ ç¾åœ¨ç®¡ç†ã—ã¦ã„る仮想 HUB 内ã§ã€ä»®æƒ³ NAT ãŠã‚ˆã³ DHCP サーãƒãƒ¼æ©Ÿèƒ½ (SecureNAT 機能) ã®è¨­å®šé …ç›®ã®å†…ã€ä»®æƒ³ãƒ›ã‚¹ãƒˆã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹ã®è¨­å®šã‚’変更ã—ã¦ä¿å­˜ã—ã¾ã™ã€‚<BR>SecureNAT 機能ã¯ã€ä»®æƒ³ HUB ã®å†…部ã§ã€L2 セグメント内㧠1 æžšã®ä»®æƒ³çš„㪠LAN カードをæŒã¡ã€MAC アドレス㨠IP アドレスを割り当ã¦ã‚‰ã‚Œã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã£ã¦ã€åŒä¸€ L2 セグメントã«æŽ¥ç¶šã—ã¦ã„ã‚‹ä»–ã®ãƒ›ã‚¹ãƒˆã¯ã€ã¾ã‚‹ã§å®Ÿéš›ã® IP ホストãŒãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã«å­˜åœ¨ã—ã¦ã„ã‚‹ã‹ã®ã‚ˆã†ã« SecureNAT ã®ä»®æƒ³ãƒ›ã‚¹ãƒˆã¨é€šä¿¡ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚<BR><BR>[SecureNAT 機能ã«é–¢ã™ã‚‹è­¦å‘Š]<BR>SecureNAT 機能ã¯ã‚·ã‚¹ãƒ†ãƒ ç®¡ç†è€…ã‚„ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«é–¢ã—ã¦è©³ã—ã„知識ã®ã‚ã‚‹æ–¹å‘ã‘ã®æ©Ÿèƒ½ã§ã™ã€‚<BR>SecureNAT 機能を正ã—ã使用ã™ã‚‹ã¨ã€VPN を経由ã—ãŸå®‰å…¨ãªãƒªãƒ¢ãƒ¼ãƒˆã‚¢ã‚¯ã‚»ã‚¹ãŒå®Ÿç¾ã§ãã¾ã™ã€‚ã—ã‹ã—ã€èª¤ã£ãŸæ–¹æ³•ã§ä½¿ç”¨ã™ã‚‹ã¨ã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯å…¨ä½“ã‚’å±é™ºãªçŠ¶æ…‹ã«ã™ã‚‹å¯èƒ½æ€§ã‚‚ã‚ã‚Šã¾ã™ã€‚ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«é–¢ã™ã‚‹å分ãªçŸ¥è­˜ã‚’ãŠæŒã¡ã§ãªã„å ´åˆã‚„ã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ç®¡ç†è€…ã®è¨±å¯ã‚’å¾—ã¦ã„ãªã„å ´åˆã¯ã€SecureNAT 機能を有効ã«ã—ãªã„ã§ãã ã•ã„。SecureNAT 機能ã«é–¢ã™ã‚‹è©³ã—ã„説明ã¯ã€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": SecureNAT 機能ã®ä»®æƒ³ 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">
+ SecureNAT 機能ã®ä»®æƒ³ NAT 機能ã®è¨­å®šã®å–å¾—</td>
+ </tr>
+ <tr>
+ <td class="tableStandard" width="125"><b>説明</b></td>
+ <td class="tableStandard" width="453" style="background-color: #FFFFFF">
+ ç¾åœ¨ç®¡ç†ã—ã¦ã„る仮想 HUB 内ã§ã€ä»®æƒ³ NAT ãŠã‚ˆã³ DHCP サーãƒãƒ¼æ©Ÿèƒ½ (SecureNAT 機能) ã®è¨­å®šé …ç›®ã®å†…ã€ä»®æƒ³ NAT ã®è¨­å®šã‚’å–å¾—ã—ã¾ã™ã€‚<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>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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.4.95 "NatEnable": SecureNAT 機能ã®ä»®æƒ³ 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">
+ SecureNAT 機能ã®ä»®æƒ³ 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 ã®ä»®æƒ³ HUB ã§ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“。</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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.4.96 "NatDisable": SecureNAT 機能ã®ä»®æƒ³ 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">
+ SecureNAT 機能ã®ä»®æƒ³ 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 ã®ä»®æƒ³ HUB ã§ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“。</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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.4.97 "NatSet": SecureNAT 機能ã®ä»®æƒ³ 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">
+ SecureNAT 機能ã®ä»®æƒ³ 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 ã®ä»®æƒ³ HUB ã§ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“。</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 ãŒé€å‡ºã™ã‚‹ Ethernet フレーム㮠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": SecureNAT 機能ã®ä»®æƒ³ 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">
+ SecureNAT 機能ã®ä»®æƒ³ NAT 機能ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒ†ãƒ¼ãƒ–ルã®å–å¾—</td>
+ </tr>
+ <tr>
+ <td class="tableStandard" width="125"><b>説明</b></td>
+ <td class="tableStandard" width="453" style="background-color: #FFFFFF">
+ ç¾åœ¨ç®¡ç†ã—ã¦ã„る仮想 HUB 内ã§ä»®æƒ³ NAT 機能ãŒå‹•ä½œã—ã¦ã„ã‚‹å ´åˆã€ä»®æƒ³ NAT を経由ã—ã¦ç¾åœ¨é€šä¿¡ä¸­ã® TCPã€ãŠã‚ˆã³ UDP ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒ†ãƒ¼ãƒ–ル (NAT テーブル) ã‚’å–å¾—ã—ã¾ã™ã€‚<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>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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.4.99 "DhcpGet": SecureNAT 機能ã®ä»®æƒ³ 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">
+ SecureNAT 機能ã®ä»®æƒ³ DHCP サーãƒãƒ¼æ©Ÿèƒ½ã®è¨­å®šã®å–å¾—</td>
+ </tr>
+ <tr>
+ <td class="tableStandard" width="125"><b>説明</b></td>
+ <td class="tableStandard" width="453" style="background-color: #FFFFFF">
+ ç¾åœ¨ç®¡ç†ã—ã¦ã„る仮想 HUB 内ã§ã€ä»®æƒ³ NAT ãŠã‚ˆã³ DHCP サーãƒãƒ¼æ©Ÿèƒ½ (SecureNAT 機能) ã®è¨­å®šé …ç›®ã®å†…ã€ä»®æƒ³ DHCP サーãƒãƒ¼ã®è¨­å®šã‚’å–å¾—ã—ã¾ã™ã€‚<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>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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.4.100 "DhcpEnable": SecureNAT 機能ã®ä»®æƒ³ 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">
+ SecureNAT 機能ã®ä»®æƒ³ DHCP サーãƒãƒ¼æ©Ÿèƒ½ã®æœ‰åŠ¹åŒ–</td>
+ </tr>
+ <tr>
+ <td class="tableStandard" width="125"><b>説明</b></td>
+ <td class="tableStandard" width="453" style="background-color: #FFFFFF">
+ ç¾åœ¨ç®¡ç†ã—ã¦ã„る仮想 HUB 内ã§ã€ä»®æƒ³ DHCP サーãƒãƒ¼æ©Ÿèƒ½ã‚’有効ã«ã—ã¾ã™ã€‚<BR>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’用ã„ã¦ä»®æƒ³ DHCP 機能を有効ã«ã—ã¦ã‚‚ã€SecureNAT 機能ãŒå‹•ä½œã—ã¦ã„ãªã„å ´åˆã¯ã€ä»®æƒ³ DHCP サーãƒãƒ¼ã¯å‹•ä½œã—ã¾ã›ã‚“。SecureNAT 機能ã®å‹•ä½œã‚’開始ã™ã‚‹ã«ã¯ã€SecureNatEnable コマンドを使用ã—ã¾ã™ã€‚<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>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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.4.101 "DhcpDisable": SecureNAT 機能ã®ä»®æƒ³ 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">
+ SecureNAT 機能ã®ä»®æƒ³ 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 ã®ä»®æƒ³ HUB ã§ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“。</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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.4.102 "DhcpSet": SecureNAT 機能ã®ä»®æƒ³ 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">
+ SecureNAT 機能ã®ä»®æƒ³ 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 ã®ä»®æƒ³ HUB ã§ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“。</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 アドレスを指定ã—ã¾ã™ã€‚SecureNAT 機能ã®ä»®æƒ³ NAT 機能ã¨å…±ã«æœ‰åŠ¹ã«ã—ã¦ä½¿ç”¨ã™ã‚‹å ´åˆã¯ã€SecureNAT ã®ä»®æƒ³ãƒ›ã‚¹ãƒˆã® 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 サーãƒãƒ¼ã®å‹•ä½œã‚’仮想 HUB ã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒ­ã‚°ã«ä¿å­˜ã™ã‚‹ã‹ã©ã†ã‹ã‚’指定ã—ã¾ã™ã€‚"yes" を指定ã™ã‚‹ã¨ä¿å­˜ã—ã¾ã™ã€‚ã“ã®å€¤ã¯ã€ä»®æƒ³ NAT 機能ã®ãƒ­ã‚°ä¿å­˜è¨­å®šã¨é€£å‹•ã—ã¦ã„ã¾ã™ã€‚</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.4.103 "DhcpTable": SecureNAT 機能ã®ä»®æƒ³ 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">
+ SecureNAT 機能ã®ä»®æƒ³ 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 ã®ä»®æƒ³ HUB ã§ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“。</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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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>仮想 HUB 管ç†ã‚ªãƒ—ションã¯ã€VPN Server ã®ç®¡ç†è€…ãŒå„仮想 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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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>仮想 HUB 管ç†ã‚ªãƒ—ションã¯ã€VPN Server ã®ç®¡ç†è€…ãŒå„仮想 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 ã«é–¢ã™ã‚‹ã‚ˆã‚Šè©³ç´°ãªè¨­å®šã‚’è¡Œã†ã“ã¨ãŒã§ãる機能ã§ã™ã€‚<BR>仮想 HUB ã®ç®¡ç†ã‚ªãƒ—ションを追加・編集ãŠã‚ˆã³å‰Šé™¤ã™ã‚‹ã“ã¨ãŒã§ãã‚‹ã®ã¯ã€ã“ã® VPN Server 全体ã®ç®¡ç†æ¨©é™ã‚’æŒã£ãŸç®¡ç†è€…ãŠã‚ˆã³ä»®æƒ³ HUB ã®ç®¡ç†è€…ã§ã™ã€‚<BR>ãŸã ã—ã€ä»®æƒ³ HUB 管ç†ã‚ªãƒ—ション㮠deny_hub_admin_change_ext_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>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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 ã«é–¢ã™ã‚‹ã‚ˆã‚Šè©³ç´°ãªè¨­å®šã‚’è¡Œã†ã“ã¨ãŒã§ãる機能ã§ã™ã€‚<BR>仮想 HUB ã®ç®¡ç†ã‚ªãƒ—ションを追加・編集ãŠã‚ˆã³å‰Šé™¤ã™ã‚‹ã“ã¨ãŒã§ãã‚‹ã®ã¯ã€ã“ã® VPN Server 全体ã®ç®¡ç†æ¨©é™ã‚’æŒã£ãŸç®¡ç†è€…ãŠã‚ˆã³ä»®æƒ³ HUB ã®ç®¡ç†è€…ã§ã™ã€‚<BR>ãŸã ã—ã€ä»®æƒ³ HUB 管ç†ã‚ªãƒ—ション㮠deny_hub_admin_change_ext_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>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">
+ 値を変更ã™ã‚‹æ‹¡å¼µã‚ªãƒ—ションåを指定ã—ã¾ã™ã€‚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 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>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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒè¨¼æ˜Žæ›¸èªè¨¼ãƒ¢ãƒ¼ãƒ‰ã§æŽ¥ç¶šã—ã¦ããŸã¨ãã€ãã®è¨¼æ˜Žæ›¸ãŒç„¡åŠ¹ãªè¨¼æ˜Žæ›¸ã®ä¸€è¦§ã«ç™»éŒ²ã•ã‚Œã¦ã„ã‚‹ 1 ã¤ä»¥ä¸Šã®å†…容ã«ä¸€è‡´ã™ã‚‹å ´åˆã«ã€ãã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®æŽ¥ç¶šã‚’æ‹’å¦ã—ã¾ã™ã€‚<BR>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã§æŒ‡å®šã—ãŸãƒ‘ラメータã§å®šç¾©ã•ã‚Œã‚‹ã™ã¹ã¦ã®æ¡ä»¶ã«ä¸€è‡´ã—ãŸè¨¼æ˜Žæ›¸ãŒã€ç„¡åŠ¹ã¨ã—ã¦åˆ¤å®šã•ã‚Œã¾ã™ã€‚<BR>設定ã§ãã‚‹é …ç›®ã¯ã€[åå‰ (CN)]ã€[所属機関 (O)]ã€[組織å˜ä½ (OU)]ã€[国 (C)]ã€[都é“府県 (ST)]ã€[ローカル (L)]ã€[ã‚·ãƒªã‚¢ãƒ«ç•ªå· (16進数)]ã€[MD5 ダイジェスト値 (16進数, 128 bit)]ã€[SHA-1 ダイジェスト値 (16進数, 160 bit)] ã§ã™ã€‚ダイジェスト値 (ãƒãƒƒã‚·ãƒ¥å€¤) ã®æŒ‡å®šã¯ã€è¨¼æ˜Žæ›¸ã‚’事実上一æ„ã«æŒ‡å®šã™ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚通常ã€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 ダイジェスト値 (16進数, 128 bit) を設定ã™ã‚‹å ´åˆã¯ã€ã“ã®ãƒ‘ラメータã§å€¤ã‚’指定ã—ã¾ã™ã€‚16 進数㧠32 文字 (16 Bytes) ã®ãƒ‘ラメータを指定ã—ãªã„å ´åˆã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚</td>
+ </tr>
+ <tr>
+ <td class="tableStandard" width="125"><i>/SHA1</i></td>
+ <td class="tableStandard" width="453" style="background-color: #FFFFFF">
+ æ¡ä»¶ã¨ã—ã¦è¨¼æ˜Žæ›¸ã® SHA1 ダイジェスト値 (16進数, 160 bit) を設定ã™ã‚‹å ´åˆã¯ã€ã“ã®ãƒ‘ラメータã§å€¤ã‚’指定ã—ã¾ã™ã€‚16 進数㧠40 文字 (20 Bytes) ã®ãƒ‘ラメータを指定ã—ãªã„å ´åˆã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚</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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€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>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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€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>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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 ã®ã‚ˆã†ã«ã€10 進数をドットã§åŒºåˆ‡ã£ã¦æŒ‡å®šã—ã¾ã™ã€‚マスク㯠255.255.255.0 ã®ã‚ˆã†ã« 10 進数をドットã§åŒºåˆ‡ã£ã¦æŒ‡å®šã™ã‚‹ã‹ã€24 ã®ã‚ˆã†ã«å…ˆé ­ã‹ã‚‰ã®ãƒ“ット長を 10 進数ã§æŒ‡å®šã—ã¾ã™ã€‚å˜ä¸€ã® IPv4 ホストを指定ã™ã‚‹ã«ã¯ã€ãƒžã‚¹ã‚¯ã‚’ 255.255.255.255 ã¾ãŸã¯ 32 ã¨ã—ã¦æŒ‡å®šã—ã¾ã™ã€‚</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>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€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:: ã®ã‚ˆã†ã« 16 進数をコロンã§åŒºåˆ‡ã£ã¦æŒ‡å®šã—ã¾ã™ã€‚マスク㯠ffff:ffff:ffff:ffff:: ã®ã‚ˆã†ã« IPv6 å½¢å¼ã§åŒºåˆ‡ã£ã¦æŒ‡å®šã™ã‚‹ã‹ã€64 ã®ã‚ˆã†ã«å…ˆé ­ã‹ã‚‰ã®ãƒ“ット長を 10 進数ã§æŒ‡å®šã—ã¾ã™ã€‚å˜ä¸€ã® IPv6 ホストを指定ã™ã‚‹ã«ã¯ã€ãƒžã‚¹ã‚¯ã‚’ ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff ã¾ãŸã¯ 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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.5.2 "VersionGet": VPN 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">VersionGet</font></b></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">
+ ç¾åœ¨ç®¡ç†ã—ã¦ã„ã‚‹ VPN Client サービスプログラムã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報をå–å¾—ã—ã¾ã™ã€‚</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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.5.3 "PasswordSet": VPN 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">PasswordSet</font></b></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">
+ VPN Client サービスã«ã€ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ç®¡ç†ãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£ã‚„ VPN クライアント接続マãƒãƒ¼ã‚¸ãƒ£ãªã©ã‹ã‚‰æŽ¥ç¶šã—ã¦åˆ¶å¾¡ã‚’è¡Œã†éš›ã«ã€ãƒ‘スワードã®å…¥åŠ›ã‚’求ã‚ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’用ã„ã¦ã€å…¥åŠ›ã‚’求ã‚るパスワードを設定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<BR>パスワードã¯ã€ãƒªãƒ¢ãƒ¼ãƒˆ (localhost 以外ã®ã‚³ãƒ³ãƒ”ュータ) ã‹ã‚‰æ“作を行ã†å ´åˆã®ã¿å…¥åŠ›ã•ã›ã‚‹ã“ã¨ã‚’è¦æ±‚ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚</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 を指定ã™ã‚‹ã¨ã€ãƒ‘スワードã¯ãƒªãƒ¢ãƒ¼ãƒˆ (localhost 以外ã®ã‚³ãƒ³ãƒ”ュータ) ã‹ã‚‰æ“作を行ã†å ´åˆã®ã¿è¦æ±‚ã•ã‚Œã€localhost ã‹ã‚‰ã®æŽ¥ç¶šæ™‚ã«ã¯è¦æ±‚ã•ã‚Œãªããªã‚Šã¾ã™ã€‚ã“ã®ãƒ‘ラメータをçœç•¥ã—ãŸå ´åˆã¯ã€"no" ã¨è¦‹ãªã—ã¾ã™ã€‚</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.5.4 "PasswordGet": VPN 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">PasswordGet</font></b></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">
+ VPN Client サービスã«ã€ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ç®¡ç†ãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£ã‚„ VPN クライアント接続マãƒãƒ¼ã‚¸ãƒ£ãªã©ã‹ã‚‰æŽ¥ç¶šã—ã¦åˆ¶å¾¡ã‚’è¡Œã†éš›ã«ã€ãƒ‘スワードã®å…¥åŠ›ã‚’求ã‚るよã†ã«ãªã£ã¦ã„ã‚‹ã‹ã©ã†ã‹ã®è¨­å®šã‚’å–å¾—ã—ã¾ã™ã€‚<BR>ã¾ãŸã€ãƒ‘スワードをè¦æ±‚ã™ã‚‹å ´åˆã«ã¤ã„ã¯ã€ãƒªãƒ¢ãƒ¼ãƒˆ (localhost 以外ã®ã‚³ãƒ³ãƒ”ュータ) ã‹ã‚‰æ“作を行ã†å ´åˆã®ã¿å…¥åŠ›ã•ã›ã‚‹è¨­å®šã«ãªã£ã¦ã„ã‚‹ã‹ã©ã†ã‹ã‚‚å–å¾—ã—ã¾ã™ã€‚</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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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>ç¾åœ¨ä½¿ç”¨ã—ã¦ã„るスマートカードã®ç¨®é¡žãŒè¡¨ç¤ºã•ã‚Œãªã„å ´åˆã¯ã€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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 Client ã§ä½¿ç”¨ã™ã‚‹ã‚¹ãƒžãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®ç¨®é¡žã‚’é¸æŠžã—ã¾ã™ã€‚<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 Client ã§ä½¿ç”¨ã™ã‚‹ã‚ˆã†ã«è¨­å®šã•ã‚Œã¦ã„るスマートカードã®ç¨®é¡žã® 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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 Client ㌠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 Client ㌠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 Client ㌠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 ãƒã‚¤ãƒˆåˆ†ã® 16 進数を文字列ã§æŒ‡å®šã—ã¦ãã ã•ã„。
+例: 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 Client ㌠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 Client ㌠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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 Client ã«ç™»éŒ²ã•ã‚Œã¦ã„る接続設定ã®ã€æŽ¥ç¶šå…ˆã® 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 ã¨ã®é–“ã®é€šä¿¡å†…容を暗å·åŒ–ã—ãªã„よã†ã«è¨­å®šã—ã¾ã™ã€‚<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 ã«å¯¾ã—ã¦æŽ¥ç¶šã™ã‚‹éš›ã«ä½¿ç”¨ã™ã‚‹æŽ¥ç¶šæ–¹æ³•ã‚’ [直接 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 ã«å¯¾ã—ã¦æŽ¥ç¶šã™ã‚‹éš›ã«ä½¿ç”¨ã™ã‚‹æŽ¥ç¶šæ–¹æ³•ã‚’ [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 ã«å¯¾ã—ã¦æŽ¥ç¶šã™ã‚‹éš›ã«ä½¿ç”¨ã™ã‚‹æŽ¥ç¶šæ–¹æ³•ã‚’ [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 コマンドã§æŽ¥ç¶šè¨­å®šè¨­å®šå†…ã«ä¿å­˜ã—ã¦ãŠãã‹ã€ã¾ãŸã¯ä»®æƒ³ HUB ã®ä¿¡é ¼ã™ã‚‹è¨¼æ˜Žæ©Ÿé–¢ã®è¨¼æ˜Žæ›¸ä¸€è¦§ã«ã€ã‚µãƒ¼ãƒãƒ¼ã® SSL 証明書を署åã—ãŸãƒ«ãƒ¼ãƒˆè¨¼æ˜Žæ›¸ã‚’ CertAdd コマンドãªã©ã§ç™»éŒ²ã—ã¦ãŠãã“ã¨ã‚’推奨ã—ã¾ã™ã€‚登録ã•ã‚Œã¦ã„ãªã„å ´åˆã¯ã€åˆå›žæŽ¥ç¶šæ™‚ã«ç¢ºèªã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒè¡¨ç¤ºã•ã‚Œã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚<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 証明書をã‚らã‹ã˜ã‚ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã§æŽ¥ç¶šè¨­å®šè¨­å®šå†…ã«ä¿å­˜ã—ã¦ãŠãã‹ã€ã¾ãŸã¯ä»®æƒ³ HUB ã®ä¿¡é ¼ã™ã‚‹è¨¼æ˜Žæ©Ÿé–¢ã®è¨¼æ˜Žæ›¸ä¸€è¦§ã«ã€ã‚µãƒ¼ãƒãƒ¼ã® SSL 証明書を署åã—ãŸãƒ«ãƒ¼ãƒˆè¨¼æ˜Žæ›¸ã‚’ CAAdd コマンドãªã©ã§ç™»éŒ²ã—ã¦ãŠãå¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚<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" を指定ã—ã¾ã™ã€‚2 本以上㮠TCP コãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’æŸã­ã¦ VPN 通信を行ã†éš›ã€ã€ŒåŠäºŒé‡ãƒ¢ãƒ¼ãƒ‰ã€ã‚’使用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚åŠäºŒé‡ãƒ¢ãƒ¼ãƒ‰ã‚’有効ã«ã™ã‚‹ã¨ã€è‡ªå‹•çš„ã«å„ TCP コãƒã‚¯ã‚·ãƒ§ãƒ³ã®ãƒ‡ãƒ¼ã‚¿ä¼é€æ–¹å‘ã‚’ã€åŠæ•°ãšã¤å›ºå®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãŸã¨ãˆã°ã€8 本㮠TCP コãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’使用ã—㦠VPN セッションを確立ã—ãŸå ´åˆã€åŠäºŒé‡ãƒ¢ãƒ¼ãƒ‰ã‚’有効ã«ã™ã‚‹ã¨ã€4 本㮠TCP コãƒã‚¯ã‚·ãƒ§ãƒ³ã¯ã‚¢ãƒƒãƒ—ロード方å‘専用ã€æ®‹ã‚Šã® 4 本ã®ã‚³ãƒã‚¯ã‚·ãƒ§ãƒ³ã¯ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰æ–¹å‘専用ã«å›ºå®šã•ã‚Œé€šä¿¡ãŒè¡Œã‚ã‚Œã¾ã™ã€‚</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 ã¸ã®æŽ¥ç¶šã‚’開始ã—ã¾ã™ã€‚接続処ç†ä¸­ã€ã¾ãŸã¯æŽ¥ç¶šæ¸ˆã¿ã®çŠ¶æ…‹ã«ãªã£ãŸæŽ¥ç¶šè¨­å®šã¯ã€AccountDisconnect コマンドã§åˆ‡æ–­ã™ã‚‹ã¾ã§ VPN Server ã«å¸¸æ™‚接続ã€ã¾ãŸã¯æŽ¥ç¶šã‚’試行ã—続ã‘ã¾ã™ (ãŸã ã— 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 Client ã«ç™»éŒ²ã•ã‚Œã¦ã„る既存ã®æŽ¥ç¶šè¨­å®šãŒ 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">
+ スマートカード内ã«æ ¼ç´ã•ã‚Œã¦ã„る秘密éµã‚ªãƒ–ジェクトã®åå‰ã‚’指定ã—ã¾ã™ã€‚/CERTNAME ã§æŒ‡å®šã—ãŸè¨¼æ˜Žæ›¸ã«å¯¾å¿œã—ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚</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 クライアント接続マãƒãƒ¼ã‚¸ãƒ£ã¨é–¢é€£ä»˜ã‘ã•ã‚Œã‚‹ã®ã§ä¾¿åˆ©ã§ã™ã€‚</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 Client ã«è¿½åŠ ã—ã¾ã™ã€‚</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 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">RemoteEnable</font></b></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">
+ VPN Client サービスã«ã€localhost 以外ã®ãƒªãƒ¢ãƒ¼ãƒˆã‚³ãƒ³ãƒ”ュータã‹ã‚‰ã€ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ç®¡ç†ãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£ã¾ãŸã¯ VPN クライアント接続マãƒãƒ¼ã‚¸ãƒ£ã§ãƒªãƒ¢ãƒ¼ãƒˆæŽ¥ç¶šã—ã¦ç®¡ç†ã™ã‚‹ã“ã¨ã‚’許å¯ã—ã¾ã™ã€‚</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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.5.57 "RemoteDisable": VPN 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">RemoteDisable</font></b></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">
+ VPN Client サービスã«ã€localhost 以外ã®ãƒªãƒ¢ãƒ¼ãƒˆã‚³ãƒ³ãƒ”ュータã‹ã‚‰ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ç®¡ç†ãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£ã¾ãŸã¯ VPN クライアント接続マãƒãƒ¼ã‚¸ãƒ£ã§ãƒªãƒ¢ãƒ¼ãƒˆæŽ¥ç¶šã—ã¦ç®¡ç†ã™ã‚‹ã“ã¨ã‚’ç¦æ­¢ã—ã¾ã™ã€‚</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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.5.58 "KeepEnable": インターãƒãƒƒãƒˆæŽ¥ç¶šã®ç¶­æŒæ©Ÿèƒ½ã®æœ‰åŠ¹åŒ–</h3>
+ <table border="1" cellspacing="0" width="100%" 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">
+ インターãƒãƒƒãƒˆæŽ¥ç¶šã®ç¶­æŒæ©Ÿèƒ½ã®æœ‰åŠ¹åŒ–</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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
+ <h3>6.5.60 "KeepSet": インターãƒãƒƒãƒˆæŽ¥ç¶šã®ç¶­æŒæ©Ÿèƒ½ã®è¨­å®š</h3>
+ <table border="1" cellspacing="0" width="100%" 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">
+ インターãƒãƒƒãƒˆæŽ¥ç¶šã®ç¶­æŒæ©Ÿèƒ½ã®è¨­å®š</td>
+ </tr>
+ <tr>
+ <td class="tableStandard" width="125"><b>説明</b></td>
+ <td class="tableStandard" width="453" style="background-color: #FFFFFF">
+ [インターãƒãƒƒãƒˆæŽ¥ç¶šã®ç¶­æŒæ©Ÿèƒ½] ã®æŽ¥ç¶šå…ˆãƒ›ã‚¹ãƒˆåãªã©ã®è¨­å®šã‚’è¡Œãªã„ã¾ã™ã€‚一定期間無通信状態ãŒç¶šãã¨è‡ªå‹•çš„ã«æŽ¥ç¶šãŒåˆ‡æ–­ã•ã‚Œã‚‹ã‚ˆã†ãªãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶šç’°å¢ƒã§ã€[インターãƒãƒƒãƒˆæŽ¥ç¶šã®ç¶­æŒæ©Ÿèƒ½] を使用ã™ã‚‹ã¨ã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆä¸Šã®ä»»æ„ã®ã‚µãƒ¼ãƒãƒ¼ã«å¯¾ã—ã¦ã€ä¸€å®šé–“éš”ã”ã¨ã«ãƒ‘ケットをé€ä¿¡ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šã‚’維æŒã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<BR>ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã§ã¯ã€é€šä¿¡å…ˆã® [ホストå]ã€[ãƒãƒ¼ãƒˆç•ªå·]ã€[パケットé€å‡ºé–“éš”]ã€ãŠã‚ˆã³ [プロトコル] を指定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<BR>インターãƒãƒƒãƒˆæŽ¥ç¶šç¶­æŒã®ãŸã‚ã«é€ä¿¡ã•ã‚Œã‚‹ãƒ‘ケットã¯ã€ãƒ©ãƒ³ãƒ€ãƒ ãªå†…容ã§ã‚ã‚Šã€ã‚³ãƒ³ãƒ”ュータやユーザーを識別ã™ã‚‹å€‹äººæƒ…å ±ãªã©ãŒé€ä¿¡ã•ã‚Œã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“。<BR>インターãƒãƒƒãƒˆæŽ¥ç¶šã®ç¶­æŒæ©Ÿèƒ½ã¯ã€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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 bit ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚<BR>証明書ã®ç¨®é¡žã¨ã—ã¦ã€ãƒ«ãƒ¼ãƒˆè¨¼æ˜Žæ›¸ (自己署å証明書) ã¨ä»–ã®è¨¼æ˜Žæ›¸ã«ã‚ˆã£ã¦ç½²åã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã®ã©ã¡ã‚‰ã§ã‚‚作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ä»–ã®è¨¼æ˜Žæ›¸ã«ã‚ˆã£ã¦ç½²åã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã‚’作æˆã™ã‚‹ãŸã‚ã«ã¯ã€ç½²åã«ä½¿ç”¨ã™ã‚‹è¨¼æ˜Žæ›¸ (X.509 å½¢å¼ã®ãƒ•ã‚¡ã‚¤ãƒ«) ã¨å¯¾å¿œã™ã‚‹ç§˜å¯†éµãƒ•ã‚¡ã‚¤ãƒ« (Base 64 エンコード) ãŒå¿…è¦ã§ã™ã€‚<BR><BR>作æˆã™ã‚‹è¨¼æ˜Žæ›¸ã«ã¯ã€åå‰ (CN)ã€æ‰€å±žæ©Ÿé–¢ (O)ã€çµ„ç¹”å˜ä½ (OU)ã€å›½ (C)ã€éƒ½é“府県 (ST)ã€ãƒ­ãƒ¼ã‚«ãƒ« (L)ã€ã‚·ãƒªã‚¢ãƒ«ç•ªå·ã€æœ‰åŠ¹æœŸé™ã‚’指定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<BR>作æˆã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã¯ X.509 å½¢å¼ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¨ã—ã¦ã€ç§˜å¯†éµãƒ•ã‚¡ã‚¤ãƒ«ã¯ RSA 1024 bit å½¢å¼ã® 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 bit ã®å…¬é–‹éµã‚’å«ã‚“ã  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 bit ã®ç§˜å¯†éµãƒ•ã‚¡ã‚¤ãƒ«ã¨ã—ã¦ä¿å­˜ã•ã‚Œã¾ã™ã€‚</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 ã® 2 ã¤ã®ã‚³ãƒžãƒ³ãƒ‰ã¨ã—ã¦åˆ©ç”¨ã—ã€IP ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã§æŽ¥ç¶šã•ã‚ŒãŸ 2 å°ã®ã‚³ãƒ³ãƒ”ュータã®é–“ã§ä¼é€ã™ã‚‹ã“ã¨ãŒã§ãる通信スループットを計測ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã™ã§ã«åˆ¥ã®ã‚³ãƒ³ãƒ”ュータ上ã§ã€TrafficServer コマンドを用ã„ã¦é€šä¿¡ã‚¹ãƒ«ãƒ¼ãƒ—ット測定ツールサーãƒãƒ¼ã‚’å¾…æ©Ÿã•ã›ã¦ãŠãã€TrafficClient コマンドã§ã€ãã®ã‚µãƒ¼ãƒãƒ¼ã®ãƒ›ã‚¹ãƒˆåã¾ãŸã¯ IP アドレスã¨ãƒãƒ¼ãƒˆç•ªå·ã‚’指定ã—ã¦æŽ¥ç¶šã—ã€é€šä¿¡é€Ÿåº¦ã‚’測定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<BR>通信速度ã®æ¸¬å®šã¯ã€åŒæ™‚ã«è¤‡æ•°æœ¬ã® TCP コãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’確立ã—ã€ãã‚Œãžã‚Œã®ã‚³ãƒã‚¯ã‚·ãƒ§ãƒ³ã§æœ€å¤§é™ã«ã‚¹ãƒˆãƒªãƒ¼ãƒ ãƒ‡ãƒ¼ã‚¿ã‚’ä¼é€ã—ãŸçµæžœã€æŒ‡å®šã•ã‚ŒãŸæ™‚間内ã«å®Ÿéš›ã«ä¼é€ã™ã‚‹ã“ã¨ãŒã§ããŸãƒ‡ãƒ¼ã‚¿ã®ãƒ“ット数を計算ã—ã€ãれを元ã«é€šä¿¡ã‚¹ãƒ«ãƒ¼ãƒ—ットã®å¹³å‡å€¤ (bps) を算出ã™ã‚‹æ–¹æ³•ã§è¡Œã‚ã‚Œã¾ã™ã€‚通常ã€1 本㮠TCP コãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’用ã„ãŸå ´åˆã¯ TCP ã®ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ä¸Šã®é™ç•Œã«ã‚ˆã‚Šã€å®Ÿéš›ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¹ãƒ«ãƒ¼ãƒ—ットよりもé…ã„速度ã§ã—ã‹é€šä¿¡ã§ããªã„å ´åˆãŒå¤šã„ãŸã‚ã€è¤‡æ•°æœ¬ã® TCP コãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’åŒæ™‚ã«ç¢ºç«‹ã—ã¦é€šä¿¡ã—ãŸçµæžœã‚’測定ã™ã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™ã€‚ã“ã®æ¸¬å®šæ–¹æ³•ã«ã‚ˆã£ã¦è¨ˆæ¸¬ã•ã‚ŒãŸã‚¹ãƒ«ãƒ¼ãƒ—ットã¯å®Ÿéš›ã« TCP ã§ã‚¹ãƒˆãƒªãƒ¼ãƒ ã¨ã—ã¦å—ä¿¡å´ã«å±Šã„ãŸãƒ‡ãƒ¼ã‚¿ã®ãƒ“ット長ã‹ã‚‰è¨ˆç®—ã•ã‚Œã‚‹ãŸã‚ã€é€”中ã§ç™ºç”Ÿã—ãŸãƒ‘ケットロスやデータ破æã—ãŸãƒ‘ケットã¯ã€å®Ÿéš›ã«å±Šã„ãŸãƒ‘ケットã«ã¯å«ã¾ã‚Œãšã€ç´”粋ãªãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®æœ€å¤§é€šä¿¡å¯èƒ½å¸¯åŸŸå¹…ã«è¿‘ã„値を算出ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<BR>測定çµæžœã¨ã—㦠TCP 内ã§ä¼é€ã•ã‚ŒãŸã‚¹ãƒˆãƒªãƒ¼ãƒ ã‚µã‚¤ã‚ºã‹ã‚‰ã€å®Ÿéš›ã«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã‚’æµã‚ŒãŸãƒ‡ãƒ¼ã‚¿é‡ã®è¿‘似値を計算ã—ã€ãれを時間ã§å‰²ã£ã¦ãƒ“ット毎秒 (bps) を算出ã—ã¾ã™ã€‚物ç†çš„ãªãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®ç¨®é¡žã¯ Ethernet (IEEE802.3) ã§ã€MAC フレームã®ãƒšã‚¤ãƒ­ãƒ¼ãƒ‰ã‚µã‚¤ã‚ºã¯ 1,500 Bytes (TCP ã® MSS 㯠1,460 Bytes) ã¨ä»®å®šã—ã¦è¨ˆç®—ãŒè¡Œã‚ã‚Œã¾ã™ã€‚/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" ã®ã†ã¡ 1 ã¤ã‚’指定ã—ã¾ã™ã€‚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 ã® 2 ã¤ã®ã‚³ãƒžãƒ³ãƒ‰ã¨ã—ã¦åˆ©ç”¨ã—ã€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 ソフトウェアãŒæ­£ã—ã動作ã™ã‚‹å¯èƒ½æ€§ãŒé«˜ã„ã¨æ€ã‚ã‚Œã¾ã™ã€‚<BR>ã¾ãŸã€ã“ã®ãƒã‚§ãƒƒã‚¯ã‚’通éŽã§ããªã„システム上ã§ã¯ã€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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</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 bit ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚<BR>証明書ã®ç¨®é¡žã¨ã—ã¦ã€ãƒ«ãƒ¼ãƒˆè¨¼æ˜Žæ›¸ (自己署å証明書) ã¨ä»–ã®è¨¼æ˜Žæ›¸ã«ã‚ˆã£ã¦ç½²åã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã®ã©ã¡ã‚‰ã§ã‚‚作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ä»–ã®è¨¼æ˜Žæ›¸ã«ã‚ˆã£ã¦ç½²åã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã‚’作æˆã™ã‚‹ãŸã‚ã«ã¯ã€ç½²åã«ä½¿ç”¨ã™ã‚‹è¨¼æ˜Žæ›¸ (X.509 å½¢å¼ã®ãƒ•ã‚¡ã‚¤ãƒ«) ã¨å¯¾å¿œã™ã‚‹ç§˜å¯†éµãƒ•ã‚¡ã‚¤ãƒ« (Base 64 エンコード) ãŒå¿…è¦ã§ã™ã€‚<BR><BR>作æˆã™ã‚‹è¨¼æ˜Žæ›¸ã«ã¯ã€åå‰ (CN)ã€æ‰€å±žæ©Ÿé–¢ (O)ã€çµ„ç¹”å˜ä½ (OU)ã€å›½ (C)ã€éƒ½é“府県 (ST)ã€ãƒ­ãƒ¼ã‚«ãƒ« (L)ã€ã‚·ãƒªã‚¢ãƒ«ç•ªå·ã€æœ‰åŠ¹æœŸé™ã‚’指定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<BR>作æˆã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã¯ X.509 å½¢å¼ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¨ã—ã¦ã€ç§˜å¯†éµãƒ•ã‚¡ã‚¤ãƒ«ã¯ RSA 1024 bit å½¢å¼ã® 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 bit ã®å…¬é–‹éµã‚’å«ã‚“ã  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 bit ã®ç§˜å¯†éµãƒ•ã‚¡ã‚¤ãƒ«ã¨ã—ã¦ä¿å­˜ã•ã‚Œã¾ã™ã€‚</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 ã® 2 ã¤ã®ã‚³ãƒžãƒ³ãƒ‰ã¨ã—ã¦åˆ©ç”¨ã—ã€IP ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã§æŽ¥ç¶šã•ã‚ŒãŸ 2 å°ã®ã‚³ãƒ³ãƒ”ュータã®é–“ã§ä¼é€ã™ã‚‹ã“ã¨ãŒã§ãる通信スループットを計測ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã™ã§ã«åˆ¥ã®ã‚³ãƒ³ãƒ”ュータ上ã§ã€TrafficServer コマンドを用ã„ã¦é€šä¿¡ã‚¹ãƒ«ãƒ¼ãƒ—ット測定ツールサーãƒãƒ¼ã‚’å¾…æ©Ÿã•ã›ã¦ãŠãã€TrafficClient コマンドã§ã€ãã®ã‚µãƒ¼ãƒãƒ¼ã®ãƒ›ã‚¹ãƒˆåã¾ãŸã¯ IP アドレスã¨ãƒãƒ¼ãƒˆç•ªå·ã‚’指定ã—ã¦æŽ¥ç¶šã—ã€é€šä¿¡é€Ÿåº¦ã‚’測定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<BR>通信速度ã®æ¸¬å®šã¯ã€åŒæ™‚ã«è¤‡æ•°æœ¬ã® TCP コãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’確立ã—ã€ãã‚Œãžã‚Œã®ã‚³ãƒã‚¯ã‚·ãƒ§ãƒ³ã§æœ€å¤§é™ã«ã‚¹ãƒˆãƒªãƒ¼ãƒ ãƒ‡ãƒ¼ã‚¿ã‚’ä¼é€ã—ãŸçµæžœã€æŒ‡å®šã•ã‚ŒãŸæ™‚間内ã«å®Ÿéš›ã«ä¼é€ã™ã‚‹ã“ã¨ãŒã§ããŸãƒ‡ãƒ¼ã‚¿ã®ãƒ“ット数を計算ã—ã€ãれを元ã«é€šä¿¡ã‚¹ãƒ«ãƒ¼ãƒ—ットã®å¹³å‡å€¤ (bps) を算出ã™ã‚‹æ–¹æ³•ã§è¡Œã‚ã‚Œã¾ã™ã€‚通常ã€1 本㮠TCP コãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’用ã„ãŸå ´åˆã¯ TCP ã®ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ä¸Šã®é™ç•Œã«ã‚ˆã‚Šã€å®Ÿéš›ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¹ãƒ«ãƒ¼ãƒ—ットよりもé…ã„速度ã§ã—ã‹é€šä¿¡ã§ããªã„å ´åˆãŒå¤šã„ãŸã‚ã€è¤‡æ•°æœ¬ã® TCP コãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’åŒæ™‚ã«ç¢ºç«‹ã—ã¦é€šä¿¡ã—ãŸçµæžœã‚’測定ã™ã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™ã€‚ã“ã®æ¸¬å®šæ–¹æ³•ã«ã‚ˆã£ã¦è¨ˆæ¸¬ã•ã‚ŒãŸã‚¹ãƒ«ãƒ¼ãƒ—ットã¯å®Ÿéš›ã« TCP ã§ã‚¹ãƒˆãƒªãƒ¼ãƒ ã¨ã—ã¦å—ä¿¡å´ã«å±Šã„ãŸãƒ‡ãƒ¼ã‚¿ã®ãƒ“ット長ã‹ã‚‰è¨ˆç®—ã•ã‚Œã‚‹ãŸã‚ã€é€”中ã§ç™ºç”Ÿã—ãŸãƒ‘ケットロスやデータ破æã—ãŸãƒ‘ケットã¯ã€å®Ÿéš›ã«å±Šã„ãŸãƒ‘ケットã«ã¯å«ã¾ã‚Œãšã€ç´”粋ãªãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®æœ€å¤§é€šä¿¡å¯èƒ½å¸¯åŸŸå¹…ã«è¿‘ã„値を算出ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<BR>測定çµæžœã¨ã—㦠TCP 内ã§ä¼é€ã•ã‚ŒãŸã‚¹ãƒˆãƒªãƒ¼ãƒ ã‚µã‚¤ã‚ºã‹ã‚‰ã€å®Ÿéš›ã«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã‚’æµã‚ŒãŸãƒ‡ãƒ¼ã‚¿é‡ã®è¿‘似値を計算ã—ã€ãれを時間ã§å‰²ã£ã¦ãƒ“ット毎秒 (bps) を算出ã—ã¾ã™ã€‚物ç†çš„ãªãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®ç¨®é¡žã¯ Ethernet (IEEE802.3) ã§ã€MAC フレームã®ãƒšã‚¤ãƒ­ãƒ¼ãƒ‰ã‚µã‚¤ã‚ºã¯ 1,500 Bytes (TCP ã® MSS 㯠1,460 Bytes) ã¨ä»®å®šã—ã¦è¨ˆç®—ãŒè¡Œã‚ã‚Œã¾ã™ã€‚/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" ã®ã†ã¡ 1 ã¤ã‚’指定ã—ã¾ã™ã€‚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 ã® 2 ã¤ã®ã‚³ãƒžãƒ³ãƒ‰ã¨ã—ã¦åˆ©ç”¨ã—ã€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 ソフトウェアãŒæ­£ã—ã動作ã™ã‚‹å¯èƒ½æ€§ãŒé«˜ã„ã¨æ€ã‚ã‚Œã¾ã™ã€‚<BR>ã¾ãŸã€ã“ã®ãƒã‚§ãƒƒã‚¯ã‚’通éŽã§ããªã„システム上ã§ã¯ã€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">ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯æŒ‡å®šã™ã¹ãパラメータ引数㯠1 ã¤ã‚‚ã‚ã‚Šã¾ã›ã‚“。</td>
+ </tr>
+ </table>
+ <p>&nbsp;</p>
diff --git a/src/Mayaqua/Encrypt.c b/src/Mayaqua/Encrypt.c
index f56fc86f..d93ef7d5 100644
--- a/src/Mayaqua/Encrypt.c
+++ b/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);
+}
diff --git a/src/Mayaqua/Encrypt.h b/src/Mayaqua/Encrypt.h
index 1be31649..d5b334b7 100644
--- a/src/Mayaqua/Encrypt.h
+++ b/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
diff --git a/src/Mayaqua/FileIO.c b/src/Mayaqua/FileIO.c
index 7d731404..f40d3b3a 100644
--- a/src/Mayaqua/FileIO.c
+++ b/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);
diff --git a/src/Mayaqua/Kernel.c b/src/Mayaqua/Kernel.c
index ddc9b748..28dd4b6e 100644
--- a/src/Mayaqua/Kernel.c
+++ b/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;
}
diff --git a/src/Mayaqua/Kernel.h b/src/Mayaqua/Kernel.h
index 5ba4a72c..35dd9679 100644
--- a/src/Mayaqua/Kernel.h
+++ b/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);
diff --git a/src/Mayaqua/MayaType.h b/src/Mayaqua/MayaType.h
index 01810e7c..ae173617 100644
--- a/src/Mayaqua/MayaType.h
+++ b/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;
diff --git a/src/Mayaqua/Memory.c b/src/Mayaqua/Memory.c
index f13d0e47..14bbcafb 100644
--- a/src/Mayaqua/Memory.c
+++ b/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;
diff --git a/src/Mayaqua/Memory.h b/src/Mayaqua/Memory.h
index 8b981aa9..04392e7e 100644
--- a/src/Mayaqua/Memory.h
+++ b/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
diff --git a/src/Mayaqua/Microsoft.c b/src/Mayaqua/Microsoft.c
index 8d71f29c..b4e95a2a 100644
--- a/src/Mayaqua/Microsoft.c
+++ b/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)
{
diff --git a/src/Mayaqua/Microsoft.h b/src/Mayaqua/Microsoft.h
index c5d85d50..8046e95d 100644
--- a/src/Mayaqua/Microsoft.h
+++ b/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);
diff --git a/src/Mayaqua/Network.c b/src/Mayaqua/Network.c
index f7768a57..ded99b77 100644
--- a/src/Mayaqua/Network.c
+++ b/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,9 +5946,54 @@ 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;
SSL_CTX *ssl_ctx = NewSSLCtx(server_mode);
@@ -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;
}
@@ -21526,6 +21848,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;
HTTP_HEADER *h;
@@ -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);
diff --git a/src/Mayaqua/Network.h b/src/Mayaqua/Network.h
index 14ac23d8..ad18ffea 100644
--- a/src/Mayaqua/Network.h
+++ b/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);
diff --git a/src/Mayaqua/Pack.c b/src/Mayaqua/Pack.c
index 881ada2e..42072bc0 100644
--- a/src/Mayaqua/Pack.c
+++ b/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
@@ -1195,6 +1257,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
if (p == NULL || name == NULL)
@@ -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;
+}
+
+
+
diff --git a/src/Mayaqua/Pack.h b/src/Mayaqua/Pack.h
index 3880d5b7..53a13840 100644
--- a/src/Mayaqua/Pack.h
+++ b/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
diff --git a/src/Mayaqua/Str.c b/src/Mayaqua/Str.c
index 6e0a6ecf..ec4023da 100644
--- a/src/Mayaqua/Str.c
+++ b/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);
+}
+
+
+
+
diff --git a/src/Mayaqua/Str.h b/src/Mayaqua/Str.h
index 6a54ece6..c5ce0532 100644
--- a/src/Mayaqua/Str.h
+++ b/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
diff --git a/src/Mayaqua/Table.c b/src/Mayaqua/Table.c
index af2a2016..089cba51 100644
--- a/src/Mayaqua/Table.c
+++ b/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);
diff --git a/src/Mayaqua/Unix.c b/src/Mayaqua/Unix.c
index 54677753..3a5ddf28 100644
--- a/src/Mayaqua/Unix.c
+++ b/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
diff --git a/src/Mayaqua/Unix.h b/src/Mayaqua/Unix.h
index 68077739..b8f2351f 100644
--- a/src/Mayaqua/Unix.h
+++ b/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();
diff --git a/src/SEVPN.sln b/src/SEVPN.sln
index 733a75ba..9b2c87fc 100644
--- a/src/SEVPN.sln
+++ b/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
diff --git a/src/See/Packet.c b/src/See/Packet.c
index 319cc4df..3cb3de67 100644
--- a/src/See/Packet.c
+++ b/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;
diff --git a/src/WARNING.TXT b/src/WARNING.TXT
index 01c37e0a..f562dcec 100644
--- a/src/WARNING.TXT
+++ b/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
diff --git a/src/bin/hamcore/DriverPackages/See/x64/See_x64.sys b/src/bin/hamcore/DriverPackages/See/x64/See_x64.sys
index a68d5908..6377f595 100644
--- a/src/bin/hamcore/DriverPackages/See/x64/See_x64.sys
+++ b/src/bin/hamcore/DriverPackages/See/x64/See_x64.sys
Binary files differ
diff --git a/src/bin/hamcore/DriverPackages/See/x86/See_x86.sys b/src/bin/hamcore/DriverPackages/See/x86/See_x86.sys
index 6c2d01b9..b98947b9 100644
--- a/src/bin/hamcore/DriverPackages/See/x86/See_x86.sys
+++ b/src/bin/hamcore/DriverPackages/See/x86/See_x86.sys
Binary files differ
diff --git a/src/bin/hamcore/lang.config b/src/bin/hamcore/lang.config
deleted file mode 100644
index aae41653..00000000
--- a/src/bin/hamcore/lang.config
+++ /dev/null
@@ -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.
-#
diff --git a/src/bin/hamcore/openvpn_sample.ovpn b/src/bin/hamcore/openvpn_sample.ovpn
index 83bc3df3..8b1a7456 100644
--- a/src/bin/hamcore/openvpn_sample.ovpn
+++ b/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>
diff --git a/src/bin/hamcore/strtable_cn.stb b/src/bin/hamcore/strtable_cn.stb
index 2ff1b122..d7cdfa18 100644
--- a/src/bin/hamcore/strtable_cn.stb
+++ b/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.
diff --git a/src/bin/hamcore/strtable_en.stb b/src/bin/hamcore/strtable_en.stb
index 14c440b1..eb1f303c 100644
--- a/src/bin/hamcore/strtable_en.stb
+++ b/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.
diff --git a/src/bin/hamcore/strtable_ja.stb b/src/bin/hamcore/strtable_ja.stb
index 7c341d3f..3b937a12 100644
--- a/src/bin/hamcore/strtable_ja.stb
+++ b/src/bin/hamcore/strtable_ja.stb
@@ -159,11 +159,11 @@ ERR_91 仮想レイヤ 3 スイッãƒã‚»ãƒƒã‚·ãƒ§ãƒ³ã¯åˆ‡æ–­ã§ãã¾ã›ã‚“
ERR_92 指定ã•ã‚ŒãŸåå‰ã®ä»®æƒ³ãƒ¬ã‚¤ãƒ¤ 3 スイッãƒã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™ã€‚別ã®åå‰ã‚’指定ã—ã¦ãã ã•ã„。
ERR_93 指定ã•ã‚ŒãŸåå‰ã®ä»®æƒ³ãƒ¬ã‚¤ãƒ¤ 3 スイッãƒãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
ERR_94 指定ã•ã‚ŒãŸåå‰ãŒä¸æ­£ã§ã™ã€‚使用ã§ããªã„文字ãŒå«ã¾ã‚Œã¦ã„ãªã„ã‹ã©ã†ã‹ãƒã‚§ãƒƒã‚¯ã—ã¦ãã ã•ã„。
-ERR_95 仮想レイヤ 3 インターフェイスã®è¿½åŠ ã«å¤±æ•—ã—ã¾ã—ãŸã€‚
-ERR_96 仮想レイヤ 3 インターフェイスã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸã€‚
+ERR_95 仮想レイヤ 3 インターフェイスã®è¿½åŠ ã«å¤±æ•—ã—ã¾ã—ãŸã€‚パラメータãŒæ­£ã—ã„ã‹ã©ã†ã‹ç¢ºèªã—ã¦ãã ã•ã„。ã¾ãŸã€ä»®æƒ³ãƒ¬ã‚¤ãƒ¤ 3 スイッãƒãŒå‹•ä½œä¸­ã®å ´åˆã¯ã€ä»®æƒ³ãƒ¬ã‚¤ãƒ¤ 3 インターフェイスã®è¿½åŠ ã¾ãŸã¯å‰Šé™¤ã¯ã§ãã¾ã›ã‚“。仮想レイヤ 3 スイッãƒã‚’åœæ­¢ã—ã¦ãã ã•ã„。
+ERR_96 仮想レイヤ 3 インターフェイスã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸã€‚パラメータãŒæ­£ã—ã„ã‹ã©ã†ã‹ç¢ºèªã—ã¦ãã ã•ã„。ã¾ãŸã€ä»®æƒ³ãƒ¬ã‚¤ãƒ¤ 3 スイッãƒãŒå‹•ä½œä¸­ã®å ´åˆã¯ã€ä»®æƒ³ãƒ¬ã‚¤ãƒ¤ 3 インターフェイスã®è¿½åŠ ã¾ãŸã¯å‰Šé™¤ã¯ã§ãã¾ã›ã‚“。仮想レイヤ 3 スイッãƒã‚’åœæ­¢ã—ã¦ãã ã•ã„。
ERR_97 指定ã•ã‚ŒãŸä»®æƒ³ãƒ¬ã‚¤ãƒ¤ 3 インターフェイスã®æŽ¥ç¶šå…ˆä»®æƒ³ HUB ã«æŽ¥ç¶šã—ã¦ã„る仮想レイヤ 3 インターフェイスãŒä»®æƒ³ãƒ¬ã‚¤ãƒ¤ 3 スイッãƒã®ä¸­ã«æ—¢ã«å­˜åœ¨ã—ã¾ã™ã€‚1 ã¤ã®ä»®æƒ³ãƒ¬ã‚¤ãƒ¤ 3 スイッãƒã®ä¸­ã§ã¯ã€åŒä¸€ã®ä»®æƒ³ HUB ã«æŽ¥ç¶šã™ã‚‹ä»®æƒ³ãƒ¬ã‚¤ãƒ¤ 3 インターフェイス㯠1 ã¤ã—ã‹å®šç¾©ã§ãã¾ã›ã‚“。
-ERR_98 ルーティングテーブルã®è¿½åŠ ã«å¤±æ•—ã—ã¾ã—ãŸã€‚
-ERR_99 ルーティングテーブルã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸã€‚
+ERR_98 ルーティングテーブルã®è¿½åŠ ã«å¤±æ•—ã—ã¾ã—ãŸã€‚パラメータãŒæ­£ã—ã„ã‹ã©ã†ã‹ç¢ºèªã—ã¦ãã ã•ã„。ã¾ãŸã€ä»®æƒ³ãƒ¬ã‚¤ãƒ¤ 3 スイッãƒãŒå‹•ä½œä¸­ã®å ´åˆã¯ã€ãƒ«ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ãƒ†ãƒ¼ãƒ–ルã®è¿½åŠ ã¾ãŸã¯å‰Šé™¤ã¯ã§ãã¾ã›ã‚“。仮想レイヤ 3 スイッãƒã‚’åœæ­¢ã—ã¦ãã ã•ã„。
+ERR_99 ルーティングテーブルã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸã€‚パラメータãŒæ­£ã—ã„ã‹ã©ã†ã‹ç¢ºèªã—ã¦ãã ã•ã„。ã¾ãŸã€ä»®æƒ³ãƒ¬ã‚¤ãƒ¤ 3 スイッãƒãŒå‹•ä½œä¸­ã®å ´åˆã¯ã€ãƒ«ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ãƒ†ãƒ¼ãƒ–ルã®è¿½åŠ ã¾ãŸã¯å‰Šé™¤ã¯ã§ãã¾ã›ã‚“。仮想レイヤ 3 スイッãƒã‚’åœæ­¢ã—ã¦ãã ã•ã„。
ERR_100 指定ã•ã‚ŒãŸãƒ«ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ãƒ†ãƒ¼ãƒ–ルã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™ã€‚
ERR_101 クライアントã¨ã‚µãƒ¼ãƒãƒ¼ã®é–“ã®æ™‚計ãŒãšã‚Œã¦ã„ã¾ã™ã€‚時刻設定を確èªã—ã¦ãã ã•ã„。
ERR_102 ã“ã®ä»®æƒ³ãƒ¬ã‚¤ãƒ¤ 3 スイッãƒã‚’開始ã§ãã¾ã›ã‚“。\r\n\r\n仮想レイヤ 3 スイッãƒã‚’開始ã™ã‚‹ã«ã¯ã€æœ€ä½Žã§ã‚‚ 1 ã¤ã®ä»®æƒ³ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹ãŒä»®æƒ³ãƒ¬ã‚¤ãƒ¤ 3 スイッãƒå†…ã«å®šç¾©ã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
@@ -841,6 +841,7 @@ CM_ST_UDP_ACCEL_ENABLED UDP 高速化機能をサãƒãƒ¼ãƒˆ
CM_ST_UDP_ACCEL_USING UDP 高速化機能を使用中
CM_ST_RUDP TCP over UDP (NAT Traversal)
CM_ST_UNDERLAY_PROTOCOL 物ç†é€šä¿¡ã«ä½¿ç”¨ä¸­ã®ãƒ—ロトコル
+CM_ST_PROTOCOL_DETAILS プロトコル詳細
CM_ST_COMPRESS_TRUE ã¯ã„ (ç´„ %u %%)
CM_ST_COMPRESS_FALSE ã„ã„㈠(圧縮無ã—)
CM_ST_SESSION_NAME セッションå
@@ -1598,6 +1599,7 @@ SM_LICENSE_NUM_BRIDGE ブリッジåŒæ™‚接続å¯èƒ½æ•°
SM_NO_LICENSE_COLUMN ã”注æ„:
SM_NO_LICENSE 製å“ライセンス㌠1 ã¤ã‚‚登録ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€ã“ã® VPN Server ã®é€šä¿¡æ©Ÿèƒ½ã¯å‹•ä½œã—ã¾ã›ã‚“。
SM_LICENSE_DELETE_MSG é¸æŠžã•ã‚ŒãŸãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã‚’ VPN Server ã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹?
+SM_LICENSE_WARNING ソフトイーサã¯ãƒ€ã‚¤ãƒŠãƒŸãƒƒã‚¯ DNSã€NAT トラãƒãƒ¼ã‚µãƒ«ãŠã‚ˆã³VPN Azure を学術実験目的ã§ç ”究開発ã—ã€ä¸»ã«ã‚ªãƒ¼ãƒ—ンソース版 SoftEther VPN ユーザーã®æ–¹ã€…ã«ã‚ˆã£ã¦åˆ©ç”¨ã—ã¦ã„ãŸã ããŸã‚ã«å®Ÿé¨“目的ã§é‹å–¶ã—ã¦ã„ã¾ã™ã€‚ãã®ãŸã‚ã€ã“れらã®ã‚µãƒ¼ãƒ“スã¯ã™ã¹ã¦ç„¡æ–™ã§ã”利用ã„ãŸã ã‘ã¾ã™ã€‚\r\n\r\nSoftEther VPN ã®ã€Œé‡è¦äº‹é …説明書ã€(インストール時ã«è¡¨ç¤ºã€ã¾ãŸã¯ãƒã‚¤ãƒŠãƒªãƒ•ã‚¡ã‚¤ãƒ«ã«ãƒ†ã‚­ã‚¹ãƒˆãƒ•ã‚¡ã‚¤ãƒ«ã¦åŒæ¢±) ã® 3.5 節ã«è¨˜è¼‰ã•ã‚Œã¦ã„ã‚‹ã¨ãŠã‚Šã€ã“れらã®ã‚µãƒ¼ãƒ“スã¯ã™ã¹ã¦ç„¡æ–™ã§ã”利用ã„ãŸã ã‘ã¾ã™ãŒã€ã“れらã®ã‚µãƒ¼ãƒ“スã¯ä¸€åˆ‡ã®ä¿è¨¼ãŒãªã„状態ã§æä¾›ã•ã‚Œã‚‹ã‚‚ã®ã§ã™ã€‚実験ã®ä¼‘æ­¢ã€ä¸­æ­¢ã‚„実験中ã®æŠ€è¡“çš„å•é¡Œã®ç™ºç”Ÿã«ã‚ˆã£ã¦ã‚µãƒ¼ãƒ“スãŒä¸­æ–­ã™ã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚ãã®å ´åˆã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã‚µãƒ¼ãƒ“スを利用ã§ããªããªã‚Šã¾ã™ã€‚ユーザーã¯ã“ã®ã‚ˆã†ãªãƒªã‚¹ã‚¯ãŒã‚ã‚‹ã“ã¨ã€ãŠã‚ˆã³ãã®ãƒªã‚¹ã‚¯ã‚’ユーザー自身ãŒè² æ‹…ã™ã‚‹ã“ã¨ã‚’承諾ã„ãŸã ã„ãŸä¸Šã§ã“れらã®ã‚µãƒ¼ãƒ“スをã”利用ãã ã•ã„。実験ã®ä¼‘æ­¢ã€ä¸­æ­¢ã‚„実験中ã®æŠ€è¡“çš„å•é¡Œã®ç™ºç”Ÿã«ã‚ˆã£ã¦ã‚µãƒ¼ãƒ“スãŒä¸­æ–­ã™ã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚ãã®å ´åˆã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã‚µãƒ¼ãƒ“スを利用ã§ããªããªã‚Šã¾ã™ã€‚\r\n\r\nã“れらã®å­¦è¡“実験サービスを商業用途ãªã©ã®é«˜ã„安定性ãŒæ±‚ã‚られる用途ã«ä½¿ç”¨ã•ã‚Œã‚‹ã“ã¨ã¯ã€ç¦æ­¢ã•ã‚Œã¦ã„ã¾ã›ã‚“ãŒã€å­¦è¡“実験サービスã«éšœå®³ãŒç™ºç”Ÿã—ãŸå ´åˆã€å®‰å®šæ€§ä¸Šã®å•é¡ŒãŒç™ºç”Ÿã™ã‚‹ãªã©ã®ãƒªã‚¹ã‚¯ãŒã‚ã‚Šã¾ã™ã€‚商業用途ãªã©ã®é«˜ã„安定性ãŒæ±‚ã‚られる用途ã«ãŠã„ã¦ã¯ã€ã“れらã®å­¦è¡“実験サービスを使用ã—ãªã„ã§ãã ã•ã„。\r\n\r\nä»®ã«ãŠå®¢æ§˜ãŒ SoftEther VPN ソフトウェアã®å•†ç”¨è£½å“を購入ã•ã‚Œã€SoftEther VPN ソフトウェアã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹æ–™é‡‘ã‚’ãŠå®¢æ§˜ãŒã™ã§ã«ãŠæ”¯æ‰•ã„ã„ãŸã ã„ã¦ã„ã‚‹å ´åˆã§ã‚ã£ã¦ã‚‚ã€å½“該料金ã«ã¯ã“れらã®ã‚µãƒ¼ãƒ“スã®å¯¾ä¾¡ã¯å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。ã“れらã®ã‚µãƒ¼ãƒ“スãŒä¸­æ–­ã—ãŸã‚Šåˆ©ç”¨ä¸èƒ½ã«ãªã£ãŸã‚Šã—ãŸå ´åˆã§ã‚ã£ã¦ã‚‚ã€SoftEther VPN ソフトウェアã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹æ–™é‡‘ã¯ä¸€åˆ‡è¿”金ã•ã‚Œãšã€ãã®ä»–ã®æ害賠償もæä¾›ã•ã‚Œã¾ã›ã‚“。
SM_SYSLOG_0 syslog é€ä¿¡æ©Ÿèƒ½ã‚’使用ã—ãªã„
SM_SYSLOG_1 サーãƒãƒ¼ãƒ­ã‚°ã‚’ syslog ã§é€ä¿¡
SM_SYSLOG_2 サーãƒãƒ¼ãŠã‚ˆã³ä»®æƒ³ HUB セキュリティログを syslog ã§é€ä¿¡
@@ -1788,6 +1790,10 @@ LS_LICENSE_NOT_VPNSERVER コãƒã‚¯ã‚·ãƒ§ãƒ³ "%S": ライセンスエラーãŒç™º
LS_LICENSE_NOT_VPNCLUSTER コãƒã‚¯ã‚·ãƒ§ãƒ³ "%S": ライセンスエラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã“ã® VPN Server ã«ã¯ç¾åœ¨ã‚¯ãƒ©ã‚¹ã‚¿ãƒªãƒ³ã‚°æ©Ÿèƒ½ã‚’使用ã§ããªã„種類ã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ãŒç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™ãŒã€ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¢ãƒ¼ãƒ‰ã§å‹•ä½œä¸­ã« VPN Client ãŒæŽ¥ç¶šã—よã†ã¨ã—ã¾ã—ãŸã€‚VPN Server ã‚’å†èµ·å‹•ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
LS_LICENSE_VIOLATION コãƒã‚¯ã‚·ãƒ§ãƒ³ "%S": VPN Server ã§ãƒ©ã‚¤ã‚»ãƒ³ã‚¹é•åãŒç™ºç”Ÿã—ã¦ã„ã‚‹ãŸã‚ã€æŽ¥ç¶šã‚’å—ã‘付ã‘られã¾ã›ã‚“。
LS_LICENSE_VIOLATION_DETECTED ライセンスé•åを検出ã—ã¾ã—ãŸã€‚別㮠VPN Server ãŒã€ã“ã® VPN Server ã¨åŒã˜ã‚µãƒ¼ãƒãƒ¼ ID "%I64u" ã§å‹•ä½œã—ã¦ã„ã¾ã™ã€‚クラスタ内ã«åŒä¸€ã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã‚’使用ã—㟠2 å°ä»¥ä¸Šã® VPN Server ãŒå­˜åœ¨ã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚å„ VPN Server ã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹æƒ…報を確èªã—ã¦ãã ã•ã„。
+LS_API_AUTH_OK HTTPS API クライアント "%r:%u" (%S): 管ç†ãƒ¢ãƒ¼ãƒ‰: "%S" ã§çµ„ã¿è¾¼ã¿ HTTPS Web サーãƒãƒ¼ã‚’用ã„ã¦ãƒ­ã‚°ã‚¤ãƒ³ã«æˆåŠŸã—ã¾ã—ãŸã€‚使用ã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼å: "%S", メソッド: "%S", パス: "%S"
+LS_API_AUTH_ERROR HTTPS API クライアント "%r:%u" (%S): 組ã¿è¾¼ã¿ HTTPS Web サーãƒãƒ¼ã‚’用ã„ã¦ãƒ­ã‚°ã‚¤ãƒ³ã«å¤±æ•—ã—ã¾ã—ãŸã€‚使用ã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼å: "%S", メソッド: "%S", パス: "%S"
+LS_API_RPC_CALL HTTPS API クライアント "%r:%u" (%S): JSON-API を呼ã³å‡ºã—ã¾ã—ãŸã€‚メソッドå: "%S", çµæžœã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰: %u (0 = æˆåŠŸ), çµæžœã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸: "%s"
+
# (OpenVPN ログ)
@@ -1797,6 +1803,9 @@ LO_PREFIX_CHANNEL OpenVPN セッション %u (%r:%u -> %r:%u) ãƒãƒ£ãƒãƒ« %u:
LO_NEW_CHANNEL æ–°ã—ã„ãƒãƒ£ãƒãƒ«ã‚’作æˆã—ã¾ã—ãŸã€‚
LO_CHANNEL_ESTABLISHED_NEWKEY ãƒãƒ£ãƒãƒ«ãŒç¢ºç«‹çŠ¶æ…‹ã«ãªã‚Šã¾ã—㟠(原因: リキーã®å®Œäº†)。
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 ã“ã®ãƒãƒ£ãƒãƒ«ã®ãƒªã‚­ãƒ¼ã‚’開始ã—ã¾ã™ã€‚
@@ -1893,6 +1902,7 @@ LH_AUTH_PASSWORD パスワードèªè¨¼
LH_AUTH_PLAIN_PASSWORD 外部サーãƒãƒ¼èªè¨¼
LH_AUTH_CERT 証明書èªè¨¼
LH_AUTH_TICKET ãƒã‚±ãƒƒãƒˆèªè¨¼
+LH_AUTH_OPENVPN_CERT OpenVPN 証明書èªè¨¼
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 ドメインèªè¨¼) ãŒæŒ‡å®šã•ã‚Œã¾ã—ãŸãŒã€RADIUS èªè¨¼ã¾ãŸã¯ Active Directory èªè¨¼ (NT ドメインèªè¨¼) を使用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。ã“ã®æ©Ÿèƒ½ã¯ã‚ªãƒ¼ãƒ—ンソース版 SoftEther VPN ã«ã¯ã¾ã å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã›ã‚“。接続ã¯æ‹’å¦ã•ã‚Œã¾ã™ã€‚
LH_AUTH_CERT_NOT_SUPPORT_ON_OPEN_SOURCE コãƒã‚¯ã‚·ãƒ§ãƒ³ "%S": ユーザー "%S" ã®èªè¨¼æ–¹æ³•ã¨ã—ã¦è¨¼æ˜Žæ›¸èªè¨¼ãŒæŒ‡å®šã•ã‚Œã¾ã—ãŸãŒã€è¨¼æ˜Žæ›¸èªè¨¼ã‚’使用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。ã“ã®æ©Ÿèƒ½ã¯ã‚ªãƒ¼ãƒ—ンソース版 SoftEther VPN ã«ã¯ã¾ã å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã›ã‚“。接続ã¯æ‹’å¦ã•ã‚Œã¾ã™ã€‚
@@ -1913,7 +1923,7 @@ LH_MAX_SESSION コãƒã‚¯ã‚·ãƒ§ãƒ³ "%S": 仮想 HUB ãŒè¨­å®šã•ã‚ŒãŸæœ€å¤§ã‚»
LH_MAX_SESSION_CLIENT コãƒã‚¯ã‚·ãƒ§ãƒ³ "%S": 仮想 HUB ãŒè¨­å®šã•ã‚ŒãŸæœ€å¤§ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³æ•° %u ã«é”ã—ã¦ã„ã¾ã™ã€‚æ–°ã—ã„セッションã¯ä½œæˆã§ãã¾ã›ã‚“。
LH_MAX_SESSION_BRIDGE コãƒã‚¯ã‚·ãƒ§ãƒ³ "%S": 仮想 HUB ãŒè¨­å®šã•ã‚ŒãŸæœ€å¤§ãƒ–リッジセッション数 %u ã«é”ã—ã¦ã„ã¾ã™ã€‚æ–°ã—ã„セッションã¯ä½œæˆã§ãã¾ã›ã‚“。
LH_MAX_SESSION_2 コãƒã‚¯ã‚·ãƒ§ãƒ³ "%S": VPN Server 上ã§ç®¡ç†ã™ã‚‹ã“ã¨ãŒã§ãる最大セッション数 %u ã«é”ã—ã¦ã„ã¾ã™ã€‚æ–°ã—ã„セッションã¯ä½œæˆã§ãã¾ã›ã‚“。
-LH_NEW_SESSION コãƒã‚¯ã‚·ãƒ§ãƒ³ "%S": æ–°ã—ã„セッション "%S" ãŒä½œæˆã•ã‚Œã¾ã—ãŸã€‚(IP アドレス %S, ãƒãƒ¼ãƒˆç•ªå· %u, 物ç†ãƒ¬ã‚¤ãƒ¤ã®ãƒ—ロトコル: "%S")
+LH_NEW_SESSION コãƒã‚¯ã‚·ãƒ§ãƒ³ "%S": æ–°ã—ã„セッション "%S" ãŒä½œæˆã•ã‚Œã¾ã—ãŸã€‚(IP アドレス %S, ãƒãƒ¼ãƒˆç•ªå· %u, 物ç†ãƒ¬ã‚¤ãƒ¤ã®ãƒ—ロトコル: "%S", プロトコル詳細: "%S")
LH_SET_SESSION セッション "%S": パラメータãŒè¨­å®šã•ã‚Œã¾ã—ãŸã€‚最大 TCP コãƒã‚¯ã‚·ãƒ§ãƒ³æ•° %u, æš—å·åŒ–ã®ä½¿ç”¨ %s, 圧縮ã®ä½¿ç”¨ %s, åŠäºŒé‡é€šä¿¡ã®ä½¿ç”¨ %s, タイムアウト %u 秒
LH_NODE_INFO セッション "%S": VPN Client ã®è©³ç´°: (%s)
LH_VLAN_ID セッション "%S": 割り当ã¦ã‚‰ã‚ŒãŸ VLAN ID: %u
@@ -7010,6 +7020,8 @@ SW_WEB2_TITLE ファイルã®æŒ‡å®š
SW_UNINSTALLINFO_URL http://selinks.org/
SW_UNINSTALLINFO_PUBLISHER SoftEther VPN Project
+SW_KB3033929_REQUIRED Windows 7 ãŠã‚ˆã³ Windows Server 2008 R2 ã§ã¯ã€SoftEther VPN ã®ä¸€éƒ¨ã®æ©Ÿèƒ½ã‚’利用ã™ã‚‹ãŸã‚ã«ã¯ã€Microsoft 社㮠Windows Update プログラム KB3033929 ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚\r\n\r\nKB3033929 ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ãªã„å ´åˆã¯ã€SoftEther VPN をインストールã™ã‚‹å‰ã«ã€Windows Update ã¾ãŸã¯ Microsoft 社㮠Web サイトã‹ã‚‰ KB3033929 をインストールをã—ã¦ãã ã•ã„。
+
SW_COMPONENTS_ABOUT_TAG 「%sã€ã¨ã¯
SW_COMPONENTS_REQUIRE_ADMIN インストールã«ã¯ç®¡ç†è€…権é™ãŒå¿…è¦ã§ã™
@@ -7052,7 +7064,7 @@ SW_INSTALLER_CACHE_IS_NOT_SIGNED ç¾åœ¨ã®ã‚³ãƒ³ãƒ”ュータã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼
SW_FILE_NOT_FOUNT ファイル "%s" ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
SW_WEB_FINISHED 生æˆã•ã‚ŒãŸ Web インストーラを格ç´ã—ãŸãƒ•ã‚¡ã‚¤ãƒ« "%s" ã‚’ä¿å­˜ã—ã¾ã—ãŸã€‚\r\n\r\nã“ã® ZIP ファイルを展開ã—ã€ä¸­èº«ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ Web サーãƒãƒ¼ã«è¨­ç½®ã—㦠HTML ファイルや inf ファイル内㮠URL ã‚’é©åˆ‡ã«æ›¸ãæ›ãˆã¦ãã ã•ã„。\r\n\r\nWeb インストーラã®é…置方法ã«é–¢ã™ã‚‹èª¬æ˜Žã¯ ZIP ファイル内ã«è¨˜è¼‰ã•ã‚Œã¦ã„ã¾ã™ã€‚
-SW_VG_CONFIRM_MSG SoftEther VPN Client ã«çµ„ã¿è¾¼ã¾ã‚ŒãŸ VPN Gate P2P 中継機能プラグインモジュール をインストールã—有効化ã—ã¾ã™ã€‚よã‚ã—ã„ã§ã™ã‹?\r\n\r\n本プラグインã¯ã€æ”¿åºœã®æ¤œé–²ç”¨ãƒ•ã‚¡ã‚¤ã‚¢ã‚¦ã‚©ãƒ¼ãƒ«ã‚’回é¿ã™ã‚‹ãŸã‚ã®é€šä¿¡ã®å®‰å®šåŒ–を実ç¾ã—ã¾ã™ã€‚ã—ã‹ã—ãªãŒã‚‰ã€VPN Gate ã®ãŸã‚ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯å¸¯åŸŸã®æ¶ˆè²»é‡ãŒå¢—加ã—ã¾ã™ã€‚ã—ãŸãŒã£ã¦ã€ãƒ¢ãƒã‚¤ãƒ«å›žç·šã«ãŠã„㦠VPN Gate 機能を使用ã™ã‚‹ã“ã¨ã¯æŽ¨å¥¨ã•ã‚Œã¦ã„ã¾ã›ã‚“。\r\n\r\n政府ã®æ¤œé–²ç”¨ãƒ•ã‚¡ã‚¤ã‚¢ã‚¦ã‚©ãƒ¼ãƒ«ã‚’回é¿ã™ã‚‹ç›®çš„ã§æš—å·åŒ–ã•ã‚ŒãŸé€šä¿¡ã‚’è¡Œã†ã“ã¨ã¯ã€ã„ãã¤ã‹ã®å›½ãŠã‚ˆã³åœ°åŸŸã§ã¯ç¦æ­¢ã•ã‚Œã¦ã„ã¾ã™ã€‚ãã®ã‚ˆã†ãªå ´åˆã¯ã€VPN Gate 機能をコンピュータã§ä½¿ç”¨ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“。VPN Gate ã¯å°‚ら日本国内ã«ãŠã‘る使用を想定ã—開発ã•ã‚Œã¦ã„ã¾ã™ã€‚VPN Gate ã¯å­¦è¡“目的ã®ç ”究プロジェクトã§ã™ã€‚VPN Gate ã¯æ—¥æœ¬å›½ã®æ³•ä»¤ã«åŸºã¥ã„ã¦æä¾›ã•ã‚Œã¾ã™ã€‚ãã®ä»–ã®å›½ã®æ³•å¾‹ã«ã¤ã„ã¦ã¯ã€VPN Gate Project ã¯ä¸€åˆ‡é–¢çŸ¥ã—ã¦ãŠã‚Šã¾ã›ã‚“。本ソフトウェアãŠã‚ˆã³ã‚µãƒ¼ãƒ“スを使用ã™ã‚‹ã«ã‚ãŸã‚Šã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼è‡ªèº«ã®è²¬ä»»ã«ãŠã„ã¦ã€é©ç”¨ã•ã‚Œã‚‹ã™ã¹ã¦ã®æ³•ä»¤ã‚’éµå®ˆã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。使用場所ãŒæ—¥æœ¬å›½å†…ã¾ãŸã¯å›½å¤–ã®ã„ãšã‚Œã§ã‚ã‚‹ã‹ã«ä¿‚ã‚らãšã€æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ãŠã‚ˆã³ã‚µãƒ¼ãƒ“スを使用ã—ãŸã“ã¨ã«ã‚ˆã‚‹ã™ã¹ã¦ã®æ害ãŠã‚ˆã³è²¬ä»»ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒè² ã†ã“ã¨ã¨ãªã‚Šã¾ã™ã€‚
+SW_VG_CONFIRM_MSG SoftEther VPN Client ã«çµ„ã¿è¾¼ã¾ã‚ŒãŸ VPN Gate P2P 中継機能プラグインモジュール をインストールã—有効化ã—ã¾ã™ã€‚よã‚ã—ã„ã§ã™ã‹?\r\n\r\n本プラグインã¯ã€æ”¿åºœã®æ¤œé–²ç”¨ãƒ•ã‚¡ã‚¤ã‚¢ã‚¦ã‚©ãƒ¼ãƒ«ã‚’回é¿ã™ã‚‹ãŸã‚ã®é€šä¿¡ã®å®‰å®šåŒ–を実ç¾ã—ã¾ã™ã€‚ã—ã‹ã—ãªãŒã‚‰ã€VPN Gate ã®ãŸã‚ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯å¸¯åŸŸã®æ¶ˆè²»é‡ãŒå¢—加ã—ã¾ã™ã€‚ã—ãŸãŒã£ã¦ã€ãƒ¢ãƒã‚¤ãƒ«å›žç·šã«ãŠã„㦠VPN Gate 機能を使用ã™ã‚‹ã“ã¨ã¯æŽ¨å¥¨ã•ã‚Œã¦ã„ã¾ã›ã‚“。\r\n\r\n政府ã®æ¤œé–²ç”¨ãƒ•ã‚¡ã‚¤ã‚¢ã‚¦ã‚©ãƒ¼ãƒ«ã‚’回é¿ã™ã‚‹ç›®çš„ã§æš—å·åŒ–ã•ã‚ŒãŸé€šä¿¡ã‚’è¡Œã†ã“ã¨ã¯ã€ã„ãã¤ã‹ã®å›½ãŠã‚ˆã³åœ°åŸŸã§ã¯ç¦æ­¢ã•ã‚Œã¦ã„ã¾ã™ã€‚ãã®ã‚ˆã†ãªå ´åˆã¯ã€VPN Gate 機能をコンピュータã§ä½¿ç”¨ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“。VPN Gate ã¯å°‚ら日本国内ã«ãŠã‘る使用を想定ã—開発ã•ã‚Œã¦ã„ã¾ã™ã€‚VPN Gate ã¯å­¦è¡“目的ã®ç ”究プロジェクトã§ã™ã€‚VPN Gate ã¯æ—¥æœ¬å›½ã®æ³•ä»¤ã«åŸºã¥ã„ã¦æä¾›ã•ã‚Œã¾ã™ã€‚ãã®ä»–ã®å›½ã®æ³•å¾‹ã«ã¤ã„ã¦ã¯ã€VPN Gate Project ã¯ä¸€åˆ‡é–¢çŸ¥ã—ã¦ãŠã‚Šã¾ã›ã‚“。本ソフトウェアãŠã‚ˆã³ã‚µãƒ¼ãƒ“スを使用ã™ã‚‹ã«ã‚ãŸã‚Šã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼è‡ªèº«ã®è²¬ä»»ã«ãŠã„ã¦ã€é©ç”¨ã•ã‚Œã‚‹ã™ã¹ã¦ã®æ³•ä»¤ã‚’éµå®ˆã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。使用場所ãŒæ—¥æœ¬å›½å†…ã¾ãŸã¯å›½å¤–ã®ã„ãšã‚Œã§ã‚ã‚‹ã‹ã«ä¿‚ã‚らãšã€æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ãŠã‚ˆã³ã‚µãƒ¼ãƒ“スを使用ã—ãŸã“ã¨ã«ã‚ˆã‚‹ã™ã¹ã¦ã®æ害ãŠã‚ˆã³è²¬ä»»ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒè² ã†ã“ã¨ã¨ãªã‚Šã¾ã™ã€‚\r\n\r\nVPN Gate 中継サービスã¯ã€ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§å‹•ä½œã™ã‚‹ã‚·ã‚¹ãƒ†ãƒ ã‚µãƒ¼ãƒ“スã¨ã—ã¦ã‚³ãƒ³ãƒ”ュータã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¾ã™ã€‚ã“れらã®ç®¡ç† GUI ツールを終了ã—ã¦ã‚‚ã€ã‚·ã‚¹ãƒ†ãƒ ã‚µãƒ¼ãƒ“スã¯ç¶™ç¶šã—ã¦ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§å‹•ä½œã—続ã‘ã¾ã™ã€‚システムサービスã¯ã€CPU 時間ã€ã‚³ãƒ³ãƒ”ュータã®æ¶ˆè²»é›»åŠ›ã€ãƒ¡ãƒ¢ãƒªãŠã‚ˆã³ãƒ‡ã‚£ã‚¹ã‚¯ã®å®¹é‡ã‚’消費ã—ã¾ã™ã€‚
diff --git a/src/bin/hamcore/vpnserver_api_doc.html b/src/bin/hamcore/vpnserver_api_doc.html
new file mode 100644
index 00000000..64e7f10c
--- /dev/null
+++ b/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>
diff --git a/src/bin/hamcore/warning_cn.txt b/src/bin/hamcore/warning_cn.txt
index 40372b81..04a17d5b 100644
--- a/src/bin/hamcore/warning_cn.txt
+++ b/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 的优化。
diff --git a/src/bin/hamcore/warning_en.txt b/src/bin/hamcore/warning_en.txt
index 9ebbf058..30a4a85c 100644
--- a/src/bin/hamcore/warning_en.txt
+++ b/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.
diff --git a/src/bin/hamcore/warning_ja.txt b/src/bin/hamcore/warning_ja.txt
index 9ed7e2c2..3748f4fd 100644
--- a/src/bin/hamcore/warning_ja.txt
+++ b/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 ã®è¨­å®šã®æœ€é©åŒ–ã¯å¾Œã‹ã‚‰å…ƒã«æˆ»ã™ã“ã¨ãŒã§ãã¾ã™ã€‚
diff --git a/src/bin/hamcore/wwwroot/admin/README.md b/src/bin/hamcore/wwwroot/admin/README.md
new file mode 100644
index 00000000..49316cba
--- /dev/null
+++ b/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.
+
+
+
+
diff --git a/src/bin/hamcore/wwwroot/admin/default/.gitignore b/src/bin/hamcore/wwwroot/admin/default/.gitignore
new file mode 100644
index 00000000..bca51b35
--- /dev/null
+++ b/src/bin/hamcore/wwwroot/admin/default/.gitignore
@@ -0,0 +1 @@
+node_modules/
diff --git a/src/bin/hamcore/wwwroot/admin/default/.vscode/launch.json b/src/bin/hamcore/wwwroot/admin/default/.vscode/launch.json
new file mode 100644
index 00000000..ae8930b3
--- /dev/null
+++ b/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"
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/bin/hamcore/wwwroot/admin/default/.vscode/settings.json b/src/bin/hamcore/wwwroot/admin/default/.vscode/settings.json
new file mode 100644
index 00000000..bb15d9e4
--- /dev/null
+++ b/src/bin/hamcore/wwwroot/admin/default/.vscode/settings.json
@@ -0,0 +1,5 @@
+{
+ "files.associations": {
+ "tsconfig_webpack.json": "jsonc"
+ }
+} \ No newline at end of file
diff --git a/src/bin/hamcore/wwwroot/admin/default/.vscode/tasks.json b/src/bin/hamcore/wwwroot/admin/default/.vscode/tasks.json
new file mode 100644
index 00000000..704f1355
--- /dev/null
+++ b/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"
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/bin/hamcore/wwwroot/admin/default/hub.html b/src/bin/hamcore/wwwroot/admin/default/hub.html
new file mode 100644
index 00000000..91b46307
--- /dev/null
+++ b/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>
+
diff --git a/src/bin/hamcore/wwwroot/admin/default/include_footer.html b/src/bin/hamcore/wwwroot/admin/default/include_footer.html
new file mode 100644
index 00000000..d00aa3e6
--- /dev/null
+++ b/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>
diff --git a/src/bin/hamcore/wwwroot/admin/default/include_head.html b/src/bin/hamcore/wwwroot/admin/default/include_head.html
new file mode 100644
index 00000000..157dfec0
--- /dev/null
+++ b/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>
diff --git a/src/bin/hamcore/wwwroot/admin/default/include_menu.html b/src/bin/hamcore/wwwroot/admin/default/include_menu.html
new file mode 100644
index 00000000..3926209a
--- /dev/null
+++ b/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>
diff --git a/src/bin/hamcore/wwwroot/admin/default/index.html b/src/bin/hamcore/wwwroot/admin/default/index.html
new file mode 100644
index 00000000..052ac57f
--- /dev/null
+++ b/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>
+
diff --git a/src/bin/hamcore/wwwroot/admin/default/out_webpack/bundle.js b/src/bin/hamcore/wwwroot/admin/default/out_webpack/bundle.js
new file mode 100644
index 00000000..e9ec0b6d
--- /dev/null
+++ b/src/bin/hamcore/wwwroot/admin/default/out_webpack/bundle.js
@@ -0,0 +1,2144 @@
+var JS =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./src/ts/main.ts");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./node_modules/base64-js/index.js":
+/*!*****************************************!*\
+ !*** ./node_modules/base64-js/index.js ***!
+ \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n for (var i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(\n uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)\n ))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYmFzZTY0LWpzL2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvYmFzZTY0LWpzL2luZGV4LmpzPzFmYjUiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydHMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcbmV4cG9ydHMudG9CeXRlQXJyYXkgPSB0b0J5dGVBcnJheVxuZXhwb3J0cy5mcm9tQnl0ZUFycmF5ID0gZnJvbUJ5dGVBcnJheVxuXG52YXIgbG9va3VwID0gW11cbnZhciByZXZMb29rdXAgPSBbXVxudmFyIEFyciA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4QXJyYXkgOiBBcnJheVxuXG52YXIgY29kZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJ1xuZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNvZGUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgbG9va3VwW2ldID0gY29kZVtpXVxuICByZXZMb29rdXBbY29kZS5jaGFyQ29kZUF0KGkpXSA9IGlcbn1cblxuLy8gU3VwcG9ydCBkZWNvZGluZyBVUkwtc2FmZSBiYXNlNjQgc3RyaW5ncywgYXMgTm9kZS5qcyBkb2VzLlxuLy8gU2VlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CYXNlNjQjVVJMX2FwcGxpY2F0aW9uc1xucmV2TG9va3VwWyctJy5jaGFyQ29kZUF0KDApXSA9IDYyXG5yZXZMb29rdXBbJ18nLmNoYXJDb2RlQXQoMCldID0gNjNcblxuZnVuY3Rpb24gZ2V0TGVucyAoYjY0KSB7XG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG5cbiAgaWYgKGxlbiAlIDQgPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0JylcbiAgfVxuXG4gIC8vIFRyaW0gb2ZmIGV4dHJhIGJ5dGVzIGFmdGVyIHBsYWNlaG9sZGVyIGJ5dGVzIGFyZSBmb3VuZFxuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9iZWF0Z2FtbWl0L2Jhc2U2NC1qcy9pc3N1ZXMvNDJcbiAgdmFyIHZhbGlkTGVuID0gYjY0LmluZGV4T2YoJz0nKVxuICBpZiAodmFsaWRMZW4gPT09IC0xKSB2YWxpZExlbiA9IGxlblxuXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSB2YWxpZExlbiA9PT0gbGVuXG4gICAgPyAwXG4gICAgOiA0IC0gKHZhbGlkTGVuICUgNClcblxuICByZXR1cm4gW3ZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW5dXG59XG5cbi8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoYjY0KSB7XG4gIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpXG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF1cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV1cbiAgcmV0dXJuICgodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzTGVuXG59XG5cbmZ1bmN0aW9uIF9ieXRlTGVuZ3RoIChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pIHtcbiAgcmV0dXJuICgodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzTGVuXG59XG5cbmZ1bmN0aW9uIHRvQnl0ZUFycmF5IChiNjQpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG5cbiAgdmFyIGFyciA9IG5ldyBBcnIoX2J5dGVMZW5ndGgoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSlcblxuICB2YXIgY3VyQnl0ZSA9IDBcblxuICAvLyBpZiB0aGVyZSBhcmUgcGxhY2Vob2xkZXJzLCBvbmx5IGdldCB1cCB0byB0aGUgbGFzdCBjb21wbGV0ZSA0IGNoYXJzXG4gIHZhciBsZW4gPSBwbGFjZUhvbGRlcnNMZW4gPiAwXG4gICAgPyB2YWxpZExlbiAtIDRcbiAgICA6IHZhbGlkTGVuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxOCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfFxuICAgICAgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV1cbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gMTYpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDIpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAxKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDEwKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDEyICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gNiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID1cbiAgICAgICgodWludDhbaV0gPDwgMTYpICYgMHhGRjAwMDApICtcbiAgICAgICgodWludDhbaSArIDFdIDw8IDgpICYgMHhGRjAwKSArXG4gICAgICAodWludDhbaSArIDJdICYgMHhGRilcbiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSlcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGZyb21CeXRlQXJyYXkgKHVpbnQ4KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aFxuICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDMgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayhcbiAgICAgIHVpbnQ4LCBpLCAoaSArIG1heENodW5rTGVuZ3RoKSA+IGxlbjIgPyBsZW4yIDogKGkgKyBtYXhDaHVua0xlbmd0aClcbiAgICApKVxuICB9XG5cbiAgLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xuICBpZiAoZXh0cmFCeXRlcyA9PT0gMSkge1xuICAgIHRtcCA9IHVpbnQ4W2xlbiAtIDFdXG4gICAgcGFydHMucHVzaChcbiAgICAgIGxvb2t1cFt0bXAgPj4gMl0gK1xuICAgICAgbG9va3VwWyh0bXAgPDwgNCkgJiAweDNGXSArXG4gICAgICAnPT0nXG4gICAgKVxuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDEwXSArXG4gICAgICBsb29rdXBbKHRtcCA+PiA0KSAmIDB4M0ZdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDIpICYgMHgzRl0gK1xuICAgICAgJz0nXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJycpXG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/base64-js/index.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/buffer/index.js":
+/*!**************************************!*\
+ !*** ./node_modules/buffer/index.js ***!
+ \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("/* WEBPACK VAR INJECTION */(function(global) {/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>\n * @license MIT\n */\n/* eslint-disable no-proto */\n\n\n\nvar base64 = __webpack_require__(/*! base64-js */ \"./node_modules/base64-js/index.js\")\nvar ieee754 = __webpack_require__(/*! ieee754 */ \"./node_modules/ieee754/index.js\")\nvar isArray = __webpack_require__(/*! isarray */ \"./node_modules/isarray/index.js\")\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n * incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n ? global.TYPED_ARRAY_SUPPORT\n : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n try {\n var arr = new Uint8Array(1)\n arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n return arr.foo() === 42 && // typed array instances can be augmented\n typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n } catch (e) {\n return false\n }\n}\n\nfunction kMaxLength () {\n return Buffer.TYPED_ARRAY_SUPPORT\n ? 0x7fffffff\n : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n if (kMaxLength() < length) {\n throw new RangeError('Invalid typed array length')\n }\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = new Uint8Array(length)\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n if (that === null) {\n that = new Buffer(length)\n }\n that.length = length\n }\n\n return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n return new Buffer(arg, encodingOrOffset, length)\n }\n\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new Error(\n 'If encoding is specified then the first argument must be a string'\n )\n }\n return allocUnsafe(this, arg)\n }\n return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n arr.__proto__ = Buffer.prototype\n return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n if (typeof value === 'number') {\n throw new TypeError('\"value\" argument must not be a number')\n }\n\n if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n return fromArrayBuffer(that, value, encodingOrOffset, length)\n }\n\n if (typeof value === 'string') {\n return fromString(that, value, encodingOrOffset)\n }\n\n return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n Buffer.prototype.__proto__ = Uint8Array.prototype\n Buffer.__proto__ = Uint8Array\n if (typeof Symbol !== 'undefined' && Symbol.species &&\n Buffer[Symbol.species] === Buffer) {\n // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n Object.defineProperty(Buffer, Symbol.species, {\n value: null,\n configurable: true\n })\n }\n}\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be a number')\n } else if (size < 0) {\n throw new RangeError('\"size\" argument must not be negative')\n }\n}\n\nfunction alloc (that, size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(that, size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpretted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(that, size).fill(fill, encoding)\n : createBuffer(that, size).fill(fill)\n }\n return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n assertSize(size)\n that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) {\n for (var i = 0; i < size; ++i) {\n that[i] = 0\n }\n }\n return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('\"encoding\" must be a valid string encoding')\n }\n\n var length = byteLength(string, encoding) | 0\n that = createBuffer(that, length)\n\n var actual = that.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n that = that.slice(0, actual)\n }\n\n return that\n}\n\nfunction fromArrayLike (that, array) {\n var length = array.length < 0 ? 0 : checked(array.length) | 0\n that = createBuffer(that, length)\n for (var i = 0; i < length; i += 1) {\n that[i] = array[i] & 255\n }\n return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\\'offset\\' is out of bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\\'length\\' is out of bounds')\n }\n\n if (byteOffset === undefined && length === undefined) {\n array = new Uint8Array(array)\n } else if (length === undefined) {\n array = new Uint8Array(array, byteOffset)\n } else {\n array = new Uint8Array(array, byteOffset, length)\n }\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = array\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n that = fromArrayLike(that, array)\n }\n return that\n}\n\nfunction fromObject (that, obj) {\n if (Buffer.isBuffer(obj)) {\n var len = checked(obj.length) | 0\n that = createBuffer(that, len)\n\n if (that.length === 0) {\n return that\n }\n\n obj.copy(that, 0, 0, len)\n return that\n }\n\n if (obj) {\n if ((typeof ArrayBuffer !== 'undefined' &&\n obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n if (typeof obj.length !== 'number' || isnan(obj.length)) {\n return createBuffer(that, 0)\n }\n return fromArrayLike(that, obj)\n }\n\n if (obj.type === 'Buffer' && isArray(obj.data)) {\n return fromArrayLike(that, obj.data)\n }\n }\n\n throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n // Note: cannot use `length < kMaxLength()` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= kMaxLength()) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + kMaxLength().toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError('Arguments must be Buffers')\n }\n\n if (a === b) return 0\n\n var x = a.length\n var y = b.length\n\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n var i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n var buffer = Buffer.allocUnsafe(length)\n var pos = 0\n for (i = 0; i < list.length; ++i) {\n var buf = list[i]\n if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n buf.copy(buffer, pos)\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n string = '' + string\n }\n\n var len = string.length\n if (len === 0) return 0\n\n // Use a for loop to avoid recursion\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n case undefined:\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) return utf8ToBytes(string).length // assume utf8\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n var loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n var i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n var len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (var i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n var len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (var i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n var len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (var i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n var length = this.length | 0\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n var str = ''\n var max = exports.INSPECT_MAX_BYTES\n if (this.length > 0) {\n str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n if (this.length > max) str += ' ... '\n }\n return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (!Buffer.isBuffer(target)) {\n throw new TypeError('Argument must be a Buffer')\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n var x = thisEnd - thisStart\n var y = end - start\n var len = Math.min(x, y)\n\n var thisCopy = this.slice(thisStart, thisEnd)\n var targetCopy = target.slice(start, end)\n\n for (var i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (isNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (Buffer.TYPED_ARRAY_SUPPORT &&\n typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n var indexSize = 1\n var arrLength = arr.length\n var valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n var i\n if (dir) {\n var foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n var found = true\n for (var j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n var remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n // must be an even number of digits\n var strLen = string.length\n if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n for (var i = 0; i < length; ++i) {\n var parsed = parseInt(string.substr(i * 2, 2), 16)\n if (isNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset | 0\n if (isFinite(length)) {\n length = length | 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n // legacy write(string, encoding, offset, length) - remove in v0.13\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n var remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n return asciiWrite(this, string, offset, length)\n\n case 'latin1':\n case 'binary':\n return latin1Write(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n var res = []\n\n var i = start\n while (i < end) {\n var firstByte = buf[i]\n var codePoint = null\n var bytesPerSequence = (firstByte > 0xEF) ? 4\n : (firstByte > 0xDF) ? 3\n : (firstByte > 0xBF) ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n var secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n var len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n var res = ''\n var i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n var len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n var out = ''\n for (var i = start; i < end; ++i) {\n out += toHex(buf[i])\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n var bytes = buf.slice(start, end)\n var res = ''\n for (var i = 0; i < bytes.length; i += 2) {\n res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n var len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n var newBuf\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n newBuf = this.subarray(start, end)\n newBuf.__proto__ = Buffer.prototype\n } else {\n var sliceLen = end - start\n newBuf = new Buffer(sliceLen, undefined)\n for (var i = 0; i < sliceLen; ++i) {\n newBuf[i] = this[i + start]\n }\n }\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n var val = this[offset + --byteLength]\n var mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var i = byteLength\n var mul = 1\n var val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var mul = 1\n var i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var i = byteLength - 1\n var mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n (littleEndian ? i : 1 - i) * 8\n }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffffffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = 0\n var mul = 1\n var sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = byteLength - 1\n var mul = 1\n var sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n var len = end - start\n var i\n\n if (this === target && start < targetStart && targetStart < end) {\n // descending copy from end\n for (i = len - 1; i >= 0; --i) {\n target[i + targetStart] = this[i + start]\n }\n } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n // ascending copy from start\n for (i = 0; i < len; ++i) {\n target[i + targetStart] = this[i + start]\n }\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, start + len),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (val.length === 1) {\n var code = val.charCodeAt(0)\n if (code < 256) {\n val = code\n }\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n } else if (typeof val === 'number') {\n val = val & 255\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n var i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n var bytes = Buffer.isBuffer(val)\n ? val\n : utf8ToBytes(new Buffer(val, encoding).toString())\n var len = bytes.length\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction stringtrim (str) {\n if (str.trim) return str.trim()\n return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n if (n < 16) return '0' + n.toString(16)\n return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n var codePoint\n var length = string.length\n var leadSurrogate = null\n var bytes = []\n\n for (var i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n var c, hi, lo\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n for (var i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\nfunction isnan (val) {\n return val !== val // eslint-disable-line no-self-compare\n}\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzP2I2MzkiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCdiYXNlNjQtanMnKVxudmFyIGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0JylcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgVXNlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogRHVlIHRvIHZhcmlvdXMgYnJvd3NlciBidWdzLCBzb21ldGltZXMgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQgZXZlblxuICogd2hlbiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0eXBlZCBhcnJheXMuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgIC0gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWAgaW5zdGFuY2VzLFxuICogICAgIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4LlxuICpcbiAqICAgLSBDaHJvbWUgOS0xMCBpcyBtaXNzaW5nIHRoZSBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uLlxuICpcbiAqICAgLSBJRTEwIGhhcyBhIGJyb2tlbiBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYXJyYXlzIG9mXG4gKiAgICAgaW5jb3JyZWN0IGxlbmd0aCBpbiBzb21lIHNpdHVhdGlvbnMuXG5cbiAqIFdlIGRldGVjdCB0aGVzZSBidWdneSBicm93c2VycyBhbmQgc2V0IGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGAgdG8gYGZhbHNlYCBzbyB0aGV5XG4gKiBnZXQgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgc2xvd2VyIGJ1dCBiZWhhdmVzIGNvcnJlY3RseS5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVCAhPT0gdW5kZWZpbmVkXG4gID8gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgOiB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbi8qXG4gKiBFeHBvcnQga01heExlbmd0aCBhZnRlciB0eXBlZCBhcnJheSBzdXBwb3J0IGlzIGRldGVybWluZWQuXG4gKi9cbmV4cG9ydHMua01heExlbmd0aCA9IGtNYXhMZW5ndGgoKVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDEpXG4gICAgYXJyLl9fcHJvdG9fXyA9IHtfX3Byb3RvX186IFVpbnQ4QXJyYXkucHJvdG90eXBlLCBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH19XG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDIgJiYgLy8gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWRcbiAgICAgICAgdHlwZW9mIGFyci5zdWJhcnJheSA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyBjaHJvbWUgOS0xMCBsYWNrIGBzdWJhcnJheWBcbiAgICAgICAgYXJyLnN1YmFycmF5KDEsIDEpLmJ5dGVMZW5ndGggPT09IDAgLy8gaWUxMCBoYXMgYnJva2VuIGBzdWJhcnJheWBcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIGtNYXhMZW5ndGggKCkge1xuICByZXR1cm4gQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgICA/IDB4N2ZmZmZmZmZcbiAgICA6IDB4M2ZmZmZmZmZcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyICh0aGF0LCBsZW5ndGgpIHtcbiAgaWYgKGtNYXhMZW5ndGgoKSA8IGxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCcpXG4gIH1cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgaWYgKHRoYXQgPT09IG51bGwpIHtcbiAgICAgIHRoYXQgPSBuZXcgQnVmZmVyKGxlbmd0aClcbiAgICB9XG4gICAgdGhhdC5sZW5ndGggPSBsZW5ndGhcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmICEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZydcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKHRoaXMsIGFyZylcbiAgfVxuICByZXR1cm4gZnJvbSh0aGlzLCBhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbi8vIFRPRE86IExlZ2FjeSwgbm90IG5lZWRlZCBhbnltb3JlLiBSZW1vdmUgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLlxuQnVmZmVyLl9hdWdtZW50ID0gZnVuY3Rpb24gKGFycikge1xuICBhcnIuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIGZyb20gKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICByZXR1cm4gZnJvbU9iamVjdCh0aGF0LCB2YWx1ZSlcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbShudWxsLCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5pZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuICBCdWZmZXIuX19wcm90b19fID0gVWludDhBcnJheVxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnNwZWNpZXMgJiZcbiAgICAgIEJ1ZmZlcltTeW1ib2wuc3BlY2llc10gPT09IEJ1ZmZlcikge1xuICAgIC8vIEZpeCBzdWJhcnJheSgpIGluIEVTMjAxNi4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzk3XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlciwgU3ltYm9sLnNwZWNpZXMsIHtcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHRoYXQsIHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0dGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKG51bGwsIHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAodGhhdCwgc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSkge1xuICAgICAgdGhhdFtpXSA9IDBcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nICh0aGF0LCBzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZW5jb2RpbmdcIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJylcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcblxuICB2YXIgYWN0dWFsID0gdGhhdC53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgdGhhdCA9IHRoYXQuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAodGhhdCwgYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBhcnJheS5ieXRlTGVuZ3RoIC8vIHRoaXMgdGhyb3dzIGlmIGBhcnJheWAgaXMgbm90IGEgdmFsaWQgQXJyYXlCdWZmZXJcblxuICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnb2Zmc2V0XFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0ICsgKGxlbmd0aCB8fCAwKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdsZW5ndGhcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSlcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpXG4gIH0gZWxzZSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IGFycmF5XG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQgPSBmcm9tQXJyYXlMaWtlKHRoYXQsIGFycmF5KVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKHRoYXQsIG9iaikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbilcblxuICAgIGlmICh0aGF0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoYXRcbiAgICB9XG5cbiAgICBvYmouY29weSh0aGF0LCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIHRoYXRcbiAgfVxuXG4gIGlmIChvYmopIHtcbiAgICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgb2JqLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB8fCAnbGVuZ3RoJyBpbiBvYmopIHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgaXNuYW4ob2JqLmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCAwKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqKVxuICAgIH1cblxuICAgIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iai5kYXRhKVxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4nKVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwga01heExlbmd0aCgpYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IGtNYXhMZW5ndGgoKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBrTWF4TGVuZ3RoKCkudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycycpXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFpc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV1cbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgIH1cbiAgICBidWYuY29weShidWZmZXIsIHBvcylcbiAgICBwb3MgKz0gYnVmLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZmZXJcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBzdHJpbmcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICBzdHJpbmcgPSAnJyArIHN0cmluZ1xuICB9XG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGUgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCBhbmQgYGlzLWJ1ZmZlcmAgKGluIFNhZmFyaSA1LTcpIHRvIGRldGVjdFxuLy8gQnVmZmVyIGluc3RhbmNlcy5cbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIHZhciBpID0gYltuXVxuICBiW25dID0gYlttXVxuICBiW21dID0gaVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA4ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgNylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNilcbiAgICBzd2FwKHRoaXMsIGkgKyAyLCBpICsgNSlcbiAgICBzd2FwKHRoaXMsIGkgKyAzLCBpICsgNClcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfCAwXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5tYXRjaCgvLnsyfS9nKS5qb2luKCcgJylcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIH1cbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzU3RhcnQsIHRoaXNFbmQpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNTdGFydCA9IDBcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgc3RhcnQgPj4+PSAwXG4gIGVuZCA+Pj49IDBcbiAgdGhpc1N0YXJ0ID4+Pj0gMFxuICB0aGlzRW5kID4+Pj0gMFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQpIHJldHVybiAwXG5cbiAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0XG4gIHZhciB5ID0gZW5kIC0gc3RhcnRcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpXG5cbiAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzQ29weVtpXSAhPT0gdGFyZ2V0Q29weVtpXSkge1xuICAgICAgeCA9IHRoaXNDb3B5W2ldXG4gICAgICB5ID0gdGFyZ2V0Q29weVtpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbi8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuXG4vL1xuLy8gQXJndW1lbnRzOlxuLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2hcbi8vIC0gdmFsIC0gYSBzdHJpbmcsIEJ1ZmZlciwgb3IgbnVtYmVyXG4vLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbi8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nXG4vLyAtIGRpciAtIHRydWUgZm9yIGluZGV4T2YsIGZhbHNlIGZvciBsYXN0SW5kZXhPZlxuZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YgKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcbiAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldFxuICAgIGJ5dGVPZmZzZXQgPSAwXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICB9XG4gIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKGlzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldFxuICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgaWYgKGRpcikgcmV0dXJuIC0xXG4gICAgZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDFcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwXG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiZcbiAgICAgICAgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgWyB2YWwgXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgdmFyIGluZGV4U2l6ZSA9IDFcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGhcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGhcblxuICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGVuY29kaW5nID09PSAndWNzMicgfHwgZW5jb2RpbmcgPT09ICd1Y3MtMicgfHxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fCBlbmNvZGluZyA9PT0gJ3V0Zi0xNmxlJykge1xuICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgaW5kZXhTaXplID0gMlxuICAgICAgYXJyTGVuZ3RoIC89IDJcbiAgICAgIHZhbExlbmd0aCAvPSAyXG4gICAgICBieXRlT2Zmc2V0IC89IDJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGRpcikge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpIDwgYXJyTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXhcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChieXRlT2Zmc2V0ICsgdmFsTGVuZ3RoID4gYXJyTGVuZ3RoKSBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgIGZvdW5kID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIC8vIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgZGlnaXRzXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChzdHJMZW4gJSAyICE9PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChpc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gbGF0aW4xV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggfCAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgLy8gbGVnYWN5IHdyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKSAtIHJlbW92ZSBpbiB2MC4xM1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCdcbiAgICApXG4gIH1cblxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIHZhciByZXMgPSBbXVxuXG4gIHZhciBpID0gc3RhcnRcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKSA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpID8gM1xuICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbnZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnXG4gIHZhciBpID0gMFxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFxuICAgICAgU3RyaW5nLFxuICAgICAgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGxhdGluMVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIHZhciByZXMgPSAnJ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyBieXRlc1tpICsgMV0gKiAyNTYpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZlxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gICAgbmV3QnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xpY2VMZW4gPSBlbmQgLSBzdGFydFxuICAgIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc2xpY2VMZW4sIHVuZGVmaW5lZClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlTGVuOyArK2kpIHtcbiAgICAgIG5ld0J1ZltpXSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIHZhciBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoXG4gIHZhciBtdWwgPSAxXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uIHdyaXRlVUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQxNiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCAyKTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSAmICgweGZmIDw8ICg4ICogKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkpKSkgPj4+XG4gICAgICAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSAqIDhcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQzMiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgNCk7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgPj4+IChsaXR0bGVFbmRpYW4gPyBpIDogMyAtIGkpICogOCkgJiAweGZmXG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gMFxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0XG4gIHZhciBpXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2UgaWYgKGxlbiA8IDEwMDAgfHwgIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gYXNjZW5kaW5nIGNvcHkgZnJvbSBzdGFydFxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICB0YXJnZXQsXG4gICAgICB0aGlzLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbiksXG4gICAgICB0YXJnZXRTdGFydFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gVXNhZ2U6XG4vLyAgICBidWZmZXIuZmlsbChudW1iZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoc3RyaW5nWywgb2Zmc2V0WywgZW5kXV1bLCBlbmNvZGluZ10pXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IHN0YXJ0XG4gICAgICBzdGFydCA9IDBcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmRcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgY29kZSA9IHZhbC5jaGFyQ29kZUF0KDApXG4gICAgICBpZiAoY29kZSA8IDI1Nikge1xuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMFxuXG4gIGlmICghdmFsKSB2YWwgPSAwXG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgdGhpc1tpXSA9IHZhbFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuaXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogdXRmOFRvQnl0ZXMobmV3IEJ1ZmZlcih2YWwsIGVuY29kaW5nKS50b1N0cmluZygpKVxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXitcXC8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHJpbmd0cmltKHN0cikucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gc3RyaW5ndHJpbSAoc3RyKSB7XG4gIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJylcbn1cblxuZnVuY3Rpb24gdG9IZXggKG4pIHtcbiAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gIHJldHVybiBuLnRvU3RyaW5nKDE2KVxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIHZhciBjb2RlUG9pbnRcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gIHZhciBieXRlcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG9cbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG5cbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKVxufVxuXG5mdW5jdGlvbiBibGl0QnVmZmVyIChzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiBpc25hbiAodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IHZhbCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/buffer/index.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/builtin-status-codes/browser.js":
+/*!******************************************************!*\
+ !*** ./node_modules/builtin-status-codes/browser.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("module.exports = {\n \"100\": \"Continue\",\n \"101\": \"Switching Protocols\",\n \"102\": \"Processing\",\n \"200\": \"OK\",\n \"201\": \"Created\",\n \"202\": \"Accepted\",\n \"203\": \"Non-Authoritative Information\",\n \"204\": \"No Content\",\n \"205\": \"Reset Content\",\n \"206\": \"Partial Content\",\n \"207\": \"Multi-Status\",\n \"208\": \"Already Reported\",\n \"226\": \"IM Used\",\n \"300\": \"Multiple Choices\",\n \"301\": \"Moved Permanently\",\n \"302\": \"Found\",\n \"303\": \"See Other\",\n \"304\": \"Not Modified\",\n \"305\": \"Use Proxy\",\n \"307\": \"Temporary Redirect\",\n \"308\": \"Permanent Redirect\",\n \"400\": \"Bad Request\",\n \"401\": \"Unauthorized\",\n \"402\": \"Payment Required\",\n \"403\": \"Forbidden\",\n \"404\": \"Not Found\",\n \"405\": \"Method Not Allowed\",\n \"406\": \"Not Acceptable\",\n \"407\": \"Proxy Authentication Required\",\n \"408\": \"Request Timeout\",\n \"409\": \"Conflict\",\n \"410\": \"Gone\",\n \"411\": \"Length Required\",\n \"412\": \"Precondition Failed\",\n \"413\": \"Payload Too Large\",\n \"414\": \"URI Too Long\",\n \"415\": \"Unsupported Media Type\",\n \"416\": \"Range Not Satisfiable\",\n \"417\": \"Expectation Failed\",\n \"418\": \"I'm a teapot\",\n \"421\": \"Misdirected Request\",\n \"422\": \"Unprocessable Entity\",\n \"423\": \"Locked\",\n \"424\": \"Failed Dependency\",\n \"425\": \"Unordered Collection\",\n \"426\": \"Upgrade Required\",\n \"428\": \"Precondition Required\",\n \"429\": \"Too Many Requests\",\n \"431\": \"Request Header Fields Too Large\",\n \"451\": \"Unavailable For Legal Reasons\",\n \"500\": \"Internal Server Error\",\n \"501\": \"Not Implemented\",\n \"502\": \"Bad Gateway\",\n \"503\": \"Service Unavailable\",\n \"504\": \"Gateway Timeout\",\n \"505\": \"HTTP Version Not Supported\",\n \"506\": \"Variant Also Negotiates\",\n \"507\": \"Insufficient Storage\",\n \"508\": \"Loop Detected\",\n \"509\": \"Bandwidth Limit Exceeded\",\n \"510\": \"Not Extended\",\n \"511\": \"Network Authentication Required\"\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYnVpbHRpbi1zdGF0dXMtY29kZXMvYnJvd3Nlci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2J1aWx0aW4tc3RhdHVzLWNvZGVzL2Jyb3dzZXIuanM/OGMwNSJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgXCIxMDBcIjogXCJDb250aW51ZVwiLFxuICBcIjEwMVwiOiBcIlN3aXRjaGluZyBQcm90b2NvbHNcIixcbiAgXCIxMDJcIjogXCJQcm9jZXNzaW5nXCIsXG4gIFwiMjAwXCI6IFwiT0tcIixcbiAgXCIyMDFcIjogXCJDcmVhdGVkXCIsXG4gIFwiMjAyXCI6IFwiQWNjZXB0ZWRcIixcbiAgXCIyMDNcIjogXCJOb24tQXV0aG9yaXRhdGl2ZSBJbmZvcm1hdGlvblwiLFxuICBcIjIwNFwiOiBcIk5vIENvbnRlbnRcIixcbiAgXCIyMDVcIjogXCJSZXNldCBDb250ZW50XCIsXG4gIFwiMjA2XCI6IFwiUGFydGlhbCBDb250ZW50XCIsXG4gIFwiMjA3XCI6IFwiTXVsdGktU3RhdHVzXCIsXG4gIFwiMjA4XCI6IFwiQWxyZWFkeSBSZXBvcnRlZFwiLFxuICBcIjIyNlwiOiBcIklNIFVzZWRcIixcbiAgXCIzMDBcIjogXCJNdWx0aXBsZSBDaG9pY2VzXCIsXG4gIFwiMzAxXCI6IFwiTW92ZWQgUGVybWFuZW50bHlcIixcbiAgXCIzMDJcIjogXCJGb3VuZFwiLFxuICBcIjMwM1wiOiBcIlNlZSBPdGhlclwiLFxuICBcIjMwNFwiOiBcIk5vdCBNb2RpZmllZFwiLFxuICBcIjMwNVwiOiBcIlVzZSBQcm94eVwiLFxuICBcIjMwN1wiOiBcIlRlbXBvcmFyeSBSZWRpcmVjdFwiLFxuICBcIjMwOFwiOiBcIlBlcm1hbmVudCBSZWRpcmVjdFwiLFxuICBcIjQwMFwiOiBcIkJhZCBSZXF1ZXN0XCIsXG4gIFwiNDAxXCI6IFwiVW5hdXRob3JpemVkXCIsXG4gIFwiNDAyXCI6IFwiUGF5bWVudCBSZXF1aXJlZFwiLFxuICBcIjQwM1wiOiBcIkZvcmJpZGRlblwiLFxuICBcIjQwNFwiOiBcIk5vdCBGb3VuZFwiLFxuICBcIjQwNVwiOiBcIk1ldGhvZCBOb3QgQWxsb3dlZFwiLFxuICBcIjQwNlwiOiBcIk5vdCBBY2NlcHRhYmxlXCIsXG4gIFwiNDA3XCI6IFwiUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWRcIixcbiAgXCI0MDhcIjogXCJSZXF1ZXN0IFRpbWVvdXRcIixcbiAgXCI0MDlcIjogXCJDb25mbGljdFwiLFxuICBcIjQxMFwiOiBcIkdvbmVcIixcbiAgXCI0MTFcIjogXCJMZW5ndGggUmVxdWlyZWRcIixcbiAgXCI0MTJcIjogXCJQcmVjb25kaXRpb24gRmFpbGVkXCIsXG4gIFwiNDEzXCI6IFwiUGF5bG9hZCBUb28gTGFyZ2VcIixcbiAgXCI0MTRcIjogXCJVUkkgVG9vIExvbmdcIixcbiAgXCI0MTVcIjogXCJVbnN1cHBvcnRlZCBNZWRpYSBUeXBlXCIsXG4gIFwiNDE2XCI6IFwiUmFuZ2UgTm90IFNhdGlzZmlhYmxlXCIsXG4gIFwiNDE3XCI6IFwiRXhwZWN0YXRpb24gRmFpbGVkXCIsXG4gIFwiNDE4XCI6IFwiSSdtIGEgdGVhcG90XCIsXG4gIFwiNDIxXCI6IFwiTWlzZGlyZWN0ZWQgUmVxdWVzdFwiLFxuICBcIjQyMlwiOiBcIlVucHJvY2Vzc2FibGUgRW50aXR5XCIsXG4gIFwiNDIzXCI6IFwiTG9ja2VkXCIsXG4gIFwiNDI0XCI6IFwiRmFpbGVkIERlcGVuZGVuY3lcIixcbiAgXCI0MjVcIjogXCJVbm9yZGVyZWQgQ29sbGVjdGlvblwiLFxuICBcIjQyNlwiOiBcIlVwZ3JhZGUgUmVxdWlyZWRcIixcbiAgXCI0MjhcIjogXCJQcmVjb25kaXRpb24gUmVxdWlyZWRcIixcbiAgXCI0MjlcIjogXCJUb28gTWFueSBSZXF1ZXN0c1wiLFxuICBcIjQzMVwiOiBcIlJlcXVlc3QgSGVhZGVyIEZpZWxkcyBUb28gTGFyZ2VcIixcbiAgXCI0NTFcIjogXCJVbmF2YWlsYWJsZSBGb3IgTGVnYWwgUmVhc29uc1wiLFxuICBcIjUwMFwiOiBcIkludGVybmFsIFNlcnZlciBFcnJvclwiLFxuICBcIjUwMVwiOiBcIk5vdCBJbXBsZW1lbnRlZFwiLFxuICBcIjUwMlwiOiBcIkJhZCBHYXRld2F5XCIsXG4gIFwiNTAzXCI6IFwiU2VydmljZSBVbmF2YWlsYWJsZVwiLFxuICBcIjUwNFwiOiBcIkdhdGV3YXkgVGltZW91dFwiLFxuICBcIjUwNVwiOiBcIkhUVFAgVmVyc2lvbiBOb3QgU3VwcG9ydGVkXCIsXG4gIFwiNTA2XCI6IFwiVmFyaWFudCBBbHNvIE5lZ290aWF0ZXNcIixcbiAgXCI1MDdcIjogXCJJbnN1ZmZpY2llbnQgU3RvcmFnZVwiLFxuICBcIjUwOFwiOiBcIkxvb3AgRGV0ZWN0ZWRcIixcbiAgXCI1MDlcIjogXCJCYW5kd2lkdGggTGltaXQgRXhjZWVkZWRcIixcbiAgXCI1MTBcIjogXCJOb3QgRXh0ZW5kZWRcIixcbiAgXCI1MTFcIjogXCJOZXR3b3JrIEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkXCJcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/builtin-status-codes/browser.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/es/promise/index.js":
+/*!**************************************************!*\
+ !*** ./node_modules/core-js/es/promise/index.js ***!
+ \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("__webpack_require__(/*! ../../modules/es.object.to-string */ \"./node_modules/core-js/modules/es.object.to-string.js\");\n__webpack_require__(/*! ../../modules/es.string.iterator */ \"./node_modules/core-js/modules/es.string.iterator.js\");\n__webpack_require__(/*! ../../modules/web.dom-collections.iterator */ \"./node_modules/core-js/modules/web.dom-collections.iterator.js\");\n__webpack_require__(/*! ../../modules/es.promise */ \"./node_modules/core-js/modules/es.promise.js\");\n__webpack_require__(/*! ../../modules/es.promise.finally */ \"./node_modules/core-js/modules/es.promise.finally.js\");\nvar path = __webpack_require__(/*! ../../internals/path */ \"./node_modules/core-js/internals/path.js\");\n\nmodule.exports = path.Promise;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9wcm9taXNlL2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9wcm9taXNlL2luZGV4LmpzPzM5ODAiXSwic291cmNlc0NvbnRlbnQiOlsicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnByb21pc2UnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5Jyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5Qcm9taXNlO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/es/promise/index.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/es/string/index.js":
+/*!*************************************************!*\
+ !*** ./node_modules/core-js/es/string/index.js ***!
+ \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("__webpack_require__(/*! ../../modules/es.string.from-code-point */ \"./node_modules/core-js/modules/es.string.from-code-point.js\");\n__webpack_require__(/*! ../../modules/es.string.raw */ \"./node_modules/core-js/modules/es.string.raw.js\");\n__webpack_require__(/*! ../../modules/es.string.code-point-at */ \"./node_modules/core-js/modules/es.string.code-point-at.js\");\n__webpack_require__(/*! ../../modules/es.string.ends-with */ \"./node_modules/core-js/modules/es.string.ends-with.js\");\n__webpack_require__(/*! ../../modules/es.string.includes */ \"./node_modules/core-js/modules/es.string.includes.js\");\n__webpack_require__(/*! ../../modules/es.string.match */ \"./node_modules/core-js/modules/es.string.match.js\");\n__webpack_require__(/*! ../../modules/es.string.match-all */ \"./node_modules/core-js/modules/es.string.match-all.js\");\n__webpack_require__(/*! ../../modules/es.string.pad-end */ \"./node_modules/core-js/modules/es.string.pad-end.js\");\n__webpack_require__(/*! ../../modules/es.string.pad-start */ \"./node_modules/core-js/modules/es.string.pad-start.js\");\n__webpack_require__(/*! ../../modules/es.string.repeat */ \"./node_modules/core-js/modules/es.string.repeat.js\");\n__webpack_require__(/*! ../../modules/es.string.replace */ \"./node_modules/core-js/modules/es.string.replace.js\");\n__webpack_require__(/*! ../../modules/es.string.search */ \"./node_modules/core-js/modules/es.string.search.js\");\n__webpack_require__(/*! ../../modules/es.string.split */ \"./node_modules/core-js/modules/es.string.split.js\");\n__webpack_require__(/*! ../../modules/es.string.starts-with */ \"./node_modules/core-js/modules/es.string.starts-with.js\");\n__webpack_require__(/*! ../../modules/es.string.trim */ \"./node_modules/core-js/modules/es.string.trim.js\");\n__webpack_require__(/*! ../../modules/es.string.trim-start */ \"./node_modules/core-js/modules/es.string.trim-start.js\");\n__webpack_require__(/*! ../../modules/es.string.trim-end */ \"./node_modules/core-js/modules/es.string.trim-end.js\");\n__webpack_require__(/*! ../../modules/es.string.iterator */ \"./node_modules/core-js/modules/es.string.iterator.js\");\n__webpack_require__(/*! ../../modules/es.string.anchor */ \"./node_modules/core-js/modules/es.string.anchor.js\");\n__webpack_require__(/*! ../../modules/es.string.big */ \"./node_modules/core-js/modules/es.string.big.js\");\n__webpack_require__(/*! ../../modules/es.string.blink */ \"./node_modules/core-js/modules/es.string.blink.js\");\n__webpack_require__(/*! ../../modules/es.string.bold */ \"./node_modules/core-js/modules/es.string.bold.js\");\n__webpack_require__(/*! ../../modules/es.string.fixed */ \"./node_modules/core-js/modules/es.string.fixed.js\");\n__webpack_require__(/*! ../../modules/es.string.fontcolor */ \"./node_modules/core-js/modules/es.string.fontcolor.js\");\n__webpack_require__(/*! ../../modules/es.string.fontsize */ \"./node_modules/core-js/modules/es.string.fontsize.js\");\n__webpack_require__(/*! ../../modules/es.string.italics */ \"./node_modules/core-js/modules/es.string.italics.js\");\n__webpack_require__(/*! ../../modules/es.string.link */ \"./node_modules/core-js/modules/es.string.link.js\");\n__webpack_require__(/*! ../../modules/es.string.small */ \"./node_modules/core-js/modules/es.string.small.js\");\n__webpack_require__(/*! ../../modules/es.string.strike */ \"./node_modules/core-js/modules/es.string.strike.js\");\n__webpack_require__(/*! ../../modules/es.string.sub */ \"./node_modules/core-js/modules/es.string.sub.js\");\n__webpack_require__(/*! ../../modules/es.string.sup */ \"./node_modules/core-js/modules/es.string.sup.js\");\nvar path = __webpack_require__(/*! ../../internals/path */ \"./node_modules/core-js/internals/path.js\");\n\nmodule.exports = path.String;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9zdHJpbmcvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL3N0cmluZy9pbmRleC5qcz85ODI1Il0sInNvdXJjZXNDb250ZW50IjpbInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLmZyb20tY29kZS1wb2ludCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcucmF3Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5jb2RlLXBvaW50LWF0Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5lbmRzLXdpdGgnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLmluY2x1ZGVzJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5tYXRjaCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcubWF0Y2gtYWxsJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5wYWQtZW5kJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5wYWQtc3RhcnQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLnJlcGVhdCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcucmVwbGFjZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuc2VhcmNoJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5zcGxpdCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuc3RhcnRzLXdpdGgnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0nKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0tc3RhcnQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0tZW5kJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuYW5jaG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5iaWcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLmJsaW5rJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5ib2xkJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5maXhlZCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuZm9udGNvbG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5mb250c2l6ZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRhbGljcycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcubGluaycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuc21hbGwnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLnN0cmlrZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuc3ViJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5zdXAnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLlN0cmluZztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/es/string/index.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/a-function.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/internals/a-function.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("module.exports = function (it) {\n if (typeof it != 'function') {\n throw TypeError(String(it) + ' is not a function');\n } return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanM/MWMwYiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoU3RyaW5nKGl0KSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/a-function.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/add-to-unscopables.js":
+/*!**************************************************************!*\
+ !*** ./node_modules/core-js/internals/add-to-unscopables.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\nvar create = __webpack_require__(/*! ../internals/object-create */ \"./node_modules/core-js/internals/object-create.js\");\nvar hide = __webpack_require__(/*! ../internals/hide */ \"./node_modules/core-js/internals/hide.js\");\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n hide(ArrayPrototype, UNSCOPABLES, create(null));\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzPzQ0ZDIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRlJyk7XG5cbnZhciBVTlNDT1BBQkxFUyA9IHdlbGxLbm93blN5bWJvbCgndW5zY29wYWJsZXMnKTtcbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxuLy8gQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuaWYgKEFycmF5UHJvdG90eXBlW1VOU0NPUEFCTEVTXSA9PSB1bmRlZmluZWQpIHtcbiAgaGlkZShBcnJheVByb3RvdHlwZSwgVU5TQ09QQUJMRVMsIGNyZWF0ZShudWxsKSk7XG59XG5cbi8vIGFkZCBhIGtleSB0byBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc11cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICBBcnJheVByb3RvdHlwZVtVTlNDT1BBQkxFU11ba2V5XSA9IHRydWU7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/add-to-unscopables.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/advance-string-index.js":
+/*!****************************************************************!*\
+ !*** ./node_modules/core-js/internals/advance-string-index.js ***!
+ \****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar codePointAt = __webpack_require__(/*! ../internals/string-at */ \"./node_modules/core-js/internals/string-at.js\");\n\n// `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? codePointAt(S, index, true).length : 1);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWR2YW5jZS1zdHJpbmctaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZHZhbmNlLXN0cmluZy1pbmRleC5qcz84YWE1Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBjb2RlUG9pbnRBdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctYXQnKTtcblxuLy8gYEFkdmFuY2VTdHJpbmdJbmRleGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hZHZhbmNlc3RyaW5naW5kZXhcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFMsIGluZGV4LCB1bmljb2RlKSB7XG4gIHJldHVybiBpbmRleCArICh1bmljb2RlID8gY29kZVBvaW50QXQoUywgaW5kZXgsIHRydWUpLmxlbmd0aCA6IDEpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/advance-string-index.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/an-instance.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/internals/an-instance.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("module.exports = function (it, Constructor, name) {\n if (!(it instanceof Constructor)) {\n throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n } return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1pbnN0YW5jZS5qcz8xOWFhIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBDb25zdHJ1Y3RvciwgbmFtZSkge1xuICBpZiAoIShpdCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW5jb3JyZWN0ICcgKyAobmFtZSA/IG5hbWUgKyAnICcgOiAnJykgKyAnaW52b2NhdGlvbicpO1xuICB9IHJldHVybiBpdDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/an-instance.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/an-object.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/core-js/internals/an-object.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\n\nmodule.exports = function (it) {\n if (!isObject(it)) {\n throw TypeError(String(it) + ' is not an object');\n } return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzPzgyNWEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkge1xuICAgIHRocm93IFR5cGVFcnJvcihTdHJpbmcoaXQpICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/an-object.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/array-includes.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/internals/array-includes.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ \"./node_modules/core-js/internals/to-indexed-object.js\");\nvar toLength = __webpack_require__(/*! ../internals/to-length */ \"./node_modules/core-js/internals/to-length.js\");\nvar toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ \"./node_modules/core-js/internals/to-absolute-index.js\");\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\n// false -> Array#indexOf\n// https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n// true -> Array#includes\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pbmNsdWRlcy5qcz80ZDY0Il0sInNvdXJjZXNDb250ZW50IjpbInZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXgnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IGluZGV4T2YsIGluY2x1ZGVzIH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbi8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmRleG9mXG4vLyB0cnVlICAtPiBBcnJheSNpbmNsdWRlc1xuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJU19JTkNMVURFUykge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBlbCwgZnJvbUluZGV4KSB7XG4gICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QoJHRoaXMpO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGZyb21JbmRleCwgbGVuZ3RoKTtcbiAgICB2YXIgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICBpZiAoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpIHdoaWxlIChsZW5ndGggPiBpbmRleCkge1xuICAgICAgdmFsdWUgPSBPW2luZGV4KytdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgaWYgKHZhbHVlICE9IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSNpbmRleE9mIGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSBpZiAoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTykge1xuICAgICAgaWYgKE9baW5kZXhdID09PSBlbCkgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/array-includes.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/bind-context.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/internals/bind-context.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var aFunction = __webpack_require__(/*! ../internals/a-function */ \"./node_modules/core-js/internals/a-function.js\");\n\n// optional / simple context binding\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 0: return function () {\n return fn.call(that);\n };\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYmluZC1jb250ZXh0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYmluZC1jb250ZXh0LmpzP2Y4YzIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG5cbi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIHRoYXQsIGxlbmd0aCkge1xuICBhRnVuY3Rpb24oZm4pO1xuICBpZiAodGhhdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZm47XG4gIHN3aXRjaCAobGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCk7XG4gICAgfTtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbiAoYSkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/bind-context.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/call-with-safe-iteration-closing.js":
+/*!****************************************************************************!*\
+ !*** ./node_modules/core-js/internals/call-with-safe-iteration-closing.js ***!
+ \****************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\n\n// call something on iterator step with safe closing on error\nmodule.exports = function (iterator, fn, value, ENTRIES) {\n try {\n return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (error) {\n var returnMethod = iterator['return'];\n if (returnMethod !== undefined) anObject(returnMethod.call(iterator));\n throw error;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZy5qcz85YmRkIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxuLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGZuLCB2YWx1ZSwgRU5UUklFUykge1xuICB0cnkge1xuICAgIHJldHVybiBFTlRSSUVTID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7XG4gIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdmFyIHJldHVybk1ldGhvZCA9IGl0ZXJhdG9yWydyZXR1cm4nXTtcbiAgICBpZiAocmV0dXJuTWV0aG9kICE9PSB1bmRlZmluZWQpIGFuT2JqZWN0KHJldHVybk1ldGhvZC5jYWxsKGl0ZXJhdG9yKSk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/call-with-safe-iteration-closing.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/check-correctness-of-iteration.js":
+/*!**************************************************************************!*\
+ !*** ./node_modules/core-js/internals/check-correctness-of-iteration.js ***!
+ \**************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line no-throw-literal\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uLmpzPzFjN2UiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciBjYWxsZWQgPSAwO1xuICB2YXIgaXRlcmF0b3JXaXRoUmV0dXJuID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7IGRvbmU6ICEhY2FsbGVkKysgfTtcbiAgICB9LFxuICAgICdyZXR1cm4nOiBmdW5jdGlvbiAoKSB7XG4gICAgICBTQUZFX0NMT1NJTkcgPSB0cnVlO1xuICAgIH1cbiAgfTtcbiAgaXRlcmF0b3JXaXRoUmV0dXJuW0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcbiAgQXJyYXkuZnJvbShpdGVyYXRvcldpdGhSZXR1cm4sIGZ1bmN0aW9uICgpIHsgdGhyb3cgMjsgfSk7XG59IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIFNLSVBfQ0xPU0lORykge1xuICBpZiAoIVNLSVBfQ0xPU0lORyAmJiAhU0FGRV9DTE9TSU5HKSByZXR1cm4gZmFsc2U7XG4gIHZhciBJVEVSQVRJT05fU1VQUE9SVCA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBvYmplY3QgPSB7fTtcbiAgICBvYmplY3RbSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IElURVJBVElPTl9TVVBQT1JUID0gdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG4gICAgZXhlYyhvYmplY3QpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBJVEVSQVRJT05fU1VQUE9SVDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/check-correctness-of-iteration.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/classof-raw.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/internals/classof-raw.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLXJhdy5qcz9jNmI2Il0sInNvdXJjZXNDb250ZW50IjpbInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/classof-raw.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/classof.js":
+/*!***************************************************!*\
+ !*** ./node_modules/core-js/internals/classof.js ***!
+ \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var classofRaw = __webpack_require__(/*! ../internals/classof-raw */ \"./node_modules/core-js/internals/classof-raw.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YuanM/ZjVkZiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY2xhc3NvZlJhdyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbi8vIEVTMyB3cm9uZyBoZXJlXG52YXIgQ09SUkVDVF9BUkdVTUVOVFMgPSBjbGFzc29mUmF3KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG59O1xuXG4vLyBnZXR0aW5nIHRhZyBmcm9tIEVTNisgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgTywgdGFnLCByZXN1bHQ7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mICh0YWcgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRPX1NUUklOR19UQUcpKSA9PSAnc3RyaW5nJyA/IHRhZ1xuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQ09SUkVDVF9BUkdVTUVOVFMgPyBjbGFzc29mUmF3KE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKHJlc3VsdCA9IGNsYXNzb2ZSYXcoTykpID09ICdPYmplY3QnICYmIHR5cGVvZiBPLmNhbGxlZSA9PSAnZnVuY3Rpb24nID8gJ0FyZ3VtZW50cycgOiByZXN1bHQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/classof.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/copy-constructor-properties.js":
+/*!***********************************************************************!*\
+ !*** ./node_modules/core-js/internals/copy-constructor-properties.js ***!
+ \***********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var has = __webpack_require__(/*! ../internals/has */ \"./node_modules/core-js/internals/has.js\");\nvar ownKeys = __webpack_require__(/*! ../internals/own-keys */ \"./node_modules/core-js/internals/own-keys.js\");\nvar getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ \"./node_modules/core-js/internals/object-get-own-property-descriptor.js\");\nvar definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ \"./node_modules/core-js/internals/object-define-property.js\");\n\nmodule.exports = function (target, source) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzLmpzP2U4OTMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBvd25LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL293bi1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG4gIHZhciBrZXlzID0gb3duS2V5cyhzb3VyY2UpO1xuICB2YXIgZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mO1xuICB2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmY7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGlmICghaGFzKHRhcmdldCwga2V5KSkgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICB9XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/copy-constructor-properties.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/correct-is-regexp-logic.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/core-js/internals/correct-is-regexp-logic.js ***!
+ \*******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar MATCH = wellKnownSymbol('match');\n\nmodule.exports = function (METHOD_NAME) {\n var regexp = /./;\n try {\n '/./'[METHOD_NAME](regexp);\n } catch (e) {\n try {\n regexp[MATCH] = false;\n return '/./'[METHOD_NAME](regexp);\n } catch (f) { /* empty */ }\n } return false;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3JyZWN0LWlzLXJlZ2V4cC1sb2dpYy5qcz9hYjEzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIE1BVENIID0gd2VsbEtub3duU3ltYm9sKCdtYXRjaCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSkge1xuICB2YXIgcmVnZXhwID0gLy4vO1xuICB0cnkge1xuICAgICcvLi8nW01FVEhPRF9OQU1FXShyZWdleHApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlZ2V4cFtNQVRDSF0gPSBmYWxzZTtcbiAgICAgIHJldHVybiAnLy4vJ1tNRVRIT0RfTkFNRV0ocmVnZXhwKTtcbiAgICB9IGNhdGNoIChmKSB7IC8qIGVtcHR5ICovIH1cbiAgfSByZXR1cm4gZmFsc2U7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/correct-is-regexp-logic.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/correct-prototype-getter.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/core-js/internals/correct-prototype-getter.js ***!
+ \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyLmpzP2UxNzciXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRigpIHsgLyogZW1wdHkgKi8gfVxuICBGLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IG51bGw7XG4gIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IEYoKSkgIT09IEYucHJvdG90eXBlO1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/correct-prototype-getter.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/create-html.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/internals/create-html.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\n\nvar quot = /\"/g;\n\n// B.2.3.2.1 CreateHTML(string, tag, attribute, value)\n// https://tc39.github.io/ecma262/#sec-createhtml\nmodule.exports = function (string, tag, attribute, value) {\n var S = String(requireObjectCoercible(string));\n var p1 = '<' + tag;\n if (attribute !== '') p1 += ' ' + attribute + '=\"' + String(value).replace(quot, '&quot;') + '\"';\n return p1 + '>' + S + '</' + tag + '>';\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWh0bWwuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaHRtbC5qcz84NTdhIl0sInNvdXJjZXNDb250ZW50IjpbInZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG52YXIgcXVvdCA9IC9cIi9nO1xuXG4vLyBCLjIuMy4yLjEgQ3JlYXRlSFRNTChzdHJpbmcsIHRhZywgYXR0cmlidXRlLCB2YWx1ZSlcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWNyZWF0ZWh0bWxcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHN0cmluZywgdGFnLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gIHZhciBTID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUoc3RyaW5nKSk7XG4gIHZhciBwMSA9ICc8JyArIHRhZztcbiAgaWYgKGF0dHJpYnV0ZSAhPT0gJycpIHAxICs9ICcgJyArIGF0dHJpYnV0ZSArICc9XCInICsgU3RyaW5nKHZhbHVlKS5yZXBsYWNlKHF1b3QsICcmcXVvdDsnKSArICdcIic7XG4gIHJldHVybiBwMSArICc+JyArIFMgKyAnPC8nICsgdGFnICsgJz4nO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/create-html.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/create-iterator-constructor.js":
+/*!***********************************************************************!*\
+ !*** ./node_modules/core-js/internals/create-iterator-constructor.js ***!
+ \***********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar IteratorPrototype = __webpack_require__(/*! ../internals/iterators-core */ \"./node_modules/core-js/internals/iterators-core.js\").IteratorPrototype;\nvar create = __webpack_require__(/*! ../internals/object-create */ \"./node_modules/core-js/internals/object-create.js\");\nvar createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ \"./node_modules/core-js/internals/create-property-descriptor.js\");\nvar setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ \"./node_modules/core-js/internals/set-to-string-tag.js\");\nvar Iterators = __webpack_require__(/*! ../internals/iterators */ \"./node_modules/core-js/internals/iterators.js\");\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n Iterators[TO_STRING_TAG] = returnThis;\n return IteratorConstructor;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yLmpzPzllZDMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlJykuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KSB7XG4gIHZhciBUT19TVFJJTkdfVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICBJdGVyYXRvckNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwgeyBuZXh0OiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yQ29uc3RydWN0b3IsIFRPX1NUUklOR19UQUcsIGZhbHNlLCB0cnVlKTtcbiAgSXRlcmF0b3JzW1RPX1NUUklOR19UQUddID0gcmV0dXJuVGhpcztcbiAgcmV0dXJuIEl0ZXJhdG9yQ29uc3RydWN0b3I7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/create-iterator-constructor.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/create-property-descriptor.js":
+/*!**********************************************************************!*\
+ !*** ./node_modules/core-js/internals/create-property-descriptor.js ***!
+ \**********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qcz81YzZjIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/create-property-descriptor.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/define-iterator.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/internals/define-iterator.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createIteratorConstructor = __webpack_require__(/*! ../internals/create-iterator-constructor */ \"./node_modules/core-js/internals/create-iterator-constructor.js\");\nvar getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ \"./node_modules/core-js/internals/object-get-prototype-of.js\");\nvar setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ \"./node_modules/core-js/internals/object-set-prototype-of.js\");\nvar setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ \"./node_modules/core-js/internals/set-to-string-tag.js\");\nvar hide = __webpack_require__(/*! ../internals/hide */ \"./node_modules/core-js/internals/hide.js\");\nvar redefine = __webpack_require__(/*! ../internals/redefine */ \"./node_modules/core-js/internals/redefine.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\nvar IS_PURE = __webpack_require__(/*! ../internals/is-pure */ \"./node_modules/core-js/internals/is-pure.js\");\nvar Iterators = __webpack_require__(/*! ../internals/iterators */ \"./node_modules/core-js/internals/iterators.js\");\nvar IteratorsCore = __webpack_require__(/*! ../internals/iterators-core */ \"./node_modules/core-js/internals/iterators-core.js\");\n\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n } return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n if (setPrototypeOf) {\n setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') {\n hide(CurrentIteratorPrototype, ITERATOR, returnThis);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n }\n }\n\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return nativeIterator.call(this); };\n }\n\n // define iterator\n if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n hide(IterablePrototype, ITERATOR, defaultIterator);\n }\n Iterators[NAME] = defaultIterator;\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n redefine(IterablePrototype, KEY, methods[KEY]);\n }\n } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n }\n\n return methods;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yLmpzPzdkZDAiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3InKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGUnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcbnZhciBJdGVyYXRvcnNDb3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlJyk7XG5cbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IEl0ZXJhdG9yc0NvcmUuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IEl0ZXJhdG9yc0NvcmUuQlVHR1lfU0FGQVJJX0lURVJBVE9SUztcbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xudmFyIEVOVFJJRVMgPSAnZW50cmllcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmFibGUsIE5BTUUsIEl0ZXJhdG9yQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7XG4gIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IoSXRlcmF0b3JDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG5cbiAgdmFyIGdldEl0ZXJhdGlvbk1ldGhvZCA9IGZ1bmN0aW9uIChLSU5EKSB7XG4gICAgaWYgKEtJTkQgPT09IERFRkFVTFQgJiYgZGVmYXVsdEl0ZXJhdG9yKSByZXR1cm4gZGVmYXVsdEl0ZXJhdG9yO1xuICAgIGlmICghQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBLSU5EIGluIEl0ZXJhYmxlUHJvdG90eXBlKSByZXR1cm4gSXRlcmFibGVQcm90b3R5cGVbS0lORF07XG4gICAgc3dpdGNoIChLSU5EKSB7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgICAgY2FzZSBFTlRSSUVTOiByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMpOyB9O1xuICB9O1xuXG4gIHZhciBUT19TVFJJTkdfVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICB2YXIgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gZmFsc2U7XG4gIHZhciBJdGVyYWJsZVByb3RvdHlwZSA9IEl0ZXJhYmxlLnByb3RvdHlwZTtcbiAgdmFyIG5hdGl2ZUl0ZXJhdG9yID0gSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdXG4gICAgfHwgSXRlcmFibGVQcm90b3R5cGVbJ0BAaXRlcmF0b3InXVxuICAgIHx8IERFRkFVTFQgJiYgSXRlcmFibGVQcm90b3R5cGVbREVGQVVMVF07XG4gIHZhciBkZWZhdWx0SXRlcmF0b3IgPSAhQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBuYXRpdmVJdGVyYXRvciB8fCBnZXRJdGVyYXRpb25NZXRob2QoREVGQVVMVCk7XG4gIHZhciBhbnlOYXRpdmVJdGVyYXRvciA9IE5BTUUgPT0gJ0FycmF5JyA/IEl0ZXJhYmxlUHJvdG90eXBlLmVudHJpZXMgfHwgbmF0aXZlSXRlcmF0b3IgOiBuYXRpdmVJdGVyYXRvcjtcbiAgdmFyIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgbWV0aG9kcywgS0VZO1xuXG4gIC8vIGZpeCBuYXRpdmVcbiAgaWYgKGFueU5hdGl2ZUl0ZXJhdG9yKSB7XG4gICAgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoYW55TmF0aXZlSXRlcmF0b3IuY2FsbChuZXcgSXRlcmFibGUoKSkpO1xuICAgIGlmIChJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUubmV4dCkge1xuICAgICAgaWYgKCFJU19QVVJFICYmIGdldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSkgIT09IEl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgICAgICAgIHNldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSXRlcmF0b3JQcm90b3R5cGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBoaWRlKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBTZXQgQEB0b1N0cmluZ1RhZyB0byBuYXRpdmUgaXRlcmF0b3JzXG4gICAgICBzZXRUb1N0cmluZ1RhZyhDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIFRPX1NUUklOR19UQUcsIHRydWUsIHRydWUpO1xuICAgICAgaWYgKElTX1BVUkUpIEl0ZXJhdG9yc1tUT19TVFJJTkdfVEFHXSA9IHJldHVyblRoaXM7XG4gICAgfVxuICB9XG5cbiAgLy8gZml4IEFycmF5I3t2YWx1ZXMsIEBAaXRlcmF0b3J9Lm5hbWUgaW4gVjggLyBGRlxuICBpZiAoREVGQVVMVCA9PSBWQUxVRVMgJiYgbmF0aXZlSXRlcmF0b3IgJiYgbmF0aXZlSXRlcmF0b3IubmFtZSAhPT0gVkFMVUVTKSB7XG4gICAgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gdHJ1ZTtcbiAgICBkZWZhdWx0SXRlcmF0b3IgPSBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBuYXRpdmVJdGVyYXRvci5jYWxsKHRoaXMpOyB9O1xuICB9XG5cbiAgLy8gZGVmaW5lIGl0ZXJhdG9yXG4gIGlmICgoIUlTX1BVUkUgfHwgRk9SQ0VEKSAmJiBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl0gIT09IGRlZmF1bHRJdGVyYXRvcikge1xuICAgIGhpZGUoSXRlcmFibGVQcm90b3R5cGUsIElURVJBVE9SLCBkZWZhdWx0SXRlcmF0b3IpO1xuICB9XG4gIEl0ZXJhdG9yc1tOQU1FXSA9IGRlZmF1bHRJdGVyYXRvcjtcblxuICAvLyBleHBvcnQgYWRkaXRpb25hbCBtZXRob2RzXG4gIGlmIChERUZBVUxUKSB7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogZ2V0SXRlcmF0aW9uTWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiBJU19TRVQgPyBkZWZhdWx0SXRlcmF0b3IgOiBnZXRJdGVyYXRpb25NZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiBnZXRJdGVyYXRpb25NZXRob2QoRU5UUklFUylcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoS0VZIGluIG1ldGhvZHMpIHtcbiAgICAgIGlmIChCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB8fCAhKEtFWSBpbiBJdGVyYWJsZVByb3RvdHlwZSkpIHtcbiAgICAgICAgcmVkZWZpbmUoSXRlcmFibGVQcm90b3R5cGUsIEtFWSwgbWV0aG9kc1tLRVldKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgJCh7IHRhcmdldDogTkFNRSwgcHJvdG86IHRydWUsIGZvcmNlZDogQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfSwgbWV0aG9kcyk7XG4gIH1cblxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/define-iterator.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/descriptors.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/internals/descriptors.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !fails(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcz84M2FiIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG4vLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/descriptors.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/document-create-element.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/core-js/internals/document-create-element.js ***!
+ \*******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar exist = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return exist ? document.createElement(it) : {};\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qcz9jYzEyIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIGV4aXN0ID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gZXhpc3QgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/document-create-element.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/dom-iterables.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/internals/dom-iterables.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("// iterable DOM collections\n// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\nmodule.exports = {\n CSSRuleList: 0,\n CSSStyleDeclaration: 0,\n CSSValueList: 0,\n ClientRectList: 0,\n DOMRectList: 0,\n DOMStringList: 0,\n DOMTokenList: 1,\n DataTransferItemList: 0,\n FileList: 0,\n HTMLAllCollection: 0,\n HTMLCollection: 0,\n HTMLFormElement: 0,\n HTMLSelectElement: 0,\n MediaList: 0,\n MimeTypeArray: 0,\n NamedNodeMap: 0,\n NodeList: 1,\n PaintRequestList: 0,\n Plugin: 0,\n PluginArray: 0,\n SVGLengthList: 0,\n SVGNumberList: 0,\n SVGPathSegList: 0,\n SVGPointList: 0,\n SVGStringList: 0,\n SVGTransformList: 0,\n SourceBufferList: 0,\n StyleSheetList: 0,\n TextTrackCueList: 0,\n TextTrackList: 0,\n TouchList: 0\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9tLWl0ZXJhYmxlcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMuanM/ZmRiYyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpdGVyYWJsZSBET00gY29sbGVjdGlvbnNcbi8vIGZsYWcgLSBgaXRlcmFibGVgIGludGVyZmFjZSAtICdlbnRyaWVzJywgJ2tleXMnLCAndmFsdWVzJywgJ2ZvckVhY2gnIG1ldGhvZHNcbm1vZHVsZS5leHBvcnRzID0ge1xuICBDU1NSdWxlTGlzdDogMCxcbiAgQ1NTU3R5bGVEZWNsYXJhdGlvbjogMCxcbiAgQ1NTVmFsdWVMaXN0OiAwLFxuICBDbGllbnRSZWN0TGlzdDogMCxcbiAgRE9NUmVjdExpc3Q6IDAsXG4gIERPTVN0cmluZ0xpc3Q6IDAsXG4gIERPTVRva2VuTGlzdDogMSxcbiAgRGF0YVRyYW5zZmVySXRlbUxpc3Q6IDAsXG4gIEZpbGVMaXN0OiAwLFxuICBIVE1MQWxsQ29sbGVjdGlvbjogMCxcbiAgSFRNTENvbGxlY3Rpb246IDAsXG4gIEhUTUxGb3JtRWxlbWVudDogMCxcbiAgSFRNTFNlbGVjdEVsZW1lbnQ6IDAsXG4gIE1lZGlhTGlzdDogMCxcbiAgTWltZVR5cGVBcnJheTogMCxcbiAgTmFtZWROb2RlTWFwOiAwLFxuICBOb2RlTGlzdDogMSxcbiAgUGFpbnRSZXF1ZXN0TGlzdDogMCxcbiAgUGx1Z2luOiAwLFxuICBQbHVnaW5BcnJheTogMCxcbiAgU1ZHTGVuZ3RoTGlzdDogMCxcbiAgU1ZHTnVtYmVyTGlzdDogMCxcbiAgU1ZHUGF0aFNlZ0xpc3Q6IDAsXG4gIFNWR1BvaW50TGlzdDogMCxcbiAgU1ZHU3RyaW5nTGlzdDogMCxcbiAgU1ZHVHJhbnNmb3JtTGlzdDogMCxcbiAgU291cmNlQnVmZmVyTGlzdDogMCxcbiAgU3R5bGVTaGVldExpc3Q6IDAsXG4gIFRleHRUcmFja0N1ZUxpc3Q6IDAsXG4gIFRleHRUcmFja0xpc3Q6IDAsXG4gIFRvdWNoTGlzdDogMFxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/dom-iterables.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/enum-bug-keys.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/internals/enum-bug-keys.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VudW0tYnVnLWtleXMuanM/NzgzOSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJRTgtIGRvbid0IGVudW0gYnVnIGtleXNcbm1vZHVsZS5leHBvcnRzID0gW1xuICAnY29uc3RydWN0b3InLFxuICAnaGFzT3duUHJvcGVydHknLFxuICAnaXNQcm90b3R5cGVPZicsXG4gICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsXG4gICd0b0xvY2FsZVN0cmluZycsXG4gICd0b1N0cmluZycsXG4gICd2YWx1ZU9mJ1xuXTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/enum-bug-keys.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/export.js":
+/*!**************************************************!*\
+ !*** ./node_modules/core-js/internals/export.js ***!
+ \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ \"./node_modules/core-js/internals/object-get-own-property-descriptor.js\").f;\nvar hide = __webpack_require__(/*! ../internals/hide */ \"./node_modules/core-js/internals/hide.js\");\nvar redefine = __webpack_require__(/*! ../internals/redefine */ \"./node_modules/core-js/internals/redefine.js\");\nvar setGlobal = __webpack_require__(/*! ../internals/set-global */ \"./node_modules/core-js/internals/set-global.js\");\nvar copyConstructorProperties = __webpack_require__(/*! ../internals/copy-constructor-properties */ \"./node_modules/core-js/internals/copy-constructor-properties.js\");\nvar isForced = __webpack_require__(/*! ../internals/is-forced */ \"./node_modules/core-js/internals/is-forced.js\");\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.noTargetGet - prevent calling a getter on target\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global;\n } else if (STATIC) {\n target = global[TARGET] || setGlobal(TARGET, {});\n } else {\n target = (global[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.noTargetGet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty === typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n hide(sourceProperty, 'sham', true);\n }\n // extend global\n redefine(target, key, sourceProperty, options);\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzPzIzZTciXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpLmY7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xudmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG5cbi8qXG4gIG9wdGlvbnMudGFyZ2V0ICAgICAgLSBuYW1lIG9mIHRoZSB0YXJnZXQgb2JqZWN0XG4gIG9wdGlvbnMuZ2xvYmFsICAgICAgLSB0YXJnZXQgaXMgdGhlIGdsb2JhbCBvYmplY3RcbiAgb3B0aW9ucy5zdGF0ICAgICAgICAtIGV4cG9ydCBhcyBzdGF0aWMgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5wcm90byAgICAgICAtIGV4cG9ydCBhcyBwcm90b3R5cGUgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5yZWFsICAgICAgICAtIHJlYWwgcHJvdG90eXBlIG1ldGhvZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMuZm9yY2VkICAgICAgLSBleHBvcnQgZXZlbiBpZiB0aGUgbmF0aXZlIGZlYXR1cmUgaXMgYXZhaWxhYmxlXG4gIG9wdGlvbnMuYmluZCAgICAgICAgLSBiaW5kIG1ldGhvZHMgdG8gdGhlIHRhcmdldCwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLndyYXAgICAgICAgIC0gd3JhcCBjb25zdHJ1Y3RvcnMgdG8gcHJldmVudGluZyBnbG9iYWwgcG9sbHV0aW9uLCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMudW5zYWZlICAgICAgLSB1c2UgdGhlIHNpbXBsZSBhc3NpZ25tZW50IG9mIHByb3BlcnR5IGluc3RlYWQgb2YgZGVsZXRlICsgZGVmaW5lUHJvcGVydHlcbiAgb3B0aW9ucy5zaGFtICAgICAgICAtIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgb3B0aW9ucy5lbnVtZXJhYmxlICAtIGV4cG9ydCBhcyBlbnVtZXJhYmxlIHByb3BlcnR5XG4gIG9wdGlvbnMubm9UYXJnZXRHZXQgLSBwcmV2ZW50IGNhbGxpbmcgYSBnZXR0ZXIgb24gdGFyZ2V0XG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0aW9ucywgc291cmNlKSB7XG4gIHZhciBUQVJHRVQgPSBvcHRpb25zLnRhcmdldDtcbiAgdmFyIEdMT0JBTCA9IG9wdGlvbnMuZ2xvYmFsO1xuICB2YXIgU1RBVElDID0gb3B0aW9ucy5zdGF0O1xuICB2YXIgRk9SQ0VELCB0YXJnZXQsIGtleSwgdGFyZ2V0UHJvcGVydHksIHNvdXJjZVByb3BlcnR5LCBkZXNjcmlwdG9yO1xuICBpZiAoR0xPQkFMKSB7XG4gICAgdGFyZ2V0ID0gZ2xvYmFsO1xuICB9IGVsc2UgaWYgKFNUQVRJQykge1xuICAgIHRhcmdldCA9IGdsb2JhbFtUQVJHRVRdIHx8IHNldEdsb2JhbChUQVJHRVQsIHt9KTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQgPSAoZ2xvYmFsW1RBUkdFVF0gfHwge30pLnByb3RvdHlwZTtcbiAgfVxuICBpZiAodGFyZ2V0KSBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICBzb3VyY2VQcm9wZXJ0eSA9IHNvdXJjZVtrZXldO1xuICAgIGlmIChvcHRpb25zLm5vVGFyZ2V0R2V0KSB7XG4gICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcbiAgICAgIHRhcmdldFByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIH0gZWxzZSB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldFtrZXldO1xuICAgIEZPUkNFRCA9IGlzRm9yY2VkKEdMT0JBTCA/IGtleSA6IFRBUkdFVCArIChTVEFUSUMgPyAnLicgOiAnIycpICsga2V5LCBvcHRpb25zLmZvcmNlZCk7XG4gICAgLy8gY29udGFpbmVkIGluIHRhcmdldFxuICAgIGlmICghRk9SQ0VEICYmIHRhcmdldFByb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2Ygc291cmNlUHJvcGVydHkgPT09IHR5cGVvZiB0YXJnZXRQcm9wZXJ0eSkgY29udGludWU7XG4gICAgICBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzKHNvdXJjZVByb3BlcnR5LCB0YXJnZXRQcm9wZXJ0eSk7XG4gICAgfVxuICAgIC8vIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgICBpZiAob3B0aW9ucy5zaGFtIHx8ICh0YXJnZXRQcm9wZXJ0eSAmJiB0YXJnZXRQcm9wZXJ0eS5zaGFtKSkge1xuICAgICAgaGlkZShzb3VyY2VQcm9wZXJ0eSwgJ3NoYW0nLCB0cnVlKTtcbiAgICB9XG4gICAgLy8gZXh0ZW5kIGdsb2JhbFxuICAgIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzb3VyY2VQcm9wZXJ0eSwgb3B0aW9ucyk7XG4gIH1cbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/export.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/fails.js":
+/*!*************************************************!*\
+ !*** ./node_modules/core-js/internals/fails.js ***!
+ \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("module.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcz9kMDM5Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/fails.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js":
+/*!******************************************************************************!*\
+ !*** ./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js ***!
+ \******************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar hide = __webpack_require__(/*! ../internals/hide */ \"./node_modules/core-js/internals/hide.js\");\nvar redefine = __webpack_require__(/*! ../internals/redefine */ \"./node_modules/core-js/internals/redefine.js\");\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\nvar regexpExec = __webpack_require__(/*! ../internals/regexp-exec */ \"./node_modules/core-js/internals/regexp-exec.js\");\n\nvar SPECIES = wellKnownSymbol('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$<a>') !== '7';\n});\n\n// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n// Weex JS has frozen built-in prototypes, so use try / catch wrapper\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n});\n\nmodule.exports = function (KEY, length, exec, sham) {\n var SYMBOL = wellKnownSymbol(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n re.exec = function () { execCalled = true; return null; };\n\n if (KEY === 'split') {\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n }\n\n re[SYMBOL]('');\n return !execCalled;\n });\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n });\n var stringMethod = methods[0];\n var regexMethod = methods[1];\n\n redefine(String.prototype, KEY, stringMethod);\n redefine(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return regexMethod.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return regexMethod.call(string, this); }\n );\n if (sham) hide(RegExp.prototype[SYMBOL], 'sham', true);\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMuanM/ZDc4NCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIHJlZ2V4cEV4ZWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxudmFyIFJFUExBQ0VfU1VQUE9SVFNfTkFNRURfR1JPVVBTID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gI3JlcGxhY2UgbmVlZHMgYnVpbHQtaW4gc3VwcG9ydCBmb3IgbmFtZWQgZ3JvdXBzLlxuICAvLyAjbWF0Y2ggd29ya3MgZmluZSBiZWNhdXNlIGl0IGp1c3QgcmV0dXJuIHRoZSBleGVjIHJlc3VsdHMsIGV2ZW4gaWYgaXQgaGFzXG4gIC8vIGEgXCJncm9wc1wiIHByb3BlcnR5LlxuICB2YXIgcmUgPSAvLi87XG4gIHJlLmV4ZWMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHJlc3VsdC5ncm91cHMgPSB7IGE6ICc3JyB9O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHJldHVybiAnJy5yZXBsYWNlKHJlLCAnJDxhPicpICE9PSAnNyc7XG59KTtcblxuLy8gQ2hyb21lIDUxIGhhcyBhIGJ1Z2d5IFwic3BsaXRcIiBpbXBsZW1lbnRhdGlvbiB3aGVuIFJlZ0V4cCNleGVjICE9PSBuYXRpdmVFeGVjXG4vLyBXZWV4IEpTIGhhcyBmcm96ZW4gYnVpbHQtaW4gcHJvdG90eXBlcywgc28gdXNlIHRyeSAvIGNhdGNoIHdyYXBwZXJcbnZhciBTUExJVF9XT1JLU19XSVRIX09WRVJXUklUVEVOX0VYRUMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgcmUgPSAvKD86KS87XG4gIHZhciBvcmlnaW5hbEV4ZWMgPSByZS5leGVjO1xuICByZS5leGVjID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gb3JpZ2luYWxFeGVjLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gIHZhciByZXN1bHQgPSAnYWInLnNwbGl0KHJlKTtcbiAgcmV0dXJuIHJlc3VsdC5sZW5ndGggIT09IDIgfHwgcmVzdWx0WzBdICE9PSAnYScgfHwgcmVzdWx0WzFdICE9PSAnYic7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZLCBsZW5ndGgsIGV4ZWMsIHNoYW0pIHtcbiAgdmFyIFNZTUJPTCA9IHdlbGxLbm93blN5bWJvbChLRVkpO1xuXG4gIHZhciBERUxFR0FURVNfVE9fU1lNQk9MID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBTdHJpbmcgbWV0aG9kcyBjYWxsIHN5bWJvbC1uYW1lZCBSZWdFcCBtZXRob2RzXG4gICAgdmFyIE8gPSB7fTtcbiAgICBPW1NZTUJPTF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9O1xuICAgIHJldHVybiAnJ1tLRVldKE8pICE9IDc7XG4gIH0pO1xuXG4gIHZhciBERUxFR0FURVNfVE9fRVhFQyA9IERFTEVHQVRFU19UT19TWU1CT0wgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBTeW1ib2wtbmFtZWQgUmVnRXhwIG1ldGhvZHMgY2FsbCAuZXhlY1xuICAgIHZhciBleGVjQ2FsbGVkID0gZmFsc2U7XG4gICAgdmFyIHJlID0gL2EvO1xuICAgIHJlLmV4ZWMgPSBmdW5jdGlvbiAoKSB7IGV4ZWNDYWxsZWQgPSB0cnVlOyByZXR1cm4gbnVsbDsgfTtcblxuICAgIGlmIChLRVkgPT09ICdzcGxpdCcpIHtcbiAgICAgIC8vIFJlZ0V4cFtAQHNwbGl0XSBkb2Vzbid0IGNhbGwgdGhlIHJlZ2V4J3MgZXhlYyBtZXRob2QsIGJ1dCBmaXJzdCBjcmVhdGVzXG4gICAgICAvLyBhIG5ldyBvbmUuIFdlIG5lZWQgdG8gcmV0dXJuIHRoZSBwYXRjaGVkIHJlZ2V4IHdoZW4gY3JlYXRpbmcgdGhlIG5ldyBvbmUuXG4gICAgICByZS5jb25zdHJ1Y3RvciA9IHt9O1xuICAgICAgcmUuY29uc3RydWN0b3JbU1BFQ0lFU10gPSBmdW5jdGlvbiAoKSB7IHJldHVybiByZTsgfTtcbiAgICB9XG5cbiAgICByZVtTWU1CT0xdKCcnKTtcbiAgICByZXR1cm4gIWV4ZWNDYWxsZWQ7XG4gIH0pO1xuXG4gIGlmIChcbiAgICAhREVMRUdBVEVTX1RPX1NZTUJPTCB8fFxuICAgICFERUxFR0FURVNfVE9fRVhFQyB8fFxuICAgIChLRVkgPT09ICdyZXBsYWNlJyAmJiAhUkVQTEFDRV9TVVBQT1JUU19OQU1FRF9HUk9VUFMpIHx8XG4gICAgKEtFWSA9PT0gJ3NwbGl0JyAmJiAhU1BMSVRfV09SS1NfV0lUSF9PVkVSV1JJVFRFTl9FWEVDKVxuICApIHtcbiAgICB2YXIgbmF0aXZlUmVnRXhwTWV0aG9kID0gLy4vW1NZTUJPTF07XG4gICAgdmFyIG1ldGhvZHMgPSBleGVjKFNZTUJPTCwgJydbS0VZXSwgZnVuY3Rpb24gKG5hdGl2ZU1ldGhvZCwgcmVnZXhwLCBzdHIsIGFyZzIsIGZvcmNlU3RyaW5nTWV0aG9kKSB7XG4gICAgICBpZiAocmVnZXhwLmV4ZWMgPT09IHJlZ2V4cEV4ZWMpIHtcbiAgICAgICAgaWYgKERFTEVHQVRFU19UT19TWU1CT0wgJiYgIWZvcmNlU3RyaW5nTWV0aG9kKSB7XG4gICAgICAgICAgLy8gVGhlIG5hdGl2ZSBTdHJpbmcgbWV0aG9kIGFscmVhZHkgZGVsZWdhdGVzIHRvIEBAbWV0aG9kICh0aGlzXG4gICAgICAgICAgLy8gcG9seWZpbGxlZCBmdW5jdGlvbiksIGxlYXNpbmcgdG8gaW5maW5pdGUgcmVjdXJzaW9uLlxuICAgICAgICAgIC8vIFdlIGF2b2lkIGl0IGJ5IGRpcmVjdGx5IGNhbGxpbmcgdGhlIG5hdGl2ZSBAQG1ldGhvZCBtZXRob2QuXG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG5hdGl2ZVJlZ0V4cE1ldGhvZC5jYWxsKHJlZ2V4cCwgc3RyLCBhcmcyKSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiBuYXRpdmVNZXRob2QuY2FsbChzdHIsIHJlZ2V4cCwgYXJnMikgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlIH07XG4gICAgfSk7XG4gICAgdmFyIHN0cmluZ01ldGhvZCA9IG1ldGhvZHNbMF07XG4gICAgdmFyIHJlZ2V4TWV0aG9kID0gbWV0aG9kc1sxXTtcblxuICAgIHJlZGVmaW5lKFN0cmluZy5wcm90b3R5cGUsIEtFWSwgc3RyaW5nTWV0aG9kKTtcbiAgICByZWRlZmluZShSZWdFeHAucHJvdG90eXBlLCBTWU1CT0wsIGxlbmd0aCA9PSAyXG4gICAgICAvLyAyMS4yLjUuOCBSZWdFeHAucHJvdG90eXBlW0BAcmVwbGFjZV0oc3RyaW5nLCByZXBsYWNlVmFsdWUpXG4gICAgICAvLyAyMS4yLjUuMTEgUmVnRXhwLnByb3RvdHlwZVtAQHNwbGl0XShzdHJpbmcsIGxpbWl0KVxuICAgICAgPyBmdW5jdGlvbiAoc3RyaW5nLCBhcmcpIHsgcmV0dXJuIHJlZ2V4TWV0aG9kLmNhbGwoc3RyaW5nLCB0aGlzLCBhcmcpOyB9XG4gICAgICAvLyAyMS4yLjUuNiBSZWdFeHAucHJvdG90eXBlW0BAbWF0Y2hdKHN0cmluZylcbiAgICAgIC8vIDIxLjIuNS45IFJlZ0V4cC5wcm90b3R5cGVbQEBzZWFyY2hdKHN0cmluZylcbiAgICAgIDogZnVuY3Rpb24gKHN0cmluZykgeyByZXR1cm4gcmVnZXhNZXRob2QuY2FsbChzdHJpbmcsIHRoaXMpOyB9XG4gICAgKTtcbiAgICBpZiAoc2hhbSkgaGlkZShSZWdFeHAucHJvdG90eXBlW1NZTUJPTF0sICdzaGFtJywgdHJ1ZSk7XG4gIH1cbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/forced-string-html-method.js":
+/*!*********************************************************************!*\
+ !*** ./node_modules/core-js/internals/forced-string-html-method.js ***!
+ \*********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\n\n// check the existence of a method, lowercase\n// of a tag and escaping quotes in arguments\nmodule.exports = function (METHOD_NAME) {\n return fails(function () {\n var test = ''[METHOD_NAME]('\"');\n return test !== test.toLowerCase() || test.split('\"').length > 3;\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZm9yY2VkLXN0cmluZy1odG1sLW1ldGhvZC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QuanM/ZWFlOSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxuLy8gY2hlY2sgdGhlIGV4aXN0ZW5jZSBvZiBhIG1ldGhvZCwgbG93ZXJjYXNlXG4vLyBvZiBhIHRhZyBhbmQgZXNjYXBpbmcgcXVvdGVzIGluIGFyZ3VtZW50c1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTUVUSE9EX05BTUUpIHtcbiAgcmV0dXJuIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdGVzdCA9ICcnW01FVEhPRF9OQU1FXSgnXCInKTtcbiAgICByZXR1cm4gdGVzdCAhPT0gdGVzdC50b0xvd2VyQ2FzZSgpIHx8IHRlc3Quc3BsaXQoJ1wiJykubGVuZ3RoID4gMztcbiAgfSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/forced-string-html-method.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/forced-string-trim-method.js":
+/*!*********************************************************************!*\
+ !*** ./node_modules/core-js/internals/forced-string-trim-method.js ***!
+ \*********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar whitespaces = __webpack_require__(/*! ../internals/whitespaces */ \"./node_modules/core-js/internals/whitespaces.js\");\n\nvar non = '\\u200B\\u0085\\u180E';\n\n// check that a method works with the correct list\n// of whitespaces and has a correct name\nmodule.exports = function (METHOD_NAME) {\n return fails(function () {\n return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME;\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZm9yY2VkLXN0cmluZy10cmltLW1ldGhvZC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctdHJpbS1tZXRob2QuanM/ZTA3MCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciB3aGl0ZXNwYWNlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93aGl0ZXNwYWNlcycpO1xuXG52YXIgbm9uID0gJ1xcdTIwMEJcXHUwMDg1XFx1MTgwRSc7XG5cbi8vIGNoZWNrIHRoYXQgYSBtZXRob2Qgd29ya3Mgd2l0aCB0aGUgY29ycmVjdCBsaXN0XG4vLyBvZiB3aGl0ZXNwYWNlcyBhbmQgaGFzIGEgY29ycmVjdCBuYW1lXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSkge1xuICByZXR1cm4gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhIXdoaXRlc3BhY2VzW01FVEhPRF9OQU1FXSgpIHx8IG5vbltNRVRIT0RfTkFNRV0oKSAhPSBub24gfHwgd2hpdGVzcGFjZXNbTUVUSE9EX05BTUVdLm5hbWUgIT09IE1FVEhPRF9OQU1FO1xuICB9KTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/forced-string-trim-method.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/function-to-string.js":
+/*!**************************************************************!*\
+ !*** ./node_modules/core-js/internals/function-to-string.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var shared = __webpack_require__(/*! ../internals/shared */ \"./node_modules/core-js/internals/shared.js\");\n\nmodule.exports = shared('native-function-to-string', Function.toString);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdG8tc3RyaW5nLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdG8tc3RyaW5nLmpzPzllODEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzaGFyZWQoJ25hdGl2ZS1mdW5jdGlvbi10by1zdHJpbmcnLCBGdW5jdGlvbi50b1N0cmluZyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/function-to-string.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/get-built-in.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/internals/get-built-in.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var path = __webpack_require__(/*! ../internals/path */ \"./node_modules/core-js/internals/path.js\");\nvar global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\n\nvar aFunction = function (variable) {\n return typeof variable == 'function' ? variable : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace])\n : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzP2QwNjYiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHBhdGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGF0aCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxudmFyIGFGdW5jdGlvbiA9IGZ1bmN0aW9uICh2YXJpYWJsZSkge1xuICByZXR1cm4gdHlwZW9mIHZhcmlhYmxlID09ICdmdW5jdGlvbicgPyB2YXJpYWJsZSA6IHVuZGVmaW5lZDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWVzcGFjZSwgbWV0aG9kKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IGFGdW5jdGlvbihwYXRoW25hbWVzcGFjZV0pIHx8IGFGdW5jdGlvbihnbG9iYWxbbmFtZXNwYWNlXSlcbiAgICA6IHBhdGhbbmFtZXNwYWNlXSAmJiBwYXRoW25hbWVzcGFjZV1bbWV0aG9kXSB8fCBnbG9iYWxbbmFtZXNwYWNlXSAmJiBnbG9iYWxbbmFtZXNwYWNlXVttZXRob2RdO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/get-built-in.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/get-iterator-method.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/core-js/internals/get-iterator-method.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var classof = __webpack_require__(/*! ../internals/classof */ \"./node_modules/core-js/internals/classof.js\");\nvar Iterators = __webpack_require__(/*! ../internals/iterators */ \"./node_modules/core-js/internals/iterators.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanM/MzVhMSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCAhPSB1bmRlZmluZWQpIHJldHVybiBpdFtJVEVSQVRPUl1cbiAgICB8fCBpdFsnQEBpdGVyYXRvciddXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/get-iterator-method.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/global.js":
+/*!**************************************************!*\
+ !*** ./node_modules/core-js/internals/global.js ***!
+ \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/* WEBPACK VAR INJECTION */(function(global) {var O = 'object';\nvar check = function (it) {\n return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line no-undef\n check(typeof globalThis == O && globalThis) ||\n check(typeof window == O && window) ||\n check(typeof self == O && self) ||\n check(typeof global == O && global) ||\n // eslint-disable-next-line no-new-func\n Function('return this')();\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzP2RhODQiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIE8gPSAnb2JqZWN0JztcbnZhciBjaGVjayA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgJiYgaXQuTWF0aCA9PSBNYXRoICYmIGl0O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbm1vZHVsZS5leHBvcnRzID1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIGNoZWNrKHR5cGVvZiBnbG9iYWxUaGlzID09IE8gJiYgZ2xvYmFsVGhpcykgfHxcbiAgY2hlY2sodHlwZW9mIHdpbmRvdyA9PSBPICYmIHdpbmRvdykgfHxcbiAgY2hlY2sodHlwZW9mIHNlbGYgPT0gTyAmJiBzZWxmKSB8fFxuICBjaGVjayh0eXBlb2YgZ2xvYmFsID09IE8gJiYgZ2xvYmFsKSB8fFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/global.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/has.js":
+/*!***********************************************!*\
+ !*** ./node_modules/core-js/internals/has.js ***!
+ \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("var hasOwnProperty = {}.hasOwnProperty;\n\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLmpzPzUxMzUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/has.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/hidden-keys.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/internals/hidden-keys.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("module.exports = {};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oaWRkZW4ta2V5cy5qcz9kMDEyIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0ge307XG4iXSwibWFwcGluZ3MiOiJBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/hidden-keys.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/hide.js":
+/*!************************************************!*\
+ !*** ./node_modules/core-js/internals/hide.js ***!
+ \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ \"./node_modules/core-js/internals/descriptors.js\");\nvar definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ \"./node_modules/core-js/internals/object-define-property.js\");\nvar createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ \"./node_modules/core-js/internals/create-property-descriptor.js\");\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hpZGUuanM/NWY2NSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwga2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/hide.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/host-report-errors.js":
+/*!**************************************************************!*\
+ !*** ./node_modules/core-js/internals/host-report-errors.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\n\nmodule.exports = function (a, b) {\n var console = global.console;\n if (console && console.error) {\n arguments.length === 1 ? console.error(a) : console.error(a, b);\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzLmpzPzQ0ZGUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYSwgYikge1xuICB2YXIgY29uc29sZSA9IGdsb2JhbC5jb25zb2xlO1xuICBpZiAoY29uc29sZSAmJiBjb25zb2xlLmVycm9yKSB7XG4gICAgYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGNvbnNvbGUuZXJyb3IoYSkgOiBjb25zb2xlLmVycm9yKGEsIGIpO1xuICB9XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/host-report-errors.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/html.js":
+/*!************************************************!*\
+ !*** ./node_modules/core-js/internals/html.js ***!
+ \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\n\nvar document = global.document;\n\nmodule.exports = document && document.documentElement;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaHRtbC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2h0bWwuanM/MWJlNCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG5cbm1vZHVsZS5leHBvcnRzID0gZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/html.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/ie8-dom-define.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/internals/ie8-dom-define.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ \"./node_modules/core-js/internals/descriptors.js\");\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar createElement = __webpack_require__(/*! ../internals/document-create-element */ \"./node_modules/core-js/internals/document-create-element.js\");\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pZTgtZG9tLWRlZmluZS5qcz8wY2ZiIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xuXG4vLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFERVNDUklQVE9SUyAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGNyZWF0ZUVsZW1lbnQoJ2RpdicpLCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH1cbiAgfSkuYSAhPSA3O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/ie8-dom-define.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/indexed-object.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/internals/indexed-object.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar classof = __webpack_require__(/*! ../internals/classof-raw */ \"./node_modules/core-js/internals/classof-raw.js\");\n\nvar split = ''.split;\n\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins\n return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split.call(it, '') : Object(it);\n} : Object;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmRleGVkLW9iamVjdC5qcz80NGFkIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG5cbnZhciBzcGxpdCA9ICcnLnNwbGl0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gdGhyb3dzIGFuIGVycm9yIGluIHJoaW5vLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvcmhpbm8vaXNzdWVzLzM0NlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gIHJldHVybiAhT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCk7XG59KSA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gY2xhc3NvZihpdCkgPT0gJ1N0cmluZycgPyBzcGxpdC5jYWxsKGl0LCAnJykgOiBPYmplY3QoaXQpO1xufSA6IE9iamVjdDtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/indexed-object.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/internal-state.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/internals/internal-state.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var NATIVE_WEAK_MAP = __webpack_require__(/*! ../internals/native-weak-map */ \"./node_modules/core-js/internals/native-weak-map.js\");\nvar global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\nvar hide = __webpack_require__(/*! ../internals/hide */ \"./node_modules/core-js/internals/hide.js\");\nvar objectHas = __webpack_require__(/*! ../internals/has */ \"./node_modules/core-js/internals/has.js\");\nvar sharedKey = __webpack_require__(/*! ../internals/shared-key */ \"./node_modules/core-js/internals/shared-key.js\");\nvar hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ \"./node_modules/core-js/internals/hidden-keys.js\");\n\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP) {\n var store = new WeakMap();\n var wmget = store.get;\n var wmhas = store.has;\n var wmset = store.set;\n set = function (it, metadata) {\n wmset.call(store, it, metadata);\n return metadata;\n };\n get = function (it) {\n return wmget.call(store, it) || {};\n };\n has = function (it) {\n return wmhas.call(store, it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n hide(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return objectHas(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return objectHas(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qcz82OWYzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBOQVRJVkVfV0VBS19NQVAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXdlYWstbWFwJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZScpO1xudmFyIG9iamVjdEhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxudmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcbnZhciBzZXQsIGdldCwgaGFzO1xuXG52YXIgZW5mb3JjZSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaGFzKGl0KSA/IGdldChpdCkgOiBzZXQoaXQsIHt9KTtcbn07XG5cbnZhciBnZXR0ZXJGb3IgPSBmdW5jdGlvbiAoVFlQRSkge1xuICByZXR1cm4gZnVuY3Rpb24gKGl0KSB7XG4gICAgdmFyIHN0YXRlO1xuICAgIGlmICghaXNPYmplY3QoaXQpIHx8IChzdGF0ZSA9IGdldChpdCkpLnR5cGUgIT09IFRZUEUpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcignSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAnICsgVFlQRSArICcgcmVxdWlyZWQnKTtcbiAgICB9IHJldHVybiBzdGF0ZTtcbiAgfTtcbn07XG5cbmlmIChOQVRJVkVfV0VBS19NQVApIHtcbiAgdmFyIHN0b3JlID0gbmV3IFdlYWtNYXAoKTtcbiAgdmFyIHdtZ2V0ID0gc3RvcmUuZ2V0O1xuICB2YXIgd21oYXMgPSBzdG9yZS5oYXM7XG4gIHZhciB3bXNldCA9IHN0b3JlLnNldDtcbiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICAgIHdtc2V0LmNhbGwoc3RvcmUsIGl0LCBtZXRhZGF0YSk7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9O1xuICBnZXQgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gd21nZXQuY2FsbChzdG9yZSwgaXQpIHx8IHt9O1xuICB9O1xuICBoYXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gd21oYXMuY2FsbChzdG9yZSwgaXQpO1xuICB9O1xufSBlbHNlIHtcbiAgdmFyIFNUQVRFID0gc2hhcmVkS2V5KCdzdGF0ZScpO1xuICBoaWRkZW5LZXlzW1NUQVRFXSA9IHRydWU7XG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICBoaWRlKGl0LCBTVEFURSwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIG9iamVjdEhhcyhpdCwgU1RBVEUpID8gaXRbU1RBVEVdIDoge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBvYmplY3RIYXMoaXQsIFNUQVRFKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBnZXQ6IGdldCxcbiAgaGFzOiBoYXMsXG4gIGVuZm9yY2U6IGVuZm9yY2UsXG4gIGdldHRlckZvcjogZ2V0dGVyRm9yXG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/internal-state.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/is-array-iterator-method.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/core-js/internals/is-array-iterator-method.js ***!
+ \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\nvar Iterators = __webpack_require__(/*! ../internals/iterators */ \"./node_modules/core-js/internals/iterators.js\");\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kLmpzP2U5NWEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG4vLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvdHlwZVtJVEVSQVRPUl0gPT09IGl0KTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/is-array-iterator-method.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/is-forced.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/core-js/internals/is-forced.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : typeof detection == 'function' ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtZm9yY2VkLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtZm9yY2VkLmpzPzk0Y2EiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbnZhciByZXBsYWNlbWVudCA9IC8jfFxcLnByb3RvdHlwZVxcLi87XG5cbnZhciBpc0ZvcmNlZCA9IGZ1bmN0aW9uIChmZWF0dXJlLCBkZXRlY3Rpb24pIHtcbiAgdmFyIHZhbHVlID0gZGF0YVtub3JtYWxpemUoZmVhdHVyZSldO1xuICByZXR1cm4gdmFsdWUgPT0gUE9MWUZJTEwgPyB0cnVlXG4gICAgOiB2YWx1ZSA9PSBOQVRJVkUgPyBmYWxzZVxuICAgIDogdHlwZW9mIGRldGVjdGlvbiA9PSAnZnVuY3Rpb24nID8gZmFpbHMoZGV0ZWN0aW9uKVxuICAgIDogISFkZXRlY3Rpb247XG59O1xuXG52YXIgbm9ybWFsaXplID0gaXNGb3JjZWQubm9ybWFsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICByZXR1cm4gU3RyaW5nKHN0cmluZykucmVwbGFjZShyZXBsYWNlbWVudCwgJy4nKS50b0xvd2VyQ2FzZSgpO1xufTtcblxudmFyIGRhdGEgPSBpc0ZvcmNlZC5kYXRhID0ge307XG52YXIgTkFUSVZFID0gaXNGb3JjZWQuTkFUSVZFID0gJ04nO1xudmFyIFBPTFlGSUxMID0gaXNGb3JjZWQuUE9MWUZJTEwgPSAnUCc7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGb3JjZWQ7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/is-forced.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/is-object.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/core-js/internals/is-object.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzPzg2MWQiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/is-object.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/is-pure.js":
+/*!***************************************************!*\
+ !*** ./node_modules/core-js/internals/is-pure.js ***!
+ \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("module.exports = false;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanM/YzQzMCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZhbHNlO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/is-pure.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/is-regexp.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/core-js/internals/is-regexp.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\nvar classof = __webpack_require__(/*! ../internals/classof-raw */ \"./node_modules/core-js/internals/classof-raw.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.github.io/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcmVnZXhwLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcmVnZXhwLmpzPzQ0ZTciXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIE1BVENIID0gd2VsbEtub3duU3ltYm9sKCdtYXRjaCcpO1xuXG4vLyBgSXNSZWdFeHBgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXNyZWdleHBcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBpc1JlZ0V4cDtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiAoKGlzUmVnRXhwID0gaXRbTUFUQ0hdKSAhPT0gdW5kZWZpbmVkID8gISFpc1JlZ0V4cCA6IGNsYXNzb2YoaXQpID09ICdSZWdFeHAnKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/is-regexp.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/iterate.js":
+/*!***************************************************!*\
+ !*** ./node_modules/core-js/internals/iterate.js ***!
+ \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar isArrayIteratorMethod = __webpack_require__(/*! ../internals/is-array-iterator-method */ \"./node_modules/core-js/internals/is-array-iterator-method.js\");\nvar toLength = __webpack_require__(/*! ../internals/to-length */ \"./node_modules/core-js/internals/to-length.js\");\nvar bind = __webpack_require__(/*! ../internals/bind-context */ \"./node_modules/core-js/internals/bind-context.js\");\nvar getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ \"./node_modules/core-js/internals/get-iterator-method.js\");\nvar callWithSafeIterationClosing = __webpack_require__(/*! ../internals/call-with-safe-iteration-closing */ \"./node_modules/core-js/internals/call-with-safe-iteration-closing.js\");\n\nvar BREAK = {};\n\nvar exports = module.exports = function (iterable, fn, that, ENTRIES, ITERATOR) {\n var boundFunction = bind(fn, that, ENTRIES ? 2 : 1);\n var iterator, iterFn, index, length, result, step;\n\n if (ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (typeof iterFn != 'function') throw TypeError('Target is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = toLength(iterable.length); length > index; index++) {\n result = ENTRIES ? boundFunction(anObject(step = iterable[index])[0], step[1]) : boundFunction(iterable[index]);\n if (result === BREAK) return BREAK;\n } return;\n }\n iterator = iterFn.call(iterable);\n }\n\n while (!(step = iterator.next()).done) {\n if (callWithSafeIterationClosing(iterator, boundFunction, step.value, ENTRIES) === BREAK) return BREAK;\n }\n};\n\nexports.BREAK = BREAK;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanM/MjI2NiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXNBcnJheUl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYmluZC1jb250ZXh0Jyk7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcnKTtcblxudmFyIEJSRUFLID0ge307XG5cbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmFibGUsIGZuLCB0aGF0LCBFTlRSSUVTLCBJVEVSQVRPUikge1xuICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoZm4sIHRoYXQsIEVOVFJJRVMgPyAyIDogMSk7XG4gIHZhciBpdGVyYXRvciwgaXRlckZuLCBpbmRleCwgbGVuZ3RoLCByZXN1bHQsIHN0ZXA7XG5cbiAgaWYgKElURVJBVE9SKSB7XG4gICAgaXRlcmF0b3IgPSBpdGVyYWJsZTtcbiAgfSBlbHNlIHtcbiAgICBpdGVyRm4gPSBnZXRJdGVyYXRvck1ldGhvZChpdGVyYWJsZSk7XG4gICAgaWYgKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJykgdGhyb3cgVHlwZUVycm9yKCdUYXJnZXQgaXMgbm90IGl0ZXJhYmxlJyk7XG4gICAgLy8gb3B0aW1pc2F0aW9uIGZvciBhcnJheSBpdGVyYXRvcnNcbiAgICBpZiAoaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJGbikpIHtcbiAgICAgIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSB0b0xlbmd0aChpdGVyYWJsZS5sZW5ndGgpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgICByZXN1bHQgPSBFTlRSSUVTID8gYm91bmRGdW5jdGlvbihhbk9iamVjdChzdGVwID0gaXRlcmFibGVbaW5kZXhdKVswXSwgc3RlcFsxXSkgOiBib3VuZEZ1bmN0aW9uKGl0ZXJhYmxlW2luZGV4XSk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IEJSRUFLKSByZXR1cm4gQlJFQUs7XG4gICAgICB9IHJldHVybjtcbiAgICB9XG4gICAgaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChpdGVyYWJsZSk7XG4gIH1cblxuICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgaWYgKGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcoaXRlcmF0b3IsIGJvdW5kRnVuY3Rpb24sIHN0ZXAudmFsdWUsIEVOVFJJRVMpID09PSBCUkVBSykgcmV0dXJuIEJSRUFLO1xuICB9XG59O1xuXG5leHBvcnRzLkJSRUFLID0gQlJFQUs7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/iterate.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/iterators-core.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/internals/iterators-core.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ \"./node_modules/core-js/internals/object-get-prototype-of.js\");\nvar hide = __webpack_require__(/*! ../internals/hide */ \"./node_modules/core-js/internals/hide.js\");\nvar has = __webpack_require__(/*! ../internals/has */ \"./node_modules/core-js/internals/has.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\nvar IS_PURE = __webpack_require__(/*! ../internals/is-pure */ \"./node_modules/core-js/internals/is-pure.js\");\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\nvar returnThis = function () { return this; };\n\n// `%IteratorPrototype%` object\n// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nif (IteratorPrototype == undefined) IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nif (!IS_PURE && !has(IteratorPrototype, ITERATOR)) hide(IteratorPrototype, ITERATOR, returnThis);\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMtY29yZS5qcz9hZTkzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSBmYWxzZTtcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG4vLyBgJUl0ZXJhdG9yUHJvdG90eXBlJWAgb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0laXRlcmF0b3Jwcm90b3R5cGUlLW9iamVjdFxudmFyIEl0ZXJhdG9yUHJvdG90eXBlLCBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUsIGFycmF5SXRlcmF0b3I7XG5cbmlmIChbXS5rZXlzKSB7XG4gIGFycmF5SXRlcmF0b3IgPSBbXS5rZXlzKCk7XG4gIC8vIFNhZmFyaSA4IGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxuICBpZiAoISgnbmV4dCcgaW4gYXJyYXlJdGVyYXRvcikpIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSB0cnVlO1xuICBlbHNlIHtcbiAgICBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihnZXRQcm90b3R5cGVPZihhcnJheUl0ZXJhdG9yKSk7XG4gICAgaWYgKFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkgSXRlcmF0b3JQcm90b3R5cGUgPSBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cbn1cblxuaWYgKEl0ZXJhdG9yUHJvdG90eXBlID09IHVuZGVmaW5lZCkgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblxuLy8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClcbmlmICghSVNfUFVSRSAmJiAhaGFzKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUikpIGhpZGUoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEl0ZXJhdG9yUHJvdG90eXBlOiBJdGVyYXRvclByb3RvdHlwZSxcbiAgQlVHR1lfU0FGQVJJX0lURVJBVE9SUzogQlVHR1lfU0FGQVJJX0lURVJBVE9SU1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/iterators-core.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/iterators.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/core-js/internals/iterators.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("module.exports = {};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLmpzPzNmOGMiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSB7fTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/iterators.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/microtask.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/core-js/internals/microtask.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ \"./node_modules/core-js/internals/object-get-own-property-descriptor.js\").f;\nvar classof = __webpack_require__(/*! ../internals/classof-raw */ \"./node_modules/core-js/internals/classof-raw.js\");\nvar macrotask = __webpack_require__(/*! ../internals/task */ \"./node_modules/core-js/internals/task.js\").set;\nvar userAgent = __webpack_require__(/*! ../internals/user-agent */ \"./node_modules/core-js/internals/user-agent.js\");\n\nvar MutationObserver = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar IS_NODE = classof(process) == 'process';\n// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`\nvar queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask');\nvar queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;\n\nvar flush, head, last, notify, toggle, node, promise;\n\n// modern engines have queueMicrotask method\nif (!queueMicrotask) {\n flush = function () {\n var parent, fn;\n if (IS_NODE && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (error) {\n if (head) notify();\n else last = undefined;\n throw error;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (IS_NODE) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n } else if (MutationObserver && !/(iphone|ipod|ipad).*applewebkit/i.test(userAgent)) {\n toggle = true;\n node = document.createTextNode('');\n new MutationObserver(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n promise = Promise.resolve(undefined);\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n}\n\nmodule.exports = queueMicrotask || function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWljcm90YXNrLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWljcm90YXNrLmpzP2I1NzUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpLmY7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIG1hY3JvdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90YXNrJykuc2V0O1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91c2VyLWFnZW50Jyk7XG5cbnZhciBNdXRhdGlvbk9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIFByb21pc2UgPSBnbG9iYWwuUHJvbWlzZTtcbnZhciBJU19OT0RFID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG4vLyBOb2RlLmpzIDExIHNob3dzIEV4cGVyaW1lbnRhbFdhcm5pbmcgb24gZ2V0dGluZyBgcXVldWVNaWNyb3Rhc2tgXG52YXIgcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGdsb2JhbCwgJ3F1ZXVlTWljcm90YXNrJyk7XG52YXIgcXVldWVNaWNyb3Rhc2sgPSBxdWV1ZU1pY3JvdGFza0Rlc2NyaXB0b3IgJiYgcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yLnZhbHVlO1xuXG52YXIgZmx1c2gsIGhlYWQsIGxhc3QsIG5vdGlmeSwgdG9nZ2xlLCBub2RlLCBwcm9taXNlO1xuXG4vLyBtb2Rlcm4gZW5naW5lcyBoYXZlIHF1ZXVlTWljcm90YXNrIG1ldGhvZFxuaWYgKCFxdWV1ZU1pY3JvdGFzaykge1xuICBmbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50LCBmbjtcbiAgICBpZiAoSVNfTk9ERSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKSBwYXJlbnQuZXhpdCgpO1xuICAgIHdoaWxlIChoZWFkKSB7XG4gICAgICBmbiA9IGhlYWQuZm47XG4gICAgICBoZWFkID0gaGVhZC5uZXh0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChoZWFkKSBub3RpZnkoKTtcbiAgICAgICAgZWxzZSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LmVudGVyKCk7XG4gIH07XG5cbiAgLy8gTm9kZS5qc1xuICBpZiAoSVNfTk9ERSkge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZmx1c2gpO1xuICAgIH07XG4gIC8vIGJyb3dzZXJzIHdpdGggTXV0YXRpb25PYnNlcnZlciwgZXhjZXB0IGlPUyAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8zMzlcbiAgfSBlbHNlIGlmIChNdXRhdGlvbk9ic2VydmVyICYmICEvKGlwaG9uZXxpcG9kfGlwYWQpLiphcHBsZXdlYmtpdC9pLnRlc3QodXNlckFnZW50KSkge1xuICAgIHRvZ2dsZSA9IHRydWU7XG4gICAgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBuZXcgTXV0YXRpb25PYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlID0gIXRvZ2dsZTtcbiAgICB9O1xuICAvLyBlbnZpcm9ubWVudHMgd2l0aCBtYXliZSBub24tY29tcGxldGVseSBjb3JyZWN0LCBidXQgZXhpc3RlbnQgUHJvbWlzZVxuICB9IGVsc2UgaWYgKFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKSB7XG4gICAgLy8gUHJvbWlzZS5yZXNvbHZlIHdpdGhvdXQgYW4gYXJndW1lbnQgdGhyb3dzIGFuIGVycm9yIGluIExHIFdlYk9TIDJcbiAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdcbiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgLy8gLSBzZXRUaW1lb3V0XG4gIH0gZWxzZSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgICAgbWFjcm90YXNrLmNhbGwoZ2xvYmFsLCBmbHVzaCk7XG4gICAgfTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHF1ZXVlTWljcm90YXNrIHx8IGZ1bmN0aW9uIChmbikge1xuICB2YXIgdGFzayA9IHsgZm46IGZuLCBuZXh0OiB1bmRlZmluZWQgfTtcbiAgaWYgKGxhc3QpIGxhc3QubmV4dCA9IHRhc2s7XG4gIGlmICghaGVhZCkge1xuICAgIGhlYWQgPSB0YXNrO1xuICAgIG5vdGlmeSgpO1xuICB9IGxhc3QgPSB0YXNrO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/microtask.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/native-symbol.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/internals/native-symbol.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\n\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n // Chrome 38 Symbol has incorrect toString conversion\n // eslint-disable-next-line no-undef\n return !String(Symbol());\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25hdGl2ZS1zeW1ib2wuanM/NDkzMCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gQ2hyb21lIDM4IFN5bWJvbCBoYXMgaW5jb3JyZWN0IHRvU3RyaW5nIGNvbnZlcnNpb25cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHJldHVybiAhU3RyaW5nKFN5bWJvbCgpKTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/native-symbol.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/native-weak-map.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/internals/native-weak-map.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar nativeFunctionToString = __webpack_require__(/*! ../internals/function-to-string */ \"./node_modules/core-js/internals/function-to-string.js\");\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = typeof WeakMap === 'function' && /native code/.test(nativeFunctionToString.call(WeakMap));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXdlYWstbWFwLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXdlYWstbWFwLmpzPzdmOWEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBuYXRpdmVGdW5jdGlvblRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXRvLXN0cmluZycpO1xuXG52YXIgV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nICYmIC9uYXRpdmUgY29kZS8udGVzdChuYXRpdmVGdW5jdGlvblRvU3RyaW5nLmNhbGwoV2Vha01hcCkpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/native-weak-map.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/new-promise-capability.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/core-js/internals/new-promise-capability.js ***!
+ \******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar aFunction = __webpack_require__(/*! ../internals/a-function */ \"./node_modules/core-js/internals/a-function.js\");\n\nvar PromiseCapability = function (C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n};\n\n// 25.4.1.5 NewPromiseCapability(C)\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanM/ZjA2OSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcblxudmFyIFByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24gKCQkcmVzb2x2ZSwgJCRyZWplY3QpIHtcbiAgICBpZiAocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoJ0JhZCBQcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgcmVzb2x2ZSA9ICQkcmVzb2x2ZTtcbiAgICByZWplY3QgPSAkJHJlamVjdDtcbiAgfSk7XG4gIHRoaXMucmVzb2x2ZSA9IGFGdW5jdGlvbihyZXNvbHZlKTtcbiAgdGhpcy5yZWplY3QgPSBhRnVuY3Rpb24ocmVqZWN0KTtcbn07XG5cbi8vIDI1LjQuMS41IE5ld1Byb21pc2VDYXBhYmlsaXR5KEMpXG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gKEMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/new-promise-capability.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-create.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/internals/object-create.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar defineProperties = __webpack_require__(/*! ../internals/object-define-properties */ \"./node_modules/core-js/internals/object-define-properties.js\");\nvar enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ \"./node_modules/core-js/internals/enum-bug-keys.js\");\nvar hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ \"./node_modules/core-js/internals/hidden-keys.js\");\nvar html = __webpack_require__(/*! ../internals/html */ \"./node_modules/core-js/internals/html.js\");\nvar documentCreateElement = __webpack_require__(/*! ../internals/document-create-element */ \"./node_modules/core-js/internals/document-create-element.js\");\nvar sharedKey = __webpack_require__(/*! ../internals/shared-key */ \"./node_modules/core-js/internals/shared-key.js\");\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar PROTOTYPE = 'prototype';\nvar Empty = function () { /* empty */ };\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var length = enumBugKeys.length;\n var lt = '<';\n var script = 'script';\n var gt = '>';\n var js = 'java' + script + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n iframe.src = String(js);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + script + gt + 'document.F=Object' + lt + '/' + script + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (length--) delete createDict[PROTOTYPE][enumBugKeys[length]];\n return createDict();\n};\n\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : defineProperties(result, Properties);\n};\n\nhiddenKeys[IE_PROTO] = true;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1jcmVhdGUuanM/N2M3MyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgZGVmaW5lUHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xudmFyIGh0bWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaHRtbCcpO1xudmFyIGRvY3VtZW50Q3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG52YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7XG5cbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBFbXB0eSA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIGNyZWF0ZURpY3QgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSBkb2N1bWVudENyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICB2YXIgbGVuZ3RoID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB2YXIgbHQgPSAnPCc7XG4gIHZhciBzY3JpcHQgPSAnc2NyaXB0JztcbiAgdmFyIGd0ID0gJz4nO1xuICB2YXIganMgPSAnamF2YScgKyBzY3JpcHQgKyAnOic7XG4gIHZhciBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGh0bWwuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9IFN0cmluZyhqcyk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyBzY3JpcHQgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvJyArIHNjcmlwdCArIGd0KTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG4gIHdoaWxlIChsZW5ndGgtLSkgZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tsZW5ndGhdXTtcbiAgcmV0dXJuIGNyZWF0ZURpY3QoKTtcbn07XG5cbi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eSgpO1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRlZmluZVByb3BlcnRpZXMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcbn07XG5cbmhpZGRlbktleXNbSUVfUFJPVE9dID0gdHJ1ZTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/object-create.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-define-properties.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/core-js/internals/object-define-properties.js ***!
+ \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ \"./node_modules/core-js/internals/descriptors.js\");\nvar definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ \"./node_modules/core-js/internals/object-define-property.js\");\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar objectKeys = __webpack_require__(/*! ../internals/object-keys */ \"./node_modules/core-js/internals/object-keys.js\");\n\nmodule.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var i = 0;\n var key;\n while (length > i) definePropertyModule.f(O, key = keys[i++], Properties[key]);\n return O;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzLmpzPzM3ZTgiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIga2V5cyA9IG9iamVjdEtleXMoUHJvcGVydGllcyk7XG4gIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgdmFyIGkgPSAwO1xuICB2YXIga2V5O1xuICB3aGlsZSAobGVuZ3RoID4gaSkgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihPLCBrZXkgPSBrZXlzW2krK10sIFByb3BlcnRpZXNba2V5XSk7XG4gIHJldHVybiBPO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/object-define-properties.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-define-property.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/core-js/internals/object-define-property.js ***!
+ \******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ \"./node_modules/core-js/internals/descriptors.js\");\nvar IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ \"./node_modules/core-js/internals/ie8-dom-define.js\");\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ \"./node_modules/core-js/internals/to-primitive.js\");\n\nvar nativeDefineProperty = Object.defineProperty;\n\nexports.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return nativeDefineProperty(O, P, Attributes);\n } catch (error) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanM/OWJmMiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xuXG52YXIgbmF0aXZlRGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbmV4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gbmF0aXZlRGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuIG5hdGl2ZURlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgaWYgKCd2YWx1ZScgaW4gQXR0cmlidXRlcykgT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG4gIHJldHVybiBPO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/object-define-property.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-get-own-property-descriptor.js":
+/*!******************************************************************************!*\
+ !*** ./node_modules/core-js/internals/object-get-own-property-descriptor.js ***!
+ \******************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ \"./node_modules/core-js/internals/descriptors.js\");\nvar propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ \"./node_modules/core-js/internals/object-property-is-enumerable.js\");\nvar createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ \"./node_modules/core-js/internals/create-property-descriptor.js\");\nvar toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ \"./node_modules/core-js/internals/to-indexed-object.js\");\nvar toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ \"./node_modules/core-js/internals/to-primitive.js\");\nvar has = __webpack_require__(/*! ../internals/has */ \"./node_modules/core-js/internals/has.js\");\nvar IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ \"./node_modules/core-js/internals/ie8-dom-define.js\");\n\nvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\nexports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return nativeGetOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanM/MDZjZiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xuXG52YXIgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgPyBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuICBPID0gdG9JbmRleGVkT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIGlmIChoYXMoTywgUCkpIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoIXByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmYuY2FsbChPLCBQKSwgT1tQXSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/object-get-own-property-descriptor.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-get-own-property-names.js":
+/*!*************************************************************************!*\
+ !*** ./node_modules/core-js/internals/object-get-own-property-names.js ***!
+ \*************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ \"./node_modules/core-js/internals/object-keys-internal.js\");\nvar enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ \"./node_modules/core-js/internals/enum-bug-keys.js\");\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcz8yNDFjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDE5LjEuMi43IC8gMTUuMi4zLjQgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbnZhciBpbnRlcm5hbE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG5cbnZhciBoaWRkZW5LZXlzID0gZW51bUJ1Z0tleXMuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XG5cbmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoTykge1xuICByZXR1cm4gaW50ZXJuYWxPYmplY3RLZXlzKE8sIGhpZGRlbktleXMpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/object-get-own-property-names.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-get-own-property-symbols.js":
+/*!***************************************************************************!*\
+ !*** ./node_modules/core-js/internals/object-get-own-property-symbols.js ***!
+ \***************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("exports.f = Object.getOwnPropertySymbols;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMuanM/NzQxOCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/object-get-own-property-symbols.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-get-prototype-of.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/core-js/internals/object-get-prototype-of.js ***!
+ \*******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var has = __webpack_require__(/*! ../internals/has */ \"./node_modules/core-js/internals/has.js\");\nvar toObject = __webpack_require__(/*! ../internals/to-object */ \"./node_modules/core-js/internals/to-object.js\");\nvar sharedKey = __webpack_require__(/*! ../internals/shared-key */ \"./node_modules/core-js/internals/shared-key.js\");\nvar CORRECT_PROTOTYPE_GETTER = __webpack_require__(/*! ../internals/correct-prototype-getter */ \"./node_modules/core-js/internals/correct-prototype-getter.js\");\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar ObjectPrototype = Object.prototype;\n\n// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectPrototype : null;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qcz9lMTYzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcbnZhciBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyJyk7XG5cbnZhciBJRV9QUk9UTyA9IHNoYXJlZEtleSgnSUVfUFJPVE8nKTtcbnZhciBPYmplY3RQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuXG4vLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxubW9kdWxlLmV4cG9ydHMgPSBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiAoTykge1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmIChoYXMoTywgSUVfUFJPVE8pKSByZXR1cm4gT1tJRV9QUk9UT107XG4gIGlmICh0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG90eXBlIDogbnVsbDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/object-get-prototype-of.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-keys-internal.js":
+/*!****************************************************************!*\
+ !*** ./node_modules/core-js/internals/object-keys-internal.js ***!
+ \****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var has = __webpack_require__(/*! ../internals/has */ \"./node_modules/core-js/internals/has.js\");\nvar toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ \"./node_modules/core-js/internals/to-indexed-object.js\");\nvar arrayIncludes = __webpack_require__(/*! ../internals/array-includes */ \"./node_modules/core-js/internals/array-includes.js\");\nvar hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ \"./node_modules/core-js/internals/hidden-keys.js\");\n\nvar arrayIndexOf = arrayIncludes(false);\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbC5qcz9jYTg0Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgYXJyYXlJbmNsdWRlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pbmNsdWRlcycpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxudmFyIGFycmF5SW5kZXhPZiA9IGFycmF5SW5jbHVkZXMoZmFsc2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWVzKSB7XG4gIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KG9iamVjdCk7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBPKSAhaGFzKGhpZGRlbktleXMsIGtleSkgJiYgaGFzKE8sIGtleSkgJiYgcmVzdWx0LnB1c2goa2V5KTtcbiAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkgaWYgKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSkge1xuICAgIH5hcnJheUluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHJlc3VsdC5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/object-keys-internal.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-keys.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/internals/object-keys.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ \"./node_modules/core-js/internals/object-keys-internal.js\");\nvar enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ \"./node_modules/core-js/internals/enum-bug-keys.js\");\n\n// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy5qcz9kZjc1Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBpbnRlcm5hbE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG5cbi8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/object-keys.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-property-is-enumerable.js":
+/*!*************************************************************************!*\
+ !*** ./node_modules/core-js/internals/object-property-is-enumerable.js ***!
+ \*************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar nativePropertyIsEnumerable = {}.propertyIsEnumerable;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);\n\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : nativePropertyIsEnumerable;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZS5qcz9kMWU3Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIE5hc2hvcm4gfiBKREs4IGJ1Z1xudmFyIE5BU0hPUk5fQlVHID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmICFuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHsgMTogMiB9LCAxKTtcblxuZXhwb3J0cy5mID0gTkFTSE9STl9CVUcgPyBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShWKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIFYpO1xuICByZXR1cm4gISFkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuZW51bWVyYWJsZTtcbn0gOiBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/object-property-is-enumerable.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-set-prototype-of.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/core-js/internals/object-set-prototype-of.js ***!
+ \*******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var validateSetPrototypeOfArguments = __webpack_require__(/*! ../internals/validate-set-prototype-of-arguments */ \"./node_modules/core-js/internals/validate-set-prototype-of-arguments.js\");\n\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var correctSetter = false;\n var test = {};\n var setter;\n try {\n setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n setter.call(test, []);\n correctSetter = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n validateSetPrototypeOfArguments(O, proto);\n if (correctSetter) setter.call(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qcz9kMmJiIl0sInNvdXJjZXNDb250ZW50IjpbInZhciB2YWxpZGF0ZVNldFByb3RvdHlwZU9mQXJndW1lbnRzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3ZhbGlkYXRlLXNldC1wcm90b3R5cGUtb2YtYXJndW1lbnRzJyk7XG5cbi8vIFdvcmtzIHdpdGggX19wcm90b19fIG9ubHkuIE9sZCB2OCBjYW4ndCB3b3JrIHdpdGggbnVsbCBwcm90byBvYmplY3RzLlxuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICgnX19wcm90b19fJyBpbiB7fSA/IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGNvcnJlY3RTZXR0ZXIgPSBmYWxzZTtcbiAgdmFyIHRlc3QgPSB7fTtcbiAgdmFyIHNldHRlcjtcbiAgdHJ5IHtcbiAgICBzZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQ7XG4gICAgc2V0dGVyLmNhbGwodGVzdCwgW10pO1xuICAgIGNvcnJlY3RTZXR0ZXIgPSB0ZXN0IGluc3RhbmNlb2YgQXJyYXk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKSB7XG4gICAgdmFsaWRhdGVTZXRQcm90b3R5cGVPZkFyZ3VtZW50cyhPLCBwcm90byk7XG4gICAgaWYgKGNvcnJlY3RTZXR0ZXIpIHNldHRlci5jYWxsKE8sIHByb3RvKTtcbiAgICBlbHNlIE8uX19wcm90b19fID0gcHJvdG87XG4gICAgcmV0dXJuIE87XG4gIH07XG59KCkgOiB1bmRlZmluZWQpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/object-set-prototype-of.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-to-string.js":
+/*!************************************************************!*\
+ !*** ./node_modules/core-js/internals/object-to-string.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar classof = __webpack_require__(/*! ../internals/classof */ \"./node_modules/core-js/internals/classof.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\n// `Object.prototype.toString` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nmodule.exports = String(test) !== '[object z]' ? function toString() {\n return '[object ' + classof(this) + ']';\n} : test.toString;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXRvLXN0cmluZy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC10by1zdHJpbmcuanM/YjA0MSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xudmFyIHRlc3QgPSB7fTtcblxudGVzdFtUT19TVFJJTkdfVEFHXSA9ICd6JztcblxuLy8gYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBTdHJpbmcodGVzdCkgIT09ICdbb2JqZWN0IHpdJyA/IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gJ1tvYmplY3QgJyArIGNsYXNzb2YodGhpcykgKyAnXSc7XG59IDogdGVzdC50b1N0cmluZztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/object-to-string.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/own-keys.js":
+/*!****************************************************!*\
+ !*** ./node_modules/core-js/internals/own-keys.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar getOwnPropertyNamesModule = __webpack_require__(/*! ../internals/object-get-own-property-names */ \"./node_modules/core-js/internals/object-get-own-property-names.js\");\nvar getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ \"./node_modules/core-js/internals/object-get-own-property-symbols.js\");\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\n\nvar Reflect = global.Reflect;\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb3duLWtleXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vd24ta2V5cy5qcz81NmVmIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcycpO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG5cbnZhciBSZWZsZWN0ID0gZ2xvYmFsLlJlZmxlY3Q7XG5cbi8vIGFsbCBvYmplY3Qga2V5cywgaW5jbHVkZXMgbm9uLWVudW1lcmFibGUgYW5kIHN5bWJvbHNcbm1vZHVsZS5leHBvcnRzID0gUmVmbGVjdCAmJiBSZWZsZWN0Lm93bktleXMgfHwgZnVuY3Rpb24gb3duS2V5cyhpdCkge1xuICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZihhbk9iamVjdChpdCkpO1xuICB2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmY7XG4gIHJldHVybiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBrZXlzLmNvbmNhdChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpKSA6IGtleXM7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/own-keys.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/path.js":
+/*!************************************************!*\
+ !*** ./node_modules/core-js/internals/path.js ***!
+ \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("module.exports = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGF0aC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BhdGguanM/NDI4ZiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/path.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/perform.js":
+/*!***************************************************!*\
+ !*** ./node_modules/core-js/internals/perform.js ***!
+ \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("module.exports = function (exec) {\n try {\n return { error: false, value: exec() };\n } catch (error) {\n return { error: true, value: error };\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGVyZm9ybS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BlcmZvcm0uanM/ZTY2NyJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHsgZXJyb3I6IGZhbHNlLCB2YWx1ZTogZXhlYygpIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHsgZXJyb3I6IHRydWUsIHZhbHVlOiBlcnJvciB9O1xuICB9XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/perform.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/promise-resolve.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/internals/promise-resolve.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\nvar newPromiseCapability = __webpack_require__(/*! ../internals/new-promise-capability */ \"./node_modules/core-js/internals/new-promise-capability.js\");\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlLmpzP2NkZjkiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQywgeCkge1xuICBhbk9iamVjdChDKTtcbiAgaWYgKGlzT2JqZWN0KHgpICYmIHguY29uc3RydWN0b3IgPT09IEMpIHJldHVybiB4O1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eS5mKEMpO1xuICB2YXIgcmVzb2x2ZSA9IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmU7XG4gIHJlc29sdmUoeCk7XG4gIHJldHVybiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/promise-resolve.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/redefine-all.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/internals/redefine-all.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var redefine = __webpack_require__(/*! ../internals/redefine */ \"./node_modules/core-js/internals/redefine.js\");\n\nmodule.exports = function (target, src, options) {\n for (var key in src) redefine(target, key, src[key], options);\n return target;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsLmpzP2UyY2MiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc3JjLCBvcHRpb25zKSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzcmNba2V5XSwgb3B0aW9ucyk7XG4gIHJldHVybiB0YXJnZXQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/redefine-all.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/redefine.js":
+/*!****************************************************!*\
+ !*** ./node_modules/core-js/internals/redefine.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar shared = __webpack_require__(/*! ../internals/shared */ \"./node_modules/core-js/internals/shared.js\");\nvar hide = __webpack_require__(/*! ../internals/hide */ \"./node_modules/core-js/internals/hide.js\");\nvar has = __webpack_require__(/*! ../internals/has */ \"./node_modules/core-js/internals/has.js\");\nvar setGlobal = __webpack_require__(/*! ../internals/set-global */ \"./node_modules/core-js/internals/set-global.js\");\nvar nativeFunctionToString = __webpack_require__(/*! ../internals/function-to-string */ \"./node_modules/core-js/internals/function-to-string.js\");\nvar InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ \"./node_modules/core-js/internals/internal-state.js\");\n\nvar getInternalState = InternalStateModule.get;\nvar enforceInternalState = InternalStateModule.enforce;\nvar TEMPLATE = String(nativeFunctionToString).split('toString');\n\nshared('inspectSource', function (it) {\n return nativeFunctionToString.call(it);\n});\n\n(module.exports = function (O, key, value, options) {\n var unsafe = options ? !!options.unsafe : false;\n var simple = options ? !!options.enumerable : false;\n var noTargetGet = options ? !!options.noTargetGet : false;\n if (typeof value == 'function') {\n if (typeof key == 'string' && !has(value, 'name')) hide(value, 'name', key);\n enforceInternalState(value).source = TEMPLATE.join(typeof key == 'string' ? key : '');\n }\n if (O === global) {\n if (simple) O[key] = value;\n else setGlobal(key, value);\n return;\n } else if (!unsafe) {\n delete O[key];\n } else if (!noTargetGet && O[key]) {\n simple = true;\n }\n if (simple) O[key] = value;\n else hide(O, key, value);\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, 'toString', function toString() {\n return typeof this == 'function' && getInternalState(this).source || nativeFunctionToString.call(this);\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS5qcz82ZWViIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xudmFyIG5hdGl2ZUZ1bmN0aW9uVG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdG8tc3RyaW5nJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xuXG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0O1xudmFyIGVuZm9yY2VJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5lbmZvcmNlO1xudmFyIFRFTVBMQVRFID0gU3RyaW5nKG5hdGl2ZUZ1bmN0aW9uVG9TdHJpbmcpLnNwbGl0KCd0b1N0cmluZycpO1xuXG5zaGFyZWQoJ2luc3BlY3RTb3VyY2UnLCBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIG5hdGl2ZUZ1bmN0aW9uVG9TdHJpbmcuY2FsbChpdCk7XG59KTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGtleSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgdmFyIHVuc2FmZSA9IG9wdGlvbnMgPyAhIW9wdGlvbnMudW5zYWZlIDogZmFsc2U7XG4gIHZhciBzaW1wbGUgPSBvcHRpb25zID8gISFvcHRpb25zLmVudW1lcmFibGUgOiBmYWxzZTtcbiAgdmFyIG5vVGFyZ2V0R2V0ID0gb3B0aW9ucyA/ICEhb3B0aW9ucy5ub1RhcmdldEdldCA6IGZhbHNlO1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAodHlwZW9mIGtleSA9PSAnc3RyaW5nJyAmJiAhaGFzKHZhbHVlLCAnbmFtZScpKSBoaWRlKHZhbHVlLCAnbmFtZScsIGtleSk7XG4gICAgZW5mb3JjZUludGVybmFsU3RhdGUodmFsdWUpLnNvdXJjZSA9IFRFTVBMQVRFLmpvaW4odHlwZW9mIGtleSA9PSAnc3RyaW5nJyA/IGtleSA6ICcnKTtcbiAgfVxuICBpZiAoTyA9PT0gZ2xvYmFsKSB7XG4gICAgaWYgKHNpbXBsZSkgT1trZXldID0gdmFsdWU7XG4gICAgZWxzZSBzZXRHbG9iYWwoa2V5LCB2YWx1ZSk7XG4gICAgcmV0dXJuO1xuICB9IGVsc2UgaWYgKCF1bnNhZmUpIHtcbiAgICBkZWxldGUgT1trZXldO1xuICB9IGVsc2UgaWYgKCFub1RhcmdldEdldCAmJiBPW2tleV0pIHtcbiAgICBzaW1wbGUgPSB0cnVlO1xuICB9XG4gIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICBlbHNlIGhpZGUoTywga2V5LCB2YWx1ZSk7XG4vLyBhZGQgZmFrZSBGdW5jdGlvbiN0b1N0cmluZyBmb3IgY29ycmVjdCB3b3JrIHdyYXBwZWQgbWV0aG9kcyAvIGNvbnN0cnVjdG9ycyB3aXRoIG1ldGhvZHMgbGlrZSBMb0Rhc2ggaXNOYXRpdmVcbn0pKEZ1bmN0aW9uLnByb3RvdHlwZSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nICYmIGdldEludGVybmFsU3RhdGUodGhpcykuc291cmNlIHx8IG5hdGl2ZUZ1bmN0aW9uVG9TdHJpbmcuY2FsbCh0aGlzKTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/redefine.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/regexp-exec-abstract.js":
+/*!****************************************************************!*\
+ !*** ./node_modules/core-js/internals/regexp-exec-abstract.js ***!
+ \****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var classof = __webpack_require__(/*! ./classof-raw */ \"./node_modules/core-js/internals/classof-raw.js\");\nvar regexpExec = __webpack_require__(/*! ./regexp-exec */ \"./node_modules/core-js/internals/regexp-exec.js\");\n\n// `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n\n if (classof(R) !== 'RegExp') {\n throw TypeError('RegExp#exec called on incompatible receiver');\n }\n\n return regexpExec.call(R, S);\n};\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZXhlYy1hYnN0cmFjdC5qcz8xNGMzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9jbGFzc29mLXJhdycpO1xudmFyIHJlZ2V4cEV4ZWMgPSByZXF1aXJlKCcuL3JlZ2V4cC1leGVjJyk7XG5cbi8vIGBSZWdFeHBFeGVjYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZ2V4cGV4ZWNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFIsIFMpIHtcbiAgdmFyIGV4ZWMgPSBSLmV4ZWM7XG4gIGlmICh0eXBlb2YgZXhlYyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciByZXN1bHQgPSBleGVjLmNhbGwoUiwgUyk7XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ1JlZ0V4cCBleGVjIG1ldGhvZCByZXR1cm5lZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBhbiBPYmplY3Qgb3IgbnVsbCcpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaWYgKGNsYXNzb2YoUikgIT09ICdSZWdFeHAnKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdSZWdFeHAjZXhlYyBjYWxsZWQgb24gaW5jb21wYXRpYmxlIHJlY2VpdmVyJyk7XG4gIH1cblxuICByZXR1cm4gcmVnZXhwRXhlYy5jYWxsKFIsIFMpO1xufTtcblxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/regexp-exec-abstract.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/regexp-exec.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/internals/regexp-exec.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar regexpFlags = __webpack_require__(/*! ./regexp-flags */ \"./node_modules/core-js/internals/regexp-flags.js\");\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/;\n var re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n})();\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + re.source + '$(?!\\\\s)', regexpFlags.call(re));\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n match = nativeExec.call(re, str);\n\n if (UPDATES_LAST_INDEX_WRONG && match) {\n re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZXhlYy5qcz85MjYzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciByZWdleHBGbGFncyA9IHJlcXVpcmUoJy4vcmVnZXhwLWZsYWdzJyk7XG5cbnZhciBuYXRpdmVFeGVjID0gUmVnRXhwLnByb3RvdHlwZS5leGVjO1xuLy8gVGhpcyBhbHdheXMgcmVmZXJzIHRvIHRoZSBuYXRpdmUgaW1wbGVtZW50YXRpb24sIGJlY2F1c2UgdGhlXG4vLyBTdHJpbmcjcmVwbGFjZSBwb2x5ZmlsbCB1c2VzIC4vZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYy5qcyxcbi8vIHdoaWNoIGxvYWRzIHRoaXMgZmlsZSBiZWZvcmUgcGF0Y2hpbmcgdGhlIG1ldGhvZC5cbnZhciBuYXRpdmVSZXBsYWNlID0gU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlO1xuXG52YXIgcGF0Y2hlZEV4ZWMgPSBuYXRpdmVFeGVjO1xuXG52YXIgVVBEQVRFU19MQVNUX0lOREVYX1dST05HID0gKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJlMSA9IC9hLztcbiAgdmFyIHJlMiA9IC9iKi9nO1xuICBuYXRpdmVFeGVjLmNhbGwocmUxLCAnYScpO1xuICBuYXRpdmVFeGVjLmNhbGwocmUyLCAnYScpO1xuICByZXR1cm4gcmUxLmxhc3RJbmRleCAhPT0gMCB8fCByZTIubGFzdEluZGV4ICE9PSAwO1xufSkoKTtcblxuLy8gbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXAsIGNvcGllZCBmcm9tIGVzNS1zaGltJ3MgU3RyaW5nI3NwbGl0IHBhdGNoLlxudmFyIE5QQ0dfSU5DTFVERUQgPSAvKCk/Py8uZXhlYygnJylbMV0gIT09IHVuZGVmaW5lZDtcblxudmFyIFBBVENIID0gVVBEQVRFU19MQVNUX0lOREVYX1dST05HIHx8IE5QQ0dfSU5DTFVERUQ7XG5cbmlmIChQQVRDSCkge1xuICBwYXRjaGVkRXhlYyA9IGZ1bmN0aW9uIGV4ZWMoc3RyKSB7XG4gICAgdmFyIHJlID0gdGhpcztcbiAgICB2YXIgbGFzdEluZGV4LCByZUNvcHksIG1hdGNoLCBpO1xuXG4gICAgaWYgKE5QQ0dfSU5DTFVERUQpIHtcbiAgICAgIHJlQ29weSA9IG5ldyBSZWdFeHAoJ14nICsgcmUuc291cmNlICsgJyQoPyFcXFxccyknLCByZWdleHBGbGFncy5jYWxsKHJlKSk7XG4gICAgfVxuICAgIGlmIChVUERBVEVTX0xBU1RfSU5ERVhfV1JPTkcpIGxhc3RJbmRleCA9IHJlLmxhc3RJbmRleDtcblxuICAgIG1hdGNoID0gbmF0aXZlRXhlYy5jYWxsKHJlLCBzdHIpO1xuXG4gICAgaWYgKFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORyAmJiBtYXRjaCkge1xuICAgICAgcmUubGFzdEluZGV4ID0gcmUuZ2xvYmFsID8gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGggOiBsYXN0SW5kZXg7XG4gICAgfVxuICAgIGlmIChOUENHX0lOQ0xVREVEICYmIG1hdGNoICYmIG1hdGNoLmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIEZpeCBicm93c2VycyB3aG9zZSBgZXhlY2AgbWV0aG9kcyBkb24ndCBjb25zaXN0ZW50bHkgcmV0dXJuIGB1bmRlZmluZWRgXG4gICAgICAvLyBmb3IgTlBDRywgbGlrZSBJRTguIE5PVEU6IFRoaXMgZG9lc24nIHdvcmsgZm9yIC8oLj8pPy9cbiAgICAgIG5hdGl2ZVJlcGxhY2UuY2FsbChtYXRjaFswXSwgcmVDb3B5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoIC0gMjsgaSsrKSB7XG4gICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXSA9PT0gdW5kZWZpbmVkKSBtYXRjaFtpXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGNoZWRFeGVjO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/regexp-exec.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/regexp-flags.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/internals/regexp-flags.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\n\n// `RegExp.prototype.flags` getter implementation\n// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzLmpzP2FkNmQiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG4vLyBgUmVnRXhwLnByb3RvdHlwZS5mbGFnc2AgZ2V0dGVyIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1nZXQtcmVnZXhwLnByb3RvdHlwZS5mbGFnc1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB0aGF0ID0gYW5PYmplY3QodGhpcyk7XG4gIHZhciByZXN1bHQgPSAnJztcbiAgaWYgKHRoYXQuZ2xvYmFsKSByZXN1bHQgKz0gJ2cnO1xuICBpZiAodGhhdC5pZ25vcmVDYXNlKSByZXN1bHQgKz0gJ2knO1xuICBpZiAodGhhdC5tdWx0aWxpbmUpIHJlc3VsdCArPSAnbSc7XG4gIGlmICh0aGF0LnVuaWNvZGUpIHJlc3VsdCArPSAndSc7XG4gIGlmICh0aGF0LnN0aWNreSkgcmVzdWx0ICs9ICd5JztcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/regexp-flags.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/require-object-coercible.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/core-js/internals/require-object-coercible.js ***!
+ \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("// `RequireObjectCoercible` abstract operation\n// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzPzFkODAiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gYFJlcXVpcmVPYmplY3RDb2VyY2libGVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVxdWlyZW9iamVjdGNvZXJjaWJsZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ID09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gXCIgKyBpdCk7XG4gIHJldHVybiBpdDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/require-object-coercible.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/same-value.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/internals/same-value.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("// `SameValue` abstract operation\n// https://tc39.github.io/ecma262/#sec-samevalue\nmodule.exports = Object.is || function is(x, y) {\n // eslint-disable-next-line no-self-compare\n return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2FtZS12YWx1ZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NhbWUtdmFsdWUuanM/MTI5ZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBgU2FtZVZhbHVlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXNhbWV2YWx1ZVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuaXMgfHwgZnVuY3Rpb24gaXMoeCwgeSkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIHJldHVybiB4ID09PSB5ID8geCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHkgOiB4ICE9IHggJiYgeSAhPSB5O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/same-value.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/set-global.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/internals/set-global.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar hide = __webpack_require__(/*! ../internals/hide */ \"./node_modules/core-js/internals/hide.js\");\n\nmodule.exports = function (key, value) {\n try {\n hide(global, key, value);\n } catch (error) {\n global[key] = value;\n } return value;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LWdsb2JhbC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1nbG9iYWwuanM/Y2U0ZSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHRyeSB7XG4gICAgaGlkZShnbG9iYWwsIGtleSwgdmFsdWUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGdsb2JhbFtrZXldID0gdmFsdWU7XG4gIH0gcmV0dXJuIHZhbHVlO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/set-global.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/set-species.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/internals/set-species.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ \"./node_modules/core-js/internals/get-built-in.js\");\nvar definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ \"./node_modules/core-js/internals/object-define-property.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\nvar DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ \"./node_modules/core-js/internals/descriptors.js\");\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n var C = getBuiltIn(CONSTRUCTOR_NAME);\n var defineProperty = definePropertyModule.f;\n if (DESCRIPTORS && C && !C[SPECIES]) defineProperty(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXNwZWNpZXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtc3BlY2llcy5qcz8yNjI2Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUl9OQU1FKSB7XG4gIHZhciBDID0gZ2V0QnVpbHRJbihDT05TVFJVQ1RPUl9OQU1FKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcbiAgaWYgKERFU0NSSVBUT1JTICYmIEMgJiYgIUNbU1BFQ0lFU10pIGRlZmluZVByb3BlcnR5KEMsIFNQRUNJRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9XG4gIH0pO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/set-species.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/set-to-string-tag.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/internals/set-to-string-tag.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ \"./node_modules/core-js/internals/object-define-property.js\").f;\nvar has = __webpack_require__(/*! ../internals/has */ \"./node_modules/core-js/internals/has.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (it, TAG, STATIC) {\n if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {\n defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZy5qcz9kNDRlIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgVEFHLCBTVEFUSUMpIHtcbiAgaWYgKGl0ICYmICFoYXMoaXQgPSBTVEFUSUMgPyBpdCA6IGl0LnByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRykpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShpdCwgVE9fU1RSSU5HX1RBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBUQUcgfSk7XG4gIH1cbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/set-to-string-tag.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/shared-key.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/internals/shared-key.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var shared = __webpack_require__(/*! ../internals/shared */ \"./node_modules/core-js/internals/shared.js\");\nvar uid = __webpack_require__(/*! ../internals/uid */ \"./node_modules/core-js/internals/uid.js\");\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLWtleS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1rZXkuanM/Zjc3MiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcblxudmFyIGtleXMgPSBzaGFyZWQoJ2tleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBrZXlzW2tleV0gfHwgKGtleXNba2V5XSA9IHVpZChrZXkpKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/shared-key.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/shared.js":
+/*!**************************************************!*\
+ !*** ./node_modules/core-js/internals/shared.js ***!
+ \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar setGlobal = __webpack_require__(/*! ../internals/set-global */ \"./node_modules/core-js/internals/set-global.js\");\nvar IS_PURE = __webpack_require__(/*! ../internals/is-pure */ \"./node_modules/core-js/internals/is-pure.js\");\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || setGlobal(SHARED, {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.1.3',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2019 Denis Pushkarev (zloirock.ru)'\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLmpzPzU2OTIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xuXG52YXIgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXyc7XG52YXIgc3RvcmUgPSBnbG9iYWxbU0hBUkVEXSB8fCBzZXRHbG9iYWwoU0hBUkVELCB7fSk7XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoge30pO1xufSkoJ3ZlcnNpb25zJywgW10pLnB1c2goe1xuICB2ZXJzaW9uOiAnMy4xLjMnLFxuICBtb2RlOiBJU19QVVJFID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gIGNvcHlyaWdodDogJ8KpIDIwMTkgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/shared.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/species-constructor.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/core-js/internals/species-constructor.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar aFunction = __webpack_require__(/*! ../internals/a-function */ \"./node_modules/core-js/internals/a-function.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.github.io/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aFunction(S);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3Rvci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanM/NDg0MCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxuLy8gYFNwZWNpZXNDb25zdHJ1Y3RvcmAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zcGVjaWVzY29uc3RydWN0b3Jcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGRlZmF1bHRDb25zdHJ1Y3Rvcikge1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yO1xuICB2YXIgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCAoUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdKSA9PSB1bmRlZmluZWQgPyBkZWZhdWx0Q29uc3RydWN0b3IgOiBhRnVuY3Rpb24oUyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/species-constructor.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/string-at.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/core-js/internals/string-at.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var toInteger = __webpack_require__(/*! ../internals/to-integer */ \"./node_modules/core-js/internals/to-integer.js\");\nvar requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\n\n// CONVERT_TO_STRING: true -> String#at\n// CONVERT_TO_STRING: false -> String#codePointAt\nmodule.exports = function (that, pos, CONVERT_TO_STRING) {\n var S = String(requireObjectCoercible(that));\n var position = toInteger(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = S.charCodeAt(position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING ? S.charAt(position) : first\n : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLWF0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLWF0LmpzP2U1ZDUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxuLy8gQ09OVkVSVF9UT19TVFJJTkc6IHRydWUgIC0+IFN0cmluZyNhdFxuLy8gQ09OVkVSVF9UT19TVFJJTkc6IGZhbHNlIC0+IFN0cmluZyNjb2RlUG9pbnRBdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGhhdCwgcG9zLCBDT05WRVJUX1RPX1NUUklORykge1xuICB2YXIgUyA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoYXQpKTtcbiAgdmFyIHBvc2l0aW9uID0gdG9JbnRlZ2VyKHBvcyk7XG4gIHZhciBzaXplID0gUy5sZW5ndGg7XG4gIHZhciBmaXJzdCwgc2Vjb25kO1xuICBpZiAocG9zaXRpb24gPCAwIHx8IHBvc2l0aW9uID49IHNpemUpIHJldHVybiBDT05WRVJUX1RPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICBmaXJzdCA9IFMuY2hhckNvZGVBdChwb3NpdGlvbik7XG4gIHJldHVybiBmaXJzdCA8IDB4RDgwMCB8fCBmaXJzdCA+IDB4REJGRiB8fCBwb3NpdGlvbiArIDEgPT09IHNpemVcbiAgICB8fCAoc2Vjb25kID0gUy5jaGFyQ29kZUF0KHBvc2l0aW9uICsgMSkpIDwgMHhEQzAwIHx8IHNlY29uZCA+IDB4REZGRlxuICAgICAgPyBDT05WRVJUX1RPX1NUUklORyA/IFMuY2hhckF0KHBvc2l0aW9uKSA6IGZpcnN0XG4gICAgICA6IENPTlZFUlRfVE9fU1RSSU5HID8gUy5zbGljZShwb3NpdGlvbiwgcG9zaXRpb24gKyAyKSA6IChmaXJzdCAtIDB4RDgwMCA8PCAxMCkgKyAoc2Vjb25kIC0gMHhEQzAwKSArIDB4MTAwMDA7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/string-at.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/string-pad.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/internals/string-pad.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("// https://github.com/tc39/proposal-string-pad-start-end\nvar toLength = __webpack_require__(/*! ../internals/to-length */ \"./node_modules/core-js/internals/to-length.js\");\nvar repeat = __webpack_require__(/*! ../internals/string-repeat */ \"./node_modules/core-js/internals/string-repeat.js\");\nvar requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\n\nmodule.exports = function (that, maxLength, fillString, left) {\n var S = String(requireObjectCoercible(that));\n var stringLength = S.length;\n var fillStr = fillString === undefined ? ' ' : String(fillString);\n var intMaxLength = toLength(maxLength);\n var fillLen, stringFiller;\n if (intMaxLength <= stringLength || fillStr == '') return S;\n fillLen = intMaxLength - stringLength;\n stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));\n if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n return left ? stringFiller + S : S + stringFiller;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXBhZC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1wYWQuanM/MGNjYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zdHJpbmctcGFkLXN0YXJ0LWVuZFxudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIHJlcGVhdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctcmVwZWF0Jyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGhhdCwgbWF4TGVuZ3RoLCBmaWxsU3RyaW5nLCBsZWZ0KSB7XG4gIHZhciBTID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhhdCkpO1xuICB2YXIgc3RyaW5nTGVuZ3RoID0gUy5sZW5ndGg7XG4gIHZhciBmaWxsU3RyID0gZmlsbFN0cmluZyA9PT0gdW5kZWZpbmVkID8gJyAnIDogU3RyaW5nKGZpbGxTdHJpbmcpO1xuICB2YXIgaW50TWF4TGVuZ3RoID0gdG9MZW5ndGgobWF4TGVuZ3RoKTtcbiAgdmFyIGZpbGxMZW4sIHN0cmluZ0ZpbGxlcjtcbiAgaWYgKGludE1heExlbmd0aCA8PSBzdHJpbmdMZW5ndGggfHwgZmlsbFN0ciA9PSAnJykgcmV0dXJuIFM7XG4gIGZpbGxMZW4gPSBpbnRNYXhMZW5ndGggLSBzdHJpbmdMZW5ndGg7XG4gIHN0cmluZ0ZpbGxlciA9IHJlcGVhdC5jYWxsKGZpbGxTdHIsIE1hdGguY2VpbChmaWxsTGVuIC8gZmlsbFN0ci5sZW5ndGgpKTtcbiAgaWYgKHN0cmluZ0ZpbGxlci5sZW5ndGggPiBmaWxsTGVuKSBzdHJpbmdGaWxsZXIgPSBzdHJpbmdGaWxsZXIuc2xpY2UoMCwgZmlsbExlbik7XG4gIHJldHVybiBsZWZ0ID8gc3RyaW5nRmlsbGVyICsgUyA6IFMgKyBzdHJpbmdGaWxsZXI7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/string-pad.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/string-repeat.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/internals/string-repeat.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar toInteger = __webpack_require__(/*! ../internals/to-integer */ \"./node_modules/core-js/internals/to-integer.js\");\nvar requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\n\n// `String.prototype.repeat` method implementation\n// https://tc39.github.io/ecma262/#sec-string.prototype.repeat\nmodule.exports = ''.repeat || function repeat(count) {\n var str = String(requireObjectCoercible(this));\n var result = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError('Wrong number of repetitions');\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str;\n return result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXJlcGVhdC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1yZXBlYXQuanM/MTE0OCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5yZXBlYXRgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5yZXBlYXRcbm1vZHVsZS5leHBvcnRzID0gJycucmVwZWF0IHx8IGZ1bmN0aW9uIHJlcGVhdChjb3VudCkge1xuICB2YXIgc3RyID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIHZhciBuID0gdG9JbnRlZ2VyKGNvdW50KTtcbiAgaWYgKG4gPCAwIHx8IG4gPT0gSW5maW5pdHkpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIG51bWJlciBvZiByZXBldGl0aW9ucycpO1xuICBmb3IgKDtuID4gMDsgKG4gPj4+PSAxKSAmJiAoc3RyICs9IHN0cikpIGlmIChuICYgMSkgcmVzdWx0ICs9IHN0cjtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/string-repeat.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/string-trim.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/internals/string-trim.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\nvar whitespaces = __webpack_require__(/*! ../internals/whitespaces */ \"./node_modules/core-js/internals/whitespaces.js\");\n\nvar whitespace = '[' + whitespaces + ']';\nvar ltrim = RegExp('^' + whitespace + whitespace + '*');\nvar rtrim = RegExp(whitespace + whitespace + '*$');\n\n// 1 -> String#trimStart\n// 2 -> String#trimEnd\n// 3 -> String#trim\nmodule.exports = function (string, TYPE) {\n string = String(requireObjectCoercible(string));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0uanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS5qcz81OGE4Il0sInNvdXJjZXNDb250ZW50IjpbInZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xudmFyIHdoaXRlc3BhY2VzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3doaXRlc3BhY2VzJyk7XG5cbnZhciB3aGl0ZXNwYWNlID0gJ1snICsgd2hpdGVzcGFjZXMgKyAnXSc7XG52YXIgbHRyaW0gPSBSZWdFeHAoJ14nICsgd2hpdGVzcGFjZSArIHdoaXRlc3BhY2UgKyAnKicpO1xudmFyIHJ0cmltID0gUmVnRXhwKHdoaXRlc3BhY2UgKyB3aGl0ZXNwYWNlICsgJyokJyk7XG5cbi8vIDEgLT4gU3RyaW5nI3RyaW1TdGFydFxuLy8gMiAtPiBTdHJpbmcjdHJpbUVuZFxuLy8gMyAtPiBTdHJpbmcjdHJpbVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RyaW5nLCBUWVBFKSB7XG4gIHN0cmluZyA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHN0cmluZykpO1xuICBpZiAoVFlQRSAmIDEpIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGx0cmltLCAnJyk7XG4gIGlmIChUWVBFICYgMikgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocnRyaW0sICcnKTtcbiAgcmV0dXJuIHN0cmluZztcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/string-trim.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/task.js":
+/*!************************************************!*\
+ !*** ./node_modules/core-js/internals/task.js ***!
+ \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar classof = __webpack_require__(/*! ../internals/classof-raw */ \"./node_modules/core-js/internals/classof-raw.js\");\nvar bind = __webpack_require__(/*! ../internals/bind-context */ \"./node_modules/core-js/internals/bind-context.js\");\nvar html = __webpack_require__(/*! ../internals/html */ \"./node_modules/core-js/internals/html.js\");\nvar createElement = __webpack_require__(/*! ../internals/document-create-element */ \"./node_modules/core-js/internals/document-create-element.js\");\n\nvar location = global.location;\nvar set = global.setImmediate;\nvar clear = global.clearImmediate;\nvar process = global.process;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\n\nvar run = function (id) {\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\n\nvar runner = function (id) {\n return function () {\n run(id);\n };\n};\n\nvar listener = function (event) {\n run(event.data);\n};\n\nvar post = function (id) {\n // old engines have not location.origin\n global.postMessage(id + '', location.protocol + '//' + location.host);\n};\n\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!set || !clear) {\n set = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args);\n };\n defer(counter);\n return counter;\n };\n clear = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (classof(process) == 'process') {\n defer = function (id) {\n process.nextTick(runner(id));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(runner(id));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = bind(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts && !fails(post)) {\n defer = post;\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in createElement('script')) {\n defer = function (id) {\n html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(runner(id), 0);\n };\n }\n}\n\nmodule.exports = {\n set: set,\n clear: clear\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdGFzay5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Rhc2suanM/MmNmNCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYmluZC1jb250ZXh0Jyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9odG1sJyk7XG52YXIgY3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xuXG52YXIgbG9jYXRpb24gPSBnbG9iYWwubG9jYXRpb247XG52YXIgc2V0ID0gZ2xvYmFsLnNldEltbWVkaWF0ZTtcbnZhciBjbGVhciA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZTtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgTWVzc2FnZUNoYW5uZWwgPSBnbG9iYWwuTWVzc2FnZUNoYW5uZWw7XG52YXIgRGlzcGF0Y2ggPSBnbG9iYWwuRGlzcGF0Y2g7XG52YXIgY291bnRlciA9IDA7XG52YXIgcXVldWUgPSB7fTtcbnZhciBPTlJFQURZU1RBVEVDSEFOR0UgPSAnb25yZWFkeXN0YXRlY2hhbmdlJztcbnZhciBkZWZlciwgY2hhbm5lbCwgcG9ydDtcblxudmFyIHJ1biA9IGZ1bmN0aW9uIChpZCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gIGlmIChxdWV1ZS5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICB2YXIgZm4gPSBxdWV1ZVtpZF07XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgICBmbigpO1xuICB9XG59O1xuXG52YXIgcnVubmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcnVuKGlkKTtcbiAgfTtcbn07XG5cbnZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCkge1xuICBydW4oZXZlbnQuZGF0YSk7XG59O1xuXG52YXIgcG9zdCA9IGZ1bmN0aW9uIChpZCkge1xuICAvLyBvbGQgZW5naW5lcyBoYXZlIG5vdCBsb2NhdGlvbi5vcmlnaW5cbiAgZ2xvYmFsLnBvc3RNZXNzYWdlKGlkICsgJycsIGxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIGxvY2F0aW9uLmhvc3QpO1xufTtcblxuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYgKCFzZXQgfHwgIWNsZWFyKSB7XG4gIHNldCA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmbikge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgdmFyIGkgPSAxO1xuICAgIHdoaWxlIChhcmd1bWVudHMubGVuZ3RoID4gaSkgYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gICAgICAodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSkuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICB9O1xuICAgIGRlZmVyKGNvdW50ZXIpO1xuICAgIHJldHVybiBjb3VudGVyO1xuICB9O1xuICBjbGVhciA9IGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGlkKSB7XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgfTtcbiAgLy8gTm9kZS5qcyAwLjgtXG4gIGlmIChjbGFzc29mKHByb2Nlc3MpID09ICdwcm9jZXNzJykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKHJ1bm5lcihpZCkpO1xuICAgIH07XG4gIC8vIFNwaGVyZSAoSlMgZ2FtZSBlbmdpbmUpIERpc3BhdGNoIEFQSVxuICB9IGVsc2UgaWYgKERpc3BhdGNoICYmIERpc3BhdGNoLm5vdykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBEaXNwYXRjaC5ub3cocnVubmVyKGlkKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICB9IGVsc2UgaWYgKE1lc3NhZ2VDaGFubmVsKSB7XG4gICAgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgIHBvcnQgPSBjaGFubmVsLnBvcnQyO1xuICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbGlzdGVuZXI7XG4gICAgZGVmZXIgPSBiaW5kKHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQsIDEpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMgJiYgIWZhaWxzKHBvc3QpKSB7XG4gICAgZGVmZXIgPSBwb3N0O1xuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYgKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4oaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBzZXRUaW1lb3V0KHJ1bm5lcihpZCksIDApO1xuICAgIH07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBjbGVhcjogY2xlYXJcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/task.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/to-absolute-index.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/internals/to-absolute-index.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var toInteger = __webpack_require__(/*! ../internals/to-integer */ \"./node_modules/core-js/internals/to-integer.js\");\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(length, length).\nmodule.exports = function (index, length) {\n var integer = toInteger(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcz8yM2NiIl0sInNvdXJjZXNDb250ZW50IjpbInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlcicpO1xuXG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIEhlbHBlciBmb3IgYSBwb3B1bGFyIHJlcGVhdGluZyBjYXNlIG9mIHRoZSBzcGVjOlxuLy8gTGV0IGludGVnZXIgYmUgPyBUb0ludGVnZXIoaW5kZXgpLlxuLy8gSWYgaW50ZWdlciA8IDAsIGxldCByZXN1bHQgYmUgbWF4KChsZW5ndGggKyBpbnRlZ2VyKSwgMCk7IGVsc2UgbGV0IHJlc3VsdCBiZSBtaW4obGVuZ3RoLCBsZW5ndGgpLlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5kZXgsIGxlbmd0aCkge1xuICB2YXIgaW50ZWdlciA9IHRvSW50ZWdlcihpbmRleCk7XG4gIHJldHVybiBpbnRlZ2VyIDwgMCA/IG1heChpbnRlZ2VyICsgbGVuZ3RoLCAwKSA6IG1pbihpbnRlZ2VyLCBsZW5ndGgpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/to-absolute-index.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/to-indexed-object.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/internals/to-indexed-object.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ \"./node_modules/core-js/internals/indexed-object.js\");\nvar requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcz9mYzZhIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmRleGVkLW9iamVjdCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBJbmRleGVkT2JqZWN0KHJlcXVpcmVPYmplY3RDb2VyY2libGUoaXQpKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/to-indexed-object.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/to-integer.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/internals/to-integer.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("var ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `ToInteger` abstract operation\n// https://tc39.github.io/ecma262/#sec-tointeger\nmodule.exports = function (argument) {\n return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWludGVnZXIuanM/YTY5MSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5cbi8vIGBUb0ludGVnZXJgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9pbnRlZ2VyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gaXNOYU4oYXJndW1lbnQgPSArYXJndW1lbnQpID8gMCA6IChhcmd1bWVudCA+IDAgPyBmbG9vciA6IGNlaWwpKGFyZ3VtZW50KTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/to-integer.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/to-length.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/core-js/internals/to-length.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var toInteger = __webpack_require__(/*! ../internals/to-integer */ \"./node_modules/core-js/internals/to-integer.js\");\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.github.io/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzPzUwYzQiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyJyk7XG5cbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gYFRvTGVuZ3RoYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvbGVuZ3RoXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gYXJndW1lbnQgPiAwID8gbWluKHRvSW50ZWdlcihhcmd1bWVudCksIDB4MUZGRkZGRkZGRkZGRkYpIDogMDsgLy8gMiAqKiA1MyAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/to-length.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/to-object.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/core-js/internals/to-object.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\n\n// `ToObject` abstract operation\n// https://tc39.github.io/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return Object(requireObjectCoercible(argument));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzPzdiMGIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbi8vIGBUb09iamVjdGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b29iamVjdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/to-object.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/to-primitive.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/internals/to-primitive.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\n\n// 7.1.1 ToPrimitive(input [, PreferredType])\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlLmpzP2MwNGUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG4vLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbi8vIGluc3RlYWQgb2YgdGhlIEVTNiBzcGVjIHZlcnNpb24sIHdlIGRpZG4ndCBpbXBsZW1lbnQgQEB0b1ByaW1pdGl2ZSBjYXNlXG4vLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFMpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHJldHVybiBpdDtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmIChTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAodHlwZW9mIChmbiA9IGl0LnZhbHVlT2YpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKCFTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/to-primitive.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/uid.js":
+/*!***********************************************!*\
+ !*** ./node_modules/core-js/internals/uid.js ***!
+ \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("var id = 0;\nvar postfix = Math.random();\n\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + postfix).toString(36));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdWlkLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdWlkLmpzPzkwZTMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlkID0gMDtcbnZhciBwb3N0Zml4ID0gTWF0aC5yYW5kb20oKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAnU3ltYm9sKCcuY29uY2F0KGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXksICcpXycsICgrK2lkICsgcG9zdGZpeCkudG9TdHJpbmcoMzYpKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/uid.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/user-agent.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/internals/user-agent.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\n\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdXNlci1hZ2VudC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VzZXItYWdlbnQuanM/YjM5YSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG52YXIgbmF2aWdhdG9yID0gZ2xvYmFsLm5hdmlnYXRvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBuYXZpZ2F0b3IgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCB8fCAnJztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/user-agent.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/validate-set-prototype-of-arguments.js":
+/*!*******************************************************************************!*\
+ !*** ./node_modules/core-js/internals/validate-set-prototype-of-arguments.js ***!
+ \*******************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\n\nmodule.exports = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) {\n throw TypeError(\"Can't set \" + String(proto) + ' as a prototype');\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdmFsaWRhdGUtc2V0LXByb3RvdHlwZS1vZi1hcmd1bWVudHMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92YWxpZGF0ZS1zZXQtcHJvdG90eXBlLW9mLWFyZ3VtZW50cy5qcz8yZTFhIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgcHJvdG8pIHtcbiAgYW5PYmplY3QoTyk7XG4gIGlmICghaXNPYmplY3QocHJvdG8pICYmIHByb3RvICE9PSBudWxsKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3Qgc2V0IFwiICsgU3RyaW5nKHByb3RvKSArICcgYXMgYSBwcm90b3R5cGUnKTtcbiAgfVxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/validate-set-prototype-of-arguments.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/validate-string-method-arguments.js":
+/*!****************************************************************************!*\
+ !*** ./node_modules/core-js/internals/validate-string-method-arguments.js ***!
+ \****************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = __webpack_require__(/*! ../internals/is-regexp */ \"./node_modules/core-js/internals/is-regexp.js\");\nvar requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\n\nmodule.exports = function (that, searchString, NAME) {\n if (isRegExp(searchString)) {\n throw TypeError('String.prototype.' + NAME + \" doesn't accept regex\");\n } return String(requireObjectCoercible(that));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdmFsaWRhdGUtc3RyaW5nLW1ldGhvZC1hcmd1bWVudHMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92YWxpZGF0ZS1zdHJpbmctbWV0aG9kLWFyZ3VtZW50cy5qcz8zNDBlIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGhlbHBlciBmb3IgU3RyaW5nI3tzdGFydHNXaXRoLCBlbmRzV2l0aCwgaW5jbHVkZXN9XG52YXIgaXNSZWdFeHAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcmVnZXhwJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGhhdCwgc2VhcmNoU3RyaW5nLCBOQU1FKSB7XG4gIGlmIChpc1JlZ0V4cChzZWFyY2hTdHJpbmcpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdTdHJpbmcucHJvdG90eXBlLicgKyBOQU1FICsgXCIgZG9lc24ndCBhY2NlcHQgcmVnZXhcIik7XG4gIH0gcmV0dXJuIFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoYXQpKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/validate-string-method-arguments.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/webkit-string-pad-bug.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/core-js/internals/webkit-string-pad-bug.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("// https://github.com/zloirock/core-js/issues/280\nvar userAgent = __webpack_require__(/*! ../internals/user-agent */ \"./node_modules/core-js/internals/user-agent.js\");\n\n// eslint-disable-next-line unicorn/no-unsafe-regex\nmodule.exports = /Version\\/10\\.\\d+(\\.\\d+)?( Mobile\\/\\w+)? Safari\\//.test(userAgent);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2Via2l0LXN0cmluZy1wYWQtYnVnLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2Via2l0LXN0cmluZy1wYWQtYnVnLmpzPzY5OWMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzI4MFxudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91c2VyLWFnZW50Jyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLXVuc2FmZS1yZWdleFxubW9kdWxlLmV4cG9ydHMgPSAvVmVyc2lvblxcLzEwXFwuXFxkKyhcXC5cXGQrKT8oIE1vYmlsZVxcL1xcdyspPyBTYWZhcmlcXC8vLnRlc3QodXNlckFnZW50KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/webkit-string-pad-bug.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/well-known-symbol.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/internals/well-known-symbol.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar shared = __webpack_require__(/*! ../internals/shared */ \"./node_modules/core-js/internals/shared.js\");\nvar uid = __webpack_require__(/*! ../internals/uid */ \"./node_modules/core-js/internals/uid.js\");\nvar NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ \"./node_modules/core-js/internals/native-symbol.js\");\n\nvar Symbol = global.Symbol;\nvar store = shared('wks');\n\nmodule.exports = function (name) {\n return store[name] || (store[name] = NATIVE_SYMBOL && Symbol[name]\n || (NATIVE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcz9iNjIyIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcbnZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS1zeW1ib2wnKTtcblxudmFyIFN5bWJvbCA9IGdsb2JhbC5TeW1ib2w7XG52YXIgc3RvcmUgPSBzaGFyZWQoJ3drcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiBzdG9yZVtuYW1lXSB8fCAoc3RvcmVbbmFtZV0gPSBOQVRJVkVfU1lNQk9MICYmIFN5bWJvbFtuYW1lXVxuICAgIHx8IChOQVRJVkVfU1lNQk9MID8gU3ltYm9sIDogdWlkKSgnU3ltYm9sLicgKyBuYW1lKSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/well-known-symbol.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/whitespaces.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/internals/whitespaces.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("// a string of all valid unicode whitespaces\n// eslint-disable-next-line max-len\nmodule.exports = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2hpdGVzcGFjZXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93aGl0ZXNwYWNlcy5qcz81ODk5Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIGEgc3RyaW5nIG9mIGFsbCB2YWxpZCB1bmljb2RlIHdoaXRlc3BhY2VzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxubW9kdWxlLmV4cG9ydHMgPSAnXFx1MDAwOVxcdTAwMEFcXHUwMDBCXFx1MDAwQ1xcdTAwMERcXHUwMDIwXFx1MDBBMFxcdTE2ODBcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwQVxcdTIwMkZcXHUyMDVGXFx1MzAwMFxcdTIwMjhcXHUyMDI5XFx1RkVGRic7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/whitespaces.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.iterator.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.iterator.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ \"./node_modules/core-js/internals/to-indexed-object.js\");\nvar addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ \"./node_modules/core-js/internals/add-to-unscopables.js\");\nvar Iterators = __webpack_require__(/*! ../internals/iterators */ \"./node_modules/core-js/internals/iterators.js\");\nvar InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ \"./node_modules/core-js/internals/internal-state.js\");\nvar defineIterator = __webpack_require__(/*! ../internals/define-iterator */ \"./node_modules/core-js/internals/define-iterator.js\");\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.github.io/ecma262/#sec-createarrayiterator\nmodule.exports = defineIterator(Array, 'Array', function (iterated, kind) {\n setInternalState(this, {\n type: ARRAY_ITERATOR,\n target: toIndexedObject(iterated), // target\n index: 0, // next index\n kind: kind // kind\n });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n var state = getInternalState(this);\n var target = state.target;\n var kind = state.kind;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = undefined;\n return { value: undefined, done: true };\n }\n if (kind == 'keys') return { value: index, done: false };\n if (kind == 'values') return { value: target[index], done: false };\n return { value: [index, target[index]], done: false };\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject\nIterators.Arguments = Iterators.Array;\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yLmpzP2UyNjAiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBkZWZpbmVJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3InKTtcblxudmFyIEFSUkFZX0lURVJBVE9SID0gJ0FycmF5IEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKEFSUkFZX0lURVJBVE9SKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5lbnRyaWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5lbnRyaWVzXG4vLyBgQXJyYXkucHJvdG90eXBlLmtleXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmtleXNcbi8vIGBBcnJheS5wcm90b3R5cGUudmFsdWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS52YWx1ZXNcbi8vIGBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAaXRlcmF0b3Jcbi8vIGBDcmVhdGVBcnJheUl0ZXJhdG9yYCBpbnRlcm5hbCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWNyZWF0ZWFycmF5aXRlcmF0b3Jcbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lSXRlcmF0b3IoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICB0eXBlOiBBUlJBWV9JVEVSQVRPUixcbiAgICB0YXJnZXQ6IHRvSW5kZXhlZE9iamVjdChpdGVyYXRlZCksIC8vIHRhcmdldFxuICAgIGluZGV4OiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICAgIGtpbmQ6IGtpbmQgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2luZFxuICB9KTtcbi8vIGAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0lYXJyYXlpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgdGFyZ2V0ID0gc3RhdGUudGFyZ2V0O1xuICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7XG4gIHZhciBpbmRleCA9IHN0YXRlLmluZGV4Kys7XG4gIGlmICghdGFyZ2V0IHx8IGluZGV4ID49IHRhcmdldC5sZW5ndGgpIHtcbiAgICBzdGF0ZS50YXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG4gIGlmIChraW5kID09ICdrZXlzJykgcmV0dXJuIHsgdmFsdWU6IGluZGV4LCBkb25lOiBmYWxzZSB9O1xuICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIHsgdmFsdWU6IHRhcmdldFtpbmRleF0sIGRvbmU6IGZhbHNlIH07XG4gIHJldHVybiB7IHZhbHVlOiBbaW5kZXgsIHRhcmdldFtpbmRleF1dLCBkb25lOiBmYWxzZSB9O1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyVcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWNyZWF0ZXVubWFwcGVkYXJndW1lbnRzb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1jcmVhdGVtYXBwZWRhcmd1bWVudHNvYmplY3Rcbkl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.array.iterator.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.object.to-string.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.object.to-string.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var redefine = __webpack_require__(/*! ../internals/redefine */ \"./node_modules/core-js/internals/redefine.js\");\nvar toString = __webpack_require__(/*! ../internals/object-to-string */ \"./node_modules/core-js/internals/object-to-string.js\");\n\nvar ObjectPrototype = Object.prototype;\n\n// `Object.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nif (toString !== ObjectPrototype.toString) {\n redefine(ObjectPrototype, 'toString', toString, { unsafe: true });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZy5qcz9kM2I3Il0sInNvdXJjZXNDb250ZW50IjpbInZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC10by1zdHJpbmcnKTtcblxudmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8vIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmdcbmlmICh0b1N0cmluZyAhPT0gT2JqZWN0UHJvdG90eXBlLnRvU3RyaW5nKSB7XG4gIHJlZGVmaW5lKE9iamVjdFByb3RvdHlwZSwgJ3RvU3RyaW5nJywgdG9TdHJpbmcsIHsgdW5zYWZlOiB0cnVlIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.object.to-string.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.promise.finally.js":
+/*!************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.promise.finally.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ \"./node_modules/core-js/internals/get-built-in.js\");\nvar speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ \"./node_modules/core-js/internals/species-constructor.js\");\nvar promiseResolve = __webpack_require__(/*! ../internals/promise-resolve */ \"./node_modules/core-js/internals/promise-resolve.js\");\n\n// `Promise.prototype.finally` method\n// https://tc39.github.io/ecma262/#sec-promise.prototype.finally\n$({ target: 'Promise', proto: true, real: true }, {\n 'finally': function (onFinally) {\n var C = speciesConstructor(this, getBuiltIn('Promise'));\n var isFunction = typeof onFinally == 'function';\n return this.then(\n isFunction ? function (x) {\n return promiseResolve(C, onFinally()).then(function () { return x; });\n } : onFinally,\n isFunction ? function (e) {\n return promiseResolve(C, onFinally()).then(function () { throw e; });\n } : onFinally\n );\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuZmluYWxseS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmZpbmFsbHkuanM/YTc5ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlJyk7XG5cbi8vIGBQcm9taXNlLnByb3RvdHlwZS5maW5hbGx5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLmZpbmFsbHlcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUgfSwge1xuICAnZmluYWxseSc6IGZ1bmN0aW9uIChvbkZpbmFsbHkpIHtcbiAgICB2YXIgQyA9IHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBnZXRCdWlsdEluKCdQcm9taXNlJykpO1xuICAgIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIG9uRmluYWxseSA9PSAnZnVuY3Rpb24nO1xuICAgIHJldHVybiB0aGlzLnRoZW4oXG4gICAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHg7IH0pO1xuICAgICAgfSA6IG9uRmluYWxseSxcbiAgICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyB0aHJvdyBlOyB9KTtcbiAgICAgIH0gOiBvbkZpbmFsbHlcbiAgICApO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.promise.finally.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.promise.js":
+/*!****************************************************!*\
+ !*** ./node_modules/core-js/modules/es.promise.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar IS_PURE = __webpack_require__(/*! ../internals/is-pure */ \"./node_modules/core-js/internals/is-pure.js\");\nvar global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar path = __webpack_require__(/*! ../internals/path */ \"./node_modules/core-js/internals/path.js\");\nvar redefineAll = __webpack_require__(/*! ../internals/redefine-all */ \"./node_modules/core-js/internals/redefine-all.js\");\nvar setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ \"./node_modules/core-js/internals/set-to-string-tag.js\");\nvar setSpecies = __webpack_require__(/*! ../internals/set-species */ \"./node_modules/core-js/internals/set-species.js\");\nvar isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\nvar aFunction = __webpack_require__(/*! ../internals/a-function */ \"./node_modules/core-js/internals/a-function.js\");\nvar anInstance = __webpack_require__(/*! ../internals/an-instance */ \"./node_modules/core-js/internals/an-instance.js\");\nvar classof = __webpack_require__(/*! ../internals/classof-raw */ \"./node_modules/core-js/internals/classof-raw.js\");\nvar iterate = __webpack_require__(/*! ../internals/iterate */ \"./node_modules/core-js/internals/iterate.js\");\nvar checkCorrectnessOfIteration = __webpack_require__(/*! ../internals/check-correctness-of-iteration */ \"./node_modules/core-js/internals/check-correctness-of-iteration.js\");\nvar speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ \"./node_modules/core-js/internals/species-constructor.js\");\nvar task = __webpack_require__(/*! ../internals/task */ \"./node_modules/core-js/internals/task.js\").set;\nvar microtask = __webpack_require__(/*! ../internals/microtask */ \"./node_modules/core-js/internals/microtask.js\");\nvar promiseResolve = __webpack_require__(/*! ../internals/promise-resolve */ \"./node_modules/core-js/internals/promise-resolve.js\");\nvar hostReportErrors = __webpack_require__(/*! ../internals/host-report-errors */ \"./node_modules/core-js/internals/host-report-errors.js\");\nvar newPromiseCapabilityModule = __webpack_require__(/*! ../internals/new-promise-capability */ \"./node_modules/core-js/internals/new-promise-capability.js\");\nvar perform = __webpack_require__(/*! ../internals/perform */ \"./node_modules/core-js/internals/perform.js\");\nvar userAgent = __webpack_require__(/*! ../internals/user-agent */ \"./node_modules/core-js/internals/user-agent.js\");\nvar InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ \"./node_modules/core-js/internals/internal-state.js\");\nvar isForced = __webpack_require__(/*! ../internals/is-forced */ \"./node_modules/core-js/internals/is-forced.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar SPECIES = wellKnownSymbol('species');\nvar PROMISE = 'Promise';\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar getInternalPromiseState = InternalStateModule.getterFor(PROMISE);\nvar PromiseConstructor = global[PROMISE];\nvar TypeError = global.TypeError;\nvar document = global.document;\nvar process = global.process;\nvar $fetch = global.fetch;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\nvar newPromiseCapability = newPromiseCapabilityModule.f;\nvar newGenericPromiseCapability = newPromiseCapability;\nvar IS_NODE = classof(process) == 'process';\nvar DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent);\nvar UNHANDLED_REJECTION = 'unhandledrejection';\nvar REJECTION_HANDLED = 'rejectionhandled';\nvar PENDING = 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\nvar HANDLED = 1;\nvar UNHANDLED = 2;\nvar Internal, OwnPromiseCapability, PromiseWrapper;\n\nvar FORCED = isForced(PROMISE, function () {\n // correct subclassing with @@species support\n var promise = PromiseConstructor.resolve(1);\n var empty = function () { /* empty */ };\n var FakePromise = (promise.constructor = {})[SPECIES] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return !((IS_NODE || typeof PromiseRejectionEvent == 'function')\n && (!IS_PURE || promise['finally'])\n && promise.then(empty) instanceof FakePromise\n // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // we can't detect it synchronously, so just check versions\n && v8.indexOf('6.6') !== 0\n && userAgent.indexOf('Chrome/66') === -1);\n});\n\nvar INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) {\n PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });\n});\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\n\nvar notify = function (promise, state, isReject) {\n if (state.notified) return;\n state.notified = true;\n var chain = state.reactions;\n microtask(function () {\n var value = state.value;\n var ok = state.state == FULFILLED;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then, exited;\n try {\n if (handler) {\n if (!ok) {\n if (state.rejection === UNHANDLED) onHandleUnhandled(promise, state);\n state.rejection = HANDLED;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // may throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (error) {\n if (domain && !exited) domain.exit();\n reject(error);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n state.reactions = [];\n state.notified = false;\n if (isReject && !state.rejection) onUnhandled(promise, state);\n });\n};\n\nvar dispatchEvent = function (name, promise, reason) {\n var event, handler;\n if (DISPATCH_EVENT) {\n event = document.createEvent('Event');\n event.promise = promise;\n event.reason = reason;\n event.initEvent(name, false, true);\n global.dispatchEvent(event);\n } else event = { promise: promise, reason: reason };\n if (handler = global['on' + name]) handler(event);\n else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n};\n\nvar onUnhandled = function (promise, state) {\n task.call(global, function () {\n var value = state.value;\n var IS_UNHANDLED = isUnhandled(state);\n var result;\n if (IS_UNHANDLED) {\n result = perform(function () {\n if (IS_NODE) {\n process.emit('unhandledRejection', value, promise);\n } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED;\n if (result.error) throw result.value;\n }\n });\n};\n\nvar isUnhandled = function (state) {\n return state.rejection !== HANDLED && !state.parent;\n};\n\nvar onHandleUnhandled = function (promise, state) {\n task.call(global, function () {\n if (IS_NODE) {\n process.emit('rejectionHandled', promise);\n } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n });\n};\n\nvar bind = function (fn, promise, state, unwrap) {\n return function (value) {\n fn(promise, state, value, unwrap);\n };\n};\n\nvar internalReject = function (promise, state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n state.value = value;\n state.state = REJECTED;\n notify(promise, state, true);\n};\n\nvar internalResolve = function (promise, state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n var then = isThenable(value);\n if (then) {\n microtask(function () {\n var wrapper = { done: false };\n try {\n then.call(value,\n bind(internalResolve, promise, wrapper, state),\n bind(internalReject, promise, wrapper, state)\n );\n } catch (error) {\n internalReject(promise, wrapper, error, state);\n }\n });\n } else {\n state.value = value;\n state.state = FULFILLED;\n notify(promise, state, false);\n }\n } catch (error) {\n internalReject(promise, { done: false }, error, state);\n }\n};\n\n// constructor polyfill\nif (FORCED) {\n // 25.4.3.1 Promise(executor)\n PromiseConstructor = function Promise(executor) {\n anInstance(this, PromiseConstructor, PROMISE);\n aFunction(executor);\n Internal.call(this);\n var state = getInternalState(this);\n try {\n executor(bind(internalResolve, this, state), bind(internalReject, this, state));\n } catch (error) {\n internalReject(this, state, error);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n setInternalState(this, {\n type: PROMISE,\n done: false,\n notified: false,\n parent: false,\n reactions: [],\n rejection: false,\n state: PENDING,\n value: undefined\n });\n };\n Internal.prototype = redefineAll(PromiseConstructor.prototype, {\n // `Promise.prototype.then` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.then\n then: function then(onFulfilled, onRejected) {\n var state = getInternalPromiseState(this);\n var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = IS_NODE ? process.domain : undefined;\n state.parent = true;\n state.reactions.push(reaction);\n if (state.state != PENDING) notify(this, state, false);\n return reaction.promise;\n },\n // `Promise.prototype.catch` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.catch\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n var state = getInternalState(promise);\n this.promise = promise;\n this.resolve = bind(internalResolve, promise, state);\n this.reject = bind(internalReject, promise, state);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === PromiseConstructor || C === PromiseWrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n\n // wrap fetch result\n if (!IS_PURE && typeof $fetch == 'function') $({ global: true, enumerable: true, forced: true }, {\n // eslint-disable-next-line no-unused-vars\n fetch: function fetch(input) {\n return promiseResolve(PromiseConstructor, $fetch.apply(global, arguments));\n }\n });\n}\n\n$({ global: true, wrap: true, forced: FORCED }, {\n Promise: PromiseConstructor\n});\n\nsetToStringTag(PromiseConstructor, PROMISE, false, true);\nsetSpecies(PROMISE);\n\nPromiseWrapper = path[PROMISE];\n\n// statics\n$({ target: PROMISE, stat: true, forced: FORCED }, {\n // `Promise.reject` method\n // https://tc39.github.io/ecma262/#sec-promise.reject\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n capability.reject.call(undefined, r);\n return capability.promise;\n }\n});\n\n$({ target: PROMISE, stat: true, forced: IS_PURE || FORCED }, {\n // `Promise.resolve` method\n // https://tc39.github.io/ecma262/#sec-promise.resolve\n resolve: function resolve(x) {\n return promiseResolve(IS_PURE && this === PromiseWrapper ? PromiseConstructor : this, x);\n }\n});\n\n$({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, {\n // `Promise.all` method\n // https://tc39.github.io/ecma262/#sec-promise.all\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aFunction(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n $promiseResolve.call(C, promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.error) reject(result.value);\n return capability.promise;\n },\n // `Promise.race` method\n // https://tc39.github.io/ecma262/#sec-promise.race\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aFunction(C.resolve);\n iterate(iterable, function (promise) {\n $promiseResolve.call(C, promise).then(capability.resolve, reject);\n });\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5qcz9lNmNmIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BhdGgnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZS1hbGwnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIHNldFNwZWNpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90YXNrJykuc2V0O1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9taWNyb3Rhc2snKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUnKTtcbnZhciBob3N0UmVwb3J0RXJyb3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hvc3QtcmVwb3J0LWVycm9ycycpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdXNlci1hZ2VudCcpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBpc0ZvcmNlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1mb3JjZWQnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcbnZhciBQUk9NSVNFID0gJ1Byb21pc2UnO1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihQUk9NSVNFKTtcbnZhciBQcm9taXNlQ29uc3RydWN0b3IgPSBnbG9iYWxbUFJPTUlTRV07XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgJGZldGNoID0gZ2xvYmFsLmZldGNoO1xudmFyIHZlcnNpb25zID0gcHJvY2VzcyAmJiBwcm9jZXNzLnZlcnNpb25zO1xudmFyIHY4ID0gdmVyc2lvbnMgJiYgdmVyc2lvbnMudjggfHwgJyc7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mO1xudmFyIG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5O1xudmFyIElTX05PREUgPSBjbGFzc29mKHByb2Nlc3MpID09ICdwcm9jZXNzJztcbnZhciBESVNQQVRDSF9FVkVOVCA9ICEhKGRvY3VtZW50ICYmIGRvY3VtZW50LmNyZWF0ZUV2ZW50ICYmIGdsb2JhbC5kaXNwYXRjaEV2ZW50KTtcbnZhciBVTkhBTkRMRURfUkVKRUNUSU9OID0gJ3VuaGFuZGxlZHJlamVjdGlvbic7XG52YXIgUkVKRUNUSU9OX0hBTkRMRUQgPSAncmVqZWN0aW9uaGFuZGxlZCc7XG52YXIgUEVORElORyA9IDA7XG52YXIgRlVMRklMTEVEID0gMTtcbnZhciBSRUpFQ1RFRCA9IDI7XG52YXIgSEFORExFRCA9IDE7XG52YXIgVU5IQU5ETEVEID0gMjtcbnZhciBJbnRlcm5hbCwgT3duUHJvbWlzZUNhcGFiaWxpdHksIFByb21pc2VXcmFwcGVyO1xuXG52YXIgRk9SQ0VEID0gaXNGb3JjZWQoUFJPTUlTRSwgZnVuY3Rpb24gKCkge1xuICAvLyBjb3JyZWN0IHN1YmNsYXNzaW5nIHdpdGggQEBzcGVjaWVzIHN1cHBvcnRcbiAgdmFyIHByb21pc2UgPSBQcm9taXNlQ29uc3RydWN0b3IucmVzb2x2ZSgxKTtcbiAgdmFyIGVtcHR5ID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xuICB2YXIgRmFrZVByb21pc2UgPSAocHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9KVtTUEVDSUVTXSA9IGZ1bmN0aW9uIChleGVjKSB7XG4gICAgZXhlYyhlbXB0eSwgZW1wdHkpO1xuICB9O1xuICAvLyB1bmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gIHJldHVybiAhKChJU19OT0RFIHx8IHR5cGVvZiBQcm9taXNlUmVqZWN0aW9uRXZlbnQgPT0gJ2Z1bmN0aW9uJylcbiAgICAmJiAoIUlTX1BVUkUgfHwgcHJvbWlzZVsnZmluYWxseSddKVxuICAgICYmIHByb21pc2UudGhlbihlbXB0eSkgaW5zdGFuY2VvZiBGYWtlUHJvbWlzZVxuICAgIC8vIHY4IDYuNiAoTm9kZSAxMCBhbmQgQ2hyb21lIDY2KSBoYXZlIGEgYnVnIHdpdGggcmVzb2x2aW5nIGN1c3RvbSB0aGVuYWJsZXNcbiAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD04MzA1NjVcbiAgICAvLyB3ZSBjYW4ndCBkZXRlY3QgaXQgc3luY2hyb25vdXNseSwgc28ganVzdCBjaGVjayB2ZXJzaW9uc1xuICAgICYmIHY4LmluZGV4T2YoJzYuNicpICE9PSAwXG4gICAgJiYgdXNlckFnZW50LmluZGV4T2YoJ0Nocm9tZS82NicpID09PSAtMSk7XG59KTtcblxudmFyIElOQ09SUkVDVF9JVEVSQVRJT04gPSBGT1JDRUQgfHwgIWNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHtcbiAgUHJvbWlzZUNvbnN0cnVjdG9yLmFsbChpdGVyYWJsZSlbJ2NhdGNoJ10oZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xuXG4vLyBoZWxwZXJzXG52YXIgaXNUaGVuYWJsZSA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgdGhlbjtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiB0eXBlb2YgKHRoZW4gPSBpdC50aGVuKSA9PSAnZnVuY3Rpb24nID8gdGhlbiA6IGZhbHNlO1xufTtcblxudmFyIG5vdGlmeSA9IGZ1bmN0aW9uIChwcm9taXNlLCBzdGF0ZSwgaXNSZWplY3QpIHtcbiAgaWYgKHN0YXRlLm5vdGlmaWVkKSByZXR1cm47XG4gIHN0YXRlLm5vdGlmaWVkID0gdHJ1ZTtcbiAgdmFyIGNoYWluID0gc3RhdGUucmVhY3Rpb25zO1xuICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZSA9IHN0YXRlLnZhbHVlO1xuICAgIHZhciBvayA9IHN0YXRlLnN0YXRlID09IEZVTEZJTExFRDtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHJ1biA9IGZ1bmN0aW9uIChyZWFjdGlvbikge1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDtcbiAgICAgIHZhciByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZTtcbiAgICAgIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7XG4gICAgICB2YXIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluO1xuICAgICAgdmFyIHJlc3VsdCwgdGhlbiwgZXhpdGVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICBpZiAoIW9rKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUucmVqZWN0aW9uID09PSBVTkhBTkRMRUQpIG9uSGFuZGxlVW5oYW5kbGVkKHByb21pc2UsIHN0YXRlKTtcbiAgICAgICAgICAgIHN0YXRlLnJlamVjdGlvbiA9IEhBTkRMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoYW5kbGVyID09PSB0cnVlKSByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkb21haW4pIGRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7IC8vIG1heSB0aHJvd1xuICAgICAgICAgICAgaWYgKGRvbWFpbikge1xuICAgICAgICAgICAgICBkb21haW4uZXhpdCgpO1xuICAgICAgICAgICAgICBleGl0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKSB7XG4gICAgICAgICAgICByZWplY3QoVHlwZUVycm9yKCdQcm9taXNlLWNoYWluIGN5Y2xlJykpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhlbiA9IGlzVGhlbmFibGUocmVzdWx0KSkge1xuICAgICAgICAgICAgdGhlbi5jYWxsKHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChkb21haW4gJiYgIWV4aXRlZCkgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdoaWxlIChjaGFpbi5sZW5ndGggPiBpKSBydW4oY2hhaW5baSsrXSk7IC8vIHZhcmlhYmxlIGxlbmd0aCAtIGNhbid0IHVzZSBmb3JFYWNoXG4gICAgc3RhdGUucmVhY3Rpb25zID0gW107XG4gICAgc3RhdGUubm90aWZpZWQgPSBmYWxzZTtcbiAgICBpZiAoaXNSZWplY3QgJiYgIXN0YXRlLnJlamVjdGlvbikgb25VbmhhbmRsZWQocHJvbWlzZSwgc3RhdGUpO1xuICB9KTtcbn07XG5cbnZhciBkaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24gKG5hbWUsIHByb21pc2UsIHJlYXNvbikge1xuICB2YXIgZXZlbnQsIGhhbmRsZXI7XG4gIGlmIChESVNQQVRDSF9FVkVOVCkge1xuICAgIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZXZlbnQucHJvbWlzZSA9IHByb21pc2U7XG4gICAgZXZlbnQucmVhc29uID0gcmVhc29uO1xuICAgIGV2ZW50LmluaXRFdmVudChuYW1lLCBmYWxzZSwgdHJ1ZSk7XG4gICAgZ2xvYmFsLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9IGVsc2UgZXZlbnQgPSB7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogcmVhc29uIH07XG4gIGlmIChoYW5kbGVyID0gZ2xvYmFsWydvbicgKyBuYW1lXSkgaGFuZGxlcihldmVudCk7XG4gIGVsc2UgaWYgKG5hbWUgPT09IFVOSEFORExFRF9SRUpFQ1RJT04pIGhvc3RSZXBvcnRFcnJvcnMoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHJlYXNvbik7XG59O1xuXG52YXIgb25VbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUpIHtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZSA9IHN0YXRlLnZhbHVlO1xuICAgIHZhciBJU19VTkhBTkRMRUQgPSBpc1VuaGFuZGxlZChzdGF0ZSk7XG4gICAgdmFyIHJlc3VsdDtcbiAgICBpZiAoSVNfVU5IQU5ETEVEKSB7XG4gICAgICByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKElTX05PREUpIHtcbiAgICAgICAgICBwcm9jZXNzLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgfSBlbHNlIGRpc3BhdGNoRXZlbnQoVU5IQU5ETEVEX1JFSkVDVElPTiwgcHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfSk7XG4gICAgICAvLyBCcm93c2VycyBzaG91bGQgbm90IHRyaWdnZXIgYHJlamVjdGlvbkhhbmRsZWRgIGV2ZW50IGlmIGl0IHdhcyBoYW5kbGVkIGhlcmUsIE5vZGVKUyAtIHNob3VsZFxuICAgICAgc3RhdGUucmVqZWN0aW9uID0gSVNfTk9ERSB8fCBpc1VuaGFuZGxlZChzdGF0ZSkgPyBVTkhBTkRMRUQgOiBIQU5ETEVEO1xuICAgICAgaWYgKHJlc3VsdC5lcnJvcikgdGhyb3cgcmVzdWx0LnZhbHVlO1xuICAgIH1cbiAgfSk7XG59O1xuXG52YXIgaXNVbmhhbmRsZWQgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgcmV0dXJuIHN0YXRlLnJlamVjdGlvbiAhPT0gSEFORExFRCAmJiAhc3RhdGUucGFyZW50O1xufTtcblxudmFyIG9uSGFuZGxlVW5oYW5kbGVkID0gZnVuY3Rpb24gKHByb21pc2UsIHN0YXRlKSB7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoSVNfTk9ERSkge1xuICAgICAgcHJvY2Vzcy5lbWl0KCdyZWplY3Rpb25IYW5kbGVkJywgcHJvbWlzZSk7XG4gICAgfSBlbHNlIGRpc3BhdGNoRXZlbnQoUkVKRUNUSU9OX0hBTkRMRUQsIHByb21pc2UsIHN0YXRlLnZhbHVlKTtcbiAgfSk7XG59O1xuXG52YXIgYmluZCA9IGZ1bmN0aW9uIChmbiwgcHJvbWlzZSwgc3RhdGUsIHVud3JhcCkge1xuICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgZm4ocHJvbWlzZSwgc3RhdGUsIHZhbHVlLCB1bndyYXApO1xuICB9O1xufTtcblxudmFyIGludGVybmFsUmVqZWN0ID0gZnVuY3Rpb24gKHByb21pc2UsIHN0YXRlLCB2YWx1ZSwgdW53cmFwKSB7XG4gIGlmIChzdGF0ZS5kb25lKSByZXR1cm47XG4gIHN0YXRlLmRvbmUgPSB0cnVlO1xuICBpZiAodW53cmFwKSBzdGF0ZSA9IHVud3JhcDtcbiAgc3RhdGUudmFsdWUgPSB2YWx1ZTtcbiAgc3RhdGUuc3RhdGUgPSBSRUpFQ1RFRDtcbiAgbm90aWZ5KHByb21pc2UsIHN0YXRlLCB0cnVlKTtcbn07XG5cbnZhciBpbnRlcm5hbFJlc29sdmUgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUsIHZhbHVlLCB1bndyYXApIHtcbiAgaWYgKHN0YXRlLmRvbmUpIHJldHVybjtcbiAgc3RhdGUuZG9uZSA9IHRydWU7XG4gIGlmICh1bndyYXApIHN0YXRlID0gdW53cmFwO1xuICB0cnkge1xuICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkgdGhyb3cgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgdmFyIHRoZW4gPSBpc1RoZW5hYmxlKHZhbHVlKTtcbiAgICBpZiAodGhlbikge1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSB7IGRvbmU6IGZhbHNlIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhlbi5jYWxsKHZhbHVlLFxuICAgICAgICAgICAgYmluZChpbnRlcm5hbFJlc29sdmUsIHByb21pc2UsIHdyYXBwZXIsIHN0YXRlKSxcbiAgICAgICAgICAgIGJpbmQoaW50ZXJuYWxSZWplY3QsIHByb21pc2UsIHdyYXBwZXIsIHN0YXRlKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaW50ZXJuYWxSZWplY3QocHJvbWlzZSwgd3JhcHBlciwgZXJyb3IsIHN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLnZhbHVlID0gdmFsdWU7XG4gICAgICBzdGF0ZS5zdGF0ZSA9IEZVTEZJTExFRDtcbiAgICAgIG5vdGlmeShwcm9taXNlLCBzdGF0ZSwgZmFsc2UpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpbnRlcm5hbFJlamVjdChwcm9taXNlLCB7IGRvbmU6IGZhbHNlIH0sIGVycm9yLCBzdGF0ZSk7XG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZiAoRk9SQ0VEKSB7XG4gIC8vIDI1LjQuMy4xIFByb21pc2UoZXhlY3V0b3IpXG4gIFByb21pc2VDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICBhbkluc3RhbmNlKHRoaXMsIFByb21pc2VDb25zdHJ1Y3RvciwgUFJPTUlTRSk7XG4gICAgYUZ1bmN0aW9uKGV4ZWN1dG9yKTtcbiAgICBJbnRlcm5hbC5jYWxsKHRoaXMpO1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWN1dG9yKGJpbmQoaW50ZXJuYWxSZXNvbHZlLCB0aGlzLCBzdGF0ZSksIGJpbmQoaW50ZXJuYWxSZWplY3QsIHRoaXMsIHN0YXRlKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGludGVybmFsUmVqZWN0KHRoaXMsIHN0YXRlLCBlcnJvcik7XG4gICAgfVxuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgICB0eXBlOiBQUk9NSVNFLFxuICAgICAgZG9uZTogZmFsc2UsXG4gICAgICBub3RpZmllZDogZmFsc2UsXG4gICAgICBwYXJlbnQ6IGZhbHNlLFxuICAgICAgcmVhY3Rpb25zOiBbXSxcbiAgICAgIHJlamVjdGlvbjogZmFsc2UsXG4gICAgICBzdGF0ZTogUEVORElORyxcbiAgICAgIHZhbHVlOiB1bmRlZmluZWRcbiAgICB9KTtcbiAgfTtcbiAgSW50ZXJuYWwucHJvdG90eXBlID0gcmVkZWZpbmVBbGwoUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZSwge1xuICAgIC8vIGBQcm9taXNlLnByb3RvdHlwZS50aGVuYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS50aGVuXG4gICAgdGhlbjogZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUodGhpcyk7XG4gICAgICB2YXIgcmVhY3Rpb24gPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgUHJvbWlzZUNvbnN0cnVjdG9yKSk7XG4gICAgICByZWFjdGlvbi5vayA9IHR5cGVvZiBvbkZ1bGZpbGxlZCA9PSAnZnVuY3Rpb24nID8gb25GdWxmaWxsZWQgOiB0cnVlO1xuICAgICAgcmVhY3Rpb24uZmFpbCA9IHR5cGVvZiBvblJlamVjdGVkID09ICdmdW5jdGlvbicgJiYgb25SZWplY3RlZDtcbiAgICAgIHJlYWN0aW9uLmRvbWFpbiA9IElTX05PREUgPyBwcm9jZXNzLmRvbWFpbiA6IHVuZGVmaW5lZDtcbiAgICAgIHN0YXRlLnBhcmVudCA9IHRydWU7XG4gICAgICBzdGF0ZS5yZWFjdGlvbnMucHVzaChyZWFjdGlvbik7XG4gICAgICBpZiAoc3RhdGUuc3RhdGUgIT0gUEVORElORykgbm90aWZ5KHRoaXMsIHN0YXRlLCBmYWxzZSk7XG4gICAgICByZXR1cm4gcmVhY3Rpb24ucHJvbWlzZTtcbiAgICB9LFxuICAgIC8vIGBQcm9taXNlLnByb3RvdHlwZS5jYXRjaGAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcHJvbWlzZS5wcm90b3R5cGUuY2F0Y2hcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbiAob25SZWplY3RlZCkge1xuICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICAgIH1cbiAgfSk7XG4gIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gbmV3IEludGVybmFsKCk7XG4gICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZShwcm9taXNlKTtcbiAgICB0aGlzLnByb21pc2UgPSBwcm9taXNlO1xuICAgIHRoaXMucmVzb2x2ZSA9IGJpbmQoaW50ZXJuYWxSZXNvbHZlLCBwcm9taXNlLCBzdGF0ZSk7XG4gICAgdGhpcy5yZWplY3QgPSBiaW5kKGludGVybmFsUmVqZWN0LCBwcm9taXNlLCBzdGF0ZSk7XG4gIH07XG4gIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uIChDKSB7XG4gICAgcmV0dXJuIEMgPT09IFByb21pc2VDb25zdHJ1Y3RvciB8fCBDID09PSBQcm9taXNlV3JhcHBlclxuICAgICAgPyBuZXcgT3duUHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICAgIDogbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICB9O1xuXG4gIC8vIHdyYXAgZmV0Y2ggcmVzdWx0XG4gIGlmICghSVNfUFVSRSAmJiB0eXBlb2YgJGZldGNoID09ICdmdW5jdGlvbicpICQoeyBnbG9iYWw6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIGZvcmNlZDogdHJ1ZSB9LCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgZmV0Y2g6IGZ1bmN0aW9uIGZldGNoKGlucHV0KSB7XG4gICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoUHJvbWlzZUNvbnN0cnVjdG9yLCAkZmV0Y2guYXBwbHkoZ2xvYmFsLCBhcmd1bWVudHMpKTtcbiAgICB9XG4gIH0pO1xufVxuXG4kKHsgZ2xvYmFsOiB0cnVlLCB3cmFwOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIFByb21pc2U6IFByb21pc2VDb25zdHJ1Y3RvclxufSk7XG5cbnNldFRvU3RyaW5nVGFnKFByb21pc2VDb25zdHJ1Y3RvciwgUFJPTUlTRSwgZmFsc2UsIHRydWUpO1xuc2V0U3BlY2llcyhQUk9NSVNFKTtcblxuUHJvbWlzZVdyYXBwZXIgPSBwYXRoW1BST01JU0VdO1xuXG4vLyBzdGF0aWNzXG4kKHsgdGFyZ2V0OiBQUk9NSVNFLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIC8vIGBQcm9taXNlLnJlamVjdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UucmVqZWN0XG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpIHtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpO1xuICAgIGNhcGFiaWxpdHkucmVqZWN0LmNhbGwodW5kZWZpbmVkLCByKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcblxuJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIHx8IEZPUkNFRCB9LCB7XG4gIC8vIGBQcm9taXNlLnJlc29sdmVgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wcm9taXNlLnJlc29sdmVcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSh4KSB7XG4gICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKElTX1BVUkUgJiYgdGhpcyA9PT0gUHJvbWlzZVdyYXBwZXIgPyBQcm9taXNlQ29uc3RydWN0b3IgOiB0aGlzLCB4KTtcbiAgfVxufSk7XG5cbiQoeyB0YXJnZXQ6IFBST01JU0UsIHN0YXQ6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX0lURVJBVElPTiB9LCB7XG4gIC8vIGBQcm9taXNlLmFsbGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UuYWxsXG4gIGFsbDogZnVuY3Rpb24gYWxsKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlc29sdmUgPSBjYXBhYmlsaXR5LnJlc29sdmU7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkcHJvbWlzZVJlc29sdmUgPSBhRnVuY3Rpb24oQy5yZXNvbHZlKTtcbiAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgIHZhciBjb3VudGVyID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gY291bnRlcisrO1xuICAgICAgICB2YXIgYWxyZWFkeUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICB2YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgJHByb21pc2VSZXNvbHZlLmNhbGwoQywgcHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1tpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9LFxuICAvLyBgUHJvbWlzZS5yYWNlYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcHJvbWlzZS5yYWNlXG4gIHJhY2U6IGZ1bmN0aW9uIHJhY2UoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICRwcm9taXNlUmVzb2x2ZSA9IGFGdW5jdGlvbihDLnJlc29sdmUpO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgJHByb21pc2VSZXNvbHZlLmNhbGwoQywgcHJvbWlzZSkudGhlbihjYXBhYmlsaXR5LnJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.promise.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.anchor.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.anchor.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createHTML = __webpack_require__(/*! ../internals/create-html */ \"./node_modules/core-js/internals/create-html.js\");\nvar forcedStringHTMLMethod = __webpack_require__(/*! ../internals/forced-string-html-method */ \"./node_modules/core-js/internals/forced-string-html-method.js\");\n\n// `String.prototype.anchor` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.anchor\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('anchor') }, {\n anchor: function anchor(name) {\n return createHTML(this, 'a', 'name', name);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5hbmNob3IuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmFuY2hvci5qcz8xOGE1Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNyZWF0ZUhUTUwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWh0bWwnKTtcbnZhciBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuYW5jaG9yYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuYW5jaG9yXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCgnYW5jaG9yJykgfSwge1xuICBhbmNob3I6IGZ1bmN0aW9uIGFuY2hvcihuYW1lKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2EnLCAnbmFtZScsIG5hbWUpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.anchor.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.big.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.big.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createHTML = __webpack_require__(/*! ../internals/create-html */ \"./node_modules/core-js/internals/create-html.js\");\nvar forcedStringHTMLMethod = __webpack_require__(/*! ../internals/forced-string-html-method */ \"./node_modules/core-js/internals/forced-string-html-method.js\");\n\n// `String.prototype.big` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.big\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('big') }, {\n big: function big() {\n return createHTML(this, 'big', '', '');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5iaWcuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmJpZy5qcz8xMzkzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNyZWF0ZUhUTUwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWh0bWwnKTtcbnZhciBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuYmlnYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuYmlnXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCgnYmlnJykgfSwge1xuICBiaWc6IGZ1bmN0aW9uIGJpZygpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnYmlnJywgJycsICcnKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.big.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.blink.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.blink.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createHTML = __webpack_require__(/*! ../internals/create-html */ \"./node_modules/core-js/internals/create-html.js\");\nvar forcedStringHTMLMethod = __webpack_require__(/*! ../internals/forced-string-html-method */ \"./node_modules/core-js/internals/forced-string-html-method.js\");\n\n// `String.prototype.blink` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.blink\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('blink') }, {\n blink: function blink() {\n return createHTML(this, 'blink', '', '');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5ibGluay5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuYmxpbmsuanM/MDRkMyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjcmVhdGVIVE1MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1odG1sJyk7XG52YXIgZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLmJsaW5rYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuYmxpbmtcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kKCdibGluaycpIH0sIHtcbiAgYmxpbms6IGZ1bmN0aW9uIGJsaW5rKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdibGluaycsICcnLCAnJyk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.blink.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.bold.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.bold.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createHTML = __webpack_require__(/*! ../internals/create-html */ \"./node_modules/core-js/internals/create-html.js\");\nvar forcedStringHTMLMethod = __webpack_require__(/*! ../internals/forced-string-html-method */ \"./node_modules/core-js/internals/forced-string-html-method.js\");\n\n// `String.prototype.bold` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.bold\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('bold') }, {\n bold: function bold() {\n return createHTML(this, 'b', '', '');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5ib2xkLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5ib2xkLmpzP2NjNzEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY3JlYXRlSFRNTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaHRtbCcpO1xudmFyIGZvcmNlZFN0cmluZ0hUTUxNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZm9yY2VkLXN0cmluZy1odG1sLW1ldGhvZCcpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5ib2xkYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuYm9sZFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ0hUTUxNZXRob2QoJ2JvbGQnKSB9LCB7XG4gIGJvbGQ6IGZ1bmN0aW9uIGJvbGQoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2InLCAnJywgJycpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.bold.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.code-point-at.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.code-point-at.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar internalCodePointAt = __webpack_require__(/*! ../internals/string-at */ \"./node_modules/core-js/internals/string-at.js\");\n\n// `String.prototype.codePointAt` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.codepointat\n$({ target: 'String', proto: true }, {\n codePointAt: function codePointAt(pos) {\n return internalCodePointAt(this, pos);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5jb2RlLXBvaW50LWF0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5jb2RlLXBvaW50LWF0LmpzP2Y1YjIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaW50ZXJuYWxDb2RlUG9pbnRBdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctYXQnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuY29kZVBvaW50QXRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5jb2RlcG9pbnRhdFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlIH0sIHtcbiAgY29kZVBvaW50QXQ6IGZ1bmN0aW9uIGNvZGVQb2ludEF0KHBvcykge1xuICAgIHJldHVybiBpbnRlcm5hbENvZGVQb2ludEF0KHRoaXMsIHBvcyk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.code-point-at.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.ends-with.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.ends-with.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar toLength = __webpack_require__(/*! ../internals/to-length */ \"./node_modules/core-js/internals/to-length.js\");\nvar validateArguments = __webpack_require__(/*! ../internals/validate-string-method-arguments */ \"./node_modules/core-js/internals/validate-string-method-arguments.js\");\nvar correctIsRegExpLogic = __webpack_require__(/*! ../internals/correct-is-regexp-logic */ \"./node_modules/core-js/internals/correct-is-regexp-logic.js\");\n\nvar ENDS_WITH = 'endsWith';\nvar nativeEndsWith = ''[ENDS_WITH];\nvar min = Math.min;\n\n// `String.prototype.endsWith` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.endswith\n$({ target: 'String', proto: true, forced: !correctIsRegExpLogic(ENDS_WITH) }, {\n endsWith: function endsWith(searchString /* , endPosition = @length */) {\n var that = validateArguments(this, searchString, ENDS_WITH);\n var endPosition = arguments.length > 1 ? arguments[1] : undefined;\n var len = toLength(that.length);\n var end = endPosition === undefined ? len : min(toLength(endPosition), len);\n var search = String(searchString);\n return nativeEndsWith\n ? nativeEndsWith.call(that, search, end)\n : that.slice(end - search.length, end) === search;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5lbmRzLXdpdGguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmVuZHMtd2l0aC5qcz84YTc5Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIHZhbGlkYXRlQXJndW1lbnRzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3ZhbGlkYXRlLXN0cmluZy1tZXRob2QtYXJndW1lbnRzJyk7XG52YXIgY29ycmVjdElzUmVnRXhwTG9naWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMnKTtcblxudmFyIEVORFNfV0lUSCA9ICdlbmRzV2l0aCc7XG52YXIgbmF0aXZlRW5kc1dpdGggPSAnJ1tFTkRTX1dJVEhdO1xudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5lbmRzV2l0aGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLmVuZHN3aXRoXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogIWNvcnJlY3RJc1JlZ0V4cExvZ2ljKEVORFNfV0lUSCkgfSwge1xuICBlbmRzV2l0aDogZnVuY3Rpb24gZW5kc1dpdGgoc2VhcmNoU3RyaW5nIC8qICwgZW5kUG9zaXRpb24gPSBAbGVuZ3RoICovKSB7XG4gICAgdmFyIHRoYXQgPSB2YWxpZGF0ZUFyZ3VtZW50cyh0aGlzLCBzZWFyY2hTdHJpbmcsIEVORFNfV0lUSCk7XG4gICAgdmFyIGVuZFBvc2l0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgdmFyIGxlbiA9IHRvTGVuZ3RoKHRoYXQubGVuZ3RoKTtcbiAgICB2YXIgZW5kID0gZW5kUG9zaXRpb24gPT09IHVuZGVmaW5lZCA/IGxlbiA6IG1pbih0b0xlbmd0aChlbmRQb3NpdGlvbiksIGxlbik7XG4gICAgdmFyIHNlYXJjaCA9IFN0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgIHJldHVybiBuYXRpdmVFbmRzV2l0aFxuICAgICAgPyBuYXRpdmVFbmRzV2l0aC5jYWxsKHRoYXQsIHNlYXJjaCwgZW5kKVxuICAgICAgOiB0aGF0LnNsaWNlKGVuZCAtIHNlYXJjaC5sZW5ndGgsIGVuZCkgPT09IHNlYXJjaDtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.ends-with.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.fixed.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.fixed.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createHTML = __webpack_require__(/*! ../internals/create-html */ \"./node_modules/core-js/internals/create-html.js\");\nvar forcedStringHTMLMethod = __webpack_require__(/*! ../internals/forced-string-html-method */ \"./node_modules/core-js/internals/forced-string-html-method.js\");\n\n// `String.prototype.fixed` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.fixed\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('fixed') }, {\n fixed: function fixed() {\n return createHTML(this, 'tt', '', '');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5maXhlZC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuZml4ZWQuanM/YzdjZCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjcmVhdGVIVE1MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1odG1sJyk7XG52YXIgZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLmZpeGVkYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuZml4ZWRcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kKCdmaXhlZCcpIH0sIHtcbiAgZml4ZWQ6IGZ1bmN0aW9uIGZpeGVkKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICd0dCcsICcnLCAnJyk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.fixed.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.fontcolor.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.fontcolor.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createHTML = __webpack_require__(/*! ../internals/create-html */ \"./node_modules/core-js/internals/create-html.js\");\nvar forcedStringHTMLMethod = __webpack_require__(/*! ../internals/forced-string-html-method */ \"./node_modules/core-js/internals/forced-string-html-method.js\");\n\n// `String.prototype.fontcolor` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.fontcolor\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('fontcolor') }, {\n fontcolor: function fontcolor(color) {\n return createHTML(this, 'font', 'color', color);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5mb250Y29sb3IuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmZvbnRjb2xvci5qcz85NzY3Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNyZWF0ZUhUTUwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWh0bWwnKTtcbnZhciBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuZm9udGNvbG9yYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuZm9udGNvbG9yXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCgnZm9udGNvbG9yJykgfSwge1xuICBmb250Y29sb3I6IGZ1bmN0aW9uIGZvbnRjb2xvcihjb2xvcikge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdmb250JywgJ2NvbG9yJywgY29sb3IpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.fontcolor.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.fontsize.js":
+/*!************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.fontsize.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createHTML = __webpack_require__(/*! ../internals/create-html */ \"./node_modules/core-js/internals/create-html.js\");\nvar forcedStringHTMLMethod = __webpack_require__(/*! ../internals/forced-string-html-method */ \"./node_modules/core-js/internals/forced-string-html-method.js\");\n\n// `String.prototype.fontsize` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.fontsize\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('fontsize') }, {\n fontsize: function fontsize(size) {\n return createHTML(this, 'font', 'size', size);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5mb250c2l6ZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuZm9udHNpemUuanM/MTkxMyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjcmVhdGVIVE1MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1odG1sJyk7XG52YXIgZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLmZvbnRzaXplYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuZm9udHNpemVcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kKCdmb250c2l6ZScpIH0sIHtcbiAgZm9udHNpemU6IGZ1bmN0aW9uIGZvbnRzaXplKHNpemUpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnZm9udCcsICdzaXplJywgc2l6ZSk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.fontsize.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.from-code-point.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.from-code-point.js ***!
+ \*******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ \"./node_modules/core-js/internals/to-absolute-index.js\");\n\nvar fromCharCode = String.fromCharCode;\nvar nativeFromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\nvar INCORRECT_LENGTH = !!nativeFromCodePoint && nativeFromCodePoint.length != 1;\n\n// `String.fromCodePoint` method\n// https://tc39.github.io/ecma262/#sec-string.fromcodepoint\n$({ target: 'String', stat: true, forced: INCORRECT_LENGTH }, {\n fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars\n var elements = [];\n var length = arguments.length;\n var i = 0;\n var code;\n while (length > i) {\n code = +arguments[i++];\n if (toAbsoluteIndex(code, 0x10FFFF) !== code) throw RangeError(code + ' is not a valid code point');\n elements.push(code < 0x10000\n ? fromCharCode(code)\n : fromCharCode(((code -= 0x10000) >> 10) + 0xD800, code % 0x400 + 0xDC00)\n );\n } return elements.join('');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5mcm9tLWNvZGUtcG9pbnQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmZyb20tY29kZS1wb2ludC5qcz9mNmQ2Il0sInNvdXJjZXNDb250ZW50IjpbInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCcpO1xuXG52YXIgZnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcbnZhciBuYXRpdmVGcm9tQ29kZVBvaW50ID0gU3RyaW5nLmZyb21Db2RlUG9pbnQ7XG5cbi8vIGxlbmd0aCBzaG91bGQgYmUgMSwgb2xkIEZGIHByb2JsZW1cbnZhciBJTkNPUlJFQ1RfTEVOR1RIID0gISFuYXRpdmVGcm9tQ29kZVBvaW50ICYmIG5hdGl2ZUZyb21Db2RlUG9pbnQubGVuZ3RoICE9IDE7XG5cbi8vIGBTdHJpbmcuZnJvbUNvZGVQb2ludGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcuZnJvbWNvZGVwb2ludFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHN0YXQ6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX0xFTkdUSCB9LCB7XG4gIGZyb21Db2RlUG9pbnQ6IGZ1bmN0aW9uIGZyb21Db2RlUG9pbnQoeCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIGVsZW1lbnRzID0gW107XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBjb2RlO1xuICAgIHdoaWxlIChsZW5ndGggPiBpKSB7XG4gICAgICBjb2RlID0gK2FyZ3VtZW50c1tpKytdO1xuICAgICAgaWYgKHRvQWJzb2x1dGVJbmRleChjb2RlLCAweDEwRkZGRikgIT09IGNvZGUpIHRocm93IFJhbmdlRXJyb3IoY29kZSArICcgaXMgbm90IGEgdmFsaWQgY29kZSBwb2ludCcpO1xuICAgICAgZWxlbWVudHMucHVzaChjb2RlIDwgMHgxMDAwMFxuICAgICAgICA/IGZyb21DaGFyQ29kZShjb2RlKVxuICAgICAgICA6IGZyb21DaGFyQ29kZSgoKGNvZGUgLT0gMHgxMDAwMCkgPj4gMTApICsgMHhEODAwLCBjb2RlICUgMHg0MDAgKyAweERDMDApXG4gICAgICApO1xuICAgIH0gcmV0dXJuIGVsZW1lbnRzLmpvaW4oJycpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.from-code-point.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.includes.js":
+/*!************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.includes.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar validateArguments = __webpack_require__(/*! ../internals/validate-string-method-arguments */ \"./node_modules/core-js/internals/validate-string-method-arguments.js\");\nvar correctIsRegExpLogic = __webpack_require__(/*! ../internals/correct-is-regexp-logic */ \"./node_modules/core-js/internals/correct-is-regexp-logic.js\");\n\n// `String.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.includes\n$({ target: 'String', proto: true, forced: !correctIsRegExpLogic('includes') }, {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~validateArguments(this, searchString, 'includes')\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pbmNsdWRlcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaW5jbHVkZXMuanM/MjUzMiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciB2YWxpZGF0ZUFyZ3VtZW50cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy92YWxpZGF0ZS1zdHJpbmctbWV0aG9kLWFyZ3VtZW50cycpO1xudmFyIGNvcnJlY3RJc1JlZ0V4cExvZ2ljID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcnJlY3QtaXMtcmVnZXhwLWxvZ2ljJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXNcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhY29ycmVjdElzUmVnRXhwTG9naWMoJ2luY2x1ZGVzJykgfSwge1xuICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoU3RyaW5nIC8qICwgcG9zaXRpb24gPSAwICovKSB7XG4gICAgcmV0dXJuICEhfnZhbGlkYXRlQXJndW1lbnRzKHRoaXMsIHNlYXJjaFN0cmluZywgJ2luY2x1ZGVzJylcbiAgICAgIC5pbmRleE9mKHNlYXJjaFN0cmluZywgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.includes.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.italics.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.italics.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createHTML = __webpack_require__(/*! ../internals/create-html */ \"./node_modules/core-js/internals/create-html.js\");\nvar forcedStringHTMLMethod = __webpack_require__(/*! ../internals/forced-string-html-method */ \"./node_modules/core-js/internals/forced-string-html-method.js\");\n\n// `String.prototype.italics` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.italics\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('italics') }, {\n italics: function italics() {\n return createHTML(this, 'i', '', '');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pdGFsaWNzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pdGFsaWNzLmpzP2M1ZDAiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY3JlYXRlSFRNTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaHRtbCcpO1xudmFyIGZvcmNlZFN0cmluZ0hUTUxNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZm9yY2VkLXN0cmluZy1odG1sLW1ldGhvZCcpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5pdGFsaWNzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuaXRhbGljc1xuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ0hUTUxNZXRob2QoJ2l0YWxpY3MnKSB9LCB7XG4gIGl0YWxpY3M6IGZ1bmN0aW9uIGl0YWxpY3MoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2knLCAnJywgJycpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.italics.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.iterator.js":
+/*!************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.iterator.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar codePointAt = __webpack_require__(/*! ../internals/string-at */ \"./node_modules/core-js/internals/string-at.js\");\nvar InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ \"./node_modules/core-js/internals/internal-state.js\");\nvar defineIterator = __webpack_require__(/*! ../internals/define-iterator */ \"./node_modules/core-js/internals/define-iterator.js\");\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: String(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return { value: undefined, done: true };\n point = codePointAt(string, index, true);\n state.index += point.length;\n return { value: point, done: false };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanM/M2NhMyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgY29kZVBvaW50QXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLWF0Jyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1pdGVyYXRvcicpO1xuXG52YXIgU1RSSU5HX0lURVJBVE9SID0gJ1N0cmluZyBJdGVyYXRvcic7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihTVFJJTkdfSVRFUkFUT1IpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLUBAaXRlcmF0b3JcbmRlZmluZUl0ZXJhdG9yKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uIChpdGVyYXRlZCkge1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICB0eXBlOiBTVFJJTkdfSVRFUkFUT1IsXG4gICAgc3RyaW5nOiBTdHJpbmcoaXRlcmF0ZWQpLFxuICAgIGluZGV4OiAwXG4gIH0pO1xuLy8gYCVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUubmV4dGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0lc3RyaW5naXRlcmF0b3Jwcm90b3R5cGUlLm5leHRcbn0sIGZ1bmN0aW9uIG5leHQoKSB7XG4gIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gIHZhciBzdHJpbmcgPSBzdGF0ZS5zdHJpbmc7XG4gIHZhciBpbmRleCA9IHN0YXRlLmluZGV4O1xuICB2YXIgcG9pbnQ7XG4gIGlmIChpbmRleCA+PSBzdHJpbmcubGVuZ3RoKSByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIHBvaW50ID0gY29kZVBvaW50QXQoc3RyaW5nLCBpbmRleCwgdHJ1ZSk7XG4gIHN0YXRlLmluZGV4ICs9IHBvaW50Lmxlbmd0aDtcbiAgcmV0dXJuIHsgdmFsdWU6IHBvaW50LCBkb25lOiBmYWxzZSB9O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.iterator.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.link.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.link.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createHTML = __webpack_require__(/*! ../internals/create-html */ \"./node_modules/core-js/internals/create-html.js\");\nvar forcedStringHTMLMethod = __webpack_require__(/*! ../internals/forced-string-html-method */ \"./node_modules/core-js/internals/forced-string-html-method.js\");\n\n// `String.prototype.link` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.link\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('link') }, {\n link: function link(url) {\n return createHTML(this, 'a', 'href', url);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5saW5rLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5saW5rLmpzPzk5MTEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY3JlYXRlSFRNTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaHRtbCcpO1xudmFyIGZvcmNlZFN0cmluZ0hUTUxNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZm9yY2VkLXN0cmluZy1odG1sLW1ldGhvZCcpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5saW5rYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUubGlua1xuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ0hUTUxNZXRob2QoJ2xpbmsnKSB9LCB7XG4gIGxpbms6IGZ1bmN0aW9uIGxpbmsodXJsKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2EnLCAnaHJlZicsIHVybCk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.link.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.match-all.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.match-all.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createIteratorConstructor = __webpack_require__(/*! ../internals/create-iterator-constructor */ \"./node_modules/core-js/internals/create-iterator-constructor.js\");\nvar requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\nvar toLength = __webpack_require__(/*! ../internals/to-length */ \"./node_modules/core-js/internals/to-length.js\");\nvar aFunction = __webpack_require__(/*! ../internals/a-function */ \"./node_modules/core-js/internals/a-function.js\");\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar classof = __webpack_require__(/*! ../internals/classof */ \"./node_modules/core-js/internals/classof.js\");\nvar getFlags = __webpack_require__(/*! ../internals/regexp-flags */ \"./node_modules/core-js/internals/regexp-flags.js\");\nvar hide = __webpack_require__(/*! ../internals/hide */ \"./node_modules/core-js/internals/hide.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\nvar speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ \"./node_modules/core-js/internals/species-constructor.js\");\nvar advanceStringIndex = __webpack_require__(/*! ../internals/advance-string-index */ \"./node_modules/core-js/internals/advance-string-index.js\");\nvar InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ \"./node_modules/core-js/internals/internal-state.js\");\nvar IS_PURE = __webpack_require__(/*! ../internals/is-pure */ \"./node_modules/core-js/internals/is-pure.js\");\n\nvar MATCH_ALL = wellKnownSymbol('matchAll');\nvar REGEXP_STRING = 'RegExp String';\nvar REGEXP_STRING_ITERATOR = REGEXP_STRING + ' Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(REGEXP_STRING_ITERATOR);\nvar RegExpPrototype = RegExp.prototype;\nvar regExpBuiltinExec = RegExpPrototype.exec;\n\nvar regExpExec = function (R, S) {\n var exec = R.exec;\n var result;\n if (typeof exec == 'function') {\n result = exec.call(R, S);\n if (typeof result != 'object') throw TypeError('Incorrect exec result');\n return result;\n } return regExpBuiltinExec.call(R, S);\n};\n\n// eslint-disable-next-line max-len\nvar $RegExpStringIterator = createIteratorConstructor(function RegExpStringIterator(regexp, string, global, fullUnicode) {\n setInternalState(this, {\n type: REGEXP_STRING_ITERATOR,\n regexp: regexp,\n string: string,\n global: global,\n unicode: fullUnicode,\n done: false\n });\n}, REGEXP_STRING, function next() {\n var state = getInternalState(this);\n if (state.done) return { value: undefined, done: true };\n var R = state.regexp;\n var S = state.string;\n var match = regExpExec(R, S);\n if (match === null) return { value: undefined, done: state.done = true };\n if (state.global) {\n if (String(match[0]) == '') R.lastIndex = advanceStringIndex(S, toLength(R.lastIndex), state.unicode);\n return { value: match, done: false };\n }\n state.done = true;\n return { value: match, done: false };\n});\n\nvar $matchAll = function (string) {\n var R = anObject(this);\n var S = String(string);\n var C, flagsValue, flags, matcher, global, fullUnicode;\n C = speciesConstructor(R, RegExp);\n flagsValue = R.flags;\n if (flagsValue === undefined && R instanceof RegExp && !('flags' in RegExpPrototype)) {\n flagsValue = getFlags.call(R);\n }\n flags = flagsValue === undefined ? '' : String(flagsValue);\n matcher = new C(C === RegExp ? R.source : R, flags);\n global = !!~flags.indexOf('g');\n fullUnicode = !!~flags.indexOf('u');\n matcher.lastIndex = toLength(R.lastIndex);\n return new $RegExpStringIterator(matcher, S, global, fullUnicode);\n};\n\n// `String.prototype.matchAll` method\n// https://github.com/tc39/proposal-string-matchall\n$({ target: 'String', proto: true }, {\n matchAll: function matchAll(regexp) {\n var O = requireObjectCoercible(this);\n var S, matcher, rx;\n if (regexp != null) {\n matcher = regexp[MATCH_ALL];\n if (matcher === undefined && IS_PURE && classof(regexp) == 'RegExp') matcher = $matchAll;\n if (matcher != null) return aFunction(matcher).call(regexp, O);\n }\n S = String(O);\n rx = new RegExp(regexp, 'g');\n return IS_PURE ? $matchAll.call(rx, S) : rx[MATCH_ALL](S);\n }\n});\n\nIS_PURE || MATCH_ALL in RegExpPrototype || hide(RegExpPrototype, MATCH_ALL, $matchAll);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5tYXRjaC1hbGwuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLm1hdGNoLWFsbC5qcz9hMWYwIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZicpO1xudmFyIGdldEZsYWdzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZ2V4cC1mbGFncycpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4Jyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xuXG52YXIgTUFUQ0hfQUxMID0gd2VsbEtub3duU3ltYm9sKCdtYXRjaEFsbCcpO1xudmFyIFJFR0VYUF9TVFJJTkcgPSAnUmVnRXhwIFN0cmluZyc7XG52YXIgUkVHRVhQX1NUUklOR19JVEVSQVRPUiA9IFJFR0VYUF9TVFJJTkcgKyAnIEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFJFR0VYUF9TVFJJTkdfSVRFUkFUT1IpO1xudmFyIFJlZ0V4cFByb3RvdHlwZSA9IFJlZ0V4cC5wcm90b3R5cGU7XG52YXIgcmVnRXhwQnVpbHRpbkV4ZWMgPSBSZWdFeHBQcm90b3R5cGUuZXhlYztcblxudmFyIHJlZ0V4cEV4ZWMgPSBmdW5jdGlvbiAoUiwgUykge1xuICB2YXIgZXhlYyA9IFIuZXhlYztcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKHR5cGVvZiBleGVjID09ICdmdW5jdGlvbicpIHtcbiAgICByZXN1bHQgPSBleGVjLmNhbGwoUiwgUyk7XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgIT0gJ29iamVjdCcpIHRocm93IFR5cGVFcnJvcignSW5jb3JyZWN0IGV4ZWMgcmVzdWx0Jyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSByZXR1cm4gcmVnRXhwQnVpbHRpbkV4ZWMuY2FsbChSLCBTKTtcbn07XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG52YXIgJFJlZ0V4cFN0cmluZ0l0ZXJhdG9yID0gY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihmdW5jdGlvbiBSZWdFeHBTdHJpbmdJdGVyYXRvcihyZWdleHAsIHN0cmluZywgZ2xvYmFsLCBmdWxsVW5pY29kZSkge1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICB0eXBlOiBSRUdFWFBfU1RSSU5HX0lURVJBVE9SLFxuICAgIHJlZ2V4cDogcmVnZXhwLFxuICAgIHN0cmluZzogc3RyaW5nLFxuICAgIGdsb2JhbDogZ2xvYmFsLFxuICAgIHVuaWNvZGU6IGZ1bGxVbmljb2RlLFxuICAgIGRvbmU6IGZhbHNlXG4gIH0pO1xufSwgUkVHRVhQX1NUUklORywgZnVuY3Rpb24gbmV4dCgpIHtcbiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgaWYgKHN0YXRlLmRvbmUpIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgdmFyIFIgPSBzdGF0ZS5yZWdleHA7XG4gIHZhciBTID0gc3RhdGUuc3RyaW5nO1xuICB2YXIgbWF0Y2ggPSByZWdFeHBFeGVjKFIsIFMpO1xuICBpZiAobWF0Y2ggPT09IG51bGwpIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHN0YXRlLmRvbmUgPSB0cnVlIH07XG4gIGlmIChzdGF0ZS5nbG9iYWwpIHtcbiAgICBpZiAoU3RyaW5nKG1hdGNoWzBdKSA9PSAnJykgUi5sYXN0SW5kZXggPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgdG9MZW5ndGgoUi5sYXN0SW5kZXgpLCBzdGF0ZS51bmljb2RlKTtcbiAgICByZXR1cm4geyB2YWx1ZTogbWF0Y2gsIGRvbmU6IGZhbHNlIH07XG4gIH1cbiAgc3RhdGUuZG9uZSA9IHRydWU7XG4gIHJldHVybiB7IHZhbHVlOiBtYXRjaCwgZG9uZTogZmFsc2UgfTtcbn0pO1xuXG52YXIgJG1hdGNoQWxsID0gZnVuY3Rpb24gKHN0cmluZykge1xuICB2YXIgUiA9IGFuT2JqZWN0KHRoaXMpO1xuICB2YXIgUyA9IFN0cmluZyhzdHJpbmcpO1xuICB2YXIgQywgZmxhZ3NWYWx1ZSwgZmxhZ3MsIG1hdGNoZXIsIGdsb2JhbCwgZnVsbFVuaWNvZGU7XG4gIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IoUiwgUmVnRXhwKTtcbiAgZmxhZ3NWYWx1ZSA9IFIuZmxhZ3M7XG4gIGlmIChmbGFnc1ZhbHVlID09PSB1bmRlZmluZWQgJiYgUiBpbnN0YW5jZW9mIFJlZ0V4cCAmJiAhKCdmbGFncycgaW4gUmVnRXhwUHJvdG90eXBlKSkge1xuICAgIGZsYWdzVmFsdWUgPSBnZXRGbGFncy5jYWxsKFIpO1xuICB9XG4gIGZsYWdzID0gZmxhZ3NWYWx1ZSA9PT0gdW5kZWZpbmVkID8gJycgOiBTdHJpbmcoZmxhZ3NWYWx1ZSk7XG4gIG1hdGNoZXIgPSBuZXcgQyhDID09PSBSZWdFeHAgPyBSLnNvdXJjZSA6IFIsIGZsYWdzKTtcbiAgZ2xvYmFsID0gISF+ZmxhZ3MuaW5kZXhPZignZycpO1xuICBmdWxsVW5pY29kZSA9ICEhfmZsYWdzLmluZGV4T2YoJ3UnKTtcbiAgbWF0Y2hlci5sYXN0SW5kZXggPSB0b0xlbmd0aChSLmxhc3RJbmRleCk7XG4gIHJldHVybiBuZXcgJFJlZ0V4cFN0cmluZ0l0ZXJhdG9yKG1hdGNoZXIsIFMsIGdsb2JhbCwgZnVsbFVuaWNvZGUpO1xufTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUubWF0Y2hBbGxgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc3RyaW5nLW1hdGNoYWxsXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUgfSwge1xuICBtYXRjaEFsbDogZnVuY3Rpb24gbWF0Y2hBbGwocmVnZXhwKSB7XG4gICAgdmFyIE8gPSByZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpO1xuICAgIHZhciBTLCBtYXRjaGVyLCByeDtcbiAgICBpZiAocmVnZXhwICE9IG51bGwpIHtcbiAgICAgIG1hdGNoZXIgPSByZWdleHBbTUFUQ0hfQUxMXTtcbiAgICAgIGlmIChtYXRjaGVyID09PSB1bmRlZmluZWQgJiYgSVNfUFVSRSAmJiBjbGFzc29mKHJlZ2V4cCkgPT0gJ1JlZ0V4cCcpIG1hdGNoZXIgPSAkbWF0Y2hBbGw7XG4gICAgICBpZiAobWF0Y2hlciAhPSBudWxsKSByZXR1cm4gYUZ1bmN0aW9uKG1hdGNoZXIpLmNhbGwocmVnZXhwLCBPKTtcbiAgICB9XG4gICAgUyA9IFN0cmluZyhPKTtcbiAgICByeCA9IG5ldyBSZWdFeHAocmVnZXhwLCAnZycpO1xuICAgIHJldHVybiBJU19QVVJFID8gJG1hdGNoQWxsLmNhbGwocngsIFMpIDogcnhbTUFUQ0hfQUxMXShTKTtcbiAgfVxufSk7XG5cbklTX1BVUkUgfHwgTUFUQ0hfQUxMIGluIFJlZ0V4cFByb3RvdHlwZSB8fCBoaWRlKFJlZ0V4cFByb3RvdHlwZSwgTUFUQ0hfQUxMLCAkbWF0Y2hBbGwpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.match-all.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.match.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.match.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar fixRegExpWellKnownSymbolLogic = __webpack_require__(/*! ../internals/fix-regexp-well-known-symbol-logic */ \"./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js\");\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar toLength = __webpack_require__(/*! ../internals/to-length */ \"./node_modules/core-js/internals/to-length.js\");\nvar requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\nvar advanceStringIndex = __webpack_require__(/*! ../internals/advance-string-index */ \"./node_modules/core-js/internals/advance-string-index.js\");\nvar regExpExec = __webpack_require__(/*! ../internals/regexp-exec-abstract */ \"./node_modules/core-js/internals/regexp-exec-abstract.js\");\n\n// @@match logic\nfixRegExpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = requireObjectCoercible(this);\n var matcher = regexp == undefined ? undefined : regexp[MATCH];\n return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative(nativeMatch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n if (!rx.global) return regExpExec(rx, S);\n\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regExpExec(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5tYXRjaC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcubWF0Y2guanM/NDY2ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgZml4UmVnRXhwV2VsbEtub3duU3ltYm9sTG9naWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4Jyk7XG52YXIgcmVnRXhwRXhlYyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWdleHAtZXhlYy1hYnN0cmFjdCcpO1xuXG4vLyBAQG1hdGNoIGxvZ2ljXG5maXhSZWdFeHBXZWxsS25vd25TeW1ib2xMb2dpYygnbWF0Y2gnLCAxLCBmdW5jdGlvbiAoTUFUQ0gsIG5hdGl2ZU1hdGNoLCBtYXliZUNhbGxOYXRpdmUpIHtcbiAgcmV0dXJuIFtcbiAgICAvLyBgU3RyaW5nLnByb3RvdHlwZS5tYXRjaGAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5tYXRjaFxuICAgIGZ1bmN0aW9uIG1hdGNoKHJlZ2V4cCkge1xuICAgICAgdmFyIE8gPSByZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpO1xuICAgICAgdmFyIG1hdGNoZXIgPSByZWdleHAgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcmVnZXhwW01BVENIXTtcbiAgICAgIHJldHVybiBtYXRjaGVyICE9PSB1bmRlZmluZWQgPyBtYXRjaGVyLmNhbGwocmVnZXhwLCBPKSA6IG5ldyBSZWdFeHAocmVnZXhwKVtNQVRDSF0oU3RyaW5nKE8pKTtcbiAgICB9LFxuICAgIC8vIGBSZWdFeHAucHJvdG90eXBlW0BAbWF0Y2hdYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAbWF0Y2hcbiAgICBmdW5jdGlvbiAocmVnZXhwKSB7XG4gICAgICB2YXIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKG5hdGl2ZU1hdGNoLCByZWdleHAsIHRoaXMpO1xuICAgICAgaWYgKHJlcy5kb25lKSByZXR1cm4gcmVzLnZhbHVlO1xuXG4gICAgICB2YXIgcnggPSBhbk9iamVjdChyZWdleHApO1xuICAgICAgdmFyIFMgPSBTdHJpbmcodGhpcyk7XG5cbiAgICAgIGlmICghcnguZ2xvYmFsKSByZXR1cm4gcmVnRXhwRXhlYyhyeCwgUyk7XG5cbiAgICAgIHZhciBmdWxsVW5pY29kZSA9IHJ4LnVuaWNvZGU7XG4gICAgICByeC5sYXN0SW5kZXggPSAwO1xuICAgICAgdmFyIEEgPSBbXTtcbiAgICAgIHZhciBuID0gMDtcbiAgICAgIHZhciByZXN1bHQ7XG4gICAgICB3aGlsZSAoKHJlc3VsdCA9IHJlZ0V4cEV4ZWMocngsIFMpKSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgbWF0Y2hTdHIgPSBTdHJpbmcocmVzdWx0WzBdKTtcbiAgICAgICAgQVtuXSA9IG1hdGNoU3RyO1xuICAgICAgICBpZiAobWF0Y2hTdHIgPT09ICcnKSByeC5sYXN0SW5kZXggPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgdG9MZW5ndGgocngubGFzdEluZGV4KSwgZnVsbFVuaWNvZGUpO1xuICAgICAgICBuKys7XG4gICAgICB9XG4gICAgICByZXR1cm4gbiA9PT0gMCA/IG51bGwgOiBBO1xuICAgIH1cbiAgXTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.match.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.pad-end.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.pad-end.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar internalStringPad = __webpack_require__(/*! ../internals/string-pad */ \"./node_modules/core-js/internals/string-pad.js\");\nvar WEBKIT_BUG = __webpack_require__(/*! ../internals/webkit-string-pad-bug */ \"./node_modules/core-js/internals/webkit-string-pad-bug.js\");\n\n// `String.prototype.padEnd` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.padend\n$({ target: 'String', proto: true, forced: WEBKIT_BUG }, {\n padEnd: function padEnd(maxLength /* , fillString = ' ' */) {\n return internalStringPad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5wYWQtZW5kLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5wYWQtZW5kLmpzPzg0M2MiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaW50ZXJuYWxTdHJpbmdQYWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXBhZCcpO1xudmFyIFdFQktJVF9CVUcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2Via2l0LXN0cmluZy1wYWQtYnVnJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnBhZEVuZGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnBhZGVuZFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IFdFQktJVF9CVUcgfSwge1xuICBwYWRFbmQ6IGZ1bmN0aW9uIHBhZEVuZChtYXhMZW5ndGggLyogLCBmaWxsU3RyaW5nID0gJyAnICovKSB7XG4gICAgcmV0dXJuIGludGVybmFsU3RyaW5nUGFkKHRoaXMsIG1heExlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIGZhbHNlKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.pad-end.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.pad-start.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.pad-start.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar internalStringPad = __webpack_require__(/*! ../internals/string-pad */ \"./node_modules/core-js/internals/string-pad.js\");\nvar WEBKIT_BUG = __webpack_require__(/*! ../internals/webkit-string-pad-bug */ \"./node_modules/core-js/internals/webkit-string-pad-bug.js\");\n\n// `String.prototype.padStart` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.padstart\n$({ target: 'String', proto: true, forced: WEBKIT_BUG }, {\n padStart: function padStart(maxLength /* , fillString = ' ' */) {\n return internalStringPad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5wYWQtc3RhcnQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnBhZC1zdGFydC5qcz80ZDkwIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGludGVybmFsU3RyaW5nUGFkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy1wYWQnKTtcbnZhciBXRUJLSVRfQlVHID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlYmtpdC1zdHJpbmctcGFkLWJ1ZycpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnBhZHN0YXJ0XG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogV0VCS0lUX0JVRyB9LCB7XG4gIHBhZFN0YXJ0OiBmdW5jdGlvbiBwYWRTdGFydChtYXhMZW5ndGggLyogLCBmaWxsU3RyaW5nID0gJyAnICovKSB7XG4gICAgcmV0dXJuIGludGVybmFsU3RyaW5nUGFkKHRoaXMsIG1heExlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIHRydWUpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.pad-start.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.raw.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.raw.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ \"./node_modules/core-js/internals/to-indexed-object.js\");\nvar toLength = __webpack_require__(/*! ../internals/to-length */ \"./node_modules/core-js/internals/to-length.js\");\n\n// `String.raw` method\n// https://tc39.github.io/ecma262/#sec-string.raw\n$({ target: 'String', stat: true }, {\n raw: function raw(template) {\n var rawTemplate = toIndexedObject(template.raw);\n var literalSegments = toLength(rawTemplate.length);\n var argumentsLength = arguments.length;\n var elements = [];\n var i = 0;\n while (literalSegments > i) {\n elements.push(String(rawTemplate[i++]));\n if (i < argumentsLength) elements.push(String(arguments[i]));\n } return elements.join('');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yYXcuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJhdy5qcz9kODBmIl0sInNvdXJjZXNDb250ZW50IjpbInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xuXG4vLyBgU3RyaW5nLnJhd2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucmF3XG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgc3RhdDogdHJ1ZSB9LCB7XG4gIHJhdzogZnVuY3Rpb24gcmF3KHRlbXBsYXRlKSB7XG4gICAgdmFyIHJhd1RlbXBsYXRlID0gdG9JbmRleGVkT2JqZWN0KHRlbXBsYXRlLnJhdyk7XG4gICAgdmFyIGxpdGVyYWxTZWdtZW50cyA9IHRvTGVuZ3RoKHJhd1RlbXBsYXRlLmxlbmd0aCk7XG4gICAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGVsZW1lbnRzID0gW107XG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlIChsaXRlcmFsU2VnbWVudHMgPiBpKSB7XG4gICAgICBlbGVtZW50cy5wdXNoKFN0cmluZyhyYXdUZW1wbGF0ZVtpKytdKSk7XG4gICAgICBpZiAoaSA8IGFyZ3VtZW50c0xlbmd0aCkgZWxlbWVudHMucHVzaChTdHJpbmcoYXJndW1lbnRzW2ldKSk7XG4gICAgfSByZXR1cm4gZWxlbWVudHMuam9pbignJyk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.raw.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.repeat.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.repeat.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar repeat = __webpack_require__(/*! ../internals/string-repeat */ \"./node_modules/core-js/internals/string-repeat.js\");\n\n// `String.prototype.repeat` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.repeat\n$({ target: 'String', proto: true }, {\n repeat: repeat\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yZXBlYXQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJlcGVhdC5qcz8zOGNmIl0sInNvdXJjZXNDb250ZW50IjpbInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHJlcGVhdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctcmVwZWF0Jyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnJlcGVhdGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnJlcGVhdFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlIH0sIHtcbiAgcmVwZWF0OiByZXBlYXRcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.repeat.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.replace.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.replace.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar fixRegExpWellKnownSymbolLogic = __webpack_require__(/*! ../internals/fix-regexp-well-known-symbol-logic */ \"./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js\");\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar toObject = __webpack_require__(/*! ../internals/to-object */ \"./node_modules/core-js/internals/to-object.js\");\nvar toLength = __webpack_require__(/*! ../internals/to-length */ \"./node_modules/core-js/internals/to-length.js\");\nvar toInteger = __webpack_require__(/*! ../internals/to-integer */ \"./node_modules/core-js/internals/to-integer.js\");\nvar requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\nvar advanceStringIndex = __webpack_require__(/*! ../internals/advance-string-index */ \"./node_modules/core-js/internals/advance-string-index.js\");\nvar regExpExec = __webpack_require__(/*! ../internals/regexp-exec-abstract */ \"./node_modules/core-js/internals/regexp-exec-abstract.js\");\n\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\nfixRegExpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative) {\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\n return replacer !== undefined\n ? replacer.call(searchValue, O, replaceValue)\n : nativeReplace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regExpExec(rx, S);\n if (result === null) break;\n\n results.push(result);\n if (!global) break;\n\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n var matched = String(result[0]);\n var position = max(min(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return nativeReplace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlLmpzPzUzMTkiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIGZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlcicpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4Jyk7XG52YXIgcmVnRXhwRXhlYyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWdleHAtZXhlYy1hYnN0cmFjdCcpO1xuXG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xudmFyIFNVQlNUSVRVVElPTl9TWU1CT0xTID0gL1xcJChbJCYnYF18XFxkXFxkP3w8W14+XSo+KS9nO1xudmFyIFNVQlNUSVRVVElPTl9TWU1CT0xTX05PX05BTUVEID0gL1xcJChbJCYnYF18XFxkXFxkPykvZztcblxudmFyIG1heWJlVG9TdHJpbmcgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyBpdCA6IFN0cmluZyhpdCk7XG59O1xuXG4vLyBAQHJlcGxhY2UgbG9naWNcbmZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljKCdyZXBsYWNlJywgMiwgZnVuY3Rpb24gKFJFUExBQ0UsIG5hdGl2ZVJlcGxhY2UsIG1heWJlQ2FsbE5hdGl2ZSkge1xuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2VgIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUucmVwbGFjZVxuICAgIGZ1bmN0aW9uIHJlcGxhY2Uoc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSkge1xuICAgICAgdmFyIE8gPSByZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpO1xuICAgICAgdmFyIHJlcGxhY2VyID0gc2VhcmNoVmFsdWUgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2VhcmNoVmFsdWVbUkVQTEFDRV07XG4gICAgICByZXR1cm4gcmVwbGFjZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHJlcGxhY2VyLmNhbGwoc2VhcmNoVmFsdWUsIE8sIHJlcGxhY2VWYWx1ZSlcbiAgICAgICAgOiBuYXRpdmVSZXBsYWNlLmNhbGwoU3RyaW5nKE8pLCBzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKTtcbiAgICB9LFxuICAgIC8vIGBSZWdFeHAucHJvdG90eXBlW0BAcmVwbGFjZV1gIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUtQEByZXBsYWNlXG4gICAgZnVuY3Rpb24gKHJlZ2V4cCwgcmVwbGFjZVZhbHVlKSB7XG4gICAgICB2YXIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKG5hdGl2ZVJlcGxhY2UsIHJlZ2V4cCwgdGhpcywgcmVwbGFjZVZhbHVlKTtcbiAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcblxuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTtcbiAgICAgIHZhciBTID0gU3RyaW5nKHRoaXMpO1xuXG4gICAgICB2YXIgZnVuY3Rpb25hbFJlcGxhY2UgPSB0eXBlb2YgcmVwbGFjZVZhbHVlID09PSAnZnVuY3Rpb24nO1xuICAgICAgaWYgKCFmdW5jdGlvbmFsUmVwbGFjZSkgcmVwbGFjZVZhbHVlID0gU3RyaW5nKHJlcGxhY2VWYWx1ZSk7XG5cbiAgICAgIHZhciBnbG9iYWwgPSByeC5nbG9iYWw7XG4gICAgICBpZiAoZ2xvYmFsKSB7XG4gICAgICAgIHZhciBmdWxsVW5pY29kZSA9IHJ4LnVuaWNvZGU7XG4gICAgICAgIHJ4Lmxhc3RJbmRleCA9IDA7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlZ0V4cEV4ZWMocngsIFMpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSBicmVhaztcblxuICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgaWYgKCFnbG9iYWwpIGJyZWFrO1xuXG4gICAgICAgIHZhciBtYXRjaFN0ciA9IFN0cmluZyhyZXN1bHRbMF0pO1xuICAgICAgICBpZiAobWF0Y2hTdHIgPT09ICcnKSByeC5sYXN0SW5kZXggPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgdG9MZW5ndGgocngubGFzdEluZGV4KSwgZnVsbFVuaWNvZGUpO1xuICAgICAgfVxuXG4gICAgICB2YXIgYWNjdW11bGF0ZWRSZXN1bHQgPSAnJztcbiAgICAgIHZhciBuZXh0U291cmNlUG9zaXRpb24gPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdHNbaV07XG5cbiAgICAgICAgdmFyIG1hdGNoZWQgPSBTdHJpbmcocmVzdWx0WzBdKTtcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gbWF4KG1pbih0b0ludGVnZXIocmVzdWx0LmluZGV4KSwgUy5sZW5ndGgpLCAwKTtcbiAgICAgICAgdmFyIGNhcHR1cmVzID0gW107XG4gICAgICAgIC8vIE5PVEU6IFRoaXMgaXMgZXF1aXZhbGVudCB0b1xuICAgICAgICAvLyAgIGNhcHR1cmVzID0gcmVzdWx0LnNsaWNlKDEpLm1hcChtYXliZVRvU3RyaW5nKVxuICAgICAgICAvLyBidXQgZm9yIHNvbWUgcmVhc29uIGBuYXRpdmVTbGljZS5jYWxsKHJlc3VsdCwgMSwgcmVzdWx0Lmxlbmd0aClgIChjYWxsZWQgaW5cbiAgICAgICAgLy8gdGhlIHNsaWNlIHBvbHlmaWxsIHdoZW4gc2xpY2luZyBuYXRpdmUgYXJyYXlzKSBcImRvZXNuJ3Qgd29ya1wiIGluIHNhZmFyaSA5IGFuZFxuICAgICAgICAvLyBjYXVzZXMgYSBjcmFzaCAoaHR0cHM6Ly9wYXN0ZWJpbi5jb20vTjIxUXplUUEpIHdoZW4gdHJ5aW5nIHRvIGRlYnVnIGl0LlxuICAgICAgICBmb3IgKHZhciBqID0gMTsgaiA8IHJlc3VsdC5sZW5ndGg7IGorKykgY2FwdHVyZXMucHVzaChtYXliZVRvU3RyaW5nKHJlc3VsdFtqXSkpO1xuICAgICAgICB2YXIgbmFtZWRDYXB0dXJlcyA9IHJlc3VsdC5ncm91cHM7XG4gICAgICAgIGlmIChmdW5jdGlvbmFsUmVwbGFjZSkge1xuICAgICAgICAgIHZhciByZXBsYWNlckFyZ3MgPSBbbWF0Y2hlZF0uY29uY2F0KGNhcHR1cmVzLCBwb3NpdGlvbiwgUyk7XG4gICAgICAgICAgaWYgKG5hbWVkQ2FwdHVyZXMgIT09IHVuZGVmaW5lZCkgcmVwbGFjZXJBcmdzLnB1c2gobmFtZWRDYXB0dXJlcyk7XG4gICAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gU3RyaW5nKHJlcGxhY2VWYWx1ZS5hcHBseSh1bmRlZmluZWQsIHJlcGxhY2VyQXJncykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcGxhY2VtZW50ID0gZ2V0U3Vic3RpdHV0aW9uKG1hdGNoZWQsIFMsIHBvc2l0aW9uLCBjYXB0dXJlcywgbmFtZWRDYXB0dXJlcywgcmVwbGFjZVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zaXRpb24gPj0gbmV4dFNvdXJjZVBvc2l0aW9uKSB7XG4gICAgICAgICAgYWNjdW11bGF0ZWRSZXN1bHQgKz0gUy5zbGljZShuZXh0U291cmNlUG9zaXRpb24sIHBvc2l0aW9uKSArIHJlcGxhY2VtZW50O1xuICAgICAgICAgIG5leHRTb3VyY2VQb3NpdGlvbiA9IHBvc2l0aW9uICsgbWF0Y2hlZC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bXVsYXRlZFJlc3VsdCArIFMuc2xpY2UobmV4dFNvdXJjZVBvc2l0aW9uKTtcbiAgICB9XG4gIF07XG5cbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZ2V0c3Vic3RpdHV0aW9uXG4gIGZ1bmN0aW9uIGdldFN1YnN0aXR1dGlvbihtYXRjaGVkLCBzdHIsIHBvc2l0aW9uLCBjYXB0dXJlcywgbmFtZWRDYXB0dXJlcywgcmVwbGFjZW1lbnQpIHtcbiAgICB2YXIgdGFpbFBvcyA9IHBvc2l0aW9uICsgbWF0Y2hlZC5sZW5ndGg7XG4gICAgdmFyIG0gPSBjYXB0dXJlcy5sZW5ndGg7XG4gICAgdmFyIHN5bWJvbHMgPSBTVUJTVElUVVRJT05fU1lNQk9MU19OT19OQU1FRDtcbiAgICBpZiAobmFtZWRDYXB0dXJlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBuYW1lZENhcHR1cmVzID0gdG9PYmplY3QobmFtZWRDYXB0dXJlcyk7XG4gICAgICBzeW1ib2xzID0gU1VCU1RJVFVUSU9OX1NZTUJPTFM7XG4gICAgfVxuICAgIHJldHVybiBuYXRpdmVSZXBsYWNlLmNhbGwocmVwbGFjZW1lbnQsIHN5bWJvbHMsIGZ1bmN0aW9uIChtYXRjaCwgY2gpIHtcbiAgICAgIHZhciBjYXB0dXJlO1xuICAgICAgc3dpdGNoIChjaC5jaGFyQXQoMCkpIHtcbiAgICAgICAgY2FzZSAnJCc6IHJldHVybiAnJCc7XG4gICAgICAgIGNhc2UgJyYnOiByZXR1cm4gbWF0Y2hlZDtcbiAgICAgICAgY2FzZSAnYCc6IHJldHVybiBzdHIuc2xpY2UoMCwgcG9zaXRpb24pO1xuICAgICAgICBjYXNlIFwiJ1wiOiByZXR1cm4gc3RyLnNsaWNlKHRhaWxQb3MpO1xuICAgICAgICBjYXNlICc8JzpcbiAgICAgICAgICBjYXB0dXJlID0gbmFtZWRDYXB0dXJlc1tjaC5zbGljZSgxLCAtMSldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiAvLyBcXGRcXGQ/XG4gICAgICAgICAgdmFyIG4gPSArY2g7XG4gICAgICAgICAgaWYgKG4gPT09IDApIHJldHVybiBtYXRjaDtcbiAgICAgICAgICBpZiAobiA+IG0pIHtcbiAgICAgICAgICAgIHZhciBmID0gZmxvb3IobiAvIDEwKTtcbiAgICAgICAgICAgIGlmIChmID09PSAwKSByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgICBpZiAoZiA8PSBtKSByZXR1cm4gY2FwdHVyZXNbZiAtIDFdID09PSB1bmRlZmluZWQgPyBjaC5jaGFyQXQoMSkgOiBjYXB0dXJlc1tmIC0gMV0gKyBjaC5jaGFyQXQoMSk7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhcHR1cmUgPSBjYXB0dXJlc1tuIC0gMV07XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FwdHVyZSA9PT0gdW5kZWZpbmVkID8gJycgOiBjYXB0dXJlO1xuICAgIH0pO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.replace.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.search.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.search.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar fixRegExpWellKnownSymbolLogic = __webpack_require__(/*! ../internals/fix-regexp-well-known-symbol-logic */ \"./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js\");\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\nvar sameValue = __webpack_require__(/*! ../internals/same-value */ \"./node_modules/core-js/internals/same-value.js\");\nvar regExpExec = __webpack_require__(/*! ../internals/regexp-exec-abstract */ \"./node_modules/core-js/internals/regexp-exec-abstract.js\");\n\n// @@search logic\nfixRegExpWellKnownSymbolLogic('search', 1, function (SEARCH, nativeSearch, maybeCallNative) {\n return [\n // `String.prototype.search` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.search\n function search(regexp) {\n var O = requireObjectCoercible(this);\n var searcher = regexp == undefined ? undefined : regexp[SEARCH];\n return searcher !== undefined ? searcher.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n },\n // `RegExp.prototype[@@search]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n function (regexp) {\n var res = maybeCallNative(nativeSearch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var previousLastIndex = rx.lastIndex;\n if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n var result = regExpExec(rx, S);\n if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n return result === null ? -1 : result.index;\n }\n ];\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zZWFyY2guanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNlYXJjaC5qcz84NDFjIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBmaXhSZWdFeHBXZWxsS25vd25TeW1ib2xMb2dpYyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9maXgtcmVnZXhwLXdlbGwta25vd24tc3ltYm9sLWxvZ2ljJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcbnZhciBzYW1lVmFsdWUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2FtZS12YWx1ZScpO1xudmFyIHJlZ0V4cEV4ZWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QnKTtcblxuLy8gQEBzZWFyY2ggbG9naWNcbmZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljKCdzZWFyY2gnLCAxLCBmdW5jdGlvbiAoU0VBUkNILCBuYXRpdmVTZWFyY2gsIG1heWJlQ2FsbE5hdGl2ZSkge1xuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLnNlYXJjaGAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zZWFyY2hcbiAgICBmdW5jdGlvbiBzZWFyY2gocmVnZXhwKSB7XG4gICAgICB2YXIgTyA9IHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcyk7XG4gICAgICB2YXIgc2VhcmNoZXIgPSByZWdleHAgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcmVnZXhwW1NFQVJDSF07XG4gICAgICByZXR1cm4gc2VhcmNoZXIgIT09IHVuZGVmaW5lZCA/IHNlYXJjaGVyLmNhbGwocmVnZXhwLCBPKSA6IG5ldyBSZWdFeHAocmVnZXhwKVtTRUFSQ0hdKFN0cmluZyhPKSk7XG4gICAgfSxcbiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQHNlYXJjaF1gIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUtQEBzZWFyY2hcbiAgICBmdW5jdGlvbiAocmVnZXhwKSB7XG4gICAgICB2YXIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKG5hdGl2ZVNlYXJjaCwgcmVnZXhwLCB0aGlzKTtcbiAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcblxuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTtcbiAgICAgIHZhciBTID0gU3RyaW5nKHRoaXMpO1xuXG4gICAgICB2YXIgcHJldmlvdXNMYXN0SW5kZXggPSByeC5sYXN0SW5kZXg7XG4gICAgICBpZiAoIXNhbWVWYWx1ZShwcmV2aW91c0xhc3RJbmRleCwgMCkpIHJ4Lmxhc3RJbmRleCA9IDA7XG4gICAgICB2YXIgcmVzdWx0ID0gcmVnRXhwRXhlYyhyeCwgUyk7XG4gICAgICBpZiAoIXNhbWVWYWx1ZShyeC5sYXN0SW5kZXgsIHByZXZpb3VzTGFzdEluZGV4KSkgcngubGFzdEluZGV4ID0gcHJldmlvdXNMYXN0SW5kZXg7XG4gICAgICByZXR1cm4gcmVzdWx0ID09PSBudWxsID8gLTEgOiByZXN1bHQuaW5kZXg7XG4gICAgfVxuICBdO1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.search.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.small.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.small.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createHTML = __webpack_require__(/*! ../internals/create-html */ \"./node_modules/core-js/internals/create-html.js\");\nvar forcedStringHTMLMethod = __webpack_require__(/*! ../internals/forced-string-html-method */ \"./node_modules/core-js/internals/forced-string-html-method.js\");\n\n// `String.prototype.small` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.small\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('small') }, {\n small: function small() {\n return createHTML(this, 'small', '', '');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zbWFsbC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc21hbGwuanM/Yzk2YSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjcmVhdGVIVE1MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1odG1sJyk7XG52YXIgZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnNtYWxsYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuc21hbGxcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kKCdzbWFsbCcpIH0sIHtcbiAgc21hbGw6IGZ1bmN0aW9uIHNtYWxsKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdzbWFsbCcsICcnLCAnJyk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.small.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.split.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.split.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar fixRegExpWellKnownSymbolLogic = __webpack_require__(/*! ../internals/fix-regexp-well-known-symbol-logic */ \"./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js\");\nvar isRegExp = __webpack_require__(/*! ../internals/is-regexp */ \"./node_modules/core-js/internals/is-regexp.js\");\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\nvar speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ \"./node_modules/core-js/internals/species-constructor.js\");\nvar advanceStringIndex = __webpack_require__(/*! ../internals/advance-string-index */ \"./node_modules/core-js/internals/advance-string-index.js\");\nvar toLength = __webpack_require__(/*! ../internals/to-length */ \"./node_modules/core-js/internals/to-length.js\");\nvar callRegExpExec = __webpack_require__(/*! ../internals/regexp-exec-abstract */ \"./node_modules/core-js/internals/regexp-exec-abstract.js\");\nvar regexpExec = __webpack_require__(/*! ../internals/regexp-exec */ \"./node_modules/core-js/internals/regexp-exec.js\");\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\n\nvar arrayPush = [].push;\nvar min = Math.min;\nvar MAX_UINT32 = 0xFFFFFFFF;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { return !RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\nfixRegExpWellKnownSymbolLogic('split', 2, function (SPLIT, nativeSplit, maybeCallNative) {\n var internalSplit;\n if (\n 'abbc'.split(/(b)*/)[1] == 'c' ||\n 'test'.split(/(?:)/, -1).length != 4 ||\n 'ab'.split(/(?:ab)*/).length != 2 ||\n '.'.split(/(.?)(.?)/).length != 4 ||\n '.'.split(/()()/).length > 1 ||\n ''.split(/.?/).length\n ) {\n // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(requireObjectCoercible(this));\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (separator === undefined) return [string];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) {\n return nativeSplit.call(string, separator, lim);\n }\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy.lastIndex;\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\n lastLength = match[0].length;\n lastLastIndex = lastIndex;\n if (output.length >= lim) break;\n }\n if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop\n }\n if (lastLastIndex === string.length) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output.length > lim ? output.slice(0, lim) : output;\n };\n // Chakra, V8\n } else if ('0'.split(undefined, 0).length) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\n };\n } else internalSplit = nativeSplit;\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = requireObjectCoercible(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n}, !SUPPORTS_Y);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zcGxpdC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc3BsaXQuanM/MTI3NiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgZml4UmVnRXhwV2VsbEtub3duU3ltYm9sTG9naWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYycpO1xudmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXJlZ2V4cCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciBhZHZhbmNlU3RyaW5nSW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWR2YW5jZS1zdHJpbmctaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciBjYWxsUmVnRXhwRXhlYyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWdleHAtZXhlYy1hYnN0cmFjdCcpO1xudmFyIHJlZ2V4cEV4ZWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG52YXIgYXJyYXlQdXNoID0gW10ucHVzaDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbnZhciBNQVhfVUlOVDMyID0gMHhGRkZGRkZGRjtcblxuLy8gYmFiZWwtbWluaWZ5IHRyYW5zcGlsZXMgUmVnRXhwKCd4JywgJ3knKSAtPiAveC95IGFuZCBpdCBjYXVzZXMgU3ludGF4RXJyb3JcbnZhciBTVVBQT1JUU19ZID0gIWZhaWxzKGZ1bmN0aW9uICgpIHsgcmV0dXJuICFSZWdFeHAoTUFYX1VJTlQzMiwgJ3knKTsgfSk7XG5cbi8vIEBAc3BsaXQgbG9naWNcbmZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljKCdzcGxpdCcsIDIsIGZ1bmN0aW9uIChTUExJVCwgbmF0aXZlU3BsaXQsIG1heWJlQ2FsbE5hdGl2ZSkge1xuICB2YXIgaW50ZXJuYWxTcGxpdDtcbiAgaWYgKFxuICAgICdhYmJjJy5zcGxpdCgvKGIpKi8pWzFdID09ICdjJyB8fFxuICAgICd0ZXN0Jy5zcGxpdCgvKD86KS8sIC0xKS5sZW5ndGggIT0gNCB8fFxuICAgICdhYicuc3BsaXQoLyg/OmFiKSovKS5sZW5ndGggIT0gMiB8fFxuICAgICcuJy5zcGxpdCgvKC4/KSguPykvKS5sZW5ndGggIT0gNCB8fFxuICAgICcuJy5zcGxpdCgvKCkoKS8pLmxlbmd0aCA+IDEgfHxcbiAgICAnJy5zcGxpdCgvLj8vKS5sZW5ndGhcbiAgKSB7XG4gICAgLy8gYmFzZWQgb24gZXM1LXNoaW0gaW1wbGVtZW50YXRpb24sIG5lZWQgdG8gcmV3b3JrIGl0XG4gICAgaW50ZXJuYWxTcGxpdCA9IGZ1bmN0aW9uIChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICB2YXIgc3RyaW5nID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpO1xuICAgICAgdmFyIGxpbSA9IGxpbWl0ID09PSB1bmRlZmluZWQgPyBNQVhfVUlOVDMyIDogbGltaXQgPj4+IDA7XG4gICAgICBpZiAobGltID09PSAwKSByZXR1cm4gW107XG4gICAgICBpZiAoc2VwYXJhdG9yID09PSB1bmRlZmluZWQpIHJldHVybiBbc3RyaW5nXTtcbiAgICAgIC8vIElmIGBzZXBhcmF0b3JgIGlzIG5vdCBhIHJlZ2V4LCB1c2UgbmF0aXZlIHNwbGl0XG4gICAgICBpZiAoIWlzUmVnRXhwKHNlcGFyYXRvcikpIHtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZVNwbGl0LmNhbGwoc3RyaW5nLCBzZXBhcmF0b3IsIGxpbSk7XG4gICAgICB9XG4gICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICB2YXIgZmxhZ3MgPSAoc2VwYXJhdG9yLmlnbm9yZUNhc2UgPyAnaScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci5tdWx0aWxpbmUgPyAnbScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci51bmljb2RlID8gJ3UnIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3Iuc3RpY2t5ID8gJ3knIDogJycpO1xuICAgICAgdmFyIGxhc3RMYXN0SW5kZXggPSAwO1xuICAgICAgLy8gTWFrZSBgZ2xvYmFsYCBhbmQgYXZvaWQgYGxhc3RJbmRleGAgaXNzdWVzIGJ5IHdvcmtpbmcgd2l0aCBhIGNvcHlcbiAgICAgIHZhciBzZXBhcmF0b3JDb3B5ID0gbmV3IFJlZ0V4cChzZXBhcmF0b3Iuc291cmNlLCBmbGFncyArICdnJyk7XG4gICAgICB2YXIgbWF0Y2gsIGxhc3RJbmRleCwgbGFzdExlbmd0aDtcbiAgICAgIHdoaWxlIChtYXRjaCA9IHJlZ2V4cEV4ZWMuY2FsbChzZXBhcmF0b3JDb3B5LCBzdHJpbmcpKSB7XG4gICAgICAgIGxhc3RJbmRleCA9IHNlcGFyYXRvckNvcHkubGFzdEluZGV4O1xuICAgICAgICBpZiAobGFzdEluZGV4ID4gbGFzdExhc3RJbmRleCkge1xuICAgICAgICAgIG91dHB1dC5wdXNoKHN0cmluZy5zbGljZShsYXN0TGFzdEluZGV4LCBtYXRjaC5pbmRleCkpO1xuICAgICAgICAgIGlmIChtYXRjaC5sZW5ndGggPiAxICYmIG1hdGNoLmluZGV4IDwgc3RyaW5nLmxlbmd0aCkgYXJyYXlQdXNoLmFwcGx5KG91dHB1dCwgbWF0Y2guc2xpY2UoMSkpO1xuICAgICAgICAgIGxhc3RMZW5ndGggPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgICAgbGFzdExhc3RJbmRleCA9IGxhc3RJbmRleDtcbiAgICAgICAgICBpZiAob3V0cHV0Lmxlbmd0aCA+PSBsaW0pIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXBhcmF0b3JDb3B5Lmxhc3RJbmRleCA9PT0gbWF0Y2guaW5kZXgpIHNlcGFyYXRvckNvcHkubGFzdEluZGV4Kys7IC8vIEF2b2lkIGFuIGluZmluaXRlIGxvb3BcbiAgICAgIH1cbiAgICAgIGlmIChsYXN0TGFzdEluZGV4ID09PSBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICAgIGlmIChsYXN0TGVuZ3RoIHx8ICFzZXBhcmF0b3JDb3B5LnRlc3QoJycpKSBvdXRwdXQucHVzaCgnJyk7XG4gICAgICB9IGVsc2Ugb3V0cHV0LnB1c2goc3RyaW5nLnNsaWNlKGxhc3RMYXN0SW5kZXgpKTtcbiAgICAgIHJldHVybiBvdXRwdXQubGVuZ3RoID4gbGltID8gb3V0cHV0LnNsaWNlKDAsIGxpbSkgOiBvdXRwdXQ7XG4gICAgfTtcbiAgLy8gQ2hha3JhLCBWOFxuICB9IGVsc2UgaWYgKCcwJy5zcGxpdCh1bmRlZmluZWQsIDApLmxlbmd0aCkge1xuICAgIGludGVybmFsU3BsaXQgPSBmdW5jdGlvbiAoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgcmV0dXJuIHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkICYmIGxpbWl0ID09PSAwID8gW10gOiBuYXRpdmVTcGxpdC5jYWxsKHRoaXMsIHNlcGFyYXRvciwgbGltaXQpO1xuICAgIH07XG4gIH0gZWxzZSBpbnRlcm5hbFNwbGl0ID0gbmF0aXZlU3BsaXQ7XG5cbiAgcmV0dXJuIFtcbiAgICAvLyBgU3RyaW5nLnByb3RvdHlwZS5zcGxpdGAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zcGxpdFxuICAgIGZ1bmN0aW9uIHNwbGl0KHNlcGFyYXRvciwgbGltaXQpIHtcbiAgICAgIHZhciBPID0gcmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKTtcbiAgICAgIHZhciBzcGxpdHRlciA9IHNlcGFyYXRvciA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzZXBhcmF0b3JbU1BMSVRdO1xuICAgICAgcmV0dXJuIHNwbGl0dGVyICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBzcGxpdHRlci5jYWxsKHNlcGFyYXRvciwgTywgbGltaXQpXG4gICAgICAgIDogaW50ZXJuYWxTcGxpdC5jYWxsKFN0cmluZyhPKSwgc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgfSxcbiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQHNwbGl0XWAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVnZXhwLnByb3RvdHlwZS1AQHNwbGl0XG4gICAgLy9cbiAgICAvLyBOT1RFOiBUaGlzIGNhbm5vdCBiZSBwcm9wZXJseSBwb2x5ZmlsbGVkIGluIGVuZ2luZXMgdGhhdCBkb24ndCBzdXBwb3J0XG4gICAgLy8gdGhlICd5JyBmbGFnLlxuICAgIGZ1bmN0aW9uIChyZWdleHAsIGxpbWl0KSB7XG4gICAgICB2YXIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKGludGVybmFsU3BsaXQsIHJlZ2V4cCwgdGhpcywgbGltaXQsIGludGVybmFsU3BsaXQgIT09IG5hdGl2ZVNwbGl0KTtcbiAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcblxuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTtcbiAgICAgIHZhciBTID0gU3RyaW5nKHRoaXMpO1xuICAgICAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IocngsIFJlZ0V4cCk7XG5cbiAgICAgIHZhciB1bmljb2RlTWF0Y2hpbmcgPSByeC51bmljb2RlO1xuICAgICAgdmFyIGZsYWdzID0gKHJ4Lmlnbm9yZUNhc2UgPyAnaScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHJ4Lm11bHRpbGluZSA/ICdtJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAocngudW5pY29kZSA/ICd1JyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAoU1VQUE9SVFNfWSA/ICd5JyA6ICdnJyk7XG5cbiAgICAgIC8vIF4oPyArIHJ4ICsgKSBpcyBuZWVkZWQsIGluIGNvbWJpbmF0aW9uIHdpdGggc29tZSBTIHNsaWNpbmcsIHRvXG4gICAgICAvLyBzaW11bGF0ZSB0aGUgJ3knIGZsYWcuXG4gICAgICB2YXIgc3BsaXR0ZXIgPSBuZXcgQyhTVVBQT1JUU19ZID8gcnggOiAnXig/OicgKyByeC5zb3VyY2UgKyAnKScsIGZsYWdzKTtcbiAgICAgIHZhciBsaW0gPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gTUFYX1VJTlQzMiA6IGxpbWl0ID4+PiAwO1xuICAgICAgaWYgKGxpbSA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgaWYgKFMubGVuZ3RoID09PSAwKSByZXR1cm4gY2FsbFJlZ0V4cEV4ZWMoc3BsaXR0ZXIsIFMpID09PSBudWxsID8gW1NdIDogW107XG4gICAgICB2YXIgcCA9IDA7XG4gICAgICB2YXIgcSA9IDA7XG4gICAgICB2YXIgQSA9IFtdO1xuICAgICAgd2hpbGUgKHEgPCBTLmxlbmd0aCkge1xuICAgICAgICBzcGxpdHRlci5sYXN0SW5kZXggPSBTVVBQT1JUU19ZID8gcSA6IDA7XG4gICAgICAgIHZhciB6ID0gY2FsbFJlZ0V4cEV4ZWMoc3BsaXR0ZXIsIFNVUFBPUlRTX1kgPyBTIDogUy5zbGljZShxKSk7XG4gICAgICAgIHZhciBlO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgeiA9PT0gbnVsbCB8fFxuICAgICAgICAgIChlID0gbWluKHRvTGVuZ3RoKHNwbGl0dGVyLmxhc3RJbmRleCArIChTVVBQT1JUU19ZID8gMCA6IHEpKSwgUy5sZW5ndGgpKSA9PT0gcFxuICAgICAgICApIHtcbiAgICAgICAgICBxID0gYWR2YW5jZVN0cmluZ0luZGV4KFMsIHEsIHVuaWNvZGVNYXRjaGluZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgQS5wdXNoKFMuc2xpY2UocCwgcSkpO1xuICAgICAgICAgIGlmIChBLmxlbmd0aCA9PT0gbGltKSByZXR1cm4gQTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8PSB6Lmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgQS5wdXNoKHpbaV0pO1xuICAgICAgICAgICAgaWYgKEEubGVuZ3RoID09PSBsaW0pIHJldHVybiBBO1xuICAgICAgICAgIH1cbiAgICAgICAgICBxID0gcCA9IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIEEucHVzaChTLnNsaWNlKHApKTtcbiAgICAgIHJldHVybiBBO1xuICAgIH1cbiAgXTtcbn0sICFTVVBQT1JUU19ZKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.split.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.starts-with.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.starts-with.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar toLength = __webpack_require__(/*! ../internals/to-length */ \"./node_modules/core-js/internals/to-length.js\");\nvar validateArguments = __webpack_require__(/*! ../internals/validate-string-method-arguments */ \"./node_modules/core-js/internals/validate-string-method-arguments.js\");\nvar correctIsRegExpLogic = __webpack_require__(/*! ../internals/correct-is-regexp-logic */ \"./node_modules/core-js/internals/correct-is-regexp-logic.js\");\n\nvar STARTS_WITH = 'startsWith';\nvar nativeStartsWith = ''[STARTS_WITH];\n\n// `String.prototype.startsWith` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.startswith\n$({ target: 'String', proto: true, forced: !correctIsRegExpLogic(STARTS_WITH) }, {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = validateArguments(this, searchString, STARTS_WITH);\n var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return nativeStartsWith\n ? nativeStartsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zdGFydHMtd2l0aC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc3RhcnRzLXdpdGguanM/MmNhMCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciB2YWxpZGF0ZUFyZ3VtZW50cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy92YWxpZGF0ZS1zdHJpbmctbWV0aG9kLWFyZ3VtZW50cycpO1xudmFyIGNvcnJlY3RJc1JlZ0V4cExvZ2ljID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcnJlY3QtaXMtcmVnZXhwLWxvZ2ljJyk7XG5cbnZhciBTVEFSVFNfV0lUSCA9ICdzdGFydHNXaXRoJztcbnZhciBuYXRpdmVTdGFydHNXaXRoID0gJydbU1RBUlRTX1dJVEhdO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuc3RhcnRzd2l0aFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFjb3JyZWN0SXNSZWdFeHBMb2dpYyhTVEFSVFNfV0lUSCkgfSwge1xuICBzdGFydHNXaXRoOiBmdW5jdGlvbiBzdGFydHNXaXRoKHNlYXJjaFN0cmluZyAvKiAsIHBvc2l0aW9uID0gMCAqLykge1xuICAgIHZhciB0aGF0ID0gdmFsaWRhdGVBcmd1bWVudHModGhpcywgc2VhcmNoU3RyaW5nLCBTVEFSVFNfV0lUSCk7XG4gICAgdmFyIGluZGV4ID0gdG9MZW5ndGgoTWF0aC5taW4oYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIHRoYXQubGVuZ3RoKSk7XG4gICAgdmFyIHNlYXJjaCA9IFN0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgIHJldHVybiBuYXRpdmVTdGFydHNXaXRoXG4gICAgICA/IG5hdGl2ZVN0YXJ0c1dpdGguY2FsbCh0aGF0LCBzZWFyY2gsIGluZGV4KVxuICAgICAgOiB0aGF0LnNsaWNlKGluZGV4LCBpbmRleCArIHNlYXJjaC5sZW5ndGgpID09PSBzZWFyY2g7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.starts-with.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.strike.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.strike.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createHTML = __webpack_require__(/*! ../internals/create-html */ \"./node_modules/core-js/internals/create-html.js\");\nvar forcedStringHTMLMethod = __webpack_require__(/*! ../internals/forced-string-html-method */ \"./node_modules/core-js/internals/forced-string-html-method.js\");\n\n// `String.prototype.strike` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.strike\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('strike') }, {\n strike: function strike() {\n return createHTML(this, 'strike', '', '');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zdHJpa2UuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN0cmlrZS5qcz8yMzE1Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNyZWF0ZUhUTUwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWh0bWwnKTtcbnZhciBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuc3RyaWtlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuc3RyaWtlXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCgnc3RyaWtlJykgfSwge1xuICBzdHJpa2U6IGZ1bmN0aW9uIHN0cmlrZSgpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnc3RyaWtlJywgJycsICcnKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.strike.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.sub.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.sub.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createHTML = __webpack_require__(/*! ../internals/create-html */ \"./node_modules/core-js/internals/create-html.js\");\nvar forcedStringHTMLMethod = __webpack_require__(/*! ../internals/forced-string-html-method */ \"./node_modules/core-js/internals/forced-string-html-method.js\");\n\n// `String.prototype.sub` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.sub\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('sub') }, {\n sub: function sub() {\n return createHTML(this, 'sub', '', '');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zdWIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN1Yi5qcz80YzUzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNyZWF0ZUhUTUwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWh0bWwnKTtcbnZhciBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuc3ViYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuc3ViXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCgnc3ViJykgfSwge1xuICBzdWI6IGZ1bmN0aW9uIHN1YigpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnc3ViJywgJycsICcnKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.sub.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.sup.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.sup.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createHTML = __webpack_require__(/*! ../internals/create-html */ \"./node_modules/core-js/internals/create-html.js\");\nvar forcedStringHTMLMethod = __webpack_require__(/*! ../internals/forced-string-html-method */ \"./node_modules/core-js/internals/forced-string-html-method.js\");\n\n// `String.prototype.sup` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.sup\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('sup') }, {\n sup: function sup() {\n return createHTML(this, 'sup', '', '');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zdXAuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN1cC5qcz82NjRmIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNyZWF0ZUhUTUwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWh0bWwnKTtcbnZhciBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuc3VwYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuc3VwXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCgnc3VwJykgfSwge1xuICBzdXA6IGZ1bmN0aW9uIHN1cCgpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnc3VwJywgJycsICcnKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.sup.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.trim-end.js":
+/*!************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.trim-end.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar internalStringTrim = __webpack_require__(/*! ../internals/string-trim */ \"./node_modules/core-js/internals/string-trim.js\");\nvar forcedStringTrimMethod = __webpack_require__(/*! ../internals/forced-string-trim-method */ \"./node_modules/core-js/internals/forced-string-trim-method.js\");\n\nvar FORCED = forcedStringTrimMethod('trimEnd');\n\nvar trimEnd = FORCED ? function trimEnd() {\n return internalStringTrim(this, 2);\n} : ''.trimEnd;\n\n// `String.prototype.{ trimEnd, trimRight }` methods\n// https://github.com/tc39/ecmascript-string-left-right-trim\n$({ target: 'String', proto: true, forced: FORCED }, {\n trimEnd: trimEnd,\n trimRight: trimEnd\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLWVuZC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcudHJpbS1lbmQuanM/MWUyNSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpbnRlcm5hbFN0cmluZ1RyaW0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXRyaW0nKTtcbnZhciBmb3JjZWRTdHJpbmdUcmltTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctdHJpbS1tZXRob2QnKTtcblxudmFyIEZPUkNFRCA9IGZvcmNlZFN0cmluZ1RyaW1NZXRob2QoJ3RyaW1FbmQnKTtcblxudmFyIHRyaW1FbmQgPSBGT1JDRUQgPyBmdW5jdGlvbiB0cmltRW5kKCkge1xuICByZXR1cm4gaW50ZXJuYWxTdHJpbmdUcmltKHRoaXMsIDIpO1xufSA6ICcnLnRyaW1FbmQ7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnsgdHJpbUVuZCwgdHJpbVJpZ2h0IH1gIG1ldGhvZHNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L2VjbWFzY3JpcHQtc3RyaW5nLWxlZnQtcmlnaHQtdHJpbVxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIHRyaW1FbmQ6IHRyaW1FbmQsXG4gIHRyaW1SaWdodDogdHJpbUVuZFxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.trim-end.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.trim-start.js":
+/*!**************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.trim-start.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar internalStringTrim = __webpack_require__(/*! ../internals/string-trim */ \"./node_modules/core-js/internals/string-trim.js\");\nvar forcedStringTrimMethod = __webpack_require__(/*! ../internals/forced-string-trim-method */ \"./node_modules/core-js/internals/forced-string-trim-method.js\");\n\nvar FORCED = forcedStringTrimMethod('trimStart');\n\nvar trimStart = FORCED ? function trimStart() {\n return internalStringTrim(this, 1);\n} : ''.trimStart;\n\n// `String.prototype.{ trimStart, trimLeft }` methods\n// https://github.com/tc39/ecmascript-string-left-right-trim\n$({ target: 'String', proto: true, forced: FORCED }, {\n trimStart: trimStart,\n trimLeft: trimStart\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLXN0YXJ0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLXN0YXJ0LmpzP2VlZTciXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaW50ZXJuYWxTdHJpbmdUcmltID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy10cmltJyk7XG52YXIgZm9yY2VkU3RyaW5nVHJpbU1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLXRyaW0tbWV0aG9kJyk7XG5cbnZhciBGT1JDRUQgPSBmb3JjZWRTdHJpbmdUcmltTWV0aG9kKCd0cmltU3RhcnQnKTtcblxudmFyIHRyaW1TdGFydCA9IEZPUkNFRCA/IGZ1bmN0aW9uIHRyaW1TdGFydCgpIHtcbiAgcmV0dXJuIGludGVybmFsU3RyaW5nVHJpbSh0aGlzLCAxKTtcbn0gOiAnJy50cmltU3RhcnQ7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnsgdHJpbVN0YXJ0LCB0cmltTGVmdCB9YCBtZXRob2RzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9lY21hc2NyaXB0LXN0cmluZy1sZWZ0LXJpZ2h0LXRyaW1cbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICB0cmltU3RhcnQ6IHRyaW1TdGFydCxcbiAgdHJpbUxlZnQ6IHRyaW1TdGFydFxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.trim-start.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.trim.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.trim.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar internalStringTrim = __webpack_require__(/*! ../internals/string-trim */ \"./node_modules/core-js/internals/string-trim.js\");\nvar forcedStringTrimMethod = __webpack_require__(/*! ../internals/forced-string-trim-method */ \"./node_modules/core-js/internals/forced-string-trim-method.js\");\n\nvar FORCED = forcedStringTrimMethod('trim');\n\n// `String.prototype.trim` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.trim\n$({ target: 'String', proto: true, forced: FORCED }, {\n trim: function trim() {\n return internalStringTrim(this, 3);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLmpzPzQ5OGEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaW50ZXJuYWxTdHJpbmdUcmltID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy10cmltJyk7XG52YXIgZm9yY2VkU3RyaW5nVHJpbU1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLXRyaW0tbWV0aG9kJyk7XG5cbnZhciBGT1JDRUQgPSBmb3JjZWRTdHJpbmdUcmltTWV0aG9kKCd0cmltJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnRyaW1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgdHJpbTogZnVuY3Rpb24gdHJpbSgpIHtcbiAgICByZXR1cm4gaW50ZXJuYWxTdHJpbmdUcmltKHRoaXMsIDMpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.trim.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/web.dom-collections.iterator.js":
+/*!**********************************************************************!*\
+ !*** ./node_modules/core-js/modules/web.dom-collections.iterator.js ***!
+ \**********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar DOMIterables = __webpack_require__(/*! ../internals/dom-iterables */ \"./node_modules/core-js/internals/dom-iterables.js\");\nvar ArrayIteratorMethods = __webpack_require__(/*! ../modules/es.array.iterator */ \"./node_modules/core-js/modules/es.array.iterator.js\");\nvar hide = __webpack_require__(/*! ../internals/hide */ \"./node_modules/core-js/internals/hide.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar ArrayValues = ArrayIteratorMethods.values;\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n if (CollectionPrototype) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[ITERATOR] !== ArrayValues) try {\n hide(CollectionPrototype, ITERATOR, ArrayValues);\n } catch (error) {\n CollectionPrototype[ITERATOR] = ArrayValues;\n }\n if (!CollectionPrototype[TO_STRING_TAG]) hide(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);\n if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {\n hide(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);\n } catch (error) {\n CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];\n }\n }\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3IuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvci5qcz9kZGIwIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgRE9NSXRlcmFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMnKTtcbnZhciBBcnJheUl0ZXJhdG9yTWV0aG9kcyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGUnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgQXJyYXlWYWx1ZXMgPSBBcnJheUl0ZXJhdG9yTWV0aG9kcy52YWx1ZXM7XG5cbmZvciAodmFyIENPTExFQ1RJT05fTkFNRSBpbiBET01JdGVyYWJsZXMpIHtcbiAgdmFyIENvbGxlY3Rpb24gPSBnbG9iYWxbQ09MTEVDVElPTl9OQU1FXTtcbiAgdmFyIENvbGxlY3Rpb25Qcm90b3R5cGUgPSBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlO1xuICBpZiAoQ29sbGVjdGlvblByb3RvdHlwZSkge1xuICAgIC8vIHNvbWUgQ2hyb21lIHZlcnNpb25zIGhhdmUgbm9uLWNvbmZpZ3VyYWJsZSBtZXRob2RzIG9uIERPTVRva2VuTGlzdFxuICAgIGlmIChDb2xsZWN0aW9uUHJvdG90eXBlW0lURVJBVE9SXSAhPT0gQXJyYXlWYWx1ZXMpIHRyeSB7XG4gICAgICBoaWRlKENvbGxlY3Rpb25Qcm90b3R5cGUsIElURVJBVE9SLCBBcnJheVZhbHVlcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIENvbGxlY3Rpb25Qcm90b3R5cGVbSVRFUkFUT1JdID0gQXJyYXlWYWx1ZXM7XG4gICAgfVxuICAgIGlmICghQ29sbGVjdGlvblByb3RvdHlwZVtUT19TVFJJTkdfVEFHXSkgaGlkZShDb2xsZWN0aW9uUHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCBDT0xMRUNUSU9OX05BTUUpO1xuICAgIGlmIChET01JdGVyYWJsZXNbQ09MTEVDVElPTl9OQU1FXSkgZm9yICh2YXIgTUVUSE9EX05BTUUgaW4gQXJyYXlJdGVyYXRvck1ldGhvZHMpIHtcbiAgICAgIC8vIHNvbWUgQ2hyb21lIHZlcnNpb25zIGhhdmUgbm9uLWNvbmZpZ3VyYWJsZSBtZXRob2RzIG9uIERPTVRva2VuTGlzdFxuICAgICAgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGVbTUVUSE9EX05BTUVdICE9PSBBcnJheUl0ZXJhdG9yTWV0aG9kc1tNRVRIT0RfTkFNRV0pIHRyeSB7XG4gICAgICAgIGhpZGUoQ29sbGVjdGlvblByb3RvdHlwZSwgTUVUSE9EX05BTUUsIEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBDb2xsZWN0aW9uUHJvdG90eXBlW01FVEhPRF9OQU1FXSA9IEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/web.dom-collections.iterator.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/core-util-is/lib/util.js":
+/*!***********************************************!*\
+ !*** ./node_modules/core-util-is/lib/util.js ***!
+ \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/* WEBPACK VAR INJECTION */(function(Buffer) {// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\n\nfunction isArray(arg) {\n if (Array.isArray) {\n return Array.isArray(arg);\n }\n return objectToString(arg) === '[object Array]';\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n return objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n return objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n return (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n return arg === null ||\n typeof arg === 'boolean' ||\n typeof arg === 'number' ||\n typeof arg === 'string' ||\n typeof arg === 'symbol' || // ES6 symbol\n typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = Buffer.isBuffer;\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../buffer/index.js */ \"./node_modules/buffer/index.js\").Buffer))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS11dGlsLWlzL2xpYi91dGlsLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS11dGlsLWlzL2xpYi91dGlsLmpzPzNhN2MiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIE5PVEU6IFRoZXNlIHR5cGUgY2hlY2tpbmcgZnVuY3Rpb25zIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGBpbnN0YW5jZW9mYFxuLy8gYmVjYXVzZSBpdCBpcyBmcmFnaWxlIGFuZCBjYW4gYmUgZWFzaWx5IGZha2VkIHdpdGggYE9iamVjdC5jcmVhdGUoKWAuXG5cbmZ1bmN0aW9uIGlzQXJyYXkoYXJnKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJnKTtcbiAgfVxuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcoYXJnKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn1cbmV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJztcbn1cbmV4cG9ydHMuaXNCb29sZWFuID0gaXNCb29sZWFuO1xuXG5mdW5jdGlvbiBpc051bGwoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbCA9IGlzTnVsbDtcblxuZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQgPSBpc051bGxPclVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydHMuaXNOdW1iZXIgPSBpc051bWJlcjtcblxuZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcbn1cbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZztcblxuZnVuY3Rpb24gaXNTeW1ib2woYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3ltYm9sJztcbn1cbmV4cG9ydHMuaXNTeW1ib2wgPSBpc1N5bWJvbDtcblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbmV4cG9ydHMuaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNSZWdFeHAocmUpIHtcbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5leHBvcnRzLmlzUmVnRXhwID0gaXNSZWdFeHA7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuXG5mdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cbmV4cG9ydHMuaXNEYXRlID0gaXNEYXRlO1xuXG5mdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IEJ1ZmZlci5pc0J1ZmZlcjtcblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-util-is/lib/util.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/events/events.js":
+/*!***************************************!*\
+ !*** ./node_modules/events/events.js ***!
+ \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction $getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return $getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = $getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n var args = [];\n for (var i = 0; i < arguments.length; i++) args.push(arguments[i]);\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n ReflectApply(this.listener, this.target, args);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanM/ZmFhMSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUiA9IHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyA/IFJlZmxlY3QgOiBudWxsXG52YXIgUmVmbGVjdEFwcGx5ID0gUiAmJiB0eXBlb2YgUi5hcHBseSA9PT0gJ2Z1bmN0aW9uJ1xuICA/IFIuYXBwbHlcbiAgOiBmdW5jdGlvbiBSZWZsZWN0QXBwbHkodGFyZ2V0LCByZWNlaXZlciwgYXJncykge1xuICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbCh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKTtcbiAgfVxuXG52YXIgUmVmbGVjdE93bktleXNcbmlmIChSICYmIHR5cGVvZiBSLm93bktleXMgPT09ICdmdW5jdGlvbicpIHtcbiAgUmVmbGVjdE93bktleXMgPSBSLm93bktleXNcbn0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICBSZWZsZWN0T3duS2V5cyA9IGZ1bmN0aW9uIFJlZmxlY3RPd25LZXlzKHRhcmdldCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpXG4gICAgICAuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModGFyZ2V0KSk7XG4gIH07XG59IGVsc2Uge1xuICBSZWZsZWN0T3duS2V5cyA9IGZ1bmN0aW9uIFJlZmxlY3RPd25LZXlzKHRhcmdldCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBQcm9jZXNzRW1pdFdhcm5pbmcod2FybmluZykge1xuICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbn1cblxudmFyIE51bWJlcklzTmFOID0gTnVtYmVyLmlzTmFOIHx8IGZ1bmN0aW9uIE51bWJlcklzTmFOKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgRXZlbnRFbWl0dGVyLmluaXQuY2FsbCh0aGlzKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50c0NvdW50ID0gMDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxudmFyIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50RW1pdHRlciwgJ2RlZmF1bHRNYXhMaXN0ZW5lcnMnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24oYXJnKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgIT09ICdudW1iZXInIHx8IGFyZyA8IDAgfHwgTnVtYmVySXNOYU4oYXJnKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcImRlZmF1bHRNYXhMaXN0ZW5lcnNcIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnICsgYXJnICsgJy4nKTtcbiAgICB9XG4gICAgZGVmYXVsdE1heExpc3RlbmVycyA9IGFyZztcbiAgfVxufSk7XG5cbkV2ZW50RW1pdHRlci5pbml0ID0gZnVuY3Rpb24oKSB7XG5cbiAgaWYgKHRoaXMuX2V2ZW50cyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLl9ldmVudHMgPT09IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSB7XG4gICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gIH1cblxuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSB0aGlzLl9tYXhMaXN0ZW5lcnMgfHwgdW5kZWZpbmVkO1xufTtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKG4pIHtcbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuIDwgMCB8fCBOdW1iZXJJc05hTihuKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJuXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIG4gKyAnLicpO1xuICB9XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gJGdldE1heExpc3RlbmVycyh0aGF0KSB7XG4gIGlmICh0aGF0Ll9tYXhMaXN0ZW5lcnMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIHJldHVybiB0aGF0Ll9tYXhMaXN0ZW5lcnM7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZ2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gZ2V0TWF4TGlzdGVuZXJzKCkge1xuICByZXR1cm4gJGdldE1heExpc3RlbmVycyh0aGlzKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQodHlwZSkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gIHZhciBkb0Vycm9yID0gKHR5cGUgPT09ICdlcnJvcicpO1xuXG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gIGlmIChldmVudHMgIT09IHVuZGVmaW5lZClcbiAgICBkb0Vycm9yID0gKGRvRXJyb3IgJiYgZXZlbnRzLmVycm9yID09PSB1bmRlZmluZWQpO1xuICBlbHNlIGlmICghZG9FcnJvcilcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8gSWYgdGhlcmUgaXMgbm8gJ2Vycm9yJyBldmVudCBsaXN0ZW5lciB0aGVuIHRocm93LlxuICBpZiAoZG9FcnJvcikge1xuICAgIHZhciBlcjtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAwKVxuICAgICAgZXIgPSBhcmdzWzBdO1xuICAgIGlmIChlciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAvLyBOb3RlOiBUaGUgY29tbWVudHMgb24gdGhlIGB0aHJvd2AgbGluZXMgYXJlIGludGVudGlvbmFsLCB0aGV5IHNob3dcbiAgICAgIC8vIHVwIGluIE5vZGUncyBvdXRwdXQgaWYgdGhpcyByZXN1bHRzIGluIGFuIHVuaGFuZGxlZCBleGNlcHRpb24uXG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICB9XG4gICAgLy8gQXQgbGVhc3QgZ2l2ZSBzb21lIGtpbmQgb2YgY29udGV4dCB0byB0aGUgdXNlclxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBlcnJvci4nICsgKGVyID8gJyAoJyArIGVyLm1lc3NhZ2UgKyAnKScgOiAnJykpO1xuICAgIGVyci5jb250ZXh0ID0gZXI7XG4gICAgdGhyb3cgZXJyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICB9XG5cbiAgdmFyIGhhbmRsZXIgPSBldmVudHNbdHlwZV07XG5cbiAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgUmVmbGVjdEFwcGx5KGhhbmRsZXIsIHRoaXMsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpXG4gICAgICBSZWZsZWN0QXBwbHkobGlzdGVuZXJzW2ldLCB0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZnVuY3Rpb24gX2FkZExpc3RlbmVyKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIsIHByZXBlbmQpIHtcbiAgdmFyIG07XG4gIHZhciBldmVudHM7XG4gIHZhciBleGlzdGluZztcblxuICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwibGlzdGVuZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBsaXN0ZW5lcik7XG4gIH1cblxuICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRhcmdldC5fZXZlbnRzQ291bnQgPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gICAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICAgIGlmIChldmVudHMubmV3TGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGFyZ2V0LmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSxcbiAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyID8gbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7XG5cbiAgICAgIC8vIFJlLWFzc2lnbiBgZXZlbnRzYCBiZWNhdXNlIGEgbmV3TGlzdGVuZXIgaGFuZGxlciBjb3VsZCBoYXZlIGNhdXNlZCB0aGVcbiAgICAgIC8vIHRoaXMuX2V2ZW50cyB0byBiZSBhc3NpZ25lZCB0byBhIG5ldyBvYmplY3RcbiAgICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICAgIH1cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXTtcbiAgfVxuXG4gIGlmIChleGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgICArK3RhcmdldC5fZXZlbnRzQ291bnQ7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9XG4gICAgICAgIHByZXBlbmQgPyBbbGlzdGVuZXIsIGV4aXN0aW5nXSA6IFtleGlzdGluZywgbGlzdGVuZXJdO1xuICAgICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgIH0gZWxzZSBpZiAocHJlcGVuZCkge1xuICAgICAgZXhpc3RpbmcudW5zaGlmdChsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4aXN0aW5nLnB1c2gobGlzdGVuZXIpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG4gICAgbSA9ICRnZXRNYXhMaXN0ZW5lcnModGFyZ2V0KTtcbiAgICBpZiAobSA+IDAgJiYgZXhpc3RpbmcubGVuZ3RoID4gbSAmJiAhZXhpc3Rpbmcud2FybmVkKSB7XG4gICAgICBleGlzdGluZy53YXJuZWQgPSB0cnVlO1xuICAgICAgLy8gTm8gZXJyb3IgY29kZSBmb3IgdGhpcyBzaW5jZSBpdCBpcyBhIFdhcm5pbmdcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoJ1Bvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmxlbmd0aCArICcgJyArIFN0cmluZyh0eXBlKSArICcgbGlzdGVuZXJzICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jcmVhc2UgbGltaXQnKTtcbiAgICAgIHcubmFtZSA9ICdNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmcnO1xuICAgICAgdy5lbWl0dGVyID0gdGFyZ2V0O1xuICAgICAgdy50eXBlID0gdHlwZTtcbiAgICAgIHcuY291bnQgPSBleGlzdGluZy5sZW5ndGg7XG4gICAgICBQcm9jZXNzRW1pdFdhcm5pbmcodyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCB0cnVlKTtcbiAgICB9O1xuXG5mdW5jdGlvbiBvbmNlV3JhcHBlcigpIHtcbiAgdmFyIGFyZ3MgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICBpZiAoIXRoaXMuZmlyZWQpIHtcbiAgICB0aGlzLnRhcmdldC5yZW1vdmVMaXN0ZW5lcih0aGlzLnR5cGUsIHRoaXMud3JhcEZuKTtcbiAgICB0aGlzLmZpcmVkID0gdHJ1ZTtcbiAgICBSZWZsZWN0QXBwbHkodGhpcy5saXN0ZW5lciwgdGhpcy50YXJnZXQsIGFyZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9vbmNlV3JhcCh0YXJnZXQsIHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBzdGF0ZSA9IHsgZmlyZWQ6IGZhbHNlLCB3cmFwRm46IHVuZGVmaW5lZCwgdGFyZ2V0OiB0YXJnZXQsIHR5cGU6IHR5cGUsIGxpc3RlbmVyOiBsaXN0ZW5lciB9O1xuICB2YXIgd3JhcHBlZCA9IG9uY2VXcmFwcGVyLmJpbmQoc3RhdGUpO1xuICB3cmFwcGVkLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHN0YXRlLndyYXBGbiA9IHdyYXBwZWQ7XG4gIHJldHVybiB3cmFwcGVkO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGxpc3RlbmVyKTtcbiAgfVxuICB0aGlzLm9uKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZE9uY2VMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucHJlcGVuZExpc3RlbmVyKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuLy8gRW1pdHMgYSAncmVtb3ZlTGlzdGVuZXInIGV2ZW50IGlmIGFuZCBvbmx5IGlmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICB2YXIgbGlzdCwgZXZlbnRzLCBwb3NpdGlvbiwgaSwgb3JpZ2luYWxMaXN0ZW5lcjtcblxuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGxpc3RlbmVyKTtcbiAgICAgIH1cblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgbGlzdCA9IGV2ZW50c1t0eXBlXTtcbiAgICAgIGlmIChsaXN0ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBpZiAobGlzdCA9PT0gbGlzdGVuZXIgfHwgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3QubGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsaXN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHBvc2l0aW9uID0gLTE7XG5cbiAgICAgICAgZm9yIChpID0gbGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGlmIChsaXN0W2ldID09PSBsaXN0ZW5lciB8fCBsaXN0W2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgb3JpZ2luYWxMaXN0ZW5lciA9IGxpc3RbaV0ubGlzdGVuZXI7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gMClcbiAgICAgICAgICBsaXN0LnNoaWZ0KCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHNwbGljZU9uZShsaXN0LCBwb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpXG4gICAgICAgICAgZXZlbnRzW3R5cGVdID0gbGlzdFswXTtcblxuICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIG9yaWdpbmFsTGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID1cbiAgICBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkge1xuICAgICAgdmFyIGxpc3RlbmVycywgZXZlbnRzLCBpO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG4gICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudHNbdHlwZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKVxuICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnRzKTtcbiAgICAgICAgdmFyIGtleTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIGxpc3RlbmVycyA9IGV2ZW50c1t0eXBlXTtcblxuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICAgICAgfSBlbHNlIGlmIChsaXN0ZW5lcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBMSUZPIG9yZGVyXG4gICAgICAgIGZvciAoaSA9IGxpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5mdW5jdGlvbiBfbGlzdGVuZXJzKHRhcmdldCwgdHlwZSwgdW53cmFwKSB7XG4gIHZhciBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIFtdO1xuXG4gIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuICBpZiAoZXZsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBbXTtcblxuICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHVud3JhcCA/IFtldmxpc3RlbmVyLmxpc3RlbmVyIHx8IGV2bGlzdGVuZXJdIDogW2V2bGlzdGVuZXJdO1xuXG4gIHJldHVybiB1bndyYXAgP1xuICAgIHVud3JhcExpc3RlbmVycyhldmxpc3RlbmVyKSA6IGFycmF5Q2xvbmUoZXZsaXN0ZW5lciwgZXZsaXN0ZW5lci5sZW5ndGgpO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyh0eXBlKSB7XG4gIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIHRydWUpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnMgPSBmdW5jdGlvbiByYXdMaXN0ZW5lcnModHlwZSkge1xuICByZXR1cm4gX2xpc3RlbmVycyh0aGlzLCB0eXBlLCBmYWxzZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLmxpc3RlbmVyQ291bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsaXN0ZW5lckNvdW50LmNhbGwoZW1pdHRlciwgdHlwZSk7XG4gIH1cbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQ7XG5mdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpIHtcbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcblxuICAgIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIGlmIChldmxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBldmxpc3RlbmVyLmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24gZXZlbnROYW1lcygpIHtcbiAgcmV0dXJuIHRoaXMuX2V2ZW50c0NvdW50ID4gMCA/IFJlZmxlY3RPd25LZXlzKHRoaXMuX2V2ZW50cykgOiBbXTtcbn07XG5cbmZ1bmN0aW9uIGFycmF5Q2xvbmUoYXJyLCBuKSB7XG4gIHZhciBjb3B5ID0gbmV3IEFycmF5KG4pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSlcbiAgICBjb3B5W2ldID0gYXJyW2ldO1xuICByZXR1cm4gY29weTtcbn1cblxuZnVuY3Rpb24gc3BsaWNlT25lKGxpc3QsIGluZGV4KSB7XG4gIGZvciAoOyBpbmRleCArIDEgPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKylcbiAgICBsaXN0W2luZGV4XSA9IGxpc3RbaW5kZXggKyAxXTtcbiAgbGlzdC5wb3AoKTtcbn1cblxuZnVuY3Rpb24gdW53cmFwTGlzdGVuZXJzKGFycikge1xuICB2YXIgcmV0ID0gbmV3IEFycmF5KGFyci5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJldC5sZW5ndGg7ICsraSkge1xuICAgIHJldFtpXSA9IGFycltpXS5saXN0ZW5lciB8fCBhcnJbaV07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/events/events.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/https-browserify/index.js":
+/*!************************************************!*\
+ !*** ./node_modules/https-browserify/index.js ***!
+ \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var http = __webpack_require__(/*! http */ \"./node_modules/stream-http/index.js\")\nvar url = __webpack_require__(/*! url */ \"./node_modules/url/url.js\")\n\nvar https = module.exports\n\nfor (var key in http) {\n if (http.hasOwnProperty(key)) https[key] = http[key]\n}\n\nhttps.request = function (params, cb) {\n params = validateParams(params)\n return http.request.call(this, params, cb)\n}\n\nhttps.get = function (params, cb) {\n params = validateParams(params)\n return http.get.call(this, params, cb)\n}\n\nfunction validateParams (params) {\n if (typeof params === 'string') {\n params = url.parse(params)\n }\n if (!params.protocol) {\n params.protocol = 'https:'\n }\n if (params.protocol !== 'https:') {\n throw new Error('Protocol \"' + params.protocol + '\" not supported. Expected \"https:\"')\n }\n return params\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvaHR0cHMtYnJvd3NlcmlmeS9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2h0dHBzLWJyb3dzZXJpZnkvaW5kZXguanM/MjRmOCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKVxudmFyIHVybCA9IHJlcXVpcmUoJ3VybCcpXG5cbnZhciBodHRwcyA9IG1vZHVsZS5leHBvcnRzXG5cbmZvciAodmFyIGtleSBpbiBodHRwKSB7XG4gIGlmIChodHRwLmhhc093blByb3BlcnR5KGtleSkpIGh0dHBzW2tleV0gPSBodHRwW2tleV1cbn1cblxuaHR0cHMucmVxdWVzdCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNiKSB7XG4gIHBhcmFtcyA9IHZhbGlkYXRlUGFyYW1zKHBhcmFtcylcbiAgcmV0dXJuIGh0dHAucmVxdWVzdC5jYWxsKHRoaXMsIHBhcmFtcywgY2IpXG59XG5cbmh0dHBzLmdldCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNiKSB7XG4gIHBhcmFtcyA9IHZhbGlkYXRlUGFyYW1zKHBhcmFtcylcbiAgcmV0dXJuIGh0dHAuZ2V0LmNhbGwodGhpcywgcGFyYW1zLCBjYilcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQYXJhbXMgKHBhcmFtcykge1xuICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gJ3N0cmluZycpIHtcbiAgICBwYXJhbXMgPSB1cmwucGFyc2UocGFyYW1zKVxuICB9XG4gIGlmICghcGFyYW1zLnByb3RvY29sKSB7XG4gICAgcGFyYW1zLnByb3RvY29sID0gJ2h0dHBzOidcbiAgfVxuICBpZiAocGFyYW1zLnByb3RvY29sICE9PSAnaHR0cHM6Jykge1xuICAgIHRocm93IG5ldyBFcnJvcignUHJvdG9jb2wgXCInICsgcGFyYW1zLnByb3RvY29sICsgJ1wiIG5vdCBzdXBwb3J0ZWQuIEV4cGVjdGVkIFwiaHR0cHM6XCInKVxuICB9XG4gIHJldHVybiBwYXJhbXNcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/https-browserify/index.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/ieee754/index.js":
+/*!***************************************!*\
+ !*** ./node_modules/ieee754/index.js ***!
+ \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("exports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanM/OTE1MiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IChlICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIGUgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IG1MZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IChtICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKCh2YWx1ZSAqIGMpIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IGUgKyBlQmlhc1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSAwXG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtXG4gIGVMZW4gKz0gbUxlblxuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/ieee754/index.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/inherits/inherits_browser.js":
+/*!***************************************************!*\
+ !*** ./node_modules/inherits/inherits_browser.js ***!
+ \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("if (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanM/M2ZiNSJdLCJzb3VyY2VzQ29udGVudCI6WyJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/inherits/inherits_browser.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/isarray/index.js":
+/*!***************************************!*\
+ !*** ./node_modules/isarray/index.js ***!
+ \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n return toString.call(arr) == '[object Array]';\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvaXNhcnJheS9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2lzYXJyYXkvaW5kZXguanM/ZTNkYiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/isarray/index.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/jquery/dist/jquery.js":
+/*!********************************************!*\
+ !*** ./node_modules/jquery/dist/jquery.js ***!
+ \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * jQuery JavaScript Library v3.4.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2019-05-01T21:04Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( true && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar document = window.document;\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar concat = arr.concat;\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n // Support: Chrome <=57, Firefox <=52\n // In some browsers, typeof returns \"function\" for HTML <object> elements\n // (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n // We don't want to classify *any* DOM node as a function.\n return typeof obj === \"function\" && typeof obj.nodeType !== \"number\";\n };\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.4.1\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android <=4.0 only\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a global context\n\tglobalEval: function( code, options ) {\n\t\tDOMEval( code, { nonce: options && options.nonce } );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Support: Android <=4.0 only\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\nfunction( i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.4\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://js.foundation/\n *\n * Date: 2019-04-08\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = \"(?:\\\\\\\\.|[\\\\w-]|[^\\0-\\\\xa0])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trhtml = /HTML$/i,\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && elem.nodeName.toLowerCase() === \"fieldset\";\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\n\t\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\t\tsetDocument( context );\n\t\t}\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( (m = match[1]) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( (elem = context.getElementById( m )) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && (elem = newContext.getElementById( m )) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[2] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t(!rbuggyQSA || !rbuggyQSA.test( selector )) &&\n\n\t\t\t\t// Support: IE 8 only\n\t\t\t\t// Exclude object elements\n\t\t\t\t(nodeType !== 1 || context.nodeName.toLowerCase() !== \"object\") ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 && rdescend.test( selector ) ) {\n\n\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\tif ( (nid = context.getAttribute( \"id\" )) ) {\n\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.setAttribute( \"id\", (nid = expando) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[i] = \"#\" + nid + \" \" + toSelector( groups[i] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + \" \" ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement(\"fieldset\");\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\tvar namespace = elem.namespaceURI,\n\t\tdocElem = (elem.ownerDocument || elem).documentElement;\n\n\t// Support: IE <=8\n\t// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes\n\t// https://bugs.jquery.com/ticket/4833\n\treturn !rhtml.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9-11, Edge\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\tif ( preferredDoc !== document &&\n\t\t(subWindow = document.defaultView) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( el ) {\n\t\tel.appendChild( document.createComment(\"\") );\n\t\treturn !el.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t});\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode(\"id\");\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( (elem = elems[i++]) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode(\"id\");\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( document.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( el ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll(\"[msallowcapture^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push(\"~=\");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push(\".#.+[+~]\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll(\":enabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll(\":disabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( el ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === document ? -1 :\n\t\t\t\tb === document ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn (sel + \"\").replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[0] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t// but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ?\n\t\t\t\targument + length :\n\t\t\t\targument > length ?\n\t\t\t\t\tlength :\n\t\t\t\t\targument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( (oldCache = uniqueCache[ key ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context === document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\tif ( !context && elem.ownerDocument !== document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n * selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n * selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( el ) {\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement(\"fieldset\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( el ) {\n\treturn el.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n};\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( typeof elem.contentDocument !== \"undefined\" ) {\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the master Deferred\n\t\t\tmaster = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tmaster.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( master.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn master.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), master.reject );\n\t\t}\n\n\t\treturn master.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\tvalue :\n\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (#9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t// - Node\n\t// - Node.ELEMENT_NODE\n\t// - Node.DOCUMENT_NODE\n\t// - Object\n\t// - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t// 1. No key was specified\n\t\t// 2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t// 1. The entire cache object\n\t\t// 2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t// 1. An object of properties\n\t\t// 2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\nvar swap = function( elem, options, callback, args ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.apply( elem, args || [] );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// Support: IE <=9 only\n\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\n// Support: IE <=9 only\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n} )();\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 - 11+\n// focus() and blur() are asynchronous, except when they are no-op.\n// So expect focus to be synchronous when the element is already active,\n// and blur to be synchronous when the element is not already active.\n// (focus and blur are always synchronous in other supported browsers,\n// this just defines when we can count on it).\nfunction expectSync( elem, type ) {\n\treturn ( elem === safeActiveElement() ) === ( type === \"focus\" );\n}\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tvar event = jQuery.event.fix( nativeEvent );\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\t\t\thandlers = ( dataPriv.get( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", returnTrue );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, expectSync ) {\n\n\t// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !expectSync ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar notAsync, result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\t// Saved data should be false in such cases, but might be a leftover capture object\n\t\t\t\t// from an async native handler (gh-4350)\n\t\t\t\tif ( !saved.length ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t// focus() and blur() are asynchronous\n\t\t\t\t\tnotAsync = expectSync( this, type );\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tif ( saved !== result || notAsync ) {\n\t\t\t\t\t\tdataPriv.set( this, type, false );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = {};\n\t\t\t\t\t}\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\treturn result.value;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering the\n\t\t\t\t// native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved.length ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, {\n\t\t\t\t\tvalue: jQuery.event.trigger(\n\n\t\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t\t// Extend with the prototype to reset the above stopImmediatePropagation()\n\t\t\t\t\t\tjQuery.extend( saved[ 0 ], jQuery.Event.prototype ),\n\t\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\t\tthis\n\t\t\t\t\t)\n\t\t\t\t} );\n\n\t\t\t\t// Abort handling of the native event\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\n\twhich: function( event ) {\n\t\tvar button = event.button;\n\n\t\t// Add which for key events\n\t\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\n\t\t\treturn event.charCode != null ? event.charCode : event.keyCode;\n\t\t}\n\n\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\n\t\t\tif ( button & 1 ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tif ( button & 2 ) {\n\t\t\t\treturn 3;\n\t\t\t}\n\n\t\t\tif ( button & 4 ) {\n\t\t\t\treturn 2;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn event.which;\n\t}\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, expectSync );\n\n\t\t\t// Return false to allow normal processing in the caller\n\t\t\treturn false;\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event ) dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t/* eslint-disable max-len */\n\n\t// See https://github.com/eslint/eslint/issues/3229\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,\n\n\t/* eslint-enable */\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.access( src );\n\t\tpdataCur = dataPriv.set( dest, pdataOld );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdelete pdataCur.handle;\n\t\t\tpdataCur.events = {};\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = concat.apply( [], args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase() !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html.replace( rxhtmlTag, \"<$1></$2>\" );\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t// .css('filter') (IE 9 only, #12537)\n\t// .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trcustomProp = /^--/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === \"margin\" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t// This happens for inline elements with no explicit setting (gh-3571)\n\t// Support: Android <=4.1 - 4.3 only\n\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t// Support: IE 9-11 only\n\t// Also use offsetWidth/offsetHeight for when box sizing is unreliable\n\t// We use getClientRects() to check for hidden/disconnected.\n\t// In those cases, the computed value can be trusted to be border-box\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\t\tval === \"auto\" ||\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"gridArea\": true,\n\t\t\"gridColumn\": true,\n\t\t\"gridColumnEnd\": true,\n\t\t\"gridColumnStart\": true,\n\t\t\"gridRow\": true,\n\t\t\"gridRowEnd\": true,\n\t\t\"gridRowStart\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t\t} ) :\n\t\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = classesToArray( value );\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || {} )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = Date.now();\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} )\n\t\t.filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} )\n\t\t.map( function( i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t * - BEFORE asking for a transport\n\t * - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\toriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce++ ) + uncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\n\njQuery._evalUrl = function( url, options ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\" ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" )\n\t\t\t\t\t.attr( s.scriptAttrs || {} )\n\t\t\t\t\t.prop( { charset: s.scriptCharset, src: s.url } )\n\t\t\t\t\t.on( \"load error\", callback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t// documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name },\n\t\tfunction( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( ( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n} );\n\njQuery.fn.extend( {\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t}\n} );\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( true ) {\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n\t\treturn jQuery;\n\t}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( !noGlobal ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvanF1ZXJ5L2Rpc3QvanF1ZXJ5LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvanF1ZXJ5L2Rpc3QvanF1ZXJ5LmpzPzExNTciXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYzLjQuMVxuICogaHR0cHM6Ly9qcXVlcnkuY29tL1xuICpcbiAqIEluY2x1ZGVzIFNpenpsZS5qc1xuICogaHR0cHM6Ly9zaXp6bGVqcy5jb20vXG4gKlxuICogQ29weXJpZ2h0IEpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwczovL2pxdWVyeS5vcmcvbGljZW5zZVxuICpcbiAqIERhdGU6IDIwMTktMDUtMDFUMjE6MDRaXG4gKi9cbiggZnVuY3Rpb24oIGdsb2JhbCwgZmFjdG9yeSApIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblxuXHRpZiAoIHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZS5leHBvcnRzID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0Ly8gRm9yIENvbW1vbkpTIGFuZCBDb21tb25KUy1saWtlIGVudmlyb25tZW50cyB3aGVyZSBhIHByb3BlciBgd2luZG93YFxuXHRcdC8vIGlzIHByZXNlbnQsIGV4ZWN1dGUgdGhlIGZhY3RvcnkgYW5kIGdldCBqUXVlcnkuXG5cdFx0Ly8gRm9yIGVudmlyb25tZW50cyB0aGF0IGRvIG5vdCBoYXZlIGEgYHdpbmRvd2Agd2l0aCBhIGBkb2N1bWVudGBcblx0XHQvLyAoc3VjaCBhcyBOb2RlLmpzKSwgZXhwb3NlIGEgZmFjdG9yeSBhcyBtb2R1bGUuZXhwb3J0cy5cblx0XHQvLyBUaGlzIGFjY2VudHVhdGVzIHRoZSBuZWVkIGZvciB0aGUgY3JlYXRpb24gb2YgYSByZWFsIGB3aW5kb3dgLlxuXHRcdC8vIGUuZy4gdmFyIGpRdWVyeSA9IHJlcXVpcmUoXCJqcXVlcnlcIikod2luZG93KTtcblx0XHQvLyBTZWUgdGlja2V0ICMxNDU0OSBmb3IgbW9yZSBpbmZvLlxuXHRcdG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLmRvY3VtZW50ID9cblx0XHRcdGZhY3RvcnkoIGdsb2JhbCwgdHJ1ZSApIDpcblx0XHRcdGZ1bmN0aW9uKCB3ICkge1xuXHRcdFx0XHRpZiAoICF3LmRvY3VtZW50ICkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciggXCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50XCIgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmFjdG9yeSggdyApO1xuXHRcdFx0fTtcblx0fSBlbHNlIHtcblx0XHRmYWN0b3J5KCBnbG9iYWwgKTtcblx0fVxuXG4vLyBQYXNzIHRoaXMgaWYgd2luZG93IGlzIG5vdCBkZWZpbmVkIHlldFxufSApKCB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24oIHdpbmRvdywgbm9HbG9iYWwgKSB7XG5cbi8vIEVkZ2UgPD0gMTIgLSAxMyssIEZpcmVmb3ggPD0xOCAtIDQ1KywgSUUgMTAgLSAxMSwgU2FmYXJpIDUuMSAtIDkrLCBpT1MgNiAtIDkuMVxuLy8gdGhyb3cgZXhjZXB0aW9ucyB3aGVuIG5vbi1zdHJpY3QgY29kZSAoZS5nLiwgQVNQLk5FVCA0LjUpIGFjY2Vzc2VzIHN0cmljdCBtb2RlXG4vLyBhcmd1bWVudHMuY2FsbGVlLmNhbGxlciAodHJhYy0xMzMzNSkuIEJ1dCBhcyBvZiBqUXVlcnkgMy4wICgyMDE2KSwgc3RyaWN0IG1vZGUgc2hvdWxkIGJlIGNvbW1vblxuLy8gZW5vdWdoIHRoYXQgYWxsIHN1Y2ggYXR0ZW1wdHMgYXJlIGd1YXJkZWQgaW4gYSB0cnkgYmxvY2suXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIGFyciA9IFtdO1xuXG52YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7XG5cbnZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcblxudmFyIHNsaWNlID0gYXJyLnNsaWNlO1xuXG52YXIgY29uY2F0ID0gYXJyLmNvbmNhdDtcblxudmFyIHB1c2ggPSBhcnIucHVzaDtcblxudmFyIGluZGV4T2YgPSBhcnIuaW5kZXhPZjtcblxudmFyIGNsYXNzMnR5cGUgPSB7fTtcblxudmFyIHRvU3RyaW5nID0gY2xhc3MydHlwZS50b1N0cmluZztcblxudmFyIGhhc093biA9IGNsYXNzMnR5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBmblRvU3RyaW5nID0gaGFzT3duLnRvU3RyaW5nO1xuXG52YXIgT2JqZWN0RnVuY3Rpb25TdHJpbmcgPSBmblRvU3RyaW5nLmNhbGwoIE9iamVjdCApO1xuXG52YXIgc3VwcG9ydCA9IHt9O1xuXG52YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24oIG9iaiApIHtcblxuICAgICAgLy8gU3VwcG9ydDogQ2hyb21lIDw9NTcsIEZpcmVmb3ggPD01MlxuICAgICAgLy8gSW4gc29tZSBicm93c2VycywgdHlwZW9mIHJldHVybnMgXCJmdW5jdGlvblwiIGZvciBIVE1MIDxvYmplY3Q+IGVsZW1lbnRzXG4gICAgICAvLyAoaS5lLiwgYHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcIm9iamVjdFwiICkgPT09IFwiZnVuY3Rpb25cImApLlxuICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBjbGFzc2lmeSAqYW55KiBET00gbm9kZSBhcyBhIGZ1bmN0aW9uLlxuICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2Ygb2JqLm5vZGVUeXBlICE9PSBcIm51bWJlclwiO1xuICB9O1xuXG5cbnZhciBpc1dpbmRvdyA9IGZ1bmN0aW9uIGlzV2luZG93KCBvYmogKSB7XG5cdFx0cmV0dXJuIG9iaiAhPSBudWxsICYmIG9iaiA9PT0gb2JqLndpbmRvdztcblx0fTtcblxuXG5cblxuXHR2YXIgcHJlc2VydmVkU2NyaXB0QXR0cmlidXRlcyA9IHtcblx0XHR0eXBlOiB0cnVlLFxuXHRcdHNyYzogdHJ1ZSxcblx0XHRub25jZTogdHJ1ZSxcblx0XHRub01vZHVsZTogdHJ1ZVxuXHR9O1xuXG5cdGZ1bmN0aW9uIERPTUV2YWwoIGNvZGUsIG5vZGUsIGRvYyApIHtcblx0XHRkb2MgPSBkb2MgfHwgZG9jdW1lbnQ7XG5cblx0XHR2YXIgaSwgdmFsLFxuXHRcdFx0c2NyaXB0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoIFwic2NyaXB0XCIgKTtcblxuXHRcdHNjcmlwdC50ZXh0ID0gY29kZTtcblx0XHRpZiAoIG5vZGUgKSB7XG5cdFx0XHRmb3IgKCBpIGluIHByZXNlcnZlZFNjcmlwdEF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA2NCssIEVkZ2UgMTgrXG5cdFx0XHRcdC8vIFNvbWUgYnJvd3NlcnMgZG9uJ3Qgc3VwcG9ydCB0aGUgXCJub25jZVwiIHByb3BlcnR5IG9uIHNjcmlwdHMuXG5cdFx0XHRcdC8vIE9uIHRoZSBvdGhlciBoYW5kLCBqdXN0IHVzaW5nIGBnZXRBdHRyaWJ1dGVgIGlzIG5vdCBlbm91Z2ggYXNcblx0XHRcdFx0Ly8gdGhlIGBub25jZWAgYXR0cmlidXRlIGlzIHJlc2V0IHRvIGFuIGVtcHR5IHN0cmluZyB3aGVuZXZlciBpdFxuXHRcdFx0XHQvLyBiZWNvbWVzIGJyb3dzaW5nLWNvbnRleHQgY29ubmVjdGVkLlxuXHRcdFx0XHQvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3doYXR3Zy9odG1sL2lzc3Vlcy8yMzY5XG5cdFx0XHRcdC8vIFNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNub25jZS1hdHRyaWJ1dGVzXG5cdFx0XHRcdC8vIFRoZSBgbm9kZS5nZXRBdHRyaWJ1dGVgIGNoZWNrIHdhcyBhZGRlZCBmb3IgdGhlIHNha2Ugb2Zcblx0XHRcdFx0Ly8gYGpRdWVyeS5nbG9iYWxFdmFsYCBzbyB0aGF0IGl0IGNhbiBmYWtlIGEgbm9uY2UtY29udGFpbmluZyBub2RlXG5cdFx0XHRcdC8vIHZpYSBhbiBvYmplY3QuXG5cdFx0XHRcdHZhbCA9IG5vZGVbIGkgXSB8fCBub2RlLmdldEF0dHJpYnV0ZSAmJiBub2RlLmdldEF0dHJpYnV0ZSggaSApO1xuXHRcdFx0XHRpZiAoIHZhbCApIHtcblx0XHRcdFx0XHRzY3JpcHQuc2V0QXR0cmlidXRlKCBpLCB2YWwgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRkb2MuaGVhZC5hcHBlbmRDaGlsZCggc2NyaXB0ICkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggc2NyaXB0ICk7XG5cdH1cblxuXG5mdW5jdGlvbiB0b1R5cGUoIG9iaiApIHtcblx0aWYgKCBvYmogPT0gbnVsbCApIHtcblx0XHRyZXR1cm4gb2JqICsgXCJcIjtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD0yLjMgb25seSAoZnVuY3Rpb25pc2ggUmVnRXhwKVxuXHRyZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIgP1xuXHRcdGNsYXNzMnR5cGVbIHRvU3RyaW5nLmNhbGwoIG9iaiApIF0gfHwgXCJvYmplY3RcIiA6XG5cdFx0dHlwZW9mIG9iajtcbn1cbi8qIGdsb2JhbCBTeW1ib2wgKi9cbi8vIERlZmluaW5nIHRoaXMgZ2xvYmFsIGluIC5lc2xpbnRyYy5qc29uIHdvdWxkIGNyZWF0ZSBhIGRhbmdlciBvZiB1c2luZyB0aGUgZ2xvYmFsXG4vLyB1bmd1YXJkZWQgaW4gYW5vdGhlciBwbGFjZSwgaXQgc2VlbXMgc2FmZXIgdG8gZGVmaW5lIGdsb2JhbCBvbmx5IGZvciB0aGlzIG1vZHVsZVxuXG5cblxudmFyXG5cdHZlcnNpb24gPSBcIjMuNC4xXCIsXG5cblx0Ly8gRGVmaW5lIGEgbG9jYWwgY29weSBvZiBqUXVlcnlcblx0alF1ZXJ5ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkge1xuXG5cdFx0Ly8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnXG5cdFx0Ly8gTmVlZCBpbml0IGlmIGpRdWVyeSBpcyBjYWxsZWQgKGp1c3QgYWxsb3cgZXJyb3IgdG8gYmUgdGhyb3duIGlmIG5vdCBpbmNsdWRlZClcblx0XHRyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCApO1xuXHR9LFxuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seVxuXHQvLyBNYWtlIHN1cmUgd2UgdHJpbSBCT00gYW5kIE5CU1Bcblx0cnRyaW0gPSAvXltcXHNcXHVGRUZGXFx4QTBdK3xbXFxzXFx1RkVGRlxceEEwXSskL2c7XG5cbmpRdWVyeS5mbiA9IGpRdWVyeS5wcm90b3R5cGUgPSB7XG5cblx0Ly8gVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBqUXVlcnkgYmVpbmcgdXNlZFxuXHRqcXVlcnk6IHZlcnNpb24sXG5cblx0Y29uc3RydWN0b3I6IGpRdWVyeSxcblxuXHQvLyBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYSBqUXVlcnkgb2JqZWN0IGlzIDBcblx0bGVuZ3RoOiAwLFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzbGljZS5jYWxsKCB0aGlzICk7XG5cdH0sXG5cblx0Ly8gR2V0IHRoZSBOdGggZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldCBPUlxuXHQvLyBHZXQgdGhlIHdob2xlIG1hdGNoZWQgZWxlbWVudCBzZXQgYXMgYSBjbGVhbiBhcnJheVxuXHRnZXQ6IGZ1bmN0aW9uKCBudW0gKSB7XG5cblx0XHQvLyBSZXR1cm4gYWxsIHRoZSBlbGVtZW50cyBpbiBhIGNsZWFuIGFycmF5XG5cdFx0aWYgKCBudW0gPT0gbnVsbCApIHtcblx0XHRcdHJldHVybiBzbGljZS5jYWxsKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0Ly8gUmV0dXJuIGp1c3QgdGhlIG9uZSBlbGVtZW50IGZyb20gdGhlIHNldFxuXHRcdHJldHVybiBudW0gPCAwID8gdGhpc1sgbnVtICsgdGhpcy5sZW5ndGggXSA6IHRoaXNbIG51bSBdO1xuXHR9LFxuXG5cdC8vIFRha2UgYW4gYXJyYXkgb2YgZWxlbWVudHMgYW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2tcblx0Ly8gKHJldHVybmluZyB0aGUgbmV3IG1hdGNoZWQgZWxlbWVudCBzZXQpXG5cdHB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkge1xuXG5cdFx0Ly8gQnVpbGQgYSBuZXcgalF1ZXJ5IG1hdGNoZWQgZWxlbWVudCBzZXRcblx0XHR2YXIgcmV0ID0galF1ZXJ5Lm1lcmdlKCB0aGlzLmNvbnN0cnVjdG9yKCksIGVsZW1zICk7XG5cblx0XHQvLyBBZGQgdGhlIG9sZCBvYmplY3Qgb250byB0aGUgc3RhY2sgKGFzIGEgcmVmZXJlbmNlKVxuXHRcdHJldC5wcmV2T2JqZWN0ID0gdGhpcztcblxuXHRcdC8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0XG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblxuXHQvLyBFeGVjdXRlIGEgY2FsbGJhY2sgZm9yIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgc2V0LlxuXHRlYWNoOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5lYWNoKCB0aGlzLCBjYWxsYmFjayApO1xuXHR9LFxuXG5cdG1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1hcCggdGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XG5cdFx0XHRyZXR1cm4gY2FsbGJhY2suY2FsbCggZWxlbSwgaSwgZWxlbSApO1xuXHRcdH0gKSApO1xuXHR9LFxuXG5cdHNsaWNlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHNsaWNlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSApO1xuXHR9LFxuXG5cdGZpcnN0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lcSggMCApO1xuXHR9LFxuXG5cdGxhc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmVxKCAtMSApO1xuXHR9LFxuXG5cdGVxOiBmdW5jdGlvbiggaSApIHtcblx0XHR2YXIgbGVuID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRqID0gK2kgKyAoIGkgPCAwID8gbGVuIDogMCApO1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggaiA+PSAwICYmIGogPCBsZW4gPyBbIHRoaXNbIGogXSBdIDogW10gKTtcblx0fSxcblxuXHRlbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcigpO1xuXHR9LFxuXG5cdC8vIEZvciBpbnRlcm5hbCB1c2Ugb25seS5cblx0Ly8gQmVoYXZlcyBsaWtlIGFuIEFycmF5J3MgbWV0aG9kLCBub3QgbGlrZSBhIGpRdWVyeSBtZXRob2QuXG5cdHB1c2g6IHB1c2gsXG5cdHNvcnQ6IGFyci5zb3J0LFxuXHRzcGxpY2U6IGFyci5zcGxpY2Vcbn07XG5cbmpRdWVyeS5leHRlbmQgPSBqUXVlcnkuZm4uZXh0ZW5kID0gZnVuY3Rpb24oKSB7XG5cdHZhciBvcHRpb25zLCBuYW1lLCBzcmMsIGNvcHksIGNvcHlJc0FycmF5LCBjbG9uZSxcblx0XHR0YXJnZXQgPSBhcmd1bWVudHNbIDAgXSB8fCB7fSxcblx0XHRpID0gMSxcblx0XHRsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuXHRcdGRlZXAgPSBmYWxzZTtcblxuXHQvLyBIYW5kbGUgYSBkZWVwIGNvcHkgc2l0dWF0aW9uXG5cdGlmICggdHlwZW9mIHRhcmdldCA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0ZGVlcCA9IHRhcmdldDtcblxuXHRcdC8vIFNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXRcblx0XHR0YXJnZXQgPSBhcmd1bWVudHNbIGkgXSB8fCB7fTtcblx0XHRpKys7XG5cdH1cblxuXHQvLyBIYW5kbGUgY2FzZSB3aGVuIHRhcmdldCBpcyBhIHN0cmluZyBvciBzb21ldGhpbmcgKHBvc3NpYmxlIGluIGRlZXAgY29weSlcblx0aWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSBcIm9iamVjdFwiICYmICFpc0Z1bmN0aW9uKCB0YXJnZXQgKSApIHtcblx0XHR0YXJnZXQgPSB7fTtcblx0fVxuXG5cdC8vIEV4dGVuZCBqUXVlcnkgaXRzZWxmIGlmIG9ubHkgb25lIGFyZ3VtZW50IGlzIHBhc3NlZFxuXHRpZiAoIGkgPT09IGxlbmd0aCApIHtcblx0XHR0YXJnZXQgPSB0aGlzO1xuXHRcdGktLTtcblx0fVxuXG5cdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXG5cdFx0Ly8gT25seSBkZWFsIHdpdGggbm9uLW51bGwvdW5kZWZpbmVkIHZhbHVlc1xuXHRcdGlmICggKCBvcHRpb25zID0gYXJndW1lbnRzWyBpIF0gKSAhPSBudWxsICkge1xuXG5cdFx0XHQvLyBFeHRlbmQgdGhlIGJhc2Ugb2JqZWN0XG5cdFx0XHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0XHRcdGNvcHkgPSBvcHRpb25zWyBuYW1lIF07XG5cblx0XHRcdFx0Ly8gUHJldmVudCBPYmplY3QucHJvdG90eXBlIHBvbGx1dGlvblxuXHRcdFx0XHQvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wXG5cdFx0XHRcdGlmICggbmFtZSA9PT0gXCJfX3Byb3RvX19cIiB8fCB0YXJnZXQgPT09IGNvcHkgKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXNcblx0XHRcdFx0aWYgKCBkZWVwICYmIGNvcHkgJiYgKCBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29weSApIHx8XG5cdFx0XHRcdFx0KCBjb3B5SXNBcnJheSA9IEFycmF5LmlzQXJyYXkoIGNvcHkgKSApICkgKSB7XG5cdFx0XHRcdFx0c3JjID0gdGFyZ2V0WyBuYW1lIF07XG5cblx0XHRcdFx0XHQvLyBFbnN1cmUgcHJvcGVyIHR5cGUgZm9yIHRoZSBzb3VyY2UgdmFsdWVcblx0XHRcdFx0XHRpZiAoIGNvcHlJc0FycmF5ICYmICFBcnJheS5pc0FycmF5KCBzcmMgKSApIHtcblx0XHRcdFx0XHRcdGNsb25lID0gW107XG5cdFx0XHRcdFx0fSBlbHNlIGlmICggIWNvcHlJc0FycmF5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggc3JjICkgKSB7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IHt9O1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IHNyYztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29weUlzQXJyYXkgPSBmYWxzZTtcblxuXHRcdFx0XHRcdC8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbVxuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwgY2xvbmUsIGNvcHkgKTtcblxuXHRcdFx0XHQvLyBEb24ndCBicmluZyBpbiB1bmRlZmluZWQgdmFsdWVzXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHR0YXJnZXRbIG5hbWUgXSA9IGNvcHk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdFxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIFVuaXF1ZSBmb3IgZWFjaCBjb3B5IG9mIGpRdWVyeSBvbiB0aGUgcGFnZVxuXHRleHBhbmRvOiBcImpRdWVyeVwiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cXEQvZywgXCJcIiApLFxuXG5cdC8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlXG5cdGlzUmVhZHk6IHRydWUsXG5cblx0ZXJyb3I6IGZ1bmN0aW9uKCBtc2cgKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCBtc2cgKTtcblx0fSxcblxuXHRub29wOiBmdW5jdGlvbigpIHt9LFxuXG5cdGlzUGxhaW5PYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0dmFyIHByb3RvLCBDdG9yO1xuXG5cdFx0Ly8gRGV0ZWN0IG9idmlvdXMgbmVnYXRpdmVzXG5cdFx0Ly8gVXNlIHRvU3RyaW5nIGluc3RlYWQgb2YgalF1ZXJ5LnR5cGUgdG8gY2F0Y2ggaG9zdCBvYmplY3RzXG5cdFx0aWYgKCAhb2JqIHx8IHRvU3RyaW5nLmNhbGwoIG9iaiApICE9PSBcIltvYmplY3QgT2JqZWN0XVwiICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHByb3RvID0gZ2V0UHJvdG8oIG9iaiApO1xuXG5cdFx0Ly8gT2JqZWN0cyB3aXRoIG5vIHByb3RvdHlwZSAoZS5nLiwgYE9iamVjdC5jcmVhdGUoIG51bGwgKWApIGFyZSBwbGFpblxuXHRcdGlmICggIXByb3RvICkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gT2JqZWN0cyB3aXRoIHByb3RvdHlwZSBhcmUgcGxhaW4gaWZmIHRoZXkgd2VyZSBjb25zdHJ1Y3RlZCBieSBhIGdsb2JhbCBPYmplY3QgZnVuY3Rpb25cblx0XHRDdG9yID0gaGFzT3duLmNhbGwoIHByb3RvLCBcImNvbnN0cnVjdG9yXCIgKSAmJiBwcm90by5jb25zdHJ1Y3Rvcjtcblx0XHRyZXR1cm4gdHlwZW9mIEN0b3IgPT09IFwiZnVuY3Rpb25cIiAmJiBmblRvU3RyaW5nLmNhbGwoIEN0b3IgKSA9PT0gT2JqZWN0RnVuY3Rpb25TdHJpbmc7XG5cdH0sXG5cblx0aXNFbXB0eU9iamVjdDogZnVuY3Rpb24oIG9iaiApIHtcblx0XHR2YXIgbmFtZTtcblxuXHRcdGZvciAoIG5hbWUgaW4gb2JqICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHQvLyBFdmFsdWF0ZXMgYSBzY3JpcHQgaW4gYSBnbG9iYWwgY29udGV4dFxuXHRnbG9iYWxFdmFsOiBmdW5jdGlvbiggY29kZSwgb3B0aW9ucyApIHtcblx0XHRET01FdmFsKCBjb2RlLCB7IG5vbmNlOiBvcHRpb25zICYmIG9wdGlvbnMubm9uY2UgfSApO1xuXHR9LFxuXG5cdGVhY2g6IGZ1bmN0aW9uKCBvYmosIGNhbGxiYWNrICkge1xuXHRcdHZhciBsZW5ndGgsIGkgPSAwO1xuXG5cdFx0aWYgKCBpc0FycmF5TGlrZSggb2JqICkgKSB7XG5cdFx0XHRsZW5ndGggPSBvYmoubGVuZ3RoO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoIGkgaW4gb2JqICkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBvYmo7XG5cdH0sXG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5XG5cdHRyaW06IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdHJldHVybiB0ZXh0ID09IG51bGwgP1xuXHRcdFx0XCJcIiA6XG5cdFx0XHQoIHRleHQgKyBcIlwiICkucmVwbGFjZSggcnRyaW0sIFwiXCIgKTtcblx0fSxcblxuXHQvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdG1ha2VBcnJheTogZnVuY3Rpb24oIGFyciwgcmVzdWx0cyApIHtcblx0XHR2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTtcblxuXHRcdGlmICggYXJyICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGlzQXJyYXlMaWtlKCBPYmplY3QoIGFyciApICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggcmV0LFxuXHRcdFx0XHRcdHR5cGVvZiBhcnIgPT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRcdFsgYXJyIF0gOiBhcnJcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guY2FsbCggcmV0LCBhcnIgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXG5cdGluQXJyYXk6IGZ1bmN0aW9uKCBlbGVtLCBhcnIsIGkgKSB7XG5cdFx0cmV0dXJuIGFyciA9PSBudWxsID8gLTEgOiBpbmRleE9mLmNhbGwoIGFyciwgZWxlbSwgaSApO1xuXHR9LFxuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdG1lcmdlOiBmdW5jdGlvbiggZmlyc3QsIHNlY29uZCApIHtcblx0XHR2YXIgbGVuID0gK3NlY29uZC5sZW5ndGgsXG5cdFx0XHRqID0gMCxcblx0XHRcdGkgPSBmaXJzdC5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGogPCBsZW47IGorKyApIHtcblx0XHRcdGZpcnN0WyBpKysgXSA9IHNlY29uZFsgaiBdO1xuXHRcdH1cblxuXHRcdGZpcnN0Lmxlbmd0aCA9IGk7XG5cblx0XHRyZXR1cm4gZmlyc3Q7XG5cdH0sXG5cblx0Z3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ZXJ0ICkge1xuXHRcdHZhciBjYWxsYmFja0ludmVyc2UsXG5cdFx0XHRtYXRjaGVzID0gW10sXG5cdFx0XHRpID0gMCxcblx0XHRcdGxlbmd0aCA9IGVsZW1zLmxlbmd0aCxcblx0XHRcdGNhbGxiYWNrRXhwZWN0ID0gIWludmVydDtcblxuXHRcdC8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmluZyB0aGUgaXRlbXNcblx0XHQvLyB0aGF0IHBhc3MgdGhlIHZhbGlkYXRvciBmdW5jdGlvblxuXHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0Y2FsbGJhY2tJbnZlcnNlID0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7XG5cdFx0XHRpZiAoIGNhbGxiYWNrSW52ZXJzZSAhPT0gY2FsbGJhY2tFeHBlY3QgKSB7XG5cdFx0XHRcdG1hdGNoZXMucHVzaCggZWxlbXNbIGkgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBtYXRjaGVzO1xuXHR9LFxuXG5cdC8vIGFyZyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seVxuXHRtYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHtcblx0XHR2YXIgbGVuZ3RoLCB2YWx1ZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0cmV0ID0gW107XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZhbHVlc1xuXHRcdGlmICggaXNBcnJheUxpa2UoIGVsZW1zICkgKSB7XG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGg7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPSBudWxsICkge1xuXHRcdFx0XHRcdHJldC5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBHbyB0aHJvdWdoIGV2ZXJ5IGtleSBvbiB0aGUgb2JqZWN0LFxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKCBpIGluIGVsZW1zICkge1xuXHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzXG5cdFx0cmV0dXJuIGNvbmNhdC5hcHBseSggW10sIHJldCApO1xuXHR9LFxuXG5cdC8vIEEgZ2xvYmFsIEdVSUQgY291bnRlciBmb3Igb2JqZWN0c1xuXHRndWlkOiAxLFxuXG5cdC8vIGpRdWVyeS5zdXBwb3J0IGlzIG5vdCB1c2VkIGluIENvcmUgYnV0IG90aGVyIHByb2plY3RzIGF0dGFjaCB0aGVpclxuXHQvLyBwcm9wZXJ0aWVzIHRvIGl0IHNvIGl0IG5lZWRzIHRvIGV4aXN0LlxuXHRzdXBwb3J0OiBzdXBwb3J0XG59ICk7XG5cbmlmICggdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICkge1xuXHRqUXVlcnkuZm5bIFN5bWJvbC5pdGVyYXRvciBdID0gYXJyWyBTeW1ib2wuaXRlcmF0b3IgXTtcbn1cblxuLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwXG5qUXVlcnkuZWFjaCggXCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbFwiLnNwbGl0KCBcIiBcIiApLFxuZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdGNsYXNzMnR5cGVbIFwiW29iamVjdCBcIiArIG5hbWUgKyBcIl1cIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xufSApO1xuXG5mdW5jdGlvbiBpc0FycmF5TGlrZSggb2JqICkge1xuXG5cdC8vIFN1cHBvcnQ6IHJlYWwgaU9TIDguMiBvbmx5IChub3QgcmVwcm9kdWNpYmxlIGluIHNpbXVsYXRvcilcblx0Ly8gYGluYCBjaGVjayB1c2VkIHRvIHByZXZlbnQgSklUIGVycm9yIChnaC0yMTQ1KVxuXHQvLyBoYXNPd24gaXNuJ3QgdXNlZCBoZXJlIGR1ZSB0byBmYWxzZSBuZWdhdGl2ZXNcblx0Ly8gcmVnYXJkaW5nIE5vZGVsaXN0IGxlbmd0aCBpbiBJRVxuXHR2YXIgbGVuZ3RoID0gISFvYmogJiYgXCJsZW5ndGhcIiBpbiBvYmogJiYgb2JqLmxlbmd0aCxcblx0XHR0eXBlID0gdG9UeXBlKCBvYmogKTtcblxuXHRpZiAoIGlzRnVuY3Rpb24oIG9iaiApIHx8IGlzV2luZG93KCBvYmogKSApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXR1cm4gdHlwZSA9PT0gXCJhcnJheVwiIHx8IGxlbmd0aCA9PT0gMCB8fFxuXHRcdHR5cGVvZiBsZW5ndGggPT09IFwibnVtYmVyXCIgJiYgbGVuZ3RoID4gMCAmJiAoIGxlbmd0aCAtIDEgKSBpbiBvYmo7XG59XG52YXIgU2l6emxlID1cbi8qIVxuICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUgdjIuMy40XG4gKiBodHRwczovL3NpenpsZWpzLmNvbS9cbiAqXG4gKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqIGh0dHBzOi8vanMuZm91bmRhdGlvbi9cbiAqXG4gKiBEYXRlOiAyMDE5LTA0LTA4XG4gKi9cbihmdW5jdGlvbiggd2luZG93ICkge1xuXG52YXIgaSxcblx0c3VwcG9ydCxcblx0RXhwcixcblx0Z2V0VGV4dCxcblx0aXNYTUwsXG5cdHRva2VuaXplLFxuXHRjb21waWxlLFxuXHRzZWxlY3QsXG5cdG91dGVybW9zdENvbnRleHQsXG5cdHNvcnRJbnB1dCxcblx0aGFzRHVwbGljYXRlLFxuXG5cdC8vIExvY2FsIGRvY3VtZW50IHZhcnNcblx0c2V0RG9jdW1lbnQsXG5cdGRvY3VtZW50LFxuXHRkb2NFbGVtLFxuXHRkb2N1bWVudElzSFRNTCxcblx0cmJ1Z2d5UVNBLFxuXHRyYnVnZ3lNYXRjaGVzLFxuXHRtYXRjaGVzLFxuXHRjb250YWlucyxcblxuXHQvLyBJbnN0YW5jZS1zcGVjaWZpYyBkYXRhXG5cdGV4cGFuZG8gPSBcInNpenpsZVwiICsgMSAqIG5ldyBEYXRlKCksXG5cdHByZWZlcnJlZERvYyA9IHdpbmRvdy5kb2N1bWVudCxcblx0ZGlycnVucyA9IDAsXG5cdGRvbmUgPSAwLFxuXHRjbGFzc0NhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0dG9rZW5DYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdGNvbXBpbGVyQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHRub25uYXRpdmVTZWxlY3RvckNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0c29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0aWYgKCBhID09PSBiICkge1xuXHRcdFx0aGFzRHVwbGljYXRlID0gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIDA7XG5cdH0sXG5cblx0Ly8gSW5zdGFuY2UgbWV0aG9kc1xuXHRoYXNPd24gPSAoe30pLmhhc093blByb3BlcnR5LFxuXHRhcnIgPSBbXSxcblx0cG9wID0gYXJyLnBvcCxcblx0cHVzaF9uYXRpdmUgPSBhcnIucHVzaCxcblx0cHVzaCA9IGFyci5wdXNoLFxuXHRzbGljZSA9IGFyci5zbGljZSxcblx0Ly8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGFzIGl0J3MgZmFzdGVyIHRoYW4gbmF0aXZlXG5cdC8vIGh0dHBzOi8vanNwZXJmLmNvbS90aG9yLWluZGV4b2YtdnMtZm9yLzVcblx0aW5kZXhPZiA9IGZ1bmN0aW9uKCBsaXN0LCBlbGVtICkge1xuXHRcdHZhciBpID0gMCxcblx0XHRcdGxlbiA9IGxpc3QubGVuZ3RoO1xuXHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0aWYgKCBsaXN0W2ldID09PSBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gaTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIC0xO1xuXHR9LFxuXG5cdGJvb2xlYW5zID0gXCJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZFwiLFxuXG5cdC8vIFJlZ3VsYXIgZXhwcmVzc2lvbnNcblxuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jd2hpdGVzcGFjZVxuXHR3aGl0ZXNwYWNlID0gXCJbXFxcXHgyMFxcXFx0XFxcXHJcXFxcblxcXFxmXVwiLFxuXG5cdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCN2YWx1ZS1kZWYtaWRlbnRpZmllclxuXHRpZGVudGlmaWVyID0gXCIoPzpcXFxcXFxcXC58W1xcXFx3LV18W15cXDAtXFxcXHhhMF0pK1wiLFxuXG5cdC8vIEF0dHJpYnV0ZSBzZWxlY3RvcnM6IGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9yc1xuXHRhdHRyaWJ1dGVzID0gXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKihcIiArIGlkZW50aWZpZXIgKyBcIikoPzpcIiArIHdoaXRlc3BhY2UgK1xuXHRcdC8vIE9wZXJhdG9yIChjYXB0dXJlIDIpXG5cdFx0XCIqKFsqXiR8IX5dPz0pXCIgKyB3aGl0ZXNwYWNlICtcblx0XHQvLyBcIkF0dHJpYnV0ZSB2YWx1ZXMgbXVzdCBiZSBDU1MgaWRlbnRpZmllcnMgW2NhcHR1cmUgNV0gb3Igc3RyaW5ncyBbY2FwdHVyZSAzIG9yIGNhcHR1cmUgNF1cIlxuXHRcdFwiKig/OicoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcInwoXCIgKyBpZGVudGlmaWVyICsgXCIpKXwpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcIipcXFxcXVwiLFxuXG5cdHBzZXVkb3MgPSBcIjooXCIgKyBpZGVudGlmaWVyICsgXCIpKD86XFxcXCgoXCIgK1xuXHRcdC8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBwcmVGaWx0ZXIsIHByZWZlciBhcmd1bWVudHM6XG5cdFx0Ly8gMS4gcXVvdGVkIChjYXB0dXJlIDM7IGNhcHR1cmUgNCBvciBjYXB0dXJlIDUpXG5cdFx0XCIoJygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwiKXxcIiArXG5cdFx0Ly8gMi4gc2ltcGxlIChjYXB0dXJlIDYpXG5cdFx0XCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKVtcXFxcXV18XCIgKyBhdHRyaWJ1dGVzICsgXCIpKil8XCIgK1xuXHRcdC8vIDMuIGFueXRoaW5nIGVsc2UgKGNhcHR1cmUgMilcblx0XHRcIi4qXCIgK1xuXHRcdFwiKVxcXFwpfClcIixcblxuXHQvLyBMZWFkaW5nIGFuZCBub24tZXNjYXBlZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBjYXB0dXJpbmcgc29tZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGluZyB0aGUgbGF0dGVyXG5cdHJ3aGl0ZXNwYWNlID0gbmV3IFJlZ0V4cCggd2hpdGVzcGFjZSArIFwiK1wiLCBcImdcIiApLFxuXHRydHJpbSA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiK3woKD86XnxbXlxcXFxcXFxcXSkoPzpcXFxcXFxcXC4pKilcIiArIHdoaXRlc3BhY2UgKyBcIiskXCIsIFwiZ1wiICksXG5cblx0cmNvbW1hID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqLFwiICsgd2hpdGVzcGFjZSArIFwiKlwiICksXG5cdHJjb21iaW5hdG9ycyA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKihbPit+XXxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIHdoaXRlc3BhY2UgKyBcIipcIiApLFxuXHRyZGVzY2VuZCA9IG5ldyBSZWdFeHAoIHdoaXRlc3BhY2UgKyBcInw+XCIgKSxcblxuXHRycHNldWRvID0gbmV3IFJlZ0V4cCggcHNldWRvcyApLFxuXHRyaWRlbnRpZmllciA9IG5ldyBSZWdFeHAoIFwiXlwiICsgaWRlbnRpZmllciArIFwiJFwiICksXG5cblx0bWF0Y2hFeHByID0ge1xuXHRcdFwiSURcIjogbmV3IFJlZ0V4cCggXCJeIyhcIiArIGlkZW50aWZpZXIgKyBcIilcIiApLFxuXHRcdFwiQ0xBU1NcIjogbmV3IFJlZ0V4cCggXCJeXFxcXC4oXCIgKyBpZGVudGlmaWVyICsgXCIpXCIgKSxcblx0XHRcIlRBR1wiOiBuZXcgUmVnRXhwKCBcIl4oXCIgKyBpZGVudGlmaWVyICsgXCJ8WypdKVwiICksXG5cdFx0XCJBVFRSXCI6IG5ldyBSZWdFeHAoIFwiXlwiICsgYXR0cmlidXRlcyApLFxuXHRcdFwiUFNFVURPXCI6IG5ldyBSZWdFeHAoIFwiXlwiICsgcHNldWRvcyApLFxuXHRcdFwiQ0hJTERcIjogbmV3IFJlZ0V4cCggXCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXFxcKFwiICsgd2hpdGVzcGFjZSArXG5cdFx0XHRcIiooZXZlbnxvZGR8KChbKy1dfCkoXFxcXGQqKW58KVwiICsgd2hpdGVzcGFjZSArIFwiKig/OihbKy1dfClcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XCIqKFxcXFxkKyl8KSlcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcKXwpXCIsIFwiaVwiICksXG5cdFx0XCJib29sXCI6IG5ldyBSZWdFeHAoIFwiXig/OlwiICsgYm9vbGVhbnMgKyBcIikkXCIsIFwiaVwiICksXG5cdFx0Ly8gRm9yIHVzZSBpbiBsaWJyYXJpZXMgaW1wbGVtZW50aW5nIC5pcygpXG5cdFx0Ly8gV2UgdXNlIHRoaXMgZm9yIFBPUyBtYXRjaGluZyBpbiBgc2VsZWN0YFxuXHRcdFwibmVlZHNDb250ZXh0XCI6IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFxcXChcIiArXG5cdFx0XHR3aGl0ZXNwYWNlICsgXCIqKCg/Oi1cXFxcZCk/XFxcXGQqKVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFwpfCkoPz1bXi1dfCQpXCIsIFwiaVwiIClcblx0fSxcblxuXHRyaHRtbCA9IC9IVE1MJC9pLFxuXHRyaW5wdXRzID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxcblx0cmhlYWRlciA9IC9eaFxcZCQvaSxcblxuXHRybmF0aXZlID0gL15bXntdK1xce1xccypcXFtuYXRpdmUgXFx3LyxcblxuXHQvLyBFYXNpbHktcGFyc2VhYmxlL3JldHJpZXZhYmxlIElEIG9yIFRBRyBvciBDTEFTUyBzZWxlY3RvcnNcblx0cnF1aWNrRXhwciA9IC9eKD86IyhbXFx3LV0rKXwoXFx3Kyl8XFwuKFtcXHctXSspKSQvLFxuXG5cdHJzaWJsaW5nID0gL1srfl0vLFxuXG5cdC8vIENTUyBlc2NhcGVzXG5cdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCNlc2NhcGVkLWNoYXJhY3RlcnNcblx0cnVuZXNjYXBlID0gbmV3IFJlZ0V4cCggXCJcXFxcXFxcXChbXFxcXGRhLWZdezEsNn1cIiArIHdoaXRlc3BhY2UgKyBcIj98KFwiICsgd2hpdGVzcGFjZSArIFwiKXwuKVwiLCBcImlnXCIgKSxcblx0ZnVuZXNjYXBlID0gZnVuY3Rpb24oIF8sIGVzY2FwZWQsIGVzY2FwZWRXaGl0ZXNwYWNlICkge1xuXHRcdHZhciBoaWdoID0gXCIweFwiICsgZXNjYXBlZCAtIDB4MTAwMDA7XG5cdFx0Ly8gTmFOIG1lYW5zIG5vbi1jb2RlcG9pbnRcblx0XHQvLyBTdXBwb3J0OiBGaXJlZm94PDI0XG5cdFx0Ly8gV29ya2Fyb3VuZCBlcnJvbmVvdXMgbnVtZXJpYyBpbnRlcnByZXRhdGlvbiBvZiArXCIweFwiXG5cdFx0cmV0dXJuIGhpZ2ggIT09IGhpZ2ggfHwgZXNjYXBlZFdoaXRlc3BhY2UgP1xuXHRcdFx0ZXNjYXBlZCA6XG5cdFx0XHRoaWdoIDwgMCA/XG5cdFx0XHRcdC8vIEJNUCBjb2RlcG9pbnRcblx0XHRcdFx0U3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCArIDB4MTAwMDAgKSA6XG5cdFx0XHRcdC8vIFN1cHBsZW1lbnRhbCBQbGFuZSBjb2RlcG9pbnQgKHN1cnJvZ2F0ZSBwYWlyKVxuXHRcdFx0XHRTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoID4+IDEwIHwgMHhEODAwLCBoaWdoICYgMHgzRkYgfCAweERDMDAgKTtcblx0fSxcblxuXHQvLyBDU1Mgc3RyaW5nL2lkZW50aWZpZXIgc2VyaWFsaXphdGlvblxuXHQvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI2NvbW1vbi1zZXJpYWxpemluZy1pZGlvbXNcblx0cmNzc2VzY2FwZSA9IC8oW1xcMC1cXHgxZlxceDdmXXxeLT9cXGQpfF4tJHxbXlxcMC1cXHgxZlxceDdmLVxcdUZGRkZcXHctXS9nLFxuXHRmY3NzZXNjYXBlID0gZnVuY3Rpb24oIGNoLCBhc0NvZGVQb2ludCApIHtcblx0XHRpZiAoIGFzQ29kZVBvaW50ICkge1xuXG5cdFx0XHQvLyBVKzAwMDAgTlVMTCBiZWNvbWVzIFUrRkZGRCBSRVBMQUNFTUVOVCBDSEFSQUNURVJcblx0XHRcdGlmICggY2ggPT09IFwiXFwwXCIgKSB7XG5cdFx0XHRcdHJldHVybiBcIlxcdUZGRkRcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29udHJvbCBjaGFyYWN0ZXJzIGFuZCAoZGVwZW5kZW50IHVwb24gcG9zaXRpb24pIG51bWJlcnMgZ2V0IGVzY2FwZWQgYXMgY29kZSBwb2ludHNcblx0XHRcdHJldHVybiBjaC5zbGljZSggMCwgLTEgKSArIFwiXFxcXFwiICsgY2guY2hhckNvZGVBdCggY2gubGVuZ3RoIC0gMSApLnRvU3RyaW5nKCAxNiApICsgXCIgXCI7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXIgcG90ZW50aWFsbHktc3BlY2lhbCBBU0NJSSBjaGFyYWN0ZXJzIGdldCBiYWNrc2xhc2gtZXNjYXBlZFxuXHRcdHJldHVybiBcIlxcXFxcIiArIGNoO1xuXHR9LFxuXG5cdC8vIFVzZWQgZm9yIGlmcmFtZXNcblx0Ly8gU2VlIHNldERvY3VtZW50KClcblx0Ly8gUmVtb3ZpbmcgdGhlIGZ1bmN0aW9uIHdyYXBwZXIgY2F1c2VzIGEgXCJQZXJtaXNzaW9uIERlbmllZFwiXG5cdC8vIGVycm9yIGluIElFXG5cdHVubG9hZEhhbmRsZXIgPSBmdW5jdGlvbigpIHtcblx0XHRzZXREb2N1bWVudCgpO1xuXHR9LFxuXG5cdGluRGlzYWJsZWRGaWVsZHNldCA9IGFkZENvbWJpbmF0b3IoXG5cdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gdHJ1ZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiZmllbGRzZXRcIjtcblx0XHR9LFxuXHRcdHsgZGlyOiBcInBhcmVudE5vZGVcIiwgbmV4dDogXCJsZWdlbmRcIiB9XG5cdCk7XG5cbi8vIE9wdGltaXplIGZvciBwdXNoLmFwcGx5KCBfLCBOb2RlTGlzdCApXG50cnkge1xuXHRwdXNoLmFwcGx5KFxuXHRcdChhcnIgPSBzbGljZS5jYWxsKCBwcmVmZXJyZWREb2MuY2hpbGROb2RlcyApKSxcblx0XHRwcmVmZXJyZWREb2MuY2hpbGROb2Rlc1xuXHQpO1xuXHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMFxuXHQvLyBEZXRlY3Qgc2lsZW50bHkgZmFpbGluZyBwdXNoLmFwcGx5XG5cdGFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7XG59IGNhdGNoICggZSApIHtcblx0cHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggP1xuXG5cdFx0Ly8gTGV2ZXJhZ2Ugc2xpY2UgaWYgcG9zc2libGVcblx0XHRmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7XG5cdFx0XHRwdXNoX25hdGl2ZS5hcHBseSggdGFyZ2V0LCBzbGljZS5jYWxsKGVscykgKTtcblx0XHR9IDpcblxuXHRcdC8vIFN1cHBvcnQ6IElFPDlcblx0XHQvLyBPdGhlcndpc2UgYXBwZW5kIGRpcmVjdGx5XG5cdFx0ZnVuY3Rpb24oIHRhcmdldCwgZWxzICkge1xuXHRcdFx0dmFyIGogPSB0YXJnZXQubGVuZ3RoLFxuXHRcdFx0XHRpID0gMDtcblx0XHRcdC8vIENhbid0IHRydXN0IE5vZGVMaXN0Lmxlbmd0aFxuXHRcdFx0d2hpbGUgKCAodGFyZ2V0W2orK10gPSBlbHNbaSsrXSkgKSB7fVxuXHRcdFx0dGFyZ2V0Lmxlbmd0aCA9IGogLSAxO1xuXHRcdH1cblx0fTtcbn1cblxuZnVuY3Rpb24gU2l6emxlKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcblx0dmFyIG0sIGksIGVsZW0sIG5pZCwgbWF0Y2gsIGdyb3VwcywgbmV3U2VsZWN0b3IsXG5cdFx0bmV3Q29udGV4dCA9IGNvbnRleHQgJiYgY29udGV4dC5vd25lckRvY3VtZW50LFxuXG5cdFx0Ly8gbm9kZVR5cGUgZGVmYXVsdHMgdG8gOSwgc2luY2UgY29udGV4dCBkZWZhdWx0cyB0byBkb2N1bWVudFxuXHRcdG5vZGVUeXBlID0gY29udGV4dCA/IGNvbnRleHQubm9kZVR5cGUgOiA5O1xuXG5cdHJlc3VsdHMgPSByZXN1bHRzIHx8IFtdO1xuXG5cdC8vIFJldHVybiBlYXJseSBmcm9tIGNhbGxzIHdpdGggaW52YWxpZCBzZWxlY3RvciBvciBjb250ZXh0XG5cdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiIHx8ICFzZWxlY3RvciB8fFxuXHRcdG5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHtcblxuXHRcdHJldHVybiByZXN1bHRzO1xuXHR9XG5cblx0Ly8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXJzKSBpbiBIVE1MIGRvY3VtZW50c1xuXHRpZiAoICFzZWVkICkge1xuXG5cdFx0aWYgKCAoIGNvbnRleHQgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IHByZWZlcnJlZERvYyApICE9PSBkb2N1bWVudCApIHtcblx0XHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdFx0fVxuXHRcdGNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50O1xuXG5cdFx0aWYgKCBkb2N1bWVudElzSFRNTCApIHtcblxuXHRcdFx0Ly8gSWYgdGhlIHNlbGVjdG9yIGlzIHN1ZmZpY2llbnRseSBzaW1wbGUsIHRyeSB1c2luZyBhIFwiZ2V0KkJ5KlwiIERPTSBtZXRob2Rcblx0XHRcdC8vIChleGNlcHRpbmcgRG9jdW1lbnRGcmFnbWVudCBjb250ZXh0LCB3aGVyZSB0aGUgbWV0aG9kcyBkb24ndCBleGlzdClcblx0XHRcdGlmICggbm9kZVR5cGUgIT09IDExICYmIChtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKSkgKSB7XG5cblx0XHRcdFx0Ly8gSUQgc2VsZWN0b3Jcblx0XHRcdFx0aWYgKCAobSA9IG1hdGNoWzFdKSApIHtcblxuXHRcdFx0XHRcdC8vIERvY3VtZW50IGNvbnRleHRcblx0XHRcdFx0XHRpZiAoIG5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXRcblx0XHRcdFx0XHRcdFx0Ly8gVE9ETzogaWRlbnRpZnkgdmVyc2lvbnNcblx0XHRcdFx0XHRcdFx0Ly8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRFxuXHRcdFx0XHRcdFx0XHRpZiAoIGVsZW0uaWQgPT09IG0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRWxlbWVudCBjb250ZXh0XG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXRcblx0XHRcdFx0XHRcdC8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zXG5cdFx0XHRcdFx0XHQvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElEXG5cdFx0XHRcdFx0XHRpZiAoIG5ld0NvbnRleHQgJiYgKGVsZW0gPSBuZXdDb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkpICYmXG5cdFx0XHRcdFx0XHRcdGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICkgJiZcblx0XHRcdFx0XHRcdFx0ZWxlbS5pZCA9PT0gbSApIHtcblxuXHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFR5cGUgc2VsZWN0b3Jcblx0XHRcdFx0fSBlbHNlIGlmICggbWF0Y2hbMl0gKSB7XG5cdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSApO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXG5cdFx0XHRcdC8vIENsYXNzIHNlbGVjdG9yXG5cdFx0XHRcdH0gZWxzZSBpZiAoIChtID0gbWF0Y2hbM10pICYmIHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJlxuXHRcdFx0XHRcdGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIHtcblxuXHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVGFrZSBhZHZhbnRhZ2Ugb2YgcXVlcnlTZWxlY3RvckFsbFxuXHRcdFx0aWYgKCBzdXBwb3J0LnFzYSAmJlxuXHRcdFx0XHQhbm9ubmF0aXZlU2VsZWN0b3JDYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdICYmXG5cdFx0XHRcdCghcmJ1Z2d5UVNBIHx8ICFyYnVnZ3lRU0EudGVzdCggc2VsZWN0b3IgKSkgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA4IG9ubHlcblx0XHRcdFx0Ly8gRXhjbHVkZSBvYmplY3QgZWxlbWVudHNcblx0XHRcdFx0KG5vZGVUeXBlICE9PSAxIHx8IGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJvYmplY3RcIikgKSB7XG5cblx0XHRcdFx0bmV3U2VsZWN0b3IgPSBzZWxlY3Rvcjtcblx0XHRcdFx0bmV3Q29udGV4dCA9IGNvbnRleHQ7XG5cblx0XHRcdFx0Ly8gcVNBIGNvbnNpZGVycyBlbGVtZW50cyBvdXRzaWRlIGEgc2NvcGluZyByb290IHdoZW4gZXZhbHVhdGluZyBjaGlsZCBvclxuXHRcdFx0XHQvLyBkZXNjZW5kYW50IGNvbWJpbmF0b3JzLCB3aGljaCBpcyBub3Qgd2hhdCB3ZSB3YW50LlxuXHRcdFx0XHQvLyBJbiBzdWNoIGNhc2VzLCB3ZSB3b3JrIGFyb3VuZCB0aGUgYmVoYXZpb3IgYnkgcHJlZml4aW5nIGV2ZXJ5IHNlbGVjdG9yIGluIHRoZVxuXHRcdFx0XHQvLyBsaXN0IHdpdGggYW4gSUQgc2VsZWN0b3IgcmVmZXJlbmNpbmcgdGhlIHNjb3BlIGNvbnRleHQuXG5cdFx0XHRcdC8vIFRoYW5rcyB0byBBbmRyZXcgRHVwb250IGZvciB0aGlzIHRlY2huaXF1ZS5cblx0XHRcdFx0aWYgKCBub2RlVHlwZSA9PT0gMSAmJiByZGVzY2VuZC50ZXN0KCBzZWxlY3RvciApICkge1xuXG5cdFx0XHRcdFx0Ly8gQ2FwdHVyZSB0aGUgY29udGV4dCBJRCwgc2V0dGluZyBpdCBmaXJzdCBpZiBuZWNlc3Nhcnlcblx0XHRcdFx0XHRpZiAoIChuaWQgPSBjb250ZXh0LmdldEF0dHJpYnV0ZSggXCJpZFwiICkpICkge1xuXHRcdFx0XHRcdFx0bmlkID0gbmlkLnJlcGxhY2UoIHJjc3Nlc2NhcGUsIGZjc3Nlc2NhcGUgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29udGV4dC5zZXRBdHRyaWJ1dGUoIFwiaWRcIiwgKG5pZCA9IGV4cGFuZG8pICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gUHJlZml4IGV2ZXJ5IHNlbGVjdG9yIGluIHRoZSBsaXN0XG5cdFx0XHRcdFx0Z3JvdXBzID0gdG9rZW5pemUoIHNlbGVjdG9yICk7XG5cdFx0XHRcdFx0aSA9IGdyb3Vwcy5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRncm91cHNbaV0gPSBcIiNcIiArIG5pZCArIFwiIFwiICsgdG9TZWxlY3RvciggZ3JvdXBzW2ldICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG5ld1NlbGVjdG9yID0gZ3JvdXBzLmpvaW4oIFwiLFwiICk7XG5cblx0XHRcdFx0XHQvLyBFeHBhbmQgY29udGV4dCBmb3Igc2libGluZyBzZWxlY3RvcnNcblx0XHRcdFx0XHRuZXdDb250ZXh0ID0gcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHxcblx0XHRcdFx0XHRcdGNvbnRleHQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsXG5cdFx0XHRcdFx0XHRuZXdDb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIG5ld1NlbGVjdG9yIClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHR9IGNhdGNoICggcXNhRXJyb3IgKSB7XG5cdFx0XHRcdFx0bm9ubmF0aXZlU2VsZWN0b3JDYWNoZSggc2VsZWN0b3IsIHRydWUgKTtcblx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRpZiAoIG5pZCA9PT0gZXhwYW5kbyApIHtcblx0XHRcdFx0XHRcdGNvbnRleHQucmVtb3ZlQXR0cmlidXRlKCBcImlkXCIgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBBbGwgb3RoZXJzXG5cdHJldHVybiBzZWxlY3QoIHNlbGVjdG9yLnJlcGxhY2UoIHJ0cmltLCBcIiQxXCIgKSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApO1xufVxuXG4vKipcbiAqIENyZWF0ZSBrZXktdmFsdWUgY2FjaGVzIG9mIGxpbWl0ZWQgc2l6ZVxuICogQHJldHVybnMge2Z1bmN0aW9uKHN0cmluZywgb2JqZWN0KX0gUmV0dXJucyB0aGUgT2JqZWN0IGRhdGEgYWZ0ZXIgc3RvcmluZyBpdCBvbiBpdHNlbGYgd2l0aFxuICpcdHByb3BlcnR5IG5hbWUgdGhlIChzcGFjZS1zdWZmaXhlZCkgc3RyaW5nIGFuZCAoaWYgdGhlIGNhY2hlIGlzIGxhcmdlciB0aGFuIEV4cHIuY2FjaGVMZW5ndGgpXG4gKlx0ZGVsZXRpbmcgdGhlIG9sZGVzdCBlbnRyeVxuICovXG5mdW5jdGlvbiBjcmVhdGVDYWNoZSgpIHtcblx0dmFyIGtleXMgPSBbXTtcblxuXHRmdW5jdGlvbiBjYWNoZSgga2V5LCB2YWx1ZSApIHtcblx0XHQvLyBVc2UgKGtleSArIFwiIFwiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAjMTU3KVxuXHRcdGlmICgga2V5cy5wdXNoKCBrZXkgKyBcIiBcIiApID4gRXhwci5jYWNoZUxlbmd0aCApIHtcblx0XHRcdC8vIE9ubHkga2VlcCB0aGUgbW9zdCByZWNlbnQgZW50cmllc1xuXHRcdFx0ZGVsZXRlIGNhY2hlWyBrZXlzLnNoaWZ0KCkgXTtcblx0XHR9XG5cdFx0cmV0dXJuIChjYWNoZVsga2V5ICsgXCIgXCIgXSA9IHZhbHVlKTtcblx0fVxuXHRyZXR1cm4gY2FjaGU7XG59XG5cbi8qKlxuICogTWFyayBhIGZ1bmN0aW9uIGZvciBzcGVjaWFsIHVzZSBieSBTaXp6bGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBtYXJrXG4gKi9cbmZ1bmN0aW9uIG1hcmtGdW5jdGlvbiggZm4gKSB7XG5cdGZuWyBleHBhbmRvIF0gPSB0cnVlO1xuXHRyZXR1cm4gZm47XG59XG5cbi8qKlxuICogU3VwcG9ydCB0ZXN0aW5nIHVzaW5nIGFuIGVsZW1lbnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFBhc3NlZCB0aGUgY3JlYXRlZCBlbGVtZW50IGFuZCByZXR1cm5zIGEgYm9vbGVhbiByZXN1bHRcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0KCBmbiApIHtcblx0dmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImZpZWxkc2V0XCIpO1xuXG5cdHRyeSB7XG5cdFx0cmV0dXJuICEhZm4oIGVsICk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0gZmluYWxseSB7XG5cdFx0Ly8gUmVtb3ZlIGZyb20gaXRzIHBhcmVudCBieSBkZWZhdWx0XG5cdFx0aWYgKCBlbC5wYXJlbnROb2RlICkge1xuXHRcdFx0ZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZWwgKTtcblx0XHR9XG5cdFx0Ly8gcmVsZWFzZSBtZW1vcnkgaW4gSUVcblx0XHRlbCA9IG51bGw7XG5cdH1cbn1cblxuLyoqXG4gKiBBZGRzIHRoZSBzYW1lIGhhbmRsZXIgZm9yIGFsbCBvZiB0aGUgc3BlY2lmaWVkIGF0dHJzXG4gKiBAcGFyYW0ge1N0cmluZ30gYXR0cnMgUGlwZS1zZXBhcmF0ZWQgbGlzdCBvZiBhdHRyaWJ1dGVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyIFRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGFwcGxpZWRcbiAqL1xuZnVuY3Rpb24gYWRkSGFuZGxlKCBhdHRycywgaGFuZGxlciApIHtcblx0dmFyIGFyciA9IGF0dHJzLnNwbGl0KFwifFwiKSxcblx0XHRpID0gYXJyLmxlbmd0aDtcblxuXHR3aGlsZSAoIGktLSApIHtcblx0XHRFeHByLmF0dHJIYW5kbGVbIGFycltpXSBdID0gaGFuZGxlcjtcblx0fVxufVxuXG4vKipcbiAqIENoZWNrcyBkb2N1bWVudCBvcmRlciBvZiB0d28gc2libGluZ3NcbiAqIEBwYXJhbSB7RWxlbWVudH0gYVxuICogQHBhcmFtIHtFbGVtZW50fSBiXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIGxlc3MgdGhhbiAwIGlmIGEgcHJlY2VkZXMgYiwgZ3JlYXRlciB0aGFuIDAgaWYgYSBmb2xsb3dzIGJcbiAqL1xuZnVuY3Rpb24gc2libGluZ0NoZWNrKCBhLCBiICkge1xuXHR2YXIgY3VyID0gYiAmJiBhLFxuXHRcdGRpZmYgPSBjdXIgJiYgYS5ub2RlVHlwZSA9PT0gMSAmJiBiLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRhLnNvdXJjZUluZGV4IC0gYi5zb3VyY2VJbmRleDtcblxuXHQvLyBVc2UgSUUgc291cmNlSW5kZXggaWYgYXZhaWxhYmxlIG9uIGJvdGggbm9kZXNcblx0aWYgKCBkaWZmICkge1xuXHRcdHJldHVybiBkaWZmO1xuXHR9XG5cblx0Ly8gQ2hlY2sgaWYgYiBmb2xsb3dzIGFcblx0aWYgKCBjdXIgKSB7XG5cdFx0d2hpbGUgKCAoY3VyID0gY3VyLm5leHRTaWJsaW5nKSApIHtcblx0XHRcdGlmICggY3VyID09PSBiICkge1xuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGEgPyAxIDogLTE7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlc1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7XG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRyZXR1cm4gbmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0udHlwZSA9PT0gdHlwZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGJ1dHRvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJ1dHRvblBzZXVkbyggdHlwZSApIHtcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdHJldHVybiAobmFtZSA9PT0gXCJpbnB1dFwiIHx8IG5hbWUgPT09IFwiYnV0dG9uXCIpICYmIGVsZW0udHlwZSA9PT0gdHlwZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIDplbmFibGVkLzpkaXNhYmxlZFxuICogQHBhcmFtIHtCb29sZWFufSBkaXNhYmxlZCB0cnVlIGZvciA6ZGlzYWJsZWQ7IGZhbHNlIGZvciA6ZW5hYmxlZFxuICovXG5mdW5jdGlvbiBjcmVhdGVEaXNhYmxlZFBzZXVkbyggZGlzYWJsZWQgKSB7XG5cblx0Ly8gS25vd24gOmRpc2FibGVkIGZhbHNlIHBvc2l0aXZlczogZmllbGRzZXRbZGlzYWJsZWRdID4gbGVnZW5kOm50aC1vZi10eXBlKG4rMikgOmNhbi1kaXNhYmxlXG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdC8vIE9ubHkgY2VydGFpbiBlbGVtZW50cyBjYW4gbWF0Y2ggOmVuYWJsZWQgb3IgOmRpc2FibGVkXG5cdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2NyaXB0aW5nLmh0bWwjc2VsZWN0b3ItZW5hYmxlZFxuXHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3NjcmlwdGluZy5odG1sI3NlbGVjdG9yLWRpc2FibGVkXG5cdFx0aWYgKCBcImZvcm1cIiBpbiBlbGVtICkge1xuXG5cdFx0XHQvLyBDaGVjayBmb3IgaW5oZXJpdGVkIGRpc2FibGVkbmVzcyBvbiByZWxldmFudCBub24tZGlzYWJsZWQgZWxlbWVudHM6XG5cdFx0XHQvLyAqIGxpc3RlZCBmb3JtLWFzc29jaWF0ZWQgZWxlbWVudHMgaW4gYSBkaXNhYmxlZCBmaWVsZHNldFxuXHRcdFx0Ly8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2NhdGVnb3J5LWxpc3RlZFxuXHRcdFx0Ly8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2NvbmNlcHQtZmUtZGlzYWJsZWRcblx0XHRcdC8vICogb3B0aW9uIGVsZW1lbnRzIGluIGEgZGlzYWJsZWQgb3B0Z3JvdXBcblx0XHRcdC8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjb25jZXB0LW9wdGlvbi1kaXNhYmxlZFxuXHRcdFx0Ly8gQWxsIHN1Y2ggZWxlbWVudHMgaGF2ZSBhIFwiZm9ybVwiIHByb3BlcnR5LlxuXHRcdFx0aWYgKCBlbGVtLnBhcmVudE5vZGUgJiYgZWxlbS5kaXNhYmxlZCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0Ly8gT3B0aW9uIGVsZW1lbnRzIGRlZmVyIHRvIGEgcGFyZW50IG9wdGdyb3VwIGlmIHByZXNlbnRcblx0XHRcdFx0aWYgKCBcImxhYmVsXCIgaW4gZWxlbSApIHtcblx0XHRcdFx0XHRpZiAoIFwibGFiZWxcIiBpbiBlbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbS5wYXJlbnROb2RlLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGRpc2FibGVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDYgLSAxMVxuXHRcdFx0XHQvLyBVc2UgdGhlIGlzRGlzYWJsZWQgc2hvcnRjdXQgcHJvcGVydHkgdG8gY2hlY2sgZm9yIGRpc2FibGVkIGZpZWxkc2V0IGFuY2VzdG9yc1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5pc0Rpc2FibGVkID09PSBkaXNhYmxlZCB8fFxuXG5cdFx0XHRcdFx0Ly8gV2hlcmUgdGhlcmUgaXMgbm8gaXNEaXNhYmxlZCwgY2hlY2sgbWFudWFsbHlcblx0XHRcdFx0XHQvKiBqc2hpbnQgLVcwMTggKi9cblx0XHRcdFx0XHRlbGVtLmlzRGlzYWJsZWQgIT09ICFkaXNhYmxlZCAmJlxuXHRcdFx0XHRcdFx0aW5EaXNhYmxlZEZpZWxkc2V0KCBlbGVtICkgPT09IGRpc2FibGVkO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cblx0XHQvLyBUcnkgdG8gd2lubm93IG91dCBlbGVtZW50cyB0aGF0IGNhbid0IGJlIGRpc2FibGVkIGJlZm9yZSB0cnVzdGluZyB0aGUgZGlzYWJsZWQgcHJvcGVydHkuXG5cdFx0Ly8gU29tZSB2aWN0aW1zIGdldCBjYXVnaHQgaW4gb3VyIG5ldCAobGFiZWwsIGxlZ2VuZCwgbWVudSwgdHJhY2spLCBidXQgaXQgc2hvdWxkbid0XG5cdFx0Ly8gZXZlbiBleGlzdCBvbiB0aGVtLCBsZXQgYWxvbmUgaGF2ZSBhIGJvb2xlYW4gdmFsdWUuXG5cdFx0fSBlbHNlIGlmICggXCJsYWJlbFwiIGluIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gUmVtYWluaW5nIGVsZW1lbnRzIGFyZSBuZWl0aGVyIDplbmFibGVkIG5vciA6ZGlzYWJsZWRcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBwb3NpdGlvbmFsc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZm4gKSB7XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIGFyZ3VtZW50ICkge1xuXHRcdGFyZ3VtZW50ID0gK2FyZ3VtZW50O1xuXHRcdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7XG5cdFx0XHR2YXIgaixcblx0XHRcdFx0bWF0Y2hJbmRleGVzID0gZm4oIFtdLCBzZWVkLmxlbmd0aCwgYXJndW1lbnQgKSxcblx0XHRcdFx0aSA9IG1hdGNoSW5kZXhlcy5sZW5ndGg7XG5cblx0XHRcdC8vIE1hdGNoIGVsZW1lbnRzIGZvdW5kIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXhlc1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggc2VlZFsgKGogPSBtYXRjaEluZGV4ZXNbaV0pIF0gKSB7XG5cdFx0XHRcdFx0c2VlZFtqXSA9ICEobWF0Y2hlc1tqXSA9IHNlZWRbal0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0pO1xufVxuXG4vKipcbiAqIENoZWNrcyBhIG5vZGUgZm9yIHZhbGlkaXR5IGFzIGEgU2l6emxlIGNvbnRleHRcbiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3Q9fSBjb250ZXh0XG4gKiBAcmV0dXJucyB7RWxlbWVudHxPYmplY3R8Qm9vbGVhbn0gVGhlIGlucHV0IG5vZGUgaWYgYWNjZXB0YWJsZSwgb3RoZXJ3aXNlIGEgZmFsc3kgdmFsdWVcbiAqL1xuZnVuY3Rpb24gdGVzdENvbnRleHQoIGNvbnRleHQgKSB7XG5cdHJldHVybiBjb250ZXh0ICYmIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICYmIGNvbnRleHQ7XG59XG5cbi8vIEV4cG9zZSBzdXBwb3J0IHZhcnMgZm9yIGNvbnZlbmllbmNlXG5zdXBwb3J0ID0gU2l6emxlLnN1cHBvcnQgPSB7fTtcblxuLyoqXG4gKiBEZXRlY3RzIFhNTCBub2Rlc1xuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gZWxlbSBBbiBlbGVtZW50IG9yIGEgZG9jdW1lbnRcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmZiBlbGVtIGlzIGEgbm9uLUhUTUwgWE1MIG5vZGVcbiAqL1xuaXNYTUwgPSBTaXp6bGUuaXNYTUwgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0dmFyIG5hbWVzcGFjZSA9IGVsZW0ubmFtZXNwYWNlVVJJLFxuXHRcdGRvY0VsZW0gPSAoZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0pLmRvY3VtZW50RWxlbWVudDtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PThcblx0Ly8gQXNzdW1lIEhUTUwgd2hlbiBkb2N1bWVudEVsZW1lbnQgZG9lc24ndCB5ZXQgZXhpc3QsIHN1Y2ggYXMgaW5zaWRlIGxvYWRpbmcgaWZyYW1lc1xuXHQvLyBodHRwczovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvNDgzM1xuXHRyZXR1cm4gIXJodG1sLnRlc3QoIG5hbWVzcGFjZSB8fCBkb2NFbGVtICYmIGRvY0VsZW0ubm9kZU5hbWUgfHwgXCJIVE1MXCIgKTtcbn07XG5cbi8qKlxuICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBbZG9jXSBBbiBlbGVtZW50IG9yIGRvY3VtZW50IG9iamVjdCB0byB1c2UgdG8gc2V0IHRoZSBkb2N1bWVudFxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY3VycmVudCBkb2N1bWVudFxuICovXG5zZXREb2N1bWVudCA9IFNpenpsZS5zZXREb2N1bWVudCA9IGZ1bmN0aW9uKCBub2RlICkge1xuXHR2YXIgaGFzQ29tcGFyZSwgc3ViV2luZG93LFxuXHRcdGRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYztcblxuXHQvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxlY3RlZFxuXHRpZiAoIGRvYyA9PT0gZG9jdW1lbnQgfHwgZG9jLm5vZGVUeXBlICE9PSA5IHx8ICFkb2MuZG9jdW1lbnRFbGVtZW50ICkge1xuXHRcdHJldHVybiBkb2N1bWVudDtcblx0fVxuXG5cdC8vIFVwZGF0ZSBnbG9iYWwgdmFyaWFibGVzXG5cdGRvY3VtZW50ID0gZG9jO1xuXHRkb2NFbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXHRkb2N1bWVudElzSFRNTCA9ICFpc1hNTCggZG9jdW1lbnQgKTtcblxuXHQvLyBTdXBwb3J0OiBJRSA5LTExLCBFZGdlXG5cdC8vIEFjY2Vzc2luZyBpZnJhbWUgZG9jdW1lbnRzIGFmdGVyIHVubG9hZCB0aHJvd3MgXCJwZXJtaXNzaW9uIGRlbmllZFwiIGVycm9ycyAoalF1ZXJ5ICMxMzkzNilcblx0aWYgKCBwcmVmZXJyZWREb2MgIT09IGRvY3VtZW50ICYmXG5cdFx0KHN1YldpbmRvdyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3KSAmJiBzdWJXaW5kb3cudG9wICE9PSBzdWJXaW5kb3cgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSAxMSwgRWRnZVxuXHRcdGlmICggc3ViV2luZG93LmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRzdWJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggXCJ1bmxvYWRcIiwgdW5sb2FkSGFuZGxlciwgZmFsc2UgKTtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMCBvbmx5XG5cdFx0fSBlbHNlIGlmICggc3ViV2luZG93LmF0dGFjaEV2ZW50ICkge1xuXHRcdFx0c3ViV2luZG93LmF0dGFjaEV2ZW50KCBcIm9udW5sb2FkXCIsIHVubG9hZEhhbmRsZXIgKTtcblx0XHR9XG5cdH1cblxuXHQvKiBBdHRyaWJ1dGVzXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBTdXBwb3J0OiBJRTw4XG5cdC8vIFZlcmlmeSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkgcmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJvcGVydGllc1xuXHQvLyAoZXhjZXB0aW5nIElFOCBib29sZWFucylcblx0c3VwcG9ydC5hdHRyaWJ1dGVzID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRlbC5jbGFzc05hbWUgPSBcImlcIjtcblx0XHRyZXR1cm4gIWVsLmdldEF0dHJpYnV0ZShcImNsYXNzTmFtZVwiKTtcblx0fSk7XG5cblx0LyogZ2V0RWxlbWVudChzKUJ5KlxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpIHJldHVybnMgb25seSBlbGVtZW50c1xuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlUYWdOYW1lID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRlbC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlQ29tbWVudChcIlwiKSApO1xuXHRcdHJldHVybiAhZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpLmxlbmd0aDtcblx0fSk7XG5cblx0Ly8gU3VwcG9ydDogSUU8OVxuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTtcblxuXHQvLyBTdXBwb3J0OiBJRTwxMFxuXHQvLyBDaGVjayBpZiBnZXRFbGVtZW50QnlJZCByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWVcblx0Ly8gVGhlIGJyb2tlbiBnZXRFbGVtZW50QnlJZCBtZXRob2RzIGRvbid0IHBpY2sgdXAgcHJvZ3JhbW1hdGljYWxseS1zZXQgbmFtZXMsXG5cdC8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdFxuXHRzdXBwb3J0LmdldEJ5SWQgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuaWQgPSBleHBhbmRvO1xuXHRcdHJldHVybiAhZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUgfHwgIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCBleHBhbmRvICkubGVuZ3RoO1xuXHR9KTtcblxuXHQvLyBJRCBmaWx0ZXIgYW5kIGZpbmRcblx0aWYgKCBzdXBwb3J0LmdldEJ5SWQgKSB7XG5cdFx0RXhwci5maWx0ZXJbXCJJRFwiXSA9IGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXHRcdEV4cHIuZmluZFtcIklEXCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdFx0dmFyIGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApO1xuXHRcdFx0XHRyZXR1cm4gZWxlbSA/IFsgZWxlbSBdIDogW107XG5cdFx0XHR9XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRFeHByLmZpbHRlcltcIklEXCJdID0gIGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09IFwidW5kZWZpbmVkXCIgJiZcblx0XHRcdFx0XHRlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0cmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgNiAtIDcgb25seVxuXHRcdC8vIGdldEVsZW1lbnRCeUlkIGlzIG5vdCByZWxpYWJsZSBhcyBhIGZpbmQgc2hvcnRjdXRcblx0XHRFeHByLmZpbmRbXCJJRFwiXSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHtcblx0XHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRcdHZhciBub2RlLCBpLCBlbGVtcyxcblx0XHRcdFx0XHRlbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTtcblxuXHRcdFx0XHRpZiAoIGVsZW0gKSB7XG5cblx0XHRcdFx0XHQvLyBWZXJpZnkgdGhlIGlkIGF0dHJpYnV0ZVxuXHRcdFx0XHRcdG5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0XHRpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gWyBlbGVtIF07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRmFsbCBiYWNrIG9uIGdldEVsZW1lbnRzQnlOYW1lXG5cdFx0XHRcdFx0ZWxlbXMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lKCBpZCApO1xuXHRcdFx0XHRcdGkgPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtc1tpKytdKSApIHtcblx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0XHRcdGlmICggbm9kZSAmJiBub2RlLnZhbHVlID09PSBpZCApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFsgZWxlbSBdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBbXTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0Ly8gVGFnXG5cdEV4cHIuZmluZFtcIlRBR1wiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgP1xuXHRcdGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7XG5cblx0XHRcdC8vIERvY3VtZW50RnJhZ21lbnQgbm9kZXMgZG9uJ3QgaGF2ZSBnRUJUTlxuXHRcdFx0fSBlbHNlIGlmICggc3VwcG9ydC5xc2EgKSB7XG5cdFx0XHRcdHJldHVybiBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyApO1xuXHRcdFx0fVxuXHRcdH0gOlxuXG5cdFx0ZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHtcblx0XHRcdHZhciBlbGVtLFxuXHRcdFx0XHR0bXAgPSBbXSxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdC8vIEJ5IGhhcHB5IGNvaW5jaWRlbmNlLCBhIChicm9rZW4pIGdFQlROIGFwcGVhcnMgb24gRG9jdW1lbnRGcmFnbWVudCBub2RlcyB0b29cblx0XHRcdFx0cmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApO1xuXG5cdFx0XHQvLyBGaWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRzXG5cdFx0XHRpZiAoIHRhZyA9PT0gXCIqXCIgKSB7XG5cdFx0XHRcdHdoaWxlICggKGVsZW0gPSByZXN1bHRzW2krK10pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0XHRcdHRtcC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRtcDtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdH07XG5cblx0Ly8gQ2xhc3Ncblx0RXhwci5maW5kW1wiQ0xBU1NcIl0gPSBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYgZnVuY3Rpb24oIGNsYXNzTmFtZSwgY29udGV4dCApIHtcblx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBjbGFzc05hbWUgKTtcblx0XHR9XG5cdH07XG5cblx0LyogUVNBL21hdGNoZXNTZWxlY3RvclxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gUVNBIGFuZCBtYXRjaGVzU2VsZWN0b3Igc3VwcG9ydFxuXG5cdC8vIG1hdGNoZXNTZWxlY3Rvcig6YWN0aXZlKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoSUU5L09wZXJhIDExLjUpXG5cdHJidWdneU1hdGNoZXMgPSBbXTtcblxuXHQvLyBxU2EoOmZvY3VzKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoQ2hyb21lIDIxKVxuXHQvLyBXZSBhbGxvdyB0aGlzIGJlY2F1c2Ugb2YgYSBidWcgaW4gSUU4LzkgdGhhdCB0aHJvd3MgYW4gZXJyb3Jcblx0Ly8gd2hlbmV2ZXIgYGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRgIGlzIGFjY2Vzc2VkIG9uIGFuIGlmcmFtZVxuXHQvLyBTbywgd2UgYWxsb3cgOmZvY3VzIHRvIHBhc3MgdGhyb3VnaCBRU0EgYWxsIHRoZSB0aW1lIHRvIGF2b2lkIHRoZSBJRSBlcnJvclxuXHQvLyBTZWUgaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzc4XG5cdHJidWdneVFTQSA9IFtdO1xuXG5cdGlmICggKHN1cHBvcnQucXNhID0gcm5hdGl2ZS50ZXN0KCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsICkpICkge1xuXHRcdC8vIEJ1aWxkIFFTQSByZWdleFxuXHRcdC8vIFJlZ2V4IHN0cmF0ZWd5IGFkb3B0ZWQgZnJvbSBEaWVnbyBQZXJpbmlcblx0XHRhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRcdFx0Ly8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZVxuXHRcdFx0Ly8gVGhpcyBpcyB0byB0ZXN0IElFJ3MgdHJlYXRtZW50IG9mIG5vdCBleHBsaWNpdGx5XG5cdFx0XHQvLyBzZXR0aW5nIGEgYm9vbGVhbiBjb250ZW50IGF0dHJpYnV0ZSxcblx0XHRcdC8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoXG5cdFx0XHQvLyBodHRwczovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIzNTlcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuaW5uZXJIVE1MID0gXCI8YSBpZD0nXCIgKyBleHBhbmRvICsgXCInPjwvYT5cIiArXG5cdFx0XHRcdFwiPHNlbGVjdCBpZD0nXCIgKyBleHBhbmRvICsgXCItXFxyXFxcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+XCIgK1xuXHRcdFx0XHRcIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+XCI7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOCwgT3BlcmEgMTEtMTIuMTZcblx0XHRcdC8vIE5vdGhpbmcgc2hvdWxkIGJlIHNlbGVjdGVkIHdoZW4gZW1wdHkgc3RyaW5ncyBmb2xsb3cgXj0gb3IgJD0gb3IgKj1cblx0XHRcdC8vIFRoZSB0ZXN0IGF0dHJpYnV0ZSBtdXN0IGJlIHVua25vd24gaW4gT3BlcmEgYnV0IFwic2FmZVwiIGZvciBXaW5SVFxuXHRcdFx0Ly8gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9oaDQ2NTM4OC5hc3B4I2F0dHJpYnV0ZV9zZWN0aW9uXG5cdFx0XHRpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbbXNhbGxvd2NhcHR1cmVePScnXVwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlsqXiRdPVwiICsgd2hpdGVzcGFjZSArIFwiKig/OicnfFxcXCJcXFwiKVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOFxuXHRcdFx0Ly8gQm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCBcInZhbHVlXCIgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseVxuXHRcdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbChcIltzZWxlY3RlZF1cIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKig/OnZhbHVlfFwiICsgYm9vbGVhbnMgKyBcIilcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWU8MjksIEFuZHJvaWQ8NC40LCBTYWZhcmk8Ny4wKywgaU9TPDcuMCssIFBoYW50b21KUzwxLjkuOCtcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW2lkfj1cIiArIGV4cGFuZG8gKyBcIi1dXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwifj1cIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdlYmtpdC9PcGVyYSAtIDpjaGVja2VkIHNob3VsZCByZXR1cm4gc2VsZWN0ZWQgb3B0aW9uIGVsZW1lbnRzXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6Y2hlY2tlZFwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwiOmNoZWNrZWRcIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IFNhZmFyaSA4KywgaU9TIDgrXG5cdFx0XHQvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM2ODUxXG5cdFx0XHQvLyBJbi1wYWdlIGBzZWxlY3RvciNpZCBzaWJsaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzXG5cdFx0XHRpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCBcImEjXCIgKyBleHBhbmRvICsgXCIrKlwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaChcIi4jLitbK35dXCIpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0YXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRcdGVsLmlubmVySFRNTCA9IFwiPGEgaHJlZj0nJyBkaXNhYmxlZD0nZGlzYWJsZWQnPjwvYT5cIiArXG5cdFx0XHRcdFwiPHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PlwiO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBXaW5kb3dzIDggTmF0aXZlIEFwcHNcblx0XHRcdC8vIFRoZSB0eXBlIGFuZCBuYW1lIGF0dHJpYnV0ZXMgYXJlIHJlc3RyaWN0ZWQgZHVyaW5nIC5pbm5lckhUTUwgYXNzaWdubWVudFxuXHRcdFx0dmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuXHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJoaWRkZW5cIiApO1xuXHRcdFx0ZWwuYXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCBcIm5hbWVcIiwgXCJEXCIgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU4XG5cdFx0XHQvLyBFbmZvcmNlIGNhc2Utc2Vuc2l0aXZpdHkgb2YgbmFtZSBhdHRyaWJ1dGVcblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbChcIltuYW1lPWRdXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwibmFtZVwiICsgd2hpdGVzcGFjZSArIFwiKlsqXiR8IX5dPz1cIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBGRiAzLjUgLSA6ZW5hYmxlZC86ZGlzYWJsZWQgYW5kIGhpZGRlbiBlbGVtZW50cyAoaGlkZGVuIGVsZW1lbnRzIGFyZSBzdGlsbCBlbmFibGVkKVxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbChcIjplbmFibGVkXCIpLmxlbmd0aCAhPT0gMiApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmVuYWJsZWRcIiwgXCI6ZGlzYWJsZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTktMTErXG5cdFx0XHQvLyBJRSdzIDpkaXNhYmxlZCBzZWxlY3RvciBkb2VzIG5vdCBwaWNrIHVwIHRoZSBjaGlsZHJlbiBvZiBkaXNhYmxlZCBmaWVsZHNldHNcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuZGlzYWJsZWQgPSB0cnVlO1xuXHRcdFx0aWYgKCBlbC5xdWVyeVNlbGVjdG9yQWxsKFwiOmRpc2FibGVkXCIpLmxlbmd0aCAhPT0gMiApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmVuYWJsZWRcIiwgXCI6ZGlzYWJsZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPcGVyYSAxMC0xMSBkb2VzIG5vdCB0aHJvdyBvbiBwb3N0LWNvbW1hIGludmFsaWQgcHNldWRvc1xuXHRcdFx0ZWwucXVlcnlTZWxlY3RvckFsbChcIiosOnhcIik7XG5cdFx0XHRyYnVnZ3lRU0EucHVzaChcIiwuKjpcIik7XG5cdFx0fSk7XG5cdH1cblxuXHRpZiAoIChzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJuYXRpdmUudGVzdCggKG1hdGNoZXMgPSBkb2NFbGVtLm1hdGNoZXMgfHxcblx0XHRkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvcikgKSkgKSB7XG5cblx0XHRhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRcdFx0Ly8gQ2hlY2sgdG8gc2VlIGlmIGl0J3MgcG9zc2libGUgdG8gZG8gbWF0Y2hlc1NlbGVjdG9yXG5cdFx0XHQvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KVxuXHRcdFx0c3VwcG9ydC5kaXNjb25uZWN0ZWRNYXRjaCA9IG1hdGNoZXMuY2FsbCggZWwsIFwiKlwiICk7XG5cblx0XHRcdC8vIFRoaXMgc2hvdWxkIGZhaWwgd2l0aCBhbiBleGNlcHRpb25cblx0XHRcdC8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWRcblx0XHRcdG1hdGNoZXMuY2FsbCggZWwsIFwiW3MhPScnXTp4XCIgKTtcblx0XHRcdHJidWdneU1hdGNoZXMucHVzaCggXCIhPVwiLCBwc2V1ZG9zICk7XG5cdFx0fSk7XG5cdH1cblxuXHRyYnVnZ3lRU0EgPSByYnVnZ3lRU0EubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneVFTQS5qb2luKFwifFwiKSApO1xuXHRyYnVnZ3lNYXRjaGVzID0gcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKFwifFwiKSApO1xuXG5cdC8qIENvbnRhaW5zXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblx0aGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApO1xuXG5cdC8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlclxuXHQvLyBQdXJwb3NlZnVsbHkgc2VsZi1leGNsdXNpdmVcblx0Ly8gQXMgaW4sIGFuIGVsZW1lbnQgZG9lcyBub3QgY29udGFpbiBpdHNlbGZcblx0Y29udGFpbnMgPSBoYXNDb21wYXJlIHx8IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb250YWlucyApID9cblx0XHRmdW5jdGlvbiggYSwgYiApIHtcblx0XHRcdHZhciBhZG93biA9IGEubm9kZVR5cGUgPT09IDkgPyBhLmRvY3VtZW50RWxlbWVudCA6IGEsXG5cdFx0XHRcdGJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlO1xuXHRcdFx0cmV0dXJuIGEgPT09IGJ1cCB8fCAhISggYnVwICYmIGJ1cC5ub2RlVHlwZSA9PT0gMSAmJiAoXG5cdFx0XHRcdGFkb3duLmNvbnRhaW5zID9cblx0XHRcdFx0XHRhZG93bi5jb250YWlucyggYnVwICkgOlxuXHRcdFx0XHRcdGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVwICkgJiAxNlxuXHRcdFx0KSk7XG5cdFx0fSA6XG5cdFx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0XHRpZiAoIGIgKSB7XG5cdFx0XHRcdHdoaWxlICggKGIgPSBiLnBhcmVudE5vZGUpICkge1xuXHRcdFx0XHRcdGlmICggYiA9PT0gYSApIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG5cblx0LyogU29ydGluZ1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gRG9jdW1lbnQgb3JkZXIgc29ydGluZ1xuXHRzb3J0T3JkZXIgPSBoYXNDb21wYXJlID9cblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cblx0XHQvLyBGbGFnIGZvciBkdXBsaWNhdGUgcmVtb3ZhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHQvLyBTb3J0IG9uIG1ldGhvZCBleGlzdGVuY2UgaWYgb25seSBvbmUgaW5wdXQgaGFzIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uXG5cdFx0dmFyIGNvbXBhcmUgPSAhYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAtICFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO1xuXHRcdGlmICggY29tcGFyZSApIHtcblx0XHRcdHJldHVybiBjb21wYXJlO1xuXHRcdH1cblxuXHRcdC8vIENhbGN1bGF0ZSBwb3NpdGlvbiBpZiBib3RoIGlucHV0cyBiZWxvbmcgdG8gdGhlIHNhbWUgZG9jdW1lbnRcblx0XHRjb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSApID09PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgP1xuXHRcdFx0YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYiApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVkXG5cdFx0XHQxO1xuXG5cdFx0Ly8gRGlzY29ubmVjdGVkIG5vZGVzXG5cdFx0aWYgKCBjb21wYXJlICYgMSB8fFxuXHRcdFx0KCFzdXBwb3J0LnNvcnREZXRhY2hlZCAmJiBiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBhICkgPT09IGNvbXBhcmUpICkge1xuXG5cdFx0XHQvLyBDaG9vc2UgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyByZWxhdGVkIHRvIG91ciBwcmVmZXJyZWQgZG9jdW1lbnRcblx0XHRcdGlmICggYSA9PT0gZG9jdW1lbnQgfHwgYS5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBhKSApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBiID09PSBkb2N1bWVudCB8fCBiLm93bmVyRG9jdW1lbnQgPT09IHByZWZlcnJlZERvYyAmJiBjb250YWlucyhwcmVmZXJyZWREb2MsIGIpICkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXJcblx0XHRcdHJldHVybiBzb3J0SW5wdXQgP1xuXHRcdFx0XHQoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6XG5cdFx0XHRcdDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxO1xuXHR9IDpcblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0Ly8gRXhpdCBlYXJseSBpZiB0aGUgbm9kZXMgYXJlIGlkZW50aWNhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHR2YXIgY3VyLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRhdXAgPSBhLnBhcmVudE5vZGUsXG5cdFx0XHRidXAgPSBiLnBhcmVudE5vZGUsXG5cdFx0XHRhcCA9IFsgYSBdLFxuXHRcdFx0YnAgPSBbIGIgXTtcblxuXHRcdC8vIFBhcmVudGxlc3Mgbm9kZXMgYXJlIGVpdGhlciBkb2N1bWVudHMgb3IgZGlzY29ubmVjdGVkXG5cdFx0aWYgKCAhYXVwIHx8ICFidXAgKSB7XG5cdFx0XHRyZXR1cm4gYSA9PT0gZG9jdW1lbnQgPyAtMSA6XG5cdFx0XHRcdGIgPT09IGRvY3VtZW50ID8gMSA6XG5cdFx0XHRcdGF1cCA/IC0xIDpcblx0XHRcdFx0YnVwID8gMSA6XG5cdFx0XHRcdHNvcnRJbnB1dCA/XG5cdFx0XHRcdCggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDpcblx0XHRcdFx0MDtcblxuXHRcdC8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrXG5cdFx0fSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7XG5cdFx0XHRyZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlIHdlIG5lZWQgZnVsbCBsaXN0cyBvZiB0aGVpciBhbmNlc3RvcnMgZm9yIGNvbXBhcmlzb25cblx0XHRjdXIgPSBhO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGFwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblx0XHRjdXIgPSBiO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGJwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblxuXHRcdC8vIFdhbGsgZG93biB0aGUgdHJlZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5XG5cdFx0d2hpbGUgKCBhcFtpXSA9PT0gYnBbaV0gKSB7XG5cdFx0XHRpKys7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGkgP1xuXHRcdFx0Ly8gRG8gYSBzaWJsaW5nIGNoZWNrIGlmIHRoZSBub2RlcyBoYXZlIGEgY29tbW9uIGFuY2VzdG9yXG5cdFx0XHRzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIG5vZGVzIGluIG91ciBkb2N1bWVudCBzb3J0IGZpcnN0XG5cdFx0XHRhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOlxuXHRcdFx0YnBbaV0gPT09IHByZWZlcnJlZERvYyA/IDEgOlxuXHRcdFx0MDtcblx0fTtcblxuXHRyZXR1cm4gZG9jdW1lbnQ7XG59O1xuXG5TaXp6bGUubWF0Y2hlcyA9IGZ1bmN0aW9uKCBleHByLCBlbGVtZW50cyApIHtcblx0cmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTtcbn07XG5cblNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHtcblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdGlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHtcblx0XHRzZXREb2N1bWVudCggZWxlbSApO1xuXHR9XG5cblx0aWYgKCBzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciAmJiBkb2N1bWVudElzSFRNTCAmJlxuXHRcdCFub25uYXRpdmVTZWxlY3RvckNhY2hlWyBleHByICsgXCIgXCIgXSAmJlxuXHRcdCggIXJidWdneU1hdGNoZXMgfHwgIXJidWdneU1hdGNoZXMudGVzdCggZXhwciApICkgJiZcblx0XHQoICFyYnVnZ3lRU0EgICAgIHx8ICFyYnVnZ3lRU0EudGVzdCggZXhwciApICkgKSB7XG5cblx0XHR0cnkge1xuXHRcdFx0dmFyIHJldCA9IG1hdGNoZXMuY2FsbCggZWxlbSwgZXhwciApO1xuXG5cdFx0XHQvLyBJRSA5J3MgbWF0Y2hlc1NlbGVjdG9yIHJldHVybnMgZmFsc2Ugb24gZGlzY29ubmVjdGVkIG5vZGVzXG5cdFx0XHRpZiAoIHJldCB8fCBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoIHx8XG5cdFx0XHRcdFx0Ly8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGluIGEgZG9jdW1lbnRcblx0XHRcdFx0XHQvLyBmcmFnbWVudCBpbiBJRSA5XG5cdFx0XHRcdFx0ZWxlbS5kb2N1bWVudCAmJiBlbGVtLmRvY3VtZW50Lm5vZGVUeXBlICE9PSAxMSApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRub25uYXRpdmVTZWxlY3RvckNhY2hlKCBleHByLCB0cnVlICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIFNpenpsZSggZXhwciwgZG9jdW1lbnQsIG51bGwsIFsgZWxlbSBdICkubGVuZ3RoID4gMDtcbn07XG5cblNpenpsZS5jb250YWlucyA9IGZ1bmN0aW9uKCBjb250ZXh0LCBlbGVtICkge1xuXHQvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWRcblx0aWYgKCAoIGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0ICkgIT09IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdH1cblx0cmV0dXJuIGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICk7XG59O1xuXG5TaXp6bGUuYXR0ciA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHQvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWRcblx0aWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBlbGVtICk7XG5cdH1cblxuXHR2YXIgZm4gPSBFeHByLmF0dHJIYW5kbGVbIG5hbWUudG9Mb3dlckNhc2UoKSBdLFxuXHRcdC8vIERvbid0IGdldCBmb29sZWQgYnkgT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzIChqUXVlcnkgIzEzODA3KVxuXHRcdHZhbCA9IGZuICYmIGhhc093bi5jYWxsKCBFeHByLmF0dHJIYW5kbGUsIG5hbWUudG9Mb3dlckNhc2UoKSApID9cblx0XHRcdGZuKCBlbGVtLCBuYW1lLCAhZG9jdW1lbnRJc0hUTUwgKSA6XG5cdFx0XHR1bmRlZmluZWQ7XG5cblx0cmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkID9cblx0XHR2YWwgOlxuXHRcdHN1cHBvcnQuYXR0cmlidXRlcyB8fCAhZG9jdW1lbnRJc0hUTUwgP1xuXHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKSA6XG5cdFx0XHQodmFsID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpKSAmJiB2YWwuc3BlY2lmaWVkID9cblx0XHRcdFx0dmFsLnZhbHVlIDpcblx0XHRcdFx0bnVsbDtcbn07XG5cblNpenpsZS5lc2NhcGUgPSBmdW5jdGlvbiggc2VsICkge1xuXHRyZXR1cm4gKHNlbCArIFwiXCIpLnJlcGxhY2UoIHJjc3Nlc2NhcGUsIGZjc3Nlc2NhcGUgKTtcbn07XG5cblNpenpsZS5lcnJvciA9IGZ1bmN0aW9uKCBtc2cgKSB7XG5cdHRocm93IG5ldyBFcnJvciggXCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiBcIiArIG1zZyApO1xufTtcblxuLyoqXG4gKiBEb2N1bWVudCBzb3J0aW5nIGFuZCByZW1vdmluZyBkdXBsaWNhdGVzXG4gKiBAcGFyYW0ge0FycmF5TGlrZX0gcmVzdWx0c1xuICovXG5TaXp6bGUudW5pcXVlU29ydCA9IGZ1bmN0aW9uKCByZXN1bHRzICkge1xuXHR2YXIgZWxlbSxcblx0XHRkdXBsaWNhdGVzID0gW10sXG5cdFx0aiA9IDAsXG5cdFx0aSA9IDA7XG5cblx0Ly8gVW5sZXNzIHdlICprbm93KiB3ZSBjYW4gZGV0ZWN0IGR1cGxpY2F0ZXMsIGFzc3VtZSB0aGVpciBwcmVzZW5jZVxuXHRoYXNEdXBsaWNhdGUgPSAhc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzO1xuXHRzb3J0SW5wdXQgPSAhc3VwcG9ydC5zb3J0U3RhYmxlICYmIHJlc3VsdHMuc2xpY2UoIDAgKTtcblx0cmVzdWx0cy5zb3J0KCBzb3J0T3JkZXIgKTtcblxuXHRpZiAoIGhhc0R1cGxpY2F0ZSApIHtcblx0XHR3aGlsZSAoIChlbGVtID0gcmVzdWx0c1tpKytdKSApIHtcblx0XHRcdGlmICggZWxlbSA9PT0gcmVzdWx0c1sgaSBdICkge1xuXHRcdFx0XHRqID0gZHVwbGljYXRlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHdoaWxlICggai0tICkge1xuXHRcdFx0cmVzdWx0cy5zcGxpY2UoIGR1cGxpY2F0ZXNbIGogXSwgMSApO1xuXHRcdH1cblx0fVxuXG5cdC8vIENsZWFyIGlucHV0IGFmdGVyIHNvcnRpbmcgdG8gcmVsZWFzZSBvYmplY3RzXG5cdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L3NpenpsZS9wdWxsLzIyNVxuXHRzb3J0SW5wdXQgPSBudWxsO1xuXG5cdHJldHVybiByZXN1bHRzO1xufTtcblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciByZXRyaWV2aW5nIHRoZSB0ZXh0IHZhbHVlIG9mIGFuIGFycmF5IG9mIERPTSBub2Rlc1xuICogQHBhcmFtIHtBcnJheXxFbGVtZW50fSBlbGVtXG4gKi9cbmdldFRleHQgPSBTaXp6bGUuZ2V0VGV4dCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHR2YXIgbm9kZSxcblx0XHRyZXQgPSBcIlwiLFxuXHRcdGkgPSAwLFxuXHRcdG5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRpZiAoICFub2RlVHlwZSApIHtcblx0XHQvLyBJZiBubyBub2RlVHlwZSwgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheVxuXHRcdHdoaWxlICggKG5vZGUgPSBlbGVtW2krK10pICkge1xuXHRcdFx0Ly8gRG8gbm90IHRyYXZlcnNlIGNvbW1lbnQgbm9kZXNcblx0XHRcdHJldCArPSBnZXRUZXh0KCBub2RlICk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMSB8fCBub2RlVHlwZSA9PT0gOSB8fCBub2RlVHlwZSA9PT0gMTEgKSB7XG5cdFx0Ly8gVXNlIHRleHRDb250ZW50IGZvciBlbGVtZW50c1xuXHRcdC8vIGlubmVyVGV4dCB1c2FnZSByZW1vdmVkIGZvciBjb25zaXN0ZW5jeSBvZiBuZXcgbGluZXMgKGpRdWVyeSAjMTExNTMpXG5cdFx0aWYgKCB0eXBlb2YgZWxlbS50ZXh0Q29udGVudCA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiBlbGVtLnRleHRDb250ZW50O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBUcmF2ZXJzZSBpdHMgY2hpbGRyZW5cblx0XHRcdGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkge1xuXHRcdFx0XHRyZXQgKz0gZ2V0VGV4dCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmICggbm9kZVR5cGUgPT09IDMgfHwgbm9kZVR5cGUgPT09IDQgKSB7XG5cdFx0cmV0dXJuIGVsZW0ubm9kZVZhbHVlO1xuXHR9XG5cdC8vIERvIG5vdCBpbmNsdWRlIGNvbW1lbnQgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub2Rlc1xuXG5cdHJldHVybiByZXQ7XG59O1xuXG5FeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHtcblxuXHQvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXJcblx0Y2FjaGVMZW5ndGg6IDUwLFxuXG5cdGNyZWF0ZVBzZXVkbzogbWFya0Z1bmN0aW9uLFxuXG5cdG1hdGNoOiBtYXRjaEV4cHIsXG5cblx0YXR0ckhhbmRsZToge30sXG5cblx0ZmluZDoge30sXG5cblx0cmVsYXRpdmU6IHtcblx0XHRcIj5cIjogeyBkaXI6IFwicGFyZW50Tm9kZVwiLCBmaXJzdDogdHJ1ZSB9LFxuXHRcdFwiIFwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIgfSxcblx0XHRcIitcIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCJ+XCI6IHsgZGlyOiBcInByZXZpb3VzU2libGluZ1wiIH1cblx0fSxcblxuXHRwcmVGaWx0ZXI6IHtcblx0XHRcIkFUVFJcIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0bWF0Y2hbMV0gPSBtYXRjaFsxXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXG5cdFx0XHQvLyBNb3ZlIHRoZSBnaXZlbiB2YWx1ZSB0byBtYXRjaFszXSB3aGV0aGVyIHF1b3RlZCBvciB1bnF1b3RlZFxuXHRcdFx0bWF0Y2hbM10gPSAoIG1hdGNoWzNdIHx8IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8IFwiXCIgKS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXG5cdFx0XHRpZiAoIG1hdGNoWzJdID09PSBcIn49XCIgKSB7XG5cdFx0XHRcdG1hdGNoWzNdID0gXCIgXCIgKyBtYXRjaFszXSArIFwiIFwiO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDQgKTtcblx0XHR9LFxuXG5cdFx0XCJDSElMRFwiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHQvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByW1wiQ0hJTERcIl1cblx0XHRcdFx0MSB0eXBlIChvbmx5fG50aHwuLi4pXG5cdFx0XHRcdDIgd2hhdCAoY2hpbGR8b2YtdHlwZSlcblx0XHRcdFx0MyBhcmd1bWVudCAoZXZlbnxvZGR8XFxkKnxcXGQqbihbKy1dXFxkKyk/fC4uLilcblx0XHRcdFx0NCB4bi1jb21wb25lbnQgb2YgeG4reSBhcmd1bWVudCAoWystXT9cXGQqbnwpXG5cdFx0XHRcdDUgc2lnbiBvZiB4bi1jb21wb25lbnRcblx0XHRcdFx0NiB4IG9mIHhuLWNvbXBvbmVudFxuXHRcdFx0XHQ3IHNpZ24gb2YgeS1jb21wb25lbnRcblx0XHRcdFx0OCB5IG9mIHktY29tcG9uZW50XG5cdFx0XHQqL1xuXHRcdFx0bWF0Y2hbMV0gPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0XHRpZiAoIG1hdGNoWzFdLnNsaWNlKCAwLCAzICkgPT09IFwibnRoXCIgKSB7XG5cdFx0XHRcdC8vIG50aC0qIHJlcXVpcmVzIGFyZ3VtZW50XG5cdFx0XHRcdGlmICggIW1hdGNoWzNdICkge1xuXHRcdFx0XHRcdFNpenpsZS5lcnJvciggbWF0Y2hbMF0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIG51bWVyaWMgeCBhbmQgeSBwYXJhbWV0ZXJzIGZvciBFeHByLmZpbHRlci5DSElMRFxuXHRcdFx0XHQvLyByZW1lbWJlciB0aGF0IGZhbHNlL3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xXG5cdFx0XHRcdG1hdGNoWzRdID0gKyggbWF0Y2hbNF0gPyBtYXRjaFs1XSArIChtYXRjaFs2XSB8fCAxKSA6IDIgKiAoIG1hdGNoWzNdID09PSBcImV2ZW5cIiB8fCBtYXRjaFszXSA9PT0gXCJvZGRcIiApICk7XG5cdFx0XHRcdG1hdGNoWzVdID0gKyggKCBtYXRjaFs3XSArIG1hdGNoWzhdICkgfHwgbWF0Y2hbM10gPT09IFwib2RkXCIgKTtcblxuXHRcdFx0Ly8gb3RoZXIgdHlwZXMgcHJvaGliaXQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRjaFszXSApIHtcblx0XHRcdFx0U2l6emxlLmVycm9yKCBtYXRjaFswXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF0Y2g7XG5cdFx0fSxcblxuXHRcdFwiUFNFVURPXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdHZhciBleGNlc3MsXG5cdFx0XHRcdHVucXVvdGVkID0gIW1hdGNoWzZdICYmIG1hdGNoWzJdO1xuXG5cdFx0XHRpZiAoIG1hdGNoRXhwcltcIkNISUxEXCJdLnRlc3QoIG1hdGNoWzBdICkgKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBY2NlcHQgcXVvdGVkIGFyZ3VtZW50cyBhcy1pc1xuXHRcdFx0aWYgKCBtYXRjaFszXSApIHtcblx0XHRcdFx0bWF0Y2hbMl0gPSBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCBcIlwiO1xuXG5cdFx0XHQvLyBTdHJpcCBleGNlc3MgY2hhcmFjdGVycyBmcm9tIHVucXVvdGVkIGFyZ3VtZW50c1xuXHRcdFx0fSBlbHNlIGlmICggdW5xdW90ZWQgJiYgcnBzZXVkby50ZXN0KCB1bnF1b3RlZCApICYmXG5cdFx0XHRcdC8vIEdldCBleGNlc3MgZnJvbSB0b2tlbml6ZSAocmVjdXJzaXZlbHkpXG5cdFx0XHRcdChleGNlc3MgPSB0b2tlbml6ZSggdW5xdW90ZWQsIHRydWUgKSkgJiZcblx0XHRcdFx0Ly8gYWR2YW5jZSB0byB0aGUgbmV4dCBjbG9zaW5nIHBhcmVudGhlc2lzXG5cdFx0XHRcdChleGNlc3MgPSB1bnF1b3RlZC5pbmRleE9mKCBcIilcIiwgdW5xdW90ZWQubGVuZ3RoIC0gZXhjZXNzICkgLSB1bnF1b3RlZC5sZW5ndGgpICkge1xuXG5cdFx0XHRcdC8vIGV4Y2VzcyBpcyBhIG5lZ2F0aXZlIGluZGV4XG5cdFx0XHRcdG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAsIGV4Y2VzcyApO1xuXHRcdFx0XHRtYXRjaFsyXSA9IHVucXVvdGVkLnNsaWNlKCAwLCBleGNlc3MgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV0dXJuIG9ubHkgY2FwdHVyZXMgbmVlZGVkIGJ5IHRoZSBwc2V1ZG8gZmlsdGVyIG1ldGhvZCAodHlwZSBhbmQgYXJndW1lbnQpXG5cdFx0XHRyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDMgKTtcblx0XHR9XG5cdH0sXG5cblx0ZmlsdGVyOiB7XG5cblx0XHRcIlRBR1wiOiBmdW5jdGlvbiggbm9kZU5hbWVTZWxlY3RvciApIHtcblx0XHRcdHZhciBub2RlTmFtZSA9IG5vZGVOYW1lU2VsZWN0b3IucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIG5vZGVOYW1lU2VsZWN0b3IgPT09IFwiKlwiID9cblx0XHRcdFx0ZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9IDpcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub2RlTmFtZTtcblx0XHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0XCJDTEFTU1wiOiBmdW5jdGlvbiggY2xhc3NOYW1lICkge1xuXHRcdFx0dmFyIHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyBcIiBcIiBdO1xuXG5cdFx0XHRyZXR1cm4gcGF0dGVybiB8fFxuXHRcdFx0XHQocGF0dGVybiA9IG5ldyBSZWdFeHAoIFwiKF58XCIgKyB3aGl0ZXNwYWNlICsgXCIpXCIgKyBjbGFzc05hbWUgKyBcIihcIiArIHdoaXRlc3BhY2UgKyBcInwkKVwiICkpICYmXG5cdFx0XHRcdGNsYXNzQ2FjaGUoIGNsYXNzTmFtZSwgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHBhdHRlcm4udGVzdCggdHlwZW9mIGVsZW0uY2xhc3NOYW1lID09PSBcInN0cmluZ1wiICYmIGVsZW0uY2xhc3NOYW1lIHx8IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpIHx8IFwiXCIgKTtcblx0XHRcdFx0fSk7XG5cdFx0fSxcblxuXHRcdFwiQVRUUlwiOiBmdW5jdGlvbiggbmFtZSwgb3BlcmF0b3IsIGNoZWNrICkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgcmVzdWx0ID0gU2l6emxlLmF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdFx0XHRpZiAoIHJlc3VsdCA9PSBudWxsICkge1xuXHRcdFx0XHRcdHJldHVybiBvcGVyYXRvciA9PT0gXCIhPVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggIW9wZXJhdG9yICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmVzdWx0ICs9IFwiXCI7XG5cblx0XHRcdFx0cmV0dXJuIG9wZXJhdG9yID09PSBcIj1cIiA/IHJlc3VsdCA9PT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIiE9XCIgPyByZXN1bHQgIT09IGNoZWNrIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCJePVwiID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPT09IDAgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIio9XCIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCIkPVwiID8gY2hlY2sgJiYgcmVzdWx0LnNsaWNlKCAtY2hlY2subGVuZ3RoICkgPT09IGNoZWNrIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCJ+PVwiID8gKCBcIiBcIiArIHJlc3VsdC5yZXBsYWNlKCByd2hpdGVzcGFjZSwgXCIgXCIgKSArIFwiIFwiICkuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCJ8PVwiID8gcmVzdWx0ID09PSBjaGVjayB8fCByZXN1bHQuc2xpY2UoIDAsIGNoZWNrLmxlbmd0aCArIDEgKSA9PT0gY2hlY2sgKyBcIi1cIiA6XG5cdFx0XHRcdFx0ZmFsc2U7XG5cdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIkNISUxEXCI6IGZ1bmN0aW9uKCB0eXBlLCB3aGF0LCBhcmd1bWVudCwgZmlyc3QsIGxhc3QgKSB7XG5cdFx0XHR2YXIgc2ltcGxlID0gdHlwZS5zbGljZSggMCwgMyApICE9PSBcIm50aFwiLFxuXHRcdFx0XHRmb3J3YXJkID0gdHlwZS5zbGljZSggLTQgKSAhPT0gXCJsYXN0XCIsXG5cdFx0XHRcdG9mVHlwZSA9IHdoYXQgPT09IFwib2YtdHlwZVwiO1xuXG5cdFx0XHRyZXR1cm4gZmlyc3QgPT09IDEgJiYgbGFzdCA9PT0gMCA/XG5cblx0XHRcdFx0Ly8gU2hvcnRjdXQgZm9yIDpudGgtKihuKVxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gISFlbGVtLnBhcmVudE5vZGU7XG5cdFx0XHRcdH0gOlxuXG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0dmFyIGNhY2hlLCB1bmlxdWVDYWNoZSwgb3V0ZXJDYWNoZSwgbm9kZSwgbm9kZUluZGV4LCBzdGFydCxcblx0XHRcdFx0XHRcdGRpciA9IHNpbXBsZSAhPT0gZm9yd2FyZCA/IFwibmV4dFNpYmxpbmdcIiA6IFwicHJldmlvdXNTaWJsaW5nXCIsXG5cdFx0XHRcdFx0XHRwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGUsXG5cdFx0XHRcdFx0XHRuYW1lID0gb2ZUeXBlICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxcblx0XHRcdFx0XHRcdHVzZUNhY2hlID0gIXhtbCAmJiAhb2ZUeXBlLFxuXHRcdFx0XHRcdFx0ZGlmZiA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0aWYgKCBwYXJlbnQgKSB7XG5cblx0XHRcdFx0XHRcdC8vIDooZmlyc3R8bGFzdHxvbmx5KS0oY2hpbGR8b2YtdHlwZSlcblx0XHRcdFx0XHRcdGlmICggc2ltcGxlICkge1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAoIGRpciApIHtcblx0XHRcdFx0XHRcdFx0XHRub2RlID0gZWxlbTtcblx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoIChub2RlID0gbm9kZVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBvZlR5cGUgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVUeXBlID09PSAxICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0Ly8gUmV2ZXJzZSBkaXJlY3Rpb24gZm9yIDpvbmx5LSogKGlmIHdlIGhhdmVuJ3QgeWV0IGRvbmUgc28pXG5cdFx0XHRcdFx0XHRcdFx0c3RhcnQgPSBkaXIgPSB0eXBlID09PSBcIm9ubHlcIiAmJiAhc3RhcnQgJiYgXCJuZXh0U2libGluZ1wiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRzdGFydCA9IFsgZm9yd2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdO1xuXG5cdFx0XHRcdFx0XHQvLyBub24teG1sIDpudGgtY2hpbGQoLi4uKSBzdG9yZXMgY2FjaGUgZGF0YSBvbiBgcGFyZW50YFxuXHRcdFx0XHRcdFx0aWYgKCBmb3J3YXJkICYmIHVzZUNhY2hlICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFNlZWsgYGVsZW1gIGZyb20gYSBwcmV2aW91c2x5LWNhY2hlZCBpbmRleFxuXG5cdFx0XHRcdFx0XHRcdC8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXlcblx0XHRcdFx0XHRcdFx0bm9kZSA9IHBhcmVudDtcblx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IG5vZGVbIGV4cGFuZG8gXSB8fCAobm9kZVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw5IG9ubHlcblx0XHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0KG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSA9IHt9KTtcblxuXHRcdFx0XHRcdFx0XHRjYWNoZSA9IHVuaXF1ZUNhY2hlWyB0eXBlIF0gfHwgW107XG5cdFx0XHRcdFx0XHRcdG5vZGVJbmRleCA9IGNhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbIDEgXTtcblx0XHRcdFx0XHRcdFx0ZGlmZiA9IG5vZGVJbmRleCAmJiBjYWNoZVsgMiBdO1xuXHRcdFx0XHRcdFx0XHRub2RlID0gbm9kZUluZGV4ICYmIHBhcmVudC5jaGlsZE5vZGVzWyBub2RlSW5kZXggXTtcblxuXHRcdFx0XHRcdFx0XHR3aGlsZSAoIChub2RlID0gKytub2RlSW5kZXggJiYgbm9kZSAmJiBub2RlWyBkaXIgXSB8fFxuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gRmFsbGJhY2sgdG8gc2Vla2luZyBgZWxlbWAgZnJvbSB0aGUgc3RhcnRcblx0XHRcdFx0XHRcdFx0XHQoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgpKSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFdoZW4gZm91bmQsIGNhY2hlIGluZGV4ZXMgb24gYHBhcmVudGAgYW5kIGJyZWFrXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBub2RlLm5vZGVUeXBlID09PSAxICYmICsrZGlmZiAmJiBub2RlID09PSBlbGVtICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGVbIHR5cGUgXSA9IFsgZGlycnVucywgbm9kZUluZGV4LCBkaWZmIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gVXNlIHByZXZpb3VzbHktY2FjaGVkIGVsZW1lbnQgaW5kZXggaWYgYXZhaWxhYmxlXG5cdFx0XHRcdFx0XHRcdGlmICggdXNlQ2FjaGUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gLi4uaW4gYSBnemlwLWZyaWVuZGx5IHdheVxuXHRcdFx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtO1xuXHRcdFx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBub2RlWyBleHBhbmRvIF0gfHwgKG5vZGVbIGV4cGFuZG8gXSA9IHt9KTtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw5IG9ubHlcblx0XHRcdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSA9IHt9KTtcblxuXHRcdFx0XHRcdFx0XHRcdGNhY2hlID0gdW5pcXVlQ2FjaGVbIHR5cGUgXSB8fCBbXTtcblx0XHRcdFx0XHRcdFx0XHRub2RlSW5kZXggPSBjYWNoZVsgMCBdID09PSBkaXJydW5zICYmIGNhY2hlWyAxIF07XG5cdFx0XHRcdFx0XHRcdFx0ZGlmZiA9IG5vZGVJbmRleDtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdC8vIHhtbCA6bnRoLWNoaWxkKC4uLilcblx0XHRcdFx0XHRcdFx0Ly8gb3IgOm50aC1sYXN0LWNoaWxkKC4uLikgb3IgOm50aCgtbGFzdCk/LW9mLXR5cGUoLi4uKVxuXHRcdFx0XHRcdFx0XHRpZiAoIGRpZmYgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFVzZSB0aGUgc2FtZSBsb29wIGFzIGFib3ZlIHRvIHNlZWsgYGVsZW1gIGZyb20gdGhlIHN0YXJ0XG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRcdChkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoICggb2ZUeXBlID9cblx0XHRcdFx0XHRcdFx0XHRcdFx0bm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lIDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0bm9kZS5ub2RlVHlwZSA9PT0gMSApICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCsrZGlmZiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBDYWNoZSB0aGUgaW5kZXggb2YgZWFjaCBlbmNvdW50ZXJlZCBlbGVtZW50XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggdXNlQ2FjaGUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IG5vZGVbIGV4cGFuZG8gXSB8fCAobm9kZVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIERlZmVuZCBhZ2FpbnN0IGNsb25lZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGVbIHR5cGUgXSA9IFsgZGlycnVucywgZGlmZiBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBub2RlID09PSBlbGVtICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIEluY29ycG9yYXRlIHRoZSBvZmZzZXQsIHRoZW4gY2hlY2sgYWdhaW5zdCBjeWNsZSBzaXplXG5cdFx0XHRcdFx0XHRkaWZmIC09IGxhc3Q7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZGlmZiA9PT0gZmlyc3QgfHwgKCBkaWZmICUgZmlyc3QgPT09IDAgJiYgZGlmZiAvIGZpcnN0ID49IDAgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiUFNFVURPXCI6IGZ1bmN0aW9uKCBwc2V1ZG8sIGFyZ3VtZW50ICkge1xuXHRcdFx0Ly8gcHNldWRvLWNsYXNzIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI3BzZXVkby1jbGFzc2VzXG5cdFx0XHQvLyBQcmlvcml0aXplIGJ5IGNhc2Ugc2Vuc2l0aXZpdHkgaW4gY2FzZSBjdXN0b20gcHNldWRvcyBhcmUgYWRkZWQgd2l0aCB1cHBlcmNhc2UgbGV0dGVyc1xuXHRcdFx0Ly8gUmVtZW1iZXIgdGhhdCBzZXRGaWx0ZXJzIGluaGVyaXRzIGZyb20gcHNldWRvc1xuXHRcdFx0dmFyIGFyZ3MsXG5cdFx0XHRcdGZuID0gRXhwci5wc2V1ZG9zWyBwc2V1ZG8gXSB8fCBFeHByLnNldEZpbHRlcnNbIHBzZXVkby50b0xvd2VyQ2FzZSgpIF0gfHxcblx0XHRcdFx0XHRTaXp6bGUuZXJyb3IoIFwidW5zdXBwb3J0ZWQgcHNldWRvOiBcIiArIHBzZXVkbyApO1xuXG5cdFx0XHQvLyBUaGUgdXNlciBtYXkgdXNlIGNyZWF0ZVBzZXVkbyB0byBpbmRpY2F0ZSB0aGF0XG5cdFx0XHQvLyBhcmd1bWVudHMgYXJlIG5lZWRlZCB0byBjcmVhdGUgdGhlIGZpbHRlciBmdW5jdGlvblxuXHRcdFx0Ly8ganVzdCBhcyBTaXp6bGUgZG9lc1xuXHRcdFx0aWYgKCBmblsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRyZXR1cm4gZm4oIGFyZ3VtZW50ICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEJ1dCBtYWludGFpbiBzdXBwb3J0IGZvciBvbGQgc2lnbmF0dXJlc1xuXHRcdFx0aWYgKCBmbi5sZW5ndGggPiAxICkge1xuXHRcdFx0XHRhcmdzID0gWyBwc2V1ZG8sIHBzZXVkbywgXCJcIiwgYXJndW1lbnQgXTtcblx0XHRcdFx0cmV0dXJuIEV4cHIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eSggcHNldWRvLnRvTG93ZXJDYXNlKCkgKSA/XG5cdFx0XHRcdFx0bWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzICkge1xuXHRcdFx0XHRcdFx0dmFyIGlkeCxcblx0XHRcdFx0XHRcdFx0bWF0Y2hlZCA9IGZuKCBzZWVkLCBhcmd1bWVudCApLFxuXHRcdFx0XHRcdFx0XHRpID0gbWF0Y2hlZC5sZW5ndGg7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWR4ID0gaW5kZXhPZiggc2VlZCwgbWF0Y2hlZFtpXSApO1xuXHRcdFx0XHRcdFx0XHRzZWVkWyBpZHggXSA9ICEoIG1hdGNoZXNbIGlkeCBdID0gbWF0Y2hlZFtpXSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pIDpcblx0XHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRcdHJldHVybiBmbiggZWxlbSwgMCwgYXJncyApO1xuXHRcdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmbjtcblx0XHR9XG5cdH0sXG5cblx0cHNldWRvczoge1xuXHRcdC8vIFBvdGVudGlhbGx5IGNvbXBsZXggcHNldWRvc1xuXHRcdFwibm90XCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0XHQvLyBUcmltIHRoZSBzZWxlY3RvciBwYXNzZWQgdG8gY29tcGlsZVxuXHRcdFx0Ly8gdG8gYXZvaWQgdHJlYXRpbmcgbGVhZGluZyBhbmQgdHJhaWxpbmdcblx0XHRcdC8vIHNwYWNlcyBhcyBjb21iaW5hdG9yc1xuXHRcdFx0dmFyIGlucHV0ID0gW10sXG5cdFx0XHRcdHJlc3VsdHMgPSBbXSxcblx0XHRcdFx0bWF0Y2hlciA9IGNvbXBpbGUoIHNlbGVjdG9yLnJlcGxhY2UoIHJ0cmltLCBcIiQxXCIgKSApO1xuXG5cdFx0XHRyZXR1cm4gbWF0Y2hlclsgZXhwYW5kbyBdID9cblx0XHRcdFx0bWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0dmFyIGVsZW0sXG5cdFx0XHRcdFx0XHR1bm1hdGNoZWQgPSBtYXRjaGVyKCBzZWVkLCBudWxsLCB4bWwsIFtdICksXG5cdFx0XHRcdFx0XHRpID0gc2VlZC5sZW5ndGg7XG5cblx0XHRcdFx0XHQvLyBNYXRjaCBlbGVtZW50cyB1bm1hdGNoZWQgYnkgYG1hdGNoZXJgXG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHtcblx0XHRcdFx0XHRcdFx0c2VlZFtpXSA9ICEobWF0Y2hlc1tpXSA9IGVsZW0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSkgOlxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0XHRcdGlucHV0WzBdID0gZWxlbTtcblx0XHRcdFx0XHRtYXRjaGVyKCBpbnB1dCwgbnVsbCwgeG1sLCByZXN1bHRzICk7XG5cdFx0XHRcdFx0Ly8gRG9uJ3Qga2VlcCB0aGUgZWxlbWVudCAoaXNzdWUgIzI5OSlcblx0XHRcdFx0XHRpbnB1dFswXSA9IG51bGw7XG5cdFx0XHRcdFx0cmV0dXJuICFyZXN1bHRzLnBvcCgpO1xuXHRcdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0XCJoYXNcIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIFNpenpsZSggc2VsZWN0b3IsIGVsZW0gKS5sZW5ndGggPiAwO1xuXHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdFwiY29udGFpbnNcIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdFx0dGV4dCA9IHRleHQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuICggZWxlbS50ZXh0Q29udGVudCB8fCBnZXRUZXh0KCBlbGVtICkgKS5pbmRleE9mKCB0ZXh0ICkgPiAtMTtcblx0XHRcdH07XG5cdFx0fSksXG5cblx0XHQvLyBcIldoZXRoZXIgYW4gZWxlbWVudCBpcyByZXByZXNlbnRlZCBieSBhIDpsYW5nKCkgc2VsZWN0b3Jcblx0XHQvLyBpcyBiYXNlZCBzb2xlbHkgb24gdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZVxuXHRcdC8vIGJlaW5nIGVxdWFsIHRvIHRoZSBpZGVudGlmaWVyIEMsXG5cdFx0Ly8gb3IgYmVnaW5uaW5nIHdpdGggdGhlIGlkZW50aWZpZXIgQyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBcIi1cIi5cblx0XHQvLyBUaGUgbWF0Y2hpbmcgb2YgQyBhZ2FpbnN0IHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWUgaXMgcGVyZm9ybWVkIGNhc2UtaW5zZW5zaXRpdmVseS5cblx0XHQvLyBUaGUgaWRlbnRpZmllciBDIGRvZXMgbm90IGhhdmUgdG8gYmUgYSB2YWxpZCBsYW5ndWFnZSBuYW1lLlwiXG5cdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNsYW5nLXBzZXVkb1xuXHRcdFwibGFuZ1wiOiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBsYW5nICkge1xuXHRcdFx0Ly8gbGFuZyB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgaWRlbnRpZmllclxuXHRcdFx0aWYgKCAhcmlkZW50aWZpZXIudGVzdChsYW5nIHx8IFwiXCIpICkge1xuXHRcdFx0XHRTaXp6bGUuZXJyb3IoIFwidW5zdXBwb3J0ZWQgbGFuZzogXCIgKyBsYW5nICk7XG5cdFx0XHR9XG5cdFx0XHRsYW5nID0gbGFuZy5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciBlbGVtTGFuZztcblx0XHRcdFx0ZG8ge1xuXHRcdFx0XHRcdGlmICggKGVsZW1MYW5nID0gZG9jdW1lbnRJc0hUTUwgP1xuXHRcdFx0XHRcdFx0ZWxlbS5sYW5nIDpcblx0XHRcdFx0XHRcdGVsZW0uZ2V0QXR0cmlidXRlKFwieG1sOmxhbmdcIikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJsYW5nXCIpKSApIHtcblxuXHRcdFx0XHRcdFx0ZWxlbUxhbmcgPSBlbGVtTGFuZy50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW1MYW5nID09PSBsYW5nIHx8IGVsZW1MYW5nLmluZGV4T2YoIGxhbmcgKyBcIi1cIiApID09PSAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSB3aGlsZSAoIChlbGVtID0gZWxlbS5wYXJlbnROb2RlKSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH07XG5cdFx0fSksXG5cblx0XHQvLyBNaXNjZWxsYW5lb3VzXG5cdFx0XCJ0YXJnZXRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbiAmJiB3aW5kb3cubG9jYXRpb24uaGFzaDtcblx0XHRcdHJldHVybiBoYXNoICYmIGhhc2guc2xpY2UoIDEgKSA9PT0gZWxlbS5pZDtcblx0XHR9LFxuXG5cdFx0XCJyb290XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGRvY0VsZW07XG5cdFx0fSxcblxuXHRcdFwiZm9jdXNcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiAoIWRvY3VtZW50Lmhhc0ZvY3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkpICYmICEhKGVsZW0udHlwZSB8fCBlbGVtLmhyZWYgfHwgfmVsZW0udGFiSW5kZXgpO1xuXHRcdH0sXG5cblx0XHQvLyBCb29sZWFuIHByb3BlcnRpZXNcblx0XHRcImVuYWJsZWRcIjogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIGZhbHNlICksXG5cdFx0XCJkaXNhYmxlZFwiOiBjcmVhdGVEaXNhYmxlZFBzZXVkbyggdHJ1ZSApLFxuXG5cdFx0XCJjaGVja2VkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0Ly8gSW4gQ1NTMywgOmNoZWNrZWQgc2hvdWxkIHJldHVybiBib3RoIGNoZWNrZWQgYW5kIHNlbGVjdGVkIGVsZW1lbnRzXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0dmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIChub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmICEhZWxlbS5jaGVja2VkKSB8fCAobm9kZU5hbWUgPT09IFwib3B0aW9uXCIgJiYgISFlbGVtLnNlbGVjdGVkKTtcblx0XHR9LFxuXG5cdFx0XCJzZWxlY3RlZFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdC8vIEFjY2Vzc2luZyB0aGlzIHByb3BlcnR5IG1ha2VzIHNlbGVjdGVkLWJ5LWRlZmF1bHRcblx0XHRcdC8vIG9wdGlvbnMgaW4gU2FmYXJpIHdvcmsgcHJvcGVybHlcblx0XHRcdGlmICggZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRlbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7XG5cdFx0fSxcblxuXHRcdC8vIENvbnRlbnRzXG5cdFx0XCJlbXB0eVwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jZW1wdHktcHNldWRvXG5cdFx0XHQvLyA6ZW1wdHkgaXMgbmVnYXRlZCBieSBlbGVtZW50ICgxKSBvciBjb250ZW50IG5vZGVzICh0ZXh0OiAzOyBjZGF0YTogNDsgZW50aXR5IHJlZjogNSksXG5cdFx0XHQvLyAgIGJ1dCBub3QgYnkgb3RoZXJzIChjb21tZW50OiA4OyBwcm9jZXNzaW5nIGluc3RydWN0aW9uOiA3OyBldGMuKVxuXHRcdFx0Ly8gbm9kZVR5cGUgPCA2IHdvcmtzIGJlY2F1c2UgYXR0cmlidXRlcyAoMikgZG8gbm90IGFwcGVhciBhcyBjaGlsZHJlblxuXHRcdFx0Zm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA8IDYgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0XCJwYXJlbnRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gIUV4cHIucHNldWRvc1tcImVtcHR5XCJdKCBlbGVtICk7XG5cdFx0fSxcblxuXHRcdC8vIEVsZW1lbnQvaW5wdXQgdHlwZXNcblx0XHRcImhlYWRlclwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiByaGVhZGVyLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTtcblx0XHR9LFxuXG5cdFx0XCJpbnB1dFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiByaW5wdXRzLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTtcblx0XHR9LFxuXG5cdFx0XCJidXR0b25cIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBuYW1lID09PSBcImlucHV0XCIgJiYgZWxlbS50eXBlID09PSBcImJ1dHRvblwiIHx8IG5hbWUgPT09IFwiYnV0dG9uXCI7XG5cdFx0fSxcblxuXHRcdFwidGV4dFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBhdHRyO1xuXHRcdFx0cmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICYmXG5cdFx0XHRcdGVsZW0udHlwZSA9PT0gXCJ0ZXh0XCIgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRTw4XG5cdFx0XHRcdC8vIE5ldyBIVE1MNSBhdHRyaWJ1dGUgdmFsdWVzIChlLmcuLCBcInNlYXJjaFwiKSBhcHBlYXIgd2l0aCBlbGVtLnR5cGUgPT09IFwidGV4dFwiXG5cdFx0XHRcdCggKGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikpID09IG51bGwgfHwgYXR0ci50b0xvd2VyQ2FzZSgpID09PSBcInRleHRcIiApO1xuXHRcdH0sXG5cblx0XHQvLyBQb3NpdGlvbi1pbi1jb2xsZWN0aW9uXG5cdFx0XCJmaXJzdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIFsgMCBdO1xuXHRcdH0pLFxuXG5cdFx0XCJsYXN0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIFsgbGVuZ3RoIC0gMSBdO1xuXHRcdH0pLFxuXG5cdFx0XCJlcVwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHRyZXR1cm4gWyBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50IF07XG5cdFx0fSksXG5cblx0XHRcImV2ZW5cIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSksXG5cblx0XHRcIm9kZFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHZhciBpID0gMTtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KSxcblxuXHRcdFwibHRcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkge1xuXHRcdFx0dmFyIGkgPSBhcmd1bWVudCA8IDAgP1xuXHRcdFx0XHRhcmd1bWVudCArIGxlbmd0aCA6XG5cdFx0XHRcdGFyZ3VtZW50ID4gbGVuZ3RoID9cblx0XHRcdFx0XHRsZW5ndGggOlxuXHRcdFx0XHRcdGFyZ3VtZW50O1xuXHRcdFx0Zm9yICggOyAtLWkgPj0gMDsgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pLFxuXG5cdFx0XCJndFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHR2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7XG5cdFx0XHRmb3IgKCA7ICsraSA8IGxlbmd0aDsgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pXG5cdH1cbn07XG5cbkV4cHIucHNldWRvc1tcIm50aFwiXSA9IEV4cHIucHNldWRvc1tcImVxXCJdO1xuXG4vLyBBZGQgYnV0dG9uL2lucHV0IHR5cGUgcHNldWRvc1xuZm9yICggaSBpbiB7IHJhZGlvOiB0cnVlLCBjaGVja2JveDogdHJ1ZSwgZmlsZTogdHJ1ZSwgcGFzc3dvcmQ6IHRydWUsIGltYWdlOiB0cnVlIH0gKSB7XG5cdEV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlSW5wdXRQc2V1ZG8oIGkgKTtcbn1cbmZvciAoIGkgaW4geyBzdWJtaXQ6IHRydWUsIHJlc2V0OiB0cnVlIH0gKSB7XG5cdEV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlQnV0dG9uUHNldWRvKCBpICk7XG59XG5cbi8vIEVhc3kgQVBJIGZvciBjcmVhdGluZyBuZXcgc2V0RmlsdGVyc1xuZnVuY3Rpb24gc2V0RmlsdGVycygpIHt9XG5zZXRGaWx0ZXJzLnByb3RvdHlwZSA9IEV4cHIuZmlsdGVycyA9IEV4cHIucHNldWRvcztcbkV4cHIuc2V0RmlsdGVycyA9IG5ldyBzZXRGaWx0ZXJzKCk7XG5cbnRva2VuaXplID0gU2l6emxlLnRva2VuaXplID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBwYXJzZU9ubHkgKSB7XG5cdHZhciBtYXRjaGVkLCBtYXRjaCwgdG9rZW5zLCB0eXBlLFxuXHRcdHNvRmFyLCBncm91cHMsIHByZUZpbHRlcnMsXG5cdFx0Y2FjaGVkID0gdG9rZW5DYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdO1xuXG5cdGlmICggY2FjaGVkICkge1xuXHRcdHJldHVybiBwYXJzZU9ubHkgPyAwIDogY2FjaGVkLnNsaWNlKCAwICk7XG5cdH1cblxuXHRzb0ZhciA9IHNlbGVjdG9yO1xuXHRncm91cHMgPSBbXTtcblx0cHJlRmlsdGVycyA9IEV4cHIucHJlRmlsdGVyO1xuXG5cdHdoaWxlICggc29GYXIgKSB7XG5cblx0XHQvLyBDb21tYSBhbmQgZmlyc3QgcnVuXG5cdFx0aWYgKCAhbWF0Y2hlZCB8fCAobWF0Y2ggPSByY29tbWEuZXhlYyggc29GYXIgKSkgKSB7XG5cdFx0XHRpZiAoIG1hdGNoICkge1xuXHRcdFx0XHQvLyBEb24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBhcyB2YWxpZFxuXHRcdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaFswXS5sZW5ndGggKSB8fCBzb0Zhcjtcblx0XHRcdH1cblx0XHRcdGdyb3Vwcy5wdXNoKCAodG9rZW5zID0gW10pICk7XG5cdFx0fVxuXG5cdFx0bWF0Y2hlZCA9IGZhbHNlO1xuXG5cdFx0Ly8gQ29tYmluYXRvcnNcblx0XHRpZiAoIChtYXRjaCA9IHJjb21iaW5hdG9ycy5leGVjKCBzb0ZhciApKSApIHtcblx0XHRcdG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpO1xuXHRcdFx0dG9rZW5zLnB1c2goe1xuXHRcdFx0XHR2YWx1ZTogbWF0Y2hlZCxcblx0XHRcdFx0Ly8gQ2FzdCBkZXNjZW5kYW50IGNvbWJpbmF0b3JzIHRvIHNwYWNlXG5cdFx0XHRcdHR5cGU6IG1hdGNoWzBdLnJlcGxhY2UoIHJ0cmltLCBcIiBcIiApXG5cdFx0XHR9KTtcblx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7XG5cdFx0fVxuXG5cdFx0Ly8gRmlsdGVyc1xuXHRcdGZvciAoIHR5cGUgaW4gRXhwci5maWx0ZXIgKSB7XG5cdFx0XHRpZiAoIChtYXRjaCA9IG1hdGNoRXhwclsgdHlwZSBdLmV4ZWMoIHNvRmFyICkpICYmICghcHJlRmlsdGVyc1sgdHlwZSBdIHx8XG5cdFx0XHRcdChtYXRjaCA9IHByZUZpbHRlcnNbIHR5cGUgXSggbWF0Y2ggKSkpICkge1xuXHRcdFx0XHRtYXRjaGVkID0gbWF0Y2guc2hpZnQoKTtcblx0XHRcdFx0dG9rZW5zLnB1c2goe1xuXHRcdFx0XHRcdHZhbHVlOiBtYXRjaGVkLFxuXHRcdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdFx0bWF0Y2hlczogbWF0Y2hcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCAhbWF0Y2hlZCApIHtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnZhbGlkIGV4Y2Vzc1xuXHQvLyBpZiB3ZSdyZSBqdXN0IHBhcnNpbmdcblx0Ly8gT3RoZXJ3aXNlLCB0aHJvdyBhbiBlcnJvciBvciByZXR1cm4gdG9rZW5zXG5cdHJldHVybiBwYXJzZU9ubHkgP1xuXHRcdHNvRmFyLmxlbmd0aCA6XG5cdFx0c29GYXIgP1xuXHRcdFx0U2l6emxlLmVycm9yKCBzZWxlY3RvciApIDpcblx0XHRcdC8vIENhY2hlIHRoZSB0b2tlbnNcblx0XHRcdHRva2VuQ2FjaGUoIHNlbGVjdG9yLCBncm91cHMgKS5zbGljZSggMCApO1xufTtcblxuZnVuY3Rpb24gdG9TZWxlY3RvciggdG9rZW5zICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gdG9rZW5zLmxlbmd0aCxcblx0XHRzZWxlY3RvciA9IFwiXCI7XG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdHNlbGVjdG9yICs9IHRva2Vuc1tpXS52YWx1ZTtcblx0fVxuXHRyZXR1cm4gc2VsZWN0b3I7XG59XG5cbmZ1bmN0aW9uIGFkZENvbWJpbmF0b3IoIG1hdGNoZXIsIGNvbWJpbmF0b3IsIGJhc2UgKSB7XG5cdHZhciBkaXIgPSBjb21iaW5hdG9yLmRpcixcblx0XHRza2lwID0gY29tYmluYXRvci5uZXh0LFxuXHRcdGtleSA9IHNraXAgfHwgZGlyLFxuXHRcdGNoZWNrTm9uRWxlbWVudHMgPSBiYXNlICYmIGtleSA9PT0gXCJwYXJlbnROb2RlXCIsXG5cdFx0ZG9uZU5hbWUgPSBkb25lKys7XG5cblx0cmV0dXJuIGNvbWJpbmF0b3IuZmlyc3QgP1xuXHRcdC8vIENoZWNrIGFnYWluc3QgY2xvc2VzdCBhbmNlc3Rvci9wcmVjZWRpbmcgZWxlbWVudFxuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IDpcblxuXHRcdC8vIENoZWNrIGFnYWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50c1xuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgb2xkQ2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLFxuXHRcdFx0XHRuZXdDYWNoZSA9IFsgZGlycnVucywgZG9uZU5hbWUgXTtcblxuXHRcdFx0Ly8gV2UgY2FuJ3Qgc2V0IGFyYml0cmFyeSBkYXRhIG9uIFhNTCBub2Rlcywgc28gdGhleSBkb24ndCBiZW5lZml0IGZyb20gY29tYmluYXRvciBjYWNoaW5nXG5cdFx0XHRpZiAoIHhtbCApIHtcblx0XHRcdFx0d2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0d2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRvIF0gfHwgKGVsZW1bIGV4cGFuZG8gXSA9IHt9KTtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHR1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIGVsZW0udW5pcXVlSUQgXSB8fCAob3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRpZiAoIHNraXAgJiYgc2tpcCA9PT0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICkge1xuXHRcdFx0XHRcdFx0XHRlbGVtID0gZWxlbVsgZGlyIF0gfHwgZWxlbTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIChvbGRDYWNoZSA9IHVuaXF1ZUNhY2hlWyBrZXkgXSkgJiZcblx0XHRcdFx0XHRcdFx0b2xkQ2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBvbGRDYWNoZVsgMSBdID09PSBkb25lTmFtZSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBBc3NpZ24gdG8gbmV3Q2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50c1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKG5ld0NhY2hlWyAyIF0gPSBvbGRDYWNoZVsgMiBdKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIFJldXNlIG5ld2NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHNcblx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGVbIGtleSBdID0gbmV3Q2FjaGU7XG5cblx0XHRcdFx0XHRcdFx0Ly8gQSBtYXRjaCBtZWFucyB3ZSdyZSBkb25lOyBhIGZhaWwgbWVhbnMgd2UgaGF2ZSB0byBrZWVwIGNoZWNraW5nXG5cdFx0XHRcdFx0XHRcdGlmICggKG5ld0NhY2hlWyAyIF0gPSBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9O1xufVxuXG5mdW5jdGlvbiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSB7XG5cdHJldHVybiBtYXRjaGVycy5sZW5ndGggPiAxID9cblx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0dmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCAhbWF0Y2hlcnNbaV0oIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSA6XG5cdFx0bWF0Y2hlcnNbMF07XG59XG5cbmZ1bmN0aW9uIG11bHRpcGxlQ29udGV4dHMoIHNlbGVjdG9yLCBjb250ZXh0cywgcmVzdWx0cyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGxlbiA9IGNvbnRleHRzLmxlbmd0aDtcblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0U2l6emxlKCBzZWxlY3RvciwgY29udGV4dHNbaV0sIHJlc3VsdHMgKTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gY29uZGVuc2UoIHVubWF0Y2hlZCwgbWFwLCBmaWx0ZXIsIGNvbnRleHQsIHhtbCApIHtcblx0dmFyIGVsZW0sXG5cdFx0bmV3VW5tYXRjaGVkID0gW10sXG5cdFx0aSA9IDAsXG5cdFx0bGVuID0gdW5tYXRjaGVkLmxlbmd0aCxcblx0XHRtYXBwZWQgPSBtYXAgIT0gbnVsbDtcblxuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHtcblx0XHRcdGlmICggIWZpbHRlciB8fCBmaWx0ZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRuZXdVbm1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdFx0XHRpZiAoIG1hcHBlZCApIHtcblx0XHRcdFx0XHRtYXAucHVzaCggaSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG5ld1VubWF0Y2hlZDtcbn1cblxuZnVuY3Rpb24gc2V0TWF0Y2hlciggcHJlRmlsdGVyLCBzZWxlY3RvciwgbWF0Y2hlciwgcG9zdEZpbHRlciwgcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICkge1xuXHRpZiAoIHBvc3RGaWx0ZXIgJiYgIXBvc3RGaWx0ZXJbIGV4cGFuZG8gXSApIHtcblx0XHRwb3N0RmlsdGVyID0gc2V0TWF0Y2hlciggcG9zdEZpbHRlciApO1xuXHR9XG5cdGlmICggcG9zdEZpbmRlciAmJiAhcG9zdEZpbmRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTtcblx0fVxuXHRyZXR1cm4gbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCByZXN1bHRzLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0dmFyIHRlbXAsIGksIGVsZW0sXG5cdFx0XHRwcmVNYXAgPSBbXSxcblx0XHRcdHBvc3RNYXAgPSBbXSxcblx0XHRcdHByZWV4aXN0aW5nID0gcmVzdWx0cy5sZW5ndGgsXG5cblx0XHRcdC8vIEdldCBpbml0aWFsIGVsZW1lbnRzIGZyb20gc2VlZCBvciBjb250ZXh0XG5cdFx0XHRlbGVtcyA9IHNlZWQgfHwgbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IgfHwgXCIqXCIsIGNvbnRleHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsIFtdICksXG5cblx0XHRcdC8vIFByZWZpbHRlciB0byBnZXQgbWF0Y2hlciBpbnB1dCwgcHJlc2VydmluZyBhIG1hcCBmb3Igc2VlZC1yZXN1bHRzIHN5bmNocm9uaXphdGlvblxuXHRcdFx0bWF0Y2hlckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/XG5cdFx0XHRcdGNvbmRlbnNlKCBlbGVtcywgcHJlTWFwLCBwcmVGaWx0ZXIsIGNvbnRleHQsIHhtbCApIDpcblx0XHRcdFx0ZWxlbXMsXG5cblx0XHRcdG1hdGNoZXJPdXQgPSBtYXRjaGVyID9cblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBhIHBvc3RGaW5kZXIsIG9yIGZpbHRlcmVkIHNlZWQsIG9yIG5vbi1zZWVkIHBvc3RGaWx0ZXIgb3IgcHJlZXhpc3RpbmcgcmVzdWx0cyxcblx0XHRcdFx0cG9zdEZpbmRlciB8fCAoIHNlZWQgPyBwcmVGaWx0ZXIgOiBwcmVleGlzdGluZyB8fCBwb3N0RmlsdGVyICkgP1xuXG5cdFx0XHRcdFx0Ly8gLi4uaW50ZXJtZWRpYXRlIHByb2Nlc3NpbmcgaXMgbmVjZXNzYXJ5XG5cdFx0XHRcdFx0W10gOlxuXG5cdFx0XHRcdFx0Ly8gLi4ub3RoZXJ3aXNlIHVzZSByZXN1bHRzIGRpcmVjdGx5XG5cdFx0XHRcdFx0cmVzdWx0cyA6XG5cdFx0XHRcdG1hdGNoZXJJbjtcblxuXHRcdC8vIEZpbmQgcHJpbWFyeSBtYXRjaGVzXG5cdFx0aWYgKCBtYXRjaGVyICkge1xuXHRcdFx0bWF0Y2hlciggbWF0Y2hlckluLCBtYXRjaGVyT3V0LCBjb250ZXh0LCB4bWwgKTtcblx0XHR9XG5cblx0XHQvLyBBcHBseSBwb3N0RmlsdGVyXG5cdFx0aWYgKCBwb3N0RmlsdGVyICkge1xuXHRcdFx0dGVtcCA9IGNvbmRlbnNlKCBtYXRjaGVyT3V0LCBwb3N0TWFwICk7XG5cdFx0XHRwb3N0RmlsdGVyKCB0ZW1wLCBbXSwgY29udGV4dCwgeG1sICk7XG5cblx0XHRcdC8vIFVuLW1hdGNoIGZhaWxpbmcgZWxlbWVudHMgYnkgbW92aW5nIHRoZW0gYmFjayB0byBtYXRjaGVySW5cblx0XHRcdGkgPSB0ZW1wLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoIChlbGVtID0gdGVtcFtpXSkgKSB7XG5cdFx0XHRcdFx0bWF0Y2hlck91dFsgcG9zdE1hcFtpXSBdID0gIShtYXRjaGVySW5bIHBvc3RNYXBbaV0gXSA9IGVsZW0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0aWYgKCBwb3N0RmluZGVyIHx8IHByZUZpbHRlciApIHtcblx0XHRcdFx0aWYgKCBwb3N0RmluZGVyICkge1xuXHRcdFx0XHRcdC8vIEdldCB0aGUgZmluYWwgbWF0Y2hlck91dCBieSBjb25kZW5zaW5nIHRoaXMgaW50ZXJtZWRpYXRlIGludG8gcG9zdEZpbmRlciBjb250ZXh0c1xuXHRcdFx0XHRcdHRlbXAgPSBbXTtcblx0XHRcdFx0XHRpID0gbWF0Y2hlck91dC5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFJlc3RvcmUgbWF0Y2hlckluIHNpbmNlIGVsZW0gaXMgbm90IHlldCBhIGZpbmFsIG1hdGNoXG5cdFx0XHRcdFx0XHRcdHRlbXAucHVzaCggKG1hdGNoZXJJbltpXSA9IGVsZW0pICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHBvc3RGaW5kZXIoIG51bGwsIChtYXRjaGVyT3V0ID0gW10pLCB0ZW1wLCB4bWwgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE1vdmUgbWF0Y2hlZCBlbGVtZW50cyBmcm9tIHNlZWQgdG8gcmVzdWx0cyB0byBrZWVwIHRoZW0gc3luY2hyb25pemVkXG5cdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0aWYgKCAoZWxlbSA9IG1hdGNoZXJPdXRbaV0pICYmXG5cdFx0XHRcdFx0XHQodGVtcCA9IHBvc3RGaW5kZXIgPyBpbmRleE9mKCBzZWVkLCBlbGVtICkgOiBwcmVNYXBbaV0pID4gLTEgKSB7XG5cblx0XHRcdFx0XHRcdHNlZWRbdGVtcF0gPSAhKHJlc3VsdHNbdGVtcF0gPSBlbGVtKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdC8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJvdWdoIHBvc3RGaW5kZXIgaWYgZGVmaW5lZFxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXRjaGVyT3V0ID0gY29uZGVuc2UoXG5cdFx0XHRcdG1hdGNoZXJPdXQgPT09IHJlc3VsdHMgP1xuXHRcdFx0XHRcdG1hdGNoZXJPdXQuc3BsaWNlKCBwcmVleGlzdGluZywgbWF0Y2hlck91dC5sZW5ndGggKSA6XG5cdFx0XHRcdFx0bWF0Y2hlck91dFxuXHRcdFx0KTtcblx0XHRcdGlmICggcG9zdEZpbmRlciApIHtcblx0XHRcdFx0cG9zdEZpbmRlciggbnVsbCwgcmVzdWx0cywgbWF0Y2hlck91dCwgeG1sICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBtYXRjaGVyT3V0ICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Ub2tlbnMoIHRva2VucyApIHtcblx0dmFyIGNoZWNrQ29udGV4dCwgbWF0Y2hlciwgaixcblx0XHRsZW4gPSB0b2tlbnMubGVuZ3RoLFxuXHRcdGxlYWRpbmdSZWxhdGl2ZSA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1swXS50eXBlIF0sXG5cdFx0aW1wbGljaXRSZWxhdGl2ZSA9IGxlYWRpbmdSZWxhdGl2ZSB8fCBFeHByLnJlbGF0aXZlW1wiIFwiXSxcblx0XHRpID0gbGVhZGluZ1JlbGF0aXZlID8gMSA6IDAsXG5cblx0XHQvLyBUaGUgZm91bmRhdGlvbmFsIG1hdGNoZXIgZW5zdXJlcyB0aGF0IGVsZW1lbnRzIGFyZSByZWFjaGFibGUgZnJvbSB0b3AtbGV2ZWwgY29udGV4dChzKVxuXHRcdG1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGNoZWNrQ29udGV4dDtcblx0XHR9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksXG5cdFx0bWF0Y2hBbnlDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXhPZiggY2hlY2tDb250ZXh0LCBlbGVtICkgPiAtMTtcblx0XHR9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksXG5cdFx0bWF0Y2hlcnMgPSBbIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgcmV0ID0gKCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1sIHx8IGNvbnRleHQgIT09IG91dGVybW9zdENvbnRleHQgKSApIHx8IChcblx0XHRcdFx0KGNoZWNrQ29udGV4dCA9IGNvbnRleHQpLm5vZGVUeXBlID9cblx0XHRcdFx0XHRtYXRjaENvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApIDpcblx0XHRcdFx0XHRtYXRjaEFueUNvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApICk7XG5cdFx0XHQvLyBBdm9pZCBoYW5naW5nIG9udG8gZWxlbWVudCAoaXNzdWUgIzI5OSlcblx0XHRcdGNoZWNrQ29udGV4dCA9IG51bGw7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH0gXTtcblxuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRpZiAoIChtYXRjaGVyID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2ldLnR5cGUgXSkgKSB7XG5cdFx0XHRtYXRjaGVycyA9IFsgYWRkQ29tYmluYXRvcihlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlcikgXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWF0Y2hlciA9IEV4cHIuZmlsdGVyWyB0b2tlbnNbaV0udHlwZSBdLmFwcGx5KCBudWxsLCB0b2tlbnNbaV0ubWF0Y2hlcyApO1xuXG5cdFx0XHQvLyBSZXR1cm4gc3BlY2lhbCB1cG9uIHNlZWluZyBhIHBvc2l0aW9uYWwgbWF0Y2hlclxuXHRcdFx0aWYgKCBtYXRjaGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdC8vIEZpbmQgdGhlIG5leHQgcmVsYXRpdmUgb3BlcmF0b3IgKGlmIGFueSkgZm9yIHByb3BlciBoYW5kbGluZ1xuXHRcdFx0XHRqID0gKytpO1xuXHRcdFx0XHRmb3IgKCA7IGogPCBsZW47IGorKyApIHtcblx0XHRcdFx0XHRpZiAoIEV4cHIucmVsYXRpdmVbIHRva2Vuc1tqXS50eXBlIF0gKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHNldE1hdGNoZXIoXG5cdFx0XHRcdFx0aSA+IDEgJiYgZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksXG5cdFx0XHRcdFx0aSA+IDEgJiYgdG9TZWxlY3Rvcihcblx0XHRcdFx0XHRcdC8vIElmIHRoZSBwcmVjZWRpbmcgdG9rZW4gd2FzIGEgZGVzY2VuZGFudCBjb21iaW5hdG9yLCBpbnNlcnQgYW4gaW1wbGljaXQgYW55LWVsZW1lbnQgYCpgXG5cdFx0XHRcdFx0XHR0b2tlbnMuc2xpY2UoIDAsIGkgLSAxICkuY29uY2F0KHsgdmFsdWU6IHRva2Vuc1sgaSAtIDIgXS50eXBlID09PSBcIiBcIiA/IFwiKlwiIDogXCJcIiB9KVxuXHRcdFx0XHRcdCkucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApLFxuXHRcdFx0XHRcdG1hdGNoZXIsXG5cdFx0XHRcdFx0aSA8IGogJiYgbWF0Y2hlckZyb21Ub2tlbnMoIHRva2Vucy5zbGljZSggaSwgaiApICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiBtYXRjaGVyRnJvbVRva2VucyggKHRva2VucyA9IHRva2Vucy5zbGljZSggaiApKSApLFxuXHRcdFx0XHRcdGogPCBsZW4gJiYgdG9TZWxlY3RvciggdG9rZW5zIClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdG1hdGNoZXJzLnB1c2goIG1hdGNoZXIgKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyggZWxlbWVudE1hdGNoZXJzLCBzZXRNYXRjaGVycyApIHtcblx0dmFyIGJ5U2V0ID0gc2V0TWF0Y2hlcnMubGVuZ3RoID4gMCxcblx0XHRieUVsZW1lbnQgPSBlbGVtZW50TWF0Y2hlcnMubGVuZ3RoID4gMCxcblx0XHRzdXBlck1hdGNoZXIgPSBmdW5jdGlvbiggc2VlZCwgY29udGV4dCwgeG1sLCByZXN1bHRzLCBvdXRlcm1vc3QgKSB7XG5cdFx0XHR2YXIgZWxlbSwgaiwgbWF0Y2hlcixcblx0XHRcdFx0bWF0Y2hlZENvdW50ID0gMCxcblx0XHRcdFx0aSA9IFwiMFwiLFxuXHRcdFx0XHR1bm1hdGNoZWQgPSBzZWVkICYmIFtdLFxuXHRcdFx0XHRzZXRNYXRjaGVkID0gW10sXG5cdFx0XHRcdGNvbnRleHRCYWNrdXAgPSBvdXRlcm1vc3RDb250ZXh0LFxuXHRcdFx0XHQvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIG91dGVybW9zdCBjb250ZXh0XG5cdFx0XHRcdGVsZW1zID0gc2VlZCB8fCBieUVsZW1lbnQgJiYgRXhwci5maW5kW1wiVEFHXCJdKCBcIipcIiwgb3V0ZXJtb3N0ICksXG5cdFx0XHRcdC8vIFVzZSBpbnRlZ2VyIGRpcnJ1bnMgaWZmIHRoaXMgaXMgdGhlIG91dGVybW9zdCBtYXRjaGVyXG5cdFx0XHRcdGRpcnJ1bnNVbmlxdWUgPSAoZGlycnVucyArPSBjb250ZXh0QmFja3VwID09IG51bGwgPyAxIDogTWF0aC5yYW5kb20oKSB8fCAwLjEpLFxuXHRcdFx0XHRsZW4gPSBlbGVtcy5sZW5ndGg7XG5cblx0XHRcdGlmICggb3V0ZXJtb3N0ICkge1xuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dCA9PT0gZG9jdW1lbnQgfHwgY29udGV4dCB8fCBvdXRlcm1vc3Q7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCBlbGVtZW50cyBwYXNzaW5nIGVsZW1lbnRNYXRjaGVycyBkaXJlY3RseSB0byByZXN1bHRzXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTw5LCBTYWZhcmlcblx0XHRcdC8vIFRvbGVyYXRlIE5vZGVMaXN0IHByb3BlcnRpZXMgKElFOiBcImxlbmd0aFwiOyBTYWZhcmk6IDxudW1iZXI+KSBtYXRjaGluZyBlbGVtZW50cyBieSBpZFxuXHRcdFx0Zm9yICggOyBpICE9PSBsZW4gJiYgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIGJ5RWxlbWVudCAmJiBlbGVtICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXHRcdFx0XHRcdGlmICggIWNvbnRleHQgJiYgZWxlbS5vd25lckRvY3VtZW50ICE9PSBkb2N1bWVudCApIHtcblx0XHRcdFx0XHRcdHNldERvY3VtZW50KCBlbGVtICk7XG5cdFx0XHRcdFx0XHR4bWwgPSAhZG9jdW1lbnRJc0hUTUw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHdoaWxlICggKG1hdGNoZXIgPSBlbGVtZW50TWF0Y2hlcnNbaisrXSkgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQgfHwgZG9jdW1lbnQsIHhtbCkgKSB7XG5cdFx0XHRcdFx0XHRcdHJlc3VsdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdFx0XHRkaXJydW5zID0gZGlycnVuc1VuaXF1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBUcmFjayB1bm1hdGNoZWQgZWxlbWVudHMgZm9yIHNldCBmaWx0ZXJzXG5cdFx0XHRcdGlmICggYnlTZXQgKSB7XG5cdFx0XHRcdFx0Ly8gVGhleSB3aWxsIGhhdmUgZ29uZSB0aHJvdWdoIGFsbCBwb3NzaWJsZSBtYXRjaGVyc1xuXHRcdFx0XHRcdGlmICggKGVsZW0gPSAhbWF0Y2hlciAmJiBlbGVtKSApIHtcblx0XHRcdFx0XHRcdG1hdGNoZWRDb3VudC0tO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIExlbmd0aGVuIHRoZSBhcnJheSBmb3IgZXZlcnkgZWxlbWVudCwgbWF0Y2hlZCBvciBub3Rcblx0XHRcdFx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRcdFx0XHR1bm1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBgaWAgaXMgbm93IHRoZSBjb3VudCBvZiBlbGVtZW50cyB2aXNpdGVkIGFib3ZlLCBhbmQgYWRkaW5nIGl0IHRvIGBtYXRjaGVkQ291bnRgXG5cdFx0XHQvLyBtYWtlcyB0aGUgbGF0dGVyIG5vbm5lZ2F0aXZlLlxuXHRcdFx0bWF0Y2hlZENvdW50ICs9IGk7XG5cblx0XHRcdC8vIEFwcGx5IHNldCBmaWx0ZXJzIHRvIHVubWF0Y2hlZCBlbGVtZW50c1xuXHRcdFx0Ly8gTk9URTogVGhpcyBjYW4gYmUgc2tpcHBlZCBpZiB0aGVyZSBhcmUgbm8gdW5tYXRjaGVkIGVsZW1lbnRzIChpLmUuLCBgbWF0Y2hlZENvdW50YFxuXHRcdFx0Ly8gZXF1YWxzIGBpYCksIHVubGVzcyB3ZSBkaWRuJ3QgdmlzaXQgX2FueV8gZWxlbWVudHMgaW4gdGhlIGFib3ZlIGxvb3AgYmVjYXVzZSB3ZSBoYXZlXG5cdFx0XHQvLyBubyBlbGVtZW50IG1hdGNoZXJzIGFuZCBubyBzZWVkLlxuXHRcdFx0Ly8gSW5jcmVtZW50aW5nIGFuIGluaXRpYWxseS1zdHJpbmcgXCIwXCIgYGlgIGFsbG93cyBgaWAgdG8gcmVtYWluIGEgc3RyaW5nIG9ubHkgaW4gdGhhdFxuXHRcdFx0Ly8gY2FzZSwgd2hpY2ggd2lsbCByZXN1bHQgaW4gYSBcIjAwXCIgYG1hdGNoZWRDb3VudGAgdGhhdCBkaWZmZXJzIGZyb20gYGlgIGJ1dCBpcyBhbHNvXG5cdFx0XHQvLyBudW1lcmljYWxseSB6ZXJvLlxuXHRcdFx0aWYgKCBieVNldCAmJiBpICE9PSBtYXRjaGVkQ291bnQgKSB7XG5cdFx0XHRcdGogPSAwO1xuXHRcdFx0XHR3aGlsZSAoIChtYXRjaGVyID0gc2V0TWF0Y2hlcnNbaisrXSkgKSB7XG5cdFx0XHRcdFx0bWF0Y2hlciggdW5tYXRjaGVkLCBzZXRNYXRjaGVkLCBjb250ZXh0LCB4bWwgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggc2VlZCApIHtcblx0XHRcdFx0XHQvLyBSZWludGVncmF0ZSBlbGVtZW50IG1hdGNoZXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciBzb3J0aW5nXG5cdFx0XHRcdFx0aWYgKCBtYXRjaGVkQ291bnQgPiAwICkge1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggISh1bm1hdGNoZWRbaV0gfHwgc2V0TWF0Y2hlZFtpXSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0c2V0TWF0Y2hlZFtpXSA9IHBvcC5jYWxsKCByZXN1bHRzICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBEaXNjYXJkIGluZGV4IHBsYWNlaG9sZGVyIHZhbHVlcyB0byBnZXQgb25seSBhY3R1YWwgbWF0Y2hlc1xuXHRcdFx0XHRcdHNldE1hdGNoZWQgPSBjb25kZW5zZSggc2V0TWF0Y2hlZCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQWRkIG1hdGNoZXMgdG8gcmVzdWx0c1xuXHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBzZXRNYXRjaGVkICk7XG5cblx0XHRcdFx0Ly8gU2VlZGxlc3Mgc2V0IG1hdGNoZXMgc3VjY2VlZGluZyBtdWx0aXBsZSBzdWNjZXNzZnVsIG1hdGNoZXJzIHN0aXB1bGF0ZSBzb3J0aW5nXG5cdFx0XHRcdGlmICggb3V0ZXJtb3N0ICYmICFzZWVkICYmIHNldE1hdGNoZWQubGVuZ3RoID4gMCAmJlxuXHRcdFx0XHRcdCggbWF0Y2hlZENvdW50ICsgc2V0TWF0Y2hlcnMubGVuZ3RoICkgPiAxICkge1xuXG5cdFx0XHRcdFx0U2l6emxlLnVuaXF1ZVNvcnQoIHJlc3VsdHMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBPdmVycmlkZSBtYW5pcHVsYXRpb24gb2YgZ2xvYmFscyBieSBuZXN0ZWQgbWF0Y2hlcnNcblx0XHRcdGlmICggb3V0ZXJtb3N0ICkge1xuXHRcdFx0XHRkaXJydW5zID0gZGlycnVuc1VuaXF1ZTtcblx0XHRcdFx0b3V0ZXJtb3N0Q29udGV4dCA9IGNvbnRleHRCYWNrdXA7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB1bm1hdGNoZWQ7XG5cdFx0fTtcblxuXHRyZXR1cm4gYnlTZXQgP1xuXHRcdG1hcmtGdW5jdGlvbiggc3VwZXJNYXRjaGVyICkgOlxuXHRcdHN1cGVyTWF0Y2hlcjtcbn1cblxuY29tcGlsZSA9IFNpenpsZS5jb21waWxlID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBtYXRjaCAvKiBJbnRlcm5hbCBVc2UgT25seSAqLyApIHtcblx0dmFyIGksXG5cdFx0c2V0TWF0Y2hlcnMgPSBbXSxcblx0XHRlbGVtZW50TWF0Y2hlcnMgPSBbXSxcblx0XHRjYWNoZWQgPSBjb21waWxlckNhY2hlWyBzZWxlY3RvciArIFwiIFwiIF07XG5cblx0aWYgKCAhY2FjaGVkICkge1xuXHRcdC8vIEdlbmVyYXRlIGEgZnVuY3Rpb24gb2YgcmVjdXJzaXZlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGVhY2ggZWxlbWVudFxuXHRcdGlmICggIW1hdGNoICkge1xuXHRcdFx0bWF0Y2ggPSB0b2tlbml6ZSggc2VsZWN0b3IgKTtcblx0XHR9XG5cdFx0aSA9IG1hdGNoLmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdGNhY2hlZCA9IG1hdGNoZXJGcm9tVG9rZW5zKCBtYXRjaFtpXSApO1xuXHRcdFx0aWYgKCBjYWNoZWRbIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0c2V0TWF0Y2hlcnMucHVzaCggY2FjaGVkICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbGVtZW50TWF0Y2hlcnMucHVzaCggY2FjaGVkICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FjaGUgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uXG5cdFx0Y2FjaGVkID0gY29tcGlsZXJDYWNoZSggc2VsZWN0b3IsIG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyggZWxlbWVudE1hdGNoZXJzLCBzZXRNYXRjaGVycyApICk7XG5cblx0XHQvLyBTYXZlIHNlbGVjdG9yIGFuZCB0b2tlbml6YXRpb25cblx0XHRjYWNoZWQuc2VsZWN0b3IgPSBzZWxlY3Rvcjtcblx0fVxuXHRyZXR1cm4gY2FjaGVkO1xufTtcblxuLyoqXG4gKiBBIGxvdy1sZXZlbCBzZWxlY3Rpb24gZnVuY3Rpb24gdGhhdCB3b3JrcyB3aXRoIFNpenpsZSdzIGNvbXBpbGVkXG4gKiAgc2VsZWN0b3IgZnVuY3Rpb25zXG4gKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gc2VsZWN0b3IgQSBzZWxlY3RvciBvciBhIHByZS1jb21waWxlZFxuICogIHNlbGVjdG9yIGZ1bmN0aW9uIGJ1aWx0IHdpdGggU2l6emxlLmNvbXBpbGVcbiAqIEBwYXJhbSB7RWxlbWVudH0gY29udGV4dFxuICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdHNdXG4gKiBAcGFyYW0ge0FycmF5fSBbc2VlZF0gQSBzZXQgb2YgZWxlbWVudHMgdG8gbWF0Y2ggYWdhaW5zdFxuICovXG5zZWxlY3QgPSBTaXp6bGUuc2VsZWN0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkge1xuXHR2YXIgaSwgdG9rZW5zLCB0b2tlbiwgdHlwZSwgZmluZCxcblx0XHRjb21waWxlZCA9IHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiICYmIHNlbGVjdG9yLFxuXHRcdG1hdGNoID0gIXNlZWQgJiYgdG9rZW5pemUoIChzZWxlY3RvciA9IGNvbXBpbGVkLnNlbGVjdG9yIHx8IHNlbGVjdG9yKSApO1xuXG5cdHJlc3VsdHMgPSByZXN1bHRzIHx8IFtdO1xuXG5cdC8vIFRyeSB0byBtaW5pbWl6ZSBvcGVyYXRpb25zIGlmIHRoZXJlIGlzIG9ubHkgb25lIHNlbGVjdG9yIGluIHRoZSBsaXN0IGFuZCBubyBzZWVkXG5cdC8vICh0aGUgbGF0dGVyIG9mIHdoaWNoIGd1YXJhbnRlZXMgdXMgY29udGV4dClcblx0aWYgKCBtYXRjaC5sZW5ndGggPT09IDEgKSB7XG5cblx0XHQvLyBSZWR1Y2UgY29udGV4dCBpZiB0aGUgbGVhZGluZyBjb21wb3VuZCBzZWxlY3RvciBpcyBhbiBJRFxuXHRcdHRva2VucyA9IG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAgKTtcblx0XHRpZiAoIHRva2Vucy5sZW5ndGggPiAyICYmICh0b2tlbiA9IHRva2Vuc1swXSkudHlwZSA9PT0gXCJJRFwiICYmXG5cdFx0XHRcdGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgZG9jdW1lbnRJc0hUTUwgJiYgRXhwci5yZWxhdGl2ZVsgdG9rZW5zWzFdLnR5cGUgXSApIHtcblxuXHRcdFx0Y29udGV4dCA9ICggRXhwci5maW5kW1wiSURcIl0oIHRva2VuLm1hdGNoZXNbMF0ucmVwbGFjZShydW5lc2NhcGUsIGZ1bmVzY2FwZSksIGNvbnRleHQgKSB8fCBbXSApWzBdO1xuXHRcdFx0aWYgKCAhY29udGV4dCApIHtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cblx0XHRcdC8vIFByZWNvbXBpbGVkIG1hdGNoZXJzIHdpbGwgc3RpbGwgdmVyaWZ5IGFuY2VzdHJ5LCBzbyBzdGVwIHVwIGEgbGV2ZWxcblx0XHRcdH0gZWxzZSBpZiAoIGNvbXBpbGVkICkge1xuXHRcdFx0XHRjb250ZXh0ID0gY29udGV4dC5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXG5cdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnNsaWNlKCB0b2tlbnMuc2hpZnQoKS52YWx1ZS5sZW5ndGggKTtcblx0XHR9XG5cblx0XHQvLyBGZXRjaCBhIHNlZWQgc2V0IGZvciByaWdodC10by1sZWZ0IG1hdGNoaW5nXG5cdFx0aSA9IG1hdGNoRXhwcltcIm5lZWRzQ29udGV4dFwiXS50ZXN0KCBzZWxlY3RvciApID8gMCA6IHRva2Vucy5sZW5ndGg7XG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHR0b2tlbiA9IHRva2Vuc1tpXTtcblxuXHRcdFx0Ly8gQWJvcnQgaWYgd2UgaGl0IGEgY29tYmluYXRvclxuXHRcdFx0aWYgKCBFeHByLnJlbGF0aXZlWyAodHlwZSA9IHRva2VuLnR5cGUpIF0gKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAoZmluZCA9IEV4cHIuZmluZFsgdHlwZSBdKSApIHtcblx0XHRcdFx0Ly8gU2VhcmNoLCBleHBhbmRpbmcgY29udGV4dCBmb3IgbGVhZGluZyBzaWJsaW5nIGNvbWJpbmF0b3JzXG5cdFx0XHRcdGlmICggKHNlZWQgPSBmaW5kKFxuXHRcdFx0XHRcdHRva2VuLm1hdGNoZXNbMF0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKSxcblx0XHRcdFx0XHRyc2libGluZy50ZXN0KCB0b2tlbnNbMF0udHlwZSApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0XG5cdFx0XHRcdCkpICkge1xuXG5cdFx0XHRcdFx0Ly8gSWYgc2VlZCBpcyBlbXB0eSBvciBubyB0b2tlbnMgcmVtYWluLCB3ZSBjYW4gcmV0dXJuIGVhcmx5XG5cdFx0XHRcdFx0dG9rZW5zLnNwbGljZSggaSwgMSApO1xuXHRcdFx0XHRcdHNlbGVjdG9yID0gc2VlZC5sZW5ndGggJiYgdG9TZWxlY3RvciggdG9rZW5zICk7XG5cdFx0XHRcdFx0aWYgKCAhc2VsZWN0b3IgKSB7XG5cdFx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBzZWVkICk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIENvbXBpbGUgYW5kIGV4ZWN1dGUgYSBmaWx0ZXJpbmcgZnVuY3Rpb24gaWYgb25lIGlzIG5vdCBwcm92aWRlZFxuXHQvLyBQcm92aWRlIGBtYXRjaGAgdG8gYXZvaWQgcmV0b2tlbml6YXRpb24gaWYgd2UgbW9kaWZpZWQgdGhlIHNlbGVjdG9yIGFib3ZlXG5cdCggY29tcGlsZWQgfHwgY29tcGlsZSggc2VsZWN0b3IsIG1hdGNoICkgKShcblx0XHRzZWVkLFxuXHRcdGNvbnRleHQsXG5cdFx0IWRvY3VtZW50SXNIVE1MLFxuXHRcdHJlc3VsdHMsXG5cdFx0IWNvbnRleHQgfHwgcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dFxuXHQpO1xuXHRyZXR1cm4gcmVzdWx0cztcbn07XG5cbi8vIE9uZS10aW1lIGFzc2lnbm1lbnRzXG5cbi8vIFNvcnQgc3RhYmlsaXR5XG5zdXBwb3J0LnNvcnRTdGFibGUgPSBleHBhbmRvLnNwbGl0KFwiXCIpLnNvcnQoIHNvcnRPcmRlciApLmpvaW4oXCJcIikgPT09IGV4cGFuZG87XG5cbi8vIFN1cHBvcnQ6IENocm9tZSAxNC0zNStcbi8vIEFsd2F5cyBhc3N1bWUgZHVwbGljYXRlcyBpZiB0aGV5IGFyZW4ndCBwYXNzZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb25cbnN1cHBvcnQuZGV0ZWN0RHVwbGljYXRlcyA9ICEhaGFzRHVwbGljYXRlO1xuXG4vLyBJbml0aWFsaXplIGFnYWluc3QgdGhlIGRlZmF1bHQgZG9jdW1lbnRcbnNldERvY3VtZW50KCk7XG5cbi8vIFN1cHBvcnQ6IFdlYmtpdDw1MzcuMzIgLSBTYWZhcmkgNi4wLjMvQ2hyb21lIDI1IChmaXhlZCBpbiBDaHJvbWUgMjcpXG4vLyBEZXRhY2hlZCBub2RlcyBjb25mb3VuZGluZ2x5IGZvbGxvdyAqZWFjaCBvdGhlcipcbnN1cHBvcnQuc29ydERldGFjaGVkID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0Ly8gU2hvdWxkIHJldHVybiAxLCBidXQgcmV0dXJucyA0IChmb2xsb3dpbmcpXG5cdHJldHVybiBlbC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImZpZWxkc2V0XCIpICkgJiAxO1xufSk7XG5cbi8vIFN1cHBvcnQ6IElFPDhcbi8vIFByZXZlbnQgYXR0cmlidXRlL3Byb3BlcnR5IFwiaW50ZXJwb2xhdGlvblwiXG4vLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNTM2NDI5JTI4VlMuODUlMjkuYXNweFxuaWYgKCAhYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0ZWwuaW5uZXJIVE1MID0gXCI8YSBocmVmPScjJz48L2E+XCI7XG5cdHJldHVybiBlbC5maXJzdENoaWxkLmdldEF0dHJpYnV0ZShcImhyZWZcIikgPT09IFwiI1wiIDtcbn0pICkge1xuXHRhZGRIYW5kbGUoIFwidHlwZXxocmVmfGhlaWdodHx3aWR0aFwiLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7XG5cdFx0aWYgKCAhaXNYTUwgKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUsIG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJ0eXBlXCIgPyAxIDogMiApO1xuXHRcdH1cblx0fSk7XG59XG5cbi8vIFN1cHBvcnQ6IElFPDlcbi8vIFVzZSBkZWZhdWx0VmFsdWUgaW4gcGxhY2Ugb2YgZ2V0QXR0cmlidXRlKFwidmFsdWVcIilcbmlmICggIXN1cHBvcnQuYXR0cmlidXRlcyB8fCAhYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0ZWwuaW5uZXJIVE1MID0gXCI8aW5wdXQvPlwiO1xuXHRlbC5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSggXCJ2YWx1ZVwiLCBcIlwiICk7XG5cdHJldHVybiBlbC5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSggXCJ2YWx1ZVwiICkgPT09IFwiXCI7XG59KSApIHtcblx0YWRkSGFuZGxlKCBcInZhbHVlXCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHRpZiAoICFpc1hNTCAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIiApIHtcblx0XHRcdHJldHVybiBlbGVtLmRlZmF1bHRWYWx1ZTtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyBTdXBwb3J0OiBJRTw5XG4vLyBVc2UgZ2V0QXR0cmlidXRlTm9kZSB0byBmZXRjaCBib29sZWFucyB3aGVuIGdldEF0dHJpYnV0ZSBsaWVzXG5pZiAoICFhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRyZXR1cm4gZWwuZ2V0QXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPT0gbnVsbDtcbn0pICkge1xuXHRhZGRIYW5kbGUoIGJvb2xlYW5zLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7XG5cdFx0dmFyIHZhbDtcblx0XHRpZiAoICFpc1hNTCApIHtcblx0XHRcdHJldHVybiBlbGVtWyBuYW1lIF0gPT09IHRydWUgPyBuYW1lLnRvTG93ZXJDYXNlKCkgOlxuXHRcdFx0XHRcdCh2YWwgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKSkgJiYgdmFsLnNwZWNpZmllZCA/XG5cdFx0XHRcdFx0dmFsLnZhbHVlIDpcblx0XHRcdFx0bnVsbDtcblx0XHR9XG5cdH0pO1xufVxuXG5yZXR1cm4gU2l6emxlO1xuXG59KSggd2luZG93ICk7XG5cblxuXG5qUXVlcnkuZmluZCA9IFNpenpsZTtcbmpRdWVyeS5leHByID0gU2l6emxlLnNlbGVjdG9ycztcblxuLy8gRGVwcmVjYXRlZFxualF1ZXJ5LmV4cHJbIFwiOlwiIF0gPSBqUXVlcnkuZXhwci5wc2V1ZG9zO1xualF1ZXJ5LnVuaXF1ZVNvcnQgPSBqUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7XG5qUXVlcnkudGV4dCA9IFNpenpsZS5nZXRUZXh0O1xualF1ZXJ5LmlzWE1MRG9jID0gU2l6emxlLmlzWE1MO1xualF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zO1xualF1ZXJ5LmVzY2FwZVNlbGVjdG9yID0gU2l6emxlLmVzY2FwZTtcblxuXG5cblxudmFyIGRpciA9IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkge1xuXHR2YXIgbWF0Y2hlZCA9IFtdLFxuXHRcdHRydW5jYXRlID0gdW50aWwgIT09IHVuZGVmaW5lZDtcblxuXHR3aGlsZSAoICggZWxlbSA9IGVsZW1bIGRpciBdICkgJiYgZWxlbS5ub2RlVHlwZSAhPT0gOSApIHtcblx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRpZiAoIHRydW5jYXRlICYmIGpRdWVyeSggZWxlbSApLmlzKCB1bnRpbCApICkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdG1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gbWF0Y2hlZDtcbn07XG5cblxudmFyIHNpYmxpbmdzID0gZnVuY3Rpb24oIG4sIGVsZW0gKSB7XG5cdHZhciBtYXRjaGVkID0gW107XG5cblx0Zm9yICggOyBuOyBuID0gbi5uZXh0U2libGluZyApIHtcblx0XHRpZiAoIG4ubm9kZVR5cGUgPT09IDEgJiYgbiAhPT0gZWxlbSApIHtcblx0XHRcdG1hdGNoZWQucHVzaCggbiApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBtYXRjaGVkO1xufTtcblxuXG52YXIgcm5lZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtcblxuXG5cbmZ1bmN0aW9uIG5vZGVOYW1lKCBlbGVtLCBuYW1lICkge1xuXG4gIHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG59O1xudmFyIHJzaW5nbGVUYWcgPSAoIC9ePChbYS16XVteXFwvXFwwPjpcXHgyMFxcdFxcclxcblxcZl0qKVtcXHgyMFxcdFxcclxcblxcZl0qXFwvPz4oPzo8XFwvXFwxPnwpJC9pICk7XG5cblxuXG4vLyBJbXBsZW1lbnQgdGhlIGlkZW50aWNhbCBmdW5jdGlvbmFsaXR5IGZvciBmaWx0ZXIgYW5kIG5vdFxuZnVuY3Rpb24gd2lubm93KCBlbGVtZW50cywgcXVhbGlmaWVyLCBub3QgKSB7XG5cdGlmICggaXNGdW5jdGlvbiggcXVhbGlmaWVyICkgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XG5cdFx0XHRyZXR1cm4gISFxdWFsaWZpZXIuY2FsbCggZWxlbSwgaSwgZWxlbSApICE9PSBub3Q7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gU2luZ2xlIGVsZW1lbnRcblx0aWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCBlbGVtID09PSBxdWFsaWZpZXIgKSAhPT0gbm90O1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIEFycmF5bGlrZSBvZiBlbGVtZW50cyAoalF1ZXJ5LCBhcmd1bWVudHMsIEFycmF5KVxuXHRpZiAoIHR5cGVvZiBxdWFsaWZpZXIgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCBpbmRleE9mLmNhbGwoIHF1YWxpZmllciwgZWxlbSApID4gLTEgKSAhPT0gbm90O1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIEZpbHRlcmVkIGRpcmVjdGx5IGZvciBib3RoIHNpbXBsZSBhbmQgY29tcGxleCBzZWxlY3RvcnNcblx0cmV0dXJuIGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMsIG5vdCApO1xufVxuXG5qUXVlcnkuZmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7XG5cdHZhciBlbGVtID0gZWxlbXNbIDAgXTtcblxuXHRpZiAoIG5vdCApIHtcblx0XHRleHByID0gXCI6bm90KFwiICsgZXhwciArIFwiKVwiO1xuXHR9XG5cblx0aWYgKCBlbGVtcy5sZW5ndGggPT09IDEgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBleHByICkgPyBbIGVsZW0gXSA6IFtdO1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeS5maW5kLm1hdGNoZXMoIGV4cHIsIGpRdWVyeS5ncmVwKCBlbGVtcywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDE7XG5cdH0gKSApO1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRmaW5kOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGksIHJldCxcblx0XHRcdGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0c2VsZiA9IHRoaXM7XG5cblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5KCBzZWxlY3RvciApLmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdFx0aWYgKCBqUXVlcnkuY29udGFpbnMoIHNlbGZbIGkgXSwgdGhpcyApICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9ICkgKTtcblx0XHR9XG5cblx0XHRyZXQgPSB0aGlzLnB1c2hTdGFjayggW10gKTtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRqUXVlcnkuZmluZCggc2VsZWN0b3IsIHNlbGZbIGkgXSwgcmV0ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGxlbiA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggcmV0ICkgOiByZXQ7XG5cdH0sXG5cdGZpbHRlcjogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KCB0aGlzLCBzZWxlY3RvciB8fCBbXSwgZmFsc2UgKSApO1xuXHR9LFxuXHRub3Q6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyggdGhpcywgc2VsZWN0b3IgfHwgW10sIHRydWUgKSApO1xuXHR9LFxuXHRpczogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiAhIXdpbm5vdyhcblx0XHRcdHRoaXMsXG5cblx0XHRcdC8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXRcblx0XHRcdC8vIHNvICQoXCJwOmZpcnN0XCIpLmlzKFwicDpsYXN0XCIpIHdvbid0IHJldHVybiB0cnVlIGZvciBhIGRvYyB3aXRoIHR3byBcInBcIi5cblx0XHRcdHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiAmJiBybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICkgP1xuXHRcdFx0XHRqUXVlcnkoIHNlbGVjdG9yICkgOlxuXHRcdFx0XHRzZWxlY3RvciB8fCBbXSxcblx0XHRcdGZhbHNlXG5cdFx0KS5sZW5ndGg7XG5cdH1cbn0gKTtcblxuXG4vLyBJbml0aWFsaXplIGEgalF1ZXJ5IG9iamVjdFxuXG5cbi8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KVxudmFyIHJvb3RqUXVlcnksXG5cblx0Ly8gQSBzaW1wbGUgd2F5IHRvIGNoZWNrIGZvciBIVE1MIHN0cmluZ3Ncblx0Ly8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKVxuXHQvLyBTdHJpY3QgSFRNTCByZWNvZ25pdGlvbiAoIzExMjkwOiBtdXN0IHN0YXJ0IHdpdGggPClcblx0Ly8gU2hvcnRjdXQgc2ltcGxlICNpZCBjYXNlIGZvciBzcGVlZFxuXHRycXVpY2tFeHByID0gL14oPzpcXHMqKDxbXFx3XFxXXSs+KVtePl0qfCMoW1xcdy1dKykpJC8sXG5cblx0aW5pdCA9IGpRdWVyeS5mbi5pbml0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByb290ICkge1xuXHRcdHZhciBtYXRjaCwgZWxlbTtcblxuXHRcdC8vIEhBTkRMRTogJChcIlwiKSwgJChudWxsKSwgJCh1bmRlZmluZWQpLCAkKGZhbHNlKVxuXHRcdGlmICggIXNlbGVjdG9yICkge1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0Ly8gTWV0aG9kIGluaXQoKSBhY2NlcHRzIGFuIGFsdGVybmF0ZSByb290alF1ZXJ5XG5cdFx0Ly8gc28gbWlncmF0ZSBjYW4gc3VwcG9ydCBqUXVlcnkuc3ViIChnaC0yMTAxKVxuXHRcdHJvb3QgPSByb290IHx8IHJvb3RqUXVlcnk7XG5cblx0XHQvLyBIYW5kbGUgSFRNTCBzdHJpbmdzXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRpZiAoIHNlbGVjdG9yWyAwIF0gPT09IFwiPFwiICYmXG5cdFx0XHRcdHNlbGVjdG9yWyBzZWxlY3Rvci5sZW5ndGggLSAxIF0gPT09IFwiPlwiICYmXG5cdFx0XHRcdHNlbGVjdG9yLmxlbmd0aCA+PSAzICkge1xuXG5cdFx0XHRcdC8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrXG5cdFx0XHRcdG1hdGNoID0gWyBudWxsLCBzZWxlY3RvciwgbnVsbCBdO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWF0Y2ggaHRtbCBvciBtYWtlIHN1cmUgbm8gY29udGV4dCBpcyBzcGVjaWZpZWQgZm9yICNpZFxuXHRcdFx0aWYgKCBtYXRjaCAmJiAoIG1hdGNoWyAxIF0gfHwgIWNvbnRleHQgKSApIHtcblxuXHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCkgLT4gJChhcnJheSlcblx0XHRcdFx0aWYgKCBtYXRjaFsgMSBdICkge1xuXHRcdFx0XHRcdGNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFsgMCBdIDogY29udGV4dDtcblxuXHRcdFx0XHRcdC8vIE9wdGlvbiB0byBydW4gc2NyaXB0cyBpcyB0cnVlIGZvciBiYWNrLWNvbXBhdFxuXHRcdFx0XHRcdC8vIEludGVudGlvbmFsbHkgbGV0IHRoZSBlcnJvciBiZSB0aHJvd24gaWYgcGFyc2VIVE1MIGlzIG5vdCBwcmVzZW50XG5cdFx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCB0aGlzLCBqUXVlcnkucGFyc2VIVE1MKFxuXHRcdFx0XHRcdFx0bWF0Y2hbIDEgXSxcblx0XHRcdFx0XHRcdGNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogZG9jdW1lbnQsXG5cdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0KSApO1xuXG5cdFx0XHRcdFx0Ly8gSEFORExFOiAkKGh0bWwsIHByb3BzKVxuXHRcdFx0XHRcdGlmICggcnNpbmdsZVRhZy50ZXN0KCBtYXRjaFsgMSBdICkgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvbnRleHQgKSApIHtcblx0XHRcdFx0XHRcdGZvciAoIG1hdGNoIGluIGNvbnRleHQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gUHJvcGVydGllcyBvZiBjb250ZXh0IGFyZSBjYWxsZWQgYXMgbWV0aG9kcyBpZiBwb3NzaWJsZVxuXHRcdFx0XHRcdFx0XHRpZiAoIGlzRnVuY3Rpb24oIHRoaXNbIG1hdGNoIF0gKSApIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzWyBtYXRjaCBdKCBjb250ZXh0WyBtYXRjaCBdICk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gLi4uYW5kIG90aGVyd2lzZSBzZXQgYXMgYXR0cmlidXRlc1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuYXR0ciggbWF0Y2gsIGNvbnRleHRbIG1hdGNoIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJCgjaWQpXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtYXRjaFsgMiBdICk7XG5cblx0XHRcdFx0XHRpZiAoIGVsZW0gKSB7XG5cblx0XHRcdFx0XHRcdC8vIEluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0XG5cdFx0XHRcdFx0XHR0aGlzWyAwIF0gPSBlbGVtO1xuXHRcdFx0XHRcdFx0dGhpcy5sZW5ndGggPSAxO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBIQU5ETEU6ICQoZXhwciwgJCguLi4pKVxuXHRcdFx0fSBlbHNlIGlmICggIWNvbnRleHQgfHwgY29udGV4dC5qcXVlcnkgKSB7XG5cdFx0XHRcdHJldHVybiAoIGNvbnRleHQgfHwgcm9vdCApLmZpbmQoIHNlbGVjdG9yICk7XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCBjb250ZXh0KVxuXHRcdFx0Ly8gKHdoaWNoIGlzIGp1c3QgZXF1aXZhbGVudCB0bzogJChjb250ZXh0KS5maW5kKGV4cHIpXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb25zdHJ1Y3RvciggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yICk7XG5cdFx0XHR9XG5cblx0XHQvLyBIQU5ETEU6ICQoRE9NRWxlbWVudClcblx0XHR9IGVsc2UgaWYgKCBzZWxlY3Rvci5ub2RlVHlwZSApIHtcblx0XHRcdHRoaXNbIDAgXSA9IHNlbGVjdG9yO1xuXHRcdFx0dGhpcy5sZW5ndGggPSAxO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHQvLyBIQU5ETEU6ICQoZnVuY3Rpb24pXG5cdFx0Ly8gU2hvcnRjdXQgZm9yIGRvY3VtZW50IHJlYWR5XG5cdFx0fSBlbHNlIGlmICggaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApIHtcblx0XHRcdHJldHVybiByb290LnJlYWR5ICE9PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRyb290LnJlYWR5KCBzZWxlY3RvciApIDpcblxuXHRcdFx0XHQvLyBFeGVjdXRlIGltbWVkaWF0ZWx5IGlmIHJlYWR5IGlzIG5vdCBwcmVzZW50XG5cdFx0XHRcdHNlbGVjdG9yKCBqUXVlcnkgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4galF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTtcblx0fTtcblxuLy8gR2l2ZSB0aGUgaW5pdCBmdW5jdGlvbiB0aGUgalF1ZXJ5IHByb3RvdHlwZSBmb3IgbGF0ZXIgaW5zdGFudGlhdGlvblxuaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47XG5cbi8vIEluaXRpYWxpemUgY2VudHJhbCByZWZlcmVuY2VcbnJvb3RqUXVlcnkgPSBqUXVlcnkoIGRvY3VtZW50ICk7XG5cblxudmFyIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLFxuXG5cdC8vIE1ldGhvZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0XG5cdGd1YXJhbnRlZWRVbmlxdWUgPSB7XG5cdFx0Y2hpbGRyZW46IHRydWUsXG5cdFx0Y29udGVudHM6IHRydWUsXG5cdFx0bmV4dDogdHJ1ZSxcblx0XHRwcmV2OiB0cnVlXG5cdH07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0aGFzOiBmdW5jdGlvbiggdGFyZ2V0ICkge1xuXHRcdHZhciB0YXJnZXRzID0galF1ZXJ5KCB0YXJnZXQsIHRoaXMgKSxcblx0XHRcdGwgPSB0YXJnZXRzLmxlbmd0aDtcblxuXHRcdHJldHVybiB0aGlzLmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdGlmICggalF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCB0YXJnZXRzWyBpIF0gKSApIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRjbG9zZXN0OiBmdW5jdGlvbiggc2VsZWN0b3JzLCBjb250ZXh0ICkge1xuXHRcdHZhciBjdXIsXG5cdFx0XHRpID0gMCxcblx0XHRcdGwgPSB0aGlzLmxlbmd0aCxcblx0XHRcdG1hdGNoZWQgPSBbXSxcblx0XHRcdHRhcmdldHMgPSB0eXBlb2Ygc2VsZWN0b3JzICE9PSBcInN0cmluZ1wiICYmIGpRdWVyeSggc2VsZWN0b3JzICk7XG5cblx0XHQvLyBQb3NpdGlvbmFsIHNlbGVjdG9ycyBuZXZlciBtYXRjaCwgc2luY2UgdGhlcmUncyBubyBfc2VsZWN0aW9uXyBjb250ZXh0XG5cdFx0aWYgKCAhcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvcnMgKSApIHtcblx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0Zm9yICggY3VyID0gdGhpc1sgaSBdOyBjdXIgJiYgY3VyICE9PSBjb250ZXh0OyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHtcblxuXHRcdFx0XHRcdC8vIEFsd2F5cyBza2lwIGRvY3VtZW50IGZyYWdtZW50c1xuXHRcdFx0XHRcdGlmICggY3VyLm5vZGVUeXBlIDwgMTEgJiYgKCB0YXJnZXRzID9cblx0XHRcdFx0XHRcdHRhcmdldHMuaW5kZXgoIGN1ciApID4gLTEgOlxuXG5cdFx0XHRcdFx0XHQvLyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBTaXp6bGVcblx0XHRcdFx0XHRcdGN1ci5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHRcdFx0XHRqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGN1ciwgc2VsZWN0b3JzICkgKSApIHtcblxuXHRcdFx0XHRcdFx0bWF0Y2hlZC5wdXNoKCBjdXIgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggbWF0Y2hlZC5sZW5ndGggPiAxID8galF1ZXJ5LnVuaXF1ZVNvcnQoIG1hdGNoZWQgKSA6IG1hdGNoZWQgKTtcblx0fSxcblxuXHQvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBzZXRcblx0aW5kZXg6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0Ly8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnRcblx0XHRpZiAoICFlbGVtICkge1xuXHRcdFx0cmV0dXJuICggdGhpc1sgMCBdICYmIHRoaXNbIDAgXS5wYXJlbnROb2RlICkgPyB0aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aCA6IC0xO1xuXHRcdH1cblxuXHRcdC8vIEluZGV4IGluIHNlbGVjdG9yXG5cdFx0aWYgKCB0eXBlb2YgZWxlbSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiBpbmRleE9mLmNhbGwoIGpRdWVyeSggZWxlbSApLCB0aGlzWyAwIF0gKTtcblx0XHR9XG5cblx0XHQvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnRcblx0XHRyZXR1cm4gaW5kZXhPZi5jYWxsKCB0aGlzLFxuXG5cdFx0XHQvLyBJZiBpdCByZWNlaXZlcyBhIGpRdWVyeSBvYmplY3QsIHRoZSBmaXJzdCBlbGVtZW50IGlzIHVzZWRcblx0XHRcdGVsZW0uanF1ZXJ5ID8gZWxlbVsgMCBdIDogZWxlbVxuXHRcdCk7XG5cdH0sXG5cblx0YWRkOiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKFxuXHRcdFx0alF1ZXJ5LnVuaXF1ZVNvcnQoXG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgalF1ZXJ5KCBzZWxlY3RvciwgY29udGV4dCApIClcblx0XHRcdClcblx0XHQpO1xuXHR9LFxuXG5cdGFkZEJhY2s6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5hZGQoIHNlbGVjdG9yID09IG51bGwgP1xuXHRcdFx0dGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlciggc2VsZWN0b3IgKVxuXHRcdCk7XG5cdH1cbn0gKTtcblxuZnVuY3Rpb24gc2libGluZyggY3VyLCBkaXIgKSB7XG5cdHdoaWxlICggKCBjdXIgPSBjdXJbIGRpciBdICkgJiYgY3VyLm5vZGVUeXBlICE9PSAxICkge31cblx0cmV0dXJuIGN1cjtcbn1cblxualF1ZXJ5LmVhY2goIHtcblx0cGFyZW50OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdHJldHVybiBwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSAxMSA/IHBhcmVudCA6IG51bGw7XG5cdH0sXG5cdHBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicGFyZW50Tm9kZVwiICk7XG5cdH0sXG5cdHBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicGFyZW50Tm9kZVwiLCB1bnRpbCApO1xuXHR9LFxuXHRuZXh0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZyggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XG5cdH0sXG5cdHByZXY6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5nKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiICk7XG5cdH0sXG5cdG5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiApO1xuXHR9LFxuXHRwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiICk7XG5cdH0sXG5cdG5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiwgdW50aWwgKTtcblx0fSxcblx0cHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwcmV2aW91c1NpYmxpbmdcIiwgdW50aWwgKTtcblx0fSxcblx0c2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5ncyggKCBlbGVtLnBhcmVudE5vZGUgfHwge30gKS5maXJzdENoaWxkLCBlbGVtICk7XG5cdH0sXG5cdGNoaWxkcmVuOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZ3MoIGVsZW0uZmlyc3RDaGlsZCApO1xuXHR9LFxuXHRjb250ZW50czogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0aWYgKCB0eXBlb2YgZWxlbS5jb250ZW50RG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5jb250ZW50RG9jdW1lbnQ7XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogSUUgOSAtIDExIG9ubHksIGlPUyA3IG9ubHksIEFuZHJvaWQgQnJvd3NlciA8PTQuMyBvbmx5XG5cdFx0Ly8gVHJlYXQgdGhlIHRlbXBsYXRlIGVsZW1lbnQgYXMgYSByZWd1bGFyIG9uZSBpbiBicm93c2VycyB0aGF0XG5cdFx0Ly8gZG9uJ3Qgc3VwcG9ydCBpdC5cblx0XHRpZiAoIG5vZGVOYW1lKCBlbGVtLCBcInRlbXBsYXRlXCIgKSApIHtcblx0XHRcdGVsZW0gPSBlbGVtLmNvbnRlbnQgfHwgZWxlbTtcblx0XHR9XG5cblx0XHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7XG5cdH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggdW50aWwsIHNlbGVjdG9yICkge1xuXHRcdHZhciBtYXRjaGVkID0galF1ZXJ5Lm1hcCggdGhpcywgZm4sIHVudGlsICk7XG5cblx0XHRpZiAoIG5hbWUuc2xpY2UoIC01ICkgIT09IFwiVW50aWxcIiApIHtcblx0XHRcdHNlbGVjdG9yID0gdW50aWw7XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWxlY3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRtYXRjaGVkID0galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIG1hdGNoZWQgKTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGR1cGxpY2F0ZXNcblx0XHRcdGlmICggIWd1YXJhbnRlZWRVbmlxdWVbIG5hbWUgXSApIHtcblx0XHRcdFx0alF1ZXJ5LnVuaXF1ZVNvcnQoIG1hdGNoZWQgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV2ZXJzZSBvcmRlciBmb3IgcGFyZW50cyogYW5kIHByZXYtZGVyaXZhdGl2ZXNcblx0XHRcdGlmICggcnBhcmVudHNwcmV2LnRlc3QoIG5hbWUgKSApIHtcblx0XHRcdFx0bWF0Y2hlZC5yZXZlcnNlKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkICk7XG5cdH07XG59ICk7XG52YXIgcm5vdGh0bWx3aGl0ZSA9ICggL1teXFx4MjBcXHRcXHJcXG5cXGZdKy9nICk7XG5cblxuXG4vLyBDb252ZXJ0IFN0cmluZy1mb3JtYXR0ZWQgb3B0aW9ucyBpbnRvIE9iamVjdC1mb3JtYXR0ZWQgb25lc1xuZnVuY3Rpb24gY3JlYXRlT3B0aW9ucyggb3B0aW9ucyApIHtcblx0dmFyIG9iamVjdCA9IHt9O1xuXHRqUXVlcnkuZWFjaCggb3B0aW9ucy5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdLCBmdW5jdGlvbiggXywgZmxhZyApIHtcblx0XHRvYmplY3RbIGZsYWcgXSA9IHRydWU7XG5cdH0gKTtcblx0cmV0dXJuIG9iamVjdDtcbn1cblxuLypcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGxpc3QgdXNpbmcgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOlxuICpcbiAqXHRvcHRpb25zOiBhbiBvcHRpb25hbCBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBvcHRpb25zIHRoYXQgd2lsbCBjaGFuZ2UgaG93XG4gKlx0XHRcdHRoZSBjYWxsYmFjayBsaXN0IGJlaGF2ZXMgb3IgYSBtb3JlIHRyYWRpdGlvbmFsIG9wdGlvbiBvYmplY3RcbiAqXG4gKiBCeSBkZWZhdWx0IGEgY2FsbGJhY2sgbGlzdCB3aWxsIGFjdCBsaWtlIGFuIGV2ZW50IGNhbGxiYWNrIGxpc3QgYW5kIGNhbiBiZVxuICogXCJmaXJlZFwiIG11bHRpcGxlIHRpbWVzLlxuICpcbiAqIFBvc3NpYmxlIG9wdGlvbnM6XG4gKlxuICpcdG9uY2U6XHRcdFx0d2lsbCBlbnN1cmUgdGhlIGNhbGxiYWNrIGxpc3QgY2FuIG9ubHkgYmUgZmlyZWQgb25jZSAobGlrZSBhIERlZmVycmVkKVxuICpcbiAqXHRtZW1vcnk6XHRcdFx0d2lsbCBrZWVwIHRyYWNrIG9mIHByZXZpb3VzIHZhbHVlcyBhbmQgd2lsbCBjYWxsIGFueSBjYWxsYmFjayBhZGRlZFxuICpcdFx0XHRcdFx0YWZ0ZXIgdGhlIGxpc3QgaGFzIGJlZW4gZmlyZWQgcmlnaHQgYXdheSB3aXRoIHRoZSBsYXRlc3QgXCJtZW1vcml6ZWRcIlxuICpcdFx0XHRcdFx0dmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpXG4gKlxuICpcdHVuaXF1ZTpcdFx0XHR3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdClcbiAqXG4gKlx0c3RvcE9uRmFsc2U6XHRpbnRlcnJ1cHQgY2FsbGluZ3Mgd2hlbiBhIGNhbGxiYWNrIHJldHVybnMgZmFsc2VcbiAqXG4gKi9cbmpRdWVyeS5DYWxsYmFja3MgPSBmdW5jdGlvbiggb3B0aW9ucyApIHtcblxuXHQvLyBDb252ZXJ0IG9wdGlvbnMgZnJvbSBTdHJpbmctZm9ybWF0dGVkIHRvIE9iamVjdC1mb3JtYXR0ZWQgaWYgbmVlZGVkXG5cdC8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdClcblx0b3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiID9cblx0XHRjcmVhdGVPcHRpb25zKCBvcHRpb25zICkgOlxuXHRcdGpRdWVyeS5leHRlbmQoIHt9LCBvcHRpb25zICk7XG5cblx0dmFyIC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IGlzIGN1cnJlbnRseSBmaXJpbmdcblx0XHRmaXJpbmcsXG5cblx0XHQvLyBMYXN0IGZpcmUgdmFsdWUgZm9yIG5vbi1mb3JnZXR0YWJsZSBsaXN0c1xuXHRcdG1lbW9yeSxcblxuXHRcdC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkXG5cdFx0ZmlyZWQsXG5cblx0XHQvLyBGbGFnIHRvIHByZXZlbnQgZmlyaW5nXG5cdFx0bG9ja2VkLFxuXG5cdFx0Ly8gQWN0dWFsIGNhbGxiYWNrIGxpc3Rcblx0XHRsaXN0ID0gW10sXG5cblx0XHQvLyBRdWV1ZSBvZiBleGVjdXRpb24gZGF0YSBmb3IgcmVwZWF0YWJsZSBsaXN0c1xuXHRcdHF1ZXVlID0gW10sXG5cblx0XHQvLyBJbmRleCBvZiBjdXJyZW50bHkgZmlyaW5nIGNhbGxiYWNrIChtb2RpZmllZCBieSBhZGQvcmVtb3ZlIGFzIG5lZWRlZClcblx0XHRmaXJpbmdJbmRleCA9IC0xLFxuXG5cdFx0Ly8gRmlyZSBjYWxsYmFja3Ncblx0XHRmaXJlID0gZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEVuZm9yY2Ugc2luZ2xlLWZpcmluZ1xuXHRcdFx0bG9ja2VkID0gbG9ja2VkIHx8IG9wdGlvbnMub25jZTtcblxuXHRcdFx0Ly8gRXhlY3V0ZSBjYWxsYmFja3MgZm9yIGFsbCBwZW5kaW5nIGV4ZWN1dGlvbnMsXG5cdFx0XHQvLyByZXNwZWN0aW5nIGZpcmluZ0luZGV4IG92ZXJyaWRlcyBhbmQgcnVudGltZSBjaGFuZ2VzXG5cdFx0XHRmaXJlZCA9IGZpcmluZyA9IHRydWU7XG5cdFx0XHRmb3IgKCA7IHF1ZXVlLmxlbmd0aDsgZmlyaW5nSW5kZXggPSAtMSApIHtcblx0XHRcdFx0bWVtb3J5ID0gcXVldWUuc2hpZnQoKTtcblx0XHRcdFx0d2hpbGUgKCArK2ZpcmluZ0luZGV4IDwgbGlzdC5sZW5ndGggKSB7XG5cblx0XHRcdFx0XHQvLyBSdW4gY2FsbGJhY2sgYW5kIGNoZWNrIGZvciBlYXJseSB0ZXJtaW5hdGlvblxuXHRcdFx0XHRcdGlmICggbGlzdFsgZmlyaW5nSW5kZXggXS5hcHBseSggbWVtb3J5WyAwIF0sIG1lbW9yeVsgMSBdICkgPT09IGZhbHNlICYmXG5cdFx0XHRcdFx0XHRvcHRpb25zLnN0b3BPbkZhbHNlICkge1xuXG5cdFx0XHRcdFx0XHQvLyBKdW1wIHRvIGVuZCBhbmQgZm9yZ2V0IHRoZSBkYXRhIHNvIC5hZGQgZG9lc24ndCByZS1maXJlXG5cdFx0XHRcdFx0XHRmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoO1xuXHRcdFx0XHRcdFx0bWVtb3J5ID0gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvcmdldCB0aGUgZGF0YSBpZiB3ZSdyZSBkb25lIHdpdGggaXRcblx0XHRcdGlmICggIW9wdGlvbnMubWVtb3J5ICkge1xuXHRcdFx0XHRtZW1vcnkgPSBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0ZmlyaW5nID0gZmFsc2U7XG5cblx0XHRcdC8vIENsZWFuIHVwIGlmIHdlJ3JlIGRvbmUgZmlyaW5nIGZvciBnb29kXG5cdFx0XHRpZiAoIGxvY2tlZCApIHtcblxuXHRcdFx0XHQvLyBLZWVwIGFuIGVtcHR5IGxpc3QgaWYgd2UgaGF2ZSBkYXRhIGZvciBmdXR1cmUgYWRkIGNhbGxzXG5cdFx0XHRcdGlmICggbWVtb3J5ICkge1xuXHRcdFx0XHRcdGxpc3QgPSBbXTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2UsIHRoaXMgb2JqZWN0IGlzIHNwZW50XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGlzdCA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gQWN0dWFsIENhbGxiYWNrcyBvYmplY3Rcblx0XHRzZWxmID0ge1xuXG5cdFx0XHQvLyBBZGQgYSBjYWxsYmFjayBvciBhIGNvbGxlY3Rpb24gb2YgY2FsbGJhY2tzIHRvIHRoZSBsaXN0XG5cdFx0XHRhZGQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGxpc3QgKSB7XG5cblx0XHRcdFx0XHQvLyBJZiB3ZSBoYXZlIG1lbW9yeSBmcm9tIGEgcGFzdCBydW4sIHdlIHNob3VsZCBmaXJlIGFmdGVyIGFkZGluZ1xuXHRcdFx0XHRcdGlmICggbWVtb3J5ICYmICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0XHRmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoIC0gMTtcblx0XHRcdFx0XHRcdHF1ZXVlLnB1c2goIG1lbW9yeSApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCggZnVuY3Rpb24gYWRkKCBhcmdzICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmVhY2goIGFyZ3MsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggaXNGdW5jdGlvbiggYXJnICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCAhb3B0aW9ucy51bmlxdWUgfHwgIXNlbGYuaGFzKCBhcmcgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGxpc3QucHVzaCggYXJnICk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBhcmcgJiYgYXJnLmxlbmd0aCAmJiB0b1R5cGUoIGFyZyApICE9PSBcInN0cmluZ1wiICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gSW5zcGVjdCByZWN1cnNpdmVseVxuXHRcdFx0XHRcdFx0XHRcdGFkZCggYXJnICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHR9ICkoIGFyZ3VtZW50cyApO1xuXG5cdFx0XHRcdFx0aWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBSZW1vdmUgYSBjYWxsYmFjayBmcm9tIHRoZSBsaXN0XG5cdFx0XHRyZW1vdmU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRqUXVlcnkuZWFjaCggYXJndW1lbnRzLCBmdW5jdGlvbiggXywgYXJnICkge1xuXHRcdFx0XHRcdHZhciBpbmRleDtcblx0XHRcdFx0XHR3aGlsZSAoICggaW5kZXggPSBqUXVlcnkuaW5BcnJheSggYXJnLCBsaXN0LCBpbmRleCApICkgPiAtMSApIHtcblx0XHRcdFx0XHRcdGxpc3Quc3BsaWNlKCBpbmRleCwgMSApO1xuXG5cdFx0XHRcdFx0XHQvLyBIYW5kbGUgZmlyaW5nIGluZGV4ZXNcblx0XHRcdFx0XHRcdGlmICggaW5kZXggPD0gZmlyaW5nSW5kZXggKSB7XG5cdFx0XHRcdFx0XHRcdGZpcmluZ0luZGV4LS07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgYSBnaXZlbiBjYWxsYmFjayBpcyBpbiB0aGUgbGlzdC5cblx0XHRcdC8vIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCByZXR1cm4gd2hldGhlciBvciBub3QgbGlzdCBoYXMgY2FsbGJhY2tzIGF0dGFjaGVkLlxuXHRcdFx0aGFzOiBmdW5jdGlvbiggZm4gKSB7XG5cdFx0XHRcdHJldHVybiBmbiA/XG5cdFx0XHRcdFx0alF1ZXJ5LmluQXJyYXkoIGZuLCBsaXN0ICkgPiAtMSA6XG5cdFx0XHRcdFx0bGlzdC5sZW5ndGggPiAwO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gUmVtb3ZlIGFsbCBjYWxsYmFja3MgZnJvbSB0aGUgbGlzdFxuXHRcdFx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGxpc3QgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gRGlzYWJsZSAuZmlyZSBhbmQgLmFkZFxuXHRcdFx0Ly8gQWJvcnQgYW55IGN1cnJlbnQvcGVuZGluZyBleGVjdXRpb25zXG5cdFx0XHQvLyBDbGVhciBhbGwgY2FsbGJhY2tzIGFuZCB2YWx1ZXNcblx0XHRcdGRpc2FibGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRsb2NrZWQgPSBxdWV1ZSA9IFtdO1xuXHRcdFx0XHRsaXN0ID0gbWVtb3J5ID0gXCJcIjtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0ZGlzYWJsZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gIWxpc3Q7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBEaXNhYmxlIC5maXJlXG5cdFx0XHQvLyBBbHNvIGRpc2FibGUgLmFkZCB1bmxlc3Mgd2UgaGF2ZSBtZW1vcnkgKHNpbmNlIGl0IHdvdWxkIGhhdmUgbm8gZWZmZWN0KVxuXHRcdFx0Ly8gQWJvcnQgYW55IHBlbmRpbmcgZXhlY3V0aW9uc1xuXHRcdFx0bG9jazogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGxvY2tlZCA9IHF1ZXVlID0gW107XG5cdFx0XHRcdGlmICggIW1lbW9yeSAmJiAhZmlyaW5nICkge1xuXHRcdFx0XHRcdGxpc3QgPSBtZW1vcnkgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdGxvY2tlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIWxvY2tlZDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIENhbGwgYWxsIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBhcmd1bWVudHNcblx0XHRcdGZpcmVXaXRoOiBmdW5jdGlvbiggY29udGV4dCwgYXJncyApIHtcblx0XHRcdFx0aWYgKCAhbG9ja2VkICkge1xuXHRcdFx0XHRcdGFyZ3MgPSBhcmdzIHx8IFtdO1xuXHRcdFx0XHRcdGFyZ3MgPSBbIGNvbnRleHQsIGFyZ3Muc2xpY2UgPyBhcmdzLnNsaWNlKCkgOiBhcmdzIF07XG5cdFx0XHRcdFx0cXVldWUucHVzaCggYXJncyApO1xuXHRcdFx0XHRcdGlmICggIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDYWxsIGFsbCB0aGUgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50c1xuXHRcdFx0ZmlyZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHNlbGYuZmlyZVdpdGgoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIFRvIGtub3cgaWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZVxuXHRcdFx0ZmlyZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gISFmaXJlZDtcblx0XHRcdH1cblx0XHR9O1xuXG5cdHJldHVybiBzZWxmO1xufTtcblxuXG5mdW5jdGlvbiBJZGVudGl0eSggdiApIHtcblx0cmV0dXJuIHY7XG59XG5mdW5jdGlvbiBUaHJvd2VyKCBleCApIHtcblx0dGhyb3cgZXg7XG59XG5cbmZ1bmN0aW9uIGFkb3B0VmFsdWUoIHZhbHVlLCByZXNvbHZlLCByZWplY3QsIG5vVmFsdWUgKSB7XG5cdHZhciBtZXRob2Q7XG5cblx0dHJ5IHtcblxuXHRcdC8vIENoZWNrIGZvciBwcm9taXNlIGFzcGVjdCBmaXJzdCB0byBwcml2aWxlZ2Ugc3luY2hyb25vdXMgYmVoYXZpb3Jcblx0XHRpZiAoIHZhbHVlICYmIGlzRnVuY3Rpb24oICggbWV0aG9kID0gdmFsdWUucHJvbWlzZSApICkgKSB7XG5cdFx0XHRtZXRob2QuY2FsbCggdmFsdWUgKS5kb25lKCByZXNvbHZlICkuZmFpbCggcmVqZWN0ICk7XG5cblx0XHQvLyBPdGhlciB0aGVuYWJsZXNcblx0XHR9IGVsc2UgaWYgKCB2YWx1ZSAmJiBpc0Z1bmN0aW9uKCAoIG1ldGhvZCA9IHZhbHVlLnRoZW4gKSApICkge1xuXHRcdFx0bWV0aG9kLmNhbGwoIHZhbHVlLCByZXNvbHZlLCByZWplY3QgKTtcblxuXHRcdC8vIE90aGVyIG5vbi10aGVuYWJsZXNcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBDb250cm9sIGByZXNvbHZlYCBhcmd1bWVudHMgYnkgbGV0dGluZyBBcnJheSNzbGljZSBjYXN0IGJvb2xlYW4gYG5vVmFsdWVgIHRvIGludGVnZXI6XG5cdFx0XHQvLyAqIGZhbHNlOiBbIHZhbHVlIF0uc2xpY2UoIDAgKSA9PiByZXNvbHZlKCB2YWx1ZSApXG5cdFx0XHQvLyAqIHRydWU6IFsgdmFsdWUgXS5zbGljZSggMSApID0+IHJlc29sdmUoKVxuXHRcdFx0cmVzb2x2ZS5hcHBseSggdW5kZWZpbmVkLCBbIHZhbHVlIF0uc2xpY2UoIG5vVmFsdWUgKSApO1xuXHRcdH1cblxuXHQvLyBGb3IgUHJvbWlzZXMvQSssIGNvbnZlcnQgZXhjZXB0aW9ucyBpbnRvIHJlamVjdGlvbnNcblx0Ly8gU2luY2UgalF1ZXJ5LndoZW4gZG9lc24ndCB1bndyYXAgdGhlbmFibGVzLCB3ZSBjYW4gc2tpcCB0aGUgZXh0cmEgY2hlY2tzIGFwcGVhcmluZyBpblxuXHQvLyBEZWZlcnJlZCN0aGVuIHRvIGNvbmRpdGlvbmFsbHkgc3VwcHJlc3MgcmVqZWN0aW9uLlxuXHR9IGNhdGNoICggdmFsdWUgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCBvbmx5XG5cdFx0Ly8gU3RyaWN0IG1vZGUgZnVuY3Rpb25zIGludm9rZWQgd2l0aG91dCAuY2FsbC8uYXBwbHkgZ2V0IGdsb2JhbC1vYmplY3QgY29udGV4dFxuXHRcdHJlamVjdC5hcHBseSggdW5kZWZpbmVkLCBbIHZhbHVlIF0gKTtcblx0fVxufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0RGVmZXJyZWQ6IGZ1bmN0aW9uKCBmdW5jICkge1xuXHRcdHZhciB0dXBsZXMgPSBbXG5cblx0XHRcdFx0Ly8gYWN0aW9uLCBhZGQgbGlzdGVuZXIsIGNhbGxiYWNrcyxcblx0XHRcdFx0Ly8gLi4uIC50aGVuIGhhbmRsZXJzLCBhcmd1bWVudCBpbmRleCwgW2ZpbmFsIHN0YXRlXVxuXHRcdFx0XHRbIFwibm90aWZ5XCIsIFwicHJvZ3Jlc3NcIiwgalF1ZXJ5LkNhbGxiYWNrcyggXCJtZW1vcnlcIiApLFxuXHRcdFx0XHRcdGpRdWVyeS5DYWxsYmFja3MoIFwibWVtb3J5XCIgKSwgMiBdLFxuXHRcdFx0XHRbIFwicmVzb2x2ZVwiLCBcImRvbmVcIiwgalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksXG5cdFx0XHRcdFx0alF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksIDAsIFwicmVzb2x2ZWRcIiBdLFxuXHRcdFx0XHRbIFwicmVqZWN0XCIsIFwiZmFpbFwiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSxcblx0XHRcdFx0XHRqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSwgMSwgXCJyZWplY3RlZFwiIF1cblx0XHRcdF0sXG5cdFx0XHRzdGF0ZSA9IFwicGVuZGluZ1wiLFxuXHRcdFx0cHJvbWlzZSA9IHtcblx0XHRcdFx0c3RhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBzdGF0ZTtcblx0XHRcdFx0fSxcblx0XHRcdFx0YWx3YXlzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5kb25lKCBhcmd1bWVudHMgKS5mYWlsKCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblx0XHRcdFx0XCJjYXRjaFwiOiBmdW5jdGlvbiggZm4gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHByb21pc2UudGhlbiggbnVsbCwgZm4gKTtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBLZWVwIHBpcGUgZm9yIGJhY2stY29tcGF0XG5cdFx0XHRcdHBpcGU6IGZ1bmN0aW9uKCAvKiBmbkRvbmUsIGZuRmFpbCwgZm5Qcm9ncmVzcyAqLyApIHtcblx0XHRcdFx0XHR2YXIgZm5zID0gYXJndW1lbnRzO1xuXG5cdFx0XHRcdFx0cmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIE1hcCB0dXBsZXMgKHByb2dyZXNzLCBkb25lLCBmYWlsKSB0byBhcmd1bWVudHMgKGRvbmUsIGZhaWwsIHByb2dyZXNzKVxuXHRcdFx0XHRcdFx0XHR2YXIgZm4gPSBpc0Z1bmN0aW9uKCBmbnNbIHR1cGxlWyA0IF0gXSApICYmIGZuc1sgdHVwbGVbIDQgXSBdO1xuXG5cdFx0XHRcdFx0XHRcdC8vIGRlZmVycmVkLnByb2dyZXNzKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLm5vdGlmeSB9KVxuXHRcdFx0XHRcdFx0XHQvLyBkZWZlcnJlZC5kb25lKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLnJlc29sdmUgfSlcblx0XHRcdFx0XHRcdFx0Ly8gZGVmZXJyZWQuZmFpbChmdW5jdGlvbigpIHsgYmluZCB0byBuZXdEZWZlciBvciBuZXdEZWZlci5yZWplY3QgfSlcblx0XHRcdFx0XHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAxIF0gXSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIHJldHVybmVkID0gZm4gJiYgZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdFx0XHRcdGlmICggcmV0dXJuZWQgJiYgaXNGdW5jdGlvbiggcmV0dXJuZWQucHJvbWlzZSApICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQucHJvbWlzZSgpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5IClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmRvbmUoIG5ld0RlZmVyLnJlc29sdmUgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuZmFpbCggbmV3RGVmZXIucmVqZWN0ICk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdG5ld0RlZmVyWyB0dXBsZVsgMCBdICsgXCJXaXRoXCIgXShcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm4gPyBbIHJldHVybmVkIF0gOiBhcmd1bWVudHNcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHRmbnMgPSBudWxsO1xuXHRcdFx0XHRcdH0gKS5wcm9taXNlKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoZW46IGZ1bmN0aW9uKCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCwgb25Qcm9ncmVzcyApIHtcblx0XHRcdFx0XHR2YXIgbWF4RGVwdGggPSAwO1xuXHRcdFx0XHRcdGZ1bmN0aW9uIHJlc29sdmUoIGRlcHRoLCBkZWZlcnJlZCwgaGFuZGxlciwgc3BlY2lhbCApIHtcblx0XHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0dmFyIHRoYXQgPSB0aGlzLFxuXHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSBhcmd1bWVudHMsXG5cdFx0XHRcdFx0XHRcdFx0bWlnaHRUaHJvdyA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIHJldHVybmVkLCB0aGVuO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuM1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIElnbm9yZSBkb3VibGUtcmVzb2x1dGlvbiBhdHRlbXB0c1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBkZXB0aCA8IG1heERlcHRoICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkID0gaGFuZGxlci5hcHBseSggdGhhdCwgYXJncyApO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4xXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC00OFxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCByZXR1cm5lZCA9PT0gZGVmZXJyZWQucHJvbWlzZSgpICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCBcIlRoZW5hYmxlIHNlbGYtcmVzb2x1dGlvblwiICk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb25zIDIuMy4zLjEsIDMuNVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTRcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTc1XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBSZXRyaWV2ZSBgdGhlbmAgb25seSBvbmNlXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGVuID0gcmV0dXJuZWQgJiZcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy40XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTY0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgY2hlY2sgb2JqZWN0cyBhbmQgZnVuY3Rpb25zIGZvciB0aGVuYWJpbGl0eVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQoIHR5cGVvZiByZXR1cm5lZCA9PT0gXCJvYmplY3RcIiB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHR5cGVvZiByZXR1cm5lZCA9PT0gXCJmdW5jdGlvblwiICkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQudGhlbjtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSGFuZGxlIGEgcmV0dXJuZWQgdGhlbmFibGVcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggaXNGdW5jdGlvbiggdGhlbiApICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFNwZWNpYWwgcHJvY2Vzc29ycyAobm90aWZ5KSBqdXN0IHdhaXQgZm9yIHJlc29sdXRpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBzcGVjaWFsICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoZW4uY2FsbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBJZGVudGl0eSwgc3BlY2lhbCApLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsIClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE5vcm1hbCBwcm9jZXNzb3JzIChyZXNvbHZlKSBhbHNvIGhvb2sgaW50byBwcm9ncmVzc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gLi4uYW5kIGRpc3JlZ2FyZCBvbGRlciByZXNvbHV0aW9uIHZhbHVlc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1heERlcHRoKys7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGVuLmNhbGwoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgVGhyb3dlciwgc3BlY2lhbCApLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBJZGVudGl0eSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBIYW5kbGUgYWxsIG90aGVyIHJldHVybmVkIHZhbHVlc1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBPbmx5IHN1YnN0aXR1dGUgaGFuZGxlcnMgcGFzcyBvbiBjb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGFuZCBtdWx0aXBsZSB2YWx1ZXMgKG5vbi1zcGVjIGJlaGF2aW9yKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGhhbmRsZXIgIT09IElkZW50aXR5ICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoYXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXJncyA9IFsgcmV0dXJuZWQgXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFByb2Nlc3MgdGhlIHZhbHVlKHMpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIERlZmF1bHQgcHJvY2VzcyBpcyByZXNvbHZlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCggc3BlY2lhbCB8fCBkZWZlcnJlZC5yZXNvbHZlV2l0aCApKCB0aGF0LCBhcmdzICk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgbm9ybWFsIHByb2Nlc3NvcnMgKHJlc29sdmUpIGNhdGNoIGFuZCByZWplY3QgZXhjZXB0aW9uc1xuXHRcdFx0XHRcdFx0XHRcdHByb2Nlc3MgPSBzcGVjaWFsID9cblx0XHRcdFx0XHRcdFx0XHRcdG1pZ2h0VGhyb3cgOlxuXHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWlnaHRUaHJvdygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2sgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayggZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzcy5zdGFja1RyYWNlICk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjQuMVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTYxXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gSWdub3JlIHBvc3QtcmVzb2x1dGlvbiBleGNlcHRpb25zXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBkZXB0aCArIDEgPj0gbWF4RGVwdGggKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgc3Vic3RpdHV0ZSBoYW5kbGVycyBwYXNzIG9uIGNvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGFuZCBtdWx0aXBsZSB2YWx1ZXMgKG5vbi1zcGVjIGJlaGF2aW9yKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBoYW5kbGVyICE9PSBUaHJvd2VyICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGF0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhcmdzID0gWyBlIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmVycmVkLnJlamVjdFdpdGgoIHRoYXQsIGFyZ3MgKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjFcblx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTdcblx0XHRcdFx0XHRcdFx0Ly8gUmUtcmVzb2x2ZSBwcm9taXNlcyBpbW1lZGlhdGVseSB0byBkb2RnZSBmYWxzZSByZWplY3Rpb24gZnJvbVxuXHRcdFx0XHRcdFx0XHQvLyBzdWJzZXF1ZW50IGVycm9yc1xuXHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoICkge1xuXHRcdFx0XHRcdFx0XHRcdHByb2Nlc3MoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIENhbGwgYW4gb3B0aW9uYWwgaG9vayB0byByZWNvcmQgdGhlIHN0YWNrLCBpbiBjYXNlIG9mIGV4Y2VwdGlvblxuXHRcdFx0XHRcdFx0XHRcdC8vIHNpbmNlIGl0J3Mgb3RoZXJ3aXNlIGxvc3Qgd2hlbiBleGVjdXRpb24gZ29lcyBhc3luY1xuXHRcdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vayApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3Muc3RhY2tUcmFjZSA9IGpRdWVyeS5EZWZlcnJlZC5nZXRTdGFja0hvb2soKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoIHByb2Nlc3MgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4galF1ZXJ5LkRlZmVycmVkKCBmdW5jdGlvbiggbmV3RGVmZXIgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHByb2dyZXNzX2hhbmRsZXJzLmFkZCggLi4uIClcblx0XHRcdFx0XHRcdHR1cGxlc1sgMCBdWyAzIF0uYWRkKFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKFxuXHRcdFx0XHRcdFx0XHRcdDAsXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIsXG5cdFx0XHRcdFx0XHRcdFx0aXNGdW5jdGlvbiggb25Qcm9ncmVzcyApID9cblx0XHRcdFx0XHRcdFx0XHRcdG9uUHJvZ3Jlc3MgOlxuXHRcdFx0XHRcdFx0XHRcdFx0SWRlbnRpdHksXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIubm90aWZ5V2l0aFxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHQvLyBmdWxmaWxsZWRfaGFuZGxlcnMuYWRkKCAuLi4gKVxuXHRcdFx0XHRcdFx0dHVwbGVzWyAxIF1bIDMgXS5hZGQoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoXG5cdFx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlcixcblx0XHRcdFx0XHRcdFx0XHRpc0Z1bmN0aW9uKCBvbkZ1bGZpbGxlZCApID9cblx0XHRcdFx0XHRcdFx0XHRcdG9uRnVsZmlsbGVkIDpcblx0XHRcdFx0XHRcdFx0XHRcdElkZW50aXR5XG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdC8vIHJlamVjdGVkX2hhbmRsZXJzLmFkZCggLi4uIClcblx0XHRcdFx0XHRcdHR1cGxlc1sgMiBdWyAzIF0uYWRkKFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKFxuXHRcdFx0XHRcdFx0XHRcdDAsXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIsXG5cdFx0XHRcdFx0XHRcdFx0aXNGdW5jdGlvbiggb25SZWplY3RlZCApID9cblx0XHRcdFx0XHRcdFx0XHRcdG9uUmVqZWN0ZWQgOlxuXHRcdFx0XHRcdFx0XHRcdFx0VGhyb3dlclxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gKS5wcm9taXNlKCk7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gR2V0IGEgcHJvbWlzZSBmb3IgdGhpcyBkZWZlcnJlZFxuXHRcdFx0XHQvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0XG5cdFx0XHRcdHByb21pc2U6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9iaiAhPSBudWxsID8galF1ZXJ5LmV4dGVuZCggb2JqLCBwcm9taXNlICkgOiBwcm9taXNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVmZXJyZWQgPSB7fTtcblxuXHRcdC8vIEFkZCBsaXN0LXNwZWNpZmljIG1ldGhvZHNcblx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7XG5cdFx0XHR2YXIgbGlzdCA9IHR1cGxlWyAyIF0sXG5cdFx0XHRcdHN0YXRlU3RyaW5nID0gdHVwbGVbIDUgXTtcblxuXHRcdFx0Ly8gcHJvbWlzZS5wcm9ncmVzcyA9IGxpc3QuYWRkXG5cdFx0XHQvLyBwcm9taXNlLmRvbmUgPSBsaXN0LmFkZFxuXHRcdFx0Ly8gcHJvbWlzZS5mYWlsID0gbGlzdC5hZGRcblx0XHRcdHByb21pc2VbIHR1cGxlWyAxIF0gXSA9IGxpc3QuYWRkO1xuXG5cdFx0XHQvLyBIYW5kbGUgc3RhdGVcblx0XHRcdGlmICggc3RhdGVTdHJpbmcgKSB7XG5cdFx0XHRcdGxpc3QuYWRkKFxuXHRcdFx0XHRcdGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdFx0XHQvLyBzdGF0ZSA9IFwicmVzb2x2ZWRcIiAoaS5lLiwgZnVsZmlsbGVkKVxuXHRcdFx0XHRcdFx0Ly8gc3RhdGUgPSBcInJlamVjdGVkXCJcblx0XHRcdFx0XHRcdHN0YXRlID0gc3RhdGVTdHJpbmc7XG5cdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdC8vIHJlamVjdGVkX2NhbGxiYWNrcy5kaXNhYmxlXG5cdFx0XHRcdFx0Ly8gZnVsZmlsbGVkX2NhbGxiYWNrcy5kaXNhYmxlXG5cdFx0XHRcdFx0dHVwbGVzWyAzIC0gaSBdWyAyIF0uZGlzYWJsZSxcblxuXHRcdFx0XHRcdC8vIHJlamVjdGVkX2hhbmRsZXJzLmRpc2FibGVcblx0XHRcdFx0XHQvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZGlzYWJsZVxuXHRcdFx0XHRcdHR1cGxlc1sgMyAtIGkgXVsgMyBdLmRpc2FibGUsXG5cblx0XHRcdFx0XHQvLyBwcm9ncmVzc19jYWxsYmFja3MubG9ja1xuXHRcdFx0XHRcdHR1cGxlc1sgMCBdWyAyIF0ubG9jayxcblxuXHRcdFx0XHRcdC8vIHByb2dyZXNzX2hhbmRsZXJzLmxvY2tcblx0XHRcdFx0XHR0dXBsZXNbIDAgXVsgMyBdLmxvY2tcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gcHJvZ3Jlc3NfaGFuZGxlcnMuZmlyZVxuXHRcdFx0Ly8gZnVsZmlsbGVkX2hhbmRsZXJzLmZpcmVcblx0XHRcdC8vIHJlamVjdGVkX2hhbmRsZXJzLmZpcmVcblx0XHRcdGxpc3QuYWRkKCB0dXBsZVsgMyBdLmZpcmUgKTtcblxuXHRcdFx0Ly8gZGVmZXJyZWQubm90aWZ5ID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLm5vdGlmeVdpdGgoLi4uKSB9XG5cdFx0XHQvLyBkZWZlcnJlZC5yZXNvbHZlID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLnJlc29sdmVXaXRoKC4uLikgfVxuXHRcdFx0Ly8gZGVmZXJyZWQucmVqZWN0ID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLnJlamVjdFdpdGgoLi4uKSB9XG5cdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDAgXSBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdICsgXCJXaXRoXCIgXSggdGhpcyA9PT0gZGVmZXJyZWQgPyB1bmRlZmluZWQgOiB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBkZWZlcnJlZC5ub3RpZnlXaXRoID0gbGlzdC5maXJlV2l0aFxuXHRcdFx0Ly8gZGVmZXJyZWQucmVzb2x2ZVdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHQvLyBkZWZlcnJlZC5yZWplY3RXaXRoID0gbGlzdC5maXJlV2l0aFxuXHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdID0gbGlzdC5maXJlV2l0aDtcblx0XHR9ICk7XG5cblx0XHQvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2Vcblx0XHRwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7XG5cblx0XHQvLyBDYWxsIGdpdmVuIGZ1bmMgaWYgYW55XG5cdFx0aWYgKCBmdW5jICkge1xuXHRcdFx0ZnVuYy5jYWxsKCBkZWZlcnJlZCwgZGVmZXJyZWQgKTtcblx0XHR9XG5cblx0XHQvLyBBbGwgZG9uZSFcblx0XHRyZXR1cm4gZGVmZXJyZWQ7XG5cdH0sXG5cblx0Ly8gRGVmZXJyZWQgaGVscGVyXG5cdHdoZW46IGZ1bmN0aW9uKCBzaW5nbGVWYWx1ZSApIHtcblx0XHR2YXJcblxuXHRcdFx0Ly8gY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzXG5cdFx0XHRyZW1haW5pbmcgPSBhcmd1bWVudHMubGVuZ3RoLFxuXG5cdFx0XHQvLyBjb3VudCBvZiB1bnByb2Nlc3NlZCBhcmd1bWVudHNcblx0XHRcdGkgPSByZW1haW5pbmcsXG5cblx0XHRcdC8vIHN1Ym9yZGluYXRlIGZ1bGZpbGxtZW50IGRhdGFcblx0XHRcdHJlc29sdmVDb250ZXh0cyA9IEFycmF5KCBpICksXG5cdFx0XHRyZXNvbHZlVmFsdWVzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzICksXG5cblx0XHRcdC8vIHRoZSBtYXN0ZXIgRGVmZXJyZWRcblx0XHRcdG1hc3RlciA9IGpRdWVyeS5EZWZlcnJlZCgpLFxuXG5cdFx0XHQvLyBzdWJvcmRpbmF0ZSBjYWxsYmFjayBmYWN0b3J5XG5cdFx0XHR1cGRhdGVGdW5jID0gZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmVzb2x2ZUNvbnRleHRzWyBpIF0gPSB0aGlzO1xuXHRcdFx0XHRcdHJlc29sdmVWYWx1ZXNbIGkgXSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gc2xpY2UuY2FsbCggYXJndW1lbnRzICkgOiB2YWx1ZTtcblx0XHRcdFx0XHRpZiAoICEoIC0tcmVtYWluaW5nICkgKSB7XG5cdFx0XHRcdFx0XHRtYXN0ZXIucmVzb2x2ZVdpdGgoIHJlc29sdmVDb250ZXh0cywgcmVzb2x2ZVZhbHVlcyApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH07XG5cblx0XHQvLyBTaW5nbGUtIGFuZCBlbXB0eSBhcmd1bWVudHMgYXJlIGFkb3B0ZWQgbGlrZSBQcm9taXNlLnJlc29sdmVcblx0XHRpZiAoIHJlbWFpbmluZyA8PSAxICkge1xuXHRcdFx0YWRvcHRWYWx1ZSggc2luZ2xlVmFsdWUsIG1hc3Rlci5kb25lKCB1cGRhdGVGdW5jKCBpICkgKS5yZXNvbHZlLCBtYXN0ZXIucmVqZWN0LFxuXHRcdFx0XHQhcmVtYWluaW5nICk7XG5cblx0XHRcdC8vIFVzZSAudGhlbigpIHRvIHVud3JhcCBzZWNvbmRhcnkgdGhlbmFibGVzIChjZi4gZ2gtMzAwMClcblx0XHRcdGlmICggbWFzdGVyLnN0YXRlKCkgPT09IFwicGVuZGluZ1wiIHx8XG5cdFx0XHRcdGlzRnVuY3Rpb24oIHJlc29sdmVWYWx1ZXNbIGkgXSAmJiByZXNvbHZlVmFsdWVzWyBpIF0udGhlbiApICkge1xuXG5cdFx0XHRcdHJldHVybiBtYXN0ZXIudGhlbigpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE11bHRpcGxlIGFyZ3VtZW50cyBhcmUgYWdncmVnYXRlZCBsaWtlIFByb21pc2UuYWxsIGFycmF5IGVsZW1lbnRzXG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRhZG9wdFZhbHVlKCByZXNvbHZlVmFsdWVzWyBpIF0sIHVwZGF0ZUZ1bmMoIGkgKSwgbWFzdGVyLnJlamVjdCApO1xuXHRcdH1cblxuXHRcdHJldHVybiBtYXN0ZXIucHJvbWlzZSgpO1xuXHR9XG59ICk7XG5cblxuLy8gVGhlc2UgdXN1YWxseSBpbmRpY2F0ZSBhIHByb2dyYW1tZXIgbWlzdGFrZSBkdXJpbmcgZGV2ZWxvcG1lbnQsXG4vLyB3YXJuIGFib3V0IHRoZW0gQVNBUCByYXRoZXIgdGhhbiBzd2FsbG93aW5nIHRoZW0gYnkgZGVmYXVsdC5cbnZhciByZXJyb3JOYW1lcyA9IC9eKEV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSSlFcnJvciQvO1xuXG5qUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayA9IGZ1bmN0aW9uKCBlcnJvciwgc3RhY2sgKSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgOCAtIDkgb25seVxuXHQvLyBDb25zb2xlIGV4aXN0cyB3aGVuIGRldiB0b29scyBhcmUgb3Blbiwgd2hpY2ggY2FuIGhhcHBlbiBhdCBhbnkgdGltZVxuXHRpZiAoIHdpbmRvdy5jb25zb2xlICYmIHdpbmRvdy5jb25zb2xlLndhcm4gJiYgZXJyb3IgJiYgcmVycm9yTmFtZXMudGVzdCggZXJyb3IubmFtZSApICkge1xuXHRcdHdpbmRvdy5jb25zb2xlLndhcm4oIFwialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogXCIgKyBlcnJvci5tZXNzYWdlLCBlcnJvci5zdGFjaywgc3RhY2sgKTtcblx0fVxufTtcblxuXG5cblxualF1ZXJ5LnJlYWR5RXhjZXB0aW9uID0gZnVuY3Rpb24oIGVycm9yICkge1xuXHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0dGhyb3cgZXJyb3I7XG5cdH0gKTtcbn07XG5cblxuXG5cbi8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeVxudmFyIHJlYWR5TGlzdCA9IGpRdWVyeS5EZWZlcnJlZCgpO1xuXG5qUXVlcnkuZm4ucmVhZHkgPSBmdW5jdGlvbiggZm4gKSB7XG5cblx0cmVhZHlMaXN0XG5cdFx0LnRoZW4oIGZuIClcblxuXHRcdC8vIFdyYXAgalF1ZXJ5LnJlYWR5RXhjZXB0aW9uIGluIGEgZnVuY3Rpb24gc28gdGhhdCB0aGUgbG9va3VwXG5cdFx0Ly8gaGFwcGVucyBhdCB0aGUgdGltZSBvZiBlcnJvciBoYW5kbGluZyBpbnN0ZWFkIG9mIGNhbGxiYWNrXG5cdFx0Ly8gcmVnaXN0cmF0aW9uLlxuXHRcdC5jYXRjaCggZnVuY3Rpb24oIGVycm9yICkge1xuXHRcdFx0alF1ZXJ5LnJlYWR5RXhjZXB0aW9uKCBlcnJvciApO1xuXHRcdH0gKTtcblxuXHRyZXR1cm4gdGhpcztcbn07XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBJcyB0aGUgRE9NIHJlYWR5IHRvIGJlIHVzZWQ/IFNldCB0byB0cnVlIG9uY2UgaXQgb2NjdXJzLlxuXHRpc1JlYWR5OiBmYWxzZSxcblxuXHQvLyBBIGNvdW50ZXIgdG8gdHJhY2sgaG93IG1hbnkgaXRlbXMgdG8gd2FpdCBmb3IgYmVmb3JlXG5cdC8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxXG5cdHJlYWR5V2FpdDogMSxcblxuXHQvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5XG5cdHJlYWR5OiBmdW5jdGlvbiggd2FpdCApIHtcblxuXHRcdC8vIEFib3J0IGlmIHRoZXJlIGFyZSBwZW5kaW5nIGhvbGRzIG9yIHdlJ3JlIGFscmVhZHkgcmVhZHlcblx0XHRpZiAoIHdhaXQgPT09IHRydWUgPyAtLWpRdWVyeS5yZWFkeVdhaXQgOiBqUXVlcnkuaXNSZWFkeSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHlcblx0XHRqUXVlcnkuaXNSZWFkeSA9IHRydWU7XG5cblx0XHQvLyBJZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5kIHdhaXQgaWYgbmVlZCBiZVxuXHRcdGlmICggd2FpdCAhPT0gdHJ1ZSAmJiAtLWpRdWVyeS5yZWFkeVdhaXQgPiAwICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZXJlIGFyZSBmdW5jdGlvbnMgYm91bmQsIHRvIGV4ZWN1dGVcblx0XHRyZWFkeUxpc3QucmVzb2x2ZVdpdGgoIGRvY3VtZW50LCBbIGpRdWVyeSBdICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LnJlYWR5LnRoZW4gPSByZWFkeUxpc3QudGhlbjtcblxuLy8gVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIgYW5kIHNlbGYgY2xlYW51cCBtZXRob2RcbmZ1bmN0aW9uIGNvbXBsZXRlZCgpIHtcblx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCApO1xuXHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJsb2FkXCIsIGNvbXBsZXRlZCApO1xuXHRqUXVlcnkucmVhZHkoKTtcbn1cblxuLy8gQ2F0Y2ggY2FzZXMgd2hlcmUgJChkb2N1bWVudCkucmVhZHkoKSBpcyBjYWxsZWRcbi8vIGFmdGVyIHRoZSBicm93c2VyIGV2ZW50IGhhcyBhbHJlYWR5IG9jY3VycmVkLlxuLy8gU3VwcG9ydDogSUUgPD05IC0gMTAgb25seVxuLy8gT2xkZXIgSUUgc29tZXRpbWVzIHNpZ25hbHMgXCJpbnRlcmFjdGl2ZVwiIHRvbyBzb29uXG5pZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIiB8fFxuXHQoIGRvY3VtZW50LnJlYWR5U3RhdGUgIT09IFwibG9hZGluZ1wiICYmICFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwgKSApIHtcblxuXHQvLyBIYW5kbGUgaXQgYXN5bmNocm9ub3VzbHkgdG8gYWxsb3cgc2NyaXB0cyB0aGUgb3Bwb3J0dW5pdHkgdG8gZGVsYXkgcmVhZHlcblx0d2luZG93LnNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApO1xuXG59IGVsc2Uge1xuXG5cdC8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2tcblx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCApO1xuXG5cdC8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrXG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCBcImxvYWRcIiwgY29tcGxldGVkICk7XG59XG5cblxuXG5cbi8vIE11bHRpZnVuY3Rpb25hbCBtZXRob2QgdG8gZ2V0IGFuZCBzZXQgdmFsdWVzIG9mIGEgY29sbGVjdGlvblxuLy8gVGhlIHZhbHVlL3MgY2FuIG9wdGlvbmFsbHkgYmUgZXhlY3V0ZWQgaWYgaXQncyBhIGZ1bmN0aW9uXG52YXIgYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcmF3ICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gZWxlbXMubGVuZ3RoLFxuXHRcdGJ1bGsgPSBrZXkgPT0gbnVsbDtcblxuXHQvLyBTZXRzIG1hbnkgdmFsdWVzXG5cdGlmICggdG9UeXBlKCBrZXkgKSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRjaGFpbmFibGUgPSB0cnVlO1xuXHRcdGZvciAoIGkgaW4ga2V5ICkge1xuXHRcdFx0YWNjZXNzKCBlbGVtcywgZm4sIGksIGtleVsgaSBdLCB0cnVlLCBlbXB0eUdldCwgcmF3ICk7XG5cdFx0fVxuXG5cdC8vIFNldHMgb25lIHZhbHVlXG5cdH0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0Y2hhaW5hYmxlID0gdHJ1ZTtcblxuXHRcdGlmICggIWlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyYXcgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICggYnVsayApIHtcblxuXHRcdFx0Ly8gQnVsayBvcGVyYXRpb25zIHJ1biBhZ2FpbnN0IHRoZSBlbnRpcmUgc2V0XG5cdFx0XHRpZiAoIHJhdyApIHtcblx0XHRcdFx0Zm4uY2FsbCggZWxlbXMsIHZhbHVlICk7XG5cdFx0XHRcdGZuID0gbnVsbDtcblxuXHRcdFx0Ly8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YnVsayA9IGZuO1xuXHRcdFx0XHRmbiA9IGZ1bmN0aW9uKCBlbGVtLCBrZXksIHZhbHVlICkge1xuXHRcdFx0XHRcdHJldHVybiBidWxrLmNhbGwoIGpRdWVyeSggZWxlbSApLCB2YWx1ZSApO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggZm4gKSB7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0Zm4oXG5cdFx0XHRcdFx0ZWxlbXNbIGkgXSwga2V5LCByYXcgP1xuXHRcdFx0XHRcdHZhbHVlIDpcblx0XHRcdFx0XHR2YWx1ZS5jYWxsKCBlbGVtc1sgaSBdLCBpLCBmbiggZWxlbXNbIGkgXSwga2V5ICkgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmICggY2hhaW5hYmxlICkge1xuXHRcdHJldHVybiBlbGVtcztcblx0fVxuXG5cdC8vIEdldHNcblx0aWYgKCBidWxrICkge1xuXHRcdHJldHVybiBmbi5jYWxsKCBlbGVtcyApO1xuXHR9XG5cblx0cmV0dXJuIGxlbiA/IGZuKCBlbGVtc1sgMCBdLCBrZXkgKSA6IGVtcHR5R2V0O1xufTtcblxuXG4vLyBNYXRjaGVzIGRhc2hlZCBzdHJpbmcgZm9yIGNhbWVsaXppbmdcbnZhciBybXNQcmVmaXggPSAvXi1tcy0vLFxuXHRyZGFzaEFscGhhID0gLy0oW2Etel0pL2c7XG5cbi8vIFVzZWQgYnkgY2FtZWxDYXNlIGFzIGNhbGxiYWNrIHRvIHJlcGxhY2UoKVxuZnVuY3Rpb24gZmNhbWVsQ2FzZSggYWxsLCBsZXR0ZXIgKSB7XG5cdHJldHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTtcbn1cblxuLy8gQ29udmVydCBkYXNoZWQgdG8gY2FtZWxDYXNlOyB1c2VkIGJ5IHRoZSBjc3MgYW5kIGRhdGEgbW9kdWxlc1xuLy8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNVxuLy8gTWljcm9zb2Z0IGZvcmdvdCB0byBodW1wIHRoZWlyIHZlbmRvciBwcmVmaXggKCM5NTcyKVxuZnVuY3Rpb24gY2FtZWxDYXNlKCBzdHJpbmcgKSB7XG5cdHJldHVybiBzdHJpbmcucmVwbGFjZSggcm1zUHJlZml4LCBcIm1zLVwiICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApO1xufVxudmFyIGFjY2VwdERhdGEgPSBmdW5jdGlvbiggb3duZXIgKSB7XG5cblx0Ly8gQWNjZXB0cyBvbmx5OlxuXHQvLyAgLSBOb2RlXG5cdC8vICAgIC0gTm9kZS5FTEVNRU5UX05PREVcblx0Ly8gICAgLSBOb2RlLkRPQ1VNRU5UX05PREVcblx0Ly8gIC0gT2JqZWN0XG5cdC8vICAgIC0gQW55XG5cdHJldHVybiBvd25lci5ub2RlVHlwZSA9PT0gMSB8fCBvd25lci5ub2RlVHlwZSA9PT0gOSB8fCAhKCArb3duZXIubm9kZVR5cGUgKTtcbn07XG5cblxuXG5cbmZ1bmN0aW9uIERhdGEoKSB7XG5cdHRoaXMuZXhwYW5kbyA9IGpRdWVyeS5leHBhbmRvICsgRGF0YS51aWQrKztcbn1cblxuRGF0YS51aWQgPSAxO1xuXG5EYXRhLnByb3RvdHlwZSA9IHtcblxuXHRjYWNoZTogZnVuY3Rpb24oIG93bmVyICkge1xuXG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIG93bmVyIG9iamVjdCBhbHJlYWR5IGhhcyBhIGNhY2hlXG5cdFx0dmFyIHZhbHVlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXG5cdFx0Ly8gSWYgbm90LCBjcmVhdGUgb25lXG5cdFx0aWYgKCAhdmFsdWUgKSB7XG5cdFx0XHR2YWx1ZSA9IHt9O1xuXG5cdFx0XHQvLyBXZSBjYW4gYWNjZXB0IGRhdGEgZm9yIG5vbi1lbGVtZW50IG5vZGVzIGluIG1vZGVybiBicm93c2Vycyxcblx0XHRcdC8vIGJ1dCB3ZSBzaG91bGQgbm90LCBzZWUgIzgzMzUuXG5cdFx0XHQvLyBBbHdheXMgcmV0dXJuIGFuIGVtcHR5IG9iamVjdC5cblx0XHRcdGlmICggYWNjZXB0RGF0YSggb3duZXIgKSApIHtcblxuXHRcdFx0XHQvLyBJZiBpdCBpcyBhIG5vZGUgdW5saWtlbHkgdG8gYmUgc3RyaW5naWZ5LWVkIG9yIGxvb3BlZCBvdmVyXG5cdFx0XHRcdC8vIHVzZSBwbGFpbiBhc3NpZ25tZW50XG5cdFx0XHRcdGlmICggb3duZXIubm9kZVR5cGUgKSB7XG5cdFx0XHRcdFx0b3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdmFsdWU7XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIHNlY3VyZSBpdCBpbiBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5XG5cdFx0XHRcdC8vIGNvbmZpZ3VyYWJsZSBtdXN0IGJlIHRydWUgdG8gYWxsb3cgdGhlIHByb3BlcnR5IHRvIGJlXG5cdFx0XHRcdC8vIGRlbGV0ZWQgd2hlbiBkYXRhIGlzIHJlbW92ZWRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIG93bmVyLCB0aGlzLmV4cGFuZG8sIHtcblx0XHRcdFx0XHRcdHZhbHVlOiB2YWx1ZSxcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZVxuXHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB2YWx1ZTtcblx0fSxcblx0c2V0OiBmdW5jdGlvbiggb3duZXIsIGRhdGEsIHZhbHVlICkge1xuXHRcdHZhciBwcm9wLFxuXHRcdFx0Y2FjaGUgPSB0aGlzLmNhY2hlKCBvd25lciApO1xuXG5cdFx0Ly8gSGFuZGxlOiBbIG93bmVyLCBrZXksIHZhbHVlIF0gYXJnc1xuXHRcdC8vIEFsd2F5cyB1c2UgY2FtZWxDYXNlIGtleSAoZ2gtMjI1Nylcblx0XHRpZiAoIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0Y2FjaGVbIGNhbWVsQ2FzZSggZGF0YSApIF0gPSB2YWx1ZTtcblxuXHRcdC8vIEhhbmRsZTogWyBvd25lciwgeyBwcm9wZXJ0aWVzIH0gXSBhcmdzXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gQ29weSB0aGUgcHJvcGVydGllcyBvbmUtYnktb25lIHRvIHRoZSBjYWNoZSBvYmplY3Rcblx0XHRcdGZvciAoIHByb3AgaW4gZGF0YSApIHtcblx0XHRcdFx0Y2FjaGVbIGNhbWVsQ2FzZSggcHJvcCApIF0gPSBkYXRhWyBwcm9wIF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBjYWNoZTtcblx0fSxcblx0Z2V0OiBmdW5jdGlvbiggb3duZXIsIGtleSApIHtcblx0XHRyZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgP1xuXHRcdFx0dGhpcy5jYWNoZSggb3duZXIgKSA6XG5cblx0XHRcdC8vIEFsd2F5cyB1c2UgY2FtZWxDYXNlIGtleSAoZ2gtMjI1Nylcblx0XHRcdG93bmVyWyB0aGlzLmV4cGFuZG8gXSAmJiBvd25lclsgdGhpcy5leHBhbmRvIF1bIGNhbWVsQ2FzZSgga2V5ICkgXTtcblx0fSxcblx0YWNjZXNzOiBmdW5jdGlvbiggb3duZXIsIGtleSwgdmFsdWUgKSB7XG5cblx0XHQvLyBJbiBjYXNlcyB3aGVyZSBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIE5vIGtleSB3YXMgc3BlY2lmaWVkXG5cdFx0Ly8gICAyLiBBIHN0cmluZyBrZXkgd2FzIHNwZWNpZmllZCwgYnV0IG5vIHZhbHVlIHByb3ZpZGVkXG5cdFx0Ly9cblx0XHQvLyBUYWtlIHRoZSBcInJlYWRcIiBwYXRoIGFuZCBhbGxvdyB0aGUgZ2V0IG1ldGhvZCB0byBkZXRlcm1pbmVcblx0XHQvLyB3aGljaCB2YWx1ZSB0byByZXR1cm4sIHJlc3BlY3RpdmVseSBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIFRoZSBlbnRpcmUgY2FjaGUgb2JqZWN0XG5cdFx0Ly8gICAyLiBUaGUgZGF0YSBzdG9yZWQgYXQgdGhlIGtleVxuXHRcdC8vXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8fFxuXHRcdFx0XHQoICgga2V5ICYmIHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgKSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmdldCggb3duZXIsIGtleSApO1xuXHRcdH1cblxuXHRcdC8vIFdoZW4gdGhlIGtleSBpcyBub3QgYSBzdHJpbmcsIG9yIGJvdGggYSBrZXkgYW5kIHZhbHVlXG5cdFx0Ly8gYXJlIHNwZWNpZmllZCwgc2V0IG9yIGV4dGVuZCAoZXhpc3Rpbmcgb2JqZWN0cykgd2l0aCBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIEFuIG9iamVjdCBvZiBwcm9wZXJ0aWVzXG5cdFx0Ly8gICAyLiBBIGtleSBhbmQgdmFsdWVcblx0XHQvL1xuXHRcdHRoaXMuc2V0KCBvd25lciwga2V5LCB2YWx1ZSApO1xuXG5cdFx0Ly8gU2luY2UgdGhlIFwic2V0XCIgcGF0aCBjYW4gaGF2ZSB0d28gcG9zc2libGUgZW50cnkgcG9pbnRzXG5cdFx0Ly8gcmV0dXJuIHRoZSBleHBlY3RlZCBkYXRhIGJhc2VkIG9uIHdoaWNoIHBhdGggd2FzIHRha2VuWypdXG5cdFx0cmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IGtleTtcblx0fSxcblx0cmVtb3ZlOiBmdW5jdGlvbiggb3duZXIsIGtleSApIHtcblx0XHR2YXIgaSxcblx0XHRcdGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXG5cdFx0aWYgKCBjYWNoZSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICgga2V5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBvZiBrZXlzXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIGtleSApICkge1xuXG5cdFx0XHRcdC8vIElmIGtleSBpcyBhbiBhcnJheSBvZiBrZXlzLi4uXG5cdFx0XHRcdC8vIFdlIGFsd2F5cyBzZXQgY2FtZWxDYXNlIGtleXMsIHNvIHJlbW92ZSB0aGF0LlxuXHRcdFx0XHRrZXkgPSBrZXkubWFwKCBjYW1lbENhc2UgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGtleSA9IGNhbWVsQ2FzZSgga2V5ICk7XG5cblx0XHRcdFx0Ly8gSWYgYSBrZXkgd2l0aCB0aGUgc3BhY2VzIGV4aXN0cywgdXNlIGl0LlxuXHRcdFx0XHQvLyBPdGhlcndpc2UsIGNyZWF0ZSBhbiBhcnJheSBieSBtYXRjaGluZyBub24td2hpdGVzcGFjZVxuXHRcdFx0XHRrZXkgPSBrZXkgaW4gY2FjaGUgP1xuXHRcdFx0XHRcdFsga2V5IF0gOlxuXHRcdFx0XHRcdCgga2V5Lm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW10gKTtcblx0XHRcdH1cblxuXHRcdFx0aSA9IGtleS5sZW5ndGg7XG5cblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRkZWxldGUgY2FjaGVbIGtleVsgaSBdIF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIHRoZXJlJ3Mgbm8gbW9yZSBkYXRhXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8fCBqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKSApIHtcblxuXHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9MzUgLSA0NVxuXHRcdFx0Ly8gV2Via2l0ICYgQmxpbmsgcGVyZm9ybWFuY2Ugc3VmZmVycyB3aGVuIGRlbGV0aW5nIHByb3BlcnRpZXNcblx0XHRcdC8vIGZyb20gRE9NIG5vZGVzLCBzbyBzZXQgdG8gdW5kZWZpbmVkIGluc3RlYWRcblx0XHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTM3ODYwNyAoYnVnIHJlc3RyaWN0ZWQpXG5cdFx0XHRpZiAoIG93bmVyLm5vZGVUeXBlICkge1xuXHRcdFx0XHRvd25lclsgdGhpcy5leHBhbmRvIF0gPSB1bmRlZmluZWQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWxldGUgb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0aGFzRGF0YTogZnVuY3Rpb24oIG93bmVyICkge1xuXHRcdHZhciBjYWNoZSA9IG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblx0XHRyZXR1cm4gY2FjaGUgIT09IHVuZGVmaW5lZCAmJiAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGNhY2hlICk7XG5cdH1cbn07XG52YXIgZGF0YVByaXYgPSBuZXcgRGF0YSgpO1xuXG52YXIgZGF0YVVzZXIgPSBuZXcgRGF0YSgpO1xuXG5cblxuLy9cdEltcGxlbWVudGF0aW9uIFN1bW1hcnlcbi8vXG4vL1x0MS4gRW5mb3JjZSBBUEkgc3VyZmFjZSBhbmQgc2VtYW50aWMgY29tcGF0aWJpbGl0eSB3aXRoIDEuOS54IGJyYW5jaFxuLy9cdDIuIEltcHJvdmUgdGhlIG1vZHVsZSdzIG1haW50YWluYWJpbGl0eSBieSByZWR1Y2luZyB0aGUgc3RvcmFnZVxuLy9cdFx0cGF0aHMgdG8gYSBzaW5nbGUgbWVjaGFuaXNtLlxuLy9cdDMuIFVzZSB0aGUgc2FtZSBzaW5nbGUgbWVjaGFuaXNtIHRvIHN1cHBvcnQgXCJwcml2YXRlXCIgYW5kIFwidXNlclwiIGRhdGEuXG4vL1x0NC4gX05ldmVyXyBleHBvc2UgXCJwcml2YXRlXCIgZGF0YSB0byB1c2VyIGNvZGUgKFRPRE86IERyb3AgX2RhdGEsIF9yZW1vdmVEYXRhKVxuLy9cdDUuIEF2b2lkIGV4cG9zaW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb24gdXNlciBvYmplY3RzIChlZy4gZXhwYW5kbyBwcm9wZXJ0aWVzKVxuLy9cdDYuIFByb3ZpZGUgYSBjbGVhciBwYXRoIGZvciBpbXBsZW1lbnRhdGlvbiB1cGdyYWRlIHRvIFdlYWtNYXAgaW4gMjAxNFxuXG52YXIgcmJyYWNlID0gL14oPzpcXHtbXFx3XFxXXSpcXH18XFxbW1xcd1xcV10qXFxdKSQvLFxuXHRybXVsdGlEYXNoID0gL1tBLVpdL2c7XG5cbmZ1bmN0aW9uIGdldERhdGEoIGRhdGEgKSB7XG5cdGlmICggZGF0YSA9PT0gXCJ0cnVlXCIgKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRpZiAoIGRhdGEgPT09IFwiZmFsc2VcIiApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRpZiAoIGRhdGEgPT09IFwibnVsbFwiICkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Ly8gT25seSBjb252ZXJ0IHRvIGEgbnVtYmVyIGlmIGl0IGRvZXNuJ3QgY2hhbmdlIHRoZSBzdHJpbmdcblx0aWYgKCBkYXRhID09PSArZGF0YSArIFwiXCIgKSB7XG5cdFx0cmV0dXJuICtkYXRhO1xuXHR9XG5cblx0aWYgKCByYnJhY2UudGVzdCggZGF0YSApICkge1xuXHRcdHJldHVybiBKU09OLnBhcnNlKCBkYXRhICk7XG5cdH1cblxuXHRyZXR1cm4gZGF0YTtcbn1cblxuZnVuY3Rpb24gZGF0YUF0dHIoIGVsZW0sIGtleSwgZGF0YSApIHtcblx0dmFyIG5hbWU7XG5cblx0Ly8gSWYgbm90aGluZyB3YXMgZm91bmQgaW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFueVxuXHQvLyBkYXRhIGZyb20gdGhlIEhUTUw1IGRhdGEtKiBhdHRyaWJ1dGVcblx0aWYgKCBkYXRhID09PSB1bmRlZmluZWQgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRuYW1lID0gXCJkYXRhLVwiICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsIFwiLSQmXCIgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdGRhdGEgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApO1xuXG5cdFx0aWYgKCB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGRhdGEgPSBnZXREYXRhKCBkYXRhICk7XG5cdFx0XHR9IGNhdGNoICggZSApIHt9XG5cblx0XHRcdC8vIE1ha2Ugc3VyZSB3ZSBzZXQgdGhlIGRhdGEgc28gaXQgaXNuJ3QgY2hhbmdlZCBsYXRlclxuXHRcdFx0ZGF0YVVzZXIuc2V0KCBlbGVtLCBrZXksIGRhdGEgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGRhdGE7XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0aGFzRGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRhdGFVc2VyLmhhc0RhdGEoIGVsZW0gKSB8fCBkYXRhUHJpdi5oYXNEYXRhKCBlbGVtICk7XG5cdH0sXG5cblx0ZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIGRhdGFVc2VyLmFjY2VzcyggZWxlbSwgbmFtZSwgZGF0YSApO1xuXHR9LFxuXG5cdHJlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdGRhdGFVc2VyLnJlbW92ZSggZWxlbSwgbmFtZSApO1xuXHR9LFxuXG5cdC8vIFRPRE86IE5vdyB0aGF0IGFsbCBjYWxscyB0byBfZGF0YSBhbmQgX3JlbW92ZURhdGEgaGF2ZSBiZWVuIHJlcGxhY2VkXG5cdC8vIHdpdGggZGlyZWN0IGNhbGxzIHRvIGRhdGFQcml2IG1ldGhvZHMsIHRoZXNlIGNhbiBiZSBkZXByZWNhdGVkLlxuXHRfZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIGRhdGFQcml2LmFjY2VzcyggZWxlbSwgbmFtZSwgZGF0YSApO1xuXHR9LFxuXG5cdF9yZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIG5hbWUgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkge1xuXHRcdHZhciBpLCBuYW1lLCBkYXRhLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXSxcblx0XHRcdGF0dHJzID0gZWxlbSAmJiBlbGVtLmF0dHJpYnV0ZXM7XG5cblx0XHQvLyBHZXRzIGFsbCB2YWx1ZXNcblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0aWYgKCB0aGlzLmxlbmd0aCApIHtcblx0XHRcdFx0ZGF0YSA9IGRhdGFVc2VyLmdldCggZWxlbSApO1xuXG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAhZGF0YVByaXYuZ2V0KCBlbGVtLCBcImhhc0RhdGFBdHRyc1wiICkgKSB7XG5cdFx0XHRcdFx0aSA9IGF0dHJzLmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgMTEgb25seVxuXHRcdFx0XHRcdFx0Ly8gVGhlIGF0dHJzIGVsZW1lbnRzIGNhbiBiZSBudWxsICgjMTQ4OTQpXG5cdFx0XHRcdFx0XHRpZiAoIGF0dHJzWyBpIF0gKSB7XG5cdFx0XHRcdFx0XHRcdG5hbWUgPSBhdHRyc1sgaSBdLm5hbWU7XG5cdFx0XHRcdFx0XHRcdGlmICggbmFtZS5pbmRleE9mKCBcImRhdGEtXCIgKSA9PT0gMCApIHtcblx0XHRcdFx0XHRcdFx0XHRuYW1lID0gY2FtZWxDYXNlKCBuYW1lLnNsaWNlKCA1ICkgKTtcblx0XHRcdFx0XHRcdFx0XHRkYXRhQXR0ciggZWxlbSwgbmFtZSwgZGF0YVsgbmFtZSBdICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCBlbGVtLCBcImhhc0RhdGFBdHRyc1wiLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0cyBtdWx0aXBsZSB2YWx1ZXNcblx0XHRpZiAoIHR5cGVvZiBrZXkgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YVVzZXIuc2V0KCB0aGlzLCBrZXkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZGF0YTtcblxuXHRcdFx0Ly8gVGhlIGNhbGxpbmcgalF1ZXJ5IG9iamVjdCAoZWxlbWVudCBtYXRjaGVzKSBpcyBub3QgZW1wdHlcblx0XHRcdC8vIChhbmQgdGhlcmVmb3JlIGhhcyBhbiBlbGVtZW50IGFwcGVhcnMgYXQgdGhpc1sgMCBdKSBhbmQgdGhlXG5cdFx0XHQvLyBgdmFsdWVgIHBhcmFtZXRlciB3YXMgbm90IHVuZGVmaW5lZC4gQW4gZW1wdHkgalF1ZXJ5IG9iamVjdFxuXHRcdFx0Ly8gd2lsbCByZXN1bHQgaW4gYHVuZGVmaW5lZGAgZm9yIGVsZW0gPSB0aGlzWyAwIF0gd2hpY2ggd2lsbFxuXHRcdFx0Ly8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGF0dGVtcHQgdG8gcmVhZCBhIGRhdGEgY2FjaGUgaXMgbWFkZS5cblx0XHRcdGlmICggZWxlbSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIEF0dGVtcHQgdG8gZ2V0IGRhdGEgZnJvbSB0aGUgY2FjaGVcblx0XHRcdFx0Ly8gVGhlIGtleSB3aWxsIGFsd2F5cyBiZSBjYW1lbENhc2VkIGluIERhdGFcblx0XHRcdFx0ZGF0YSA9IGRhdGFVc2VyLmdldCggZWxlbSwga2V5ICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBcImRpc2NvdmVyXCIgdGhlIGRhdGEgaW5cblx0XHRcdFx0Ly8gSFRNTDUgY3VzdG9tIGRhdGEtKiBhdHRyc1xuXHRcdFx0XHRkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGtleSApO1xuXHRcdFx0XHRpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gZGF0YTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFdlIHRyaWVkIHJlYWxseSBoYXJkLCBidXQgdGhlIGRhdGEgZG9lc24ndCBleGlzdC5cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgdGhlIGRhdGEuLi5cblx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHN0b3JlIHRoZSBjYW1lbENhc2VkIGtleVxuXHRcdFx0XHRkYXRhVXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTtcblx0XHRcdH0gKTtcblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEsIG51bGwsIHRydWUgKTtcblx0fSxcblxuXHRyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0ZGF0YVVzZXIucmVtb3ZlKCB0aGlzLCBrZXkgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdHF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgcXVldWU7XG5cblx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHR0eXBlID0gKCB0eXBlIHx8IFwiZnhcIiApICsgXCJxdWV1ZVwiO1xuXHRcdFx0cXVldWUgPSBkYXRhUHJpdi5nZXQoIGVsZW0sIHR5cGUgKTtcblxuXHRcdFx0Ly8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0aW5nIG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVzdCBhIGxvb2t1cFxuXHRcdFx0aWYgKCBkYXRhICkge1xuXHRcdFx0XHRpZiAoICFxdWV1ZSB8fCBBcnJheS5pc0FycmF5KCBkYXRhICkgKSB7XG5cdFx0XHRcdFx0cXVldWUgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHF1ZXVlLnB1c2goIGRhdGEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHF1ZXVlIHx8IFtdO1xuXHRcdH1cblx0fSxcblxuXHRkZXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cblx0XHR2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSxcblx0XHRcdHN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLFxuXHRcdFx0Zm4gPSBxdWV1ZS5zaGlmdCgpLFxuXHRcdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIHR5cGUgKSxcblx0XHRcdG5leHQgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIGVsZW0sIHR5cGUgKTtcblx0XHRcdH07XG5cblx0XHQvLyBJZiB0aGUgZnggcXVldWUgaXMgZGVxdWV1ZWQsIGFsd2F5cyByZW1vdmUgdGhlIHByb2dyZXNzIHNlbnRpbmVsXG5cdFx0aWYgKCBmbiA9PT0gXCJpbnByb2dyZXNzXCIgKSB7XG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCk7XG5cdFx0XHRzdGFydExlbmd0aC0tO1xuXHRcdH1cblxuXHRcdGlmICggZm4gKSB7XG5cblx0XHRcdC8vIEFkZCBhIHByb2dyZXNzIHNlbnRpbmVsIHRvIHByZXZlbnQgdGhlIGZ4IHF1ZXVlIGZyb20gYmVpbmdcblx0XHRcdC8vIGF1dG9tYXRpY2FsbHkgZGVxdWV1ZWRcblx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICkge1xuXHRcdFx0XHRxdWV1ZS51bnNoaWZ0KCBcImlucHJvZ3Jlc3NcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDbGVhciB1cCB0aGUgbGFzdCBxdWV1ZSBzdG9wIGZ1bmN0aW9uXG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdGZuLmNhbGwoIGVsZW0sIG5leHQsIGhvb2tzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhc3RhcnRMZW5ndGggJiYgaG9va3MgKSB7XG5cdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIE5vdCBwdWJsaWMgLSBnZW5lcmF0ZSBhIHF1ZXVlSG9va3Mgb2JqZWN0LCBvciByZXR1cm4gdGhlIGN1cnJlbnQgb25lXG5cdF9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR2YXIga2V5ID0gdHlwZSArIFwicXVldWVIb29rc1wiO1xuXHRcdHJldHVybiBkYXRhUHJpdi5nZXQoIGVsZW0sIGtleSApIHx8IGRhdGFQcml2LmFjY2VzcyggZWxlbSwga2V5LCB7XG5cdFx0XHRlbXB0eTogalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICkuYWRkKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBbIHR5cGUgKyBcInF1ZXVlXCIsIGtleSBdICk7XG5cdFx0XHR9IClcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRxdWV1ZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIHNldHRlciA9IDI7XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0ZGF0YSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gXCJmeFwiO1xuXHRcdFx0c2V0dGVyLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoIDwgc2V0dGVyICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1sgMCBdLCB0eXBlICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHR0aGlzIDpcblx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApO1xuXG5cdFx0XHRcdC8vIEVuc3VyZSBhIGhvb2tzIGZvciB0aGlzIHF1ZXVlXG5cdFx0XHRcdGpRdWVyeS5fcXVldWVIb29rcyggdGhpcywgdHlwZSApO1xuXG5cdFx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICYmIHF1ZXVlWyAwIF0gIT09IFwiaW5wcm9ncmVzc1wiICkge1xuXHRcdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0fSxcblx0ZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdH0gKTtcblx0fSxcblx0Y2xlYXJRdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMucXVldWUoIHR5cGUgfHwgXCJmeFwiLCBbXSApO1xuXHR9LFxuXG5cdC8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGVcblx0Ly8gYXJlIGVtcHRpZWQgKGZ4IGlzIHRoZSB0eXBlIGJ5IGRlZmF1bHQpXG5cdHByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmogKSB7XG5cdFx0dmFyIHRtcCxcblx0XHRcdGNvdW50ID0gMSxcblx0XHRcdGRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksXG5cdFx0XHRlbGVtZW50cyA9IHRoaXMsXG5cdFx0XHRpID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRyZXNvbHZlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggISggLS1jb3VudCApICkge1xuXHRcdFx0XHRcdGRlZmVyLnJlc29sdmVXaXRoKCBlbGVtZW50cywgWyBlbGVtZW50cyBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0b2JqID0gdHlwZTtcblx0XHRcdHR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0dG1wID0gZGF0YVByaXYuZ2V0KCBlbGVtZW50c1sgaSBdLCB0eXBlICsgXCJxdWV1ZUhvb2tzXCIgKTtcblx0XHRcdGlmICggdG1wICYmIHRtcC5lbXB0eSApIHtcblx0XHRcdFx0Y291bnQrKztcblx0XHRcdFx0dG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXNvbHZlKCk7XG5cdFx0cmV0dXJuIGRlZmVyLnByb21pc2UoIG9iaiApO1xuXHR9XG59ICk7XG52YXIgcG51bSA9ICggL1srLV0/KD86XFxkKlxcLnwpXFxkKyg/OltlRV1bKy1dP1xcZCt8KS8gKS5zb3VyY2U7XG5cbnZhciByY3NzTnVtID0gbmV3IFJlZ0V4cCggXCJeKD86KFsrLV0pPXwpKFwiICsgcG51bSArIFwiKShbYS16JV0qKSRcIiwgXCJpXCIgKTtcblxuXG52YXIgY3NzRXhwYW5kID0gWyBcIlRvcFwiLCBcIlJpZ2h0XCIsIFwiQm90dG9tXCIsIFwiTGVmdFwiIF07XG5cbnZhciBkb2N1bWVudEVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cblxuXG5cdHZhciBpc0F0dGFjaGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblx0XHR9LFxuXHRcdGNvbXBvc2VkID0geyBjb21wb3NlZDogdHJ1ZSB9O1xuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSssIEVkZ2UgMTIgLSAxOCssIGlPUyAxMC4wIC0gMTAuMiBvbmx5XG5cdC8vIENoZWNrIGF0dGFjaG1lbnQgYWNyb3NzIHNoYWRvdyBET00gYm91bmRhcmllcyB3aGVuIHBvc3NpYmxlIChnaC0zNTA0KVxuXHQvLyBTdXBwb3J0OiBpT1MgMTAuMC0xMC4yIG9ubHlcblx0Ly8gRWFybHkgaU9TIDEwIHZlcnNpb25zIHN1cHBvcnQgYGF0dGFjaFNoYWRvd2AgYnV0IG5vdCBgZ2V0Um9vdE5vZGVgLFxuXHQvLyBsZWFkaW5nIHRvIGVycm9ycy4gV2UgbmVlZCB0byBjaGVjayBmb3IgYGdldFJvb3ROb2RlYC5cblx0aWYgKCBkb2N1bWVudEVsZW1lbnQuZ2V0Um9vdE5vZGUgKSB7XG5cdFx0aXNBdHRhY2hlZCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgfHxcblx0XHRcdFx0ZWxlbS5nZXRSb290Tm9kZSggY29tcG9zZWQgKSA9PT0gZWxlbS5vd25lckRvY3VtZW50O1xuXHRcdH07XG5cdH1cbnZhciBpc0hpZGRlbldpdGhpblRyZWUgPSBmdW5jdGlvbiggZWxlbSwgZWwgKSB7XG5cblx0XHQvLyBpc0hpZGRlbldpdGhpblRyZWUgbWlnaHQgYmUgY2FsbGVkIGZyb20galF1ZXJ5I2ZpbHRlciBmdW5jdGlvbjtcblx0XHQvLyBpbiB0aGF0IGNhc2UsIGVsZW1lbnQgd2lsbCBiZSBzZWNvbmQgYXJndW1lbnRcblx0XHRlbGVtID0gZWwgfHwgZWxlbTtcblxuXHRcdC8vIElubGluZSBzdHlsZSB0cnVtcHMgYWxsXG5cdFx0cmV0dXJuIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJub25lXCIgfHxcblx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiAmJlxuXG5cdFx0XHQvLyBPdGhlcndpc2UsIGNoZWNrIGNvbXB1dGVkIHN0eWxlXG5cdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9NDMgLSA0NVxuXHRcdFx0Ly8gRGlzY29ubmVjdGVkIGVsZW1lbnRzIGNhbiBoYXZlIGNvbXB1dGVkIGRpc3BsYXk6IG5vbmUsIHNvIGZpcnN0IGNvbmZpcm0gdGhhdCBlbGVtIGlzXG5cdFx0XHQvLyBpbiB0aGUgZG9jdW1lbnQuXG5cdFx0XHRpc0F0dGFjaGVkKCBlbGVtICkgJiZcblxuXHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSA9PT0gXCJub25lXCI7XG5cdH07XG5cbnZhciBzd2FwID0gZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGNhbGxiYWNrLCBhcmdzICkge1xuXHR2YXIgcmV0LCBuYW1lLFxuXHRcdG9sZCA9IHt9O1xuXG5cdC8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lc1xuXHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0b2xkWyBuYW1lIF0gPSBlbGVtLnN0eWxlWyBuYW1lIF07XG5cdFx0ZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdO1xuXHR9XG5cblx0cmV0ID0gY2FsbGJhY2suYXBwbHkoIGVsZW0sIGFyZ3MgfHwgW10gKTtcblxuXHQvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXNcblx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdGVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdO1xuXHR9XG5cblx0cmV0dXJuIHJldDtcbn07XG5cblxuXG5cbmZ1bmN0aW9uIGFkanVzdENTUyggZWxlbSwgcHJvcCwgdmFsdWVQYXJ0cywgdHdlZW4gKSB7XG5cdHZhciBhZGp1c3RlZCwgc2NhbGUsXG5cdFx0bWF4SXRlcmF0aW9ucyA9IDIwLFxuXHRcdGN1cnJlbnRWYWx1ZSA9IHR3ZWVuID9cblx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gdHdlZW4uY3VyKCk7XG5cdFx0XHR9IDpcblx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4galF1ZXJ5LmNzcyggZWxlbSwgcHJvcCwgXCJcIiApO1xuXHRcdFx0fSxcblx0XHRpbml0aWFsID0gY3VycmVudFZhbHVlKCksXG5cdFx0dW5pdCA9IHZhbHVlUGFydHMgJiYgdmFsdWVQYXJ0c1sgMyBdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gXCJcIiA6IFwicHhcIiApLFxuXG5cdFx0Ly8gU3RhcnRpbmcgdmFsdWUgY29tcHV0YXRpb24gaXMgcmVxdWlyZWQgZm9yIHBvdGVudGlhbCB1bml0IG1pc21hdGNoZXNcblx0XHRpbml0aWFsSW5Vbml0ID0gZWxlbS5ub2RlVHlwZSAmJlxuXHRcdFx0KCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gfHwgdW5pdCAhPT0gXCJweFwiICYmICtpbml0aWFsICkgJiZcblx0XHRcdHJjc3NOdW0uZXhlYyggalF1ZXJ5LmNzcyggZWxlbSwgcHJvcCApICk7XG5cblx0aWYgKCBpbml0aWFsSW5Vbml0ICYmIGluaXRpYWxJblVuaXRbIDMgXSAhPT0gdW5pdCApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD01NFxuXHRcdC8vIEhhbHZlIHRoZSBpdGVyYXRpb24gdGFyZ2V0IHZhbHVlIHRvIHByZXZlbnQgaW50ZXJmZXJlbmNlIGZyb20gQ1NTIHVwcGVyIGJvdW5kcyAoZ2gtMjE0NClcblx0XHRpbml0aWFsID0gaW5pdGlhbCAvIDI7XG5cblx0XHQvLyBUcnVzdCB1bml0cyByZXBvcnRlZCBieSBqUXVlcnkuY3NzXG5cdFx0dW5pdCA9IHVuaXQgfHwgaW5pdGlhbEluVW5pdFsgMyBdO1xuXG5cdFx0Ly8gSXRlcmF0aXZlbHkgYXBwcm94aW1hdGUgZnJvbSBhIG5vbnplcm8gc3RhcnRpbmcgcG9pbnRcblx0XHRpbml0aWFsSW5Vbml0ID0gK2luaXRpYWwgfHwgMTtcblxuXHRcdHdoaWxlICggbWF4SXRlcmF0aW9ucy0tICkge1xuXG5cdFx0XHQvLyBFdmFsdWF0ZSBhbmQgdXBkYXRlIG91ciBiZXN0IGd1ZXNzIChkb3VibGluZyBndWVzc2VzIHRoYXQgemVybyBvdXQpLlxuXHRcdFx0Ly8gRmluaXNoIGlmIHRoZSBzY2FsZSBlcXVhbHMgb3IgY3Jvc3NlcyAxIChtYWtpbmcgdGhlIG9sZCpuZXcgcHJvZHVjdCBub24tcG9zaXRpdmUpLlxuXHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBpbml0aWFsSW5Vbml0ICsgdW5pdCApO1xuXHRcdFx0aWYgKCAoIDEgLSBzY2FsZSApICogKCAxIC0gKCBzY2FsZSA9IGN1cnJlbnRWYWx1ZSgpIC8gaW5pdGlhbCB8fCAwLjUgKSApIDw9IDAgKSB7XG5cdFx0XHRcdG1heEl0ZXJhdGlvbnMgPSAwO1xuXHRcdFx0fVxuXHRcdFx0aW5pdGlhbEluVW5pdCA9IGluaXRpYWxJblVuaXQgLyBzY2FsZTtcblxuXHRcdH1cblxuXHRcdGluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0ICogMjtcblx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIGluaXRpYWxJblVuaXQgKyB1bml0ICk7XG5cblx0XHQvLyBNYWtlIHN1cmUgd2UgdXBkYXRlIHRoZSB0d2VlbiBwcm9wZXJ0aWVzIGxhdGVyIG9uXG5cdFx0dmFsdWVQYXJ0cyA9IHZhbHVlUGFydHMgfHwgW107XG5cdH1cblxuXHRpZiAoIHZhbHVlUGFydHMgKSB7XG5cdFx0aW5pdGlhbEluVW5pdCA9ICtpbml0aWFsSW5Vbml0IHx8ICtpbml0aWFsIHx8IDA7XG5cblx0XHQvLyBBcHBseSByZWxhdGl2ZSBvZmZzZXQgKCs9Ly09KSBpZiBzcGVjaWZpZWRcblx0XHRhZGp1c3RlZCA9IHZhbHVlUGFydHNbIDEgXSA/XG5cdFx0XHRpbml0aWFsSW5Vbml0ICsgKCB2YWx1ZVBhcnRzWyAxIF0gKyAxICkgKiB2YWx1ZVBhcnRzWyAyIF0gOlxuXHRcdFx0K3ZhbHVlUGFydHNbIDIgXTtcblx0XHRpZiAoIHR3ZWVuICkge1xuXHRcdFx0dHdlZW4udW5pdCA9IHVuaXQ7XG5cdFx0XHR0d2Vlbi5zdGFydCA9IGluaXRpYWxJblVuaXQ7XG5cdFx0XHR0d2Vlbi5lbmQgPSBhZGp1c3RlZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGFkanVzdGVkO1xufVxuXG5cbnZhciBkZWZhdWx0RGlzcGxheU1hcCA9IHt9O1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0RGlzcGxheSggZWxlbSApIHtcblx0dmFyIHRlbXAsXG5cdFx0ZG9jID0gZWxlbS5vd25lckRvY3VtZW50LFxuXHRcdG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZSxcblx0XHRkaXNwbGF5ID0gZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF07XG5cblx0aWYgKCBkaXNwbGF5ICkge1xuXHRcdHJldHVybiBkaXNwbGF5O1xuXHR9XG5cblx0dGVtcCA9IGRvYy5ib2R5LmFwcGVuZENoaWxkKCBkb2MuY3JlYXRlRWxlbWVudCggbm9kZU5hbWUgKSApO1xuXHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggdGVtcCwgXCJkaXNwbGF5XCIgKTtcblxuXHR0ZW1wLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHRlbXAgKTtcblxuXHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdGRpc3BsYXkgPSBcImJsb2NrXCI7XG5cdH1cblx0ZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF0gPSBkaXNwbGF5O1xuXG5cdHJldHVybiBkaXNwbGF5O1xufVxuXG5mdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7XG5cdHZhciBkaXNwbGF5LCBlbGVtLFxuXHRcdHZhbHVlcyA9IFtdLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XG5cblx0Ly8gRGV0ZXJtaW5lIG5ldyBkaXNwbGF5IHZhbHVlIGZvciBlbGVtZW50cyB0aGF0IG5lZWQgdG8gY2hhbmdlXG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0ZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdO1xuXHRcdGlmICggIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5O1xuXHRcdGlmICggc2hvdyApIHtcblxuXHRcdFx0Ly8gU2luY2Ugd2UgZm9yY2UgdmlzaWJpbGl0eSB1cG9uIGNhc2NhZGUtaGlkZGVuIGVsZW1lbnRzLCBhbiBpbW1lZGlhdGUgKGFuZCBzbG93KVxuXHRcdFx0Ly8gY2hlY2sgaXMgcmVxdWlyZWQgaW4gdGhpcyBmaXJzdCBsb29wIHVubGVzcyB3ZSBoYXZlIGEgbm9uZW1wdHkgZGlzcGxheSB2YWx1ZSAoZWl0aGVyXG5cdFx0XHQvLyBpbmxpbmUgb3IgYWJvdXQtdG8tYmUtcmVzdG9yZWQpXG5cdFx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBkYXRhUHJpdi5nZXQoIGVsZW0sIFwiZGlzcGxheVwiICkgfHwgbnVsbDtcblx0XHRcdFx0aWYgKCAhdmFsdWVzWyBpbmRleCBdICkge1xuXHRcdFx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICggZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIlwiICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBnZXREZWZhdWx0RGlzcGxheSggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIGRpc3BsYXkgIT09IFwibm9uZVwiICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBcIm5vbmVcIjtcblxuXHRcdFx0XHQvLyBSZW1lbWJlciB3aGF0IHdlJ3JlIG92ZXJ3cml0aW5nXG5cdFx0XHRcdGRhdGFQcml2LnNldCggZWxlbSwgXCJkaXNwbGF5XCIsIGRpc3BsYXkgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBTZXQgdGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AgdG8gYXZvaWQgY29uc3RhbnQgcmVmbG93XG5cdGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0aWYgKCB2YWx1ZXNbIGluZGV4IF0gIT0gbnVsbCApIHtcblx0XHRcdGVsZW1lbnRzWyBpbmRleCBdLnN0eWxlLmRpc3BsYXkgPSB2YWx1ZXNbIGluZGV4IF07XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW1lbnRzO1xufVxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHNob3c6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApO1xuXHR9LFxuXHRoaWRlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMgKTtcblx0fSxcblx0dG9nZ2xlOiBmdW5jdGlvbiggc3RhdGUgKSB7XG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGUgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdFx0cmV0dXJuIHN0YXRlID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggaXNIaWRkZW5XaXRoaW5UcmVlKCB0aGlzICkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnNob3coKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLmhpZGUoKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcbnZhciByY2hlY2thYmxlVHlwZSA9ICggL14oPzpjaGVja2JveHxyYWRpbykkL2kgKTtcblxudmFyIHJ0YWdOYW1lID0gKCAvPChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSopL2kgKTtcblxudmFyIHJzY3JpcHRUeXBlID0gKCAvXiR8Xm1vZHVsZSR8XFwvKD86amF2YXxlY21hKXNjcmlwdC9pICk7XG5cblxuXG4vLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKVxudmFyIHdyYXBNYXAgPSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0b3B0aW9uOiBbIDEsIFwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPlwiLCBcIjwvc2VsZWN0PlwiIF0sXG5cblx0Ly8gWEhUTUwgcGFyc2VycyBkbyBub3QgbWFnaWNhbGx5IGluc2VydCBlbGVtZW50cyBpbiB0aGVcblx0Ly8gc2FtZSB3YXkgdGhhdCB0YWcgc291cCBwYXJzZXJzIGRvLiBTbyB3ZSBjYW5ub3Qgc2hvcnRlblxuXHQvLyB0aGlzIGJ5IG9taXR0aW5nIDx0Ym9keT4gb3Igb3RoZXIgcmVxdWlyZWQgZWxlbWVudHMuXG5cdHRoZWFkOiBbIDEsIFwiPHRhYmxlPlwiLCBcIjwvdGFibGU+XCIgXSxcblx0Y29sOiBbIDIsIFwiPHRhYmxlPjxjb2xncm91cD5cIiwgXCI8L2NvbGdyb3VwPjwvdGFibGU+XCIgXSxcblx0dHI6IFsgMiwgXCI8dGFibGU+PHRib2R5PlwiLCBcIjwvdGJvZHk+PC90YWJsZT5cIiBdLFxuXHR0ZDogWyAzLCBcIjx0YWJsZT48dGJvZHk+PHRyPlwiLCBcIjwvdHI+PC90Ym9keT48L3RhYmxlPlwiIF0sXG5cblx0X2RlZmF1bHQ6IFsgMCwgXCJcIiwgXCJcIiBdXG59O1xuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxud3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uO1xuXG53cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkO1xud3JhcE1hcC50aCA9IHdyYXBNYXAudGQ7XG5cblxuZnVuY3Rpb24gZ2V0QWxsKCBjb250ZXh0LCB0YWcgKSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHQvLyBVc2UgdHlwZW9mIHRvIGF2b2lkIHplcm8tYXJndW1lbnQgbWV0aG9kIGludm9jYXRpb24gb24gaG9zdCBvYmplY3RzICgjMTUxNTEpXG5cdHZhciByZXQ7XG5cblx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRyZXQgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgfHwgXCIqXCIgKTtcblxuXHR9IGVsc2UgaWYgKCB0eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdHJldCA9IGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnIHx8IFwiKlwiICk7XG5cblx0fSBlbHNlIHtcblx0XHRyZXQgPSBbXTtcblx0fVxuXG5cdGlmICggdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIG5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSApIHtcblx0XHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0ICk7XG5cdH1cblxuXHRyZXR1cm4gcmV0O1xufVxuXG5cbi8vIE1hcmsgc2NyaXB0cyBhcyBoYXZpbmcgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZFxuZnVuY3Rpb24gc2V0R2xvYmFsRXZhbCggZWxlbXMsIHJlZkVsZW1lbnRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bCA9IGVsZW1zLmxlbmd0aDtcblxuXHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0ZGF0YVByaXYuc2V0KFxuXHRcdFx0ZWxlbXNbIGkgXSxcblx0XHRcdFwiZ2xvYmFsRXZhbFwiLFxuXHRcdFx0IXJlZkVsZW1lbnRzIHx8IGRhdGFQcml2LmdldCggcmVmRWxlbWVudHNbIGkgXSwgXCJnbG9iYWxFdmFsXCIgKVxuXHRcdCk7XG5cdH1cbn1cblxuXG52YXIgcmh0bWwgPSAvPHwmIz9cXHcrOy87XG5cbmZ1bmN0aW9uIGJ1aWxkRnJhZ21lbnQoIGVsZW1zLCBjb250ZXh0LCBzY3JpcHRzLCBzZWxlY3Rpb24sIGlnbm9yZWQgKSB7XG5cdHZhciBlbGVtLCB0bXAsIHRhZywgd3JhcCwgYXR0YWNoZWQsIGosXG5cdFx0ZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRub2RlcyA9IFtdLFxuXHRcdGkgPSAwLFxuXHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdGVsZW0gPSBlbGVtc1sgaSBdO1xuXG5cdFx0aWYgKCBlbGVtIHx8IGVsZW0gPT09IDAgKSB7XG5cblx0XHRcdC8vIEFkZCBub2RlcyBkaXJlY3RseVxuXHRcdFx0aWYgKCB0b1R5cGUoIGVsZW0gKSA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdFx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIG5vZGVzLCBlbGVtLm5vZGVUeXBlID8gWyBlbGVtIF0gOiBlbGVtICk7XG5cblx0XHRcdC8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZVxuXHRcdFx0fSBlbHNlIGlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHtcblx0XHRcdFx0bm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7XG5cblx0XHRcdC8vIENvbnZlcnQgaHRtbCBpbnRvIERPTSBub2Rlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dG1wID0gdG1wIHx8IGZyYWdtZW50LmFwcGVuZENoaWxkKCBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSApO1xuXG5cdFx0XHRcdC8vIERlc2VyaWFsaXplIGEgc3RhbmRhcmQgcmVwcmVzZW50YXRpb25cblx0XHRcdFx0dGFnID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdHdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0O1xuXHRcdFx0XHR0bXAuaW5uZXJIVE1MID0gd3JhcFsgMSBdICsgalF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIGVsZW0gKSArIHdyYXBbIDIgXTtcblxuXHRcdFx0XHQvLyBEZXNjZW5kIHRocm91Z2ggd3JhcHBlcnMgdG8gdGhlIHJpZ2h0IGNvbnRlbnRcblx0XHRcdFx0aiA9IHdyYXBbIDAgXTtcblx0XHRcdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRcdFx0dG1wID0gdG1wLmxhc3RDaGlsZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggbm9kZXMsIHRtcC5jaGlsZE5vZGVzICk7XG5cblx0XHRcdFx0Ly8gUmVtZW1iZXIgdGhlIHRvcC1sZXZlbCBjb250YWluZXJcblx0XHRcdFx0dG1wID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdFx0XHQvLyBFbnN1cmUgdGhlIGNyZWF0ZWQgbm9kZXMgYXJlIG9ycGhhbmVkICgjMTIzOTIpXG5cdFx0XHRcdHRtcC50ZXh0Q29udGVudCA9IFwiXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudFxuXHRmcmFnbWVudC50ZXh0Q29udGVudCA9IFwiXCI7XG5cblx0aSA9IDA7XG5cdHdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7XG5cblx0XHQvLyBTa2lwIGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGNvbnRleHQgY29sbGVjdGlvbiAodHJhYy00MDg3KVxuXHRcdGlmICggc2VsZWN0aW9uICYmIGpRdWVyeS5pbkFycmF5KCBlbGVtLCBzZWxlY3Rpb24gKSA+IC0xICkge1xuXHRcdFx0aWYgKCBpZ25vcmVkICkge1xuXHRcdFx0XHRpZ25vcmVkLnB1c2goIGVsZW0gKTtcblx0XHRcdH1cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGF0dGFjaGVkID0gaXNBdHRhY2hlZCggZWxlbSApO1xuXG5cdFx0Ly8gQXBwZW5kIHRvIGZyYWdtZW50XG5cdFx0dG1wID0gZ2V0QWxsKCBmcmFnbWVudC5hcHBlbmRDaGlsZCggZWxlbSApLCBcInNjcmlwdFwiICk7XG5cblx0XHQvLyBQcmVzZXJ2ZSBzY3JpcHQgZXZhbHVhdGlvbiBoaXN0b3J5XG5cdFx0aWYgKCBhdHRhY2hlZCApIHtcblx0XHRcdHNldEdsb2JhbEV2YWwoIHRtcCApO1xuXHRcdH1cblxuXHRcdC8vIENhcHR1cmUgZXhlY3V0YWJsZXNcblx0XHRpZiAoIHNjcmlwdHMgKSB7XG5cdFx0XHRqID0gMDtcblx0XHRcdHdoaWxlICggKCBlbGVtID0gdG1wWyBqKysgXSApICkge1xuXHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIGVsZW0udHlwZSB8fCBcIlwiICkgKSB7XG5cdFx0XHRcdFx0c2NyaXB0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZnJhZ21lbnQ7XG59XG5cblxuKCBmdW5jdGlvbigpIHtcblx0dmFyIGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuXHRcdGRpdiA9IGZyYWdtZW50LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkgKSxcblx0XHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHlcblx0Ly8gQ2hlY2sgc3RhdGUgbG9zdCBpZiB0aGUgbmFtZSBpcyBzZXQgKCMxMTIxNylcblx0Ly8gU3VwcG9ydDogV2luZG93cyBXZWIgQXBwcyAoV1dBKVxuXHQvLyBgbmFtZWAgYW5kIGB0eXBlYCBtdXN0IHVzZSAuc2V0QXR0cmlidXRlIGZvciBXV0EgKCMxNDkwMSlcblx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJyYWRpb1wiICk7XG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJjaGVja2VkXCIsIFwiY2hlY2tlZFwiICk7XG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJuYW1lXCIsIFwidFwiICk7XG5cblx0ZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApO1xuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgb25seVxuXHQvLyBPbGRlciBXZWJLaXQgZG9lc24ndCBjbG9uZSBjaGVja2VkIHN0YXRlIGNvcnJlY3RseSBpbiBmcmFnbWVudHNcblx0c3VwcG9ydC5jaGVja0Nsb25lID0gZGl2LmNsb25lTm9kZSggdHJ1ZSApLmNsb25lTm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5jaGVja2VkO1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuXHQvLyBNYWtlIHN1cmUgdGV4dGFyZWEgKGFuZCBjaGVja2JveCkgZGVmYXVsdFZhbHVlIGlzIHByb3Blcmx5IGNsb25lZFxuXHRkaXYuaW5uZXJIVE1MID0gXCI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+XCI7XG5cdHN1cHBvcnQubm9DbG9uZUNoZWNrZWQgPSAhIWRpdi5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlO1xufSApKCk7XG5cblxudmFyXG5cdHJrZXlFdmVudCA9IC9ea2V5Lyxcblx0cm1vdXNlRXZlbnQgPSAvXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnV8ZHJhZ3xkcm9wKXxjbGljay8sXG5cdHJ0eXBlbmFtZXNwYWNlID0gL14oW14uXSopKD86XFwuKC4rKXwpLztcblxuZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHtcblx0cmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJldHVybkZhbHNlKCkge1xuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8vIFN1cHBvcnQ6IElFIDw9OSAtIDExK1xuLy8gZm9jdXMoKSBhbmQgYmx1cigpIGFyZSBhc3luY2hyb25vdXMsIGV4Y2VwdCB3aGVuIHRoZXkgYXJlIG5vLW9wLlxuLy8gU28gZXhwZWN0IGZvY3VzIHRvIGJlIHN5bmNocm9ub3VzIHdoZW4gdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBhY3RpdmUsXG4vLyBhbmQgYmx1ciB0byBiZSBzeW5jaHJvbm91cyB3aGVuIHRoZSBlbGVtZW50IGlzIG5vdCBhbHJlYWR5IGFjdGl2ZS5cbi8vIChmb2N1cyBhbmQgYmx1ciBhcmUgYWx3YXlzIHN5bmNocm9ub3VzIGluIG90aGVyIHN1cHBvcnRlZCBicm93c2Vycyxcbi8vIHRoaXMganVzdCBkZWZpbmVzIHdoZW4gd2UgY2FuIGNvdW50IG9uIGl0KS5cbmZ1bmN0aW9uIGV4cGVjdFN5bmMoIGVsZW0sIHR5cGUgKSB7XG5cdHJldHVybiAoIGVsZW0gPT09IHNhZmVBY3RpdmVFbGVtZW50KCkgKSA9PT0gKCB0eXBlID09PSBcImZvY3VzXCIgKTtcbn1cblxuLy8gU3VwcG9ydDogSUUgPD05IG9ubHlcbi8vIEFjY2Vzc2luZyBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGNhbiB0aHJvdyB1bmV4cGVjdGVkbHlcbi8vIGh0dHBzOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMzM5M1xuZnVuY3Rpb24gc2FmZUFjdGl2ZUVsZW1lbnQoKSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cdH0gY2F0Y2ggKCBlcnIgKSB7IH1cbn1cblxuZnVuY3Rpb24gb24oIGVsZW0sIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIG9uZSApIHtcblx0dmFyIG9yaWdGbiwgdHlwZTtcblxuXHQvLyBUeXBlcyBjYW4gYmUgYSBtYXAgb2YgdHlwZXMvaGFuZGxlcnNcblx0aWYgKCB0eXBlb2YgdHlwZXMgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHQvLyAoIHR5cGVzLU9iamVjdCwgc2VsZWN0b3IsIGRhdGEgKVxuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzLU9iamVjdCwgZGF0YSApXG5cdFx0XHRkYXRhID0gZGF0YSB8fCBzZWxlY3Rvcjtcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRmb3IgKCB0eXBlIGluIHR5cGVzICkge1xuXHRcdFx0b24oIGVsZW0sIHR5cGUsIHNlbGVjdG9yLCBkYXRhLCB0eXBlc1sgdHlwZSBdLCBvbmUgKTtcblx0XHR9XG5cdFx0cmV0dXJuIGVsZW07XG5cdH1cblxuXHRpZiAoIGRhdGEgPT0gbnVsbCAmJiBmbiA9PSBudWxsICkge1xuXG5cdFx0Ly8gKCB0eXBlcywgZm4gKVxuXHRcdGZuID0gc2VsZWN0b3I7XG5cdFx0ZGF0YSA9IHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKCBmbiA9PSBudWxsICkge1xuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzLCBzZWxlY3RvciwgZm4gKVxuXHRcdFx0Zm4gPSBkYXRhO1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyAoIHR5cGVzLCBkYXRhLCBmbiApXG5cdFx0XHRmbiA9IGRhdGE7XG5cdFx0XHRkYXRhID0gc2VsZWN0b3I7XG5cdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0aWYgKCBmbiA9PT0gZmFsc2UgKSB7XG5cdFx0Zm4gPSByZXR1cm5GYWxzZTtcblx0fSBlbHNlIGlmICggIWZuICkge1xuXHRcdHJldHVybiBlbGVtO1xuXHR9XG5cblx0aWYgKCBvbmUgPT09IDEgKSB7XG5cdFx0b3JpZ0ZuID0gZm47XG5cdFx0Zm4gPSBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHRcdC8vIENhbiB1c2UgYW4gZW1wdHkgc2V0LCBzaW5jZSBldmVudCBjb250YWlucyB0aGUgaW5mb1xuXHRcdFx0alF1ZXJ5KCkub2ZmKCBldmVudCApO1xuXHRcdFx0cmV0dXJuIG9yaWdGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0fTtcblxuXHRcdC8vIFVzZSBzYW1lIGd1aWQgc28gY2FsbGVyIGNhbiByZW1vdmUgdXNpbmcgb3JpZ0ZuXG5cdFx0Zm4uZ3VpZCA9IG9yaWdGbi5ndWlkIHx8ICggb3JpZ0ZuLmd1aWQgPSBqUXVlcnkuZ3VpZCsrICk7XG5cdH1cblx0cmV0dXJuIGVsZW0uZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0alF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgdHlwZXMsIGZuLCBkYXRhLCBzZWxlY3RvciApO1xuXHR9ICk7XG59XG5cbi8qXG4gKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyBldmVudHMgLS0gbm90IHBhcnQgb2YgdGhlIHB1YmxpYyBpbnRlcmZhY2UuXG4gKiBQcm9wcyB0byBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkgZm9yIG1hbnkgb2YgdGhlIGlkZWFzLlxuICovXG5qUXVlcnkuZXZlbnQgPSB7XG5cblx0Z2xvYmFsOiB7fSxcblxuXHRhZGQ6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgZGF0YSwgc2VsZWN0b3IgKSB7XG5cblx0XHR2YXIgaGFuZGxlT2JqSW4sIGV2ZW50SGFuZGxlLCB0bXAsXG5cdFx0XHRldmVudHMsIHQsIGhhbmRsZU9iaixcblx0XHRcdHNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSxcblx0XHRcdGVsZW1EYXRhID0gZGF0YVByaXYuZ2V0KCBlbGVtICk7XG5cblx0XHQvLyBEb24ndCBhdHRhY2ggZXZlbnRzIHRvIG5vRGF0YSBvciB0ZXh0L2NvbW1lbnQgbm9kZXMgKGJ1dCBhbGxvdyBwbGFpbiBvYmplY3RzKVxuXHRcdGlmICggIWVsZW1EYXRhICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBvYmplY3Qgb2YgY3VzdG9tIGRhdGEgaW4gbGlldSBvZiB0aGUgaGFuZGxlclxuXHRcdGlmICggaGFuZGxlci5oYW5kbGVyICkge1xuXHRcdFx0aGFuZGxlT2JqSW4gPSBoYW5kbGVyO1xuXHRcdFx0aGFuZGxlciA9IGhhbmRsZU9iakluLmhhbmRsZXI7XG5cdFx0XHRzZWxlY3RvciA9IGhhbmRsZU9iakluLnNlbGVjdG9yO1xuXHRcdH1cblxuXHRcdC8vIEVuc3VyZSB0aGF0IGludmFsaWQgc2VsZWN0b3JzIHRocm93IGV4Y2VwdGlvbnMgYXQgYXR0YWNoIHRpbWVcblx0XHQvLyBFdmFsdWF0ZSBhZ2FpbnN0IGRvY3VtZW50RWxlbWVudCBpbiBjYXNlIGVsZW0gaXMgYSBub24tZWxlbWVudCBub2RlIChlLmcuLCBkb2N1bWVudClcblx0XHRpZiAoIHNlbGVjdG9yICkge1xuXHRcdFx0alF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKCBkb2N1bWVudEVsZW1lbnQsIHNlbGVjdG9yICk7XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgdGhlIGhhbmRsZXIgaGFzIGEgdW5pcXVlIElELCB1c2VkIHRvIGZpbmQvcmVtb3ZlIGl0IGxhdGVyXG5cdFx0aWYgKCAhaGFuZGxlci5ndWlkICkge1xuXHRcdFx0aGFuZGxlci5ndWlkID0galF1ZXJ5Lmd1aWQrKztcblx0XHR9XG5cblx0XHQvLyBJbml0IHRoZSBlbGVtZW50J3MgZXZlbnQgc3RydWN0dXJlIGFuZCBtYWluIGhhbmRsZXIsIGlmIHRoaXMgaXMgdGhlIGZpcnN0XG5cdFx0aWYgKCAhKCBldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgKSApIHtcblx0XHRcdGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyA9IHt9O1xuXHRcdH1cblx0XHRpZiAoICEoIGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlICkgKSB7XG5cdFx0XHRldmVudEhhbmRsZSA9IGVsZW1EYXRhLmhhbmRsZSA9IGZ1bmN0aW9uKCBlICkge1xuXG5cdFx0XHRcdC8vIERpc2NhcmQgdGhlIHNlY29uZCBldmVudCBvZiBhIGpRdWVyeS5ldmVudC50cmlnZ2VyKCkgYW5kXG5cdFx0XHRcdC8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWRcblx0XHRcdFx0cmV0dXJuIHR5cGVvZiBqUXVlcnkgIT09IFwidW5kZWZpbmVkXCIgJiYgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCAhPT0gZS50eXBlID9cblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQuZGlzcGF0Y2guYXBwbHkoIGVsZW0sIGFyZ3VtZW50cyApIDogdW5kZWZpbmVkO1xuXHRcdFx0fTtcblx0XHR9XG5cblx0XHQvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlXG5cdFx0dHlwZXMgPSAoIHR5cGVzIHx8IFwiXCIgKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXHRcdHQgPSB0eXBlcy5sZW5ndGg7XG5cdFx0d2hpbGUgKCB0LS0gKSB7XG5cdFx0XHR0bXAgPSBydHlwZW5hbWVzcGFjZS5leGVjKCB0eXBlc1sgdCBdICkgfHwgW107XG5cdFx0XHR0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTtcblx0XHRcdG5hbWVzcGFjZXMgPSAoIHRtcFsgMiBdIHx8IFwiXCIgKS5zcGxpdCggXCIuXCIgKS5zb3J0KCk7XG5cblx0XHRcdC8vIFRoZXJlICptdXN0KiBiZSBhIHR5cGUsIG5vIGF0dGFjaGluZyBuYW1lc3BhY2Utb25seSBoYW5kbGVyc1xuXHRcdFx0aWYgKCAhdHlwZSApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGV2ZW50IGNoYW5nZXMgaXRzIHR5cGUsIHVzZSB0aGUgc3BlY2lhbCBldmVudCBoYW5kbGVycyBmb3IgdGhlIGNoYW5nZWQgdHlwZVxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cblx0XHRcdC8vIElmIHNlbGVjdG9yIGRlZmluZWQsIGRldGVybWluZSBzcGVjaWFsIGV2ZW50IGFwaSB0eXBlLCBvdGhlcndpc2UgZ2l2ZW4gdHlwZVxuXHRcdFx0dHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlO1xuXG5cdFx0XHQvLyBVcGRhdGUgc3BlY2lhbCBiYXNlZCBvbiBuZXdseSByZXNldCB0eXBlXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblxuXHRcdFx0Ly8gaGFuZGxlT2JqIGlzIHBhc3NlZCB0byBhbGwgZXZlbnQgaGFuZGxlcnNcblx0XHRcdGhhbmRsZU9iaiA9IGpRdWVyeS5leHRlbmQoIHtcblx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0b3JpZ1R5cGU6IG9yaWdUeXBlLFxuXHRcdFx0XHRkYXRhOiBkYXRhLFxuXHRcdFx0XHRoYW5kbGVyOiBoYW5kbGVyLFxuXHRcdFx0XHRndWlkOiBoYW5kbGVyLmd1aWQsXG5cdFx0XHRcdHNlbGVjdG9yOiBzZWxlY3Rvcixcblx0XHRcdFx0bmVlZHNDb250ZXh0OiBzZWxlY3RvciAmJiBqUXVlcnkuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSxcblx0XHRcdFx0bmFtZXNwYWNlOiBuYW1lc3BhY2VzLmpvaW4oIFwiLlwiIClcblx0XHRcdH0sIGhhbmRsZU9iakluICk7XG5cblx0XHRcdC8vIEluaXQgdGhlIGV2ZW50IGhhbmRsZXIgcXVldWUgaWYgd2UncmUgdGhlIGZpcnN0XG5cdFx0XHRpZiAoICEoIGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gKSApIHtcblx0XHRcdFx0aGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSA9IFtdO1xuXHRcdFx0XHRoYW5kbGVycy5kZWxlZ2F0ZUNvdW50ID0gMDtcblxuXHRcdFx0XHQvLyBPbmx5IHVzZSBhZGRFdmVudExpc3RlbmVyIGlmIHRoZSBzcGVjaWFsIGV2ZW50cyBoYW5kbGVyIHJldHVybnMgZmFsc2Vcblx0XHRcdFx0aWYgKCAhc3BlY2lhbC5zZXR1cCB8fFxuXHRcdFx0XHRcdHNwZWNpYWwuc2V0dXAuY2FsbCggZWxlbSwgZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGVsZW0uYWRkRXZlbnRMaXN0ZW5lciApIHtcblx0XHRcdFx0XHRcdGVsZW0uYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgZXZlbnRIYW5kbGUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBzcGVjaWFsLmFkZCApIHtcblx0XHRcdFx0c3BlY2lhbC5hZGQuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XG5cblx0XHRcdFx0aWYgKCAhaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCApIHtcblx0XHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlci5ndWlkID0gaGFuZGxlci5ndWlkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCB0byB0aGUgZWxlbWVudCdzIGhhbmRsZXIgbGlzdCwgZGVsZWdhdGVzIGluIGZyb250XG5cdFx0XHRpZiAoIHNlbGVjdG9yICkge1xuXHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGhhbmRsZXJzLmRlbGVnYXRlQ291bnQrKywgMCwgaGFuZGxlT2JqICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRoYW5kbGVycy5wdXNoKCBoYW5kbGVPYmogKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gS2VlcCB0cmFjayBvZiB3aGljaCBldmVudHMgaGF2ZSBldmVyIGJlZW4gdXNlZCwgZm9yIGV2ZW50IG9wdGltaXphdGlvblxuXHRcdFx0alF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdID0gdHJ1ZTtcblx0XHR9XG5cblx0fSxcblxuXHQvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnRcblx0cmVtb3ZlOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIHNlbGVjdG9yLCBtYXBwZWRUeXBlcyApIHtcblxuXHRcdHZhciBqLCBvcmlnQ291bnQsIHRtcCxcblx0XHRcdGV2ZW50cywgdCwgaGFuZGxlT2JqLFxuXHRcdFx0c3BlY2lhbCwgaGFuZGxlcnMsIHR5cGUsIG5hbWVzcGFjZXMsIG9yaWdUeXBlLFxuXHRcdFx0ZWxlbURhdGEgPSBkYXRhUHJpdi5oYXNEYXRhKCBlbGVtICkgJiYgZGF0YVByaXYuZ2V0KCBlbGVtICk7XG5cblx0XHRpZiAoICFlbGVtRGF0YSB8fCAhKCBldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBPbmNlIGZvciBlYWNoIHR5cGUubmFtZXNwYWNlIGluIHR5cGVzOyB0eXBlIG1heSBiZSBvbWl0dGVkXG5cdFx0dHlwZXMgPSAoIHR5cGVzIHx8IFwiXCIgKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXHRcdHQgPSB0eXBlcy5sZW5ndGg7XG5cdFx0d2hpbGUgKCB0LS0gKSB7XG5cdFx0XHR0bXAgPSBydHlwZW5hbWVzcGFjZS5leGVjKCB0eXBlc1sgdCBdICkgfHwgW107XG5cdFx0XHR0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTtcblx0XHRcdG5hbWVzcGFjZXMgPSAoIHRtcFsgMiBdIHx8IFwiXCIgKS5zcGxpdCggXCIuXCIgKS5zb3J0KCk7XG5cblx0XHRcdC8vIFVuYmluZCBhbGwgZXZlbnRzIChvbiB0aGlzIG5hbWVzcGFjZSwgaWYgcHJvdmlkZWQpIGZvciB0aGUgZWxlbWVudFxuXHRcdFx0aWYgKCAhdHlwZSApIHtcblx0XHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSArIHR5cGVzWyB0IF0sIGhhbmRsZXIsIHNlbGVjdG9yLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXHRcdFx0dHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlO1xuXHRcdFx0aGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSB8fCBbXTtcblx0XHRcdHRtcCA9IHRtcFsgMiBdICYmXG5cdFx0XHRcdG5ldyBSZWdFeHAoIFwiKF58XFxcXC4pXCIgKyBuYW1lc3BhY2VzLmpvaW4oIFwiXFxcXC4oPzouKlxcXFwufClcIiApICsgXCIoXFxcXC58JClcIiApO1xuXG5cdFx0XHQvLyBSZW1vdmUgbWF0Y2hpbmcgZXZlbnRzXG5cdFx0XHRvcmlnQ291bnQgPSBqID0gaGFuZGxlcnMubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRcdGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBqIF07XG5cblx0XHRcdFx0aWYgKCAoIG1hcHBlZFR5cGVzIHx8IG9yaWdUeXBlID09PSBoYW5kbGVPYmoub3JpZ1R5cGUgKSAmJlxuXHRcdFx0XHRcdCggIWhhbmRsZXIgfHwgaGFuZGxlci5ndWlkID09PSBoYW5kbGVPYmouZ3VpZCApICYmXG5cdFx0XHRcdFx0KCAhdG1wIHx8IHRtcC50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSAmJlxuXHRcdFx0XHRcdCggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgfHxcblx0XHRcdFx0XHRcdHNlbGVjdG9yID09PSBcIioqXCIgJiYgaGFuZGxlT2JqLnNlbGVjdG9yICkgKSB7XG5cdFx0XHRcdFx0aGFuZGxlcnMuc3BsaWNlKCBqLCAxICk7XG5cblx0XHRcdFx0XHRpZiAoIGhhbmRsZU9iai5zZWxlY3RvciApIHtcblx0XHRcdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQtLTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBzcGVjaWFsLnJlbW92ZSApIHtcblx0XHRcdFx0XHRcdHNwZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZW1vdmUgZ2VuZXJpYyBldmVudCBoYW5kbGVyIGlmIHdlIHJlbW92ZWQgc29tZXRoaW5nIGFuZCBubyBtb3JlIGhhbmRsZXJzIGV4aXN0XG5cdFx0XHQvLyAoYXZvaWRzIHBvdGVudGlhbCBmb3IgZW5kbGVzcyByZWN1cnNpb24gZHVyaW5nIHJlbW92YWwgb2Ygc3BlY2lhbCBldmVudCBoYW5kbGVycylcblx0XHRcdGlmICggb3JpZ0NvdW50ICYmICFoYW5kbGVycy5sZW5ndGggKSB7XG5cdFx0XHRcdGlmICggIXNwZWNpYWwudGVhcmRvd24gfHxcblx0XHRcdFx0XHRzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdGpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZWxlbURhdGEuaGFuZGxlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkZWxldGUgZXZlbnRzWyB0eXBlIF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUmVtb3ZlIGRhdGEgYW5kIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWRcblx0XHRpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBldmVudHMgKSApIHtcblx0XHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgXCJoYW5kbGUgZXZlbnRzXCIgKTtcblx0XHR9XG5cdH0sXG5cblx0ZGlzcGF0Y2g6IGZ1bmN0aW9uKCBuYXRpdmVFdmVudCApIHtcblxuXHRcdC8vIE1ha2UgYSB3cml0YWJsZSBqUXVlcnkuRXZlbnQgZnJvbSB0aGUgbmF0aXZlIGV2ZW50IG9iamVjdFxuXHRcdHZhciBldmVudCA9IGpRdWVyeS5ldmVudC5maXgoIG5hdGl2ZUV2ZW50ICk7XG5cblx0XHR2YXIgaSwgaiwgcmV0LCBtYXRjaGVkLCBoYW5kbGVPYmosIGhhbmRsZXJRdWV1ZSxcblx0XHRcdGFyZ3MgPSBuZXcgQXJyYXkoIGFyZ3VtZW50cy5sZW5ndGggKSxcblx0XHRcdGhhbmRsZXJzID0gKCBkYXRhUHJpdi5nZXQoIHRoaXMsIFwiZXZlbnRzXCIgKSB8fCB7fSApWyBldmVudC50eXBlIF0gfHwgW10sXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGV2ZW50LnR5cGUgXSB8fCB7fTtcblxuXHRcdC8vIFVzZSB0aGUgZml4LWVkIGpRdWVyeS5FdmVudCByYXRoZXIgdGhhbiB0aGUgKHJlYWQtb25seSkgbmF0aXZlIGV2ZW50XG5cdFx0YXJnc1sgMCBdID0gZXZlbnQ7XG5cblx0XHRmb3IgKCBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdGFyZ3NbIGkgXSA9IGFyZ3VtZW50c1sgaSBdO1xuXHRcdH1cblxuXHRcdGV2ZW50LmRlbGVnYXRlVGFyZ2V0ID0gdGhpcztcblxuXHRcdC8vIENhbGwgdGhlIHByZURpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZSwgYW5kIGxldCBpdCBiYWlsIGlmIGRlc2lyZWRcblx0XHRpZiAoIHNwZWNpYWwucHJlRGlzcGF0Y2ggJiYgc3BlY2lhbC5wcmVEaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApID09PSBmYWxzZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBEZXRlcm1pbmUgaGFuZGxlcnNcblx0XHRoYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQsIGhhbmRsZXJzICk7XG5cblx0XHQvLyBSdW4gZGVsZWdhdGVzIGZpcnN0OyB0aGV5IG1heSB3YW50IHRvIHN0b3AgcHJvcGFnYXRpb24gYmVuZWF0aCB1c1xuXHRcdGkgPSAwO1xuXHRcdHdoaWxlICggKCBtYXRjaGVkID0gaGFuZGxlclF1ZXVlWyBpKysgXSApICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0ZXZlbnQuY3VycmVudFRhcmdldCA9IG1hdGNoZWQuZWxlbTtcblxuXHRcdFx0aiA9IDA7XG5cdFx0XHR3aGlsZSAoICggaGFuZGxlT2JqID0gbWF0Y2hlZC5oYW5kbGVyc1sgaisrIF0gKSAmJlxuXHRcdFx0XHQhZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblxuXHRcdFx0XHQvLyBJZiB0aGUgZXZlbnQgaXMgbmFtZXNwYWNlZCwgdGhlbiBlYWNoIGhhbmRsZXIgaXMgb25seSBpbnZva2VkIGlmIGl0IGlzXG5cdFx0XHRcdC8vIHNwZWNpYWxseSB1bml2ZXJzYWwgb3IgaXRzIG5hbWVzcGFjZXMgYXJlIGEgc3VwZXJzZXQgb2YgdGhlIGV2ZW50J3MuXG5cdFx0XHRcdGlmICggIWV2ZW50LnJuYW1lc3BhY2UgfHwgaGFuZGxlT2JqLm5hbWVzcGFjZSA9PT0gZmFsc2UgfHxcblx0XHRcdFx0XHRldmVudC5ybmFtZXNwYWNlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHtcblxuXHRcdFx0XHRcdGV2ZW50LmhhbmRsZU9iaiA9IGhhbmRsZU9iajtcblx0XHRcdFx0XHRldmVudC5kYXRhID0gaGFuZGxlT2JqLmRhdGE7XG5cblx0XHRcdFx0XHRyZXQgPSAoICggalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGhhbmRsZU9iai5vcmlnVHlwZSBdIHx8IHt9ICkuaGFuZGxlIHx8XG5cdFx0XHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlciApLmFwcGx5KCBtYXRjaGVkLmVsZW0sIGFyZ3MgKTtcblxuXHRcdFx0XHRcdGlmICggcmV0ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICggZXZlbnQucmVzdWx0ID0gcmV0ICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWxsIHRoZSBwb3N0RGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlXG5cdFx0aWYgKCBzcGVjaWFsLnBvc3REaXNwYXRjaCApIHtcblx0XHRcdHNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHRoYW5kbGVyczogZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVycyApIHtcblx0XHR2YXIgaSwgaGFuZGxlT2JqLCBzZWwsIG1hdGNoZWRIYW5kbGVycywgbWF0Y2hlZFNlbGVjdG9ycyxcblx0XHRcdGhhbmRsZXJRdWV1ZSA9IFtdLFxuXHRcdFx0ZGVsZWdhdGVDb3VudCA9IGhhbmRsZXJzLmRlbGVnYXRlQ291bnQsXG5cdFx0XHRjdXIgPSBldmVudC50YXJnZXQ7XG5cblx0XHQvLyBGaW5kIGRlbGVnYXRlIGhhbmRsZXJzXG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50ICYmXG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OVxuXHRcdFx0Ly8gQmxhY2staG9sZSBTVkcgPHVzZT4gaW5zdGFuY2UgdHJlZXMgKHRyYWMtMTMxODApXG5cdFx0XHRjdXIubm9kZVR5cGUgJiZcblxuXHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA8PTQyXG5cdFx0XHQvLyBTdXBwcmVzcyBzcGVjLXZpb2xhdGluZyBjbGlja3MgaW5kaWNhdGluZyBhIG5vbi1wcmltYXJ5IHBvaW50ZXIgYnV0dG9uICh0cmFjLTM4NjEpXG5cdFx0XHQvLyBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudC10eXBlLWNsaWNrXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSBvbmx5XG5cdFx0XHQvLyAuLi5idXQgbm90IGFycm93IGtleSBcImNsaWNrc1wiIG9mIHJhZGlvIGlucHV0cywgd2hpY2ggY2FuIGhhdmUgYGJ1dHRvbmAgLTEgKGdoLTIzNDMpXG5cdFx0XHQhKCBldmVudC50eXBlID09PSBcImNsaWNrXCIgJiYgZXZlbnQuYnV0dG9uID49IDEgKSApIHtcblxuXHRcdFx0Zm9yICggOyBjdXIgIT09IHRoaXM7IGN1ciA9IGN1ci5wYXJlbnROb2RlIHx8IHRoaXMgKSB7XG5cblx0XHRcdFx0Ly8gRG9uJ3QgY2hlY2sgbm9uLWVsZW1lbnRzICgjMTMyMDgpXG5cdFx0XHRcdC8vIERvbid0IHByb2Nlc3MgY2xpY2tzIG9uIGRpc2FibGVkIGVsZW1lbnRzICgjNjkxMSwgIzgxNjUsICMxMTM4MiwgIzExNzY0KVxuXHRcdFx0XHRpZiAoIGN1ci5ub2RlVHlwZSA9PT0gMSAmJiAhKCBldmVudC50eXBlID09PSBcImNsaWNrXCIgJiYgY3VyLmRpc2FibGVkID09PSB0cnVlICkgKSB7XG5cdFx0XHRcdFx0bWF0Y2hlZEhhbmRsZXJzID0gW107XG5cdFx0XHRcdFx0bWF0Y2hlZFNlbGVjdG9ycyA9IHt9O1xuXHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZGVsZWdhdGVDb3VudDsgaSsrICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlT2JqID0gaGFuZGxlcnNbIGkgXTtcblxuXHRcdFx0XHRcdFx0Ly8gRG9uJ3QgY29uZmxpY3Qgd2l0aCBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKCMxMzIwMylcblx0XHRcdFx0XHRcdHNlbCA9IGhhbmRsZU9iai5zZWxlY3RvciArIFwiIFwiO1xuXG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZWRTZWxlY3RvcnNbIHNlbCBdID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRcdG1hdGNoZWRTZWxlY3RvcnNbIHNlbCBdID0gaGFuZGxlT2JqLm5lZWRzQ29udGV4dCA/XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5KCBzZWwsIHRoaXMgKS5pbmRleCggY3VyICkgPiAtMSA6XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LmZpbmQoIHNlbCwgdGhpcywgbnVsbCwgWyBjdXIgXSApLmxlbmd0aDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gKSB7XG5cdFx0XHRcdFx0XHRcdG1hdGNoZWRIYW5kbGVycy5wdXNoKCBoYW5kbGVPYmogKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBtYXRjaGVkSGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goIHsgZWxlbTogY3VyLCBoYW5kbGVyczogbWF0Y2hlZEhhbmRsZXJzIH0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBZGQgdGhlIHJlbWFpbmluZyAoZGlyZWN0bHktYm91bmQpIGhhbmRsZXJzXG5cdFx0Y3VyID0gdGhpcztcblx0XHRpZiAoIGRlbGVnYXRlQ291bnQgPCBoYW5kbGVycy5sZW5ndGggKSB7XG5cdFx0XHRoYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBoYW5kbGVycy5zbGljZSggZGVsZWdhdGVDb3VudCApIH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaGFuZGxlclF1ZXVlO1xuXHR9LFxuXG5cdGFkZFByb3A6IGZ1bmN0aW9uKCBuYW1lLCBob29rICkge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggalF1ZXJ5LkV2ZW50LnByb3RvdHlwZSwgbmFtZSwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblxuXHRcdFx0Z2V0OiBpc0Z1bmN0aW9uKCBob29rICkgP1xuXHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGhvb2soIHRoaXMub3JpZ2luYWxFdmVudCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSA6XG5cdFx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGlmICggdGhpcy5vcmlnaW5hbEV2ZW50ICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5vcmlnaW5hbEV2ZW50WyBuYW1lIF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCBuYW1lLCB7XG5cdFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0d3JpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0Zml4OiBmdW5jdGlvbiggb3JpZ2luYWxFdmVudCApIHtcblx0XHRyZXR1cm4gb3JpZ2luYWxFdmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/XG5cdFx0XHRvcmlnaW5hbEV2ZW50IDpcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTtcblx0fSxcblxuXHRzcGVjaWFsOiB7XG5cdFx0bG9hZDoge1xuXG5cdFx0XHQvLyBQcmV2ZW50IHRyaWdnZXJlZCBpbWFnZS5sb2FkIGV2ZW50cyBmcm9tIGJ1YmJsaW5nIHRvIHdpbmRvdy5sb2FkXG5cdFx0XHRub0J1YmJsZTogdHJ1ZVxuXHRcdH0sXG5cdFx0Y2xpY2s6IHtcblxuXHRcdFx0Ly8gVXRpbGl6ZSBuYXRpdmUgZXZlbnQgdG8gZW5zdXJlIGNvcnJlY3Qgc3RhdGUgZm9yIGNoZWNrYWJsZSBpbnB1dHNcblx0XHRcdHNldHVwOiBmdW5jdGlvbiggZGF0YSApIHtcblxuXHRcdFx0XHQvLyBGb3IgbXV0dWFsIGNvbXByZXNzaWJpbGl0eSB3aXRoIF9kZWZhdWx0LCByZXBsYWNlIGB0aGlzYCBhY2Nlc3Mgd2l0aCBhIGxvY2FsIHZhci5cblx0XHRcdFx0Ly8gYHx8IGRhdGFgIGlzIGRlYWQgY29kZSBtZWFudCBvbmx5IHRvIHByZXNlcnZlIHRoZSB2YXJpYWJsZSB0aHJvdWdoIG1pbmlmaWNhdGlvbi5cblx0XHRcdFx0dmFyIGVsID0gdGhpcyB8fCBkYXRhO1xuXG5cdFx0XHRcdC8vIENsYWltIHRoZSBmaXJzdCBoYW5kbGVyXG5cdFx0XHRcdGlmICggcmNoZWNrYWJsZVR5cGUudGVzdCggZWwudHlwZSApICYmXG5cdFx0XHRcdFx0ZWwuY2xpY2sgJiYgbm9kZU5hbWUoIGVsLCBcImlucHV0XCIgKSApIHtcblxuXHRcdFx0XHRcdC8vIGRhdGFQcml2LnNldCggZWwsIFwiY2xpY2tcIiwgLi4uIClcblx0XHRcdFx0XHRsZXZlcmFnZU5hdGl2ZSggZWwsIFwiY2xpY2tcIiwgcmV0dXJuVHJ1ZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmV0dXJuIGZhbHNlIHRvIGFsbG93IG5vcm1hbCBwcm9jZXNzaW5nIGluIHRoZSBjYWxsZXJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSxcblx0XHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCBkYXRhICkge1xuXG5cdFx0XHRcdC8vIEZvciBtdXR1YWwgY29tcHJlc3NpYmlsaXR5IHdpdGggX2RlZmF1bHQsIHJlcGxhY2UgYHRoaXNgIGFjY2VzcyB3aXRoIGEgbG9jYWwgdmFyLlxuXHRcdFx0XHQvLyBgfHwgZGF0YWAgaXMgZGVhZCBjb2RlIG1lYW50IG9ubHkgdG8gcHJlc2VydmUgdGhlIHZhcmlhYmxlIHRocm91Z2ggbWluaWZpY2F0aW9uLlxuXHRcdFx0XHR2YXIgZWwgPSB0aGlzIHx8IGRhdGE7XG5cblx0XHRcdFx0Ly8gRm9yY2Ugc2V0dXAgYmVmb3JlIHRyaWdnZXJpbmcgYSBjbGlja1xuXHRcdFx0XHRpZiAoIHJjaGVja2FibGVUeXBlLnRlc3QoIGVsLnR5cGUgKSAmJlxuXHRcdFx0XHRcdGVsLmNsaWNrICYmIG5vZGVOYW1lKCBlbCwgXCJpbnB1dFwiICkgKSB7XG5cblx0XHRcdFx0XHRsZXZlcmFnZU5hdGl2ZSggZWwsIFwiY2xpY2tcIiApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmV0dXJuIG5vbi1mYWxzZSB0byBhbGxvdyBub3JtYWwgZXZlbnQtcGF0aCBwcm9wYWdhdGlvblxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH0sXG5cblx0XHRcdC8vIEZvciBjcm9zcy1icm93c2VyIGNvbnNpc3RlbmN5LCBzdXBwcmVzcyBuYXRpdmUgLmNsaWNrKCkgb24gbGlua3Ncblx0XHRcdC8vIEFsc28gcHJldmVudCBpdCBpZiB3ZSdyZSBjdXJyZW50bHkgaW5zaWRlIGEgbGV2ZXJhZ2VkIG5hdGl2ZS1ldmVudCBzdGFja1xuXHRcdFx0X2RlZmF1bHQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcblx0XHRcdFx0cmV0dXJuIHJjaGVja2FibGVUeXBlLnRlc3QoIHRhcmdldC50eXBlICkgJiZcblx0XHRcdFx0XHR0YXJnZXQuY2xpY2sgJiYgbm9kZU5hbWUoIHRhcmdldCwgXCJpbnB1dFwiICkgJiZcblx0XHRcdFx0XHRkYXRhUHJpdi5nZXQoIHRhcmdldCwgXCJjbGlja1wiICkgfHxcblx0XHRcdFx0XHRub2RlTmFtZSggdGFyZ2V0LCBcImFcIiApO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRiZWZvcmV1bmxvYWQ6IHtcblx0XHRcdHBvc3REaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggMjArXG5cdFx0XHRcdC8vIEZpcmVmb3ggZG9lc24ndCBhbGVydCBpZiB0aGUgcmV0dXJuVmFsdWUgZmllbGQgaXMgbm90IHNldC5cblx0XHRcdFx0aWYgKCBldmVudC5yZXN1bHQgIT09IHVuZGVmaW5lZCAmJiBldmVudC5vcmlnaW5hbEV2ZW50ICkge1xuXHRcdFx0XHRcdGV2ZW50Lm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWUgPSBldmVudC5yZXN1bHQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn07XG5cbi8vIEVuc3VyZSB0aGUgcHJlc2VuY2Ugb2YgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBoYW5kbGVzIG1hbnVhbGx5LXRyaWdnZXJlZFxuLy8gc3ludGhldGljIGV2ZW50cyBieSBpbnRlcnJ1cHRpbmcgcHJvZ3Jlc3MgdW50aWwgcmVpbnZva2VkIGluIHJlc3BvbnNlIHRvXG4vLyAqbmF0aXZlKiBldmVudHMgdGhhdCBpdCBmaXJlcyBkaXJlY3RseSwgZW5zdXJpbmcgdGhhdCBzdGF0ZSBjaGFuZ2VzIGhhdmVcbi8vIGFscmVhZHkgb2NjdXJyZWQgYmVmb3JlIG90aGVyIGxpc3RlbmVycyBhcmUgaW52b2tlZC5cbmZ1bmN0aW9uIGxldmVyYWdlTmF0aXZlKCBlbCwgdHlwZSwgZXhwZWN0U3luYyApIHtcblxuXHQvLyBNaXNzaW5nIGV4cGVjdFN5bmMgaW5kaWNhdGVzIGEgdHJpZ2dlciBjYWxsLCB3aGljaCBtdXN0IGZvcmNlIHNldHVwIHRocm91Z2ggalF1ZXJ5LmV2ZW50LmFkZFxuXHRpZiAoICFleHBlY3RTeW5jICkge1xuXHRcdGlmICggZGF0YVByaXYuZ2V0KCBlbCwgdHlwZSApID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQuYWRkKCBlbCwgdHlwZSwgcmV0dXJuVHJ1ZSApO1xuXHRcdH1cblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBSZWdpc3RlciB0aGUgY29udHJvbGxlciBhcyBhIHNwZWNpYWwgdW5pdmVyc2FsIGhhbmRsZXIgZm9yIGFsbCBldmVudCBuYW1lc3BhY2VzXG5cdGRhdGFQcml2LnNldCggZWwsIHR5cGUsIGZhbHNlICk7XG5cdGpRdWVyeS5ldmVudC5hZGQoIGVsLCB0eXBlLCB7XG5cdFx0bmFtZXNwYWNlOiBmYWxzZSxcblx0XHRoYW5kbGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHR2YXIgbm90QXN5bmMsIHJlc3VsdCxcblx0XHRcdFx0c2F2ZWQgPSBkYXRhUHJpdi5nZXQoIHRoaXMsIHR5cGUgKTtcblxuXHRcdFx0aWYgKCAoIGV2ZW50LmlzVHJpZ2dlciAmIDEgKSAmJiB0aGlzWyB0eXBlIF0gKSB7XG5cblx0XHRcdFx0Ly8gSW50ZXJydXB0IHByb2Nlc3Npbmcgb2YgdGhlIG91dGVyIHN5bnRoZXRpYyAudHJpZ2dlcigpZWQgZXZlbnRcblx0XHRcdFx0Ly8gU2F2ZWQgZGF0YSBzaG91bGQgYmUgZmFsc2UgaW4gc3VjaCBjYXNlcywgYnV0IG1pZ2h0IGJlIGEgbGVmdG92ZXIgY2FwdHVyZSBvYmplY3Rcblx0XHRcdFx0Ly8gZnJvbSBhbiBhc3luYyBuYXRpdmUgaGFuZGxlciAoZ2gtNDM1MClcblx0XHRcdFx0aWYgKCAhc2F2ZWQubGVuZ3RoICkge1xuXG5cdFx0XHRcdFx0Ly8gU3RvcmUgYXJndW1lbnRzIGZvciB1c2Ugd2hlbiBoYW5kbGluZyB0aGUgaW5uZXIgbmF0aXZlIGV2ZW50XG5cdFx0XHRcdFx0Ly8gVGhlcmUgd2lsbCBhbHdheXMgYmUgYXQgbGVhc3Qgb25lIGFyZ3VtZW50IChhbiBldmVudCBvYmplY3QpLCBzbyB0aGlzIGFycmF5XG5cdFx0XHRcdFx0Ly8gd2lsbCBub3QgYmUgY29uZnVzZWQgd2l0aCBhIGxlZnRvdmVyIGNhcHR1cmUgb2JqZWN0LlxuXHRcdFx0XHRcdHNhdmVkID0gc2xpY2UuY2FsbCggYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCB0aGlzLCB0eXBlLCBzYXZlZCApO1xuXG5cdFx0XHRcdFx0Ly8gVHJpZ2dlciB0aGUgbmF0aXZlIGV2ZW50IGFuZCBjYXB0dXJlIGl0cyByZXN1bHRcblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMStcblx0XHRcdFx0XHQvLyBmb2N1cygpIGFuZCBibHVyKCkgYXJlIGFzeW5jaHJvbm91c1xuXHRcdFx0XHRcdG5vdEFzeW5jID0gZXhwZWN0U3luYyggdGhpcywgdHlwZSApO1xuXHRcdFx0XHRcdHRoaXNbIHR5cGUgXSgpO1xuXHRcdFx0XHRcdHJlc3VsdCA9IGRhdGFQcml2LmdldCggdGhpcywgdHlwZSApO1xuXHRcdFx0XHRcdGlmICggc2F2ZWQgIT09IHJlc3VsdCB8fCBub3RBc3luYyApIHtcblx0XHRcdFx0XHRcdGRhdGFQcml2LnNldCggdGhpcywgdHlwZSwgZmFsc2UgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVzdWx0ID0ge307XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggc2F2ZWQgIT09IHJlc3VsdCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gQ2FuY2VsIHRoZSBvdXRlciBzeW50aGV0aWMgZXZlbnRcblx0XHRcdFx0XHRcdGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHQudmFsdWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIElmIHRoaXMgaXMgYW4gaW5uZXIgc3ludGhldGljIGV2ZW50IGZvciBhbiBldmVudCB3aXRoIGEgYnViYmxpbmcgc3Vycm9nYXRlXG5cdFx0XHRcdC8vIChmb2N1cyBvciBibHVyKSwgYXNzdW1lIHRoYXQgdGhlIHN1cnJvZ2F0ZSBhbHJlYWR5IHByb3BhZ2F0ZWQgZnJvbSB0cmlnZ2VyaW5nIHRoZVxuXHRcdFx0XHQvLyBuYXRpdmUgZXZlbnQgYW5kIHByZXZlbnQgdGhhdCBmcm9tIGhhcHBlbmluZyBhZ2FpbiBoZXJlLlxuXHRcdFx0XHQvLyBUaGlzIHRlY2huaWNhbGx5IGdldHMgdGhlIG9yZGVyaW5nIHdyb25nIHcuci50LiB0byBgLnRyaWdnZXIoKWAgKGluIHdoaWNoIHRoZVxuXHRcdFx0XHQvLyBidWJibGluZyBzdXJyb2dhdGUgcHJvcGFnYXRlcyAqYWZ0ZXIqIHRoZSBub24tYnViYmxpbmcgYmFzZSksIGJ1dCB0aGF0IHNlZW1zXG5cdFx0XHRcdC8vIGxlc3MgYmFkIHRoYW4gZHVwbGljYXRpb24uXG5cdFx0XHRcdH0gZWxzZSBpZiAoICggalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fSApLmRlbGVnYXRlVHlwZSApIHtcblx0XHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGlzIGlzIGEgbmF0aXZlIGV2ZW50IHRyaWdnZXJlZCBhYm92ZSwgZXZlcnl0aGluZyBpcyBub3cgaW4gb3JkZXJcblx0XHRcdC8vIEZpcmUgYW4gaW5uZXIgc3ludGhldGljIGV2ZW50IHdpdGggdGhlIG9yaWdpbmFsIGFyZ3VtZW50c1xuXHRcdFx0fSBlbHNlIGlmICggc2F2ZWQubGVuZ3RoICkge1xuXG5cdFx0XHRcdC8vIC4uLmFuZCBjYXB0dXJlIHRoZSByZXN1bHRcblx0XHRcdFx0ZGF0YVByaXYuc2V0KCB0aGlzLCB0eXBlLCB7XG5cdFx0XHRcdFx0dmFsdWU6IGpRdWVyeS5ldmVudC50cmlnZ2VyKFxuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMStcblx0XHRcdFx0XHRcdC8vIEV4dGVuZCB3aXRoIHRoZSBwcm90b3R5cGUgdG8gcmVzZXQgdGhlIGFib3ZlIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG5cdFx0XHRcdFx0XHRqUXVlcnkuZXh0ZW5kKCBzYXZlZFsgMCBdLCBqUXVlcnkuRXZlbnQucHJvdG90eXBlICksXG5cdFx0XHRcdFx0XHRzYXZlZC5zbGljZSggMSApLFxuXHRcdFx0XHRcdFx0dGhpc1xuXHRcdFx0XHRcdClcblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdC8vIEFib3J0IGhhbmRsaW5nIG9mIHRoZSBuYXRpdmUgZXZlbnRcblx0XHRcdFx0ZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9ICk7XG59XG5cbmpRdWVyeS5yZW1vdmVFdmVudCA9IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBoYW5kbGUgKSB7XG5cblx0Ly8gVGhpcyBcImlmXCIgaXMgbmVlZGVkIGZvciBwbGFpbiBvYmplY3RzXG5cdGlmICggZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyICkge1xuXHRcdGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciggdHlwZSwgaGFuZGxlICk7XG5cdH1cbn07XG5cbmpRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMsIHByb3BzICkge1xuXG5cdC8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCB0aGUgJ25ldycga2V5d29yZFxuXHRpZiAoICEoIHRoaXMgaW5zdGFuY2VvZiBqUXVlcnkuRXZlbnQgKSApIHtcblx0XHRyZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjLCBwcm9wcyApO1xuXHR9XG5cblx0Ly8gRXZlbnQgb2JqZWN0XG5cdGlmICggc3JjICYmIHNyYy50eXBlICkge1xuXHRcdHRoaXMub3JpZ2luYWxFdmVudCA9IHNyYztcblx0XHR0aGlzLnR5cGUgPSBzcmMudHlwZTtcblxuXHRcdC8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJldmVudGVkXG5cdFx0Ly8gYnkgYSBoYW5kbGVyIGxvd2VyIGRvd24gdGhlIHRyZWU7IHJlZmxlY3QgdGhlIGNvcnJlY3QgdmFsdWUuXG5cdFx0dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBzcmMuZGVmYXVsdFByZXZlbnRlZCB8fFxuXHRcdFx0XHRzcmMuZGVmYXVsdFByZXZlbnRlZCA9PT0gdW5kZWZpbmVkICYmXG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTIuMyBvbmx5XG5cdFx0XHRcdHNyYy5yZXR1cm5WYWx1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0cmV0dXJuVHJ1ZSA6XG5cdFx0XHRyZXR1cm5GYWxzZTtcblxuXHRcdC8vIENyZWF0ZSB0YXJnZXQgcHJvcGVydGllc1xuXHRcdC8vIFN1cHBvcnQ6IFNhZmFyaSA8PTYgLSA3IG9ubHlcblx0XHQvLyBUYXJnZXQgc2hvdWxkIG5vdCBiZSBhIHRleHQgbm9kZSAoIzUwNCwgIzEzMTQzKVxuXHRcdHRoaXMudGFyZ2V0ID0gKCBzcmMudGFyZ2V0ICYmIHNyYy50YXJnZXQubm9kZVR5cGUgPT09IDMgKSA/XG5cdFx0XHRzcmMudGFyZ2V0LnBhcmVudE5vZGUgOlxuXHRcdFx0c3JjLnRhcmdldDtcblxuXHRcdHRoaXMuY3VycmVudFRhcmdldCA9IHNyYy5jdXJyZW50VGFyZ2V0O1xuXHRcdHRoaXMucmVsYXRlZFRhcmdldCA9IHNyYy5yZWxhdGVkVGFyZ2V0O1xuXG5cdC8vIEV2ZW50IHR5cGVcblx0fSBlbHNlIHtcblx0XHR0aGlzLnR5cGUgPSBzcmM7XG5cdH1cblxuXHQvLyBQdXQgZXhwbGljaXRseSBwcm92aWRlZCBwcm9wZXJ0aWVzIG9udG8gdGhlIGV2ZW50IG9iamVjdFxuXHRpZiAoIHByb3BzICkge1xuXHRcdGpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBDcmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5jb21pbmcgZXZlbnQgZG9lc24ndCBoYXZlIG9uZVxuXHR0aGlzLnRpbWVTdGFtcCA9IHNyYyAmJiBzcmMudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG5cblx0Ly8gTWFyayBpdCBhcyBmaXhlZFxuXHR0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTtcbn07XG5cbi8vIGpRdWVyeS5FdmVudCBpcyBiYXNlZCBvbiBET00zIEV2ZW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZ1xuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbFxualF1ZXJ5LkV2ZW50LnByb3RvdHlwZSA9IHtcblx0Y29uc3RydWN0b3I6IGpRdWVyeS5FdmVudCxcblx0aXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSxcblx0aXNQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuXHRpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsXG5cdGlzU2ltdWxhdGVkOiBmYWxzZSxcblxuXHRwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0fVxuXHR9LFxuXHRzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdH1cblx0fSxcblx0c3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlO1xuXG5cdFx0aWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkge1xuXHRcdFx0ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblx0XHR9XG5cblx0XHR0aGlzLnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9XG59O1xuXG4vLyBJbmNsdWRlcyBhbGwgY29tbW9uIGV2ZW50IHByb3BzIGluY2x1ZGluZyBLZXlFdmVudCBhbmQgTW91c2VFdmVudCBzcGVjaWZpYyBwcm9wc1xualF1ZXJ5LmVhY2goIHtcblx0YWx0S2V5OiB0cnVlLFxuXHRidWJibGVzOiB0cnVlLFxuXHRjYW5jZWxhYmxlOiB0cnVlLFxuXHRjaGFuZ2VkVG91Y2hlczogdHJ1ZSxcblx0Y3RybEtleTogdHJ1ZSxcblx0ZGV0YWlsOiB0cnVlLFxuXHRldmVudFBoYXNlOiB0cnVlLFxuXHRtZXRhS2V5OiB0cnVlLFxuXHRwYWdlWDogdHJ1ZSxcblx0cGFnZVk6IHRydWUsXG5cdHNoaWZ0S2V5OiB0cnVlLFxuXHR2aWV3OiB0cnVlLFxuXHRcImNoYXJcIjogdHJ1ZSxcblx0Y29kZTogdHJ1ZSxcblx0Y2hhckNvZGU6IHRydWUsXG5cdGtleTogdHJ1ZSxcblx0a2V5Q29kZTogdHJ1ZSxcblx0YnV0dG9uOiB0cnVlLFxuXHRidXR0b25zOiB0cnVlLFxuXHRjbGllbnRYOiB0cnVlLFxuXHRjbGllbnRZOiB0cnVlLFxuXHRvZmZzZXRYOiB0cnVlLFxuXHRvZmZzZXRZOiB0cnVlLFxuXHRwb2ludGVySWQ6IHRydWUsXG5cdHBvaW50ZXJUeXBlOiB0cnVlLFxuXHRzY3JlZW5YOiB0cnVlLFxuXHRzY3JlZW5ZOiB0cnVlLFxuXHR0YXJnZXRUb3VjaGVzOiB0cnVlLFxuXHR0b0VsZW1lbnQ6IHRydWUsXG5cdHRvdWNoZXM6IHRydWUsXG5cblx0d2hpY2g6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHR2YXIgYnV0dG9uID0gZXZlbnQuYnV0dG9uO1xuXG5cdFx0Ly8gQWRkIHdoaWNoIGZvciBrZXkgZXZlbnRzXG5cdFx0aWYgKCBldmVudC53aGljaCA9PSBudWxsICYmIHJrZXlFdmVudC50ZXN0KCBldmVudC50eXBlICkgKSB7XG5cdFx0XHRyZXR1cm4gZXZlbnQuY2hhckNvZGUgIT0gbnVsbCA/IGV2ZW50LmNoYXJDb2RlIDogZXZlbnQua2V5Q29kZTtcblx0XHR9XG5cblx0XHQvLyBBZGQgd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAyID09PSBtaWRkbGU7IDMgPT09IHJpZ2h0XG5cdFx0aWYgKCAhZXZlbnQud2hpY2ggJiYgYnV0dG9uICE9PSB1bmRlZmluZWQgJiYgcm1vdXNlRXZlbnQudGVzdCggZXZlbnQudHlwZSApICkge1xuXHRcdFx0aWYgKCBidXR0b24gJiAxICkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBidXR0b24gJiAyICkge1xuXHRcdFx0XHRyZXR1cm4gMztcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBidXR0b24gJiA0ICkge1xuXHRcdFx0XHRyZXR1cm4gMjtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LndoaWNoO1xuXHR9XG59LCBqUXVlcnkuZXZlbnQuYWRkUHJvcCApO1xuXG5qUXVlcnkuZWFjaCggeyBmb2N1czogXCJmb2N1c2luXCIsIGJsdXI6IFwiZm9jdXNvdXRcIiB9LCBmdW5jdGlvbiggdHlwZSwgZGVsZWdhdGVUeXBlICkge1xuXHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdID0ge1xuXG5cdFx0Ly8gVXRpbGl6ZSBuYXRpdmUgZXZlbnQgaWYgcG9zc2libGUgc28gYmx1ci9mb2N1cyBzZXF1ZW5jZSBpcyBjb3JyZWN0XG5cdFx0c2V0dXA6IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBDbGFpbSB0aGUgZmlyc3QgaGFuZGxlclxuXHRcdFx0Ly8gZGF0YVByaXYuc2V0KCB0aGlzLCBcImZvY3VzXCIsIC4uLiApXG5cdFx0XHQvLyBkYXRhUHJpdi5zZXQoIHRoaXMsIFwiYmx1clwiLCAuLi4gKVxuXHRcdFx0bGV2ZXJhZ2VOYXRpdmUoIHRoaXMsIHR5cGUsIGV4cGVjdFN5bmMgKTtcblxuXHRcdFx0Ly8gUmV0dXJuIGZhbHNlIHRvIGFsbG93IG5vcm1hbCBwcm9jZXNzaW5nIGluIHRoZSBjYWxsZXJcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBGb3JjZSBzZXR1cCBiZWZvcmUgdHJpZ2dlclxuXHRcdFx0bGV2ZXJhZ2VOYXRpdmUoIHRoaXMsIHR5cGUgKTtcblxuXHRcdFx0Ly8gUmV0dXJuIG5vbi1mYWxzZSB0byBhbGxvdyBub3JtYWwgZXZlbnQtcGF0aCBwcm9wYWdhdGlvblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSxcblxuXHRcdGRlbGVnYXRlVHlwZTogZGVsZWdhdGVUeXBlXG5cdH07XG59ICk7XG5cbi8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrc1xuLy8gc28gdGhhdCBldmVudCBkZWxlZ2F0aW9uIHdvcmtzIGluIGpRdWVyeS5cbi8vIERvIHRoZSBzYW1lIGZvciBwb2ludGVyZW50ZXIvcG9pbnRlcmxlYXZlIGFuZCBwb2ludGVyb3Zlci9wb2ludGVyb3V0XG4vL1xuLy8gU3VwcG9ydDogU2FmYXJpIDcgb25seVxuLy8gU2FmYXJpIHNlbmRzIG1vdXNlZW50ZXIgdG9vIG9mdGVuOyBzZWU6XG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NzAyNThcbi8vIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGJ1ZyAoaXQgZXhpc3RlZCBpbiBvbGRlciBDaHJvbWUgdmVyc2lvbnMgYXMgd2VsbCkuXG5qUXVlcnkuZWFjaCgge1xuXHRtb3VzZWVudGVyOiBcIm1vdXNlb3ZlclwiLFxuXHRtb3VzZWxlYXZlOiBcIm1vdXNlb3V0XCIsXG5cdHBvaW50ZXJlbnRlcjogXCJwb2ludGVyb3ZlclwiLFxuXHRwb2ludGVybGVhdmU6IFwicG9pbnRlcm91dFwiXG59LCBmdW5jdGlvbiggb3JpZywgZml4ICkge1xuXHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0ge1xuXHRcdGRlbGVnYXRlVHlwZTogZml4LFxuXHRcdGJpbmRUeXBlOiBmaXgsXG5cblx0XHRoYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdHZhciByZXQsXG5cdFx0XHRcdHRhcmdldCA9IHRoaXMsXG5cdFx0XHRcdHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LFxuXHRcdFx0XHRoYW5kbGVPYmogPSBldmVudC5oYW5kbGVPYmo7XG5cblx0XHRcdC8vIEZvciBtb3VzZWVudGVyL2xlYXZlIGNhbGwgdGhlIGhhbmRsZXIgaWYgcmVsYXRlZCBpcyBvdXRzaWRlIHRoZSB0YXJnZXQuXG5cdFx0XHQvLyBOQjogTm8gcmVsYXRlZFRhcmdldCBpZiB0aGUgbW91c2UgbGVmdC9lbnRlcmVkIHRoZSBicm93c2VyIHdpbmRvd1xuXHRcdFx0aWYgKCAhcmVsYXRlZCB8fCAoIHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSApICkge1xuXHRcdFx0XHRldmVudC50eXBlID0gaGFuZGxlT2JqLm9yaWdUeXBlO1xuXHRcdFx0XHRyZXQgPSBoYW5kbGVPYmouaGFuZGxlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdGV2ZW50LnR5cGUgPSBmaXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0fTtcbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdG9uOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gb24oIHRoaXMsIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTtcblx0fSxcblx0b25lOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gb24oIHRoaXMsIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIDEgKTtcblx0fSxcblx0b2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHtcblx0XHR2YXIgaGFuZGxlT2JqLCB0eXBlO1xuXHRcdGlmICggdHlwZXMgJiYgdHlwZXMucHJldmVudERlZmF1bHQgJiYgdHlwZXMuaGFuZGxlT2JqICkge1xuXG5cdFx0XHQvLyAoIGV2ZW50ICkgIGRpc3BhdGNoZWQgalF1ZXJ5LkV2ZW50XG5cdFx0XHRoYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7XG5cdFx0XHRqUXVlcnkoIHR5cGVzLmRlbGVnYXRlVGFyZ2V0ICkub2ZmKFxuXHRcdFx0XHRoYW5kbGVPYmoubmFtZXNwYWNlID9cblx0XHRcdFx0XHRoYW5kbGVPYmoub3JpZ1R5cGUgKyBcIi5cIiArIGhhbmRsZU9iai5uYW1lc3BhY2UgOlxuXHRcdFx0XHRcdGhhbmRsZU9iai5vcmlnVHlwZSxcblx0XHRcdFx0aGFuZGxlT2JqLnNlbGVjdG9yLFxuXHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlclxuXHRcdFx0KTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0XHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdIClcblx0XHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRcdHRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlmICggc2VsZWN0b3IgPT09IGZhbHNlIHx8IHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzIFssIGZuXSApXG5cdFx0XHRmbiA9IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmICggZm4gPT09IGZhbHNlICkge1xuXHRcdFx0Zm4gPSByZXR1cm5GYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCB0eXBlcywgZm4sIHNlbGVjdG9yICk7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cblxudmFyXG5cblx0LyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuXG5cdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9pc3N1ZXMvMzIyOVxuXHRyeGh0bWxUYWcgPSAvPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSopW14+XSopXFwvPi9naSxcblxuXHQvKiBlc2xpbnQtZW5hYmxlICovXG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMCAtIDExLCBFZGdlIDEyIC0gMTMgb25seVxuXHQvLyBJbiBJRS9FZGdlIHVzaW5nIHJlZ2V4IGdyb3VwcyBoZXJlIGNhdXNlcyBzZXZlcmUgc2xvd2Rvd25zLlxuXHQvLyBTZWUgaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy8xNzM2NTEyL1xuXHRybm9Jbm5lcmh0bWwgPSAvPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxcblxuXHQvLyBjaGVja2VkPVwiY2hlY2tlZFwiIG9yIGNoZWNrZWRcblx0cmNoZWNrZWQgPSAvY2hlY2tlZFxccyooPzpbXj1dfD1cXHMqLmNoZWNrZWQuKS9pLFxuXHRyY2xlYW5TY3JpcHQgPSAvXlxccyo8ISg/OlxcW0NEQVRBXFxbfC0tKXwoPzpcXF1cXF18LS0pPlxccyokL2c7XG5cbi8vIFByZWZlciBhIHRib2R5IG92ZXIgaXRzIHBhcmVudCB0YWJsZSBmb3IgY29udGFpbmluZyBuZXcgcm93c1xuZnVuY3Rpb24gbWFuaXB1bGF0aW9uVGFyZ2V0KCBlbGVtLCBjb250ZW50ICkge1xuXHRpZiAoIG5vZGVOYW1lKCBlbGVtLCBcInRhYmxlXCIgKSAmJlxuXHRcdG5vZGVOYW1lKCBjb250ZW50Lm5vZGVUeXBlICE9PSAxMSA/IGNvbnRlbnQgOiBjb250ZW50LmZpcnN0Q2hpbGQsIFwidHJcIiApICkge1xuXG5cdFx0cmV0dXJuIGpRdWVyeSggZWxlbSApLmNoaWxkcmVuKCBcInRib2R5XCIgKVsgMCBdIHx8IGVsZW07XG5cdH1cblxuXHRyZXR1cm4gZWxlbTtcbn1cblxuLy8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvblxuZnVuY3Rpb24gZGlzYWJsZVNjcmlwdCggZWxlbSApIHtcblx0ZWxlbS50eXBlID0gKCBlbGVtLmdldEF0dHJpYnV0ZSggXCJ0eXBlXCIgKSAhPT0gbnVsbCApICsgXCIvXCIgKyBlbGVtLnR5cGU7XG5cdHJldHVybiBlbGVtO1xufVxuZnVuY3Rpb24gcmVzdG9yZVNjcmlwdCggZWxlbSApIHtcblx0aWYgKCAoIGVsZW0udHlwZSB8fCBcIlwiICkuc2xpY2UoIDAsIDUgKSA9PT0gXCJ0cnVlL1wiICkge1xuXHRcdGVsZW0udHlwZSA9IGVsZW0udHlwZS5zbGljZSggNSApO1xuXHR9IGVsc2Uge1xuXHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBcInR5cGVcIiApO1xuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbmZ1bmN0aW9uIGNsb25lQ29weUV2ZW50KCBzcmMsIGRlc3QgKSB7XG5cdHZhciBpLCBsLCB0eXBlLCBwZGF0YU9sZCwgcGRhdGFDdXIsIHVkYXRhT2xkLCB1ZGF0YUN1ciwgZXZlbnRzO1xuXG5cdGlmICggZGVzdC5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5kbGVycywgZXRjLlxuXHRpZiAoIGRhdGFQcml2Lmhhc0RhdGEoIHNyYyApICkge1xuXHRcdHBkYXRhT2xkID0gZGF0YVByaXYuYWNjZXNzKCBzcmMgKTtcblx0XHRwZGF0YUN1ciA9IGRhdGFQcml2LnNldCggZGVzdCwgcGRhdGFPbGQgKTtcblx0XHRldmVudHMgPSBwZGF0YU9sZC5ldmVudHM7XG5cblx0XHRpZiAoIGV2ZW50cyApIHtcblx0XHRcdGRlbGV0ZSBwZGF0YUN1ci5oYW5kbGU7XG5cdFx0XHRwZGF0YUN1ci5ldmVudHMgPSB7fTtcblxuXHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XG5cdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIDIuIENvcHkgdXNlciBkYXRhXG5cdGlmICggZGF0YVVzZXIuaGFzRGF0YSggc3JjICkgKSB7XG5cdFx0dWRhdGFPbGQgPSBkYXRhVXNlci5hY2Nlc3MoIHNyYyApO1xuXHRcdHVkYXRhQ3VyID0galF1ZXJ5LmV4dGVuZCgge30sIHVkYXRhT2xkICk7XG5cblx0XHRkYXRhVXNlci5zZXQoIGRlc3QsIHVkYXRhQ3VyICk7XG5cdH1cbn1cblxuLy8gRml4IElFIGJ1Z3MsIHNlZSBzdXBwb3J0IHRlc3RzXG5mdW5jdGlvbiBmaXhJbnB1dCggc3JjLCBkZXN0ICkge1xuXHR2YXIgbm9kZU5hbWUgPSBkZXN0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0Ly8gRmFpbHMgdG8gcGVyc2lzdCB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBhIGNsb25lZCBjaGVja2JveCBvciByYWRpbyBidXR0b24uXG5cdGlmICggbm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiByY2hlY2thYmxlVHlwZS50ZXN0KCBzcmMudHlwZSApICkge1xuXHRcdGRlc3QuY2hlY2tlZCA9IHNyYy5jaGVja2VkO1xuXG5cdC8vIEZhaWxzIHRvIHJldHVybiB0aGUgc2VsZWN0ZWQgb3B0aW9uIHRvIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zXG5cdH0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSBcImlucHV0XCIgfHwgbm9kZU5hbWUgPT09IFwidGV4dGFyZWFcIiApIHtcblx0XHRkZXN0LmRlZmF1bHRWYWx1ZSA9IHNyYy5kZWZhdWx0VmFsdWU7XG5cdH1cbn1cblxuZnVuY3Rpb24gZG9tTWFuaXAoIGNvbGxlY3Rpb24sIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICkge1xuXG5cdC8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXNcblx0YXJncyA9IGNvbmNhdC5hcHBseSggW10sIGFyZ3MgKTtcblxuXHR2YXIgZnJhZ21lbnQsIGZpcnN0LCBzY3JpcHRzLCBoYXNTY3JpcHRzLCBub2RlLCBkb2MsXG5cdFx0aSA9IDAsXG5cdFx0bCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuXHRcdGlOb0Nsb25lID0gbCAtIDEsXG5cdFx0dmFsdWUgPSBhcmdzWyAwIF0sXG5cdFx0dmFsdWVJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHQvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXRcblx0aWYgKCB2YWx1ZUlzRnVuY3Rpb24gfHxcblx0XHRcdCggbCA+IDEgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCFzdXBwb3J0LmNoZWNrQ2xvbmUgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUgKSApICkge1xuXHRcdHJldHVybiBjb2xsZWN0aW9uLmVhY2goIGZ1bmN0aW9uKCBpbmRleCApIHtcblx0XHRcdHZhciBzZWxmID0gY29sbGVjdGlvbi5lcSggaW5kZXggKTtcblx0XHRcdGlmICggdmFsdWVJc0Z1bmN0aW9uICkge1xuXHRcdFx0XHRhcmdzWyAwIF0gPSB2YWx1ZS5jYWxsKCB0aGlzLCBpbmRleCwgc2VsZi5odG1sKCkgKTtcblx0XHRcdH1cblx0XHRcdGRvbU1hbmlwKCBzZWxmLCBhcmdzLCBjYWxsYmFjaywgaWdub3JlZCApO1xuXHRcdH0gKTtcblx0fVxuXG5cdGlmICggbCApIHtcblx0XHRmcmFnbWVudCA9IGJ1aWxkRnJhZ21lbnQoIGFyZ3MsIGNvbGxlY3Rpb25bIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgY29sbGVjdGlvbiwgaWdub3JlZCApO1xuXHRcdGZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdGlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7XG5cdFx0XHRmcmFnbWVudCA9IGZpcnN0O1xuXHRcdH1cblxuXHRcdC8vIFJlcXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVudHMgdG8gaW52b2tlIHRoZSBjYWxsYmFja1xuXHRcdGlmICggZmlyc3QgfHwgaWdub3JlZCApIHtcblx0XHRcdHNjcmlwdHMgPSBqUXVlcnkubWFwKCBnZXRBbGwoIGZyYWdtZW50LCBcInNjcmlwdFwiICksIGRpc2FibGVTY3JpcHQgKTtcblx0XHRcdGhhc1NjcmlwdHMgPSBzY3JpcHRzLmxlbmd0aDtcblxuXHRcdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbVxuXHRcdFx0Ly8gaW5zdGVhZCBvZiB0aGUgZmlyc3QgYmVjYXVzZSBpdCBjYW4gZW5kIHVwXG5cdFx0XHQvLyBiZWluZyBlbXB0aWVkIGluY29ycmVjdGx5IGluIGNlcnRhaW4gc2l0dWF0aW9ucyAoIzgwNzApLlxuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRub2RlID0gZnJhZ21lbnQ7XG5cblx0XHRcdFx0aWYgKCBpICE9PSBpTm9DbG9uZSApIHtcblx0XHRcdFx0XHRub2RlID0galF1ZXJ5LmNsb25lKCBub2RlLCB0cnVlLCB0cnVlICk7XG5cblx0XHRcdFx0XHQvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uXG5cdFx0XHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0XHRcdGpRdWVyeS5tZXJnZSggc2NyaXB0cywgZ2V0QWxsKCBub2RlLCBcInNjcmlwdFwiICkgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjYWxsYmFjay5jYWxsKCBjb2xsZWN0aW9uWyBpIF0sIG5vZGUsIGkgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXHRcdFx0XHRkb2MgPSBzY3JpcHRzWyBzY3JpcHRzLmxlbmd0aCAtIDEgXS5vd25lckRvY3VtZW50O1xuXG5cdFx0XHRcdC8vIFJlZW5hYmxlIHNjcmlwdHNcblx0XHRcdFx0alF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVzdG9yZVNjcmlwdCApO1xuXG5cdFx0XHRcdC8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb25cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBoYXNTY3JpcHRzOyBpKysgKSB7XG5cdFx0XHRcdFx0bm9kZSA9IHNjcmlwdHNbIGkgXTtcblx0XHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIG5vZGUudHlwZSB8fCBcIlwiICkgJiZcblx0XHRcdFx0XHRcdCFkYXRhUHJpdi5hY2Nlc3MoIG5vZGUsIFwiZ2xvYmFsRXZhbFwiICkgJiZcblx0XHRcdFx0XHRcdGpRdWVyeS5jb250YWlucyggZG9jLCBub2RlICkgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggbm9kZS5zcmMgJiYgKCBub2RlLnR5cGUgfHwgXCJcIiApLnRvTG93ZXJDYXNlKCkgICE9PSBcIm1vZHVsZVwiICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIE9wdGlvbmFsIEFKQVggZGVwZW5kZW5jeSwgYnV0IHdvbid0IHJ1biBzY3JpcHRzIGlmIG5vdCBwcmVzZW50XG5cdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5Ll9ldmFsVXJsICYmICFub2RlLm5vTW9kdWxlICkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5fZXZhbFVybCggbm9kZS5zcmMsIHtcblx0XHRcdFx0XHRcdFx0XHRcdG5vbmNlOiBub2RlLm5vbmNlIHx8IG5vZGUuZ2V0QXR0cmlidXRlKCBcIm5vbmNlXCIgKVxuXHRcdFx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0RE9NRXZhbCggbm9kZS50ZXh0Q29udGVudC5yZXBsYWNlKCByY2xlYW5TY3JpcHQsIFwiXCIgKSwgbm9kZSwgZG9jICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGNvbGxlY3Rpb247XG59XG5cbmZ1bmN0aW9uIHJlbW92ZSggZWxlbSwgc2VsZWN0b3IsIGtlZXBEYXRhICkge1xuXHR2YXIgbm9kZSxcblx0XHRub2RlcyA9IHNlbGVjdG9yID8galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIGVsZW0gKSA6IGVsZW0sXG5cdFx0aSA9IDA7XG5cblx0Zm9yICggOyAoIG5vZGUgPSBub2Rlc1sgaSBdICkgIT0gbnVsbDsgaSsrICkge1xuXHRcdGlmICggIWtlZXBEYXRhICYmIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIG5vZGUgKSApO1xuXHRcdH1cblxuXHRcdGlmICggbm9kZS5wYXJlbnROb2RlICkge1xuXHRcdFx0aWYgKCBrZWVwRGF0YSAmJiBpc0F0dGFjaGVkKCBub2RlICkgKSB7XG5cdFx0XHRcdHNldEdsb2JhbEV2YWwoIGdldEFsbCggbm9kZSwgXCJzY3JpcHRcIiApICk7XG5cdFx0XHR9XG5cdFx0XHRub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIG5vZGUgKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZWxlbTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXHRodG1sUHJlZmlsdGVyOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHRyZXR1cm4gaHRtbC5yZXBsYWNlKCByeGh0bWxUYWcsIFwiPCQxPjwvJDI+XCIgKTtcblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24oIGVsZW0sIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdHZhciBpLCBsLCBzcmNFbGVtZW50cywgZGVzdEVsZW1lbnRzLFxuXHRcdFx0Y2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApLFxuXHRcdFx0aW5QYWdlID0gaXNBdHRhY2hlZCggZWxlbSApO1xuXG5cdFx0Ly8gRml4IElFIGNsb25pbmcgaXNzdWVzXG5cdFx0aWYgKCAhc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCAmJiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgZWxlbS5ub2RlVHlwZSA9PT0gMTEgKSAmJlxuXHRcdFx0XHQhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cblx0XHRcdC8vIFdlIGVzY2hldyBTaXp6bGUgaGVyZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29uczogaHR0cHM6Ly9qc3BlcmYuY29tL2dldGFsbC12cy1zaXp6bGUvMlxuXHRcdFx0ZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApO1xuXHRcdFx0c3JjRWxlbWVudHMgPSBnZXRBbGwoIGVsZW0gKTtcblxuXHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdGZpeElucHV0KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENvcHkgdGhlIGV2ZW50cyBmcm9tIHRoZSBvcmlnaW5hbCB0byB0aGUgY2xvbmVcblx0XHRpZiAoIGRhdGFBbmRFdmVudHMgKSB7XG5cdFx0XHRpZiAoIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdFx0XHRzcmNFbGVtZW50cyA9IHNyY0VsZW1lbnRzIHx8IGdldEFsbCggZWxlbSApO1xuXHRcdFx0XHRkZXN0RWxlbWVudHMgPSBkZXN0RWxlbWVudHMgfHwgZ2V0QWxsKCBjbG9uZSApO1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdGNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjbG9uZUNvcHlFdmVudCggZWxlbSwgY2xvbmUgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBQcmVzZXJ2ZSBzY3JpcHQgZXZhbHVhdGlvbiBoaXN0b3J5XG5cdFx0ZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSwgXCJzY3JpcHRcIiApO1xuXHRcdGlmICggZGVzdEVsZW1lbnRzLmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRzZXRHbG9iYWxFdmFsKCBkZXN0RWxlbWVudHMsICFpblBhZ2UgJiYgZ2V0QWxsKCBlbGVtLCBcInNjcmlwdFwiICkgKTtcblx0XHR9XG5cblx0XHQvLyBSZXR1cm4gdGhlIGNsb25lZCBzZXRcblx0XHRyZXR1cm4gY2xvbmU7XG5cdH0sXG5cblx0Y2xlYW5EYXRhOiBmdW5jdGlvbiggZWxlbXMgKSB7XG5cdFx0dmFyIGRhdGEsIGVsZW0sIHR5cGUsXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWwsXG5cdFx0XHRpID0gMDtcblxuXHRcdGZvciAoIDsgKCBlbGVtID0gZWxlbXNbIGkgXSApICE9PSB1bmRlZmluZWQ7IGkrKyApIHtcblx0XHRcdGlmICggYWNjZXB0RGF0YSggZWxlbSApICkge1xuXHRcdFx0XHRpZiAoICggZGF0YSA9IGVsZW1bIGRhdGFQcml2LmV4cGFuZG8gXSApICkge1xuXHRcdFx0XHRcdGlmICggZGF0YS5ldmVudHMgKSB7XG5cdFx0XHRcdFx0XHRmb3IgKCB0eXBlIGluIGRhdGEuZXZlbnRzICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoIHNwZWNpYWxbIHR5cGUgXSApIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5yZW1vdmUncyBvdmVyaGVhZFxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZGF0YS5oYW5kbGUgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrXG5cdFx0XHRcdFx0Ly8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlXG5cdFx0XHRcdFx0ZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggZWxlbVsgZGF0YVVzZXIuZXhwYW5kbyBdICkge1xuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9MzUgLSA0NStcblx0XHRcdFx0XHQvLyBBc3NpZ24gdW5kZWZpbmVkIGluc3RlYWQgb2YgdXNpbmcgZGVsZXRlLCBzZWUgRGF0YSNyZW1vdmVcblx0XHRcdFx0XHRlbGVtWyBkYXRhVXNlci5leHBhbmRvIF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRkZXRhY2g6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciwgdHJ1ZSApO1xuXHR9LFxuXG5cdHJlbW92ZTogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiByZW1vdmUoIHRoaXMsIHNlbGVjdG9yICk7XG5cdH0sXG5cblx0dGV4dDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID9cblx0XHRcdFx0alF1ZXJ5LnRleHQoIHRoaXMgKSA6XG5cdFx0XHRcdHRoaXMuZW1wdHkoKS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0XHRcdHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9LFxuXG5cdGFwcGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTtcblx0XHRcdFx0dGFyZ2V0LmFwcGVuZENoaWxkKCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdHByZXBlbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHR2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7XG5cdFx0XHRcdHRhcmdldC5pbnNlcnRCZWZvcmUoIGVsZW0sIHRhcmdldC5maXJzdENoaWxkICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGJlZm9yZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0YWZ0ZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5wYXJlbnROb2RlICkge1xuXHRcdFx0XHR0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGVtcHR5OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZWxlbSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyAoIGVsZW0gPSB0aGlzWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHRcdFx0Ly8gUHJldmVudCBtZW1vcnkgbGVha3Ncblx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7XG5cblx0XHRcdFx0Ly8gUmVtb3ZlIGFueSByZW1haW5pbmcgbm9kZXNcblx0XHRcdFx0ZWxlbS50ZXh0Q29udGVudCA9IFwiXCI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uKCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHRkYXRhQW5kRXZlbnRzID0gZGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZmFsc2UgOiBkYXRhQW5kRXZlbnRzO1xuXHRcdGRlZXBEYXRhQW5kRXZlbnRzID0gZGVlcERhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGRhdGFBbmRFdmVudHMgOiBkZWVwRGF0YUFuZEV2ZW50cztcblxuXHRcdHJldHVybiB0aGlzLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApO1xuXHRcdH0gKTtcblx0fSxcblxuXHRodG1sOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0dmFyIGVsZW0gPSB0aGlzWyAwIF0gfHwge30sXG5cdFx0XHRcdGkgPSAwLFxuXHRcdFx0XHRsID0gdGhpcy5sZW5ndGg7XG5cblx0XHRcdGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5pbm5lckhUTUw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNlZSBpZiB3ZSBjYW4gdGFrZSBhIHNob3J0Y3V0IGFuZCBqdXN0IHVzZSBpbm5lckhUTUxcblx0XHRcdGlmICggdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmICFybm9Jbm5lcmh0bWwudGVzdCggdmFsdWUgKSAmJlxuXHRcdFx0XHQhd3JhcE1hcFsgKCBydGFnTmFtZS5leGVjKCB2YWx1ZSApIHx8IFsgXCJcIiwgXCJcIiBdIClbIDEgXS50b0xvd2VyQ2FzZSgpIF0gKSB7XG5cblx0XHRcdFx0dmFsdWUgPSBqUXVlcnkuaHRtbFByZWZpbHRlciggdmFsdWUgKTtcblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0XHRcdGVsZW0gPSB0aGlzWyBpIF0gfHwge307XG5cblx0XHRcdFx0XHRcdC8vIFJlbW92ZSBlbGVtZW50IG5vZGVzIGFuZCBwcmV2ZW50IG1lbW9yeSBsZWFrc1xuXHRcdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTtcblx0XHRcdFx0XHRcdFx0ZWxlbS5pbm5lckhUTUwgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRlbGVtID0gMDtcblxuXHRcdFx0XHQvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2Rcblx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHRcdHRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7XG5cdFx0XHR9XG5cdFx0fSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggKTtcblx0fSxcblxuXHRyZXBsYWNlV2l0aDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGlnbm9yZWQgPSBbXTtcblxuXHRcdC8vIE1ha2UgdGhlIGNoYW5nZXMsIHJlcGxhY2luZyBlYWNoIG5vbi1pZ25vcmVkIGNvbnRleHQgZWxlbWVudCB3aXRoIHRoZSBuZXcgY29udGVudFxuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG5cblx0XHRcdGlmICggalF1ZXJ5LmluQXJyYXkoIHRoaXMsIGlnbm9yZWQgKSA8IDAgKSB7XG5cdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggdGhpcyApICk7XG5cdFx0XHRcdGlmICggcGFyZW50ICkge1xuXHRcdFx0XHRcdHBhcmVudC5yZXBsYWNlQ2hpbGQoIGVsZW0sIHRoaXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gRm9yY2UgY2FsbGJhY2sgaW52b2NhdGlvblxuXHRcdH0sIGlnbm9yZWQgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCgge1xuXHRhcHBlbmRUbzogXCJhcHBlbmRcIixcblx0cHJlcGVuZFRvOiBcInByZXBlbmRcIixcblx0aW5zZXJ0QmVmb3JlOiBcImJlZm9yZVwiLFxuXHRpbnNlcnRBZnRlcjogXCJhZnRlclwiLFxuXHRyZXBsYWNlQWxsOiBcInJlcGxhY2VXaXRoXCJcbn0sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5hbCApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGVsZW1zLFxuXHRcdFx0cmV0ID0gW10sXG5cdFx0XHRpbnNlcnQgPSBqUXVlcnkoIHNlbGVjdG9yICksXG5cdFx0XHRsYXN0ID0gaW5zZXJ0Lmxlbmd0aCAtIDEsXG5cdFx0XHRpID0gMDtcblxuXHRcdGZvciAoIDsgaSA8PSBsYXN0OyBpKysgKSB7XG5cdFx0XHRlbGVtcyA9IGkgPT09IGxhc3QgPyB0aGlzIDogdGhpcy5jbG9uZSggdHJ1ZSApO1xuXHRcdFx0alF1ZXJ5KCBpbnNlcnRbIGkgXSApWyBvcmlnaW5hbCBdKCBlbGVtcyApO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdC8vIC5nZXQoKSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdHB1c2guYXBwbHkoIHJldCwgZWxlbXMuZ2V0KCkgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCApO1xuXHR9O1xufSApO1xudmFyIHJudW1ub25weCA9IG5ldyBSZWdFeHAoIFwiXihcIiArIHBudW0gKyBcIikoPyFweClbYS16JV0rJFwiLCBcImlcIiApO1xuXG52YXIgZ2V0U3R5bGVzID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHksIEZpcmVmb3ggPD0zMCAoIzE1MDk4LCAjMTQxNTApXG5cdFx0Ly8gSUUgdGhyb3dzIG9uIGVsZW1lbnRzIGNyZWF0ZWQgaW4gcG9wdXBzXG5cdFx0Ly8gRkYgbWVhbndoaWxlIHRocm93cyBvbiBmcmFtZSBlbGVtZW50cyB0aHJvdWdoIFwiZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZVwiXG5cdFx0dmFyIHZpZXcgPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XG5cblx0XHRpZiAoICF2aWV3IHx8ICF2aWV3Lm9wZW5lciApIHtcblx0XHRcdHZpZXcgPSB3aW5kb3c7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSApO1xuXHR9O1xuXG52YXIgcmJveFN0eWxlID0gbmV3IFJlZ0V4cCggY3NzRXhwYW5kLmpvaW4oIFwifFwiICksIFwiaVwiICk7XG5cblxuXG4oIGZ1bmN0aW9uKCkge1xuXG5cdC8vIEV4ZWN1dGluZyBib3RoIHBpeGVsUG9zaXRpb24gJiBib3hTaXppbmdSZWxpYWJsZSB0ZXN0cyByZXF1aXJlIG9ubHkgb25lIGxheW91dFxuXHQvLyBzbyB0aGV5J3JlIGV4ZWN1dGVkIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSB0aGUgc2Vjb25kIGNvbXB1dGF0aW9uLlxuXHRmdW5jdGlvbiBjb21wdXRlU3R5bGVUZXN0cygpIHtcblxuXHRcdC8vIFRoaXMgaXMgYSBzaW5nbGV0b24sIHdlIG5lZWQgdG8gZXhlY3V0ZSBpdCBvbmx5IG9uY2Vcblx0XHRpZiAoICFkaXYgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSBcInBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7d2lkdGg6NjBweDtcIiArXG5cdFx0XHRcIm1hcmdpbi10b3A6MXB4O3BhZGRpbmc6MDtib3JkZXI6MFwiO1xuXHRcdGRpdi5zdHlsZS5jc3NUZXh0ID1cblx0XHRcdFwicG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6c2Nyb2xsO1wiICtcblx0XHRcdFwibWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDtcIiArXG5cdFx0XHRcIndpZHRoOjYwJTt0b3A6MSVcIjtcblx0XHRkb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoIGNvbnRhaW5lciApLmFwcGVuZENoaWxkKCBkaXYgKTtcblxuXHRcdHZhciBkaXZTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBkaXYgKTtcblx0XHRwaXhlbFBvc2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9PSBcIjElXCI7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBGaXJlZm94IDw9MyAtIDQ0XG5cdFx0cmVsaWFibGVNYXJnaW5MZWZ0VmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS5tYXJnaW5MZWZ0ICkgPT09IDEyO1xuXG5cdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA0LjAgLSA0LjMgb25seSwgU2FmYXJpIDw9OS4xIC0gMTAuMSwgaU9TIDw9Ny4wIC0gOS4zXG5cdFx0Ly8gU29tZSBzdHlsZXMgY29tZSBiYWNrIHdpdGggcGVyY2VudGFnZSB2YWx1ZXMsIGV2ZW4gdGhvdWdoIHRoZXkgc2hvdWxkbid0XG5cdFx0ZGl2LnN0eWxlLnJpZ2h0ID0gXCI2MCVcIjtcblx0XHRwaXhlbEJveFN0eWxlc1ZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2U3R5bGUucmlnaHQgKSA9PT0gMzY7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IC0gMTEgb25seVxuXHRcdC8vIERldGVjdCBtaXNyZXBvcnRpbmcgb2YgY29udGVudCBkaW1lbnNpb25zIGZvciBib3gtc2l6aW5nOmJvcmRlci1ib3ggZWxlbWVudHNcblx0XHRib3hTaXppbmdSZWxpYWJsZVZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2U3R5bGUud2lkdGggKSA9PT0gMzY7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IG9ubHlcblx0XHQvLyBEZXRlY3Qgb3ZlcmZsb3c6c2Nyb2xsIHNjcmV3aW5lc3MgKGdoLTM2OTkpXG5cdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9NjRcblx0XHQvLyBEb24ndCBnZXQgdHJpY2tlZCB3aGVuIHpvb20gYWZmZWN0cyBvZmZzZXRXaWR0aCAoZ2gtNDAyOSlcblx0XHRkaXYuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdFx0c2Nyb2xsYm94U2l6ZVZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2Lm9mZnNldFdpZHRoIC8gMyApID09PSAxMjtcblxuXHRcdGRvY3VtZW50RWxlbWVudC5yZW1vdmVDaGlsZCggY29udGFpbmVyICk7XG5cblx0XHQvLyBOdWxsaWZ5IHRoZSBkaXYgc28gaXQgd291bGRuJ3QgYmUgc3RvcmVkIGluIHRoZSBtZW1vcnkgYW5kXG5cdFx0Ly8gaXQgd2lsbCBhbHNvIGJlIGEgc2lnbiB0aGF0IGNoZWNrcyBhbHJlYWR5IHBlcmZvcm1lZFxuXHRcdGRpdiA9IG51bGw7XG5cdH1cblxuXHRmdW5jdGlvbiByb3VuZFBpeGVsTWVhc3VyZXMoIG1lYXN1cmUgKSB7XG5cdFx0cmV0dXJuIE1hdGgucm91bmQoIHBhcnNlRmxvYXQoIG1lYXN1cmUgKSApO1xuXHR9XG5cblx0dmFyIHBpeGVsUG9zaXRpb25WYWwsIGJveFNpemluZ1JlbGlhYmxlVmFsLCBzY3JvbGxib3hTaXplVmFsLCBwaXhlbEJveFN0eWxlc1ZhbCxcblx0XHRyZWxpYWJsZU1hcmdpbkxlZnRWYWwsXG5cdFx0Y29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApLFxuXHRcdGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKTtcblxuXHQvLyBGaW5pc2ggZWFybHkgaW4gbGltaXRlZCAobm9uLWJyb3dzZXIpIGVudmlyb25tZW50c1xuXHRpZiAoICFkaXYuc3R5bGUgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHQvLyBTdHlsZSBvZiBjbG9uZWQgZWxlbWVudCBhZmZlY3RzIHNvdXJjZSBlbGVtZW50IGNsb25lZCAoIzg5MDgpXG5cdGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9IFwiY29udGVudC1ib3hcIjtcblx0ZGl2LmNsb25lTm9kZSggdHJ1ZSApLnN0eWxlLmJhY2tncm91bmRDbGlwID0gXCJcIjtcblx0c3VwcG9ydC5jbGVhckNsb25lU3R5bGUgPSBkaXYuc3R5bGUuYmFja2dyb3VuZENsaXAgPT09IFwiY29udGVudC1ib3hcIjtcblxuXHRqUXVlcnkuZXh0ZW5kKCBzdXBwb3J0LCB7XG5cdFx0Ym94U2l6aW5nUmVsaWFibGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBib3hTaXppbmdSZWxpYWJsZVZhbDtcblx0XHR9LFxuXHRcdHBpeGVsQm94U3R5bGVzOiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gcGl4ZWxCb3hTdHlsZXNWYWw7XG5cdFx0fSxcblx0XHRwaXhlbFBvc2l0aW9uOiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gcGl4ZWxQb3NpdGlvblZhbDtcblx0XHR9LFxuXHRcdHJlbGlhYmxlTWFyZ2luTGVmdDogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIHJlbGlhYmxlTWFyZ2luTGVmdFZhbDtcblx0XHR9LFxuXHRcdHNjcm9sbGJveFNpemU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBzY3JvbGxib3hTaXplVmFsO1xuXHRcdH1cblx0fSApO1xufSApKCk7XG5cblxuZnVuY3Rpb24gY3VyQ1NTKCBlbGVtLCBuYW1lLCBjb21wdXRlZCApIHtcblx0dmFyIHdpZHRoLCBtaW5XaWR0aCwgbWF4V2lkdGgsIHJldCxcblxuXHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggNTErXG5cdFx0Ly8gUmV0cmlldmluZyBzdHlsZSBiZWZvcmUgY29tcHV0ZWQgc29tZWhvd1xuXHRcdC8vIGZpeGVzIGFuIGlzc3VlIHdpdGggZ2V0dGluZyB3cm9uZyB2YWx1ZXNcblx0XHQvLyBvbiBkZXRhY2hlZCBlbGVtZW50c1xuXHRcdHN0eWxlID0gZWxlbS5zdHlsZTtcblxuXHRjb21wdXRlZCA9IGNvbXB1dGVkIHx8IGdldFN0eWxlcyggZWxlbSApO1xuXG5cdC8vIGdldFByb3BlcnR5VmFsdWUgaXMgbmVlZGVkIGZvcjpcblx0Ly8gICAuY3NzKCdmaWx0ZXInKSAoSUUgOSBvbmx5LCAjMTI1MzcpXG5cdC8vICAgLmNzcygnLS1jdXN0b21Qcm9wZXJ0eSkgKCMzMTQ0KVxuXHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdHJldCA9IGNvbXB1dGVkLmdldFByb3BlcnR5VmFsdWUoIG5hbWUgKSB8fCBjb21wdXRlZFsgbmFtZSBdO1xuXG5cdFx0aWYgKCByZXQgPT09IFwiXCIgJiYgIWlzQXR0YWNoZWQoIGVsZW0gKSApIHtcblx0XHRcdHJldCA9IGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSApO1xuXHRcdH1cblxuXHRcdC8vIEEgdHJpYnV0ZSB0byB0aGUgXCJhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzXCJcblx0XHQvLyBBbmRyb2lkIEJyb3dzZXIgcmV0dXJucyBwZXJjZW50YWdlIGZvciBzb21lIHZhbHVlcyxcblx0XHQvLyBidXQgd2lkdGggc2VlbXMgdG8gYmUgcmVsaWFibHkgcGl4ZWxzLlxuXHRcdC8vIFRoaXMgaXMgYWdhaW5zdCB0aGUgQ1NTT00gZHJhZnQgc3BlYzpcblx0XHQvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI3Jlc29sdmVkLXZhbHVlc1xuXHRcdGlmICggIXN1cHBvcnQucGl4ZWxCb3hTdHlsZXMoKSAmJiBybnVtbm9ucHgudGVzdCggcmV0ICkgJiYgcmJveFN0eWxlLnRlc3QoIG5hbWUgKSApIHtcblxuXHRcdFx0Ly8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlc1xuXHRcdFx0d2lkdGggPSBzdHlsZS53aWR0aDtcblx0XHRcdG1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7XG5cdFx0XHRtYXhXaWR0aCA9IHN0eWxlLm1heFdpZHRoO1xuXG5cdFx0XHQvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0XG5cdFx0XHRzdHlsZS5taW5XaWR0aCA9IHN0eWxlLm1heFdpZHRoID0gc3R5bGUud2lkdGggPSByZXQ7XG5cdFx0XHRyZXQgPSBjb21wdXRlZC53aWR0aDtcblxuXHRcdFx0Ly8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlc1xuXHRcdFx0c3R5bGUud2lkdGggPSB3aWR0aDtcblx0XHRcdHN0eWxlLm1pbldpZHRoID0gbWluV2lkdGg7XG5cdFx0XHRzdHlsZS5tYXhXaWR0aCA9IG1heFdpZHRoO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXQgIT09IHVuZGVmaW5lZCA/XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5XG5cdFx0Ly8gSUUgcmV0dXJucyB6SW5kZXggdmFsdWUgYXMgYW4gaW50ZWdlci5cblx0XHRyZXQgKyBcIlwiIDpcblx0XHRyZXQ7XG59XG5cblxuZnVuY3Rpb24gYWRkR2V0SG9va0lmKCBjb25kaXRpb25GbiwgaG9va0ZuICkge1xuXG5cdC8vIERlZmluZSB0aGUgaG9vaywgd2UnbGwgY2hlY2sgb24gdGhlIGZpcnN0IHJ1biBpZiBpdCdzIHJlYWxseSBuZWVkZWQuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggY29uZGl0aW9uRm4oKSApIHtcblxuXHRcdFx0XHQvLyBIb29rIG5vdCBuZWVkZWQgKG9yIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHVzZSBpdCBkdWVcblx0XHRcdFx0Ly8gdG8gbWlzc2luZyBkZXBlbmRlbmN5KSwgcmVtb3ZlIGl0LlxuXHRcdFx0XHRkZWxldGUgdGhpcy5nZXQ7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSG9vayBuZWVkZWQ7IHJlZGVmaW5lIGl0IHNvIHRoYXQgdGhlIHN1cHBvcnQgdGVzdCBpcyBub3QgZXhlY3V0ZWQgYWdhaW4uXG5cdFx0XHRyZXR1cm4gKCB0aGlzLmdldCA9IGhvb2tGbiApLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9XG5cdH07XG59XG5cblxudmFyIGNzc1ByZWZpeGVzID0gWyBcIldlYmtpdFwiLCBcIk1velwiLCBcIm1zXCIgXSxcblx0ZW1wdHlTdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKS5zdHlsZSxcblx0dmVuZG9yUHJvcHMgPSB7fTtcblxuLy8gUmV0dXJuIGEgdmVuZG9yLXByZWZpeGVkIHByb3BlcnR5IG9yIHVuZGVmaW5lZFxuZnVuY3Rpb24gdmVuZG9yUHJvcE5hbWUoIG5hbWUgKSB7XG5cblx0Ly8gQ2hlY2sgZm9yIHZlbmRvciBwcmVmaXhlZCBuYW1lc1xuXHR2YXIgY2FwTmFtZSA9IG5hbWVbIDAgXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSggMSApLFxuXHRcdGkgPSBjc3NQcmVmaXhlcy5sZW5ndGg7XG5cblx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0bmFtZSA9IGNzc1ByZWZpeGVzWyBpIF0gKyBjYXBOYW1lO1xuXHRcdGlmICggbmFtZSBpbiBlbXB0eVN0eWxlICkge1xuXHRcdFx0cmV0dXJuIG5hbWU7XG5cdFx0fVxuXHR9XG59XG5cbi8vIFJldHVybiBhIHBvdGVudGlhbGx5LW1hcHBlZCBqUXVlcnkuY3NzUHJvcHMgb3IgdmVuZG9yIHByZWZpeGVkIHByb3BlcnR5XG5mdW5jdGlvbiBmaW5hbFByb3BOYW1lKCBuYW1lICkge1xuXHR2YXIgZmluYWwgPSBqUXVlcnkuY3NzUHJvcHNbIG5hbWUgXSB8fCB2ZW5kb3JQcm9wc1sgbmFtZSBdO1xuXG5cdGlmICggZmluYWwgKSB7XG5cdFx0cmV0dXJuIGZpbmFsO1xuXHR9XG5cdGlmICggbmFtZSBpbiBlbXB0eVN0eWxlICkge1xuXHRcdHJldHVybiBuYW1lO1xuXHR9XG5cdHJldHVybiB2ZW5kb3JQcm9wc1sgbmFtZSBdID0gdmVuZG9yUHJvcE5hbWUoIG5hbWUgKSB8fCBuYW1lO1xufVxuXG5cbnZhclxuXG5cdC8vIFN3YXBwYWJsZSBpZiBkaXNwbGF5IGlzIG5vbmUgb3Igc3RhcnRzIHdpdGggdGFibGVcblx0Ly8gZXhjZXB0IFwidGFibGVcIiwgXCJ0YWJsZS1jZWxsXCIsIG9yIFwidGFibGUtY2FwdGlvblwiXG5cdC8vIFNlZSBoZXJlIGZvciBkaXNwbGF5IHZhbHVlczogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9DU1MvZGlzcGxheVxuXHRyZGlzcGxheXN3YXAgPSAvXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sXG5cdHJjdXN0b21Qcm9wID0gL14tLS8sXG5cdGNzc1Nob3cgPSB7IHBvc2l0aW9uOiBcImFic29sdXRlXCIsIHZpc2liaWxpdHk6IFwiaGlkZGVuXCIsIGRpc3BsYXk6IFwiYmxvY2tcIiB9LFxuXHRjc3NOb3JtYWxUcmFuc2Zvcm0gPSB7XG5cdFx0bGV0dGVyU3BhY2luZzogXCIwXCIsXG5cdFx0Zm9udFdlaWdodDogXCI0MDBcIlxuXHR9O1xuXG5mdW5jdGlvbiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICkge1xuXG5cdC8vIEFueSByZWxhdGl2ZSAoKy8tKSB2YWx1ZXMgaGF2ZSBhbHJlYWR5IGJlZW5cblx0Ly8gbm9ybWFsaXplZCBhdCB0aGlzIHBvaW50XG5cdHZhciBtYXRjaGVzID0gcmNzc051bS5leGVjKCB2YWx1ZSApO1xuXHRyZXR1cm4gbWF0Y2hlcyA/XG5cblx0XHQvLyBHdWFyZCBhZ2FpbnN0IHVuZGVmaW5lZCBcInN1YnRyYWN0XCIsIGUuZy4sIHdoZW4gdXNlZCBhcyBpbiBjc3NIb29rc1xuXHRcdE1hdGgubWF4KCAwLCBtYXRjaGVzWyAyIF0gLSAoIHN1YnRyYWN0IHx8IDAgKSApICsgKCBtYXRjaGVzWyAzIF0gfHwgXCJweFwiICkgOlxuXHRcdHZhbHVlO1xufVxuXG5mdW5jdGlvbiBib3hNb2RlbEFkanVzdG1lbnQoIGVsZW0sIGRpbWVuc2lvbiwgYm94LCBpc0JvcmRlckJveCwgc3R5bGVzLCBjb21wdXRlZFZhbCApIHtcblx0dmFyIGkgPSBkaW1lbnNpb24gPT09IFwid2lkdGhcIiA/IDEgOiAwLFxuXHRcdGV4dHJhID0gMCxcblx0XHRkZWx0YSA9IDA7XG5cblx0Ly8gQWRqdXN0bWVudCBtYXkgbm90IGJlIG5lY2Vzc2FyeVxuXHRpZiAoIGJveCA9PT0gKCBpc0JvcmRlckJveCA/IFwiYm9yZGVyXCIgOiBcImNvbnRlbnRcIiApICkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0Zm9yICggOyBpIDwgNDsgaSArPSAyICkge1xuXG5cdFx0Ly8gQm90aCBib3ggbW9kZWxzIGV4Y2x1ZGUgbWFyZ2luXG5cdFx0aWYgKCBib3ggPT09IFwibWFyZ2luXCIgKSB7XG5cdFx0XHRkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCBib3ggKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgd2UgZ2V0IGhlcmUgd2l0aCBhIGNvbnRlbnQtYm94LCB3ZSdyZSBzZWVraW5nIFwicGFkZGluZ1wiIG9yIFwiYm9yZGVyXCIgb3IgXCJtYXJnaW5cIlxuXHRcdGlmICggIWlzQm9yZGVyQm94ICkge1xuXG5cdFx0XHQvLyBBZGQgcGFkZGluZ1xuXHRcdFx0ZGVsdGEgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJwYWRkaW5nXCIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cblx0XHRcdC8vIEZvciBcImJvcmRlclwiIG9yIFwibWFyZ2luXCIsIGFkZCBib3JkZXJcblx0XHRcdGlmICggYm94ICE9PSBcInBhZGRpbmdcIiApIHtcblx0XHRcdFx0ZGVsdGEgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblxuXHRcdFx0Ly8gQnV0IHN0aWxsIGtlZXAgdHJhY2sgb2YgaXQgb3RoZXJ3aXNlXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRleHRyYSArPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJvcmRlclwiICsgY3NzRXhwYW5kWyBpIF0gKyBcIldpZHRoXCIsIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXG5cdFx0Ly8gSWYgd2UgZ2V0IGhlcmUgd2l0aCBhIGJvcmRlci1ib3ggKGNvbnRlbnQgKyBwYWRkaW5nICsgYm9yZGVyKSwgd2UncmUgc2Vla2luZyBcImNvbnRlbnRcIiBvclxuXHRcdC8vIFwicGFkZGluZ1wiIG9yIFwibWFyZ2luXCJcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBGb3IgXCJjb250ZW50XCIsIHN1YnRyYWN0IHBhZGRpbmdcblx0XHRcdGlmICggYm94ID09PSBcImNvbnRlbnRcIiApIHtcblx0XHRcdFx0ZGVsdGEgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJwYWRkaW5nXCIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvciBcImNvbnRlbnRcIiBvciBcInBhZGRpbmdcIiwgc3VidHJhY3QgYm9yZGVyXG5cdFx0XHRpZiAoIGJveCAhPT0gXCJtYXJnaW5cIiApIHtcblx0XHRcdFx0ZGVsdGEgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBBY2NvdW50IGZvciBwb3NpdGl2ZSBjb250ZW50LWJveCBzY3JvbGwgZ3V0dGVyIHdoZW4gcmVxdWVzdGVkIGJ5IHByb3ZpZGluZyBjb21wdXRlZFZhbFxuXHRpZiAoICFpc0JvcmRlckJveCAmJiBjb21wdXRlZFZhbCA+PSAwICkge1xuXG5cdFx0Ly8gb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGlzIGEgcm91bmRlZCBzdW0gb2YgY29udGVudCwgcGFkZGluZywgc2Nyb2xsIGd1dHRlciwgYW5kIGJvcmRlclxuXHRcdC8vIEFzc3VtaW5nIGludGVnZXIgc2Nyb2xsIGd1dHRlciwgc3VidHJhY3QgdGhlIHJlc3QgYW5kIHJvdW5kIGRvd25cblx0XHRkZWx0YSArPSBNYXRoLm1heCggMCwgTWF0aC5jZWlsKFxuXHRcdFx0ZWxlbVsgXCJvZmZzZXRcIiArIGRpbWVuc2lvblsgMCBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoIDEgKSBdIC1cblx0XHRcdGNvbXB1dGVkVmFsIC1cblx0XHRcdGRlbHRhIC1cblx0XHRcdGV4dHJhIC1cblx0XHRcdDAuNVxuXG5cdFx0Ly8gSWYgb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGlzIHVua25vd24sIHRoZW4gd2UgY2FuJ3QgZGV0ZXJtaW5lIGNvbnRlbnQtYm94IHNjcm9sbCBndXR0ZXJcblx0XHQvLyBVc2UgYW4gZXhwbGljaXQgemVybyB0byBhdm9pZCBOYU4gKGdoLTM5NjQpXG5cdFx0KSApIHx8IDA7XG5cdH1cblxuXHRyZXR1cm4gZGVsdGE7XG59XG5cbmZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKSB7XG5cblx0Ly8gU3RhcnQgd2l0aCBjb21wdXRlZCBzdHlsZVxuXHR2YXIgc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksXG5cblx0XHQvLyBUbyBhdm9pZCBmb3JjaW5nIGEgcmVmbG93LCBvbmx5IGZldGNoIGJveFNpemluZyBpZiB3ZSBuZWVkIGl0IChnaC00MzIyKS5cblx0XHQvLyBGYWtlIGNvbnRlbnQtYm94IHVudGlsIHdlIGtub3cgaXQncyBuZWVkZWQgdG8ga25vdyB0aGUgdHJ1ZSB2YWx1ZS5cblx0XHRib3hTaXppbmdOZWVkZWQgPSAhc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZSgpIHx8IGV4dHJhLFxuXHRcdGlzQm9yZGVyQm94ID0gYm94U2l6aW5nTmVlZGVkICYmXG5cdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiYm9yZGVyLWJveFwiLFxuXHRcdHZhbHVlSXNCb3JkZXJCb3ggPSBpc0JvcmRlckJveCxcblxuXHRcdHZhbCA9IGN1ckNTUyggZWxlbSwgZGltZW5zaW9uLCBzdHlsZXMgKSxcblx0XHRvZmZzZXRQcm9wID0gXCJvZmZzZXRcIiArIGRpbWVuc2lvblsgMCBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoIDEgKTtcblxuXHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9NTRcblx0Ly8gUmV0dXJuIGEgY29uZm91bmRpbmcgbm9uLXBpeGVsIHZhbHVlIG9yIGZlaWduIGlnbm9yYW5jZSwgYXMgYXBwcm9wcmlhdGUuXG5cdGlmICggcm51bW5vbnB4LnRlc3QoIHZhbCApICkge1xuXHRcdGlmICggIWV4dHJhICkge1xuXHRcdFx0cmV0dXJuIHZhbDtcblx0XHR9XG5cdFx0dmFsID0gXCJhdXRvXCI7XG5cdH1cblxuXG5cdC8vIEZhbGwgYmFjayB0byBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgd2hlbiB2YWx1ZSBpcyBcImF1dG9cIlxuXHQvLyBUaGlzIGhhcHBlbnMgZm9yIGlubGluZSBlbGVtZW50cyB3aXRoIG5vIGV4cGxpY2l0IHNldHRpbmcgKGdoLTM1NzEpXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgLSA0LjMgb25seVxuXHQvLyBBbHNvIHVzZSBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgZm9yIG1pc3JlcG9ydGVkIGlubGluZSBkaW1lbnNpb25zIChnaC0zNjAyKVxuXHQvLyBTdXBwb3J0OiBJRSA5LTExIG9ubHlcblx0Ly8gQWxzbyB1c2Ugb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGZvciB3aGVuIGJveCBzaXppbmcgaXMgdW5yZWxpYWJsZVxuXHQvLyBXZSB1c2UgZ2V0Q2xpZW50UmVjdHMoKSB0byBjaGVjayBmb3IgaGlkZGVuL2Rpc2Nvbm5lY3RlZC5cblx0Ly8gSW4gdGhvc2UgY2FzZXMsIHRoZSBjb21wdXRlZCB2YWx1ZSBjYW4gYmUgdHJ1c3RlZCB0byBiZSBib3JkZXItYm94XG5cdGlmICggKCAhc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZSgpICYmIGlzQm9yZGVyQm94IHx8XG5cdFx0dmFsID09PSBcImF1dG9cIiB8fFxuXHRcdCFwYXJzZUZsb2F0KCB2YWwgKSAmJiBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiwgZmFsc2UsIHN0eWxlcyApID09PSBcImlubGluZVwiICkgJiZcblx0XHRlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoICkge1xuXG5cdFx0aXNCb3JkZXJCb3ggPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiYm9yZGVyLWJveFwiO1xuXG5cdFx0Ly8gV2hlcmUgYXZhaWxhYmxlLCBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgYXBwcm94aW1hdGUgYm9yZGVyIGJveCBkaW1lbnNpb25zLlxuXHRcdC8vIFdoZXJlIG5vdCBhdmFpbGFibGUgKGUuZy4sIFNWRyksIGFzc3VtZSB1bnJlbGlhYmxlIGJveC1zaXppbmcgYW5kIGludGVycHJldCB0aGVcblx0XHQvLyByZXRyaWV2ZWQgdmFsdWUgYXMgYSBjb250ZW50IGJveCBkaW1lbnNpb24uXG5cdFx0dmFsdWVJc0JvcmRlckJveCA9IG9mZnNldFByb3AgaW4gZWxlbTtcblx0XHRpZiAoIHZhbHVlSXNCb3JkZXJCb3ggKSB7XG5cdFx0XHR2YWwgPSBlbGVtWyBvZmZzZXRQcm9wIF07XG5cdFx0fVxuXHR9XG5cblx0Ly8gTm9ybWFsaXplIFwiXCIgYW5kIGF1dG9cblx0dmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDtcblxuXHQvLyBBZGp1c3QgZm9yIHRoZSBlbGVtZW50J3MgYm94IG1vZGVsXG5cdHJldHVybiAoIHZhbCArXG5cdFx0Ym94TW9kZWxBZGp1c3RtZW50KFxuXHRcdFx0ZWxlbSxcblx0XHRcdGRpbWVuc2lvbixcblx0XHRcdGV4dHJhIHx8ICggaXNCb3JkZXJCb3ggPyBcImJvcmRlclwiIDogXCJjb250ZW50XCIgKSxcblx0XHRcdHZhbHVlSXNCb3JkZXJCb3gsXG5cdFx0XHRzdHlsZXMsXG5cblx0XHRcdC8vIFByb3ZpZGUgdGhlIGN1cnJlbnQgY29tcHV0ZWQgc2l6ZSB0byByZXF1ZXN0IHNjcm9sbCBndXR0ZXIgY2FsY3VsYXRpb24gKGdoLTM1ODkpXG5cdFx0XHR2YWxcblx0XHQpXG5cdCkgKyBcInB4XCI7XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHRcblx0Ly8gYmVoYXZpb3Igb2YgZ2V0dGluZyBhbmQgc2V0dGluZyBhIHN0eWxlIHByb3BlcnR5XG5cdGNzc0hvb2tzOiB7XG5cdFx0b3BhY2l0eToge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eVxuXHRcdFx0XHRcdHZhciByZXQgPSBjdXJDU1MoIGVsZW0sIFwib3BhY2l0eVwiICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJldCA9PT0gXCJcIiA/IFwiMVwiIDogcmV0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8vIERvbid0IGF1dG9tYXRpY2FsbHkgYWRkIFwicHhcIiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzXG5cdGNzc051bWJlcjoge1xuXHRcdFwiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnRcIjogdHJ1ZSxcblx0XHRcImNvbHVtbkNvdW50XCI6IHRydWUsXG5cdFx0XCJmaWxsT3BhY2l0eVwiOiB0cnVlLFxuXHRcdFwiZmxleEdyb3dcIjogdHJ1ZSxcblx0XHRcImZsZXhTaHJpbmtcIjogdHJ1ZSxcblx0XHRcImZvbnRXZWlnaHRcIjogdHJ1ZSxcblx0XHRcImdyaWRBcmVhXCI6IHRydWUsXG5cdFx0XCJncmlkQ29sdW1uXCI6IHRydWUsXG5cdFx0XCJncmlkQ29sdW1uRW5kXCI6IHRydWUsXG5cdFx0XCJncmlkQ29sdW1uU3RhcnRcIjogdHJ1ZSxcblx0XHRcImdyaWRSb3dcIjogdHJ1ZSxcblx0XHRcImdyaWRSb3dFbmRcIjogdHJ1ZSxcblx0XHRcImdyaWRSb3dTdGFydFwiOiB0cnVlLFxuXHRcdFwibGluZUhlaWdodFwiOiB0cnVlLFxuXHRcdFwib3BhY2l0eVwiOiB0cnVlLFxuXHRcdFwib3JkZXJcIjogdHJ1ZSxcblx0XHRcIm9ycGhhbnNcIjogdHJ1ZSxcblx0XHRcIndpZG93c1wiOiB0cnVlLFxuXHRcdFwiekluZGV4XCI6IHRydWUsXG5cdFx0XCJ6b29tXCI6IHRydWVcblx0fSxcblxuXHQvLyBBZGQgaW4gcHJvcGVydGllcyB3aG9zZSBuYW1lcyB5b3Ugd2lzaCB0byBmaXggYmVmb3JlXG5cdC8vIHNldHRpbmcgb3IgZ2V0dGluZyB0aGUgdmFsdWVcblx0Y3NzUHJvcHM6IHt9LFxuXG5cdC8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlXG5cdHN0eWxlOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUsIGV4dHJhICkge1xuXG5cdFx0Ly8gRG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXG5cdFx0aWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lXG5cdFx0dmFyIHJldCwgdHlwZSwgaG9va3MsXG5cdFx0XHRvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLFxuXHRcdFx0aXNDdXN0b21Qcm9wID0gcmN1c3RvbVByb3AudGVzdCggbmFtZSApLFxuXHRcdFx0c3R5bGUgPSBlbGVtLnN0eWxlO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndFxuXHRcdC8vIHdhbnQgdG8gcXVlcnkgdGhlIHZhbHVlIGlmIGl0IGlzIGEgQ1NTIGN1c3RvbSBwcm9wZXJ0eVxuXHRcdC8vIHNpbmNlIHRoZXkgYXJlIHVzZXItZGVmaW5lZC5cblx0XHRpZiAoICFpc0N1c3RvbVByb3AgKSB7XG5cdFx0XHRuYW1lID0gZmluYWxQcm9wTmFtZSggb3JpZ05hbWUgKTtcblx0XHR9XG5cblx0XHQvLyBHZXRzIGhvb2sgZm9yIHRoZSBwcmVmaXhlZCB2ZXJzaW9uLCB0aGVuIHVucHJlZml4ZWQgdmVyc2lvblxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgd2UncmUgc2V0dGluZyBhIHZhbHVlXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dHlwZSA9IHR5cGVvZiB2YWx1ZTtcblxuXHRcdFx0Ly8gQ29udmVydCBcIis9XCIgb3IgXCItPVwiIHRvIHJlbGF0aXZlIG51bWJlcnMgKCM3MzQ1KVxuXHRcdFx0aWYgKCB0eXBlID09PSBcInN0cmluZ1wiICYmICggcmV0ID0gcmNzc051bS5leGVjKCB2YWx1ZSApICkgJiYgcmV0WyAxIF0gKSB7XG5cdFx0XHRcdHZhbHVlID0gYWRqdXN0Q1NTKCBlbGVtLCBuYW1lLCByZXQgKTtcblxuXHRcdFx0XHQvLyBGaXhlcyBidWcgIzkyMzdcblx0XHRcdFx0dHlwZSA9IFwibnVtYmVyXCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1ha2Ugc3VyZSB0aGF0IG51bGwgYW5kIE5hTiB2YWx1ZXMgYXJlbid0IHNldCAoIzcxMTYpXG5cdFx0XHRpZiAoIHZhbHVlID09IG51bGwgfHwgdmFsdWUgIT09IHZhbHVlICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgbnVtYmVyIHdhcyBwYXNzZWQgaW4sIGFkZCB0aGUgdW5pdCAoZXhjZXB0IGZvciBjZXJ0YWluIENTUyBwcm9wZXJ0aWVzKVxuXHRcdFx0Ly8gVGhlIGlzQ3VzdG9tUHJvcCBjaGVjayBjYW4gYmUgcmVtb3ZlZCBpbiBqUXVlcnkgNC4wIHdoZW4gd2Ugb25seSBhdXRvLWFwcGVuZFxuXHRcdFx0Ly8gXCJweFwiIHRvIGEgZmV3IGhhcmRjb2RlZCB2YWx1ZXMuXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwibnVtYmVyXCIgJiYgIWlzQ3VzdG9tUHJvcCApIHtcblx0XHRcdFx0dmFsdWUgKz0gcmV0ICYmIHJldFsgMyBdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgb3JpZ05hbWUgXSA/IFwiXCIgOiBcInB4XCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gYmFja2dyb3VuZC0qIHByb3BzIGFmZmVjdCBvcmlnaW5hbCBjbG9uZSdzIHZhbHVlc1xuXHRcdFx0aWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09IFwiXCIgJiYgbmFtZS5pbmRleE9mKCBcImJhY2tncm91bmRcIiApID09PSAwICkge1xuXHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gXCJpbmhlcml0XCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQsIHVzZSB0aGF0IHZhbHVlLCBvdGhlcndpc2UganVzdCBzZXQgdGhlIHNwZWNpZmllZCB2YWx1ZVxuXHRcdFx0aWYgKCAhaG9va3MgfHwgISggXCJzZXRcIiBpbiBob29rcyApIHx8XG5cdFx0XHRcdCggdmFsdWUgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBleHRyYSApICkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRpZiAoIGlzQ3VzdG9tUHJvcCApIHtcblx0XHRcdFx0XHRzdHlsZS5zZXRQcm9wZXJ0eSggbmFtZSwgdmFsdWUgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxuXHRcdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBmYWxzZSwgZXh0cmEgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIGp1c3QgZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBzdHlsZSBvYmplY3Rcblx0XHRcdHJldHVybiBzdHlsZVsgbmFtZSBdO1xuXHRcdH1cblx0fSxcblxuXHRjc3M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBleHRyYSwgc3R5bGVzICkge1xuXHRcdHZhciB2YWwsIG51bSwgaG9va3MsXG5cdFx0XHRvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLFxuXHRcdFx0aXNDdXN0b21Qcm9wID0gcmN1c3RvbVByb3AudGVzdCggbmFtZSApO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndFxuXHRcdC8vIHdhbnQgdG8gbW9kaWZ5IHRoZSB2YWx1ZSBpZiBpdCBpcyBhIENTUyBjdXN0b20gcHJvcGVydHlcblx0XHQvLyBzaW5jZSB0aGV5IGFyZSB1c2VyLWRlZmluZWQuXG5cdFx0aWYgKCAhaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0bmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gVHJ5IHByZWZpeGVkIG5hbWUgZm9sbG93ZWQgYnkgdGhlIHVucHJlZml4ZWQgbmFtZVxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xuXG5cdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmVcblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWwgPSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4dHJhICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXRcblx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTtcblx0XHR9XG5cblx0XHQvLyBDb252ZXJ0IFwibm9ybWFsXCIgdG8gY29tcHV0ZWQgdmFsdWVcblx0XHRpZiAoIHZhbCA9PT0gXCJub3JtYWxcIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHtcblx0XHRcdHZhbCA9IGNzc05vcm1hbFRyYW5zZm9ybVsgbmFtZSBdO1xuXHRcdH1cblxuXHRcdC8vIE1ha2UgbnVtZXJpYyBpZiBmb3JjZWQgb3IgYSBxdWFsaWZpZXIgd2FzIHByb3ZpZGVkIGFuZCB2YWwgbG9va3MgbnVtZXJpY1xuXHRcdGlmICggZXh0cmEgPT09IFwiXCIgfHwgZXh0cmEgKSB7XG5cdFx0XHRudW0gPSBwYXJzZUZsb2F0KCB2YWwgKTtcblx0XHRcdHJldHVybiBleHRyYSA9PT0gdHJ1ZSB8fCBpc0Zpbml0ZSggbnVtICkgPyBudW0gfHwgMCA6IHZhbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiaGVpZ2h0XCIsIFwid2lkdGhcIiBdLCBmdW5jdGlvbiggaSwgZGltZW5zaW9uICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIGRpbWVuc2lvbiBdID0ge1xuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHtcblx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0Ly8gQ2VydGFpbiBlbGVtZW50cyBjYW4gaGF2ZSBkaW1lbnNpb24gaW5mbyBpZiB3ZSBpbnZpc2libHkgc2hvdyB0aGVtXG5cdFx0XHRcdC8vIGJ1dCBpdCBtdXN0IGhhdmUgYSBjdXJyZW50IGRpc3BsYXkgc3R5bGUgdGhhdCB3b3VsZCBiZW5lZml0XG5cdFx0XHRcdHJldHVybiByZGlzcGxheXN3YXAudGVzdCggalF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSApICYmXG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgOCtcblx0XHRcdFx0XHQvLyBUYWJsZSBjb2x1bW5zIGluIFNhZmFyaSBoYXZlIG5vbi16ZXJvIG9mZnNldFdpZHRoICYgemVyb1xuXHRcdFx0XHRcdC8vIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIHVubGVzcyBkaXNwbGF5IGlzIGNoYW5nZWQuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdFx0XHRcdFx0Ly8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYSBkaXNjb25uZWN0ZWQgbm9kZVxuXHRcdFx0XHRcdC8vIGluIElFIHRocm93cyBhbiBlcnJvci5cblx0XHRcdFx0XHQoICFlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoIHx8ICFlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoICkgP1xuXHRcdFx0XHRcdFx0c3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBkaW1lbnNpb24sIGV4dHJhICk7XG5cdFx0XHRcdFx0XHR9ICkgOlxuXHRcdFx0XHRcdFx0Z2V0V2lkdGhPckhlaWdodCggZWxlbSwgZGltZW5zaW9uLCBleHRyYSApO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSB7XG5cdFx0XHR2YXIgbWF0Y2hlcyxcblx0XHRcdFx0c3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksXG5cblx0XHRcdFx0Ly8gT25seSByZWFkIHN0eWxlcy5wb3NpdGlvbiBpZiB0aGUgdGVzdCBoYXMgYSBjaGFuY2UgdG8gZmFpbFxuXHRcdFx0XHQvLyB0byBhdm9pZCBmb3JjaW5nIGEgcmVmbG93LlxuXHRcdFx0XHRzY3JvbGxib3hTaXplQnVnZ3kgPSAhc3VwcG9ydC5zY3JvbGxib3hTaXplKCkgJiZcblx0XHRcdFx0XHRzdHlsZXMucG9zaXRpb24gPT09IFwiYWJzb2x1dGVcIixcblxuXHRcdFx0XHQvLyBUbyBhdm9pZCBmb3JjaW5nIGEgcmVmbG93LCBvbmx5IGZldGNoIGJveFNpemluZyBpZiB3ZSBuZWVkIGl0IChnaC0zOTkxKVxuXHRcdFx0XHRib3hTaXppbmdOZWVkZWQgPSBzY3JvbGxib3hTaXplQnVnZ3kgfHwgZXh0cmEsXG5cdFx0XHRcdGlzQm9yZGVyQm94ID0gYm94U2l6aW5nTmVlZGVkICYmXG5cdFx0XHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgXCJib3hTaXppbmdcIiwgZmFsc2UsIHN0eWxlcyApID09PSBcImJvcmRlci1ib3hcIixcblx0XHRcdFx0c3VidHJhY3QgPSBleHRyYSA/XG5cdFx0XHRcdFx0Ym94TW9kZWxBZGp1c3RtZW50KFxuXHRcdFx0XHRcdFx0ZWxlbSxcblx0XHRcdFx0XHRcdGRpbWVuc2lvbixcblx0XHRcdFx0XHRcdGV4dHJhLFxuXHRcdFx0XHRcdFx0aXNCb3JkZXJCb3gsXG5cdFx0XHRcdFx0XHRzdHlsZXNcblx0XHRcdFx0XHQpIDpcblx0XHRcdFx0XHQwO1xuXG5cdFx0XHQvLyBBY2NvdW50IGZvciB1bnJlbGlhYmxlIGJvcmRlci1ib3ggZGltZW5zaW9ucyBieSBjb21wYXJpbmcgb2Zmc2V0KiB0byBjb21wdXRlZCBhbmRcblx0XHRcdC8vIGZha2luZyBhIGNvbnRlbnQtYm94IHRvIGdldCBib3JkZXIgYW5kIHBhZGRpbmcgKGdoLTM2OTkpXG5cdFx0XHRpZiAoIGlzQm9yZGVyQm94ICYmIHNjcm9sbGJveFNpemVCdWdneSApIHtcblx0XHRcdFx0c3VidHJhY3QgLT0gTWF0aC5jZWlsKFxuXHRcdFx0XHRcdGVsZW1bIFwib2Zmc2V0XCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtXG5cdFx0XHRcdFx0cGFyc2VGbG9hdCggc3R5bGVzWyBkaW1lbnNpb24gXSApIC1cblx0XHRcdFx0XHRib3hNb2RlbEFkanVzdG1lbnQoIGVsZW0sIGRpbWVuc2lvbiwgXCJib3JkZXJcIiwgZmFsc2UsIHN0eWxlcyApIC1cblx0XHRcdFx0XHQwLjVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29udmVydCB0byBwaXhlbHMgaWYgdmFsdWUgYWRqdXN0bWVudCBpcyBuZWVkZWRcblx0XHRcdGlmICggc3VidHJhY3QgJiYgKCBtYXRjaGVzID0gcmNzc051bS5leGVjKCB2YWx1ZSApICkgJiZcblx0XHRcdFx0KCBtYXRjaGVzWyAzIF0gfHwgXCJweFwiICkgIT09IFwicHhcIiApIHtcblxuXHRcdFx0XHRlbGVtLnN0eWxlWyBkaW1lbnNpb24gXSA9IHZhbHVlO1xuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeS5jc3MoIGVsZW0sIGRpbWVuc2lvbiApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gc2V0UG9zaXRpdmVOdW1iZXIoIGVsZW0sIHZhbHVlLCBzdWJ0cmFjdCApO1xuXHRcdH1cblx0fTtcbn0gKTtcblxualF1ZXJ5LmNzc0hvb2tzLm1hcmdpbkxlZnQgPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucmVsaWFibGVNYXJnaW5MZWZ0LFxuXHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0aWYgKCBjb21wdXRlZCApIHtcblx0XHRcdHJldHVybiAoIHBhcnNlRmxvYXQoIGN1ckNTUyggZWxlbSwgXCJtYXJnaW5MZWZ0XCIgKSApIHx8XG5cdFx0XHRcdGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtXG5cdFx0XHRcdFx0c3dhcCggZWxlbSwgeyBtYXJnaW5MZWZ0OiAwIH0sIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcblx0XHRcdFx0XHR9IClcblx0XHRcdFx0KSArIFwicHhcIjtcblx0XHR9XG5cdH1cbik7XG5cbi8vIFRoZXNlIGhvb2tzIGFyZSB1c2VkIGJ5IGFuaW1hdGUgdG8gZXhwYW5kIHByb3BlcnRpZXNcbmpRdWVyeS5lYWNoKCB7XG5cdG1hcmdpbjogXCJcIixcblx0cGFkZGluZzogXCJcIixcblx0Ym9yZGVyOiBcIldpZHRoXCJcbn0sIGZ1bmN0aW9uKCBwcmVmaXgsIHN1ZmZpeCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHtcblx0XHRleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBpID0gMCxcblx0XHRcdFx0ZXhwYW5kZWQgPSB7fSxcblxuXHRcdFx0XHQvLyBBc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmdcblx0XHRcdFx0cGFydHMgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZS5zcGxpdCggXCIgXCIgKSA6IFsgdmFsdWUgXTtcblxuXHRcdFx0Zm9yICggOyBpIDwgNDsgaSsrICkge1xuXHRcdFx0XHRleHBhbmRlZFsgcHJlZml4ICsgY3NzRXhwYW5kWyBpIF0gKyBzdWZmaXggXSA9XG5cdFx0XHRcdFx0cGFydHNbIGkgXSB8fCBwYXJ0c1sgaSAtIDIgXSB8fCBwYXJ0c1sgMCBdO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZXhwYW5kZWQ7XG5cdFx0fVxuXHR9O1xuXG5cdGlmICggcHJlZml4ICE9PSBcIm1hcmdpblwiICkge1xuXHRcdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0uc2V0ID0gc2V0UG9zaXRpdmVOdW1iZXI7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRjc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgc3R5bGVzLCBsZW4sXG5cdFx0XHRcdG1hcCA9IHt9LFxuXHRcdFx0XHRpID0gMDtcblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBuYW1lICkgKSB7XG5cdFx0XHRcdHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApO1xuXHRcdFx0XHRsZW4gPSBuYW1lLmxlbmd0aDtcblxuXHRcdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRtYXBbIG5hbWVbIGkgXSBdID0galF1ZXJ5LmNzcyggZWxlbSwgbmFtZVsgaSBdLCBmYWxzZSwgc3R5bGVzICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbWFwO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6XG5cdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTtcblx0XHR9LCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fVxufSApO1xuXG5cbmZ1bmN0aW9uIFR3ZWVuKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApIHtcblx0cmV0dXJuIG5ldyBUd2Vlbi5wcm90b3R5cGUuaW5pdCggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKTtcbn1cbmpRdWVyeS5Ud2VlbiA9IFR3ZWVuO1xuXG5Ud2Vlbi5wcm90b3R5cGUgPSB7XG5cdGNvbnN0cnVjdG9yOiBUd2Vlbixcblx0aW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkge1xuXHRcdHRoaXMuZWxlbSA9IGVsZW07XG5cdFx0dGhpcy5wcm9wID0gcHJvcDtcblx0XHR0aGlzLmVhc2luZyA9IGVhc2luZyB8fCBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0O1xuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cdFx0dGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTtcblx0XHR0aGlzLmVuZCA9IGVuZDtcblx0XHR0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gXCJcIiA6IFwicHhcIiApO1xuXHR9LFxuXHRjdXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID9cblx0XHRcdGhvb2tzLmdldCggdGhpcyApIDpcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5nZXQoIHRoaXMgKTtcblx0fSxcblx0cnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHtcblx0XHR2YXIgZWFzZWQsXG5cdFx0XHRob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5kdXJhdGlvbiApIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKFxuXHRcdFx0XHRwZXJjZW50LCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKiBwZXJjZW50LCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb25cblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBwZXJjZW50O1xuXHRcdH1cblx0XHR0aGlzLm5vdyA9ICggdGhpcy5lbmQgLSB0aGlzLnN0YXJ0ICkgKiBlYXNlZCArIHRoaXMuc3RhcnQ7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkge1xuXHRcdFx0dGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgaG9va3Muc2V0ICkge1xuXHRcdFx0aG9va3Muc2V0KCB0aGlzICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn07XG5cblR3ZWVuLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZSA9IFR3ZWVuLnByb3RvdHlwZTtcblxuVHdlZW4ucHJvcEhvb2tzID0ge1xuXHRfZGVmYXVsdDoge1xuXHRcdGdldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdFx0dmFyIHJlc3VsdDtcblxuXHRcdFx0Ly8gVXNlIGEgcHJvcGVydHkgb24gdGhlIGVsZW1lbnQgZGlyZWN0bHkgd2hlbiBpdCBpcyBub3QgYSBET00gZWxlbWVudCxcblx0XHRcdC8vIG9yIHdoZW4gdGhlcmUgaXMgbm8gbWF0Y2hpbmcgc3R5bGUgcHJvcGVydHkgdGhhdCBleGlzdHMuXG5cdFx0XHRpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgIT09IDEgfHxcblx0XHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdICE9IG51bGwgJiYgdHdlZW4uZWxlbS5zdHlsZVsgdHdlZW4ucHJvcCBdID09IG51bGwgKSB7XG5cdFx0XHRcdHJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07XG5cdFx0XHR9XG5cblx0XHRcdC8vIFBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3JkIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseVxuXHRcdFx0Ly8gYXR0ZW1wdCBhIHBhcnNlRmxvYXQgYW5kIGZhbGxiYWNrIHRvIGEgc3RyaW5nIGlmIHRoZSBwYXJzZSBmYWlscy5cblx0XHRcdC8vIFNpbXBsZSB2YWx1ZXMgc3VjaCBhcyBcIjEwcHhcIiBhcmUgcGFyc2VkIHRvIEZsb2F0O1xuXHRcdFx0Ly8gY29tcGxleCB2YWx1ZXMgc3VjaCBhcyBcInJvdGF0ZSgxcmFkKVwiIGFyZSByZXR1cm5lZCBhcy1pcy5cblx0XHRcdHJlc3VsdCA9IGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsIFwiXCIgKTtcblxuXHRcdFx0Ly8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCBcImF1dG9cIiBhcmUgY29udmVydGVkIHRvIDAuXG5cdFx0XHRyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09IFwiYXV0b1wiID8gMCA6IHJlc3VsdDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXG5cdFx0XHQvLyBVc2Ugc3RlcCBob29rIGZvciBiYWNrIGNvbXBhdC5cblx0XHRcdC8vIFVzZSBjc3NIb29rIGlmIGl0cyB0aGVyZS5cblx0XHRcdC8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuXG5cdFx0XHRpZiAoIGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0gKSB7XG5cdFx0XHRcdGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0oIHR3ZWVuICk7XG5cdFx0XHR9IGVsc2UgaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlID09PSAxICYmIChcblx0XHRcdFx0XHRqUXVlcnkuY3NzSG9va3NbIHR3ZWVuLnByb3AgXSB8fFxuXHRcdFx0XHRcdHR3ZWVuLmVsZW0uc3R5bGVbIGZpbmFsUHJvcE5hbWUoIHR3ZWVuLnByb3AgKSBdICE9IG51bGwgKSApIHtcblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCB0d2Vlbi5ub3cgKyB0d2Vlbi51bml0ICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzXG5Ud2Vlbi5wcm9wSG9va3Muc2Nyb2xsVG9wID0gVHdlZW4ucHJvcEhvb2tzLnNjcm9sbExlZnQgPSB7XG5cdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZWFzaW5nID0ge1xuXHRsaW5lYXI6IGZ1bmN0aW9uKCBwICkge1xuXHRcdHJldHVybiBwO1xuXHR9LFxuXHRzd2luZzogZnVuY3Rpb24oIHAgKSB7XG5cdFx0cmV0dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjtcblx0fSxcblx0X2RlZmF1bHQ6IFwic3dpbmdcIlxufTtcblxualF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7XG5cbi8vIEJhY2sgY29tcGF0IDwxLjggZXh0ZW5zaW9uIHBvaW50XG5qUXVlcnkuZnguc3RlcCA9IHt9O1xuXG5cblxuXG52YXJcblx0ZnhOb3csIGluUHJvZ3Jlc3MsXG5cdHJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLFxuXHRycnVuID0gL3F1ZXVlSG9va3MkLztcblxuZnVuY3Rpb24gc2NoZWR1bGUoKSB7XG5cdGlmICggaW5Qcm9ncmVzcyApIHtcblx0XHRpZiAoIGRvY3VtZW50LmhpZGRlbiA9PT0gZmFsc2UgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSApIHtcblx0XHRcdHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIHNjaGVkdWxlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBzY2hlZHVsZSwgalF1ZXJ5LmZ4LmludGVydmFsICk7XG5cdFx0fVxuXG5cdFx0alF1ZXJ5LmZ4LnRpY2soKTtcblx0fVxufVxuXG4vLyBBbmltYXRpb25zIGNyZWF0ZWQgc3luY2hyb25vdXNseSB3aWxsIHJ1biBzeW5jaHJvbm91c2x5XG5mdW5jdGlvbiBjcmVhdGVGeE5vdygpIHtcblx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdGZ4Tm93ID0gdW5kZWZpbmVkO1xuXHR9ICk7XG5cdHJldHVybiAoIGZ4Tm93ID0gRGF0ZS5ub3coKSApO1xufVxuXG4vLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvblxuZnVuY3Rpb24gZ2VuRngoIHR5cGUsIGluY2x1ZGVXaWR0aCApIHtcblx0dmFyIHdoaWNoLFxuXHRcdGkgPSAwLFxuXHRcdGF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfTtcblxuXHQvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsXG5cdC8vIG90aGVyd2lzZSBzdGVwIHZhbHVlIGlzIDIgdG8gc2tpcCBvdmVyIExlZnQgYW5kIFJpZ2h0XG5cdGluY2x1ZGVXaWR0aCA9IGluY2x1ZGVXaWR0aCA/IDEgOiAwO1xuXHRmb3IgKCA7IGkgPCA0OyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7XG5cdFx0d2hpY2ggPSBjc3NFeHBhbmRbIGkgXTtcblx0XHRhdHRyc1sgXCJtYXJnaW5cIiArIHdoaWNoIF0gPSBhdHRyc1sgXCJwYWRkaW5nXCIgKyB3aGljaCBdID0gdHlwZTtcblx0fVxuXG5cdGlmICggaW5jbHVkZVdpZHRoICkge1xuXHRcdGF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7XG5cdH1cblxuXHRyZXR1cm4gYXR0cnM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVR3ZWVuKCB2YWx1ZSwgcHJvcCwgYW5pbWF0aW9uICkge1xuXHR2YXIgdHdlZW4sXG5cdFx0Y29sbGVjdGlvbiA9ICggQW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gfHwgW10gKS5jb25jYXQoIEFuaW1hdGlvbi50d2VlbmVyc1sgXCIqXCIgXSApLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRpZiAoICggdHdlZW4gPSBjb2xsZWN0aW9uWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgcHJvcCwgdmFsdWUgKSApICkge1xuXG5cdFx0XHQvLyBXZSdyZSBkb25lIHdpdGggdGhpcyBwcm9wZXJ0eVxuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0UHJlZmlsdGVyKCBlbGVtLCBwcm9wcywgb3B0cyApIHtcblx0dmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIGhvb2tzLCBvbGRmaXJlLCBwcm9wVHdlZW4sIHJlc3RvcmVEaXNwbGF5LCBkaXNwbGF5LFxuXHRcdGlzQm94ID0gXCJ3aWR0aFwiIGluIHByb3BzIHx8IFwiaGVpZ2h0XCIgaW4gcHJvcHMsXG5cdFx0YW5pbSA9IHRoaXMsXG5cdFx0b3JpZyA9IHt9LFxuXHRcdHN0eWxlID0gZWxlbS5zdHlsZSxcblx0XHRoaWRkZW4gPSBlbGVtLm5vZGVUeXBlICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApLFxuXHRcdGRhdGFTaG93ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImZ4c2hvd1wiICk7XG5cblx0Ly8gUXVldWUtc2tpcHBpbmcgYW5pbWF0aW9ucyBoaWphY2sgdGhlIGZ4IGhvb2tzXG5cdGlmICggIW9wdHMucXVldWUgKSB7XG5cdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIFwiZnhcIiApO1xuXHRcdGlmICggaG9va3MudW5xdWV1ZWQgPT0gbnVsbCApIHtcblx0XHRcdGhvb2tzLnVucXVldWVkID0gMDtcblx0XHRcdG9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlO1xuXHRcdFx0aG9va3MuZW1wdHkuZmlyZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoICFob29rcy51bnF1ZXVlZCApIHtcblx0XHRcdFx0XHRvbGRmaXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHRcdGhvb2tzLnVucXVldWVkKys7XG5cblx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzXG5cdFx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGhvb2tzLnVucXVldWVkLS07XG5cdFx0XHRcdGlmICggIWpRdWVyeS5xdWV1ZSggZWxlbSwgXCJmeFwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIERldGVjdCBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRmb3IgKCBwcm9wIGluIHByb3BzICkge1xuXHRcdHZhbHVlID0gcHJvcHNbIHByb3AgXTtcblx0XHRpZiAoIHJmeHR5cGVzLnRlc3QoIHZhbHVlICkgKSB7XG5cdFx0XHRkZWxldGUgcHJvcHNbIHByb3AgXTtcblx0XHRcdHRvZ2dsZSA9IHRvZ2dsZSB8fCB2YWx1ZSA9PT0gXCJ0b2dnbGVcIjtcblx0XHRcdGlmICggdmFsdWUgPT09ICggaGlkZGVuID8gXCJoaWRlXCIgOiBcInNob3dcIiApICkge1xuXG5cdFx0XHRcdC8vIFByZXRlbmQgdG8gYmUgaGlkZGVuIGlmIHRoaXMgaXMgYSBcInNob3dcIiBhbmRcblx0XHRcdFx0Ly8gdGhlcmUgaXMgc3RpbGwgZGF0YSBmcm9tIGEgc3RvcHBlZCBzaG93L2hpZGVcblx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gXCJzaG93XCIgJiYgZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGhpZGRlbiA9IHRydWU7XG5cblx0XHRcdFx0Ly8gSWdub3JlIGFsbCBvdGhlciBuby1vcCBzaG93L2hpZGUgZGF0YVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRvcmlnWyBwcm9wIF0gPSBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdIHx8IGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCApO1xuXHRcdH1cblx0fVxuXG5cdC8vIEJhaWwgb3V0IGlmIHRoaXMgaXMgYSBuby1vcCBsaWtlIC5oaWRlKCkuaGlkZSgpXG5cdHByb3BUd2VlbiA9ICFqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcHMgKTtcblx0aWYgKCAhcHJvcFR3ZWVuICYmIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvcmlnICkgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gUmVzdHJpY3QgXCJvdmVyZmxvd1wiIGFuZCBcImRpc3BsYXlcIiBzdHlsZXMgZHVyaW5nIGJveCBhbmltYXRpb25zXG5cdGlmICggaXNCb3ggJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExLCBFZGdlIDEyIC0gMTVcblx0XHQvLyBSZWNvcmQgYWxsIDMgb3ZlcmZsb3cgYXR0cmlidXRlcyBiZWNhdXNlIElFIGRvZXMgbm90IGluZmVyIHRoZSBzaG9ydGhhbmRcblx0XHQvLyBmcm9tIGlkZW50aWNhbGx5LXZhbHVlZCBvdmVyZmxvd1ggYW5kIG92ZXJmbG93WSBhbmQgRWRnZSBqdXN0IG1pcnJvcnNcblx0XHQvLyB0aGUgb3ZlcmZsb3dYIHZhbHVlIHRoZXJlLlxuXHRcdG9wdHMub3ZlcmZsb3cgPSBbIHN0eWxlLm92ZXJmbG93LCBzdHlsZS5vdmVyZmxvd1gsIHN0eWxlLm92ZXJmbG93WSBdO1xuXG5cdFx0Ly8gSWRlbnRpZnkgYSBkaXNwbGF5IHR5cGUsIHByZWZlcnJpbmcgb2xkIHNob3cvaGlkZSBkYXRhIG92ZXIgdGhlIENTUyBjYXNjYWRlXG5cdFx0cmVzdG9yZURpc3BsYXkgPSBkYXRhU2hvdyAmJiBkYXRhU2hvdy5kaXNwbGF5O1xuXHRcdGlmICggcmVzdG9yZURpc3BsYXkgPT0gbnVsbCApIHtcblx0XHRcdHJlc3RvcmVEaXNwbGF5ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImRpc3BsYXlcIiApO1xuXHRcdH1cblx0XHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKTtcblx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSApIHtcblx0XHRcdFx0ZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5O1xuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBHZXQgbm9uZW1wdHkgdmFsdWUocykgYnkgdGVtcG9yYXJpbHkgZm9yY2luZyB2aXNpYmlsaXR5XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSwgdHJ1ZSApO1xuXHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheSB8fCByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICk7XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFuaW1hdGUgaW5saW5lIGVsZW1lbnRzIGFzIGlubGluZS1ibG9ja1xuXHRcdGlmICggZGlzcGxheSA9PT0gXCJpbmxpbmVcIiB8fCBkaXNwbGF5ID09PSBcImlubGluZS1ibG9ja1wiICYmIHJlc3RvcmVEaXNwbGF5ICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwiZmxvYXRcIiApID09PSBcIm5vbmVcIiApIHtcblxuXHRcdFx0XHQvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBkaXNwbGF5IHZhbHVlIGF0IHRoZSBlbmQgb2YgcHVyZSBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRcdFx0XHRpZiAoICFwcm9wVHdlZW4gKSB7XG5cdFx0XHRcdFx0YW5pbS5kb25lKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0ZGlzcGxheSA9IHN0eWxlLmRpc3BsYXk7XG5cdFx0XHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGRpc3BsYXkgPT09IFwibm9uZVwiID8gXCJcIiA6IGRpc3BsYXk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmICggb3B0cy5vdmVyZmxvdyApIHtcblx0XHRzdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG5cdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXHRcdFx0c3R5bGUub3ZlcmZsb3cgPSBvcHRzLm92ZXJmbG93WyAwIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1ggPSBvcHRzLm92ZXJmbG93WyAxIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gSW1wbGVtZW50IHNob3cvaGlkZSBhbmltYXRpb25zXG5cdHByb3BUd2VlbiA9IGZhbHNlO1xuXHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cblx0XHQvLyBHZW5lcmFsIHNob3cvaGlkZSBzZXR1cCBmb3IgdGhpcyBlbGVtZW50IGFuaW1hdGlvblxuXHRcdGlmICggIXByb3BUd2VlbiApIHtcblx0XHRcdGlmICggZGF0YVNob3cgKSB7XG5cdFx0XHRcdGlmICggXCJoaWRkZW5cIiBpbiBkYXRhU2hvdyApIHtcblx0XHRcdFx0XHRoaWRkZW4gPSBkYXRhU2hvdy5oaWRkZW47XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRhdGFTaG93ID0gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBcImZ4c2hvd1wiLCB7IGRpc3BsYXk6IHJlc3RvcmVEaXNwbGF5IH0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RvcmUgaGlkZGVuL3Zpc2libGUgZm9yIHRvZ2dsZSBzbyBgLnN0b3AoKS50b2dnbGUoKWAgXCJyZXZlcnNlc1wiXG5cdFx0XHRpZiAoIHRvZ2dsZSApIHtcblx0XHRcdFx0ZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2hvdyBlbGVtZW50cyBiZWZvcmUgYW5pbWF0aW5nIHRoZW1cblx0XHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTtcblx0XHRcdH1cblxuXHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovXG5cblx0XHRcdGFuaW0uZG9uZSggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8qIGVzbGludC1lbmFibGUgbm8tbG9vcC1mdW5jICovXG5cblx0XHRcdFx0Ly8gVGhlIGZpbmFsIHN0ZXAgb2YgYSBcImhpZGVcIiBhbmltYXRpb24gaXMgYWN0dWFsbHkgaGlkaW5nIHRoZSBlbGVtZW50XG5cdFx0XHRcdGlmICggIWhpZGRlbiApIHtcblx0XHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFwiZnhzaG93XCIgKTtcblx0XHRcdFx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgb3JpZ1sgcHJvcCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHQvLyBQZXItcHJvcGVydHkgc2V0dXBcblx0XHRwcm9wVHdlZW4gPSBjcmVhdGVUd2VlbiggaGlkZGVuID8gZGF0YVNob3dbIHByb3AgXSA6IDAsIHByb3AsIGFuaW0gKTtcblx0XHRpZiAoICEoIHByb3AgaW4gZGF0YVNob3cgKSApIHtcblx0XHRcdGRhdGFTaG93WyBwcm9wIF0gPSBwcm9wVHdlZW4uc3RhcnQ7XG5cdFx0XHRpZiAoIGhpZGRlbiApIHtcblx0XHRcdFx0cHJvcFR3ZWVuLmVuZCA9IHByb3BUd2Vlbi5zdGFydDtcblx0XHRcdFx0cHJvcFR3ZWVuLnN0YXJ0ID0gMDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gcHJvcEZpbHRlciggcHJvcHMsIHNwZWNpYWxFYXNpbmcgKSB7XG5cdHZhciBpbmRleCwgbmFtZSwgZWFzaW5nLCB2YWx1ZSwgaG9va3M7XG5cblx0Ly8gY2FtZWxDYXNlLCBzcGVjaWFsRWFzaW5nIGFuZCBleHBhbmQgY3NzSG9vayBwYXNzXG5cdGZvciAoIGluZGV4IGluIHByb3BzICkge1xuXHRcdG5hbWUgPSBjYW1lbENhc2UoIGluZGV4ICk7XG5cdFx0ZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdO1xuXHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF07XG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdFx0ZWFzaW5nID0gdmFsdWVbIDEgXTtcblx0XHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgMCBdO1xuXHRcdH1cblxuXHRcdGlmICggaW5kZXggIT09IG5hbWUgKSB7XG5cdFx0XHRwcm9wc1sgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRkZWxldGUgcHJvcHNbIGluZGV4IF07XG5cdFx0fVxuXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTtcblx0XHRpZiAoIGhvb2tzICYmIFwiZXhwYW5kXCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgbmFtZSBdO1xuXG5cdFx0XHQvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuXG5cdFx0XHQvLyBSZXVzaW5nICdpbmRleCcgYmVjYXVzZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IFwibmFtZVwiXG5cdFx0XHRmb3IgKCBpbmRleCBpbiB2YWx1ZSApIHtcblx0XHRcdFx0aWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkge1xuXHRcdFx0XHRcdHByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07XG5cdFx0XHRcdFx0c3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzcGVjaWFsRWFzaW5nWyBuYW1lIF0gPSBlYXNpbmc7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHtcblx0dmFyIHJlc3VsdCxcblx0XHRzdG9wcGVkLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBBbmltYXRpb24ucHJlZmlsdGVycy5sZW5ndGgsXG5cdFx0ZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBEb24ndCBtYXRjaCBlbGVtIGluIHRoZSA6YW5pbWF0ZWQgc2VsZWN0b3Jcblx0XHRcdGRlbGV0ZSB0aWNrLmVsZW07XG5cdFx0fSApLFxuXHRcdHRpY2sgPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggc3RvcHBlZCApIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0dmFyIGN1cnJlbnRUaW1lID0gZnhOb3cgfHwgY3JlYXRlRnhOb3coKSxcblx0XHRcdFx0cmVtYWluaW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRpb24uZHVyYXRpb24gLSBjdXJyZW50VGltZSApLFxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zIG9ubHlcblx0XHRcdFx0Ly8gQXJjaGFpYyBjcmFzaCBidWcgd29uJ3QgYWxsb3cgdXMgdG8gdXNlIGAxIC0gKCAwLjUgfHwgMCApYCAoIzEyNDk3KVxuXHRcdFx0XHR0ZW1wID0gcmVtYWluaW5nIC8gYW5pbWF0aW9uLmR1cmF0aW9uIHx8IDAsXG5cdFx0XHRcdHBlcmNlbnQgPSAxIC0gdGVtcCxcblx0XHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0XHRsZW5ndGggPSBhbmltYXRpb24udHdlZW5zLmxlbmd0aDtcblxuXHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIHBlcmNlbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIHBlcmNlbnQsIHJlbWFpbmluZyBdICk7XG5cblx0XHRcdC8vIElmIHRoZXJlJ3MgbW9yZSB0byBkbywgeWllbGRcblx0XHRcdGlmICggcGVyY2VudCA8IDEgJiYgbGVuZ3RoICkge1xuXHRcdFx0XHRyZXR1cm4gcmVtYWluaW5nO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGlzIHdhcyBhbiBlbXB0eSBhbmltYXRpb24sIHN5bnRoZXNpemUgYSBmaW5hbCBwcm9ncmVzcyBub3RpZmljYXRpb25cblx0XHRcdGlmICggIWxlbmd0aCApIHtcblx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXNvbHZlIHRoZSBhbmltYXRpb24gYW5kIHJlcG9ydCBpdHMgY29uY2x1c2lvblxuXHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uIF0gKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdGFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2UoIHtcblx0XHRcdGVsZW06IGVsZW0sXG5cdFx0XHRwcm9wczogalF1ZXJ5LmV4dGVuZCgge30sIHByb3BlcnRpZXMgKSxcblx0XHRcdG9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHtcblx0XHRcdFx0c3BlY2lhbEVhc2luZzoge30sXG5cdFx0XHRcdGVhc2luZzogalF1ZXJ5LmVhc2luZy5fZGVmYXVsdFxuXHRcdFx0fSwgb3B0aW9ucyApLFxuXHRcdFx0b3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLFxuXHRcdFx0b3JpZ2luYWxPcHRpb25zOiBvcHRpb25zLFxuXHRcdFx0c3RhcnRUaW1lOiBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxuXHRcdFx0ZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sXG5cdFx0XHR0d2VlbnM6IFtdLFxuXHRcdFx0Y3JlYXRlVHdlZW46IGZ1bmN0aW9uKCBwcm9wLCBlbmQgKSB7XG5cdFx0XHRcdHZhciB0d2VlbiA9IGpRdWVyeS5Ud2VlbiggZWxlbSwgYW5pbWF0aW9uLm9wdHMsIHByb3AsIGVuZCxcblx0XHRcdFx0XHRcdGFuaW1hdGlvbi5vcHRzLnNwZWNpYWxFYXNpbmdbIHByb3AgXSB8fCBhbmltYXRpb24ub3B0cy5lYXNpbmcgKTtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVucy5wdXNoKCB0d2VlbiApO1xuXHRcdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0XHR9LFxuXHRcdFx0c3RvcDogZnVuY3Rpb24oIGdvdG9FbmQgKSB7XG5cdFx0XHRcdHZhciBpbmRleCA9IDAsXG5cblx0XHRcdFx0XHQvLyBJZiB3ZSBhcmUgZ29pbmcgdG8gdGhlIGVuZCwgd2Ugd2FudCB0byBydW4gYWxsIHRoZSB0d2VlbnNcblx0XHRcdFx0XHQvLyBvdGhlcndpc2Ugd2Ugc2tpcCB0aGlzIHBhcnRcblx0XHRcdFx0XHRsZW5ndGggPSBnb3RvRW5kID8gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGggOiAwO1xuXHRcdFx0XHRpZiAoIHN0b3BwZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3RvcHBlZCA9IHRydWU7XG5cdFx0XHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIDEgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWU7IG90aGVyd2lzZSwgcmVqZWN0XG5cdFx0XHRcdGlmICggZ290b0VuZCApIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgMSwgMCBdICk7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9XG5cdFx0fSApLFxuXHRcdHByb3BzID0gYW5pbWF0aW9uLnByb3BzO1xuXG5cdHByb3BGaWx0ZXIoIHByb3BzLCBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nICk7XG5cblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRyZXN1bHQgPSBBbmltYXRpb24ucHJlZmlsdGVyc1sgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIGVsZW0sIHByb3BzLCBhbmltYXRpb24ub3B0cyApO1xuXHRcdGlmICggcmVzdWx0ICkge1xuXHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCByZXN1bHQuc3RvcCApICkge1xuXHRcdFx0XHRqUXVlcnkuX3F1ZXVlSG9va3MoIGFuaW1hdGlvbi5lbGVtLCBhbmltYXRpb24ub3B0cy5xdWV1ZSApLnN0b3AgPVxuXHRcdFx0XHRcdHJlc3VsdC5zdG9wLmJpbmQoIHJlc3VsdCApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cdH1cblxuXHRqUXVlcnkubWFwKCBwcm9wcywgY3JlYXRlVHdlZW4sIGFuaW1hdGlvbiApO1xuXG5cdGlmICggaXNGdW5jdGlvbiggYW5pbWF0aW9uLm9wdHMuc3RhcnQgKSApIHtcblx0XHRhbmltYXRpb24ub3B0cy5zdGFydC5jYWxsKCBlbGVtLCBhbmltYXRpb24gKTtcblx0fVxuXG5cdC8vIEF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zXG5cdGFuaW1hdGlvblxuXHRcdC5wcm9ncmVzcyggYW5pbWF0aW9uLm9wdHMucHJvZ3Jlc3MgKVxuXHRcdC5kb25lKCBhbmltYXRpb24ub3B0cy5kb25lLCBhbmltYXRpb24ub3B0cy5jb21wbGV0ZSApXG5cdFx0LmZhaWwoIGFuaW1hdGlvbi5vcHRzLmZhaWwgKVxuXHRcdC5hbHdheXMoIGFuaW1hdGlvbi5vcHRzLmFsd2F5cyApO1xuXG5cdGpRdWVyeS5meC50aW1lcihcblx0XHRqUXVlcnkuZXh0ZW5kKCB0aWNrLCB7XG5cdFx0XHRlbGVtOiBlbGVtLFxuXHRcdFx0YW5pbTogYW5pbWF0aW9uLFxuXHRcdFx0cXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1ZXVlXG5cdFx0fSApXG5cdCk7XG5cblx0cmV0dXJuIGFuaW1hdGlvbjtcbn1cblxualF1ZXJ5LkFuaW1hdGlvbiA9IGpRdWVyeS5leHRlbmQoIEFuaW1hdGlvbiwge1xuXG5cdHR3ZWVuZXJzOiB7XG5cdFx0XCIqXCI6IFsgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkge1xuXHRcdFx0dmFyIHR3ZWVuID0gdGhpcy5jcmVhdGVUd2VlbiggcHJvcCwgdmFsdWUgKTtcblx0XHRcdGFkanVzdENTUyggdHdlZW4uZWxlbSwgcHJvcCwgcmNzc051bS5leGVjKCB2YWx1ZSApLCB0d2VlbiApO1xuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH0gXVxuXHR9LFxuXG5cdHR3ZWVuZXI6IGZ1bmN0aW9uKCBwcm9wcywgY2FsbGJhY2sgKSB7XG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBwcm9wcyApICkge1xuXHRcdFx0Y2FsbGJhY2sgPSBwcm9wcztcblx0XHRcdHByb3BzID0gWyBcIipcIiBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9wcyA9IHByb3BzLm1hdGNoKCBybm90aHRtbHdoaXRlICk7XG5cdFx0fVxuXG5cdFx0dmFyIHByb3AsXG5cdFx0XHRpbmRleCA9IDAsXG5cdFx0XHRsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0cHJvcCA9IHByb3BzWyBpbmRleCBdO1xuXHRcdFx0QW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gPSBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXTtcblx0XHRcdEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9LFxuXG5cdHByZWZpbHRlcnM6IFsgZGVmYXVsdFByZWZpbHRlciBdLFxuXG5cdHByZWZpbHRlcjogZnVuY3Rpb24oIGNhbGxiYWNrLCBwcmVwZW5kICkge1xuXHRcdGlmICggcHJlcGVuZCApIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cbmpRdWVyeS5zcGVlZCA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBmbiApIHtcblx0dmFyIG9wdCA9IHNwZWVkICYmIHR5cGVvZiBzcGVlZCA9PT0gXCJvYmplY3RcIiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDoge1xuXHRcdGNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8XG5cdFx0XHRpc0Z1bmN0aW9uKCBzcGVlZCApICYmIHNwZWVkLFxuXHRcdGR1cmF0aW9uOiBzcGVlZCxcblx0XHRlYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYgIWlzRnVuY3Rpb24oIGVhc2luZyApICYmIGVhc2luZ1xuXHR9O1xuXG5cdC8vIEdvIHRvIHRoZSBlbmQgc3RhdGUgaWYgZnggYXJlIG9mZlxuXHRpZiAoIGpRdWVyeS5meC5vZmYgKSB7XG5cdFx0b3B0LmR1cmF0aW9uID0gMDtcblxuXHR9IGVsc2Uge1xuXHRcdGlmICggdHlwZW9mIG9wdC5kdXJhdGlvbiAhPT0gXCJudW1iZXJcIiApIHtcblx0XHRcdGlmICggb3B0LmR1cmF0aW9uIGluIGpRdWVyeS5meC5zcGVlZHMgKSB7XG5cdFx0XHRcdG9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5zcGVlZHNbIG9wdC5kdXJhdGlvbiBdO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvcHQuZHVyYXRpb24gPSBqUXVlcnkuZnguc3BlZWRzLl9kZWZhdWx0O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIE5vcm1hbGl6ZSBvcHQucXVldWUgLSB0cnVlL3VuZGVmaW5lZC9udWxsIC0+IFwiZnhcIlxuXHRpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHtcblx0XHRvcHQucXVldWUgPSBcImZ4XCI7XG5cdH1cblxuXHQvLyBRdWV1ZWluZ1xuXHRvcHQub2xkID0gb3B0LmNvbXBsZXRlO1xuXG5cdG9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggaXNGdW5jdGlvbiggb3B0Lm9sZCApICkge1xuXHRcdFx0b3B0Lm9sZC5jYWxsKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHQucXVldWUgKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7XG5cdFx0fVxuXHR9O1xuXG5cdHJldHVybiBvcHQ7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGZhZGVUbzogZnVuY3Rpb24oIHNwZWVkLCB0bywgZWFzaW5nLCBjYWxsYmFjayApIHtcblxuXHRcdC8vIFNob3cgYW55IGhpZGRlbiBlbGVtZW50cyBhZnRlciBzZXR0aW5nIG9wYWNpdHkgdG8gMFxuXHRcdHJldHVybiB0aGlzLmZpbHRlciggaXNIaWRkZW5XaXRoaW5UcmVlICkuY3NzKCBcIm9wYWNpdHlcIiwgMCApLnNob3coKVxuXG5cdFx0XHQvLyBBbmltYXRlIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWRcblx0XHRcdC5lbmQoKS5hbmltYXRlKCB7IG9wYWNpdHk6IHRvIH0sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH0sXG5cdGFuaW1hdGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHR2YXIgZW1wdHkgPSBqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcCApLFxuXHRcdFx0b3B0YWxsID0galF1ZXJ5LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLFxuXHRcdFx0ZG9BbmltYXRpb24gPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBPcGVyYXRlIG9uIGEgY29weSBvZiBwcm9wIHNvIHBlci1wcm9wZXJ0eSBlYXNpbmcgd29uJ3QgYmUgbG9zdFxuXHRcdFx0XHR2YXIgYW5pbSA9IEFuaW1hdGlvbiggdGhpcywgalF1ZXJ5LmV4dGVuZCgge30sIHByb3AgKSwgb3B0YWxsICk7XG5cblx0XHRcdFx0Ly8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGltbWVkaWF0ZWx5XG5cdFx0XHRcdGlmICggZW1wdHkgfHwgZGF0YVByaXYuZ2V0KCB0aGlzLCBcImZpbmlzaFwiICkgKSB7XG5cdFx0XHRcdFx0YW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRkb0FuaW1hdGlvbi5maW5pc2ggPSBkb0FuaW1hdGlvbjtcblxuXHRcdHJldHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID9cblx0XHRcdHRoaXMuZWFjaCggZG9BbmltYXRpb24gKSA6XG5cdFx0XHR0aGlzLnF1ZXVlKCBvcHRhbGwucXVldWUsIGRvQW5pbWF0aW9uICk7XG5cdH0sXG5cdHN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkge1xuXHRcdHZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7XG5cdFx0XHR2YXIgc3RvcCA9IGhvb2tzLnN0b3A7XG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdHN0b3AoIGdvdG9FbmQgKTtcblx0XHR9O1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGdvdG9FbmQgPSBjbGVhclF1ZXVlO1xuXHRcdFx0Y2xlYXJRdWV1ZSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7XG5cdFx0XHR0aGlzLnF1ZXVlKCB0eXBlIHx8IFwiZnhcIiwgW10gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBkZXF1ZXVlID0gdHJ1ZSxcblx0XHRcdFx0aW5kZXggPSB0eXBlICE9IG51bGwgJiYgdHlwZSArIFwicXVldWVIb29rc1wiLFxuXHRcdFx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzLFxuXHRcdFx0XHRkYXRhID0gZGF0YVByaXYuZ2V0KCB0aGlzICk7XG5cblx0XHRcdGlmICggaW5kZXggKSB7XG5cdFx0XHRcdGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgKSB7XG5cdFx0XHRcdFx0c3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvciAoIGluZGV4IGluIGRhdGEgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCAmJiBycnVuLnRlc3QoIGluZGV4ICkgKSB7XG5cdFx0XHRcdFx0XHRzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHtcblx0XHRcdFx0aWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJlxuXHRcdFx0XHRcdCggdHlwZSA9PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApICkge1xuXG5cdFx0XHRcdFx0dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggZ290b0VuZCApO1xuXHRcdFx0XHRcdGRlcXVldWUgPSBmYWxzZTtcblx0XHRcdFx0XHR0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQuXG5cdFx0XHQvLyBUaW1lcnMgY3VycmVudGx5IHdpbGwgY2FsbCB0aGVpciBjb21wbGV0ZSBjYWxsYmFja3MsIHdoaWNoXG5cdFx0XHQvLyB3aWxsIGRlcXVldWUgYnV0IG9ubHkgaWYgdGhleSB3ZXJlIGdvdG9FbmQuXG5cdFx0XHRpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7XG5cdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXHRmaW5pc2g6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdGlmICggdHlwZSAhPT0gZmFsc2UgKSB7XG5cdFx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGluZGV4LFxuXHRcdFx0XHRkYXRhID0gZGF0YVByaXYuZ2V0KCB0aGlzICksXG5cdFx0XHRcdHF1ZXVlID0gZGF0YVsgdHlwZSArIFwicXVldWVcIiBdLFxuXHRcdFx0XHRob29rcyA9IGRhdGFbIHR5cGUgKyBcInF1ZXVlSG9va3NcIiBdLFxuXHRcdFx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzLFxuXHRcdFx0XHRsZW5ndGggPSBxdWV1ZSA/IHF1ZXVlLmxlbmd0aCA6IDA7XG5cblx0XHRcdC8vIEVuYWJsZSBmaW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGFcblx0XHRcdGRhdGEuZmluaXNoID0gdHJ1ZTtcblxuXHRcdFx0Ly8gRW1wdHkgdGhlIHF1ZXVlIGZpcnN0XG5cdFx0XHRqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIFtdICk7XG5cblx0XHRcdGlmICggaG9va3MgJiYgaG9va3Muc3RvcCApIHtcblx0XHRcdFx0aG9va3Muc3RvcC5jYWxsKCB0aGlzLCB0cnVlICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIExvb2sgZm9yIGFueSBhY3RpdmUgYW5pbWF0aW9ucywgYW5kIGZpbmlzaCB0aGVtXG5cdFx0XHRmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkge1xuXHRcdFx0XHRpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmIHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApIHtcblx0XHRcdFx0XHR0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdFx0dGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBMb29rIGZvciBhbnkgYW5pbWF0aW9ucyBpbiB0aGUgb2xkIHF1ZXVlIGFuZCBmaW5pc2ggdGhlbVxuXHRcdFx0Zm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0aWYgKCBxdWV1ZVsgaW5kZXggXSAmJiBxdWV1ZVsgaW5kZXggXS5maW5pc2ggKSB7XG5cdFx0XHRcdFx0cXVldWVbIGluZGV4IF0uZmluaXNoLmNhbGwoIHRoaXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBUdXJuIG9mZiBmaW5pc2hpbmcgZmxhZ1xuXHRcdFx0ZGVsZXRlIGRhdGEuZmluaXNoO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCggWyBcInRvZ2dsZVwiLCBcInNob3dcIiwgXCJoaWRlXCIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdHZhciBjc3NGbiA9IGpRdWVyeS5mblsgbmFtZSBdO1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gc3BlZWQgPT0gbnVsbCB8fCB0eXBlb2Ygc3BlZWQgPT09IFwiYm9vbGVhblwiID9cblx0XHRcdGNzc0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSA6XG5cdFx0XHR0aGlzLmFuaW1hdGUoIGdlbkZ4KCBuYW1lLCB0cnVlICksIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbi8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnNcbmpRdWVyeS5lYWNoKCB7XG5cdHNsaWRlRG93bjogZ2VuRngoIFwic2hvd1wiICksXG5cdHNsaWRlVXA6IGdlbkZ4KCBcImhpZGVcIiApLFxuXHRzbGlkZVRvZ2dsZTogZ2VuRngoIFwidG9nZ2xlXCIgKSxcblx0ZmFkZUluOiB7IG9wYWNpdHk6IFwic2hvd1wiIH0sXG5cdGZhZGVPdXQ6IHsgb3BhY2l0eTogXCJoaWRlXCIgfSxcblx0ZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiBcInRvZ2dsZVwiIH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHRoaXMuYW5pbWF0ZSggcHJvcHMsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbmpRdWVyeS50aW1lcnMgPSBbXTtcbmpRdWVyeS5meC50aWNrID0gZnVuY3Rpb24oKSB7XG5cdHZhciB0aW1lcixcblx0XHRpID0gMCxcblx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzO1xuXG5cdGZ4Tm93ID0gRGF0ZS5ub3coKTtcblxuXHRmb3IgKCA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysgKSB7XG5cdFx0dGltZXIgPSB0aW1lcnNbIGkgXTtcblxuXHRcdC8vIFJ1biB0aGUgdGltZXIgYW5kIHNhZmVseSByZW1vdmUgaXQgd2hlbiBkb25lIChhbGxvd2luZyBmb3IgZXh0ZXJuYWwgcmVtb3ZhbClcblx0XHRpZiAoICF0aW1lcigpICYmIHRpbWVyc1sgaSBdID09PSB0aW1lciApIHtcblx0XHRcdHRpbWVycy5zcGxpY2UoIGktLSwgMSApO1xuXHRcdH1cblx0fVxuXG5cdGlmICggIXRpbWVycy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5LmZ4LnN0b3AoKTtcblx0fVxuXHRmeE5vdyA9IHVuZGVmaW5lZDtcbn07XG5cbmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHtcblx0alF1ZXJ5LnRpbWVycy5wdXNoKCB0aW1lciApO1xuXHRqUXVlcnkuZnguc3RhcnQoKTtcbn07XG5cbmpRdWVyeS5meC5pbnRlcnZhbCA9IDEzO1xualF1ZXJ5LmZ4LnN0YXJ0ID0gZnVuY3Rpb24oKSB7XG5cdGlmICggaW5Qcm9ncmVzcyApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRpblByb2dyZXNzID0gdHJ1ZTtcblx0c2NoZWR1bGUoKTtcbn07XG5cbmpRdWVyeS5meC5zdG9wID0gZnVuY3Rpb24oKSB7XG5cdGluUHJvZ3Jlc3MgPSBudWxsO1xufTtcblxualF1ZXJ5LmZ4LnNwZWVkcyA9IHtcblx0c2xvdzogNjAwLFxuXHRmYXN0OiAyMDAsXG5cblx0Ly8gRGVmYXVsdCBzcGVlZFxuXHRfZGVmYXVsdDogNDAwXG59O1xuXG5cbi8vIEJhc2VkIG9mZiBvZiB0aGUgcGx1Z2luIGJ5IENsaW50IEhlbGZlcnMsIHdpdGggcGVybWlzc2lvbi5cbi8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDEwMDMyNDAxNDc0Ny9odHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvXG5qUXVlcnkuZm4uZGVsYXkgPSBmdW5jdGlvbiggdGltZSwgdHlwZSApIHtcblx0dGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTtcblx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlLCBmdW5jdGlvbiggbmV4dCwgaG9va3MgKSB7XG5cdFx0dmFyIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCggbmV4dCwgdGltZSApO1xuXHRcdGhvb2tzLnN0b3AgPSBmdW5jdGlvbigpIHtcblx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVvdXQgKTtcblx0XHR9O1xuXHR9ICk7XG59O1xuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApLFxuXHRcdHNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwic2VsZWN0XCIgKSxcblx0XHRvcHQgPSBzZWxlY3QuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwib3B0aW9uXCIgKSApO1xuXG5cdGlucHV0LnR5cGUgPSBcImNoZWNrYm94XCI7XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMyBvbmx5XG5cdC8vIERlZmF1bHQgdmFsdWUgZm9yIGEgY2hlY2tib3ggc2hvdWxkIGJlIFwib25cIlxuXHRzdXBwb3J0LmNoZWNrT24gPSBpbnB1dC52YWx1ZSAhPT0gXCJcIjtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gTXVzdCBhY2Nlc3Mgc2VsZWN0ZWRJbmRleCB0byBtYWtlIGRlZmF1bHQgb3B0aW9ucyBzZWxlY3Rcblx0c3VwcG9ydC5vcHRTZWxlY3RlZCA9IG9wdC5zZWxlY3RlZDtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gQW4gaW5wdXQgbG9zZXMgaXRzIHZhbHVlIGFmdGVyIGJlY29taW5nIGEgcmFkaW9cblx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblx0aW5wdXQudmFsdWUgPSBcInRcIjtcblx0aW5wdXQudHlwZSA9IFwicmFkaW9cIjtcblx0c3VwcG9ydC5yYWRpb1ZhbHVlID0gaW5wdXQudmFsdWUgPT09IFwidFwiO1xufSApKCk7XG5cblxudmFyIGJvb2xIb29rLFxuXHRhdHRySGFuZGxlID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRhdHRyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LmF0dHIsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9LFxuXG5cdHJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIHRoaXMsIG5hbWUgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHRhdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0dmFyIHJldCwgaG9va3MsXG5cdFx0XHRuVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0XHQvLyBEb24ndCBnZXQvc2V0IGF0dHJpYnV0ZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzXG5cdFx0aWYgKCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZFxuXHRcdGlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdC8vIEF0dHJpYnV0ZSBob29rcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbG93ZXJjYXNlIHZlcnNpb25cblx0XHQvLyBHcmFiIG5lY2Vzc2FyeSBob29rIGlmIG9uZSBpcyBkZWZpbmVkXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5hdHRySG9va3NbIG5hbWUudG9Mb3dlckNhc2UoKSBdIHx8XG5cdFx0XHRcdCggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC50ZXN0KCBuYW1lICkgPyBib29sSG9vayA6IHVuZGVmaW5lZCApO1xuXHRcdH1cblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggdmFsdWUgPT09IG51bGwgKSB7XG5cdFx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBob29rcyAmJiBcInNldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIHZhbHVlICsgXCJcIiApO1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblxuXHRcdHJldCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdC8vIE5vbi1leGlzdGVudCBhdHRyaWJ1dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkXG5cdFx0cmV0dXJuIHJldCA9PSBudWxsID8gdW5kZWZpbmVkIDogcmV0O1xuXHR9LFxuXG5cdGF0dHJIb29rczoge1xuXHRcdHR5cGU6IHtcblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09IFwicmFkaW9cIiAmJlxuXHRcdFx0XHRcdG5vZGVOYW1lKCBlbGVtLCBcImlucHV0XCIgKSApIHtcblx0XHRcdFx0XHR2YXIgdmFsID0gZWxlbS52YWx1ZTtcblx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIHZhbHVlICk7XG5cdFx0XHRcdFx0aWYgKCB2YWwgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLnZhbHVlID0gdmFsO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0cmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdHZhciBuYW1lLFxuXHRcdFx0aSA9IDAsXG5cblx0XHRcdC8vIEF0dHJpYnV0ZSBuYW1lcyBjYW4gY29udGFpbiBub24tSFRNTCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnNcblx0XHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2F0dHJpYnV0ZXMtMlxuXHRcdFx0YXR0ck5hbWVzID0gdmFsdWUgJiYgdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKTtcblxuXHRcdGlmICggYXR0ck5hbWVzICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHR3aGlsZSAoICggbmFtZSA9IGF0dHJOYW1lc1sgaSsrIF0gKSApIHtcblx0XHRcdFx0ZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0gKTtcblxuLy8gSG9va3MgZm9yIGJvb2xlYW4gYXR0cmlidXRlc1xuYm9vbEhvb2sgPSB7XG5cdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkge1xuXHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xuXG5cdFx0XHQvLyBSZW1vdmUgYm9vbGVhbiBhdHRyaWJ1dGVzIHdoZW4gc2V0IHRvIGZhbHNlXG5cdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgbmFtZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gbmFtZTtcblx0fVxufTtcblxualF1ZXJ5LmVhY2goIGpRdWVyeS5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKCAvXFx3Ky9nICksIGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXHR2YXIgZ2V0dGVyID0gYXR0ckhhbmRsZVsgbmFtZSBdIHx8IGpRdWVyeS5maW5kLmF0dHI7XG5cblx0YXR0ckhhbmRsZVsgbmFtZSBdID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdHZhciByZXQsIGhhbmRsZSxcblx0XHRcdGxvd2VyY2FzZU5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRpZiAoICFpc1hNTCApIHtcblxuXHRcdFx0Ly8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcCBieSB0ZW1wb3JhcmlseSByZW1vdmluZyB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGdldHRlclxuXHRcdFx0aGFuZGxlID0gYXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdO1xuXHRcdFx0YXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdID0gcmV0O1xuXHRcdFx0cmV0ID0gZ2V0dGVyKCBlbGVtLCBuYW1lLCBpc1hNTCApICE9IG51bGwgP1xuXHRcdFx0XHRsb3dlcmNhc2VOYW1lIDpcblx0XHRcdFx0bnVsbDtcblx0XHRcdGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXSA9IGhhbmRsZTtcblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcbn0gKTtcblxuXG5cblxudmFyIHJmb2N1c2FibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFxuXHRyY2xpY2thYmxlID0gL14oPzphfGFyZWEpJC9pO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHByb3A6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkucHJvcCwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlUHJvcDogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRkZWxldGUgdGhpc1sgalF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lIF07XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0cHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdHZhciByZXQsIGhvb2tzLFxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdFx0Ly8gRG9uJ3QgZ2V0L3NldCBwcm9wZXJ0aWVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2Rlc1xuXHRcdGlmICggblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cblx0XHRcdC8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3Ncblx0XHRcdG5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5wcm9wSG9va3NbIG5hbWUgXTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIGhvb2tzICYmIFwic2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKCBlbGVtWyBuYW1lIF0gPSB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblxuXHRcdHJldHVybiBlbGVtWyBuYW1lIF07XG5cdH0sXG5cblx0cHJvcEhvb2tzOiB7XG5cdFx0dGFiSW5kZXg6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHRcdFx0XHQvLyBlbGVtLnRhYkluZGV4IGRvZXNuJ3QgYWx3YXlzIHJldHVybiB0aGVcblx0XHRcdFx0Ly8gY29ycmVjdCB2YWx1ZSB3aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0XG5cdFx0XHRcdC8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE0MTExNjIzMzM0Ny9odHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0L1xuXHRcdFx0XHQvLyBVc2UgcHJvcGVyIGF0dHJpYnV0ZSByZXRyaWV2YWwoIzEyMDcyKVxuXHRcdFx0XHR2YXIgdGFiaW5kZXggPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBcInRhYmluZGV4XCIgKTtcblxuXHRcdFx0XHRpZiAoIHRhYmluZGV4ICkge1xuXHRcdFx0XHRcdHJldHVybiBwYXJzZUludCggdGFiaW5kZXgsIDEwICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0cmZvY3VzYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHxcblx0XHRcdFx0XHRyY2xpY2thYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJlxuXHRcdFx0XHRcdGVsZW0uaHJlZlxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0cHJvcEZpeDoge1xuXHRcdFwiZm9yXCI6IFwiaHRtbEZvclwiLFxuXHRcdFwiY2xhc3NcIjogXCJjbGFzc05hbWVcIlxuXHR9XG59ICk7XG5cbi8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuLy8gQWNjZXNzaW5nIHRoZSBzZWxlY3RlZEluZGV4IHByb3BlcnR5XG4vLyBmb3JjZXMgdGhlIGJyb3dzZXIgdG8gcmVzcGVjdCBzZXR0aW5nIHNlbGVjdGVkXG4vLyBvbiB0aGUgb3B0aW9uXG4vLyBUaGUgZ2V0dGVyIGVuc3VyZXMgYSBkZWZhdWx0IG9wdGlvbiBpcyBzZWxlY3RlZFxuLy8gd2hlbiBpbiBhbiBvcHRncm91cFxuLy8gZXNsaW50IHJ1bGUgXCJuby11bnVzZWQtZXhwcmVzc2lvbnNcIiBpcyBkaXNhYmxlZCBmb3IgdGhpcyBjb2RlXG4vLyBzaW5jZSBpdCBjb25zaWRlcnMgc3VjaCBhY2Nlc3Npb25zIG5vb3BcbmlmICggIXN1cHBvcnQub3B0U2VsZWN0ZWQgKSB7XG5cdGpRdWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQgPSB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0LyogZXNsaW50IG5vLXVudXNlZC1leHByZXNzaW9uczogXCJvZmZcIiAqL1xuXG5cdFx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0aWYgKCBwYXJlbnQgJiYgcGFyZW50LnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdC8qIGVzbGludCBuby11bnVzZWQtZXhwcmVzc2lvbnM6IFwib2ZmXCIgKi9cblxuXHRcdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdGlmICggcGFyZW50ICkge1xuXHRcdFx0XHRwYXJlbnQuc2VsZWN0ZWRJbmRleDtcblxuXHRcdFx0XHRpZiAoIHBhcmVudC5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbmpRdWVyeS5lYWNoKCBbXG5cdFwidGFiSW5kZXhcIixcblx0XCJyZWFkT25seVwiLFxuXHRcIm1heExlbmd0aFwiLFxuXHRcImNlbGxTcGFjaW5nXCIsXG5cdFwiY2VsbFBhZGRpbmdcIixcblx0XCJyb3dTcGFuXCIsXG5cdFwiY29sU3BhblwiLFxuXHRcInVzZU1hcFwiLFxuXHRcImZyYW1lQm9yZGVyXCIsXG5cdFwiY29udGVudEVkaXRhYmxlXCJcbl0sIGZ1bmN0aW9uKCkge1xuXHRqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzO1xufSApO1xuXG5cblxuXG5cdC8vIFN0cmlwIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlIGFjY29yZGluZyB0byBIVE1MIHNwZWNcblx0Ly8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS1hc2NpaS13aGl0ZXNwYWNlXG5cdGZ1bmN0aW9uIHN0cmlwQW5kQ29sbGFwc2UoIHZhbHVlICkge1xuXHRcdHZhciB0b2tlbnMgPSB2YWx1ZS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdO1xuXHRcdHJldHVybiB0b2tlbnMuam9pbiggXCIgXCIgKTtcblx0fVxuXG5cbmZ1bmN0aW9uIGdldENsYXNzKCBlbGVtICkge1xuXHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiApIHx8IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApIHtcblx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxuXHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTtcblx0fVxuXHRyZXR1cm4gW107XG59XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0YWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjdXJWYWx1ZSwgY2xhenosIGosIGZpbmFsVmFsdWUsXG5cdFx0XHRpID0gMDtcblxuXHRcdGlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBqICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5hZGRDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgZ2V0Q2xhc3MoIHRoaXMgKSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0Y2xhc3NlcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApO1xuXG5cdFx0aWYgKCBjbGFzc2VzLmxlbmd0aCApIHtcblx0XHRcdHdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHtcblx0XHRcdFx0Y3VyVmFsdWUgPSBnZXRDbGFzcyggZWxlbSApO1xuXHRcdFx0XHRjdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggXCIgXCIgKyBzdHJpcEFuZENvbGxhcHNlKCBjdXJWYWx1ZSApICsgXCIgXCIgKTtcblxuXHRcdFx0XHRpZiAoIGN1ciApIHtcblx0XHRcdFx0XHRqID0gMDtcblx0XHRcdFx0XHR3aGlsZSAoICggY2xhenogPSBjbGFzc2VzWyBqKysgXSApICkge1xuXHRcdFx0XHRcdFx0aWYgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPCAwICkge1xuXHRcdFx0XHRcdFx0XHRjdXIgKz0gY2xhenogKyBcIiBcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTtcblx0XHRcdFx0XHRpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiwgZmluYWxWYWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkucmVtb3ZlQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIGdldENsYXNzKCB0aGlzICkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdGlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5hdHRyKCBcImNsYXNzXCIsIFwiXCIgKTtcblx0XHR9XG5cblx0XHRjbGFzc2VzID0gY2xhc3Nlc1RvQXJyYXkoIHZhbHVlICk7XG5cblx0XHRpZiAoIGNsYXNzZXMubGVuZ3RoICkge1xuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0XHRjdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7XG5cblx0XHRcdFx0Ly8gVGhpcyBleHByZXNzaW9uIGlzIGhlcmUgZm9yIGJldHRlciBjb21wcmVzc2liaWxpdHkgKHNlZSBhZGRDbGFzcylcblx0XHRcdFx0Y3VyID0gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAoIFwiIFwiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArIFwiIFwiICk7XG5cblx0XHRcdFx0aWYgKCBjdXIgKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0d2hpbGUgKCAoIGNsYXp6ID0gY2xhc3Nlc1sgaisrIF0gKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlICphbGwqIGluc3RhbmNlc1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPiAtMSApIHtcblx0XHRcdFx0XHRcdFx0Y3VyID0gY3VyLnJlcGxhY2UoIFwiIFwiICsgY2xhenogKyBcIiBcIiwgXCIgXCIgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTtcblx0XHRcdFx0XHRpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiwgZmluYWxWYWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHRvZ2dsZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUsIHN0YXRlVmFsICkge1xuXHRcdHZhciB0eXBlID0gdHlwZW9mIHZhbHVlLFxuXHRcdFx0aXNWYWxpZFZhbHVlID0gdHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBBcnJheS5pc0FycmF5KCB2YWx1ZSApO1xuXG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGVWYWwgPT09IFwiYm9vbGVhblwiICYmIGlzVmFsaWRWYWx1ZSApIHtcblx0XHRcdHJldHVybiBzdGF0ZVZhbCA/IHRoaXMuYWRkQ2xhc3MoIHZhbHVlICkgOiB0aGlzLnJlbW92ZUNsYXNzKCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyhcblx0XHRcdFx0XHR2YWx1ZS5jYWxsKCB0aGlzLCBpLCBnZXRDbGFzcyggdGhpcyApLCBzdGF0ZVZhbCApLFxuXHRcdFx0XHRcdHN0YXRlVmFsXG5cdFx0XHRcdCk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgY2xhc3NOYW1lLCBpLCBzZWxmLCBjbGFzc05hbWVzO1xuXG5cdFx0XHRpZiAoIGlzVmFsaWRWYWx1ZSApIHtcblxuXHRcdFx0XHQvLyBUb2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBuYW1lc1xuXHRcdFx0XHRpID0gMDtcblx0XHRcdFx0c2VsZiA9IGpRdWVyeSggdGhpcyApO1xuXHRcdFx0XHRjbGFzc05hbWVzID0gY2xhc3Nlc1RvQXJyYXkoIHZhbHVlICk7XG5cblx0XHRcdFx0d2hpbGUgKCAoIGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNbIGkrKyBdICkgKSB7XG5cblx0XHRcdFx0XHQvLyBDaGVjayBlYWNoIGNsYXNzTmFtZSBnaXZlbiwgc3BhY2Ugc2VwYXJhdGVkIGxpc3Rcblx0XHRcdFx0XHRpZiAoIHNlbGYuaGFzQ2xhc3MoIGNsYXNzTmFtZSApICkge1xuXHRcdFx0XHRcdFx0c2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNlbGYuYWRkQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBUb2dnbGUgd2hvbGUgY2xhc3MgbmFtZVxuXHRcdFx0fSBlbHNlIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdFx0Y2xhc3NOYW1lID0gZ2V0Q2xhc3MoIHRoaXMgKTtcblx0XHRcdFx0aWYgKCBjbGFzc05hbWUgKSB7XG5cblx0XHRcdFx0XHQvLyBTdG9yZSBjbGFzc05hbWUgaWYgc2V0XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiwgY2xhc3NOYW1lICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiB0aGUgZWxlbWVudCBoYXMgYSBjbGFzcyBuYW1lIG9yIGlmIHdlJ3JlIHBhc3NlZCBgZmFsc2VgLFxuXHRcdFx0XHQvLyB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgY2xhc3NuYW1lIChpZiB0aGVyZSB3YXMgb25lLCB0aGUgYWJvdmUgc2F2ZWQgaXQpLlxuXHRcdFx0XHQvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLFxuXHRcdFx0XHQvLyBmYWxsaW5nIGJhY2sgdG8gdGhlIGVtcHR5IHN0cmluZyBpZiBub3RoaW5nIHdhcyBzdG9yZWQuXG5cdFx0XHRcdGlmICggdGhpcy5zZXRBdHRyaWJ1dGUgKSB7XG5cdFx0XHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIixcblx0XHRcdFx0XHRcdGNsYXNzTmFtZSB8fCB2YWx1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0XHRcdFx0XCJcIiA6XG5cdFx0XHRcdFx0XHRkYXRhUHJpdi5nZXQoIHRoaXMsIFwiX19jbGFzc05hbWVfX1wiICkgfHwgXCJcIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0aGFzQ2xhc3M6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgY2xhc3NOYW1lLCBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRjbGFzc05hbWUgPSBcIiBcIiArIHNlbGVjdG9yICsgXCIgXCI7XG5cdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdCggXCIgXCIgKyBzdHJpcEFuZENvbGxhcHNlKCBnZXRDbGFzcyggZWxlbSApICkgKyBcIiBcIiApLmluZGV4T2YoIGNsYXNzTmFtZSApID4gLTEgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59ICk7XG5cblxuXG5cbnZhciBycmV0dXJuID0gL1xcci9nO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHZhbDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBob29rcywgcmV0LCB2YWx1ZUlzRnVuY3Rpb24sXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdO1xuXG5cdFx0aWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0aG9va3MgPSBqUXVlcnkudmFsSG9va3NbIGVsZW0udHlwZSBdIHx8XG5cdFx0XHRcdFx0alF1ZXJ5LnZhbEhvb2tzWyBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0XHRpZiAoIGhvb2tzICYmXG5cdFx0XHRcdFx0XCJnZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHRcdCggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBcInZhbHVlXCIgKSApICE9PSB1bmRlZmluZWRcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldCA9IGVsZW0udmFsdWU7XG5cblx0XHRcdFx0Ly8gSGFuZGxlIG1vc3QgY29tbW9uIHN0cmluZyBjYXNlc1xuXHRcdFx0XHRpZiAoIHR5cGVvZiByZXQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJldC5yZXBsYWNlKCBycmV0dXJuLCBcIlwiICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXJcblx0XHRcdFx0cmV0dXJuIHJldCA9PSBudWxsID8gXCJcIiA6IHJldDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhbHVlSXNGdW5jdGlvbiA9IGlzRnVuY3Rpb24oIHZhbHVlICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdHZhciB2YWw7XG5cblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHZhbHVlSXNGdW5jdGlvbiApIHtcblx0XHRcdFx0dmFsID0gdmFsdWUuY2FsbCggdGhpcywgaSwgalF1ZXJ5KCB0aGlzICkudmFsKCkgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhbCA9IHZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUcmVhdCBudWxsL3VuZGVmaW5lZCBhcyBcIlwiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nXG5cdFx0XHRpZiAoIHZhbCA9PSBudWxsICkge1xuXHRcdFx0XHR2YWwgPSBcIlwiO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlb2YgdmFsID09PSBcIm51bWJlclwiICkge1xuXHRcdFx0XHR2YWwgKz0gXCJcIjtcblxuXHRcdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggdmFsICkgKSB7XG5cdFx0XHRcdHZhbCA9IGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRcdHJldHVybiB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICsgXCJcIjtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXG5cdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0Ly8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmdcblx0XHRcdGlmICggIWhvb2tzIHx8ICEoIFwic2V0XCIgaW4gaG9va3MgKSB8fCBob29rcy5zZXQoIHRoaXMsIHZhbCwgXCJ2YWx1ZVwiICkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0dGhpcy52YWx1ZSA9IHZhbDtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHR2YWxIb29rczoge1xuXHRcdG9wdGlvbjoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0XHR2YXIgdmFsID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgXCJ2YWx1ZVwiICk7XG5cdFx0XHRcdHJldHVybiB2YWwgIT0gbnVsbCA/XG5cdFx0XHRcdFx0dmFsIDpcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSBvbmx5XG5cdFx0XHRcdFx0Ly8gb3B0aW9uLnRleHQgdGhyb3dzIGV4Y2VwdGlvbnMgKCMxNDY4NiwgIzE0ODU4KVxuXHRcdFx0XHRcdC8vIFN0cmlwIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlXG5cdFx0XHRcdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jc3RyaXAtYW5kLWNvbGxhcHNlLXdoaXRlc3BhY2Vcblx0XHRcdFx0XHRzdHJpcEFuZENvbGxhcHNlKCBqUXVlcnkudGV4dCggZWxlbSApICk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRzZWxlY3Q6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciB2YWx1ZSwgb3B0aW9uLCBpLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0aW5kZXggPSBlbGVtLnNlbGVjdGVkSW5kZXgsXG5cdFx0XHRcdFx0b25lID0gZWxlbS50eXBlID09PSBcInNlbGVjdC1vbmVcIixcblx0XHRcdFx0XHR2YWx1ZXMgPSBvbmUgPyBudWxsIDogW10sXG5cdFx0XHRcdFx0bWF4ID0gb25lID8gaW5kZXggKyAxIDogb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0aWYgKCBpbmRleCA8IDAgKSB7XG5cdFx0XHRcdFx0aSA9IG1heDtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGkgPSBvbmUgPyBpbmRleCA6IDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zXG5cdFx0XHRcdGZvciAoIDsgaSA8IG1heDsgaSsrICkge1xuXHRcdFx0XHRcdG9wdGlvbiA9IG9wdGlvbnNbIGkgXTtcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0XHRcdFx0Ly8gSUU4LTkgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpXG5cdFx0XHRcdFx0aWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmXG5cblx0XHRcdFx0XHRcdFx0Ly8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cFxuXHRcdFx0XHRcdFx0XHQhb3B0aW9uLmRpc2FibGVkICYmXG5cdFx0XHRcdFx0XHRcdCggIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8XG5cdFx0XHRcdFx0XHRcdFx0IW5vZGVOYW1lKCBvcHRpb24ucGFyZW50Tm9kZSwgXCJvcHRncm91cFwiICkgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvblxuXHRcdFx0XHRcdFx0dmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpO1xuXG5cdFx0XHRcdFx0XHQvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0c1xuXHRcdFx0XHRcdFx0aWYgKCBvbmUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gTXVsdGktU2VsZWN0cyByZXR1cm4gYW4gYXJyYXlcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9LFxuXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIG9wdGlvblNldCwgb3B0aW9uLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0dmFsdWVzID0galF1ZXJ5Lm1ha2VBcnJheSggdmFsdWUgKSxcblx0XHRcdFx0XHRpID0gb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0b3B0aW9uID0gb3B0aW9uc1sgaSBdO1xuXG5cdFx0XHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tY29uZC1hc3NpZ24gKi9cblxuXHRcdFx0XHRcdGlmICggb3B0aW9uLnNlbGVjdGVkID1cblx0XHRcdFx0XHRcdGpRdWVyeS5pbkFycmF5KCBqUXVlcnkudmFsSG9va3Mub3B0aW9uLmdldCggb3B0aW9uICksIHZhbHVlcyApID4gLTFcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9wdGlvblNldCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0LyogZXNsaW50LWVuYWJsZSBuby1jb25kLWFzc2lnbiAqL1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRm9yY2UgYnJvd3NlcnMgdG8gYmVoYXZlIGNvbnNpc3RlbnRseSB3aGVuIG5vbi1tYXRjaGluZyB2YWx1ZSBpcyBzZXRcblx0XHRcdFx0aWYgKCAhb3B0aW9uU2V0ICkge1xuXHRcdFx0XHRcdGVsZW0uc2VsZWN0ZWRJbmRleCA9IC0xO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIFJhZGlvcyBhbmQgY2hlY2tib3hlcyBnZXR0ZXIvc2V0dGVyXG5qUXVlcnkuZWFjaCggWyBcInJhZGlvXCIsIFwiY2hlY2tib3hcIiBdLCBmdW5jdGlvbigpIHtcblx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7XG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0XHRcdHJldHVybiAoIGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoIGVsZW0gKS52YWwoKSwgdmFsdWUgKSA+IC0xICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRpZiAoICFzdXBwb3J0LmNoZWNrT24gKSB7XG5cdFx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0uZ2V0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIFwidmFsdWVcIiApID09PSBudWxsID8gXCJvblwiIDogZWxlbS52YWx1ZTtcblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBpbmNsdXNpb25cblxuXG5zdXBwb3J0LmZvY3VzaW4gPSBcIm9uZm9jdXNpblwiIGluIHdpbmRvdztcblxuXG52YXIgcmZvY3VzTW9ycGggPSAvXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sXG5cdHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrID0gZnVuY3Rpb24oIGUgKSB7XG5cdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0fTtcblxualF1ZXJ5LmV4dGVuZCggalF1ZXJ5LmV2ZW50LCB7XG5cblx0dHJpZ2dlcjogZnVuY3Rpb24oIGV2ZW50LCBkYXRhLCBlbGVtLCBvbmx5SGFuZGxlcnMgKSB7XG5cblx0XHR2YXIgaSwgY3VyLCB0bXAsIGJ1YmJsZVR5cGUsIG9udHlwZSwgaGFuZGxlLCBzcGVjaWFsLCBsYXN0RWxlbWVudCxcblx0XHRcdGV2ZW50UGF0aCA9IFsgZWxlbSB8fCBkb2N1bWVudCBdLFxuXHRcdFx0dHlwZSA9IGhhc093bi5jYWxsKCBldmVudCwgXCJ0eXBlXCIgKSA/IGV2ZW50LnR5cGUgOiBldmVudCxcblx0XHRcdG5hbWVzcGFjZXMgPSBoYXNPd24uY2FsbCggZXZlbnQsIFwibmFtZXNwYWNlXCIgKSA/IGV2ZW50Lm5hbWVzcGFjZS5zcGxpdCggXCIuXCIgKSA6IFtdO1xuXG5cdFx0Y3VyID0gbGFzdEVsZW1lbnQgPSB0bXAgPSBlbGVtID0gZWxlbSB8fCBkb2N1bWVudDtcblxuXHRcdC8vIERvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXG5cdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gZm9jdXMvYmx1ciBtb3JwaHMgdG8gZm9jdXNpbi9vdXQ7IGVuc3VyZSB3ZSdyZSBub3QgZmlyaW5nIHRoZW0gcmlnaHQgbm93XG5cdFx0aWYgKCByZm9jdXNNb3JwaC50ZXN0KCB0eXBlICsgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggdHlwZS5pbmRleE9mKCBcIi5cIiApID4gLTEgKSB7XG5cblx0XHRcdC8vIE5hbWVzcGFjZWQgdHJpZ2dlcjsgY3JlYXRlIGEgcmVnZXhwIHRvIG1hdGNoIGV2ZW50IHR5cGUgaW4gaGFuZGxlKClcblx0XHRcdG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCBcIi5cIiApO1xuXHRcdFx0dHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTtcblx0XHRcdG5hbWVzcGFjZXMuc29ydCgpO1xuXHRcdH1cblx0XHRvbnR5cGUgPSB0eXBlLmluZGV4T2YoIFwiOlwiICkgPCAwICYmIFwib25cIiArIHR5cGU7XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYSBqUXVlcnkuRXZlbnQgb2JqZWN0LCBPYmplY3QsIG9yIGp1c3QgYW4gZXZlbnQgdHlwZSBzdHJpbmdcblx0XHRldmVudCA9IGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID9cblx0XHRcdGV2ZW50IDpcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoIHR5cGUsIHR5cGVvZiBldmVudCA9PT0gXCJvYmplY3RcIiAmJiBldmVudCApO1xuXG5cdFx0Ly8gVHJpZ2dlciBiaXRtYXNrOiAmIDEgZm9yIG5hdGl2ZSBoYW5kbGVyczsgJiAyIGZvciBqUXVlcnkgKGFsd2F5cyB0cnVlKVxuXHRcdGV2ZW50LmlzVHJpZ2dlciA9IG9ubHlIYW5kbGVycyA/IDIgOiAzO1xuXHRcdGV2ZW50Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKTtcblx0XHRldmVudC5ybmFtZXNwYWNlID0gZXZlbnQubmFtZXNwYWNlID9cblx0XHRcdG5ldyBSZWdFeHAoIFwiKF58XFxcXC4pXCIgKyBuYW1lc3BhY2VzLmpvaW4oIFwiXFxcXC4oPzouKlxcXFwufClcIiApICsgXCIoXFxcXC58JClcIiApIDpcblx0XHRcdG51bGw7XG5cblx0XHQvLyBDbGVhbiB1cCB0aGUgZXZlbnQgaW4gY2FzZSBpdCBpcyBiZWluZyByZXVzZWRcblx0XHRldmVudC5yZXN1bHQgPSB1bmRlZmluZWQ7XG5cdFx0aWYgKCAhZXZlbnQudGFyZ2V0ICkge1xuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gZWxlbTtcblx0XHR9XG5cblx0XHQvLyBDbG9uZSBhbnkgaW5jb21pbmcgZGF0YSBhbmQgcHJlcGVuZCB0aGUgZXZlbnQsIGNyZWF0aW5nIHRoZSBoYW5kbGVyIGFyZyBsaXN0XG5cdFx0ZGF0YSA9IGRhdGEgPT0gbnVsbCA/XG5cdFx0XHRbIGV2ZW50IF0gOlxuXHRcdFx0alF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7XG5cblx0XHQvLyBBbGxvdyBzcGVjaWFsIGV2ZW50cyB0byBkcmF3IG91dHNpZGUgdGhlIGxpbmVzXG5cdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmIHNwZWNpYWwudHJpZ2dlciAmJiBzcGVjaWFsLnRyaWdnZXIuYXBwbHkoIGVsZW0sIGRhdGEgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAoIzk5NTEpXG5cdFx0Ly8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICgjOTcyNClcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdGJ1YmJsZVR5cGUgPSBzcGVjaWFsLmRlbGVnYXRlVHlwZSB8fCB0eXBlO1xuXHRcdFx0aWYgKCAhcmZvY3VzTW9ycGgudGVzdCggYnViYmxlVHlwZSArIHR5cGUgKSApIHtcblx0XHRcdFx0Y3VyID0gY3VyLnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKCA7IGN1cjsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdGV2ZW50UGF0aC5wdXNoKCBjdXIgKTtcblx0XHRcdFx0dG1wID0gY3VyO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPbmx5IGFkZCB3aW5kb3cgaWYgd2UgZ290IHRvIGRvY3VtZW50IChlLmcuLCBub3QgcGxhaW4gb2JqIG9yIGRldGFjaGVkIERPTSlcblx0XHRcdGlmICggdG1wID09PSAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCApICkge1xuXHRcdFx0XHRldmVudFBhdGgucHVzaCggdG1wLmRlZmF1bHRWaWV3IHx8IHRtcC5wYXJlbnRXaW5kb3cgfHwgd2luZG93ICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmlyZSBoYW5kbGVycyBvbiB0aGUgZXZlbnQgcGF0aFxuXHRcdGkgPSAwO1xuXHRcdHdoaWxlICggKCBjdXIgPSBldmVudFBhdGhbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cdFx0XHRsYXN0RWxlbWVudCA9IGN1cjtcblx0XHRcdGV2ZW50LnR5cGUgPSBpID4gMSA/XG5cdFx0XHRcdGJ1YmJsZVR5cGUgOlxuXHRcdFx0XHRzcGVjaWFsLmJpbmRUeXBlIHx8IHR5cGU7XG5cblx0XHRcdC8vIGpRdWVyeSBoYW5kbGVyXG5cdFx0XHRoYW5kbGUgPSAoIGRhdGFQcml2LmdldCggY3VyLCBcImV2ZW50c1wiICkgfHwge30gKVsgZXZlbnQudHlwZSBdICYmXG5cdFx0XHRcdGRhdGFQcml2LmdldCggY3VyLCBcImhhbmRsZVwiICk7XG5cdFx0XHRpZiAoIGhhbmRsZSApIHtcblx0XHRcdFx0aGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTmF0aXZlIGhhbmRsZXJcblx0XHRcdGhhbmRsZSA9IG9udHlwZSAmJiBjdXJbIG9udHlwZSBdO1xuXHRcdFx0aWYgKCBoYW5kbGUgJiYgaGFuZGxlLmFwcGx5ICYmIGFjY2VwdERhdGEoIGN1ciApICkge1xuXHRcdFx0XHRldmVudC5yZXN1bHQgPSBoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApO1xuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRldmVudC50eXBlID0gdHlwZTtcblxuXHRcdC8vIElmIG5vYm9keSBwcmV2ZW50ZWQgdGhlIGRlZmF1bHQgYWN0aW9uLCBkbyBpdCBub3dcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICkge1xuXG5cdFx0XHRpZiAoICggIXNwZWNpYWwuX2RlZmF1bHQgfHxcblx0XHRcdFx0c3BlY2lhbC5fZGVmYXVsdC5hcHBseSggZXZlbnRQYXRoLnBvcCgpLCBkYXRhICkgPT09IGZhbHNlICkgJiZcblx0XHRcdFx0YWNjZXB0RGF0YSggZWxlbSApICkge1xuXG5cdFx0XHRcdC8vIENhbGwgYSBuYXRpdmUgRE9NIG1ldGhvZCBvbiB0aGUgdGFyZ2V0IHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgZXZlbnQuXG5cdFx0XHRcdC8vIERvbid0IGRvIGRlZmF1bHQgYWN0aW9ucyBvbiB3aW5kb3csIHRoYXQncyB3aGVyZSBnbG9iYWwgdmFyaWFibGVzIGJlICgjNjE3MClcblx0XHRcdFx0aWYgKCBvbnR5cGUgJiYgaXNGdW5jdGlvbiggZWxlbVsgdHlwZSBdICkgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kXG5cdFx0XHRcdFx0dG1wID0gZWxlbVsgb250eXBlIF07XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gbnVsbDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZVxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlO1xuXG5cdFx0XHRcdFx0aWYgKCBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0XHRcdFx0bGFzdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRlbGVtWyB0eXBlIF0oKTtcblxuXHRcdFx0XHRcdGlmICggZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdFx0XHRcdGxhc3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0XHRcdGlmICggdG1wICkge1xuXHRcdFx0XHRcdFx0ZWxlbVsgb250eXBlIF0gPSB0bXA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHQvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmVcblx0Ly8gVXNlZCBvbmx5IGZvciBgZm9jdXMoaW4gfCBvdXQpYCBldmVudHNcblx0c2ltdWxhdGU6IGZ1bmN0aW9uKCB0eXBlLCBlbGVtLCBldmVudCApIHtcblx0XHR2YXIgZSA9IGpRdWVyeS5leHRlbmQoXG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCksXG5cdFx0XHRldmVudCxcblx0XHRcdHtcblx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0aXNTaW11bGF0ZWQ6IHRydWVcblx0XHRcdH1cblx0XHQpO1xuXG5cdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIG51bGwsIGVsZW0gKTtcblx0fVxuXG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHR0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7XG5cdFx0fSApO1xuXHR9LFxuXHR0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIGVsZW0gPSB0aGlzWyAwIF07XG5cdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCBlbGVtLCB0cnVlICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cblxuLy8gU3VwcG9ydDogRmlyZWZveCA8PTQ0XG4vLyBGaXJlZm94IGRvZXNuJ3QgaGF2ZSBmb2N1cyhpbiB8IG91dCkgZXZlbnRzXG4vLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Nzc4N1xuLy9cbi8vIFN1cHBvcnQ6IENocm9tZSA8PTQ4IC0gNDksIFNhZmFyaSA8PTkuMCAtIDkuMVxuLy8gZm9jdXMoaW4gfCBvdXQpIGV2ZW50cyBmaXJlIGFmdGVyIGZvY3VzICYgYmx1ciBldmVudHMsXG4vLyB3aGljaCBpcyBzcGVjIHZpb2xhdGlvbiAtIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnRzLWZvY3VzZXZlbnQtZXZlbnQtb3JkZXJcbi8vIFJlbGF0ZWQgdGlja2V0IC0gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDQ5ODU3XG5pZiAoICFzdXBwb3J0LmZvY3VzaW4gKSB7XG5cdGpRdWVyeS5lYWNoKCB7IGZvY3VzOiBcImZvY3VzaW5cIiwgYmx1cjogXCJmb2N1c291dFwiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7XG5cblx0XHQvLyBBdHRhY2ggYSBzaW5nbGUgY2FwdHVyaW5nIGhhbmRsZXIgb24gdGhlIGRvY3VtZW50IHdoaWxlIHNvbWVvbmUgd2FudHMgZm9jdXNpbi9mb2N1c291dFxuXHRcdHZhciBoYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCBmaXgsIGV2ZW50LnRhcmdldCwgalF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKSApO1xuXHRcdH07XG5cblx0XHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7XG5cdFx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcyxcblx0XHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXgsICggYXR0YWNoZXMgfHwgMCApICsgMSApO1xuXHRcdFx0fSxcblx0XHRcdHRlYXJkb3duOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGRvYyA9IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLFxuXHRcdFx0XHRcdGF0dGFjaGVzID0gZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCApIC0gMTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHRcdGRhdGFQcml2LnJlbW92ZSggZG9jLCBmaXggKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXgsIGF0dGFjaGVzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9ICk7XG59XG52YXIgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247XG5cbnZhciBub25jZSA9IERhdGUubm93KCk7XG5cbnZhciBycXVlcnkgPSAoIC9cXD8vICk7XG5cblxuXG4vLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nXG5qUXVlcnkucGFyc2VYTUwgPSBmdW5jdGlvbiggZGF0YSApIHtcblx0dmFyIHhtbDtcblx0aWYgKCAhZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5XG5cdC8vIElFIHRocm93cyBvbiBwYXJzZUZyb21TdHJpbmcgd2l0aCBpbnZhbGlkIGlucHV0LlxuXHR0cnkge1xuXHRcdHhtbCA9ICggbmV3IHdpbmRvdy5ET01QYXJzZXIoKSApLnBhcnNlRnJvbVN0cmluZyggZGF0YSwgXCJ0ZXh0L3htbFwiICk7XG5cdH0gY2F0Y2ggKCBlICkge1xuXHRcdHhtbCA9IHVuZGVmaW5lZDtcblx0fVxuXG5cdGlmICggIXhtbCB8fCB4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwicGFyc2VyZXJyb3JcIiApLmxlbmd0aCApIHtcblx0XHRqUXVlcnkuZXJyb3IoIFwiSW52YWxpZCBYTUw6IFwiICsgZGF0YSApO1xuXHR9XG5cdHJldHVybiB4bWw7XG59O1xuXG5cbnZhclxuXHRyYnJhY2tldCA9IC9cXFtcXF0kLyxcblx0ckNSTEYgPSAvXFxyP1xcbi9nLFxuXHRyc3VibWl0dGVyVHlwZXMgPSAvXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksXG5cdHJzdWJtaXR0YWJsZSA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtcblxuZnVuY3Rpb24gYnVpbGRQYXJhbXMoIHByZWZpeCwgb2JqLCB0cmFkaXRpb25hbCwgYWRkICkge1xuXHR2YXIgbmFtZTtcblxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIG9iaiApICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIGFycmF5IGl0ZW0uXG5cdFx0alF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7XG5cdFx0XHRpZiAoIHRyYWRpdGlvbmFsIHx8IHJicmFja2V0LnRlc3QoIHByZWZpeCApICkge1xuXG5cdFx0XHRcdC8vIFRyZWF0IGVhY2ggYXJyYXkgaXRlbSBhcyBhIHNjYWxhci5cblx0XHRcdFx0YWRkKCBwcmVmaXgsIHYgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBJdGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMgbnVtZXJpYyBpbmRleC5cblx0XHRcdFx0YnVpbGRQYXJhbXMoXG5cdFx0XHRcdFx0cHJlZml4ICsgXCJbXCIgKyAoIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT0gbnVsbCA/IGkgOiBcIlwiICkgKyBcIl1cIixcblx0XHRcdFx0XHR2LFxuXHRcdFx0XHRcdHRyYWRpdGlvbmFsLFxuXHRcdFx0XHRcdGFkZFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gKTtcblxuXHR9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgdG9UeXBlKCBvYmogKSA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS5cblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXggKyBcIltcIiArIG5hbWUgKyBcIl1cIiwgb2JqWyBuYW1lIF0sIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHR9XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS5cblx0XHRhZGQoIHByZWZpeCwgb2JqICk7XG5cdH1cbn1cblxuLy8gU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2Zcbi8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZ1xualF1ZXJ5LnBhcmFtID0gZnVuY3Rpb24oIGEsIHRyYWRpdGlvbmFsICkge1xuXHR2YXIgcHJlZml4LFxuXHRcdHMgPSBbXSxcblx0XHRhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZU9yRnVuY3Rpb24gKSB7XG5cblx0XHRcdC8vIElmIHZhbHVlIGlzIGEgZnVuY3Rpb24sIGludm9rZSBpdCBhbmQgdXNlIGl0cyByZXR1cm4gdmFsdWVcblx0XHRcdHZhciB2YWx1ZSA9IGlzRnVuY3Rpb24oIHZhbHVlT3JGdW5jdGlvbiApID9cblx0XHRcdFx0dmFsdWVPckZ1bmN0aW9uKCkgOlxuXHRcdFx0XHR2YWx1ZU9yRnVuY3Rpb247XG5cblx0XHRcdHNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoIGtleSApICsgXCI9XCIgK1xuXHRcdFx0XHRlbmNvZGVVUklDb21wb25lbnQoIHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKTtcblx0XHR9O1xuXG5cdGlmICggYSA9PSBudWxsICkge1xuXHRcdHJldHVybiBcIlwiO1xuXHR9XG5cblx0Ly8gSWYgYW4gYXJyYXkgd2FzIHBhc3NlZCBpbiwgYXNzdW1lIHRoYXQgaXQgaXMgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cy5cblx0aWYgKCBBcnJheS5pc0FycmF5KCBhICkgfHwgKCBhLmpxdWVyeSAmJiAhalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGEgKSApICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzXG5cdFx0alF1ZXJ5LmVhY2goIGEsIGZ1bmN0aW9uKCkge1xuXHRcdFx0YWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTtcblx0XHR9ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIElmIHRyYWRpdGlvbmFsLCBlbmNvZGUgdGhlIFwib2xkXCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyXG5cdFx0Ly8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuXG5cdFx0Zm9yICggcHJlZml4IGluIGEgKSB7XG5cdFx0XHRidWlsZFBhcmFtcyggcHJlZml4LCBhWyBwcmVmaXggXSwgdHJhZGl0aW9uYWwsIGFkZCApO1xuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb25cblx0cmV0dXJuIHMuam9pbiggXCImXCIgKTtcbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0c2VyaWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4galF1ZXJ5LnBhcmFtKCB0aGlzLnNlcmlhbGl6ZUFycmF5KCkgKTtcblx0fSxcblx0c2VyaWFsaXplQXJyYXk6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1hcCggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIENhbiBhZGQgcHJvcEhvb2sgZm9yIFwiZWxlbWVudHNcIiB0byBmaWx0ZXIgb3IgYWRkIGZvcm0gZWxlbWVudHNcblx0XHRcdHZhciBlbGVtZW50cyA9IGpRdWVyeS5wcm9wKCB0aGlzLCBcImVsZW1lbnRzXCIgKTtcblx0XHRcdHJldHVybiBlbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkoIGVsZW1lbnRzICkgOiB0aGlzO1xuXHRcdH0gKVxuXHRcdC5maWx0ZXIoIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHR5cGUgPSB0aGlzLnR5cGU7XG5cblx0XHRcdC8vIFVzZSAuaXMoIFwiOmRpc2FibGVkXCIgKSBzbyB0aGF0IGZpZWxkc2V0W2Rpc2FibGVkXSB3b3Jrc1xuXHRcdFx0cmV0dXJuIHRoaXMubmFtZSAmJiAhalF1ZXJ5KCB0aGlzICkuaXMoIFwiOmRpc2FibGVkXCIgKSAmJlxuXHRcdFx0XHRyc3VibWl0dGFibGUudGVzdCggdGhpcy5ub2RlTmFtZSApICYmICFyc3VibWl0dGVyVHlwZXMudGVzdCggdHlwZSApICYmXG5cdFx0XHRcdCggdGhpcy5jaGVja2VkIHx8ICFyY2hlY2thYmxlVHlwZS50ZXN0KCB0eXBlICkgKTtcblx0XHR9IClcblx0XHQubWFwKCBmdW5jdGlvbiggaSwgZWxlbSApIHtcblx0XHRcdHZhciB2YWwgPSBqUXVlcnkoIHRoaXMgKS52YWwoKTtcblxuXHRcdFx0aWYgKCB2YWwgPT0gbnVsbCApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggdmFsICkgKSB7XG5cdFx0XHRcdHJldHVybiBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCBcIlxcclxcblwiICkgfTtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsIFwiXFxyXFxuXCIgKSB9O1xuXHRcdH0gKS5nZXQoKTtcblx0fVxufSApO1xuXG5cbnZhclxuXHRyMjAgPSAvJTIwL2csXG5cdHJoYXNoID0gLyMuKiQvLFxuXHRyYW50aUNhY2hlID0gLyhbPyZdKV89W14mXSovLFxuXHRyaGVhZGVycyA9IC9eKC4qPyk6WyBcXHRdKihbXlxcclxcbl0qKSQvbWcsXG5cblx0Ly8gIzc2NTMsICM4MTI1LCAjODE1MjogbG9jYWwgcHJvdG9jb2wgZGV0ZWN0aW9uXG5cdHJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sXG5cdHJub0NvbnRlbnQgPSAvXig/OkdFVHxIRUFEKSQvLFxuXHRycHJvdG9jb2wgPSAvXlxcL1xcLy8sXG5cblx0LyogUHJlZmlsdGVyc1xuXHQgKiAxKSBUaGV5IGFyZSB1c2VmdWwgdG8gaW50cm9kdWNlIGN1c3RvbSBkYXRhVHlwZXMgKHNlZSBhamF4L2pzb25wLmpzIGZvciBhbiBleGFtcGxlKVxuXHQgKiAyKSBUaGVzZSBhcmUgY2FsbGVkOlxuXHQgKiAgICAtIEJFRk9SRSBhc2tpbmcgZm9yIGEgdHJhbnNwb3J0XG5cdCAqICAgIC0gQUZURVIgcGFyYW0gc2VyaWFsaXphdGlvbiAocy5kYXRhIGlzIGEgc3RyaW5nIGlmIHMucHJvY2Vzc0RhdGEgaXMgdHJ1ZSlcblx0ICogMykga2V5IGlzIHRoZSBkYXRhVHlwZVxuXHQgKiA0KSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkXG5cdCAqIDUpIGV4ZWN1dGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGNvbnRpbnVlIGRvd24gdG8gXCIqXCIgaWYgbmVlZGVkXG5cdCAqL1xuXHRwcmVmaWx0ZXJzID0ge30sXG5cblx0LyogVHJhbnNwb3J0cyBiaW5kaW5nc1xuXHQgKiAxKSBrZXkgaXMgdGhlIGRhdGFUeXBlXG5cdCAqIDIpIHRoZSBjYXRjaGFsbCBzeW1ib2wgXCIqXCIgY2FuIGJlIHVzZWRcblx0ICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gXCIqXCIgaWYgbmVlZGVkXG5cdCAqL1xuXHR0cmFuc3BvcnRzID0ge30sXG5cblx0Ly8gQXZvaWQgY29tbWVudC1wcm9sb2cgY2hhciBzZXF1ZW5jZSAoIzEwMDk4KTsgbXVzdCBhcHBlYXNlIGxpbnQgYW5kIGV2YWRlIGNvbXByZXNzaW9uXG5cdGFsbFR5cGVzID0gXCIqL1wiLmNvbmNhdCggXCIqXCIgKSxcblxuXHQvLyBBbmNob3IgdGFnIGZvciBwYXJzaW5nIHRoZSBkb2N1bWVudCBvcmlnaW5cblx0b3JpZ2luQW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJhXCIgKTtcblx0b3JpZ2luQW5jaG9yLmhyZWYgPSBsb2NhdGlvbi5ocmVmO1xuXG4vLyBCYXNlIFwiY29uc3RydWN0b3JcIiBmb3IgalF1ZXJ5LmFqYXhQcmVmaWx0ZXIgYW5kIGpRdWVyeS5hamF4VHJhbnNwb3J0XG5mdW5jdGlvbiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSApIHtcblxuXHQvLyBkYXRhVHlwZUV4cHJlc3Npb24gaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvIFwiKlwiXG5cdHJldHVybiBmdW5jdGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkge1xuXG5cdFx0aWYgKCB0eXBlb2YgZGF0YVR5cGVFeHByZXNzaW9uICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0ZnVuYyA9IGRhdGFUeXBlRXhwcmVzc2lvbjtcblx0XHRcdGRhdGFUeXBlRXhwcmVzc2lvbiA9IFwiKlwiO1xuXHRcdH1cblxuXHRcdHZhciBkYXRhVHlwZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0ZGF0YVR5cGVzID0gZGF0YVR5cGVFeHByZXNzaW9uLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTtcblxuXHRcdGlmICggaXNGdW5jdGlvbiggZnVuYyApICkge1xuXG5cdFx0XHQvLyBGb3IgZWFjaCBkYXRhVHlwZSBpbiB0aGUgZGF0YVR5cGVFeHByZXNzaW9uXG5cdFx0XHR3aGlsZSAoICggZGF0YVR5cGUgPSBkYXRhVHlwZXNbIGkrKyBdICkgKSB7XG5cblx0XHRcdFx0Ly8gUHJlcGVuZCBpZiByZXF1ZXN0ZWRcblx0XHRcdFx0aWYgKCBkYXRhVHlwZVsgMCBdID09PSBcIitcIiApIHtcblx0XHRcdFx0XHRkYXRhVHlwZSA9IGRhdGFUeXBlLnNsaWNlKCAxICkgfHwgXCIqXCI7XG5cdFx0XHRcdFx0KCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10gKS51bnNoaWZ0KCBmdW5jICk7XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIGFwcGVuZFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdCggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkucHVzaCggZnVuYyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufVxuXG4vLyBCYXNlIGluc3BlY3Rpb24gZnVuY3Rpb24gZm9yIHByZWZpbHRlcnMgYW5kIHRyYW5zcG9ydHNcbmZ1bmN0aW9uIGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUsIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKSB7XG5cblx0dmFyIGluc3BlY3RlZCA9IHt9LFxuXHRcdHNlZWtpbmdUcmFuc3BvcnQgPSAoIHN0cnVjdHVyZSA9PT0gdHJhbnNwb3J0cyApO1xuXG5cdGZ1bmN0aW9uIGluc3BlY3QoIGRhdGFUeXBlICkge1xuXHRcdHZhciBzZWxlY3RlZDtcblx0XHRpbnNwZWN0ZWRbIGRhdGFUeXBlIF0gPSB0cnVlO1xuXHRcdGpRdWVyeS5lYWNoKCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10sIGZ1bmN0aW9uKCBfLCBwcmVmaWx0ZXJPckZhY3RvcnkgKSB7XG5cdFx0XHR2YXIgZGF0YVR5cGVPclRyYW5zcG9ydCA9IHByZWZpbHRlck9yRmFjdG9yeSggb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApO1xuXHRcdFx0aWYgKCB0eXBlb2YgZGF0YVR5cGVPclRyYW5zcG9ydCA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdFx0XHQhc2Vla2luZ1RyYW5zcG9ydCAmJiAhaW5zcGVjdGVkWyBkYXRhVHlwZU9yVHJhbnNwb3J0IF0gKSB7XG5cblx0XHRcdFx0b3B0aW9ucy5kYXRhVHlwZXMudW5zaGlmdCggZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0XHRpbnNwZWN0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0gZWxzZSBpZiAoIHNlZWtpbmdUcmFuc3BvcnQgKSB7XG5cdFx0XHRcdHJldHVybiAhKCBzZWxlY3RlZCA9IGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdFx0cmV0dXJuIHNlbGVjdGVkO1xuXHR9XG5cblx0cmV0dXJuIGluc3BlY3QoIG9wdGlvbnMuZGF0YVR5cGVzWyAwIF0gKSB8fCAhaW5zcGVjdGVkWyBcIipcIiBdICYmIGluc3BlY3QoIFwiKlwiICk7XG59XG5cbi8vIEEgc3BlY2lhbCBleHRlbmQgZm9yIGFqYXggb3B0aW9uc1xuLy8gdGhhdCB0YWtlcyBcImZsYXRcIiBvcHRpb25zIChub3QgdG8gYmUgZGVlcCBleHRlbmRlZClcbi8vIEZpeGVzICM5ODg3XG5mdW5jdGlvbiBhamF4RXh0ZW5kKCB0YXJnZXQsIHNyYyApIHtcblx0dmFyIGtleSwgZGVlcCxcblx0XHRmbGF0T3B0aW9ucyA9IGpRdWVyeS5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnMgfHwge307XG5cblx0Zm9yICgga2V5IGluIHNyYyApIHtcblx0XHRpZiAoIHNyY1sga2V5IF0gIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdCggZmxhdE9wdGlvbnNbIGtleSBdID8gdGFyZ2V0IDogKCBkZWVwIHx8ICggZGVlcCA9IHt9ICkgKSApWyBrZXkgXSA9IHNyY1sga2V5IF07XG5cdFx0fVxuXHR9XG5cdGlmICggZGVlcCApIHtcblx0XHRqUXVlcnkuZXh0ZW5kKCB0cnVlLCB0YXJnZXQsIGRlZXAgKTtcblx0fVxuXG5cdHJldHVybiB0YXJnZXQ7XG59XG5cbi8qIEhhbmRsZXMgcmVzcG9uc2VzIHRvIGFuIGFqYXggcmVxdWVzdDpcbiAqIC0gZmluZHMgdGhlIHJpZ2h0IGRhdGFUeXBlIChtZWRpYXRlcyBiZXR3ZWVuIGNvbnRlbnQtdHlwZSBhbmQgZXhwZWN0ZWQgZGF0YVR5cGUpXG4gKiAtIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2VcbiAqL1xuZnVuY3Rpb24gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApIHtcblxuXHR2YXIgY3QsIHR5cGUsIGZpbmFsRGF0YVR5cGUsIGZpcnN0RGF0YVR5cGUsXG5cdFx0Y29udGVudHMgPSBzLmNvbnRlbnRzLFxuXHRcdGRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzO1xuXG5cdC8vIFJlbW92ZSBhdXRvIGRhdGFUeXBlIGFuZCBnZXQgY29udGVudC10eXBlIGluIHRoZSBwcm9jZXNzXG5cdHdoaWxlICggZGF0YVR5cGVzWyAwIF0gPT09IFwiKlwiICkge1xuXHRcdGRhdGFUeXBlcy5zaGlmdCgpO1xuXHRcdGlmICggY3QgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGN0ID0gcy5taW1lVHlwZSB8fCBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggXCJDb250ZW50LVR5cGVcIiApO1xuXHRcdH1cblx0fVxuXG5cdC8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGtub3duIGNvbnRlbnQtdHlwZVxuXHRpZiAoIGN0ICkge1xuXHRcdGZvciAoIHR5cGUgaW4gY29udGVudHMgKSB7XG5cdFx0XHRpZiAoIGNvbnRlbnRzWyB0eXBlIF0gJiYgY29udGVudHNbIHR5cGUgXS50ZXN0KCBjdCApICkge1xuXHRcdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggdHlwZSApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIHJlc3BvbnNlIGZvciB0aGUgZXhwZWN0ZWQgZGF0YVR5cGVcblx0aWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7XG5cdFx0ZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBlc1sgMCBdO1xuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gVHJ5IGNvbnZlcnRpYmxlIGRhdGFUeXBlc1xuXHRcdGZvciAoIHR5cGUgaW4gcmVzcG9uc2VzICkge1xuXHRcdFx0aWYgKCAhZGF0YVR5cGVzWyAwIF0gfHwgcy5jb252ZXJ0ZXJzWyB0eXBlICsgXCIgXCIgKyBkYXRhVHlwZXNbIDAgXSBdICkge1xuXHRcdFx0XHRmaW5hbERhdGFUeXBlID0gdHlwZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAoICFmaXJzdERhdGFUeXBlICkge1xuXHRcdFx0XHRmaXJzdERhdGFUeXBlID0gdHlwZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBPciBqdXN0IHVzZSBmaXJzdCBvbmVcblx0XHRmaW5hbERhdGFUeXBlID0gZmluYWxEYXRhVHlwZSB8fCBmaXJzdERhdGFUeXBlO1xuXHR9XG5cblx0Ly8gSWYgd2UgZm91bmQgYSBkYXRhVHlwZVxuXHQvLyBXZSBhZGQgdGhlIGRhdGFUeXBlIHRvIHRoZSBsaXN0IGlmIG5lZWRlZFxuXHQvLyBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlXG5cdGlmICggZmluYWxEYXRhVHlwZSApIHtcblx0XHRpZiAoIGZpbmFsRGF0YVR5cGUgIT09IGRhdGFUeXBlc1sgMCBdICkge1xuXHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIGZpbmFsRGF0YVR5cGUgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3BvbnNlc1sgZmluYWxEYXRhVHlwZSBdO1xuXHR9XG59XG5cbi8qIENoYWluIGNvbnZlcnNpb25zIGdpdmVuIHRoZSByZXF1ZXN0IGFuZCB0aGUgb3JpZ2luYWwgcmVzcG9uc2VcbiAqIEFsc28gc2V0cyB0aGUgcmVzcG9uc2VYWFggZmllbGRzIG9uIHRoZSBqcVhIUiBpbnN0YW5jZVxuICovXG5mdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKSB7XG5cdHZhciBjb252MiwgY3VycmVudCwgY29udiwgdG1wLCBwcmV2LFxuXHRcdGNvbnZlcnRlcnMgPSB7fSxcblxuXHRcdC8vIFdvcmsgd2l0aCBhIGNvcHkgb2YgZGF0YVR5cGVzIGluIGNhc2Ugd2UgbmVlZCB0byBtb2RpZnkgaXQgZm9yIGNvbnZlcnNpb25cblx0XHRkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcy5zbGljZSgpO1xuXG5cdC8vIENyZWF0ZSBjb252ZXJ0ZXJzIG1hcCB3aXRoIGxvd2VyY2FzZWQga2V5c1xuXHRpZiAoIGRhdGFUeXBlc1sgMSBdICkge1xuXHRcdGZvciAoIGNvbnYgaW4gcy5jb252ZXJ0ZXJzICkge1xuXHRcdFx0Y29udmVydGVyc1sgY29udi50b0xvd2VyQ2FzZSgpIF0gPSBzLmNvbnZlcnRlcnNbIGNvbnYgXTtcblx0XHR9XG5cdH1cblxuXHRjdXJyZW50ID0gZGF0YVR5cGVzLnNoaWZ0KCk7XG5cblx0Ly8gQ29udmVydCB0byBlYWNoIHNlcXVlbnRpYWwgZGF0YVR5cGVcblx0d2hpbGUgKCBjdXJyZW50ICkge1xuXG5cdFx0aWYgKCBzLnJlc3BvbnNlRmllbGRzWyBjdXJyZW50IF0gKSB7XG5cdFx0XHRqcVhIUlsgcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdIF0gPSByZXNwb25zZTtcblx0XHR9XG5cblx0XHQvLyBBcHBseSB0aGUgZGF0YUZpbHRlciBpZiBwcm92aWRlZFxuXHRcdGlmICggIXByZXYgJiYgaXNTdWNjZXNzICYmIHMuZGF0YUZpbHRlciApIHtcblx0XHRcdHJlc3BvbnNlID0gcy5kYXRhRmlsdGVyKCByZXNwb25zZSwgcy5kYXRhVHlwZSApO1xuXHRcdH1cblxuXHRcdHByZXYgPSBjdXJyZW50O1xuXHRcdGN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTtcblxuXHRcdGlmICggY3VycmVudCApIHtcblxuXHRcdFx0Ly8gVGhlcmUncyBvbmx5IHdvcmsgdG8gZG8gaWYgY3VycmVudCBkYXRhVHlwZSBpcyBub24tYXV0b1xuXHRcdFx0aWYgKCBjdXJyZW50ID09PSBcIipcIiApIHtcblxuXHRcdFx0XHRjdXJyZW50ID0gcHJldjtcblxuXHRcdFx0Ly8gQ29udmVydCByZXNwb25zZSBpZiBwcmV2IGRhdGFUeXBlIGlzIG5vbi1hdXRvIGFuZCBkaWZmZXJzIGZyb20gY3VycmVudFxuXHRcdFx0fSBlbHNlIGlmICggcHJldiAhPT0gXCIqXCIgJiYgcHJldiAhPT0gY3VycmVudCApIHtcblxuXHRcdFx0XHQvLyBTZWVrIGEgZGlyZWN0IGNvbnZlcnRlclxuXHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgcHJldiArIFwiIFwiICsgY3VycmVudCBdIHx8IGNvbnZlcnRlcnNbIFwiKiBcIiArIGN1cnJlbnQgXTtcblxuXHRcdFx0XHQvLyBJZiBub25lIGZvdW5kLCBzZWVrIGEgcGFpclxuXHRcdFx0XHRpZiAoICFjb252ICkge1xuXHRcdFx0XHRcdGZvciAoIGNvbnYyIGluIGNvbnZlcnRlcnMgKSB7XG5cblx0XHRcdFx0XHRcdC8vIElmIGNvbnYyIG91dHB1dHMgY3VycmVudFxuXHRcdFx0XHRcdFx0dG1wID0gY29udjIuc3BsaXQoIFwiIFwiICk7XG5cdFx0XHRcdFx0XHRpZiAoIHRtcFsgMSBdID09PSBjdXJyZW50ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIElmIHByZXYgY2FuIGJlIGNvbnZlcnRlZCB0byBhY2NlcHRlZCBpbnB1dFxuXHRcdFx0XHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgcHJldiArIFwiIFwiICsgdG1wWyAwIF0gXSB8fFxuXHRcdFx0XHRcdFx0XHRcdGNvbnZlcnRlcnNbIFwiKiBcIiArIHRtcFsgMCBdIF07XG5cdFx0XHRcdFx0XHRcdGlmICggY29udiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIENvbmRlbnNlIGVxdWl2YWxlbmNlIGNvbnZlcnRlcnNcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGNvbnYgPT09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgY29udjIgXTtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0YVR5cGVcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBjb252ZXJ0ZXJzWyBjb252MiBdICE9PSB0cnVlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y3VycmVudCA9IHRtcFsgMCBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIHRtcFsgMSBdICk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXBwbHkgY29udmVydGVyIChpZiBub3QgYW4gZXF1aXZhbGVuY2UpXG5cdFx0XHRcdGlmICggY29udiAhPT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdC8vIFVubGVzcyBlcnJvcnMgYXJlIGFsbG93ZWQgdG8gYnViYmxlLCBjYXRjaCBhbmQgcmV0dXJuIHRoZW1cblx0XHRcdFx0XHRpZiAoIGNvbnYgJiYgcy50aHJvd3MgKSB7XG5cdFx0XHRcdFx0XHRyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdHN0YXRlOiBcInBhcnNlcmVycm9yXCIsXG5cdFx0XHRcdFx0XHRcdFx0ZXJyb3I6IGNvbnYgPyBlIDogXCJObyBjb252ZXJzaW9uIGZyb20gXCIgKyBwcmV2ICsgXCIgdG8gXCIgKyBjdXJyZW50XG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHsgc3RhdGU6IFwic3VjY2Vzc1wiLCBkYXRhOiByZXNwb25zZSB9O1xufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0Ly8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzXG5cdGFjdGl2ZTogMCxcblxuXHQvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0XG5cdGxhc3RNb2RpZmllZDoge30sXG5cdGV0YWc6IHt9LFxuXG5cdGFqYXhTZXR0aW5nczoge1xuXHRcdHVybDogbG9jYXRpb24uaHJlZixcblx0XHR0eXBlOiBcIkdFVFwiLFxuXHRcdGlzTG9jYWw6IHJsb2NhbFByb3RvY29sLnRlc3QoIGxvY2F0aW9uLnByb3RvY29sICksXG5cdFx0Z2xvYmFsOiB0cnVlLFxuXHRcdHByb2Nlc3NEYXRhOiB0cnVlLFxuXHRcdGFzeW5jOiB0cnVlLFxuXHRcdGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOFwiLFxuXG5cdFx0Lypcblx0XHR0aW1lb3V0OiAwLFxuXHRcdGRhdGE6IG51bGwsXG5cdFx0ZGF0YVR5cGU6IG51bGwsXG5cdFx0dXNlcm5hbWU6IG51bGwsXG5cdFx0cGFzc3dvcmQ6IG51bGwsXG5cdFx0Y2FjaGU6IG51bGwsXG5cdFx0dGhyb3dzOiBmYWxzZSxcblx0XHR0cmFkaXRpb25hbDogZmFsc2UsXG5cdFx0aGVhZGVyczoge30sXG5cdFx0Ki9cblxuXHRcdGFjY2VwdHM6IHtcblx0XHRcdFwiKlwiOiBhbGxUeXBlcyxcblx0XHRcdHRleHQ6IFwidGV4dC9wbGFpblwiLFxuXHRcdFx0aHRtbDogXCJ0ZXh0L2h0bWxcIixcblx0XHRcdHhtbDogXCJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sXCIsXG5cdFx0XHRqc29uOiBcImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdFwiXG5cdFx0fSxcblxuXHRcdGNvbnRlbnRzOiB7XG5cdFx0XHR4bWw6IC9cXGJ4bWxcXGIvLFxuXHRcdFx0aHRtbDogL1xcYmh0bWwvLFxuXHRcdFx0anNvbjogL1xcYmpzb25cXGIvXG5cdFx0fSxcblxuXHRcdHJlc3BvbnNlRmllbGRzOiB7XG5cdFx0XHR4bWw6IFwicmVzcG9uc2VYTUxcIixcblx0XHRcdHRleHQ6IFwicmVzcG9uc2VUZXh0XCIsXG5cdFx0XHRqc29uOiBcInJlc3BvbnNlSlNPTlwiXG5cdFx0fSxcblxuXHRcdC8vIERhdGEgY29udmVydGVyc1xuXHRcdC8vIEtleXMgc2VwYXJhdGUgc291cmNlIChvciBjYXRjaGFsbCBcIipcIikgYW5kIGRlc3RpbmF0aW9uIHR5cGVzIHdpdGggYSBzaW5nbGUgc3BhY2Vcblx0XHRjb252ZXJ0ZXJzOiB7XG5cblx0XHRcdC8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dFxuXHRcdFx0XCIqIHRleHRcIjogU3RyaW5nLFxuXG5cdFx0XHQvLyBUZXh0IHRvIGh0bWwgKHRydWUgPSBubyB0cmFuc2Zvcm1hdGlvbilcblx0XHRcdFwidGV4dCBodG1sXCI6IHRydWUsXG5cblx0XHRcdC8vIEV2YWx1YXRlIHRleHQgYXMgYSBqc29uIGV4cHJlc3Npb25cblx0XHRcdFwidGV4dCBqc29uXCI6IEpTT04ucGFyc2UsXG5cblx0XHRcdC8vIFBhcnNlIHRleHQgYXMgeG1sXG5cdFx0XHRcInRleHQgeG1sXCI6IGpRdWVyeS5wYXJzZVhNTFxuXHRcdH0sXG5cblx0XHQvLyBGb3Igb3B0aW9ucyB0aGF0IHNob3VsZG4ndCBiZSBkZWVwIGV4dGVuZGVkOlxuXHRcdC8vIHlvdSBjYW4gYWRkIHlvdXIgb3duIGN1c3RvbSBvcHRpb25zIGhlcmUgaWZcblx0XHQvLyBhbmQgd2hlbiB5b3UgY3JlYXRlIG9uZSB0aGF0IHNob3VsZG4ndCBiZVxuXHRcdC8vIGRlZXAgZXh0ZW5kZWQgKHNlZSBhamF4RXh0ZW5kKVxuXHRcdGZsYXRPcHRpb25zOiB7XG5cdFx0XHR1cmw6IHRydWUsXG5cdFx0XHRjb250ZXh0OiB0cnVlXG5cdFx0fVxuXHR9LFxuXG5cdC8vIENyZWF0ZXMgYSBmdWxsIGZsZWRnZWQgc2V0dGluZ3Mgb2JqZWN0IGludG8gdGFyZ2V0XG5cdC8vIHdpdGggYm90aCBhamF4U2V0dGluZ3MgYW5kIHNldHRpbmdzIGZpZWxkcy5cblx0Ly8gSWYgdGFyZ2V0IGlzIG9taXR0ZWQsIHdyaXRlcyBpbnRvIGFqYXhTZXR0aW5ncy5cblx0YWpheFNldHVwOiBmdW5jdGlvbiggdGFyZ2V0LCBzZXR0aW5ncyApIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MgP1xuXG5cdFx0XHQvLyBCdWlsZGluZyBhIHNldHRpbmdzIG9iamVjdFxuXHRcdFx0YWpheEV4dGVuZCggYWpheEV4dGVuZCggdGFyZ2V0LCBqUXVlcnkuYWpheFNldHRpbmdzICksIHNldHRpbmdzICkgOlxuXG5cdFx0XHQvLyBFeHRlbmRpbmcgYWpheFNldHRpbmdzXG5cdFx0XHRhamF4RXh0ZW5kKCBqUXVlcnkuYWpheFNldHRpbmdzLCB0YXJnZXQgKTtcblx0fSxcblxuXHRhamF4UHJlZmlsdGVyOiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZpbHRlcnMgKSxcblx0YWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksXG5cblx0Ly8gTWFpbiBtZXRob2Rcblx0YWpheDogZnVuY3Rpb24oIHVybCwgb3B0aW9ucyApIHtcblxuXHRcdC8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlXG5cdFx0aWYgKCB0eXBlb2YgdXJsID09PSBcIm9iamVjdFwiICkge1xuXHRcdFx0b3B0aW9ucyA9IHVybDtcblx0XHRcdHVybCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBGb3JjZSBvcHRpb25zIHRvIGJlIGFuIG9iamVjdFxuXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdFx0dmFyIHRyYW5zcG9ydCxcblxuXHRcdFx0Ly8gVVJMIHdpdGhvdXQgYW50aS1jYWNoZSBwYXJhbVxuXHRcdFx0Y2FjaGVVUkwsXG5cblx0XHRcdC8vIFJlc3BvbnNlIGhlYWRlcnNcblx0XHRcdHJlc3BvbnNlSGVhZGVyc1N0cmluZyxcblx0XHRcdHJlc3BvbnNlSGVhZGVycyxcblxuXHRcdFx0Ly8gdGltZW91dCBoYW5kbGVcblx0XHRcdHRpbWVvdXRUaW1lcixcblxuXHRcdFx0Ly8gVXJsIGNsZWFudXAgdmFyXG5cdFx0XHR1cmxBbmNob3IsXG5cblx0XHRcdC8vIFJlcXVlc3Qgc3RhdGUgKGJlY29tZXMgZmFsc2UgdXBvbiBzZW5kIGFuZCB0cnVlIHVwb24gY29tcGxldGlvbilcblx0XHRcdGNvbXBsZXRlZCxcblxuXHRcdFx0Ly8gVG8ga25vdyBpZiBnbG9iYWwgZXZlbnRzIGFyZSB0byBiZSBkaXNwYXRjaGVkXG5cdFx0XHRmaXJlR2xvYmFscyxcblxuXHRcdFx0Ly8gTG9vcCB2YXJpYWJsZVxuXHRcdFx0aSxcblxuXHRcdFx0Ly8gdW5jYWNoZWQgcGFydCBvZiB0aGUgdXJsXG5cdFx0XHR1bmNhY2hlZCxcblxuXHRcdFx0Ly8gQ3JlYXRlIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdFxuXHRcdFx0cyA9IGpRdWVyeS5hamF4U2V0dXAoIHt9LCBvcHRpb25zICksXG5cblx0XHRcdC8vIENhbGxiYWNrcyBjb250ZXh0XG5cdFx0XHRjYWxsYmFja0NvbnRleHQgPSBzLmNvbnRleHQgfHwgcyxcblxuXHRcdFx0Ly8gQ29udGV4dCBmb3IgZ2xvYmFsIGV2ZW50cyBpcyBjYWxsYmFja0NvbnRleHQgaWYgaXQgaXMgYSBET00gbm9kZSBvciBqUXVlcnkgY29sbGVjdGlvblxuXHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0ID0gcy5jb250ZXh0ICYmXG5cdFx0XHRcdCggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dC5qcXVlcnkgKSA/XG5cdFx0XHRcdFx0alF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LFxuXG5cdFx0XHQvLyBEZWZlcnJlZHNcblx0XHRcdGRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksXG5cdFx0XHRjb21wbGV0ZURlZmVycmVkID0galF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksXG5cblx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRzdGF0dXNDb2RlID0gcy5zdGF0dXNDb2RlIHx8IHt9LFxuXG5cdFx0XHQvLyBIZWFkZXJzICh0aGV5IGFyZSBzZW50IGFsbCBhdCBvbmNlKVxuXHRcdFx0cmVxdWVzdEhlYWRlcnMgPSB7fSxcblx0XHRcdHJlcXVlc3RIZWFkZXJzTmFtZXMgPSB7fSxcblxuXHRcdFx0Ly8gRGVmYXVsdCBhYm9ydCBtZXNzYWdlXG5cdFx0XHRzdHJBYm9ydCA9IFwiY2FuY2VsZWRcIixcblxuXHRcdFx0Ly8gRmFrZSB4aHJcblx0XHRcdGpxWEhSID0ge1xuXHRcdFx0XHRyZWFkeVN0YXRlOiAwLFxuXG5cdFx0XHRcdC8vIEJ1aWxkcyBoZWFkZXJzIGhhc2h0YWJsZSBpZiBuZWVkZWRcblx0XHRcdFx0Z2V0UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKCBrZXkgKSB7XG5cdFx0XHRcdFx0dmFyIG1hdGNoO1xuXHRcdFx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRcdFx0aWYgKCAhcmVzcG9uc2VIZWFkZXJzICkge1xuXHRcdFx0XHRcdFx0XHRyZXNwb25zZUhlYWRlcnMgPSB7fTtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKCAoIG1hdGNoID0gcmhlYWRlcnMuZXhlYyggcmVzcG9uc2VIZWFkZXJzU3RyaW5nICkgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXNwb25zZUhlYWRlcnNbIG1hdGNoWyAxIF0udG9Mb3dlckNhc2UoKSArIFwiIFwiIF0gPVxuXHRcdFx0XHRcdFx0XHRcdFx0KCByZXNwb25zZUhlYWRlcnNbIG1hdGNoWyAxIF0udG9Mb3dlckNhc2UoKSArIFwiIFwiIF0gfHwgW10gKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuY29uY2F0KCBtYXRjaFsgMiBdICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG1hdGNoID0gcmVzcG9uc2VIZWFkZXJzWyBrZXkudG9Mb3dlckNhc2UoKSArIFwiIFwiIF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBtYXRjaCA9PSBudWxsID8gbnVsbCA6IG1hdGNoLmpvaW4oIFwiLCBcIiApO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFJhdyBzdHJpbmdcblx0XHRcdFx0Z2V0QWxsUmVzcG9uc2VIZWFkZXJzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gY29tcGxldGVkID8gcmVzcG9uc2VIZWFkZXJzU3RyaW5nIDogbnVsbDtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBDYWNoZXMgdGhlIGhlYWRlclxuXHRcdFx0XHRzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgPT0gbnVsbCApIHtcblx0XHRcdFx0XHRcdG5hbWUgPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSA9XG5cdFx0XHRcdFx0XHRcdHJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdIHx8IG5hbWU7XG5cdFx0XHRcdFx0XHRyZXF1ZXN0SGVhZGVyc1sgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyXG5cdFx0XHRcdG92ZXJyaWRlTWltZVR5cGU6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdFx0XHRcdGlmICggY29tcGxldGVkID09IG51bGwgKSB7XG5cdFx0XHRcdFx0XHRzLm1pbWVUeXBlID0gdHlwZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3Ncblx0XHRcdFx0c3RhdHVzQ29kZTogZnVuY3Rpb24oIG1hcCApIHtcblx0XHRcdFx0XHR2YXIgY29kZTtcblx0XHRcdFx0XHRpZiAoIG1hcCApIHtcblx0XHRcdFx0XHRcdGlmICggY29tcGxldGVkICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEV4ZWN1dGUgdGhlIGFwcHJvcHJpYXRlIGNhbGxiYWNrc1xuXHRcdFx0XHRcdFx0XHRqcVhIUi5hbHdheXMoIG1hcFsganFYSFIuc3RhdHVzIF0gKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gTGF6eS1hZGQgdGhlIG5ldyBjYWxsYmFja3MgaW4gYSB3YXkgdGhhdCBwcmVzZXJ2ZXMgb2xkIG9uZXNcblx0XHRcdFx0XHRcdFx0Zm9yICggY29kZSBpbiBtYXAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0c3RhdHVzQ29kZVsgY29kZSBdID0gWyBzdGF0dXNDb2RlWyBjb2RlIF0sIG1hcFsgY29kZSBdIF07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gQ2FuY2VsIHRoZSByZXF1ZXN0XG5cdFx0XHRcdGFib3J0OiBmdW5jdGlvbiggc3RhdHVzVGV4dCApIHtcblx0XHRcdFx0XHR2YXIgZmluYWxUZXh0ID0gc3RhdHVzVGV4dCB8fCBzdHJBYm9ydDtcblx0XHRcdFx0XHRpZiAoIHRyYW5zcG9ydCApIHtcblx0XHRcdFx0XHRcdHRyYW5zcG9ydC5hYm9ydCggZmluYWxUZXh0ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGRvbmUoIDAsIGZpbmFsVGV4dCApO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0Ly8gQXR0YWNoIGRlZmVycmVkc1xuXHRcdGRlZmVycmVkLnByb21pc2UoIGpxWEhSICk7XG5cblx0XHQvLyBBZGQgcHJvdG9jb2wgaWYgbm90IHByb3ZpZGVkIChwcmVmaWx0ZXJzIG1pZ2h0IGV4cGVjdCBpdClcblx0XHQvLyBIYW5kbGUgZmFsc3kgdXJsIGluIHRoZSBzZXR0aW5ncyBvYmplY3QgKCMxMDA5MzogY29uc2lzdGVuY3kgd2l0aCBvbGQgc2lnbmF0dXJlKVxuXHRcdC8vIFdlIGFsc28gdXNlIHRoZSB1cmwgcGFyYW1ldGVyIGlmIGF2YWlsYWJsZVxuXHRcdHMudXJsID0gKCAoIHVybCB8fCBzLnVybCB8fCBsb2NhdGlvbi5ocmVmICkgKyBcIlwiIClcblx0XHRcdC5yZXBsYWNlKCBycHJvdG9jb2wsIGxvY2F0aW9uLnByb3RvY29sICsgXCIvL1wiICk7XG5cblx0XHQvLyBBbGlhcyBtZXRob2Qgb3B0aW9uIHRvIHR5cGUgYXMgcGVyIHRpY2tldCAjMTIwMDRcblx0XHRzLnR5cGUgPSBvcHRpb25zLm1ldGhvZCB8fCBvcHRpb25zLnR5cGUgfHwgcy5tZXRob2QgfHwgcy50eXBlO1xuXG5cdFx0Ly8gRXh0cmFjdCBkYXRhVHlwZXMgbGlzdFxuXHRcdHMuZGF0YVR5cGVzID0gKCBzLmRhdGFUeXBlIHx8IFwiKlwiICkudG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXG5cdFx0Ly8gQSBjcm9zcy1kb21haW4gcmVxdWVzdCBpcyBpbiBvcmRlciB3aGVuIHRoZSBvcmlnaW4gZG9lc24ndCBtYXRjaCB0aGUgY3VycmVudCBvcmlnaW4uXG5cdFx0aWYgKCBzLmNyb3NzRG9tYWluID09IG51bGwgKSB7XG5cdFx0XHR1cmxBbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImFcIiApO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTggLSAxMSwgRWRnZSAxMiAtIDE1XG5cdFx0XHQvLyBJRSB0aHJvd3MgZXhjZXB0aW9uIG9uIGFjY2Vzc2luZyB0aGUgaHJlZiBwcm9wZXJ0eSBpZiB1cmwgaXMgbWFsZm9ybWVkLFxuXHRcdFx0Ly8gZS5nLiBodHRwOi8vZXhhbXBsZS5jb206ODB4L1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dXJsQW5jaG9yLmhyZWYgPSBzLnVybDtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTggLSAxMSBvbmx5XG5cdFx0XHRcdC8vIEFuY2hvcidzIGhvc3QgcHJvcGVydHkgaXNuJ3QgY29ycmVjdGx5IHNldCB3aGVuIHMudXJsIGlzIHJlbGF0aXZlXG5cdFx0XHRcdHVybEFuY2hvci5ocmVmID0gdXJsQW5jaG9yLmhyZWY7XG5cdFx0XHRcdHMuY3Jvc3NEb21haW4gPSBvcmlnaW5BbmNob3IucHJvdG9jb2wgKyBcIi8vXCIgKyBvcmlnaW5BbmNob3IuaG9zdCAhPT1cblx0XHRcdFx0XHR1cmxBbmNob3IucHJvdG9jb2wgKyBcIi8vXCIgKyB1cmxBbmNob3IuaG9zdDtcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdC8vIElmIHRoZXJlIGlzIGFuIGVycm9yIHBhcnNpbmcgdGhlIFVSTCwgYXNzdW1lIGl0IGlzIGNyb3NzRG9tYWluLFxuXHRcdFx0XHQvLyBpdCBjYW4gYmUgcmVqZWN0ZWQgYnkgdGhlIHRyYW5zcG9ydCBpZiBpdCBpcyBpbnZhbGlkXG5cdFx0XHRcdHMuY3Jvc3NEb21haW4gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENvbnZlcnQgZGF0YSBpZiBub3QgYWxyZWFkeSBhIHN0cmluZ1xuXHRcdGlmICggcy5kYXRhICYmIHMucHJvY2Vzc0RhdGEgJiYgdHlwZW9mIHMuZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHMuZGF0YSA9IGpRdWVyeS5wYXJhbSggcy5kYXRhLCBzLnRyYWRpdGlvbmFsICk7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgcHJlZmlsdGVyc1xuXHRcdGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApO1xuXG5cdFx0Ly8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYSBwcmVmaWx0ZXIsIHN0b3AgdGhlcmVcblx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdHJldHVybiBqcVhIUjtcblx0XHR9XG5cblx0XHQvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZlbnRzIGFzIG9mIG5vdyBpZiBhc2tlZCB0b1xuXHRcdC8vIERvbid0IGZpcmUgZXZlbnRzIGlmIGpRdWVyeS5ldmVudCBpcyB1bmRlZmluZWQgaW4gYW4gQU1ELXVzYWdlIHNjZW5hcmlvICgjMTUxMTgpXG5cdFx0ZmlyZUdsb2JhbHMgPSBqUXVlcnkuZXZlbnQgJiYgcy5nbG9iYWw7XG5cblx0XHQvLyBXYXRjaCBmb3IgYSBuZXcgc2V0IG9mIHJlcXVlc3RzXG5cdFx0aWYgKCBmaXJlR2xvYmFscyAmJiBqUXVlcnkuYWN0aXZlKysgPT09IDAgKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggXCJhamF4U3RhcnRcIiApO1xuXHRcdH1cblxuXHRcdC8vIFVwcGVyY2FzZSB0aGUgdHlwZVxuXHRcdHMudHlwZSA9IHMudHlwZS50b1VwcGVyQ2FzZSgpO1xuXG5cdFx0Ly8gRGV0ZXJtaW5lIGlmIHJlcXVlc3QgaGFzIGNvbnRlbnRcblx0XHRzLmhhc0NvbnRlbnQgPSAhcm5vQ29udGVudC50ZXN0KCBzLnR5cGUgKTtcblxuXHRcdC8vIFNhdmUgdGhlIFVSTCBpbiBjYXNlIHdlJ3JlIHRveWluZyB3aXRoIHRoZSBJZi1Nb2RpZmllZC1TaW5jZVxuXHRcdC8vIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciBsYXRlciBvblxuXHRcdC8vIFJlbW92ZSBoYXNoIHRvIHNpbXBsaWZ5IHVybCBtYW5pcHVsYXRpb25cblx0XHRjYWNoZVVSTCA9IHMudXJsLnJlcGxhY2UoIHJoYXNoLCBcIlwiICk7XG5cblx0XHQvLyBNb3JlIG9wdGlvbnMgaGFuZGxpbmcgZm9yIHJlcXVlc3RzIHdpdGggbm8gY29udGVudFxuXHRcdGlmICggIXMuaGFzQ29udGVudCApIHtcblxuXHRcdFx0Ly8gUmVtZW1iZXIgdGhlIGhhc2ggc28gd2UgY2FuIHB1dCBpdCBiYWNrXG5cdFx0XHR1bmNhY2hlZCA9IHMudXJsLnNsaWNlKCBjYWNoZVVSTC5sZW5ndGggKTtcblxuXHRcdFx0Ly8gSWYgZGF0YSBpcyBhdmFpbGFibGUgYW5kIHNob3VsZCBiZSBwcm9jZXNzZWQsIGFwcGVuZCBkYXRhIHRvIHVybFxuXHRcdFx0aWYgKCBzLmRhdGEgJiYgKCBzLnByb2Nlc3NEYXRhIHx8IHR5cGVvZiBzLmRhdGEgPT09IFwic3RyaW5nXCIgKSApIHtcblx0XHRcdFx0Y2FjaGVVUkwgKz0gKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/IFwiJlwiIDogXCI/XCIgKSArIHMuZGF0YTtcblxuXHRcdFx0XHQvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5XG5cdFx0XHRcdGRlbGV0ZSBzLmRhdGE7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCBvciB1cGRhdGUgYW50aS1jYWNoZSBwYXJhbSBpZiBuZWVkZWRcblx0XHRcdGlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdGNhY2hlVVJMID0gY2FjaGVVUkwucmVwbGFjZSggcmFudGlDYWNoZSwgXCIkMVwiICk7XG5cdFx0XHRcdHVuY2FjaGVkID0gKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/IFwiJlwiIDogXCI/XCIgKSArIFwiXz1cIiArICggbm9uY2UrKyApICsgdW5jYWNoZWQ7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFB1dCBoYXNoIGFuZCBhbnRpLWNhY2hlIG9uIHRoZSBVUkwgdGhhdCB3aWxsIGJlIHJlcXVlc3RlZCAoZ2gtMTczMilcblx0XHRcdHMudXJsID0gY2FjaGVVUkwgKyB1bmNhY2hlZDtcblxuXHRcdC8vIENoYW5nZSAnJTIwJyB0byAnKycgaWYgdGhpcyBpcyBlbmNvZGVkIGZvcm0gYm9keSBjb250ZW50IChnaC0yNjU4KVxuXHRcdH0gZWxzZSBpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmXG5cdFx0XHQoIHMuY29udGVudFR5cGUgfHwgXCJcIiApLmluZGV4T2YoIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgKSA9PT0gMCApIHtcblx0XHRcdHMuZGF0YSA9IHMuZGF0YS5yZXBsYWNlKCByMjAsIFwiK1wiICk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS5cblx0XHRpZiAoIHMuaWZNb2RpZmllZCApIHtcblx0XHRcdGlmICggalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApIHtcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Nb2RpZmllZC1TaW5jZVwiLCBqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdICk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICkge1xuXHRcdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIklmLU5vbmUtTWF0Y2hcIiwgalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnRcblx0XHRpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHtcblx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiQ29udGVudC1UeXBlXCIsIHMuY29udGVudFR5cGUgKTtcblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIEFjY2VwdHMgaGVhZGVyIGZvciB0aGUgc2VydmVyLCBkZXBlbmRpbmcgb24gdGhlIGRhdGFUeXBlXG5cdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlcihcblx0XHRcdFwiQWNjZXB0XCIsXG5cdFx0XHRzLmRhdGFUeXBlc1sgMCBdICYmIHMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbIDAgXSBdID9cblx0XHRcdFx0cy5hY2NlcHRzWyBzLmRhdGFUeXBlc1sgMCBdIF0gK1xuXHRcdFx0XHRcdCggcy5kYXRhVHlwZXNbIDAgXSAhPT0gXCIqXCIgPyBcIiwgXCIgKyBhbGxUeXBlcyArIFwiOyBxPTAuMDFcIiA6IFwiXCIgKSA6XG5cdFx0XHRcdHMuYWNjZXB0c1sgXCIqXCIgXVxuXHRcdCk7XG5cblx0XHQvLyBDaGVjayBmb3IgaGVhZGVycyBvcHRpb25cblx0XHRmb3IgKCBpIGluIHMuaGVhZGVycyApIHtcblx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIGksIHMuaGVhZGVyc1sgaSBdICk7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsb3cgY3VzdG9tIGhlYWRlcnMvbWltZXR5cGVzIGFuZCBlYXJseSBhYm9ydFxuXHRcdGlmICggcy5iZWZvcmVTZW5kICYmXG5cdFx0XHQoIHMuYmVmb3JlU2VuZC5jYWxsKCBjYWxsYmFja0NvbnRleHQsIGpxWEhSLCBzICkgPT09IGZhbHNlIHx8IGNvbXBsZXRlZCApICkge1xuXG5cdFx0XHQvLyBBYm9ydCBpZiBub3QgZG9uZSBhbHJlYWR5IGFuZCByZXR1cm5cblx0XHRcdHJldHVybiBqcVhIUi5hYm9ydCgpO1xuXHRcdH1cblxuXHRcdC8vIEFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvblxuXHRcdHN0ckFib3J0ID0gXCJhYm9ydFwiO1xuXG5cdFx0Ly8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzXG5cdFx0Y29tcGxldGVEZWZlcnJlZC5hZGQoIHMuY29tcGxldGUgKTtcblx0XHRqcVhIUi5kb25lKCBzLnN1Y2Nlc3MgKTtcblx0XHRqcVhIUi5mYWlsKCBzLmVycm9yICk7XG5cblx0XHQvLyBHZXQgdHJhbnNwb3J0XG5cdFx0dHJhbnNwb3J0ID0gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMsIHMsIG9wdGlvbnMsIGpxWEhSICk7XG5cblx0XHQvLyBJZiBubyB0cmFuc3BvcnQsIHdlIGF1dG8tYWJvcnRcblx0XHRpZiAoICF0cmFuc3BvcnQgKSB7XG5cdFx0XHRkb25lKCAtMSwgXCJObyBUcmFuc3BvcnRcIiApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRqcVhIUi5yZWFkeVN0YXRlID0gMTtcblxuXHRcdFx0Ly8gU2VuZCBnbG9iYWwgZXZlbnRcblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBcImFqYXhTZW5kXCIsIFsganFYSFIsIHMgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhamF4U2VuZCwgc3RvcCB0aGVyZVxuXHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRcdHJldHVybiBqcVhIUjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGltZW91dFxuXHRcdFx0aWYgKCBzLmFzeW5jICYmIHMudGltZW91dCA+IDAgKSB7XG5cdFx0XHRcdHRpbWVvdXRUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRqcVhIUi5hYm9ydCggXCJ0aW1lb3V0XCIgKTtcblx0XHRcdFx0fSwgcy50aW1lb3V0ICk7XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbXBsZXRlZCA9IGZhbHNlO1xuXHRcdFx0XHR0cmFuc3BvcnQuc2VuZCggcmVxdWVzdEhlYWRlcnMsIGRvbmUgKTtcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdC8vIFJldGhyb3cgcG9zdC1jb21wbGV0aW9uIGV4Y2VwdGlvbnNcblx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRcdFx0dGhyb3cgZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFByb3BhZ2F0ZSBvdGhlcnMgYXMgcmVzdWx0c1xuXHRcdFx0XHRkb25lKCAtMSwgZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZVxuXHRcdGZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkge1xuXHRcdFx0dmFyIGlzU3VjY2Vzcywgc3VjY2VzcywgZXJyb3IsIHJlc3BvbnNlLCBtb2RpZmllZCxcblx0XHRcdFx0c3RhdHVzVGV4dCA9IG5hdGl2ZVN0YXR1c1RleHQ7XG5cblx0XHRcdC8vIElnbm9yZSByZXBlYXQgaW52b2NhdGlvbnNcblx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbXBsZXRlZCA9IHRydWU7XG5cblx0XHRcdC8vIENsZWFyIHRpbWVvdXQgaWYgaXQgZXhpc3RzXG5cdFx0XHRpZiAoIHRpbWVvdXRUaW1lciApIHtcblx0XHRcdFx0d2luZG93LmNsZWFyVGltZW91dCggdGltZW91dFRpbWVyICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIERlcmVmZXJlbmNlIHRyYW5zcG9ydCBmb3IgZWFybHkgZ2FyYmFnZSBjb2xsZWN0aW9uXG5cdFx0XHQvLyAobm8gbWF0dGVyIGhvdyBsb25nIHRoZSBqcVhIUiBvYmplY3Qgd2lsbCBiZSB1c2VkKVxuXHRcdFx0dHJhbnNwb3J0ID0gdW5kZWZpbmVkO1xuXG5cdFx0XHQvLyBDYWNoZSByZXNwb25zZSBoZWFkZXJzXG5cdFx0XHRyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8IFwiXCI7XG5cblx0XHRcdC8vIFNldCByZWFkeVN0YXRlXG5cdFx0XHRqcVhIUi5yZWFkeVN0YXRlID0gc3RhdHVzID4gMCA/IDQgOiAwO1xuXG5cdFx0XHQvLyBEZXRlcm1pbmUgaWYgc3VjY2Vzc2Z1bFxuXHRcdFx0aXNTdWNjZXNzID0gc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDAgfHwgc3RhdHVzID09PSAzMDQ7XG5cblx0XHRcdC8vIEdldCByZXNwb25zZSBkYXRhXG5cdFx0XHRpZiAoIHJlc3BvbnNlcyApIHtcblx0XHRcdFx0cmVzcG9uc2UgPSBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbnZlcnQgbm8gbWF0dGVyIHdoYXQgKHRoYXQgd2F5IHJlc3BvbnNlWFhYIGZpZWxkcyBhcmUgYWx3YXlzIHNldClcblx0XHRcdHJlc3BvbnNlID0gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICk7XG5cblx0XHRcdC8vIElmIHN1Y2Nlc3NmdWwsIGhhbmRsZSB0eXBlIGNoYWluaW5nXG5cdFx0XHRpZiAoIGlzU3VjY2VzcyApIHtcblxuXHRcdFx0XHQvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLlxuXHRcdFx0XHRpZiAoIHMuaWZNb2RpZmllZCApIHtcblx0XHRcdFx0XHRtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcIkxhc3QtTW9kaWZpZWRcIiApO1xuXHRcdFx0XHRcdGlmICggbW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdID0gbW9kaWZpZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiZXRhZ1wiICk7XG5cdFx0XHRcdFx0aWYgKCBtb2RpZmllZCApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdID0gbW9kaWZpZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gaWYgbm8gY29udGVudFxuXHRcdFx0XHRpZiAoIHN0YXR1cyA9PT0gMjA0IHx8IHMudHlwZSA9PT0gXCJIRUFEXCIgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwibm9jb250ZW50XCI7XG5cblx0XHRcdFx0Ly8gaWYgbm90IG1vZGlmaWVkXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHN0YXR1cyA9PT0gMzA0ICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIm5vdG1vZGlmaWVkXCI7XG5cblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBkYXRhLCBsZXQncyBjb252ZXJ0IGl0XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXRlO1xuXHRcdFx0XHRcdHN1Y2Nlc3MgPSByZXNwb25zZS5kYXRhO1xuXHRcdFx0XHRcdGVycm9yID0gcmVzcG9uc2UuZXJyb3I7XG5cdFx0XHRcdFx0aXNTdWNjZXNzID0gIWVycm9yO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIEV4dHJhY3QgZXJyb3IgZnJvbSBzdGF0dXNUZXh0IGFuZCBub3JtYWxpemUgZm9yIG5vbi1hYm9ydHNcblx0XHRcdFx0ZXJyb3IgPSBzdGF0dXNUZXh0O1xuXHRcdFx0XHRpZiAoIHN0YXR1cyB8fCAhc3RhdHVzVGV4dCApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJlcnJvclwiO1xuXHRcdFx0XHRcdGlmICggc3RhdHVzIDwgMCApIHtcblx0XHRcdFx0XHRcdHN0YXR1cyA9IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCBkYXRhIGZvciB0aGUgZmFrZSB4aHIgb2JqZWN0XG5cdFx0XHRqcVhIUi5zdGF0dXMgPSBzdGF0dXM7XG5cdFx0XHRqcVhIUi5zdGF0dXNUZXh0ID0gKCBuYXRpdmVTdGF0dXNUZXh0IHx8IHN0YXR1c1RleHQgKSArIFwiXCI7XG5cblx0XHRcdC8vIFN1Y2Nlc3MvRXJyb3Jcblx0XHRcdGlmICggaXNTdWNjZXNzICkge1xuXHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIHN1Y2Nlc3MsIHN0YXR1c1RleHQsIGpxWEhSIF0gKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlamVjdFdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCwgZXJyb3IgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0anFYSFIuc3RhdHVzQ29kZSggc3RhdHVzQ29kZSApO1xuXHRcdFx0c3RhdHVzQ29kZSA9IHVuZGVmaW5lZDtcblxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIGlzU3VjY2VzcyA/IFwiYWpheFN1Y2Nlc3NcIiA6IFwiYWpheEVycm9yXCIsXG5cdFx0XHRcdFx0WyBqcVhIUiwgcywgaXNTdWNjZXNzID8gc3VjY2VzcyA6IGVycm9yIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29tcGxldGVcblx0XHRcdGNvbXBsZXRlRGVmZXJyZWQuZmlyZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCBdICk7XG5cblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBcImFqYXhDb21wbGV0ZVwiLCBbIGpxWEhSLCBzIF0gKTtcblxuXHRcdFx0XHQvLyBIYW5kbGUgdGhlIGdsb2JhbCBBSkFYIGNvdW50ZXJcblx0XHRcdFx0aWYgKCAhKCAtLWpRdWVyeS5hY3RpdmUgKSApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggXCJhamF4U3RvcFwiICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ganFYSFI7XG5cdH0sXG5cblx0Z2V0SlNPTjogZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgZGF0YSwgY2FsbGJhY2ssIFwianNvblwiICk7XG5cdH0sXG5cblx0Z2V0U2NyaXB0OiBmdW5jdGlvbiggdXJsLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdldCggdXJsLCB1bmRlZmluZWQsIGNhbGxiYWNrLCBcInNjcmlwdFwiICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIFsgXCJnZXRcIiwgXCJwb3N0XCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHtcblx0alF1ZXJ5WyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkge1xuXG5cdFx0Ly8gU2hpZnQgYXJndW1lbnRzIGlmIGRhdGEgYXJndW1lbnQgd2FzIG9taXR0ZWRcblx0XHRpZiAoIGlzRnVuY3Rpb24oIGRhdGEgKSApIHtcblx0XHRcdHR5cGUgPSB0eXBlIHx8IGNhbGxiYWNrO1xuXHRcdFx0Y2FsbGJhY2sgPSBkYXRhO1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBUaGUgdXJsIGNhbiBiZSBhbiBvcHRpb25zIG9iamVjdCAod2hpY2ggdGhlbiBtdXN0IGhhdmUgLnVybClcblx0XHRyZXR1cm4galF1ZXJ5LmFqYXgoIGpRdWVyeS5leHRlbmQoIHtcblx0XHRcdHVybDogdXJsLFxuXHRcdFx0dHlwZTogbWV0aG9kLFxuXHRcdFx0ZGF0YVR5cGU6IHR5cGUsXG5cdFx0XHRkYXRhOiBkYXRhLFxuXHRcdFx0c3VjY2VzczogY2FsbGJhY2tcblx0XHR9LCBqUXVlcnkuaXNQbGFpbk9iamVjdCggdXJsICkgJiYgdXJsICkgKTtcblx0fTtcbn0gKTtcblxuXG5qUXVlcnkuX2V2YWxVcmwgPSBmdW5jdGlvbiggdXJsLCBvcHRpb25zICkge1xuXHRyZXR1cm4galF1ZXJ5LmFqYXgoIHtcblx0XHR1cmw6IHVybCxcblxuXHRcdC8vIE1ha2UgdGhpcyBleHBsaWNpdCwgc2luY2UgdXNlciBjYW4gb3ZlcnJpZGUgdGhpcyB0aHJvdWdoIGFqYXhTZXR1cCAoIzExMjY0KVxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0ZGF0YVR5cGU6IFwic2NyaXB0XCIsXG5cdFx0Y2FjaGU6IHRydWUsXG5cdFx0YXN5bmM6IGZhbHNlLFxuXHRcdGdsb2JhbDogZmFsc2UsXG5cblx0XHQvLyBPbmx5IGV2YWx1YXRlIHRoZSByZXNwb25zZSBpZiBpdCBpcyBzdWNjZXNzZnVsIChnaC00MTI2KVxuXHRcdC8vIGRhdGFGaWx0ZXIgaXMgbm90IGludm9rZWQgZm9yIGZhaWx1cmUgcmVzcG9uc2VzLCBzbyB1c2luZyBpdCBpbnN0ZWFkXG5cdFx0Ly8gb2YgdGhlIGRlZmF1bHQgY29udmVydGVyIGlzIGtsdWRneSBidXQgaXQgd29ya3MuXG5cdFx0Y29udmVydGVyczoge1xuXHRcdFx0XCJ0ZXh0IHNjcmlwdFwiOiBmdW5jdGlvbigpIHt9XG5cdFx0fSxcblx0XHRkYXRhRmlsdGVyOiBmdW5jdGlvbiggcmVzcG9uc2UgKSB7XG5cdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggcmVzcG9uc2UsIG9wdGlvbnMgKTtcblx0XHR9XG5cdH0gKTtcbn07XG5cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHR3cmFwQWxsOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHR2YXIgd3JhcDtcblxuXHRcdGlmICggdGhpc1sgMCBdICkge1xuXHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCBodG1sICkgKSB7XG5cdFx0XHRcdGh0bWwgPSBodG1sLmNhbGwoIHRoaXNbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaGUgZWxlbWVudHMgdG8gd3JhcCB0aGUgdGFyZ2V0IGFyb3VuZFxuXHRcdFx0d3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQgKS5lcSggMCApLmNsb25lKCB0cnVlICk7XG5cblx0XHRcdGlmICggdGhpc1sgMCBdLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHdyYXAuaW5zZXJ0QmVmb3JlKCB0aGlzWyAwIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0d3JhcC5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgZWxlbSA9IHRoaXM7XG5cblx0XHRcdFx0d2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVudENoaWxkICkge1xuXHRcdFx0XHRcdGVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGVsZW07XG5cdFx0XHR9ICkuYXBwZW5kKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0d3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHRpZiAoIGlzRnVuY3Rpb24oIGh0bWwgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS53cmFwSW5uZXIoIGh0bWwuY2FsbCggdGhpcywgaSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApLFxuXHRcdFx0XHRjb250ZW50cyA9IHNlbGYuY29udGVudHMoKTtcblxuXHRcdFx0aWYgKCBjb250ZW50cy5sZW5ndGggKSB7XG5cdFx0XHRcdGNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2VsZi5hcHBlbmQoIGh0bWwgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0d3JhcDogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0dmFyIGh0bWxJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggaHRtbCApO1xuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBodG1sSXNGdW5jdGlvbiA/IGh0bWwuY2FsbCggdGhpcywgaSApIDogaHRtbCApO1xuXHRcdH0gKTtcblx0fSxcblxuXHR1bndyYXA6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR0aGlzLnBhcmVudCggc2VsZWN0b3IgKS5ub3QoIFwiYm9keVwiICkuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkoIHRoaXMgKS5yZXBsYWNlV2l0aCggdGhpcy5jaGlsZE5vZGVzICk7XG5cdFx0fSApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59ICk7XG5cblxualF1ZXJ5LmV4cHIucHNldWRvcy5oaWRkZW4gPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuICFqUXVlcnkuZXhwci5wc2V1ZG9zLnZpc2libGUoIGVsZW0gKTtcbn07XG5qUXVlcnkuZXhwci5wc2V1ZG9zLnZpc2libGUgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuICEhKCBlbGVtLm9mZnNldFdpZHRoIHx8IGVsZW0ub2Zmc2V0SGVpZ2h0IHx8IGVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKTtcbn07XG5cblxuXG5cbmpRdWVyeS5hamF4U2V0dGluZ3MueGhyID0gZnVuY3Rpb24oKSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTtcblx0fSBjYXRjaCAoIGUgKSB7fVxufTtcblxudmFyIHhoclN1Y2Nlc3NTdGF0dXMgPSB7XG5cblx0XHQvLyBGaWxlIHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIGNvZGUgMCwgYXNzdW1lIDIwMFxuXHRcdDA6IDIwMCxcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0Ly8gIzE0NTA6IHNvbWV0aW1lcyBJRSByZXR1cm5zIDEyMjMgd2hlbiBpdCBzaG91bGQgYmUgMjA0XG5cdFx0MTIyMzogMjA0XG5cdH0sXG5cdHhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7XG5cbnN1cHBvcnQuY29ycyA9ICEheGhyU3VwcG9ydGVkICYmICggXCJ3aXRoQ3JlZGVudGlhbHNcIiBpbiB4aHJTdXBwb3J0ZWQgKTtcbnN1cHBvcnQuYWpheCA9IHhoclN1cHBvcnRlZCA9ICEheGhyU3VwcG9ydGVkO1xuXG5qUXVlcnkuYWpheFRyYW5zcG9ydCggZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdHZhciBjYWxsYmFjaywgZXJyb3JDYWxsYmFjaztcblxuXHQvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0XG5cdGlmICggc3VwcG9ydC5jb3JzIHx8IHhoclN1cHBvcnRlZCAmJiAhb3B0aW9ucy5jcm9zc0RvbWFpbiApIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VuZDogZnVuY3Rpb24oIGhlYWRlcnMsIGNvbXBsZXRlICkge1xuXHRcdFx0XHR2YXIgaSxcblx0XHRcdFx0XHR4aHIgPSBvcHRpb25zLnhocigpO1xuXG5cdFx0XHRcdHhoci5vcGVuKFxuXHRcdFx0XHRcdG9wdGlvbnMudHlwZSxcblx0XHRcdFx0XHRvcHRpb25zLnVybCxcblx0XHRcdFx0XHRvcHRpb25zLmFzeW5jLFxuXHRcdFx0XHRcdG9wdGlvbnMudXNlcm5hbWUsXG5cdFx0XHRcdFx0b3B0aW9ucy5wYXNzd29yZFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIEFwcGx5IGN1c3RvbSBmaWVsZHMgaWYgcHJvdmlkZWRcblx0XHRcdFx0aWYgKCBvcHRpb25zLnhockZpZWxkcyApIHtcblx0XHRcdFx0XHRmb3IgKCBpIGluIG9wdGlvbnMueGhyRmllbGRzICkge1xuXHRcdFx0XHRcdFx0eGhyWyBpIF0gPSBvcHRpb25zLnhockZpZWxkc1sgaSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWRcblx0XHRcdFx0aWYgKCBvcHRpb25zLm1pbWVUeXBlICYmIHhoci5vdmVycmlkZU1pbWVUeXBlICkge1xuXHRcdFx0XHRcdHhoci5vdmVycmlkZU1pbWVUeXBlKCBvcHRpb25zLm1pbWVUeXBlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlclxuXHRcdFx0XHQvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlXG5cdFx0XHRcdC8vIGFraW4gdG8gYSBqaWdzYXcgcHV6emxlLCB3ZSBzaW1wbHkgbmV2ZXIgc2V0IGl0IHRvIGJlIHN1cmUuXG5cdFx0XHRcdC8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIG9yIGV2ZW4gdXNpbmcgYWpheFNldHVwKVxuXHRcdFx0XHQvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC5cblx0XHRcdFx0aWYgKCAhb3B0aW9ucy5jcm9zc0RvbWFpbiAmJiAhaGVhZGVyc1sgXCJYLVJlcXVlc3RlZC1XaXRoXCIgXSApIHtcblx0XHRcdFx0XHRoZWFkZXJzWyBcIlgtUmVxdWVzdGVkLVdpdGhcIiBdID0gXCJYTUxIdHRwUmVxdWVzdFwiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU2V0IGhlYWRlcnNcblx0XHRcdFx0Zm9yICggaSBpbiBoZWFkZXJzICkge1xuXHRcdFx0XHRcdHhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSBlcnJvckNhbGxiYWNrID0geGhyLm9ubG9hZCA9XG5cdFx0XHRcdFx0XHRcdFx0eGhyLm9uZXJyb3IgPSB4aHIub25hYm9ydCA9IHhoci5vbnRpbWVvdXQgPVxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0eXBlID09PSBcImFib3J0XCIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0eGhyLmFib3J0KCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIHR5cGUgPT09IFwiZXJyb3JcIiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0Ly8gT24gYSBtYW51YWwgbmF0aXZlIGFib3J0LCBJRTkgdGhyb3dzXG5cdFx0XHRcdFx0XHRcdFx0Ly8gZXJyb3JzIG9uIGFueSBwcm9wZXJ0eSBhY2Nlc3MgdGhhdCBpcyBub3QgcmVhZHlTdGF0ZVxuXHRcdFx0XHRcdFx0XHRcdGlmICggdHlwZW9mIHhoci5zdGF0dXMgIT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggMCwgXCJlcnJvclwiICk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEZpbGU6IHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIDA7IHNlZSAjODYwNSwgIzE0MjA3XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHhoci5zdGF0dXMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHhoci5zdGF0dXNUZXh0XG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRjb21wbGV0ZShcblx0XHRcdFx0XHRcdFx0XHRcdHhoclN1Y2Nlc3NTdGF0dXNbIHhoci5zdGF0dXMgXSB8fCB4aHIuc3RhdHVzLFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1c1RleHQsXG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBJRTkgaGFzIG5vIFhIUjIgYnV0IHRocm93cyBvbiBiaW5hcnkgKHRyYWMtMTE0MjYpXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBGb3IgWEhSMiBub24tdGV4dCwgbGV0IHRoZSBjYWxsZXIgaGFuZGxlIGl0IChnaC0yNDk4KVxuXHRcdFx0XHRcdFx0XHRcdFx0KCB4aHIucmVzcG9uc2VUeXBlIHx8IFwidGV4dFwiICkgIT09IFwidGV4dFwiICB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0dHlwZW9mIHhoci5yZXNwb25zZVRleHQgIT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IGJpbmFyeTogeGhyLnJlc3BvbnNlIH0gOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IHRleHQ6IHhoci5yZXNwb25zZVRleHQgfSxcblx0XHRcdFx0XHRcdFx0XHRcdHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vIExpc3RlbiB0byBldmVudHNcblx0XHRcdFx0eGhyLm9ubG9hZCA9IGNhbGxiYWNrKCk7XG5cdFx0XHRcdGVycm9yQ2FsbGJhY2sgPSB4aHIub25lcnJvciA9IHhoci5vbnRpbWVvdXQgPSBjYWxsYmFjayggXCJlcnJvclwiICk7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgOSBvbmx5XG5cdFx0XHRcdC8vIFVzZSBvbnJlYWR5c3RhdGVjaGFuZ2UgdG8gcmVwbGFjZSBvbmFib3J0XG5cdFx0XHRcdC8vIHRvIGhhbmRsZSB1bmNhdWdodCBhYm9ydHNcblx0XHRcdFx0aWYgKCB4aHIub25hYm9ydCAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHhoci5vbmFib3J0ID0gZXJyb3JDYWxsYmFjaztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0XHRcdC8vIENoZWNrIHJlYWR5U3RhdGUgYmVmb3JlIHRpbWVvdXQgYXMgaXQgY2hhbmdlc1xuXHRcdFx0XHRcdFx0aWYgKCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBBbGxvdyBvbmVycm9yIHRvIGJlIGNhbGxlZCBmaXJzdCxcblx0XHRcdFx0XHRcdFx0Ly8gYnV0IHRoYXQgd2lsbCBub3QgaGFuZGxlIGEgbmF0aXZlIGFib3J0XG5cdFx0XHRcdFx0XHRcdC8vIEFsc28sIHNhdmUgZXJyb3JDYWxsYmFjayB0byBhIHZhcmlhYmxlXG5cdFx0XHRcdFx0XHRcdC8vIGFzIHhoci5vbmVycm9yIGNhbm5vdCBiZSBhY2Nlc3NlZFxuXHRcdFx0XHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGVycm9yQ2FsbGJhY2soKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ3JlYXRlIHRoZSBhYm9ydCBjYWxsYmFja1xuXHRcdFx0XHRjYWxsYmFjayA9IGNhbGxiYWNrKCBcImFib3J0XCIgKTtcblxuXHRcdFx0XHR0cnkge1xuXG5cdFx0XHRcdFx0Ly8gRG8gc2VuZCB0aGUgcmVxdWVzdCAodGhpcyBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uKVxuXHRcdFx0XHRcdHhoci5zZW5kKCBvcHRpb25zLmhhc0NvbnRlbnQgJiYgb3B0aW9ucy5kYXRhIHx8IG51bGwgKTtcblx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0XHQvLyAjMTQ2ODM6IE9ubHkgcmV0aHJvdyBpZiB0aGlzIGhhc24ndCBiZWVuIG5vdGlmaWVkIGFzIGFuIGVycm9yIHlldFxuXHRcdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIFByZXZlbnQgYXV0by1leGVjdXRpb24gb2Ygc2NyaXB0cyB3aGVuIG5vIGV4cGxpY2l0IGRhdGFUeXBlIHdhcyBwcm92aWRlZCAoU2VlIGdoLTI0MzIpXG5qUXVlcnkuYWpheFByZWZpbHRlciggZnVuY3Rpb24oIHMgKSB7XG5cdGlmICggcy5jcm9zc0RvbWFpbiApIHtcblx0XHRzLmNvbnRlbnRzLnNjcmlwdCA9IGZhbHNlO1xuXHR9XG59ICk7XG5cbi8vIEluc3RhbGwgc2NyaXB0IGRhdGFUeXBlXG5qUXVlcnkuYWpheFNldHVwKCB7XG5cdGFjY2VwdHM6IHtcblx0XHRzY3JpcHQ6IFwidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBcIiArXG5cdFx0XHRcImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdFwiXG5cdH0sXG5cdGNvbnRlbnRzOiB7XG5cdFx0c2NyaXB0OiAvXFxiKD86amF2YXxlY21hKXNjcmlwdFxcYi9cblx0fSxcblx0Y29udmVydGVyczoge1xuXHRcdFwidGV4dCBzY3JpcHRcIjogZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggdGV4dCApO1xuXHRcdFx0cmV0dXJuIHRleHQ7XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwgY2FzZSBhbmQgY3Jvc3NEb21haW5cbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBcInNjcmlwdFwiLCBmdW5jdGlvbiggcyApIHtcblx0aWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0cy5jYWNoZSA9IGZhbHNlO1xuXHR9XG5cdGlmICggcy5jcm9zc0RvbWFpbiApIHtcblx0XHRzLnR5cGUgPSBcIkdFVFwiO1xuXHR9XG59ICk7XG5cbi8vIEJpbmQgc2NyaXB0IHRhZyBoYWNrIHRyYW5zcG9ydFxualF1ZXJ5LmFqYXhUcmFuc3BvcnQoIFwic2NyaXB0XCIsIGZ1bmN0aW9uKCBzICkge1xuXG5cdC8vIFRoaXMgdHJhbnNwb3J0IG9ubHkgZGVhbHMgd2l0aCBjcm9zcyBkb21haW4gb3IgZm9yY2VkLWJ5LWF0dHJzIHJlcXVlc3RzXG5cdGlmICggcy5jcm9zc0RvbWFpbiB8fCBzLnNjcmlwdEF0dHJzICkge1xuXHRcdHZhciBzY3JpcHQsIGNhbGxiYWNrO1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZW5kOiBmdW5jdGlvbiggXywgY29tcGxldGUgKSB7XG5cdFx0XHRcdHNjcmlwdCA9IGpRdWVyeSggXCI8c2NyaXB0PlwiIClcblx0XHRcdFx0XHQuYXR0ciggcy5zY3JpcHRBdHRycyB8fCB7fSApXG5cdFx0XHRcdFx0LnByb3AoIHsgY2hhcnNldDogcy5zY3JpcHRDaGFyc2V0LCBzcmM6IHMudXJsIH0gKVxuXHRcdFx0XHRcdC5vbiggXCJsb2FkIGVycm9yXCIsIGNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHtcblx0XHRcdFx0XHRcdHNjcmlwdC5yZW1vdmUoKTtcblx0XHRcdFx0XHRcdGNhbGxiYWNrID0gbnVsbDtcblx0XHRcdFx0XHRcdGlmICggZXZ0ICkge1xuXHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggZXZ0LnR5cGUgPT09IFwiZXJyb3JcIiA/IDQwNCA6IDIwMCwgZXZ0LnR5cGUgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0Ly8gVXNlIG5hdGl2ZSBET00gbWFuaXB1bGF0aW9uIHRvIGF2b2lkIG91ciBkb21NYW5pcCBBSkFYIHRyaWNrZXJ5XG5cdFx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7XG5cdFx0XHR9LFxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbnZhciBvbGRDYWxsYmFja3MgPSBbXSxcblx0cmpzb25wID0gLyg9KVxcPyg/PSZ8JCl8XFw/XFw/LztcblxuLy8gRGVmYXVsdCBqc29ucCBzZXR0aW5nc1xualF1ZXJ5LmFqYXhTZXR1cCgge1xuXHRqc29ucDogXCJjYWxsYmFja1wiLFxuXHRqc29ucENhbGxiYWNrOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY2FsbGJhY2sgPSBvbGRDYWxsYmFja3MucG9wKCkgfHwgKCBqUXVlcnkuZXhwYW5kbyArIFwiX1wiICsgKCBub25jZSsrICkgKTtcblx0XHR0aGlzWyBjYWxsYmFjayBdID0gdHJ1ZTtcblx0XHRyZXR1cm4gY2FsbGJhY2s7XG5cdH1cbn0gKTtcblxuLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzXG5qUXVlcnkuYWpheFByZWZpbHRlciggXCJqc29uIGpzb25wXCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHtcblxuXHR2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsXG5cdFx0anNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID9cblx0XHRcdFwidXJsXCIgOlxuXHRcdFx0dHlwZW9mIHMuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdFx0XHQoIHMuY29udGVudFR5cGUgfHwgXCJcIiApXG5cdFx0XHRcdFx0LmluZGV4T2YoIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgKSA9PT0gMCAmJlxuXHRcdFx0XHRyanNvbnAudGVzdCggcy5kYXRhICkgJiYgXCJkYXRhXCJcblx0XHQpO1xuXG5cdC8vIEhhbmRsZSBpZmYgdGhlIGV4cGVjdGVkIGRhdGEgdHlwZSBpcyBcImpzb25wXCIgb3Igd2UgaGF2ZSBhIHBhcmFtZXRlciB0byBzZXRcblx0aWYgKCBqc29uUHJvcCB8fCBzLmRhdGFUeXBlc1sgMCBdID09PSBcImpzb25wXCIgKSB7XG5cblx0XHQvLyBHZXQgY2FsbGJhY2sgbmFtZSwgcmVtZW1iZXJpbmcgcHJlZXhpc3RpbmcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGl0XG5cdFx0Y2FsbGJhY2tOYW1lID0gcy5qc29ucENhbGxiYWNrID0gaXNGdW5jdGlvbiggcy5qc29ucENhbGxiYWNrICkgP1xuXHRcdFx0cy5qc29ucENhbGxiYWNrKCkgOlxuXHRcdFx0cy5qc29ucENhbGxiYWNrO1xuXG5cdFx0Ly8gSW5zZXJ0IGNhbGxiYWNrIGludG8gdXJsIG9yIGZvcm0gZGF0YVxuXHRcdGlmICgganNvblByb3AgKSB7XG5cdFx0XHRzWyBqc29uUHJvcCBdID0gc1sganNvblByb3AgXS5yZXBsYWNlKCByanNvbnAsIFwiJDFcIiArIGNhbGxiYWNrTmFtZSApO1xuXHRcdH0gZWxzZSBpZiAoIHMuanNvbnAgIT09IGZhbHNlICkge1xuXHRcdFx0cy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/IFwiJlwiIDogXCI/XCIgKSArIHMuanNvbnAgKyBcIj1cIiArIGNhbGxiYWNrTmFtZTtcblx0XHR9XG5cblx0XHQvLyBVc2UgZGF0YSBjb252ZXJ0ZXIgdG8gcmV0cmlldmUganNvbiBhZnRlciBzY3JpcHQgZXhlY3V0aW9uXG5cdFx0cy5jb252ZXJ0ZXJzWyBcInNjcmlwdCBqc29uXCIgXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCAhcmVzcG9uc2VDb250YWluZXIgKSB7XG5cdFx0XHRcdGpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgXCIgd2FzIG5vdCBjYWxsZWRcIiApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3BvbnNlQ29udGFpbmVyWyAwIF07XG5cdFx0fTtcblxuXHRcdC8vIEZvcmNlIGpzb24gZGF0YVR5cGVcblx0XHRzLmRhdGFUeXBlc1sgMCBdID0gXCJqc29uXCI7XG5cblx0XHQvLyBJbnN0YWxsIGNhbGxiYWNrXG5cdFx0b3ZlcndyaXR0ZW4gPSB3aW5kb3dbIGNhbGxiYWNrTmFtZSBdO1xuXHRcdHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzO1xuXHRcdH07XG5cblx0XHQvLyBDbGVhbi11cCBmdW5jdGlvbiAoZmlyZXMgYWZ0ZXIgY29udmVydGVycylcblx0XHRqcVhIUi5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBJZiBwcmV2aW91cyB2YWx1ZSBkaWRuJ3QgZXhpc3QgLSByZW1vdmUgaXRcblx0XHRcdGlmICggb3ZlcndyaXR0ZW4gPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0alF1ZXJ5KCB3aW5kb3cgKS5yZW1vdmVQcm9wKCBjYWxsYmFja05hbWUgKTtcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHJlc3RvcmUgcHJlZXhpc3RpbmcgdmFsdWVcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBvdmVyd3JpdHRlbjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2F2ZSBiYWNrIGFzIGZyZWVcblx0XHRcdGlmICggc1sgY2FsbGJhY2tOYW1lIF0gKSB7XG5cblx0XHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgcmUtdXNpbmcgdGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5kXG5cdFx0XHRcdHMuanNvbnBDYWxsYmFjayA9IG9yaWdpbmFsU2V0dGluZ3MuanNvbnBDYWxsYmFjaztcblxuXHRcdFx0XHQvLyBTYXZlIHRoZSBjYWxsYmFjayBuYW1lIGZvciBmdXR1cmUgdXNlXG5cdFx0XHRcdG9sZENhbGxiYWNrcy5wdXNoKCBjYWxsYmFja05hbWUgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2FsbCBpZiBpdCB3YXMgYSBmdW5jdGlvbiBhbmQgd2UgaGF2ZSBhIHJlc3BvbnNlXG5cdFx0XHRpZiAoIHJlc3BvbnNlQ29udGFpbmVyICYmIGlzRnVuY3Rpb24oIG92ZXJ3cml0dGVuICkgKSB7XG5cdFx0XHRcdG92ZXJ3cml0dGVuKCByZXNwb25zZUNvbnRhaW5lclsgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gb3ZlcndyaXR0ZW4gPSB1bmRlZmluZWQ7XG5cdFx0fSApO1xuXG5cdFx0Ly8gRGVsZWdhdGUgdG8gc2NyaXB0XG5cdFx0cmV0dXJuIFwic2NyaXB0XCI7XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gU3VwcG9ydDogU2FmYXJpIDggb25seVxuLy8gSW4gU2FmYXJpIDggZG9jdW1lbnRzIGNyZWF0ZWQgdmlhIGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudFxuLy8gY29sbGFwc2Ugc2libGluZyBmb3JtczogdGhlIHNlY29uZCBvbmUgYmVjb21lcyBhIGNoaWxkIG9mIHRoZSBmaXJzdCBvbmUuXG4vLyBCZWNhdXNlIG9mIHRoYXQsIHRoaXMgc2VjdXJpdHkgbWVhc3VyZSBoYXMgdG8gYmUgZGlzYWJsZWQgaW4gU2FmYXJpIDguXG4vLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3MzM3XG5zdXBwb3J0LmNyZWF0ZUhUTUxEb2N1bWVudCA9ICggZnVuY3Rpb24oKSB7XG5cdHZhciBib2R5ID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCBcIlwiICkuYm9keTtcblx0Ym9keS5pbm5lckhUTUwgPSBcIjxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+XCI7XG5cdHJldHVybiBib2R5LmNoaWxkTm9kZXMubGVuZ3RoID09PSAyO1xufSApKCk7XG5cblxuLy8gQXJndW1lbnQgXCJkYXRhXCIgc2hvdWxkIGJlIHN0cmluZyBvZiBodG1sXG4vLyBjb250ZXh0IChvcHRpb25hbCk6IElmIHNwZWNpZmllZCwgdGhlIGZyYWdtZW50IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGlzIGNvbnRleHQsXG4vLyBkZWZhdWx0cyB0byBkb2N1bWVudFxuLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZ1xualF1ZXJ5LnBhcnNlSFRNTCA9IGZ1bmN0aW9uKCBkYXRhLCBjb250ZXh0LCBrZWVwU2NyaXB0cyApIHtcblx0aWYgKCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gW107XG5cdH1cblx0aWYgKCB0eXBlb2YgY29udGV4dCA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0a2VlcFNjcmlwdHMgPSBjb250ZXh0O1xuXHRcdGNvbnRleHQgPSBmYWxzZTtcblx0fVxuXG5cdHZhciBiYXNlLCBwYXJzZWQsIHNjcmlwdHM7XG5cblx0aWYgKCAhY29udGV4dCApIHtcblxuXHRcdC8vIFN0b3Agc2NyaXB0cyBvciBpbmxpbmUgZXZlbnQgaGFuZGxlcnMgZnJvbSBiZWluZyBleGVjdXRlZCBpbW1lZGlhdGVseVxuXHRcdC8vIGJ5IHVzaW5nIGRvY3VtZW50LmltcGxlbWVudGF0aW9uXG5cdFx0aWYgKCBzdXBwb3J0LmNyZWF0ZUhUTUxEb2N1bWVudCApIHtcblx0XHRcdGNvbnRleHQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIFwiXCIgKTtcblxuXHRcdFx0Ly8gU2V0IHRoZSBiYXNlIGhyZWYgZm9yIHRoZSBjcmVhdGVkIGRvY3VtZW50XG5cdFx0XHQvLyBzbyBhbnkgcGFyc2VkIGVsZW1lbnRzIHdpdGggVVJMc1xuXHRcdFx0Ly8gYXJlIGJhc2VkIG9uIHRoZSBkb2N1bWVudCdzIFVSTCAoZ2gtMjk2NSlcblx0XHRcdGJhc2UgPSBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIFwiYmFzZVwiICk7XG5cdFx0XHRiYXNlLmhyZWYgPSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmO1xuXHRcdFx0Y29udGV4dC5oZWFkLmFwcGVuZENoaWxkKCBiYXNlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnRleHQgPSBkb2N1bWVudDtcblx0XHR9XG5cdH1cblxuXHRwYXJzZWQgPSByc2luZ2xlVGFnLmV4ZWMoIGRhdGEgKTtcblx0c2NyaXB0cyA9ICFrZWVwU2NyaXB0cyAmJiBbXTtcblxuXHQvLyBTaW5nbGUgdGFnXG5cdGlmICggcGFyc2VkICkge1xuXHRcdHJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWyAxIF0gKSBdO1xuXHR9XG5cblx0cGFyc2VkID0gYnVpbGRGcmFnbWVudCggWyBkYXRhIF0sIGNvbnRleHQsIHNjcmlwdHMgKTtcblxuXHRpZiAoIHNjcmlwdHMgJiYgc2NyaXB0cy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5KCBzY3JpcHRzICkucmVtb3ZlKCk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgcGFyc2VkLmNoaWxkTm9kZXMgKTtcbn07XG5cblxuLyoqXG4gKiBMb2FkIGEgdXJsIGludG8gYSBwYWdlXG4gKi9cbmpRdWVyeS5mbi5sb2FkID0gZnVuY3Rpb24oIHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHtcblx0dmFyIHNlbGVjdG9yLCB0eXBlLCByZXNwb25zZSxcblx0XHRzZWxmID0gdGhpcyxcblx0XHRvZmYgPSB1cmwuaW5kZXhPZiggXCIgXCIgKTtcblxuXHRpZiAoIG9mZiA+IC0xICkge1xuXHRcdHNlbGVjdG9yID0gc3RyaXBBbmRDb2xsYXBzZSggdXJsLnNsaWNlKCBvZmYgKSApO1xuXHRcdHVybCA9IHVybC5zbGljZSggMCwgb2ZmICk7XG5cdH1cblxuXHQvLyBJZiBpdCdzIGEgZnVuY3Rpb25cblx0aWYgKCBpc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHtcblxuXHRcdC8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrXG5cdFx0Y2FsbGJhY2sgPSBwYXJhbXM7XG5cdFx0cGFyYW1zID0gdW5kZWZpbmVkO1xuXG5cdC8vIE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmdcblx0fSBlbHNlIGlmICggcGFyYW1zICYmIHR5cGVvZiBwYXJhbXMgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0dHlwZSA9IFwiUE9TVFwiO1xuXHR9XG5cblx0Ly8gSWYgd2UgaGF2ZSBlbGVtZW50cyB0byBtb2RpZnksIG1ha2UgdGhlIHJlcXVlc3Rcblx0aWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7XG5cdFx0alF1ZXJ5LmFqYXgoIHtcblx0XHRcdHVybDogdXJsLFxuXG5cdFx0XHQvLyBJZiBcInR5cGVcIiB2YXJpYWJsZSBpcyB1bmRlZmluZWQsIHRoZW4gXCJHRVRcIiBtZXRob2Qgd2lsbCBiZSB1c2VkLlxuXHRcdFx0Ly8gTWFrZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGV4cGxpY2l0IHNpbmNlXG5cdFx0XHQvLyB1c2VyIGNhbiBvdmVycmlkZSBpdCB0aHJvdWdoIGFqYXhTZXR1cCBtZXRob2Rcblx0XHRcdHR5cGU6IHR5cGUgfHwgXCJHRVRcIixcblx0XHRcdGRhdGFUeXBlOiBcImh0bWxcIixcblx0XHRcdGRhdGE6IHBhcmFtc1xuXHRcdH0gKS5kb25lKCBmdW5jdGlvbiggcmVzcG9uc2VUZXh0ICkge1xuXG5cdFx0XHQvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2tcblx0XHRcdHJlc3BvbnNlID0gYXJndW1lbnRzO1xuXG5cdFx0XHRzZWxmLmh0bWwoIHNlbGVjdG9yID9cblxuXHRcdFx0XHQvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXZcblx0XHRcdFx0Ly8gRXhjbHVkZSBzY3JpcHRzIHRvIGF2b2lkIElFICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzXG5cdFx0XHRcdGpRdWVyeSggXCI8ZGl2PlwiICkuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0XG5cdFx0XHRcdHJlc3BvbnNlVGV4dCApO1xuXG5cdFx0Ly8gSWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyBcImRhdGFcIiwgXCJzdGF0dXNcIiwgXCJqcVhIUlwiXG5cdFx0Ly8gYnV0IHRoZXkgYXJlIGlnbm9yZWQgYmVjYXVzZSByZXNwb25zZSB3YXMgc2V0IGFib3ZlLlxuXHRcdC8vIElmIGl0IGZhaWxzLCB0aGlzIGZ1bmN0aW9uIGdldHMgXCJqcVhIUlwiLCBcInN0YXR1c1wiLCBcImVycm9yXCJcblx0XHR9ICkuYWx3YXlzKCBjYWxsYmFjayAmJiBmdW5jdGlvbigganFYSFIsIHN0YXR1cyApIHtcblx0XHRcdHNlbGYuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGNhbGxiYWNrLmFwcGx5KCB0aGlzLCByZXNwb25zZSB8fCBbIGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7XG5cdFx0XHR9ICk7XG5cdFx0fSApO1xuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG5cblxuXG4vLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50c1xualF1ZXJ5LmVhY2goIFtcblx0XCJhamF4U3RhcnRcIixcblx0XCJhamF4U3RvcFwiLFxuXHRcImFqYXhDb21wbGV0ZVwiLFxuXHRcImFqYXhFcnJvclwiLFxuXHRcImFqYXhTdWNjZXNzXCIsXG5cdFwiYWpheFNlbmRcIlxuXSwgZnVuY3Rpb24oIGksIHR5cGUgKSB7XG5cdGpRdWVyeS5mblsgdHlwZSBdID0gZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiB0aGlzLm9uKCB0eXBlLCBmbiApO1xuXHR9O1xufSApO1xuXG5cblxuXG5qUXVlcnkuZXhwci5wc2V1ZG9zLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHJldHVybiBqUXVlcnkuZ3JlcCggalF1ZXJ5LnRpbWVycywgZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiBlbGVtID09PSBmbi5lbGVtO1xuXHR9ICkubGVuZ3RoO1xufTtcblxuXG5cblxualF1ZXJ5Lm9mZnNldCA9IHtcblx0c2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHtcblx0XHR2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLFxuXHRcdFx0cG9zaXRpb24gPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBvc2l0aW9uXCIgKSxcblx0XHRcdGN1ckVsZW0gPSBqUXVlcnkoIGVsZW0gKSxcblx0XHRcdHByb3BzID0ge307XG5cblx0XHQvLyBTZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtXG5cdFx0aWYgKCBwb3NpdGlvbiA9PT0gXCJzdGF0aWNcIiApIHtcblx0XHRcdGVsZW0uc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG5cdFx0fVxuXG5cdFx0Y3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKTtcblx0XHRjdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCBcInRvcFwiICk7XG5cdFx0Y3VyQ1NTTGVmdCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwibGVmdFwiICk7XG5cdFx0Y2FsY3VsYXRlUG9zaXRpb24gPSAoIHBvc2l0aW9uID09PSBcImFic29sdXRlXCIgfHwgcG9zaXRpb24gPT09IFwiZml4ZWRcIiApICYmXG5cdFx0XHQoIGN1ckNTU1RvcCArIGN1ckNTU0xlZnQgKS5pbmRleE9mKCBcImF1dG9cIiApID4gLTE7XG5cblx0XHQvLyBOZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlclxuXHRcdC8vIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZFxuXHRcdGlmICggY2FsY3VsYXRlUG9zaXRpb24gKSB7XG5cdFx0XHRjdXJQb3NpdGlvbiA9IGN1ckVsZW0ucG9zaXRpb24oKTtcblx0XHRcdGN1clRvcCA9IGN1clBvc2l0aW9uLnRvcDtcblx0XHRcdGN1ckxlZnQgPSBjdXJQb3NpdGlvbi5sZWZ0O1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGN1clRvcCA9IHBhcnNlRmxvYXQoIGN1ckNTU1RvcCApIHx8IDA7XG5cdFx0XHRjdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7XG5cdFx0fVxuXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBvcHRpb25zICkgKSB7XG5cblx0XHRcdC8vIFVzZSBqUXVlcnkuZXh0ZW5kIGhlcmUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIG9mIGNvb3JkaW5hdGVzIGFyZ3VtZW50IChnaC0xODQ4KVxuXHRcdFx0b3B0aW9ucyA9IG9wdGlvbnMuY2FsbCggZWxlbSwgaSwgalF1ZXJ5LmV4dGVuZCgge30sIGN1ck9mZnNldCApICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHRpb25zLnRvcCAhPSBudWxsICkge1xuXHRcdFx0cHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDtcblx0XHR9XG5cdFx0aWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHtcblx0XHRcdHByb3BzLmxlZnQgPSAoIG9wdGlvbnMubGVmdCAtIGN1ck9mZnNldC5sZWZ0ICkgKyBjdXJMZWZ0O1xuXHRcdH1cblxuXHRcdGlmICggXCJ1c2luZ1wiIGluIG9wdGlvbnMgKSB7XG5cdFx0XHRvcHRpb25zLnVzaW5nLmNhbGwoIGVsZW0sIHByb3BzICk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3VyRWxlbS5jc3MoIHByb3BzICk7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0Ly8gb2Zmc2V0KCkgcmVsYXRlcyBhbiBlbGVtZW50J3MgYm9yZGVyIGJveCB0byB0aGUgZG9jdW1lbnQgb3JpZ2luXG5cdG9mZnNldDogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cblx0XHQvLyBQcmVzZXJ2ZSBjaGFpbmluZyBmb3Igc2V0dGVyXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHRoaXMgOlxuXHRcdFx0XHR0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRcdGpRdWVyeS5vZmZzZXQuc2V0T2Zmc2V0KCB0aGlzLCBvcHRpb25zLCBpICk7XG5cdFx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHR2YXIgcmVjdCwgd2luLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXTtcblxuXHRcdGlmICggIWVsZW0gKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUmV0dXJuIHplcm9zIGZvciBkaXNjb25uZWN0ZWQgYW5kIGhpZGRlbiAoZGlzcGxheTogbm9uZSkgZWxlbWVudHMgKGdoLTIzMTApXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdFx0Ly8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYVxuXHRcdC8vIGRpc2Nvbm5lY3RlZCBub2RlIGluIElFIHRocm93cyBhbiBlcnJvclxuXHRcdGlmICggIWVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4geyB0b3A6IDAsIGxlZnQ6IDAgfTtcblx0XHR9XG5cblx0XHQvLyBHZXQgZG9jdW1lbnQtcmVsYXRpdmUgcG9zaXRpb24gYnkgYWRkaW5nIHZpZXdwb3J0IHNjcm9sbCB0byB2aWV3cG9ydC1yZWxhdGl2ZSBnQkNSXG5cdFx0cmVjdCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0d2luID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuXHRcdHJldHVybiB7XG5cdFx0XHR0b3A6IHJlY3QudG9wICsgd2luLnBhZ2VZT2Zmc2V0LFxuXHRcdFx0bGVmdDogcmVjdC5sZWZ0ICsgd2luLnBhZ2VYT2Zmc2V0XG5cdFx0fTtcblx0fSxcblxuXHQvLyBwb3NpdGlvbigpIHJlbGF0ZXMgYW4gZWxlbWVudCdzIG1hcmdpbiBib3ggdG8gaXRzIG9mZnNldCBwYXJlbnQncyBwYWRkaW5nIGJveFxuXHQvLyBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBiZWhhdmlvciBvZiBDU1MgYWJzb2x1dGUgcG9zaXRpb25pbmdcblx0cG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggIXRoaXNbIDAgXSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsIGRvYyxcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF0sXG5cdFx0XHRwYXJlbnRPZmZzZXQgPSB7IHRvcDogMCwgbGVmdDogMCB9O1xuXG5cdFx0Ly8gcG9zaXRpb246Zml4ZWQgZWxlbWVudHMgYXJlIG9mZnNldCBmcm9tIHRoZSB2aWV3cG9ydCwgd2hpY2ggaXRzZWxmIGFsd2F5cyBoYXMgemVybyBvZmZzZXRcblx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwicG9zaXRpb25cIiApID09PSBcImZpeGVkXCIgKSB7XG5cblx0XHRcdC8vIEFzc3VtZSBwb3NpdGlvbjpmaXhlZCBpbXBsaWVzIGF2YWlsYWJpbGl0eSBvZiBnZXRCb3VuZGluZ0NsaWVudFJlY3Rcblx0XHRcdG9mZnNldCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0b2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTtcblxuXHRcdFx0Ly8gQWNjb3VudCBmb3IgdGhlICpyZWFsKiBvZmZzZXQgcGFyZW50LCB3aGljaCBjYW4gYmUgdGhlIGRvY3VtZW50IG9yIGl0cyByb290IGVsZW1lbnRcblx0XHRcdC8vIHdoZW4gYSBzdGF0aWNhbGx5IHBvc2l0aW9uZWQgZWxlbWVudCBpcyBpZGVudGlmaWVkXG5cdFx0XHRkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQ7XG5cdFx0XHRvZmZzZXRQYXJlbnQgPSBlbGVtLm9mZnNldFBhcmVudCB8fCBkb2MuZG9jdW1lbnRFbGVtZW50O1xuXHRcdFx0d2hpbGUgKCBvZmZzZXRQYXJlbnQgJiZcblx0XHRcdFx0KCBvZmZzZXRQYXJlbnQgPT09IGRvYy5ib2R5IHx8IG9mZnNldFBhcmVudCA9PT0gZG9jLmRvY3VtZW50RWxlbWVudCApICYmXG5cdFx0XHRcdGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJwb3NpdGlvblwiICkgPT09IFwic3RhdGljXCIgKSB7XG5cblx0XHRcdFx0b2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50LnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIG9mZnNldFBhcmVudCAmJiBvZmZzZXRQYXJlbnQgIT09IGVsZW0gJiYgb2Zmc2V0UGFyZW50Lm5vZGVUeXBlID09PSAxICkge1xuXG5cdFx0XHRcdC8vIEluY29ycG9yYXRlIGJvcmRlcnMgaW50byBpdHMgb2Zmc2V0LCBzaW5jZSB0aGV5IGFyZSBvdXRzaWRlIGl0cyBjb250ZW50IG9yaWdpblxuXHRcdFx0XHRwYXJlbnRPZmZzZXQgPSBqUXVlcnkoIG9mZnNldFBhcmVudCApLm9mZnNldCgpO1xuXHRcdFx0XHRwYXJlbnRPZmZzZXQudG9wICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJib3JkZXJUb3BXaWR0aFwiLCB0cnVlICk7XG5cdFx0XHRcdHBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJib3JkZXJMZWZ0V2lkdGhcIiwgdHJ1ZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFN1YnRyYWN0IHBhcmVudCBvZmZzZXRzIGFuZCBlbGVtZW50IG1hcmdpbnNcblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wOiBvZmZzZXQudG9wIC0gcGFyZW50T2Zmc2V0LnRvcCAtIGpRdWVyeS5jc3MoIGVsZW0sIFwibWFyZ2luVG9wXCIsIHRydWUgKSxcblx0XHRcdGxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQgLSBqUXVlcnkuY3NzKCBlbGVtLCBcIm1hcmdpbkxlZnRcIiwgdHJ1ZSApXG5cdFx0fTtcblx0fSxcblxuXHQvLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBkb2N1bWVudEVsZW1lbnQgaW4gdGhlIGZvbGxvd2luZyBjYXNlczpcblx0Ly8gMSkgRm9yIHRoZSBlbGVtZW50IGluc2lkZSB0aGUgaWZyYW1lIHdpdGhvdXQgb2Zmc2V0UGFyZW50LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVyblxuXHQvLyAgICBkb2N1bWVudEVsZW1lbnQgb2YgdGhlIHBhcmVudCB3aW5kb3dcblx0Ly8gMikgRm9yIHRoZSBoaWRkZW4gb3IgZGV0YWNoZWQgZWxlbWVudFxuXHQvLyAzKSBGb3IgYm9keSBvciBodG1sIGVsZW1lbnQsIGkuZS4gaW4gY2FzZSBvZiB0aGUgaHRtbCBub2RlIC0gaXQgd2lsbCByZXR1cm4gaXRzZWxmXG5cdC8vXG5cdC8vIGJ1dCB0aG9zZSBleGNlcHRpb25zIHdlcmUgbmV2ZXIgcHJlc2VudGVkIGFzIGEgcmVhbCBsaWZlIHVzZS1jYXNlc1xuXHQvLyBhbmQgbWlnaHQgYmUgY29uc2lkZXJlZCBhcyBtb3JlIHByZWZlcmFibGUgcmVzdWx0cy5cblx0Ly9cblx0Ly8gVGhpcyBsb2dpYywgaG93ZXZlciwgaXMgbm90IGd1YXJhbnRlZWQgYW5kIGNhbiBjaGFuZ2UgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmVcblx0b2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50O1xuXG5cdFx0XHR3aGlsZSAoIG9mZnNldFBhcmVudCAmJiBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsIFwicG9zaXRpb25cIiApID09PSBcInN0YXRpY1wiICkge1xuXHRcdFx0XHRvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50RWxlbWVudDtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuLy8gQ3JlYXRlIHNjcm9sbExlZnQgYW5kIHNjcm9sbFRvcCBtZXRob2RzXG5qUXVlcnkuZWFjaCggeyBzY3JvbGxMZWZ0OiBcInBhZ2VYT2Zmc2V0XCIsIHNjcm9sbFRvcDogXCJwYWdlWU9mZnNldFwiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7XG5cdHZhciB0b3AgPSBcInBhZ2VZT2Zmc2V0XCIgPT09IHByb3A7XG5cblx0alF1ZXJ5LmZuWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG1ldGhvZCwgdmFsICkge1xuXG5cdFx0XHQvLyBDb2FsZXNjZSBkb2N1bWVudHMgYW5kIHdpbmRvd3Ncblx0XHRcdHZhciB3aW47XG5cdFx0XHRpZiAoIGlzV2luZG93KCBlbGVtICkgKSB7XG5cdFx0XHRcdHdpbiA9IGVsZW07XG5cdFx0XHR9IGVsc2UgaWYgKCBlbGVtLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHR3aW4gPSBlbGVtLmRlZmF1bHRWaWV3O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gd2luID8gd2luWyBwcm9wIF0gOiBlbGVtWyBtZXRob2QgXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB3aW4gKSB7XG5cdFx0XHRcdHdpbi5zY3JvbGxUbyhcblx0XHRcdFx0XHQhdG9wID8gdmFsIDogd2luLnBhZ2VYT2Zmc2V0LFxuXHRcdFx0XHRcdHRvcCA/IHZhbCA6IHdpbi5wYWdlWU9mZnNldFxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbGVtWyBtZXRob2QgXSA9IHZhbDtcblx0XHRcdH1cblx0XHR9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9O1xufSApO1xuXG4vLyBTdXBwb3J0OiBTYWZhcmkgPD03IC0gOS4xLCBDaHJvbWUgPD0zNyAtIDQ5XG4vLyBBZGQgdGhlIHRvcC9sZWZ0IGNzc0hvb2tzIHVzaW5nIGpRdWVyeS5mbi5wb3NpdGlvblxuLy8gV2Via2l0IGJ1ZzogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI5MDg0XG4vLyBCbGluayBidWc6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTU4OTM0N1xuLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodDtcbi8vIHJhdGhlciB0aGFuIG1ha2UgdGhlIGNzcyBtb2R1bGUgZGVwZW5kIG9uIHRoZSBvZmZzZXQgbW9kdWxlLCBqdXN0IGNoZWNrIGZvciBpdCBoZXJlXG5qUXVlcnkuZWFjaCggWyBcInRvcFwiLCBcImxlZnRcIiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcm9wIF0gPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucGl4ZWxQb3NpdGlvbixcblx0XHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0XHRjb21wdXRlZCA9IGN1ckNTUyggZWxlbSwgcHJvcCApO1xuXG5cdFx0XHRcdC8vIElmIGN1ckNTUyByZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNrIHRvIG9mZnNldFxuXHRcdFx0XHRyZXR1cm4gcm51bW5vbnB4LnRlc3QoIGNvbXB1dGVkICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggZWxlbSApLnBvc2l0aW9uKClbIHByb3AgXSArIFwicHhcIiA6XG5cdFx0XHRcdFx0Y29tcHV0ZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xufSApO1xuXG5cbi8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiBcImhlaWdodFwiLCBXaWR0aDogXCJ3aWR0aFwiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkge1xuXHRqUXVlcnkuZWFjaCggeyBwYWRkaW5nOiBcImlubmVyXCIgKyBuYW1lLCBjb250ZW50OiB0eXBlLCBcIlwiOiBcIm91dGVyXCIgKyBuYW1lIH0sXG5cdFx0ZnVuY3Rpb24oIGRlZmF1bHRFeHRyYSwgZnVuY05hbWUgKSB7XG5cblx0XHQvLyBNYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGhcblx0XHRqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHtcblx0XHRcdHZhciBjaGFpbmFibGUgPSBhcmd1bWVudHMubGVuZ3RoICYmICggZGVmYXVsdEV4dHJhIHx8IHR5cGVvZiBtYXJnaW4gIT09IFwiYm9vbGVhblwiICksXG5cdFx0XHRcdGV4dHJhID0gZGVmYXVsdEV4dHJhIHx8ICggbWFyZ2luID09PSB0cnVlIHx8IHZhbHVlID09PSB0cnVlID8gXCJtYXJnaW5cIiA6IFwiYm9yZGVyXCIgKTtcblxuXHRcdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIHR5cGUsIHZhbHVlICkge1xuXHRcdFx0XHR2YXIgZG9jO1xuXG5cdFx0XHRcdGlmICggaXNXaW5kb3coIGVsZW0gKSApIHtcblxuXHRcdFx0XHRcdC8vICQoIHdpbmRvdyApLm91dGVyV2lkdGgvSGVpZ2h0IHJldHVybiB3L2ggaW5jbHVkaW5nIHNjcm9sbGJhcnMgKGdoLTE3MjkpXG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmNOYW1lLmluZGV4T2YoIFwib3V0ZXJcIiApID09PSAwID9cblx0XHRcdFx0XHRcdGVsZW1bIFwiaW5uZXJcIiArIG5hbWUgXSA6XG5cdFx0XHRcdFx0XHRlbGVtLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgXCJjbGllbnRcIiArIG5hbWUgXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHRcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdGRvYyA9IGVsZW0uZG9jdW1lbnRFbGVtZW50O1xuXG5cdFx0XHRcdFx0Ly8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLFxuXHRcdFx0XHRcdC8vIHdoaWNoZXZlciBpcyBncmVhdGVzdFxuXHRcdFx0XHRcdHJldHVybiBNYXRoLm1heChcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJzY3JvbGxcIiArIG5hbWUgXSwgZG9jWyBcInNjcm9sbFwiICsgbmFtZSBdLFxuXHRcdFx0XHRcdFx0ZWxlbS5ib2R5WyBcIm9mZnNldFwiICsgbmFtZSBdLCBkb2NbIFwib2Zmc2V0XCIgKyBuYW1lIF0sXG5cdFx0XHRcdFx0XHRkb2NbIFwiY2xpZW50XCIgKyBuYW1lIF1cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXG5cdFx0XHRcdFx0Ly8gR2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCwgcmVxdWVzdGluZyBidXQgbm90IGZvcmNpbmcgcGFyc2VGbG9hdFxuXHRcdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsIGV4dHJhICkgOlxuXG5cdFx0XHRcdFx0Ly8gU2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudFxuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgdHlwZSwgdmFsdWUsIGV4dHJhICk7XG5cdFx0XHR9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSApO1xuXHRcdH07XG5cdH0gKTtcbn0gKTtcblxuXG5qUXVlcnkuZWFjaCggKCBcImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIFwiICtcblx0XCJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBcIiArXG5cdFwiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudVwiICkuc3BsaXQoIFwiIFwiICksXG5cdGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXG5cdC8vIEhhbmRsZSBldmVudCBiaW5kaW5nXG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMCA/XG5cdFx0XHR0aGlzLm9uKCBuYW1lLCBudWxsLCBkYXRhLCBmbiApIDpcblx0XHRcdHRoaXMudHJpZ2dlciggbmFtZSApO1xuXHR9O1xufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGhvdmVyOiBmdW5jdGlvbiggZm5PdmVyLCBmbk91dCApIHtcblx0XHRyZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92ZXIgKS5tb3VzZWxlYXZlKCBmbk91dCB8fCBmbk92ZXIgKTtcblx0fVxufSApO1xuXG5cblxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0YmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEsIGZuICk7XG5cdH0sXG5cdHVuYmluZDogZnVuY3Rpb24oIHR5cGVzLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vZmYoIHR5cGVzLCBudWxsLCBmbiApO1xuXHR9LFxuXG5cdGRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBmbiApIHtcblxuXHRcdC8vICggbmFtZXNwYWNlICkgb3IgKCBzZWxlY3RvciwgdHlwZXMgWywgZm5dIClcblx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/XG5cdFx0XHR0aGlzLm9mZiggc2VsZWN0b3IsIFwiKipcIiApIDpcblx0XHRcdHRoaXMub2ZmKCB0eXBlcywgc2VsZWN0b3IgfHwgXCIqKlwiLCBmbiApO1xuXHR9XG59ICk7XG5cbi8vIEJpbmQgYSBmdW5jdGlvbiB0byBhIGNvbnRleHQsIG9wdGlvbmFsbHkgcGFydGlhbGx5IGFwcGx5aW5nIGFueVxuLy8gYXJndW1lbnRzLlxuLy8galF1ZXJ5LnByb3h5IGlzIGRlcHJlY2F0ZWQgdG8gcHJvbW90ZSBzdGFuZGFyZHMgKHNwZWNpZmljYWxseSBGdW5jdGlvbiNiaW5kKVxuLy8gSG93ZXZlciwgaXQgaXMgbm90IHNsYXRlZCBmb3IgcmVtb3ZhbCBhbnkgdGltZSBzb29uXG5qUXVlcnkucHJveHkgPSBmdW5jdGlvbiggZm4sIGNvbnRleHQgKSB7XG5cdHZhciB0bXAsIGFyZ3MsIHByb3h5O1xuXG5cdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0dG1wID0gZm5bIGNvbnRleHQgXTtcblx0XHRjb250ZXh0ID0gZm47XG5cdFx0Zm4gPSB0bXA7XG5cdH1cblxuXHQvLyBRdWljayBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGFyZ2V0IGlzIGNhbGxhYmxlLCBpbiB0aGUgc3BlY1xuXHQvLyB0aGlzIHRocm93cyBhIFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVzdCByZXR1cm4gdW5kZWZpbmVkLlxuXHRpZiAoICFpc0Z1bmN0aW9uKCBmbiApICkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvLyBTaW11bGF0ZWQgYmluZFxuXHRhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzLCAyICk7XG5cdHByb3h5ID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7XG5cdH07XG5cblx0Ly8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkXG5cdHByb3h5Lmd1aWQgPSBmbi5ndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrO1xuXG5cdHJldHVybiBwcm94eTtcbn07XG5cbmpRdWVyeS5ob2xkUmVhZHkgPSBmdW5jdGlvbiggaG9sZCApIHtcblx0aWYgKCBob2xkICkge1xuXHRcdGpRdWVyeS5yZWFkeVdhaXQrKztcblx0fSBlbHNlIHtcblx0XHRqUXVlcnkucmVhZHkoIHRydWUgKTtcblx0fVxufTtcbmpRdWVyeS5pc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbmpRdWVyeS5wYXJzZUpTT04gPSBKU09OLnBhcnNlO1xualF1ZXJ5Lm5vZGVOYW1lID0gbm9kZU5hbWU7XG5qUXVlcnkuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5qUXVlcnkuaXNXaW5kb3cgPSBpc1dpbmRvdztcbmpRdWVyeS5jYW1lbENhc2UgPSBjYW1lbENhc2U7XG5qUXVlcnkudHlwZSA9IHRvVHlwZTtcblxualF1ZXJ5Lm5vdyA9IERhdGUubm93O1xuXG5qUXVlcnkuaXNOdW1lcmljID0gZnVuY3Rpb24oIG9iaiApIHtcblxuXHQvLyBBcyBvZiBqUXVlcnkgMy4wLCBpc051bWVyaWMgaXMgbGltaXRlZCB0b1xuXHQvLyBzdHJpbmdzIGFuZCBudW1iZXJzIChwcmltaXRpdmVzIG9yIG9iamVjdHMpXG5cdC8vIHRoYXQgY2FuIGJlIGNvZXJjZWQgdG8gZmluaXRlIG51bWJlcnMgKGdoLTI2NjIpXG5cdHZhciB0eXBlID0galF1ZXJ5LnR5cGUoIG9iaiApO1xuXHRyZXR1cm4gKCB0eXBlID09PSBcIm51bWJlclwiIHx8IHR5cGUgPT09IFwic3RyaW5nXCIgKSAmJlxuXG5cdFx0Ly8gcGFyc2VGbG9hdCBOYU5zIG51bWVyaWMtY2FzdCBmYWxzZSBwb3NpdGl2ZXMgKFwiXCIpXG5cdFx0Ly8gLi4uYnV0IG1pc2ludGVycHJldHMgbGVhZGluZy1udW1iZXIgc3RyaW5ncywgcGFydGljdWxhcmx5IGhleCBsaXRlcmFscyAoXCIweC4uLlwiKVxuXHRcdC8vIHN1YnRyYWN0aW9uIGZvcmNlcyBpbmZpbml0aWVzIHRvIE5hTlxuXHRcdCFpc05hTiggb2JqIC0gcGFyc2VGbG9hdCggb2JqICkgKTtcbn07XG5cblxuXG5cbi8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlclxuLy8gZmlsZXMgdGhhdCBtYXkgdXNlIGRlZmluZSwgYnV0IG5vdCB2aWEgYSBwcm9wZXIgY29uY2F0ZW5hdGlvbiBzY3JpcHQgdGhhdFxuLy8gdW5kZXJzdGFuZHMgYW5vbnltb3VzIEFNRCBtb2R1bGVzLiBBIG5hbWVkIEFNRCBpcyBzYWZlc3QgYW5kIG1vc3Qgcm9idXN0XG4vLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlXG4vLyBkZXJpdmVkIGZyb20gZmlsZSBuYW1lcywgYW5kIGpRdWVyeSBpcyBub3JtYWxseSBkZWxpdmVyZWQgaW4gYSBsb3dlcmNhc2Vcbi8vIGZpbGUgbmFtZS4gRG8gdGhpcyBhZnRlciBjcmVhdGluZyB0aGUgZ2xvYmFsIHNvIHRoYXQgaWYgYW4gQU1EIG1vZHVsZSB3YW50c1xuLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLlxuXG4vLyBOb3RlIHRoYXQgZm9yIG1heGltdW0gcG9ydGFiaWxpdHksIGxpYnJhcmllcyB0aGF0IGFyZSBub3QgalF1ZXJ5IHNob3VsZFxuLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQgc2V0dGluZyBhIGdsb2JhbCBpZiBhblxuLy8gQU1EIGxvYWRlciBpcyBwcmVzZW50LiBqUXVlcnkgaXMgYSBzcGVjaWFsIGNhc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcmJ1cmtlL3JlcXVpcmVqcy93aWtpL1VwZGF0aW5nLWV4aXN0aW5nLWxpYnJhcmllcyN3aWtpLWFub25cblxuaWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblx0ZGVmaW5lKCBcImpxdWVyeVwiLCBbXSwgZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeTtcblx0fSApO1xufVxuXG5cblxuXG52YXJcblxuXHQvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0X2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksXG5cblx0Ly8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0XyQgPSB3aW5kb3cuJDtcblxualF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHtcblx0aWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy4kID0gXyQ7XG5cdH1cblxuXHRpZiAoIGRlZXAgJiYgd2luZG93LmpRdWVyeSA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5O1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeTtcbn07XG5cbi8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW4gQU1EXG4vLyAoIzcxMDIjY29tbWVudDoxMCwgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVsbC81NTcpXG4vLyBhbmQgQ29tbW9uSlMgZm9yIGJyb3dzZXIgZW11bGF0b3JzICgjMTM1NjYpXG5pZiAoICFub0dsb2JhbCApIHtcblx0d2luZG93LmpRdWVyeSA9IHdpbmRvdy4kID0galF1ZXJ5O1xufVxuXG5cblxuXG5yZXR1cm4galF1ZXJ5O1xufSApO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/jquery/dist/jquery.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/node-libs-browser/node_modules/punycode/punycode.js":
+/*!**************************************************************************!*\
+ !*** ./node_modules/node-libs-browser/node_modules/punycode/punycode.js ***!
+ \**************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/* WEBPACK VAR INJECTION */(function(module, global) {var __WEBPACK_AMD_DEFINE_RESULT__;/*! https://mths.be/punycode v1.4.1 by @mathias */\n;(function(root) {\n\n\t/** Detect free variables */\n\tvar freeExports = true && exports &&\n\t\t!exports.nodeType && exports;\n\tvar freeModule = true && module &&\n\t\t!module.nodeType && module;\n\tvar freeGlobal = typeof global == 'object' && global;\n\tif (\n\t\tfreeGlobal.global === freeGlobal ||\n\t\tfreeGlobal.window === freeGlobal ||\n\t\tfreeGlobal.self === freeGlobal\n\t) {\n\t\troot = freeGlobal;\n\t}\n\n\t/**\n\t * The `punycode` object.\n\t * @name punycode\n\t * @type Object\n\t */\n\tvar punycode,\n\n\t/** Highest positive signed 32-bit float value */\n\tmaxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1\n\n\t/** Bootstring parameters */\n\tbase = 36,\n\ttMin = 1,\n\ttMax = 26,\n\tskew = 38,\n\tdamp = 700,\n\tinitialBias = 72,\n\tinitialN = 128, // 0x80\n\tdelimiter = '-', // '\\x2D'\n\n\t/** Regular expressions */\n\tregexPunycode = /^xn--/,\n\tregexNonASCII = /[^\\x20-\\x7E]/, // unprintable ASCII chars + non-ASCII chars\n\tregexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g, // RFC 3490 separators\n\n\t/** Error messages */\n\terrors = {\n\t\t'overflow': 'Overflow: input needs wider integers to process',\n\t\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t\t'invalid-input': 'Invalid input'\n\t},\n\n\t/** Convenience shortcuts */\n\tbaseMinusTMin = base - tMin,\n\tfloor = Math.floor,\n\tstringFromCharCode = String.fromCharCode,\n\n\t/** Temporary variable */\n\tkey;\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/**\n\t * A generic error utility function.\n\t * @private\n\t * @param {String} type The error type.\n\t * @returns {Error} Throws a `RangeError` with the applicable error message.\n\t */\n\tfunction error(type) {\n\t\tthrow new RangeError(errors[type]);\n\t}\n\n\t/**\n\t * A generic `Array#map` utility function.\n\t * @private\n\t * @param {Array} array The array to iterate over.\n\t * @param {Function} callback The function that gets called for every array\n\t * item.\n\t * @returns {Array} A new array of values returned by the callback function.\n\t */\n\tfunction map(array, fn) {\n\t\tvar length = array.length;\n\t\tvar result = [];\n\t\twhile (length--) {\n\t\t\tresult[length] = fn(array[length]);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * A simple `Array#map`-like wrapper to work with domain name strings or email\n\t * addresses.\n\t * @private\n\t * @param {String} domain The domain name or email address.\n\t * @param {Function} callback The function that gets called for every\n\t * character.\n\t * @returns {Array} A new string of characters returned by the callback\n\t * function.\n\t */\n\tfunction mapDomain(string, fn) {\n\t\tvar parts = string.split('@');\n\t\tvar result = '';\n\t\tif (parts.length > 1) {\n\t\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t\t// the local part (i.e. everything up to `@`) intact.\n\t\t\tresult = parts[0] + '@';\n\t\t\tstring = parts[1];\n\t\t}\n\t\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\t\tstring = string.replace(regexSeparators, '\\x2E');\n\t\tvar labels = string.split('.');\n\t\tvar encoded = map(labels, fn).join('.');\n\t\treturn result + encoded;\n\t}\n\n\t/**\n\t * Creates an array containing the numeric code points of each Unicode\n\t * character in the string. While JavaScript uses UCS-2 internally,\n\t * this function will convert a pair of surrogate halves (each of which\n\t * UCS-2 exposes as separate characters) into a single code point,\n\t * matching UTF-16.\n\t * @see `punycode.ucs2.encode`\n\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t * @memberOf punycode.ucs2\n\t * @name decode\n\t * @param {String} string The Unicode input string (UCS-2).\n\t * @returns {Array} The new array of code points.\n\t */\n\tfunction ucs2decode(string) {\n\t\tvar output = [],\n\t\t counter = 0,\n\t\t length = string.length,\n\t\t value,\n\t\t extra;\n\t\twhile (counter < length) {\n\t\t\tvalue = string.charCodeAt(counter++);\n\t\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t\t// high surrogate, and there is a next character\n\t\t\t\textra = string.charCodeAt(counter++);\n\t\t\t\tif ((extra & 0xFC00) == 0xDC00) { // low surrogate\n\t\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t\t} else {\n\t\t\t\t\t// unmatched surrogate; only append this code unit, in case the next\n\t\t\t\t\t// code unit is the high surrogate of a surrogate pair\n\t\t\t\t\toutput.push(value);\n\t\t\t\t\tcounter--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toutput.push(value);\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\t/**\n\t * Creates a string based on an array of numeric code points.\n\t * @see `punycode.ucs2.decode`\n\t * @memberOf punycode.ucs2\n\t * @name encode\n\t * @param {Array} codePoints The array of numeric code points.\n\t * @returns {String} The new Unicode string (UCS-2).\n\t */\n\tfunction ucs2encode(array) {\n\t\treturn map(array, function(value) {\n\t\t\tvar output = '';\n\t\t\tif (value > 0xFFFF) {\n\t\t\t\tvalue -= 0x10000;\n\t\t\t\toutput += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n\t\t\t\tvalue = 0xDC00 | value & 0x3FF;\n\t\t\t}\n\t\t\toutput += stringFromCharCode(value);\n\t\t\treturn output;\n\t\t}).join('');\n\t}\n\n\t/**\n\t * Converts a basic code point into a digit/integer.\n\t * @see `digitToBasic()`\n\t * @private\n\t * @param {Number} codePoint The basic numeric code point value.\n\t * @returns {Number} The numeric value of a basic code point (for use in\n\t * representing integers) in the range `0` to `base - 1`, or `base` if\n\t * the code point does not represent a value.\n\t */\n\tfunction basicToDigit(codePoint) {\n\t\tif (codePoint - 48 < 10) {\n\t\t\treturn codePoint - 22;\n\t\t}\n\t\tif (codePoint - 65 < 26) {\n\t\t\treturn codePoint - 65;\n\t\t}\n\t\tif (codePoint - 97 < 26) {\n\t\t\treturn codePoint - 97;\n\t\t}\n\t\treturn base;\n\t}\n\n\t/**\n\t * Converts a digit/integer into a basic code point.\n\t * @see `basicToDigit()`\n\t * @private\n\t * @param {Number} digit The numeric value of a basic code point.\n\t * @returns {Number} The basic code point whose value (when used for\n\t * representing integers) is `digit`, which needs to be in the range\n\t * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n\t * used; else, the lowercase form is used. The behavior is undefined\n\t * if `flag` is non-zero and `digit` has no uppercase form.\n\t */\n\tfunction digitToBasic(digit, flag) {\n\t\t// 0..25 map to ASCII a..z or A..Z\n\t\t// 26..35 map to ASCII 0..9\n\t\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n\t}\n\n\t/**\n\t * Bias adaptation function as per section 3.4 of RFC 3492.\n\t * https://tools.ietf.org/html/rfc3492#section-3.4\n\t * @private\n\t */\n\tfunction adapt(delta, numPoints, firstTime) {\n\t\tvar k = 0;\n\t\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\t\tdelta += floor(delta / numPoints);\n\t\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\t\tdelta = floor(delta / baseMinusTMin);\n\t\t}\n\t\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n\t}\n\n\t/**\n\t * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n\t * symbols.\n\t * @memberOf punycode\n\t * @param {String} input The Punycode string of ASCII-only symbols.\n\t * @returns {String} The resulting string of Unicode symbols.\n\t */\n\tfunction decode(input) {\n\t\t// Don't use UCS-2\n\t\tvar output = [],\n\t\t inputLength = input.length,\n\t\t out,\n\t\t i = 0,\n\t\t n = initialN,\n\t\t bias = initialBias,\n\t\t basic,\n\t\t j,\n\t\t index,\n\t\t oldi,\n\t\t w,\n\t\t k,\n\t\t digit,\n\t\t t,\n\t\t /** Cached calculation results */\n\t\t baseMinusT;\n\n\t\t// Handle the basic code points: let `basic` be the number of input code\n\t\t// points before the last delimiter, or `0` if there is none, then copy\n\t\t// the first basic code points to the output.\n\n\t\tbasic = input.lastIndexOf(delimiter);\n\t\tif (basic < 0) {\n\t\t\tbasic = 0;\n\t\t}\n\n\t\tfor (j = 0; j < basic; ++j) {\n\t\t\t// if it's not a basic code point\n\t\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\t\terror('not-basic');\n\t\t\t}\n\t\t\toutput.push(input.charCodeAt(j));\n\t\t}\n\n\t\t// Main decoding loop: start just after the last delimiter if any basic code\n\t\t// points were copied; start at the beginning otherwise.\n\n\t\tfor (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t\t// `index` is the index of the next character to be consumed.\n\t\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t\t// which gets added to `i`. The overflow checking is easier\n\t\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t\t// value at the end to obtain `delta`.\n\t\t\tfor (oldi = i, w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\t\tif (index >= inputLength) {\n\t\t\t\t\terror('invalid-input');\n\t\t\t\t}\n\n\t\t\t\tdigit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\ti += digit * w;\n\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\t\tif (digit < t) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tbaseMinusT = base - t;\n\t\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tw *= baseMinusT;\n\n\t\t\t}\n\n\t\t\tout = output.length + 1;\n\t\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t\t// incrementing `n` each time, so we'll fix that now:\n\t\t\tif (floor(i / out) > maxInt - n) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tn += floor(i / out);\n\t\t\ti %= out;\n\n\t\t\t// Insert `n` at position `i` of the output\n\t\t\toutput.splice(i++, 0, n);\n\n\t\t}\n\n\t\treturn ucs2encode(output);\n\t}\n\n\t/**\n\t * Converts a string of Unicode symbols (e.g. a domain name label) to a\n\t * Punycode string of ASCII-only symbols.\n\t * @memberOf punycode\n\t * @param {String} input The string of Unicode symbols.\n\t * @returns {String} The resulting Punycode string of ASCII-only symbols.\n\t */\n\tfunction encode(input) {\n\t\tvar n,\n\t\t delta,\n\t\t handledCPCount,\n\t\t basicLength,\n\t\t bias,\n\t\t j,\n\t\t m,\n\t\t q,\n\t\t k,\n\t\t t,\n\t\t currentValue,\n\t\t output = [],\n\t\t /** `inputLength` will hold the number of code points in `input`. */\n\t\t inputLength,\n\t\t /** Cached calculation results */\n\t\t handledCPCountPlusOne,\n\t\t baseMinusT,\n\t\t qMinusT;\n\n\t\t// Convert the input in UCS-2 to Unicode\n\t\tinput = ucs2decode(input);\n\n\t\t// Cache the length\n\t\tinputLength = input.length;\n\n\t\t// Initialize the state\n\t\tn = initialN;\n\t\tdelta = 0;\n\t\tbias = initialBias;\n\n\t\t// Handle the basic code points\n\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\tcurrentValue = input[j];\n\t\t\tif (currentValue < 0x80) {\n\t\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t\t}\n\t\t}\n\n\t\thandledCPCount = basicLength = output.length;\n\n\t\t// `handledCPCount` is the number of code points that have been handled;\n\t\t// `basicLength` is the number of basic code points.\n\n\t\t// Finish the basic string - if it is not empty - with a delimiter\n\t\tif (basicLength) {\n\t\t\toutput.push(delimiter);\n\t\t}\n\n\t\t// Main encoding loop:\n\t\twhile (handledCPCount < inputLength) {\n\n\t\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t\t// larger one:\n\t\t\tfor (m = maxInt, j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\t\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\t\tm = currentValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,\n\t\t\t// but guard against overflow\n\t\t\thandledCPCountPlusOne = handledCPCount + 1;\n\t\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\t\tn = m;\n\n\t\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\n\t\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tif (currentValue == n) {\n\t\t\t\t\t// Represent delta as a generalized variable-length integer\n\t\t\t\t\tfor (q = delta, k = base; /* no condition */; k += base) {\n\t\t\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tqMinusT = q - t;\n\t\t\t\t\t\tbaseMinusT = base - t;\n\t\t\t\t\t\toutput.push(\n\t\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t\t);\n\t\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t\t}\n\n\t\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\t\tdelta = 0;\n\t\t\t\t\t++handledCPCount;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t++delta;\n\t\t\t++n;\n\n\t\t}\n\t\treturn output.join('');\n\t}\n\n\t/**\n\t * Converts a Punycode string representing a domain name or an email address\n\t * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n\t * it doesn't matter if you call it on a string that has already been\n\t * converted to Unicode.\n\t * @memberOf punycode\n\t * @param {String} input The Punycoded domain name or email address to\n\t * convert to Unicode.\n\t * @returns {String} The Unicode representation of the given Punycode\n\t * string.\n\t */\n\tfunction toUnicode(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexPunycode.test(string)\n\t\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/**\n\t * Converts a Unicode string representing a domain name or an email address to\n\t * Punycode. Only the non-ASCII parts of the domain name will be converted,\n\t * i.e. it doesn't matter if you call it with a domain that's already in\n\t * ASCII.\n\t * @memberOf punycode\n\t * @param {String} input The domain name or email address to convert, as a\n\t * Unicode string.\n\t * @returns {String} The Punycode representation of the given domain name or\n\t * email address.\n\t */\n\tfunction toASCII(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexNonASCII.test(string)\n\t\t\t\t? 'xn--' + encode(string)\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/** Define the public API */\n\tpunycode = {\n\t\t/**\n\t\t * A string representing the current Punycode.js version number.\n\t\t * @memberOf punycode\n\t\t * @type String\n\t\t */\n\t\t'version': '1.4.1',\n\t\t/**\n\t\t * An object of methods to convert from JavaScript's internal character\n\t\t * representation (UCS-2) to Unicode code points, and back.\n\t\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t\t * @memberOf punycode\n\t\t * @type Object\n\t\t */\n\t\t'ucs2': {\n\t\t\t'decode': ucs2decode,\n\t\t\t'encode': ucs2encode\n\t\t},\n\t\t'decode': decode,\n\t\t'encode': encode,\n\t\t'toASCII': toASCII,\n\t\t'toUnicode': toUnicode\n\t};\n\n\t/** Expose `punycode` */\n\t// Some AMD build optimizers, like r.js, check for specific condition patterns\n\t// like the following:\n\tif (\n\t\ttrue\n\t) {\n\t\t!(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n\t\t\treturn punycode;\n\t\t}).call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t} else {}\n\n}(this));\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module), __webpack_require__(/*! ./../../../webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvbm9kZS1saWJzLWJyb3dzZXIvbm9kZV9tb2R1bGVzL3B1bnljb2RlL3B1bnljb2RlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvbm9kZS1saWJzLWJyb3dzZXIvbm9kZV9tb2R1bGVzL3B1bnljb2RlL3B1bnljb2RlLmpzPzE5ODUiXSwic291cmNlc0NvbnRlbnQiOlsiLyohIGh0dHBzOi8vbXRocy5iZS9wdW55Y29kZSB2MS40LjEgYnkgQG1hdGhpYXMgKi9cbjsoZnVuY3Rpb24ocm9vdCkge1xuXG5cdC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZXMgKi9cblx0dmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJlxuXHRcdCFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cdHZhciBmcmVlTW9kdWxlID0gdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiZcblx0XHQhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblx0dmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbDtcblx0aWYgKFxuXHRcdGZyZWVHbG9iYWwuZ2xvYmFsID09PSBmcmVlR2xvYmFsIHx8XG5cdFx0ZnJlZUdsb2JhbC53aW5kb3cgPT09IGZyZWVHbG9iYWwgfHxcblx0XHRmcmVlR2xvYmFsLnNlbGYgPT09IGZyZWVHbG9iYWxcblx0KSB7XG5cdFx0cm9vdCA9IGZyZWVHbG9iYWw7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGBwdW55Y29kZWAgb2JqZWN0LlxuXHQgKiBAbmFtZSBwdW55Y29kZVxuXHQgKiBAdHlwZSBPYmplY3Rcblx0ICovXG5cdHZhciBwdW55Y29kZSxcblxuXHQvKiogSGlnaGVzdCBwb3NpdGl2ZSBzaWduZWQgMzItYml0IGZsb2F0IHZhbHVlICovXG5cdG1heEludCA9IDIxNDc0ODM2NDcsIC8vIGFrYS4gMHg3RkZGRkZGRiBvciAyXjMxLTFcblxuXHQvKiogQm9vdHN0cmluZyBwYXJhbWV0ZXJzICovXG5cdGJhc2UgPSAzNixcblx0dE1pbiA9IDEsXG5cdHRNYXggPSAyNixcblx0c2tldyA9IDM4LFxuXHRkYW1wID0gNzAwLFxuXHRpbml0aWFsQmlhcyA9IDcyLFxuXHRpbml0aWFsTiA9IDEyOCwgLy8gMHg4MFxuXHRkZWxpbWl0ZXIgPSAnLScsIC8vICdcXHgyRCdcblxuXHQvKiogUmVndWxhciBleHByZXNzaW9ucyAqL1xuXHRyZWdleFB1bnljb2RlID0gL154bi0tLyxcblx0cmVnZXhOb25BU0NJSSA9IC9bXlxceDIwLVxceDdFXS8sIC8vIHVucHJpbnRhYmxlIEFTQ0lJIGNoYXJzICsgbm9uLUFTQ0lJIGNoYXJzXG5cdHJlZ2V4U2VwYXJhdG9ycyA9IC9bXFx4MkVcXHUzMDAyXFx1RkYwRVxcdUZGNjFdL2csIC8vIFJGQyAzNDkwIHNlcGFyYXRvcnNcblxuXHQvKiogRXJyb3IgbWVzc2FnZXMgKi9cblx0ZXJyb3JzID0ge1xuXHRcdCdvdmVyZmxvdyc6ICdPdmVyZmxvdzogaW5wdXQgbmVlZHMgd2lkZXIgaW50ZWdlcnMgdG8gcHJvY2VzcycsXG5cdFx0J25vdC1iYXNpYyc6ICdJbGxlZ2FsIGlucHV0ID49IDB4ODAgKG5vdCBhIGJhc2ljIGNvZGUgcG9pbnQpJyxcblx0XHQnaW52YWxpZC1pbnB1dCc6ICdJbnZhbGlkIGlucHV0J1xuXHR9LFxuXG5cdC8qKiBDb252ZW5pZW5jZSBzaG9ydGN1dHMgKi9cblx0YmFzZU1pbnVzVE1pbiA9IGJhc2UgLSB0TWluLFxuXHRmbG9vciA9IE1hdGguZmxvb3IsXG5cdHN0cmluZ0Zyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUsXG5cblx0LyoqIFRlbXBvcmFyeSB2YXJpYWJsZSAqL1xuXHRrZXk7XG5cblx0LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cblx0LyoqXG5cdCAqIEEgZ2VuZXJpYyBlcnJvciB1dGlsaXR5IGZ1bmN0aW9uLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgZXJyb3IgdHlwZS5cblx0ICogQHJldHVybnMge0Vycm9yfSBUaHJvd3MgYSBgUmFuZ2VFcnJvcmAgd2l0aCB0aGUgYXBwbGljYWJsZSBlcnJvciBtZXNzYWdlLlxuXHQgKi9cblx0ZnVuY3Rpb24gZXJyb3IodHlwZSkge1xuXHRcdHRocm93IG5ldyBSYW5nZUVycm9yKGVycm9yc1t0eXBlXSk7XG5cdH1cblxuXHQvKipcblx0ICogQSBnZW5lcmljIGBBcnJheSNtYXBgIHV0aWxpdHkgZnVuY3Rpb24uXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIGZvciBldmVyeSBhcnJheVxuXHQgKiBpdGVtLlxuXHQgKiBAcmV0dXJucyB7QXJyYXl9IEEgbmV3IGFycmF5IG9mIHZhbHVlcyByZXR1cm5lZCBieSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uXG5cdCAqL1xuXHRmdW5jdGlvbiBtYXAoYXJyYXksIGZuKSB7XG5cdFx0dmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblx0XHR2YXIgcmVzdWx0ID0gW107XG5cdFx0d2hpbGUgKGxlbmd0aC0tKSB7XG5cdFx0XHRyZXN1bHRbbGVuZ3RoXSA9IGZuKGFycmF5W2xlbmd0aF0pO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEEgc2ltcGxlIGBBcnJheSNtYXBgLWxpa2Ugd3JhcHBlciB0byB3b3JrIHdpdGggZG9tYWluIG5hbWUgc3RyaW5ncyBvciBlbWFpbFxuXHQgKiBhZGRyZXNzZXMuXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBkb21haW4gVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIGZvciBldmVyeVxuXHQgKiBjaGFyYWN0ZXIuXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gQSBuZXcgc3RyaW5nIG9mIGNoYXJhY3RlcnMgcmV0dXJuZWQgYnkgdGhlIGNhbGxiYWNrXG5cdCAqIGZ1bmN0aW9uLlxuXHQgKi9cblx0ZnVuY3Rpb24gbWFwRG9tYWluKHN0cmluZywgZm4pIHtcblx0XHR2YXIgcGFydHMgPSBzdHJpbmcuc3BsaXQoJ0AnKTtcblx0XHR2YXIgcmVzdWx0ID0gJyc7XG5cdFx0aWYgKHBhcnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdC8vIEluIGVtYWlsIGFkZHJlc3Nlcywgb25seSB0aGUgZG9tYWluIG5hbWUgc2hvdWxkIGJlIHB1bnljb2RlZC4gTGVhdmVcblx0XHRcdC8vIHRoZSBsb2NhbCBwYXJ0IChpLmUuIGV2ZXJ5dGhpbmcgdXAgdG8gYEBgKSBpbnRhY3QuXG5cdFx0XHRyZXN1bHQgPSBwYXJ0c1swXSArICdAJztcblx0XHRcdHN0cmluZyA9IHBhcnRzWzFdO1xuXHRcdH1cblx0XHQvLyBBdm9pZCBgc3BsaXQocmVnZXgpYCBmb3IgSUU4IGNvbXBhdGliaWxpdHkuIFNlZSAjMTcuXG5cdFx0c3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocmVnZXhTZXBhcmF0b3JzLCAnXFx4MkUnKTtcblx0XHR2YXIgbGFiZWxzID0gc3RyaW5nLnNwbGl0KCcuJyk7XG5cdFx0dmFyIGVuY29kZWQgPSBtYXAobGFiZWxzLCBmbikuam9pbignLicpO1xuXHRcdHJldHVybiByZXN1bHQgKyBlbmNvZGVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbnVtZXJpYyBjb2RlIHBvaW50cyBvZiBlYWNoIFVuaWNvZGVcblx0ICogY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuIFdoaWxlIEphdmFTY3JpcHQgdXNlcyBVQ1MtMiBpbnRlcm5hbGx5LFxuXHQgKiB0aGlzIGZ1bmN0aW9uIHdpbGwgY29udmVydCBhIHBhaXIgb2Ygc3Vycm9nYXRlIGhhbHZlcyAoZWFjaCBvZiB3aGljaFxuXHQgKiBVQ1MtMiBleHBvc2VzIGFzIHNlcGFyYXRlIGNoYXJhY3RlcnMpIGludG8gYSBzaW5nbGUgY29kZSBwb2ludCxcblx0ICogbWF0Y2hpbmcgVVRGLTE2LlxuXHQgKiBAc2VlIGBwdW55Y29kZS51Y3MyLmVuY29kZWBcblx0ICogQHNlZSA8aHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmc+XG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZS51Y3MyXG5cdCAqIEBuYW1lIGRlY29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nIFRoZSBVbmljb2RlIGlucHV0IHN0cmluZyAoVUNTLTIpLlxuXHQgKiBAcmV0dXJucyB7QXJyYXl9IFRoZSBuZXcgYXJyYXkgb2YgY29kZSBwb2ludHMuXG5cdCAqL1xuXHRmdW5jdGlvbiB1Y3MyZGVjb2RlKHN0cmluZykge1xuXHRcdHZhciBvdXRwdXQgPSBbXSxcblx0XHQgICAgY291bnRlciA9IDAsXG5cdFx0ICAgIGxlbmd0aCA9IHN0cmluZy5sZW5ndGgsXG5cdFx0ICAgIHZhbHVlLFxuXHRcdCAgICBleHRyYTtcblx0XHR3aGlsZSAoY291bnRlciA8IGxlbmd0aCkge1xuXHRcdFx0dmFsdWUgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspO1xuXHRcdFx0aWYgKHZhbHVlID49IDB4RDgwMCAmJiB2YWx1ZSA8PSAweERCRkYgJiYgY291bnRlciA8IGxlbmd0aCkge1xuXHRcdFx0XHQvLyBoaWdoIHN1cnJvZ2F0ZSwgYW5kIHRoZXJlIGlzIGEgbmV4dCBjaGFyYWN0ZXJcblx0XHRcdFx0ZXh0cmEgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspO1xuXHRcdFx0XHRpZiAoKGV4dHJhICYgMHhGQzAwKSA9PSAweERDMDApIHsgLy8gbG93IHN1cnJvZ2F0ZVxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKCgodmFsdWUgJiAweDNGRikgPDwgMTApICsgKGV4dHJhICYgMHgzRkYpICsgMHgxMDAwMCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gdW5tYXRjaGVkIHN1cnJvZ2F0ZTsgb25seSBhcHBlbmQgdGhpcyBjb2RlIHVuaXQsIGluIGNhc2UgdGhlIG5leHRcblx0XHRcdFx0XHQvLyBjb2RlIHVuaXQgaXMgdGhlIGhpZ2ggc3Vycm9nYXRlIG9mIGEgc3Vycm9nYXRlIHBhaXJcblx0XHRcdFx0XHRvdXRwdXQucHVzaCh2YWx1ZSk7XG5cdFx0XHRcdFx0Y291bnRlci0tO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvdXRwdXQucHVzaCh2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvdXRwdXQ7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIHN0cmluZyBiYXNlZCBvbiBhbiBhcnJheSBvZiBudW1lcmljIGNvZGUgcG9pbnRzLlxuXHQgKiBAc2VlIGBwdW55Y29kZS51Y3MyLmRlY29kZWBcblx0ICogQG1lbWJlck9mIHB1bnljb2RlLnVjczJcblx0ICogQG5hbWUgZW5jb2RlXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGNvZGVQb2ludHMgVGhlIGFycmF5IG9mIG51bWVyaWMgY29kZSBwb2ludHMuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBuZXcgVW5pY29kZSBzdHJpbmcgKFVDUy0yKS5cblx0ICovXG5cdGZ1bmN0aW9uIHVjczJlbmNvZGUoYXJyYXkpIHtcblx0XHRyZXR1cm4gbWFwKGFycmF5LCBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0dmFyIG91dHB1dCA9ICcnO1xuXHRcdFx0aWYgKHZhbHVlID4gMHhGRkZGKSB7XG5cdFx0XHRcdHZhbHVlIC09IDB4MTAwMDA7XG5cdFx0XHRcdG91dHB1dCArPSBzdHJpbmdGcm9tQ2hhckNvZGUodmFsdWUgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApO1xuXHRcdFx0XHR2YWx1ZSA9IDB4REMwMCB8IHZhbHVlICYgMHgzRkY7XG5cdFx0XHR9XG5cdFx0XHRvdXRwdXQgKz0gc3RyaW5nRnJvbUNoYXJDb2RlKHZhbHVlKTtcblx0XHRcdHJldHVybiBvdXRwdXQ7XG5cdFx0fSkuam9pbignJyk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBiYXNpYyBjb2RlIHBvaW50IGludG8gYSBkaWdpdC9pbnRlZ2VyLlxuXHQgKiBAc2VlIGBkaWdpdFRvQmFzaWMoKWBcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGNvZGVQb2ludCBUaGUgYmFzaWMgbnVtZXJpYyBjb2RlIHBvaW50IHZhbHVlLlxuXHQgKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgbnVtZXJpYyB2YWx1ZSBvZiBhIGJhc2ljIGNvZGUgcG9pbnQgKGZvciB1c2UgaW5cblx0ICogcmVwcmVzZW50aW5nIGludGVnZXJzKSBpbiB0aGUgcmFuZ2UgYDBgIHRvIGBiYXNlIC0gMWAsIG9yIGBiYXNlYCBpZlxuXHQgKiB0aGUgY29kZSBwb2ludCBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWx1ZS5cblx0ICovXG5cdGZ1bmN0aW9uIGJhc2ljVG9EaWdpdChjb2RlUG9pbnQpIHtcblx0XHRpZiAoY29kZVBvaW50IC0gNDggPCAxMCkge1xuXHRcdFx0cmV0dXJuIGNvZGVQb2ludCAtIDIyO1xuXHRcdH1cblx0XHRpZiAoY29kZVBvaW50IC0gNjUgPCAyNikge1xuXHRcdFx0cmV0dXJuIGNvZGVQb2ludCAtIDY1O1xuXHRcdH1cblx0XHRpZiAoY29kZVBvaW50IC0gOTcgPCAyNikge1xuXHRcdFx0cmV0dXJuIGNvZGVQb2ludCAtIDk3O1xuXHRcdH1cblx0XHRyZXR1cm4gYmFzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIGRpZ2l0L2ludGVnZXIgaW50byBhIGJhc2ljIGNvZGUgcG9pbnQuXG5cdCAqIEBzZWUgYGJhc2ljVG9EaWdpdCgpYFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge051bWJlcn0gZGlnaXQgVGhlIG51bWVyaWMgdmFsdWUgb2YgYSBiYXNpYyBjb2RlIHBvaW50LlxuXHQgKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgYmFzaWMgY29kZSBwb2ludCB3aG9zZSB2YWx1ZSAod2hlbiB1c2VkIGZvclxuXHQgKiByZXByZXNlbnRpbmcgaW50ZWdlcnMpIGlzIGBkaWdpdGAsIHdoaWNoIG5lZWRzIHRvIGJlIGluIHRoZSByYW5nZVxuXHQgKiBgMGAgdG8gYGJhc2UgLSAxYC4gSWYgYGZsYWdgIGlzIG5vbi16ZXJvLCB0aGUgdXBwZXJjYXNlIGZvcm0gaXNcblx0ICogdXNlZDsgZWxzZSwgdGhlIGxvd2VyY2FzZSBmb3JtIGlzIHVzZWQuIFRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWRcblx0ICogaWYgYGZsYWdgIGlzIG5vbi16ZXJvIGFuZCBgZGlnaXRgIGhhcyBubyB1cHBlcmNhc2UgZm9ybS5cblx0ICovXG5cdGZ1bmN0aW9uIGRpZ2l0VG9CYXNpYyhkaWdpdCwgZmxhZykge1xuXHRcdC8vICAwLi4yNSBtYXAgdG8gQVNDSUkgYS4ueiBvciBBLi5aXG5cdFx0Ly8gMjYuLjM1IG1hcCB0byBBU0NJSSAwLi45XG5cdFx0cmV0dXJuIGRpZ2l0ICsgMjIgKyA3NSAqIChkaWdpdCA8IDI2KSAtICgoZmxhZyAhPSAwKSA8PCA1KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBCaWFzIGFkYXB0YXRpb24gZnVuY3Rpb24gYXMgcGVyIHNlY3Rpb24gMy40IG9mIFJGQyAzNDkyLlxuXHQgKiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzQ5MiNzZWN0aW9uLTMuNFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0ZnVuY3Rpb24gYWRhcHQoZGVsdGEsIG51bVBvaW50cywgZmlyc3RUaW1lKSB7XG5cdFx0dmFyIGsgPSAwO1xuXHRcdGRlbHRhID0gZmlyc3RUaW1lID8gZmxvb3IoZGVsdGEgLyBkYW1wKSA6IGRlbHRhID4+IDE7XG5cdFx0ZGVsdGEgKz0gZmxvb3IoZGVsdGEgLyBudW1Qb2ludHMpO1xuXHRcdGZvciAoLyogbm8gaW5pdGlhbGl6YXRpb24gKi87IGRlbHRhID4gYmFzZU1pbnVzVE1pbiAqIHRNYXggPj4gMTsgayArPSBiYXNlKSB7XG5cdFx0XHRkZWx0YSA9IGZsb29yKGRlbHRhIC8gYmFzZU1pbnVzVE1pbik7XG5cdFx0fVxuXHRcdHJldHVybiBmbG9vcihrICsgKGJhc2VNaW51c1RNaW4gKyAxKSAqIGRlbHRhIC8gKGRlbHRhICsgc2tldykpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scyB0byBhIHN0cmluZyBvZiBVbmljb2RlXG5cdCAqIHN5bWJvbHMuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSByZXN1bHRpbmcgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scy5cblx0ICovXG5cdGZ1bmN0aW9uIGRlY29kZShpbnB1dCkge1xuXHRcdC8vIERvbid0IHVzZSBVQ1MtMlxuXHRcdHZhciBvdXRwdXQgPSBbXSxcblx0XHQgICAgaW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGgsXG5cdFx0ICAgIG91dCxcblx0XHQgICAgaSA9IDAsXG5cdFx0ICAgIG4gPSBpbml0aWFsTixcblx0XHQgICAgYmlhcyA9IGluaXRpYWxCaWFzLFxuXHRcdCAgICBiYXNpYyxcblx0XHQgICAgaixcblx0XHQgICAgaW5kZXgsXG5cdFx0ICAgIG9sZGksXG5cdFx0ICAgIHcsXG5cdFx0ICAgIGssXG5cdFx0ICAgIGRpZ2l0LFxuXHRcdCAgICB0LFxuXHRcdCAgICAvKiogQ2FjaGVkIGNhbGN1bGF0aW9uIHJlc3VsdHMgKi9cblx0XHQgICAgYmFzZU1pbnVzVDtcblxuXHRcdC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHM6IGxldCBgYmFzaWNgIGJlIHRoZSBudW1iZXIgb2YgaW5wdXQgY29kZVxuXHRcdC8vIHBvaW50cyBiZWZvcmUgdGhlIGxhc3QgZGVsaW1pdGVyLCBvciBgMGAgaWYgdGhlcmUgaXMgbm9uZSwgdGhlbiBjb3B5XG5cdFx0Ly8gdGhlIGZpcnN0IGJhc2ljIGNvZGUgcG9pbnRzIHRvIHRoZSBvdXRwdXQuXG5cblx0XHRiYXNpYyA9IGlucHV0Lmxhc3RJbmRleE9mKGRlbGltaXRlcik7XG5cdFx0aWYgKGJhc2ljIDwgMCkge1xuXHRcdFx0YmFzaWMgPSAwO1xuXHRcdH1cblxuXHRcdGZvciAoaiA9IDA7IGogPCBiYXNpYzsgKytqKSB7XG5cdFx0XHQvLyBpZiBpdCdzIG5vdCBhIGJhc2ljIGNvZGUgcG9pbnRcblx0XHRcdGlmIChpbnB1dC5jaGFyQ29kZUF0KGopID49IDB4ODApIHtcblx0XHRcdFx0ZXJyb3IoJ25vdC1iYXNpYycpO1xuXHRcdFx0fVxuXHRcdFx0b3V0cHV0LnB1c2goaW5wdXQuY2hhckNvZGVBdChqKSk7XG5cdFx0fVxuXG5cdFx0Ly8gTWFpbiBkZWNvZGluZyBsb29wOiBzdGFydCBqdXN0IGFmdGVyIHRoZSBsYXN0IGRlbGltaXRlciBpZiBhbnkgYmFzaWMgY29kZVxuXHRcdC8vIHBvaW50cyB3ZXJlIGNvcGllZDsgc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvdGhlcndpc2UuXG5cblx0XHRmb3IgKGluZGV4ID0gYmFzaWMgPiAwID8gYmFzaWMgKyAxIDogMDsgaW5kZXggPCBpbnB1dExlbmd0aDsgLyogbm8gZmluYWwgZXhwcmVzc2lvbiAqLykge1xuXG5cdFx0XHQvLyBgaW5kZXhgIGlzIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBjaGFyYWN0ZXIgdG8gYmUgY29uc3VtZWQuXG5cdFx0XHQvLyBEZWNvZGUgYSBnZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlciBpbnRvIGBkZWx0YWAsXG5cdFx0XHQvLyB3aGljaCBnZXRzIGFkZGVkIHRvIGBpYC4gVGhlIG92ZXJmbG93IGNoZWNraW5nIGlzIGVhc2llclxuXHRcdFx0Ly8gaWYgd2UgaW5jcmVhc2UgYGlgIGFzIHdlIGdvLCB0aGVuIHN1YnRyYWN0IG9mZiBpdHMgc3RhcnRpbmdcblx0XHRcdC8vIHZhbHVlIGF0IHRoZSBlbmQgdG8gb2J0YWluIGBkZWx0YWAuXG5cdFx0XHRmb3IgKG9sZGkgPSBpLCB3ID0gMSwgayA9IGJhc2U7IC8qIG5vIGNvbmRpdGlvbiAqLzsgayArPSBiYXNlKSB7XG5cblx0XHRcdFx0aWYgKGluZGV4ID49IGlucHV0TGVuZ3RoKSB7XG5cdFx0XHRcdFx0ZXJyb3IoJ2ludmFsaWQtaW5wdXQnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRpZ2l0ID0gYmFzaWNUb0RpZ2l0KGlucHV0LmNoYXJDb2RlQXQoaW5kZXgrKykpO1xuXG5cdFx0XHRcdGlmIChkaWdpdCA+PSBiYXNlIHx8IGRpZ2l0ID4gZmxvb3IoKG1heEludCAtIGkpIC8gdykpIHtcblx0XHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGkgKz0gZGlnaXQgKiB3O1xuXHRcdFx0XHR0ID0gayA8PSBiaWFzID8gdE1pbiA6IChrID49IGJpYXMgKyB0TWF4ID8gdE1heCA6IGsgLSBiaWFzKTtcblxuXHRcdFx0XHRpZiAoZGlnaXQgPCB0KSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRiYXNlTWludXNUID0gYmFzZSAtIHQ7XG5cdFx0XHRcdGlmICh3ID4gZmxvb3IobWF4SW50IC8gYmFzZU1pbnVzVCkpIHtcblx0XHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHcgKj0gYmFzZU1pbnVzVDtcblxuXHRcdFx0fVxuXG5cdFx0XHRvdXQgPSBvdXRwdXQubGVuZ3RoICsgMTtcblx0XHRcdGJpYXMgPSBhZGFwdChpIC0gb2xkaSwgb3V0LCBvbGRpID09IDApO1xuXG5cdFx0XHQvLyBgaWAgd2FzIHN1cHBvc2VkIHRvIHdyYXAgYXJvdW5kIGZyb20gYG91dGAgdG8gYDBgLFxuXHRcdFx0Ly8gaW5jcmVtZW50aW5nIGBuYCBlYWNoIHRpbWUsIHNvIHdlJ2xsIGZpeCB0aGF0IG5vdzpcblx0XHRcdGlmIChmbG9vcihpIC8gb3V0KSA+IG1heEludCAtIG4pIHtcblx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHR9XG5cblx0XHRcdG4gKz0gZmxvb3IoaSAvIG91dCk7XG5cdFx0XHRpICU9IG91dDtcblxuXHRcdFx0Ly8gSW5zZXJ0IGBuYCBhdCBwb3NpdGlvbiBgaWAgb2YgdGhlIG91dHB1dFxuXHRcdFx0b3V0cHV0LnNwbGljZShpKyssIDAsIG4pO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVjczJlbmNvZGUob3V0cHV0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMgKGUuZy4gYSBkb21haW4gbmFtZSBsYWJlbCkgdG8gYVxuXHQgKiBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzLlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzLlxuXHQgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgcmVzdWx0aW5nIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG5cdCAqL1xuXHRmdW5jdGlvbiBlbmNvZGUoaW5wdXQpIHtcblx0XHR2YXIgbixcblx0XHQgICAgZGVsdGEsXG5cdFx0ICAgIGhhbmRsZWRDUENvdW50LFxuXHRcdCAgICBiYXNpY0xlbmd0aCxcblx0XHQgICAgYmlhcyxcblx0XHQgICAgaixcblx0XHQgICAgbSxcblx0XHQgICAgcSxcblx0XHQgICAgayxcblx0XHQgICAgdCxcblx0XHQgICAgY3VycmVudFZhbHVlLFxuXHRcdCAgICBvdXRwdXQgPSBbXSxcblx0XHQgICAgLyoqIGBpbnB1dExlbmd0aGAgd2lsbCBob2xkIHRoZSBudW1iZXIgb2YgY29kZSBwb2ludHMgaW4gYGlucHV0YC4gKi9cblx0XHQgICAgaW5wdXRMZW5ndGgsXG5cdFx0ICAgIC8qKiBDYWNoZWQgY2FsY3VsYXRpb24gcmVzdWx0cyAqL1xuXHRcdCAgICBoYW5kbGVkQ1BDb3VudFBsdXNPbmUsXG5cdFx0ICAgIGJhc2VNaW51c1QsXG5cdFx0ICAgIHFNaW51c1Q7XG5cblx0XHQvLyBDb252ZXJ0IHRoZSBpbnB1dCBpbiBVQ1MtMiB0byBVbmljb2RlXG5cdFx0aW5wdXQgPSB1Y3MyZGVjb2RlKGlucHV0KTtcblxuXHRcdC8vIENhY2hlIHRoZSBsZW5ndGhcblx0XHRpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aDtcblxuXHRcdC8vIEluaXRpYWxpemUgdGhlIHN0YXRlXG5cdFx0biA9IGluaXRpYWxOO1xuXHRcdGRlbHRhID0gMDtcblx0XHRiaWFzID0gaW5pdGlhbEJpYXM7XG5cblx0XHQvLyBIYW5kbGUgdGhlIGJhc2ljIGNvZGUgcG9pbnRzXG5cdFx0Zm9yIChqID0gMDsgaiA8IGlucHV0TGVuZ3RoOyArK2opIHtcblx0XHRcdGN1cnJlbnRWYWx1ZSA9IGlucHV0W2pdO1xuXHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA8IDB4ODApIHtcblx0XHRcdFx0b3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGN1cnJlbnRWYWx1ZSkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGhhbmRsZWRDUENvdW50ID0gYmFzaWNMZW5ndGggPSBvdXRwdXQubGVuZ3RoO1xuXG5cdFx0Ly8gYGhhbmRsZWRDUENvdW50YCBpcyB0aGUgbnVtYmVyIG9mIGNvZGUgcG9pbnRzIHRoYXQgaGF2ZSBiZWVuIGhhbmRsZWQ7XG5cdFx0Ly8gYGJhc2ljTGVuZ3RoYCBpcyB0aGUgbnVtYmVyIG9mIGJhc2ljIGNvZGUgcG9pbnRzLlxuXG5cdFx0Ly8gRmluaXNoIHRoZSBiYXNpYyBzdHJpbmcgLSBpZiBpdCBpcyBub3QgZW1wdHkgLSB3aXRoIGEgZGVsaW1pdGVyXG5cdFx0aWYgKGJhc2ljTGVuZ3RoKSB7XG5cdFx0XHRvdXRwdXQucHVzaChkZWxpbWl0ZXIpO1xuXHRcdH1cblxuXHRcdC8vIE1haW4gZW5jb2RpbmcgbG9vcDpcblx0XHR3aGlsZSAoaGFuZGxlZENQQ291bnQgPCBpbnB1dExlbmd0aCkge1xuXG5cdFx0XHQvLyBBbGwgbm9uLWJhc2ljIGNvZGUgcG9pbnRzIDwgbiBoYXZlIGJlZW4gaGFuZGxlZCBhbHJlYWR5LiBGaW5kIHRoZSBuZXh0XG5cdFx0XHQvLyBsYXJnZXIgb25lOlxuXHRcdFx0Zm9yIChtID0gbWF4SW50LCBqID0gMDsgaiA8IGlucHV0TGVuZ3RoOyArK2opIHtcblx0XHRcdFx0Y3VycmVudFZhbHVlID0gaW5wdXRbal07XG5cdFx0XHRcdGlmIChjdXJyZW50VmFsdWUgPj0gbiAmJiBjdXJyZW50VmFsdWUgPCBtKSB7XG5cdFx0XHRcdFx0bSA9IGN1cnJlbnRWYWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBJbmNyZWFzZSBgZGVsdGFgIGVub3VnaCB0byBhZHZhbmNlIHRoZSBkZWNvZGVyJ3MgPG4saT4gc3RhdGUgdG8gPG0sMD4sXG5cdFx0XHQvLyBidXQgZ3VhcmQgYWdhaW5zdCBvdmVyZmxvd1xuXHRcdFx0aGFuZGxlZENQQ291bnRQbHVzT25lID0gaGFuZGxlZENQQ291bnQgKyAxO1xuXHRcdFx0aWYgKG0gLSBuID4gZmxvb3IoKG1heEludCAtIGRlbHRhKSAvIGhhbmRsZWRDUENvdW50UGx1c09uZSkpIHtcblx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHR9XG5cblx0XHRcdGRlbHRhICs9IChtIC0gbikgKiBoYW5kbGVkQ1BDb3VudFBsdXNPbmU7XG5cdFx0XHRuID0gbTtcblxuXHRcdFx0Zm9yIChqID0gMDsgaiA8IGlucHV0TGVuZ3RoOyArK2opIHtcblx0XHRcdFx0Y3VycmVudFZhbHVlID0gaW5wdXRbal07XG5cblx0XHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA8IG4gJiYgKytkZWx0YSA+IG1heEludCkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA9PSBuKSB7XG5cdFx0XHRcdFx0Ly8gUmVwcmVzZW50IGRlbHRhIGFzIGEgZ2VuZXJhbGl6ZWQgdmFyaWFibGUtbGVuZ3RoIGludGVnZXJcblx0XHRcdFx0XHRmb3IgKHEgPSBkZWx0YSwgayA9IGJhc2U7IC8qIG5vIGNvbmRpdGlvbiAqLzsgayArPSBiYXNlKSB7XG5cdFx0XHRcdFx0XHR0ID0gayA8PSBiaWFzID8gdE1pbiA6IChrID49IGJpYXMgKyB0TWF4ID8gdE1heCA6IGsgLSBiaWFzKTtcblx0XHRcdFx0XHRcdGlmIChxIDwgdCkge1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHFNaW51c1QgPSBxIC0gdDtcblx0XHRcdFx0XHRcdGJhc2VNaW51c1QgPSBiYXNlIC0gdDtcblx0XHRcdFx0XHRcdG91dHB1dC5wdXNoKFxuXHRcdFx0XHRcdFx0XHRzdHJpbmdGcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHQgKyBxTWludXNUICUgYmFzZU1pbnVzVCwgMCkpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cSA9IGZsb29yKHFNaW51c1QgLyBiYXNlTWludXNUKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHEsIDApKSk7XG5cdFx0XHRcdFx0YmlhcyA9IGFkYXB0KGRlbHRhLCBoYW5kbGVkQ1BDb3VudFBsdXNPbmUsIGhhbmRsZWRDUENvdW50ID09IGJhc2ljTGVuZ3RoKTtcblx0XHRcdFx0XHRkZWx0YSA9IDA7XG5cdFx0XHRcdFx0KytoYW5kbGVkQ1BDb3VudDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQrK2RlbHRhO1xuXHRcdFx0KytuO1xuXG5cdFx0fVxuXHRcdHJldHVybiBvdXRwdXQuam9pbignJyk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBQdW55Y29kZSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgZG9tYWluIG5hbWUgb3IgYW4gZW1haWwgYWRkcmVzc1xuXHQgKiB0byBVbmljb2RlLiBPbmx5IHRoZSBQdW55Y29kZWQgcGFydHMgb2YgdGhlIGlucHV0IHdpbGwgYmUgY29udmVydGVkLCBpLmUuXG5cdCAqIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHlvdSBjYWxsIGl0IG9uIGEgc3RyaW5nIHRoYXQgaGFzIGFscmVhZHkgYmVlblxuXHQgKiBjb252ZXJ0ZWQgdG8gVW5pY29kZS5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgUHVueWNvZGVkIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MgdG9cblx0ICogY29udmVydCB0byBVbmljb2RlLlxuXHQgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgVW5pY29kZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gUHVueWNvZGVcblx0ICogc3RyaW5nLlxuXHQgKi9cblx0ZnVuY3Rpb24gdG9Vbmljb2RlKGlucHV0KSB7XG5cdFx0cmV0dXJuIG1hcERvbWFpbihpbnB1dCwgZnVuY3Rpb24oc3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4gcmVnZXhQdW55Y29kZS50ZXN0KHN0cmluZylcblx0XHRcdFx0PyBkZWNvZGUoc3RyaW5nLnNsaWNlKDQpLnRvTG93ZXJDYXNlKCkpXG5cdFx0XHRcdDogc3RyaW5nO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgVW5pY29kZSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgZG9tYWluIG5hbWUgb3IgYW4gZW1haWwgYWRkcmVzcyB0b1xuXHQgKiBQdW55Y29kZS4gT25seSB0aGUgbm9uLUFTQ0lJIHBhcnRzIG9mIHRoZSBkb21haW4gbmFtZSB3aWxsIGJlIGNvbnZlcnRlZCxcblx0ICogaS5lLiBpdCBkb2Vzbid0IG1hdHRlciBpZiB5b3UgY2FsbCBpdCB3aXRoIGEgZG9tYWluIHRoYXQncyBhbHJlYWR5IGluXG5cdCAqIEFTQ0lJLlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBkb21haW4gbmFtZSBvciBlbWFpbCBhZGRyZXNzIHRvIGNvbnZlcnQsIGFzIGFcblx0ICogVW5pY29kZSBzdHJpbmcuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBQdW55Y29kZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gZG9tYWluIG5hbWUgb3Jcblx0ICogZW1haWwgYWRkcmVzcy5cblx0ICovXG5cdGZ1bmN0aW9uIHRvQVNDSUkoaW5wdXQpIHtcblx0XHRyZXR1cm4gbWFwRG9tYWluKGlucHV0LCBmdW5jdGlvbihzdHJpbmcpIHtcblx0XHRcdHJldHVybiByZWdleE5vbkFTQ0lJLnRlc3Qoc3RyaW5nKVxuXHRcdFx0XHQ/ICd4bi0tJyArIGVuY29kZShzdHJpbmcpXG5cdFx0XHRcdDogc3RyaW5nO1xuXHRcdH0pO1xuXHR9XG5cblx0LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cblx0LyoqIERlZmluZSB0aGUgcHVibGljIEFQSSAqL1xuXHRwdW55Y29kZSA9IHtcblx0XHQvKipcblx0XHQgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgUHVueWNvZGUuanMgdmVyc2lvbiBudW1iZXIuXG5cdFx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdFx0ICogQHR5cGUgU3RyaW5nXG5cdFx0ICovXG5cdFx0J3ZlcnNpb24nOiAnMS40LjEnLFxuXHRcdC8qKlxuXHRcdCAqIEFuIG9iamVjdCBvZiBtZXRob2RzIHRvIGNvbnZlcnQgZnJvbSBKYXZhU2NyaXB0J3MgaW50ZXJuYWwgY2hhcmFjdGVyXG5cdFx0ICogcmVwcmVzZW50YXRpb24gKFVDUy0yKSB0byBVbmljb2RlIGNvZGUgcG9pbnRzLCBhbmQgYmFjay5cblx0XHQgKiBAc2VlIDxodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZz5cblx0XHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0XHQgKiBAdHlwZSBPYmplY3Rcblx0XHQgKi9cblx0XHQndWNzMic6IHtcblx0XHRcdCdkZWNvZGUnOiB1Y3MyZGVjb2RlLFxuXHRcdFx0J2VuY29kZSc6IHVjczJlbmNvZGVcblx0XHR9LFxuXHRcdCdkZWNvZGUnOiBkZWNvZGUsXG5cdFx0J2VuY29kZSc6IGVuY29kZSxcblx0XHQndG9BU0NJSSc6IHRvQVNDSUksXG5cdFx0J3RvVW5pY29kZSc6IHRvVW5pY29kZVxuXHR9O1xuXG5cdC8qKiBFeHBvc2UgYHB1bnljb2RlYCAqL1xuXHQvLyBTb21lIEFNRCBidWlsZCBvcHRpbWl6ZXJzLCBsaWtlIHIuanMsIGNoZWNrIGZvciBzcGVjaWZpYyBjb25kaXRpb24gcGF0dGVybnNcblx0Ly8gbGlrZSB0aGUgZm9sbG93aW5nOlxuXHRpZiAoXG5cdFx0dHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmXG5cdFx0dHlwZW9mIGRlZmluZS5hbWQgPT0gJ29iamVjdCcgJiZcblx0XHRkZWZpbmUuYW1kXG5cdCkge1xuXHRcdGRlZmluZSgncHVueWNvZGUnLCBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBwdW55Y29kZTtcblx0XHR9KTtcblx0fSBlbHNlIGlmIChmcmVlRXhwb3J0cyAmJiBmcmVlTW9kdWxlKSB7XG5cdFx0aWYgKG1vZHVsZS5leHBvcnRzID09IGZyZWVFeHBvcnRzKSB7XG5cdFx0XHQvLyBpbiBOb2RlLmpzLCBpby5qcywgb3IgUmluZ29KUyB2MC44LjArXG5cdFx0XHRmcmVlTW9kdWxlLmV4cG9ydHMgPSBwdW55Y29kZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gaW4gTmFyd2hhbCBvciBSaW5nb0pTIHYwLjcuMC1cblx0XHRcdGZvciAoa2V5IGluIHB1bnljb2RlKSB7XG5cdFx0XHRcdHB1bnljb2RlLmhhc093blByb3BlcnR5KGtleSkgJiYgKGZyZWVFeHBvcnRzW2tleV0gPSBwdW55Y29kZVtrZXldKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gaW4gUmhpbm8gb3IgYSB3ZWIgYnJvd3NlclxuXHRcdHJvb3QucHVueWNvZGUgPSBwdW55Y29kZTtcblx0fVxuXG59KHRoaXMpKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQSxVQWFBO0FBQ0E7QUFDQTs7QSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/node-libs-browser/node_modules/punycode/punycode.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/process-nextick-args/index.js":
+/*!****************************************************!*\
+ !*** ./node_modules/process-nextick-args/index.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("/* WEBPACK VAR INJECTION */(function(process) {\n\nif (!process.version ||\n process.version.indexOf('v0.') === 0 ||\n process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {\n module.exports = { nextTick: nextTick };\n} else {\n module.exports = process\n}\n\nfunction nextTick(fn, arg1, arg2, arg3) {\n if (typeof fn !== 'function') {\n throw new TypeError('\"callback\" argument must be a function');\n }\n var len = arguments.length;\n var args, i;\n switch (len) {\n case 0:\n case 1:\n return process.nextTick(fn);\n case 2:\n return process.nextTick(function afterTickOne() {\n fn.call(null, arg1);\n });\n case 3:\n return process.nextTick(function afterTickTwo() {\n fn.call(null, arg1, arg2);\n });\n case 4:\n return process.nextTick(function afterTickThree() {\n fn.call(null, arg1, arg2, arg3);\n });\n default:\n args = new Array(len - 1);\n i = 0;\n while (i < args.length) {\n args[i++] = arguments[i];\n }\n return process.nextTick(function afterTick() {\n fn.apply(null, args);\n });\n }\n}\n\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../process/browser.js */ \"./node_modules/process/browser.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy1uZXh0aWNrLWFyZ3MvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9wcm9jZXNzLW5leHRpY2stYXJncy9pbmRleC5qcz85NjZkIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuaWYgKCFwcm9jZXNzLnZlcnNpb24gfHxcbiAgICBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjAuJykgPT09IDAgfHxcbiAgICBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjEuJykgPT09IDAgJiYgcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YxLjguJykgIT09IDApIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSB7IG5leHRUaWNrOiBuZXh0VGljayB9O1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBwcm9jZXNzXG59XG5cbmZ1bmN0aW9uIG5leHRUaWNrKGZuLCBhcmcxLCBhcmcyLCBhcmczKSB7XG4gIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImNhbGxiYWNrXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cbiAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBhcmdzLCBpO1xuICBzd2l0Y2ggKGxlbikge1xuICBjYXNlIDA6XG4gIGNhc2UgMTpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmbik7XG4gIGNhc2UgMjpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tPbmUoKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIGFyZzEpO1xuICAgIH0pO1xuICBjYXNlIDM6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrVHdvKCkge1xuICAgICAgZm4uY2FsbChudWxsLCBhcmcxLCBhcmcyKTtcbiAgICB9KTtcbiAgY2FzZSA0OlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGlja1RocmVlKCkge1xuICAgICAgZm4uY2FsbChudWxsLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICB9KTtcbiAgZGVmYXVsdDpcbiAgICBhcmdzID0gbmV3IEFycmF5KGxlbiAtIDEpO1xuICAgIGkgPSAwO1xuICAgIHdoaWxlIChpIDwgYXJncy5sZW5ndGgpIHtcbiAgICAgIGFyZ3NbaSsrXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrKCkge1xuICAgICAgZm4uYXBwbHkobnVsbCwgYXJncyk7XG4gICAgfSk7XG4gIH1cbn1cblxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/process-nextick-args/index.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/process/browser.js":
+/*!*****************************************!*\
+ !*** ./node_modules/process/browser.js ***!
+ \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzP2YyOGMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kT25jZUxpc3RlbmVyID0gbm9vcDtcblxucHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gW10gfVxuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/process/browser.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/querystring-es3/decode.js":
+/*!************************************************!*\
+ !*** ./node_modules/querystring-es3/decode.js ***!
+ \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n\n// If obj.hasOwnProperty has been overridden, then calling\n// obj.hasOwnProperty(prop) will break.\n// See: https://github.com/joyent/node/issues/1707\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nmodule.exports = function(qs, sep, eq, options) {\n sep = sep || '&';\n eq = eq || '=';\n var obj = {};\n\n if (typeof qs !== 'string' || qs.length === 0) {\n return obj;\n }\n\n var regexp = /\\+/g;\n qs = qs.split(sep);\n\n var maxKeys = 1000;\n if (options && typeof options.maxKeys === 'number') {\n maxKeys = options.maxKeys;\n }\n\n var len = qs.length;\n // maxKeys <= 0 means that we should not limit keys count\n if (maxKeys > 0 && len > maxKeys) {\n len = maxKeys;\n }\n\n for (var i = 0; i < len; ++i) {\n var x = qs[i].replace(regexp, '%20'),\n idx = x.indexOf(eq),\n kstr, vstr, k, v;\n\n if (idx >= 0) {\n kstr = x.substr(0, idx);\n vstr = x.substr(idx + 1);\n } else {\n kstr = x;\n vstr = '';\n }\n\n k = decodeURIComponent(kstr);\n v = decodeURIComponent(vstr);\n\n if (!hasOwnProperty(obj, k)) {\n obj[k] = v;\n } else if (isArray(obj[k])) {\n obj[k].push(v);\n } else {\n obj[k] = [obj[k], v];\n }\n }\n\n return obj;\n};\n\nvar isArray = Array.isArray || function (xs) {\n return Object.prototype.toString.call(xs) === '[object Array]';\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcXVlcnlzdHJpbmctZXMzL2RlY29kZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9kZWNvZGUuanM/OTFkZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG4vLyBJZiBvYmouaGFzT3duUHJvcGVydHkgaGFzIGJlZW4gb3ZlcnJpZGRlbiwgdGhlbiBjYWxsaW5nXG4vLyBvYmouaGFzT3duUHJvcGVydHkocHJvcCkgd2lsbCBicmVhay5cbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2pveWVudC9ub2RlL2lzc3Vlcy8xNzA3XG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShvYmosIHByb3ApIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHFzLCBzZXAsIGVxLCBvcHRpb25zKSB7XG4gIHNlcCA9IHNlcCB8fCAnJic7XG4gIGVxID0gZXEgfHwgJz0nO1xuICB2YXIgb2JqID0ge307XG5cbiAgaWYgKHR5cGVvZiBxcyAhPT0gJ3N0cmluZycgfHwgcXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHZhciByZWdleHAgPSAvXFwrL2c7XG4gIHFzID0gcXMuc3BsaXQoc2VwKTtcblxuICB2YXIgbWF4S2V5cyA9IDEwMDA7XG4gIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLm1heEtleXMgPT09ICdudW1iZXInKSB7XG4gICAgbWF4S2V5cyA9IG9wdGlvbnMubWF4S2V5cztcbiAgfVxuXG4gIHZhciBsZW4gPSBxcy5sZW5ndGg7XG4gIC8vIG1heEtleXMgPD0gMCBtZWFucyB0aGF0IHdlIHNob3VsZCBub3QgbGltaXQga2V5cyBjb3VudFxuICBpZiAobWF4S2V5cyA+IDAgJiYgbGVuID4gbWF4S2V5cykge1xuICAgIGxlbiA9IG1heEtleXM7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgdmFyIHggPSBxc1tpXS5yZXBsYWNlKHJlZ2V4cCwgJyUyMCcpLFxuICAgICAgICBpZHggPSB4LmluZGV4T2YoZXEpLFxuICAgICAgICBrc3RyLCB2c3RyLCBrLCB2O1xuXG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICBrc3RyID0geC5zdWJzdHIoMCwgaWR4KTtcbiAgICAgIHZzdHIgPSB4LnN1YnN0cihpZHggKyAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAga3N0ciA9IHg7XG4gICAgICB2c3RyID0gJyc7XG4gICAgfVxuXG4gICAgayA9IGRlY29kZVVSSUNvbXBvbmVudChrc3RyKTtcbiAgICB2ID0gZGVjb2RlVVJJQ29tcG9uZW50KHZzdHIpO1xuXG4gICAgaWYgKCFoYXNPd25Qcm9wZXJ0eShvYmosIGspKSB7XG4gICAgICBvYmpba10gPSB2O1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShvYmpba10pKSB7XG4gICAgICBvYmpba10ucHVzaCh2KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2JqW2tdID0gW29ialtrXSwgdl07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoeHMpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4cykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/querystring-es3/decode.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/querystring-es3/encode.js":
+/*!************************************************!*\
+ !*** ./node_modules/querystring-es3/encode.js ***!
+ \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n\nvar stringifyPrimitive = function(v) {\n switch (typeof v) {\n case 'string':\n return v;\n\n case 'boolean':\n return v ? 'true' : 'false';\n\n case 'number':\n return isFinite(v) ? v : '';\n\n default:\n return '';\n }\n};\n\nmodule.exports = function(obj, sep, eq, name) {\n sep = sep || '&';\n eq = eq || '=';\n if (obj === null) {\n obj = undefined;\n }\n\n if (typeof obj === 'object') {\n return map(objectKeys(obj), function(k) {\n var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;\n if (isArray(obj[k])) {\n return map(obj[k], function(v) {\n return ks + encodeURIComponent(stringifyPrimitive(v));\n }).join(sep);\n } else {\n return ks + encodeURIComponent(stringifyPrimitive(obj[k]));\n }\n }).join(sep);\n\n }\n\n if (!name) return '';\n return encodeURIComponent(stringifyPrimitive(name)) + eq +\n encodeURIComponent(stringifyPrimitive(obj));\n};\n\nvar isArray = Array.isArray || function (xs) {\n return Object.prototype.toString.call(xs) === '[object Array]';\n};\n\nfunction map (xs, f) {\n if (xs.map) return xs.map(f);\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n res.push(f(xs[i], i));\n }\n return res;\n}\n\nvar objectKeys = Object.keys || function (obj) {\n var res = [];\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);\n }\n return res;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcXVlcnlzdHJpbmctZXMzL2VuY29kZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9lbmNvZGUuanM/ZTA5OSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgc3RyaW5naWZ5UHJpbWl0aXZlID0gZnVuY3Rpb24odikge1xuICBzd2l0Y2ggKHR5cGVvZiB2KSB7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIHJldHVybiB2O1xuXG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICByZXR1cm4gdiA/ICd0cnVlJyA6ICdmYWxzZSc7XG5cbiAgICBjYXNlICdudW1iZXInOlxuICAgICAgcmV0dXJuIGlzRmluaXRlKHYpID8gdiA6ICcnO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAnJztcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvYmosIHNlcCwgZXEsIG5hbWUpIHtcbiAgc2VwID0gc2VwIHx8ICcmJztcbiAgZXEgPSBlcSB8fCAnPSc7XG4gIGlmIChvYmogPT09IG51bGwpIHtcbiAgICBvYmogPSB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbWFwKG9iamVjdEtleXMob2JqKSwgZnVuY3Rpb24oaykge1xuICAgICAgdmFyIGtzID0gZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShrKSkgKyBlcTtcbiAgICAgIGlmIChpc0FycmF5KG9ialtrXSkpIHtcbiAgICAgICAgcmV0dXJuIG1hcChvYmpba10sIGZ1bmN0aW9uKHYpIHtcbiAgICAgICAgICByZXR1cm4ga3MgKyBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKHYpKTtcbiAgICAgICAgfSkuam9pbihzZXApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGtzICsgZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShvYmpba10pKTtcbiAgICAgIH1cbiAgICB9KS5qb2luKHNlcCk7XG5cbiAgfVxuXG4gIGlmICghbmFtZSkgcmV0dXJuICcnO1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShuYW1lKSkgKyBlcSArXG4gICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKG9iaikpO1xufTtcblxudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uICh4cykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHhzKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG5cbmZ1bmN0aW9uIG1hcCAoeHMsIGYpIHtcbiAgaWYgKHhzLm1hcCkgcmV0dXJuIHhzLm1hcChmKTtcbiAgdmFyIHJlcyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgcmVzLnB1c2goZih4c1tpXSwgaSkpO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICB2YXIgcmVzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgcmVzLnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/querystring-es3/encode.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/querystring-es3/index.js":
+/*!***********************************************!*\
+ !*** ./node_modules/querystring-es3/index.js ***!
+ \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nexports.decode = exports.parse = __webpack_require__(/*! ./decode */ \"./node_modules/querystring-es3/decode.js\");\nexports.encode = exports.stringify = __webpack_require__(/*! ./encode */ \"./node_modules/querystring-es3/encode.js\");\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcXVlcnlzdHJpbmctZXMzL2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvcXVlcnlzdHJpbmctZXMzL2luZGV4LmpzP2IzODMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLmRlY29kZSA9IGV4cG9ydHMucGFyc2UgPSByZXF1aXJlKCcuL2RlY29kZScpO1xuZXhwb3J0cy5lbmNvZGUgPSBleHBvcnRzLnN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vZW5jb2RlJyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/querystring-es3/index.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/readable-stream/lib/_stream_duplex.js":
+/*!************************************************************!*\
+ !*** ./node_modules/readable-stream/lib/_stream_duplex.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a duplex stream is just a stream that is both readable and writable.\n// Since JS doesn't have multiple prototypal inheritance, this class\n// prototypally inherits from Readable, and then parasitically from\n// Writable.\n\n\n\n/*<replacement>*/\n\nvar pna = __webpack_require__(/*! process-nextick-args */ \"./node_modules/process-nextick-args/index.js\");\n/*</replacement>*/\n\n/*<replacement>*/\nvar objectKeys = Object.keys || function (obj) {\n var keys = [];\n for (var key in obj) {\n keys.push(key);\n }return keys;\n};\n/*</replacement>*/\n\nmodule.exports = Duplex;\n\n/*<replacement>*/\nvar util = __webpack_require__(/*! core-util-is */ \"./node_modules/core-util-is/lib/util.js\");\nutil.inherits = __webpack_require__(/*! inherits */ \"./node_modules/inherits/inherits_browser.js\");\n/*</replacement>*/\n\nvar Readable = __webpack_require__(/*! ./_stream_readable */ \"./node_modules/readable-stream/lib/_stream_readable.js\");\nvar Writable = __webpack_require__(/*! ./_stream_writable */ \"./node_modules/readable-stream/lib/_stream_writable.js\");\n\nutil.inherits(Duplex, Readable);\n\n{\n // avoid scope creep, the keys array can then be collected\n var keys = objectKeys(Writable.prototype);\n for (var v = 0; v < keys.length; v++) {\n var method = keys[v];\n if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];\n }\n}\n\nfunction Duplex(options) {\n if (!(this instanceof Duplex)) return new Duplex(options);\n\n Readable.call(this, options);\n Writable.call(this, options);\n\n if (options && options.readable === false) this.readable = false;\n\n if (options && options.writable === false) this.writable = false;\n\n this.allowHalfOpen = true;\n if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;\n\n this.once('end', onend);\n}\n\nObject.defineProperty(Duplex.prototype, 'writableHighWaterMark', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function () {\n return this._writableState.highWaterMark;\n }\n});\n\n// the no-half-open enforcer\nfunction onend() {\n // if we allow half-open state, or if the writable side ended,\n // then we're ok.\n if (this.allowHalfOpen || this._writableState.ended) return;\n\n // no more data can be written.\n // But allow more writes to happen in this tick.\n pna.nextTick(onEndNT, this);\n}\n\nfunction onEndNT(self) {\n self.end();\n}\n\nObject.defineProperty(Duplex.prototype, 'destroyed', {\n get: function () {\n if (this._readableState === undefined || this._writableState === undefined) {\n return false;\n }\n return this._readableState.destroyed && this._writableState.destroyed;\n },\n set: function (value) {\n // we ignore the value if the stream\n // has not been initialized yet\n if (this._readableState === undefined || this._writableState === undefined) {\n return;\n }\n\n // backward compatibility, the user is explicitly\n // managing destroyed\n this._readableState.destroyed = value;\n this._writableState.destroyed = value;\n }\n});\n\nDuplex.prototype._destroy = function (err, cb) {\n this.push(null);\n this.end();\n\n pna.nextTick(cb, err);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX2R1cGxleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9kdXBsZXguanM/YjE5YSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gYSBkdXBsZXggc3RyZWFtIGlzIGp1c3QgYSBzdHJlYW0gdGhhdCBpcyBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZS5cbi8vIFNpbmNlIEpTIGRvZXNuJ3QgaGF2ZSBtdWx0aXBsZSBwcm90b3R5cGFsIGluaGVyaXRhbmNlLCB0aGlzIGNsYXNzXG4vLyBwcm90b3R5cGFsbHkgaW5oZXJpdHMgZnJvbSBSZWFkYWJsZSwgYW5kIHRoZW4gcGFyYXNpdGljYWxseSBmcm9tXG4vLyBXcml0YWJsZS5cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuXG52YXIgcG5hID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfXJldHVybiBrZXlzO1xufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IER1cGxleDtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgUmVhZGFibGUgPSByZXF1aXJlKCcuL19zdHJlYW1fcmVhZGFibGUnKTtcbnZhciBXcml0YWJsZSA9IHJlcXVpcmUoJy4vX3N0cmVhbV93cml0YWJsZScpO1xuXG51dGlsLmluaGVyaXRzKER1cGxleCwgUmVhZGFibGUpO1xuXG57XG4gIC8vIGF2b2lkIHNjb3BlIGNyZWVwLCB0aGUga2V5cyBhcnJheSBjYW4gdGhlbiBiZSBjb2xsZWN0ZWRcbiAgdmFyIGtleXMgPSBvYmplY3RLZXlzKFdyaXRhYmxlLnByb3RvdHlwZSk7XG4gIGZvciAodmFyIHYgPSAwOyB2IDwga2V5cy5sZW5ndGg7IHYrKykge1xuICAgIHZhciBtZXRob2QgPSBrZXlzW3ZdO1xuICAgIGlmICghRHVwbGV4LnByb3RvdHlwZVttZXRob2RdKSBEdXBsZXgucHJvdG90eXBlW21ldGhvZF0gPSBXcml0YWJsZS5wcm90b3R5cGVbbWV0aG9kXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBEdXBsZXgob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSkgcmV0dXJuIG5ldyBEdXBsZXgob3B0aW9ucyk7XG5cbiAgUmVhZGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgV3JpdGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnJlYWRhYmxlID09PSBmYWxzZSkgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMud3JpdGFibGUgPT09IGZhbHNlKSB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG5cbiAgdGhpcy5hbGxvd0hhbGZPcGVuID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5hbGxvd0hhbGZPcGVuID09PSBmYWxzZSkgdGhpcy5hbGxvd0hhbGZPcGVuID0gZmFsc2U7XG5cbiAgdGhpcy5vbmNlKCdlbmQnLCBvbmVuZCk7XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdXBsZXgucHJvdG90eXBlLCAnd3JpdGFibGVIaWdoV2F0ZXJNYXJrJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICB9XG59KTtcblxuLy8gdGhlIG5vLWhhbGYtb3BlbiBlbmZvcmNlclxuZnVuY3Rpb24gb25lbmQoKSB7XG4gIC8vIGlmIHdlIGFsbG93IGhhbGYtb3BlbiBzdGF0ZSwgb3IgaWYgdGhlIHdyaXRhYmxlIHNpZGUgZW5kZWQsXG4gIC8vIHRoZW4gd2UncmUgb2suXG4gIGlmICh0aGlzLmFsbG93SGFsZk9wZW4gfHwgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZCkgcmV0dXJuO1xuXG4gIC8vIG5vIG1vcmUgZGF0YSBjYW4gYmUgd3JpdHRlbi5cbiAgLy8gQnV0IGFsbG93IG1vcmUgd3JpdGVzIHRvIGhhcHBlbiBpbiB0aGlzIHRpY2suXG4gIHBuYS5uZXh0VGljayhvbkVuZE5ULCB0aGlzKTtcbn1cblxuZnVuY3Rpb24gb25FbmROVChzZWxmKSB7XG4gIHNlbGYuZW5kKCk7XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdXBsZXgucHJvdG90eXBlLCAnZGVzdHJveWVkJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgJiYgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgLy8gd2UgaWdub3JlIHRoZSB2YWx1ZSBpZiB0aGUgc3RyZWFtXG4gICAgLy8gaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldFxuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQgfHwgdGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlIHVzZXIgaXMgZXhwbGljaXRseVxuICAgIC8vIG1hbmFnaW5nIGRlc3Ryb3llZFxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkID0gdmFsdWU7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgfVxufSk7XG5cbkR1cGxleC5wcm90b3R5cGUuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAoZXJyLCBjYikge1xuICB0aGlzLnB1c2gobnVsbCk7XG4gIHRoaXMuZW5kKCk7XG5cbiAgcG5hLm5leHRUaWNrKGNiLCBlcnIpO1xufTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/readable-stream/lib/_stream_duplex.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/readable-stream/lib/_stream_passthrough.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/readable-stream/lib/_stream_passthrough.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a passthrough stream.\n// basically just the most minimal sort of Transform stream.\n// Every written chunk gets output as-is.\n\n\n\nmodule.exports = PassThrough;\n\nvar Transform = __webpack_require__(/*! ./_stream_transform */ \"./node_modules/readable-stream/lib/_stream_transform.js\");\n\n/*<replacement>*/\nvar util = __webpack_require__(/*! core-util-is */ \"./node_modules/core-util-is/lib/util.js\");\nutil.inherits = __webpack_require__(/*! inherits */ \"./node_modules/inherits/inherits_browser.js\");\n/*</replacement>*/\n\nutil.inherits(PassThrough, Transform);\n\nfunction PassThrough(options) {\n if (!(this instanceof PassThrough)) return new PassThrough(options);\n\n Transform.call(this, options);\n}\n\nPassThrough.prototype._transform = function (chunk, encoding, cb) {\n cb(null, chunk);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzPzc4MGYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGEgcGFzc3Rocm91Z2ggc3RyZWFtLlxuLy8gYmFzaWNhbGx5IGp1c3QgdGhlIG1vc3QgbWluaW1hbCBzb3J0IG9mIFRyYW5zZm9ybSBzdHJlYW0uXG4vLyBFdmVyeSB3cml0dGVuIGNodW5rIGdldHMgb3V0cHV0IGFzLWlzLlxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUGFzc1Rocm91Z2g7XG5cbnZhciBUcmFuc2Zvcm0gPSByZXF1aXJlKCcuL19zdHJlYW1fdHJhbnNmb3JtJyk7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudXRpbC5pbmhlcml0cyhQYXNzVGhyb3VnaCwgVHJhbnNmb3JtKTtcblxuZnVuY3Rpb24gUGFzc1Rocm91Z2gob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUGFzc1Rocm91Z2gpKSByZXR1cm4gbmV3IFBhc3NUaHJvdWdoKG9wdGlvbnMpO1xuXG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xufVxuXG5QYXNzVGhyb3VnaC5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG51bGwsIGNodW5rKTtcbn07Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/readable-stream/lib/_stream_passthrough.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/readable-stream/lib/_stream_readable.js":
+/*!**************************************************************!*\
+ !*** ./node_modules/readable-stream/lib/_stream_readable.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("/* WEBPACK VAR INJECTION */(function(global, process) {// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n\n/*<replacement>*/\n\nvar pna = __webpack_require__(/*! process-nextick-args */ \"./node_modules/process-nextick-args/index.js\");\n/*</replacement>*/\n\nmodule.exports = Readable;\n\n/*<replacement>*/\nvar isArray = __webpack_require__(/*! isarray */ \"./node_modules/isarray/index.js\");\n/*</replacement>*/\n\n/*<replacement>*/\nvar Duplex;\n/*</replacement>*/\n\nReadable.ReadableState = ReadableState;\n\n/*<replacement>*/\nvar EE = __webpack_require__(/*! events */ \"./node_modules/events/events.js\").EventEmitter;\n\nvar EElistenerCount = function (emitter, type) {\n return emitter.listeners(type).length;\n};\n/*</replacement>*/\n\n/*<replacement>*/\nvar Stream = __webpack_require__(/*! ./internal/streams/stream */ \"./node_modules/readable-stream/lib/internal/streams/stream-browser.js\");\n/*</replacement>*/\n\n/*<replacement>*/\n\nvar Buffer = __webpack_require__(/*! safe-buffer */ \"./node_modules/safe-buffer/index.js\").Buffer;\nvar OurUint8Array = global.Uint8Array || function () {};\nfunction _uint8ArrayToBuffer(chunk) {\n return Buffer.from(chunk);\n}\nfunction _isUint8Array(obj) {\n return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;\n}\n\n/*</replacement>*/\n\n/*<replacement>*/\nvar util = __webpack_require__(/*! core-util-is */ \"./node_modules/core-util-is/lib/util.js\");\nutil.inherits = __webpack_require__(/*! inherits */ \"./node_modules/inherits/inherits_browser.js\");\n/*</replacement>*/\n\n/*<replacement>*/\nvar debugUtil = __webpack_require__(/*! util */ 0);\nvar debug = void 0;\nif (debugUtil && debugUtil.debuglog) {\n debug = debugUtil.debuglog('stream');\n} else {\n debug = function () {};\n}\n/*</replacement>*/\n\nvar BufferList = __webpack_require__(/*! ./internal/streams/BufferList */ \"./node_modules/readable-stream/lib/internal/streams/BufferList.js\");\nvar destroyImpl = __webpack_require__(/*! ./internal/streams/destroy */ \"./node_modules/readable-stream/lib/internal/streams/destroy.js\");\nvar StringDecoder;\n\nutil.inherits(Readable, Stream);\n\nvar kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];\n\nfunction prependListener(emitter, event, fn) {\n // Sadly this is not cacheable as some libraries bundle their own\n // event emitter implementation with them.\n if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);\n\n // This is a hack to make sure that our error handler is attached before any\n // userland ones. NEVER DO THIS. This is here only because this code needs\n // to continue to work with older versions of Node.js that do not include\n // the prependListener() method. The goal is to eventually remove this hack.\n if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];\n}\n\nfunction ReadableState(options, stream) {\n Duplex = Duplex || __webpack_require__(/*! ./_stream_duplex */ \"./node_modules/readable-stream/lib/_stream_duplex.js\");\n\n options = options || {};\n\n // Duplex streams are both readable and writable, but share\n // the same options object.\n // However, some cases require setting options to different\n // values for the readable and the writable sides of the duplex stream.\n // These options can be provided separately as readableXXX and writableXXX.\n var isDuplex = stream instanceof Duplex;\n\n // object stream flag. Used to make read(n) ignore n and to\n // make all the buffer merging and length checks go away\n this.objectMode = !!options.objectMode;\n\n if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;\n\n // the point at which it stops calling _read() to fill the buffer\n // Note: 0 is a valid value, means \"don't call _read preemptively ever\"\n var hwm = options.highWaterMark;\n var readableHwm = options.readableHighWaterMark;\n var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n\n if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm;\n\n // cast to ints.\n this.highWaterMark = Math.floor(this.highWaterMark);\n\n // A linked list is used to store data chunks instead of an array because the\n // linked list can remove elements from the beginning faster than\n // array.shift()\n this.buffer = new BufferList();\n this.length = 0;\n this.pipes = null;\n this.pipesCount = 0;\n this.flowing = null;\n this.ended = false;\n this.endEmitted = false;\n this.reading = false;\n\n // a flag to be able to tell if the event 'readable'/'data' is emitted\n // immediately, or on a later tick. We set this to true at first, because\n // any actions that shouldn't happen until \"later\" should generally also\n // not happen before the first read call.\n this.sync = true;\n\n // whenever we return null, then we set a flag to say\n // that we're awaiting a 'readable' event emission.\n this.needReadable = false;\n this.emittedReadable = false;\n this.readableListening = false;\n this.resumeScheduled = false;\n\n // has it been destroyed\n this.destroyed = false;\n\n // Crypto is kind of old and crusty. Historically, its default string\n // encoding is 'binary' so we have to make this configurable.\n // Everything else in the universe uses 'utf8', though.\n this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n // the number of writers that are awaiting a drain event in .pipe()s\n this.awaitDrain = 0;\n\n // if true, a maybeReadMore has been scheduled\n this.readingMore = false;\n\n this.decoder = null;\n this.encoding = null;\n if (options.encoding) {\n if (!StringDecoder) StringDecoder = __webpack_require__(/*! string_decoder/ */ \"./node_modules/string_decoder/lib/string_decoder.js\").StringDecoder;\n this.decoder = new StringDecoder(options.encoding);\n this.encoding = options.encoding;\n }\n}\n\nfunction Readable(options) {\n Duplex = Duplex || __webpack_require__(/*! ./_stream_duplex */ \"./node_modules/readable-stream/lib/_stream_duplex.js\");\n\n if (!(this instanceof Readable)) return new Readable(options);\n\n this._readableState = new ReadableState(options, this);\n\n // legacy\n this.readable = true;\n\n if (options) {\n if (typeof options.read === 'function') this._read = options.read;\n\n if (typeof options.destroy === 'function') this._destroy = options.destroy;\n }\n\n Stream.call(this);\n}\n\nObject.defineProperty(Readable.prototype, 'destroyed', {\n get: function () {\n if (this._readableState === undefined) {\n return false;\n }\n return this._readableState.destroyed;\n },\n set: function (value) {\n // we ignore the value if the stream\n // has not been initialized yet\n if (!this._readableState) {\n return;\n }\n\n // backward compatibility, the user is explicitly\n // managing destroyed\n this._readableState.destroyed = value;\n }\n});\n\nReadable.prototype.destroy = destroyImpl.destroy;\nReadable.prototype._undestroy = destroyImpl.undestroy;\nReadable.prototype._destroy = function (err, cb) {\n this.push(null);\n cb(err);\n};\n\n// Manually shove something into the read() buffer.\n// This returns true if the highWaterMark has not been hit yet,\n// similar to how Writable.write() returns true if you should\n// write() some more.\nReadable.prototype.push = function (chunk, encoding) {\n var state = this._readableState;\n var skipChunkCheck;\n\n if (!state.objectMode) {\n if (typeof chunk === 'string') {\n encoding = encoding || state.defaultEncoding;\n if (encoding !== state.encoding) {\n chunk = Buffer.from(chunk, encoding);\n encoding = '';\n }\n skipChunkCheck = true;\n }\n } else {\n skipChunkCheck = true;\n }\n\n return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);\n};\n\n// Unshift should *always* be something directly out of read()\nReadable.prototype.unshift = function (chunk) {\n return readableAddChunk(this, chunk, null, true, false);\n};\n\nfunction readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {\n var state = stream._readableState;\n if (chunk === null) {\n state.reading = false;\n onEofChunk(stream, state);\n } else {\n var er;\n if (!skipChunkCheck) er = chunkInvalid(state, chunk);\n if (er) {\n stream.emit('error', er);\n } else if (state.objectMode || chunk && chunk.length > 0) {\n if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {\n chunk = _uint8ArrayToBuffer(chunk);\n }\n\n if (addToFront) {\n if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true);\n } else if (state.ended) {\n stream.emit('error', new Error('stream.push() after EOF'));\n } else {\n state.reading = false;\n if (state.decoder && !encoding) {\n chunk = state.decoder.write(chunk);\n if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);\n } else {\n addChunk(stream, state, chunk, false);\n }\n }\n } else if (!addToFront) {\n state.reading = false;\n }\n }\n\n return needMoreData(state);\n}\n\nfunction addChunk(stream, state, chunk, addToFront) {\n if (state.flowing && state.length === 0 && !state.sync) {\n stream.emit('data', chunk);\n stream.read(0);\n } else {\n // update the buffer info.\n state.length += state.objectMode ? 1 : chunk.length;\n if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);\n\n if (state.needReadable) emitReadable(stream);\n }\n maybeReadMore(stream, state);\n}\n\nfunction chunkInvalid(state, chunk) {\n var er;\n if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n er = new TypeError('Invalid non-string/buffer chunk');\n }\n return er;\n}\n\n// if it's past the high water mark, we can push in some more.\n// Also, if we have no data yet, we can stand some\n// more bytes. This is to work around cases where hwm=0,\n// such as the repl. Also, if the push() triggered a\n// readable event, and the user called read(largeNumber) such that\n// needReadable was set, then we ought to push more, so that another\n// 'readable' event will be triggered.\nfunction needMoreData(state) {\n return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);\n}\n\nReadable.prototype.isPaused = function () {\n return this._readableState.flowing === false;\n};\n\n// backwards compatibility.\nReadable.prototype.setEncoding = function (enc) {\n if (!StringDecoder) StringDecoder = __webpack_require__(/*! string_decoder/ */ \"./node_modules/string_decoder/lib/string_decoder.js\").StringDecoder;\n this._readableState.decoder = new StringDecoder(enc);\n this._readableState.encoding = enc;\n return this;\n};\n\n// Don't raise the hwm > 8MB\nvar MAX_HWM = 0x800000;\nfunction computeNewHighWaterMark(n) {\n if (n >= MAX_HWM) {\n n = MAX_HWM;\n } else {\n // Get the next highest power of 2 to prevent increasing hwm excessively in\n // tiny amounts\n n--;\n n |= n >>> 1;\n n |= n >>> 2;\n n |= n >>> 4;\n n |= n >>> 8;\n n |= n >>> 16;\n n++;\n }\n return n;\n}\n\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction howMuchToRead(n, state) {\n if (n <= 0 || state.length === 0 && state.ended) return 0;\n if (state.objectMode) return 1;\n if (n !== n) {\n // Only flow one buffer at a time\n if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;\n }\n // If we're asking for more than the current hwm, then raise the hwm.\n if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);\n if (n <= state.length) return n;\n // Don't have enough\n if (!state.ended) {\n state.needReadable = true;\n return 0;\n }\n return state.length;\n}\n\n// you can override either this method, or the async _read(n) below.\nReadable.prototype.read = function (n) {\n debug('read', n);\n n = parseInt(n, 10);\n var state = this._readableState;\n var nOrig = n;\n\n if (n !== 0) state.emittedReadable = false;\n\n // if we're doing read(0) to trigger a readable event, but we\n // already have a bunch of data in the buffer, then just trigger\n // the 'readable' event and move on.\n if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {\n debug('read: emitReadable', state.length, state.ended);\n if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);\n return null;\n }\n\n n = howMuchToRead(n, state);\n\n // if we've ended, and we're now clear, then finish it up.\n if (n === 0 && state.ended) {\n if (state.length === 0) endReadable(this);\n return null;\n }\n\n // All the actual chunk generation logic needs to be\n // *below* the call to _read. The reason is that in certain\n // synthetic stream cases, such as passthrough streams, _read\n // may be a completely synchronous operation which may change\n // the state of the read buffer, providing enough data when\n // before there was *not* enough.\n //\n // So, the steps are:\n // 1. Figure out what the state of things will be after we do\n // a read from the buffer.\n //\n // 2. If that resulting state will trigger a _read, then call _read.\n // Note that this may be asynchronous, or synchronous. Yes, it is\n // deeply ugly to write APIs this way, but that still doesn't mean\n // that the Readable class should behave improperly, as streams are\n // designed to be sync/async agnostic.\n // Take note if the _read call is sync or async (ie, if the read call\n // has returned yet), so that we know whether or not it's safe to emit\n // 'readable' etc.\n //\n // 3. Actually pull the requested chunks out of the buffer and return.\n\n // if we need a readable event, then we need to do some reading.\n var doRead = state.needReadable;\n debug('need readable', doRead);\n\n // if we currently have less than the highWaterMark, then also read some\n if (state.length === 0 || state.length - n < state.highWaterMark) {\n doRead = true;\n debug('length less than watermark', doRead);\n }\n\n // however, if we've ended, then there's no point, and if we're already\n // reading, then it's unnecessary.\n if (state.ended || state.reading) {\n doRead = false;\n debug('reading or ended', doRead);\n } else if (doRead) {\n debug('do read');\n state.reading = true;\n state.sync = true;\n // if the length is currently zero, then we *need* a readable event.\n if (state.length === 0) state.needReadable = true;\n // call internal read method\n this._read(state.highWaterMark);\n state.sync = false;\n // If _read pushed data synchronously, then `reading` will be false,\n // and we need to re-evaluate how much data we can return to the user.\n if (!state.reading) n = howMuchToRead(nOrig, state);\n }\n\n var ret;\n if (n > 0) ret = fromList(n, state);else ret = null;\n\n if (ret === null) {\n state.needReadable = true;\n n = 0;\n } else {\n state.length -= n;\n }\n\n if (state.length === 0) {\n // If we have nothing in the buffer, then we want to know\n // as soon as we *do* get something into the buffer.\n if (!state.ended) state.needReadable = true;\n\n // If we tried to read() past the EOF, then emit end on the next tick.\n if (nOrig !== n && state.ended) endReadable(this);\n }\n\n if (ret !== null) this.emit('data', ret);\n\n return ret;\n};\n\nfunction onEofChunk(stream, state) {\n if (state.ended) return;\n if (state.decoder) {\n var chunk = state.decoder.end();\n if (chunk && chunk.length) {\n state.buffer.push(chunk);\n state.length += state.objectMode ? 1 : chunk.length;\n }\n }\n state.ended = true;\n\n // emit 'readable' now to make sure it gets picked up.\n emitReadable(stream);\n}\n\n// Don't emit readable right away in sync mode, because this can trigger\n// another read() call => stack overflow. This way, it might trigger\n// a nextTick recursion warning, but that's not so bad.\nfunction emitReadable(stream) {\n var state = stream._readableState;\n state.needReadable = false;\n if (!state.emittedReadable) {\n debug('emitReadable', state.flowing);\n state.emittedReadable = true;\n if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream);\n }\n}\n\nfunction emitReadable_(stream) {\n debug('emit readable');\n stream.emit('readable');\n flow(stream);\n}\n\n// at this point, the user has presumably seen the 'readable' event,\n// and called read() to consume some data. that may have triggered\n// in turn another _read(n) call, in which case reading = true if\n// it's in progress.\n// However, if we're not ended, or reading, and the length < hwm,\n// then go ahead and try to read some more preemptively.\nfunction maybeReadMore(stream, state) {\n if (!state.readingMore) {\n state.readingMore = true;\n pna.nextTick(maybeReadMore_, stream, state);\n }\n}\n\nfunction maybeReadMore_(stream, state) {\n var len = state.length;\n while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {\n debug('maybeReadMore read 0');\n stream.read(0);\n if (len === state.length)\n // didn't get any data, stop spinning.\n break;else len = state.length;\n }\n state.readingMore = false;\n}\n\n// abstract method. to be overridden in specific implementation classes.\n// call cb(er, data) where data is <= n in length.\n// for virtual (non-string, non-buffer) streams, \"length\" is somewhat\n// arbitrary, and perhaps not very meaningful.\nReadable.prototype._read = function (n) {\n this.emit('error', new Error('_read() is not implemented'));\n};\n\nReadable.prototype.pipe = function (dest, pipeOpts) {\n var src = this;\n var state = this._readableState;\n\n switch (state.pipesCount) {\n case 0:\n state.pipes = dest;\n break;\n case 1:\n state.pipes = [state.pipes, dest];\n break;\n default:\n state.pipes.push(dest);\n break;\n }\n state.pipesCount += 1;\n debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);\n\n var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;\n\n var endFn = doEnd ? onend : unpipe;\n if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn);\n\n dest.on('unpipe', onunpipe);\n function onunpipe(readable, unpipeInfo) {\n debug('onunpipe');\n if (readable === src) {\n if (unpipeInfo && unpipeInfo.hasUnpiped === false) {\n unpipeInfo.hasUnpiped = true;\n cleanup();\n }\n }\n }\n\n function onend() {\n debug('onend');\n dest.end();\n }\n\n // when the dest drains, it reduces the awaitDrain counter\n // on the source. This would be more elegant with a .once()\n // handler in flow(), but adding and removing repeatedly is\n // too slow.\n var ondrain = pipeOnDrain(src);\n dest.on('drain', ondrain);\n\n var cleanedUp = false;\n function cleanup() {\n debug('cleanup');\n // cleanup event handlers once the pipe is broken\n dest.removeListener('close', onclose);\n dest.removeListener('finish', onfinish);\n dest.removeListener('drain', ondrain);\n dest.removeListener('error', onerror);\n dest.removeListener('unpipe', onunpipe);\n src.removeListener('end', onend);\n src.removeListener('end', unpipe);\n src.removeListener('data', ondata);\n\n cleanedUp = true;\n\n // if the reader is waiting for a drain event from this\n // specific writer, then it would cause it to never start\n // flowing again.\n // So, if this is awaiting a drain, then we just call it now.\n // If we don't know, then assume that we are waiting for one.\n if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();\n }\n\n // If the user pushes more data while we're writing to dest then we'll end up\n // in ondata again. However, we only want to increase awaitDrain once because\n // dest will only emit one 'drain' event for the multiple writes.\n // => Introduce a guard on increasing awaitDrain.\n var increasedAwaitDrain = false;\n src.on('data', ondata);\n function ondata(chunk) {\n debug('ondata');\n increasedAwaitDrain = false;\n var ret = dest.write(chunk);\n if (false === ret && !increasedAwaitDrain) {\n // If the user unpiped during `dest.write()`, it is possible\n // to get stuck in a permanently paused state if that write\n // also returned false.\n // => Check whether `dest` is still a piping destination.\n if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {\n debug('false write response, pause', src._readableState.awaitDrain);\n src._readableState.awaitDrain++;\n increasedAwaitDrain = true;\n }\n src.pause();\n }\n }\n\n // if the dest has an error, then stop piping into it.\n // however, don't suppress the throwing behavior for this.\n function onerror(er) {\n debug('onerror', er);\n unpipe();\n dest.removeListener('error', onerror);\n if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);\n }\n\n // Make sure our error handler is attached before userland ones.\n prependListener(dest, 'error', onerror);\n\n // Both close and finish should trigger unpipe, but only once.\n function onclose() {\n dest.removeListener('finish', onfinish);\n unpipe();\n }\n dest.once('close', onclose);\n function onfinish() {\n debug('onfinish');\n dest.removeListener('close', onclose);\n unpipe();\n }\n dest.once('finish', onfinish);\n\n function unpipe() {\n debug('unpipe');\n src.unpipe(dest);\n }\n\n // tell the dest that it's being piped to\n dest.emit('pipe', src);\n\n // start the flow if it hasn't been started already.\n if (!state.flowing) {\n debug('pipe resume');\n src.resume();\n }\n\n return dest;\n};\n\nfunction pipeOnDrain(src) {\n return function () {\n var state = src._readableState;\n debug('pipeOnDrain', state.awaitDrain);\n if (state.awaitDrain) state.awaitDrain--;\n if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {\n state.flowing = true;\n flow(src);\n }\n };\n}\n\nReadable.prototype.unpipe = function (dest) {\n var state = this._readableState;\n var unpipeInfo = { hasUnpiped: false };\n\n // if we're not piping anywhere, then do nothing.\n if (state.pipesCount === 0) return this;\n\n // just one destination. most common case.\n if (state.pipesCount === 1) {\n // passed in one, but it's not the right one.\n if (dest && dest !== state.pipes) return this;\n\n if (!dest) dest = state.pipes;\n\n // got a match.\n state.pipes = null;\n state.pipesCount = 0;\n state.flowing = false;\n if (dest) dest.emit('unpipe', this, unpipeInfo);\n return this;\n }\n\n // slow case. multiple pipe destinations.\n\n if (!dest) {\n // remove all.\n var dests = state.pipes;\n var len = state.pipesCount;\n state.pipes = null;\n state.pipesCount = 0;\n state.flowing = false;\n\n for (var i = 0; i < len; i++) {\n dests[i].emit('unpipe', this, unpipeInfo);\n }return this;\n }\n\n // try to find the right one.\n var index = indexOf(state.pipes, dest);\n if (index === -1) return this;\n\n state.pipes.splice(index, 1);\n state.pipesCount -= 1;\n if (state.pipesCount === 1) state.pipes = state.pipes[0];\n\n dest.emit('unpipe', this, unpipeInfo);\n\n return this;\n};\n\n// set up data events if they are asked for\n// Ensure readable listeners eventually get something\nReadable.prototype.on = function (ev, fn) {\n var res = Stream.prototype.on.call(this, ev, fn);\n\n if (ev === 'data') {\n // Start flowing on next tick if stream isn't explicitly paused\n if (this._readableState.flowing !== false) this.resume();\n } else if (ev === 'readable') {\n var state = this._readableState;\n if (!state.endEmitted && !state.readableListening) {\n state.readableListening = state.needReadable = true;\n state.emittedReadable = false;\n if (!state.reading) {\n pna.nextTick(nReadingNextTick, this);\n } else if (state.length) {\n emitReadable(this);\n }\n }\n }\n\n return res;\n};\nReadable.prototype.addListener = Readable.prototype.on;\n\nfunction nReadingNextTick(self) {\n debug('readable nexttick read 0');\n self.read(0);\n}\n\n// pause() and resume() are remnants of the legacy readable stream API\n// If the user uses them, then switch into old mode.\nReadable.prototype.resume = function () {\n var state = this._readableState;\n if (!state.flowing) {\n debug('resume');\n state.flowing = true;\n resume(this, state);\n }\n return this;\n};\n\nfunction resume(stream, state) {\n if (!state.resumeScheduled) {\n state.resumeScheduled = true;\n pna.nextTick(resume_, stream, state);\n }\n}\n\nfunction resume_(stream, state) {\n if (!state.reading) {\n debug('resume read 0');\n stream.read(0);\n }\n\n state.resumeScheduled = false;\n state.awaitDrain = 0;\n stream.emit('resume');\n flow(stream);\n if (state.flowing && !state.reading) stream.read(0);\n}\n\nReadable.prototype.pause = function () {\n debug('call pause flowing=%j', this._readableState.flowing);\n if (false !== this._readableState.flowing) {\n debug('pause');\n this._readableState.flowing = false;\n this.emit('pause');\n }\n return this;\n};\n\nfunction flow(stream) {\n var state = stream._readableState;\n debug('flow', state.flowing);\n while (state.flowing && stream.read() !== null) {}\n}\n\n// wrap an old-style stream as the async data source.\n// This is *not* part of the readable stream interface.\n// It is an ugly unfortunate mess of history.\nReadable.prototype.wrap = function (stream) {\n var _this = this;\n\n var state = this._readableState;\n var paused = false;\n\n stream.on('end', function () {\n debug('wrapped end');\n if (state.decoder && !state.ended) {\n var chunk = state.decoder.end();\n if (chunk && chunk.length) _this.push(chunk);\n }\n\n _this.push(null);\n });\n\n stream.on('data', function (chunk) {\n debug('wrapped data');\n if (state.decoder) chunk = state.decoder.write(chunk);\n\n // don't skip over falsy values in objectMode\n if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;\n\n var ret = _this.push(chunk);\n if (!ret) {\n paused = true;\n stream.pause();\n }\n });\n\n // proxy all the other methods.\n // important when wrapping filters and duplexes.\n for (var i in stream) {\n if (this[i] === undefined && typeof stream[i] === 'function') {\n this[i] = function (method) {\n return function () {\n return stream[method].apply(stream, arguments);\n };\n }(i);\n }\n }\n\n // proxy certain important events.\n for (var n = 0; n < kProxyEvents.length; n++) {\n stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));\n }\n\n // when we try to consume some more bytes, simply unpause the\n // underlying stream.\n this._read = function (n) {\n debug('wrapped _read', n);\n if (paused) {\n paused = false;\n stream.resume();\n }\n };\n\n return this;\n};\n\nObject.defineProperty(Readable.prototype, 'readableHighWaterMark', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function () {\n return this._readableState.highWaterMark;\n }\n});\n\n// exposed for testing purposes only.\nReadable._fromList = fromList;\n\n// Pluck off n bytes from an array of buffers.\n// Length is the combined lengths of all the buffers in the list.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromList(n, state) {\n // nothing buffered\n if (state.length === 0) return null;\n\n var ret;\n if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {\n // read it all, truncate the list\n if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);\n state.buffer.clear();\n } else {\n // read part of list\n ret = fromListPartial(n, state.buffer, state.decoder);\n }\n\n return ret;\n}\n\n// Extracts only enough buffered data to satisfy the amount requested.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromListPartial(n, list, hasStrings) {\n var ret;\n if (n < list.head.data.length) {\n // slice is the same for buffers and strings\n ret = list.head.data.slice(0, n);\n list.head.data = list.head.data.slice(n);\n } else if (n === list.head.data.length) {\n // first chunk is a perfect match\n ret = list.shift();\n } else {\n // result spans more than one buffer\n ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);\n }\n return ret;\n}\n\n// Copies a specified amount of characters from the list of buffered data\n// chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBufferString(n, list) {\n var p = list.head;\n var c = 1;\n var ret = p.data;\n n -= ret.length;\n while (p = p.next) {\n var str = p.data;\n var nb = n > str.length ? str.length : n;\n if (nb === str.length) ret += str;else ret += str.slice(0, n);\n n -= nb;\n if (n === 0) {\n if (nb === str.length) {\n ++c;\n if (p.next) list.head = p.next;else list.head = list.tail = null;\n } else {\n list.head = p;\n p.data = str.slice(nb);\n }\n break;\n }\n ++c;\n }\n list.length -= c;\n return ret;\n}\n\n// Copies a specified amount of bytes from the list of buffered data chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBuffer(n, list) {\n var ret = Buffer.allocUnsafe(n);\n var p = list.head;\n var c = 1;\n p.data.copy(ret);\n n -= p.data.length;\n while (p = p.next) {\n var buf = p.data;\n var nb = n > buf.length ? buf.length : n;\n buf.copy(ret, ret.length - n, 0, nb);\n n -= nb;\n if (n === 0) {\n if (nb === buf.length) {\n ++c;\n if (p.next) list.head = p.next;else list.head = list.tail = null;\n } else {\n list.head = p;\n p.data = buf.slice(nb);\n }\n break;\n }\n ++c;\n }\n list.length -= c;\n return ret;\n}\n\nfunction endReadable(stream) {\n var state = stream._readableState;\n\n // If we get here before consuming all the bytes, then that is a\n // bug in node. Should never happen.\n if (state.length > 0) throw new Error('\"endReadable()\" called on non-empty stream');\n\n if (!state.endEmitted) {\n state.ended = true;\n pna.nextTick(endReadableNT, state, stream);\n }\n}\n\nfunction endReadableNT(state, stream) {\n // Check that we didn't get one last unshift.\n if (!state.endEmitted && state.length === 0) {\n state.endEmitted = true;\n stream.readable = false;\n stream.emit('end');\n }\n}\n\nfunction indexOf(xs, x) {\n for (var i = 0, l = xs.length; i < l; i++) {\n if (xs[i] === x) return i;\n }\n return -1;\n}\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\"), __webpack_require__(/*! ./../../process/browser.js */ \"./node_modules/process/browser.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzP2FkNzEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIHBuYSA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxubW9kdWxlLmV4cG9ydHMgPSBSZWFkYWJsZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgRHVwbGV4O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cblJlYWRhYmxlLlJlYWRhYmxlU3RhdGUgPSBSZWFkYWJsZVN0YXRlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEVFID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuXG52YXIgRUVsaXN0ZW5lckNvdW50ID0gZnVuY3Rpb24gKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJzKHR5cGUpLmxlbmd0aDtcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIE91clVpbnQ4QXJyYXkgPSBnbG9iYWwuVWludDhBcnJheSB8fCBmdW5jdGlvbiAoKSB7fTtcbmZ1bmN0aW9uIF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNodW5rKTtcbn1cbmZ1bmN0aW9uIF9pc1VpbnQ4QXJyYXkob2JqKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIob2JqKSB8fCBvYmogaW5zdGFuY2VvZiBPdXJVaW50OEFycmF5O1xufVxuXG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGRlYnVnVXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBkZWJ1ZyA9IHZvaWQgMDtcbmlmIChkZWJ1Z1V0aWwgJiYgZGVidWdVdGlsLmRlYnVnbG9nKSB7XG4gIGRlYnVnID0gZGVidWdVdGlsLmRlYnVnbG9nKCdzdHJlYW0nKTtcbn0gZWxzZSB7XG4gIGRlYnVnID0gZnVuY3Rpb24gKCkge307XG59XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlckxpc3QgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvQnVmZmVyTGlzdCcpO1xudmFyIGRlc3Ryb3lJbXBsID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3knKTtcbnZhciBTdHJpbmdEZWNvZGVyO1xuXG51dGlsLmluaGVyaXRzKFJlYWRhYmxlLCBTdHJlYW0pO1xuXG52YXIga1Byb3h5RXZlbnRzID0gWydlcnJvcicsICdjbG9zZScsICdkZXN0cm95JywgJ3BhdXNlJywgJ3Jlc3VtZSddO1xuXG5mdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIoZW1pdHRlciwgZXZlbnQsIGZuKSB7XG4gIC8vIFNhZGx5IHRoaXMgaXMgbm90IGNhY2hlYWJsZSBhcyBzb21lIGxpYnJhcmllcyBidW5kbGUgdGhlaXIgb3duXG4gIC8vIGV2ZW50IGVtaXR0ZXIgaW1wbGVtZW50YXRpb24gd2l0aCB0aGVtLlxuICBpZiAodHlwZW9mIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSByZXR1cm4gZW1pdHRlci5wcmVwZW5kTGlzdGVuZXIoZXZlbnQsIGZuKTtcblxuICAvLyBUaGlzIGlzIGEgaGFjayB0byBtYWtlIHN1cmUgdGhhdCBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgYW55XG4gIC8vIHVzZXJsYW5kIG9uZXMuICBORVZFUiBETyBUSElTLiBUaGlzIGlzIGhlcmUgb25seSBiZWNhdXNlIHRoaXMgY29kZSBuZWVkc1xuICAvLyB0byBjb250aW51ZSB0byB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgTm9kZS5qcyB0aGF0IGRvIG5vdCBpbmNsdWRlXG4gIC8vIHRoZSBwcmVwZW5kTGlzdGVuZXIoKSBtZXRob2QuIFRoZSBnb2FsIGlzIHRvIGV2ZW50dWFsbHkgcmVtb3ZlIHRoaXMgaGFjay5cbiAgaWYgKCFlbWl0dGVyLl9ldmVudHMgfHwgIWVtaXR0ZXIuX2V2ZW50c1tldmVudF0pIGVtaXR0ZXIub24oZXZlbnQsIGZuKTtlbHNlIGlmIChpc0FycmF5KGVtaXR0ZXIuX2V2ZW50c1tldmVudF0pKSBlbWl0dGVyLl9ldmVudHNbZXZlbnRdLnVuc2hpZnQoZm4pO2Vsc2UgZW1pdHRlci5fZXZlbnRzW2V2ZW50XSA9IFtmbiwgZW1pdHRlci5fZXZlbnRzW2V2ZW50XV07XG59XG5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gRHVwbGV4IHN0cmVhbXMgYXJlIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLCBidXQgc2hhcmVcbiAgLy8gdGhlIHNhbWUgb3B0aW9ucyBvYmplY3QuXG4gIC8vIEhvd2V2ZXIsIHNvbWUgY2FzZXMgcmVxdWlyZSBzZXR0aW5nIG9wdGlvbnMgdG8gZGlmZmVyZW50XG4gIC8vIHZhbHVlcyBmb3IgdGhlIHJlYWRhYmxlIGFuZCB0aGUgd3JpdGFibGUgc2lkZXMgb2YgdGhlIGR1cGxleCBzdHJlYW0uXG4gIC8vIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHByb3ZpZGVkIHNlcGFyYXRlbHkgYXMgcmVhZGFibGVYWFggYW5kIHdyaXRhYmxlWFhYLlxuICB2YXIgaXNEdXBsZXggPSBzdHJlYW0gaW5zdGFuY2VvZiBEdXBsZXg7XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnLiBVc2VkIHRvIG1ha2UgcmVhZChuKSBpZ25vcmUgbiBhbmQgdG9cbiAgLy8gbWFrZSBhbGwgdGhlIGJ1ZmZlciBtZXJnaW5nIGFuZCBsZW5ndGggY2hlY2tzIGdvIGF3YXlcbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKGlzRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggaXQgc3RvcHMgY2FsbGluZyBfcmVhZCgpIHRvIGZpbGwgdGhlIGJ1ZmZlclxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIFwiZG9uJ3QgY2FsbCBfcmVhZCBwcmVlbXB0aXZlbHkgZXZlclwiXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciByZWFkYWJsZUh3bSA9IG9wdGlvbnMucmVhZGFibGVIaWdoV2F0ZXJNYXJrO1xuICB2YXIgZGVmYXVsdEh3bSA9IHRoaXMub2JqZWN0TW9kZSA/IDE2IDogMTYgKiAxMDI0O1xuXG4gIGlmIChod20gfHwgaHdtID09PSAwKSB0aGlzLmhpZ2hXYXRlck1hcmsgPSBod207ZWxzZSBpZiAoaXNEdXBsZXggJiYgKHJlYWRhYmxlSHdtIHx8IHJlYWRhYmxlSHdtID09PSAwKSkgdGhpcy5oaWdoV2F0ZXJNYXJrID0gcmVhZGFibGVId207ZWxzZSB0aGlzLmhpZ2hXYXRlck1hcmsgPSBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gTWF0aC5mbG9vcih0aGlzLmhpZ2hXYXRlck1hcmspO1xuXG4gIC8vIEEgbGlua2VkIGxpc3QgaXMgdXNlZCB0byBzdG9yZSBkYXRhIGNodW5rcyBpbnN0ZWFkIG9mIGFuIGFycmF5IGJlY2F1c2UgdGhlXG4gIC8vIGxpbmtlZCBsaXN0IGNhbiByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgYmVnaW5uaW5nIGZhc3RlciB0aGFuXG4gIC8vIGFycmF5LnNoaWZ0KClcbiAgdGhpcy5idWZmZXIgPSBuZXcgQnVmZmVyTGlzdCgpO1xuICB0aGlzLmxlbmd0aCA9IDA7XG4gIHRoaXMucGlwZXMgPSBudWxsO1xuICB0aGlzLnBpcGVzQ291bnQgPSAwO1xuICB0aGlzLmZsb3dpbmcgPSBudWxsO1xuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIHRoaXMuZW5kRW1pdHRlZCA9IGZhbHNlO1xuICB0aGlzLnJlYWRpbmcgPSBmYWxzZTtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBldmVudCAncmVhZGFibGUnLydkYXRhJyBpcyBlbWl0dGVkXG4gIC8vIGltbWVkaWF0ZWx5LCBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlXG4gIC8vIGFueSBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCByZWFkIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWU7XG5cbiAgLy8gd2hlbmV2ZXIgd2UgcmV0dXJuIG51bGwsIHRoZW4gd2Ugc2V0IGEgZmxhZyB0byBzYXlcbiAgLy8gdGhhdCB3ZSdyZSBhd2FpdGluZyBhICdyZWFkYWJsZScgZXZlbnQgZW1pc3Npb24uXG4gIHRoaXMubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMucmVhZGFibGVMaXN0ZW5pbmcgPSBmYWxzZTtcbiAgdGhpcy5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcblxuICAvLyBoYXMgaXQgYmVlbiBkZXN0cm95ZWRcbiAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcblxuICAvLyBDcnlwdG8gaXMga2luZCBvZiBvbGQgYW5kIGNydXN0eS4gIEhpc3RvcmljYWxseSwgaXRzIGRlZmF1bHQgc3RyaW5nXG4gIC8vIGVuY29kaW5nIGlzICdiaW5hcnknIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgLy8gRXZlcnl0aGluZyBlbHNlIGluIHRoZSB1bml2ZXJzZSB1c2VzICd1dGY4JywgdGhvdWdoLlxuICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IG9wdGlvbnMuZGVmYXVsdEVuY29kaW5nIHx8ICd1dGY4JztcblxuICAvLyB0aGUgbnVtYmVyIG9mIHdyaXRlcnMgdGhhdCBhcmUgYXdhaXRpbmcgYSBkcmFpbiBldmVudCBpbiAucGlwZSgpc1xuICB0aGlzLmF3YWl0RHJhaW4gPSAwO1xuXG4gIC8vIGlmIHRydWUsIGEgbWF5YmVSZWFkTW9yZSBoYXMgYmVlbiBzY2hlZHVsZWRcbiAgdGhpcy5yZWFkaW5nTW9yZSA9IGZhbHNlO1xuXG4gIHRoaXMuZGVjb2RlciA9IG51bGw7XG4gIHRoaXMuZW5jb2RpbmcgPSBudWxsO1xuICBpZiAob3B0aW9ucy5lbmNvZGluZykge1xuICAgIGlmICghU3RyaW5nRGVjb2RlcikgU3RyaW5nRGVjb2RlciA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyLycpLlN0cmluZ0RlY29kZXI7XG4gICAgdGhpcy5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIob3B0aW9ucy5lbmNvZGluZyk7XG4gICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuZW5jb2Rpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gUmVhZGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWFkYWJsZSkpIHJldHVybiBuZXcgUmVhZGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeVxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5yZWFkID09PSAnZnVuY3Rpb24nKSB0aGlzLl9yZWFkID0gb3B0aW9ucy5yZWFkO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHRoaXMuX2Rlc3Ryb3kgPSBvcHRpb25zLmRlc3Ryb3k7XG4gIH1cblxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwgJ2Rlc3Ryb3llZCcsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgLy8gd2UgaWdub3JlIHRoZSB2YWx1ZSBpZiB0aGUgc3RyZWFtXG4gICAgLy8gaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldFxuICAgIGlmICghdGhpcy5fcmVhZGFibGVTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHlcbiAgICAvLyBtYW5hZ2luZyBkZXN0cm95ZWRcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlO1xuICB9XG59KTtcblxuUmVhZGFibGUucHJvdG90eXBlLmRlc3Ryb3kgPSBkZXN0cm95SW1wbC5kZXN0cm95O1xuUmVhZGFibGUucHJvdG90eXBlLl91bmRlc3Ryb3kgPSBkZXN0cm95SW1wbC51bmRlc3Ryb3k7XG5SZWFkYWJsZS5wcm90b3R5cGUuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAoZXJyLCBjYikge1xuICB0aGlzLnB1c2gobnVsbCk7XG4gIGNiKGVycik7XG59O1xuXG4vLyBNYW51YWxseSBzaG92ZSBzb21ldGhpbmcgaW50byB0aGUgcmVhZCgpIGJ1ZmZlci5cbi8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBoaWdoV2F0ZXJNYXJrIGhhcyBub3QgYmVlbiBoaXQgeWV0LFxuLy8gc2ltaWxhciB0byBob3cgV3JpdGFibGUud3JpdGUoKSByZXR1cm5zIHRydWUgaWYgeW91IHNob3VsZFxuLy8gd3JpdGUoKSBzb21lIG1vcmUuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHNraXBDaHVua0NoZWNrO1xuXG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuY29kaW5nIHx8IHN0YXRlLmRlZmF1bHRFbmNvZGluZztcbiAgICAgIGlmIChlbmNvZGluZyAhPT0gc3RhdGUuZW5jb2RpbmcpIHtcbiAgICAgICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgICBlbmNvZGluZyA9ICcnO1xuICAgICAgfVxuICAgICAgc2tpcENodW5rQ2hlY2sgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBza2lwQ2h1bmtDaGVjayA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBjaHVuaywgZW5jb2RpbmcsIGZhbHNlLCBza2lwQ2h1bmtDaGVjayk7XG59O1xuXG4vLyBVbnNoaWZ0IHNob3VsZCAqYWx3YXlzKiBiZSBzb21ldGhpbmcgZGlyZWN0bHkgb3V0IG9mIHJlYWQoKVxuUmVhZGFibGUucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgY2h1bmssIG51bGwsIHRydWUsIGZhbHNlKTtcbn07XG5cbmZ1bmN0aW9uIHJlYWRhYmxlQWRkQ2h1bmsoc3RyZWFtLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQsIHNraXBDaHVua0NoZWNrKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGVyO1xuICAgIGlmICghc2tpcENodW5rQ2hlY2spIGVyID0gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuayk7XG4gICAgaWYgKGVyKSB7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rICYmIGNodW5rLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICh0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmICFzdGF0ZS5vYmplY3RNb2RlICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihjaHVuaykgIT09IEJ1ZmZlci5wcm90b3R5cGUpIHtcbiAgICAgICAgY2h1bmsgPSBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFkZFRvRnJvbnQpIHtcbiAgICAgICAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIHN0cmVhbS5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignc3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnQnKSk7ZWxzZSBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgdHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmVuZGVkKSB7XG4gICAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignc3RyZWFtLnB1c2goKSBhZnRlciBFT0YnKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFlbmNvZGluZykge1xuICAgICAgICAgIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG4gICAgICAgICAgaWYgKHN0YXRlLm9iamVjdE1vZGUgfHwgY2h1bmsubGVuZ3RoICE9PSAwKSBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZmFsc2UpO2Vsc2UgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghYWRkVG9Gcm9udCkge1xuICAgICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkTW9yZURhdGEoc3RhdGUpO1xufVxuXG5mdW5jdGlvbiBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgYWRkVG9Gcm9udCkge1xuICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLnN5bmMpIHtcbiAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGNodW5rKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB1cGRhdGUgdGhlIGJ1ZmZlciBpbmZvLlxuICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICBpZiAoYWRkVG9Gcm9udCkgc3RhdGUuYnVmZmVyLnVuc2hpZnQoY2h1bmspO2Vsc2Ugc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuXG4gICAgaWYgKHN0YXRlLm5lZWRSZWFkYWJsZSkgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG4gIH1cbiAgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKTtcbn1cblxuZnVuY3Rpb24gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuaykge1xuICB2YXIgZXI7XG4gIGlmICghX2lzVWludDhBcnJheShjaHVuaykgJiYgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cbiAgcmV0dXJuIGVyO1xufVxuXG4vLyBpZiBpdCdzIHBhc3QgdGhlIGhpZ2ggd2F0ZXIgbWFyaywgd2UgY2FuIHB1c2ggaW4gc29tZSBtb3JlLlxuLy8gQWxzbywgaWYgd2UgaGF2ZSBubyBkYXRhIHlldCwgd2UgY2FuIHN0YW5kIHNvbWVcbi8vIG1vcmUgYnl0ZXMuICBUaGlzIGlzIHRvIHdvcmsgYXJvdW5kIGNhc2VzIHdoZXJlIGh3bT0wLFxuLy8gc3VjaCBhcyB0aGUgcmVwbC4gIEFsc28sIGlmIHRoZSBwdXNoKCkgdHJpZ2dlcmVkIGFcbi8vIHJlYWRhYmxlIGV2ZW50LCBhbmQgdGhlIHVzZXIgY2FsbGVkIHJlYWQobGFyZ2VOdW1iZXIpIHN1Y2ggdGhhdFxuLy8gbmVlZFJlYWRhYmxlIHdhcyBzZXQsIHRoZW4gd2Ugb3VnaHQgdG8gcHVzaCBtb3JlLCBzbyB0aGF0IGFub3RoZXJcbi8vICdyZWFkYWJsZScgZXZlbnQgd2lsbCBiZSB0cmlnZ2VyZWQuXG5mdW5jdGlvbiBuZWVkTW9yZURhdGEoc3RhdGUpIHtcbiAgcmV0dXJuICFzdGF0ZS5lbmRlZCAmJiAoc3RhdGUubmVlZFJlYWRhYmxlIHx8IHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmsgfHwgc3RhdGUubGVuZ3RoID09PSAwKTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLmlzUGF1c2VkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID09PSBmYWxzZTtcbn07XG5cbi8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuUmVhZGFibGUucHJvdG90eXBlLnNldEVuY29kaW5nID0gZnVuY3Rpb24gKGVuYykge1xuICBpZiAoIVN0cmluZ0RlY29kZXIpIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihlbmMpO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nID0gZW5jO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIERvbid0IHJhaXNlIHRoZSBod20gPiA4TUJcbnZhciBNQVhfSFdNID0gMHg4MDAwMDA7XG5mdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKSB7XG4gIGlmIChuID49IE1BWF9IV00pIHtcbiAgICBuID0gTUFYX0hXTTtcbiAgfSBlbHNlIHtcbiAgICAvLyBHZXQgdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyIHRvIHByZXZlbnQgaW5jcmVhc2luZyBod20gZXhjZXNzaXZlbHkgaW5cbiAgICAvLyB0aW55IGFtb3VudHNcbiAgICBuLS07XG4gICAgbiB8PSBuID4+PiAxO1xuICAgIG4gfD0gbiA+Pj4gMjtcbiAgICBuIHw9IG4gPj4+IDQ7XG4gICAgbiB8PSBuID4+PiA4O1xuICAgIG4gfD0gbiA+Pj4gMTY7XG4gICAgbisrO1xuICB9XG4gIHJldHVybiBuO1xufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKG4gPD0gMCB8fCBzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpIHJldHVybiAwO1xuICBpZiAoc3RhdGUub2JqZWN0TW9kZSkgcmV0dXJuIDE7XG4gIGlmIChuICE9PSBuKSB7XG4gICAgLy8gT25seSBmbG93IG9uZSBidWZmZXIgYXQgYSB0aW1lXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoKSByZXR1cm4gc3RhdGUuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGg7ZWxzZSByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICB9XG4gIC8vIElmIHdlJ3JlIGFza2luZyBmb3IgbW9yZSB0aGFuIHRoZSBjdXJyZW50IGh3bSwgdGhlbiByYWlzZSB0aGUgaHdtLlxuICBpZiAobiA+IHN0YXRlLmhpZ2hXYXRlck1hcmspIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKTtcbiAgaWYgKG4gPD0gc3RhdGUubGVuZ3RoKSByZXR1cm4gbjtcbiAgLy8gRG9uJ3QgaGF2ZSBlbm91Z2hcbiAgaWYgKCFzdGF0ZS5lbmRlZCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbn1cblxuLy8geW91IGNhbiBvdmVycmlkZSBlaXRoZXIgdGhpcyBtZXRob2QsIG9yIHRoZSBhc3luYyBfcmVhZChuKSBiZWxvdy5cblJlYWRhYmxlLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgZGVidWcoJ3JlYWQnLCBuKTtcbiAgbiA9IHBhcnNlSW50KG4sIDEwKTtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIG5PcmlnID0gbjtcblxuICBpZiAobiAhPT0gMCkgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG5cbiAgLy8gaWYgd2UncmUgZG9pbmcgcmVhZCgwKSB0byB0cmlnZ2VyIGEgcmVhZGFibGUgZXZlbnQsIGJ1dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYSBidW5jaCBvZiBkYXRhIGluIHRoZSBidWZmZXIsIHRoZW4ganVzdCB0cmlnZ2VyXG4gIC8vIHRoZSAncmVhZGFibGUnIGV2ZW50IGFuZCBtb3ZlIG9uLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5uZWVkUmVhZGFibGUgJiYgKHN0YXRlLmxlbmd0aCA+PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmVuZGVkKSkge1xuICAgIGRlYnVnKCdyZWFkOiBlbWl0UmVhZGFibGUnLCBzdGF0ZS5sZW5ndGgsIHN0YXRlLmVuZGVkKTtcbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSBlbmRSZWFkYWJsZSh0aGlzKTtlbHNlIGVtaXRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIG4gPSBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKTtcblxuICAvLyBpZiB3ZSd2ZSBlbmRlZCwgYW5kIHdlJ3JlIG5vdyBjbGVhciwgdGhlbiBmaW5pc2ggaXQgdXAuXG4gIGlmIChuID09PSAwICYmIHN0YXRlLmVuZGVkKSB7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBbGwgdGhlIGFjdHVhbCBjaHVuayBnZW5lcmF0aW9uIGxvZ2ljIG5lZWRzIHRvIGJlXG4gIC8vICpiZWxvdyogdGhlIGNhbGwgdG8gX3JlYWQuICBUaGUgcmVhc29uIGlzIHRoYXQgaW4gY2VydGFpblxuICAvLyBzeW50aGV0aWMgc3RyZWFtIGNhc2VzLCBzdWNoIGFzIHBhc3N0aHJvdWdoIHN0cmVhbXMsIF9yZWFkXG4gIC8vIG1heSBiZSBhIGNvbXBsZXRlbHkgc3luY2hyb25vdXMgb3BlcmF0aW9uIHdoaWNoIG1heSBjaGFuZ2VcbiAgLy8gdGhlIHN0YXRlIG9mIHRoZSByZWFkIGJ1ZmZlciwgcHJvdmlkaW5nIGVub3VnaCBkYXRhIHdoZW5cbiAgLy8gYmVmb3JlIHRoZXJlIHdhcyAqbm90KiBlbm91Z2guXG4gIC8vXG4gIC8vIFNvLCB0aGUgc3RlcHMgYXJlOlxuICAvLyAxLiBGaWd1cmUgb3V0IHdoYXQgdGhlIHN0YXRlIG9mIHRoaW5ncyB3aWxsIGJlIGFmdGVyIHdlIGRvXG4gIC8vIGEgcmVhZCBmcm9tIHRoZSBidWZmZXIuXG4gIC8vXG4gIC8vIDIuIElmIHRoYXQgcmVzdWx0aW5nIHN0YXRlIHdpbGwgdHJpZ2dlciBhIF9yZWFkLCB0aGVuIGNhbGwgX3JlYWQuXG4gIC8vIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBhc3luY2hyb25vdXMsIG9yIHN5bmNocm9ub3VzLiAgWWVzLCBpdCBpc1xuICAvLyBkZWVwbHkgdWdseSB0byB3cml0ZSBBUElzIHRoaXMgd2F5LCBidXQgdGhhdCBzdGlsbCBkb2Vzbid0IG1lYW5cbiAgLy8gdGhhdCB0aGUgUmVhZGFibGUgY2xhc3Mgc2hvdWxkIGJlaGF2ZSBpbXByb3Blcmx5LCBhcyBzdHJlYW1zIGFyZVxuICAvLyBkZXNpZ25lZCB0byBiZSBzeW5jL2FzeW5jIGFnbm9zdGljLlxuICAvLyBUYWtlIG5vdGUgaWYgdGhlIF9yZWFkIGNhbGwgaXMgc3luYyBvciBhc3luYyAoaWUsIGlmIHRoZSByZWFkIGNhbGxcbiAgLy8gaGFzIHJldHVybmVkIHlldCksIHNvIHRoYXQgd2Uga25vdyB3aGV0aGVyIG9yIG5vdCBpdCdzIHNhZmUgdG8gZW1pdFxuICAvLyAncmVhZGFibGUnIGV0Yy5cbiAgLy9cbiAgLy8gMy4gQWN0dWFsbHkgcHVsbCB0aGUgcmVxdWVzdGVkIGNodW5rcyBvdXQgb2YgdGhlIGJ1ZmZlciBhbmQgcmV0dXJuLlxuXG4gIC8vIGlmIHdlIG5lZWQgYSByZWFkYWJsZSBldmVudCwgdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWUgcmVhZGluZy5cbiAgdmFyIGRvUmVhZCA9IHN0YXRlLm5lZWRSZWFkYWJsZTtcbiAgZGVidWcoJ25lZWQgcmVhZGFibGUnLCBkb1JlYWQpO1xuXG4gIC8vIGlmIHdlIGN1cnJlbnRseSBoYXZlIGxlc3MgdGhhbiB0aGUgaGlnaFdhdGVyTWFyaywgdGhlbiBhbHNvIHJlYWQgc29tZVxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwIHx8IHN0YXRlLmxlbmd0aCAtIG4gPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZG9SZWFkID0gdHJ1ZTtcbiAgICBkZWJ1ZygnbGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsnLCBkb1JlYWQpO1xuICB9XG5cbiAgLy8gaG93ZXZlciwgaWYgd2UndmUgZW5kZWQsIHRoZW4gdGhlcmUncyBubyBwb2ludCwgYW5kIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LlxuICBpZiAoc3RhdGUuZW5kZWQgfHwgc3RhdGUucmVhZGluZykge1xuICAgIGRvUmVhZCA9IGZhbHNlO1xuICAgIGRlYnVnKCdyZWFkaW5nIG9yIGVuZGVkJywgZG9SZWFkKTtcbiAgfSBlbHNlIGlmIChkb1JlYWQpIHtcbiAgICBkZWJ1ZygnZG8gcmVhZCcpO1xuICAgIHN0YXRlLnJlYWRpbmcgPSB0cnVlO1xuICAgIHN0YXRlLnN5bmMgPSB0cnVlO1xuICAgIC8vIGlmIHRoZSBsZW5ndGggaXMgY3VycmVudGx5IHplcm8sIHRoZW4gd2UgKm5lZWQqIGEgcmVhZGFibGUgZXZlbnQuXG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAvLyBjYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdGhpcy5fcmVhZChzdGF0ZS5oaWdoV2F0ZXJNYXJrKTtcbiAgICBzdGF0ZS5zeW5jID0gZmFsc2U7XG4gICAgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgICAvLyBhbmQgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBob3cgbXVjaCBkYXRhIHdlIGNhbiByZXR1cm4gdG8gdGhlIHVzZXIuXG4gICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuICB9XG5cbiAgdmFyIHJldDtcbiAgaWYgKG4gPiAwKSByZXQgPSBmcm9tTGlzdChuLCBzdGF0ZSk7ZWxzZSByZXQgPSBudWxsO1xuXG4gIGlmIChyZXQgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIG4gPSAwO1xuICB9IGVsc2Uge1xuICAgIHN0YXRlLmxlbmd0aCAtPSBuO1xuICB9XG5cbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIElmIHdlIGhhdmUgbm90aGluZyBpbiB0aGUgYnVmZmVyLCB0aGVuIHdlIHdhbnQgdG8ga25vd1xuICAgIC8vIGFzIHNvb24gYXMgd2UgKmRvKiBnZXQgc29tZXRoaW5nIGludG8gdGhlIGJ1ZmZlci5cbiAgICBpZiAoIXN0YXRlLmVuZGVkKSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gICAgLy8gSWYgd2UgdHJpZWQgdG8gcmVhZCgpIHBhc3QgdGhlIEVPRiwgdGhlbiBlbWl0IGVuZCBvbiB0aGUgbmV4dCB0aWNrLlxuICAgIGlmIChuT3JpZyAhPT0gbiAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7XG4gIH1cblxuICBpZiAocmV0ICE9PSBudWxsKSB0aGlzLmVtaXQoJ2RhdGEnLCByZXQpO1xuXG4gIHJldHVybiByZXQ7XG59O1xuXG5mdW5jdGlvbiBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmVuZGVkKSByZXR1cm47XG4gIGlmIChzdGF0ZS5kZWNvZGVyKSB7XG4gICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSB7XG4gICAgICBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG4gICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgfVxuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcblxuICAvLyBlbWl0ICdyZWFkYWJsZScgbm93IHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHBpY2tlZCB1cC5cbiAgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG59XG5cbi8vIERvbid0IGVtaXQgcmVhZGFibGUgcmlnaHQgYXdheSBpbiBzeW5jIG1vZGUsIGJlY2F1c2UgdGhpcyBjYW4gdHJpZ2dlclxuLy8gYW5vdGhlciByZWFkKCkgY2FsbCA9PiBzdGFjayBvdmVyZmxvdy4gIFRoaXMgd2F5LCBpdCBtaWdodCB0cmlnZ2VyXG4vLyBhIG5leHRUaWNrIHJlY3Vyc2lvbiB3YXJuaW5nLCBidXQgdGhhdCdzIG5vdCBzbyBiYWQuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgc3RhdGUubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIGlmICghc3RhdGUuZW1pdHRlZFJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ2VtaXRSZWFkYWJsZScsIHN0YXRlLmZsb3dpbmcpO1xuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgaWYgKHN0YXRlLnN5bmMpIHBuYS5uZXh0VGljayhlbWl0UmVhZGFibGVfLCBzdHJlYW0pO2Vsc2UgZW1pdFJlYWRhYmxlXyhzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIGRlYnVnKCdlbWl0IHJlYWRhYmxlJyk7XG4gIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICBmbG93KHN0cmVhbSk7XG59XG5cbi8vIGF0IHRoaXMgcG9pbnQsIHRoZSB1c2VyIGhhcyBwcmVzdW1hYmx5IHNlZW4gdGhlICdyZWFkYWJsZScgZXZlbnQsXG4vLyBhbmQgY2FsbGVkIHJlYWQoKSB0byBjb25zdW1lIHNvbWUgZGF0YS4gIHRoYXQgbWF5IGhhdmUgdHJpZ2dlcmVkXG4vLyBpbiB0dXJuIGFub3RoZXIgX3JlYWQobikgY2FsbCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nID0gdHJ1ZSBpZlxuLy8gaXQncyBpbiBwcm9ncmVzcy5cbi8vIEhvd2V2ZXIsIGlmIHdlJ3JlIG5vdCBlbmRlZCwgb3IgcmVhZGluZywgYW5kIHRoZSBsZW5ndGggPCBod20sXG4vLyB0aGVuIGdvIGFoZWFkIGFuZCB0cnkgdG8gcmVhZCBzb21lIG1vcmUgcHJlZW1wdGl2ZWx5LlxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZ01vcmUpIHtcbiAgICBzdGF0ZS5yZWFkaW5nTW9yZSA9IHRydWU7XG4gICAgcG5hLm5leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIHdoaWxlICghc3RhdGUucmVhZGluZyAmJiAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRlYnVnKCdtYXliZVJlYWRNb3JlIHJlYWQgMCcpO1xuICAgIHN0cmVhbS5yZWFkKDApO1xuICAgIGlmIChsZW4gPT09IHN0YXRlLmxlbmd0aClcbiAgICAgIC8vIGRpZG4ndCBnZXQgYW55IGRhdGEsIHN0b3Agc3Bpbm5pbmcuXG4gICAgICBicmVhaztlbHNlIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgfVxuICBzdGF0ZS5yZWFkaW5nTW9yZSA9IGZhbHNlO1xufVxuXG4vLyBhYnN0cmFjdCBtZXRob2QuICB0byBiZSBvdmVycmlkZGVuIGluIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyBjYWxsIGNiKGVyLCBkYXRhKSB3aGVyZSBkYXRhIGlzIDw9IG4gaW4gbGVuZ3RoLlxuLy8gZm9yIHZpcnR1YWwgKG5vbi1zdHJpbmcsIG5vbi1idWZmZXIpIHN0cmVhbXMsIFwibGVuZ3RoXCIgaXMgc29tZXdoYXRcbi8vIGFyYml0cmFyeSwgYW5kIHBlcmhhcHMgbm90IHZlcnkgbWVhbmluZ2Z1bC5cblJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ19yZWFkKCkgaXMgbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuUmVhZGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoZGVzdCwgcGlwZU9wdHMpIHtcbiAgdmFyIHNyYyA9IHRoaXM7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgc3dpdGNoIChzdGF0ZS5waXBlc0NvdW50KSB7XG4gICAgY2FzZSAwOlxuICAgICAgc3RhdGUucGlwZXMgPSBkZXN0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxOlxuICAgICAgc3RhdGUucGlwZXMgPSBbc3RhdGUucGlwZXMsIGRlc3RdO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHN0YXRlLnBpcGVzLnB1c2goZGVzdCk7XG4gICAgICBicmVhaztcbiAgfVxuICBzdGF0ZS5waXBlc0NvdW50ICs9IDE7XG4gIGRlYnVnKCdwaXBlIGNvdW50PSVkIG9wdHM9JWonLCBzdGF0ZS5waXBlc0NvdW50LCBwaXBlT3B0cyk7XG5cbiAgdmFyIGRvRW5kID0gKCFwaXBlT3B0cyB8fCBwaXBlT3B0cy5lbmQgIT09IGZhbHNlKSAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZG91dCAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZGVycjtcblxuICB2YXIgZW5kRm4gPSBkb0VuZCA/IG9uZW5kIDogdW5waXBlO1xuICBpZiAoc3RhdGUuZW5kRW1pdHRlZCkgcG5hLm5leHRUaWNrKGVuZEZuKTtlbHNlIHNyYy5vbmNlKCdlbmQnLCBlbmRGbik7XG5cbiAgZGVzdC5vbigndW5waXBlJywgb251bnBpcGUpO1xuICBmdW5jdGlvbiBvbnVucGlwZShyZWFkYWJsZSwgdW5waXBlSW5mbykge1xuICAgIGRlYnVnKCdvbnVucGlwZScpO1xuICAgIGlmIChyZWFkYWJsZSA9PT0gc3JjKSB7XG4gICAgICBpZiAodW5waXBlSW5mbyAmJiB1bnBpcGVJbmZvLmhhc1VucGlwZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHVucGlwZUluZm8uaGFzVW5waXBlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXAoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBkZWJ1Zygnb25lbmQnKTtcbiAgICBkZXN0LmVuZCgpO1xuICB9XG5cbiAgLy8gd2hlbiB0aGUgZGVzdCBkcmFpbnMsIGl0IHJlZHVjZXMgdGhlIGF3YWl0RHJhaW4gY291bnRlclxuICAvLyBvbiB0aGUgc291cmNlLiAgVGhpcyB3b3VsZCBiZSBtb3JlIGVsZWdhbnQgd2l0aCBhIC5vbmNlKClcbiAgLy8gaGFuZGxlciBpbiBmbG93KCksIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIHJlcGVhdGVkbHkgaXNcbiAgLy8gdG9vIHNsb3cuXG4gIHZhciBvbmRyYWluID0gcGlwZU9uRHJhaW4oc3JjKTtcbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcblxuICB2YXIgY2xlYW5lZFVwID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgZGVidWcoJ2NsZWFudXAnKTtcbiAgICAvLyBjbGVhbnVwIGV2ZW50IGhhbmRsZXJzIG9uY2UgdGhlIHBpcGUgaXMgYnJva2VuXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ3VucGlwZScsIG9udW5waXBlKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIHVucGlwZSk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKTtcblxuICAgIGNsZWFuZWRVcCA9IHRydWU7XG5cbiAgICAvLyBpZiB0aGUgcmVhZGVyIGlzIHdhaXRpbmcgZm9yIGEgZHJhaW4gZXZlbnQgZnJvbSB0aGlzXG4gICAgLy8gc3BlY2lmaWMgd3JpdGVyLCB0aGVuIGl0IHdvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHN0YXJ0XG4gICAgLy8gZmxvd2luZyBhZ2Fpbi5cbiAgICAvLyBTbywgaWYgdGhpcyBpcyBhd2FpdGluZyBhIGRyYWluLCB0aGVuIHdlIGp1c3QgY2FsbCBpdCBub3cuXG4gICAgLy8gSWYgd2UgZG9uJ3Qga25vdywgdGhlbiBhc3N1bWUgdGhhdCB3ZSBhcmUgd2FpdGluZyBmb3Igb25lLlxuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluICYmICghZGVzdC5fd3JpdGFibGVTdGF0ZSB8fCBkZXN0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbikpIG9uZHJhaW4oKTtcbiAgfVxuXG4gIC8vIElmIHRoZSB1c2VyIHB1c2hlcyBtb3JlIGRhdGEgd2hpbGUgd2UncmUgd3JpdGluZyB0byBkZXN0IHRoZW4gd2UnbGwgZW5kIHVwXG4gIC8vIGluIG9uZGF0YSBhZ2Fpbi4gSG93ZXZlciwgd2Ugb25seSB3YW50IHRvIGluY3JlYXNlIGF3YWl0RHJhaW4gb25jZSBiZWNhdXNlXG4gIC8vIGRlc3Qgd2lsbCBvbmx5IGVtaXQgb25lICdkcmFpbicgZXZlbnQgZm9yIHRoZSBtdWx0aXBsZSB3cml0ZXMuXG4gIC8vID0+IEludHJvZHVjZSBhIGd1YXJkIG9uIGluY3JlYXNpbmcgYXdhaXREcmFpbi5cbiAgdmFyIGluY3JlYXNlZEF3YWl0RHJhaW4gPSBmYWxzZTtcbiAgc3JjLm9uKCdkYXRhJywgb25kYXRhKTtcbiAgZnVuY3Rpb24gb25kYXRhKGNodW5rKSB7XG4gICAgZGVidWcoJ29uZGF0YScpO1xuICAgIGluY3JlYXNlZEF3YWl0RHJhaW4gPSBmYWxzZTtcbiAgICB2YXIgcmV0ID0gZGVzdC53cml0ZShjaHVuayk7XG4gICAgaWYgKGZhbHNlID09PSByZXQgJiYgIWluY3JlYXNlZEF3YWl0RHJhaW4pIHtcbiAgICAgIC8vIElmIHRoZSB1c2VyIHVucGlwZWQgZHVyaW5nIGBkZXN0LndyaXRlKClgLCBpdCBpcyBwb3NzaWJsZVxuICAgICAgLy8gdG8gZ2V0IHN0dWNrIGluIGEgcGVybWFuZW50bHkgcGF1c2VkIHN0YXRlIGlmIHRoYXQgd3JpdGVcbiAgICAgIC8vIGFsc28gcmV0dXJuZWQgZmFsc2UuXG4gICAgICAvLyA9PiBDaGVjayB3aGV0aGVyIGBkZXN0YCBpcyBzdGlsbCBhIHBpcGluZyBkZXN0aW5hdGlvbi5cbiAgICAgIGlmICgoc3RhdGUucGlwZXNDb3VudCA9PT0gMSAmJiBzdGF0ZS5waXBlcyA9PT0gZGVzdCB8fCBzdGF0ZS5waXBlc0NvdW50ID4gMSAmJiBpbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KSAhPT0gLTEpICYmICFjbGVhbmVkVXApIHtcbiAgICAgICAgZGVidWcoJ2ZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZScsIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKTtcbiAgICAgICAgc3JjLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4rKztcbiAgICAgICAgaW5jcmVhc2VkQXdhaXREcmFpbiA9IHRydWU7XG4gICAgICB9XG4gICAgICBzcmMucGF1c2UoKTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgZGVzdCBoYXMgYW4gZXJyb3IsIHRoZW4gc3RvcCBwaXBpbmcgaW50byBpdC5cbiAgLy8gaG93ZXZlciwgZG9uJ3Qgc3VwcHJlc3MgdGhlIHRocm93aW5nIGJlaGF2aW9yIGZvciB0aGlzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgZGVidWcoJ29uZXJyb3InLCBlcik7XG4gICAgdW5waXBlKCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBpZiAoRUVsaXN0ZW5lckNvdW50KGRlc3QsICdlcnJvcicpID09PSAwKSBkZXN0LmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9XG5cbiAgLy8gTWFrZSBzdXJlIG91ciBlcnJvciBoYW5kbGVyIGlzIGF0dGFjaGVkIGJlZm9yZSB1c2VybGFuZCBvbmVzLlxuICBwcmVwZW5kTGlzdGVuZXIoZGVzdCwgJ2Vycm9yJywgb25lcnJvcik7XG5cbiAgLy8gQm90aCBjbG9zZSBhbmQgZmluaXNoIHNob3VsZCB0cmlnZ2VyIHVucGlwZSwgYnV0IG9ubHkgb25jZS5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdjbG9zZScsIG9uY2xvc2UpO1xuICBmdW5jdGlvbiBvbmZpbmlzaCgpIHtcbiAgICBkZWJ1Zygnb25maW5pc2gnKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnZmluaXNoJywgb25maW5pc2gpO1xuXG4gIGZ1bmN0aW9uIHVucGlwZSgpIHtcbiAgICBkZWJ1ZygndW5waXBlJyk7XG4gICAgc3JjLnVucGlwZShkZXN0KTtcbiAgfVxuXG4gIC8vIHRlbGwgdGhlIGRlc3QgdGhhdCBpdCdzIGJlaW5nIHBpcGVkIHRvXG4gIGRlc3QuZW1pdCgncGlwZScsIHNyYyk7XG5cbiAgLy8gc3RhcnQgdGhlIGZsb3cgaWYgaXQgaGFzbid0IGJlZW4gc3RhcnRlZCBhbHJlYWR5LlxuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGlwZSByZXN1bWUnKTtcbiAgICBzcmMucmVzdW1lKCk7XG4gIH1cblxuICByZXR1cm4gZGVzdDtcbn07XG5cbmZ1bmN0aW9uIHBpcGVPbkRyYWluKHNyYykge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZTtcbiAgICBkZWJ1ZygncGlwZU9uRHJhaW4nLCBzdGF0ZS5hd2FpdERyYWluKTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbikgc3RhdGUuYXdhaXREcmFpbi0tO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluID09PSAwICYmIEVFbGlzdGVuZXJDb3VudChzcmMsICdkYXRhJykpIHtcbiAgICAgIHN0YXRlLmZsb3dpbmcgPSB0cnVlO1xuICAgICAgZmxvdyhzcmMpO1xuICAgIH1cbiAgfTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uIChkZXN0KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciB1bnBpcGVJbmZvID0geyBoYXNVbnBpcGVkOiBmYWxzZSB9O1xuXG4gIC8vIGlmIHdlJ3JlIG5vdCBwaXBpbmcgYW55d2hlcmUsIHRoZW4gZG8gbm90aGluZy5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDApIHJldHVybiB0aGlzO1xuXG4gIC8vIGp1c3Qgb25lIGRlc3RpbmF0aW9uLiAgbW9zdCBjb21tb24gY2FzZS5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpIHtcbiAgICAvLyBwYXNzZWQgaW4gb25lLCBidXQgaXQncyBub3QgdGhlIHJpZ2h0IG9uZS5cbiAgICBpZiAoZGVzdCAmJiBkZXN0ICE9PSBzdGF0ZS5waXBlcykgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAoIWRlc3QpIGRlc3QgPSBzdGF0ZS5waXBlcztcblxuICAgIC8vIGdvdCBhIG1hdGNoLlxuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgaWYgKGRlc3QpIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcywgdW5waXBlSW5mbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBzbG93IGNhc2UuIG11bHRpcGxlIHBpcGUgZGVzdGluYXRpb25zLlxuXG4gIGlmICghZGVzdCkge1xuICAgIC8vIHJlbW92ZSBhbGwuXG4gICAgdmFyIGRlc3RzID0gc3RhdGUucGlwZXM7XG4gICAgdmFyIGxlbiA9IHN0YXRlLnBpcGVzQ291bnQ7XG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGRlc3RzW2ldLmVtaXQoJ3VucGlwZScsIHRoaXMsIHVucGlwZUluZm8pO1xuICAgIH1yZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHRyeSB0byBmaW5kIHRoZSByaWdodCBvbmUuXG4gIHZhciBpbmRleCA9IGluZGV4T2Yoc3RhdGUucGlwZXMsIGRlc3QpO1xuICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gdGhpcztcblxuICBzdGF0ZS5waXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICBzdGF0ZS5waXBlc0NvdW50IC09IDE7XG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSBzdGF0ZS5waXBlcyA9IHN0YXRlLnBpcGVzWzBdO1xuXG4gIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcywgdW5waXBlSW5mbyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBzZXQgdXAgZGF0YSBldmVudHMgaWYgdGhleSBhcmUgYXNrZWQgZm9yXG4vLyBFbnN1cmUgcmVhZGFibGUgbGlzdGVuZXJzIGV2ZW50dWFsbHkgZ2V0IHNvbWV0aGluZ1xuUmVhZGFibGUucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKGV2LCBmbikge1xuICB2YXIgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIGV2LCBmbik7XG5cbiAgaWYgKGV2ID09PSAnZGF0YScpIHtcbiAgICAvLyBTdGFydCBmbG93aW5nIG9uIG5leHQgdGljayBpZiBzdHJlYW0gaXNuJ3QgZXhwbGljaXRseSBwYXVzZWRcbiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nICE9PSBmYWxzZSkgdGhpcy5yZXN1bWUoKTtcbiAgfSBlbHNlIGlmIChldiA9PT0gJ3JlYWRhYmxlJykge1xuICAgIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmICFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZykge1xuICAgICAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICAgICAgcG5hLm5leHRUaWNrKG5SZWFkaW5nTmV4dFRpY2ssIHRoaXMpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgZW1pdFJlYWRhYmxlKHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuUmVhZGFibGUucHJvdG90eXBlLmFkZExpc3RlbmVyID0gUmVhZGFibGUucHJvdG90eXBlLm9uO1xuXG5mdW5jdGlvbiBuUmVhZGluZ05leHRUaWNrKHNlbGYpIHtcbiAgZGVidWcoJ3JlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCcpO1xuICBzZWxmLnJlYWQoMCk7XG59XG5cbi8vIHBhdXNlKCkgYW5kIHJlc3VtZSgpIGFyZSByZW1uYW50cyBvZiB0aGUgbGVnYWN5IHJlYWRhYmxlIHN0cmVhbSBBUElcbi8vIElmIHRoZSB1c2VyIHVzZXMgdGhlbSwgdGhlbiBzd2l0Y2ggaW50byBvbGQgbW9kZS5cblJlYWRhYmxlLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdyZXN1bWUnKTtcbiAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICByZXN1bWUodGhpcywgc3RhdGUpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gcmVzdW1lKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZXN1bWVTY2hlZHVsZWQpIHtcbiAgICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSB0cnVlO1xuICAgIHBuYS5uZXh0VGljayhyZXN1bWVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXN1bWVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfVxuXG4gIHN0YXRlLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlO1xuICBzdGF0ZS5hd2FpdERyYWluID0gMDtcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpO1xuICBmbG93KHN0cmVhbSk7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5yZWFkaW5nKSBzdHJlYW0ucmVhZCgwKTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICBkZWJ1ZygnY2FsbCBwYXVzZSBmbG93aW5nPSVqJywgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKTtcbiAgaWYgKGZhbHNlICE9PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGF1c2UnKTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ3BhdXNlJyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBmbG93KHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGRlYnVnKCdmbG93Jywgc3RhdGUuZmxvd2luZyk7XG4gIHdoaWxlIChzdGF0ZS5mbG93aW5nICYmIHN0cmVhbS5yZWFkKCkgIT09IG51bGwpIHt9XG59XG5cbi8vIHdyYXAgYW4gb2xkLXN0eWxlIHN0cmVhbSBhcyB0aGUgYXN5bmMgZGF0YSBzb3VyY2UuXG4vLyBUaGlzIGlzICpub3QqIHBhcnQgb2YgdGhlIHJlYWRhYmxlIHN0cmVhbSBpbnRlcmZhY2UuXG4vLyBJdCBpcyBhbiB1Z2x5IHVuZm9ydHVuYXRlIG1lc3Mgb2YgaGlzdG9yeS5cblJlYWRhYmxlLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBwYXVzZWQgPSBmYWxzZTtcblxuICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBlbmQnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhc3RhdGUuZW5kZWQpIHtcbiAgICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSBfdGhpcy5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICBfdGhpcy5wdXNoKG51bGwpO1xuICB9KTtcblxuICBzdHJlYW0ub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBkYXRhJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIpIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG5cbiAgICAvLyBkb24ndCBza2lwIG92ZXIgZmFsc3kgdmFsdWVzIGluIG9iamVjdE1vZGVcbiAgICBpZiAoc3RhdGUub2JqZWN0TW9kZSAmJiAoY2h1bmsgPT09IG51bGwgfHwgY2h1bmsgPT09IHVuZGVmaW5lZCkpIHJldHVybjtlbHNlIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiAoIWNodW5rIHx8ICFjaHVuay5sZW5ndGgpKSByZXR1cm47XG5cbiAgICB2YXIgcmV0ID0gX3RoaXMucHVzaChjaHVuayk7XG4gICAgaWYgKCFyZXQpIHtcbiAgICAgIHBhdXNlZCA9IHRydWU7XG4gICAgICBzdHJlYW0ucGF1c2UoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIHByb3h5IGFsbCB0aGUgb3RoZXIgbWV0aG9kcy5cbiAgLy8gaW1wb3J0YW50IHdoZW4gd3JhcHBpbmcgZmlsdGVycyBhbmQgZHVwbGV4ZXMuXG4gIGZvciAodmFyIGkgaW4gc3RyZWFtKSB7XG4gICAgaWYgKHRoaXNbaV0gPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygc3RyZWFtW2ldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2ldID0gZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBzdHJlYW1bbWV0aG9kXS5hcHBseShzdHJlYW0sIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KGkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHByb3h5IGNlcnRhaW4gaW1wb3J0YW50IGV2ZW50cy5cbiAgZm9yICh2YXIgbiA9IDA7IG4gPCBrUHJveHlFdmVudHMubGVuZ3RoOyBuKyspIHtcbiAgICBzdHJlYW0ub24oa1Byb3h5RXZlbnRzW25dLCB0aGlzLmVtaXQuYmluZCh0aGlzLCBrUHJveHlFdmVudHNbbl0pKTtcbiAgfVxuXG4gIC8vIHdoZW4gd2UgdHJ5IHRvIGNvbnN1bWUgc29tZSBtb3JlIGJ5dGVzLCBzaW1wbHkgdW5wYXVzZSB0aGVcbiAgLy8gdW5kZXJseWluZyBzdHJlYW0uXG4gIHRoaXMuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICAgIGRlYnVnKCd3cmFwcGVkIF9yZWFkJywgbik7XG4gICAgaWYgKHBhdXNlZCkge1xuICAgICAgcGF1c2VkID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwgJ3JlYWRhYmxlSGlnaFdhdGVyTWFyaycsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgfVxufSk7XG5cbi8vIGV4cG9zZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS5cblJlYWRhYmxlLl9mcm9tTGlzdCA9IGZyb21MaXN0O1xuXG4vLyBQbHVjayBvZmYgbiBieXRlcyBmcm9tIGFuIGFycmF5IG9mIGJ1ZmZlcnMuXG4vLyBMZW5ndGggaXMgdGhlIGNvbWJpbmVkIGxlbmd0aHMgb2YgYWxsIHRoZSBidWZmZXJzIGluIHRoZSBsaXN0LlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBmcm9tTGlzdChuLCBzdGF0ZSkge1xuICAvLyBub3RoaW5nIGJ1ZmZlcmVkXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gIHZhciByZXQ7XG4gIGlmIChzdGF0ZS5vYmplY3RNb2RlKSByZXQgPSBzdGF0ZS5idWZmZXIuc2hpZnQoKTtlbHNlIGlmICghbiB8fCBuID49IHN0YXRlLmxlbmd0aCkge1xuICAgIC8vIHJlYWQgaXQgYWxsLCB0cnVuY2F0ZSB0aGUgbGlzdFxuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSByZXQgPSBzdGF0ZS5idWZmZXIuam9pbignJyk7ZWxzZSBpZiAoc3RhdGUuYnVmZmVyLmxlbmd0aCA9PT0gMSkgcmV0ID0gc3RhdGUuYnVmZmVyLmhlYWQuZGF0YTtlbHNlIHJldCA9IHN0YXRlLmJ1ZmZlci5jb25jYXQoc3RhdGUubGVuZ3RoKTtcbiAgICBzdGF0ZS5idWZmZXIuY2xlYXIoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIHBhcnQgb2YgbGlzdFxuICAgIHJldCA9IGZyb21MaXN0UGFydGlhbChuLCBzdGF0ZS5idWZmZXIsIHN0YXRlLmRlY29kZXIpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gRXh0cmFjdHMgb25seSBlbm91Z2ggYnVmZmVyZWQgZGF0YSB0byBzYXRpc2Z5IHRoZSBhbW91bnQgcmVxdWVzdGVkLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBmcm9tTGlzdFBhcnRpYWwobiwgbGlzdCwgaGFzU3RyaW5ncykge1xuICB2YXIgcmV0O1xuICBpZiAobiA8IGxpc3QuaGVhZC5kYXRhLmxlbmd0aCkge1xuICAgIC8vIHNsaWNlIGlzIHRoZSBzYW1lIGZvciBidWZmZXJzIGFuZCBzdHJpbmdzXG4gICAgcmV0ID0gbGlzdC5oZWFkLmRhdGEuc2xpY2UoMCwgbik7XG4gICAgbGlzdC5oZWFkLmRhdGEgPSBsaXN0LmhlYWQuZGF0YS5zbGljZShuKTtcbiAgfSBlbHNlIGlmIChuID09PSBsaXN0LmhlYWQuZGF0YS5sZW5ndGgpIHtcbiAgICAvLyBmaXJzdCBjaHVuayBpcyBhIHBlcmZlY3QgbWF0Y2hcbiAgICByZXQgPSBsaXN0LnNoaWZ0KCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVzdWx0IHNwYW5zIG1vcmUgdGhhbiBvbmUgYnVmZmVyXG4gICAgcmV0ID0gaGFzU3RyaW5ncyA/IGNvcHlGcm9tQnVmZmVyU3RyaW5nKG4sIGxpc3QpIDogY29weUZyb21CdWZmZXIobiwgbGlzdCk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gQ29waWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxpc3Qgb2YgYnVmZmVyZWQgZGF0YVxuLy8gY2h1bmtzLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBjb3B5RnJvbUJ1ZmZlclN0cmluZyhuLCBsaXN0KSB7XG4gIHZhciBwID0gbGlzdC5oZWFkO1xuICB2YXIgYyA9IDE7XG4gIHZhciByZXQgPSBwLmRhdGE7XG4gIG4gLT0gcmV0Lmxlbmd0aDtcbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICB2YXIgc3RyID0gcC5kYXRhO1xuICAgIHZhciBuYiA9IG4gPiBzdHIubGVuZ3RoID8gc3RyLmxlbmd0aCA6IG47XG4gICAgaWYgKG5iID09PSBzdHIubGVuZ3RoKSByZXQgKz0gc3RyO2Vsc2UgcmV0ICs9IHN0ci5zbGljZSgwLCBuKTtcbiAgICBuIC09IG5iO1xuICAgIGlmIChuID09PSAwKSB7XG4gICAgICBpZiAobmIgPT09IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgKytjO1xuICAgICAgICBpZiAocC5uZXh0KSBsaXN0LmhlYWQgPSBwLm5leHQ7ZWxzZSBsaXN0LmhlYWQgPSBsaXN0LnRhaWwgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGlzdC5oZWFkID0gcDtcbiAgICAgICAgcC5kYXRhID0gc3RyLnNsaWNlKG5iKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICArK2M7XG4gIH1cbiAgbGlzdC5sZW5ndGggLT0gYztcbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gQ29waWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBieXRlcyBmcm9tIHRoZSBsaXN0IG9mIGJ1ZmZlcmVkIGRhdGEgY2h1bmtzLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBjb3B5RnJvbUJ1ZmZlcihuLCBsaXN0KSB7XG4gIHZhciByZXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobik7XG4gIHZhciBwID0gbGlzdC5oZWFkO1xuICB2YXIgYyA9IDE7XG4gIHAuZGF0YS5jb3B5KHJldCk7XG4gIG4gLT0gcC5kYXRhLmxlbmd0aDtcbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICB2YXIgYnVmID0gcC5kYXRhO1xuICAgIHZhciBuYiA9IG4gPiBidWYubGVuZ3RoID8gYnVmLmxlbmd0aCA6IG47XG4gICAgYnVmLmNvcHkocmV0LCByZXQubGVuZ3RoIC0gbiwgMCwgbmIpO1xuICAgIG4gLT0gbmI7XG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIGlmIChuYiA9PT0gYnVmLmxlbmd0aCkge1xuICAgICAgICArK2M7XG4gICAgICAgIGlmIChwLm5leHQpIGxpc3QuaGVhZCA9IHAubmV4dDtlbHNlIGxpc3QuaGVhZCA9IGxpc3QudGFpbCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0LmhlYWQgPSBwO1xuICAgICAgICBwLmRhdGEgPSBidWYuc2xpY2UobmIpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgICsrYztcbiAgfVxuICBsaXN0Lmxlbmd0aCAtPSBjO1xuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuXG4gIC8vIElmIHdlIGdldCBoZXJlIGJlZm9yZSBjb25zdW1pbmcgYWxsIHRoZSBieXRlcywgdGhlbiB0aGF0IGlzIGFcbiAgLy8gYnVnIGluIG5vZGUuICBTaG91bGQgbmV2ZXIgaGFwcGVuLlxuICBpZiAoc3RhdGUubGVuZ3RoID4gMCkgdGhyb3cgbmV3IEVycm9yKCdcImVuZFJlYWRhYmxlKClcIiBjYWxsZWQgb24gbm9uLWVtcHR5IHN0cmVhbScpO1xuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCkge1xuICAgIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgICBwbmEubmV4dFRpY2soZW5kUmVhZGFibGVOVCwgc3RhdGUsIHN0cmVhbSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGVOVChzdGF0ZSwgc3RyZWFtKSB7XG4gIC8vIENoZWNrIHRoYXQgd2UgZGlkbid0IGdldCBvbmUgbGFzdCB1bnNoaWZ0LlxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKSB7XG4gICAgc3RhdGUuZW5kRW1pdHRlZCA9IHRydWU7XG4gICAgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2VuZCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoeHNbaV0gPT09IHgpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/readable-stream/lib/_stream_readable.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/readable-stream/lib/_stream_transform.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/readable-stream/lib/_stream_transform.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a transform stream is a readable/writable stream where you do\n// something with the data. Sometimes it's called a \"filter\",\n// but that's not a great name for it, since that implies a thing where\n// some bits pass through, and others are simply ignored. (That would\n// be a valid example of a transform, of course.)\n//\n// While the output is causally related to the input, it's not a\n// necessarily symmetric or synchronous transformation. For example,\n// a zlib stream might take multiple plain-text writes(), and then\n// emit a single compressed chunk some time in the future.\n//\n// Here's how this works:\n//\n// The Transform stream has all the aspects of the readable and writable\n// stream classes. When you write(chunk), that calls _write(chunk,cb)\n// internally, and returns false if there's a lot of pending writes\n// buffered up. When you call read(), that calls _read(n) until\n// there's enough pending readable data buffered up.\n//\n// In a transform stream, the written data is placed in a buffer. When\n// _read(n) is called, it transforms the queued up data, calling the\n// buffered _write cb's as it consumes chunks. If consuming a single\n// written chunk would result in multiple output chunks, then the first\n// outputted bit calls the readcb, and subsequent chunks just go into\n// the read buffer, and will cause it to emit 'readable' if necessary.\n//\n// This way, back-pressure is actually determined by the reading side,\n// since _read has to be called to start processing a new chunk. However,\n// a pathological inflate type of transform can cause excessive buffering\n// here. For example, imagine a stream where every byte of input is\n// interpreted as an integer from 0-255, and then results in that many\n// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in\n// 1kb of data being output. In this case, you could write a very small\n// amount of input, and end up with a very large amount of output. In\n// such a pathological inflating mechanism, there'd be no way to tell\n// the system to stop doing the transform. A single 4MB write could\n// cause the system to run out of memory.\n//\n// However, even in such a pathological case, only a single written chunk\n// would be consumed, and then the rest would wait (un-transformed) until\n// the results of the previous transformed chunk were consumed.\n\n\n\nmodule.exports = Transform;\n\nvar Duplex = __webpack_require__(/*! ./_stream_duplex */ \"./node_modules/readable-stream/lib/_stream_duplex.js\");\n\n/*<replacement>*/\nvar util = __webpack_require__(/*! core-util-is */ \"./node_modules/core-util-is/lib/util.js\");\nutil.inherits = __webpack_require__(/*! inherits */ \"./node_modules/inherits/inherits_browser.js\");\n/*</replacement>*/\n\nutil.inherits(Transform, Duplex);\n\nfunction afterTransform(er, data) {\n var ts = this._transformState;\n ts.transforming = false;\n\n var cb = ts.writecb;\n\n if (!cb) {\n return this.emit('error', new Error('write callback called multiple times'));\n }\n\n ts.writechunk = null;\n ts.writecb = null;\n\n if (data != null) // single equals check for both `null` and `undefined`\n this.push(data);\n\n cb(er);\n\n var rs = this._readableState;\n rs.reading = false;\n if (rs.needReadable || rs.length < rs.highWaterMark) {\n this._read(rs.highWaterMark);\n }\n}\n\nfunction Transform(options) {\n if (!(this instanceof Transform)) return new Transform(options);\n\n Duplex.call(this, options);\n\n this._transformState = {\n afterTransform: afterTransform.bind(this),\n needTransform: false,\n transforming: false,\n writecb: null,\n writechunk: null,\n writeencoding: null\n };\n\n // start out asking for a readable event once data is transformed.\n this._readableState.needReadable = true;\n\n // we have implemented the _read method, and done the other things\n // that Readable wants before the first _read call, so unset the\n // sync guard flag.\n this._readableState.sync = false;\n\n if (options) {\n if (typeof options.transform === 'function') this._transform = options.transform;\n\n if (typeof options.flush === 'function') this._flush = options.flush;\n }\n\n // When the writable side finishes, then flush out anything remaining.\n this.on('prefinish', prefinish);\n}\n\nfunction prefinish() {\n var _this = this;\n\n if (typeof this._flush === 'function') {\n this._flush(function (er, data) {\n done(_this, er, data);\n });\n } else {\n done(this, null, null);\n }\n}\n\nTransform.prototype.push = function (chunk, encoding) {\n this._transformState.needTransform = false;\n return Duplex.prototype.push.call(this, chunk, encoding);\n};\n\n// This is the part where you do stuff!\n// override this function in implementation classes.\n// 'chunk' is an input chunk.\n//\n// Call `push(newChunk)` to pass along transformed output\n// to the readable side. You may call 'push' zero or more times.\n//\n// Call `cb(err)` when you are done with this chunk. If you pass\n// an error, then that'll put the hurt on the whole operation. If you\n// never call cb(), then you'll never get another chunk.\nTransform.prototype._transform = function (chunk, encoding, cb) {\n throw new Error('_transform() is not implemented');\n};\n\nTransform.prototype._write = function (chunk, encoding, cb) {\n var ts = this._transformState;\n ts.writecb = cb;\n ts.writechunk = chunk;\n ts.writeencoding = encoding;\n if (!ts.transforming) {\n var rs = this._readableState;\n if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);\n }\n};\n\n// Doesn't matter what the args are here.\n// _transform does all the work.\n// That we got here means that the readable side wants more data.\nTransform.prototype._read = function (n) {\n var ts = this._transformState;\n\n if (ts.writechunk !== null && ts.writecb && !ts.transforming) {\n ts.transforming = true;\n this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);\n } else {\n // mark that we need a transform, so that any data that comes in\n // will get processed, now that we've asked for it.\n ts.needTransform = true;\n }\n};\n\nTransform.prototype._destroy = function (err, cb) {\n var _this2 = this;\n\n Duplex.prototype._destroy.call(this, err, function (err2) {\n cb(err2);\n _this2.emit('close');\n });\n};\n\nfunction done(stream, er, data) {\n if (er) return stream.emit('error', er);\n\n if (data != null) // single equals check for both `null` and `undefined`\n stream.push(data);\n\n // if there's nothing in the write buffer, then that means\n // that nothing more will ever be provided\n if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0');\n\n if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming');\n\n return stream.push(null);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanM/MjdiZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gYSB0cmFuc2Zvcm0gc3RyZWFtIGlzIGEgcmVhZGFibGUvd3JpdGFibGUgc3RyZWFtIHdoZXJlIHlvdSBkb1xuLy8gc29tZXRoaW5nIHdpdGggdGhlIGRhdGEuICBTb21ldGltZXMgaXQncyBjYWxsZWQgYSBcImZpbHRlclwiLFxuLy8gYnV0IHRoYXQncyBub3QgYSBncmVhdCBuYW1lIGZvciBpdCwgc2luY2UgdGhhdCBpbXBsaWVzIGEgdGhpbmcgd2hlcmVcbi8vIHNvbWUgYml0cyBwYXNzIHRocm91Z2gsIGFuZCBvdGhlcnMgYXJlIHNpbXBseSBpZ25vcmVkLiAgKFRoYXQgd291bGRcbi8vIGJlIGEgdmFsaWQgZXhhbXBsZSBvZiBhIHRyYW5zZm9ybSwgb2YgY291cnNlLilcbi8vXG4vLyBXaGlsZSB0aGUgb3V0cHV0IGlzIGNhdXNhbGx5IHJlbGF0ZWQgdG8gdGhlIGlucHV0LCBpdCdzIG5vdCBhXG4vLyBuZWNlc3NhcmlseSBzeW1tZXRyaWMgb3Igc3luY2hyb25vdXMgdHJhbnNmb3JtYXRpb24uICBGb3IgZXhhbXBsZSxcbi8vIGEgemxpYiBzdHJlYW0gbWlnaHQgdGFrZSBtdWx0aXBsZSBwbGFpbi10ZXh0IHdyaXRlcygpLCBhbmQgdGhlblxuLy8gZW1pdCBhIHNpbmdsZSBjb21wcmVzc2VkIGNodW5rIHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlLlxuLy9cbi8vIEhlcmUncyBob3cgdGhpcyB3b3Jrczpcbi8vXG4vLyBUaGUgVHJhbnNmb3JtIHN0cmVhbSBoYXMgYWxsIHRoZSBhc3BlY3RzIG9mIHRoZSByZWFkYWJsZSBhbmQgd3JpdGFibGVcbi8vIHN0cmVhbSBjbGFzc2VzLiAgV2hlbiB5b3Ugd3JpdGUoY2h1bmspLCB0aGF0IGNhbGxzIF93cml0ZShjaHVuayxjYilcbi8vIGludGVybmFsbHksIGFuZCByZXR1cm5zIGZhbHNlIGlmIHRoZXJlJ3MgYSBsb3Qgb2YgcGVuZGluZyB3cml0ZXNcbi8vIGJ1ZmZlcmVkIHVwLiAgV2hlbiB5b3UgY2FsbCByZWFkKCksIHRoYXQgY2FsbHMgX3JlYWQobikgdW50aWxcbi8vIHRoZXJlJ3MgZW5vdWdoIHBlbmRpbmcgcmVhZGFibGUgZGF0YSBidWZmZXJlZCB1cC5cbi8vXG4vLyBJbiBhIHRyYW5zZm9ybSBzdHJlYW0sIHRoZSB3cml0dGVuIGRhdGEgaXMgcGxhY2VkIGluIGEgYnVmZmVyLiAgV2hlblxuLy8gX3JlYWQobikgaXMgY2FsbGVkLCBpdCB0cmFuc2Zvcm1zIHRoZSBxdWV1ZWQgdXAgZGF0YSwgY2FsbGluZyB0aGVcbi8vIGJ1ZmZlcmVkIF93cml0ZSBjYidzIGFzIGl0IGNvbnN1bWVzIGNodW5rcy4gIElmIGNvbnN1bWluZyBhIHNpbmdsZVxuLy8gd3JpdHRlbiBjaHVuayB3b3VsZCByZXN1bHQgaW4gbXVsdGlwbGUgb3V0cHV0IGNodW5rcywgdGhlbiB0aGUgZmlyc3Rcbi8vIG91dHB1dHRlZCBiaXQgY2FsbHMgdGhlIHJlYWRjYiwgYW5kIHN1YnNlcXVlbnQgY2h1bmtzIGp1c3QgZ28gaW50b1xuLy8gdGhlIHJlYWQgYnVmZmVyLCBhbmQgd2lsbCBjYXVzZSBpdCB0byBlbWl0ICdyZWFkYWJsZScgaWYgbmVjZXNzYXJ5LlxuLy9cbi8vIFRoaXMgd2F5LCBiYWNrLXByZXNzdXJlIGlzIGFjdHVhbGx5IGRldGVybWluZWQgYnkgdGhlIHJlYWRpbmcgc2lkZSxcbi8vIHNpbmNlIF9yZWFkIGhhcyB0byBiZSBjYWxsZWQgdG8gc3RhcnQgcHJvY2Vzc2luZyBhIG5ldyBjaHVuay4gIEhvd2V2ZXIsXG4vLyBhIHBhdGhvbG9naWNhbCBpbmZsYXRlIHR5cGUgb2YgdHJhbnNmb3JtIGNhbiBjYXVzZSBleGNlc3NpdmUgYnVmZmVyaW5nXG4vLyBoZXJlLiAgRm9yIGV4YW1wbGUsIGltYWdpbmUgYSBzdHJlYW0gd2hlcmUgZXZlcnkgYnl0ZSBvZiBpbnB1dCBpc1xuLy8gaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlciBmcm9tIDAtMjU1LCBhbmQgdGhlbiByZXN1bHRzIGluIHRoYXQgbWFueVxuLy8gYnl0ZXMgb2Ygb3V0cHV0LiAgV3JpdGluZyB0aGUgNCBieXRlcyB7ZmYsZmYsZmYsZmZ9IHdvdWxkIHJlc3VsdCBpblxuLy8gMWtiIG9mIGRhdGEgYmVpbmcgb3V0cHV0LiAgSW4gdGhpcyBjYXNlLCB5b3UgY291bGQgd3JpdGUgYSB2ZXJ5IHNtYWxsXG4vLyBhbW91bnQgb2YgaW5wdXQsIGFuZCBlbmQgdXAgd2l0aCBhIHZlcnkgbGFyZ2UgYW1vdW50IG9mIG91dHB1dC4gIEluXG4vLyBzdWNoIGEgcGF0aG9sb2dpY2FsIGluZmxhdGluZyBtZWNoYW5pc20sIHRoZXJlJ2QgYmUgbm8gd2F5IHRvIHRlbGxcbi8vIHRoZSBzeXN0ZW0gdG8gc3RvcCBkb2luZyB0aGUgdHJhbnNmb3JtLiAgQSBzaW5nbGUgNE1CIHdyaXRlIGNvdWxkXG4vLyBjYXVzZSB0aGUgc3lzdGVtIHRvIHJ1biBvdXQgb2YgbWVtb3J5LlxuLy9cbi8vIEhvd2V2ZXIsIGV2ZW4gaW4gc3VjaCBhIHBhdGhvbG9naWNhbCBjYXNlLCBvbmx5IGEgc2luZ2xlIHdyaXR0ZW4gY2h1bmtcbi8vIHdvdWxkIGJlIGNvbnN1bWVkLCBhbmQgdGhlbiB0aGUgcmVzdCB3b3VsZCB3YWl0ICh1bi10cmFuc2Zvcm1lZCkgdW50aWxcbi8vIHRoZSByZXN1bHRzIG9mIHRoZSBwcmV2aW91cyB0cmFuc2Zvcm1lZCBjaHVuayB3ZXJlIGNvbnN1bWVkLlxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gVHJhbnNmb3JtO1xuXG52YXIgRHVwbGV4ID0gcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnV0aWwuaW5oZXJpdHMoVHJhbnNmb3JtLCBEdXBsZXgpO1xuXG5mdW5jdGlvbiBhZnRlclRyYW5zZm9ybShlciwgZGF0YSkge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG5cbiAgdmFyIGNiID0gdHMud3JpdGVjYjtcblxuICBpZiAoIWNiKSB7XG4gICAgcmV0dXJuIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ3dyaXRlIGNhbGxiYWNrIGNhbGxlZCBtdWx0aXBsZSB0aW1lcycpKTtcbiAgfVxuXG4gIHRzLndyaXRlY2h1bmsgPSBudWxsO1xuICB0cy53cml0ZWNiID0gbnVsbDtcblxuICBpZiAoZGF0YSAhPSBudWxsKSAvLyBzaW5nbGUgZXF1YWxzIGNoZWNrIGZvciBib3RoIGBudWxsYCBhbmQgYHVuZGVmaW5lZGBcbiAgICB0aGlzLnB1c2goZGF0YSk7XG5cbiAgY2IoZXIpO1xuXG4gIHZhciBycyA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHJzLnJlYWRpbmcgPSBmYWxzZTtcbiAgaWYgKHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgdGhpcy5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBUcmFuc2Zvcm0ob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVHJhbnNmb3JtKSkgcmV0dXJuIG5ldyBUcmFuc2Zvcm0ob3B0aW9ucyk7XG5cbiAgRHVwbGV4LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUgPSB7XG4gICAgYWZ0ZXJUcmFuc2Zvcm06IGFmdGVyVHJhbnNmb3JtLmJpbmQodGhpcyksXG4gICAgbmVlZFRyYW5zZm9ybTogZmFsc2UsXG4gICAgdHJhbnNmb3JtaW5nOiBmYWxzZSxcbiAgICB3cml0ZWNiOiBudWxsLFxuICAgIHdyaXRlY2h1bms6IG51bGwsXG4gICAgd3JpdGVlbmNvZGluZzogbnVsbFxuICB9O1xuXG4gIC8vIHN0YXJ0IG91dCBhc2tpbmcgZm9yIGEgcmVhZGFibGUgZXZlbnQgb25jZSBkYXRhIGlzIHRyYW5zZm9ybWVkLlxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG5cbiAgLy8gd2UgaGF2ZSBpbXBsZW1lbnRlZCB0aGUgX3JlYWQgbWV0aG9kLCBhbmQgZG9uZSB0aGUgb3RoZXIgdGhpbmdzXG4gIC8vIHRoYXQgUmVhZGFibGUgd2FudHMgYmVmb3JlIHRoZSBmaXJzdCBfcmVhZCBjYWxsLCBzbyB1bnNldCB0aGVcbiAgLy8gc3luYyBndWFyZCBmbGFnLlxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLnN5bmMgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHRoaXMuX3RyYW5zZm9ybSA9IG9wdGlvbnMudHJhbnNmb3JtO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZsdXNoID09PSAnZnVuY3Rpb24nKSB0aGlzLl9mbHVzaCA9IG9wdGlvbnMuZmx1c2g7XG4gIH1cblxuICAvLyBXaGVuIHRoZSB3cml0YWJsZSBzaWRlIGZpbmlzaGVzLCB0aGVuIGZsdXNoIG91dCBhbnl0aGluZyByZW1haW5pbmcuXG4gIHRoaXMub24oJ3ByZWZpbmlzaCcsIHByZWZpbmlzaCk7XG59XG5cbmZ1bmN0aW9uIHByZWZpbmlzaCgpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICBpZiAodHlwZW9mIHRoaXMuX2ZsdXNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhpcy5fZmx1c2goZnVuY3Rpb24gKGVyLCBkYXRhKSB7XG4gICAgICBkb25lKF90aGlzLCBlciwgZGF0YSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgZG9uZSh0aGlzLCBudWxsLCBudWxsKTtcbiAgfVxufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlLm5lZWRUcmFuc2Zvcm0gPSBmYWxzZTtcbiAgcmV0dXJuIER1cGxleC5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsIGNodW5rLCBlbmNvZGluZyk7XG59O1xuXG4vLyBUaGlzIGlzIHRoZSBwYXJ0IHdoZXJlIHlvdSBkbyBzdHVmZiFcbi8vIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gaW4gaW1wbGVtZW50YXRpb24gY2xhc3Nlcy5cbi8vICdjaHVuaycgaXMgYW4gaW5wdXQgY2h1bmsuXG4vL1xuLy8gQ2FsbCBgcHVzaChuZXdDaHVuaylgIHRvIHBhc3MgYWxvbmcgdHJhbnNmb3JtZWQgb3V0cHV0XG4vLyB0byB0aGUgcmVhZGFibGUgc2lkZS4gIFlvdSBtYXkgY2FsbCAncHVzaCcgemVybyBvciBtb3JlIHRpbWVzLlxuLy9cbi8vIENhbGwgYGNiKGVycilgIHdoZW4geW91IGFyZSBkb25lIHdpdGggdGhpcyBjaHVuay4gIElmIHlvdSBwYXNzXG4vLyBhbiBlcnJvciwgdGhlbiB0aGF0J2xsIHB1dCB0aGUgaHVydCBvbiB0aGUgd2hvbGUgb3BlcmF0aW9uLiAgSWYgeW91XG4vLyBuZXZlciBjYWxsIGNiKCksIHRoZW4geW91J2xsIG5ldmVyIGdldCBhbm90aGVyIGNodW5rLlxuVHJhbnNmb3JtLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdfdHJhbnNmb3JtKCkgaXMgbm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuICB0cy53cml0ZWNiID0gY2I7XG4gIHRzLndyaXRlY2h1bmsgPSBjaHVuaztcbiAgdHMud3JpdGVlbmNvZGluZyA9IGVuY29kaW5nO1xuICBpZiAoIXRzLnRyYW5zZm9ybWluZykge1xuICAgIHZhciBycyA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKHRzLm5lZWRUcmFuc2Zvcm0gfHwgcnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHRoaXMuX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn07XG5cbi8vIERvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIGFyZ3MgYXJlIGhlcmUuXG4vLyBfdHJhbnNmb3JtIGRvZXMgYWxsIHRoZSB3b3JrLlxuLy8gVGhhdCB3ZSBnb3QgaGVyZSBtZWFucyB0aGF0IHRoZSByZWFkYWJsZSBzaWRlIHdhbnRzIG1vcmUgZGF0YS5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcblxuICBpZiAodHMud3JpdGVjaHVuayAhPT0gbnVsbCAmJiB0cy53cml0ZWNiICYmICF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB0cy50cmFuc2Zvcm1pbmcgPSB0cnVlO1xuICAgIHRoaXMuX3RyYW5zZm9ybSh0cy53cml0ZWNodW5rLCB0cy53cml0ZWVuY29kaW5nLCB0cy5hZnRlclRyYW5zZm9ybSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gbWFyayB0aGF0IHdlIG5lZWQgYSB0cmFuc2Zvcm0sIHNvIHRoYXQgYW55IGRhdGEgdGhhdCBjb21lcyBpblxuICAgIC8vIHdpbGwgZ2V0IHByb2Nlc3NlZCwgbm93IHRoYXQgd2UndmUgYXNrZWQgZm9yIGl0LlxuICAgIHRzLm5lZWRUcmFuc2Zvcm0gPSB0cnVlO1xuICB9XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgRHVwbGV4LnByb3RvdHlwZS5fZGVzdHJveS5jYWxsKHRoaXMsIGVyciwgZnVuY3Rpb24gKGVycjIpIHtcbiAgICBjYihlcnIyKTtcbiAgICBfdGhpczIuZW1pdCgnY2xvc2UnKTtcbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBkb25lKHN0cmVhbSwgZXIsIGRhdGEpIHtcbiAgaWYgKGVyKSByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuXG4gIGlmIChkYXRhICE9IG51bGwpIC8vIHNpbmdsZSBlcXVhbHMgY2hlY2sgZm9yIGJvdGggYG51bGxgIGFuZCBgdW5kZWZpbmVkYFxuICAgIHN0cmVhbS5wdXNoKGRhdGEpO1xuXG4gIC8vIGlmIHRoZXJlJ3Mgbm90aGluZyBpbiB0aGUgd3JpdGUgYnVmZmVyLCB0aGVuIHRoYXQgbWVhbnNcbiAgLy8gdGhhdCBub3RoaW5nIG1vcmUgd2lsbCBldmVyIGJlIHByb3ZpZGVkXG4gIGlmIChzdHJlYW0uX3dyaXRhYmxlU3RhdGUubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ0NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiB3cy5sZW5ndGggIT0gMCcpO1xuXG4gIGlmIChzdHJlYW0uX3RyYW5zZm9ybVN0YXRlLnRyYW5zZm9ybWluZykgdGhyb3cgbmV3IEVycm9yKCdDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gc3RpbGwgdHJhbnNmb3JtaW5nJyk7XG5cbiAgcmV0dXJuIHN0cmVhbS5wdXNoKG51bGwpO1xufSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/readable-stream/lib/_stream_transform.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/readable-stream/lib/_stream_writable.js":
+/*!**************************************************************!*\
+ !*** ./node_modules/readable-stream/lib/_stream_writable.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("/* WEBPACK VAR INJECTION */(function(process, setImmediate, global) {// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// A bit simpler than readable streams.\n// Implement an async ._write(chunk, encoding, cb), and it'll handle all\n// the drain event emission and buffering.\n\n\n\n/*<replacement>*/\n\nvar pna = __webpack_require__(/*! process-nextick-args */ \"./node_modules/process-nextick-args/index.js\");\n/*</replacement>*/\n\nmodule.exports = Writable;\n\n/* <replacement> */\nfunction WriteReq(chunk, encoding, cb) {\n this.chunk = chunk;\n this.encoding = encoding;\n this.callback = cb;\n this.next = null;\n}\n\n// It seems a linked list but it is not\n// there will be only 2 of these for each stream\nfunction CorkedRequest(state) {\n var _this = this;\n\n this.next = null;\n this.entry = null;\n this.finish = function () {\n onCorkedFinish(_this, state);\n };\n}\n/* </replacement> */\n\n/*<replacement>*/\nvar asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick;\n/*</replacement>*/\n\n/*<replacement>*/\nvar Duplex;\n/*</replacement>*/\n\nWritable.WritableState = WritableState;\n\n/*<replacement>*/\nvar util = __webpack_require__(/*! core-util-is */ \"./node_modules/core-util-is/lib/util.js\");\nutil.inherits = __webpack_require__(/*! inherits */ \"./node_modules/inherits/inherits_browser.js\");\n/*</replacement>*/\n\n/*<replacement>*/\nvar internalUtil = {\n deprecate: __webpack_require__(/*! util-deprecate */ \"./node_modules/util-deprecate/browser.js\")\n};\n/*</replacement>*/\n\n/*<replacement>*/\nvar Stream = __webpack_require__(/*! ./internal/streams/stream */ \"./node_modules/readable-stream/lib/internal/streams/stream-browser.js\");\n/*</replacement>*/\n\n/*<replacement>*/\n\nvar Buffer = __webpack_require__(/*! safe-buffer */ \"./node_modules/safe-buffer/index.js\").Buffer;\nvar OurUint8Array = global.Uint8Array || function () {};\nfunction _uint8ArrayToBuffer(chunk) {\n return Buffer.from(chunk);\n}\nfunction _isUint8Array(obj) {\n return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;\n}\n\n/*</replacement>*/\n\nvar destroyImpl = __webpack_require__(/*! ./internal/streams/destroy */ \"./node_modules/readable-stream/lib/internal/streams/destroy.js\");\n\nutil.inherits(Writable, Stream);\n\nfunction nop() {}\n\nfunction WritableState(options, stream) {\n Duplex = Duplex || __webpack_require__(/*! ./_stream_duplex */ \"./node_modules/readable-stream/lib/_stream_duplex.js\");\n\n options = options || {};\n\n // Duplex streams are both readable and writable, but share\n // the same options object.\n // However, some cases require setting options to different\n // values for the readable and the writable sides of the duplex stream.\n // These options can be provided separately as readableXXX and writableXXX.\n var isDuplex = stream instanceof Duplex;\n\n // object stream flag to indicate whether or not this stream\n // contains buffers or objects.\n this.objectMode = !!options.objectMode;\n\n if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode;\n\n // the point at which write() starts returning false\n // Note: 0 is a valid value, means that we always return false if\n // the entire buffer is not flushed immediately on write()\n var hwm = options.highWaterMark;\n var writableHwm = options.writableHighWaterMark;\n var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n\n if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm;\n\n // cast to ints.\n this.highWaterMark = Math.floor(this.highWaterMark);\n\n // if _final has been called\n this.finalCalled = false;\n\n // drain event flag.\n this.needDrain = false;\n // at the start of calling end()\n this.ending = false;\n // when end() has been called, and returned\n this.ended = false;\n // when 'finish' is emitted\n this.finished = false;\n\n // has it been destroyed\n this.destroyed = false;\n\n // should we decode strings into buffers before passing to _write?\n // this is here so that some node-core streams can optimize string\n // handling at a lower level.\n var noDecode = options.decodeStrings === false;\n this.decodeStrings = !noDecode;\n\n // Crypto is kind of old and crusty. Historically, its default string\n // encoding is 'binary' so we have to make this configurable.\n // Everything else in the universe uses 'utf8', though.\n this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n // not an actual buffer we keep track of, but a measurement\n // of how much we're waiting to get pushed to some underlying\n // socket or file.\n this.length = 0;\n\n // a flag to see when we're in the middle of a write.\n this.writing = false;\n\n // when true all writes will be buffered until .uncork() call\n this.corked = 0;\n\n // a flag to be able to tell if the onwrite cb is called immediately,\n // or on a later tick. We set this to true at first, because any\n // actions that shouldn't happen until \"later\" should generally also\n // not happen before the first write call.\n this.sync = true;\n\n // a flag to know if we're processing previously buffered items, which\n // may call the _write() callback in the same tick, so that we don't\n // end up in an overlapped onwrite situation.\n this.bufferProcessing = false;\n\n // the callback that's passed to _write(chunk,cb)\n this.onwrite = function (er) {\n onwrite(stream, er);\n };\n\n // the callback that the user supplies to write(chunk,encoding,cb)\n this.writecb = null;\n\n // the amount that is being written when _write is called.\n this.writelen = 0;\n\n this.bufferedRequest = null;\n this.lastBufferedRequest = null;\n\n // number of pending user-supplied write callbacks\n // this must be 0 before 'finish' can be emitted\n this.pendingcb = 0;\n\n // emit prefinish if the only thing we're waiting for is _write cbs\n // This is relevant for synchronous Transform streams\n this.prefinished = false;\n\n // True if the error was already emitted and should not be thrown again\n this.errorEmitted = false;\n\n // count buffered requests\n this.bufferedRequestCount = 0;\n\n // allocate the first CorkedRequest, there is always\n // one allocated and free to use, and we maintain at most two\n this.corkedRequestsFree = new CorkedRequest(this);\n}\n\nWritableState.prototype.getBuffer = function getBuffer() {\n var current = this.bufferedRequest;\n var out = [];\n while (current) {\n out.push(current);\n current = current.next;\n }\n return out;\n};\n\n(function () {\n try {\n Object.defineProperty(WritableState.prototype, 'buffer', {\n get: internalUtil.deprecate(function () {\n return this.getBuffer();\n }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')\n });\n } catch (_) {}\n})();\n\n// Test _writableState for inheritance to account for Duplex streams,\n// whose prototype chain only points to Readable.\nvar realHasInstance;\nif (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {\n realHasInstance = Function.prototype[Symbol.hasInstance];\n Object.defineProperty(Writable, Symbol.hasInstance, {\n value: function (object) {\n if (realHasInstance.call(this, object)) return true;\n if (this !== Writable) return false;\n\n return object && object._writableState instanceof WritableState;\n }\n });\n} else {\n realHasInstance = function (object) {\n return object instanceof this;\n };\n}\n\nfunction Writable(options) {\n Duplex = Duplex || __webpack_require__(/*! ./_stream_duplex */ \"./node_modules/readable-stream/lib/_stream_duplex.js\");\n\n // Writable ctor is applied to Duplexes, too.\n // `realHasInstance` is necessary because using plain `instanceof`\n // would return false, as no `_writableState` property is attached.\n\n // Trying to use the custom `instanceof` for Writable here will also break the\n // Node.js LazyTransform implementation, which has a non-trivial getter for\n // `_writableState` that would lead to infinite recursion.\n if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {\n return new Writable(options);\n }\n\n this._writableState = new WritableState(options, this);\n\n // legacy.\n this.writable = true;\n\n if (options) {\n if (typeof options.write === 'function') this._write = options.write;\n\n if (typeof options.writev === 'function') this._writev = options.writev;\n\n if (typeof options.destroy === 'function') this._destroy = options.destroy;\n\n if (typeof options.final === 'function') this._final = options.final;\n }\n\n Stream.call(this);\n}\n\n// Otherwise people can pipe Writable streams, which is just wrong.\nWritable.prototype.pipe = function () {\n this.emit('error', new Error('Cannot pipe, not readable'));\n};\n\nfunction writeAfterEnd(stream, cb) {\n var er = new Error('write after end');\n // TODO: defer error events consistently everywhere, not just the cb\n stream.emit('error', er);\n pna.nextTick(cb, er);\n}\n\n// Checks that a user-supplied chunk is valid, especially for the particular\n// mode the stream is in. Currently this means that `null` is never accepted\n// and undefined/non-string values are only allowed in object mode.\nfunction validChunk(stream, state, chunk, cb) {\n var valid = true;\n var er = false;\n\n if (chunk === null) {\n er = new TypeError('May not write null values to stream');\n } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n er = new TypeError('Invalid non-string/buffer chunk');\n }\n if (er) {\n stream.emit('error', er);\n pna.nextTick(cb, er);\n valid = false;\n }\n return valid;\n}\n\nWritable.prototype.write = function (chunk, encoding, cb) {\n var state = this._writableState;\n var ret = false;\n var isBuf = !state.objectMode && _isUint8Array(chunk);\n\n if (isBuf && !Buffer.isBuffer(chunk)) {\n chunk = _uint8ArrayToBuffer(chunk);\n }\n\n if (typeof encoding === 'function') {\n cb = encoding;\n encoding = null;\n }\n\n if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;\n\n if (typeof cb !== 'function') cb = nop;\n\n if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {\n state.pendingcb++;\n ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);\n }\n\n return ret;\n};\n\nWritable.prototype.cork = function () {\n var state = this._writableState;\n\n state.corked++;\n};\n\nWritable.prototype.uncork = function () {\n var state = this._writableState;\n\n if (state.corked) {\n state.corked--;\n\n if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);\n }\n};\n\nWritable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {\n // node::ParseEncoding() requires lower case.\n if (typeof encoding === 'string') encoding = encoding.toLowerCase();\n if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);\n this._writableState.defaultEncoding = encoding;\n return this;\n};\n\nfunction decodeChunk(state, chunk, encoding) {\n if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding);\n }\n return chunk;\n}\n\nObject.defineProperty(Writable.prototype, 'writableHighWaterMark', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function () {\n return this._writableState.highWaterMark;\n }\n});\n\n// if we're already writing something, then just put this\n// in the queue, and wait our turn. Otherwise, call _write\n// If we return false, then we need a drain event, so set that flag.\nfunction writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {\n if (!isBuf) {\n var newChunk = decodeChunk(state, chunk, encoding);\n if (chunk !== newChunk) {\n isBuf = true;\n encoding = 'buffer';\n chunk = newChunk;\n }\n }\n var len = state.objectMode ? 1 : chunk.length;\n\n state.length += len;\n\n var ret = state.length < state.highWaterMark;\n // we must ensure that previous needDrain will not be reset to false.\n if (!ret) state.needDrain = true;\n\n if (state.writing || state.corked) {\n var last = state.lastBufferedRequest;\n state.lastBufferedRequest = {\n chunk: chunk,\n encoding: encoding,\n isBuf: isBuf,\n callback: cb,\n next: null\n };\n if (last) {\n last.next = state.lastBufferedRequest;\n } else {\n state.bufferedRequest = state.lastBufferedRequest;\n }\n state.bufferedRequestCount += 1;\n } else {\n doWrite(stream, state, false, len, chunk, encoding, cb);\n }\n\n return ret;\n}\n\nfunction doWrite(stream, state, writev, len, chunk, encoding, cb) {\n state.writelen = len;\n state.writecb = cb;\n state.writing = true;\n state.sync = true;\n if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);\n state.sync = false;\n}\n\nfunction onwriteError(stream, state, sync, er, cb) {\n --state.pendingcb;\n\n if (sync) {\n // defer the callback if we are being called synchronously\n // to avoid piling up things on the stack\n pna.nextTick(cb, er);\n // this can emit finish, and it will always happen\n // after error\n pna.nextTick(finishMaybe, stream, state);\n stream._writableState.errorEmitted = true;\n stream.emit('error', er);\n } else {\n // the caller expect this to happen before if\n // it is async\n cb(er);\n stream._writableState.errorEmitted = true;\n stream.emit('error', er);\n // this can emit finish, but finish must\n // always follow error\n finishMaybe(stream, state);\n }\n}\n\nfunction onwriteStateUpdate(state) {\n state.writing = false;\n state.writecb = null;\n state.length -= state.writelen;\n state.writelen = 0;\n}\n\nfunction onwrite(stream, er) {\n var state = stream._writableState;\n var sync = state.sync;\n var cb = state.writecb;\n\n onwriteStateUpdate(state);\n\n if (er) onwriteError(stream, state, sync, er, cb);else {\n // Check if we're actually ready to finish, but don't emit yet\n var finished = needFinish(state);\n\n if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {\n clearBuffer(stream, state);\n }\n\n if (sync) {\n /*<replacement>*/\n asyncWrite(afterWrite, stream, state, finished, cb);\n /*</replacement>*/\n } else {\n afterWrite(stream, state, finished, cb);\n }\n }\n}\n\nfunction afterWrite(stream, state, finished, cb) {\n if (!finished) onwriteDrain(stream, state);\n state.pendingcb--;\n cb();\n finishMaybe(stream, state);\n}\n\n// Must force callback to be called on nextTick, so that we don't\n// emit 'drain' before the write() consumer gets the 'false' return\n// value, and has a chance to attach a 'drain' listener.\nfunction onwriteDrain(stream, state) {\n if (state.length === 0 && state.needDrain) {\n state.needDrain = false;\n stream.emit('drain');\n }\n}\n\n// if there's something in the buffer waiting, then process it\nfunction clearBuffer(stream, state) {\n state.bufferProcessing = true;\n var entry = state.bufferedRequest;\n\n if (stream._writev && entry && entry.next) {\n // Fast case, write everything using _writev()\n var l = state.bufferedRequestCount;\n var buffer = new Array(l);\n var holder = state.corkedRequestsFree;\n holder.entry = entry;\n\n var count = 0;\n var allBuffers = true;\n while (entry) {\n buffer[count] = entry;\n if (!entry.isBuf) allBuffers = false;\n entry = entry.next;\n count += 1;\n }\n buffer.allBuffers = allBuffers;\n\n doWrite(stream, state, true, state.length, buffer, '', holder.finish);\n\n // doWrite is almost always async, defer these to save a bit of time\n // as the hot path ends with doWrite\n state.pendingcb++;\n state.lastBufferedRequest = null;\n if (holder.next) {\n state.corkedRequestsFree = holder.next;\n holder.next = null;\n } else {\n state.corkedRequestsFree = new CorkedRequest(state);\n }\n state.bufferedRequestCount = 0;\n } else {\n // Slow case, write chunks one-by-one\n while (entry) {\n var chunk = entry.chunk;\n var encoding = entry.encoding;\n var cb = entry.callback;\n var len = state.objectMode ? 1 : chunk.length;\n\n doWrite(stream, state, false, len, chunk, encoding, cb);\n entry = entry.next;\n state.bufferedRequestCount--;\n // if we didn't call the onwrite immediately, then\n // it means that we need to wait until it does.\n // also, that means that the chunk and cb are currently\n // being processed, so move the buffer counter past them.\n if (state.writing) {\n break;\n }\n }\n\n if (entry === null) state.lastBufferedRequest = null;\n }\n\n state.bufferedRequest = entry;\n state.bufferProcessing = false;\n}\n\nWritable.prototype._write = function (chunk, encoding, cb) {\n cb(new Error('_write() is not implemented'));\n};\n\nWritable.prototype._writev = null;\n\nWritable.prototype.end = function (chunk, encoding, cb) {\n var state = this._writableState;\n\n if (typeof chunk === 'function') {\n cb = chunk;\n chunk = null;\n encoding = null;\n } else if (typeof encoding === 'function') {\n cb = encoding;\n encoding = null;\n }\n\n if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);\n\n // .end() fully uncorks\n if (state.corked) {\n state.corked = 1;\n this.uncork();\n }\n\n // ignore unnecessary end() calls.\n if (!state.ending && !state.finished) endWritable(this, state, cb);\n};\n\nfunction needFinish(state) {\n return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;\n}\nfunction callFinal(stream, state) {\n stream._final(function (err) {\n state.pendingcb--;\n if (err) {\n stream.emit('error', err);\n }\n state.prefinished = true;\n stream.emit('prefinish');\n finishMaybe(stream, state);\n });\n}\nfunction prefinish(stream, state) {\n if (!state.prefinished && !state.finalCalled) {\n if (typeof stream._final === 'function') {\n state.pendingcb++;\n state.finalCalled = true;\n pna.nextTick(callFinal, stream, state);\n } else {\n state.prefinished = true;\n stream.emit('prefinish');\n }\n }\n}\n\nfunction finishMaybe(stream, state) {\n var need = needFinish(state);\n if (need) {\n prefinish(stream, state);\n if (state.pendingcb === 0) {\n state.finished = true;\n stream.emit('finish');\n }\n }\n return need;\n}\n\nfunction endWritable(stream, state, cb) {\n state.ending = true;\n finishMaybe(stream, state);\n if (cb) {\n if (state.finished) pna.nextTick(cb);else stream.once('finish', cb);\n }\n state.ended = true;\n stream.writable = false;\n}\n\nfunction onCorkedFinish(corkReq, state, err) {\n var entry = corkReq.entry;\n corkReq.entry = null;\n while (entry) {\n var cb = entry.callback;\n state.pendingcb--;\n cb(err);\n entry = entry.next;\n }\n if (state.corkedRequestsFree) {\n state.corkedRequestsFree.next = corkReq;\n } else {\n state.corkedRequestsFree = corkReq;\n }\n}\n\nObject.defineProperty(Writable.prototype, 'destroyed', {\n get: function () {\n if (this._writableState === undefined) {\n return false;\n }\n return this._writableState.destroyed;\n },\n set: function (value) {\n // we ignore the value if the stream\n // has not been initialized yet\n if (!this._writableState) {\n return;\n }\n\n // backward compatibility, the user is explicitly\n // managing destroyed\n this._writableState.destroyed = value;\n }\n});\n\nWritable.prototype.destroy = destroyImpl.destroy;\nWritable.prototype._undestroy = destroyImpl.undestroy;\nWritable.prototype._destroy = function (err, cb) {\n this.end();\n cb(err);\n};\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../process/browser.js */ \"./node_modules/process/browser.js\"), __webpack_require__(/*! ./../../timers-browserify/main.js */ \"./node_modules/timers-browserify/main.js\").setImmediate, __webpack_require__(/*! ./../../webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzP2RjMTQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIEEgYml0IHNpbXBsZXIgdGhhbiByZWFkYWJsZSBzdHJlYW1zLlxuLy8gSW1wbGVtZW50IGFuIGFzeW5jIC5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYiksIGFuZCBpdCdsbCBoYW5kbGUgYWxsXG4vLyB0aGUgZHJhaW4gZXZlbnQgZW1pc3Npb24gYW5kIGJ1ZmZlcmluZy5cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuXG52YXIgcG5hID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdyaXRhYmxlO1xuXG4vKiA8cmVwbGFjZW1lbnQ+ICovXG5mdW5jdGlvbiBXcml0ZVJlcShjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRoaXMuY2h1bmsgPSBjaHVuaztcbiAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nO1xuICB0aGlzLmNhbGxiYWNrID0gY2I7XG4gIHRoaXMubmV4dCA9IG51bGw7XG59XG5cbi8vIEl0IHNlZW1zIGEgbGlua2VkIGxpc3QgYnV0IGl0IGlzIG5vdFxuLy8gdGhlcmUgd2lsbCBiZSBvbmx5IDIgb2YgdGhlc2UgZm9yIGVhY2ggc3RyZWFtXG5mdW5jdGlvbiBDb3JrZWRSZXF1ZXN0KHN0YXRlKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdGhpcy5uZXh0ID0gbnVsbDtcbiAgdGhpcy5lbnRyeSA9IG51bGw7XG4gIHRoaXMuZmluaXNoID0gZnVuY3Rpb24gKCkge1xuICAgIG9uQ29ya2VkRmluaXNoKF90aGlzLCBzdGF0ZSk7XG4gIH07XG59XG4vKiA8L3JlcGxhY2VtZW50PiAqL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGFzeW5jV3JpdGUgPSAhcHJvY2Vzcy5icm93c2VyICYmIFsndjAuMTAnLCAndjAuOS4nXS5pbmRleE9mKHByb2Nlc3MudmVyc2lvbi5zbGljZSgwLCA1KSkgPiAtMSA/IHNldEltbWVkaWF0ZSA6IHBuYS5uZXh0VGljaztcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIER1cGxleDtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5Xcml0YWJsZS5Xcml0YWJsZVN0YXRlID0gV3JpdGFibGVTdGF0ZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGludGVybmFsVXRpbCA9IHtcbiAgZGVwcmVjYXRlOiByZXF1aXJlKCd1dGlsLWRlcHJlY2F0ZScpXG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3N0cmVhbScpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBPdXJVaW50OEFycmF5ID0gZ2xvYmFsLlVpbnQ4QXJyYXkgfHwgZnVuY3Rpb24gKCkge307XG5mdW5jdGlvbiBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKSB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShjaHVuayk7XG59XG5mdW5jdGlvbiBfaXNVaW50OEFycmF5KG9iaikge1xuICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKG9iaikgfHwgb2JqIGluc3RhbmNlb2YgT3VyVWludDhBcnJheTtcbn1cblxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBkZXN0cm95SW1wbCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9kZXN0cm95Jyk7XG5cbnV0aWwuaW5oZXJpdHMoV3JpdGFibGUsIFN0cmVhbSk7XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmZ1bmN0aW9uIFdyaXRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gRHVwbGV4IHN0cmVhbXMgYXJlIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLCBidXQgc2hhcmVcbiAgLy8gdGhlIHNhbWUgb3B0aW9ucyBvYmplY3QuXG4gIC8vIEhvd2V2ZXIsIHNvbWUgY2FzZXMgcmVxdWlyZSBzZXR0aW5nIG9wdGlvbnMgdG8gZGlmZmVyZW50XG4gIC8vIHZhbHVlcyBmb3IgdGhlIHJlYWRhYmxlIGFuZCB0aGUgd3JpdGFibGUgc2lkZXMgb2YgdGhlIGR1cGxleCBzdHJlYW0uXG4gIC8vIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHByb3ZpZGVkIHNlcGFyYXRlbHkgYXMgcmVhZGFibGVYWFggYW5kIHdyaXRhYmxlWFhYLlxuICB2YXIgaXNEdXBsZXggPSBzdHJlYW0gaW5zdGFuY2VvZiBEdXBsZXg7XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgc3RyZWFtXG4gIC8vIGNvbnRhaW5zIGJ1ZmZlcnMgb3Igb2JqZWN0cy5cbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKGlzRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLndyaXRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggd3JpdGUoKSBzdGFydHMgcmV0dXJuaW5nIGZhbHNlXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgdGhhdCB3ZSBhbHdheXMgcmV0dXJuIGZhbHNlIGlmXG4gIC8vIHRoZSBlbnRpcmUgYnVmZmVyIGlzIG5vdCBmbHVzaGVkIGltbWVkaWF0ZWx5IG9uIHdyaXRlKClcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdmFyIHdyaXRhYmxlSHdtID0gb3B0aW9ucy53cml0YWJsZUhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG5cbiAgaWYgKGh3bSB8fCBod20gPT09IDApIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bTtlbHNlIGlmIChpc0R1cGxleCAmJiAod3JpdGFibGVId20gfHwgd3JpdGFibGVId20gPT09IDApKSB0aGlzLmhpZ2hXYXRlck1hcmsgPSB3cml0YWJsZUh3bTtlbHNlIHRoaXMuaGlnaFdhdGVyTWFyayA9IGRlZmF1bHRId207XG5cbiAgLy8gY2FzdCB0byBpbnRzLlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBNYXRoLmZsb29yKHRoaXMuaGlnaFdhdGVyTWFyayk7XG5cbiAgLy8gaWYgX2ZpbmFsIGhhcyBiZWVuIGNhbGxlZFxuICB0aGlzLmZpbmFsQ2FsbGVkID0gZmFsc2U7XG5cbiAgLy8gZHJhaW4gZXZlbnQgZmxhZy5cbiAgdGhpcy5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgLy8gYXQgdGhlIHN0YXJ0IG9mIGNhbGxpbmcgZW5kKClcbiAgdGhpcy5lbmRpbmcgPSBmYWxzZTtcbiAgLy8gd2hlbiBlbmQoKSBoYXMgYmVlbiBjYWxsZWQsIGFuZCByZXR1cm5lZFxuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIC8vIHdoZW4gJ2ZpbmlzaCcgaXMgZW1pdHRlZFxuICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7XG5cbiAgLy8gaGFzIGl0IGJlZW4gZGVzdHJveWVkXG4gIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG5cbiAgLy8gc2hvdWxkIHdlIGRlY29kZSBzdHJpbmdzIGludG8gYnVmZmVycyBiZWZvcmUgcGFzc2luZyB0byBfd3JpdGU/XG4gIC8vIHRoaXMgaXMgaGVyZSBzbyB0aGF0IHNvbWUgbm9kZS1jb3JlIHN0cmVhbXMgY2FuIG9wdGltaXplIHN0cmluZ1xuICAvLyBoYW5kbGluZyBhdCBhIGxvd2VyIGxldmVsLlxuICB2YXIgbm9EZWNvZGUgPSBvcHRpb25zLmRlY29kZVN0cmluZ3MgPT09IGZhbHNlO1xuICB0aGlzLmRlY29kZVN0cmluZ3MgPSAhbm9EZWNvZGU7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gbm90IGFuIGFjdHVhbCBidWZmZXIgd2Uga2VlcCB0cmFjayBvZiwgYnV0IGEgbWVhc3VyZW1lbnRcbiAgLy8gb2YgaG93IG11Y2ggd2UncmUgd2FpdGluZyB0byBnZXQgcHVzaGVkIHRvIHNvbWUgdW5kZXJseWluZ1xuICAvLyBzb2NrZXQgb3IgZmlsZS5cbiAgdGhpcy5sZW5ndGggPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBzZWUgd2hlbiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgd3JpdGUuXG4gIHRoaXMud3JpdGluZyA9IGZhbHNlO1xuXG4gIC8vIHdoZW4gdHJ1ZSBhbGwgd3JpdGVzIHdpbGwgYmUgYnVmZmVyZWQgdW50aWwgLnVuY29yaygpIGNhbGxcbiAgdGhpcy5jb3JrZWQgPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIGEgZmxhZyB0byBrbm93IGlmIHdlJ3JlIHByb2Nlc3NpbmcgcHJldmlvdXNseSBidWZmZXJlZCBpdGVtcywgd2hpY2hcbiAgLy8gbWF5IGNhbGwgdGhlIF93cml0ZSgpIGNhbGxiYWNrIGluIHRoZSBzYW1lIHRpY2ssIHNvIHRoYXQgd2UgZG9uJ3RcbiAgLy8gZW5kIHVwIGluIGFuIG92ZXJsYXBwZWQgb253cml0ZSBzaXR1YXRpb24uXG4gIHRoaXMuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xuXG4gIC8vIHRoZSBjYWxsYmFjayB0aGF0J3MgcGFzc2VkIHRvIF93cml0ZShjaHVuayxjYilcbiAgdGhpcy5vbndyaXRlID0gZnVuY3Rpb24gKGVyKSB7XG4gICAgb253cml0ZShzdHJlYW0sIGVyKTtcbiAgfTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCB0aGUgdXNlciBzdXBwbGllcyB0byB3cml0ZShjaHVuayxlbmNvZGluZyxjYilcbiAgdGhpcy53cml0ZWNiID0gbnVsbDtcblxuICAvLyB0aGUgYW1vdW50IHRoYXQgaXMgYmVpbmcgd3JpdHRlbiB3aGVuIF93cml0ZSBpcyBjYWxsZWQuXG4gIHRoaXMud3JpdGVsZW4gPSAwO1xuXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgdGhpcy5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcblxuICAvLyBudW1iZXIgb2YgcGVuZGluZyB1c2VyLXN1cHBsaWVkIHdyaXRlIGNhbGxiYWNrc1xuICAvLyB0aGlzIG11c3QgYmUgMCBiZWZvcmUgJ2ZpbmlzaCcgY2FuIGJlIGVtaXR0ZWRcbiAgdGhpcy5wZW5kaW5nY2IgPSAwO1xuXG4gIC8vIGVtaXQgcHJlZmluaXNoIGlmIHRoZSBvbmx5IHRoaW5nIHdlJ3JlIHdhaXRpbmcgZm9yIGlzIF93cml0ZSBjYnNcbiAgLy8gVGhpcyBpcyByZWxldmFudCBmb3Igc3luY2hyb25vdXMgVHJhbnNmb3JtIHN0cmVhbXNcbiAgdGhpcy5wcmVmaW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIFRydWUgaWYgdGhlIGVycm9yIHdhcyBhbHJlYWR5IGVtaXR0ZWQgYW5kIHNob3VsZCBub3QgYmUgdGhyb3duIGFnYWluXG4gIHRoaXMuZXJyb3JFbWl0dGVkID0gZmFsc2U7XG5cbiAgLy8gY291bnQgYnVmZmVyZWQgcmVxdWVzdHNcbiAgdGhpcy5idWZmZXJlZFJlcXVlc3RDb3VudCA9IDA7XG5cbiAgLy8gYWxsb2NhdGUgdGhlIGZpcnN0IENvcmtlZFJlcXVlc3QsIHRoZXJlIGlzIGFsd2F5c1xuICAvLyBvbmUgYWxsb2NhdGVkIGFuZCBmcmVlIHRvIHVzZSwgYW5kIHdlIG1haW50YWluIGF0IG1vc3QgdHdvXG4gIHRoaXMuY29ya2VkUmVxdWVzdHNGcmVlID0gbmV3IENvcmtlZFJlcXVlc3QodGhpcyk7XG59XG5cbldyaXRhYmxlU3RhdGUucHJvdG90eXBlLmdldEJ1ZmZlciA9IGZ1bmN0aW9uIGdldEJ1ZmZlcigpIHtcbiAgdmFyIGN1cnJlbnQgPSB0aGlzLmJ1ZmZlcmVkUmVxdWVzdDtcbiAgdmFyIG91dCA9IFtdO1xuICB3aGlsZSAoY3VycmVudCkge1xuICAgIG91dC5wdXNoKGN1cnJlbnQpO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn07XG5cbihmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RhdGUucHJvdG90eXBlLCAnYnVmZmVyJywge1xuICAgICAgZ2V0OiBpbnRlcm5hbFV0aWwuZGVwcmVjYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QnVmZmVyKCk7XG4gICAgICB9LCAnX3dyaXRhYmxlU3RhdGUuYnVmZmVyIGlzIGRlcHJlY2F0ZWQuIFVzZSBfd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIgJyArICdpbnN0ZWFkLicsICdERVAwMDAzJylcbiAgICB9KTtcbiAgfSBjYXRjaCAoXykge31cbn0pKCk7XG5cbi8vIFRlc3QgX3dyaXRhYmxlU3RhdGUgZm9yIGluaGVyaXRhbmNlIHRvIGFjY291bnQgZm9yIER1cGxleCBzdHJlYW1zLFxuLy8gd2hvc2UgcHJvdG90eXBlIGNoYWluIG9ubHkgcG9pbnRzIHRvIFJlYWRhYmxlLlxudmFyIHJlYWxIYXNJbnN0YW5jZTtcbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5oYXNJbnN0YW5jZSAmJiB0eXBlb2YgRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgcmVhbEhhc0luc3RhbmNlID0gRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV07XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZSwgU3ltYm9sLmhhc0luc3RhbmNlLCB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICAgIGlmIChyZWFsSGFzSW5zdGFuY2UuY2FsbCh0aGlzLCBvYmplY3QpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmICh0aGlzICE9PSBXcml0YWJsZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICByZXR1cm4gb2JqZWN0ICYmIG9iamVjdC5fd3JpdGFibGVTdGF0ZSBpbnN0YW5jZW9mIFdyaXRhYmxlU3RhdGU7XG4gICAgfVxuICB9KTtcbn0gZWxzZSB7XG4gIHJlYWxIYXNJbnN0YW5jZSA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgdGhpcztcbiAgfTtcbn1cblxuZnVuY3Rpb24gV3JpdGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIC8vIFdyaXRhYmxlIGN0b3IgaXMgYXBwbGllZCB0byBEdXBsZXhlcywgdG9vLlxuICAvLyBgcmVhbEhhc0luc3RhbmNlYCBpcyBuZWNlc3NhcnkgYmVjYXVzZSB1c2luZyBwbGFpbiBgaW5zdGFuY2VvZmBcbiAgLy8gd291bGQgcmV0dXJuIGZhbHNlLCBhcyBubyBgX3dyaXRhYmxlU3RhdGVgIHByb3BlcnR5IGlzIGF0dGFjaGVkLlxuXG4gIC8vIFRyeWluZyB0byB1c2UgdGhlIGN1c3RvbSBgaW5zdGFuY2VvZmAgZm9yIFdyaXRhYmxlIGhlcmUgd2lsbCBhbHNvIGJyZWFrIHRoZVxuICAvLyBOb2RlLmpzIExhenlUcmFuc2Zvcm0gaW1wbGVtZW50YXRpb24sIHdoaWNoIGhhcyBhIG5vbi10cml2aWFsIGdldHRlciBmb3JcbiAgLy8gYF93cml0YWJsZVN0YXRlYCB0aGF0IHdvdWxkIGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uLlxuICBpZiAoIXJlYWxIYXNJbnN0YW5jZS5jYWxsKFdyaXRhYmxlLCB0aGlzKSAmJiAhKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgpKSB7XG4gICAgcmV0dXJuIG5ldyBXcml0YWJsZShvcHRpb25zKTtcbiAgfVxuXG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUgPSBuZXcgV3JpdGFibGVTdGF0ZShvcHRpb25zLCB0aGlzKTtcblxuICAvLyBsZWdhY3kuXG4gIHRoaXMud3JpdGFibGUgPSB0cnVlO1xuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRlID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZSA9IG9wdGlvbnMud3JpdGU7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGV2ID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZXYgPSBvcHRpb25zLndyaXRldjtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB0aGlzLl9kZXN0cm95ID0gb3B0aW9ucy5kZXN0cm95O1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbmFsID09PSAnZnVuY3Rpb24nKSB0aGlzLl9maW5hbCA9IG9wdGlvbnMuZmluYWw7XG4gIH1cblxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cblxuLy8gT3RoZXJ3aXNlIHBlb3BsZSBjYW4gcGlwZSBXcml0YWJsZSBzdHJlYW1zLCB3aGljaCBpcyBqdXN0IHdyb25nLlxuV3JpdGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ0Nhbm5vdCBwaXBlLCBub3QgcmVhZGFibGUnKSk7XG59O1xuXG5mdW5jdGlvbiB3cml0ZUFmdGVyRW5kKHN0cmVhbSwgY2IpIHtcbiAgdmFyIGVyID0gbmV3IEVycm9yKCd3cml0ZSBhZnRlciBlbmQnKTtcbiAgLy8gVE9ETzogZGVmZXIgZXJyb3IgZXZlbnRzIGNvbnNpc3RlbnRseSBldmVyeXdoZXJlLCBub3QganVzdCB0aGUgY2JcbiAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICBwbmEubmV4dFRpY2soY2IsIGVyKTtcbn1cblxuLy8gQ2hlY2tzIHRoYXQgYSB1c2VyLXN1cHBsaWVkIGNodW5rIGlzIHZhbGlkLCBlc3BlY2lhbGx5IGZvciB0aGUgcGFydGljdWxhclxuLy8gbW9kZSB0aGUgc3RyZWFtIGlzIGluLiBDdXJyZW50bHkgdGhpcyBtZWFucyB0aGF0IGBudWxsYCBpcyBuZXZlciBhY2NlcHRlZFxuLy8gYW5kIHVuZGVmaW5lZC9ub24tc3RyaW5nIHZhbHVlcyBhcmUgb25seSBhbGxvd2VkIGluIG9iamVjdCBtb2RlLlxuZnVuY3Rpb24gdmFsaWRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgY2IpIHtcbiAgdmFyIHZhbGlkID0gdHJ1ZTtcbiAgdmFyIGVyID0gZmFsc2U7XG5cbiAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdNYXkgbm90IHdyaXRlIG51bGwgdmFsdWVzIHRvIHN0cmVhbScpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICB9XG4gIGlmIChlcikge1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgICBwbmEubmV4dFRpY2soY2IsIGVyKTtcbiAgICB2YWxpZCA9IGZhbHNlO1xuICB9XG4gIHJldHVybiB2YWxpZDtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHJldCA9IGZhbHNlO1xuICB2YXIgaXNCdWYgPSAhc3RhdGUub2JqZWN0TW9kZSAmJiBfaXNVaW50OEFycmF5KGNodW5rKTtcblxuICBpZiAoaXNCdWYgJiYgIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIHtcbiAgICBjaHVuayA9IF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGlzQnVmKSBlbmNvZGluZyA9ICdidWZmZXInO2Vsc2UgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG5cbiAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykgY2IgPSBub3A7XG5cbiAgaWYgKHN0YXRlLmVuZGVkKSB3cml0ZUFmdGVyRW5kKHRoaXMsIGNiKTtlbHNlIGlmIChpc0J1ZiB8fCB2YWxpZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgY2IpKSB7XG4gICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgcmV0ID0gd3JpdGVPckJ1ZmZlcih0aGlzLCBzdGF0ZSwgaXNCdWYsIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIHN0YXRlLmNvcmtlZCsrO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnVuY29yayA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkLS07XG5cbiAgICBpZiAoIXN0YXRlLndyaXRpbmcgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSBjbGVhckJ1ZmZlcih0aGlzLCBzdGF0ZSk7XG4gIH1cbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5zZXREZWZhdWx0RW5jb2RpbmcgPSBmdW5jdGlvbiBzZXREZWZhdWx0RW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgLy8gbm9kZTo6UGFyc2VFbmNvZGluZygpIHJlcXVpcmVzIGxvd2VyIGNhc2UuXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSBlbmNvZGluZyA9IGVuY29kaW5nLnRvTG93ZXJDYXNlKCk7XG4gIGlmICghKFsnaGV4JywgJ3V0ZjgnLCAndXRmLTgnLCAnYXNjaWknLCAnYmluYXJ5JywgJ2Jhc2U2NCcsICd1Y3MyJywgJ3Vjcy0yJywgJ3V0ZjE2bGUnLCAndXRmLTE2bGUnLCAncmF3J10uaW5kZXhPZigoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKSkgPiAtMSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZykge1xuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgc3RhdGUuZGVjb2RlU3RyaW5ncyAhPT0gZmFsc2UgJiYgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgfVxuICByZXR1cm4gY2h1bms7XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZS5wcm90b3R5cGUsICd3cml0YWJsZUhpZ2hXYXRlck1hcmsnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIH1cbn0pO1xuXG4vLyBpZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgc29tZXRoaW5nLCB0aGVuIGp1c3QgcHV0IHRoaXNcbi8vIGluIHRoZSBxdWV1ZSwgYW5kIHdhaXQgb3VyIHR1cm4uICBPdGhlcndpc2UsIGNhbGwgX3dyaXRlXG4vLyBJZiB3ZSByZXR1cm4gZmFsc2UsIHRoZW4gd2UgbmVlZCBhIGRyYWluIGV2ZW50LCBzbyBzZXQgdGhhdCBmbGFnLlxuZnVuY3Rpb24gd3JpdGVPckJ1ZmZlcihzdHJlYW0sIHN0YXRlLCBpc0J1ZiwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBpZiAoIWlzQnVmKSB7XG4gICAgdmFyIG5ld0NodW5rID0gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZyk7XG4gICAgaWYgKGNodW5rICE9PSBuZXdDaHVuaykge1xuICAgICAgaXNCdWYgPSB0cnVlO1xuICAgICAgZW5jb2RpbmcgPSAnYnVmZmVyJztcbiAgICAgIGNodW5rID0gbmV3Q2h1bms7XG4gICAgfVxuICB9XG4gIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICBzdGF0ZS5sZW5ndGggKz0gbGVuO1xuXG4gIHZhciByZXQgPSBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICAvLyB3ZSBtdXN0IGVuc3VyZSB0aGF0IHByZXZpb3VzIG5lZWREcmFpbiB3aWxsIG5vdCBiZSByZXNldCB0byBmYWxzZS5cbiAgaWYgKCFyZXQpIHN0YXRlLm5lZWREcmFpbiA9IHRydWU7XG5cbiAgaWYgKHN0YXRlLndyaXRpbmcgfHwgc3RhdGUuY29ya2VkKSB7XG4gICAgdmFyIGxhc3QgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSB7XG4gICAgICBjaHVuazogY2h1bmssXG4gICAgICBlbmNvZGluZzogZW5jb2RpbmcsXG4gICAgICBpc0J1ZjogaXNCdWYsXG4gICAgICBjYWxsYmFjazogY2IsXG4gICAgICBuZXh0OiBudWxsXG4gICAgfTtcbiAgICBpZiAobGFzdCkge1xuICAgICAgbGFzdC5uZXh0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICB9XG4gICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgKz0gMTtcbiAgfSBlbHNlIHtcbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB3cml0ZXYsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBzdGF0ZS53cml0ZWxlbiA9IGxlbjtcbiAgc3RhdGUud3JpdGVjYiA9IGNiO1xuICBzdGF0ZS53cml0aW5nID0gdHJ1ZTtcbiAgc3RhdGUuc3luYyA9IHRydWU7XG4gIGlmICh3cml0ZXYpIHN0cmVhbS5fd3JpdGV2KGNodW5rLCBzdGF0ZS5vbndyaXRlKTtlbHNlIHN0cmVhbS5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBzdGF0ZS5vbndyaXRlKTtcbiAgc3RhdGUuc3luYyA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKSB7XG4gIC0tc3RhdGUucGVuZGluZ2NiO1xuXG4gIGlmIChzeW5jKSB7XG4gICAgLy8gZGVmZXIgdGhlIGNhbGxiYWNrIGlmIHdlIGFyZSBiZWluZyBjYWxsZWQgc3luY2hyb25vdXNseVxuICAgIC8vIHRvIGF2b2lkIHBpbGluZyB1cCB0aGluZ3Mgb24gdGhlIHN0YWNrXG4gICAgcG5hLm5leHRUaWNrKGNiLCBlcik7XG4gICAgLy8gdGhpcyBjYW4gZW1pdCBmaW5pc2gsIGFuZCBpdCB3aWxsIGFsd2F5cyBoYXBwZW5cbiAgICAvLyBhZnRlciBlcnJvclxuICAgIHBuYS5uZXh0VGljayhmaW5pc2hNYXliZSwgc3RyZWFtLCBzdGF0ZSk7XG4gICAgc3RyZWFtLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9IGVsc2Uge1xuICAgIC8vIHRoZSBjYWxsZXIgZXhwZWN0IHRoaXMgdG8gaGFwcGVuIGJlZm9yZSBpZlxuICAgIC8vIGl0IGlzIGFzeW5jXG4gICAgY2IoZXIpO1xuICAgIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgICAvLyB0aGlzIGNhbiBlbWl0IGZpbmlzaCwgYnV0IGZpbmlzaCBtdXN0XG4gICAgLy8gYWx3YXlzIGZvbGxvdyBlcnJvclxuICAgIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSkge1xuICBzdGF0ZS53cml0aW5nID0gZmFsc2U7XG4gIHN0YXRlLndyaXRlY2IgPSBudWxsO1xuICBzdGF0ZS5sZW5ndGggLT0gc3RhdGUud3JpdGVsZW47XG4gIHN0YXRlLndyaXRlbGVuID0gMDtcbn1cblxuZnVuY3Rpb24gb253cml0ZShzdHJlYW0sIGVyKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHN5bmMgPSBzdGF0ZS5zeW5jO1xuICB2YXIgY2IgPSBzdGF0ZS53cml0ZWNiO1xuXG4gIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSk7XG5cbiAgaWYgKGVyKSBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKTtlbHNlIHtcbiAgICAvLyBDaGVjayBpZiB3ZSdyZSBhY3R1YWxseSByZWFkeSB0byBmaW5pc2gsIGJ1dCBkb24ndCBlbWl0IHlldFxuICAgIHZhciBmaW5pc2hlZCA9IG5lZWRGaW5pc2goc3RhdGUpO1xuXG4gICAgaWYgKCFmaW5pc2hlZCAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkge1xuICAgICAgY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN5bmMpIHtcbiAgICAgIC8qPHJlcGxhY2VtZW50PiovXG4gICAgICBhc3luY1dyaXRlKGFmdGVyV3JpdGUsIHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICAvKjwvcmVwbGFjZW1lbnQ+Ki9cbiAgICB9IGVsc2Uge1xuICAgICAgYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYikge1xuICBpZiAoIWZpbmlzaGVkKSBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSk7XG4gIHN0YXRlLnBlbmRpbmdjYi0tO1xuICBjYigpO1xuICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbn1cblxuLy8gTXVzdCBmb3JjZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgb24gbmV4dFRpY2ssIHNvIHRoYXQgd2UgZG9uJ3Rcbi8vIGVtaXQgJ2RyYWluJyBiZWZvcmUgdGhlIHdyaXRlKCkgY29uc3VtZXIgZ2V0cyB0aGUgJ2ZhbHNlJyByZXR1cm5cbi8vIHZhbHVlLCBhbmQgaGFzIGEgY2hhbmNlIHRvIGF0dGFjaCBhICdkcmFpbicgbGlzdGVuZXIuXG5mdW5jdGlvbiBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLm5lZWREcmFpbikge1xuICAgIHN0YXRlLm5lZWREcmFpbiA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdkcmFpbicpO1xuICB9XG59XG5cbi8vIGlmIHRoZXJlJ3Mgc29tZXRoaW5nIGluIHRoZSBidWZmZXIgd2FpdGluZywgdGhlbiBwcm9jZXNzIGl0XG5mdW5jdGlvbiBjbGVhckJ1ZmZlcihzdHJlYW0sIHN0YXRlKSB7XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSB0cnVlO1xuICB2YXIgZW50cnkgPSBzdGF0ZS5idWZmZXJlZFJlcXVlc3Q7XG5cbiAgaWYgKHN0cmVhbS5fd3JpdGV2ICYmIGVudHJ5ICYmIGVudHJ5Lm5leHQpIHtcbiAgICAvLyBGYXN0IGNhc2UsIHdyaXRlIGV2ZXJ5dGhpbmcgdXNpbmcgX3dyaXRldigpXG4gICAgdmFyIGwgPSBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudDtcbiAgICB2YXIgYnVmZmVyID0gbmV3IEFycmF5KGwpO1xuICAgIHZhciBob2xkZXIgPSBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU7XG4gICAgaG9sZGVyLmVudHJ5ID0gZW50cnk7XG5cbiAgICB2YXIgY291bnQgPSAwO1xuICAgIHZhciBhbGxCdWZmZXJzID0gdHJ1ZTtcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIGJ1ZmZlcltjb3VudF0gPSBlbnRyeTtcbiAgICAgIGlmICghZW50cnkuaXNCdWYpIGFsbEJ1ZmZlcnMgPSBmYWxzZTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuICAgIGJ1ZmZlci5hbGxCdWZmZXJzID0gYWxsQnVmZmVycztcblxuICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgdHJ1ZSwgc3RhdGUubGVuZ3RoLCBidWZmZXIsICcnLCBob2xkZXIuZmluaXNoKTtcblxuICAgIC8vIGRvV3JpdGUgaXMgYWxtb3N0IGFsd2F5cyBhc3luYywgZGVmZXIgdGhlc2UgdG8gc2F2ZSBhIGJpdCBvZiB0aW1lXG4gICAgLy8gYXMgdGhlIGhvdCBwYXRoIGVuZHMgd2l0aCBkb1dyaXRlXG4gICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gICAgaWYgKGhvbGRlci5uZXh0KSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBob2xkZXIubmV4dDtcbiAgICAgIGhvbGRlci5uZXh0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gbmV3IENvcmtlZFJlcXVlc3Qoc3RhdGUpO1xuICAgIH1cbiAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gU2xvdyBjYXNlLCB3cml0ZSBjaHVua3Mgb25lLWJ5LW9uZVxuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgdmFyIGNodW5rID0gZW50cnkuY2h1bms7XG4gICAgICB2YXIgZW5jb2RpbmcgPSBlbnRyeS5lbmNvZGluZztcbiAgICAgIHZhciBjYiA9IGVudHJ5LmNhbGxiYWNrO1xuICAgICAgdmFyIGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuXG4gICAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQtLTtcbiAgICAgIC8vIGlmIHdlIGRpZG4ndCBjYWxsIHRoZSBvbndyaXRlIGltbWVkaWF0ZWx5LCB0aGVuXG4gICAgICAvLyBpdCBtZWFucyB0aGF0IHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBpdCBkb2VzLlxuICAgICAgLy8gYWxzbywgdGhhdCBtZWFucyB0aGF0IHRoZSBjaHVuayBhbmQgY2IgYXJlIGN1cnJlbnRseVxuICAgICAgLy8gYmVpbmcgcHJvY2Vzc2VkLCBzbyBtb3ZlIHRoZSBidWZmZXIgY291bnRlciBwYXN0IHRoZW0uXG4gICAgICBpZiAoc3RhdGUud3JpdGluZykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZW50cnkgPT09IG51bGwpIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICB9XG5cbiAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gZW50cnk7XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG5ldyBFcnJvcignX3dyaXRlKCkgaXMgbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZXYgPSBudWxsO1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAodHlwZW9mIGNodW5rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBjaHVuaztcbiAgICBjaHVuayA9IG51bGw7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQpIHRoaXMud3JpdGUoY2h1bmssIGVuY29kaW5nKTtcblxuICAvLyAuZW5kKCkgZnVsbHkgdW5jb3Jrc1xuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkID0gMTtcbiAgICB0aGlzLnVuY29yaygpO1xuICB9XG5cbiAgLy8gaWdub3JlIHVubmVjZXNzYXJ5IGVuZCgpIGNhbGxzLlxuICBpZiAoIXN0YXRlLmVuZGluZyAmJiAhc3RhdGUuZmluaXNoZWQpIGVuZFdyaXRhYmxlKHRoaXMsIHN0YXRlLCBjYik7XG59O1xuXG5mdW5jdGlvbiBuZWVkRmluaXNoKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5lbmRpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9PT0gbnVsbCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLndyaXRpbmc7XG59XG5mdW5jdGlvbiBjYWxsRmluYWwoc3RyZWFtLCBzdGF0ZSkge1xuICBzdHJlYW0uX2ZpbmFsKGZ1bmN0aW9uIChlcnIpIHtcbiAgICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgIH1cbiAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICAgIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucHJlZmluaXNoZWQgJiYgIXN0YXRlLmZpbmFsQ2FsbGVkKSB7XG4gICAgaWYgKHR5cGVvZiBzdHJlYW0uX2ZpbmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICAgIHN0YXRlLmZpbmFsQ2FsbGVkID0gdHJ1ZTtcbiAgICAgIHBuYS5uZXh0VGljayhjYWxsRmluYWwsIHN0cmVhbSwgc3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgICBzdHJlYW0uZW1pdCgncHJlZmluaXNoJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIG5lZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcbiAgaWYgKG5lZWQpIHtcbiAgICBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gICAgaWYgKHN0YXRlLnBlbmRpbmdjYiA9PT0gMCkge1xuICAgICAgc3RhdGUuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLmVtaXQoJ2ZpbmlzaCcpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmVlZDtcbn1cblxuZnVuY3Rpb24gZW5kV3JpdGFibGUoc3RyZWFtLCBzdGF0ZSwgY2IpIHtcbiAgc3RhdGUuZW5kaW5nID0gdHJ1ZTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG4gIGlmIChjYikge1xuICAgIGlmIChzdGF0ZS5maW5pc2hlZCkgcG5hLm5leHRUaWNrKGNiKTtlbHNlIHN0cmVhbS5vbmNlKCdmaW5pc2gnLCBjYik7XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICBzdHJlYW0ud3JpdGFibGUgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gb25Db3JrZWRGaW5pc2goY29ya1JlcSwgc3RhdGUsIGVycikge1xuICB2YXIgZW50cnkgPSBjb3JrUmVxLmVudHJ5O1xuICBjb3JrUmVxLmVudHJ5ID0gbnVsbDtcbiAgd2hpbGUgKGVudHJ5KSB7XG4gICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgc3RhdGUucGVuZGluZ2NiLS07XG4gICAgY2IoZXJyKTtcbiAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gIH1cbiAgaWYgKHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSkge1xuICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZS5uZXh0ID0gY29ya1JlcTtcbiAgfSBlbHNlIHtcbiAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBjb3JrUmVxO1xuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZS5wcm90b3R5cGUsICdkZXN0cm95ZWQnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl93cml0YWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIC8vIHdlIGlnbm9yZSB0aGUgdmFsdWUgaWYgdGhlIHN0cmVhbVxuICAgIC8vIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcbiAgICBpZiAoIXRoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgfVxufSk7XG5cbldyaXRhYmxlLnByb3RvdHlwZS5kZXN0cm95ID0gZGVzdHJveUltcGwuZGVzdHJveTtcbldyaXRhYmxlLnByb3RvdHlwZS5fdW5kZXN0cm95ID0gZGVzdHJveUltcGwudW5kZXN0cm95O1xuV3JpdGFibGUucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgdGhpcy5lbmQoKTtcbiAgY2IoZXJyKTtcbn07Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/readable-stream/lib/_stream_writable.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/readable-stream/lib/internal/streams/BufferList.js":
+/*!*************************************************************************!*\
+ !*** ./node_modules/readable-stream/lib/internal/streams/BufferList.js ***!
+ \*************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Buffer = __webpack_require__(/*! safe-buffer */ \"./node_modules/safe-buffer/index.js\").Buffer;\nvar util = __webpack_require__(/*! util */ 1);\n\nfunction copyBuffer(src, target, offset) {\n src.copy(target, offset);\n}\n\nmodule.exports = function () {\n function BufferList() {\n _classCallCheck(this, BufferList);\n\n this.head = null;\n this.tail = null;\n this.length = 0;\n }\n\n BufferList.prototype.push = function push(v) {\n var entry = { data: v, next: null };\n if (this.length > 0) this.tail.next = entry;else this.head = entry;\n this.tail = entry;\n ++this.length;\n };\n\n BufferList.prototype.unshift = function unshift(v) {\n var entry = { data: v, next: this.head };\n if (this.length === 0) this.tail = entry;\n this.head = entry;\n ++this.length;\n };\n\n BufferList.prototype.shift = function shift() {\n if (this.length === 0) return;\n var ret = this.head.data;\n if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;\n --this.length;\n return ret;\n };\n\n BufferList.prototype.clear = function clear() {\n this.head = this.tail = null;\n this.length = 0;\n };\n\n BufferList.prototype.join = function join(s) {\n if (this.length === 0) return '';\n var p = this.head;\n var ret = '' + p.data;\n while (p = p.next) {\n ret += s + p.data;\n }return ret;\n };\n\n BufferList.prototype.concat = function concat(n) {\n if (this.length === 0) return Buffer.alloc(0);\n if (this.length === 1) return this.head.data;\n var ret = Buffer.allocUnsafe(n >>> 0);\n var p = this.head;\n var i = 0;\n while (p) {\n copyBuffer(p.data, ret, i);\n i += p.data.length;\n p = p.next;\n }\n return ret;\n };\n\n return BufferList;\n}();\n\nif (util && util.inspect && util.inspect.custom) {\n module.exports.prototype[util.inspect.custom] = function () {\n var obj = util.inspect({ length: this.length });\n return this.constructor.name + ' ' + obj;\n };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL0J1ZmZlckxpc3QuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvQnVmZmVyTGlzdC5qcz81ZTFhIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbmZ1bmN0aW9uIGNvcHlCdWZmZXIoc3JjLCB0YXJnZXQsIG9mZnNldCkge1xuICBzcmMuY29weSh0YXJnZXQsIG9mZnNldCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBCdWZmZXJMaXN0KCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBCdWZmZXJMaXN0KTtcblxuICAgIHRoaXMuaGVhZCA9IG51bGw7XG4gICAgdGhpcy50YWlsID0gbnVsbDtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG4gIH1cblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gcHVzaCh2KSB7XG4gICAgdmFyIGVudHJ5ID0geyBkYXRhOiB2LCBuZXh0OiBudWxsIH07XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gMCkgdGhpcy50YWlsLm5leHQgPSBlbnRyeTtlbHNlIHRoaXMuaGVhZCA9IGVudHJ5O1xuICAgIHRoaXMudGFpbCA9IGVudHJ5O1xuICAgICsrdGhpcy5sZW5ndGg7XG4gIH07XG5cbiAgQnVmZmVyTGlzdC5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uIHVuc2hpZnQodikge1xuICAgIHZhciBlbnRyeSA9IHsgZGF0YTogdiwgbmV4dDogdGhpcy5oZWFkIH07XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSB0aGlzLnRhaWwgPSBlbnRyeTtcbiAgICB0aGlzLmhlYWQgPSBlbnRyeTtcbiAgICArK3RoaXMubGVuZ3RoO1xuICB9O1xuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLnNoaWZ0ID0gZnVuY3Rpb24gc2hpZnQoKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgdmFyIHJldCA9IHRoaXMuaGVhZC5kYXRhO1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDtlbHNlIHRoaXMuaGVhZCA9IHRoaXMuaGVhZC5uZXh0O1xuICAgIC0tdGhpcy5sZW5ndGg7XG4gICAgcmV0dXJuIHJldDtcbiAgfTtcblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuICB9O1xuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbiBqb2luKHMpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgICB2YXIgcCA9IHRoaXMuaGVhZDtcbiAgICB2YXIgcmV0ID0gJycgKyBwLmRhdGE7XG4gICAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICAgIHJldCArPSBzICsgcC5kYXRhO1xuICAgIH1yZXR1cm4gcmV0O1xuICB9O1xuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdChuKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gQnVmZmVyLmFsbG9jKDApO1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHRoaXMuaGVhZC5kYXRhO1xuICAgIHZhciByZXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobiA+Pj4gMCk7XG4gICAgdmFyIHAgPSB0aGlzLmhlYWQ7XG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlIChwKSB7XG4gICAgICBjb3B5QnVmZmVyKHAuZGF0YSwgcmV0LCBpKTtcbiAgICAgIGkgKz0gcC5kYXRhLmxlbmd0aDtcbiAgICAgIHAgPSBwLm5leHQ7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH07XG5cbiAgcmV0dXJuIEJ1ZmZlckxpc3Q7XG59KCk7XG5cbmlmICh1dGlsICYmIHV0aWwuaW5zcGVjdCAmJiB1dGlsLmluc3BlY3QuY3VzdG9tKSB7XG4gIG1vZHVsZS5leHBvcnRzLnByb3RvdHlwZVt1dGlsLmluc3BlY3QuY3VzdG9tXSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgb2JqID0gdXRpbC5pbnNwZWN0KHsgbGVuZ3RoOiB0aGlzLmxlbmd0aCB9KTtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgJyAnICsgb2JqO1xuICB9O1xufSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/readable-stream/lib/internal/streams/BufferList.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/readable-stream/lib/internal/streams/destroy.js":
+/*!**********************************************************************!*\
+ !*** ./node_modules/readable-stream/lib/internal/streams/destroy.js ***!
+ \**********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\n/*<replacement>*/\n\nvar pna = __webpack_require__(/*! process-nextick-args */ \"./node_modules/process-nextick-args/index.js\");\n/*</replacement>*/\n\n// undocumented cb() API, needed for core, not for public API\nfunction destroy(err, cb) {\n var _this = this;\n\n var readableDestroyed = this._readableState && this._readableState.destroyed;\n var writableDestroyed = this._writableState && this._writableState.destroyed;\n\n if (readableDestroyed || writableDestroyed) {\n if (cb) {\n cb(err);\n } else if (err && (!this._writableState || !this._writableState.errorEmitted)) {\n pna.nextTick(emitErrorNT, this, err);\n }\n return this;\n }\n\n // we set destroyed to true before firing error callbacks in order\n // to make it re-entrance safe in case destroy() is called within callbacks\n\n if (this._readableState) {\n this._readableState.destroyed = true;\n }\n\n // if this is a duplex stream mark the writable part as destroyed as well\n if (this._writableState) {\n this._writableState.destroyed = true;\n }\n\n this._destroy(err || null, function (err) {\n if (!cb && err) {\n pna.nextTick(emitErrorNT, _this, err);\n if (_this._writableState) {\n _this._writableState.errorEmitted = true;\n }\n } else if (cb) {\n cb(err);\n }\n });\n\n return this;\n}\n\nfunction undestroy() {\n if (this._readableState) {\n this._readableState.destroyed = false;\n this._readableState.reading = false;\n this._readableState.ended = false;\n this._readableState.endEmitted = false;\n }\n\n if (this._writableState) {\n this._writableState.destroyed = false;\n this._writableState.ended = false;\n this._writableState.ending = false;\n this._writableState.finished = false;\n this._writableState.errorEmitted = false;\n }\n}\n\nfunction emitErrorNT(self, err) {\n self.emit('error', err);\n}\n\nmodule.exports = {\n destroy: destroy,\n undestroy: undestroy\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3kuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZGVzdHJveS5qcz80NjgxIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIHBuYSA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLy8gdW5kb2N1bWVudGVkIGNiKCkgQVBJLCBuZWVkZWQgZm9yIGNvcmUsIG5vdCBmb3IgcHVibGljIEFQSVxuZnVuY3Rpb24gZGVzdHJveShlcnIsIGNiKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdmFyIHJlYWRhYmxlRGVzdHJveWVkID0gdGhpcy5fcmVhZGFibGVTdGF0ZSAmJiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgdmFyIHdyaXRhYmxlRGVzdHJveWVkID0gdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtcblxuICBpZiAocmVhZGFibGVEZXN0cm95ZWQgfHwgd3JpdGFibGVEZXN0cm95ZWQpIHtcbiAgICBpZiAoY2IpIHtcbiAgICAgIGNiKGVycik7XG4gICAgfSBlbHNlIGlmIChlcnIgJiYgKCF0aGlzLl93cml0YWJsZVN0YXRlIHx8ICF0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCkpIHtcbiAgICAgIHBuYS5uZXh0VGljayhlbWl0RXJyb3JOVCwgdGhpcywgZXJyKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyB3ZSBzZXQgZGVzdHJveWVkIHRvIHRydWUgYmVmb3JlIGZpcmluZyBlcnJvciBjYWxsYmFja3MgaW4gb3JkZXJcbiAgLy8gdG8gbWFrZSBpdCByZS1lbnRyYW5jZSBzYWZlIGluIGNhc2UgZGVzdHJveSgpIGlzIGNhbGxlZCB3aXRoaW4gY2FsbGJhY2tzXG5cbiAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHRydWU7XG4gIH1cblxuICAvLyBpZiB0aGlzIGlzIGEgZHVwbGV4IHN0cmVhbSBtYXJrIHRoZSB3cml0YWJsZSBwYXJ0IGFzIGRlc3Ryb3llZCBhcyB3ZWxsXG4gIGlmICh0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB0cnVlO1xuICB9XG5cbiAgdGhpcy5fZGVzdHJveShlcnIgfHwgbnVsbCwgZnVuY3Rpb24gKGVycikge1xuICAgIGlmICghY2IgJiYgZXJyKSB7XG4gICAgICBwbmEubmV4dFRpY2soZW1pdEVycm9yTlQsIF90aGlzLCBlcnIpO1xuICAgICAgaWYgKF90aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgICAgIF90aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjYikge1xuICAgICAgY2IoZXJyKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB0aGlzO1xufVxuXG5mdW5jdGlvbiB1bmRlc3Ryb3koKSB7XG4gIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZGVkID0gZmFsc2U7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIH1cblxuICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kaW5nID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdEVycm9yTlQoc2VsZiwgZXJyKSB7XG4gIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZGVzdHJveTogZGVzdHJveSxcbiAgdW5kZXN0cm95OiB1bmRlc3Ryb3lcbn07Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/readable-stream/lib/internal/streams/destroy.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/readable-stream/lib/internal/streams/stream-browser.js":
+/*!*****************************************************************************!*\
+ !*** ./node_modules/readable-stream/lib/internal/streams/stream-browser.js ***!
+ \*****************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("module.exports = __webpack_require__(/*! events */ \"./node_modules/events/events.js\").EventEmitter;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3N0cmVhbS1icm93c2VyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3N0cmVhbS1icm93c2VyLmpzPzQyOWIiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG4iXSwibWFwcGluZ3MiOiJBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/readable-stream/lib/internal/streams/stream-browser.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/readable-stream/readable-browser.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/readable-stream/readable-browser.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("exports = module.exports = __webpack_require__(/*! ./lib/_stream_readable.js */ \"./node_modules/readable-stream/lib/_stream_readable.js\");\nexports.Stream = exports;\nexports.Readable = exports;\nexports.Writable = __webpack_require__(/*! ./lib/_stream_writable.js */ \"./node_modules/readable-stream/lib/_stream_writable.js\");\nexports.Duplex = __webpack_require__(/*! ./lib/_stream_duplex.js */ \"./node_modules/readable-stream/lib/_stream_duplex.js\");\nexports.Transform = __webpack_require__(/*! ./lib/_stream_transform.js */ \"./node_modules/readable-stream/lib/_stream_transform.js\");\nexports.PassThrough = __webpack_require__(/*! ./lib/_stream_passthrough.js */ \"./node_modules/readable-stream/lib/_stream_passthrough.js\");\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL3JlYWRhYmxlLWJyb3dzZXIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vcmVhZGFibGUtYnJvd3Nlci5qcz9lMzcyIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fcmVhZGFibGUuanMnKTtcbmV4cG9ydHMuU3RyZWFtID0gZXhwb3J0cztcbmV4cG9ydHMuUmVhZGFibGUgPSBleHBvcnRzO1xuZXhwb3J0cy5Xcml0YWJsZSA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fd3JpdGFibGUuanMnKTtcbmV4cG9ydHMuRHVwbGV4ID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9kdXBsZXguanMnKTtcbmV4cG9ydHMuVHJhbnNmb3JtID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMnKTtcbmV4cG9ydHMuUGFzc1Rocm91Z2ggPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzJyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/readable-stream/readable-browser.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/safe-buffer/index.js":
+/*!*******************************************!*\
+ !*** ./node_modules/safe-buffer/index.js ***!
+ \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/* eslint-disable node/no-deprecated-api */\nvar buffer = __webpack_require__(/*! buffer */ \"./node_modules/buffer/index.js\")\nvar Buffer = buffer.Buffer\n\n// alternative to using Object.keys for old browsers\nfunction copyProps (src, dst) {\n for (var key in src) {\n dst[key] = src[key]\n }\n}\nif (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {\n module.exports = buffer\n} else {\n // Copy properties from require('buffer')\n copyProps(buffer, exports)\n exports.Buffer = SafeBuffer\n}\n\nfunction SafeBuffer (arg, encodingOrOffset, length) {\n return Buffer(arg, encodingOrOffset, length)\n}\n\n// Copy static methods from Buffer\ncopyProps(Buffer, SafeBuffer)\n\nSafeBuffer.from = function (arg, encodingOrOffset, length) {\n if (typeof arg === 'number') {\n throw new TypeError('Argument must not be a number')\n }\n return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.alloc = function (size, fill, encoding) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n var buf = Buffer(size)\n if (fill !== undefined) {\n if (typeof encoding === 'string') {\n buf.fill(fill, encoding)\n } else {\n buf.fill(fill)\n }\n } else {\n buf.fill(0)\n }\n return buf\n}\n\nSafeBuffer.allocUnsafe = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n return Buffer(size)\n}\n\nSafeBuffer.allocUnsafeSlow = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n return buffer.SlowBuffer(size)\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc2FmZS1idWZmZXIvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcz84NzA3Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vZGUvbm8tZGVwcmVjYXRlZC1hcGkgKi9cbnZhciBidWZmZXIgPSByZXF1aXJlKCdidWZmZXInKVxudmFyIEJ1ZmZlciA9IGJ1ZmZlci5CdWZmZXJcblxuLy8gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgT2JqZWN0LmtleXMgZm9yIG9sZCBicm93c2Vyc1xuZnVuY3Rpb24gY29weVByb3BzIChzcmMsIGRzdCkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgZHN0W2tleV0gPSBzcmNba2V5XVxuICB9XG59XG5pZiAoQnVmZmVyLmZyb20gJiYgQnVmZmVyLmFsbG9jICYmIEJ1ZmZlci5hbGxvY1Vuc2FmZSAmJiBCdWZmZXIuYWxsb2NVbnNhZmVTbG93KSB7XG4gIG1vZHVsZS5leHBvcnRzID0gYnVmZmVyXG59IGVsc2Uge1xuICAvLyBDb3B5IHByb3BlcnRpZXMgZnJvbSByZXF1aXJlKCdidWZmZXInKVxuICBjb3B5UHJvcHMoYnVmZmVyLCBleHBvcnRzKVxuICBleHBvcnRzLkJ1ZmZlciA9IFNhZmVCdWZmZXJcbn1cblxuZnVuY3Rpb24gU2FmZUJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuLy8gQ29weSBzdGF0aWMgbWV0aG9kcyBmcm9tIEJ1ZmZlclxuY29weVByb3BzKEJ1ZmZlciwgU2FmZUJ1ZmZlcilcblxuU2FmZUJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICB2YXIgYnVmID0gQnVmZmVyKHNpemUpXG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgYnVmLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGJ1Zi5maWxsKDApXG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoc2l6ZSlcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlci5TbG93QnVmZmVyKHNpemUpXG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/safe-buffer/index.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/setimmediate/setImmediate.js":
+/*!***************************************************!*\
+ !*** ./node_modules/setimmediate/setImmediate.js ***!
+ \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) {\n \"use strict\";\n\n if (global.setImmediate) {\n return;\n }\n\n var nextHandle = 1; // Spec says greater than zero\n var tasksByHandle = {};\n var currentlyRunningATask = false;\n var doc = global.document;\n var registerImmediate;\n\n function setImmediate(callback) {\n // Callback can either be a function or a string\n if (typeof callback !== \"function\") {\n callback = new Function(\"\" + callback);\n }\n // Copy function arguments\n var args = new Array(arguments.length - 1);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i + 1];\n }\n // Store and register the task\n var task = { callback: callback, args: args };\n tasksByHandle[nextHandle] = task;\n registerImmediate(nextHandle);\n return nextHandle++;\n }\n\n function clearImmediate(handle) {\n delete tasksByHandle[handle];\n }\n\n function run(task) {\n var callback = task.callback;\n var args = task.args;\n switch (args.length) {\n case 0:\n callback();\n break;\n case 1:\n callback(args[0]);\n break;\n case 2:\n callback(args[0], args[1]);\n break;\n case 3:\n callback(args[0], args[1], args[2]);\n break;\n default:\n callback.apply(undefined, args);\n break;\n }\n }\n\n function runIfPresent(handle) {\n // From the spec: \"Wait until any invocations of this algorithm started before this one have completed.\"\n // So if we're currently running a task, we'll need to delay this invocation.\n if (currentlyRunningATask) {\n // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a\n // \"too much recursion\" error.\n setTimeout(runIfPresent, 0, handle);\n } else {\n var task = tasksByHandle[handle];\n if (task) {\n currentlyRunningATask = true;\n try {\n run(task);\n } finally {\n clearImmediate(handle);\n currentlyRunningATask = false;\n }\n }\n }\n }\n\n function installNextTickImplementation() {\n registerImmediate = function(handle) {\n process.nextTick(function () { runIfPresent(handle); });\n };\n }\n\n function canUsePostMessage() {\n // The test against `importScripts` prevents this implementation from being installed inside a web worker,\n // where `global.postMessage` means something completely different and can't be used for this purpose.\n if (global.postMessage && !global.importScripts) {\n var postMessageIsAsynchronous = true;\n var oldOnMessage = global.onmessage;\n global.onmessage = function() {\n postMessageIsAsynchronous = false;\n };\n global.postMessage(\"\", \"*\");\n global.onmessage = oldOnMessage;\n return postMessageIsAsynchronous;\n }\n }\n\n function installPostMessageImplementation() {\n // Installs an event handler on `global` for the `message` event: see\n // * https://developer.mozilla.org/en/DOM/window.postMessage\n // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages\n\n var messagePrefix = \"setImmediate$\" + Math.random() + \"$\";\n var onGlobalMessage = function(event) {\n if (event.source === global &&\n typeof event.data === \"string\" &&\n event.data.indexOf(messagePrefix) === 0) {\n runIfPresent(+event.data.slice(messagePrefix.length));\n }\n };\n\n if (global.addEventListener) {\n global.addEventListener(\"message\", onGlobalMessage, false);\n } else {\n global.attachEvent(\"onmessage\", onGlobalMessage);\n }\n\n registerImmediate = function(handle) {\n global.postMessage(messagePrefix + handle, \"*\");\n };\n }\n\n function installMessageChannelImplementation() {\n var channel = new MessageChannel();\n channel.port1.onmessage = function(event) {\n var handle = event.data;\n runIfPresent(handle);\n };\n\n registerImmediate = function(handle) {\n channel.port2.postMessage(handle);\n };\n }\n\n function installReadyStateChangeImplementation() {\n var html = doc.documentElement;\n registerImmediate = function(handle) {\n // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted\n // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n var script = doc.createElement(\"script\");\n script.onreadystatechange = function () {\n runIfPresent(handle);\n script.onreadystatechange = null;\n html.removeChild(script);\n script = null;\n };\n html.appendChild(script);\n };\n }\n\n function installSetTimeoutImplementation() {\n registerImmediate = function(handle) {\n setTimeout(runIfPresent, 0, handle);\n };\n }\n\n // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.\n var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);\n attachTo = attachTo && attachTo.setTimeout ? attachTo : global;\n\n // Don't get fooled by e.g. browserify environments.\n if ({}.toString.call(global.process) === \"[object process]\") {\n // For Node.js before 0.9\n installNextTickImplementation();\n\n } else if (canUsePostMessage()) {\n // For non-IE10 modern browsers\n installPostMessageImplementation();\n\n } else if (global.MessageChannel) {\n // For web workers, where supported\n installMessageChannelImplementation();\n\n } else if (doc && \"onreadystatechange\" in doc.createElement(\"script\")) {\n // For IE 6–8\n installReadyStateChangeImplementation();\n\n } else {\n // For older browsers\n installSetTimeoutImplementation();\n }\n\n attachTo.setImmediate = setImmediate;\n attachTo.clearImmediate = clearImmediate;\n}(typeof self === \"undefined\" ? typeof global === \"undefined\" ? this : global : self));\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\"), __webpack_require__(/*! ./../process/browser.js */ \"./node_modules/process/browser.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc2V0aW1tZWRpYXRlL3NldEltbWVkaWF0ZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL3NldGltbWVkaWF0ZS9zZXRJbW1lZGlhdGUuanM/NjAxNyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gKGdsb2JhbCwgdW5kZWZpbmVkKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBpZiAoZ2xvYmFsLnNldEltbWVkaWF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5leHRIYW5kbGUgPSAxOyAvLyBTcGVjIHNheXMgZ3JlYXRlciB0aGFuIHplcm9cbiAgICB2YXIgdGFza3NCeUhhbmRsZSA9IHt9O1xuICAgIHZhciBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICB2YXIgZG9jID0gZ2xvYmFsLmRvY3VtZW50O1xuICAgIHZhciByZWdpc3RlckltbWVkaWF0ZTtcblxuICAgIGZ1bmN0aW9uIHNldEltbWVkaWF0ZShjYWxsYmFjaykge1xuICAgICAgLy8gQ2FsbGJhY2sgY2FuIGVpdGhlciBiZSBhIGZ1bmN0aW9uIG9yIGEgc3RyaW5nXG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBuZXcgRnVuY3Rpb24oXCJcIiArIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICAgIC8vIENvcHkgZnVuY3Rpb24gYXJndW1lbnRzXG4gICAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2kgKyAxXTtcbiAgICAgIH1cbiAgICAgIC8vIFN0b3JlIGFuZCByZWdpc3RlciB0aGUgdGFza1xuICAgICAgdmFyIHRhc2sgPSB7IGNhbGxiYWNrOiBjYWxsYmFjaywgYXJnczogYXJncyB9O1xuICAgICAgdGFza3NCeUhhbmRsZVtuZXh0SGFuZGxlXSA9IHRhc2s7XG4gICAgICByZWdpc3RlckltbWVkaWF0ZShuZXh0SGFuZGxlKTtcbiAgICAgIHJldHVybiBuZXh0SGFuZGxlKys7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaGFuZGxlKSB7XG4gICAgICAgIGRlbGV0ZSB0YXNrc0J5SGFuZGxlW2hhbmRsZV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuKHRhc2spIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gdGFzay5jYWxsYmFjaztcbiAgICAgICAgdmFyIGFyZ3MgPSB0YXNrLmFyZ3M7XG4gICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuSWZQcmVzZW50KGhhbmRsZSkge1xuICAgICAgICAvLyBGcm9tIHRoZSBzcGVjOiBcIldhaXQgdW50aWwgYW55IGludm9jYXRpb25zIG9mIHRoaXMgYWxnb3JpdGhtIHN0YXJ0ZWQgYmVmb3JlIHRoaXMgb25lIGhhdmUgY29tcGxldGVkLlwiXG4gICAgICAgIC8vIFNvIGlmIHdlJ3JlIGN1cnJlbnRseSBydW5uaW5nIGEgdGFzaywgd2UnbGwgbmVlZCB0byBkZWxheSB0aGlzIGludm9jYXRpb24uXG4gICAgICAgIGlmIChjdXJyZW50bHlSdW5uaW5nQVRhc2spIHtcbiAgICAgICAgICAgIC8vIERlbGF5IGJ5IGRvaW5nIGEgc2V0VGltZW91dC4gc2V0SW1tZWRpYXRlIHdhcyB0cmllZCBpbnN0ZWFkLCBidXQgaW4gRmlyZWZveCA3IGl0IGdlbmVyYXRlZCBhXG4gICAgICAgICAgICAvLyBcInRvbyBtdWNoIHJlY3Vyc2lvblwiIGVycm9yLlxuICAgICAgICAgICAgc2V0VGltZW91dChydW5JZlByZXNlbnQsIDAsIGhhbmRsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdGFzayA9IHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICAgICAgICAgIGlmICh0YXNrKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBydW4odGFzayk7XG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbW1lZGlhdGUoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHsgcnVuSWZQcmVzZW50KGhhbmRsZSk7IH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhblVzZVBvc3RNZXNzYWdlKCkge1xuICAgICAgICAvLyBUaGUgdGVzdCBhZ2FpbnN0IGBpbXBvcnRTY3JpcHRzYCBwcmV2ZW50cyB0aGlzIGltcGxlbWVudGF0aW9uIGZyb20gYmVpbmcgaW5zdGFsbGVkIGluc2lkZSBhIHdlYiB3b3JrZXIsXG4gICAgICAgIC8vIHdoZXJlIGBnbG9iYWwucG9zdE1lc3NhZ2VgIG1lYW5zIHNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudCBhbmQgY2FuJ3QgYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLlxuICAgICAgICBpZiAoZ2xvYmFsLnBvc3RNZXNzYWdlICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cykge1xuICAgICAgICAgICAgdmFyIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIG9sZE9uTWVzc2FnZSA9IGdsb2JhbC5vbm1lc3NhZ2U7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IGZhbHNlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShcIlwiLCBcIipcIik7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gb2xkT25NZXNzYWdlO1xuICAgICAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgLy8gSW5zdGFsbHMgYW4gZXZlbnQgaGFuZGxlciBvbiBgZ2xvYmFsYCBmb3IgdGhlIGBtZXNzYWdlYCBldmVudDogc2VlXG4gICAgICAgIC8vICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vRE9NL3dpbmRvdy5wb3N0TWVzc2FnZVxuICAgICAgICAvLyAqIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL2NvbW1zLmh0bWwjY3Jvc3NEb2N1bWVudE1lc3NhZ2VzXG5cbiAgICAgICAgdmFyIG1lc3NhZ2VQcmVmaXggPSBcInNldEltbWVkaWF0ZSRcIiArIE1hdGgucmFuZG9tKCkgKyBcIiRcIjtcbiAgICAgICAgdmFyIG9uR2xvYmFsTWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlID09PSBnbG9iYWwgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnQuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEuaW5kZXhPZihtZXNzYWdlUHJlZml4KSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJ1bklmUHJlc2VudCgrZXZlbnQuZGF0YS5zbGljZShtZXNzYWdlUHJlZml4Lmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSwgZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2xvYmFsLmF0dGFjaEV2ZW50KFwib25tZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKG1lc3NhZ2VQcmVmaXggKyBoYW5kbGUsIFwiKlwiKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGV2ZW50LmRhdGE7XG4gICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZShoYW5kbGUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBodG1sID0gZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIDxzY3JpcHQ+IGVsZW1lbnQ7IGl0cyByZWFkeXN0YXRlY2hhbmdlIGV2ZW50IHdpbGwgYmUgZmlyZWQgYXN5bmNocm9ub3VzbHkgb25jZSBpdCBpcyBpbnNlcnRlZFxuICAgICAgICAgICAgLy8gaW50byB0aGUgZG9jdW1lbnQuIERvIHNvLCB0aHVzIHF1ZXVpbmcgdXAgdGhlIHRhc2suIFJlbWVtYmVyIHRvIGNsZWFuIHVwIG9uY2UgaXQncyBiZWVuIGNhbGxlZC5cbiAgICAgICAgICAgIHZhciBzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcbiAgICAgICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcnVuSWZQcmVzZW50KGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaHRtbC5yZW1vdmVDaGlsZChzY3JpcHQpO1xuICAgICAgICAgICAgICAgIHNjcmlwdCA9IG51bGw7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaHRtbC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJ1bklmUHJlc2VudCwgMCwgaGFuZGxlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJZiBzdXBwb3J0ZWQsIHdlIHNob3VsZCBhdHRhY2ggdG8gdGhlIHByb3RvdHlwZSBvZiBnbG9iYWwsIHNpbmNlIHRoYXQgaXMgd2hlcmUgc2V0VGltZW91dCBldCBhbC4gbGl2ZS5cbiAgICB2YXIgYXR0YWNoVG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKGdsb2JhbCk7XG4gICAgYXR0YWNoVG8gPSBhdHRhY2hUbyAmJiBhdHRhY2hUby5zZXRUaW1lb3V0ID8gYXR0YWNoVG8gOiBnbG9iYWw7XG5cbiAgICAvLyBEb24ndCBnZXQgZm9vbGVkIGJ5IGUuZy4gYnJvd3NlcmlmeSBlbnZpcm9ubWVudHMuXG4gICAgaWYgKHt9LnRvU3RyaW5nLmNhbGwoZ2xvYmFsLnByb2Nlc3MpID09PSBcIltvYmplY3QgcHJvY2Vzc11cIikge1xuICAgICAgICAvLyBGb3IgTm9kZS5qcyBiZWZvcmUgMC45XG4gICAgICAgIGluc3RhbGxOZXh0VGlja0ltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGNhblVzZVBvc3RNZXNzYWdlKCkpIHtcbiAgICAgICAgLy8gRm9yIG5vbi1JRTEwIG1vZGVybiBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChnbG9iYWwuTWVzc2FnZUNoYW5uZWwpIHtcbiAgICAgICAgLy8gRm9yIHdlYiB3b3JrZXJzLCB3aGVyZSBzdXBwb3J0ZWRcbiAgICAgICAgaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoZG9jICYmIFwib25yZWFkeXN0YXRlY2hhbmdlXCIgaW4gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIikpIHtcbiAgICAgICAgLy8gRm9yIElFIDbigJM4XG4gICAgICAgIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvciBvbGRlciBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsU2V0VGltZW91dEltcGxlbWVudGF0aW9uKCk7XG4gICAgfVxuXG4gICAgYXR0YWNoVG8uc2V0SW1tZWRpYXRlID0gc2V0SW1tZWRpYXRlO1xuICAgIGF0dGFjaFRvLmNsZWFySW1tZWRpYXRlID0gY2xlYXJJbW1lZGlhdGU7XG59KHR5cGVvZiBzZWxmID09PSBcInVuZGVmaW5lZFwiID8gdHlwZW9mIGdsb2JhbCA9PT0gXCJ1bmRlZmluZWRcIiA/IHRoaXMgOiBnbG9iYWwgOiBzZWxmKSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/setimmediate/setImmediate.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/stream-http/index.js":
+/*!*******************************************!*\
+ !*** ./node_modules/stream-http/index.js ***!
+ \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/* WEBPACK VAR INJECTION */(function(global) {var ClientRequest = __webpack_require__(/*! ./lib/request */ \"./node_modules/stream-http/lib/request.js\")\nvar response = __webpack_require__(/*! ./lib/response */ \"./node_modules/stream-http/lib/response.js\")\nvar extend = __webpack_require__(/*! xtend */ \"./node_modules/xtend/immutable.js\")\nvar statusCodes = __webpack_require__(/*! builtin-status-codes */ \"./node_modules/builtin-status-codes/browser.js\")\nvar url = __webpack_require__(/*! url */ \"./node_modules/url/url.js\")\n\nvar http = exports\n\nhttp.request = function (opts, cb) {\n\tif (typeof opts === 'string')\n\t\topts = url.parse(opts)\n\telse\n\t\topts = extend(opts)\n\n\t// Normally, the page is loaded from http or https, so not specifying a protocol\n\t// will result in a (valid) protocol-relative url. However, this won't work if\n\t// the protocol is something else, like 'file:'\n\tvar defaultProtocol = global.location.protocol.search(/^https?:$/) === -1 ? 'http:' : ''\n\n\tvar protocol = opts.protocol || defaultProtocol\n\tvar host = opts.hostname || opts.host\n\tvar port = opts.port\n\tvar path = opts.path || '/'\n\n\t// Necessary for IPv6 addresses\n\tif (host && host.indexOf(':') !== -1)\n\t\thost = '[' + host + ']'\n\n\t// This may be a relative url. The browser should always be able to interpret it correctly.\n\topts.url = (host ? (protocol + '//' + host) : '') + (port ? ':' + port : '') + path\n\topts.method = (opts.method || 'GET').toUpperCase()\n\topts.headers = opts.headers || {}\n\n\t// Also valid opts.auth, opts.mode\n\n\tvar req = new ClientRequest(opts)\n\tif (cb)\n\t\treq.on('response', cb)\n\treturn req\n}\n\nhttp.get = function get (opts, cb) {\n\tvar req = http.request(opts, cb)\n\treq.end()\n\treturn req\n}\n\nhttp.ClientRequest = ClientRequest\nhttp.IncomingMessage = response.IncomingMessage\n\nhttp.Agent = function () {}\nhttp.Agent.defaultMaxSockets = 4\n\nhttp.globalAgent = new http.Agent()\n\nhttp.STATUS_CODES = statusCodes\n\nhttp.METHODS = [\n\t'CHECKOUT',\n\t'CONNECT',\n\t'COPY',\n\t'DELETE',\n\t'GET',\n\t'HEAD',\n\t'LOCK',\n\t'M-SEARCH',\n\t'MERGE',\n\t'MKACTIVITY',\n\t'MKCOL',\n\t'MOVE',\n\t'NOTIFY',\n\t'OPTIONS',\n\t'PATCH',\n\t'POST',\n\t'PROPFIND',\n\t'PROPPATCH',\n\t'PURGE',\n\t'PUT',\n\t'REPORT',\n\t'SEARCH',\n\t'SUBSCRIBE',\n\t'TRACE',\n\t'UNLOCK',\n\t'UNSUBSCRIBE'\n]\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9pbmRleC5qcz85NDkwIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBDbGllbnRSZXF1ZXN0ID0gcmVxdWlyZSgnLi9saWIvcmVxdWVzdCcpXG52YXIgcmVzcG9uc2UgPSByZXF1aXJlKCcuL2xpYi9yZXNwb25zZScpXG52YXIgZXh0ZW5kID0gcmVxdWlyZSgneHRlbmQnKVxudmFyIHN0YXR1c0NvZGVzID0gcmVxdWlyZSgnYnVpbHRpbi1zdGF0dXMtY29kZXMnKVxudmFyIHVybCA9IHJlcXVpcmUoJ3VybCcpXG5cbnZhciBodHRwID0gZXhwb3J0c1xuXG5odHRwLnJlcXVlc3QgPSBmdW5jdGlvbiAob3B0cywgY2IpIHtcblx0aWYgKHR5cGVvZiBvcHRzID09PSAnc3RyaW5nJylcblx0XHRvcHRzID0gdXJsLnBhcnNlKG9wdHMpXG5cdGVsc2Vcblx0XHRvcHRzID0gZXh0ZW5kKG9wdHMpXG5cblx0Ly8gTm9ybWFsbHksIHRoZSBwYWdlIGlzIGxvYWRlZCBmcm9tIGh0dHAgb3IgaHR0cHMsIHNvIG5vdCBzcGVjaWZ5aW5nIGEgcHJvdG9jb2xcblx0Ly8gd2lsbCByZXN1bHQgaW4gYSAodmFsaWQpIHByb3RvY29sLXJlbGF0aXZlIHVybC4gSG93ZXZlciwgdGhpcyB3b24ndCB3b3JrIGlmXG5cdC8vIHRoZSBwcm90b2NvbCBpcyBzb21ldGhpbmcgZWxzZSwgbGlrZSAnZmlsZTonXG5cdHZhciBkZWZhdWx0UHJvdG9jb2wgPSBnbG9iYWwubG9jYXRpb24ucHJvdG9jb2wuc2VhcmNoKC9eaHR0cHM/OiQvKSA9PT0gLTEgPyAnaHR0cDonIDogJydcblxuXHR2YXIgcHJvdG9jb2wgPSBvcHRzLnByb3RvY29sIHx8IGRlZmF1bHRQcm90b2NvbFxuXHR2YXIgaG9zdCA9IG9wdHMuaG9zdG5hbWUgfHwgb3B0cy5ob3N0XG5cdHZhciBwb3J0ID0gb3B0cy5wb3J0XG5cdHZhciBwYXRoID0gb3B0cy5wYXRoIHx8ICcvJ1xuXG5cdC8vIE5lY2Vzc2FyeSBmb3IgSVB2NiBhZGRyZXNzZXNcblx0aWYgKGhvc3QgJiYgaG9zdC5pbmRleE9mKCc6JykgIT09IC0xKVxuXHRcdGhvc3QgPSAnWycgKyBob3N0ICsgJ10nXG5cblx0Ly8gVGhpcyBtYXkgYmUgYSByZWxhdGl2ZSB1cmwuIFRoZSBicm93c2VyIHNob3VsZCBhbHdheXMgYmUgYWJsZSB0byBpbnRlcnByZXQgaXQgY29ycmVjdGx5LlxuXHRvcHRzLnVybCA9IChob3N0ID8gKHByb3RvY29sICsgJy8vJyArIGhvc3QpIDogJycpICsgKHBvcnQgPyAnOicgKyBwb3J0IDogJycpICsgcGF0aFxuXHRvcHRzLm1ldGhvZCA9IChvcHRzLm1ldGhvZCB8fCAnR0VUJykudG9VcHBlckNhc2UoKVxuXHRvcHRzLmhlYWRlcnMgPSBvcHRzLmhlYWRlcnMgfHwge31cblxuXHQvLyBBbHNvIHZhbGlkIG9wdHMuYXV0aCwgb3B0cy5tb2RlXG5cblx0dmFyIHJlcSA9IG5ldyBDbGllbnRSZXF1ZXN0KG9wdHMpXG5cdGlmIChjYilcblx0XHRyZXEub24oJ3Jlc3BvbnNlJywgY2IpXG5cdHJldHVybiByZXFcbn1cblxuaHR0cC5nZXQgPSBmdW5jdGlvbiBnZXQgKG9wdHMsIGNiKSB7XG5cdHZhciByZXEgPSBodHRwLnJlcXVlc3Qob3B0cywgY2IpXG5cdHJlcS5lbmQoKVxuXHRyZXR1cm4gcmVxXG59XG5cbmh0dHAuQ2xpZW50UmVxdWVzdCA9IENsaWVudFJlcXVlc3Rcbmh0dHAuSW5jb21pbmdNZXNzYWdlID0gcmVzcG9uc2UuSW5jb21pbmdNZXNzYWdlXG5cbmh0dHAuQWdlbnQgPSBmdW5jdGlvbiAoKSB7fVxuaHR0cC5BZ2VudC5kZWZhdWx0TWF4U29ja2V0cyA9IDRcblxuaHR0cC5nbG9iYWxBZ2VudCA9IG5ldyBodHRwLkFnZW50KClcblxuaHR0cC5TVEFUVVNfQ09ERVMgPSBzdGF0dXNDb2Rlc1xuXG5odHRwLk1FVEhPRFMgPSBbXG5cdCdDSEVDS09VVCcsXG5cdCdDT05ORUNUJyxcblx0J0NPUFknLFxuXHQnREVMRVRFJyxcblx0J0dFVCcsXG5cdCdIRUFEJyxcblx0J0xPQ0snLFxuXHQnTS1TRUFSQ0gnLFxuXHQnTUVSR0UnLFxuXHQnTUtBQ1RJVklUWScsXG5cdCdNS0NPTCcsXG5cdCdNT1ZFJyxcblx0J05PVElGWScsXG5cdCdPUFRJT05TJyxcblx0J1BBVENIJyxcblx0J1BPU1QnLFxuXHQnUFJPUEZJTkQnLFxuXHQnUFJPUFBBVENIJyxcblx0J1BVUkdFJyxcblx0J1BVVCcsXG5cdCdSRVBPUlQnLFxuXHQnU0VBUkNIJyxcblx0J1NVQlNDUklCRScsXG5cdCdUUkFDRScsXG5cdCdVTkxPQ0snLFxuXHQnVU5TVUJTQ1JJQkUnXG5dIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/stream-http/index.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/stream-http/lib/capability.js":
+/*!****************************************************!*\
+ !*** ./node_modules/stream-http/lib/capability.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/* WEBPACK VAR INJECTION */(function(global) {exports.fetch = isFunction(global.fetch) && isFunction(global.ReadableStream)\n\nexports.writableStream = isFunction(global.WritableStream)\n\nexports.abortController = isFunction(global.AbortController)\n\nexports.blobConstructor = false\ntry {\n\tnew Blob([new ArrayBuffer(1)])\n\texports.blobConstructor = true\n} catch (e) {}\n\n// The xhr request to example.com may violate some restrictive CSP configurations,\n// so if we're running in a browser that supports `fetch`, avoid calling getXHR()\n// and assume support for certain features below.\nvar xhr\nfunction getXHR () {\n\t// Cache the xhr value\n\tif (xhr !== undefined) return xhr\n\n\tif (global.XMLHttpRequest) {\n\t\txhr = new global.XMLHttpRequest()\n\t\t// If XDomainRequest is available (ie only, where xhr might not work\n\t\t// cross domain), use the page location. Otherwise use example.com\n\t\t// Note: this doesn't actually make an http request.\n\t\ttry {\n\t\t\txhr.open('GET', global.XDomainRequest ? '/' : 'https://example.com')\n\t\t} catch(e) {\n\t\t\txhr = null\n\t\t}\n\t} else {\n\t\t// Service workers don't have XHR\n\t\txhr = null\n\t}\n\treturn xhr\n}\n\nfunction checkTypeSupport (type) {\n\tvar xhr = getXHR()\n\tif (!xhr) return false\n\ttry {\n\t\txhr.responseType = type\n\t\treturn xhr.responseType === type\n\t} catch (e) {}\n\treturn false\n}\n\n// For some strange reason, Safari 7.0 reports typeof global.ArrayBuffer === 'object'.\n// Safari 7.1 appears to have fixed this bug.\nvar haveArrayBuffer = typeof global.ArrayBuffer !== 'undefined'\nvar haveSlice = haveArrayBuffer && isFunction(global.ArrayBuffer.prototype.slice)\n\n// If fetch is supported, then arraybuffer will be supported too. Skip calling\n// checkTypeSupport(), since that calls getXHR().\nexports.arraybuffer = exports.fetch || (haveArrayBuffer && checkTypeSupport('arraybuffer'))\n\n// These next two tests unavoidably show warnings in Chrome. Since fetch will always\n// be used if it's available, just return false for these to avoid the warnings.\nexports.msstream = !exports.fetch && haveSlice && checkTypeSupport('ms-stream')\nexports.mozchunkedarraybuffer = !exports.fetch && haveArrayBuffer &&\n\tcheckTypeSupport('moz-chunked-arraybuffer')\n\n// If fetch is supported, then overrideMimeType will be supported too. Skip calling\n// getXHR().\nexports.overrideMimeType = exports.fetch || (getXHR() ? isFunction(getXHR().overrideMimeType) : false)\n\nexports.vbArray = isFunction(global.VBArray)\n\nfunction isFunction (value) {\n\treturn typeof value === 'function'\n}\n\nxhr = null // Help gc\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbGliL2NhcGFiaWxpdHkuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9saWIvY2FwYWJpbGl0eS5qcz9hOWYxIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMuZmV0Y2ggPSBpc0Z1bmN0aW9uKGdsb2JhbC5mZXRjaCkgJiYgaXNGdW5jdGlvbihnbG9iYWwuUmVhZGFibGVTdHJlYW0pXG5cbmV4cG9ydHMud3JpdGFibGVTdHJlYW0gPSBpc0Z1bmN0aW9uKGdsb2JhbC5Xcml0YWJsZVN0cmVhbSlcblxuZXhwb3J0cy5hYm9ydENvbnRyb2xsZXIgPSBpc0Z1bmN0aW9uKGdsb2JhbC5BYm9ydENvbnRyb2xsZXIpXG5cbmV4cG9ydHMuYmxvYkNvbnN0cnVjdG9yID0gZmFsc2VcbnRyeSB7XG5cdG5ldyBCbG9iKFtuZXcgQXJyYXlCdWZmZXIoMSldKVxuXHRleHBvcnRzLmJsb2JDb25zdHJ1Y3RvciA9IHRydWVcbn0gY2F0Y2ggKGUpIHt9XG5cbi8vIFRoZSB4aHIgcmVxdWVzdCB0byBleGFtcGxlLmNvbSBtYXkgdmlvbGF0ZSBzb21lIHJlc3RyaWN0aXZlIENTUCBjb25maWd1cmF0aW9ucyxcbi8vIHNvIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSBicm93c2VyIHRoYXQgc3VwcG9ydHMgYGZldGNoYCwgYXZvaWQgY2FsbGluZyBnZXRYSFIoKVxuLy8gYW5kIGFzc3VtZSBzdXBwb3J0IGZvciBjZXJ0YWluIGZlYXR1cmVzIGJlbG93LlxudmFyIHhoclxuZnVuY3Rpb24gZ2V0WEhSICgpIHtcblx0Ly8gQ2FjaGUgdGhlIHhociB2YWx1ZVxuXHRpZiAoeGhyICE9PSB1bmRlZmluZWQpIHJldHVybiB4aHJcblxuXHRpZiAoZ2xvYmFsLlhNTEh0dHBSZXF1ZXN0KSB7XG5cdFx0eGhyID0gbmV3IGdsb2JhbC5YTUxIdHRwUmVxdWVzdCgpXG5cdFx0Ly8gSWYgWERvbWFpblJlcXVlc3QgaXMgYXZhaWxhYmxlIChpZSBvbmx5LCB3aGVyZSB4aHIgbWlnaHQgbm90IHdvcmtcblx0XHQvLyBjcm9zcyBkb21haW4pLCB1c2UgdGhlIHBhZ2UgbG9jYXRpb24uIE90aGVyd2lzZSB1c2UgZXhhbXBsZS5jb21cblx0XHQvLyBOb3RlOiB0aGlzIGRvZXNuJ3QgYWN0dWFsbHkgbWFrZSBhbiBodHRwIHJlcXVlc3QuXG5cdFx0dHJ5IHtcblx0XHRcdHhoci5vcGVuKCdHRVQnLCBnbG9iYWwuWERvbWFpblJlcXVlc3QgPyAnLycgOiAnaHR0cHM6Ly9leGFtcGxlLmNvbScpXG5cdFx0fSBjYXRjaChlKSB7XG5cdFx0XHR4aHIgPSBudWxsXG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIFNlcnZpY2Ugd29ya2VycyBkb24ndCBoYXZlIFhIUlxuXHRcdHhociA9IG51bGxcblx0fVxuXHRyZXR1cm4geGhyXG59XG5cbmZ1bmN0aW9uIGNoZWNrVHlwZVN1cHBvcnQgKHR5cGUpIHtcblx0dmFyIHhociA9IGdldFhIUigpXG5cdGlmICgheGhyKSByZXR1cm4gZmFsc2Vcblx0dHJ5IHtcblx0XHR4aHIucmVzcG9uc2VUeXBlID0gdHlwZVxuXHRcdHJldHVybiB4aHIucmVzcG9uc2VUeXBlID09PSB0eXBlXG5cdH0gY2F0Y2ggKGUpIHt9XG5cdHJldHVybiBmYWxzZVxufVxuXG4vLyBGb3Igc29tZSBzdHJhbmdlIHJlYXNvbiwgU2FmYXJpIDcuMCByZXBvcnRzIHR5cGVvZiBnbG9iYWwuQXJyYXlCdWZmZXIgPT09ICdvYmplY3QnLlxuLy8gU2FmYXJpIDcuMSBhcHBlYXJzIHRvIGhhdmUgZml4ZWQgdGhpcyBidWcuXG52YXIgaGF2ZUFycmF5QnVmZmVyID0gdHlwZW9mIGdsb2JhbC5BcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCdcbnZhciBoYXZlU2xpY2UgPSBoYXZlQXJyYXlCdWZmZXIgJiYgaXNGdW5jdGlvbihnbG9iYWwuQXJyYXlCdWZmZXIucHJvdG90eXBlLnNsaWNlKVxuXG4vLyBJZiBmZXRjaCBpcyBzdXBwb3J0ZWQsIHRoZW4gYXJyYXlidWZmZXIgd2lsbCBiZSBzdXBwb3J0ZWQgdG9vLiBTa2lwIGNhbGxpbmdcbi8vIGNoZWNrVHlwZVN1cHBvcnQoKSwgc2luY2UgdGhhdCBjYWxscyBnZXRYSFIoKS5cbmV4cG9ydHMuYXJyYXlidWZmZXIgPSBleHBvcnRzLmZldGNoIHx8IChoYXZlQXJyYXlCdWZmZXIgJiYgY2hlY2tUeXBlU3VwcG9ydCgnYXJyYXlidWZmZXInKSlcblxuLy8gVGhlc2UgbmV4dCB0d28gdGVzdHMgdW5hdm9pZGFibHkgc2hvdyB3YXJuaW5ncyBpbiBDaHJvbWUuIFNpbmNlIGZldGNoIHdpbGwgYWx3YXlzXG4vLyBiZSB1c2VkIGlmIGl0J3MgYXZhaWxhYmxlLCBqdXN0IHJldHVybiBmYWxzZSBmb3IgdGhlc2UgdG8gYXZvaWQgdGhlIHdhcm5pbmdzLlxuZXhwb3J0cy5tc3N0cmVhbSA9ICFleHBvcnRzLmZldGNoICYmIGhhdmVTbGljZSAmJiBjaGVja1R5cGVTdXBwb3J0KCdtcy1zdHJlYW0nKVxuZXhwb3J0cy5tb3pjaHVua2VkYXJyYXlidWZmZXIgPSAhZXhwb3J0cy5mZXRjaCAmJiBoYXZlQXJyYXlCdWZmZXIgJiZcblx0Y2hlY2tUeXBlU3VwcG9ydCgnbW96LWNodW5rZWQtYXJyYXlidWZmZXInKVxuXG4vLyBJZiBmZXRjaCBpcyBzdXBwb3J0ZWQsIHRoZW4gb3ZlcnJpZGVNaW1lVHlwZSB3aWxsIGJlIHN1cHBvcnRlZCB0b28uIFNraXAgY2FsbGluZ1xuLy8gZ2V0WEhSKCkuXG5leHBvcnRzLm92ZXJyaWRlTWltZVR5cGUgPSBleHBvcnRzLmZldGNoIHx8IChnZXRYSFIoKSA/IGlzRnVuY3Rpb24oZ2V0WEhSKCkub3ZlcnJpZGVNaW1lVHlwZSkgOiBmYWxzZSlcblxuZXhwb3J0cy52YkFycmF5ID0gaXNGdW5jdGlvbihnbG9iYWwuVkJBcnJheSlcblxuZnVuY3Rpb24gaXNGdW5jdGlvbiAodmFsdWUpIHtcblx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJ1xufVxuXG54aHIgPSBudWxsIC8vIEhlbHAgZ2NcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/stream-http/lib/capability.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/stream-http/lib/request.js":
+/*!*************************************************!*\
+ !*** ./node_modules/stream-http/lib/request.js ***!
+ \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/* WEBPACK VAR INJECTION */(function(Buffer, global, process) {var capability = __webpack_require__(/*! ./capability */ \"./node_modules/stream-http/lib/capability.js\")\nvar inherits = __webpack_require__(/*! inherits */ \"./node_modules/inherits/inherits_browser.js\")\nvar response = __webpack_require__(/*! ./response */ \"./node_modules/stream-http/lib/response.js\")\nvar stream = __webpack_require__(/*! readable-stream */ \"./node_modules/readable-stream/readable-browser.js\")\nvar toArrayBuffer = __webpack_require__(/*! to-arraybuffer */ \"./node_modules/to-arraybuffer/index.js\")\n\nvar IncomingMessage = response.IncomingMessage\nvar rStates = response.readyStates\n\nfunction decideMode (preferBinary, useFetch) {\n\tif (capability.fetch && useFetch) {\n\t\treturn 'fetch'\n\t} else if (capability.mozchunkedarraybuffer) {\n\t\treturn 'moz-chunked-arraybuffer'\n\t} else if (capability.msstream) {\n\t\treturn 'ms-stream'\n\t} else if (capability.arraybuffer && preferBinary) {\n\t\treturn 'arraybuffer'\n\t} else if (capability.vbArray && preferBinary) {\n\t\treturn 'text:vbarray'\n\t} else {\n\t\treturn 'text'\n\t}\n}\n\nvar ClientRequest = module.exports = function (opts) {\n\tvar self = this\n\tstream.Writable.call(self)\n\n\tself._opts = opts\n\tself._body = []\n\tself._headers = {}\n\tif (opts.auth)\n\t\tself.setHeader('Authorization', 'Basic ' + new Buffer(opts.auth).toString('base64'))\n\tObject.keys(opts.headers).forEach(function (name) {\n\t\tself.setHeader(name, opts.headers[name])\n\t})\n\n\tvar preferBinary\n\tvar useFetch = true\n\tif (opts.mode === 'disable-fetch' || ('requestTimeout' in opts && !capability.abortController)) {\n\t\t// If the use of XHR should be preferred. Not typically needed.\n\t\tuseFetch = false\n\t\tpreferBinary = true\n\t} else if (opts.mode === 'prefer-streaming') {\n\t\t// If streaming is a high priority but binary compatibility and\n\t\t// the accuracy of the 'content-type' header aren't\n\t\tpreferBinary = false\n\t} else if (opts.mode === 'allow-wrong-content-type') {\n\t\t// If streaming is more important than preserving the 'content-type' header\n\t\tpreferBinary = !capability.overrideMimeType\n\t} else if (!opts.mode || opts.mode === 'default' || opts.mode === 'prefer-fast') {\n\t\t// Use binary if text streaming may corrupt data or the content-type header, or for speed\n\t\tpreferBinary = true\n\t} else {\n\t\tthrow new Error('Invalid value for opts.mode')\n\t}\n\tself._mode = decideMode(preferBinary, useFetch)\n\tself._fetchTimer = null\n\n\tself.on('finish', function () {\n\t\tself._onFinish()\n\t})\n}\n\ninherits(ClientRequest, stream.Writable)\n\nClientRequest.prototype.setHeader = function (name, value) {\n\tvar self = this\n\tvar lowerName = name.toLowerCase()\n\t// This check is not necessary, but it prevents warnings from browsers about setting unsafe\n\t// headers. To be honest I'm not entirely sure hiding these warnings is a good thing, but\n\t// http-browserify did it, so I will too.\n\tif (unsafeHeaders.indexOf(lowerName) !== -1)\n\t\treturn\n\n\tself._headers[lowerName] = {\n\t\tname: name,\n\t\tvalue: value\n\t}\n}\n\nClientRequest.prototype.getHeader = function (name) {\n\tvar header = this._headers[name.toLowerCase()]\n\tif (header)\n\t\treturn header.value\n\treturn null\n}\n\nClientRequest.prototype.removeHeader = function (name) {\n\tvar self = this\n\tdelete self._headers[name.toLowerCase()]\n}\n\nClientRequest.prototype._onFinish = function () {\n\tvar self = this\n\n\tif (self._destroyed)\n\t\treturn\n\tvar opts = self._opts\n\n\tvar headersObj = self._headers\n\tvar body = null\n\tif (opts.method !== 'GET' && opts.method !== 'HEAD') {\n\t\tif (capability.arraybuffer) {\n\t\t\tbody = toArrayBuffer(Buffer.concat(self._body))\n\t\t} else if (capability.blobConstructor) {\n\t\t\tbody = new global.Blob(self._body.map(function (buffer) {\n\t\t\t\treturn toArrayBuffer(buffer)\n\t\t\t}), {\n\t\t\t\ttype: (headersObj['content-type'] || {}).value || ''\n\t\t\t})\n\t\t} else {\n\t\t\t// get utf8 string\n\t\t\tbody = Buffer.concat(self._body).toString()\n\t\t}\n\t}\n\n\t// create flattened list of headers\n\tvar headersList = []\n\tObject.keys(headersObj).forEach(function (keyName) {\n\t\tvar name = headersObj[keyName].name\n\t\tvar value = headersObj[keyName].value\n\t\tif (Array.isArray(value)) {\n\t\t\tvalue.forEach(function (v) {\n\t\t\t\theadersList.push([name, v])\n\t\t\t})\n\t\t} else {\n\t\t\theadersList.push([name, value])\n\t\t}\n\t})\n\n\tif (self._mode === 'fetch') {\n\t\tvar signal = null\n\t\tvar fetchTimer = null\n\t\tif (capability.abortController) {\n\t\t\tvar controller = new AbortController()\n\t\t\tsignal = controller.signal\n\t\t\tself._fetchAbortController = controller\n\n\t\t\tif ('requestTimeout' in opts && opts.requestTimeout !== 0) {\n\t\t\t\tself._fetchTimer = global.setTimeout(function () {\n\t\t\t\t\tself.emit('requestTimeout')\n\t\t\t\t\tif (self._fetchAbortController)\n\t\t\t\t\t\tself._fetchAbortController.abort()\n\t\t\t\t}, opts.requestTimeout)\n\t\t\t}\n\t\t}\n\n\t\tglobal.fetch(self._opts.url, {\n\t\t\tmethod: self._opts.method,\n\t\t\theaders: headersList,\n\t\t\tbody: body || undefined,\n\t\t\tmode: 'cors',\n\t\t\tcredentials: opts.withCredentials ? 'include' : 'same-origin',\n\t\t\tsignal: signal\n\t\t}).then(function (response) {\n\t\t\tself._fetchResponse = response\n\t\t\tself._connect()\n\t\t}, function (reason) {\n\t\t\tglobal.clearTimeout(self._fetchTimer)\n\t\t\tif (!self._destroyed)\n\t\t\t\tself.emit('error', reason)\n\t\t})\n\t} else {\n\t\tvar xhr = self._xhr = new global.XMLHttpRequest()\n\t\ttry {\n\t\t\txhr.open(self._opts.method, self._opts.url, true)\n\t\t} catch (err) {\n\t\t\tprocess.nextTick(function () {\n\t\t\t\tself.emit('error', err)\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\t// Can't set responseType on really old browsers\n\t\tif ('responseType' in xhr)\n\t\t\txhr.responseType = self._mode.split(':')[0]\n\n\t\tif ('withCredentials' in xhr)\n\t\t\txhr.withCredentials = !!opts.withCredentials\n\n\t\tif (self._mode === 'text' && 'overrideMimeType' in xhr)\n\t\t\txhr.overrideMimeType('text/plain; charset=x-user-defined')\n\n\t\tif ('requestTimeout' in opts) {\n\t\t\txhr.timeout = opts.requestTimeout\n\t\t\txhr.ontimeout = function () {\n\t\t\t\tself.emit('requestTimeout')\n\t\t\t}\n\t\t}\n\n\t\theadersList.forEach(function (header) {\n\t\t\txhr.setRequestHeader(header[0], header[1])\n\t\t})\n\n\t\tself._response = null\n\t\txhr.onreadystatechange = function () {\n\t\t\tswitch (xhr.readyState) {\n\t\t\t\tcase rStates.LOADING:\n\t\t\t\tcase rStates.DONE:\n\t\t\t\t\tself._onXHRProgress()\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\t// Necessary for streaming in Firefox, since xhr.response is ONLY defined\n\t\t// in onprogress, not in onreadystatechange with xhr.readyState = 3\n\t\tif (self._mode === 'moz-chunked-arraybuffer') {\n\t\t\txhr.onprogress = function () {\n\t\t\t\tself._onXHRProgress()\n\t\t\t}\n\t\t}\n\n\t\txhr.onerror = function () {\n\t\t\tif (self._destroyed)\n\t\t\t\treturn\n\t\t\tself.emit('error', new Error('XHR error'))\n\t\t}\n\n\t\ttry {\n\t\t\txhr.send(body)\n\t\t} catch (err) {\n\t\t\tprocess.nextTick(function () {\n\t\t\t\tself.emit('error', err)\n\t\t\t})\n\t\t\treturn\n\t\t}\n\t}\n}\n\n/**\n * Checks if xhr.status is readable and non-zero, indicating no error.\n * Even though the spec says it should be available in readyState 3,\n * accessing it throws an exception in IE8\n */\nfunction statusValid (xhr) {\n\ttry {\n\t\tvar status = xhr.status\n\t\treturn (status !== null && status !== 0)\n\t} catch (e) {\n\t\treturn false\n\t}\n}\n\nClientRequest.prototype._onXHRProgress = function () {\n\tvar self = this\n\n\tif (!statusValid(self._xhr) || self._destroyed)\n\t\treturn\n\n\tif (!self._response)\n\t\tself._connect()\n\n\tself._response._onXHRProgress()\n}\n\nClientRequest.prototype._connect = function () {\n\tvar self = this\n\n\tif (self._destroyed)\n\t\treturn\n\n\tself._response = new IncomingMessage(self._xhr, self._fetchResponse, self._mode, self._fetchTimer)\n\tself._response.on('error', function(err) {\n\t\tself.emit('error', err)\n\t})\n\n\tself.emit('response', self._response)\n}\n\nClientRequest.prototype._write = function (chunk, encoding, cb) {\n\tvar self = this\n\n\tself._body.push(chunk)\n\tcb()\n}\n\nClientRequest.prototype.abort = ClientRequest.prototype.destroy = function () {\n\tvar self = this\n\tself._destroyed = true\n\tglobal.clearTimeout(self._fetchTimer)\n\tif (self._response)\n\t\tself._response._destroyed = true\n\tif (self._xhr)\n\t\tself._xhr.abort()\n\telse if (self._fetchAbortController)\n\t\tself._fetchAbortController.abort()\n}\n\nClientRequest.prototype.end = function (data, encoding, cb) {\n\tvar self = this\n\tif (typeof data === 'function') {\n\t\tcb = data\n\t\tdata = undefined\n\t}\n\n\tstream.Writable.prototype.end.call(self, data, encoding, cb)\n}\n\nClientRequest.prototype.flushHeaders = function () {}\nClientRequest.prototype.setTimeout = function () {}\nClientRequest.prototype.setNoDelay = function () {}\nClientRequest.prototype.setSocketKeepAlive = function () {}\n\n// Taken from http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader%28%29-method\nvar unsafeHeaders = [\n\t'accept-charset',\n\t'accept-encoding',\n\t'access-control-request-headers',\n\t'access-control-request-method',\n\t'connection',\n\t'content-length',\n\t'cookie',\n\t'cookie2',\n\t'date',\n\t'dnt',\n\t'expect',\n\t'host',\n\t'keep-alive',\n\t'origin',\n\t'referer',\n\t'te',\n\t'trailer',\n\t'transfer-encoding',\n\t'upgrade',\n\t'via'\n]\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../buffer/index.js */ \"./node_modules/buffer/index.js\").Buffer, __webpack_require__(/*! ./../../webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\"), __webpack_require__(/*! ./../../process/browser.js */ \"./node_modules/process/browser.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbGliL3JlcXVlc3QuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9saWIvcmVxdWVzdC5qcz85MjVlIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBjYXBhYmlsaXR5ID0gcmVxdWlyZSgnLi9jYXBhYmlsaXR5JylcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciByZXNwb25zZSA9IHJlcXVpcmUoJy4vcmVzcG9uc2UnKVxudmFyIHN0cmVhbSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbScpXG52YXIgdG9BcnJheUJ1ZmZlciA9IHJlcXVpcmUoJ3RvLWFycmF5YnVmZmVyJylcblxudmFyIEluY29taW5nTWVzc2FnZSA9IHJlc3BvbnNlLkluY29taW5nTWVzc2FnZVxudmFyIHJTdGF0ZXMgPSByZXNwb25zZS5yZWFkeVN0YXRlc1xuXG5mdW5jdGlvbiBkZWNpZGVNb2RlIChwcmVmZXJCaW5hcnksIHVzZUZldGNoKSB7XG5cdGlmIChjYXBhYmlsaXR5LmZldGNoICYmIHVzZUZldGNoKSB7XG5cdFx0cmV0dXJuICdmZXRjaCdcblx0fSBlbHNlIGlmIChjYXBhYmlsaXR5Lm1vemNodW5rZWRhcnJheWJ1ZmZlcikge1xuXHRcdHJldHVybiAnbW96LWNodW5rZWQtYXJyYXlidWZmZXInXG5cdH0gZWxzZSBpZiAoY2FwYWJpbGl0eS5tc3N0cmVhbSkge1xuXHRcdHJldHVybiAnbXMtc3RyZWFtJ1xuXHR9IGVsc2UgaWYgKGNhcGFiaWxpdHkuYXJyYXlidWZmZXIgJiYgcHJlZmVyQmluYXJ5KSB7XG5cdFx0cmV0dXJuICdhcnJheWJ1ZmZlcidcblx0fSBlbHNlIGlmIChjYXBhYmlsaXR5LnZiQXJyYXkgJiYgcHJlZmVyQmluYXJ5KSB7XG5cdFx0cmV0dXJuICd0ZXh0OnZiYXJyYXknXG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuICd0ZXh0J1xuXHR9XG59XG5cbnZhciBDbGllbnRSZXF1ZXN0ID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0cykge1xuXHR2YXIgc2VsZiA9IHRoaXNcblx0c3RyZWFtLldyaXRhYmxlLmNhbGwoc2VsZilcblxuXHRzZWxmLl9vcHRzID0gb3B0c1xuXHRzZWxmLl9ib2R5ID0gW11cblx0c2VsZi5faGVhZGVycyA9IHt9XG5cdGlmIChvcHRzLmF1dGgpXG5cdFx0c2VsZi5zZXRIZWFkZXIoJ0F1dGhvcml6YXRpb24nLCAnQmFzaWMgJyArIG5ldyBCdWZmZXIob3B0cy5hdXRoKS50b1N0cmluZygnYmFzZTY0JykpXG5cdE9iamVjdC5rZXlzKG9wdHMuaGVhZGVycykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuXHRcdHNlbGYuc2V0SGVhZGVyKG5hbWUsIG9wdHMuaGVhZGVyc1tuYW1lXSlcblx0fSlcblxuXHR2YXIgcHJlZmVyQmluYXJ5XG5cdHZhciB1c2VGZXRjaCA9IHRydWVcblx0aWYgKG9wdHMubW9kZSA9PT0gJ2Rpc2FibGUtZmV0Y2gnIHx8ICgncmVxdWVzdFRpbWVvdXQnIGluIG9wdHMgJiYgIWNhcGFiaWxpdHkuYWJvcnRDb250cm9sbGVyKSkge1xuXHRcdC8vIElmIHRoZSB1c2Ugb2YgWEhSIHNob3VsZCBiZSBwcmVmZXJyZWQuIE5vdCB0eXBpY2FsbHkgbmVlZGVkLlxuXHRcdHVzZUZldGNoID0gZmFsc2Vcblx0XHRwcmVmZXJCaW5hcnkgPSB0cnVlXG5cdH0gZWxzZSBpZiAob3B0cy5tb2RlID09PSAncHJlZmVyLXN0cmVhbWluZycpIHtcblx0XHQvLyBJZiBzdHJlYW1pbmcgaXMgYSBoaWdoIHByaW9yaXR5IGJ1dCBiaW5hcnkgY29tcGF0aWJpbGl0eSBhbmRcblx0XHQvLyB0aGUgYWNjdXJhY3kgb2YgdGhlICdjb250ZW50LXR5cGUnIGhlYWRlciBhcmVuJ3Rcblx0XHRwcmVmZXJCaW5hcnkgPSBmYWxzZVxuXHR9IGVsc2UgaWYgKG9wdHMubW9kZSA9PT0gJ2FsbG93LXdyb25nLWNvbnRlbnQtdHlwZScpIHtcblx0XHQvLyBJZiBzdHJlYW1pbmcgaXMgbW9yZSBpbXBvcnRhbnQgdGhhbiBwcmVzZXJ2aW5nIHRoZSAnY29udGVudC10eXBlJyBoZWFkZXJcblx0XHRwcmVmZXJCaW5hcnkgPSAhY2FwYWJpbGl0eS5vdmVycmlkZU1pbWVUeXBlXG5cdH0gZWxzZSBpZiAoIW9wdHMubW9kZSB8fCBvcHRzLm1vZGUgPT09ICdkZWZhdWx0JyB8fCBvcHRzLm1vZGUgPT09ICdwcmVmZXItZmFzdCcpIHtcblx0XHQvLyBVc2UgYmluYXJ5IGlmIHRleHQgc3RyZWFtaW5nIG1heSBjb3JydXB0IGRhdGEgb3IgdGhlIGNvbnRlbnQtdHlwZSBoZWFkZXIsIG9yIGZvciBzcGVlZFxuXHRcdHByZWZlckJpbmFyeSA9IHRydWVcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIG9wdHMubW9kZScpXG5cdH1cblx0c2VsZi5fbW9kZSA9IGRlY2lkZU1vZGUocHJlZmVyQmluYXJ5LCB1c2VGZXRjaClcblx0c2VsZi5fZmV0Y2hUaW1lciA9IG51bGxcblxuXHRzZWxmLm9uKCdmaW5pc2gnLCBmdW5jdGlvbiAoKSB7XG5cdFx0c2VsZi5fb25GaW5pc2goKVxuXHR9KVxufVxuXG5pbmhlcml0cyhDbGllbnRSZXF1ZXN0LCBzdHJlYW0uV3JpdGFibGUpXG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLnNldEhlYWRlciA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuXHR2YXIgc2VsZiA9IHRoaXNcblx0dmFyIGxvd2VyTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKVxuXHQvLyBUaGlzIGNoZWNrIGlzIG5vdCBuZWNlc3NhcnksIGJ1dCBpdCBwcmV2ZW50cyB3YXJuaW5ncyBmcm9tIGJyb3dzZXJzIGFib3V0IHNldHRpbmcgdW5zYWZlXG5cdC8vIGhlYWRlcnMuIFRvIGJlIGhvbmVzdCBJJ20gbm90IGVudGlyZWx5IHN1cmUgaGlkaW5nIHRoZXNlIHdhcm5pbmdzIGlzIGEgZ29vZCB0aGluZywgYnV0XG5cdC8vIGh0dHAtYnJvd3NlcmlmeSBkaWQgaXQsIHNvIEkgd2lsbCB0b28uXG5cdGlmICh1bnNhZmVIZWFkZXJzLmluZGV4T2YobG93ZXJOYW1lKSAhPT0gLTEpXG5cdFx0cmV0dXJuXG5cblx0c2VsZi5faGVhZGVyc1tsb3dlck5hbWVdID0ge1xuXHRcdG5hbWU6IG5hbWUsXG5cdFx0dmFsdWU6IHZhbHVlXG5cdH1cbn1cblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuZ2V0SGVhZGVyID0gZnVuY3Rpb24gKG5hbWUpIHtcblx0dmFyIGhlYWRlciA9IHRoaXMuX2hlYWRlcnNbbmFtZS50b0xvd2VyQ2FzZSgpXVxuXHRpZiAoaGVhZGVyKVxuXHRcdHJldHVybiBoZWFkZXIudmFsdWVcblx0cmV0dXJuIG51bGxcbn1cblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUucmVtb3ZlSGVhZGVyID0gZnVuY3Rpb24gKG5hbWUpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cdGRlbGV0ZSBzZWxmLl9oZWFkZXJzW25hbWUudG9Mb3dlckNhc2UoKV1cbn1cblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuX29uRmluaXNoID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgc2VsZiA9IHRoaXNcblxuXHRpZiAoc2VsZi5fZGVzdHJveWVkKVxuXHRcdHJldHVyblxuXHR2YXIgb3B0cyA9IHNlbGYuX29wdHNcblxuXHR2YXIgaGVhZGVyc09iaiA9IHNlbGYuX2hlYWRlcnNcblx0dmFyIGJvZHkgPSBudWxsXG5cdGlmIChvcHRzLm1ldGhvZCAhPT0gJ0dFVCcgJiYgb3B0cy5tZXRob2QgIT09ICdIRUFEJykge1xuXHRcdGlmIChjYXBhYmlsaXR5LmFycmF5YnVmZmVyKSB7XG5cdFx0XHRib2R5ID0gdG9BcnJheUJ1ZmZlcihCdWZmZXIuY29uY2F0KHNlbGYuX2JvZHkpKVxuXHRcdH0gZWxzZSBpZiAoY2FwYWJpbGl0eS5ibG9iQ29uc3RydWN0b3IpIHtcblx0XHRcdGJvZHkgPSBuZXcgZ2xvYmFsLkJsb2Ioc2VsZi5fYm9keS5tYXAoZnVuY3Rpb24gKGJ1ZmZlcikge1xuXHRcdFx0XHRyZXR1cm4gdG9BcnJheUJ1ZmZlcihidWZmZXIpXG5cdFx0XHR9KSwge1xuXHRcdFx0XHR0eXBlOiAoaGVhZGVyc09ialsnY29udGVudC10eXBlJ10gfHwge30pLnZhbHVlIHx8ICcnXG5cdFx0XHR9KVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBnZXQgdXRmOCBzdHJpbmdcblx0XHRcdGJvZHkgPSBCdWZmZXIuY29uY2F0KHNlbGYuX2JvZHkpLnRvU3RyaW5nKClcblx0XHR9XG5cdH1cblxuXHQvLyBjcmVhdGUgZmxhdHRlbmVkIGxpc3Qgb2YgaGVhZGVyc1xuXHR2YXIgaGVhZGVyc0xpc3QgPSBbXVxuXHRPYmplY3Qua2V5cyhoZWFkZXJzT2JqKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXlOYW1lKSB7XG5cdFx0dmFyIG5hbWUgPSBoZWFkZXJzT2JqW2tleU5hbWVdLm5hbWVcblx0XHR2YXIgdmFsdWUgPSBoZWFkZXJzT2JqW2tleU5hbWVdLnZhbHVlXG5cdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG5cdFx0XHR2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG5cdFx0XHRcdGhlYWRlcnNMaXN0LnB1c2goW25hbWUsIHZdKVxuXHRcdFx0fSlcblx0XHR9IGVsc2Uge1xuXHRcdFx0aGVhZGVyc0xpc3QucHVzaChbbmFtZSwgdmFsdWVdKVxuXHRcdH1cblx0fSlcblxuXHRpZiAoc2VsZi5fbW9kZSA9PT0gJ2ZldGNoJykge1xuXHRcdHZhciBzaWduYWwgPSBudWxsXG5cdFx0dmFyIGZldGNoVGltZXIgPSBudWxsXG5cdFx0aWYgKGNhcGFiaWxpdHkuYWJvcnRDb250cm9sbGVyKSB7XG5cdFx0XHR2YXIgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuXHRcdFx0c2lnbmFsID0gY29udHJvbGxlci5zaWduYWxcblx0XHRcdHNlbGYuX2ZldGNoQWJvcnRDb250cm9sbGVyID0gY29udHJvbGxlclxuXG5cdFx0XHRpZiAoJ3JlcXVlc3RUaW1lb3V0JyBpbiBvcHRzICYmIG9wdHMucmVxdWVzdFRpbWVvdXQgIT09IDApIHtcblx0XHRcdFx0c2VsZi5fZmV0Y2hUaW1lciA9IGdsb2JhbC5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRzZWxmLmVtaXQoJ3JlcXVlc3RUaW1lb3V0Jylcblx0XHRcdFx0XHRpZiAoc2VsZi5fZmV0Y2hBYm9ydENvbnRyb2xsZXIpXG5cdFx0XHRcdFx0XHRzZWxmLl9mZXRjaEFib3J0Q29udHJvbGxlci5hYm9ydCgpXG5cdFx0XHRcdH0sIG9wdHMucmVxdWVzdFRpbWVvdXQpXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Z2xvYmFsLmZldGNoKHNlbGYuX29wdHMudXJsLCB7XG5cdFx0XHRtZXRob2Q6IHNlbGYuX29wdHMubWV0aG9kLFxuXHRcdFx0aGVhZGVyczogaGVhZGVyc0xpc3QsXG5cdFx0XHRib2R5OiBib2R5IHx8IHVuZGVmaW5lZCxcblx0XHRcdG1vZGU6ICdjb3JzJyxcblx0XHRcdGNyZWRlbnRpYWxzOiBvcHRzLndpdGhDcmVkZW50aWFscyA/ICdpbmNsdWRlJyA6ICdzYW1lLW9yaWdpbicsXG5cdFx0XHRzaWduYWw6IHNpZ25hbFxuXHRcdH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG5cdFx0XHRzZWxmLl9mZXRjaFJlc3BvbnNlID0gcmVzcG9uc2Vcblx0XHRcdHNlbGYuX2Nvbm5lY3QoKVxuXHRcdH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcblx0XHRcdGdsb2JhbC5jbGVhclRpbWVvdXQoc2VsZi5fZmV0Y2hUaW1lcilcblx0XHRcdGlmICghc2VsZi5fZGVzdHJveWVkKVxuXHRcdFx0XHRzZWxmLmVtaXQoJ2Vycm9yJywgcmVhc29uKVxuXHRcdH0pXG5cdH0gZWxzZSB7XG5cdFx0dmFyIHhociA9IHNlbGYuX3hociA9IG5ldyBnbG9iYWwuWE1MSHR0cFJlcXVlc3QoKVxuXHRcdHRyeSB7XG5cdFx0XHR4aHIub3BlbihzZWxmLl9vcHRzLm1ldGhvZCwgc2VsZi5fb3B0cy51cmwsIHRydWUpXG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0c2VsZi5lbWl0KCdlcnJvcicsIGVycilcblx0XHRcdH0pXG5cdFx0XHRyZXR1cm5cblx0XHR9XG5cblx0XHQvLyBDYW4ndCBzZXQgcmVzcG9uc2VUeXBlIG9uIHJlYWxseSBvbGQgYnJvd3NlcnNcblx0XHRpZiAoJ3Jlc3BvbnNlVHlwZScgaW4geGhyKVxuXHRcdFx0eGhyLnJlc3BvbnNlVHlwZSA9IHNlbGYuX21vZGUuc3BsaXQoJzonKVswXVxuXG5cdFx0aWYgKCd3aXRoQ3JlZGVudGlhbHMnIGluIHhocilcblx0XHRcdHhoci53aXRoQ3JlZGVudGlhbHMgPSAhIW9wdHMud2l0aENyZWRlbnRpYWxzXG5cblx0XHRpZiAoc2VsZi5fbW9kZSA9PT0gJ3RleHQnICYmICdvdmVycmlkZU1pbWVUeXBlJyBpbiB4aHIpXG5cdFx0XHR4aHIub3ZlcnJpZGVNaW1lVHlwZSgndGV4dC9wbGFpbjsgY2hhcnNldD14LXVzZXItZGVmaW5lZCcpXG5cblx0XHRpZiAoJ3JlcXVlc3RUaW1lb3V0JyBpbiBvcHRzKSB7XG5cdFx0XHR4aHIudGltZW91dCA9IG9wdHMucmVxdWVzdFRpbWVvdXRcblx0XHRcdHhoci5vbnRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHNlbGYuZW1pdCgncmVxdWVzdFRpbWVvdXQnKVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGhlYWRlcnNMaXN0LmZvckVhY2goZnVuY3Rpb24gKGhlYWRlcikge1xuXHRcdFx0eGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyWzBdLCBoZWFkZXJbMV0pXG5cdFx0fSlcblxuXHRcdHNlbGYuX3Jlc3BvbnNlID0gbnVsbFxuXHRcdHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRzd2l0Y2ggKHhoci5yZWFkeVN0YXRlKSB7XG5cdFx0XHRcdGNhc2UgclN0YXRlcy5MT0FESU5HOlxuXHRcdFx0XHRjYXNlIHJTdGF0ZXMuRE9ORTpcblx0XHRcdFx0XHRzZWxmLl9vblhIUlByb2dyZXNzKClcblx0XHRcdFx0XHRicmVha1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBOZWNlc3NhcnkgZm9yIHN0cmVhbWluZyBpbiBGaXJlZm94LCBzaW5jZSB4aHIucmVzcG9uc2UgaXMgT05MWSBkZWZpbmVkXG5cdFx0Ly8gaW4gb25wcm9ncmVzcywgbm90IGluIG9ucmVhZHlzdGF0ZWNoYW5nZSB3aXRoIHhoci5yZWFkeVN0YXRlID0gM1xuXHRcdGlmIChzZWxmLl9tb2RlID09PSAnbW96LWNodW5rZWQtYXJyYXlidWZmZXInKSB7XG5cdFx0XHR4aHIub25wcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0c2VsZi5fb25YSFJQcm9ncmVzcygpXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0eGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRpZiAoc2VsZi5fZGVzdHJveWVkKVxuXHRcdFx0XHRyZXR1cm5cblx0XHRcdHNlbGYuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ1hIUiBlcnJvcicpKVxuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHR4aHIuc2VuZChib2R5KVxuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0cHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpXG5cdFx0XHR9KVxuXHRcdFx0cmV0dXJuXG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHhoci5zdGF0dXMgaXMgcmVhZGFibGUgYW5kIG5vbi16ZXJvLCBpbmRpY2F0aW5nIG5vIGVycm9yLlxuICogRXZlbiB0aG91Z2ggdGhlIHNwZWMgc2F5cyBpdCBzaG91bGQgYmUgYXZhaWxhYmxlIGluIHJlYWR5U3RhdGUgMyxcbiAqIGFjY2Vzc2luZyBpdCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIElFOFxuICovXG5mdW5jdGlvbiBzdGF0dXNWYWxpZCAoeGhyKSB7XG5cdHRyeSB7XG5cdFx0dmFyIHN0YXR1cyA9IHhoci5zdGF0dXNcblx0XHRyZXR1cm4gKHN0YXR1cyAhPT0gbnVsbCAmJiBzdGF0dXMgIT09IDApXG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2Vcblx0fVxufVxuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5fb25YSFJQcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cblx0aWYgKCFzdGF0dXNWYWxpZChzZWxmLl94aHIpIHx8IHNlbGYuX2Rlc3Ryb3llZClcblx0XHRyZXR1cm5cblxuXHRpZiAoIXNlbGYuX3Jlc3BvbnNlKVxuXHRcdHNlbGYuX2Nvbm5lY3QoKVxuXG5cdHNlbGYuX3Jlc3BvbnNlLl9vblhIUlByb2dyZXNzKClcbn1cblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuX2Nvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBzZWxmID0gdGhpc1xuXG5cdGlmIChzZWxmLl9kZXN0cm95ZWQpXG5cdFx0cmV0dXJuXG5cblx0c2VsZi5fcmVzcG9uc2UgPSBuZXcgSW5jb21pbmdNZXNzYWdlKHNlbGYuX3hociwgc2VsZi5fZmV0Y2hSZXNwb25zZSwgc2VsZi5fbW9kZSwgc2VsZi5fZmV0Y2hUaW1lcilcblx0c2VsZi5fcmVzcG9uc2Uub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7XG5cdFx0c2VsZi5lbWl0KCdlcnJvcicsIGVycilcblx0fSlcblxuXHRzZWxmLmVtaXQoJ3Jlc3BvbnNlJywgc2VsZi5fcmVzcG9uc2UpXG59XG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG5cdHZhciBzZWxmID0gdGhpc1xuXG5cdHNlbGYuX2JvZHkucHVzaChjaHVuaylcblx0Y2IoKVxufVxuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5hYm9ydCA9IENsaWVudFJlcXVlc3QucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBzZWxmID0gdGhpc1xuXHRzZWxmLl9kZXN0cm95ZWQgPSB0cnVlXG5cdGdsb2JhbC5jbGVhclRpbWVvdXQoc2VsZi5fZmV0Y2hUaW1lcilcblx0aWYgKHNlbGYuX3Jlc3BvbnNlKVxuXHRcdHNlbGYuX3Jlc3BvbnNlLl9kZXN0cm95ZWQgPSB0cnVlXG5cdGlmIChzZWxmLl94aHIpXG5cdFx0c2VsZi5feGhyLmFib3J0KClcblx0ZWxzZSBpZiAoc2VsZi5fZmV0Y2hBYm9ydENvbnRyb2xsZXIpXG5cdFx0c2VsZi5fZmV0Y2hBYm9ydENvbnRyb2xsZXIuYWJvcnQoKVxufVxuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoZGF0YSwgZW5jb2RpbmcsIGNiKSB7XG5cdHZhciBzZWxmID0gdGhpc1xuXHRpZiAodHlwZW9mIGRhdGEgPT09ICdmdW5jdGlvbicpIHtcblx0XHRjYiA9IGRhdGFcblx0XHRkYXRhID0gdW5kZWZpbmVkXG5cdH1cblxuXHRzdHJlYW0uV3JpdGFibGUucHJvdG90eXBlLmVuZC5jYWxsKHNlbGYsIGRhdGEsIGVuY29kaW5nLCBjYilcbn1cblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuZmx1c2hIZWFkZXJzID0gZnVuY3Rpb24gKCkge31cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLnNldFRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7fVxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuc2V0Tm9EZWxheSA9IGZ1bmN0aW9uICgpIHt9XG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5zZXRTb2NrZXRLZWVwQWxpdmUgPSBmdW5jdGlvbiAoKSB7fVxuXG4vLyBUYWtlbiBmcm9tIGh0dHA6Ly93d3cudzMub3JnL1RSL1hNTEh0dHBSZXF1ZXN0LyN0aGUtc2V0cmVxdWVzdGhlYWRlciUyOCUyOS1tZXRob2RcbnZhciB1bnNhZmVIZWFkZXJzID0gW1xuXHQnYWNjZXB0LWNoYXJzZXQnLFxuXHQnYWNjZXB0LWVuY29kaW5nJyxcblx0J2FjY2Vzcy1jb250cm9sLXJlcXVlc3QtaGVhZGVycycsXG5cdCdhY2Nlc3MtY29udHJvbC1yZXF1ZXN0LW1ldGhvZCcsXG5cdCdjb25uZWN0aW9uJyxcblx0J2NvbnRlbnQtbGVuZ3RoJyxcblx0J2Nvb2tpZScsXG5cdCdjb29raWUyJyxcblx0J2RhdGUnLFxuXHQnZG50Jyxcblx0J2V4cGVjdCcsXG5cdCdob3N0Jyxcblx0J2tlZXAtYWxpdmUnLFxuXHQnb3JpZ2luJyxcblx0J3JlZmVyZXInLFxuXHQndGUnLFxuXHQndHJhaWxlcicsXG5cdCd0cmFuc2Zlci1lbmNvZGluZycsXG5cdCd1cGdyYWRlJyxcblx0J3ZpYSdcbl1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/stream-http/lib/request.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/stream-http/lib/response.js":
+/*!**************************************************!*\
+ !*** ./node_modules/stream-http/lib/response.js ***!
+ \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/* WEBPACK VAR INJECTION */(function(process, Buffer, global) {var capability = __webpack_require__(/*! ./capability */ \"./node_modules/stream-http/lib/capability.js\")\nvar inherits = __webpack_require__(/*! inherits */ \"./node_modules/inherits/inherits_browser.js\")\nvar stream = __webpack_require__(/*! readable-stream */ \"./node_modules/readable-stream/readable-browser.js\")\n\nvar rStates = exports.readyStates = {\n\tUNSENT: 0,\n\tOPENED: 1,\n\tHEADERS_RECEIVED: 2,\n\tLOADING: 3,\n\tDONE: 4\n}\n\nvar IncomingMessage = exports.IncomingMessage = function (xhr, response, mode, fetchTimer) {\n\tvar self = this\n\tstream.Readable.call(self)\n\n\tself._mode = mode\n\tself.headers = {}\n\tself.rawHeaders = []\n\tself.trailers = {}\n\tself.rawTrailers = []\n\n\t// Fake the 'close' event, but only once 'end' fires\n\tself.on('end', function () {\n\t\t// The nextTick is necessary to prevent the 'request' module from causing an infinite loop\n\t\tprocess.nextTick(function () {\n\t\t\tself.emit('close')\n\t\t})\n\t})\n\n\tif (mode === 'fetch') {\n\t\tself._fetchResponse = response\n\n\t\tself.url = response.url\n\t\tself.statusCode = response.status\n\t\tself.statusMessage = response.statusText\n\t\t\n\t\tresponse.headers.forEach(function (header, key){\n\t\t\tself.headers[key.toLowerCase()] = header\n\t\t\tself.rawHeaders.push(key, header)\n\t\t})\n\n\t\tif (capability.writableStream) {\n\t\t\tvar writable = new WritableStream({\n\t\t\t\twrite: function (chunk) {\n\t\t\t\t\treturn new Promise(function (resolve, reject) {\n\t\t\t\t\t\tif (self._destroyed) {\n\t\t\t\t\t\t\treject()\n\t\t\t\t\t\t} else if(self.push(new Buffer(chunk))) {\n\t\t\t\t\t\t\tresolve()\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tself._resumeFetch = resolve\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tclose: function () {\n\t\t\t\t\tglobal.clearTimeout(fetchTimer)\n\t\t\t\t\tif (!self._destroyed)\n\t\t\t\t\t\tself.push(null)\n\t\t\t\t},\n\t\t\t\tabort: function (err) {\n\t\t\t\t\tif (!self._destroyed)\n\t\t\t\t\t\tself.emit('error', err)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\ttry {\n\t\t\t\tresponse.body.pipeTo(writable).catch(function (err) {\n\t\t\t\t\tglobal.clearTimeout(fetchTimer)\n\t\t\t\t\tif (!self._destroyed)\n\t\t\t\t\t\tself.emit('error', err)\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t} catch (e) {} // pipeTo method isn't defined. Can't find a better way to feature test this\n\t\t}\n\t\t// fallback for when writableStream or pipeTo aren't available\n\t\tvar reader = response.body.getReader()\n\t\tfunction read () {\n\t\t\treader.read().then(function (result) {\n\t\t\t\tif (self._destroyed)\n\t\t\t\t\treturn\n\t\t\t\tif (result.done) {\n\t\t\t\t\tglobal.clearTimeout(fetchTimer)\n\t\t\t\t\tself.push(null)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tself.push(new Buffer(result.value))\n\t\t\t\tread()\n\t\t\t}).catch(function (err) {\n\t\t\t\tglobal.clearTimeout(fetchTimer)\n\t\t\t\tif (!self._destroyed)\n\t\t\t\t\tself.emit('error', err)\n\t\t\t})\n\t\t}\n\t\tread()\n\t} else {\n\t\tself._xhr = xhr\n\t\tself._pos = 0\n\n\t\tself.url = xhr.responseURL\n\t\tself.statusCode = xhr.status\n\t\tself.statusMessage = xhr.statusText\n\t\tvar headers = xhr.getAllResponseHeaders().split(/\\r?\\n/)\n\t\theaders.forEach(function (header) {\n\t\t\tvar matches = header.match(/^([^:]+):\\s*(.*)/)\n\t\t\tif (matches) {\n\t\t\t\tvar key = matches[1].toLowerCase()\n\t\t\t\tif (key === 'set-cookie') {\n\t\t\t\t\tif (self.headers[key] === undefined) {\n\t\t\t\t\t\tself.headers[key] = []\n\t\t\t\t\t}\n\t\t\t\t\tself.headers[key].push(matches[2])\n\t\t\t\t} else if (self.headers[key] !== undefined) {\n\t\t\t\t\tself.headers[key] += ', ' + matches[2]\n\t\t\t\t} else {\n\t\t\t\t\tself.headers[key] = matches[2]\n\t\t\t\t}\n\t\t\t\tself.rawHeaders.push(matches[1], matches[2])\n\t\t\t}\n\t\t})\n\n\t\tself._charset = 'x-user-defined'\n\t\tif (!capability.overrideMimeType) {\n\t\t\tvar mimeType = self.rawHeaders['mime-type']\n\t\t\tif (mimeType) {\n\t\t\t\tvar charsetMatch = mimeType.match(/;\\s*charset=([^;])(;|$)/)\n\t\t\t\tif (charsetMatch) {\n\t\t\t\t\tself._charset = charsetMatch[1].toLowerCase()\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!self._charset)\n\t\t\t\tself._charset = 'utf-8' // best guess\n\t\t}\n\t}\n}\n\ninherits(IncomingMessage, stream.Readable)\n\nIncomingMessage.prototype._read = function () {\n\tvar self = this\n\n\tvar resolve = self._resumeFetch\n\tif (resolve) {\n\t\tself._resumeFetch = null\n\t\tresolve()\n\t}\n}\n\nIncomingMessage.prototype._onXHRProgress = function () {\n\tvar self = this\n\n\tvar xhr = self._xhr\n\n\tvar response = null\n\tswitch (self._mode) {\n\t\tcase 'text:vbarray': // For IE9\n\t\t\tif (xhr.readyState !== rStates.DONE)\n\t\t\t\tbreak\n\t\t\ttry {\n\t\t\t\t// This fails in IE8\n\t\t\t\tresponse = new global.VBArray(xhr.responseBody).toArray()\n\t\t\t} catch (e) {}\n\t\t\tif (response !== null) {\n\t\t\t\tself.push(new Buffer(response))\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// Falls through in IE8\t\n\t\tcase 'text':\n\t\t\ttry { // This will fail when readyState = 3 in IE9. Switch mode and wait for readyState = 4\n\t\t\t\tresponse = xhr.responseText\n\t\t\t} catch (e) {\n\t\t\t\tself._mode = 'text:vbarray'\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif (response.length > self._pos) {\n\t\t\t\tvar newData = response.substr(self._pos)\n\t\t\t\tif (self._charset === 'x-user-defined') {\n\t\t\t\t\tvar buffer = new Buffer(newData.length)\n\t\t\t\t\tfor (var i = 0; i < newData.length; i++)\n\t\t\t\t\t\tbuffer[i] = newData.charCodeAt(i) & 0xff\n\n\t\t\t\t\tself.push(buffer)\n\t\t\t\t} else {\n\t\t\t\t\tself.push(newData, self._charset)\n\t\t\t\t}\n\t\t\t\tself._pos = response.length\n\t\t\t}\n\t\t\tbreak\n\t\tcase 'arraybuffer':\n\t\t\tif (xhr.readyState !== rStates.DONE || !xhr.response)\n\t\t\t\tbreak\n\t\t\tresponse = xhr.response\n\t\t\tself.push(new Buffer(new Uint8Array(response)))\n\t\t\tbreak\n\t\tcase 'moz-chunked-arraybuffer': // take whole\n\t\t\tresponse = xhr.response\n\t\t\tif (xhr.readyState !== rStates.LOADING || !response)\n\t\t\t\tbreak\n\t\t\tself.push(new Buffer(new Uint8Array(response)))\n\t\t\tbreak\n\t\tcase 'ms-stream':\n\t\t\tresponse = xhr.response\n\t\t\tif (xhr.readyState !== rStates.LOADING)\n\t\t\t\tbreak\n\t\t\tvar reader = new global.MSStreamReader()\n\t\t\treader.onprogress = function () {\n\t\t\t\tif (reader.result.byteLength > self._pos) {\n\t\t\t\t\tself.push(new Buffer(new Uint8Array(reader.result.slice(self._pos))))\n\t\t\t\t\tself._pos = reader.result.byteLength\n\t\t\t\t}\n\t\t\t}\n\t\t\treader.onload = function () {\n\t\t\t\tself.push(null)\n\t\t\t}\n\t\t\t// reader.onerror = ??? // TODO: this\n\t\t\treader.readAsArrayBuffer(response)\n\t\t\tbreak\n\t}\n\n\t// The ms-stream case handles end separately in reader.onload()\n\tif (self._xhr.readyState === rStates.DONE && self._mode !== 'ms-stream') {\n\t\tself.push(null)\n\t}\n}\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../process/browser.js */ \"./node_modules/process/browser.js\"), __webpack_require__(/*! ./../../buffer/index.js */ \"./node_modules/buffer/index.js\").Buffer, __webpack_require__(/*! ./../../webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbGliL3Jlc3BvbnNlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbGliL3Jlc3BvbnNlLmpzP2M5MGIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGNhcGFiaWxpdHkgPSByZXF1aXJlKCcuL2NhcGFiaWxpdHknKVxudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxudmFyIHN0cmVhbSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbScpXG5cbnZhciByU3RhdGVzID0gZXhwb3J0cy5yZWFkeVN0YXRlcyA9IHtcblx0VU5TRU5UOiAwLFxuXHRPUEVORUQ6IDEsXG5cdEhFQURFUlNfUkVDRUlWRUQ6IDIsXG5cdExPQURJTkc6IDMsXG5cdERPTkU6IDRcbn1cblxudmFyIEluY29taW5nTWVzc2FnZSA9IGV4cG9ydHMuSW5jb21pbmdNZXNzYWdlID0gZnVuY3Rpb24gKHhociwgcmVzcG9uc2UsIG1vZGUsIGZldGNoVGltZXIpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cdHN0cmVhbS5SZWFkYWJsZS5jYWxsKHNlbGYpXG5cblx0c2VsZi5fbW9kZSA9IG1vZGVcblx0c2VsZi5oZWFkZXJzID0ge31cblx0c2VsZi5yYXdIZWFkZXJzID0gW11cblx0c2VsZi50cmFpbGVycyA9IHt9XG5cdHNlbGYucmF3VHJhaWxlcnMgPSBbXVxuXG5cdC8vIEZha2UgdGhlICdjbG9zZScgZXZlbnQsIGJ1dCBvbmx5IG9uY2UgJ2VuZCcgZmlyZXNcblx0c2VsZi5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuXHRcdC8vIFRoZSBuZXh0VGljayBpcyBuZWNlc3NhcnkgdG8gcHJldmVudCB0aGUgJ3JlcXVlc3QnIG1vZHVsZSBmcm9tIGNhdXNpbmcgYW4gaW5maW5pdGUgbG9vcFxuXHRcdHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuXHRcdFx0c2VsZi5lbWl0KCdjbG9zZScpXG5cdFx0fSlcblx0fSlcblxuXHRpZiAobW9kZSA9PT0gJ2ZldGNoJykge1xuXHRcdHNlbGYuX2ZldGNoUmVzcG9uc2UgPSByZXNwb25zZVxuXG5cdFx0c2VsZi51cmwgPSByZXNwb25zZS51cmxcblx0XHRzZWxmLnN0YXR1c0NvZGUgPSByZXNwb25zZS5zdGF0dXNcblx0XHRzZWxmLnN0YXR1c01lc3NhZ2UgPSByZXNwb25zZS5zdGF0dXNUZXh0XG5cdFx0XG5cdFx0cmVzcG9uc2UuaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChoZWFkZXIsIGtleSl7XG5cdFx0XHRzZWxmLmhlYWRlcnNba2V5LnRvTG93ZXJDYXNlKCldID0gaGVhZGVyXG5cdFx0XHRzZWxmLnJhd0hlYWRlcnMucHVzaChrZXksIGhlYWRlcilcblx0XHR9KVxuXG5cdFx0aWYgKGNhcGFiaWxpdHkud3JpdGFibGVTdHJlYW0pIHtcblx0XHRcdHZhciB3cml0YWJsZSA9IG5ldyBXcml0YWJsZVN0cmVhbSh7XG5cdFx0XHRcdHdyaXRlOiBmdW5jdGlvbiAoY2h1bmspIHtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuXHRcdFx0XHRcdFx0aWYgKHNlbGYuX2Rlc3Ryb3llZCkge1xuXHRcdFx0XHRcdFx0XHRyZWplY3QoKVxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmKHNlbGYucHVzaChuZXcgQnVmZmVyKGNodW5rKSkpIHtcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRzZWxmLl9yZXN1bWVGZXRjaCA9IHJlc29sdmVcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRjbG9zZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGdsb2JhbC5jbGVhclRpbWVvdXQoZmV0Y2hUaW1lcilcblx0XHRcdFx0XHRpZiAoIXNlbGYuX2Rlc3Ryb3llZClcblx0XHRcdFx0XHRcdHNlbGYucHVzaChudWxsKVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRhYm9ydDogZnVuY3Rpb24gKGVycikge1xuXHRcdFx0XHRcdGlmICghc2VsZi5fZGVzdHJveWVkKVxuXHRcdFx0XHRcdFx0c2VsZi5lbWl0KCdlcnJvcicsIGVycilcblx0XHRcdFx0fVxuXHRcdFx0fSlcblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cmVzcG9uc2UuYm9keS5waXBlVG8od3JpdGFibGUpLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcblx0XHRcdFx0XHRnbG9iYWwuY2xlYXJUaW1lb3V0KGZldGNoVGltZXIpXG5cdFx0XHRcdFx0aWYgKCFzZWxmLl9kZXN0cm95ZWQpXG5cdFx0XHRcdFx0XHRzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKVxuXHRcdFx0XHR9KVxuXHRcdFx0XHRyZXR1cm5cblx0XHRcdH0gY2F0Y2ggKGUpIHt9IC8vIHBpcGVUbyBtZXRob2QgaXNuJ3QgZGVmaW5lZC4gQ2FuJ3QgZmluZCBhIGJldHRlciB3YXkgdG8gZmVhdHVyZSB0ZXN0IHRoaXNcblx0XHR9XG5cdFx0Ly8gZmFsbGJhY2sgZm9yIHdoZW4gd3JpdGFibGVTdHJlYW0gb3IgcGlwZVRvIGFyZW4ndCBhdmFpbGFibGVcblx0XHR2YXIgcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKVxuXHRcdGZ1bmN0aW9uIHJlYWQgKCkge1xuXHRcdFx0cmVhZGVyLnJlYWQoKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcblx0XHRcdFx0aWYgKHNlbGYuX2Rlc3Ryb3llZClcblx0XHRcdFx0XHRyZXR1cm5cblx0XHRcdFx0aWYgKHJlc3VsdC5kb25lKSB7XG5cdFx0XHRcdFx0Z2xvYmFsLmNsZWFyVGltZW91dChmZXRjaFRpbWVyKVxuXHRcdFx0XHRcdHNlbGYucHVzaChudWxsKVxuXHRcdFx0XHRcdHJldHVyblxuXHRcdFx0XHR9XG5cdFx0XHRcdHNlbGYucHVzaChuZXcgQnVmZmVyKHJlc3VsdC52YWx1ZSkpXG5cdFx0XHRcdHJlYWQoKVxuXHRcdFx0fSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuXHRcdFx0XHRnbG9iYWwuY2xlYXJUaW1lb3V0KGZldGNoVGltZXIpXG5cdFx0XHRcdGlmICghc2VsZi5fZGVzdHJveWVkKVxuXHRcdFx0XHRcdHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpXG5cdFx0XHR9KVxuXHRcdH1cblx0XHRyZWFkKClcblx0fSBlbHNlIHtcblx0XHRzZWxmLl94aHIgPSB4aHJcblx0XHRzZWxmLl9wb3MgPSAwXG5cblx0XHRzZWxmLnVybCA9IHhoci5yZXNwb25zZVVSTFxuXHRcdHNlbGYuc3RhdHVzQ29kZSA9IHhoci5zdGF0dXNcblx0XHRzZWxmLnN0YXR1c01lc3NhZ2UgPSB4aHIuc3RhdHVzVGV4dFxuXHRcdHZhciBoZWFkZXJzID0geGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLnNwbGl0KC9cXHI/XFxuLylcblx0XHRoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKGhlYWRlcikge1xuXHRcdFx0dmFyIG1hdGNoZXMgPSBoZWFkZXIubWF0Y2goL14oW146XSspOlxccyooLiopLylcblx0XHRcdGlmIChtYXRjaGVzKSB7XG5cdFx0XHRcdHZhciBrZXkgPSBtYXRjaGVzWzFdLnRvTG93ZXJDYXNlKClcblx0XHRcdFx0aWYgKGtleSA9PT0gJ3NldC1jb29raWUnKSB7XG5cdFx0XHRcdFx0aWYgKHNlbGYuaGVhZGVyc1trZXldID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdHNlbGYuaGVhZGVyc1trZXldID0gW11cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c2VsZi5oZWFkZXJzW2tleV0ucHVzaChtYXRjaGVzWzJdKVxuXHRcdFx0XHR9IGVsc2UgaWYgKHNlbGYuaGVhZGVyc1trZXldICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRzZWxmLmhlYWRlcnNba2V5XSArPSAnLCAnICsgbWF0Y2hlc1syXVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNlbGYuaGVhZGVyc1trZXldID0gbWF0Y2hlc1syXVxuXHRcdFx0XHR9XG5cdFx0XHRcdHNlbGYucmF3SGVhZGVycy5wdXNoKG1hdGNoZXNbMV0sIG1hdGNoZXNbMl0pXG5cdFx0XHR9XG5cdFx0fSlcblxuXHRcdHNlbGYuX2NoYXJzZXQgPSAneC11c2VyLWRlZmluZWQnXG5cdFx0aWYgKCFjYXBhYmlsaXR5Lm92ZXJyaWRlTWltZVR5cGUpIHtcblx0XHRcdHZhciBtaW1lVHlwZSA9IHNlbGYucmF3SGVhZGVyc1snbWltZS10eXBlJ11cblx0XHRcdGlmIChtaW1lVHlwZSkge1xuXHRcdFx0XHR2YXIgY2hhcnNldE1hdGNoID0gbWltZVR5cGUubWF0Y2goLztcXHMqY2hhcnNldD0oW147XSkoO3wkKS8pXG5cdFx0XHRcdGlmIChjaGFyc2V0TWF0Y2gpIHtcblx0XHRcdFx0XHRzZWxmLl9jaGFyc2V0ID0gY2hhcnNldE1hdGNoWzFdLnRvTG93ZXJDYXNlKClcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCFzZWxmLl9jaGFyc2V0KVxuXHRcdFx0XHRzZWxmLl9jaGFyc2V0ID0gJ3V0Zi04JyAvLyBiZXN0IGd1ZXNzXG5cdFx0fVxuXHR9XG59XG5cbmluaGVyaXRzKEluY29taW5nTWVzc2FnZSwgc3RyZWFtLlJlYWRhYmxlKVxuXG5JbmNvbWluZ01lc3NhZ2UucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgc2VsZiA9IHRoaXNcblxuXHR2YXIgcmVzb2x2ZSA9IHNlbGYuX3Jlc3VtZUZldGNoXG5cdGlmIChyZXNvbHZlKSB7XG5cdFx0c2VsZi5fcmVzdW1lRmV0Y2ggPSBudWxsXG5cdFx0cmVzb2x2ZSgpXG5cdH1cbn1cblxuSW5jb21pbmdNZXNzYWdlLnByb3RvdHlwZS5fb25YSFJQcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cblx0dmFyIHhociA9IHNlbGYuX3hoclxuXG5cdHZhciByZXNwb25zZSA9IG51bGxcblx0c3dpdGNoIChzZWxmLl9tb2RlKSB7XG5cdFx0Y2FzZSAndGV4dDp2YmFycmF5JzogLy8gRm9yIElFOVxuXHRcdFx0aWYgKHhoci5yZWFkeVN0YXRlICE9PSByU3RhdGVzLkRPTkUpXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHR0cnkge1xuXHRcdFx0XHQvLyBUaGlzIGZhaWxzIGluIElFOFxuXHRcdFx0XHRyZXNwb25zZSA9IG5ldyBnbG9iYWwuVkJBcnJheSh4aHIucmVzcG9uc2VCb2R5KS50b0FycmF5KClcblx0XHRcdH0gY2F0Y2ggKGUpIHt9XG5cdFx0XHRpZiAocmVzcG9uc2UgIT09IG51bGwpIHtcblx0XHRcdFx0c2VsZi5wdXNoKG5ldyBCdWZmZXIocmVzcG9uc2UpKVxuXHRcdFx0XHRicmVha1xuXHRcdFx0fVxuXHRcdFx0Ly8gRmFsbHMgdGhyb3VnaCBpbiBJRThcdFxuXHRcdGNhc2UgJ3RleHQnOlxuXHRcdFx0dHJ5IHsgLy8gVGhpcyB3aWxsIGZhaWwgd2hlbiByZWFkeVN0YXRlID0gMyBpbiBJRTkuIFN3aXRjaCBtb2RlIGFuZCB3YWl0IGZvciByZWFkeVN0YXRlID0gNFxuXHRcdFx0XHRyZXNwb25zZSA9IHhoci5yZXNwb25zZVRleHRcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0c2VsZi5fbW9kZSA9ICd0ZXh0OnZiYXJyYXknXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHR9XG5cdFx0XHRpZiAocmVzcG9uc2UubGVuZ3RoID4gc2VsZi5fcG9zKSB7XG5cdFx0XHRcdHZhciBuZXdEYXRhID0gcmVzcG9uc2Uuc3Vic3RyKHNlbGYuX3Bvcylcblx0XHRcdFx0aWYgKHNlbGYuX2NoYXJzZXQgPT09ICd4LXVzZXItZGVmaW5lZCcpIHtcblx0XHRcdFx0XHR2YXIgYnVmZmVyID0gbmV3IEJ1ZmZlcihuZXdEYXRhLmxlbmd0aClcblx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IG5ld0RhdGEubGVuZ3RoOyBpKyspXG5cdFx0XHRcdFx0XHRidWZmZXJbaV0gPSBuZXdEYXRhLmNoYXJDb2RlQXQoaSkgJiAweGZmXG5cblx0XHRcdFx0XHRzZWxmLnB1c2goYnVmZmVyKVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNlbGYucHVzaChuZXdEYXRhLCBzZWxmLl9jaGFyc2V0KVxuXHRcdFx0XHR9XG5cdFx0XHRcdHNlbGYuX3BvcyA9IHJlc3BvbnNlLmxlbmd0aFxuXHRcdFx0fVxuXHRcdFx0YnJlYWtcblx0XHRjYXNlICdhcnJheWJ1ZmZlcic6XG5cdFx0XHRpZiAoeGhyLnJlYWR5U3RhdGUgIT09IHJTdGF0ZXMuRE9ORSB8fCAheGhyLnJlc3BvbnNlKVxuXHRcdFx0XHRicmVha1xuXHRcdFx0cmVzcG9uc2UgPSB4aHIucmVzcG9uc2Vcblx0XHRcdHNlbGYucHVzaChuZXcgQnVmZmVyKG5ldyBVaW50OEFycmF5KHJlc3BvbnNlKSkpXG5cdFx0XHRicmVha1xuXHRcdGNhc2UgJ21vei1jaHVua2VkLWFycmF5YnVmZmVyJzogLy8gdGFrZSB3aG9sZVxuXHRcdFx0cmVzcG9uc2UgPSB4aHIucmVzcG9uc2Vcblx0XHRcdGlmICh4aHIucmVhZHlTdGF0ZSAhPT0gclN0YXRlcy5MT0FESU5HIHx8ICFyZXNwb25zZSlcblx0XHRcdFx0YnJlYWtcblx0XHRcdHNlbGYucHVzaChuZXcgQnVmZmVyKG5ldyBVaW50OEFycmF5KHJlc3BvbnNlKSkpXG5cdFx0XHRicmVha1xuXHRcdGNhc2UgJ21zLXN0cmVhbSc6XG5cdFx0XHRyZXNwb25zZSA9IHhoci5yZXNwb25zZVxuXHRcdFx0aWYgKHhoci5yZWFkeVN0YXRlICE9PSByU3RhdGVzLkxPQURJTkcpXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHR2YXIgcmVhZGVyID0gbmV3IGdsb2JhbC5NU1N0cmVhbVJlYWRlcigpXG5cdFx0XHRyZWFkZXIub25wcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKHJlYWRlci5yZXN1bHQuYnl0ZUxlbmd0aCA+IHNlbGYuX3Bvcykge1xuXHRcdFx0XHRcdHNlbGYucHVzaChuZXcgQnVmZmVyKG5ldyBVaW50OEFycmF5KHJlYWRlci5yZXN1bHQuc2xpY2Uoc2VsZi5fcG9zKSkpKVxuXHRcdFx0XHRcdHNlbGYuX3BvcyA9IHJlYWRlci5yZXN1bHQuYnl0ZUxlbmd0aFxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZWFkZXIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRzZWxmLnB1c2gobnVsbClcblx0XHRcdH1cblx0XHRcdC8vIHJlYWRlci5vbmVycm9yID0gPz8/IC8vIFRPRE86IHRoaXNcblx0XHRcdHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihyZXNwb25zZSlcblx0XHRcdGJyZWFrXG5cdH1cblxuXHQvLyBUaGUgbXMtc3RyZWFtIGNhc2UgaGFuZGxlcyBlbmQgc2VwYXJhdGVseSBpbiByZWFkZXIub25sb2FkKClcblx0aWYgKHNlbGYuX3hoci5yZWFkeVN0YXRlID09PSByU3RhdGVzLkRPTkUgJiYgc2VsZi5fbW9kZSAhPT0gJ21zLXN0cmVhbScpIHtcblx0XHRzZWxmLnB1c2gobnVsbClcblx0fVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/stream-http/lib/response.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/string_decoder/lib/string_decoder.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/string_decoder/lib/string_decoder.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n\n/*<replacement>*/\n\nvar Buffer = __webpack_require__(/*! safe-buffer */ \"./node_modules/safe-buffer/index.js\").Buffer;\n/*</replacement>*/\n\nvar isEncoding = Buffer.isEncoding || function (encoding) {\n encoding = '' + encoding;\n switch (encoding && encoding.toLowerCase()) {\n case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw':\n return true;\n default:\n return false;\n }\n};\n\nfunction _normalizeEncoding(enc) {\n if (!enc) return 'utf8';\n var retried;\n while (true) {\n switch (enc) {\n case 'utf8':\n case 'utf-8':\n return 'utf8';\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return 'utf16le';\n case 'latin1':\n case 'binary':\n return 'latin1';\n case 'base64':\n case 'ascii':\n case 'hex':\n return enc;\n default:\n if (retried) return; // undefined\n enc = ('' + enc).toLowerCase();\n retried = true;\n }\n }\n};\n\n// Do not cache `Buffer.isEncoding` when checking encoding names as some\n// modules monkey-patch it to support additional encodings\nfunction normalizeEncoding(enc) {\n var nenc = _normalizeEncoding(enc);\n if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);\n return nenc || enc;\n}\n\n// StringDecoder provides an interface for efficiently splitting a series of\n// buffers into a series of JS strings without breaking apart multi-byte\n// characters.\nexports.StringDecoder = StringDecoder;\nfunction StringDecoder(encoding) {\n this.encoding = normalizeEncoding(encoding);\n var nb;\n switch (this.encoding) {\n case 'utf16le':\n this.text = utf16Text;\n this.end = utf16End;\n nb = 4;\n break;\n case 'utf8':\n this.fillLast = utf8FillLast;\n nb = 4;\n break;\n case 'base64':\n this.text = base64Text;\n this.end = base64End;\n nb = 3;\n break;\n default:\n this.write = simpleWrite;\n this.end = simpleEnd;\n return;\n }\n this.lastNeed = 0;\n this.lastTotal = 0;\n this.lastChar = Buffer.allocUnsafe(nb);\n}\n\nStringDecoder.prototype.write = function (buf) {\n if (buf.length === 0) return '';\n var r;\n var i;\n if (this.lastNeed) {\n r = this.fillLast(buf);\n if (r === undefined) return '';\n i = this.lastNeed;\n this.lastNeed = 0;\n } else {\n i = 0;\n }\n if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);\n return r || '';\n};\n\nStringDecoder.prototype.end = utf8End;\n\n// Returns only complete characters in a Buffer\nStringDecoder.prototype.text = utf8Text;\n\n// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer\nStringDecoder.prototype.fillLast = function (buf) {\n if (this.lastNeed <= buf.length) {\n buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);\n return this.lastChar.toString(this.encoding, 0, this.lastTotal);\n }\n buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);\n this.lastNeed -= buf.length;\n};\n\n// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a\n// continuation byte. If an invalid byte is detected, -2 is returned.\nfunction utf8CheckByte(byte) {\n if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;\n return byte >> 6 === 0x02 ? -1 : -2;\n}\n\n// Checks at most 3 bytes at the end of a Buffer in order to detect an\n// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)\n// needed to complete the UTF-8 character (if applicable) are returned.\nfunction utf8CheckIncomplete(self, buf, i) {\n var j = buf.length - 1;\n if (j < i) return 0;\n var nb = utf8CheckByte(buf[j]);\n if (nb >= 0) {\n if (nb > 0) self.lastNeed = nb - 1;\n return nb;\n }\n if (--j < i || nb === -2) return 0;\n nb = utf8CheckByte(buf[j]);\n if (nb >= 0) {\n if (nb > 0) self.lastNeed = nb - 2;\n return nb;\n }\n if (--j < i || nb === -2) return 0;\n nb = utf8CheckByte(buf[j]);\n if (nb >= 0) {\n if (nb > 0) {\n if (nb === 2) nb = 0;else self.lastNeed = nb - 3;\n }\n return nb;\n }\n return 0;\n}\n\n// Validates as many continuation bytes for a multi-byte UTF-8 character as\n// needed or are available. If we see a non-continuation byte where we expect\n// one, we \"replace\" the validated continuation bytes we've seen so far with\n// a single UTF-8 replacement character ('\\ufffd'), to match v8's UTF-8 decoding\n// behavior. The continuation byte check is included three times in the case\n// where all of the continuation bytes for a character exist in the same buffer.\n// It is also done this way as a slight performance increase instead of using a\n// loop.\nfunction utf8CheckExtraBytes(self, buf, p) {\n if ((buf[0] & 0xC0) !== 0x80) {\n self.lastNeed = 0;\n return '\\ufffd';\n }\n if (self.lastNeed > 1 && buf.length > 1) {\n if ((buf[1] & 0xC0) !== 0x80) {\n self.lastNeed = 1;\n return '\\ufffd';\n }\n if (self.lastNeed > 2 && buf.length > 2) {\n if ((buf[2] & 0xC0) !== 0x80) {\n self.lastNeed = 2;\n return '\\ufffd';\n }\n }\n }\n}\n\n// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.\nfunction utf8FillLast(buf) {\n var p = this.lastTotal - this.lastNeed;\n var r = utf8CheckExtraBytes(this, buf, p);\n if (r !== undefined) return r;\n if (this.lastNeed <= buf.length) {\n buf.copy(this.lastChar, p, 0, this.lastNeed);\n return this.lastChar.toString(this.encoding, 0, this.lastTotal);\n }\n buf.copy(this.lastChar, p, 0, buf.length);\n this.lastNeed -= buf.length;\n}\n\n// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a\n// partial character, the character's bytes are buffered until the required\n// number of bytes are available.\nfunction utf8Text(buf, i) {\n var total = utf8CheckIncomplete(this, buf, i);\n if (!this.lastNeed) return buf.toString('utf8', i);\n this.lastTotal = total;\n var end = buf.length - (total - this.lastNeed);\n buf.copy(this.lastChar, 0, end);\n return buf.toString('utf8', i, end);\n}\n\n// For UTF-8, a replacement character is added when ending on a partial\n// character.\nfunction utf8End(buf) {\n var r = buf && buf.length ? this.write(buf) : '';\n if (this.lastNeed) return r + '\\ufffd';\n return r;\n}\n\n// UTF-16LE typically needs two bytes per character, but even if we have an even\n// number of bytes available, we need to check if we end on a leading/high\n// surrogate. In that case, we need to wait for the next two bytes in order to\n// decode the last character properly.\nfunction utf16Text(buf, i) {\n if ((buf.length - i) % 2 === 0) {\n var r = buf.toString('utf16le', i);\n if (r) {\n var c = r.charCodeAt(r.length - 1);\n if (c >= 0xD800 && c <= 0xDBFF) {\n this.lastNeed = 2;\n this.lastTotal = 4;\n this.lastChar[0] = buf[buf.length - 2];\n this.lastChar[1] = buf[buf.length - 1];\n return r.slice(0, -1);\n }\n }\n return r;\n }\n this.lastNeed = 1;\n this.lastTotal = 2;\n this.lastChar[0] = buf[buf.length - 1];\n return buf.toString('utf16le', i, buf.length - 1);\n}\n\n// For UTF-16LE we do not explicitly append special replacement characters if we\n// end on a partial character, we simply let v8 handle that.\nfunction utf16End(buf) {\n var r = buf && buf.length ? this.write(buf) : '';\n if (this.lastNeed) {\n var end = this.lastTotal - this.lastNeed;\n return r + this.lastChar.toString('utf16le', 0, end);\n }\n return r;\n}\n\nfunction base64Text(buf, i) {\n var n = (buf.length - i) % 3;\n if (n === 0) return buf.toString('base64', i);\n this.lastNeed = 3 - n;\n this.lastTotal = 3;\n if (n === 1) {\n this.lastChar[0] = buf[buf.length - 1];\n } else {\n this.lastChar[0] = buf[buf.length - 2];\n this.lastChar[1] = buf[buf.length - 1];\n }\n return buf.toString('base64', i, buf.length - n);\n}\n\nfunction base64End(buf) {\n var r = buf && buf.length ? this.write(buf) : '';\n if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);\n return r;\n}\n\n// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)\nfunction simpleWrite(buf) {\n return buf.toString(this.encoding);\n}\n\nfunction simpleEnd(buf) {\n return buf && buf.length ? this.write(buf) : '';\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3RyaW5nX2RlY29kZXIvbGliL3N0cmluZ19kZWNvZGVyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvc3RyaW5nX2RlY29kZXIvbGliL3N0cmluZ19kZWNvZGVyLmpzPzdkNzIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBpc0VuY29kaW5nID0gQnVmZmVyLmlzRW5jb2RpbmcgfHwgZnVuY3Rpb24gKGVuY29kaW5nKSB7XG4gIGVuY29kaW5nID0gJycgKyBlbmNvZGluZztcbiAgc3dpdGNoIChlbmNvZGluZyAmJiBlbmNvZGluZy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpjYXNlICd1dGY4JzpjYXNlICd1dGYtOCc6Y2FzZSAnYXNjaWknOmNhc2UgJ2JpbmFyeSc6Y2FzZSAnYmFzZTY0JzpjYXNlICd1Y3MyJzpjYXNlICd1Y3MtMic6Y2FzZSAndXRmMTZsZSc6Y2FzZSAndXRmLTE2bGUnOmNhc2UgJ3Jhdyc6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG5mdW5jdGlvbiBfbm9ybWFsaXplRW5jb2RpbmcoZW5jKSB7XG4gIGlmICghZW5jKSByZXR1cm4gJ3V0ZjgnO1xuICB2YXIgcmV0cmllZDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuYykge1xuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiAndXRmOCc7XG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gJ3V0ZjE2bGUnO1xuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiAnbGF0aW4xJztcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gZW5jO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHJldHJpZWQpIHJldHVybjsgLy8gdW5kZWZpbmVkXG4gICAgICAgIGVuYyA9ICgnJyArIGVuYykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0cmllZCA9IHRydWU7XG4gICAgfVxuICB9XG59O1xuXG4vLyBEbyBub3QgY2FjaGUgYEJ1ZmZlci5pc0VuY29kaW5nYCB3aGVuIGNoZWNraW5nIGVuY29kaW5nIG5hbWVzIGFzIHNvbWVcbi8vIG1vZHVsZXMgbW9ua2V5LXBhdGNoIGl0IHRvIHN1cHBvcnQgYWRkaXRpb25hbCBlbmNvZGluZ3NcbmZ1bmN0aW9uIG5vcm1hbGl6ZUVuY29kaW5nKGVuYykge1xuICB2YXIgbmVuYyA9IF9ub3JtYWxpemVFbmNvZGluZyhlbmMpO1xuICBpZiAodHlwZW9mIG5lbmMgIT09ICdzdHJpbmcnICYmIChCdWZmZXIuaXNFbmNvZGluZyA9PT0gaXNFbmNvZGluZyB8fCAhaXNFbmNvZGluZyhlbmMpKSkgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jKTtcbiAgcmV0dXJuIG5lbmMgfHwgZW5jO1xufVxuXG4vLyBTdHJpbmdEZWNvZGVyIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgZWZmaWNpZW50bHkgc3BsaXR0aW5nIGEgc2VyaWVzIG9mXG4vLyBidWZmZXJzIGludG8gYSBzZXJpZXMgb2YgSlMgc3RyaW5ncyB3aXRob3V0IGJyZWFraW5nIGFwYXJ0IG11bHRpLWJ5dGVcbi8vIGNoYXJhY3RlcnMuXG5leHBvcnRzLlN0cmluZ0RlY29kZXIgPSBTdHJpbmdEZWNvZGVyO1xuZnVuY3Rpb24gU3RyaW5nRGVjb2RlcihlbmNvZGluZykge1xuICB0aGlzLmVuY29kaW5nID0gbm9ybWFsaXplRW5jb2RpbmcoZW5jb2RpbmcpO1xuICB2YXIgbmI7XG4gIHN3aXRjaCAodGhpcy5lbmNvZGluZykge1xuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgdGhpcy50ZXh0ID0gdXRmMTZUZXh0O1xuICAgICAgdGhpcy5lbmQgPSB1dGYxNkVuZDtcbiAgICAgIG5iID0gNDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgdGhpcy5maWxsTGFzdCA9IHV0ZjhGaWxsTGFzdDtcbiAgICAgIG5iID0gNDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICB0aGlzLnRleHQgPSBiYXNlNjRUZXh0O1xuICAgICAgdGhpcy5lbmQgPSBiYXNlNjRFbmQ7XG4gICAgICBuYiA9IDM7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhpcy53cml0ZSA9IHNpbXBsZVdyaXRlO1xuICAgICAgdGhpcy5lbmQgPSBzaW1wbGVFbmQ7XG4gICAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5sYXN0TmVlZCA9IDA7XG4gIHRoaXMubGFzdFRvdGFsID0gMDtcbiAgdGhpcy5sYXN0Q2hhciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuYik7XG59XG5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGJ1Zikge1xuICBpZiAoYnVmLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuICB2YXIgcjtcbiAgdmFyIGk7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSB7XG4gICAgciA9IHRoaXMuZmlsbExhc3QoYnVmKTtcbiAgICBpZiAociA9PT0gdW5kZWZpbmVkKSByZXR1cm4gJyc7XG4gICAgaSA9IHRoaXMubGFzdE5lZWQ7XG4gICAgdGhpcy5sYXN0TmVlZCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgaSA9IDA7XG4gIH1cbiAgaWYgKGkgPCBidWYubGVuZ3RoKSByZXR1cm4gciA/IHIgKyB0aGlzLnRleHQoYnVmLCBpKSA6IHRoaXMudGV4dChidWYsIGkpO1xuICByZXR1cm4gciB8fCAnJztcbn07XG5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmVuZCA9IHV0ZjhFbmQ7XG5cbi8vIFJldHVybnMgb25seSBjb21wbGV0ZSBjaGFyYWN0ZXJzIGluIGEgQnVmZmVyXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS50ZXh0ID0gdXRmOFRleHQ7XG5cbi8vIEF0dGVtcHRzIHRvIGNvbXBsZXRlIGEgcGFydGlhbCBub24tVVRGLTggY2hhcmFjdGVyIHVzaW5nIGJ5dGVzIGZyb20gYSBCdWZmZXJcblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmZpbGxMYXN0ID0gZnVuY3Rpb24gKGJ1Zikge1xuICBpZiAodGhpcy5sYXN0TmVlZCA8PSBidWYubGVuZ3RoKSB7XG4gICAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkLCAwLCB0aGlzLmxhc3ROZWVkKTtcbiAgICByZXR1cm4gdGhpcy5sYXN0Q2hhci50b1N0cmluZyh0aGlzLmVuY29kaW5nLCAwLCB0aGlzLmxhc3RUb3RhbCk7XG4gIH1cbiAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkLCAwLCBidWYubGVuZ3RoKTtcbiAgdGhpcy5sYXN0TmVlZCAtPSBidWYubGVuZ3RoO1xufTtcblxuLy8gQ2hlY2tzIHRoZSB0eXBlIG9mIGEgVVRGLTggYnl0ZSwgd2hldGhlciBpdCdzIEFTQ0lJLCBhIGxlYWRpbmcgYnl0ZSwgb3IgYVxuLy8gY29udGludWF0aW9uIGJ5dGUuIElmIGFuIGludmFsaWQgYnl0ZSBpcyBkZXRlY3RlZCwgLTIgaXMgcmV0dXJuZWQuXG5mdW5jdGlvbiB1dGY4Q2hlY2tCeXRlKGJ5dGUpIHtcbiAgaWYgKGJ5dGUgPD0gMHg3RikgcmV0dXJuIDA7ZWxzZSBpZiAoYnl0ZSA+PiA1ID09PSAweDA2KSByZXR1cm4gMjtlbHNlIGlmIChieXRlID4+IDQgPT09IDB4MEUpIHJldHVybiAzO2Vsc2UgaWYgKGJ5dGUgPj4gMyA9PT0gMHgxRSkgcmV0dXJuIDQ7XG4gIHJldHVybiBieXRlID4+IDYgPT09IDB4MDIgPyAtMSA6IC0yO1xufVxuXG4vLyBDaGVja3MgYXQgbW9zdCAzIGJ5dGVzIGF0IHRoZSBlbmQgb2YgYSBCdWZmZXIgaW4gb3JkZXIgdG8gZGV0ZWN0IGFuXG4vLyBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyLiBUaGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzICgyLCAzLCBvciA0KVxuLy8gbmVlZGVkIHRvIGNvbXBsZXRlIHRoZSBVVEYtOCBjaGFyYWN0ZXIgKGlmIGFwcGxpY2FibGUpIGFyZSByZXR1cm5lZC5cbmZ1bmN0aW9uIHV0ZjhDaGVja0luY29tcGxldGUoc2VsZiwgYnVmLCBpKSB7XG4gIHZhciBqID0gYnVmLmxlbmd0aCAtIDE7XG4gIGlmIChqIDwgaSkgcmV0dXJuIDA7XG4gIHZhciBuYiA9IHV0ZjhDaGVja0J5dGUoYnVmW2pdKTtcbiAgaWYgKG5iID49IDApIHtcbiAgICBpZiAobmIgPiAwKSBzZWxmLmxhc3ROZWVkID0gbmIgLSAxO1xuICAgIHJldHVybiBuYjtcbiAgfVxuICBpZiAoLS1qIDwgaSB8fCBuYiA9PT0gLTIpIHJldHVybiAwO1xuICBuYiA9IHV0ZjhDaGVja0J5dGUoYnVmW2pdKTtcbiAgaWYgKG5iID49IDApIHtcbiAgICBpZiAobmIgPiAwKSBzZWxmLmxhc3ROZWVkID0gbmIgLSAyO1xuICAgIHJldHVybiBuYjtcbiAgfVxuICBpZiAoLS1qIDwgaSB8fCBuYiA9PT0gLTIpIHJldHVybiAwO1xuICBuYiA9IHV0ZjhDaGVja0J5dGUoYnVmW2pdKTtcbiAgaWYgKG5iID49IDApIHtcbiAgICBpZiAobmIgPiAwKSB7XG4gICAgICBpZiAobmIgPT09IDIpIG5iID0gMDtlbHNlIHNlbGYubGFzdE5lZWQgPSBuYiAtIDM7XG4gICAgfVxuICAgIHJldHVybiBuYjtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy8gVmFsaWRhdGVzIGFzIG1hbnkgY29udGludWF0aW9uIGJ5dGVzIGZvciBhIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyIGFzXG4vLyBuZWVkZWQgb3IgYXJlIGF2YWlsYWJsZS4gSWYgd2Ugc2VlIGEgbm9uLWNvbnRpbnVhdGlvbiBieXRlIHdoZXJlIHdlIGV4cGVjdFxuLy8gb25lLCB3ZSBcInJlcGxhY2VcIiB0aGUgdmFsaWRhdGVkIGNvbnRpbnVhdGlvbiBieXRlcyB3ZSd2ZSBzZWVuIHNvIGZhciB3aXRoXG4vLyBhIHNpbmdsZSBVVEYtOCByZXBsYWNlbWVudCBjaGFyYWN0ZXIgKCdcXHVmZmZkJyksIHRvIG1hdGNoIHY4J3MgVVRGLTggZGVjb2Rpbmdcbi8vIGJlaGF2aW9yLiBUaGUgY29udGludWF0aW9uIGJ5dGUgY2hlY2sgaXMgaW5jbHVkZWQgdGhyZWUgdGltZXMgaW4gdGhlIGNhc2Vcbi8vIHdoZXJlIGFsbCBvZiB0aGUgY29udGludWF0aW9uIGJ5dGVzIGZvciBhIGNoYXJhY3RlciBleGlzdCBpbiB0aGUgc2FtZSBidWZmZXIuXG4vLyBJdCBpcyBhbHNvIGRvbmUgdGhpcyB3YXkgYXMgYSBzbGlnaHQgcGVyZm9ybWFuY2UgaW5jcmVhc2UgaW5zdGVhZCBvZiB1c2luZyBhXG4vLyBsb29wLlxuZnVuY3Rpb24gdXRmOENoZWNrRXh0cmFCeXRlcyhzZWxmLCBidWYsIHApIHtcbiAgaWYgKChidWZbMF0gJiAweEMwKSAhPT0gMHg4MCkge1xuICAgIHNlbGYubGFzdE5lZWQgPSAwO1xuICAgIHJldHVybiAnXFx1ZmZmZCc7XG4gIH1cbiAgaWYgKHNlbGYubGFzdE5lZWQgPiAxICYmIGJ1Zi5sZW5ndGggPiAxKSB7XG4gICAgaWYgKChidWZbMV0gJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgc2VsZi5sYXN0TmVlZCA9IDE7XG4gICAgICByZXR1cm4gJ1xcdWZmZmQnO1xuICAgIH1cbiAgICBpZiAoc2VsZi5sYXN0TmVlZCA+IDIgJiYgYnVmLmxlbmd0aCA+IDIpIHtcbiAgICAgIGlmICgoYnVmWzJdICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICAgICAgc2VsZi5sYXN0TmVlZCA9IDI7XG4gICAgICAgIHJldHVybiAnXFx1ZmZmZCc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIEF0dGVtcHRzIHRvIGNvbXBsZXRlIGEgbXVsdGktYnl0ZSBVVEYtOCBjaGFyYWN0ZXIgdXNpbmcgYnl0ZXMgZnJvbSBhIEJ1ZmZlci5cbmZ1bmN0aW9uIHV0ZjhGaWxsTGFzdChidWYpIHtcbiAgdmFyIHAgPSB0aGlzLmxhc3RUb3RhbCAtIHRoaXMubGFzdE5lZWQ7XG4gIHZhciByID0gdXRmOENoZWNrRXh0cmFCeXRlcyh0aGlzLCBidWYsIHApO1xuICBpZiAociAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcjtcbiAgaWYgKHRoaXMubGFzdE5lZWQgPD0gYnVmLmxlbmd0aCkge1xuICAgIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIHAsIDAsIHRoaXMubGFzdE5lZWQpO1xuICAgIHJldHVybiB0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIHRoaXMubGFzdFRvdGFsKTtcbiAgfVxuICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCBwLCAwLCBidWYubGVuZ3RoKTtcbiAgdGhpcy5sYXN0TmVlZCAtPSBidWYubGVuZ3RoO1xufVxuXG4vLyBSZXR1cm5zIGFsbCBjb21wbGV0ZSBVVEYtOCBjaGFyYWN0ZXJzIGluIGEgQnVmZmVyLiBJZiB0aGUgQnVmZmVyIGVuZGVkIG9uIGFcbi8vIHBhcnRpYWwgY2hhcmFjdGVyLCB0aGUgY2hhcmFjdGVyJ3MgYnl0ZXMgYXJlIGJ1ZmZlcmVkIHVudGlsIHRoZSByZXF1aXJlZFxuLy8gbnVtYmVyIG9mIGJ5dGVzIGFyZSBhdmFpbGFibGUuXG5mdW5jdGlvbiB1dGY4VGV4dChidWYsIGkpIHtcbiAgdmFyIHRvdGFsID0gdXRmOENoZWNrSW5jb21wbGV0ZSh0aGlzLCBidWYsIGkpO1xuICBpZiAoIXRoaXMubGFzdE5lZWQpIHJldHVybiBidWYudG9TdHJpbmcoJ3V0ZjgnLCBpKTtcbiAgdGhpcy5sYXN0VG90YWwgPSB0b3RhbDtcbiAgdmFyIGVuZCA9IGJ1Zi5sZW5ndGggLSAodG90YWwgLSB0aGlzLmxhc3ROZWVkKTtcbiAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgMCwgZW5kKTtcbiAgcmV0dXJuIGJ1Zi50b1N0cmluZygndXRmOCcsIGksIGVuZCk7XG59XG5cbi8vIEZvciBVVEYtOCwgYSByZXBsYWNlbWVudCBjaGFyYWN0ZXIgaXMgYWRkZWQgd2hlbiBlbmRpbmcgb24gYSBwYXJ0aWFsXG4vLyBjaGFyYWN0ZXIuXG5mdW5jdGlvbiB1dGY4RW5kKGJ1Zikge1xuICB2YXIgciA9IGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSByZXR1cm4gciArICdcXHVmZmZkJztcbiAgcmV0dXJuIHI7XG59XG5cbi8vIFVURi0xNkxFIHR5cGljYWxseSBuZWVkcyB0d28gYnl0ZXMgcGVyIGNoYXJhY3RlciwgYnV0IGV2ZW4gaWYgd2UgaGF2ZSBhbiBldmVuXG4vLyBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlLCB3ZSBuZWVkIHRvIGNoZWNrIGlmIHdlIGVuZCBvbiBhIGxlYWRpbmcvaGlnaFxuLy8gc3Vycm9nYXRlLiBJbiB0aGF0IGNhc2UsIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIG5leHQgdHdvIGJ5dGVzIGluIG9yZGVyIHRvXG4vLyBkZWNvZGUgdGhlIGxhc3QgY2hhcmFjdGVyIHByb3Blcmx5LlxuZnVuY3Rpb24gdXRmMTZUZXh0KGJ1ZiwgaSkge1xuICBpZiAoKGJ1Zi5sZW5ndGggLSBpKSAlIDIgPT09IDApIHtcbiAgICB2YXIgciA9IGJ1Zi50b1N0cmluZygndXRmMTZsZScsIGkpO1xuICAgIGlmIChyKSB7XG4gICAgICB2YXIgYyA9IHIuY2hhckNvZGVBdChyLmxlbmd0aCAtIDEpO1xuICAgICAgaWYgKGMgPj0gMHhEODAwICYmIGMgPD0gMHhEQkZGKSB7XG4gICAgICAgIHRoaXMubGFzdE5lZWQgPSAyO1xuICAgICAgICB0aGlzLmxhc3RUb3RhbCA9IDQ7XG4gICAgICAgIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDJdO1xuICAgICAgICB0aGlzLmxhc3RDaGFyWzFdID0gYnVmW2J1Zi5sZW5ndGggLSAxXTtcbiAgICAgICAgcmV0dXJuIHIuc2xpY2UoMCwgLTEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuICB0aGlzLmxhc3ROZWVkID0gMTtcbiAgdGhpcy5sYXN0VG90YWwgPSAyO1xuICB0aGlzLmxhc3RDaGFyWzBdID0gYnVmW2J1Zi5sZW5ndGggLSAxXTtcbiAgcmV0dXJuIGJ1Zi50b1N0cmluZygndXRmMTZsZScsIGksIGJ1Zi5sZW5ndGggLSAxKTtcbn1cblxuLy8gRm9yIFVURi0xNkxFIHdlIGRvIG5vdCBleHBsaWNpdGx5IGFwcGVuZCBzcGVjaWFsIHJlcGxhY2VtZW50IGNoYXJhY3RlcnMgaWYgd2Vcbi8vIGVuZCBvbiBhIHBhcnRpYWwgY2hhcmFjdGVyLCB3ZSBzaW1wbHkgbGV0IHY4IGhhbmRsZSB0aGF0LlxuZnVuY3Rpb24gdXRmMTZFbmQoYnVmKSB7XG4gIHZhciByID0gYnVmICYmIGJ1Zi5sZW5ndGggPyB0aGlzLndyaXRlKGJ1ZikgOiAnJztcbiAgaWYgKHRoaXMubGFzdE5lZWQpIHtcbiAgICB2YXIgZW5kID0gdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkO1xuICAgIHJldHVybiByICsgdGhpcy5sYXN0Q2hhci50b1N0cmluZygndXRmMTZsZScsIDAsIGVuZCk7XG4gIH1cbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRleHQoYnVmLCBpKSB7XG4gIHZhciBuID0gKGJ1Zi5sZW5ndGggLSBpKSAlIDM7XG4gIGlmIChuID09PSAwKSByZXR1cm4gYnVmLnRvU3RyaW5nKCdiYXNlNjQnLCBpKTtcbiAgdGhpcy5sYXN0TmVlZCA9IDMgLSBuO1xuICB0aGlzLmxhc3RUb3RhbCA9IDM7XG4gIGlmIChuID09PSAxKSB7XG4gICAgdGhpcy5sYXN0Q2hhclswXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5sYXN0Q2hhclswXSA9IGJ1ZltidWYubGVuZ3RoIC0gMl07XG4gICAgdGhpcy5sYXN0Q2hhclsxXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gIH1cbiAgcmV0dXJuIGJ1Zi50b1N0cmluZygnYmFzZTY0JywgaSwgYnVmLmxlbmd0aCAtIG4pO1xufVxuXG5mdW5jdGlvbiBiYXNlNjRFbmQoYnVmKSB7XG4gIHZhciByID0gYnVmICYmIGJ1Zi5sZW5ndGggPyB0aGlzLndyaXRlKGJ1ZikgOiAnJztcbiAgaWYgKHRoaXMubGFzdE5lZWQpIHJldHVybiByICsgdGhpcy5sYXN0Q2hhci50b1N0cmluZygnYmFzZTY0JywgMCwgMyAtIHRoaXMubGFzdE5lZWQpO1xuICByZXR1cm4gcjtcbn1cblxuLy8gUGFzcyBieXRlcyBvbiB0aHJvdWdoIGZvciBzaW5nbGUtYnl0ZSBlbmNvZGluZ3MgKGUuZy4gYXNjaWksIGxhdGluMSwgaGV4KVxuZnVuY3Rpb24gc2ltcGxlV3JpdGUoYnVmKSB7XG4gIHJldHVybiBidWYudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7XG59XG5cbmZ1bmN0aW9uIHNpbXBsZUVuZChidWYpIHtcbiAgcmV0dXJuIGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/string_decoder/lib/string_decoder.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/timers-browserify/main.js":
+/*!************************************************!*\
+ !*** ./node_modules/timers-browserify/main.js ***!
+ \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/* WEBPACK VAR INJECTION */(function(global) {var scope = (typeof global !== \"undefined\" && global) ||\n (typeof self !== \"undefined\" && self) ||\n window;\nvar apply = Function.prototype.apply;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) {\n if (timeout) {\n timeout.close();\n }\n};\n\nfunction Timeout(id, clearFn) {\n this._id = id;\n this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n this._clearFn.call(scope, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n clearTimeout(item._idleTimeoutId);\n\n var msecs = item._idleTimeout;\n if (msecs >= 0) {\n item._idleTimeoutId = setTimeout(function onTimeout() {\n if (item._onTimeout)\n item._onTimeout();\n }, msecs);\n }\n};\n\n// setimmediate attaches itself to the global object\n__webpack_require__(/*! setimmediate */ \"./node_modules/setimmediate/setImmediate.js\");\n// On some exotic environments, it's not clear which object `setimmediate` was\n// able to install onto. Search each possibility in the same order as the\n// `setimmediate` library.\nexports.setImmediate = (typeof self !== \"undefined\" && self.setImmediate) ||\n (typeof global !== \"undefined\" && global.setImmediate) ||\n (this && this.setImmediate);\nexports.clearImmediate = (typeof self !== \"undefined\" && self.clearImmediate) ||\n (typeof global !== \"undefined\" && global.clearImmediate) ||\n (this && this.clearImmediate);\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvdGltZXJzLWJyb3dzZXJpZnkvbWFpbi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL3RpbWVycy1icm93c2VyaWZ5L21haW4uanM/NTExOCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgc2NvcGUgPSAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwpIHx8XG4gICAgICAgICAgICAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZikgfHxcbiAgICAgICAgICAgIHdpbmRvdztcbnZhciBhcHBseSA9IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtcblxuLy8gRE9NIEFQSXMsIGZvciBjb21wbGV0ZW5lc3NcblxuZXhwb3J0cy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldFRpbWVvdXQsIHNjb3BlLCBhcmd1bWVudHMpLCBjbGVhclRpbWVvdXQpO1xufTtcbmV4cG9ydHMuc2V0SW50ZXJ2YWwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBUaW1lb3V0KGFwcGx5LmNhbGwoc2V0SW50ZXJ2YWwsIHNjb3BlLCBhcmd1bWVudHMpLCBjbGVhckludGVydmFsKTtcbn07XG5leHBvcnRzLmNsZWFyVGltZW91dCA9XG5leHBvcnRzLmNsZWFySW50ZXJ2YWwgPSBmdW5jdGlvbih0aW1lb3V0KSB7XG4gIGlmICh0aW1lb3V0KSB7XG4gICAgdGltZW91dC5jbG9zZSgpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBUaW1lb3V0KGlkLCBjbGVhckZuKSB7XG4gIHRoaXMuX2lkID0gaWQ7XG4gIHRoaXMuX2NsZWFyRm4gPSBjbGVhckZuO1xufVxuVGltZW91dC5wcm90b3R5cGUudW5yZWYgPSBUaW1lb3V0LnByb3RvdHlwZS5yZWYgPSBmdW5jdGlvbigpIHt9O1xuVGltZW91dC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fY2xlYXJGbi5jYWxsKHNjb3BlLCB0aGlzLl9pZCk7XG59O1xuXG4vLyBEb2VzIG5vdCBzdGFydCB0aGUgdGltZSwganVzdCBzZXRzIHVwIHRoZSBtZW1iZXJzIG5lZWRlZC5cbmV4cG9ydHMuZW5yb2xsID0gZnVuY3Rpb24oaXRlbSwgbXNlY3MpIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IG1zZWNzO1xufTtcblxuZXhwb3J0cy51bmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IC0xO1xufTtcblxuZXhwb3J0cy5fdW5yZWZBY3RpdmUgPSBleHBvcnRzLmFjdGl2ZSA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuXG4gIHZhciBtc2VjcyA9IGl0ZW0uX2lkbGVUaW1lb3V0O1xuICBpZiAobXNlY3MgPj0gMCkge1xuICAgIGl0ZW0uX2lkbGVUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIG9uVGltZW91dCgpIHtcbiAgICAgIGlmIChpdGVtLl9vblRpbWVvdXQpXG4gICAgICAgIGl0ZW0uX29uVGltZW91dCgpO1xuICAgIH0sIG1zZWNzKTtcbiAgfVxufTtcblxuLy8gc2V0aW1tZWRpYXRlIGF0dGFjaGVzIGl0c2VsZiB0byB0aGUgZ2xvYmFsIG9iamVjdFxucmVxdWlyZShcInNldGltbWVkaWF0ZVwiKTtcbi8vIE9uIHNvbWUgZXhvdGljIGVudmlyb25tZW50cywgaXQncyBub3QgY2xlYXIgd2hpY2ggb2JqZWN0IGBzZXRpbW1lZGlhdGVgIHdhc1xuLy8gYWJsZSB0byBpbnN0YWxsIG9udG8uICBTZWFyY2ggZWFjaCBwb3NzaWJpbGl0eSBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGVcbi8vIGBzZXRpbW1lZGlhdGVgIGxpYnJhcnkuXG5leHBvcnRzLnNldEltbWVkaWF0ZSA9ICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmLnNldEltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsLnNldEltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgJiYgdGhpcy5zZXRJbW1lZGlhdGUpO1xuZXhwb3J0cy5jbGVhckltbWVkaWF0ZSA9ICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmLmNsZWFySW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbC5jbGVhckltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcyAmJiB0aGlzLmNsZWFySW1tZWRpYXRlKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/timers-browserify/main.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/to-arraybuffer/index.js":
+/*!**********************************************!*\
+ !*** ./node_modules/to-arraybuffer/index.js ***!
+ \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var Buffer = __webpack_require__(/*! buffer */ \"./node_modules/buffer/index.js\").Buffer\n\nmodule.exports = function (buf) {\n\t// If the buffer is backed by a Uint8Array, a faster version will work\n\tif (buf instanceof Uint8Array) {\n\t\t// If the buffer isn't a subarray, return the underlying ArrayBuffer\n\t\tif (buf.byteOffset === 0 && buf.byteLength === buf.buffer.byteLength) {\n\t\t\treturn buf.buffer\n\t\t} else if (typeof buf.buffer.slice === 'function') {\n\t\t\t// Otherwise we need to get a proper copy\n\t\t\treturn buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength)\n\t\t}\n\t}\n\n\tif (Buffer.isBuffer(buf)) {\n\t\t// This is the slow version that will work with any Buffer\n\t\t// implementation (even in old browsers)\n\t\tvar arrayCopy = new Uint8Array(buf.length)\n\t\tvar len = buf.length\n\t\tfor (var i = 0; i < len; i++) {\n\t\t\tarrayCopy[i] = buf[i]\n\t\t}\n\t\treturn arrayCopy.buffer\n\t} else {\n\t\tthrow new Error('Argument must be a Buffer')\n\t}\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvdG8tYXJyYXlidWZmZXIvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy90by1hcnJheWJ1ZmZlci9pbmRleC5qcz9kOTM4Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXJcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYnVmKSB7XG5cdC8vIElmIHRoZSBidWZmZXIgaXMgYmFja2VkIGJ5IGEgVWludDhBcnJheSwgYSBmYXN0ZXIgdmVyc2lvbiB3aWxsIHdvcmtcblx0aWYgKGJ1ZiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcblx0XHQvLyBJZiB0aGUgYnVmZmVyIGlzbid0IGEgc3ViYXJyYXksIHJldHVybiB0aGUgdW5kZXJseWluZyBBcnJheUJ1ZmZlclxuXHRcdGlmIChidWYuYnl0ZU9mZnNldCA9PT0gMCAmJiBidWYuYnl0ZUxlbmd0aCA9PT0gYnVmLmJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gYnVmLmJ1ZmZlclxuXHRcdH0gZWxzZSBpZiAodHlwZW9mIGJ1Zi5idWZmZXIuc2xpY2UgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdC8vIE90aGVyd2lzZSB3ZSBuZWVkIHRvIGdldCBhIHByb3BlciBjb3B5XG5cdFx0XHRyZXR1cm4gYnVmLmJ1ZmZlci5zbGljZShidWYuYnl0ZU9mZnNldCwgYnVmLmJ5dGVPZmZzZXQgKyBidWYuYnl0ZUxlbmd0aClcblx0XHR9XG5cdH1cblxuXHRpZiAoQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHtcblx0XHQvLyBUaGlzIGlzIHRoZSBzbG93IHZlcnNpb24gdGhhdCB3aWxsIHdvcmsgd2l0aCBhbnkgQnVmZmVyXG5cdFx0Ly8gaW1wbGVtZW50YXRpb24gKGV2ZW4gaW4gb2xkIGJyb3dzZXJzKVxuXHRcdHZhciBhcnJheUNvcHkgPSBuZXcgVWludDhBcnJheShidWYubGVuZ3RoKVxuXHRcdHZhciBsZW4gPSBidWYubGVuZ3RoXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0YXJyYXlDb3B5W2ldID0gYnVmW2ldXG5cdFx0fVxuXHRcdHJldHVybiBhcnJheUNvcHkuYnVmZmVyXG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcblx0fVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/to-arraybuffer/index.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/url/url.js":
+/*!*********************************!*\
+ !*** ./node_modules/url/url.js ***!
+ \*********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n\nvar punycode = __webpack_require__(/*! punycode */ \"./node_modules/node-libs-browser/node_modules/punycode/punycode.js\");\nvar util = __webpack_require__(/*! ./util */ \"./node_modules/url/util.js\");\n\nexports.parse = urlParse;\nexports.resolve = urlResolve;\nexports.resolveObject = urlResolveObject;\nexports.format = urlFormat;\n\nexports.Url = Url;\n\nfunction Url() {\n this.protocol = null;\n this.slashes = null;\n this.auth = null;\n this.host = null;\n this.port = null;\n this.hostname = null;\n this.hash = null;\n this.search = null;\n this.query = null;\n this.pathname = null;\n this.path = null;\n this.href = null;\n}\n\n// Reference: RFC 3986, RFC 1808, RFC 2396\n\n// define these here so at least they only have to be\n// compiled once on the first module load.\nvar protocolPattern = /^([a-z0-9.+-]+:)/i,\n portPattern = /:[0-9]*$/,\n\n // Special case for a simple path URL\n simplePathPattern = /^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,\n\n // RFC 2396: characters reserved for delimiting URLs.\n // We actually just auto-escape these.\n delims = ['<', '>', '\"', '`', ' ', '\\r', '\\n', '\\t'],\n\n // RFC 2396: characters not allowed for various reasons.\n unwise = ['{', '}', '|', '\\\\', '^', '`'].concat(delims),\n\n // Allowed by RFCs, but cause of XSS attacks. Always escape these.\n autoEscape = ['\\''].concat(unwise),\n // Characters that are never ever allowed in a hostname.\n // Note that any invalid chars are also handled, but these\n // are the ones that are *expected* to be seen, so we fast-path\n // them.\n nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape),\n hostEndingChars = ['/', '?', '#'],\n hostnameMaxLen = 255,\n hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,\n hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,\n // protocols that can allow \"unsafe\" and \"unwise\" chars.\n unsafeProtocol = {\n 'javascript': true,\n 'javascript:': true\n },\n // protocols that never have a hostname.\n hostlessProtocol = {\n 'javascript': true,\n 'javascript:': true\n },\n // protocols that always contain a // bit.\n slashedProtocol = {\n 'http': true,\n 'https': true,\n 'ftp': true,\n 'gopher': true,\n 'file': true,\n 'http:': true,\n 'https:': true,\n 'ftp:': true,\n 'gopher:': true,\n 'file:': true\n },\n querystring = __webpack_require__(/*! querystring */ \"./node_modules/querystring-es3/index.js\");\n\nfunction urlParse(url, parseQueryString, slashesDenoteHost) {\n if (url && util.isObject(url) && url instanceof Url) return url;\n\n var u = new Url;\n u.parse(url, parseQueryString, slashesDenoteHost);\n return u;\n}\n\nUrl.prototype.parse = function(url, parseQueryString, slashesDenoteHost) {\n if (!util.isString(url)) {\n throw new TypeError(\"Parameter 'url' must be a string, not \" + typeof url);\n }\n\n // Copy chrome, IE, opera backslash-handling behavior.\n // Back slashes before the query string get converted to forward slashes\n // See: https://code.google.com/p/chromium/issues/detail?id=25916\n var queryIndex = url.indexOf('?'),\n splitter =\n (queryIndex !== -1 && queryIndex < url.indexOf('#')) ? '?' : '#',\n uSplit = url.split(splitter),\n slashRegex = /\\\\/g;\n uSplit[0] = uSplit[0].replace(slashRegex, '/');\n url = uSplit.join(splitter);\n\n var rest = url;\n\n // trim before proceeding.\n // This is to support parse stuff like \" http://foo.com \\n\"\n rest = rest.trim();\n\n if (!slashesDenoteHost && url.split('#').length === 1) {\n // Try fast path regexp\n var simplePath = simplePathPattern.exec(rest);\n if (simplePath) {\n this.path = rest;\n this.href = rest;\n this.pathname = simplePath[1];\n if (simplePath[2]) {\n this.search = simplePath[2];\n if (parseQueryString) {\n this.query = querystring.parse(this.search.substr(1));\n } else {\n this.query = this.search.substr(1);\n }\n } else if (parseQueryString) {\n this.search = '';\n this.query = {};\n }\n return this;\n }\n }\n\n var proto = protocolPattern.exec(rest);\n if (proto) {\n proto = proto[0];\n var lowerProto = proto.toLowerCase();\n this.protocol = lowerProto;\n rest = rest.substr(proto.length);\n }\n\n // figure out if it's got a host\n // user@server is *always* interpreted as a hostname, and url\n // resolution will treat //foo/bar as host=foo,path=bar because that's\n // how the browser resolves relative URLs.\n if (slashesDenoteHost || proto || rest.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)) {\n var slashes = rest.substr(0, 2) === '//';\n if (slashes && !(proto && hostlessProtocol[proto])) {\n rest = rest.substr(2);\n this.slashes = true;\n }\n }\n\n if (!hostlessProtocol[proto] &&\n (slashes || (proto && !slashedProtocol[proto]))) {\n\n // there's a hostname.\n // the first instance of /, ?, ;, or # ends the host.\n //\n // If there is an @ in the hostname, then non-host chars *are* allowed\n // to the left of the last @ sign, unless some host-ending character\n // comes *before* the @-sign.\n // URLs are obnoxious.\n //\n // ex:\n // http://a@b@c/ => user:a@b host:c\n // http://a@b?@c => user:a host:c path:/?@c\n\n // v0.12 TODO(isaacs): This is not quite how Chrome does things.\n // Review our test case against browsers more comprehensively.\n\n // find the first instance of any hostEndingChars\n var hostEnd = -1;\n for (var i = 0; i < hostEndingChars.length; i++) {\n var hec = rest.indexOf(hostEndingChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))\n hostEnd = hec;\n }\n\n // at this point, either we have an explicit point where the\n // auth portion cannot go past, or the last @ char is the decider.\n var auth, atSign;\n if (hostEnd === -1) {\n // atSign can be anywhere.\n atSign = rest.lastIndexOf('@');\n } else {\n // atSign must be in auth portion.\n // http://a@b/c@d => host:b auth:a path:/c@d\n atSign = rest.lastIndexOf('@', hostEnd);\n }\n\n // Now we have a portion which is definitely the auth.\n // Pull that off.\n if (atSign !== -1) {\n auth = rest.slice(0, atSign);\n rest = rest.slice(atSign + 1);\n this.auth = decodeURIComponent(auth);\n }\n\n // the host is the remaining to the left of the first non-host char\n hostEnd = -1;\n for (var i = 0; i < nonHostChars.length; i++) {\n var hec = rest.indexOf(nonHostChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))\n hostEnd = hec;\n }\n // if we still have not hit it, then the entire thing is a host.\n if (hostEnd === -1)\n hostEnd = rest.length;\n\n this.host = rest.slice(0, hostEnd);\n rest = rest.slice(hostEnd);\n\n // pull out port.\n this.parseHost();\n\n // we've indicated that there is a hostname,\n // so even if it's empty, it has to be present.\n this.hostname = this.hostname || '';\n\n // if hostname begins with [ and ends with ]\n // assume that it's an IPv6 address.\n var ipv6Hostname = this.hostname[0] === '[' &&\n this.hostname[this.hostname.length - 1] === ']';\n\n // validate a little.\n if (!ipv6Hostname) {\n var hostparts = this.hostname.split(/\\./);\n for (var i = 0, l = hostparts.length; i < l; i++) {\n var part = hostparts[i];\n if (!part) continue;\n if (!part.match(hostnamePartPattern)) {\n var newpart = '';\n for (var j = 0, k = part.length; j < k; j++) {\n if (part.charCodeAt(j) > 127) {\n // we replace non-ASCII char with a temporary placeholder\n // we need this to make sure size of hostname is not\n // broken by replacing non-ASCII by nothing\n newpart += 'x';\n } else {\n newpart += part[j];\n }\n }\n // we test again with ASCII char only\n if (!newpart.match(hostnamePartPattern)) {\n var validParts = hostparts.slice(0, i);\n var notHost = hostparts.slice(i + 1);\n var bit = part.match(hostnamePartStart);\n if (bit) {\n validParts.push(bit[1]);\n notHost.unshift(bit[2]);\n }\n if (notHost.length) {\n rest = '/' + notHost.join('.') + rest;\n }\n this.hostname = validParts.join('.');\n break;\n }\n }\n }\n }\n\n if (this.hostname.length > hostnameMaxLen) {\n this.hostname = '';\n } else {\n // hostnames are always lower case.\n this.hostname = this.hostname.toLowerCase();\n }\n\n if (!ipv6Hostname) {\n // IDNA Support: Returns a punycoded representation of \"domain\".\n // It only converts parts of the domain name that\n // have non-ASCII characters, i.e. it doesn't matter if\n // you call it with a domain that already is ASCII-only.\n this.hostname = punycode.toASCII(this.hostname);\n }\n\n var p = this.port ? ':' + this.port : '';\n var h = this.hostname || '';\n this.host = h + p;\n this.href += this.host;\n\n // strip [ and ] from the hostname\n // the host field still retains them, though\n if (ipv6Hostname) {\n this.hostname = this.hostname.substr(1, this.hostname.length - 2);\n if (rest[0] !== '/') {\n rest = '/' + rest;\n }\n }\n }\n\n // now rest is set to the post-host stuff.\n // chop off any delim chars.\n if (!unsafeProtocol[lowerProto]) {\n\n // First, make 100% sure that any \"autoEscape\" chars get\n // escaped, even if encodeURIComponent doesn't think they\n // need to be.\n for (var i = 0, l = autoEscape.length; i < l; i++) {\n var ae = autoEscape[i];\n if (rest.indexOf(ae) === -1)\n continue;\n var esc = encodeURIComponent(ae);\n if (esc === ae) {\n esc = escape(ae);\n }\n rest = rest.split(ae).join(esc);\n }\n }\n\n\n // chop off from the tail first.\n var hash = rest.indexOf('#');\n if (hash !== -1) {\n // got a fragment string.\n this.hash = rest.substr(hash);\n rest = rest.slice(0, hash);\n }\n var qm = rest.indexOf('?');\n if (qm !== -1) {\n this.search = rest.substr(qm);\n this.query = rest.substr(qm + 1);\n if (parseQueryString) {\n this.query = querystring.parse(this.query);\n }\n rest = rest.slice(0, qm);\n } else if (parseQueryString) {\n // no query string, but parseQueryString still requested\n this.search = '';\n this.query = {};\n }\n if (rest) this.pathname = rest;\n if (slashedProtocol[lowerProto] &&\n this.hostname && !this.pathname) {\n this.pathname = '/';\n }\n\n //to support http.request\n if (this.pathname || this.search) {\n var p = this.pathname || '';\n var s = this.search || '';\n this.path = p + s;\n }\n\n // finally, reconstruct the href based on what has been validated.\n this.href = this.format();\n return this;\n};\n\n// format a parsed object into a url string\nfunction urlFormat(obj) {\n // ensure it's an object, and not a string url.\n // If it's an obj, this is a no-op.\n // this way, you can call url_format() on strings\n // to clean up potentially wonky urls.\n if (util.isString(obj)) obj = urlParse(obj);\n if (!(obj instanceof Url)) return Url.prototype.format.call(obj);\n return obj.format();\n}\n\nUrl.prototype.format = function() {\n var auth = this.auth || '';\n if (auth) {\n auth = encodeURIComponent(auth);\n auth = auth.replace(/%3A/i, ':');\n auth += '@';\n }\n\n var protocol = this.protocol || '',\n pathname = this.pathname || '',\n hash = this.hash || '',\n host = false,\n query = '';\n\n if (this.host) {\n host = auth + this.host;\n } else if (this.hostname) {\n host = auth + (this.hostname.indexOf(':') === -1 ?\n this.hostname :\n '[' + this.hostname + ']');\n if (this.port) {\n host += ':' + this.port;\n }\n }\n\n if (this.query &&\n util.isObject(this.query) &&\n Object.keys(this.query).length) {\n query = querystring.stringify(this.query);\n }\n\n var search = this.search || (query && ('?' + query)) || '';\n\n if (protocol && protocol.substr(-1) !== ':') protocol += ':';\n\n // only the slashedProtocols get the //. Not mailto:, xmpp:, etc.\n // unless they had them to begin with.\n if (this.slashes ||\n (!protocol || slashedProtocol[protocol]) && host !== false) {\n host = '//' + (host || '');\n if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname;\n } else if (!host) {\n host = '';\n }\n\n if (hash && hash.charAt(0) !== '#') hash = '#' + hash;\n if (search && search.charAt(0) !== '?') search = '?' + search;\n\n pathname = pathname.replace(/[?#]/g, function(match) {\n return encodeURIComponent(match);\n });\n search = search.replace('#', '%23');\n\n return protocol + host + pathname + search + hash;\n};\n\nfunction urlResolve(source, relative) {\n return urlParse(source, false, true).resolve(relative);\n}\n\nUrl.prototype.resolve = function(relative) {\n return this.resolveObject(urlParse(relative, false, true)).format();\n};\n\nfunction urlResolveObject(source, relative) {\n if (!source) return relative;\n return urlParse(source, false, true).resolveObject(relative);\n}\n\nUrl.prototype.resolveObject = function(relative) {\n if (util.isString(relative)) {\n var rel = new Url();\n rel.parse(relative, false, true);\n relative = rel;\n }\n\n var result = new Url();\n var tkeys = Object.keys(this);\n for (var tk = 0; tk < tkeys.length; tk++) {\n var tkey = tkeys[tk];\n result[tkey] = this[tkey];\n }\n\n // hash is always overridden, no matter what.\n // even href=\"\" will remove it.\n result.hash = relative.hash;\n\n // if the relative url is empty, then there's nothing left to do here.\n if (relative.href === '') {\n result.href = result.format();\n return result;\n }\n\n // hrefs like //foo/bar always cut to the protocol.\n if (relative.slashes && !relative.protocol) {\n // take everything except the protocol from relative\n var rkeys = Object.keys(relative);\n for (var rk = 0; rk < rkeys.length; rk++) {\n var rkey = rkeys[rk];\n if (rkey !== 'protocol')\n result[rkey] = relative[rkey];\n }\n\n //urlParse appends trailing / to urls like http://www.example.com\n if (slashedProtocol[result.protocol] &&\n result.hostname && !result.pathname) {\n result.path = result.pathname = '/';\n }\n\n result.href = result.format();\n return result;\n }\n\n if (relative.protocol && relative.protocol !== result.protocol) {\n // if it's a known url protocol, then changing\n // the protocol does weird things\n // first, if it's not file:, then we MUST have a host,\n // and if there was a path\n // to begin with, then we MUST have a path.\n // if it is file:, then the host is dropped,\n // because that's known to be hostless.\n // anything else is assumed to be absolute.\n if (!slashedProtocol[relative.protocol]) {\n var keys = Object.keys(relative);\n for (var v = 0; v < keys.length; v++) {\n var k = keys[v];\n result[k] = relative[k];\n }\n result.href = result.format();\n return result;\n }\n\n result.protocol = relative.protocol;\n if (!relative.host && !hostlessProtocol[relative.protocol]) {\n var relPath = (relative.pathname || '').split('/');\n while (relPath.length && !(relative.host = relPath.shift()));\n if (!relative.host) relative.host = '';\n if (!relative.hostname) relative.hostname = '';\n if (relPath[0] !== '') relPath.unshift('');\n if (relPath.length < 2) relPath.unshift('');\n result.pathname = relPath.join('/');\n } else {\n result.pathname = relative.pathname;\n }\n result.search = relative.search;\n result.query = relative.query;\n result.host = relative.host || '';\n result.auth = relative.auth;\n result.hostname = relative.hostname || relative.host;\n result.port = relative.port;\n // to support http.request\n if (result.pathname || result.search) {\n var p = result.pathname || '';\n var s = result.search || '';\n result.path = p + s;\n }\n result.slashes = result.slashes || relative.slashes;\n result.href = result.format();\n return result;\n }\n\n var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'),\n isRelAbs = (\n relative.host ||\n relative.pathname && relative.pathname.charAt(0) === '/'\n ),\n mustEndAbs = (isRelAbs || isSourceAbs ||\n (result.host && relative.pathname)),\n removeAllDots = mustEndAbs,\n srcPath = result.pathname && result.pathname.split('/') || [],\n relPath = relative.pathname && relative.pathname.split('/') || [],\n psychotic = result.protocol && !slashedProtocol[result.protocol];\n\n // if the url is a non-slashed url, then relative\n // links like ../.. should be able\n // to crawl up to the hostname, as well. This is strange.\n // result.protocol has already been set by now.\n // Later on, put the first path part into the host field.\n if (psychotic) {\n result.hostname = '';\n result.port = null;\n if (result.host) {\n if (srcPath[0] === '') srcPath[0] = result.host;\n else srcPath.unshift(result.host);\n }\n result.host = '';\n if (relative.protocol) {\n relative.hostname = null;\n relative.port = null;\n if (relative.host) {\n if (relPath[0] === '') relPath[0] = relative.host;\n else relPath.unshift(relative.host);\n }\n relative.host = null;\n }\n mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');\n }\n\n if (isRelAbs) {\n // it's absolute.\n result.host = (relative.host || relative.host === '') ?\n relative.host : result.host;\n result.hostname = (relative.hostname || relative.hostname === '') ?\n relative.hostname : result.hostname;\n result.search = relative.search;\n result.query = relative.query;\n srcPath = relPath;\n // fall through to the dot-handling below.\n } else if (relPath.length) {\n // it's relative\n // throw away the existing file, and take the new path instead.\n if (!srcPath) srcPath = [];\n srcPath.pop();\n srcPath = srcPath.concat(relPath);\n result.search = relative.search;\n result.query = relative.query;\n } else if (!util.isNullOrUndefined(relative.search)) {\n // just pull out the search.\n // like href='?foo'.\n // Put this after the other two cases because it simplifies the booleans\n if (psychotic) {\n result.hostname = result.host = srcPath.shift();\n //occationaly the auth can get stuck only in host\n //this especially happens in cases like\n //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\n var authInHost = result.host && result.host.indexOf('@') > 0 ?\n result.host.split('@') : false;\n if (authInHost) {\n result.auth = authInHost.shift();\n result.host = result.hostname = authInHost.shift();\n }\n }\n result.search = relative.search;\n result.query = relative.query;\n //to support http.request\n if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\n result.path = (result.pathname ? result.pathname : '') +\n (result.search ? result.search : '');\n }\n result.href = result.format();\n return result;\n }\n\n if (!srcPath.length) {\n // no path at all. easy.\n // we've already handled the other stuff above.\n result.pathname = null;\n //to support http.request\n if (result.search) {\n result.path = '/' + result.search;\n } else {\n result.path = null;\n }\n result.href = result.format();\n return result;\n }\n\n // if a url ENDs in . or .., then it must get a trailing slash.\n // however, if it ends in anything else non-slashy,\n // then it must NOT get a trailing slash.\n var last = srcPath.slice(-1)[0];\n var hasTrailingSlash = (\n (result.host || relative.host || srcPath.length > 1) &&\n (last === '.' || last === '..') || last === '');\n\n // strip single dots, resolve double dots to parent dir\n // if the path tries to go above the root, `up` ends up > 0\n var up = 0;\n for (var i = srcPath.length; i >= 0; i--) {\n last = srcPath[i];\n if (last === '.') {\n srcPath.splice(i, 1);\n } else if (last === '..') {\n srcPath.splice(i, 1);\n up++;\n } else if (up) {\n srcPath.splice(i, 1);\n up--;\n }\n }\n\n // if the path is allowed to go above the root, restore leading ..s\n if (!mustEndAbs && !removeAllDots) {\n for (; up--; up) {\n srcPath.unshift('..');\n }\n }\n\n if (mustEndAbs && srcPath[0] !== '' &&\n (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {\n srcPath.unshift('');\n }\n\n if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) {\n srcPath.push('');\n }\n\n var isAbsolute = srcPath[0] === '' ||\n (srcPath[0] && srcPath[0].charAt(0) === '/');\n\n // put the host back\n if (psychotic) {\n result.hostname = result.host = isAbsolute ? '' :\n srcPath.length ? srcPath.shift() : '';\n //occationaly the auth can get stuck only in host\n //this especially happens in cases like\n //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\n var authInHost = result.host && result.host.indexOf('@') > 0 ?\n result.host.split('@') : false;\n if (authInHost) {\n result.auth = authInHost.shift();\n result.host = result.hostname = authInHost.shift();\n }\n }\n\n mustEndAbs = mustEndAbs || (result.host && srcPath.length);\n\n if (mustEndAbs && !isAbsolute) {\n srcPath.unshift('');\n }\n\n if (!srcPath.length) {\n result.pathname = null;\n result.path = null;\n } else {\n result.pathname = srcPath.join('/');\n }\n\n //to support request.http\n if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\n result.path = (result.pathname ? result.pathname : '') +\n (result.search ? result.search : '');\n }\n result.auth = relative.auth || result.auth;\n result.slashes = result.slashes || relative.slashes;\n result.href = result.format();\n return result;\n};\n\nUrl.prototype.parseHost = function() {\n var host = this.host;\n var port = portPattern.exec(host);\n if (port) {\n port = port[0];\n if (port !== ':') {\n this.port = port.substr(1);\n }\n host = host.substr(0, host.length - port.length);\n }\n if (host) this.hostname = host;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvdXJsL3VybC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL3VybC91cmwuanM/MGIxNiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcHVueWNvZGUgPSByZXF1aXJlKCdwdW55Y29kZScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuZXhwb3J0cy5wYXJzZSA9IHVybFBhcnNlO1xuZXhwb3J0cy5yZXNvbHZlID0gdXJsUmVzb2x2ZTtcbmV4cG9ydHMucmVzb2x2ZU9iamVjdCA9IHVybFJlc29sdmVPYmplY3Q7XG5leHBvcnRzLmZvcm1hdCA9IHVybEZvcm1hdDtcblxuZXhwb3J0cy5VcmwgPSBVcmw7XG5cbmZ1bmN0aW9uIFVybCgpIHtcbiAgdGhpcy5wcm90b2NvbCA9IG51bGw7XG4gIHRoaXMuc2xhc2hlcyA9IG51bGw7XG4gIHRoaXMuYXV0aCA9IG51bGw7XG4gIHRoaXMuaG9zdCA9IG51bGw7XG4gIHRoaXMucG9ydCA9IG51bGw7XG4gIHRoaXMuaG9zdG5hbWUgPSBudWxsO1xuICB0aGlzLmhhc2ggPSBudWxsO1xuICB0aGlzLnNlYXJjaCA9IG51bGw7XG4gIHRoaXMucXVlcnkgPSBudWxsO1xuICB0aGlzLnBhdGhuYW1lID0gbnVsbDtcbiAgdGhpcy5wYXRoID0gbnVsbDtcbiAgdGhpcy5ocmVmID0gbnVsbDtcbn1cblxuLy8gUmVmZXJlbmNlOiBSRkMgMzk4NiwgUkZDIDE4MDgsIFJGQyAyMzk2XG5cbi8vIGRlZmluZSB0aGVzZSBoZXJlIHNvIGF0IGxlYXN0IHRoZXkgb25seSBoYXZlIHRvIGJlXG4vLyBjb21waWxlZCBvbmNlIG9uIHRoZSBmaXJzdCBtb2R1bGUgbG9hZC5cbnZhciBwcm90b2NvbFBhdHRlcm4gPSAvXihbYS16MC05ListXSs6KS9pLFxuICAgIHBvcnRQYXR0ZXJuID0gLzpbMC05XSokLyxcblxuICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgYSBzaW1wbGUgcGF0aCBVUkxcbiAgICBzaW1wbGVQYXRoUGF0dGVybiA9IC9eKFxcL1xcLz8oPyFcXC8pW15cXD9cXHNdKikoXFw/W15cXHNdKik/JC8sXG5cbiAgICAvLyBSRkMgMjM5NjogY2hhcmFjdGVycyByZXNlcnZlZCBmb3IgZGVsaW1pdGluZyBVUkxzLlxuICAgIC8vIFdlIGFjdHVhbGx5IGp1c3QgYXV0by1lc2NhcGUgdGhlc2UuXG4gICAgZGVsaW1zID0gWyc8JywgJz4nLCAnXCInLCAnYCcsICcgJywgJ1xccicsICdcXG4nLCAnXFx0J10sXG5cbiAgICAvLyBSRkMgMjM5NjogY2hhcmFjdGVycyBub3QgYWxsb3dlZCBmb3IgdmFyaW91cyByZWFzb25zLlxuICAgIHVud2lzZSA9IFsneycsICd9JywgJ3wnLCAnXFxcXCcsICdeJywgJ2AnXS5jb25jYXQoZGVsaW1zKSxcblxuICAgIC8vIEFsbG93ZWQgYnkgUkZDcywgYnV0IGNhdXNlIG9mIFhTUyBhdHRhY2tzLiAgQWx3YXlzIGVzY2FwZSB0aGVzZS5cbiAgICBhdXRvRXNjYXBlID0gWydcXCcnXS5jb25jYXQodW53aXNlKSxcbiAgICAvLyBDaGFyYWN0ZXJzIHRoYXQgYXJlIG5ldmVyIGV2ZXIgYWxsb3dlZCBpbiBhIGhvc3RuYW1lLlxuICAgIC8vIE5vdGUgdGhhdCBhbnkgaW52YWxpZCBjaGFycyBhcmUgYWxzbyBoYW5kbGVkLCBidXQgdGhlc2VcbiAgICAvLyBhcmUgdGhlIG9uZXMgdGhhdCBhcmUgKmV4cGVjdGVkKiB0byBiZSBzZWVuLCBzbyB3ZSBmYXN0LXBhdGhcbiAgICAvLyB0aGVtLlxuICAgIG5vbkhvc3RDaGFycyA9IFsnJScsICcvJywgJz8nLCAnOycsICcjJ10uY29uY2F0KGF1dG9Fc2NhcGUpLFxuICAgIGhvc3RFbmRpbmdDaGFycyA9IFsnLycsICc/JywgJyMnXSxcbiAgICBob3N0bmFtZU1heExlbiA9IDI1NSxcbiAgICBob3N0bmFtZVBhcnRQYXR0ZXJuID0gL15bK2EtejAtOUEtWl8tXXswLDYzfSQvLFxuICAgIGhvc3RuYW1lUGFydFN0YXJ0ID0gL14oWythLXowLTlBLVpfLV17MCw2M30pKC4qKSQvLFxuICAgIC8vIHByb3RvY29scyB0aGF0IGNhbiBhbGxvdyBcInVuc2FmZVwiIGFuZCBcInVud2lzZVwiIGNoYXJzLlxuICAgIHVuc2FmZVByb3RvY29sID0ge1xuICAgICAgJ2phdmFzY3JpcHQnOiB0cnVlLFxuICAgICAgJ2phdmFzY3JpcHQ6JzogdHJ1ZVxuICAgIH0sXG4gICAgLy8gcHJvdG9jb2xzIHRoYXQgbmV2ZXIgaGF2ZSBhIGhvc3RuYW1lLlxuICAgIGhvc3RsZXNzUHJvdG9jb2wgPSB7XG4gICAgICAnamF2YXNjcmlwdCc6IHRydWUsXG4gICAgICAnamF2YXNjcmlwdDonOiB0cnVlXG4gICAgfSxcbiAgICAvLyBwcm90b2NvbHMgdGhhdCBhbHdheXMgY29udGFpbiBhIC8vIGJpdC5cbiAgICBzbGFzaGVkUHJvdG9jb2wgPSB7XG4gICAgICAnaHR0cCc6IHRydWUsXG4gICAgICAnaHR0cHMnOiB0cnVlLFxuICAgICAgJ2Z0cCc6IHRydWUsXG4gICAgICAnZ29waGVyJzogdHJ1ZSxcbiAgICAgICdmaWxlJzogdHJ1ZSxcbiAgICAgICdodHRwOic6IHRydWUsXG4gICAgICAnaHR0cHM6JzogdHJ1ZSxcbiAgICAgICdmdHA6JzogdHJ1ZSxcbiAgICAgICdnb3BoZXI6JzogdHJ1ZSxcbiAgICAgICdmaWxlOic6IHRydWVcbiAgICB9LFxuICAgIHF1ZXJ5c3RyaW5nID0gcmVxdWlyZSgncXVlcnlzdHJpbmcnKTtcblxuZnVuY3Rpb24gdXJsUGFyc2UodXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCkge1xuICBpZiAodXJsICYmIHV0aWwuaXNPYmplY3QodXJsKSAmJiB1cmwgaW5zdGFuY2VvZiBVcmwpIHJldHVybiB1cmw7XG5cbiAgdmFyIHUgPSBuZXcgVXJsO1xuICB1LnBhcnNlKHVybCwgcGFyc2VRdWVyeVN0cmluZywgc2xhc2hlc0Rlbm90ZUhvc3QpO1xuICByZXR1cm4gdTtcbn1cblxuVXJsLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uKHVybCwgcGFyc2VRdWVyeVN0cmluZywgc2xhc2hlc0Rlbm90ZUhvc3QpIHtcbiAgaWYgKCF1dGlsLmlzU3RyaW5nKHVybCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUGFyYW1ldGVyICd1cmwnIG11c3QgYmUgYSBzdHJpbmcsIG5vdCBcIiArIHR5cGVvZiB1cmwpO1xuICB9XG5cbiAgLy8gQ29weSBjaHJvbWUsIElFLCBvcGVyYSBiYWNrc2xhc2gtaGFuZGxpbmcgYmVoYXZpb3IuXG4gIC8vIEJhY2sgc2xhc2hlcyBiZWZvcmUgdGhlIHF1ZXJ5IHN0cmluZyBnZXQgY29udmVydGVkIHRvIGZvcndhcmQgc2xhc2hlc1xuICAvLyBTZWU6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0yNTkxNlxuICB2YXIgcXVlcnlJbmRleCA9IHVybC5pbmRleE9mKCc/JyksXG4gICAgICBzcGxpdHRlciA9XG4gICAgICAgICAgKHF1ZXJ5SW5kZXggIT09IC0xICYmIHF1ZXJ5SW5kZXggPCB1cmwuaW5kZXhPZignIycpKSA/ICc/JyA6ICcjJyxcbiAgICAgIHVTcGxpdCA9IHVybC5zcGxpdChzcGxpdHRlciksXG4gICAgICBzbGFzaFJlZ2V4ID0gL1xcXFwvZztcbiAgdVNwbGl0WzBdID0gdVNwbGl0WzBdLnJlcGxhY2Uoc2xhc2hSZWdleCwgJy8nKTtcbiAgdXJsID0gdVNwbGl0LmpvaW4oc3BsaXR0ZXIpO1xuXG4gIHZhciByZXN0ID0gdXJsO1xuXG4gIC8vIHRyaW0gYmVmb3JlIHByb2NlZWRpbmcuXG4gIC8vIFRoaXMgaXMgdG8gc3VwcG9ydCBwYXJzZSBzdHVmZiBsaWtlIFwiICBodHRwOi8vZm9vLmNvbSAgXFxuXCJcbiAgcmVzdCA9IHJlc3QudHJpbSgpO1xuXG4gIGlmICghc2xhc2hlc0Rlbm90ZUhvc3QgJiYgdXJsLnNwbGl0KCcjJykubGVuZ3RoID09PSAxKSB7XG4gICAgLy8gVHJ5IGZhc3QgcGF0aCByZWdleHBcbiAgICB2YXIgc2ltcGxlUGF0aCA9IHNpbXBsZVBhdGhQYXR0ZXJuLmV4ZWMocmVzdCk7XG4gICAgaWYgKHNpbXBsZVBhdGgpIHtcbiAgICAgIHRoaXMucGF0aCA9IHJlc3Q7XG4gICAgICB0aGlzLmhyZWYgPSByZXN0O1xuICAgICAgdGhpcy5wYXRobmFtZSA9IHNpbXBsZVBhdGhbMV07XG4gICAgICBpZiAoc2ltcGxlUGF0aFsyXSkge1xuICAgICAgICB0aGlzLnNlYXJjaCA9IHNpbXBsZVBhdGhbMl07XG4gICAgICAgIGlmIChwYXJzZVF1ZXJ5U3RyaW5nKSB7XG4gICAgICAgICAgdGhpcy5xdWVyeSA9IHF1ZXJ5c3RyaW5nLnBhcnNlKHRoaXMuc2VhcmNoLnN1YnN0cigxKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5xdWVyeSA9IHRoaXMuc2VhcmNoLnN1YnN0cigxKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwYXJzZVF1ZXJ5U3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoID0gJyc7XG4gICAgICAgIHRoaXMucXVlcnkgPSB7fTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfVxuXG4gIHZhciBwcm90byA9IHByb3RvY29sUGF0dGVybi5leGVjKHJlc3QpO1xuICBpZiAocHJvdG8pIHtcbiAgICBwcm90byA9IHByb3RvWzBdO1xuICAgIHZhciBsb3dlclByb3RvID0gcHJvdG8udG9Mb3dlckNhc2UoKTtcbiAgICB0aGlzLnByb3RvY29sID0gbG93ZXJQcm90bztcbiAgICByZXN0ID0gcmVzdC5zdWJzdHIocHJvdG8ubGVuZ3RoKTtcbiAgfVxuXG4gIC8vIGZpZ3VyZSBvdXQgaWYgaXQncyBnb3QgYSBob3N0XG4gIC8vIHVzZXJAc2VydmVyIGlzICphbHdheXMqIGludGVycHJldGVkIGFzIGEgaG9zdG5hbWUsIGFuZCB1cmxcbiAgLy8gcmVzb2x1dGlvbiB3aWxsIHRyZWF0IC8vZm9vL2JhciBhcyBob3N0PWZvbyxwYXRoPWJhciBiZWNhdXNlIHRoYXQnc1xuICAvLyBob3cgdGhlIGJyb3dzZXIgcmVzb2x2ZXMgcmVsYXRpdmUgVVJMcy5cbiAgaWYgKHNsYXNoZXNEZW5vdGVIb3N0IHx8IHByb3RvIHx8IHJlc3QubWF0Y2goL15cXC9cXC9bXkBcXC9dK0BbXkBcXC9dKy8pKSB7XG4gICAgdmFyIHNsYXNoZXMgPSByZXN0LnN1YnN0cigwLCAyKSA9PT0gJy8vJztcbiAgICBpZiAoc2xhc2hlcyAmJiAhKHByb3RvICYmIGhvc3RsZXNzUHJvdG9jb2xbcHJvdG9dKSkge1xuICAgICAgcmVzdCA9IHJlc3Quc3Vic3RyKDIpO1xuICAgICAgdGhpcy5zbGFzaGVzID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWhvc3RsZXNzUHJvdG9jb2xbcHJvdG9dICYmXG4gICAgICAoc2xhc2hlcyB8fCAocHJvdG8gJiYgIXNsYXNoZWRQcm90b2NvbFtwcm90b10pKSkge1xuXG4gICAgLy8gdGhlcmUncyBhIGhvc3RuYW1lLlxuICAgIC8vIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiAvLCA/LCA7LCBvciAjIGVuZHMgdGhlIGhvc3QuXG4gICAgLy9cbiAgICAvLyBJZiB0aGVyZSBpcyBhbiBAIGluIHRoZSBob3N0bmFtZSwgdGhlbiBub24taG9zdCBjaGFycyAqYXJlKiBhbGxvd2VkXG4gICAgLy8gdG8gdGhlIGxlZnQgb2YgdGhlIGxhc3QgQCBzaWduLCB1bmxlc3Mgc29tZSBob3N0LWVuZGluZyBjaGFyYWN0ZXJcbiAgICAvLyBjb21lcyAqYmVmb3JlKiB0aGUgQC1zaWduLlxuICAgIC8vIFVSTHMgYXJlIG9ibm94aW91cy5cbiAgICAvL1xuICAgIC8vIGV4OlxuICAgIC8vIGh0dHA6Ly9hQGJAYy8gPT4gdXNlcjphQGIgaG9zdDpjXG4gICAgLy8gaHR0cDovL2FAYj9AYyA9PiB1c2VyOmEgaG9zdDpjIHBhdGg6Lz9AY1xuXG4gICAgLy8gdjAuMTIgVE9ETyhpc2FhY3MpOiBUaGlzIGlzIG5vdCBxdWl0ZSBob3cgQ2hyb21lIGRvZXMgdGhpbmdzLlxuICAgIC8vIFJldmlldyBvdXIgdGVzdCBjYXNlIGFnYWluc3QgYnJvd3NlcnMgbW9yZSBjb21wcmVoZW5zaXZlbHkuXG5cbiAgICAvLyBmaW5kIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiBhbnkgaG9zdEVuZGluZ0NoYXJzXG4gICAgdmFyIGhvc3RFbmQgPSAtMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhvc3RFbmRpbmdDaGFycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGhlYyA9IHJlc3QuaW5kZXhPZihob3N0RW5kaW5nQ2hhcnNbaV0pO1xuICAgICAgaWYgKGhlYyAhPT0gLTEgJiYgKGhvc3RFbmQgPT09IC0xIHx8IGhlYyA8IGhvc3RFbmQpKVxuICAgICAgICBob3N0RW5kID0gaGVjO1xuICAgIH1cblxuICAgIC8vIGF0IHRoaXMgcG9pbnQsIGVpdGhlciB3ZSBoYXZlIGFuIGV4cGxpY2l0IHBvaW50IHdoZXJlIHRoZVxuICAgIC8vIGF1dGggcG9ydGlvbiBjYW5ub3QgZ28gcGFzdCwgb3IgdGhlIGxhc3QgQCBjaGFyIGlzIHRoZSBkZWNpZGVyLlxuICAgIHZhciBhdXRoLCBhdFNpZ247XG4gICAgaWYgKGhvc3RFbmQgPT09IC0xKSB7XG4gICAgICAvLyBhdFNpZ24gY2FuIGJlIGFueXdoZXJlLlxuICAgICAgYXRTaWduID0gcmVzdC5sYXN0SW5kZXhPZignQCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhdFNpZ24gbXVzdCBiZSBpbiBhdXRoIHBvcnRpb24uXG4gICAgICAvLyBodHRwOi8vYUBiL2NAZCA9PiBob3N0OmIgYXV0aDphIHBhdGg6L2NAZFxuICAgICAgYXRTaWduID0gcmVzdC5sYXN0SW5kZXhPZignQCcsIGhvc3RFbmQpO1xuICAgIH1cblxuICAgIC8vIE5vdyB3ZSBoYXZlIGEgcG9ydGlvbiB3aGljaCBpcyBkZWZpbml0ZWx5IHRoZSBhdXRoLlxuICAgIC8vIFB1bGwgdGhhdCBvZmYuXG4gICAgaWYgKGF0U2lnbiAhPT0gLTEpIHtcbiAgICAgIGF1dGggPSByZXN0LnNsaWNlKDAsIGF0U2lnbik7XG4gICAgICByZXN0ID0gcmVzdC5zbGljZShhdFNpZ24gKyAxKTtcbiAgICAgIHRoaXMuYXV0aCA9IGRlY29kZVVSSUNvbXBvbmVudChhdXRoKTtcbiAgICB9XG5cbiAgICAvLyB0aGUgaG9zdCBpcyB0aGUgcmVtYWluaW5nIHRvIHRoZSBsZWZ0IG9mIHRoZSBmaXJzdCBub24taG9zdCBjaGFyXG4gICAgaG9zdEVuZCA9IC0xO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9uSG9zdENoYXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaGVjID0gcmVzdC5pbmRleE9mKG5vbkhvc3RDaGFyc1tpXSk7XG4gICAgICBpZiAoaGVjICE9PSAtMSAmJiAoaG9zdEVuZCA9PT0gLTEgfHwgaGVjIDwgaG9zdEVuZCkpXG4gICAgICAgIGhvc3RFbmQgPSBoZWM7XG4gICAgfVxuICAgIC8vIGlmIHdlIHN0aWxsIGhhdmUgbm90IGhpdCBpdCwgdGhlbiB0aGUgZW50aXJlIHRoaW5nIGlzIGEgaG9zdC5cbiAgICBpZiAoaG9zdEVuZCA9PT0gLTEpXG4gICAgICBob3N0RW5kID0gcmVzdC5sZW5ndGg7XG5cbiAgICB0aGlzLmhvc3QgPSByZXN0LnNsaWNlKDAsIGhvc3RFbmQpO1xuICAgIHJlc3QgPSByZXN0LnNsaWNlKGhvc3RFbmQpO1xuXG4gICAgLy8gcHVsbCBvdXQgcG9ydC5cbiAgICB0aGlzLnBhcnNlSG9zdCgpO1xuXG4gICAgLy8gd2UndmUgaW5kaWNhdGVkIHRoYXQgdGhlcmUgaXMgYSBob3N0bmFtZSxcbiAgICAvLyBzbyBldmVuIGlmIGl0J3MgZW1wdHksIGl0IGhhcyB0byBiZSBwcmVzZW50LlxuICAgIHRoaXMuaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lIHx8ICcnO1xuXG4gICAgLy8gaWYgaG9zdG5hbWUgYmVnaW5zIHdpdGggWyBhbmQgZW5kcyB3aXRoIF1cbiAgICAvLyBhc3N1bWUgdGhhdCBpdCdzIGFuIElQdjYgYWRkcmVzcy5cbiAgICB2YXIgaXB2Nkhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZVswXSA9PT0gJ1snICYmXG4gICAgICAgIHRoaXMuaG9zdG5hbWVbdGhpcy5ob3N0bmFtZS5sZW5ndGggLSAxXSA9PT0gJ10nO1xuXG4gICAgLy8gdmFsaWRhdGUgYSBsaXR0bGUuXG4gICAgaWYgKCFpcHY2SG9zdG5hbWUpIHtcbiAgICAgIHZhciBob3N0cGFydHMgPSB0aGlzLmhvc3RuYW1lLnNwbGl0KC9cXC4vKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gaG9zdHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICB2YXIgcGFydCA9IGhvc3RwYXJ0c1tpXTtcbiAgICAgICAgaWYgKCFwYXJ0KSBjb250aW51ZTtcbiAgICAgICAgaWYgKCFwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFBhdHRlcm4pKSB7XG4gICAgICAgICAgdmFyIG5ld3BhcnQgPSAnJztcbiAgICAgICAgICBmb3IgKHZhciBqID0gMCwgayA9IHBhcnQubGVuZ3RoOyBqIDwgazsgaisrKSB7XG4gICAgICAgICAgICBpZiAocGFydC5jaGFyQ29kZUF0KGopID4gMTI3KSB7XG4gICAgICAgICAgICAgIC8vIHdlIHJlcGxhY2Ugbm9uLUFTQ0lJIGNoYXIgd2l0aCBhIHRlbXBvcmFyeSBwbGFjZWhvbGRlclxuICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRoaXMgdG8gbWFrZSBzdXJlIHNpemUgb2YgaG9zdG5hbWUgaXMgbm90XG4gICAgICAgICAgICAgIC8vIGJyb2tlbiBieSByZXBsYWNpbmcgbm9uLUFTQ0lJIGJ5IG5vdGhpbmdcbiAgICAgICAgICAgICAgbmV3cGFydCArPSAneCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBuZXdwYXJ0ICs9IHBhcnRbal07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHdlIHRlc3QgYWdhaW4gd2l0aCBBU0NJSSBjaGFyIG9ubHlcbiAgICAgICAgICBpZiAoIW5ld3BhcnQubWF0Y2goaG9zdG5hbWVQYXJ0UGF0dGVybikpIHtcbiAgICAgICAgICAgIHZhciB2YWxpZFBhcnRzID0gaG9zdHBhcnRzLnNsaWNlKDAsIGkpO1xuICAgICAgICAgICAgdmFyIG5vdEhvc3QgPSBob3N0cGFydHMuc2xpY2UoaSArIDEpO1xuICAgICAgICAgICAgdmFyIGJpdCA9IHBhcnQubWF0Y2goaG9zdG5hbWVQYXJ0U3RhcnQpO1xuICAgICAgICAgICAgaWYgKGJpdCkge1xuICAgICAgICAgICAgICB2YWxpZFBhcnRzLnB1c2goYml0WzFdKTtcbiAgICAgICAgICAgICAgbm90SG9zdC51bnNoaWZ0KGJpdFsyXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm90SG9zdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcmVzdCA9ICcvJyArIG5vdEhvc3Quam9pbignLicpICsgcmVzdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaG9zdG5hbWUgPSB2YWxpZFBhcnRzLmpvaW4oJy4nKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmhvc3RuYW1lLmxlbmd0aCA+IGhvc3RuYW1lTWF4TGVuKSB7XG4gICAgICB0aGlzLmhvc3RuYW1lID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGhvc3RuYW1lcyBhcmUgYWx3YXlzIGxvd2VyIGNhc2UuXG4gICAgICB0aGlzLmhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIGlmICghaXB2Nkhvc3RuYW1lKSB7XG4gICAgICAvLyBJRE5BIFN1cHBvcnQ6IFJldHVybnMgYSBwdW55Y29kZWQgcmVwcmVzZW50YXRpb24gb2YgXCJkb21haW5cIi5cbiAgICAgIC8vIEl0IG9ubHkgY29udmVydHMgcGFydHMgb2YgdGhlIGRvbWFpbiBuYW1lIHRoYXRcbiAgICAgIC8vIGhhdmUgbm9uLUFTQ0lJIGNoYXJhY3RlcnMsIGkuZS4gaXQgZG9lc24ndCBtYXR0ZXIgaWZcbiAgICAgIC8vIHlvdSBjYWxsIGl0IHdpdGggYSBkb21haW4gdGhhdCBhbHJlYWR5IGlzIEFTQ0lJLW9ubHkuXG4gICAgICB0aGlzLmhvc3RuYW1lID0gcHVueWNvZGUudG9BU0NJSSh0aGlzLmhvc3RuYW1lKTtcbiAgICB9XG5cbiAgICB2YXIgcCA9IHRoaXMucG9ydCA/ICc6JyArIHRoaXMucG9ydCA6ICcnO1xuICAgIHZhciBoID0gdGhpcy5ob3N0bmFtZSB8fCAnJztcbiAgICB0aGlzLmhvc3QgPSBoICsgcDtcbiAgICB0aGlzLmhyZWYgKz0gdGhpcy5ob3N0O1xuXG4gICAgLy8gc3RyaXAgWyBhbmQgXSBmcm9tIHRoZSBob3N0bmFtZVxuICAgIC8vIHRoZSBob3N0IGZpZWxkIHN0aWxsIHJldGFpbnMgdGhlbSwgdGhvdWdoXG4gICAgaWYgKGlwdjZIb3N0bmFtZSkge1xuICAgICAgdGhpcy5ob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWUuc3Vic3RyKDEsIHRoaXMuaG9zdG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBpZiAocmVzdFswXSAhPT0gJy8nKSB7XG4gICAgICAgIHJlc3QgPSAnLycgKyByZXN0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIG5vdyByZXN0IGlzIHNldCB0byB0aGUgcG9zdC1ob3N0IHN0dWZmLlxuICAvLyBjaG9wIG9mZiBhbnkgZGVsaW0gY2hhcnMuXG4gIGlmICghdW5zYWZlUHJvdG9jb2xbbG93ZXJQcm90b10pIHtcblxuICAgIC8vIEZpcnN0LCBtYWtlIDEwMCUgc3VyZSB0aGF0IGFueSBcImF1dG9Fc2NhcGVcIiBjaGFycyBnZXRcbiAgICAvLyBlc2NhcGVkLCBldmVuIGlmIGVuY29kZVVSSUNvbXBvbmVudCBkb2Vzbid0IHRoaW5rIHRoZXlcbiAgICAvLyBuZWVkIHRvIGJlLlxuICAgIGZvciAodmFyIGkgPSAwLCBsID0gYXV0b0VzY2FwZS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHZhciBhZSA9IGF1dG9Fc2NhcGVbaV07XG4gICAgICBpZiAocmVzdC5pbmRleE9mKGFlKSA9PT0gLTEpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgdmFyIGVzYyA9IGVuY29kZVVSSUNvbXBvbmVudChhZSk7XG4gICAgICBpZiAoZXNjID09PSBhZSkge1xuICAgICAgICBlc2MgPSBlc2NhcGUoYWUpO1xuICAgICAgfVxuICAgICAgcmVzdCA9IHJlc3Quc3BsaXQoYWUpLmpvaW4oZXNjKTtcbiAgICB9XG4gIH1cblxuXG4gIC8vIGNob3Agb2ZmIGZyb20gdGhlIHRhaWwgZmlyc3QuXG4gIHZhciBoYXNoID0gcmVzdC5pbmRleE9mKCcjJyk7XG4gIGlmIChoYXNoICE9PSAtMSkge1xuICAgIC8vIGdvdCBhIGZyYWdtZW50IHN0cmluZy5cbiAgICB0aGlzLmhhc2ggPSByZXN0LnN1YnN0cihoYXNoKTtcbiAgICByZXN0ID0gcmVzdC5zbGljZSgwLCBoYXNoKTtcbiAgfVxuICB2YXIgcW0gPSByZXN0LmluZGV4T2YoJz8nKTtcbiAgaWYgKHFtICE9PSAtMSkge1xuICAgIHRoaXMuc2VhcmNoID0gcmVzdC5zdWJzdHIocW0pO1xuICAgIHRoaXMucXVlcnkgPSByZXN0LnN1YnN0cihxbSArIDEpO1xuICAgIGlmIChwYXJzZVF1ZXJ5U3RyaW5nKSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0gcXVlcnlzdHJpbmcucGFyc2UodGhpcy5xdWVyeSk7XG4gICAgfVxuICAgIHJlc3QgPSByZXN0LnNsaWNlKDAsIHFtKTtcbiAgfSBlbHNlIGlmIChwYXJzZVF1ZXJ5U3RyaW5nKSB7XG4gICAgLy8gbm8gcXVlcnkgc3RyaW5nLCBidXQgcGFyc2VRdWVyeVN0cmluZyBzdGlsbCByZXF1ZXN0ZWRcbiAgICB0aGlzLnNlYXJjaCA9ICcnO1xuICAgIHRoaXMucXVlcnkgPSB7fTtcbiAgfVxuICBpZiAocmVzdCkgdGhpcy5wYXRobmFtZSA9IHJlc3Q7XG4gIGlmIChzbGFzaGVkUHJvdG9jb2xbbG93ZXJQcm90b10gJiZcbiAgICAgIHRoaXMuaG9zdG5hbWUgJiYgIXRoaXMucGF0aG5hbWUpIHtcbiAgICB0aGlzLnBhdGhuYW1lID0gJy8nO1xuICB9XG5cbiAgLy90byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICBpZiAodGhpcy5wYXRobmFtZSB8fCB0aGlzLnNlYXJjaCkge1xuICAgIHZhciBwID0gdGhpcy5wYXRobmFtZSB8fCAnJztcbiAgICB2YXIgcyA9IHRoaXMuc2VhcmNoIHx8ICcnO1xuICAgIHRoaXMucGF0aCA9IHAgKyBzO1xuICB9XG5cbiAgLy8gZmluYWxseSwgcmVjb25zdHJ1Y3QgdGhlIGhyZWYgYmFzZWQgb24gd2hhdCBoYXMgYmVlbiB2YWxpZGF0ZWQuXG4gIHRoaXMuaHJlZiA9IHRoaXMuZm9ybWF0KCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gZm9ybWF0IGEgcGFyc2VkIG9iamVjdCBpbnRvIGEgdXJsIHN0cmluZ1xuZnVuY3Rpb24gdXJsRm9ybWF0KG9iaikge1xuICAvLyBlbnN1cmUgaXQncyBhbiBvYmplY3QsIGFuZCBub3QgYSBzdHJpbmcgdXJsLlxuICAvLyBJZiBpdCdzIGFuIG9iaiwgdGhpcyBpcyBhIG5vLW9wLlxuICAvLyB0aGlzIHdheSwgeW91IGNhbiBjYWxsIHVybF9mb3JtYXQoKSBvbiBzdHJpbmdzXG4gIC8vIHRvIGNsZWFuIHVwIHBvdGVudGlhbGx5IHdvbmt5IHVybHMuXG4gIGlmICh1dGlsLmlzU3RyaW5nKG9iaikpIG9iaiA9IHVybFBhcnNlKG9iaik7XG4gIGlmICghKG9iaiBpbnN0YW5jZW9mIFVybCkpIHJldHVybiBVcmwucHJvdG90eXBlLmZvcm1hdC5jYWxsKG9iaik7XG4gIHJldHVybiBvYmouZm9ybWF0KCk7XG59XG5cblVybC5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBhdXRoID0gdGhpcy5hdXRoIHx8ICcnO1xuICBpZiAoYXV0aCkge1xuICAgIGF1dGggPSBlbmNvZGVVUklDb21wb25lbnQoYXV0aCk7XG4gICAgYXV0aCA9IGF1dGgucmVwbGFjZSgvJTNBL2ksICc6Jyk7XG4gICAgYXV0aCArPSAnQCc7XG4gIH1cblxuICB2YXIgcHJvdG9jb2wgPSB0aGlzLnByb3RvY29sIHx8ICcnLFxuICAgICAgcGF0aG5hbWUgPSB0aGlzLnBhdGhuYW1lIHx8ICcnLFxuICAgICAgaGFzaCA9IHRoaXMuaGFzaCB8fCAnJyxcbiAgICAgIGhvc3QgPSBmYWxzZSxcbiAgICAgIHF1ZXJ5ID0gJyc7XG5cbiAgaWYgKHRoaXMuaG9zdCkge1xuICAgIGhvc3QgPSBhdXRoICsgdGhpcy5ob3N0O1xuICB9IGVsc2UgaWYgKHRoaXMuaG9zdG5hbWUpIHtcbiAgICBob3N0ID0gYXV0aCArICh0aGlzLmhvc3RuYW1lLmluZGV4T2YoJzonKSA9PT0gLTEgP1xuICAgICAgICB0aGlzLmhvc3RuYW1lIDpcbiAgICAgICAgJ1snICsgdGhpcy5ob3N0bmFtZSArICddJyk7XG4gICAgaWYgKHRoaXMucG9ydCkge1xuICAgICAgaG9zdCArPSAnOicgKyB0aGlzLnBvcnQ7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMucXVlcnkgJiZcbiAgICAgIHV0aWwuaXNPYmplY3QodGhpcy5xdWVyeSkgJiZcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMucXVlcnkpLmxlbmd0aCkge1xuICAgIHF1ZXJ5ID0gcXVlcnlzdHJpbmcuc3RyaW5naWZ5KHRoaXMucXVlcnkpO1xuICB9XG5cbiAgdmFyIHNlYXJjaCA9IHRoaXMuc2VhcmNoIHx8IChxdWVyeSAmJiAoJz8nICsgcXVlcnkpKSB8fCAnJztcblxuICBpZiAocHJvdG9jb2wgJiYgcHJvdG9jb2wuc3Vic3RyKC0xKSAhPT0gJzonKSBwcm90b2NvbCArPSAnOic7XG5cbiAgLy8gb25seSB0aGUgc2xhc2hlZFByb3RvY29scyBnZXQgdGhlIC8vLiAgTm90IG1haWx0bzosIHhtcHA6LCBldGMuXG4gIC8vIHVubGVzcyB0aGV5IGhhZCB0aGVtIHRvIGJlZ2luIHdpdGguXG4gIGlmICh0aGlzLnNsYXNoZXMgfHxcbiAgICAgICghcHJvdG9jb2wgfHwgc2xhc2hlZFByb3RvY29sW3Byb3RvY29sXSkgJiYgaG9zdCAhPT0gZmFsc2UpIHtcbiAgICBob3N0ID0gJy8vJyArIChob3N0IHx8ICcnKTtcbiAgICBpZiAocGF0aG5hbWUgJiYgcGF0aG5hbWUuY2hhckF0KDApICE9PSAnLycpIHBhdGhuYW1lID0gJy8nICsgcGF0aG5hbWU7XG4gIH0gZWxzZSBpZiAoIWhvc3QpIHtcbiAgICBob3N0ID0gJyc7XG4gIH1cblxuICBpZiAoaGFzaCAmJiBoYXNoLmNoYXJBdCgwKSAhPT0gJyMnKSBoYXNoID0gJyMnICsgaGFzaDtcbiAgaWYgKHNlYXJjaCAmJiBzZWFyY2guY2hhckF0KDApICE9PSAnPycpIHNlYXJjaCA9ICc/JyArIHNlYXJjaDtcblxuICBwYXRobmFtZSA9IHBhdGhuYW1lLnJlcGxhY2UoL1s/I10vZywgZnVuY3Rpb24obWF0Y2gpIHtcbiAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KG1hdGNoKTtcbiAgfSk7XG4gIHNlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKCcjJywgJyUyMycpO1xuXG4gIHJldHVybiBwcm90b2NvbCArIGhvc3QgKyBwYXRobmFtZSArIHNlYXJjaCArIGhhc2g7XG59O1xuXG5mdW5jdGlvbiB1cmxSZXNvbHZlKHNvdXJjZSwgcmVsYXRpdmUpIHtcbiAgcmV0dXJuIHVybFBhcnNlKHNvdXJjZSwgZmFsc2UsIHRydWUpLnJlc29sdmUocmVsYXRpdmUpO1xufVxuXG5VcmwucHJvdG90eXBlLnJlc29sdmUgPSBmdW5jdGlvbihyZWxhdGl2ZSkge1xuICByZXR1cm4gdGhpcy5yZXNvbHZlT2JqZWN0KHVybFBhcnNlKHJlbGF0aXZlLCBmYWxzZSwgdHJ1ZSkpLmZvcm1hdCgpO1xufTtcblxuZnVuY3Rpb24gdXJsUmVzb2x2ZU9iamVjdChzb3VyY2UsIHJlbGF0aXZlKSB7XG4gIGlmICghc291cmNlKSByZXR1cm4gcmVsYXRpdmU7XG4gIHJldHVybiB1cmxQYXJzZShzb3VyY2UsIGZhbHNlLCB0cnVlKS5yZXNvbHZlT2JqZWN0KHJlbGF0aXZlKTtcbn1cblxuVXJsLnByb3RvdHlwZS5yZXNvbHZlT2JqZWN0ID0gZnVuY3Rpb24ocmVsYXRpdmUpIHtcbiAgaWYgKHV0aWwuaXNTdHJpbmcocmVsYXRpdmUpKSB7XG4gICAgdmFyIHJlbCA9IG5ldyBVcmwoKTtcbiAgICByZWwucGFyc2UocmVsYXRpdmUsIGZhbHNlLCB0cnVlKTtcbiAgICByZWxhdGl2ZSA9IHJlbDtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSBuZXcgVXJsKCk7XG4gIHZhciB0a2V5cyA9IE9iamVjdC5rZXlzKHRoaXMpO1xuICBmb3IgKHZhciB0ayA9IDA7IHRrIDwgdGtleXMubGVuZ3RoOyB0aysrKSB7XG4gICAgdmFyIHRrZXkgPSB0a2V5c1t0a107XG4gICAgcmVzdWx0W3RrZXldID0gdGhpc1t0a2V5XTtcbiAgfVxuXG4gIC8vIGhhc2ggaXMgYWx3YXlzIG92ZXJyaWRkZW4sIG5vIG1hdHRlciB3aGF0LlxuICAvLyBldmVuIGhyZWY9XCJcIiB3aWxsIHJlbW92ZSBpdC5cbiAgcmVzdWx0Lmhhc2ggPSByZWxhdGl2ZS5oYXNoO1xuXG4gIC8vIGlmIHRoZSByZWxhdGl2ZSB1cmwgaXMgZW1wdHksIHRoZW4gdGhlcmUncyBub3RoaW5nIGxlZnQgdG8gZG8gaGVyZS5cbiAgaWYgKHJlbGF0aXZlLmhyZWYgPT09ICcnKSB7XG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIGhyZWZzIGxpa2UgLy9mb28vYmFyIGFsd2F5cyBjdXQgdG8gdGhlIHByb3RvY29sLlxuICBpZiAocmVsYXRpdmUuc2xhc2hlcyAmJiAhcmVsYXRpdmUucHJvdG9jb2wpIHtcbiAgICAvLyB0YWtlIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBwcm90b2NvbCBmcm9tIHJlbGF0aXZlXG4gICAgdmFyIHJrZXlzID0gT2JqZWN0LmtleXMocmVsYXRpdmUpO1xuICAgIGZvciAodmFyIHJrID0gMDsgcmsgPCBya2V5cy5sZW5ndGg7IHJrKyspIHtcbiAgICAgIHZhciBya2V5ID0gcmtleXNbcmtdO1xuICAgICAgaWYgKHJrZXkgIT09ICdwcm90b2NvbCcpXG4gICAgICAgIHJlc3VsdFtya2V5XSA9IHJlbGF0aXZlW3JrZXldO1xuICAgIH1cblxuICAgIC8vdXJsUGFyc2UgYXBwZW5kcyB0cmFpbGluZyAvIHRvIHVybHMgbGlrZSBodHRwOi8vd3d3LmV4YW1wbGUuY29tXG4gICAgaWYgKHNsYXNoZWRQcm90b2NvbFtyZXN1bHQucHJvdG9jb2xdICYmXG4gICAgICAgIHJlc3VsdC5ob3N0bmFtZSAmJiAhcmVzdWx0LnBhdGhuYW1lKSB7XG4gICAgICByZXN1bHQucGF0aCA9IHJlc3VsdC5wYXRobmFtZSA9ICcvJztcbiAgICB9XG5cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaWYgKHJlbGF0aXZlLnByb3RvY29sICYmIHJlbGF0aXZlLnByb3RvY29sICE9PSByZXN1bHQucHJvdG9jb2wpIHtcbiAgICAvLyBpZiBpdCdzIGEga25vd24gdXJsIHByb3RvY29sLCB0aGVuIGNoYW5naW5nXG4gICAgLy8gdGhlIHByb3RvY29sIGRvZXMgd2VpcmQgdGhpbmdzXG4gICAgLy8gZmlyc3QsIGlmIGl0J3Mgbm90IGZpbGU6LCB0aGVuIHdlIE1VU1QgaGF2ZSBhIGhvc3QsXG4gICAgLy8gYW5kIGlmIHRoZXJlIHdhcyBhIHBhdGhcbiAgICAvLyB0byBiZWdpbiB3aXRoLCB0aGVuIHdlIE1VU1QgaGF2ZSBhIHBhdGguXG4gICAgLy8gaWYgaXQgaXMgZmlsZTosIHRoZW4gdGhlIGhvc3QgaXMgZHJvcHBlZCxcbiAgICAvLyBiZWNhdXNlIHRoYXQncyBrbm93biB0byBiZSBob3N0bGVzcy5cbiAgICAvLyBhbnl0aGluZyBlbHNlIGlzIGFzc3VtZWQgdG8gYmUgYWJzb2x1dGUuXG4gICAgaWYgKCFzbGFzaGVkUHJvdG9jb2xbcmVsYXRpdmUucHJvdG9jb2xdKSB7XG4gICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHJlbGF0aXZlKTtcbiAgICAgIGZvciAodmFyIHYgPSAwOyB2IDwga2V5cy5sZW5ndGg7IHYrKykge1xuICAgICAgICB2YXIgayA9IGtleXNbdl07XG4gICAgICAgIHJlc3VsdFtrXSA9IHJlbGF0aXZlW2tdO1xuICAgICAgfVxuICAgICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJlc3VsdC5wcm90b2NvbCA9IHJlbGF0aXZlLnByb3RvY29sO1xuICAgIGlmICghcmVsYXRpdmUuaG9zdCAmJiAhaG9zdGxlc3NQcm90b2NvbFtyZWxhdGl2ZS5wcm90b2NvbF0pIHtcbiAgICAgIHZhciByZWxQYXRoID0gKHJlbGF0aXZlLnBhdGhuYW1lIHx8ICcnKS5zcGxpdCgnLycpO1xuICAgICAgd2hpbGUgKHJlbFBhdGgubGVuZ3RoICYmICEocmVsYXRpdmUuaG9zdCA9IHJlbFBhdGguc2hpZnQoKSkpO1xuICAgICAgaWYgKCFyZWxhdGl2ZS5ob3N0KSByZWxhdGl2ZS5ob3N0ID0gJyc7XG4gICAgICBpZiAoIXJlbGF0aXZlLmhvc3RuYW1lKSByZWxhdGl2ZS5ob3N0bmFtZSA9ICcnO1xuICAgICAgaWYgKHJlbFBhdGhbMF0gIT09ICcnKSByZWxQYXRoLnVuc2hpZnQoJycpO1xuICAgICAgaWYgKHJlbFBhdGgubGVuZ3RoIDwgMikgcmVsUGF0aC51bnNoaWZ0KCcnKTtcbiAgICAgIHJlc3VsdC5wYXRobmFtZSA9IHJlbFBhdGguam9pbignLycpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucGF0aG5hbWUgPSByZWxhdGl2ZS5wYXRobmFtZTtcbiAgICB9XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICByZXN1bHQuaG9zdCA9IHJlbGF0aXZlLmhvc3QgfHwgJyc7XG4gICAgcmVzdWx0LmF1dGggPSByZWxhdGl2ZS5hdXRoO1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9IHJlbGF0aXZlLmhvc3RuYW1lIHx8IHJlbGF0aXZlLmhvc3Q7XG4gICAgcmVzdWx0LnBvcnQgPSByZWxhdGl2ZS5wb3J0O1xuICAgIC8vIHRvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKHJlc3VsdC5wYXRobmFtZSB8fCByZXN1bHQuc2VhcmNoKSB7XG4gICAgICB2YXIgcCA9IHJlc3VsdC5wYXRobmFtZSB8fCAnJztcbiAgICAgIHZhciBzID0gcmVzdWx0LnNlYXJjaCB8fCAnJztcbiAgICAgIHJlc3VsdC5wYXRoID0gcCArIHM7XG4gICAgfVxuICAgIHJlc3VsdC5zbGFzaGVzID0gcmVzdWx0LnNsYXNoZXMgfHwgcmVsYXRpdmUuc2xhc2hlcztcbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgdmFyIGlzU291cmNlQWJzID0gKHJlc3VsdC5wYXRobmFtZSAmJiByZXN1bHQucGF0aG5hbWUuY2hhckF0KDApID09PSAnLycpLFxuICAgICAgaXNSZWxBYnMgPSAoXG4gICAgICAgICAgcmVsYXRpdmUuaG9zdCB8fFxuICAgICAgICAgIHJlbGF0aXZlLnBhdGhuYW1lICYmIHJlbGF0aXZlLnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nXG4gICAgICApLFxuICAgICAgbXVzdEVuZEFicyA9IChpc1JlbEFicyB8fCBpc1NvdXJjZUFicyB8fFxuICAgICAgICAgICAgICAgICAgICAocmVzdWx0Lmhvc3QgJiYgcmVsYXRpdmUucGF0aG5hbWUpKSxcbiAgICAgIHJlbW92ZUFsbERvdHMgPSBtdXN0RW5kQWJzLFxuICAgICAgc3JjUGF0aCA9IHJlc3VsdC5wYXRobmFtZSAmJiByZXN1bHQucGF0aG5hbWUuc3BsaXQoJy8nKSB8fCBbXSxcbiAgICAgIHJlbFBhdGggPSByZWxhdGl2ZS5wYXRobmFtZSAmJiByZWxhdGl2ZS5wYXRobmFtZS5zcGxpdCgnLycpIHx8IFtdLFxuICAgICAgcHN5Y2hvdGljID0gcmVzdWx0LnByb3RvY29sICYmICFzbGFzaGVkUHJvdG9jb2xbcmVzdWx0LnByb3RvY29sXTtcblxuICAvLyBpZiB0aGUgdXJsIGlzIGEgbm9uLXNsYXNoZWQgdXJsLCB0aGVuIHJlbGF0aXZlXG4gIC8vIGxpbmtzIGxpa2UgLi4vLi4gc2hvdWxkIGJlIGFibGVcbiAgLy8gdG8gY3Jhd2wgdXAgdG8gdGhlIGhvc3RuYW1lLCBhcyB3ZWxsLiAgVGhpcyBpcyBzdHJhbmdlLlxuICAvLyByZXN1bHQucHJvdG9jb2wgaGFzIGFscmVhZHkgYmVlbiBzZXQgYnkgbm93LlxuICAvLyBMYXRlciBvbiwgcHV0IHRoZSBmaXJzdCBwYXRoIHBhcnQgaW50byB0aGUgaG9zdCBmaWVsZC5cbiAgaWYgKHBzeWNob3RpYykge1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9ICcnO1xuICAgIHJlc3VsdC5wb3J0ID0gbnVsbDtcbiAgICBpZiAocmVzdWx0Lmhvc3QpIHtcbiAgICAgIGlmIChzcmNQYXRoWzBdID09PSAnJykgc3JjUGF0aFswXSA9IHJlc3VsdC5ob3N0O1xuICAgICAgZWxzZSBzcmNQYXRoLnVuc2hpZnQocmVzdWx0Lmhvc3QpO1xuICAgIH1cbiAgICByZXN1bHQuaG9zdCA9ICcnO1xuICAgIGlmIChyZWxhdGl2ZS5wcm90b2NvbCkge1xuICAgICAgcmVsYXRpdmUuaG9zdG5hbWUgPSBudWxsO1xuICAgICAgcmVsYXRpdmUucG9ydCA9IG51bGw7XG4gICAgICBpZiAocmVsYXRpdmUuaG9zdCkge1xuICAgICAgICBpZiAocmVsUGF0aFswXSA9PT0gJycpIHJlbFBhdGhbMF0gPSByZWxhdGl2ZS5ob3N0O1xuICAgICAgICBlbHNlIHJlbFBhdGgudW5zaGlmdChyZWxhdGl2ZS5ob3N0KTtcbiAgICAgIH1cbiAgICAgIHJlbGF0aXZlLmhvc3QgPSBudWxsO1xuICAgIH1cbiAgICBtdXN0RW5kQWJzID0gbXVzdEVuZEFicyAmJiAocmVsUGF0aFswXSA9PT0gJycgfHwgc3JjUGF0aFswXSA9PT0gJycpO1xuICB9XG5cbiAgaWYgKGlzUmVsQWJzKSB7XG4gICAgLy8gaXQncyBhYnNvbHV0ZS5cbiAgICByZXN1bHQuaG9zdCA9IChyZWxhdGl2ZS5ob3N0IHx8IHJlbGF0aXZlLmhvc3QgPT09ICcnKSA/XG4gICAgICAgICAgICAgICAgICByZWxhdGl2ZS5ob3N0IDogcmVzdWx0Lmhvc3Q7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gKHJlbGF0aXZlLmhvc3RuYW1lIHx8IHJlbGF0aXZlLmhvc3RuYW1lID09PSAnJykgP1xuICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlLmhvc3RuYW1lIDogcmVzdWx0Lmhvc3RuYW1lO1xuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gICAgc3JjUGF0aCA9IHJlbFBhdGg7XG4gICAgLy8gZmFsbCB0aHJvdWdoIHRvIHRoZSBkb3QtaGFuZGxpbmcgYmVsb3cuXG4gIH0gZWxzZSBpZiAocmVsUGF0aC5sZW5ndGgpIHtcbiAgICAvLyBpdCdzIHJlbGF0aXZlXG4gICAgLy8gdGhyb3cgYXdheSB0aGUgZXhpc3RpbmcgZmlsZSwgYW5kIHRha2UgdGhlIG5ldyBwYXRoIGluc3RlYWQuXG4gICAgaWYgKCFzcmNQYXRoKSBzcmNQYXRoID0gW107XG4gICAgc3JjUGF0aC5wb3AoKTtcbiAgICBzcmNQYXRoID0gc3JjUGF0aC5jb25jYXQocmVsUGF0aCk7XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgfSBlbHNlIGlmICghdXRpbC5pc051bGxPclVuZGVmaW5lZChyZWxhdGl2ZS5zZWFyY2gpKSB7XG4gICAgLy8ganVzdCBwdWxsIG91dCB0aGUgc2VhcmNoLlxuICAgIC8vIGxpa2UgaHJlZj0nP2ZvbycuXG4gICAgLy8gUHV0IHRoaXMgYWZ0ZXIgdGhlIG90aGVyIHR3byBjYXNlcyBiZWNhdXNlIGl0IHNpbXBsaWZpZXMgdGhlIGJvb2xlYW5zXG4gICAgaWYgKHBzeWNob3RpYykge1xuICAgICAgcmVzdWx0Lmhvc3RuYW1lID0gcmVzdWx0Lmhvc3QgPSBzcmNQYXRoLnNoaWZ0KCk7XG4gICAgICAvL29jY2F0aW9uYWx5IHRoZSBhdXRoIGNhbiBnZXQgc3R1Y2sgb25seSBpbiBob3N0XG4gICAgICAvL3RoaXMgZXNwZWNpYWxseSBoYXBwZW5zIGluIGNhc2VzIGxpa2VcbiAgICAgIC8vdXJsLnJlc29sdmVPYmplY3QoJ21haWx0bzpsb2NhbDFAZG9tYWluMScsICdsb2NhbDJAZG9tYWluMicpXG4gICAgICB2YXIgYXV0aEluSG9zdCA9IHJlc3VsdC5ob3N0ICYmIHJlc3VsdC5ob3N0LmluZGV4T2YoJ0AnKSA+IDAgP1xuICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuaG9zdC5zcGxpdCgnQCcpIDogZmFsc2U7XG4gICAgICBpZiAoYXV0aEluSG9zdCkge1xuICAgICAgICByZXN1bHQuYXV0aCA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICAgICAgcmVzdWx0Lmhvc3QgPSByZXN1bHQuaG9zdG5hbWUgPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gICAgLy90byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICAgIGlmICghdXRpbC5pc051bGwocmVzdWx0LnBhdGhuYW1lKSB8fCAhdXRpbC5pc051bGwocmVzdWx0LnNlYXJjaCkpIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gKHJlc3VsdC5wYXRobmFtZSA/IHJlc3VsdC5wYXRobmFtZSA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAgIChyZXN1bHQuc2VhcmNoID8gcmVzdWx0LnNlYXJjaCA6ICcnKTtcbiAgICB9XG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmICghc3JjUGF0aC5sZW5ndGgpIHtcbiAgICAvLyBubyBwYXRoIGF0IGFsbC4gIGVhc3kuXG4gICAgLy8gd2UndmUgYWxyZWFkeSBoYW5kbGVkIHRoZSBvdGhlciBzdHVmZiBhYm92ZS5cbiAgICByZXN1bHQucGF0aG5hbWUgPSBudWxsO1xuICAgIC8vdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgICBpZiAocmVzdWx0LnNlYXJjaCkge1xuICAgICAgcmVzdWx0LnBhdGggPSAnLycgKyByZXN1bHQuc2VhcmNoO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucGF0aCA9IG51bGw7XG4gICAgfVxuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBpZiBhIHVybCBFTkRzIGluIC4gb3IgLi4sIHRoZW4gaXQgbXVzdCBnZXQgYSB0cmFpbGluZyBzbGFzaC5cbiAgLy8gaG93ZXZlciwgaWYgaXQgZW5kcyBpbiBhbnl0aGluZyBlbHNlIG5vbi1zbGFzaHksXG4gIC8vIHRoZW4gaXQgbXVzdCBOT1QgZ2V0IGEgdHJhaWxpbmcgc2xhc2guXG4gIHZhciBsYXN0ID0gc3JjUGF0aC5zbGljZSgtMSlbMF07XG4gIHZhciBoYXNUcmFpbGluZ1NsYXNoID0gKFxuICAgICAgKHJlc3VsdC5ob3N0IHx8IHJlbGF0aXZlLmhvc3QgfHwgc3JjUGF0aC5sZW5ndGggPiAxKSAmJlxuICAgICAgKGxhc3QgPT09ICcuJyB8fCBsYXN0ID09PSAnLi4nKSB8fCBsYXN0ID09PSAnJyk7XG5cbiAgLy8gc3RyaXAgc2luZ2xlIGRvdHMsIHJlc29sdmUgZG91YmxlIGRvdHMgdG8gcGFyZW50IGRpclxuICAvLyBpZiB0aGUgcGF0aCB0cmllcyB0byBnbyBhYm92ZSB0aGUgcm9vdCwgYHVwYCBlbmRzIHVwID4gMFxuICB2YXIgdXAgPSAwO1xuICBmb3IgKHZhciBpID0gc3JjUGF0aC5sZW5ndGg7IGkgPj0gMDsgaS0tKSB7XG4gICAgbGFzdCA9IHNyY1BhdGhbaV07XG4gICAgaWYgKGxhc3QgPT09ICcuJykge1xuICAgICAgc3JjUGF0aC5zcGxpY2UoaSwgMSk7XG4gICAgfSBlbHNlIGlmIChsYXN0ID09PSAnLi4nKSB7XG4gICAgICBzcmNQYXRoLnNwbGljZShpLCAxKTtcbiAgICAgIHVwKys7XG4gICAgfSBlbHNlIGlmICh1cCkge1xuICAgICAgc3JjUGF0aC5zcGxpY2UoaSwgMSk7XG4gICAgICB1cC0tO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBwYXRoIGlzIGFsbG93ZWQgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIHJlc3RvcmUgbGVhZGluZyAuLnNcbiAgaWYgKCFtdXN0RW5kQWJzICYmICFyZW1vdmVBbGxEb3RzKSB7XG4gICAgZm9yICg7IHVwLS07IHVwKSB7XG4gICAgICBzcmNQYXRoLnVuc2hpZnQoJy4uJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG11c3RFbmRBYnMgJiYgc3JjUGF0aFswXSAhPT0gJycgJiZcbiAgICAgICghc3JjUGF0aFswXSB8fCBzcmNQYXRoWzBdLmNoYXJBdCgwKSAhPT0gJy8nKSkge1xuICAgIHNyY1BhdGgudW5zaGlmdCgnJyk7XG4gIH1cblxuICBpZiAoaGFzVHJhaWxpbmdTbGFzaCAmJiAoc3JjUGF0aC5qb2luKCcvJykuc3Vic3RyKC0xKSAhPT0gJy8nKSkge1xuICAgIHNyY1BhdGgucHVzaCgnJyk7XG4gIH1cblxuICB2YXIgaXNBYnNvbHV0ZSA9IHNyY1BhdGhbMF0gPT09ICcnIHx8XG4gICAgICAoc3JjUGF0aFswXSAmJiBzcmNQYXRoWzBdLmNoYXJBdCgwKSA9PT0gJy8nKTtcblxuICAvLyBwdXQgdGhlIGhvc3QgYmFja1xuICBpZiAocHN5Y2hvdGljKSB7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gcmVzdWx0Lmhvc3QgPSBpc0Fic29sdXRlID8gJycgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUGF0aC5sZW5ndGggPyBzcmNQYXRoLnNoaWZ0KCkgOiAnJztcbiAgICAvL29jY2F0aW9uYWx5IHRoZSBhdXRoIGNhbiBnZXQgc3R1Y2sgb25seSBpbiBob3N0XG4gICAgLy90aGlzIGVzcGVjaWFsbHkgaGFwcGVucyBpbiBjYXNlcyBsaWtlXG4gICAgLy91cmwucmVzb2x2ZU9iamVjdCgnbWFpbHRvOmxvY2FsMUBkb21haW4xJywgJ2xvY2FsMkBkb21haW4yJylcbiAgICB2YXIgYXV0aEluSG9zdCA9IHJlc3VsdC5ob3N0ICYmIHJlc3VsdC5ob3N0LmluZGV4T2YoJ0AnKSA+IDAgP1xuICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhvc3Quc3BsaXQoJ0AnKSA6IGZhbHNlO1xuICAgIGlmIChhdXRoSW5Ib3N0KSB7XG4gICAgICByZXN1bHQuYXV0aCA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICAgIHJlc3VsdC5ob3N0ID0gcmVzdWx0Lmhvc3RuYW1lID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgIH1cbiAgfVxuXG4gIG11c3RFbmRBYnMgPSBtdXN0RW5kQWJzIHx8IChyZXN1bHQuaG9zdCAmJiBzcmNQYXRoLmxlbmd0aCk7XG5cbiAgaWYgKG11c3RFbmRBYnMgJiYgIWlzQWJzb2x1dGUpIHtcbiAgICBzcmNQYXRoLnVuc2hpZnQoJycpO1xuICB9XG5cbiAgaWYgKCFzcmNQYXRoLmxlbmd0aCkge1xuICAgIHJlc3VsdC5wYXRobmFtZSA9IG51bGw7XG4gICAgcmVzdWx0LnBhdGggPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdC5wYXRobmFtZSA9IHNyY1BhdGguam9pbignLycpO1xuICB9XG5cbiAgLy90byBzdXBwb3J0IHJlcXVlc3QuaHR0cFxuICBpZiAoIXV0aWwuaXNOdWxsKHJlc3VsdC5wYXRobmFtZSkgfHwgIXV0aWwuaXNOdWxsKHJlc3VsdC5zZWFyY2gpKSB7XG4gICAgcmVzdWx0LnBhdGggPSAocmVzdWx0LnBhdGhuYW1lID8gcmVzdWx0LnBhdGhuYW1lIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChyZXN1bHQuc2VhcmNoID8gcmVzdWx0LnNlYXJjaCA6ICcnKTtcbiAgfVxuICByZXN1bHQuYXV0aCA9IHJlbGF0aXZlLmF1dGggfHwgcmVzdWx0LmF1dGg7XG4gIHJlc3VsdC5zbGFzaGVzID0gcmVzdWx0LnNsYXNoZXMgfHwgcmVsYXRpdmUuc2xhc2hlcztcbiAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5VcmwucHJvdG90eXBlLnBhcnNlSG9zdCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaG9zdCA9IHRoaXMuaG9zdDtcbiAgdmFyIHBvcnQgPSBwb3J0UGF0dGVybi5leGVjKGhvc3QpO1xuICBpZiAocG9ydCkge1xuICAgIHBvcnQgPSBwb3J0WzBdO1xuICAgIGlmIChwb3J0ICE9PSAnOicpIHtcbiAgICAgIHRoaXMucG9ydCA9IHBvcnQuc3Vic3RyKDEpO1xuICAgIH1cbiAgICBob3N0ID0gaG9zdC5zdWJzdHIoMCwgaG9zdC5sZW5ndGggLSBwb3J0Lmxlbmd0aCk7XG4gIH1cbiAgaWYgKGhvc3QpIHRoaXMuaG9zdG5hbWUgPSBob3N0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/url/url.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/url/util.js":
+/*!**********************************!*\
+ !*** ./node_modules/url/util.js ***!
+ \**********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nmodule.exports = {\n isString: function(arg) {\n return typeof(arg) === 'string';\n },\n isObject: function(arg) {\n return typeof(arg) === 'object' && arg !== null;\n },\n isNull: function(arg) {\n return arg === null;\n },\n isNullOrUndefined: function(arg) {\n return arg == null;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvdXJsL3V0aWwuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy91cmwvdXRpbC5qcz8zNWU4Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzU3RyaW5nOiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gdHlwZW9mKGFyZykgPT09ICdzdHJpbmcnO1xuICB9LFxuICBpc09iamVjdDogZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHR5cGVvZihhcmcpID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG4gIH0sXG4gIGlzTnVsbDogZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbiAgfSxcbiAgaXNOdWxsT3JVbmRlZmluZWQ6IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBhcmcgPT0gbnVsbDtcbiAgfVxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/url/util.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/util-deprecate/browser.js":
+/*!************************************************!*\
+ !*** ./node_modules/util-deprecate/browser.js ***!
+ \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/* WEBPACK VAR INJECTION */(function(global) {\n/**\n * Module exports.\n */\n\nmodule.exports = deprecate;\n\n/**\n * Mark that a method should not be used.\n * Returns a modified function which warns once by default.\n *\n * If `localStorage.noDeprecation = true` is set, then it is a no-op.\n *\n * If `localStorage.throwDeprecation = true` is set, then deprecated functions\n * will throw an Error when invoked.\n *\n * If `localStorage.traceDeprecation = true` is set, then deprecated functions\n * will invoke `console.trace()` instead of `console.error()`.\n *\n * @param {Function} fn - the function to deprecate\n * @param {String} msg - the string to print to the console when `fn` is invoked\n * @returns {Function} a new \"deprecated\" version of `fn`\n * @api public\n */\n\nfunction deprecate (fn, msg) {\n if (config('noDeprecation')) {\n return fn;\n }\n\n var warned = false;\n function deprecated() {\n if (!warned) {\n if (config('throwDeprecation')) {\n throw new Error(msg);\n } else if (config('traceDeprecation')) {\n console.trace(msg);\n } else {\n console.warn(msg);\n }\n warned = true;\n }\n return fn.apply(this, arguments);\n }\n\n return deprecated;\n}\n\n/**\n * Checks `localStorage` for boolean values for the given `name`.\n *\n * @param {String} name\n * @returns {Boolean}\n * @api private\n */\n\nfunction config (name) {\n // accessing global.localStorage can trigger a DOMException in sandboxed iframes\n try {\n if (!global.localStorage) return false;\n } catch (_) {\n return false;\n }\n var val = global.localStorage[name];\n if (null == val) return false;\n return String(val).toLowerCase() === 'true';\n}\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvdXRpbC1kZXByZWNhdGUvYnJvd3Nlci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL3V0aWwtZGVwcmVjYXRlL2Jyb3dzZXIuanM/YjdkMSJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBkZXByZWNhdGU7XG5cbi8qKlxuICogTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbiAqIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS5ub0RlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS50aHJvd0RlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGRlcHJlY2F0ZWQgZnVuY3Rpb25zXG4gKiB3aWxsIHRocm93IGFuIEVycm9yIHdoZW4gaW52b2tlZC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLnRyYWNlRGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gZGVwcmVjYXRlZCBmdW5jdGlvbnNcbiAqIHdpbGwgaW52b2tlIGBjb25zb2xlLnRyYWNlKClgIGluc3RlYWQgb2YgYGNvbnNvbGUuZXJyb3IoKWAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSB0aGUgZnVuY3Rpb24gdG8gZGVwcmVjYXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gbXNnIC0gdGhlIHN0cmluZyB0byBwcmludCB0byB0aGUgY29uc29sZSB3aGVuIGBmbmAgaXMgaW52b2tlZFxuICogQHJldHVybnMge0Z1bmN0aW9ufSBhIG5ldyBcImRlcHJlY2F0ZWRcIiB2ZXJzaW9uIG9mIGBmbmBcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZGVwcmVjYXRlIChmbiwgbXNnKSB7XG4gIGlmIChjb25maWcoJ25vRGVwcmVjYXRpb24nKSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKGNvbmZpZygndGhyb3dEZXByZWNhdGlvbicpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChjb25maWcoJ3RyYWNlRGVwcmVjYXRpb24nKSkge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4obXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGBsb2NhbFN0b3JhZ2VgIGZvciBib29sZWFuIHZhbHVlcyBmb3IgdGhlIGdpdmVuIGBuYW1lYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb25maWcgKG5hbWUpIHtcbiAgLy8gYWNjZXNzaW5nIGdsb2JhbC5sb2NhbFN0b3JhZ2UgY2FuIHRyaWdnZXIgYSBET01FeGNlcHRpb24gaW4gc2FuZGJveGVkIGlmcmFtZXNcbiAgdHJ5IHtcbiAgICBpZiAoIWdsb2JhbC5sb2NhbFN0b3JhZ2UpIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdmFsID0gZ2xvYmFsLmxvY2FsU3RvcmFnZVtuYW1lXTtcbiAgaWYgKG51bGwgPT0gdmFsKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBTdHJpbmcodmFsKS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/util-deprecate/browser.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/vpnrpc/dist/vpnrpc.js":
+/*!********************************************!*\
+ !*** ./node_modules/vpnrpc/dist/vpnrpc.js ***!
+ \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("/* WEBPACK VAR INJECTION */(function(Buffer) {\r\n// SoftEther VPN Server JSON-RPC Stub code for TypeScript\r\n// \r\n// vpnrpc.ts\r\n// Automatically generated at 2019-05-29 18:21:39 by vpnserver-jsonrpc-codegen\r\n//\r\n// Licensed under the Apache License 2.0\r\n// Copyright (c) 2014-2019 SoftEther VPN Project\r\nvar __extends = (this && this.__extends) || (function () {\r\n var extendStatics = function (d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n };\r\n return function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n})();\r\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nvar __generator = (this && this.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\nexports.__esModule = true;\r\n// Trivial utility codes\r\nvar is_node_js = (typeof navigator === \"undefined\") || navigator.userAgent.indexOf(\"Node.js\") !== -1 || navigator.userAgent.indexOf(\"jsdom\") !== -1;\r\nfunction is_null(obj) {\r\n return (typeof obj === \"undefined\") || (obj === null);\r\n}\r\nvar debug_mode = false;\r\n/** VPN Server RPC Stubs */\r\nvar VpnServerRpc = /** @class */ (function () {\r\n /**\r\n * Constructor of the VpnServerRpc class\r\n * @param vpnserver_hostname The hostname or IP address of the destination VPN Server. In the web browser you can specify null if you want to connect to the server itself.\r\n * @param vpnserver_port The port number of the destination VPN Server. In the web browser you can specify null if you want to connect to the server itself.\r\n * @param hubname The name of the Virtual Hub if you want to connect to the VPN Server as a Virtual Hub Admin Mode. Specify null if you want to connect to the VPN Server as the Entire VPN Server Admin Mode.\r\n * @param password Specify the administration password. This value is valid only if vpnserver_hostname is sepcified.\r\n * @param nodejs_https_client_reject_untrusted_server_cert In Node.js set this true to check the SSL server certificate on the destination VPN Server. Set this false to ignore the SSL server certification.\r\n */\r\n function VpnServerRpc(vpnserver_hostname, vpnserver_port, hubname, password, nodejs_https_client_reject_untrusted_server_cert) {\r\n var _this = this;\r\n // --- Stubs ---\r\n /** 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. */\r\n this.Test = function (in_param) {\r\n return _this.CallAsync(\"Test\", in_param);\r\n };\r\n /** 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. */\r\n this.GetServerInfo = function () {\r\n return _this.CallAsync(\"GetServerInfo\", new VpnRpcServerInfo());\r\n };\r\n /** 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. */\r\n this.GetServerStatus = function () {\r\n return _this.CallAsync(\"GetServerStatus\", new VpnRpcServerStatus());\r\n };\r\n /** 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. */\r\n this.CreateListener = function (in_param) {\r\n return _this.CallAsync(\"CreateListener\", in_param);\r\n };\r\n /** 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. */\r\n this.EnumListener = function () {\r\n return _this.CallAsync(\"EnumListener\", new VpnRpcListenerList());\r\n };\r\n /** 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. */\r\n this.DeleteListener = function (in_param) {\r\n return _this.CallAsync(\"DeleteListener\", in_param);\r\n };\r\n /** 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. */\r\n this.EnableListener = function (in_param) {\r\n return _this.CallAsync(\"EnableListener\", in_param);\r\n };\r\n /** 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. */\r\n this.SetServerPassword = function (in_param) {\r\n return _this.CallAsync(\"SetServerPassword\", in_param);\r\n };\r\n /** 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. */\r\n this.SetFarmSetting = function (in_param) {\r\n return _this.CallAsync(\"SetFarmSetting\", in_param);\r\n };\r\n /** 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. */\r\n this.GetFarmSetting = function () {\r\n return _this.CallAsync(\"GetFarmSetting\", new VpnRpcFarm());\r\n };\r\n /** 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. */\r\n this.GetFarmInfo = function (in_param) {\r\n return _this.CallAsync(\"GetFarmInfo\", in_param);\r\n };\r\n /** 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. */\r\n this.EnumFarmMember = function () {\r\n return _this.CallAsync(\"EnumFarmMember\", new VpnRpcEnumFarm());\r\n };\r\n /** 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. */\r\n this.GetFarmConnectionStatus = function () {\r\n return _this.CallAsync(\"GetFarmConnectionStatus\", new VpnRpcFarmConnectionStatus());\r\n };\r\n /** 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. */\r\n this.SetServerCert = function (in_param) {\r\n return _this.CallAsync(\"SetServerCert\", in_param);\r\n };\r\n /** 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. */\r\n this.GetServerCert = function () {\r\n return _this.CallAsync(\"GetServerCert\", new VpnRpcKeyPair());\r\n };\r\n /** 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. */\r\n this.GetServerCipher = function () {\r\n return _this.CallAsync(\"GetServerCipher\", new VpnRpcStr());\r\n };\r\n /** 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. */\r\n this.SetServerCipher = function (in_param) {\r\n return _this.CallAsync(\"SetServerCipher\", in_param);\r\n };\r\n /** 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. */\r\n this.CreateHub = function (in_param) {\r\n return _this.CallAsync(\"CreateHub\", in_param);\r\n };\r\n /** 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. */\r\n this.SetHub = function (in_param) {\r\n return _this.CallAsync(\"SetHub\", in_param);\r\n };\r\n /** 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. */\r\n this.GetHub = function (in_param) {\r\n return _this.CallAsync(\"GetHub\", in_param);\r\n };\r\n /** 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. */\r\n this.EnumHub = function () {\r\n return _this.CallAsync(\"EnumHub\", new VpnRpcEnumHub());\r\n };\r\n /** 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. */\r\n this.DeleteHub = function (in_param) {\r\n return _this.CallAsync(\"DeleteHub\", in_param);\r\n };\r\n /** 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. */\r\n this.GetHubRadius = function (in_param) {\r\n return _this.CallAsync(\"GetHubRadius\", in_param);\r\n };\r\n /** 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. */\r\n this.SetHubRadius = function (in_param) {\r\n return _this.CallAsync(\"SetHubRadius\", in_param);\r\n };\r\n /** 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. */\r\n this.EnumConnection = function () {\r\n return _this.CallAsync(\"EnumConnection\", new VpnRpcEnumConnection());\r\n };\r\n /** 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. */\r\n this.DisconnectConnection = function (in_param) {\r\n return _this.CallAsync(\"DisconnectConnection\", in_param);\r\n };\r\n /** 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. */\r\n this.GetConnectionInfo = function (in_param) {\r\n return _this.CallAsync(\"GetConnectionInfo\", in_param);\r\n };\r\n /** 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. */\r\n this.SetHubOnline = function (in_param) {\r\n return _this.CallAsync(\"SetHubOnline\", in_param);\r\n };\r\n /** 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. */\r\n this.GetHubStatus = function (in_param) {\r\n return _this.CallAsync(\"GetHubStatus\", in_param);\r\n };\r\n /** 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. */\r\n this.SetHubLog = function (in_param) {\r\n return _this.CallAsync(\"SetHubLog\", in_param);\r\n };\r\n /** 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. */\r\n this.GetHubLog = function (in_param) {\r\n return _this.CallAsync(\"GetHubLog\", in_param);\r\n };\r\n /** 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. */\r\n this.AddCa = function (in_param) {\r\n return _this.CallAsync(\"AddCa\", in_param);\r\n };\r\n /** 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. */\r\n this.EnumCa = function (in_param) {\r\n return _this.CallAsync(\"EnumCa\", in_param);\r\n };\r\n /** 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. */\r\n this.GetCa = function (in_param) {\r\n return _this.CallAsync(\"GetCa\", in_param);\r\n };\r\n /** 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. */\r\n this.DeleteCa = function (in_param) {\r\n return _this.CallAsync(\"DeleteCa\", in_param);\r\n };\r\n /** 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 \"Link\". [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. */\r\n this.CreateLink = function (in_param) {\r\n return _this.CallAsync(\"CreateLink\", in_param);\r\n };\r\n /** 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 \"Link\" after creating the Cascade Connection. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */\r\n this.GetLink = function (in_param) {\r\n return _this.CallAsync(\"GetLink\", in_param);\r\n };\r\n /** Change Existing Cascade Connection. Use this to alter the setting of an existing Cascade Connection on the currently managed Virtual Hub. */\r\n this.SetLink = function (in_param) {\r\n return _this.CallAsync(\"SetLink\", in_param);\r\n };\r\n /** 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. */\r\n this.EnumLink = function (in_param) {\r\n return _this.CallAsync(\"EnumLink\", in_param);\r\n };\r\n /** 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. */\r\n this.SetLinkOnline = function (in_param) {\r\n return _this.CallAsync(\"SetLinkOnline\", in_param);\r\n };\r\n /** 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. */\r\n this.SetLinkOffline = function (in_param) {\r\n return _this.CallAsync(\"SetLinkOffline\", in_param);\r\n };\r\n /** 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. */\r\n this.DeleteLink = function (in_param) {\r\n return _this.CallAsync(\"DeleteLink\", in_param);\r\n };\r\n /** 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. */\r\n this.RenameLink = function (in_param) {\r\n return _this.CallAsync(\"RenameLink\", in_param);\r\n };\r\n /** 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. */\r\n this.GetLinkStatus = function (in_param) {\r\n return _this.CallAsync(\"GetLinkStatus\", in_param);\r\n };\r\n /** 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. */\r\n this.AddAccess = function (in_param) {\r\n return _this.CallAsync(\"AddAccess\", in_param);\r\n };\r\n /** 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. */\r\n this.DeleteAccess = function (in_param) {\r\n return _this.CallAsync(\"DeleteAccess\", in_param);\r\n };\r\n /** 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. */\r\n this.EnumAccess = function (in_param) {\r\n return _this.CallAsync(\"EnumAccess\", in_param);\r\n };\r\n /** 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. */\r\n this.SetAccessList = function (in_param) {\r\n return _this.CallAsync(\"SetAccessList\", in_param);\r\n };\r\n /** 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 \"*\" (a single asterisk character) will automatically be registered as a RADIUS authentication user. For cases where there are users with \"*\" 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 \"*\". 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. */\r\n this.CreateUser = function (in_param) {\r\n return _this.CallAsync(\"CreateUser\", in_param);\r\n };\r\n /** 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. */\r\n this.SetUser = function (in_param) {\r\n return _this.CallAsync(\"SetUser\", in_param);\r\n };\r\n /** 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. */\r\n this.GetUser = function (in_param) {\r\n return _this.CallAsync(\"GetUser\", in_param);\r\n };\r\n /** 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. */\r\n this.DeleteUser = function (in_param) {\r\n return _this.CallAsync(\"DeleteUser\", in_param);\r\n };\r\n /** 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. */\r\n this.EnumUser = function (in_param) {\r\n return _this.CallAsync(\"EnumUser\", in_param);\r\n };\r\n /** 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. */\r\n this.CreateGroup = function (in_param) {\r\n return _this.CallAsync(\"CreateGroup\", in_param);\r\n };\r\n /** 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. */\r\n this.SetGroup = function (in_param) {\r\n return _this.CallAsync(\"SetGroup\", in_param);\r\n };\r\n /** 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. */\r\n this.GetGroup = function (in_param) {\r\n return _this.CallAsync(\"GetGroup\", in_param);\r\n };\r\n /** 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. */\r\n this.DeleteGroup = function (in_param) {\r\n return _this.CallAsync(\"DeleteGroup\", in_param);\r\n };\r\n /** 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. */\r\n this.EnumGroup = function (in_param) {\r\n return _this.CallAsync(\"EnumGroup\", in_param);\r\n };\r\n /** 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. */\r\n this.EnumSession = function (in_param) {\r\n return _this.CallAsync(\"EnumSession\", in_param);\r\n };\r\n /** 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. */\r\n this.GetSessionStatus = function (in_param) {\r\n return _this.CallAsync(\"GetSessionStatus\", in_param);\r\n };\r\n /** 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. */\r\n this.DeleteSession = function (in_param) {\r\n return _this.CallAsync(\"DeleteSession\", in_param);\r\n };\r\n /** 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. */\r\n this.EnumMacTable = function (in_param) {\r\n return _this.CallAsync(\"EnumMacTable\", in_param);\r\n };\r\n /** 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. */\r\n this.DeleteMacTable = function (in_param) {\r\n return _this.CallAsync(\"DeleteMacTable\", in_param);\r\n };\r\n /** 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. */\r\n this.EnumIpTable = function (in_param) {\r\n return _this.CallAsync(\"EnumIpTable\", in_param);\r\n };\r\n /** 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. */\r\n this.DeleteIpTable = function (in_param) {\r\n return _this.CallAsync(\"DeleteIpTable\", in_param);\r\n };\r\n /** 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. */\r\n this.SetKeep = function (in_param) {\r\n return _this.CallAsync(\"SetKeep\", in_param);\r\n };\r\n /** 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. */\r\n this.GetKeep = function (in_param) {\r\n return _this.CallAsync(\"GetKeep\", in_param);\r\n };\r\n /** 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. */\r\n this.EnableSecureNAT = function (in_param) {\r\n return _this.CallAsync(\"EnableSecureNAT\", in_param);\r\n };\r\n /** 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. */\r\n this.DisableSecureNAT = function (in_param) {\r\n return _this.CallAsync(\"DisableSecureNAT\", in_param);\r\n };\r\n /** 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. */\r\n this.SetSecureNATOption = function (in_param) {\r\n return _this.CallAsync(\"SetSecureNATOption\", in_param);\r\n };\r\n /** Get Settings of SecureNAT Function. This API get the registered settings for the SecureNAT function which is set by the SetSecureNATOption API. */\r\n this.GetSecureNATOption = function (in_param) {\r\n return _this.CallAsync(\"GetSecureNATOption\", in_param);\r\n };\r\n /** 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. */\r\n this.EnumNAT = function (in_param) {\r\n return _this.CallAsync(\"EnumNAT\", in_param);\r\n };\r\n /** 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. */\r\n this.EnumDHCP = function (in_param) {\r\n return _this.CallAsync(\"EnumDHCP\", in_param);\r\n };\r\n /** 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. */\r\n this.GetSecureNATStatus = function (in_param) {\r\n return _this.CallAsync(\"GetSecureNATStatus\", in_param);\r\n };\r\n /** 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. */\r\n this.EnumEthernet = function () {\r\n return _this.CallAsync(\"EnumEthernet\", new VpnRpcEnumEth());\r\n };\r\n /** 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. */\r\n this.AddLocalBridge = function (in_param) {\r\n return _this.CallAsync(\"AddLocalBridge\", in_param);\r\n };\r\n /** 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. */\r\n this.DeleteLocalBridge = function (in_param) {\r\n return _this.CallAsync(\"DeleteLocalBridge\", in_param);\r\n };\r\n /** 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. */\r\n this.EnumLocalBridge = function () {\r\n return _this.CallAsync(\"EnumLocalBridge\", new VpnRpcEnumLocalBridge());\r\n };\r\n /** Get whether the localbridge function is supported on the current system. */\r\n this.GetBridgeSupport = function () {\r\n return _this.CallAsync(\"GetBridgeSupport\", new VpnRpcBridgeSupport());\r\n };\r\n /** 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 \"IntValue\" parameter to \"1\", 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. */\r\n this.RebootServer = function (in_param) {\r\n return _this.CallAsync(\"RebootServer\", in_param);\r\n };\r\n /** 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. */\r\n this.GetCaps = function () {\r\n return _this.CallAsync(\"GetCaps\", new VpnCapslist());\r\n };\r\n /** 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. */\r\n this.GetConfig = function () {\r\n return _this.CallAsync(\"GetConfig\", new VpnRpcConfig());\r\n };\r\n /** 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. */\r\n this.SetConfig = function (in_param) {\r\n return _this.CallAsync(\"SetConfig\", in_param);\r\n };\r\n /** Get Virtual Hub Administration Option default values. */\r\n this.GetDefaultHubAdminOptions = function (in_param) {\r\n return _this.CallAsync(\"GetDefaultHubAdminOptions\", in_param);\r\n };\r\n /** 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 \"1\", 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. */\r\n this.GetHubAdminOptions = function (in_param) {\r\n return _this.CallAsync(\"GetHubAdminOptions\", in_param);\r\n };\r\n /** 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 \"1\", 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. */\r\n this.SetHubAdminOptions = function (in_param) {\r\n return _this.CallAsync(\"SetHubAdminOptions\", in_param);\r\n };\r\n /** 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. */\r\n this.GetHubExtOptions = function (in_param) {\r\n return _this.CallAsync(\"GetHubExtOptions\", in_param);\r\n };\r\n /** 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. */\r\n this.SetHubExtOptions = function (in_param) {\r\n return _this.CallAsync(\"SetHubExtOptions\", in_param);\r\n };\r\n /** 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. */\r\n this.AddL3Switch = function (in_param) {\r\n return _this.CallAsync(\"AddL3Switch\", in_param);\r\n };\r\n /** 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. */\r\n this.DelL3Switch = function (in_param) {\r\n return _this.CallAsync(\"DelL3Switch\", in_param);\r\n };\r\n /** 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. */\r\n this.EnumL3Switch = function () {\r\n return _this.CallAsync(\"EnumL3Switch\", new VpnRpcEnumL3Sw());\r\n };\r\n /** 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. */\r\n this.StartL3Switch = function (in_param) {\r\n return _this.CallAsync(\"StartL3Switch\", in_param);\r\n };\r\n /** 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. */\r\n this.StopL3Switch = function (in_param) {\r\n return _this.CallAsync(\"StopL3Switch\", in_param);\r\n };\r\n /** 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. */\r\n this.AddL3If = function (in_param) {\r\n return _this.CallAsync(\"AddL3If\", in_param);\r\n };\r\n /** 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. */\r\n this.DelL3If = function (in_param) {\r\n return _this.CallAsync(\"DelL3If\", in_param);\r\n };\r\n /** 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. */\r\n this.EnumL3If = function (in_param) {\r\n return _this.CallAsync(\"EnumL3If\", in_param);\r\n };\r\n /** 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. */\r\n this.AddL3Table = function (in_param) {\r\n return _this.CallAsync(\"AddL3Table\", in_param);\r\n };\r\n /** 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. */\r\n this.DelL3Table = function (in_param) {\r\n return _this.CallAsync(\"DelL3Table\", in_param);\r\n };\r\n /** 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. */\r\n this.EnumL3Table = function (in_param) {\r\n return _this.CallAsync(\"EnumL3Table\", in_param);\r\n };\r\n /** 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. */\r\n this.EnumCrl = function (in_param) {\r\n return _this.CallAsync(\"EnumCrl\", in_param);\r\n };\r\n /** 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. */\r\n this.AddCrl = function (in_param) {\r\n return _this.CallAsync(\"AddCrl\", in_param);\r\n };\r\n /** 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. */\r\n this.DelCrl = function (in_param) {\r\n return _this.CallAsync(\"DelCrl\", in_param);\r\n };\r\n /** 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. */\r\n this.GetCrl = function (in_param) {\r\n return _this.CallAsync(\"GetCrl\", in_param);\r\n };\r\n /** 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. */\r\n this.SetCrl = function (in_param) {\r\n return _this.CallAsync(\"SetCrl\", in_param);\r\n };\r\n /** 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. */\r\n this.SetAcList = function (in_param) {\r\n return _this.CallAsync(\"SetAcList\", in_param);\r\n };\r\n /** 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. */\r\n this.GetAcList = function (in_param) {\r\n return _this.CallAsync(\"GetAcList\", in_param);\r\n };\r\n /** 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. */\r\n this.EnumLogFile = function () {\r\n return _this.CallAsync(\"EnumLogFile\", new VpnRpcEnumLogFile());\r\n };\r\n /** 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. */\r\n this.ReadLogFile = function (in_param) {\r\n return _this.CallAsync(\"ReadLogFile\", in_param);\r\n };\r\n /** Set syslog Send Function. Use this to set the usage of syslog send function and which syslog server to use. */\r\n this.SetSysLog = function (in_param) {\r\n return _this.CallAsync(\"SetSysLog\", in_param);\r\n };\r\n /** 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. */\r\n this.GetSysLog = function (in_param) {\r\n return _this.CallAsync(\"GetSysLog\", in_param);\r\n };\r\n /** 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. */\r\n this.SetHubMsg = function (in_param) {\r\n return _this.CallAsync(\"SetHubMsg\", in_param);\r\n };\r\n /** 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. */\r\n this.GetHubMsg = function (in_param) {\r\n return _this.CallAsync(\"GetHubMsg\", in_param);\r\n };\r\n /** 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. */\r\n this.Crash = function (in_param) {\r\n return _this.CallAsync(\"Crash\", in_param);\r\n };\r\n /** Get the message for administrators. */\r\n this.GetAdminMsg = function () {\r\n return _this.CallAsync(\"GetAdminMsg\", new VpnRpcMsg());\r\n };\r\n /** Save All Volatile Data of VPN Server / Bridge to the Configuration File. The number of configuration file bytes will be returned as the \"IntValue\" 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. */\r\n this.Flush = function (in_param) {\r\n return _this.CallAsync(\"Flush\", in_param);\r\n };\r\n /** 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. */\r\n this.SetIPsecServices = function (in_param) {\r\n return _this.CallAsync(\"SetIPsecServices\", in_param);\r\n };\r\n /** 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. */\r\n this.GetIPsecServices = function () {\r\n return _this.CallAsync(\"GetIPsecServices\", new VpnIPsecServices());\r\n };\r\n /** 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. */\r\n this.AddEtherIpId = function (in_param) {\r\n return _this.CallAsync(\"AddEtherIpId\", in_param);\r\n };\r\n /** 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. */\r\n this.GetEtherIpId = function (in_param) {\r\n return _this.CallAsync(\"GetEtherIpId\", in_param);\r\n };\r\n /** 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. */\r\n this.DeleteEtherIpId = function (in_param) {\r\n return _this.CallAsync(\"DeleteEtherIpId\", in_param);\r\n };\r\n /** 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. */\r\n this.EnumEtherIpId = function () {\r\n return _this.CallAsync(\"EnumEtherIpId\", new VpnRpcEnumEtherIpId());\r\n };\r\n /** 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. */\r\n this.SetOpenVpnSstpConfig = function (in_param) {\r\n return _this.CallAsync(\"SetOpenVpnSstpConfig\", in_param);\r\n };\r\n /** 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. */\r\n this.GetOpenVpnSstpConfig = function () {\r\n return _this.CallAsync(\"GetOpenVpnSstpConfig\", new VpnOpenVpnSstpConfig());\r\n };\r\n /** 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 \"declare root\" directive has the \"declare DDnsClient\" directive. In this directive, you can switch \"bool Disable\" 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. */\r\n this.GetDDnsClientStatus = function () {\r\n return _this.CallAsync(\"GetDDnsClientStatus\", new VpnDDnsClientStatus());\r\n };\r\n /** 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 \"declare root\" directive has the \"declare DDnsClient\" directive. In this directive, you can switch \"bool Disable\" 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. */\r\n this.ChangeDDnsClientHostname = function (in_param) {\r\n return _this.CallAsync(\"ChangeDDnsClientHostname\", in_param);\r\n };\r\n /** 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. */\r\n this.RegenerateServerCert = function (in_param) {\r\n return _this.CallAsync(\"RegenerateServerCert\", in_param);\r\n };\r\n /** 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. */\r\n this.MakeOpenVpnConfigFile = function () {\r\n return _this.CallAsync(\"MakeOpenVpnConfigFile\", new VpnRpcReadLogFile());\r\n };\r\n /** 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. */\r\n this.SetSpecialListener = function (in_param) {\r\n return _this.CallAsync(\"SetSpecialListener\", in_param);\r\n };\r\n /** 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. */\r\n this.GetSpecialListener = function () {\r\n return _this.CallAsync(\"GetSpecialListener\", new VpnRpcSpecialListener());\r\n };\r\n /** 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 http://www.vpnazure.net/ 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 \"vpnazure.net\". 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. */\r\n this.GetAzureStatus = function () {\r\n return _this.CallAsync(\"GetAzureStatus\", new VpnRpcAzureStatus());\r\n };\r\n /** 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 http://www.vpnazure.net/ 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 \"vpnazure.net\". 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. */\r\n this.SetAzureStatus = function (in_param) {\r\n return _this.CallAsync(\"SetAzureStatus\", in_param);\r\n };\r\n /** Get the Proxy Settings for Connecting to the DDNS server. */\r\n this.GetDDnsInternetSettng = function () {\r\n return _this.CallAsync(\"GetDDnsInternetSettng\", new VpnInternetSetting());\r\n };\r\n /** Set the Proxy Settings for Connecting to the DDNS server. */\r\n this.SetDDnsInternetSettng = function (in_param) {\r\n return _this.CallAsync(\"SetDDnsInternetSettng\", in_param);\r\n };\r\n /** Set the VPN Gate Server Configuration. This API is valid for Win32 binary distribution of the Stable Edition of SoftEther VPN Server. */\r\n this.SetVgsConfig = function (in_param) {\r\n return _this.CallAsync(\"SetVgsConfig\", in_param);\r\n };\r\n /** Get the VPN Gate Server Configuration. This API is valid for Win32 binary distribution of the Stable Edition of SoftEther VPN Server. */\r\n this.GetVgsConfig = function () {\r\n return _this.CallAsync(\"GetVgsConfig\", new VpnVgsConfig());\r\n };\r\n var headers = {};\r\n var send_credentials = false;\r\n nodejs_https_client_reject_untrusted_server_cert = is_null(nodejs_https_client_reject_untrusted_server_cert) ? false : nodejs_https_client_reject_untrusted_server_cert;\r\n if (is_null(vpnserver_hostname)) {\r\n this.rpc_url = \"/api/\";\r\n send_credentials = true;\r\n }\r\n else {\r\n if (is_null(vpnserver_port))\r\n vpnserver_port = 443;\r\n this.rpc_url = \"https://\" + vpnserver_hostname + \":\" + vpnserver_port + \"/api/\";\r\n headers[\"X-VPNADMIN-HUBNAME\"] = is_null(hubname) ? \"\" : hubname;\r\n headers[\"X-VPNADMIN-PASSWORD\"] = is_null(password) ? \"\" : password;\r\n }\r\n if (is_null(nodejs_https_client_reject_untrusted_server_cert))\r\n nodejs_https_client_reject_untrusted_server_cert = false;\r\n this.rpc_client = new JsonRpcClient(this.rpc_url, headers, send_credentials, nodejs_https_client_reject_untrusted_server_cert);\r\n }\r\n /** Determine if this JavaScript environment is on the Node.js or not. */\r\n VpnServerRpc.IsNodeJS = function () {\r\n return is_node_js;\r\n };\r\n /** Set the debug mode flag */\r\n VpnServerRpc.SetDebugMode = function (flag) {\r\n debug_mode = flag;\r\n };\r\n // -- Utility functions --\r\n /** Call a RPC procedure */\r\n VpnServerRpc.prototype.CallAsync = function (method_name, request) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var response;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, this.rpc_client.CallAsync(method_name, request)];\r\n case 1:\r\n response = _a.sent();\r\n return [2 /*return*/, response];\r\n }\r\n });\r\n });\r\n };\r\n return VpnServerRpc;\r\n}());\r\nexports.VpnServerRpc = VpnServerRpc;\r\n// --- Types ---\r\n/** IP Protocol Numbers */\r\nvar VpnIpProtocolNumber;\r\n(function (VpnIpProtocolNumber) {\r\n /** ICMP for IPv4 */\r\n VpnIpProtocolNumber[VpnIpProtocolNumber[\"ICMPv4\"] = 1] = \"ICMPv4\";\r\n /** TCP */\r\n VpnIpProtocolNumber[VpnIpProtocolNumber[\"TCP\"] = 6] = \"TCP\";\r\n /** UDP */\r\n VpnIpProtocolNumber[VpnIpProtocolNumber[\"UDP\"] = 17] = \"UDP\";\r\n /** ICMP for IPv6 */\r\n VpnIpProtocolNumber[VpnIpProtocolNumber[\"ICMPv6\"] = 58] = \"ICMPv6\";\r\n})(VpnIpProtocolNumber = exports.VpnIpProtocolNumber || (exports.VpnIpProtocolNumber = {}));\r\n/** The body of the Access list */\r\nvar VpnAccess = /** @class */ (function () {\r\n /** Constructor for the 'VpnAccess' class: The body of the Access list */\r\n function VpnAccess(init) {\r\n /** ID */\r\n this.Id_u32 = 0;\r\n /** Specify a description (note) for this rule */\r\n this.Note_utf = \"\";\r\n /** Enabled flag (true: enabled, false: disabled) */\r\n this.Active_bool = false;\r\n /** 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. */\r\n this.Priority_u32 = 0;\r\n /** 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. */\r\n this.Discard_bool = false;\r\n /** The flag if the rule is for IPv6. Specify false for IPv4, or specify true for IPv6. */\r\n this.IsIPv6_bool = false;\r\n /** 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. */\r\n this.SrcIpAddress_ip = \"\";\r\n /** Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 subnet mask as a rule condition. \"0.0.0.0\" means all hosts. \"255.255.255.255\" means one single host. */\r\n this.SrcSubnetMask_ip = \"\";\r\n /** 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. */\r\n this.DestIpAddress_ip = \"\";\r\n /** Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 subnet mask as a rule condition. \"0.0.0.0\" means all hosts. \"255.255.255.255\" means one single host. */\r\n this.DestSubnetMask_ip = \"\";\r\n /** 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. */\r\n this.SrcIpAddress6_bin = new Uint8Array([]);\r\n /** 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. */\r\n this.SrcSubnetMask6_bin = new Uint8Array([]);\r\n /** 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. */\r\n this.DestIpAddress6_bin = new Uint8Array([]);\r\n /** 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. */\r\n this.DestSubnetMask6_bin = new Uint8Array([]);\r\n /** The IP protocol number */\r\n this.Protocol_u32 = 0;\r\n /** 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. */\r\n this.SrcPortStart_u32 = 0;\r\n /** 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. */\r\n this.SrcPortEnd_u32 = 0;\r\n /** 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. */\r\n this.DestPortStart_u32 = 0;\r\n /** 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. */\r\n this.DestPortEnd_u32 = 0;\r\n /** 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. */\r\n this.SrcUsername_str = \"\";\r\n /** 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. */\r\n this.DestUsername_str = \"\";\r\n /** Specify true if you want to check the source MAC address. */\r\n this.CheckSrcMac_bool = false;\r\n /** Source MAC address (6 bytes), valid only if CheckSrcMac_bool == true. */\r\n this.SrcMacAddress_bin = new Uint8Array([]);\r\n /** Source MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true. */\r\n this.SrcMacMask_bin = new Uint8Array([]);\r\n /** Specify true if you want to check the destination MAC address. */\r\n this.CheckDstMac_bool = false;\r\n /** Destination MAC address (6 bytes), valid only if CheckSrcMac_bool == true. */\r\n this.DstMacAddress_bin = new Uint8Array([]);\r\n /** Destination MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true. */\r\n this.DstMacMask_bin = new Uint8Array([]);\r\n /** Specify true if you want to check the state of the TCP connection. */\r\n this.CheckTcpState_bool = false;\r\n /** 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. */\r\n this.Established_bool = false;\r\n /** 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. */\r\n this.Delay_u32 = 0;\r\n /** 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. */\r\n this.Jitter_u32 = 0;\r\n /** 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. */\r\n this.Loss_u32 = 0;\r\n /** 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. */\r\n this.RedirectUrl_str = \"\";\r\n Object.assign(this, init);\r\n }\r\n return VpnAccess;\r\n}());\r\nexports.VpnAccess = VpnAccess;\r\n/** Add an item to Access List */\r\nvar VpnRpcAddAccess = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcAddAccess' class: Add an item to Access List */\r\n function VpnRpcAddAccess(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** Access list (Must be a single item) */\r\n this.AccessListSingle = [];\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcAddAccess;\r\n}());\r\nexports.VpnRpcAddAccess = VpnRpcAddAccess;\r\n/** Add CA to HUB */\r\nvar VpnRpcHubAddCA = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcHubAddCA' class: Add CA to HUB */\r\n function VpnRpcHubAddCA(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** The body of the X.509 certificate */\r\n this.Cert_bin = new Uint8Array([]);\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcHubAddCA;\r\n}());\r\nexports.VpnRpcHubAddCA = VpnRpcHubAddCA;\r\n/** CRL entry */\r\nvar VpnRpcCrl = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcCrl' class: CRL entry */\r\n function VpnRpcCrl(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** Key ID */\r\n this.Key_u32 = 0;\r\n /** CN, optional */\r\n this.CommonName_utf = \"\";\r\n /** O, optional */\r\n this.Organization_utf = \"\";\r\n /** OU, optional */\r\n this.Unit_utf = \"\";\r\n /** C, optional */\r\n this.Country_utf = \"\";\r\n /** ST, optional */\r\n this.State_utf = \"\";\r\n /** L, optional */\r\n this.Local_utf = \"\";\r\n /** Serial, optional */\r\n this.Serial_bin = new Uint8Array([]);\r\n /** MD5 Digest, optional */\r\n this.DigestMD5_bin = new Uint8Array([]);\r\n /** SHA1 Digest, optional */\r\n this.DigestSHA1_bin = new Uint8Array([]);\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcCrl;\r\n}());\r\nexports.VpnRpcCrl = VpnRpcCrl;\r\n/** EtherIP key list entry */\r\nvar VpnEtherIpId = /** @class */ (function () {\r\n /** Constructor for the 'VpnEtherIpId' class: EtherIP key list entry */\r\n function VpnEtherIpId(init) {\r\n /** 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. */\r\n this.Id_str = \"\";\r\n /** Specify the name of the Virtual Hub to connect. */\r\n this.HubName_str = \"\";\r\n /** Specify the username to login to the destination Virtual Hub. */\r\n this.UserName_str = \"\";\r\n /** Specify the password to login to the destination Virtual Hub. */\r\n this.Password_str = \"\";\r\n Object.assign(this, init);\r\n }\r\n return VpnEtherIpId;\r\n}());\r\nexports.VpnEtherIpId = VpnEtherIpId;\r\n/** Layer-3 virtual interface */\r\nvar VpnRpcL3If = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcL3If' class: Layer-3 virtual interface */\r\n function VpnRpcL3If(init) {\r\n /** L3 switch name */\r\n this.Name_str = \"\";\r\n /** Virtual HUB name */\r\n this.HubName_str = \"\";\r\n /** IP address */\r\n this.IpAddress_ip = \"\";\r\n /** Subnet mask */\r\n this.SubnetMask_ip = \"\";\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcL3If;\r\n}());\r\nexports.VpnRpcL3If = VpnRpcL3If;\r\n/** Layer-3 switch */\r\nvar VpnRpcL3Sw = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcL3Sw' class: Layer-3 switch */\r\n function VpnRpcL3Sw(init) {\r\n /** Layer-3 Switch name */\r\n this.Name_str = \"\";\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcL3Sw;\r\n}());\r\nexports.VpnRpcL3Sw = VpnRpcL3Sw;\r\n/** Routing table */\r\nvar VpnRpcL3Table = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcL3Table' class: Routing table */\r\n function VpnRpcL3Table(init) {\r\n /** L3 switch name */\r\n this.Name_str = \"\";\r\n /** Network address */\r\n this.NetworkAddress_ip = \"\";\r\n /** Subnet mask */\r\n this.SubnetMask_ip = \"\";\r\n /** Gateway address */\r\n this.GatewayAddress_ip = \"\";\r\n /** Metric */\r\n this.Metric_u32 = 0;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcL3Table;\r\n}());\r\nexports.VpnRpcL3Table = VpnRpcL3Table;\r\n/** Generic parameter to contain u32, u64, ascii_string and unicode string */\r\nvar VpnRpcTest = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcTest' class: Generic parameter to contain u32, u64, ascii_string and unicode string */\r\n function VpnRpcTest(init) {\r\n /** A 32-bit integer field */\r\n this.IntValue_u32 = 0;\r\n /** A 64-bit integer field */\r\n this.Int64Value_u64 = 0;\r\n /** An Ascii string field */\r\n this.StrValue_str = \"\";\r\n /** An UTF-8 string field */\r\n this.UniStrValue_utf = \"\";\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcTest;\r\n}());\r\nexports.VpnRpcTest = VpnRpcTest;\r\n/** Local Bridge list item */\r\nvar VpnRpcLocalBridge = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcLocalBridge' class: Local Bridge list item */\r\n function VpnRpcLocalBridge(init) {\r\n /** Physical Ethernet device name */\r\n this.DeviceName_str = \"\";\r\n /** The Virtual Hub name */\r\n this.HubNameLB_str = \"\";\r\n /** Online flag */\r\n this.Online_bool = false;\r\n /** Running flag */\r\n this.Active_bool = false;\r\n /** Specify true if you are using a tap device rather than a network adapter for the bridge destination (only supported for Linux versions). */\r\n this.TapMode_bool = false;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcLocalBridge;\r\n}());\r\nexports.VpnRpcLocalBridge = VpnRpcLocalBridge;\r\n/** Create, configure, and get the group */\r\nvar VpnRpcSetGroup = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcSetGroup' class: Create, configure, and get the group */\r\n function VpnRpcSetGroup(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** The group name */\r\n this.Name_str = \"\";\r\n /** Optional real name (full name) of the group, allow using any Unicode characters */\r\n this.Realname_utf = \"\";\r\n /** Optional, specify a description of the group */\r\n this.Note_utf = \"\";\r\n /** Number of broadcast packets (Recv) */\r\n this[\"Recv.BroadcastBytes_u64\"] = 0;\r\n /** Broadcast bytes (Recv) */\r\n this[\"Recv.BroadcastCount_u64\"] = 0;\r\n /** Unicast count (Recv) */\r\n this[\"Recv.UnicastBytes_u64\"] = 0;\r\n /** Unicast bytes (Recv) */\r\n this[\"Recv.UnicastCount_u64\"] = 0;\r\n /** Number of broadcast packets (Send) */\r\n this[\"Send.BroadcastBytes_u64\"] = 0;\r\n /** Broadcast bytes (Send) */\r\n this[\"Send.BroadcastCount_u64\"] = 0;\r\n /** Unicast bytes (Send) */\r\n this[\"Send.UnicastBytes_u64\"] = 0;\r\n /** Unicast bytes (Send) */\r\n this[\"Send.UnicastCount_u64\"] = 0;\r\n /** The flag whether to use security policy */\r\n this.UsePolicy_bool = false;\r\n /** Security policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server. */\r\n this[\"policy:Access_bool\"] = false;\r\n /** Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. */\r\n this[\"policy:DHCPFilter_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:DHCPNoServer_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:DHCPForce_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:NoBridge_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:NoRouting_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:CheckMac_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:CheckIP_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:ArpDhcpOnly_bool\"] = false;\r\n /** Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. */\r\n this[\"policy:PrivacyFilter_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:NoServer_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:NoBroadcastLimiter_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:MonitorPort_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:MaxConnection_u32\"] = 0;\r\n /** 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. */\r\n this[\"policy:TimeOut_u32\"] = 0;\r\n /** Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. */\r\n this[\"policy:MaxMac_u32\"] = 0;\r\n /** 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. */\r\n this[\"policy:MaxIP_u32\"] = 0;\r\n /** 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. */\r\n this[\"policy:MaxUpload_u32\"] = 0;\r\n /** 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. */\r\n this[\"policy:MaxDownload_u32\"] = 0;\r\n /** 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. */\r\n this[\"policy:FixPassword_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:MultiLogins_u32\"] = 0;\r\n /** Security policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions. */\r\n this[\"policy:NoQoS_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:RSandRAFilter_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:RAFilter_bool\"] = false;\r\n /** Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. */\r\n this[\"policy:DHCPv6Filter_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:DHCPv6NoServer_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:NoRoutingV6_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:CheckIPv6_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:NoServerV6_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:MaxIPv6_u32\"] = 0;\r\n /** Security policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using *standard* 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. */\r\n this[\"policy:NoSavePassword_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:AutoDisconnect_u32\"] = 0;\r\n /** Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. */\r\n this[\"policy:FilterIPv4_bool\"] = false;\r\n /** Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. */\r\n this[\"policy:FilterIPv6_bool\"] = false;\r\n /** Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. \"Non-IP packet\" 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. */\r\n this[\"policy:FilterNonIP_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:NoIPv6DefaultRouterInRA_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:NoIPv6DefaultRouterInRAWhenIPv6_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:VLanId_u32\"] = 0;\r\n /** Security policy: Whether version 3.0 (must be true) */\r\n this[\"policy:Ver3_bool\"] = false;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcSetGroup;\r\n}());\r\nexports.VpnRpcSetGroup = VpnRpcSetGroup;\r\n/** Hub types */\r\nvar VpnRpcHubType;\r\n(function (VpnRpcHubType) {\r\n /** Stand-alone HUB */\r\n VpnRpcHubType[VpnRpcHubType[\"Standalone\"] = 0] = \"Standalone\";\r\n /** Static HUB */\r\n VpnRpcHubType[VpnRpcHubType[\"FarmStatic\"] = 1] = \"FarmStatic\";\r\n /** Dynamic HUB */\r\n VpnRpcHubType[VpnRpcHubType[\"FarmDynamic\"] = 2] = \"FarmDynamic\";\r\n})(VpnRpcHubType = exports.VpnRpcHubType || (exports.VpnRpcHubType = {}));\r\n/** Create a HUB */\r\nvar VpnRpcCreateHub = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcCreateHub' class: Create a HUB */\r\n function VpnRpcCreateHub(init) {\r\n /** Specify the name of the Virtual Hub to create / update. */\r\n this.HubName_str = \"\";\r\n /** 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. */\r\n this.AdminPasswordPlainText_str = \"\";\r\n /** Online flag */\r\n this.Online_bool = false;\r\n /** Maximum number of VPN sessions */\r\n this.MaxSession_u32 = 0;\r\n /** 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. */\r\n this.NoEnum_bool = false;\r\n /** Type of the Virtual Hub (Valid only for Clustered VPN Servers) */\r\n this.HubType_u32 = 0;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcCreateHub;\r\n}());\r\nexports.VpnRpcCreateHub = VpnRpcCreateHub;\r\nvar VpnRpcClientAuthType;\r\n(function (VpnRpcClientAuthType) {\r\n /** Anonymous authentication */\r\n VpnRpcClientAuthType[VpnRpcClientAuthType[\"Anonymous\"] = 0] = \"Anonymous\";\r\n /** SHA-0 hashed password authentication */\r\n VpnRpcClientAuthType[VpnRpcClientAuthType[\"SHA0_Hashed_Password\"] = 1] = \"SHA0_Hashed_Password\";\r\n /** Plain password authentication */\r\n VpnRpcClientAuthType[VpnRpcClientAuthType[\"PlainPassword\"] = 2] = \"PlainPassword\";\r\n /** Certificate authentication */\r\n VpnRpcClientAuthType[VpnRpcClientAuthType[\"Cert\"] = 3] = \"Cert\";\r\n})(VpnRpcClientAuthType = exports.VpnRpcClientAuthType || (exports.VpnRpcClientAuthType = {}));\r\n/** Create and set of link */\r\nvar VpnRpcCreateLink = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcCreateLink' class: Create and set of link */\r\n function VpnRpcCreateLink(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_Ex_str = \"\";\r\n /** Online flag */\r\n this.Online_bool = false;\r\n /** The flag to enable validation for the server certificate */\r\n this.CheckServerCert_bool = false;\r\n /** The body of server X.509 certificate to compare. Valid only if the CheckServerCert_bool flag is true. */\r\n this.ServerCert_bin = new Uint8Array([]);\r\n /** Client Option Parameters: Specify the name of the Cascade Connection */\r\n this.AccountName_utf = \"\";\r\n /** Client Option Parameters: Specify the hostname of the destination VPN Server. You can also specify by IP address. */\r\n this.Hostname_str = \"\";\r\n /** Client Option Parameters: Specify the port number of the destination VPN Server. */\r\n this.Port_u32 = 0;\r\n /** Client Option Parameters: The type of the proxy server */\r\n this.ProxyType_u32 = 0;\r\n /** Client Option Parameters: The hostname or IP address of the proxy server name */\r\n this.ProxyName_str = \"\";\r\n /** Client Option Parameters: The port number of the proxy server */\r\n this.ProxyPort_u32 = 0;\r\n /** Client Option Parameters: The username to connect to the proxy server */\r\n this.ProxyUsername_str = \"\";\r\n /** Client Option Parameters: The password to connect to the proxy server */\r\n this.ProxyPassword_str = \"\";\r\n /** Client Option Parameters: The Virtual Hub on the destination VPN Server */\r\n this.HubName_str = \"\";\r\n /** Client Option Parameters: Number of TCP Connections to Use in VPN Communication */\r\n this.MaxConnection_u32 = 0;\r\n /** Client Option Parameters: The flag to enable the encryption on the communication */\r\n this.UseEncrypt_bool = false;\r\n /** Client Option Parameters: Enable / Disable Data Compression when Communicating by Cascade Connection */\r\n this.UseCompress_bool = false;\r\n /** 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. */\r\n this.HalfConnection_bool = false;\r\n /** Client Option Parameters: Connection attempt interval when additional connection will be established */\r\n this.AdditionalConnectionInterval_u32 = 0;\r\n /** Client Option Parameters: Connection Life of Each TCP Connection (0 for no keep-alive) */\r\n this.ConnectionDisconnectSpan_u32 = 0;\r\n /** Client Option Parameters: Disable QoS Control Function if the value is true */\r\n this.DisableQoS_bool = false;\r\n /** Client Option Parameters: Do not use TLS 1.x of the value is true */\r\n this.NoTls1_bool = false;\r\n /** Client Option Parameters: Do not use UDP acceleration mode if the value is true */\r\n this.NoUdpAcceleration_bool = false;\r\n /** Authentication type */\r\n this.AuthType_u32 = 0;\r\n /** User name */\r\n this.Username_str = \"\";\r\n /** 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). */\r\n this.HashedPassword_bin = new Uint8Array([]);\r\n /** Plaintext Password. Valid only if ClientAuth_AuthType_u32 == PlainPassword (2). */\r\n this.PlainPassword_str = \"\";\r\n /** Client certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3). */\r\n this.ClientX_bin = new Uint8Array([]);\r\n /** Client private key of the certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3). */\r\n this.ClientK_bin = new Uint8Array([]);\r\n /** Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. */\r\n this[\"policy:DHCPFilter_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:DHCPNoServer_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:DHCPForce_bool\"] = false;\r\n /** Security policy: Prohibit the duplicate MAC address */\r\n this.SecPol_CheckMac_bool = false;\r\n /** Security policy: Prohibit a duplicate IP address (IPv4) */\r\n this.SecPol_CheckIP_bool = false;\r\n /** 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. */\r\n this[\"policy:ArpDhcpOnly_bool\"] = false;\r\n /** Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. */\r\n this[\"policy:PrivacyFilter_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:NoServer_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:NoBroadcastLimiter_bool\"] = false;\r\n /** Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. */\r\n this[\"policy:MaxMac_u32\"] = 0;\r\n /** 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. */\r\n this[\"policy:MaxIP_u32\"] = 0;\r\n /** 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. */\r\n this[\"policy:MaxUpload_u32\"] = 0;\r\n /** 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. */\r\n this[\"policy:MaxDownload_u32\"] = 0;\r\n /** 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. */\r\n this[\"policy:RSandRAFilter_bool\"] = false;\r\n /** Security policy: Filter the router advertisement packet (IPv6) */\r\n this.SecPol_RAFilter_bool = false;\r\n /** Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. */\r\n this[\"policy:DHCPv6Filter_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:DHCPv6NoServer_bool\"] = false;\r\n /** Security policy: Prohibit the duplicate IP address (IPv6) */\r\n this.SecPol_CheckIPv6_bool = false;\r\n /** 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. */\r\n this[\"policy:NoServerV6_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:MaxIPv6_u32\"] = 0;\r\n /** Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. */\r\n this[\"policy:FilterIPv4_bool\"] = false;\r\n /** Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. */\r\n this[\"policy:FilterIPv6_bool\"] = false;\r\n /** Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. \"Non-IP packet\" 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. */\r\n this[\"policy:FilterNonIP_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:NoIPv6DefaultRouterInRA_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:VLanId_u32\"] = 0;\r\n /** Security policy: Whether version 3.0 (must be true) */\r\n this[\"policy:Ver3_bool\"] = false;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcCreateLink;\r\n}());\r\nexports.VpnRpcCreateLink = VpnRpcCreateLink;\r\n/** Listener */\r\nvar VpnRpcListener = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcListener' class: Listener */\r\n function VpnRpcListener(init) {\r\n /** Port number (Range: 1 - 65535) */\r\n this.Port_u32 = 0;\r\n /** Active state */\r\n this.Enable_bool = false;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcListener;\r\n}());\r\nexports.VpnRpcListener = VpnRpcListener;\r\n/** User authentication type (server side) */\r\nvar VpnRpcUserAuthType;\r\n(function (VpnRpcUserAuthType) {\r\n /** Anonymous authentication */\r\n VpnRpcUserAuthType[VpnRpcUserAuthType[\"Anonymous\"] = 0] = \"Anonymous\";\r\n /** Password authentication */\r\n VpnRpcUserAuthType[VpnRpcUserAuthType[\"Password\"] = 1] = \"Password\";\r\n /** User certificate authentication */\r\n VpnRpcUserAuthType[VpnRpcUserAuthType[\"UserCert\"] = 2] = \"UserCert\";\r\n /** Root certificate which is issued by trusted Certificate Authority */\r\n VpnRpcUserAuthType[VpnRpcUserAuthType[\"RootCert\"] = 3] = \"RootCert\";\r\n /** Radius authentication */\r\n VpnRpcUserAuthType[VpnRpcUserAuthType[\"Radius\"] = 4] = \"Radius\";\r\n /** Windows NT authentication */\r\n VpnRpcUserAuthType[VpnRpcUserAuthType[\"NTDomain\"] = 5] = \"NTDomain\";\r\n})(VpnRpcUserAuthType = exports.VpnRpcUserAuthType || (exports.VpnRpcUserAuthType = {}));\r\n/** Create, configure, and get the user */\r\nvar VpnRpcSetUser = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcSetUser' class: Create, configure, and get the user */\r\n function VpnRpcSetUser(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** Specify the user name of the user */\r\n this.Name_str = \"\";\r\n /** Assigned group name for the user */\r\n this.GroupName_str = \"\";\r\n /** Optional real name (full name) of the user, allow using any Unicode characters */\r\n this.Realname_utf = \"\";\r\n /** Optional User Description */\r\n this.Note_utf = \"\";\r\n /** Creation date and time */\r\n this.CreatedTime_dt = new Date();\r\n /** Last modified date and time */\r\n this.UpdatedTime_dt = new Date();\r\n /** Expiration date and time */\r\n this.ExpireTime_dt = new Date();\r\n /** Authentication method of the user */\r\n this.AuthType_u32 = 0;\r\n /** User password, valid only if AuthType_u32 == Password(1). Valid only to create or set operations. */\r\n this.Auth_Password_str = \"\";\r\n /** User certificate, valid only if AuthType_u32 == UserCert(2). */\r\n this.UserX_bin = new Uint8Array([]);\r\n /** Certificate Serial Number, optional, valid only if AuthType_u32 == RootCert(3). */\r\n this.Serial_bin = new Uint8Array([]);\r\n /** Certificate Common Name, optional, valid only if AuthType_u32 == RootCert(3). */\r\n this.CommonName_utf = \"\";\r\n /** Username in RADIUS server, optional, valid only if AuthType_u32 == Radius(4). */\r\n this.RadiusUsername_utf = \"\";\r\n /** Username in NT Domain server, optional, valid only if AuthType_u32 == NT(5). */\r\n this.NtUsername_utf = \"\";\r\n /** Number of total logins of the user */\r\n this.NumLogin_u32 = 0;\r\n /** Number of broadcast packets (Recv) */\r\n this[\"Recv.BroadcastBytes_u64\"] = 0;\r\n /** Broadcast bytes (Recv) */\r\n this[\"Recv.BroadcastCount_u64\"] = 0;\r\n /** Unicast count (Recv) */\r\n this[\"Recv.UnicastBytes_u64\"] = 0;\r\n /** Unicast bytes (Recv) */\r\n this[\"Recv.UnicastCount_u64\"] = 0;\r\n /** Number of broadcast packets (Send) */\r\n this[\"Send.BroadcastBytes_u64\"] = 0;\r\n /** Broadcast bytes (Send) */\r\n this[\"Send.BroadcastCount_u64\"] = 0;\r\n /** Unicast bytes (Send) */\r\n this[\"Send.UnicastBytes_u64\"] = 0;\r\n /** Unicast bytes (Send) */\r\n this[\"Send.UnicastCount_u64\"] = 0;\r\n /** The flag whether to use security policy */\r\n this.UsePolicy_bool = false;\r\n /** Security policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server. */\r\n this[\"policy:Access_bool\"] = false;\r\n /** Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. */\r\n this[\"policy:DHCPFilter_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:DHCPNoServer_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:DHCPForce_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:NoBridge_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:NoRouting_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:CheckMac_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:CheckIP_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:ArpDhcpOnly_bool\"] = false;\r\n /** Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. */\r\n this[\"policy:PrivacyFilter_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:NoServer_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:NoBroadcastLimiter_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:MonitorPort_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:MaxConnection_u32\"] = 0;\r\n /** 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. */\r\n this[\"policy:TimeOut_u32\"] = 0;\r\n /** Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. */\r\n this[\"policy:MaxMac_u32\"] = 0;\r\n /** 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. */\r\n this[\"policy:MaxIP_u32\"] = 0;\r\n /** 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. */\r\n this[\"policy:MaxUpload_u32\"] = 0;\r\n /** 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. */\r\n this[\"policy:MaxDownload_u32\"] = 0;\r\n /** 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. */\r\n this[\"policy:FixPassword_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:MultiLogins_u32\"] = 0;\r\n /** Security policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions. */\r\n this[\"policy:NoQoS_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:RSandRAFilter_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:RAFilter_bool\"] = false;\r\n /** Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. */\r\n this[\"policy:DHCPv6Filter_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:DHCPv6NoServer_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:NoRoutingV6_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:CheckIPv6_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:NoServerV6_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:MaxIPv6_u32\"] = 0;\r\n /** Security policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using *standard* 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. */\r\n this[\"policy:NoSavePassword_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:AutoDisconnect_u32\"] = 0;\r\n /** Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. */\r\n this[\"policy:FilterIPv4_bool\"] = false;\r\n /** Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. */\r\n this[\"policy:FilterIPv6_bool\"] = false;\r\n /** Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. \"Non-IP packet\" 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. */\r\n this[\"policy:FilterNonIP_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:NoIPv6DefaultRouterInRA_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:NoIPv6DefaultRouterInRAWhenIPv6_bool\"] = false;\r\n /** 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. */\r\n this[\"policy:VLanId_u32\"] = 0;\r\n /** Security policy: Whether version 3.0 (must be true) */\r\n this[\"policy:Ver3_bool\"] = false;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcSetUser;\r\n}());\r\nexports.VpnRpcSetUser = VpnRpcSetUser;\r\n/** Delete the access list */\r\nvar VpnRpcDeleteAccess = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcDeleteAccess' class: Delete the access list */\r\n function VpnRpcDeleteAccess(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** ID */\r\n this.Id_u32 = 0;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcDeleteAccess;\r\n}());\r\nexports.VpnRpcDeleteAccess = VpnRpcDeleteAccess;\r\n/** Delete the CA of HUB */\r\nvar VpnRpcHubDeleteCA = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcHubDeleteCA' class: Delete the CA of HUB */\r\n function VpnRpcHubDeleteCA(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** Certificate key id to be deleted */\r\n this.Key_u32 = 0;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcHubDeleteCA;\r\n}());\r\nexports.VpnRpcHubDeleteCA = VpnRpcHubDeleteCA;\r\n/** Deleting a user or group */\r\nvar VpnRpcDeleteUser = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcDeleteUser' class: Deleting a user or group */\r\n function VpnRpcDeleteUser(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** User or group name */\r\n this.Name_str = \"\";\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcDeleteUser;\r\n}());\r\nexports.VpnRpcDeleteUser = VpnRpcDeleteUser;\r\n/** Delete the HUB */\r\nvar VpnRpcDeleteHub = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcDeleteHub' class: Delete the HUB */\r\n function VpnRpcDeleteHub(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcDeleteHub;\r\n}());\r\nexports.VpnRpcDeleteHub = VpnRpcDeleteHub;\r\n/** Delete the table */\r\nvar VpnRpcDeleteTable = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcDeleteTable' class: Delete the table */\r\n function VpnRpcDeleteTable(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** Key ID */\r\n this.Key_u32 = 0;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcDeleteTable;\r\n}());\r\nexports.VpnRpcDeleteTable = VpnRpcDeleteTable;\r\n/** Specify the Link */\r\nvar VpnRpcLink = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcLink' class: Specify the Link */\r\n function VpnRpcLink(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** The name of the cascade connection */\r\n this.AccountName_utf = \"\";\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcLink;\r\n}());\r\nexports.VpnRpcLink = VpnRpcLink;\r\n/** Disconnect the session */\r\nvar VpnRpcDeleteSession = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcDeleteSession' class: Disconnect the session */\r\n function VpnRpcDeleteSession(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** Session name */\r\n this.Name_str = \"\";\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcDeleteSession;\r\n}());\r\nexports.VpnRpcDeleteSession = VpnRpcDeleteSession;\r\n/** Specify the HUB */\r\nvar VpnRpcHub = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcHub' class: Specify the HUB */\r\n function VpnRpcHub(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcHub;\r\n}());\r\nexports.VpnRpcHub = VpnRpcHub;\r\n/** Disconnect a connection */\r\nvar VpnRpcDisconnectConnection = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcDisconnectConnection' class: Disconnect a connection */\r\n function VpnRpcDisconnectConnection(init) {\r\n /** Connection name */\r\n this.Name_str = \"\";\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcDisconnectConnection;\r\n}());\r\nexports.VpnRpcDisconnectConnection = VpnRpcDisconnectConnection;\r\n/** Enumeration of the access list */\r\nvar VpnRpcEnumAccessList = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumAccessList' class: Enumeration of the access list */\r\n function VpnRpcEnumAccessList(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** Access list */\r\n this.AccessList = [];\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumAccessList;\r\n}());\r\nexports.VpnRpcEnumAccessList = VpnRpcEnumAccessList;\r\n/** CA enumeration items of HUB */\r\nvar VpnRpcHubEnumCAItem = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcHubEnumCAItem' class: CA enumeration items of HUB */\r\n function VpnRpcHubEnumCAItem(init) {\r\n /** The key id of the item */\r\n this.Key_u32 = 0;\r\n /** Subject */\r\n this.SubjectName_utf = \"\";\r\n /** Issuer */\r\n this.IssuerName_utf = \"\";\r\n /** Expiration date */\r\n this.Expires_dt = new Date();\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcHubEnumCAItem;\r\n}());\r\nexports.VpnRpcHubEnumCAItem = VpnRpcHubEnumCAItem;\r\n/** CA enumeration of HUB */\r\nvar VpnRpcHubEnumCA = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcHubEnumCA' class: CA enumeration of HUB */\r\n function VpnRpcHubEnumCA(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** The list of CA */\r\n this.CAList = [];\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcHubEnumCA;\r\n}());\r\nexports.VpnRpcHubEnumCA = VpnRpcHubEnumCA;\r\n/** Type of connection */\r\nvar VpnRpcConnectionType;\r\n(function (VpnRpcConnectionType) {\r\n /** VPN Client */\r\n VpnRpcConnectionType[VpnRpcConnectionType[\"Client\"] = 0] = \"Client\";\r\n /** During initialization */\r\n VpnRpcConnectionType[VpnRpcConnectionType[\"Init\"] = 1] = \"Init\";\r\n /** Login connection */\r\n VpnRpcConnectionType[VpnRpcConnectionType[\"Login\"] = 2] = \"Login\";\r\n /** Additional connection */\r\n VpnRpcConnectionType[VpnRpcConnectionType[\"Additional\"] = 3] = \"Additional\";\r\n /** RPC for server farm */\r\n VpnRpcConnectionType[VpnRpcConnectionType[\"FarmRpc\"] = 4] = \"FarmRpc\";\r\n /** RPC for Management */\r\n VpnRpcConnectionType[VpnRpcConnectionType[\"AdminRpc\"] = 5] = \"AdminRpc\";\r\n /** HUB enumeration */\r\n VpnRpcConnectionType[VpnRpcConnectionType[\"EnumHub\"] = 6] = \"EnumHub\";\r\n /** Password change */\r\n VpnRpcConnectionType[VpnRpcConnectionType[\"Password\"] = 7] = \"Password\";\r\n /** SSTP */\r\n VpnRpcConnectionType[VpnRpcConnectionType[\"SSTP\"] = 8] = \"SSTP\";\r\n /** OpenVPN */\r\n VpnRpcConnectionType[VpnRpcConnectionType[\"OpenVPN\"] = 9] = \"OpenVPN\";\r\n})(VpnRpcConnectionType = exports.VpnRpcConnectionType || (exports.VpnRpcConnectionType = {}));\r\n/** Connection enumeration items */\r\nvar VpnRpcEnumConnectionItem = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumConnectionItem' class: Connection enumeration items */\r\n function VpnRpcEnumConnectionItem(init) {\r\n /** Connection name */\r\n this.Name_str = \"\";\r\n /** Host name */\r\n this.Hostname_str = \"\";\r\n /** IP address */\r\n this.Ip_ip = \"\";\r\n /** Port number */\r\n this.Port_u32 = 0;\r\n /** Connected time */\r\n this.ConnectedTime_dt = new Date();\r\n /** Connection type */\r\n this.Type_u32 = 0;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumConnectionItem;\r\n}());\r\nexports.VpnRpcEnumConnectionItem = VpnRpcEnumConnectionItem;\r\n/** Connection enumeration */\r\nvar VpnRpcEnumConnection = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumConnection' class: Connection enumeration */\r\n function VpnRpcEnumConnection(init) {\r\n /** Number of connections */\r\n this.NumConnection_u32 = 0;\r\n /** Connection list */\r\n this.ConnectionList = [];\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumConnection;\r\n}());\r\nexports.VpnRpcEnumConnection = VpnRpcEnumConnection;\r\n/** Enum CRL Item */\r\nvar VpnRpcEnumCrlItem = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumCrlItem' class: Enum CRL Item */\r\n function VpnRpcEnumCrlItem(init) {\r\n /** Key ID */\r\n this.Key_u32 = 0;\r\n /** The contents of the CRL item */\r\n this.CrlInfo_utf = \"\";\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumCrlItem;\r\n}());\r\nexports.VpnRpcEnumCrlItem = VpnRpcEnumCrlItem;\r\n/** Enum CRL */\r\nvar VpnRpcEnumCrl = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumCrl' class: Enum CRL */\r\n function VpnRpcEnumCrl(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** CRL list */\r\n this.CRLList = [];\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumCrl;\r\n}());\r\nexports.VpnRpcEnumCrl = VpnRpcEnumCrl;\r\n/** RPC_ENUM_DHCP_ITEM */\r\nvar VpnRpcEnumDhcpItem = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumDhcpItem' class: RPC_ENUM_DHCP_ITEM */\r\n function VpnRpcEnumDhcpItem(init) {\r\n /** ID */\r\n this.Id_u32 = 0;\r\n /** Lease time */\r\n this.LeasedTime_dt = new Date();\r\n /** Expiration date */\r\n this.ExpireTime_dt = new Date();\r\n /** MAC address */\r\n this.MacAddress_bin = new Uint8Array([]);\r\n /** IP address */\r\n this.IpAddress_ip = \"\";\r\n /** Subnet mask */\r\n this.Mask_u32 = 0;\r\n /** Host name */\r\n this.Hostname_str = \"\";\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumDhcpItem;\r\n}());\r\nexports.VpnRpcEnumDhcpItem = VpnRpcEnumDhcpItem;\r\n/** RPC_ENUM_DHCP */\r\nvar VpnRpcEnumDhcp = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumDhcp' class: RPC_ENUM_DHCP */\r\n function VpnRpcEnumDhcp(init) {\r\n /** Virtual Hub Name */\r\n this.HubName_str = \"\";\r\n /** DHCP Item */\r\n this.DhcpTable = [];\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumDhcp;\r\n}());\r\nexports.VpnRpcEnumDhcp = VpnRpcEnumDhcp;\r\n/** EtherIP setting list */\r\nvar VpnRpcEnumEtherIpId = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumEtherIpId' class: EtherIP setting list */\r\n function VpnRpcEnumEtherIpId(init) {\r\n /** Setting list */\r\n this.Settings = [];\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumEtherIpId;\r\n}());\r\nexports.VpnRpcEnumEtherIpId = VpnRpcEnumEtherIpId;\r\n/** Ethernet Network Adapters list item */\r\nvar VpnRpcEnumEthItem = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumEthItem' class: Ethernet Network Adapters list item */\r\n function VpnRpcEnumEthItem(init) {\r\n /** Device name */\r\n this.DeviceName_str = \"\";\r\n /** Network connection name (description) */\r\n this.NetworkConnectionName_utf = \"\";\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumEthItem;\r\n}());\r\nexports.VpnRpcEnumEthItem = VpnRpcEnumEthItem;\r\n/** Ethernet Network Adapters list */\r\nvar VpnRpcEnumEth = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumEth' class: Ethernet Network Adapters list */\r\n function VpnRpcEnumEth(init) {\r\n /** Ethernet Network Adapters list */\r\n this.EthList = [];\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumEth;\r\n}());\r\nexports.VpnRpcEnumEth = VpnRpcEnumEth;\r\n/** Server farm members enumeration items */\r\nvar VpnRpcEnumFarmItem = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumFarmItem' class: Server farm members enumeration items */\r\n function VpnRpcEnumFarmItem(init) {\r\n /** ID */\r\n this.Id_u32 = 0;\r\n /** Controller */\r\n this.Controller_bool = false;\r\n /** Connection time */\r\n this.ConnectedTime_dt = new Date();\r\n /** IP address */\r\n this.Ip_ip = \"\";\r\n /** Host name */\r\n this.Hostname_str = \"\";\r\n /** Point */\r\n this.Point_u32 = 0;\r\n /** Number of sessions */\r\n this.NumSessions_u32 = 0;\r\n /** Number of TCP connections */\r\n this.NumTcpConnections_u32 = 0;\r\n /** Number of HUBs */\r\n this.NumHubs_u32 = 0;\r\n /** Number of assigned client licenses */\r\n this.AssignedClientLicense_u32 = 0;\r\n /** Number of assigned bridge licenses */\r\n this.AssignedBridgeLicense_u32 = 0;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumFarmItem;\r\n}());\r\nexports.VpnRpcEnumFarmItem = VpnRpcEnumFarmItem;\r\n/** Server farm member enumeration */\r\nvar VpnRpcEnumFarm = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumFarm' class: Server farm member enumeration */\r\n function VpnRpcEnumFarm(init) {\r\n /** Number of Cluster Members */\r\n this.NumFarm_u32 = 0;\r\n /** Cluster Members list */\r\n this.FarmMemberList = [];\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumFarm;\r\n}());\r\nexports.VpnRpcEnumFarm = VpnRpcEnumFarm;\r\n/** Enumeration items in the group */\r\nvar VpnRpcEnumGroupItem = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumGroupItem' class: Enumeration items in the group */\r\n function VpnRpcEnumGroupItem(init) {\r\n /** User name */\r\n this.Name_str = \"\";\r\n /** Real name */\r\n this.Realname_utf = \"\";\r\n /** Note */\r\n this.Note_utf = \"\";\r\n /** Number of users */\r\n this.NumUsers_u32 = 0;\r\n /** Access denied */\r\n this.DenyAccess_bool = false;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumGroupItem;\r\n}());\r\nexports.VpnRpcEnumGroupItem = VpnRpcEnumGroupItem;\r\n/** Group enumeration */\r\nvar VpnRpcEnumGroup = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumGroup' class: Group enumeration */\r\n function VpnRpcEnumGroup(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** Group list */\r\n this.GroupList = [];\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumGroup;\r\n}());\r\nexports.VpnRpcEnumGroup = VpnRpcEnumGroup;\r\n/** Enumeration items of HUB */\r\nvar VpnRpcEnumHubItem = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumHubItem' class: Enumeration items of HUB */\r\n function VpnRpcEnumHubItem(init) {\r\n /** The name of the Virtual Hub */\r\n this.HubName_str = \"\";\r\n /** Online state */\r\n this.Online_bool = false;\r\n /** Type of HUB (Valid only for Clustered VPN Servers) */\r\n this.HubType_u32 = 0;\r\n /** Number of users */\r\n this.NumUsers_u32 = 0;\r\n /** Number of registered groups */\r\n this.NumGroups_u32 = 0;\r\n /** Number of registered sessions */\r\n this.NumSessions_u32 = 0;\r\n /** Number of current MAC table entries */\r\n this.NumMacTables_u32 = 0;\r\n /** Number of current IP table entries */\r\n this.NumIpTables_u32 = 0;\r\n /** Last communication date and time */\r\n this.LastCommTime_dt = new Date();\r\n /** Last login date and time */\r\n this.LastLoginTime_dt = new Date();\r\n /** Creation date and time */\r\n this.CreatedTime_dt = new Date();\r\n /** Number of accumulated logins */\r\n this.NumLogin_u32 = 0;\r\n /** Whether the traffic information is provided */\r\n this.IsTrafficFilled_bool = false;\r\n /** Number of broadcast packets (Recv) */\r\n this[\"Ex.Recv.BroadcastBytes_u64\"] = 0;\r\n /** Broadcast bytes (Recv) */\r\n this[\"Ex.Recv.BroadcastCount_u64\"] = 0;\r\n /** Unicast count (Recv) */\r\n this[\"Ex.Recv.UnicastBytes_u64\"] = 0;\r\n /** Unicast bytes (Recv) */\r\n this[\"Ex.Recv.UnicastCount_u64\"] = 0;\r\n /** Number of broadcast packets (Send) */\r\n this[\"Ex.Send.BroadcastBytes_u64\"] = 0;\r\n /** Broadcast bytes (Send) */\r\n this[\"Ex.Send.BroadcastCount_u64\"] = 0;\r\n /** Unicast bytes (Send) */\r\n this[\"Ex.Send.UnicastBytes_u64\"] = 0;\r\n /** Unicast bytes (Send) */\r\n this[\"Ex.Send.UnicastCount_u64\"] = 0;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumHubItem;\r\n}());\r\nexports.VpnRpcEnumHubItem = VpnRpcEnumHubItem;\r\n/** Enumeration of HUB */\r\nvar VpnRpcEnumHub = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumHub' class: Enumeration of HUB */\r\n function VpnRpcEnumHub(init) {\r\n /** Number of Virtual Hubs */\r\n this.NumHub_u32 = 0;\r\n /** Virtual Hubs */\r\n this.HubList = [];\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumHub;\r\n}());\r\nexports.VpnRpcEnumHub = VpnRpcEnumHub;\r\n/** Enumeration items of IP table */\r\nvar VpnRpcEnumIpTableItem = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumIpTableItem' class: Enumeration items of IP table */\r\n function VpnRpcEnumIpTableItem(init) {\r\n /** Key ID */\r\n this.Key_u32 = 0;\r\n /** Session name */\r\n this.SessionName_str = \"\";\r\n /** IP address */\r\n this.IpAddress_ip = \"\";\r\n /** Assigned by the DHCP */\r\n this.DhcpAllocated_bool = false;\r\n /** Creation date and time */\r\n this.CreatedTime_dt = new Date();\r\n /** Updating date */\r\n this.UpdatedTime_dt = new Date();\r\n /** Remote items */\r\n this.RemoteItem_bool = false;\r\n /** Remote host name */\r\n this.RemoteHostname_str = \"\";\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumIpTableItem;\r\n}());\r\nexports.VpnRpcEnumIpTableItem = VpnRpcEnumIpTableItem;\r\n/** Enumeration of IP table */\r\nvar VpnRpcEnumIpTable = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumIpTable' class: Enumeration of IP table */\r\n function VpnRpcEnumIpTable(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** MAC table */\r\n this.IpTable = [];\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumIpTable;\r\n}());\r\nexports.VpnRpcEnumIpTable = VpnRpcEnumIpTable;\r\n/** Layer-3 interface enumeration */\r\nvar VpnRpcEnumL3If = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumL3If' class: Layer-3 interface enumeration */\r\n function VpnRpcEnumL3If(init) {\r\n /** Layer-3 switch name */\r\n this.Name_str = \"\";\r\n /** Layer-3 interface list */\r\n this.L3IFList = [];\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumL3If;\r\n}());\r\nexports.VpnRpcEnumL3If = VpnRpcEnumL3If;\r\n/** Layer-3 switch enumeration item */\r\nvar VpnRpcEnumL3SwItem = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumL3SwItem' class: Layer-3 switch enumeration item */\r\n function VpnRpcEnumL3SwItem(init) {\r\n /** Name of the layer-3 switch */\r\n this.Name_str = \"\";\r\n /** Number of layer-3 switch virtual interfaces */\r\n this.NumInterfaces_u32 = 0;\r\n /** Number of routing tables */\r\n this.NumTables_u32 = 0;\r\n /** Activated flag */\r\n this.Active_bool = false;\r\n /** Online flag */\r\n this.Online_bool = false;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumL3SwItem;\r\n}());\r\nexports.VpnRpcEnumL3SwItem = VpnRpcEnumL3SwItem;\r\n/** Layer-3 switch enumeration */\r\nvar VpnRpcEnumL3Sw = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumL3Sw' class: Layer-3 switch enumeration */\r\n function VpnRpcEnumL3Sw(init) {\r\n /** Layer-3 switch list */\r\n this.L3SWList = [];\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumL3Sw;\r\n}());\r\nexports.VpnRpcEnumL3Sw = VpnRpcEnumL3Sw;\r\n/** Routing table enumeration */\r\nvar VpnRpcEnumL3Table = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumL3Table' class: Routing table enumeration */\r\n function VpnRpcEnumL3Table(init) {\r\n /** L3 switch name */\r\n this.Name_str = \"\";\r\n /** Routing table item list */\r\n this.L3Table = [];\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumL3Table;\r\n}());\r\nexports.VpnRpcEnumL3Table = VpnRpcEnumL3Table;\r\n/** Cascade Connection Enumeration */\r\nvar VpnRpcEnumLinkItem = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumLinkItem' class: Cascade Connection Enumeration */\r\n function VpnRpcEnumLinkItem(init) {\r\n /** The name of cascade connection */\r\n this.AccountName_utf = \"\";\r\n /** Online flag */\r\n this.Online_bool = false;\r\n /** The flag indicates whether the cascade connection is established */\r\n this.Connected_bool = false;\r\n /** The error last occurred if the cascade connection is in the fail state */\r\n this.LastError_u32 = 0;\r\n /** Connection completion time */\r\n this.ConnectedTime_dt = new Date();\r\n /** Host name of the destination VPN server */\r\n this.Hostname_str = \"\";\r\n /** The Virtual Hub name */\r\n this.TargetHubName_str = \"\";\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumLinkItem;\r\n}());\r\nexports.VpnRpcEnumLinkItem = VpnRpcEnumLinkItem;\r\n/** Enumeration of the link */\r\nvar VpnRpcEnumLink = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumLink' class: Enumeration of the link */\r\n function VpnRpcEnumLink(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** Number of cascade connections */\r\n this.NumLink_u32 = 0;\r\n /** The list of cascade connections */\r\n this.LinkList = [];\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumLink;\r\n}());\r\nexports.VpnRpcEnumLink = VpnRpcEnumLink;\r\n/** List of listeners item */\r\nvar VpnRpcListenerListItem = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcListenerListItem' class: List of listeners item */\r\n function VpnRpcListenerListItem(init) {\r\n /** TCP port number (range: 1 - 65535) */\r\n this.Ports_u32 = 0;\r\n /** Active state */\r\n this.Enables_bool = false;\r\n /** The flag to indicate if the error occurred on the listener port */\r\n this.Errors_bool = false;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcListenerListItem;\r\n}());\r\nexports.VpnRpcListenerListItem = VpnRpcListenerListItem;\r\n/** List of listeners */\r\nvar VpnRpcListenerList = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcListenerList' class: List of listeners */\r\n function VpnRpcListenerList(init) {\r\n /** List of listener items */\r\n this.ListenerList = [];\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcListenerList;\r\n}());\r\nexports.VpnRpcListenerList = VpnRpcListenerList;\r\n/** Local Bridge enumeration */\r\nvar VpnRpcEnumLocalBridge = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumLocalBridge' class: Local Bridge enumeration */\r\n function VpnRpcEnumLocalBridge(init) {\r\n /** Local Bridge list */\r\n this.LocalBridgeList = [];\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumLocalBridge;\r\n}());\r\nexports.VpnRpcEnumLocalBridge = VpnRpcEnumLocalBridge;\r\n/** Log file enumeration */\r\nvar VpnRpcEnumLogFileItem = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumLogFileItem' class: Log file enumeration */\r\n function VpnRpcEnumLogFileItem(init) {\r\n /** Server name */\r\n this.ServerName_str = \"\";\r\n /** File path */\r\n this.FilePath_str = \"\";\r\n /** File size */\r\n this.FileSize_u32 = 0;\r\n /** Last write date */\r\n this.UpdatedTime_dt = new Date();\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumLogFileItem;\r\n}());\r\nexports.VpnRpcEnumLogFileItem = VpnRpcEnumLogFileItem;\r\n/** Log file enumeration */\r\nvar VpnRpcEnumLogFile = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumLogFile' class: Log file enumeration */\r\n function VpnRpcEnumLogFile(init) {\r\n /** Log file list */\r\n this.LogFiles = [];\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumLogFile;\r\n}());\r\nexports.VpnRpcEnumLogFile = VpnRpcEnumLogFile;\r\n/** Enumeration items of the MAC table */\r\nvar VpnRpcEnumMacTableItem = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumMacTableItem' class: Enumeration items of the MAC table */\r\n function VpnRpcEnumMacTableItem(init) {\r\n /** Key ID */\r\n this.Key_u32 = 0;\r\n /** Session name */\r\n this.SessionName_str = \"\";\r\n /** MAC address */\r\n this.MacAddress_bin = new Uint8Array([]);\r\n /** Creation date and time */\r\n this.CreatedTime_dt = new Date();\r\n /** Updating date */\r\n this.UpdatedTime_dt = new Date();\r\n /** Remote items */\r\n this.RemoteItem_bool = false;\r\n /** Remote host name */\r\n this.RemoteHostname_str = \"\";\r\n /** VLAN ID */\r\n this.VlanId_u32 = 0;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumMacTableItem;\r\n}());\r\nexports.VpnRpcEnumMacTableItem = VpnRpcEnumMacTableItem;\r\n/** Enumeration of the MAC table */\r\nvar VpnRpcEnumMacTable = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumMacTable' class: Enumeration of the MAC table */\r\n function VpnRpcEnumMacTable(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** MAC table */\r\n this.MacTable = [];\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumMacTable;\r\n}());\r\nexports.VpnRpcEnumMacTable = VpnRpcEnumMacTable;\r\n/** NAT Entry Protocol Number */\r\nvar VpnRpcNatProtocol;\r\n(function (VpnRpcNatProtocol) {\r\n /** TCP */\r\n VpnRpcNatProtocol[VpnRpcNatProtocol[\"TCP\"] = 0] = \"TCP\";\r\n /** UDP */\r\n VpnRpcNatProtocol[VpnRpcNatProtocol[\"UDP\"] = 1] = \"UDP\";\r\n /** DNS */\r\n VpnRpcNatProtocol[VpnRpcNatProtocol[\"DNS\"] = 2] = \"DNS\";\r\n /** ICMP */\r\n VpnRpcNatProtocol[VpnRpcNatProtocol[\"ICMP\"] = 3] = \"ICMP\";\r\n})(VpnRpcNatProtocol = exports.VpnRpcNatProtocol || (exports.VpnRpcNatProtocol = {}));\r\n/** State of NAT session (TCP) */\r\nvar VpnRpcNatTcpState;\r\n(function (VpnRpcNatTcpState) {\r\n /** Connecting */\r\n VpnRpcNatTcpState[VpnRpcNatTcpState[\"Connecting\"] = 0] = \"Connecting\";\r\n /** Send the RST (Connection failure or disconnected) */\r\n VpnRpcNatTcpState[VpnRpcNatTcpState[\"SendReset\"] = 1] = \"SendReset\";\r\n /** Connection complete */\r\n VpnRpcNatTcpState[VpnRpcNatTcpState[\"Connected\"] = 2] = \"Connected\";\r\n /** Connection established */\r\n VpnRpcNatTcpState[VpnRpcNatTcpState[\"Established\"] = 3] = \"Established\";\r\n /** Wait for socket disconnection */\r\n VpnRpcNatTcpState[VpnRpcNatTcpState[\"WaitDisconnect\"] = 4] = \"WaitDisconnect\";\r\n})(VpnRpcNatTcpState = exports.VpnRpcNatTcpState || (exports.VpnRpcNatTcpState = {}));\r\n/** VpnRpcEnumNat List Item */\r\nvar VpnRpcEnumNatItem = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumNatItem' class: VpnRpcEnumNat List Item */\r\n function VpnRpcEnumNatItem(init) {\r\n /** ID */\r\n this.Id_u32 = 0;\r\n /** Protocol */\r\n this.Protocol_u32 = 0;\r\n /** Source IP address */\r\n this.SrcIp_ip = \"\";\r\n /** Source host name */\r\n this.SrcHost_str = \"\";\r\n /** Source port number */\r\n this.SrcPort_u32 = 0;\r\n /** Destination IP address */\r\n this.DestIp_ip = \"\";\r\n /** Destination host name */\r\n this.DestHost_str = \"\";\r\n /** Destination port number */\r\n this.DestPort_u32 = 0;\r\n /** Connection time */\r\n this.CreatedTime_dt = new Date();\r\n /** Last communication time */\r\n this.LastCommTime_dt = new Date();\r\n /** Transmission size */\r\n this.SendSize_u64 = 0;\r\n /** Receive size */\r\n this.RecvSize_u64 = 0;\r\n /** TCP state */\r\n this.TcpStatus_u32 = 0;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumNatItem;\r\n}());\r\nexports.VpnRpcEnumNatItem = VpnRpcEnumNatItem;\r\n/** RPC_ENUM_NAT */\r\nvar VpnRpcEnumNat = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumNat' class: RPC_ENUM_NAT */\r\n function VpnRpcEnumNat(init) {\r\n /** Virtual Hub Name */\r\n this.HubName_str = \"\";\r\n /** NAT item */\r\n this.NatTable = [];\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumNat;\r\n}());\r\nexports.VpnRpcEnumNat = VpnRpcEnumNat;\r\n/** Enumeration item of VPN session */\r\nvar VpnRpcEnumSessionItem = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumSessionItem' class: Enumeration item of VPN session */\r\n function VpnRpcEnumSessionItem(init) {\r\n /** Session name */\r\n this.Name_str = \"\";\r\n /** Remote session */\r\n this.RemoteSession_bool = false;\r\n /** Remote server name */\r\n this.RemoteHostname_str = \"\";\r\n /** User name */\r\n this.Username_str = \"\";\r\n /** IP address */\r\n this.ClientIP_ip = \"\";\r\n /** Host name */\r\n this.Hostname_str = \"\";\r\n /** Maximum number of underlying TCP connections */\r\n this.MaxNumTcp_u32 = 0;\r\n /** Number of current underlying TCP connections */\r\n this.CurrentNumTcp_u32 = 0;\r\n /** Packet size transmitted */\r\n this.PacketSize_u64 = 0;\r\n /** Number of packets transmitted */\r\n this.PacketNum_u64 = 0;\r\n /** Is a Cascade VPN session */\r\n this.LinkMode_bool = false;\r\n /** Is a SecureNAT VPN session */\r\n this.SecureNATMode_bool = false;\r\n /** Is the VPN session for Local Bridge */\r\n this.BridgeMode_bool = false;\r\n /** Is a Layer-3 Switch VPN session */\r\n this.Layer3Mode_bool = false;\r\n /** Is in Bridge Mode */\r\n this.Client_BridgeMode_bool = false;\r\n /** Is in Monitor Mode */\r\n this.Client_MonitorMode_bool = false;\r\n /** VLAN ID */\r\n this.VLanId_u32 = 0;\r\n /** Unique ID of the VPN Session */\r\n this.UniqueId_bin = new Uint8Array([]);\r\n /** Creation date and time */\r\n this.CreatedTime_dt = new Date();\r\n /** Last communication date and time */\r\n this.LastCommTime_dt = new Date();\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumSessionItem;\r\n}());\r\nexports.VpnRpcEnumSessionItem = VpnRpcEnumSessionItem;\r\n/** Enumerate VPN sessions */\r\nvar VpnRpcEnumSession = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumSession' class: Enumerate VPN sessions */\r\n function VpnRpcEnumSession(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** VPN sessions list */\r\n this.SessionList = [];\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumSession;\r\n}());\r\nexports.VpnRpcEnumSession = VpnRpcEnumSession;\r\n/** Enumeration item of user */\r\nvar VpnRpcEnumUserItem = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumUserItem' class: Enumeration item of user */\r\n function VpnRpcEnumUserItem(init) {\r\n /** User name */\r\n this.Name_str = \"\";\r\n /** Group name */\r\n this.GroupName_str = \"\";\r\n /** Real name */\r\n this.Realname_utf = \"\";\r\n /** Note */\r\n this.Note_utf = \"\";\r\n /** Authentication method */\r\n this.AuthType_u32 = 0;\r\n /** Number of logins */\r\n this.NumLogin_u32 = 0;\r\n /** Last login date and time */\r\n this.LastLoginTime_dt = new Date();\r\n /** Access denied */\r\n this.DenyAccess_bool = false;\r\n /** Flag of whether the traffic variable is set */\r\n this.IsTrafficFilled_bool = false;\r\n /** Flag of whether expiration date variable is set */\r\n this.IsExpiresFilled_bool = false;\r\n /** Expiration date */\r\n this.Expires_dt = new Date();\r\n /** Number of broadcast packets (Recv) */\r\n this[\"Ex.Recv.BroadcastBytes_u64\"] = 0;\r\n /** Broadcast bytes (Recv) */\r\n this[\"Ex.Recv.BroadcastCount_u64\"] = 0;\r\n /** Unicast count (Recv) */\r\n this[\"Ex.Recv.UnicastBytes_u64\"] = 0;\r\n /** Unicast bytes (Recv) */\r\n this[\"Ex.Recv.UnicastCount_u64\"] = 0;\r\n /** Number of broadcast packets (Send) */\r\n this[\"Ex.Send.BroadcastBytes_u64\"] = 0;\r\n /** Broadcast bytes (Send) */\r\n this[\"Ex.Send.BroadcastCount_u64\"] = 0;\r\n /** Unicast bytes (Send) */\r\n this[\"Ex.Send.UnicastBytes_u64\"] = 0;\r\n /** Unicast bytes (Send) */\r\n this[\"Ex.Send.UnicastCount_u64\"] = 0;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumUserItem;\r\n}());\r\nexports.VpnRpcEnumUserItem = VpnRpcEnumUserItem;\r\n/** Enumeration of user */\r\nvar VpnRpcEnumUser = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcEnumUser' class: Enumeration of user */\r\n function VpnRpcEnumUser(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** User list */\r\n this.UserList = [];\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcEnumUser;\r\n}());\r\nexports.VpnRpcEnumUser = VpnRpcEnumUser;\r\n/** Source IP Address Limit List Item */\r\nvar VpnAc = /** @class */ (function () {\r\n /** Constructor for the 'VpnAc' class: Source IP Address Limit List Item */\r\n function VpnAc(init) {\r\n /** ID */\r\n this.Id_u32 = 0;\r\n /** Priority */\r\n this.Priority_u32 = 0;\r\n /** Deny access */\r\n this.Deny_bool = false;\r\n /** Set true if you want to specify the SubnetMask_ip item. */\r\n this.Masked_bool = false;\r\n /** IP address */\r\n this.IpAddress_ip = \"\";\r\n /** Subnet mask, valid only if Masked_bool == true */\r\n this.SubnetMask_ip = \"\";\r\n Object.assign(this, init);\r\n }\r\n return VpnAc;\r\n}());\r\nexports.VpnAc = VpnAc;\r\n/** Source IP Address Limit List */\r\nvar VpnRpcAcList = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcAcList' class: Source IP Address Limit List */\r\n function VpnRpcAcList(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** Source IP Address Limit List */\r\n this.ACList = [];\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcAcList;\r\n}());\r\nexports.VpnRpcAcList = VpnRpcAcList;\r\n/** Message */\r\nvar VpnRpcMsg = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcMsg' class: Message */\r\n function VpnRpcMsg(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** Message (Unicode strings acceptable) */\r\n this.Msg_bin = new Uint8Array([]);\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcMsg;\r\n}());\r\nexports.VpnRpcMsg = VpnRpcMsg;\r\n/** Get / Set the Azure state */\r\nvar VpnRpcAzureStatus = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcAzureStatus' class: Get / Set the Azure state */\r\n function VpnRpcAzureStatus(init) {\r\n /** Whether VPN Azure Function is Enabled */\r\n this.IsEnabled_bool = false;\r\n /** Whether connection to VPN Azure Cloud Server is established */\r\n this.IsConnected_bool = false;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcAzureStatus;\r\n}());\r\nexports.VpnRpcAzureStatus = VpnRpcAzureStatus;\r\n/** Local Bridge support information */\r\nvar VpnRpcBridgeSupport = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcBridgeSupport' class: Local Bridge support information */\r\n function VpnRpcBridgeSupport(init) {\r\n /** Whether the OS supports the Local Bridge function */\r\n this.IsBridgeSupportedOs_bool = false;\r\n /** Whether WinPcap is necessary to install */\r\n this.IsWinPcapNeeded_bool = false;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcBridgeSupport;\r\n}());\r\nexports.VpnRpcBridgeSupport = VpnRpcBridgeSupport;\r\n/** Get the CA of HUB */\r\nvar VpnRpcHubGetCA = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcHubGetCA' class: Get the CA of HUB */\r\n function VpnRpcHubGetCA(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** The key id of the certificate */\r\n this.Key_u32 = 0;\r\n /** The body of the X.509 certificate */\r\n this.Cert_bin = new Uint8Array([]);\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcHubGetCA;\r\n}());\r\nexports.VpnRpcHubGetCA = VpnRpcHubGetCA;\r\n/** Caps item of the VPN Server */\r\nvar VpnCaps = /** @class */ (function () {\r\n /** Constructor for the 'VpnCaps' class: Caps item of the VPN Server */\r\n function VpnCaps(init) {\r\n /** Name */\r\n this.CapsName_str = \"\";\r\n /** Value */\r\n this.CapsValue_u32 = 0;\r\n /** Descrption */\r\n this.CapsDescrption_utf = \"\";\r\n Object.assign(this, init);\r\n }\r\n return VpnCaps;\r\n}());\r\nexports.VpnCaps = VpnCaps;\r\n/** Caps list of the VPN Server */\r\nvar VpnCapslist = /** @class */ (function () {\r\n /** Constructor for the 'VpnCapslist' class: Caps list of the VPN Server */\r\n function VpnCapslist(init) {\r\n /** Caps list of the VPN Server */\r\n this.CapsList = [];\r\n Object.assign(this, init);\r\n }\r\n return VpnCapslist;\r\n}());\r\nexports.VpnCapslist = VpnCapslist;\r\n/** Config operation */\r\nvar VpnRpcConfig = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcConfig' class: Config operation */\r\n function VpnRpcConfig(init) {\r\n /** File name (valid only for returning from the server) */\r\n this.FileName_str = \"\";\r\n /** File data */\r\n this.FileData_bin = new Uint8Array([]);\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcConfig;\r\n}());\r\nexports.VpnRpcConfig = VpnRpcConfig;\r\n/** Connection information */\r\nvar VpnRpcConnectionInfo = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcConnectionInfo' class: Connection information */\r\n function VpnRpcConnectionInfo(init) {\r\n /** Connection name */\r\n this.Name_str = \"\";\r\n /** Type */\r\n this.Type_u32 = 0;\r\n /** Host name */\r\n this.Hostname_str = \"\";\r\n /** IP address */\r\n this.Ip_ip = \"\";\r\n /** Port number */\r\n this.Port_u32 = 0;\r\n /** Connected time */\r\n this.ConnectedTime_dt = new Date();\r\n /** Server string */\r\n this.ServerStr_str = \"\";\r\n /** Server version */\r\n this.ServerVer_u32 = 0;\r\n /** Server build number */\r\n this.ServerBuild_u32 = 0;\r\n /** Client string */\r\n this.ClientStr_str = \"\";\r\n /** Client version */\r\n this.ClientVer_u32 = 0;\r\n /** Client build number */\r\n this.ClientBuild_u32 = 0;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcConnectionInfo;\r\n}());\r\nexports.VpnRpcConnectionInfo = VpnRpcConnectionInfo;\r\n/** Proxy type */\r\nvar VpnRpcProxyType;\r\n(function (VpnRpcProxyType) {\r\n /** Direct TCP connection */\r\n VpnRpcProxyType[VpnRpcProxyType[\"Direct\"] = 0] = \"Direct\";\r\n /** Connection via HTTP proxy server */\r\n VpnRpcProxyType[VpnRpcProxyType[\"HTTP\"] = 1] = \"HTTP\";\r\n /** Connection via SOCKS proxy server */\r\n VpnRpcProxyType[VpnRpcProxyType[\"SOCKS\"] = 2] = \"SOCKS\";\r\n})(VpnRpcProxyType = exports.VpnRpcProxyType || (exports.VpnRpcProxyType = {}));\r\n/** The current status of the DDNS */\r\nvar VpnDDnsClientStatus = /** @class */ (function () {\r\n /** Constructor for the 'VpnDDnsClientStatus' class: The current status of the DDNS */\r\n function VpnDDnsClientStatus(init) {\r\n /** Last error code (IPv4) */\r\n this.Err_IPv4_u32 = 0;\r\n /** Last error string (IPv4) */\r\n this.ErrStr_IPv4_utf = \"\";\r\n /** Last error code (IPv6) */\r\n this.Err_IPv6_u32 = 0;\r\n /** Last error string (IPv6) */\r\n this.ErrStr_IPv6_utf = \"\";\r\n /** Current DDNS host name */\r\n this.CurrentHostName_str = \"\";\r\n /** Current FQDN of the DDNS hostname */\r\n this.CurrentFqdn_str = \"\";\r\n /** DDNS suffix */\r\n this.DnsSuffix_str = \"\";\r\n /** Current IPv4 address of the VPN Server */\r\n this.CurrentIPv4_str = \"\";\r\n /** Current IPv6 address of the VPN Server */\r\n this.CurrentIPv6_str = \"\";\r\n Object.assign(this, init);\r\n }\r\n return VpnDDnsClientStatus;\r\n}());\r\nexports.VpnDDnsClientStatus = VpnDDnsClientStatus;\r\n/** Internet connection settings */\r\nvar VpnInternetSetting = /** @class */ (function () {\r\n /** Constructor for the 'VpnInternetSetting' class: Internet connection settings */\r\n function VpnInternetSetting(init) {\r\n /** Type of proxy server */\r\n this.ProxyType_u32 = 0;\r\n /** Proxy server host name */\r\n this.ProxyHostName_str = \"\";\r\n /** Proxy server port number */\r\n this.ProxyPort_u32 = 0;\r\n /** Proxy server user name */\r\n this.ProxyUsername_str = \"\";\r\n /** Proxy server password */\r\n this.ProxyPassword_str = \"\";\r\n Object.assign(this, init);\r\n }\r\n return VpnInternetSetting;\r\n}());\r\nexports.VpnInternetSetting = VpnInternetSetting;\r\n/** Administration options */\r\nvar VpnAdminOption = /** @class */ (function () {\r\n /** Constructor for the 'VpnAdminOption' class: Administration options */\r\n function VpnAdminOption(init) {\r\n /** Name */\r\n this.Name_str = \"\";\r\n /** Data */\r\n this.Value_u32 = 0;\r\n /** Descrption */\r\n this.Descrption_utf = \"\";\r\n Object.assign(this, init);\r\n }\r\n return VpnAdminOption;\r\n}());\r\nexports.VpnAdminOption = VpnAdminOption;\r\n/** Administration options list */\r\nvar VpnRpcAdminOption = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcAdminOption' class: Administration options list */\r\n function VpnRpcAdminOption(init) {\r\n /** Virtual HUB name */\r\n this.HubName_str = \"\";\r\n /** List data */\r\n this.AdminOptionList = [];\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcAdminOption;\r\n}());\r\nexports.VpnRpcAdminOption = VpnRpcAdminOption;\r\n/** Connection state to the controller */\r\nvar VpnRpcFarmConnectionStatus = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcFarmConnectionStatus' class: Connection state to the controller */\r\n function VpnRpcFarmConnectionStatus(init) {\r\n /** IP address */\r\n this.Ip_ip = \"\";\r\n /** Port number */\r\n this.Port_u32 = 0;\r\n /** Online state */\r\n this.Online_bool = false;\r\n /** Last error code */\r\n this.LastError_u32 = 0;\r\n /** Connection start time */\r\n this.StartedTime_dt = new Date();\r\n /** First connection time */\r\n this.FirstConnectedTime_dt = new Date();\r\n /** Connection time of this time */\r\n this.CurrentConnectedTime_dt = new Date();\r\n /** Number of retries */\r\n this.NumTry_u32 = 0;\r\n /** Number of connection count */\r\n this.NumConnected_u32 = 0;\r\n /** Connection failure count */\r\n this.NumFailed_u32 = 0;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcFarmConnectionStatus;\r\n}());\r\nexports.VpnRpcFarmConnectionStatus = VpnRpcFarmConnectionStatus;\r\n/** HUB item of each farm member */\r\nvar VpnRpcFarmHub = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcFarmHub' class: HUB item of each farm member */\r\n function VpnRpcFarmHub(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** Dynamic HUB */\r\n this.DynamicHub_bool = false;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcFarmHub;\r\n}());\r\nexports.VpnRpcFarmHub = VpnRpcFarmHub;\r\n/** Server farm member information acquisition */\r\nvar VpnRpcFarmInfo = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcFarmInfo' class: Server farm member information acquisition */\r\n function VpnRpcFarmInfo(init) {\r\n /** ID */\r\n this.Id_u32 = 0;\r\n /** The flag if the server is Cluster Controller (false: Cluster Member servers) */\r\n this.Controller_bool = false;\r\n /** Connection Established Time */\r\n this.ConnectedTime_dt = new Date();\r\n /** IP address */\r\n this.Ip_ip = \"\";\r\n /** Host name */\r\n this.Hostname_str = \"\";\r\n /** Point */\r\n this.Point_u32 = 0;\r\n /** Number of Public Ports */\r\n this.NumPort_u32 = 0;\r\n /** Public Ports */\r\n this.Ports_u32 = [];\r\n /** Server certificate */\r\n this.ServerCert_bin = new Uint8Array([]);\r\n /** Number of farm HUB */\r\n this.NumFarmHub_u32 = 0;\r\n /** The hosted Virtual Hub list */\r\n this.HubsList = [];\r\n /** Number of hosted VPN sessions */\r\n this.NumSessions_u32 = 0;\r\n /** Number of TCP connections */\r\n this.NumTcpConnections_u32 = 0;\r\n /** Performance Standard Ratio */\r\n this.Weight_u32 = 0;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcFarmInfo;\r\n}());\r\nexports.VpnRpcFarmInfo = VpnRpcFarmInfo;\r\n/** Server farm configuration */\r\nvar VpnRpcFarm = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcFarm' class: Server farm configuration */\r\n function VpnRpcFarm(init) {\r\n /** Type of server */\r\n this.ServerType_u32 = 0;\r\n /** Valid only for Cluster Member servers. Number of the Ports_u32 element. */\r\n this.NumPort_u32 = 0;\r\n /** 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. */\r\n this.Ports_u32 = [];\r\n /** 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. */\r\n this.PublicIp_ip = \"\";\r\n /** Valid only for Cluster Member servers. Specify the host name or IP address of the destination cluster controller. */\r\n this.ControllerName_str = \"\";\r\n /** Valid only for Cluster Member servers. Specify the TCP port number of the destination cluster controller. */\r\n this.ControllerPort_u32 = 0;\r\n /** 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. */\r\n this.MemberPasswordPlaintext_str = \"\";\r\n /** 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. */\r\n this.Weight_u32 = 0;\r\n /** 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. */\r\n this.ControllerOnly_bool = false;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcFarm;\r\n}());\r\nexports.VpnRpcFarm = VpnRpcFarm;\r\n/** Log switch type */\r\nvar VpnRpcLogSwitchType;\r\n(function (VpnRpcLogSwitchType) {\r\n /** No switching */\r\n VpnRpcLogSwitchType[VpnRpcLogSwitchType[\"No\"] = 0] = \"No\";\r\n /** Secondly basis */\r\n VpnRpcLogSwitchType[VpnRpcLogSwitchType[\"Second\"] = 1] = \"Second\";\r\n /** Minutely basis */\r\n VpnRpcLogSwitchType[VpnRpcLogSwitchType[\"Minute\"] = 2] = \"Minute\";\r\n /** Hourly basis */\r\n VpnRpcLogSwitchType[VpnRpcLogSwitchType[\"Hour\"] = 3] = \"Hour\";\r\n /** Daily basis */\r\n VpnRpcLogSwitchType[VpnRpcLogSwitchType[\"Day\"] = 4] = \"Day\";\r\n /** Monthly basis */\r\n VpnRpcLogSwitchType[VpnRpcLogSwitchType[\"Month\"] = 5] = \"Month\";\r\n})(VpnRpcLogSwitchType = exports.VpnRpcLogSwitchType || (exports.VpnRpcLogSwitchType = {}));\r\n/** Packet log settings */\r\nvar VpnRpcPacketLogSetting;\r\n(function (VpnRpcPacketLogSetting) {\r\n /** Not save */\r\n VpnRpcPacketLogSetting[VpnRpcPacketLogSetting[\"None\"] = 0] = \"None\";\r\n /** Only header */\r\n VpnRpcPacketLogSetting[VpnRpcPacketLogSetting[\"Header\"] = 1] = \"Header\";\r\n /** All payloads */\r\n VpnRpcPacketLogSetting[VpnRpcPacketLogSetting[\"All\"] = 2] = \"All\";\r\n})(VpnRpcPacketLogSetting = exports.VpnRpcPacketLogSetting || (exports.VpnRpcPacketLogSetting = {}));\r\n/** Packet log settings array index */\r\nvar VpnRpcPacketLogSettingIndex;\r\n(function (VpnRpcPacketLogSettingIndex) {\r\n /** TCP connection log */\r\n VpnRpcPacketLogSettingIndex[VpnRpcPacketLogSettingIndex[\"TcpConnection\"] = 0] = \"TcpConnection\";\r\n /** TCP packet log */\r\n VpnRpcPacketLogSettingIndex[VpnRpcPacketLogSettingIndex[\"TcpAll\"] = 1] = \"TcpAll\";\r\n /** DHCP Log */\r\n VpnRpcPacketLogSettingIndex[VpnRpcPacketLogSettingIndex[\"Dhcp\"] = 2] = \"Dhcp\";\r\n /** UDP log */\r\n VpnRpcPacketLogSettingIndex[VpnRpcPacketLogSettingIndex[\"Udp\"] = 3] = \"Udp\";\r\n /** ICMP log */\r\n VpnRpcPacketLogSettingIndex[VpnRpcPacketLogSettingIndex[\"Icmp\"] = 4] = \"Icmp\";\r\n /** IP log */\r\n VpnRpcPacketLogSettingIndex[VpnRpcPacketLogSettingIndex[\"Ip\"] = 5] = \"Ip\";\r\n /** ARP log */\r\n VpnRpcPacketLogSettingIndex[VpnRpcPacketLogSettingIndex[\"Arp\"] = 6] = \"Arp\";\r\n /** Ethernet log */\r\n VpnRpcPacketLogSettingIndex[VpnRpcPacketLogSettingIndex[\"Ethernet\"] = 7] = \"Ethernet\";\r\n})(VpnRpcPacketLogSettingIndex = exports.VpnRpcPacketLogSettingIndex || (exports.VpnRpcPacketLogSettingIndex = {}));\r\n/** HUB log settings */\r\nvar VpnRpcHubLog = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcHubLog' class: HUB log settings */\r\n function VpnRpcHubLog(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** The flag to enable / disable saving the security log */\r\n this.SaveSecurityLog_bool = false;\r\n /** The log filename switching setting of the security log */\r\n this.SecurityLogSwitchType_u32 = 0;\r\n /** The flag to enable / disable saving the security log */\r\n this.SavePacketLog_bool = false;\r\n /** The log filename switching settings of the packet logs */\r\n this.PacketLogSwitchType_u32 = 0;\r\n /** 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. */\r\n this.PacketLogConfig_u32 = [];\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcHubLog;\r\n}());\r\nexports.VpnRpcHubLog = VpnRpcHubLog;\r\n/** RADIUS server options */\r\nvar VpnRpcRadius = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcRadius' class: RADIUS server options */\r\n function VpnRpcRadius(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** RADIUS server name */\r\n this.RadiusServerName_str = \"\";\r\n /** RADIUS port number */\r\n this.RadiusPort_u32 = 0;\r\n /** Secret key */\r\n this.RadiusSecret_str = \"\";\r\n /** Radius retry interval */\r\n this.RadiusRetryInterval_u32 = 0;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcRadius;\r\n}());\r\nexports.VpnRpcRadius = VpnRpcRadius;\r\n/** Get the state HUB */\r\nvar VpnRpcHubStatus = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcHubStatus' class: Get the state HUB */\r\n function VpnRpcHubStatus(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** Online */\r\n this.Online_bool = false;\r\n /** Type of HUB */\r\n this.HubType_u32 = 0;\r\n /** Number of sessions */\r\n this.NumSessions_u32 = 0;\r\n /** Number of sessions (client mode) */\r\n this.NumSessionsClient_u32 = 0;\r\n /** Number of sessions (bridge mode) */\r\n this.NumSessionsBridge_u32 = 0;\r\n /** Number of Access list entries */\r\n this.NumAccessLists_u32 = 0;\r\n /** Number of users */\r\n this.NumUsers_u32 = 0;\r\n /** Number of groups */\r\n this.NumGroups_u32 = 0;\r\n /** Number of MAC table entries */\r\n this.NumMacTables_u32 = 0;\r\n /** Number of IP table entries */\r\n this.NumIpTables_u32 = 0;\r\n /** Number of broadcast packets (Recv) */\r\n this[\"Recv.BroadcastBytes_u64\"] = 0;\r\n /** Broadcast bytes (Recv) */\r\n this[\"Recv.BroadcastCount_u64\"] = 0;\r\n /** Unicast count (Recv) */\r\n this[\"Recv.UnicastBytes_u64\"] = 0;\r\n /** Unicast bytes (Recv) */\r\n this[\"Recv.UnicastCount_u64\"] = 0;\r\n /** Number of broadcast packets (Send) */\r\n this[\"Send.BroadcastBytes_u64\"] = 0;\r\n /** Broadcast bytes (Send) */\r\n this[\"Send.BroadcastCount_u64\"] = 0;\r\n /** Unicast bytes (Send) */\r\n this[\"Send.UnicastBytes_u64\"] = 0;\r\n /** Unicast bytes (Send) */\r\n this[\"Send.UnicastCount_u64\"] = 0;\r\n /** Whether SecureNAT is enabled */\r\n this.SecureNATEnabled_bool = false;\r\n /** Last communication date and time */\r\n this.LastCommTime_dt = new Date();\r\n /** Last login date and time */\r\n this.LastLoginTime_dt = new Date();\r\n /** Creation date and time */\r\n this.CreatedTime_dt = new Date();\r\n /** Number of logins */\r\n this.NumLogin_u32 = 0;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcHubStatus;\r\n}());\r\nexports.VpnRpcHubStatus = VpnRpcHubStatus;\r\n/** List of services provided by IPsec server */\r\nvar VpnIPsecServices = /** @class */ (function () {\r\n /** Constructor for the 'VpnIPsecServices' class: List of services provided by IPsec server */\r\n function VpnIPsecServices(init) {\r\n /** Enable or Disable the L2TP Server Function (Raw L2TP with No Encryptions). To accept special VPN clients, enable this option. */\r\n this.L2TP_Raw_bool = false;\r\n /** 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. */\r\n this.L2TP_IPsec_bool = false;\r\n /** 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. */\r\n this.EtherIP_IPsec_bool = false;\r\n /** Specify the IPsec Pre-Shared Key. An IPsec Pre-Shared Key is also called as \"PSK\" or \"secret\". 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. */\r\n this.IPsec_Secret_str = \"\";\r\n /** Specify the default Virtual HUB in a case of omitting the name of HUB on the Username. Users should specify their username such as \"Username@Target Virtual HUB Name\" to connect this L2TP Server. If the designation of the Virtual Hub is omitted, the above HUB will be used as the target. */\r\n this.L2TP_DefaultHub_str = \"\";\r\n Object.assign(this, init);\r\n }\r\n return VpnIPsecServices;\r\n}());\r\nexports.VpnIPsecServices = VpnIPsecServices;\r\n/** Keep alive protocol */\r\nvar VpnRpcKeepAliveProtocol;\r\n(function (VpnRpcKeepAliveProtocol) {\r\n /** TCP */\r\n VpnRpcKeepAliveProtocol[VpnRpcKeepAliveProtocol[\"TCP\"] = 0] = \"TCP\";\r\n /** UDP */\r\n VpnRpcKeepAliveProtocol[VpnRpcKeepAliveProtocol[\"UDP\"] = 1] = \"UDP\";\r\n})(VpnRpcKeepAliveProtocol = exports.VpnRpcKeepAliveProtocol || (exports.VpnRpcKeepAliveProtocol = {}));\r\n/** Keep Alive settings */\r\nvar VpnRpcKeep = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcKeep' class: Keep Alive settings */\r\n function VpnRpcKeep(init) {\r\n /** The flag to enable keep-alive to the Internet */\r\n this.UseKeepConnect_bool = false;\r\n /** Specify the host name or IP address of the destination */\r\n this.KeepConnectHost_str = \"\";\r\n /** Specify the port number of the destination */\r\n this.KeepConnectPort_u32 = 0;\r\n /** Protocol type */\r\n this.KeepConnectProtocol_u32 = 0;\r\n /** Interval Between Packets Sends (Seconds) */\r\n this.KeepConnectInterval_u32 = 0;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcKeep;\r\n}());\r\nexports.VpnRpcKeep = VpnRpcKeep;\r\n/** State of the client session */\r\nvar VpnRpcClientSessionStatus;\r\n(function (VpnRpcClientSessionStatus) {\r\n /** Connecting */\r\n VpnRpcClientSessionStatus[VpnRpcClientSessionStatus[\"Connecting\"] = 0] = \"Connecting\";\r\n /** Negotiating */\r\n VpnRpcClientSessionStatus[VpnRpcClientSessionStatus[\"Negotiation\"] = 1] = \"Negotiation\";\r\n /** During user authentication */\r\n VpnRpcClientSessionStatus[VpnRpcClientSessionStatus[\"Auth\"] = 2] = \"Auth\";\r\n /** Connection complete */\r\n VpnRpcClientSessionStatus[VpnRpcClientSessionStatus[\"Established\"] = 3] = \"Established\";\r\n /** Wait to retry */\r\n VpnRpcClientSessionStatus[VpnRpcClientSessionStatus[\"Retry\"] = 4] = \"Retry\";\r\n /** Idle state */\r\n VpnRpcClientSessionStatus[VpnRpcClientSessionStatus[\"Idle\"] = 5] = \"Idle\";\r\n})(VpnRpcClientSessionStatus = exports.VpnRpcClientSessionStatus || (exports.VpnRpcClientSessionStatus = {}));\r\n/** Get the link state */\r\nvar VpnRpcLinkStatus = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcLinkStatus' class: Get the link state */\r\n function VpnRpcLinkStatus(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_Ex_str = \"\";\r\n /** The name of the cascade connection */\r\n this.AccountName_utf = \"\";\r\n /** The flag whether the cascade connection is enabled */\r\n this.Active_bool = false;\r\n /** The flag whether the cascade connection is established */\r\n this.Connected_bool = false;\r\n /** The session status */\r\n this.SessionStatus_u32 = 0;\r\n /** The destination VPN server name */\r\n this.ServerName_str = \"\";\r\n /** The port number of the server */\r\n this.ServerPort_u32 = 0;\r\n /** Server product name */\r\n this.ServerProductName_str = \"\";\r\n /** Server product version */\r\n this.ServerProductVer_u32 = 0;\r\n /** Server product build number */\r\n this.ServerProductBuild_u32 = 0;\r\n /** Server's X.509 certificate */\r\n this.ServerX_bin = new Uint8Array([]);\r\n /** Client certificate */\r\n this.ClientX_bin = new Uint8Array([]);\r\n /** Connection start time */\r\n this.StartTime_dt = new Date();\r\n /** Connection completion time of the first connection */\r\n this.FirstConnectionEstablisiedTime_dt = new Date();\r\n /** Connection completion time of this connection */\r\n this.CurrentConnectionEstablishTime_dt = new Date();\r\n /** Number of connections have been established so far */\r\n this.NumConnectionsEatablished_u32 = 0;\r\n /** Half-connection */\r\n this.HalfConnection_bool = false;\r\n /** VoIP / QoS */\r\n this.QoS_bool = false;\r\n /** Maximum number of the underlying TCP connections */\r\n this.MaxTcpConnections_u32 = 0;\r\n /** Number of current underlying TCP connections */\r\n this.NumTcpConnections_u32 = 0;\r\n /** Number of underlying inbound TCP connections */\r\n this.NumTcpConnectionsUpload_u32 = 0;\r\n /** Number of underlying outbound TCP connections */\r\n this.NumTcpConnectionsDownload_u32 = 0;\r\n /** Use of encryption */\r\n this.UseEncrypt_bool = false;\r\n /** Cipher algorithm name */\r\n this.CipherName_str = \"\";\r\n /** Use of compression */\r\n this.UseCompress_bool = false;\r\n /** The flag whether this is a R-UDP session */\r\n this.IsRUDPSession_bool = false;\r\n /** Underlying physical communication protocol */\r\n this.UnderlayProtocol_str = \"\";\r\n /** The UDP acceleration is enabled */\r\n this.IsUdpAccelerationEnabled_bool = false;\r\n /** The UDP acceleration is being actually used */\r\n this.IsUsingUdpAcceleration_bool = false;\r\n /** Session name */\r\n this.SessionName_str = \"\";\r\n /** Connection name */\r\n this.ConnectionName_str = \"\";\r\n /** Session key */\r\n this.SessionKey_bin = new Uint8Array([]);\r\n /** Total transmitted data size */\r\n this.TotalSendSize_u64 = 0;\r\n /** Total received data size */\r\n this.TotalRecvSize_u64 = 0;\r\n /** Total transmitted data size (no compression) */\r\n this.TotalSendSizeReal_u64 = 0;\r\n /** Total received data size (no compression) */\r\n this.TotalRecvSizeReal_u64 = 0;\r\n /** The flag whether the VPN session is Bridge Mode */\r\n this.IsBridgeMode_bool = false;\r\n /** The flag whether the VPN session is Monitor mode */\r\n this.IsMonitorMode_bool = false;\r\n /** VLAN ID */\r\n this.VLanId_u32 = 0;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcLinkStatus;\r\n}());\r\nexports.VpnRpcLinkStatus = VpnRpcLinkStatus;\r\n/** Setting of SSTP and OpenVPN */\r\nvar VpnOpenVpnSstpConfig = /** @class */ (function () {\r\n /** Constructor for the 'VpnOpenVpnSstpConfig' class: Setting of SSTP and OpenVPN */\r\n function VpnOpenVpnSstpConfig(init) {\r\n /** Specify true to enable the OpenVPN Clone Server Function. Specify false to disable. */\r\n this.EnableOpenVPN_bool = false;\r\n /** Specify UDP ports to listen for OpenVPN. Multiple UDP ports can be specified with splitting by space or comma letters, for example: \"1194, 2001, 2010, 2012\". The default port for OpenVPN is UDP 1194. You can specify any other UDP ports. */\r\n this.OpenVPNPortList_str = \"\";\r\n /** pecify true to enable the Microsoft SSTP VPN Clone Server Function. Specify false to disable. */\r\n this.EnableSSTP_bool = false;\r\n Object.assign(this, init);\r\n }\r\n return VpnOpenVpnSstpConfig;\r\n}());\r\nexports.VpnOpenVpnSstpConfig = VpnOpenVpnSstpConfig;\r\n/** Virtual host option */\r\nvar VpnVhOption = /** @class */ (function () {\r\n /** Constructor for the 'VpnVhOption' class: Virtual host option */\r\n function VpnVhOption(init) {\r\n /** Target Virtual HUB name */\r\n this.RpcHubName_str = \"\";\r\n /** MAC address */\r\n this.MacAddress_bin = new Uint8Array([]);\r\n /** IP address */\r\n this.Ip_ip = \"\";\r\n /** Subnet mask */\r\n this.Mask_ip = \"\";\r\n /** Use flag of the Virtual NAT function */\r\n this.UseNat_bool = false;\r\n /** MTU value (Standard: 1500) */\r\n this.Mtu_u32 = 0;\r\n /** NAT TCP timeout in seconds */\r\n this.NatTcpTimeout_u32 = 0;\r\n /** NAT UDP timeout in seconds */\r\n this.NatUdpTimeout_u32 = 0;\r\n /** Using flag of DHCP function */\r\n this.UseDhcp_bool = false;\r\n /** Specify the start point of the address band to be distributed to the client. (Example: 192.168.30.10) */\r\n this.DhcpLeaseIPStart_ip = \"\";\r\n /** Specify the end point of the address band to be distributed to the client. (Example: 192.168.30.200) */\r\n this.DhcpLeaseIPEnd_ip = \"\";\r\n /** Specify the subnet mask to be specified for the client. (Example: 255.255.255.0) */\r\n this.DhcpSubnetMask_ip = \"\";\r\n /** Specify the expiration date in second units for leasing an IP address to a client. */\r\n this.DhcpExpireTimeSpan_u32 = 0;\r\n /** 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. */\r\n this.DhcpGatewayAddress_ip = \"\";\r\n /** 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. */\r\n this.DhcpDnsServerAddress_ip = \"\";\r\n /** 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. */\r\n this.DhcpDnsServerAddress2_ip = \"\";\r\n /** 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. */\r\n this.DhcpDomainName_str = \"\";\r\n /** 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. */\r\n this.SaveLog_bool = false;\r\n /** The flag to enable the DhcpPushRoutes_str field. */\r\n this.ApplyDhcpPushRoutes_bool = false;\r\n /** Specify the static routing table to push. Example: \"192.168.5.0/255.255.255.0/192.168.4.254, 10.0.0.0/255.0.0.0/192.168.4.253\" Split multiple entries (maximum: 64 entries) by comma or space characters. Each entry must be specified in the \"IP network address/subnet mask/gateway IP address\" 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. */\r\n this.DhcpPushRoutes_str = \"\";\r\n Object.assign(this, init);\r\n }\r\n return VpnVhOption;\r\n}());\r\nexports.VpnVhOption = VpnVhOption;\r\n/** RPC_NAT_STATUS */\r\nvar VpnRpcNatStatus = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcNatStatus' class: RPC_NAT_STATUS */\r\n function VpnRpcNatStatus(init) {\r\n /** Virtual Hub Name */\r\n this.HubName_str = \"\";\r\n /** Number of TCP sessions */\r\n this.NumTcpSessions_u32 = 0;\r\n /** Ntmber of UDP sessions */\r\n this.NumUdpSessions_u32 = 0;\r\n /** Nymber of ICMP sessions */\r\n this.NumIcmpSessions_u32 = 0;\r\n /** Number of DNS sessions */\r\n this.NumDnsSessions_u32 = 0;\r\n /** Number of DHCP clients */\r\n this.NumDhcpClients_u32 = 0;\r\n /** Whether the NAT is operating in the Kernel Mode */\r\n this.IsKernelMode_bool = false;\r\n /** Whether the NAT is operating in the Raw IP Mode */\r\n this.IsRawIpMode_bool = false;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcNatStatus;\r\n}());\r\nexports.VpnRpcNatStatus = VpnRpcNatStatus;\r\n/** Key pair */\r\nvar VpnRpcKeyPair = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcKeyPair' class: Key pair */\r\n function VpnRpcKeyPair(init) {\r\n /** The body of the certificate */\r\n this.Cert_bin = new Uint8Array([]);\r\n /** The body of the private key */\r\n this.Key_bin = new Uint8Array([]);\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcKeyPair;\r\n}());\r\nexports.VpnRpcKeyPair = VpnRpcKeyPair;\r\n/** Single string value */\r\nvar VpnRpcStr = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcStr' class: Single string value */\r\n function VpnRpcStr(init) {\r\n /** A string value */\r\n this.String_str = \"\";\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcStr;\r\n}());\r\nexports.VpnRpcStr = VpnRpcStr;\r\n/** Type of VPN Server */\r\nvar VpnRpcServerType;\r\n(function (VpnRpcServerType) {\r\n /** Stand-alone server */\r\n VpnRpcServerType[VpnRpcServerType[\"Standalone\"] = 0] = \"Standalone\";\r\n /** Farm controller server */\r\n VpnRpcServerType[VpnRpcServerType[\"FarmController\"] = 1] = \"FarmController\";\r\n /** Farm member server */\r\n VpnRpcServerType[VpnRpcServerType[\"FarmMember\"] = 2] = \"FarmMember\";\r\n})(VpnRpcServerType = exports.VpnRpcServerType || (exports.VpnRpcServerType = {}));\r\n/** Operating system type */\r\nvar VpnRpcOsType;\r\n(function (VpnRpcOsType) {\r\n /** Windows 95 */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_95\"] = 1100] = \"WINDOWS_95\";\r\n /** Windows 98 */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_98\"] = 1200] = \"WINDOWS_98\";\r\n /** Windows Me */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_ME\"] = 1300] = \"WINDOWS_ME\";\r\n /** Windows (unknown) */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_UNKNOWN\"] = 1400] = \"WINDOWS_UNKNOWN\";\r\n /** Windows NT 4.0 Workstation */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_NT_4_WORKSTATION\"] = 2100] = \"WINDOWS_NT_4_WORKSTATION\";\r\n /** Windows NT 4.0 Server */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_NT_4_SERVER\"] = 2110] = \"WINDOWS_NT_4_SERVER\";\r\n /** Windows NT 4.0 Server, Enterprise Edition */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_NT_4_SERVER_ENTERPRISE\"] = 2111] = \"WINDOWS_NT_4_SERVER_ENTERPRISE\";\r\n /** Windows NT 4.0 Terminal Server */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_NT_4_TERMINAL_SERVER\"] = 2112] = \"WINDOWS_NT_4_TERMINAL_SERVER\";\r\n /** BackOffice Server 4.5 */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_NT_4_BACKOFFICE\"] = 2113] = \"WINDOWS_NT_4_BACKOFFICE\";\r\n /** Small Business Server 4.5 */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_NT_4_SMS\"] = 2114] = \"WINDOWS_NT_4_SMS\";\r\n /** Windows 2000 Professional */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_2000_PROFESSIONAL\"] = 2200] = \"WINDOWS_2000_PROFESSIONAL\";\r\n /** Windows 2000 Server */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_2000_SERVER\"] = 2211] = \"WINDOWS_2000_SERVER\";\r\n /** Windows 2000 Advanced Server */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_2000_ADVANCED_SERVER\"] = 2212] = \"WINDOWS_2000_ADVANCED_SERVER\";\r\n /** Windows 2000 Datacenter Server */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_2000_DATACENTER_SERVER\"] = 2213] = \"WINDOWS_2000_DATACENTER_SERVER\";\r\n /** BackOffice Server 2000 */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_2000_BACKOFFICE\"] = 2214] = \"WINDOWS_2000_BACKOFFICE\";\r\n /** Small Business Server 2000 */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_2000_SBS\"] = 2215] = \"WINDOWS_2000_SBS\";\r\n /** Windows XP Home Edition */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_XP_HOME\"] = 2300] = \"WINDOWS_XP_HOME\";\r\n /** Windows XP Professional */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_XP_PROFESSIONAL\"] = 2301] = \"WINDOWS_XP_PROFESSIONAL\";\r\n /** Windows Server 2003 Web Edition */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_2003_WEB\"] = 2410] = \"WINDOWS_2003_WEB\";\r\n /** Windows Server 2003 Standard Edition */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_2003_STANDARD\"] = 2411] = \"WINDOWS_2003_STANDARD\";\r\n /** Windows Server 2003 Enterprise Edition */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_2003_ENTERPRISE\"] = 2412] = \"WINDOWS_2003_ENTERPRISE\";\r\n /** Windows Server 2003 DataCenter Edition */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_2003_DATACENTER\"] = 2413] = \"WINDOWS_2003_DATACENTER\";\r\n /** BackOffice Server 2003 */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_2003_BACKOFFICE\"] = 2414] = \"WINDOWS_2003_BACKOFFICE\";\r\n /** Small Business Server 2003 */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_2003_SBS\"] = 2415] = \"WINDOWS_2003_SBS\";\r\n /** Windows Vista */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_LONGHORN_PROFESSIONAL\"] = 2500] = \"WINDOWS_LONGHORN_PROFESSIONAL\";\r\n /** Windows Server 2008 */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_LONGHORN_SERVER\"] = 2510] = \"WINDOWS_LONGHORN_SERVER\";\r\n /** Windows 7 */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_7\"] = 2600] = \"WINDOWS_7\";\r\n /** Windows Server 2008 R2 */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_SERVER_2008_R2\"] = 2610] = \"WINDOWS_SERVER_2008_R2\";\r\n /** Windows 8 */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_8\"] = 2700] = \"WINDOWS_8\";\r\n /** Windows Server 2012 */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_SERVER_8\"] = 2710] = \"WINDOWS_SERVER_8\";\r\n /** Windows 8.1 */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_81\"] = 2701] = \"WINDOWS_81\";\r\n /** Windows Server 2012 R2 */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_SERVER_81\"] = 2711] = \"WINDOWS_SERVER_81\";\r\n /** Windows 10 */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_10\"] = 2702] = \"WINDOWS_10\";\r\n /** Windows Server 10 */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_SERVER_10\"] = 2712] = \"WINDOWS_SERVER_10\";\r\n /** Windows 11 or later */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_11\"] = 2800] = \"WINDOWS_11\";\r\n /** Windows Server 11 or later */\r\n VpnRpcOsType[VpnRpcOsType[\"WINDOWS_SERVER_11\"] = 2810] = \"WINDOWS_SERVER_11\";\r\n /** Unknown UNIX */\r\n VpnRpcOsType[VpnRpcOsType[\"UNIX_UNKNOWN\"] = 3000] = \"UNIX_UNKNOWN\";\r\n /** Linux */\r\n VpnRpcOsType[VpnRpcOsType[\"LINUX\"] = 3100] = \"LINUX\";\r\n /** Solaris */\r\n VpnRpcOsType[VpnRpcOsType[\"SOLARIS\"] = 3200] = \"SOLARIS\";\r\n /** Cygwin */\r\n VpnRpcOsType[VpnRpcOsType[\"CYGWIN\"] = 3300] = \"CYGWIN\";\r\n /** BSD */\r\n VpnRpcOsType[VpnRpcOsType[\"BSD\"] = 3400] = \"BSD\";\r\n /** MacOS X */\r\n VpnRpcOsType[VpnRpcOsType[\"MACOS_X\"] = 3500] = \"MACOS_X\";\r\n})(VpnRpcOsType = exports.VpnRpcOsType || (exports.VpnRpcOsType = {}));\r\n/** VPN Server Information */\r\nvar VpnRpcServerInfo = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcServerInfo' class: VPN Server Information */\r\n function VpnRpcServerInfo(init) {\r\n /** Server product name */\r\n this.ServerProductName_str = \"\";\r\n /** Server version string */\r\n this.ServerVersionString_str = \"\";\r\n /** Server build information string */\r\n this.ServerBuildInfoString_str = \"\";\r\n /** Server version integer value */\r\n this.ServerVerInt_u32 = 0;\r\n /** Server build number integer value */\r\n this.ServerBuildInt_u32 = 0;\r\n /** Server host name */\r\n this.ServerHostName_str = \"\";\r\n /** Type of server */\r\n this.ServerType_u32 = 0;\r\n /** Build date and time of the server */\r\n this.ServerBuildDate_dt = new Date();\r\n /** Family name */\r\n this.ServerFamilyName_str = \"\";\r\n /** OS type */\r\n this.OsType_u32 = 0;\r\n /** Service pack number */\r\n this.OsServicePack_u32 = 0;\r\n /** OS system name */\r\n this.OsSystemName_str = \"\";\r\n /** OS product name */\r\n this.OsProductName_str = \"\";\r\n /** OS vendor name */\r\n this.OsVendorName_str = \"\";\r\n /** OS version */\r\n this.OsVersion_str = \"\";\r\n /** Kernel name */\r\n this.KernelName_str = \"\";\r\n /** Kernel version */\r\n this.KernelVersion_str = \"\";\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcServerInfo;\r\n}());\r\nexports.VpnRpcServerInfo = VpnRpcServerInfo;\r\n/** Server status */\r\nvar VpnRpcServerStatus = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcServerStatus' class: Server status */\r\n function VpnRpcServerStatus(init) {\r\n /** Type of server */\r\n this.ServerType_u32 = 0;\r\n /** Total number of TCP connections */\r\n this.NumTcpConnections_u32 = 0;\r\n /** Number of Local TCP connections */\r\n this.NumTcpConnectionsLocal_u32 = 0;\r\n /** Number of remote TCP connections */\r\n this.NumTcpConnectionsRemote_u32 = 0;\r\n /** Total number of HUBs */\r\n this.NumHubTotal_u32 = 0;\r\n /** Nymber of stand-alone HUB */\r\n this.NumHubStandalone_u32 = 0;\r\n /** Number of static HUBs */\r\n this.NumHubStatic_u32 = 0;\r\n /** Number of Dynamic HUBs */\r\n this.NumHubDynamic_u32 = 0;\r\n /** Total number of sessions */\r\n this.NumSessionsTotal_u32 = 0;\r\n /** Number of local VPN sessions */\r\n this.NumSessionsLocal_u32 = 0;\r\n /** The number of remote sessions */\r\n this.NumSessionsRemote_u32 = 0;\r\n /** Number of MAC table entries (total sum of all Virtual Hubs) */\r\n this.NumMacTables_u32 = 0;\r\n /** Number of IP table entries (total sum of all Virtual Hubs) */\r\n this.NumIpTables_u32 = 0;\r\n /** Number of users (total sum of all Virtual Hubs) */\r\n this.NumUsers_u32 = 0;\r\n /** Number of groups (total sum of all Virtual Hubs) */\r\n this.NumGroups_u32 = 0;\r\n /** Number of assigned bridge licenses (Useful to make a commercial version) */\r\n this.AssignedBridgeLicenses_u32 = 0;\r\n /** Number of assigned client licenses (Useful to make a commercial version) */\r\n this.AssignedClientLicenses_u32 = 0;\r\n /** Number of Assigned bridge license (cluster-wide), useful to make a commercial version */\r\n this.AssignedBridgeLicensesTotal_u32 = 0;\r\n /** Number of assigned client licenses (cluster-wide), useful to make a commercial version */\r\n this.AssignedClientLicensesTotal_u32 = 0;\r\n /** Number of broadcast packets (Recv) */\r\n this[\"Recv.BroadcastBytes_u64\"] = 0;\r\n /** Broadcast bytes (Recv) */\r\n this[\"Recv.BroadcastCount_u64\"] = 0;\r\n /** Unicast count (Recv) */\r\n this[\"Recv.UnicastBytes_u64\"] = 0;\r\n /** Unicast bytes (Recv) */\r\n this[\"Recv.UnicastCount_u64\"] = 0;\r\n /** Number of broadcast packets (Send) */\r\n this[\"Send.BroadcastBytes_u64\"] = 0;\r\n /** Broadcast bytes (Send) */\r\n this[\"Send.BroadcastCount_u64\"] = 0;\r\n /** Unicast bytes (Send) */\r\n this[\"Send.UnicastBytes_u64\"] = 0;\r\n /** Unicast bytes (Send) */\r\n this[\"Send.UnicastCount_u64\"] = 0;\r\n /** Current time */\r\n this.CurrentTime_dt = new Date();\r\n /** 64 bit High-Precision Logical System Clock */\r\n this.CurrentTick_u64 = 0;\r\n /** VPN Server Start-up time */\r\n this.StartTime_dt = new Date();\r\n /** Memory information: Total Memory */\r\n this.TotalMemory_u64 = 0;\r\n /** Memory information: Used Memory */\r\n this.UsedMemory_u64 = 0;\r\n /** Memory information: Free Memory */\r\n this.FreeMemory_u64 = 0;\r\n /** Memory information: Total Phys */\r\n this.TotalPhys_u64 = 0;\r\n /** Memory information: Used Phys */\r\n this.UsedPhys_u64 = 0;\r\n /** Memory information: Free Phys */\r\n this.FreePhys_u64 = 0;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcServerStatus;\r\n}());\r\nexports.VpnRpcServerStatus = VpnRpcServerStatus;\r\n/** VPN Session status */\r\nvar VpnRpcSessionStatus = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcSessionStatus' class: VPN Session status */\r\n function VpnRpcSessionStatus(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** VPN session name */\r\n this.Name_str = \"\";\r\n /** User name */\r\n this.Username_str = \"\";\r\n /** Real user name which was used for the authentication */\r\n this.RealUsername_str = \"\";\r\n /** Group name */\r\n this.GroupName_str = \"\";\r\n /** Is Cascade Session */\r\n this.LinkMode_bool = false;\r\n /** Client IP address */\r\n this.Client_Ip_Address_ip = \"\";\r\n /** Client host name */\r\n this.SessionStatus_ClientHostName_str = \"\";\r\n /** Operation flag */\r\n this.Active_bool = false;\r\n /** Connected flag */\r\n this.Connected_bool = false;\r\n /** State of the client session */\r\n this.SessionStatus_u32 = 0;\r\n /** Server name */\r\n this.ServerName_str = \"\";\r\n /** Port number of the server */\r\n this.ServerPort_u32 = 0;\r\n /** Server product name */\r\n this.ServerProductName_str = \"\";\r\n /** Server product version */\r\n this.ServerProductVer_u32 = 0;\r\n /** Server product build number */\r\n this.ServerProductBuild_u32 = 0;\r\n /** Connection start time */\r\n this.StartTime_dt = new Date();\r\n /** Connection completion time of the first connection */\r\n this.FirstConnectionEstablisiedTime_dt = new Date();\r\n /** Connection completion time of this connection */\r\n this.CurrentConnectionEstablishTime_dt = new Date();\r\n /** Number of connections have been established so far */\r\n this.NumConnectionsEatablished_u32 = 0;\r\n /** Half-connection */\r\n this.HalfConnection_bool = false;\r\n /** VoIP / QoS */\r\n this.QoS_bool = false;\r\n /** Maximum number of the underlying TCP connections */\r\n this.MaxTcpConnections_u32 = 0;\r\n /** Number of current underlying TCP connections */\r\n this.NumTcpConnections_u32 = 0;\r\n /** Number of inbound underlying connections */\r\n this.NumTcpConnectionsUpload_u32 = 0;\r\n /** Number of outbound underlying connections */\r\n this.NumTcpConnectionsDownload_u32 = 0;\r\n /** Use of encryption */\r\n this.UseEncrypt_bool = false;\r\n /** Cipher algorithm name */\r\n this.CipherName_str = \"\";\r\n /** Use of compression */\r\n this.UseCompress_bool = false;\r\n /** Is R-UDP session */\r\n this.IsRUDPSession_bool = false;\r\n /** Physical underlying communication protocol */\r\n this.UnderlayProtocol_str = \"\";\r\n /** The UDP acceleration is enabled */\r\n this.IsUdpAccelerationEnabled_bool = false;\r\n /** Using the UDP acceleration function */\r\n this.IsUsingUdpAcceleration_bool = false;\r\n /** VPN session name */\r\n this.SessionName_str = \"\";\r\n /** Connection name */\r\n this.ConnectionName_str = \"\";\r\n /** Session key */\r\n this.SessionKey_bin = new Uint8Array([]);\r\n /** Total transmitted data size */\r\n this.TotalSendSize_u64 = 0;\r\n /** Total received data size */\r\n this.TotalRecvSize_u64 = 0;\r\n /** Total transmitted data size (no compression) */\r\n this.TotalSendSizeReal_u64 = 0;\r\n /** Total received data size (no compression) */\r\n this.TotalRecvSizeReal_u64 = 0;\r\n /** Is Bridge Mode */\r\n this.IsBridgeMode_bool = false;\r\n /** Is Monitor mode */\r\n this.IsMonitorMode_bool = false;\r\n /** VLAN ID */\r\n this.VLanId_u32 = 0;\r\n /** Client product name */\r\n this.ClientProductName_str = \"\";\r\n /** Client version */\r\n this.ClientProductVer_u32 = 0;\r\n /** Client build number */\r\n this.ClientProductBuild_u32 = 0;\r\n /** Client OS name */\r\n this.ClientOsName_str = \"\";\r\n /** Client OS version */\r\n this.ClientOsVer_str = \"\";\r\n /** Client OS Product ID */\r\n this.ClientOsProductId_str = \"\";\r\n /** Client host name */\r\n this.ClientHostname_str = \"\";\r\n /** Unique ID */\r\n this.UniqueId_bin = new Uint8Array([]);\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcSessionStatus;\r\n}());\r\nexports.VpnRpcSessionStatus = VpnRpcSessionStatus;\r\n/** Set the special listener */\r\nvar VpnRpcSpecialListener = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcSpecialListener' class: Set the special listener */\r\n function VpnRpcSpecialListener(init) {\r\n /** The flag to activate the VPN over ICMP server function */\r\n this.VpnOverIcmpListener_bool = false;\r\n /** The flag to activate the VPN over DNS function */\r\n this.VpnOverDnsListener_bool = false;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcSpecialListener;\r\n}());\r\nexports.VpnRpcSpecialListener = VpnRpcSpecialListener;\r\n/** Syslog configuration */\r\nvar VpnSyslogSaveType;\r\n(function (VpnSyslogSaveType) {\r\n /** Do not use syslog */\r\n VpnSyslogSaveType[VpnSyslogSaveType[\"None\"] = 0] = \"None\";\r\n /** Only server log */\r\n VpnSyslogSaveType[VpnSyslogSaveType[\"ServerLog\"] = 1] = \"ServerLog\";\r\n /** Server and Virtual HUB security log */\r\n VpnSyslogSaveType[VpnSyslogSaveType[\"ServerAndHubSecurityLog\"] = 2] = \"ServerAndHubSecurityLog\";\r\n /** Server, Virtual HUB security, and packet log */\r\n VpnSyslogSaveType[VpnSyslogSaveType[\"ServerAndHubAllLog\"] = 3] = \"ServerAndHubAllLog\";\r\n})(VpnSyslogSaveType = exports.VpnSyslogSaveType || (exports.VpnSyslogSaveType = {}));\r\n/** Syslog configuration */\r\nvar VpnSyslogSetting = /** @class */ (function () {\r\n /** Constructor for the 'VpnSyslogSetting' class: Syslog configuration */\r\n function VpnSyslogSetting(init) {\r\n /** The behavior of the syslog function */\r\n this.SaveType_u32 = 0;\r\n /** Specify the host name or IP address of the syslog server */\r\n this.Hostname_str = \"\";\r\n /** Specify the port number of the syslog server */\r\n this.Port_u32 = 0;\r\n Object.assign(this, init);\r\n }\r\n return VpnSyslogSetting;\r\n}());\r\nexports.VpnSyslogSetting = VpnSyslogSetting;\r\n/** VPN Gate Server Config */\r\nvar VpnVgsConfig = /** @class */ (function () {\r\n /** Constructor for the 'VpnVgsConfig' class: VPN Gate Server Config */\r\n function VpnVgsConfig(init) {\r\n /** Active flag */\r\n this.IsEnabled_bool = false;\r\n /** Message */\r\n this.Message_utf = \"\";\r\n /** Owner name */\r\n this.Owner_utf = \"\";\r\n /** Abuse email */\r\n this.Abuse_utf = \"\";\r\n /** Log save flag */\r\n this.NoLog_bool = false;\r\n /** Save log permanently */\r\n this.LogPermanent_bool = false;\r\n /** Enable the L2TP VPN function */\r\n this.EnableL2TP_bool = false;\r\n Object.assign(this, init);\r\n }\r\n return VpnVgsConfig;\r\n}());\r\nexports.VpnVgsConfig = VpnVgsConfig;\r\n/** Read a Log file */\r\nvar VpnRpcReadLogFile = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcReadLogFile' class: Read a Log file */\r\n function VpnRpcReadLogFile(init) {\r\n /** Server name */\r\n this.ServerName_str = \"\";\r\n /** File Path */\r\n this.FilePath_str = \"\";\r\n /** 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. */\r\n this.Offset_u32 = 0;\r\n /** Received buffer */\r\n this.Buffer_bin = new Uint8Array([]);\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcReadLogFile;\r\n}());\r\nexports.VpnRpcReadLogFile = VpnRpcReadLogFile;\r\n/** Rename link */\r\nvar VpnRpcRenameLink = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcRenameLink' class: Rename link */\r\n function VpnRpcRenameLink(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** The old name of the cascade connection */\r\n this.OldAccountName_utf = \"\";\r\n /** The new name of the cascade connection */\r\n this.NewAccountName_utf = \"\";\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcRenameLink;\r\n}());\r\nexports.VpnRpcRenameLink = VpnRpcRenameLink;\r\n/** Online or offline the HUB */\r\nvar VpnRpcSetHubOnline = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcSetHubOnline' class: Online or offline the HUB */\r\n function VpnRpcSetHubOnline(init) {\r\n /** The Virtual Hub name */\r\n this.HubName_str = \"\";\r\n /** Online / offline flag */\r\n this.Online_bool = false;\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcSetHubOnline;\r\n}());\r\nexports.VpnRpcSetHubOnline = VpnRpcSetHubOnline;\r\n/** Set Password */\r\nvar VpnRpcSetPassword = /** @class */ (function () {\r\n /** Constructor for the 'VpnRpcSetPassword' class: Set Password */\r\n function VpnRpcSetPassword(init) {\r\n /** The plaintext password */\r\n this.PlainTextPassword_str = \"\";\r\n Object.assign(this, init);\r\n }\r\n return VpnRpcSetPassword;\r\n}());\r\nexports.VpnRpcSetPassword = VpnRpcSetPassword;\r\n// --- Utility codes ---\r\n/** JSON-RPC request class. See https://www.jsonrpc.org/specification */\r\nvar JsonRpcRequest = /** @class */ (function () {\r\n function JsonRpcRequest(method, param, id) {\r\n if (method === void 0) { method = \"\"; }\r\n if (param === void 0) { param = null; }\r\n if (id === void 0) { id = \"\"; }\r\n this.jsonrpc = \"2.0\";\r\n this.method = method;\r\n this.params = param;\r\n this.id = id;\r\n }\r\n return JsonRpcRequest;\r\n}());\r\nexports.JsonRpcRequest = JsonRpcRequest;\r\n/** JSON-RPC error class. See https://www.jsonrpc.org/specification */\r\nvar JsonRpcError = /** @class */ (function () {\r\n function JsonRpcError(code, message, data) {\r\n if (code === void 0) { code = 0; }\r\n if (message === void 0) { message = \"\"; }\r\n if (data === void 0) { data = null; }\r\n this.code = code;\r\n this.message = message;\r\n this.data = data;\r\n }\r\n return JsonRpcError;\r\n}());\r\nexports.JsonRpcError = JsonRpcError;\r\n/** JSON-RPC response class with generics */\r\nvar JsonRpcResponse = /** @class */ (function () {\r\n function JsonRpcResponse() {\r\n this.jsonrpc = \"2.0\";\r\n this.result = null;\r\n this.error = null;\r\n this.id = \"\";\r\n }\r\n return JsonRpcResponse;\r\n}());\r\nexports.JsonRpcResponse = JsonRpcResponse;\r\n/** JSON-RPC client class. See https://www.jsonrpc.org/specification */\r\nvar JsonRpcClient = /** @class */ (function () {\r\n /**\r\n * JSON-RPC client class constructor\r\n * @param url The URL\r\n * @param headers Additional HTTP headers\r\n * @param send_credential Set true to use the same credential with the browsing web site. Valid only if the code is running on the web browser.\r\n */\r\n function JsonRpcClient(url, headers, send_credential, nodejs_https_client_reject_untrusted_server_cert) {\r\n this.BaseUrl = url;\r\n this.headers = headers;\r\n this.client = new HttpClient();\r\n this.client.SendCredential = send_credential;\r\n this.client.NodeJS_HTTPS_Client_Reject_Unauthorized = nodejs_https_client_reject_untrusted_server_cert;\r\n }\r\n /** A utility function to convert any object to JSON string */\r\n JsonRpcClient.ObjectToJson = function (obj) {\r\n return JSON.stringify(obj, function (key, value) {\r\n if (key.endsWith(\"_bin\")) {\r\n return Util_Base64_Encode(value);\r\n }\r\n return value;\r\n }, 4);\r\n };\r\n /** A utility function to convert JSON string to object */\r\n JsonRpcClient.JsonToObject = function (str) {\r\n return JSON.parse(str, function (key, value) {\r\n if (key.endsWith(\"_bin\")) {\r\n return Util_Base64_Decode(value);\r\n }\r\n else if (key.endsWith(\"_dt\")) {\r\n return new Date(value);\r\n }\r\n return value;\r\n });\r\n };\r\n /**\r\n * Call a single RPC call (without error check). You can wait for the response with Promise<string> or await statement.\r\n * @param method_name The name of RPC method\r\n * @param param The parameters\r\n */\r\n JsonRpcClient.prototype.CallInternalAsync = function (method_name, param) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var id, req, req_string, http_response, ret_string;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n id = \"1\";\r\n req = new JsonRpcRequest(method_name, param, id);\r\n req_string = JsonRpcClient.ObjectToJson(req);\r\n if (debug_mode) {\r\n console.log(\"--- RPC Request Body ---\");\r\n console.log(req_string);\r\n console.log(\"------------------------\");\r\n }\r\n return [4 /*yield*/, this.client.PostAsync(this.BaseUrl, this.headers, req_string, \"application/json\")];\r\n case 1:\r\n http_response = _a.sent();\r\n ret_string = http_response.Body;\r\n if (debug_mode) {\r\n console.log(\"--- RPC Response Body ---\");\r\n console.log(ret_string);\r\n console.log(\"-------------------------\");\r\n }\r\n return [2 /*return*/, ret_string];\r\n }\r\n });\r\n });\r\n };\r\n /**\r\n * Call a single RPC call (with error check). You can wait for the response with Promise<TResult> or await statement. In the case of error, it will be thrown.\r\n * @param method_name The name of RPC method\r\n * @param param The parameters\r\n */\r\n JsonRpcClient.prototype.CallAsync = function (method_name, param) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var ret_string, ret;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, this.CallInternalAsync(method_name, param)];\r\n case 1:\r\n ret_string = _a.sent();\r\n ret = JSON.parse(ret_string);\r\n if (is_null(ret.error) === false) {\r\n throw new JsonRpcException(ret.error);\r\n }\r\n return [2 /*return*/, ret.result];\r\n }\r\n });\r\n });\r\n };\r\n return JsonRpcClient;\r\n}());\r\nexports.JsonRpcClient = JsonRpcClient;\r\n/** JSON-RPC exception class */\r\nvar JsonRpcException = /** @class */ (function (_super) {\r\n __extends(JsonRpcException, _super);\r\n function JsonRpcException(error) {\r\n var _this = _super.call(this, \"Code=\" + error.code + \", Message=\" + error.message) || this;\r\n _this.Error = error;\r\n return _this;\r\n }\r\n return JsonRpcException;\r\n}(Error));\r\nexports.JsonRpcException = JsonRpcException;\r\n/** HTTP client exception class */\r\nvar HttpClientException = /** @class */ (function (_super) {\r\n __extends(HttpClientException, _super);\r\n function HttpClientException(message) {\r\n return _super.call(this, message) || this;\r\n }\r\n return HttpClientException;\r\n}(Error));\r\nexports.HttpClientException = HttpClientException;\r\n/** HTTP client response class */\r\nvar HttpClientResponse = /** @class */ (function () {\r\n function HttpClientResponse() {\r\n this.Body = \"\";\r\n }\r\n return HttpClientResponse;\r\n}());\r\nexports.HttpClientResponse = HttpClientResponse;\r\n/** An HTTP client which can be used in both web browsers and Node.js */\r\nvar HttpClient = /** @class */ (function () {\r\n function HttpClient() {\r\n this.TimeoutMsecs = 60 * 5 * 1000;\r\n this.SendCredential = true;\r\n this.NodeJS_HTTPS_Client_Reject_Unauthorized = false;\r\n }\r\n /** Post method. In web browsers this function will process the request by itself. In Node.js this function will call PostAsync_NodeJS() instead. */\r\n HttpClient.prototype.PostAsync = function (url, headers, req_body, req_media_type) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var fetch_header_list, _i, _a, name_1, fetch_init, fetch_response, ret, _b;\r\n return __generator(this, function (_c) {\r\n switch (_c.label) {\r\n case 0:\r\n if (is_node_js) {\r\n return [2 /*return*/, this.PostAsync_NodeJS(url, headers, req_body, req_media_type)];\r\n }\r\n fetch_header_list = new Headers();\r\n for (_i = 0, _a = Object.keys(headers); _i < _a.length; _i++) {\r\n name_1 = _a[_i];\r\n fetch_header_list.append(name_1, headers[name_1]);\r\n }\r\n fetch_init = {\r\n mode: \"cors\",\r\n headers: fetch_header_list,\r\n credentials: (this.SendCredential ? \"include\" : \"omit\"),\r\n method: \"POST\",\r\n cache: \"no-cache\",\r\n keepalive: true,\r\n redirect: \"follow\",\r\n body: req_body\r\n };\r\n return [4 /*yield*/, fetch(url, fetch_init)];\r\n case 1:\r\n fetch_response = _c.sent();\r\n if (fetch_response.ok === false) {\r\n throw new HttpClientException(\"HTTP Error: \" + fetch_response.status + \" \" + fetch_response.statusText);\r\n }\r\n ret = new HttpClientResponse();\r\n _b = ret;\r\n return [4 /*yield*/, fetch_response.text()];\r\n case 2:\r\n _b.Body = _c.sent();\r\n return [2 /*return*/, ret];\r\n }\r\n });\r\n });\r\n };\r\n /** Post method for Node.js. */\r\n HttpClient.prototype.PostAsync_NodeJS = function (url, headers, req_body, req_media_type) {\r\n var https = __webpack_require__(/*! https */ \"./node_modules/https-browserify/index.js\");\r\n var keepAliveAgent = new https.Agent({ keepAlive: true });\r\n var urlparse = __webpack_require__(/*! url */ \"./node_modules/url/url.js\");\r\n var urlobj = urlparse.parse(url);\r\n if (is_null(urlobj.host))\r\n throw new Error(\"URL is invalid.\");\r\n var options = {\r\n host: urlobj.hostname,\r\n port: urlobj.port,\r\n path: urlobj.path,\r\n rejectUnauthorized: this.NodeJS_HTTPS_Client_Reject_Unauthorized,\r\n method: \"POST\",\r\n timeout: this.TimeoutMsecs,\r\n agent: keepAliveAgent\r\n };\r\n return new Promise(function (resolve, reject) {\r\n var req = https.request(options, function (res) {\r\n if (res.statusCode !== 200) {\r\n reject(new HttpClientException(\"HTTP Error: \" + res.statusCode + \" \" + res.statusMessage));\r\n }\r\n var recv_str = \"\";\r\n res.on(\"data\", function (body) {\r\n recv_str += body;\r\n });\r\n res.on(\"end\", function () {\r\n var ret = new HttpClientResponse();\r\n ret.Body = recv_str;\r\n resolve(ret);\r\n });\r\n }).on(\"error\", function (err) {\r\n throw err;\r\n });\r\n for (var _i = 0, _a = Object.keys(headers); _i < _a.length; _i++) {\r\n var name_2 = _a[_i];\r\n req.setHeader(name_2, !is_null(headers[name_2]) ? headers[name_2] : \"\");\r\n }\r\n req.setHeader(\"Content-Type\", req_media_type);\r\n req.setHeader(\"Content-Length\", Buffer.byteLength(req_body));\r\n req.write(req_body);\r\n req.end();\r\n });\r\n };\r\n return HttpClient;\r\n}());\r\nexports.HttpClient = HttpClient;\r\n//////// BEGIN: Base64 encode / decode utility functions from https://github.com/beatgammit/base64-js\r\n// The MIT License(MIT)\r\n// Copyright(c) 2014\r\n// Permission is hereby granted, free of charge, to any person obtaining a copy\r\n// of this software and associated documentation files(the \"Software\"), to deal\r\n// in the Software without restriction, including without limitation the rights\r\n// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell\r\n// copies of the Software, and to permit persons to whom the Software is\r\n// furnished to do so, subject to the following conditions:\r\n// The above copyright notice and this permission notice shall be included in\r\n// all copies or substantial portions of the Software.\r\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE\r\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n// THE SOFTWARE.\r\nvar lookup = [];\r\nvar revLookup = [];\r\nvar code = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\r\nfor (var i = 0, len = code.length; i < len; ++i) {\r\n lookup[i] = code[i];\r\n revLookup[code.charCodeAt(i)] = i;\r\n}\r\n// Support decoding URL-safe base64 strings, as Node.js does.\r\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\r\nrevLookup[\"-\".charCodeAt(0)] = 62;\r\nrevLookup[\"_\".charCodeAt(0)] = 63;\r\nfunction getLens(b64) {\r\n var len = b64.length;\r\n if (len % 4 > 0) {\r\n throw new Error(\"Invalid string. Length must be a multiple of 4\");\r\n }\r\n // Trim off extra bytes after placeholder bytes are found\r\n // See: https://github.com/beatgammit/base64-js/issues/42\r\n var validLen = b64.indexOf(\"=\");\r\n if (validLen === -1)\r\n validLen = len;\r\n var placeHoldersLen = validLen === len\r\n ? 0\r\n : 4 - (validLen % 4);\r\n return [validLen, placeHoldersLen];\r\n}\r\n// base64 is 4/3 + up to two characters of the original data\r\nfunction byteLength(b64) {\r\n var lens = getLens(b64);\r\n var validLen = lens[0];\r\n var placeHoldersLen = lens[1];\r\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen;\r\n}\r\nfunction _byteLength(b64, validLen, placeHoldersLen) {\r\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen;\r\n}\r\nfunction Util_Base64_Decode(b64) {\r\n var tmp;\r\n var lens = getLens(b64);\r\n var validLen = lens[0];\r\n var placeHoldersLen = lens[1];\r\n var arr = new Uint8Array(_byteLength(b64, validLen, placeHoldersLen));\r\n var curByte = 0;\r\n // if there are placeholders, only get up to the last complete 4 chars\r\n var len = placeHoldersLen > 0\r\n ? validLen - 4\r\n : validLen;\r\n for (var i = 0; i < len; i += 4) {\r\n tmp =\r\n (revLookup[b64.charCodeAt(i)] << 18) |\r\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\r\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\r\n revLookup[b64.charCodeAt(i + 3)];\r\n arr[curByte++] = (tmp >> 16) & 0xFF;\r\n arr[curByte++] = (tmp >> 8) & 0xFF;\r\n arr[curByte++] = tmp & 0xFF;\r\n }\r\n if (placeHoldersLen === 2) {\r\n tmp =\r\n (revLookup[b64.charCodeAt(i)] << 2) |\r\n (revLookup[b64.charCodeAt(i + 1)] >> 4);\r\n arr[curByte++] = tmp & 0xFF;\r\n }\r\n if (placeHoldersLen === 1) {\r\n tmp =\r\n (revLookup[b64.charCodeAt(i)] << 10) |\r\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\r\n (revLookup[b64.charCodeAt(i + 2)] >> 2);\r\n arr[curByte++] = (tmp >> 8) & 0xFF;\r\n arr[curByte++] = tmp & 0xFF;\r\n }\r\n return arr;\r\n}\r\nexports.Util_Base64_Decode = Util_Base64_Decode;\r\nfunction tripletToBase64(num) {\r\n return lookup[num >> 18 & 0x3F] +\r\n lookup[num >> 12 & 0x3F] +\r\n lookup[num >> 6 & 0x3F] +\r\n lookup[num & 0x3F];\r\n}\r\nfunction encodeChunk(uint8, start, end) {\r\n var tmp;\r\n var output = [];\r\n for (var i = start; i < end; i += 3) {\r\n tmp =\r\n ((uint8[i] << 16) & 0xFF0000) +\r\n ((uint8[i + 1] << 8) & 0xFF00) +\r\n (uint8[i + 2] & 0xFF);\r\n output.push(tripletToBase64(tmp));\r\n }\r\n return output.join(\"\");\r\n}\r\nfunction Util_Base64_Encode(uint8) {\r\n var tmp;\r\n var len = uint8.length;\r\n var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes\r\n var parts = [];\r\n var maxChunkLength = 16383; // must be multiple of 3\r\n // go through the array every three bytes, we'll deal with trailing stuff later\r\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\r\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)));\r\n }\r\n // pad the end with zeros, but make sure to not forget the extra bytes\r\n if (extraBytes === 1) {\r\n tmp = uint8[len - 1];\r\n parts.push(lookup[tmp >> 2] +\r\n lookup[(tmp << 4) & 0x3F] +\r\n \"==\");\r\n }\r\n else if (extraBytes === 2) {\r\n tmp = (uint8[len - 2] << 8) + uint8[len - 1];\r\n parts.push(lookup[tmp >> 10] +\r\n lookup[(tmp >> 4) & 0x3F] +\r\n lookup[(tmp << 2) & 0x3F] +\r\n \"=\");\r\n }\r\n return parts.join(\"\");\r\n}\r\nexports.Util_Base64_Encode = Util_Base64_Encode;\r\n//////// END: Base64 encode / decode utility functions from https://github.com/beatgammit/base64-js\r\n//# sourceMappingURL=vpnrpc.js.map\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../buffer/index.js */ \"./node_modules/buffer/index.js\").Buffer))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvdnBucnBjL2Rpc3QvdnBucnBjLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvdnBucnBjL2Rpc3QvdnBucnBjLmpzPzQ2ZWYiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XHJcbi8vIFNvZnRFdGhlciBWUE4gU2VydmVyIEpTT04tUlBDIFN0dWIgY29kZSBmb3IgVHlwZVNjcmlwdFxyXG4vLyBcclxuLy8gdnBucnBjLnRzXHJcbi8vIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGF0IDIwMTktMDUtMjkgMTg6MjE6MzkgYnkgdnBuc2VydmVyLWpzb25ycGMtY29kZWdlblxyXG4vL1xyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgMi4wXHJcbi8vIENvcHlyaWdodCAoYykgMjAxNC0yMDE5IFNvZnRFdGhlciBWUE4gUHJvamVjdFxyXG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XHJcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xyXG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG4gICAgfTtcclxufSkoKTtcclxudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHJlc3VsdC52YWx1ZSk7IH0pLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufTtcclxudmFyIF9fZ2VuZXJhdG9yID0gKHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59O1xyXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xyXG4vLyBUcml2aWFsIHV0aWxpdHkgY29kZXNcclxudmFyIGlzX25vZGVfanMgPSAodHlwZW9mIG5hdmlnYXRvciA9PT0gXCJ1bmRlZmluZWRcIikgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKFwiTm9kZS5qc1wiKSAhPT0gLTEgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKFwianNkb21cIikgIT09IC0xO1xyXG5mdW5jdGlvbiBpc19udWxsKG9iaikge1xyXG4gICAgcmV0dXJuICh0eXBlb2Ygb2JqID09PSBcInVuZGVmaW5lZFwiKSB8fCAob2JqID09PSBudWxsKTtcclxufVxyXG52YXIgZGVidWdfbW9kZSA9IGZhbHNlO1xyXG4vKiogVlBOIFNlcnZlciBSUEMgU3R1YnMgKi9cclxudmFyIFZwblNlcnZlclJwYyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKlxyXG4gICAgICogQ29uc3RydWN0b3Igb2YgdGhlIFZwblNlcnZlclJwYyBjbGFzc1xyXG4gICAgICogQHBhcmFtIHZwbnNlcnZlcl9ob3N0bmFtZSBUaGUgaG9zdG5hbWUgb3IgSVAgYWRkcmVzcyBvZiB0aGUgZGVzdGluYXRpb24gVlBOIFNlcnZlci4gSW4gdGhlIHdlYiBicm93c2VyIHlvdSBjYW4gc3BlY2lmeSBudWxsIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgdG8gdGhlIHNlcnZlciBpdHNlbGYuXHJcbiAgICAgKiBAcGFyYW0gdnBuc2VydmVyX3BvcnQgVGhlIHBvcnQgbnVtYmVyIG9mIHRoZSBkZXN0aW5hdGlvbiBWUE4gU2VydmVyLiBJbiB0aGUgd2ViIGJyb3dzZXIgeW91IGNhbiBzcGVjaWZ5IG51bGwgaWYgeW91IHdhbnQgdG8gY29ubmVjdCB0byB0aGUgc2VydmVyIGl0c2VsZi5cclxuICAgICAqIEBwYXJhbSBodWJuYW1lIFRoZSBuYW1lIG9mIHRoZSBWaXJ0dWFsIEh1YiBpZiB5b3Ugd2FudCB0byBjb25uZWN0IHRvIHRoZSBWUE4gU2VydmVyIGFzIGEgVmlydHVhbCBIdWIgQWRtaW4gTW9kZS4gU3BlY2lmeSBudWxsIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgdG8gdGhlIFZQTiBTZXJ2ZXIgYXMgdGhlIEVudGlyZSBWUE4gU2VydmVyIEFkbWluIE1vZGUuXHJcbiAgICAgKiBAcGFyYW0gcGFzc3dvcmQgU3BlY2lmeSB0aGUgYWRtaW5pc3RyYXRpb24gcGFzc3dvcmQuIFRoaXMgdmFsdWUgaXMgdmFsaWQgb25seSBpZiB2cG5zZXJ2ZXJfaG9zdG5hbWUgaXMgc2VwY2lmaWVkLlxyXG4gICAgICogQHBhcmFtIG5vZGVqc19odHRwc19jbGllbnRfcmVqZWN0X3VudHJ1c3RlZF9zZXJ2ZXJfY2VydCBJbiBOb2RlLmpzIHNldCB0aGlzIHRydWUgdG8gY2hlY2sgdGhlIFNTTCBzZXJ2ZXIgY2VydGlmaWNhdGUgb24gdGhlIGRlc3RpbmF0aW9uIFZQTiBTZXJ2ZXIuIFNldCB0aGlzIGZhbHNlIHRvIGlnbm9yZSB0aGUgU1NMIHNlcnZlciBjZXJ0aWZpY2F0aW9uLlxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBWcG5TZXJ2ZXJScGModnBuc2VydmVyX2hvc3RuYW1lLCB2cG5zZXJ2ZXJfcG9ydCwgaHVibmFtZSwgcGFzc3dvcmQsIG5vZGVqc19odHRwc19jbGllbnRfcmVqZWN0X3VudHJ1c3RlZF9zZXJ2ZXJfY2VydCkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgLy8gLS0tIFN0dWJzIC0tLVxyXG4gICAgICAgIC8qKiBUZXN0IFJQQyBmdW5jdGlvbi4gSW5wdXQgYW55IGludGVnZXIgdmFsdWUgdG8gdGhlIEludFZhbHVlX3UzMiBmaWVsZC4gVGhlbiB0aGUgc2VydmVyIHdpbGwgY29udmVydCB0aGUgaW50ZWdlciB0byB0aGUgc3RyaW5nLCBhbmQgcmV0dXJuIHRoZSBzdHJpbmcgaW4gdGhlIFN0clZhbHVlX3N0ciBmaWVsZC4gKi9cclxuICAgICAgICB0aGlzLlRlc3QgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIlRlc3RcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIEdldCBzZXJ2ZXIgaW5mb3JtYXRpb24uIFRoaXMgYWxsb3dzIHlvdSB0byBvYnRhaW4gdGhlIHNlcnZlciBpbmZvcm1hdGlvbiBvZiB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCBWUE4gU2VydmVyIG9yIFZQTiBCcmlkZ2UuIEluY2x1ZGVkIGluIHRoZSBzZXJ2ZXIgaW5mb3JtYXRpb24gYXJlIHRoZSB2ZXJzaW9uIG51bWJlciwgYnVpbGQgbnVtYmVyIGFuZCBidWlsZCBpbmZvcm1hdGlvbi4gWW91IGNhbiBhbHNvIG9idGFpbiBpbmZvcm1hdGlvbiBvbiB0aGUgY3VycmVudCBzZXJ2ZXIgb3BlcmF0aW9uIG1vZGUgYW5kIHRoZSBpbmZvcm1hdGlvbiBvZiBvcGVyYXRpbmcgc3lzdGVtIHRoYXQgdGhlIHNlcnZlciBpcyBvcGVyYXRpbmcgb24uICovXHJcbiAgICAgICAgdGhpcy5HZXRTZXJ2ZXJJbmZvID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiR2V0U2VydmVySW5mb1wiLCBuZXcgVnBuUnBjU2VydmVySW5mbygpKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBHZXQgQ3VycmVudCBTZXJ2ZXIgU3RhdHVzLiBUaGlzIGFsbG93cyB5b3UgdG8gb2J0YWluIGluIHJlYWwtdGltZSB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIGN1cnJlbnRseSBjb25uZWN0ZWQgVlBOIFNlcnZlciBvciBWUE4gQnJpZGdlLiBZb3UgY2FuIGdldCBzdGF0aXN0aWNhbCBpbmZvcm1hdGlvbiBvbiBkYXRhIGNvbW11bmljYXRpb24gYW5kIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGtpbmRzIG9mIG9iamVjdHMgdGhhdCBleGlzdCBvbiB0aGUgc2VydmVyLiBZb3UgY2FuIGdldCBpbmZvcm1hdGlvbiBvbiBob3cgbXVjaCBtZW1vcnkgaXMgYmVpbmcgdXNlZCBvbiB0aGUgY3VycmVudCBjb21wdXRlciBieSB0aGUgT1MuICovXHJcbiAgICAgICAgdGhpcy5HZXRTZXJ2ZXJTdGF0dXMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJHZXRTZXJ2ZXJTdGF0dXNcIiwgbmV3IFZwblJwY1NlcnZlclN0YXR1cygpKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBDcmVhdGUgTmV3IFRDUCBMaXN0ZW5lci4gVGhpcyBhbGxvd3MgeW91IHRvIGNyZWF0ZSBhIG5ldyBUQ1AgTGlzdGVuZXIgb24gdGhlIHNlcnZlci4gQnkgY3JlYXRpbmcgdGhlIFRDUCBMaXN0ZW5lciB0aGUgc2VydmVyIHN0YXJ0cyBsaXN0ZW5pbmcgZm9yIGEgY29ubmVjdGlvbiBmcm9tIGNsaWVudHMgYXQgdGhlIHNwZWNpZmllZCBUQ1AvSVAgcG9ydCBudW1iZXIuIEEgVENQIExpc3RlbmVyIHRoYXQgaGFzIGJlZW4gY3JlYXRlZCBjYW4gYmUgZGVsZXRlZCBieSB0aGUgRGVsZXRlTGlzdGVuZXIgQVBJLiBZb3UgY2FuIGFsc28gZ2V0IGEgbGlzdCBvZiBUQ1AgTGlzdGVuZXJzIGN1cnJlbnRseSByZWdpc3RlcmVkIGJ5IHVzaW5nIHRoZSBFbnVtTGlzdGVuZXIgQVBJLiBUbyBleGVjdXRlIHRoaXMgQVBJLCB5b3UgbXVzdCBoYXZlIFZQTiBTZXJ2ZXIgYWRtaW5pc3RyYXRvciBwcml2aWxlZ2VzLiAqL1xyXG4gICAgICAgIHRoaXMuQ3JlYXRlTGlzdGVuZXIgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkNyZWF0ZUxpc3RlbmVyXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBHZXQgTGlzdCBvZiBUQ1AgTGlzdGVuZXJzLiBUaGlzIGFsbG93cyB5b3UgdG8gZ2V0IGEgbGlzdCBvZiBUQ1AgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgb24gdGhlIGN1cnJlbnQgc2VydmVyLiBZb3UgY2FuIG9idGFpbiBpbmZvcm1hdGlvbiBvbiB3aGV0aGVyIHRoZSB2YXJpb3VzIFRDUCBsaXN0ZW5lcnMgaGF2ZSBhIHN0YXR1cyBvZiBvcGVyYXRpbmcgb3IgZXJyb3IuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBtdXN0IGhhdmUgVlBOIFNlcnZlciBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMuICovXHJcbiAgICAgICAgdGhpcy5FbnVtTGlzdGVuZXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJFbnVtTGlzdGVuZXJcIiwgbmV3IFZwblJwY0xpc3RlbmVyTGlzdCgpKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBEZWxldGUgVENQIExpc3RlbmVyLiBUaGlzIGFsbG93cyB5b3UgdG8gZGVsZXRlIGEgVENQIExpc3RlbmVyIHRoYXQncyByZWdpc3RlcmVkIG9uIHRoZSBzZXJ2ZXIuIFdoZW4gdGhlIFRDUCBMaXN0ZW5lciBpcyBpbiBhIHN0YXRlIG9mIG9wZXJhdGlvbiwgdGhlIGxpc3RlbmVyIHdpbGwgYXV0b21hdGljYWxseSBiZSBkZWxldGVkIHdoZW4gaXRzIG9wZXJhdGlvbiBzdG9wcy4gWW91IGNhbiBhbHNvIGdldCBhIGxpc3Qgb2YgVENQIExpc3RlbmVycyBjdXJyZW50bHkgcmVnaXN0ZXJlZCBieSB1c2luZyB0aGUgRW51bUxpc3RlbmVyIEFQSS4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG11c3QgaGF2ZSBWUE4gU2VydmVyIGFkbWluaXN0cmF0b3IgcHJpdmlsZWdlcy4gKi9cclxuICAgICAgICB0aGlzLkRlbGV0ZUxpc3RlbmVyID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJEZWxldGVMaXN0ZW5lclwiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogRW5hYmxlIC8gRGlzYWJsZSBUQ1AgTGlzdGVuZXIuIFRoaXMgc3RhcnRzIG9yIHN0b3BzIHRoZSBvcGVyYXRpb24gb2YgVENQIExpc3RlbmVycyByZWdpc3RlcmVkIG9uIHRoZSBjdXJyZW50IHNlcnZlci4gWW91IGNhbiBhbHNvIGdldCBhIGxpc3Qgb2YgVENQIExpc3RlbmVycyBjdXJyZW50bHkgcmVnaXN0ZXJlZCBieSB1c2luZyB0aGUgRW51bUxpc3RlbmVyIEFQSS4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG11c3QgaGF2ZSBWUE4gU2VydmVyIGFkbWluaXN0cmF0b3IgcHJpdmlsZWdlcy4gKi9cclxuICAgICAgICB0aGlzLkVuYWJsZUxpc3RlbmVyID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJFbmFibGVMaXN0ZW5lclwiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogU2V0IFZQTiBTZXJ2ZXIgQWRtaW5pc3RyYXRvciBQYXNzd29yZC4gVGhpcyBzZXRzIHRoZSBWUE4gU2VydmVyIGFkbWluaXN0cmF0b3IgcGFzc3dvcmQuIFlvdSBjYW4gc3BlY2lmeSB0aGUgcGFzc3dvcmQgYXMgYSBwYXJhbWV0ZXIuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBtdXN0IGhhdmUgVlBOIFNlcnZlciBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMuICovXHJcbiAgICAgICAgdGhpcy5TZXRTZXJ2ZXJQYXNzd29yZCA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiU2V0U2VydmVyUGFzc3dvcmRcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIFNldCB0aGUgVlBOIFNlcnZlciBjbHVzdGVyaW5nIGNvbmZpZ3VyYXRpb24uIFVzZSB0aGlzIHRvIHNldCB0aGUgVlBOIFNlcnZlciB0eXBlIGFzIFN0YW5kYWxvbmUgU2VydmVyLCBDbHVzdGVyIENvbnRyb2xsZXIgU2VydmVyIG9yIENsdXN0ZXIgTWVtYmVyIFNlcnZlci4gU3RhbmRhbG9uZSBzZXJ2ZXIgbWVhbnMgYSBWUE4gU2VydmVyIHRoYXQgZG9lcyBub3QgYmVsb25nIHRvIGFueSBjbHVzdGVyIGluIGl0cyBjdXJyZW50IHN0YXRlLiBXaGVuIFZQTiBTZXJ2ZXIgaXMgaW5zdGFsbGVkLCBieSBkZWZhdWx0IGl0IHdpbGwgYmUgaW4gc3RhbmRhbG9uZSBzZXJ2ZXIgbW9kZS4gVW5sZXNzIHlvdSBoYXZlIHBhcnRpY3VsYXIgcGxhbnMgdG8gY29uZmlndXJlIGEgY2x1c3Rlciwgd2UgcmVjb21tZW5kIHRoZSBWUE4gU2VydmVyIGJlIG9wZXJhdGVkIGluIHN0YW5kYWxvbmUgbW9kZS4gQSBjbHVzdGVyIGNvbnRyb2xsZXIgaXMgdGhlIGNlbnRyYWwgY29tcHV0ZXIgb2YgYWxsIG1lbWJlciBzZXJ2ZXJzIG9mIGEgY2x1c3RlciBpbiB0aGUgY2FzZSB3aGVyZSBhIGNsdXN0ZXJpbmcgZW52aXJvbm1lbnQgaXMgbWFkZSB1cCBvZiBtdWx0aXBsZSBWUE4gU2VydmVycy4gTXVsdGlwbGUgY2x1c3RlciBtZW1iZXJzIGNhbiBiZSBhZGRlZCB0byB0aGUgY2x1c3RlciBhcyByZXF1aXJlZC4gQSBjbHVzdGVyIHJlcXVpcmVzIG9uZSBjb21wdXRlciB0byBzZXJ2ZSB0aGlzIHJvbGUuIFRoZSBvdGhlciBjbHVzdGVyIG1lbWJlciBzZXJ2ZXJzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW4gdGhlIHNhbWUgY2x1c3RlciBiZWdpbiBvcGVyYXRpb24gYXMgYSBjbHVzdGVyIG1lbWJlciBieSBjb25uZWN0aW5nIHRvIHRoZSBjbHVzdGVyIGNvbnRyb2xsZXIuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBtdXN0IGhhdmUgVlBOIFNlcnZlciBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMuIEFsc28sIHdoZW4gdGhpcyBBUEkgaXMgZXhlY3V0ZWQsIFZQTiBTZXJ2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IHJlc3RhcnQuIFRoaXMgQVBJIGNhbm5vdCBiZSBjYWxsZWQgb24gVlBOIEJyaWRnZS4gKi9cclxuICAgICAgICB0aGlzLlNldEZhcm1TZXR0aW5nID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJTZXRGYXJtU2V0dGluZ1wiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogR2V0IENsdXN0ZXJpbmcgQ29uZmlndXJhdGlvbiBvZiBDdXJyZW50IFZQTiBTZXJ2ZXIuIFlvdSBjYW4gdXNlIHRoaXMgdG8gYWNxdWlyZSB0aGUgY2x1c3RlcmluZyBjb25maWd1cmF0aW9uIG9mIHRoZSBjdXJyZW50IFZQTiBTZXJ2ZXIuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBtdXN0IGhhdmUgVlBOIFNlcnZlciBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMuICovXHJcbiAgICAgICAgdGhpcy5HZXRGYXJtU2V0dGluZyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkdldEZhcm1TZXR0aW5nXCIsIG5ldyBWcG5ScGNGYXJtKCkpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIEdldCBDbHVzdGVyIE1lbWJlciBJbmZvcm1hdGlvbi4gV2hlbiB0aGUgVlBOIFNlcnZlciBpcyBvcGVyYXRpbmcgYXMgYSBjbHVzdGVyIGNvbnRyb2xsZXIsIHlvdSBjYW4gZ2V0IGluZm9ybWF0aW9uIG9uIGNsdXN0ZXIgbWVtYmVyIHNlcnZlcnMgb24gdGhhdCBjbHVzdGVyIGJ5IHNwZWNpZnlpbmcgdGhlIElEcyBvZiB0aGUgbWVtYmVyIHNlcnZlcnMuIFlvdSBjYW4gZ2V0IHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNwZWNpZmllZCBjbHVzdGVyIG1lbWJlciBzZXJ2ZXI6IFNlcnZlciBUeXBlLCBUaW1lIENvbm5lY3Rpb24gaGFzIGJlZW4gRXN0YWJsaXNoZWQsIElQIEFkZHJlc3MsIEhvc3QgTmFtZSwgUG9pbnRzLCBQdWJsaWMgUG9ydCBMaXN0LCBOdW1iZXIgb2YgT3BlcmF0aW5nIFZpcnR1YWwgSHVicywgRmlyc3QgVmlydHVhbCBIdWIsIE51bWJlciBvZiBTZXNzaW9ucyBhbmQgTnVtYmVyIG9mIFRDUCBDb25uZWN0aW9ucy4gVGhpcyBBUEkgY2Fubm90IGJlIGludm9rZWQgb24gVlBOIEJyaWRnZS4gKi9cclxuICAgICAgICB0aGlzLkdldEZhcm1JbmZvID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJHZXRGYXJtSW5mb1wiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogR2V0IExpc3Qgb2YgQ2x1c3RlciBNZW1iZXJzLiBVc2UgdGhpcyBBUEkgd2hlbiB0aGUgVlBOIFNlcnZlciBpcyBvcGVyYXRpbmcgYXMgYSBjbHVzdGVyIGNvbnRyb2xsZXIgdG8gZ2V0IGEgbGlzdCBvZiB0aGUgY2x1c3RlciBtZW1iZXIgc2VydmVycyBvbiB0aGUgc2FtZSBjbHVzdGVyLCBpbmNsdWRpbmcgdGhlIGNsdXN0ZXIgY29udHJvbGxlciBpdHNlbGYuIEZvciBlYWNoIG1lbWJlciwgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBpcyBhbHNvIGxpc3RlZDogVHlwZSwgQ29ubmVjdGlvbiBTdGFydCwgSG9zdCBOYW1lLCBQb2ludHMsIE51bWJlciBvZiBTZXNzaW9uLCBOdW1iZXIgb2YgVENQIENvbm5lY3Rpb25zLCBOdW1iZXIgb2YgT3BlcmF0aW5nIFZpcnR1YWwgSHVicywgVXNpbmcgQ2xpZW50IENvbm5lY3Rpb24gTGljZW5zZSBhbmQgVXNpbmcgQnJpZGdlIENvbm5lY3Rpb24gTGljZW5zZS4gVGhpcyBBUEkgY2Fubm90IGJlIGludm9rZWQgb24gVlBOIEJyaWRnZS4gKi9cclxuICAgICAgICB0aGlzLkVudW1GYXJtTWVtYmVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiRW51bUZhcm1NZW1iZXJcIiwgbmV3IFZwblJwY0VudW1GYXJtKCkpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIEdldCBDb25uZWN0aW9uIFN0YXR1cyB0byBDbHVzdGVyIENvbnRyb2xsZXIuIFVzZSB0aGlzIEFQSSB3aGVuIHRoZSBWUE4gU2VydmVyIGlzIG9wZXJhdGluZyBhcyBhIGNsdXN0ZXIgY29udHJvbGxlciB0byBnZXQgdGhlIHN0YXR1cyBvZiBjb25uZWN0aW9uIHRvIHRoZSBjbHVzdGVyIGNvbnRyb2xsZXIuIFlvdSBjYW4gZ2V0IHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246IENvbnRyb2xsZXIgSVAgQWRkcmVzcywgUG9ydCBOdW1iZXIsIENvbm5lY3Rpb24gU3RhdHVzLCBDb25uZWN0aW9uIFN0YXJ0IFRpbWUsIEZpcnN0IENvbm5lY3Rpb24gRXN0YWJsaXNoZWQgVGltZSwgQ3VycmVudCBDb25uZWN0aW9uIEVzdGFibGlzaGVkIFRpbWUsIE51bWJlciBvZiBDb25uZWN0aW9uIEF0dGVtcHRzLCBOdW1iZXIgb2YgU3VjY2Vzc2Z1bCBDb25uZWN0aW9ucywgTnVtYmVyIG9mIEZhaWxlZCBDb25uZWN0aW9ucy4gVGhpcyBBUEkgY2Fubm90IGJlIGludm9rZWQgb24gVlBOIEJyaWRnZS4gKi9cclxuICAgICAgICB0aGlzLkdldEZhcm1Db25uZWN0aW9uU3RhdHVzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiR2V0RmFybUNvbm5lY3Rpb25TdGF0dXNcIiwgbmV3IFZwblJwY0Zhcm1Db25uZWN0aW9uU3RhdHVzKCkpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIFNldCBTU0wgQ2VydGlmaWNhdGUgYW5kIFByaXZhdGUgS2V5IG9mIFZQTiBTZXJ2ZXIuIFlvdSBjYW4gc2V0IHRoZSBTU0wgY2VydGlmaWNhdGUgdGhhdCB0aGUgVlBOIFNlcnZlciBwcm92aWRlcyB0byB0aGUgY29ubmVjdGVkIGNsaWVudCBhbmQgdGhlIHByaXZhdGUga2V5IGZvciB0aGF0IGNlcnRpZmljYXRlLiBUaGUgY2VydGlmaWNhdGUgbXVzdCBiZSBpbiBYLjUwOSBmb3JtYXQgYW5kIHRoZSBwcml2YXRlIGtleSBtdXN0IGJlIEJhc2UgNjQgZW5jb2RlZCBmb3JtYXQuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBtdXN0IGhhdmUgVlBOIFNlcnZlciBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMuICovXHJcbiAgICAgICAgdGhpcy5TZXRTZXJ2ZXJDZXJ0ID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJTZXRTZXJ2ZXJDZXJ0XCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBHZXQgU1NMIENlcnRpZmljYXRlIGFuZCBQcml2YXRlIEtleSBvZiBWUE4gU2VydmVyLiBVc2UgdGhpcyB0byBnZXQgdGhlIFNTTCBjZXJ0aWZpY2F0ZSBwcml2YXRlIGtleSB0aGF0IHRoZSBWUE4gU2VydmVyIHByb3ZpZGVzIHRvIHRoZSBjb25uZWN0ZWQgY2xpZW50LiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbXVzdCBoYXZlIFZQTiBTZXJ2ZXIgYWRtaW5pc3RyYXRvciBwcml2aWxlZ2VzLiAqL1xyXG4gICAgICAgIHRoaXMuR2V0U2VydmVyQ2VydCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkdldFNlcnZlckNlcnRcIiwgbmV3IFZwblJwY0tleVBhaXIoKSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogR2V0IHRoZSBFbmNyeXB0ZWQgQWxnb3JpdGhtIFVzZWQgZm9yIFZQTiBDb21tdW5pY2F0aW9uLiBVc2UgdGhpcyBBUEkgdG8gZ2V0IHRoZSBjdXJyZW50IHNldHRpbmcgb2YgdGhlIGFsZ29yaXRobSB1c2VkIGZvciB0aGUgZWxlY3Ryb25pYyBzaWduYXR1cmUgYW5kIGVuY3J5cHRlZCBmb3IgU1NMIGNvbm5lY3Rpb24gdG8gYmUgdXNlZCBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBWUE4gU2VydmVyIGFuZCB0aGUgY29ubmVjdGVkIGNsaWVudCBhbmQgdGhlIGxpc3Qgb2YgYWxnb3JpdGhtcyB0aGF0IGNhbiBiZSB1c2VkIG9uIHRoZSBWUE4gU2VydmVyLiAqL1xyXG4gICAgICAgIHRoaXMuR2V0U2VydmVyQ2lwaGVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiR2V0U2VydmVyQ2lwaGVyXCIsIG5ldyBWcG5ScGNTdHIoKSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogU2V0IHRoZSBFbmNyeXB0ZWQgQWxnb3JpdGhtIFVzZWQgZm9yIFZQTiBDb21tdW5pY2F0aW9uLiBVc2UgdGhpcyBBUEkgdG8gc2V0IHRoZSBhbGdvcml0aG0gdXNlZCBmb3IgdGhlIGVsZWN0cm9uaWMgc2lnbmF0dXJlIGFuZCBlbmNyeXB0ZWQgZm9yIFNTTCBjb25uZWN0aW9ucyB0byBiZSB1c2VkIGZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIFZQTiBTZXJ2ZXIgYW5kIHRoZSBjb25uZWN0ZWQgY2xpZW50LiBCeSBzcGVjaWZ5aW5nIHRoZSBhbGdvcml0aG0gbmFtZSwgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gd2lsbCBiZSB1c2VkIGxhdGVyIGJldHdlZW4gdGhlIFZQTiBDbGllbnQgYW5kIFZQTiBCcmlkZ2UgY29ubmVjdGVkIHRvIHRoaXMgc2VydmVyIGFuZCB0aGUgZGF0YSB3aWxsIGJlIGVuY3J5cHRlZC4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG11c3QgaGF2ZSBWUE4gU2VydmVyIGFkbWluaXN0cmF0b3IgcHJpdmlsZWdlcy4gKi9cclxuICAgICAgICB0aGlzLlNldFNlcnZlckNpcGhlciA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiU2V0U2VydmVyQ2lwaGVyXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBDcmVhdGUgTmV3IFZpcnR1YWwgSHViLiBVc2UgdGhpcyB0byBjcmVhdGUgYSBuZXcgVmlydHVhbCBIdWIgb24gdGhlIFZQTiBTZXJ2ZXIuIFRoZSBjcmVhdGVkIFZpcnR1YWwgSHViIHdpbGwgYmVnaW4gb3BlcmF0aW9uIGltbWVkaWF0ZWx5LiBXaGVuIHRoZSBWUE4gU2VydmVyIGlzIG9wZXJhdGluZyBvbiBhIGNsdXN0ZXIsIHRoaXMgQVBJIGlzIG9ubHkgdmFsaWQgZm9yIHRoZSBjbHVzdGVyIGNvbnRyb2xsZXIuIEFsc28sIHRoZSBuZXcgVmlydHVhbCBIdWIgd2lsbCBvcGVyYXRlIGFzIGEgZHluYW1pYyBWaXJ0dWFsIEh1Yi4gWW91IGNhbiBjaGFuZ2UgaXQgdG8gYSBzdGF0aWMgVmlydHVhbCBIdWIgYnkgdXNpbmcgdGhlIFNldEh1YiBBUEkuIFRvIGdldCBhIGxpc3Qgb2YgVmlydHVhbCBIdWJzIHRoYXQgYXJlIGFscmVhZHkgb24gdGhlIFZQTiBTZXJ2ZXIsIHVzZSB0aGUgRW51bUh1YiBBUEkuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBtdXN0IGhhdmUgVlBOIFNlcnZlciBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMuIEFsc28sIHRoaXMgQVBJIGRvZXMgbm90IG9wZXJhdGUgb24gVlBOIFNlcnZlcnMgdGhhdCBhcmUgb3BlcmF0aW5nIGFzIGEgVlBOIEJyaWRnZSBvciBjbHVzdGVyIG1lbWJlci4gKi9cclxuICAgICAgICB0aGlzLkNyZWF0ZUh1YiA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiQ3JlYXRlSHViXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBTZXQgdGhlIFZpcnR1YWwgSHViIGNvbmZpZ3VyYXRpb24uIFlvdSBjYW4gY2FsbCB0aGlzIEFQSSB0byBjaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHNwZWNpZmllZCBWaXJ0dWFsIEh1Yi4gWW91IGNhbiBzZXQgdGhlIFZpcnR1YWwgSHViIG9ubGluZSBvciBvZmZsaW5lLiBZb3UgY2FuIHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2Vzc2lvbnMgdGhhdCBjYW4gYmUgY29uY3VycmVudGx5IGNvbm5lY3RlZCB0byB0aGUgVmlydHVhbCBIdWIgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgbWFuYWdlZC4gWW91IGNhbiBzZXQgdGhlIFZpcnR1YWwgSHViIGFkbWluaXN0cmF0b3IgcGFzc3dvcmQuIFlvdSBjYW4gc2V0IG90aGVyIHBhcmFtZXRlcnMgZm9yIHRoZSBWaXJ0dWFsIEh1Yi4gQmVmb3JlIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIHRvIG9idGFpbiB0aGUgbGF0ZXN0IHN0YXRlIG9mIHRoZSBWaXJ0dWFsIEh1YiBieSB1c2luZyB0aGUgR2V0SHViIEFQSS4gKi9cclxuICAgICAgICB0aGlzLlNldEh1YiA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiU2V0SHViXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBHZXQgdGhlIFZpcnR1YWwgSHViIGNvbmZpZ3VyYXRpb24uIFlvdSBjYW4gY2FsbCB0aGlzIEFQSSB0byBnZXQgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIFZpcnR1YWwgSHViLiBUbyBjaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIFZpcnR1YWwgSHViLCBjYWxsIHRoZSBTZXRIdWIgQVBJLiAqL1xyXG4gICAgICAgIHRoaXMuR2V0SHViID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJHZXRIdWJcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIEdldCBMaXN0IG9mIFZpcnR1YWwgSHVicy4gVXNlIHRoaXMgdG8gZ2V0IGEgbGlzdCBvZiBleGlzdGluZyBWaXJ0dWFsIEh1YnMgb24gdGhlIFZQTiBTZXJ2ZXIuIEZvciBlYWNoIFZpcnR1YWwgSHViLCB5b3UgY2FuIGdldCB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOiBWaXJ0dWFsIEh1YiBOYW1lLCBTdGF0dXMsIFR5cGUsIE51bWJlciBvZiBVc2VycywgTnVtYmVyIG9mIEdyb3VwcywgTnVtYmVyIG9mIFNlc3Npb25zLCBOdW1iZXIgb2YgTUFDIFRhYmxlcywgTnVtYmVyIG9mIElQIFRhYmxlcywgTnVtYmVyIG9mIExvZ2lucywgTGFzdCBMb2dpbiwgYW5kIExhc3QgQ29tbXVuaWNhdGlvbi4gTm90ZSB0aGF0IHdoZW4gY29ubmVjdGluZyBpbiBWaXJ0dWFsIEh1YiBBZG1pbiBNb2RlLCBpZiBpbiB0aGUgb3B0aW9ucyBvZiBhIFZpcnR1YWwgSHViIHRoYXQgeW91IGRvIG5vdCBoYXZlIGFkbWluaXN0cmF0b3IgcHJpdmlsZWdlcyBmb3IsIHRoZSBvcHRpb24gRG9uJ3QgRW51bWVyYXRlIHRoaXMgVmlydHVhbCBIdWIgZm9yIEFub255bW91cyBVc2VycyBpcyBlbmFibGVkIHRoZW4gdGhhdCBWaXJ0dWFsIEh1YiB3aWxsIG5vdCBiZSBlbnVtZXJhdGVkLiBJZiB5b3UgYXJlIGNvbm5lY3RlZCBpbiBTZXJ2ZXIgQWRtaW4gTW9kZSwgdGhlbiB0aGUgbGlzdCBvZiBhbGwgVmlydHVhbCBIdWJzIHdpbGwgYmUgZGlzcGxheWVkLiBXaGVuIGNvbm5lY3RpbmcgdG8gYW5kIG1hbmFnaW5nIGEgbm9uLWNsdXN0ZXItY29udHJvbGxlciBjbHVzdGVyIG1lbWJlciBvZiBhIGNsdXN0ZXJpbmcgZW52aXJvbm1lbnQsIG9ubHkgdGhlIFZpcnR1YWwgSHViIGN1cnJlbnRseSBiZWluZyBob3N0ZWQgYnkgdGhhdCBWUE4gU2VydmVyIHdpbGwgYmUgZGlzcGxheWVkLiBXaGVuIGNvbm5lY3RpbmcgdG8gYSBjbHVzdGVyIGNvbnRyb2xsZXIgZm9yIGFkbWluaXN0cmF0aW9uIHB1cnBvc2VzLCBhbGwgdGhlIFZpcnR1YWwgSHVicyB3aWxsIGJlIGRpc3BsYXllZC4gKi9cclxuICAgICAgICB0aGlzLkVudW1IdWIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJFbnVtSHViXCIsIG5ldyBWcG5ScGNFbnVtSHViKCkpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIERlbGV0ZSBWaXJ0dWFsIEh1Yi4gVXNlIHRoaXMgdG8gZGVsZXRlIGFuIGV4aXN0aW5nIFZpcnR1YWwgSHViIG9uIHRoZSBWUE4gU2VydmVyLiBJZiB5b3UgZGVsZXRlIHRoZSBWaXJ0dWFsIEh1YiwgYWxsIHNlc3Npb25zIHRoYXQgYXJlIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8gdGhlIFZpcnR1YWwgSHViIHdpbGwgYmUgZGlzY29ubmVjdGVkIGFuZCBuZXcgc2Vzc2lvbnMgd2lsbCBiZSB1bmFibGUgdG8gY29ubmVjdCB0byB0aGUgVmlydHVhbCBIdWIuIEFsc28sIHRoaXMgd2lsbCBhbHNvIGRlbGV0ZSBhbGwgdGhlIEh1YiBzZXR0aW5ncywgdXNlciBvYmplY3RzLCBncm91cCBvYmplY3RzLCBjZXJ0aWZpY2F0ZXMgYW5kIENhc2NhZGUgQ29ubmVjdGlvbnMuIE9uY2UgeW91IGRlbGV0ZSB0aGUgVmlydHVhbCBIdWIsIGl0IGNhbm5vdCBiZSByZWNvdmVyZWQuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBtdXN0IGhhdmUgVlBOIFNlcnZlciBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMuIEFsc28sIHRoaXMgQVBJIGRvZXMgbm90IG9wZXJhdGUgb24gVlBOIFNlcnZlcnMgdGhhdCBhcmUgb3BlcmF0aW5nIGFzIGEgVlBOIEJyaWRnZSBvciBjbHVzdGVyIG1lbWJlci4gKi9cclxuICAgICAgICB0aGlzLkRlbGV0ZUh1YiA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiRGVsZXRlSHViXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBHZXQgU2V0dGluZyBvZiBSQURJVVMgU2VydmVyIFVzZWQgZm9yIFVzZXIgQXV0aGVudGljYXRpb24uIFVzZSB0aGlzIHRvIGdldCB0aGUgY3VycmVudCBzZXR0aW5ncyBmb3IgdGhlIFJBRElVUyBzZXJ2ZXIgdXNlZCB3aGVuIGEgdXNlciBjb25uZWN0cyB0byB0aGUgY3VycmVudGx5IG1hbmFnZWQgVmlydHVhbCBIdWIgdXNpbmcgUkFESVVTIFNlcnZlciBBdXRoZW50aWNhdGlvbiBNb2RlLiBUaGlzIEFQSSBjYW5ub3QgYmUgaW52b2tlZCBvbiBWUE4gQnJpZGdlLiBZb3UgY2Fubm90IGV4ZWN1dGUgdGhpcyBBUEkgZm9yIFZpcnR1YWwgSHVicyBvZiBWUE4gU2VydmVycyBvcGVyYXRpbmcgYXMgYSBjbHVzdGVyLiAqL1xyXG4gICAgICAgIHRoaXMuR2V0SHViUmFkaXVzID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJHZXRIdWJSYWRpdXNcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIFNldCBSQURJVVMgU2VydmVyIHRvIHVzZSBmb3IgVXNlciBBdXRoZW50aWNhdGlvbi4gVG8gYWNjZXB0IHVzZXJzIHRvIHRoZSBjdXJyZW50bHkgbWFuYWdlZCBWaXJ0dWFsIEh1YiBpbiBSQURJVVMgc2VydmVyIGF1dGhlbnRpY2F0aW9uIG1vZGUsIHlvdSBjYW4gc3BlY2lmeSBhbiBleHRlcm5hbCBSQURJVVMgc2VydmVyIHRoYXQgY29uZmlybXMgdGhlIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQuIChZb3UgY2FuIHNwZWNpZnkgbXVsdGlwbGUgaG9zdG5hbWUgYnkgc3BsaXR0aW5nIHdpdGggY29tbWEgb3Igc2VtaWNvbG9uLikgVGhlIFJBRElVUyBzZXJ2ZXIgbXVzdCBiZSBzZXQgdG8gcmVjZWl2ZSByZXF1ZXN0cyBmcm9tIElQIGFkZHJlc3NlcyBvZiB0aGlzIFZQTiBTZXJ2ZXIuIEFsc28sIGF1dGhlbnRpY2F0aW9uIGJ5IFBhc3N3b3JkIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sIChQQVApIG11c3QgYmUgZW5hYmxlZC4gVGhpcyBBUEkgY2Fubm90IGJlIGludm9rZWQgb24gVlBOIEJyaWRnZS4gWW91IGNhbm5vdCBleGVjdXRlIHRoaXMgQVBJIGZvciBWaXJ0dWFsIEh1YnMgb2YgVlBOIFNlcnZlcnMgb3BlcmF0aW5nIGFzIGEgY2x1c3Rlci4gKi9cclxuICAgICAgICB0aGlzLlNldEh1YlJhZGl1cyA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiU2V0SHViUmFkaXVzXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBHZXQgTGlzdCBvZiBUQ1AgQ29ubmVjdGlvbnMgQ29ubmVjdGluZyB0byB0aGUgVlBOIFNlcnZlci4gVXNlIHRoaXMgdG8gZ2V0IGEgbGlzdCBvZiBUQ1AvSVAgY29ubmVjdGlvbnMgdGhhdCBhcmUgY3VycmVudGx5IGNvbm5lY3RpbmcgdG8gdGhlIFZQTiBTZXJ2ZXIuIEl0IGRvZXMgbm90IGRpc3BsYXkgdGhlIFRDUCBjb25uZWN0aW9ucyB0aGF0IGhhdmUgYmVlbiBlc3RhYmxpc2hlZCBhcyBWUE4gc2Vzc2lvbnMuIFRvIGdldCB0aGUgbGlzdCBvZiBUQ1AvSVAgY29ubmVjdGlvbnMgdGhhdCBoYXZlIGJlZW4gZXN0YWJsaXNoZWQgYXMgVlBOIHNlc3Npb25zLCB5b3UgY2FuIHVzZSB0aGUgRW51bVNlc3Npb24gQVBJLiBZb3UgY2FuIGdldCB0aGUgZm9sbG93aW5nOiBDb25uZWN0aW9uIE5hbWUsIENvbm5lY3Rpb24gU291cmNlLCBDb25uZWN0aW9uIFN0YXJ0IGFuZCBUeXBlLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbXVzdCBoYXZlIFZQTiBTZXJ2ZXIgYWRtaW5pc3RyYXRvciBwcml2aWxlZ2VzLiAqL1xyXG4gICAgICAgIHRoaXMuRW51bUNvbm5lY3Rpb24gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJFbnVtQ29ubmVjdGlvblwiLCBuZXcgVnBuUnBjRW51bUNvbm5lY3Rpb24oKSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogRGlzY29ubmVjdCBUQ1AgQ29ubmVjdGlvbnMgQ29ubmVjdGluZyB0byB0aGUgVlBOIFNlcnZlci4gVXNlIHRoaXMgdG8gZm9yY2VmdWxseSBkaXNjb25uZWN0IHNwZWNpZmljIFRDUC9JUCBjb25uZWN0aW9ucyB0aGF0IGFyZSBjb25uZWN0aW5nIHRvIHRoZSBWUE4gU2VydmVyLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbXVzdCBoYXZlIFZQTiBTZXJ2ZXIgYWRtaW5pc3RyYXRvciBwcml2aWxlZ2VzLiAqL1xyXG4gICAgICAgIHRoaXMuRGlzY29ubmVjdENvbm5lY3Rpb24gPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkRpc2Nvbm5lY3RDb25uZWN0aW9uXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBHZXQgSW5mb3JtYXRpb24gb2YgVENQIENvbm5lY3Rpb25zIENvbm5lY3RpbmcgdG8gdGhlIFZQTiBTZXJ2ZXIuIFVzZSB0aGlzIHRvIGdldCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvZiBhIHNwZWNpZmljIFRDUC9JUCBjb25uZWN0aW9uIHRoYXQgaXMgY29ubmVjdGluZyB0byB0aGUgVlBOIFNlcnZlci4gWW91IGNhbiBnZXQgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjogQ29ubmVjdGlvbiBOYW1lLCBDb25uZWN0aW9uIFR5cGUsIFNvdXJjZSBIb3N0bmFtZSwgU291cmNlIElQIEFkZHJlc3MsIFNvdXJjZSBQb3J0IE51bWJlciAoVENQKSwgQ29ubmVjdGlvbiBTdGFydCwgU2VydmVyIFByb2R1Y3QgTmFtZSwgU2VydmVyIFZlcnNpb24sIFNlcnZlciBCdWlsZCBOdW1iZXIsIENsaWVudCBQcm9kdWN0IE5hbWUsIENsaWVudCBWZXJzaW9uLCBhbmQgQ2xpZW50IEJ1aWxkIE51bWJlci4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG11c3QgaGF2ZSBWUE4gU2VydmVyIGFkbWluaXN0cmF0b3IgcHJpdmlsZWdlcy4gKi9cclxuICAgICAgICB0aGlzLkdldENvbm5lY3Rpb25JbmZvID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJHZXRDb25uZWN0aW9uSW5mb1wiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogU3dpdGNoIFZpcnR1YWwgSHViIHRvIE9ubGluZSBvciBPZmZsaW5lLiBVc2UgdGhpcyB0byBzZXQgdGhlIFZpcnR1YWwgSHViIHRvIG9ubGluZSBvciBvZmZsaW5lLiBBIFZpcnR1YWwgSHViIHdpdGggYW4gb2ZmbGluZSBzdGF0dXMgY2Fubm90IHJlY2VpdmUgVlBOIGNvbm5lY3Rpb25zIGZyb20gY2xpZW50cy4gV2hlbiB5b3Ugc2V0IHRoZSBWaXJ0dWFsIEh1YiBvZmZsaW5lLCBhbGwgc2Vzc2lvbnMgd2lsbCBiZSBkaXNjb25uZWN0ZWQuIEEgVmlydHVhbCBIdWIgd2l0aCBhbiBvZmZsaW5lIHN0YXR1cyBjYW5ub3QgcmVjZWl2ZSBWUE4gY29ubmVjdGlvbnMgZnJvbSBjbGllbnRzLiBUaGlzIEFQSSBjYW5ub3QgYmUgaW52b2tlZCBvbiBWUE4gQnJpZGdlLiBZb3UgY2Fubm90IGV4ZWN1dGUgdGhpcyBBUEkgZm9yIFZpcnR1YWwgSHVicyBvZiBWUE4gU2VydmVycyBvcGVyYXRpbmcgYXMgYSBjbHVzdGVyLiAqL1xyXG4gICAgICAgIHRoaXMuU2V0SHViT25saW5lID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJTZXRIdWJPbmxpbmVcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIEdldCBDdXJyZW50IFN0YXR1cyBvZiBWaXJ0dWFsIEh1Yi4gVXNlIHRoaXMgdG8gZ2V0IHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgVmlydHVhbCBIdWIgY3VycmVudGx5IGJlaW5nIG1hbmFnZWQuIFlvdSBjYW4gZ2V0IHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246IFZpcnR1YWwgSHViIFR5cGUsIE51bWJlciBvZiBTZXNzaW9ucywgTnVtYmVyIG9mIEVhY2ggVHlwZSBvZiBPYmplY3QsIE51bWJlciBvZiBMb2dpbnMsIExhc3QgTG9naW4sIExhc3QgQ29tbXVuaWNhdGlvbiwgYW5kIENvbW11bmljYXRpb24gU3RhdGlzdGljYWwgRGF0YS4gKi9cclxuICAgICAgICB0aGlzLkdldEh1YlN0YXR1cyA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiR2V0SHViU3RhdHVzXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBTZXQgdGhlIGxvZ2dpbmcgY29uZmlndXJhdGlvbiBvZiB0aGUgVmlydHVhbCBIdWIuIFVzZSB0aGlzIHRvIGVuYWJsZSBvciBkaXNhYmxlIGEgc2VjdXJpdHkgbG9nIG9yIHBhY2tldCBsb2dzIG9mIHRoZSBWaXJ0dWFsIEh1YiBjdXJyZW50bHkgYmVpbmcgbWFuYWdlZCwgc2V0IHRoZSBzYXZlIGNvbnRlbnRzIG9mIHRoZSBwYWNrZXQgbG9nIGZvciBlYWNoIHR5cGUgb2YgcGFja2V0IHRvIGJlIHNhdmVkLCBhbmQgc2V0IHRoZSBsb2cgZmlsZSBzd2l0Y2ggY3ljbGUgZm9yIHRoZSBzZWN1cml0eSBsb2cgb3IgcGFja2V0IGxvZyB0aGF0IHRoZSBjdXJyZW50bHkgbWFuYWdlZCBWaXJ0dWFsIEh1YiBzYXZlcy4gVGhlcmUgYXJlIHRoZSBmb2xsb3dpbmcgcGFja2V0IHR5cGVzOiBUQ1AgQ29ubmVjdGlvbiBMb2csIFRDUCBQYWNrZXQgTG9nLCBESENQIFBhY2tldCBMb2csIFVEUCBQYWNrZXQgTG9nLCBJQ01QIFBhY2tldCBMb2csIElQIFBhY2tldCBMb2csIEFSUCBQYWNrZXQgTG9nLCBhbmQgRXRoZXJuZXQgUGFja2V0IExvZy4gVG8gZ2V0IHRoZSBjdXJyZW50IHNldHRpbmcsIHlvdSBjYW4gdXNlIHRoZSBMb2dHZXQgQVBJLiBUaGUgbG9nIGZpbGUgc3dpdGNoIGN5Y2xlIGNhbiBiZSBjaGFuZ2VkIHRvIHN3aXRjaCBpbiBldmVyeSBzZWNvbmQsIGV2ZXJ5IG1pbnV0ZSwgZXZlcnkgaG91ciwgZXZlcnkgZGF5LCBldmVyeSBtb250aCBvciBub3Qgc3dpdGNoLiBUbyBnZXQgdGhlIGN1cnJlbnQgc2V0dGluZywgeW91IGNhbiB1c2UgdGhlIEdldEh1YkxvZyBBUEkuICovXHJcbiAgICAgICAgdGhpcy5TZXRIdWJMb2cgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIlNldEh1YkxvZ1wiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogR2V0IHRoZSBsb2dnaW5nIGNvbmZpZ3VyYXRpb24gb2YgdGhlIFZpcnR1YWwgSHViLiBVc2UgdGhpcyB0byBnZXQgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGEgc2VjdXJpdHkgbG9nIG9yIHBhY2tldCBsb2dzIG9mIHRoZSBWaXJ0dWFsIEh1YiBjdXJyZW50bHkgYmVpbmcgbWFuYWdlZCwgZ2V0IHRoZSBzZXR0aW5nIGZvciBzYXZlIGNvbnRlbnRzIG9mIHRoZSBwYWNrZXQgbG9nIGZvciBlYWNoIHR5cGUgb2YgcGFja2V0IHRvIGJlIHNhdmVkLCBhbmQgZ2V0IHRoZSBsb2cgZmlsZSBzd2l0Y2ggY3ljbGUgZm9yIHRoZSBzZWN1cml0eSBsb2cgb3IgcGFja2V0IGxvZyB0aGF0IHRoZSBjdXJyZW50bHkgbWFuYWdlZCBWaXJ0dWFsIEh1YiBzYXZlcy4gVG8gc2V0IHRoZSBjdXJyZW50IHNldHRpbmcsIHlvdSBjYW4gdXNlIHRoZSBTZXRIdWJMb2cgQVBJLiAqL1xyXG4gICAgICAgIHRoaXMuR2V0SHViTG9nID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJHZXRIdWJMb2dcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIEFkZCBUcnVzdGVkIENBIENlcnRpZmljYXRlLiBVc2UgdGhpcyB0byBhZGQgYSBuZXcgY2VydGlmaWNhdGUgdG8gYSBsaXN0IG9mIENBIGNlcnRpZmljYXRlcyB0cnVzdGVkIGJ5IHRoZSBjdXJyZW50bHkgbWFuYWdlZCBWaXJ0dWFsIEh1Yi4gVGhlIGxpc3Qgb2YgY2VydGlmaWNhdGUgYXV0aG9yaXR5IGNlcnRpZmljYXRlcyB0aGF0IGFyZSByZWdpc3RlcmVkIGlzIHVzZWQgdG8gdmVyaWZ5IGNlcnRpZmljYXRlcyB3aGVuIGEgVlBOIENsaWVudCBpcyBjb25uZWN0ZWQgaW4gc2lnbmVkIGNlcnRpZmljYXRlIGF1dGhlbnRpY2F0aW9uIG1vZGUuIFRvIGdldCBhIGxpc3Qgb2YgdGhlIGN1cnJlbnQgY2VydGlmaWNhdGVzIHlvdSBjYW4gdXNlIHRoZSBFbnVtQ2EgQVBJLiBUaGUgY2VydGlmaWNhdGUgeW91IGFkZCBtdXN0IGJlIHNhdmVkIGluIHRoZSBYLjUwOSBmaWxlIGZvcm1hdC4gVGhpcyBBUEkgY2Fubm90IGJlIGludm9rZWQgb24gVlBOIEJyaWRnZS4gWW91IGNhbm5vdCBleGVjdXRlIHRoaXMgQVBJIGZvciBWaXJ0dWFsIEh1YnMgb2YgVlBOIFNlcnZlcnMgb3BlcmF0aW5nIGFzIGEgbWVtYmVyIHNlcnZlciBvbiBhIGNsdXN0ZXIuICovXHJcbiAgICAgICAgdGhpcy5BZGRDYSA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiQWRkQ2FcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIEdldCBMaXN0IG9mIFRydXN0ZWQgQ0EgQ2VydGlmaWNhdGVzLiBIZXJlIHlvdSBjYW4gbWFuYWdlIHRoZSBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkgY2VydGlmaWNhdGVzIHRoYXQgYXJlIHRydXN0ZWQgYnkgdGhpcyBjdXJyZW50bHkgbWFuYWdlZCBWaXJ0dWFsIEh1Yi4gVGhlIGxpc3Qgb2YgY2VydGlmaWNhdGUgYXV0aG9yaXR5IGNlcnRpZmljYXRlcyB0aGF0IGFyZSByZWdpc3RlcmVkIGlzIHVzZWQgdG8gdmVyaWZ5IGNlcnRpZmljYXRlcyB3aGVuIGEgVlBOIENsaWVudCBpcyBjb25uZWN0ZWQgaW4gc2lnbmVkIGNlcnRpZmljYXRlIGF1dGhlbnRpY2F0aW9uIG1vZGUuIFRoaXMgQVBJIGNhbm5vdCBiZSBpbnZva2VkIG9uIFZQTiBCcmlkZ2UuIFlvdSBjYW5ub3QgZXhlY3V0ZSB0aGlzIEFQSSBmb3IgVmlydHVhbCBIdWJzIG9mIFZQTiBTZXJ2ZXJzIG9wZXJhdGluZyBhcyBhIG1lbWJlciBzZXJ2ZXIgb24gYSBjbHVzdGVyLiAqL1xyXG4gICAgICAgIHRoaXMuRW51bUNhID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJFbnVtQ2FcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIEdldCBUcnVzdGVkIENBIENlcnRpZmljYXRlLiBVc2UgdGhpcyB0byBnZXQgYW4gZXhpc3RpbmcgY2VydGlmaWNhdGUgZnJvbSB0aGUgbGlzdCBvZiBDQSBjZXJ0aWZpY2F0ZXMgdHJ1c3RlZCBieSB0aGUgY3VycmVudGx5IG1hbmFnZWQgVmlydHVhbCBIdWIgYW5kIHNhdmUgaXQgYXMgYSBmaWxlIGluIFguNTA5IGZvcm1hdC4gVGhpcyBBUEkgY2Fubm90IGJlIGludm9rZWQgb24gVlBOIEJyaWRnZS4gWW91IGNhbm5vdCBleGVjdXRlIHRoaXMgQVBJIGZvciBWaXJ0dWFsIEh1YnMgb2YgVlBOIFNlcnZlcnMgb3BlcmF0aW5nIGFzIGEgbWVtYmVyIHNlcnZlciBvbiBhIGNsdXN0ZXIuICovXHJcbiAgICAgICAgdGhpcy5HZXRDYSA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiR2V0Q2FcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIERlbGV0ZSBUcnVzdGVkIENBIENlcnRpZmljYXRlLiBVc2UgdGhpcyB0byBkZWxldGUgYW4gZXhpc3RpbmcgY2VydGlmaWNhdGUgZnJvbSB0aGUgbGlzdCBvZiBDQSBjZXJ0aWZpY2F0ZXMgdHJ1c3RlZCBieSB0aGUgY3VycmVudGx5IG1hbmFnZWQgVmlydHVhbCBIdWIuIFRvIGdldCBhIGxpc3Qgb2YgdGhlIGN1cnJlbnQgY2VydGlmaWNhdGVzIHlvdSBjYW4gdXNlIHRoZSBFbnVtQ2EgQVBJLiBUaGlzIEFQSSBjYW5ub3QgYmUgaW52b2tlZCBvbiBWUE4gQnJpZGdlLiBZb3UgY2Fubm90IGV4ZWN1dGUgdGhpcyBBUEkgZm9yIFZpcnR1YWwgSHVicyBvZiBWUE4gU2VydmVycyBvcGVyYXRpbmcgYXMgYSBtZW1iZXIgc2VydmVyIG9uIGEgY2x1c3Rlci4gKi9cclxuICAgICAgICB0aGlzLkRlbGV0ZUNhID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJEZWxldGVDYVwiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogQ3JlYXRlIE5ldyBDYXNjYWRlIENvbm5lY3Rpb24uIFVzZSB0aGlzIHRvIGNyZWF0ZSBhIG5ldyBDYXNjYWRlIENvbm5lY3Rpb24gb24gdGhlIGN1cnJlbnRseSBtYW5hZ2VkIFZpcnR1YWwgSHViLiBCeSB1c2luZyBhIENhc2NhZGUgQ29ubmVjdGlvbiwgeW91IGNhbiBjb25uZWN0IHRoaXMgVmlydHVhbCBIdWIgYnkgQ2FzY2FkZSBDb25uZWN0aW9uIHRvIGFub3RoZXIgVmlydHVhbCBIdWIgdGhhdCBpcyBvcGVyYXRpbmcgb24gdGhlIHNhbWUgb3IgYSBkaWZmZXJlbnQgY29tcHV0ZXIuIFRvIGNyZWF0ZSBhIENhc2NhZGUgQ29ubmVjdGlvbiwgeW91IG11c3Qgc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgQ2FzY2FkZSBDb25uZWN0aW9uLCBkZXN0aW5hdGlvbiBzZXJ2ZXIgYW5kIGRlc3RpbmF0aW9uIFZpcnR1YWwgSHViIGFuZCB1c2VyIG5hbWUuIFdoZW4gYSBuZXcgQ2FzY2FkZSBDb25uZWN0aW9uIGlzIGNyZWF0ZWQsIHRoZSB0eXBlIG9mIHVzZXIgYXV0aGVudGljYXRpb24gaXMgaW5pdGlhbGx5IHNldCBhcyBBbm9ueW1vdXMgQXV0aGVudGljYXRpb24gYW5kIHRoZSBwcm94eSBzZXJ2ZXIgc2V0dGluZyBhbmQgdGhlIHZlcmlmaWNhdGlvbiBvcHRpb25zIG9mIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgaXMgbm90IHNldC4gVG8gY2hhbmdlIHRoZXNlIHNldHRpbmdzIGFuZCBvdGhlciBhZHZhbmNlZCBzZXR0aW5ncyBhZnRlciBhIENhc2NhZGUgQ29ubmVjdGlvbiBoYXMgYmVlbiBjcmVhdGVkLCB1c2UgdGhlIG90aGVyIEFQSXMgdGhhdCBpbmNsdWRlIHRoZSBuYW1lIFwiTGlua1wiLiBbV2FybmluZyBBYm91dCBDYXNjYWRlIENvbm5lY3Rpb25zXSBCeSBjb25uZWN0aW5nIHVzaW5nIGEgQ2FzY2FkZSBDb25uZWN0aW9uIHlvdSBjYW4gY3JlYXRlIGEgTGF5ZXIgMiBicmlkZ2UgYmV0d2VlbiBtdWx0aXBsZSBWaXJ0dWFsIEh1YnMgYnV0IGlmIHRoZSBjb25uZWN0aW9uIGlzIGluY29ycmVjdGx5IGNvbmZpZ3VyZWQsIGEgbG9vcGJhY2sgQ2FzY2FkZSBDb25uZWN0aW9uIGNvdWxkIGluYWR2ZXJ0ZW50bHkgYmUgY3JlYXRlZC4gV2hlbiB1c2luZyBhIENhc2NhZGUgQ29ubmVjdGlvbiBmdW5jdGlvbiBwbGVhc2UgZGVzaWduIHRoZSBuZXR3b3JrIHRvcG9sb2d5IHdpdGggY2FyZS4gWW91IGNhbm5vdCBleGVjdXRlIHRoaXMgQVBJIGZvciBWaXJ0dWFsIEh1YnMgb2YgVlBOIFNlcnZlcnMgb3BlcmF0aW5nIGFzIGEgY2x1c3Rlci4gKi9cclxuICAgICAgICB0aGlzLkNyZWF0ZUxpbmsgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkNyZWF0ZUxpbmtcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIEdldCB0aGUgQ2FzY2FkZSBDb25uZWN0aW9uIFNldHRpbmcuIFVzZSB0aGlzIHRvIGdldCB0aGUgQ29ubmVjdGlvbiBTZXR0aW5nIG9mIGEgQ2FzY2FkZSBDb25uZWN0aW9uIHRoYXQgaXMgcmVnaXN0ZXJlZCBvbiB0aGUgY3VycmVudGx5IG1hbmFnZWQgVmlydHVhbCBIdWIuIFRvIGNoYW5nZSB0aGUgQ29ubmVjdGlvbiBTZXR0aW5nIGNvbnRlbnRzIG9mIHRoZSBDYXNjYWRlIENvbm5lY3Rpb24sIHVzZSB0aGUgQVBJcyB0aGF0IGluY2x1ZGUgdGhlIG5hbWUgXCJMaW5rXCIgYWZ0ZXIgY3JlYXRpbmcgdGhlIENhc2NhZGUgQ29ubmVjdGlvbi4gWW91IGNhbm5vdCBleGVjdXRlIHRoaXMgQVBJIGZvciBWaXJ0dWFsIEh1YnMgb2YgVlBOIFNlcnZlcnMgb3BlcmF0aW5nIGFzIGEgY2x1c3Rlci4gKi9cclxuICAgICAgICB0aGlzLkdldExpbmsgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkdldExpbmtcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIENoYW5nZSBFeGlzdGluZyBDYXNjYWRlIENvbm5lY3Rpb24uIFVzZSB0aGlzIHRvIGFsdGVyIHRoZSBzZXR0aW5nIG9mIGFuIGV4aXN0aW5nIENhc2NhZGUgQ29ubmVjdGlvbiBvbiB0aGUgY3VycmVudGx5IG1hbmFnZWQgVmlydHVhbCBIdWIuICovXHJcbiAgICAgICAgdGhpcy5TZXRMaW5rID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJTZXRMaW5rXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBHZXQgTGlzdCBvZiBDYXNjYWRlIENvbm5lY3Rpb25zLiBVc2UgdGhpcyB0byBnZXQgYSBsaXN0IG9mIENhc2NhZGUgQ29ubmVjdGlvbnMgdGhhdCBhcmUgcmVnaXN0ZXJlZCBvbiB0aGUgY3VycmVudGx5IG1hbmFnZWQgVmlydHVhbCBIdWIuIEJ5IHVzaW5nIGEgQ2FzY2FkZSBDb25uZWN0aW9uLCB5b3UgY2FuIGNvbm5lY3QgdGhpcyBWaXJ0dWFsIEh1YiBieSBMYXllciAyIENhc2NhZGUgQ29ubmVjdGlvbiB0byBhbm90aGVyIFZpcnR1YWwgSHViIHRoYXQgaXMgb3BlcmF0aW5nIG9uIHRoZSBzYW1lIG9yIGEgZGlmZmVyZW50IGNvbXB1dGVyLiBbV2FybmluZyBBYm91dCBDYXNjYWRlIENvbm5lY3Rpb25zXSBCeSBjb25uZWN0aW5nIHVzaW5nIGEgQ2FzY2FkZSBDb25uZWN0aW9uIHlvdSBjYW4gY3JlYXRlIGEgTGF5ZXIgMiBicmlkZ2UgYmV0d2VlbiBtdWx0aXBsZSBWaXJ0dWFsIEh1YnMgYnV0IGlmIHRoZSBjb25uZWN0aW9uIGlzIGluY29ycmVjdGx5IGNvbmZpZ3VyZWQsIGEgbG9vcGJhY2sgQ2FzY2FkZSBDb25uZWN0aW9uIGNvdWxkIGluYWR2ZXJ0ZW50bHkgYmUgY3JlYXRlZC4gV2hlbiB1c2luZyBhIENhc2NhZGUgQ29ubmVjdGlvbiBmdW5jdGlvbiBwbGVhc2UgZGVzaWduIHRoZSBuZXR3b3JrIHRvcG9sb2d5IHdpdGggY2FyZS4gWW91IGNhbm5vdCBleGVjdXRlIHRoaXMgQVBJIGZvciBWaXJ0dWFsIEh1YnMgb2YgVlBOIFNlcnZlcnMgb3BlcmF0aW5nIGFzIGEgY2x1c3Rlci4gKi9cclxuICAgICAgICB0aGlzLkVudW1MaW5rID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJFbnVtTGlua1wiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogU3dpdGNoIENhc2NhZGUgQ29ubmVjdGlvbiB0byBPbmxpbmUgU3RhdHVzLiBXaGVuIGEgQ2FzY2FkZSBDb25uZWN0aW9uIHJlZ2lzdGVyZWQgb24gdGhlIGN1cnJlbnRseSBtYW5hZ2VkIFZpcnR1YWwgSHViIGlzIHNwZWNpZmllZCwgdXNlIHRoaXMgdG8gc3dpdGNoIHRoYXQgQ2FzY2FkZSBDb25uZWN0aW9uIHRvIG9ubGluZSBzdGF0dXMuIFRoZSBDYXNjYWRlIENvbm5lY3Rpb24gdGhhdCBpcyBzd2l0Y2hlZCB0byBvbmxpbmUgc3RhdHVzIGJlZ2lucyB0aGUgcHJvY2VzcyBvZiBjb25uZWN0aW5nIHRvIHRoZSBkZXN0aW5hdGlvbiBWUE4gU2VydmVyIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgQ29ubmVjdGlvbiBTZXR0aW5nLiBUaGUgQ2FzY2FkZSBDb25uZWN0aW9uIHRoYXQgaXMgc3dpdGNoZWQgdG8gb25saW5lIHN0YXR1cyB3aWxsIGVzdGFibGlzaCBub3JtYWwgY29ubmVjdGlvbiB0byB0aGUgVlBOIFNlcnZlciBvciBjb250aW51ZSB0byBhdHRlbXB0IGNvbm5lY3Rpb24gdW50aWwgaXQgaXMgc3dpdGNoZWQgdG8gb2ZmbGluZSBzdGF0dXMuIFlvdSBjYW5ub3QgZXhlY3V0ZSB0aGlzIEFQSSBmb3IgVmlydHVhbCBIdWJzIG9mIFZQTiBTZXJ2ZXJzIG9wZXJhdGluZyBhcyBhIGNsdXN0ZXIuICovXHJcbiAgICAgICAgdGhpcy5TZXRMaW5rT25saW5lID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJTZXRMaW5rT25saW5lXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBTd2l0Y2ggQ2FzY2FkZSBDb25uZWN0aW9uIHRvIE9mZmxpbmUgU3RhdHVzLiBXaGVuIGEgQ2FzY2FkZSBDb25uZWN0aW9uIHJlZ2lzdGVyZWQgb24gdGhlIGN1cnJlbnRseSBtYW5hZ2VkIFZpcnR1YWwgSHViIGlzIHNwZWNpZmllZCwgdXNlIHRoaXMgdG8gc3dpdGNoIHRoYXQgQ2FzY2FkZSBDb25uZWN0aW9uIHRvIG9mZmxpbmUgc3RhdHVzLiBUaGUgQ2FzY2FkZSBDb25uZWN0aW9uIHRoYXQgaXMgc3dpdGNoZWQgdG8gb2ZmbGluZSB3aWxsIG5vdCBjb25uZWN0IHRvIHRoZSBWUE4gU2VydmVyIHVudGlsIG5leHQgdGltZSBpdCBpcyBzd2l0Y2hlZCB0byB0aGUgb25saW5lIHN0YXR1cyB1c2luZyB0aGUgU2V0TGlua09ubGluZSBBUEkgWW91IGNhbm5vdCBleGVjdXRlIHRoaXMgQVBJIGZvciBWaXJ0dWFsIEh1YnMgb2YgVlBOIFNlcnZlcnMgb3BlcmF0aW5nIGFzIGEgY2x1c3Rlci4gKi9cclxuICAgICAgICB0aGlzLlNldExpbmtPZmZsaW5lID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJTZXRMaW5rT2ZmbGluZVwiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogRGVsZXRlIENhc2NhZGUgQ29ubmVjdGlvbiBTZXR0aW5nLiBVc2UgdGhpcyB0byBkZWxldGUgYSBDYXNjYWRlIENvbm5lY3Rpb24gdGhhdCBpcyByZWdpc3RlcmVkIG9uIHRoZSBjdXJyZW50bHkgbWFuYWdlZCBWaXJ0dWFsIEh1Yi4gSWYgdGhlIHNwZWNpZmllZCBDYXNjYWRlIENvbm5lY3Rpb24gaGFzIGEgc3RhdHVzIG9mIG9ubGluZSwgdGhlIGNvbm5lY3Rpb25zIHdpbGwgYmUgYXV0b21hdGljYWxseSBkaXNjb25uZWN0ZWQgYW5kIHRoZW4gdGhlIENhc2NhZGUgQ29ubmVjdGlvbiB3aWxsIGJlIGRlbGV0ZWQuIFlvdSBjYW5ub3QgZXhlY3V0ZSB0aGlzIEFQSSBmb3IgVmlydHVhbCBIdWJzIG9mIFZQTiBTZXJ2ZXJzIG9wZXJhdGluZyBhcyBhIGNsdXN0ZXIuICovXHJcbiAgICAgICAgdGhpcy5EZWxldGVMaW5rID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJEZWxldGVMaW5rXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBDaGFuZ2UgTmFtZSBvZiBDYXNjYWRlIENvbm5lY3Rpb24uIFdoZW4gYSBDYXNjYWRlIENvbm5lY3Rpb24gcmVnaXN0ZXJlZCBvbiB0aGUgY3VycmVudGx5IG1hbmFnZWQgVmlydHVhbCBIdWIgaXMgc3BlY2lmaWVkLCB1c2UgdGhpcyB0byBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhhdCBDYXNjYWRlIENvbm5lY3Rpb24uIFlvdSBjYW5ub3QgZXhlY3V0ZSB0aGlzIEFQSSBmb3IgVmlydHVhbCBIdWJzIG9mIFZQTiBTZXJ2ZXJzIG9wZXJhdGluZyBhcyBhIGNsdXN0ZXIuICovXHJcbiAgICAgICAgdGhpcy5SZW5hbWVMaW5rID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJSZW5hbWVMaW5rXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBHZXQgQ3VycmVudCBDYXNjYWRlIENvbm5lY3Rpb24gU3RhdHVzLiBXaGVuIGEgQ2FzY2FkZSBDb25uZWN0aW9uIHJlZ2lzdGVyZWQgb24gdGhlIGN1cnJlbnRseSBtYW5hZ2VkIFZpcnR1YWwgSHViIGlzIHNwZWNpZmllZCBhbmQgdGhhdCBDYXNjYWRlIENvbm5lY3Rpb24gaXMgY3VycmVudGx5IG9ubGluZSwgdXNlIHRoaXMgdG8gZ2V0IGl0cyBjb25uZWN0aW9uIHN0YXR1cyBhbmQgb3RoZXIgaW5mb3JtYXRpb24uIFlvdSBjYW5ub3QgZXhlY3V0ZSB0aGlzIEFQSSBmb3IgVmlydHVhbCBIdWJzIG9mIFZQTiBTZXJ2ZXJzIG9wZXJhdGluZyBhcyBhIGNsdXN0ZXIuICovXHJcbiAgICAgICAgdGhpcy5HZXRMaW5rU3RhdHVzID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJHZXRMaW5rU3RhdHVzXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBBZGQgQWNjZXNzIExpc3QgUnVsZS4gVXNlIHRoaXMgdG8gYWRkIGEgbmV3IHJ1bGUgdG8gdGhlIGFjY2VzcyBsaXN0IG9mIHRoZSBjdXJyZW50bHkgbWFuYWdlZCBWaXJ0dWFsIEh1Yi4gVGhlIGFjY2VzcyBsaXN0IGlzIGEgc2V0IG9mIHBhY2tldCBmaWxlIHJ1bGVzIHRoYXQgYXJlIGFwcGxpZWQgdG8gcGFja2V0cyB0aGF0IGZsb3cgdGhyb3VnaCB0aGUgVmlydHVhbCBIdWIuIFlvdSBjYW4gcmVnaXN0ZXIgbXVsdGlwbGUgcnVsZXMgaW4gYW4gYWNjZXNzIGxpc3QgYW5kIHlvdSBjYW4gYWxzbyBkZWZpbmUgYW4gcHJpb3JpdHkgZm9yIGVhY2ggcnVsZS4gQWxsIHBhY2tldHMgYXJlIGNoZWNrZWQgZm9yIHRoZSBjb25kaXRpb25zIHNwZWNpZmllZCBieSB0aGUgcnVsZXMgcmVnaXN0ZXJlZCBpbiB0aGUgYWNjZXNzIGxpc3QgYW5kIGJhc2VkIG9uIHRoZSBvcGVyYXRpb24gdGhhdCBpcyBzdGlwdWxhdGVkIGJ5IHRoZSBmaXJzdCBtYXRjaGluZyBydWxlLCB0aGV5IGVpdGhlciBwYXNzIG9yIGFyZSBkaXNjYXJkZWQuIFBhY2tldHMgdGhhdCBkbyBub3QgbWF0Y2ggYW55IHJ1bGUgYXJlIGltcGxpY2l0bHkgYWxsb3dlZCB0byBwYXNzLiBZb3UgY2FuIGFsc28gdXNlIHRoZSBhY2Nlc3MgbGlzdCB0byBnZW5lcmF0ZSBkZWxheXMsIGppdHRlcnMgYW5kIHBhY2tldCBsb3NzZXMuIFRoaXMgQVBJIGNhbm5vdCBiZSBpbnZva2VkIG9uIFZQTiBCcmlkZ2UuIFlvdSBjYW5ub3QgZXhlY3V0ZSB0aGlzIEFQSSBmb3IgVmlydHVhbCBIdWJzIG9mIFZQTiBTZXJ2ZXJzIG9wZXJhdGluZyBhcyBhIG1lbWJlciBzZXJ2ZXIgb24gYSBjbHVzdGVyLiAqL1xyXG4gICAgICAgIHRoaXMuQWRkQWNjZXNzID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJBZGRBY2Nlc3NcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIERlbGV0ZSBSdWxlIGZyb20gQWNjZXNzIExpc3QuIFVzZSB0aGlzIHRvIHNwZWNpZnkgYSBwYWNrZXQgZmlsdGVyIHJ1bGUgcmVnaXN0ZXJlZCBvbiB0aGUgYWNjZXNzIGxpc3Qgb2YgdGhlIGN1cnJlbnRseSBtYW5hZ2VkIFZpcnR1YWwgSHViIGFuZCBkZWxldGUgaXQuIFRvIGRlbGV0ZSBhIHJ1bGUsIHlvdSBtdXN0IHNwZWNpZnkgdGhhdCBydWxlJ3MgSUQuIFlvdSBjYW4gZGlzcGxheSB0aGUgSUQgYnkgdXNpbmcgdGhlIEVudW1BY2Nlc3MgQVBJLiBJZiB5b3Ugd2lzaCBub3QgdG8gZGVsZXRlIHRoZSBydWxlIGJ1dCB0byBvbmx5IHRlbXBvcmFyaWx5IGRpc2FibGUgaXQsIHVzZSB0aGUgU2V0QWNjZXNzTGlzdCBBUEkgdG8gc2V0IHRoZSBydWxlIHN0YXR1cyB0byBkaXNhYmxlLiBUaGlzIEFQSSBjYW5ub3QgYmUgaW52b2tlZCBvbiBWUE4gQnJpZGdlLiBZb3UgY2Fubm90IGV4ZWN1dGUgdGhpcyBBUEkgZm9yIFZpcnR1YWwgSHVicyBvZiBWUE4gU2VydmVycyBvcGVyYXRpbmcgYXMgYSBtZW1iZXIgc2VydmVyIG9uIGEgY2x1c3Rlci4gKi9cclxuICAgICAgICB0aGlzLkRlbGV0ZUFjY2VzcyA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiRGVsZXRlQWNjZXNzXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBHZXQgQWNjZXNzIExpc3QgUnVsZSBMaXN0LiBVc2UgdGhpcyB0byBnZXQgYSBsaXN0IG9mIHBhY2tldCBmaWx0ZXIgcnVsZXMgdGhhdCBhcmUgcmVnaXN0ZXJlZCBvbiBhY2Nlc3MgbGlzdCBvZiB0aGUgY3VycmVudGx5IG1hbmFnZWQgVmlydHVhbCBIdWIuIFRoZSBhY2Nlc3MgbGlzdCBpcyBhIHNldCBvZiBwYWNrZXQgZmlsZSBydWxlcyB0aGF0IGFyZSBhcHBsaWVkIHRvIHBhY2tldHMgdGhhdCBmbG93IHRocm91Z2ggdGhlIFZpcnR1YWwgSHViLiBZb3UgY2FuIHJlZ2lzdGVyIG11bHRpcGxlIHJ1bGVzIGluIGFuIGFjY2VzcyBsaXN0IGFuZCB5b3UgY2FuIGFsc28gZGVmaW5lIGEgcHJpb3JpdHkgZm9yIGVhY2ggcnVsZS4gQWxsIHBhY2tldHMgYXJlIGNoZWNrZWQgZm9yIHRoZSBjb25kaXRpb25zIHNwZWNpZmllZCBieSB0aGUgcnVsZXMgcmVnaXN0ZXJlZCBpbiB0aGUgYWNjZXNzIGxpc3QgYW5kIGJhc2VkIG9uIHRoZSBvcGVyYXRpb24gdGhhdCBpcyBzdGlwdWxhdGVkIGJ5IHRoZSBmaXJzdCBtYXRjaGluZyBydWxlLCB0aGV5IGVpdGhlciBwYXNzIG9yIGFyZSBkaXNjYXJkZWQuIFBhY2tldHMgdGhhdCBkbyBub3QgbWF0Y2ggYW55IHJ1bGUgYXJlIGltcGxpY2l0bHkgYWxsb3dlZCB0byBwYXNzLiBUaGlzIEFQSSBjYW5ub3QgYmUgaW52b2tlZCBvbiBWUE4gQnJpZGdlLiBZb3UgY2Fubm90IGV4ZWN1dGUgdGhpcyBBUEkgZm9yIFZpcnR1YWwgSHVicyBvZiBWUE4gU2VydmVycyBvcGVyYXRpbmcgYXMgYSBtZW1iZXIgc2VydmVyIG9uIGEgY2x1c3Rlci4gKi9cclxuICAgICAgICB0aGlzLkVudW1BY2Nlc3MgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkVudW1BY2Nlc3NcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIFJlcGxhY2UgYWxsIGFjY2VzcyBsaXN0cyBvbiBhIHNpbmdsZSBidWxrIEFQSSBjYWxsLiBUaGlzIEFQSSByZW1vdmVzIGFsbCBleGlzdGluZyBhY2Nlc3MgbGlzdCBydWxlcyBvbiB0aGUgVmlydHVhbCBIdWIsIGFuZCByZXBsYWNlIHRoZW0gYnkgbmV3IGFjY2VzcyBsaXN0IHJ1bGVzIHNwZWNpZmllZCBieSB0aGUgcGFyYW1ldGVyLiAqL1xyXG4gICAgICAgIHRoaXMuU2V0QWNjZXNzTGlzdCA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiU2V0QWNjZXNzTGlzdFwiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogQ3JlYXRlIGEgdXNlci4gVXNlIHRoaXMgdG8gY3JlYXRlIGEgbmV3IHVzZXIgaW4gdGhlIHNlY3VyaXR5IGFjY291bnQgZGF0YWJhc2Ugb2YgdGhlIGN1cnJlbnRseSBtYW5hZ2VkIFZpcnR1YWwgSHViLiBCeSBjcmVhdGluZyBhIHVzZXIsIHRoZSBWUE4gQ2xpZW50IGNhbiBjb25uZWN0IHRvIHRoZSBWaXJ0dWFsIEh1YiBieSB1c2luZyB0aGUgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24gb2YgdGhhdCB1c2VyLiBOb3RlIHRoYXQgYSB1c2VyIHdob3NlIHVzZXIgbmFtZSBoYXMgYmVlbiBjcmVhdGVkIGFzIFwiKlwiIChhIHNpbmdsZSBhc3RlcmlzayBjaGFyYWN0ZXIpIHdpbGwgYXV0b21hdGljYWxseSBiZSByZWdpc3RlcmVkIGFzIGEgUkFESVVTIGF1dGhlbnRpY2F0aW9uIHVzZXIuIEZvciBjYXNlcyB3aGVyZSB0aGVyZSBhcmUgdXNlcnMgd2l0aCBcIipcIiBhcyB0aGUgbmFtZSwgd2hlbiBhIHVzZXIsIHdob3NlIHVzZXIgbmFtZSB0aGF0IGhhcyBiZWVuIHByb3ZpZGVkIHdoZW4gYSBjbGllbnQgY29ubmVjdGVkIHRvIGEgVlBOIFNlcnZlciBkb2VzIG5vdCBtYXRjaCBleGlzdGluZyB1c2VyIG5hbWVzLCBpcyBhYmxlIHRvIGJlIGF1dGhlbnRpY2F0ZWQgYnkgYSBSQURJVVMgc2VydmVyIG9yIE5UIGRvbWFpbiBjb250cm9sbGVyIGJ5IGlucHV0dGluZyBhIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQsIHRoZSBhdXRoZW50aWNhdGlvbiBzZXR0aW5ncyBhbmQgc2VjdXJpdHkgcG9saWN5IHNldHRpbmdzIHdpbGwgZm9sbG93IHRoZSBzZXR0aW5nIGZvciB0aGUgdXNlciBcIipcIi4gVG8gY2hhbmdlIHRoZSB1c2VyIGluZm9ybWF0aW9uIG9mIGEgdXNlciB0aGF0IGhhcyBiZWVuIGNyZWF0ZWQsIHVzZSB0aGUgU2V0VXNlciBBUEkuIFRoaXMgQVBJIGNhbm5vdCBiZSBpbnZva2VkIG9uIFZQTiBCcmlkZ2UuIFlvdSBjYW5ub3QgZXhlY3V0ZSB0aGlzIEFQSSBmb3IgVmlydHVhbCBIdWJzIG9mIFZQTiBTZXJ2ZXJzIG9wZXJhdGluZyBhcyBhIG1lbWJlciBzZXJ2ZXIgb24gYSBjbHVzdGVyLiAqL1xyXG4gICAgICAgIHRoaXMuQ3JlYXRlVXNlciA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiQ3JlYXRlVXNlclwiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogQ2hhbmdlIFVzZXIgU2V0dGluZ3MuIFVzZSB0aGlzIHRvIGNoYW5nZSB1c2VyIHNldHRpbmdzIHRoYXQgaXMgcmVnaXN0ZXJlZCBvbiB0aGUgc2VjdXJpdHkgYWNjb3VudCBkYXRhYmFzZSBvZiB0aGUgY3VycmVudGx5IG1hbmFnZWQgVmlydHVhbCBIdWIuIFRoZSB1c2VyIHNldHRpbmdzIHRoYXQgY2FuIGJlIGNoYW5nZWQgdXNpbmcgdGhpcyBBUEkgYXJlIHRoZSB0aHJlZSBpdGVtcyB0aGF0IGFyZSBzcGVjaWZpZWQgd2hlbiBhIG5ldyB1c2VyIGlzIGNyZWF0ZWQgdXNpbmcgdGhlIENyZWF0ZVVzZXIgQVBJOiBHcm91cCBOYW1lLCBGdWxsIE5hbWUsIGFuZCBEZXNjcmlwdGlvbi4gVG8gZ2V0IHRoZSBsaXN0IG9mIGN1cnJlbnRseSByZWdpc3RlcmVkIHVzZXJzLCB1c2UgdGhlIEVudW1Vc2VyIEFQSS4gVGhpcyBBUEkgY2Fubm90IGJlIGludm9rZWQgb24gVlBOIEJyaWRnZS4gWW91IGNhbm5vdCBleGVjdXRlIHRoaXMgQVBJIGZvciBWaXJ0dWFsIEh1YnMgb2YgVlBOIFNlcnZlcnMgb3BlcmF0aW5nIGFzIGEgbWVtYmVyIHNlcnZlciBvbiBhIGNsdXN0ZXIuICovXHJcbiAgICAgICAgdGhpcy5TZXRVc2VyID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJTZXRVc2VyXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBHZXQgVXNlciBTZXR0aW5ncy4gVXNlIHRoaXMgdG8gZ2V0IHVzZXIgc2V0dGluZ3MgaW5mb3JtYXRpb24gdGhhdCBpcyByZWdpc3RlcmVkIG9uIHRoZSBzZWN1cml0eSBhY2NvdW50IGRhdGFiYXNlIG9mIHRoZSBjdXJyZW50bHkgbWFuYWdlZCBWaXJ0dWFsIEh1Yi4gVGhlIGluZm9ybWF0aW9uIHRoYXQgeW91IGNhbiBnZXQgdXNpbmcgdGhpcyBBUEkgYXJlIFVzZXIgTmFtZSwgRnVsbCBOYW1lLCBHcm91cCBOYW1lLCBFeHBpcmF0aW9uIERhdGUsIFNlY3VyaXR5IFBvbGljeSwgYW5kIEF1dGggVHlwZSwgYXMgd2VsbCBhcyBwYXJhbWV0ZXJzIHRoYXQgYXJlIHNwZWNpZmllZCBhcyBhdXRoIHR5cGUgYXR0cmlidXRlcyBhbmQgdGhlIHN0YXRpc3RpY2FsIGRhdGEgb2YgdGhhdCB1c2VyLiBUbyBnZXQgdGhlIGxpc3Qgb2YgY3VycmVudGx5IHJlZ2lzdGVyZWQgdXNlcnMsIHVzZSB0aGUgRW51bVVzZXIgQVBJLiBUaGlzIEFQSSBjYW5ub3QgYmUgaW52b2tlZCBvbiBWUE4gQnJpZGdlLiBZb3UgY2Fubm90IGV4ZWN1dGUgdGhpcyBBUEkgZm9yIFZpcnR1YWwgSHVicyBvZiBWUE4gU2VydmVycyBvcGVyYXRpbmcgYXMgYSBtZW1iZXIgc2VydmVyIG9uIGEgY2x1c3Rlci4gKi9cclxuICAgICAgICB0aGlzLkdldFVzZXIgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkdldFVzZXJcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIERlbGV0ZSBhIHVzZXIuIFVzZSB0aGlzIHRvIGRlbGV0ZSBhIHVzZXIgdGhhdCBpcyByZWdpc3RlcmVkIG9uIHRoZSBzZWN1cml0eSBhY2NvdW50IGRhdGFiYXNlIG9mIHRoZSBjdXJyZW50bHkgbWFuYWdlZCBWaXJ0dWFsIEh1Yi4gQnkgZGVsZXRpbmcgdGhlIHVzZXIsIHRoYXQgdXNlciB3aWxsIG5vIGxvbmcgYmUgYWJsZSB0byBjb25uZWN0IHRvIHRoZSBWaXJ0dWFsIEh1Yi4gWW91IGNhbiB1c2UgdGhlIFNldFVzZXIgQVBJIHRvIHNldCB0aGUgdXNlcidzIHNlY3VyaXR5IHBvbGljeSB0byBkZW55IGFjY2VzcyBpbnN0ZWFkIG9mIGRlbGV0aW5nIGEgdXNlciwgc2V0IHRoZSB1c2VyIHRvIGJlIHRlbXBvcmFyaWx5IGRlbmllZCBmcm9tIGxvZ2dpbmcgaW4uIFRvIGdldCB0aGUgbGlzdCBvZiBjdXJyZW50bHkgcmVnaXN0ZXJlZCB1c2VycywgdXNlIHRoZSBFbnVtVXNlciBBUEkuIFRoaXMgQVBJIGNhbm5vdCBiZSBpbnZva2VkIG9uIFZQTiBCcmlkZ2UuIFlvdSBjYW5ub3QgZXhlY3V0ZSB0aGlzIEFQSSBmb3IgVmlydHVhbCBIdWJzIG9mIFZQTiBTZXJ2ZXJzIG9wZXJhdGluZyBhcyBhIG1lbWJlciBzZXJ2ZXIgb24gYSBjbHVzdGVyLiAqL1xyXG4gICAgICAgIHRoaXMuRGVsZXRlVXNlciA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiRGVsZXRlVXNlclwiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogR2V0IExpc3Qgb2YgVXNlcnMuIFVzZSB0aGlzIHRvIGdldCBhIGxpc3Qgb2YgdXNlcnMgdGhhdCBhcmUgcmVnaXN0ZXJlZCBvbiB0aGUgc2VjdXJpdHkgYWNjb3VudCBkYXRhYmFzZSBvZiB0aGUgY3VycmVudGx5IG1hbmFnZWQgVmlydHVhbCBIdWIuIFRoaXMgQVBJIGNhbm5vdCBiZSBpbnZva2VkIG9uIFZQTiBCcmlkZ2UuIFlvdSBjYW5ub3QgZXhlY3V0ZSB0aGlzIEFQSSBmb3IgVmlydHVhbCBIdWJzIG9mIFZQTiBTZXJ2ZXJzIG9wZXJhdGluZyBhcyBhIG1lbWJlciBzZXJ2ZXIgb24gYSBjbHVzdGVyLiAqL1xyXG4gICAgICAgIHRoaXMuRW51bVVzZXIgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkVudW1Vc2VyXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBDcmVhdGUgR3JvdXAuIFVzZSB0aGlzIHRvIGNyZWF0ZSBhIG5ldyBncm91cCBpbiB0aGUgc2VjdXJpdHkgYWNjb3VudCBkYXRhYmFzZSBvZiB0aGUgY3VycmVudGx5IG1hbmFnZWQgVmlydHVhbCBIdWIuIFlvdSBjYW4gcmVnaXN0ZXIgbXVsdGlwbGUgdXNlcnMgaW4gYSBncm91cC4gVG8gcmVnaXN0ZXIgdXNlcnMgaW4gYSBncm91cCB1c2UgdGhlIFNldFVzZXIgQVBJLiBUaGlzIEFQSSBjYW5ub3QgYmUgaW52b2tlZCBvbiBWUE4gQnJpZGdlLiBZb3UgY2Fubm90IGV4ZWN1dGUgdGhpcyBBUEkgZm9yIFZpcnR1YWwgSHVicyBvZiBWUE4gU2VydmVycyBvcGVyYXRpbmcgYXMgYSBtZW1iZXIgc2VydmVyIG9uIGEgY2x1c3Rlci4gKi9cclxuICAgICAgICB0aGlzLkNyZWF0ZUdyb3VwID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJDcmVhdGVHcm91cFwiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogU2V0IGdyb3VwIHNldHRpbmdzLiBVc2UgdGhpcyB0byBzZXQgZ3JvdXAgc2V0dGluZ3MgdGhhdCBpcyByZWdpc3RlcmVkIG9uIHRoZSBzZWN1cml0eSBhY2NvdW50IGRhdGFiYXNlIG9mIHRoZSBjdXJyZW50bHkgbWFuYWdlZCBWaXJ0dWFsIEh1Yi4gVG8gZ2V0IHRoZSBsaXN0IG9mIGN1cnJlbnRseSByZWdpc3RlcmVkIGdyb3VwcywgdXNlIHRoZSBFbnVtR3JvdXAgQVBJLiBUaGlzIEFQSSBjYW5ub3QgYmUgaW52b2tlZCBvbiBWUE4gQnJpZGdlLiBZb3UgY2Fubm90IGV4ZWN1dGUgdGhpcyBBUEkgZm9yIFZpcnR1YWwgSHVicyBvZiBWUE4gU2VydmVycyBvcGVyYXRpbmcgYXMgYSBtZW1iZXIgc2VydmVyIG9uIGEgY2x1c3Rlci4gKi9cclxuICAgICAgICB0aGlzLlNldEdyb3VwID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJTZXRHcm91cFwiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogR2V0IEdyb3VwIFNldHRpbmcgKFN5bmMgbW9kZSkuIFVzZSB0aGlzIHRvIGdldCB0aGUgc2V0dGluZyBvZiBhIGdyb3VwIHRoYXQgaXMgcmVnaXN0ZXJlZCBvbiB0aGUgc2VjdXJpdHkgYWNjb3VudCBkYXRhYmFzZSBvZiB0aGUgY3VycmVudGx5IG1hbmFnZWQgVmlydHVhbCBIdWIuIFRvIGdldCB0aGUgbGlzdCBvZiBjdXJyZW50bHkgcmVnaXN0ZXJlZCBncm91cHMsIHVzZSB0aGUgRW51bUdyb3VwIEFQSS4gVGhpcyBBUEkgY2Fubm90IGJlIGludm9rZWQgb24gVlBOIEJyaWRnZS4gWW91IGNhbm5vdCBleGVjdXRlIHRoaXMgQVBJIGZvciBWaXJ0dWFsIEh1YnMgb2YgVlBOIFNlcnZlcnMgb3BlcmF0aW5nIGFzIGEgbWVtYmVyIHNlcnZlciBvbiBhIGNsdXN0ZXIuICovXHJcbiAgICAgICAgdGhpcy5HZXRHcm91cCA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiR2V0R3JvdXBcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIERlbGV0ZSBVc2VyIGZyb20gR3JvdXAuIFVzZSB0aGlzIHRvIGRlbGV0ZSBhIHNwZWNpZmllZCB1c2VyIGZyb20gdGhlIGdyb3VwIHRoYXQgaXMgcmVnaXN0ZXJlZCBvbiB0aGUgc2VjdXJpdHkgYWNjb3VudCBkYXRhYmFzZSBvZiB0aGUgY3VycmVudGx5IG1hbmFnZWQgVmlydHVhbCBIdWIuIEJ5IGRlbGV0aW5nIGEgdXNlciBmcm9tIHRoZSBncm91cCwgdGhhdCB1c2VyIGJlY29tZXMgdW5hc3NpZ25lZC4gVG8gZ2V0IHRoZSBsaXN0IG9mIGN1cnJlbnRseSByZWdpc3RlcmVkIGdyb3VwcywgdXNlIHRoZSBFbnVtR3JvdXAgQVBJLiBUaGlzIEFQSSBjYW5ub3QgYmUgaW52b2tlZCBvbiBWUE4gQnJpZGdlLiBZb3UgY2Fubm90IGV4ZWN1dGUgdGhpcyBBUEkgZm9yIFZpcnR1YWwgSHVicyBvZiBWUE4gU2VydmVycyBvcGVyYXRpbmcgYXMgYSBtZW1iZXIgc2VydmVyIG9uIGEgY2x1c3Rlci4gKi9cclxuICAgICAgICB0aGlzLkRlbGV0ZUdyb3VwID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJEZWxldGVHcm91cFwiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogR2V0IExpc3Qgb2YgR3JvdXBzLiBVc2UgdGhpcyB0byBnZXQgYSBsaXN0IG9mIGdyb3VwcyB0aGF0IGFyZSByZWdpc3RlcmVkIG9uIHRoZSBzZWN1cml0eSBhY2NvdW50IGRhdGFiYXNlIG9mIHRoZSBjdXJyZW50bHkgbWFuYWdlZCBWaXJ0dWFsIEh1Yi4gVGhpcyBBUEkgY2Fubm90IGJlIGludm9rZWQgb24gVlBOIEJyaWRnZS4gWW91IGNhbm5vdCBleGVjdXRlIHRoaXMgQVBJIGZvciBWaXJ0dWFsIEh1YnMgb2YgVlBOIFNlcnZlcnMgb3BlcmF0aW5nIGFzIGEgbWVtYmVyIHNlcnZlciBvbiBhIGNsdXN0ZXIuICovXHJcbiAgICAgICAgdGhpcy5FbnVtR3JvdXAgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkVudW1Hcm91cFwiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogR2V0IExpc3Qgb2YgQ29ubmVjdGVkIFZQTiBTZXNzaW9ucy4gVXNlIHRoaXMgdG8gZ2V0IGEgbGlzdCBvZiB0aGUgc2Vzc2lvbnMgY29ubmVjdGVkIHRvIHRoZSBWaXJ0dWFsIEh1YiBjdXJyZW50bHkgYmVpbmcgbWFuYWdlZC4gSW4gdGhlIGxpc3Qgb2Ygc2Vzc2lvbnMsIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gd2lsbCBiZSBvYnRhaW5lZCBmb3IgZWFjaCBjb25uZWN0aW9uOiBTZXNzaW9uIE5hbWUsIFNlc3Npb24gU2l0ZSwgVXNlciBOYW1lLCBTb3VyY2UgSG9zdCBOYW1lLCBUQ1AgQ29ubmVjdGlvbiwgVHJhbnNmZXIgQnl0ZXMgYW5kIFRyYW5zZmVyIFBhY2tldHMuIElmIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkIFZQTiBTZXJ2ZXIgaXMgYSBjbHVzdGVyIGNvbnRyb2xsZXIgYW5kIHRoZSBjdXJyZW50bHkgbWFuYWdlZCBWaXJ0dWFsIEh1YiBpcyBhIHN0YXRpYyBWaXJ0dWFsIEh1YiwgeW91IGNhbiBnZXQgYW4gYWxsLWxpbmtlZC10b2dldGhlciBsaXN0IG9mIGFsbCBzZXNzaW9ucyBjb25uZWN0ZWQgdG8gdGhhdCBWaXJ0dWFsIEh1YiBvbiBhbGwgY2x1c3RlciBtZW1iZXJzLiBJbiBhbGwgb3RoZXIgY2FzZXMsIG9ubHkgdGhlIGxpc3Qgb2Ygc2Vzc2lvbnMgdGhhdCBhcmUgYWN0dWFsbHkgY29ubmVjdGVkIHRvIHRoZSBjdXJyZW50bHkgbWFuYWdlZCBWUE4gU2VydmVyIHdpbGwgYmUgb2J0YWluZWQuICovXHJcbiAgICAgICAgdGhpcy5FbnVtU2Vzc2lvbiA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiRW51bVNlc3Npb25cIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIEdldCBTZXNzaW9uIFN0YXR1cy4gVXNlIHRoaXMgdG8gc3BlY2lmeSBhIHNlc3Npb24gY3VycmVudGx5IGNvbm5lY3RlZCB0byB0aGUgY3VycmVudGx5IG1hbmFnZWQgVmlydHVhbCBIdWIgYW5kIGdldCB0aGUgc2Vzc2lvbiBpbmZvcm1hdGlvbi4gVGhlIHNlc3Npb24gc3RhdHVzIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmc6IHNvdXJjZSBob3N0IG5hbWUgYW5kIHVzZXIgbmFtZSwgdmVyc2lvbiBpbmZvcm1hdGlvbiwgdGltZSBpbmZvcm1hdGlvbiwgbnVtYmVyIG9mIFRDUCBjb25uZWN0aW9ucywgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzLCBzZXNzaW9uIGtleSwgc3RhdGlzdGljYWwgaW5mb3JtYXRpb24gb24gZGF0YSB0cmFuc2ZlcnJlZCwgYW5kIG90aGVyIGNsaWVudCBhbmQgc2VydmVyIGluZm9ybWF0aW9uLiBUbyBnZXQgdGhlIGxpc3Qgb2YgY3VycmVudGx5IGNvbm5lY3RlZCBzZXNzaW9ucywgdXNlIHRoZSBFbnVtU2Vzc2lvbiBBUEkuICovXHJcbiAgICAgICAgdGhpcy5HZXRTZXNzaW9uU3RhdHVzID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJHZXRTZXNzaW9uU3RhdHVzXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBEaXNjb25uZWN0IFNlc3Npb24uIFVzZSB0aGlzIHRvIHNwZWNpZnkgYSBzZXNzaW9uIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8gdGhlIGN1cnJlbnRseSBtYW5hZ2VkIFZpcnR1YWwgSHViIGFuZCBmb3JjZWZ1bGx5IGRpc2Nvbm5lY3QgdGhhdCBzZXNzaW9uIHVzaW5nIG1hbmFnZXIgcHJpdmlsZWdlcy4gTm90ZSB0aGF0IHdoZW4gY29tbXVuaWNhdGlvbiBpcyBkaXNjb25uZWN0ZWQgYnkgc2V0dGluZ3Mgb24gdGhlIHNvdXJjZSBjbGllbnQgc2lkZSBhbmQgdGhlIGF1dG9tYXRpY2FsbHkgcmVjb25uZWN0IG9wdGlvbiBpcyBlbmFibGVkLCBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBjbGllbnQgd2lsbCByZWNvbm5lY3QuIFRvIGdldCB0aGUgbGlzdCBvZiBjdXJyZW50bHkgY29ubmVjdGVkIHNlc3Npb25zLCB1c2UgdGhlIEVudW1TZXNzaW9uIEFQSS4gKi9cclxuICAgICAgICB0aGlzLkRlbGV0ZVNlc3Npb24gPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkRlbGV0ZVNlc3Npb25cIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIEdldCB0aGUgTUFDIEFkZHJlc3MgVGFibGUgRGF0YWJhc2UuIFVzZSB0aGlzIHRvIGdldCB0aGUgTUFDIGFkZHJlc3MgdGFibGUgZGF0YWJhc2UgdGhhdCBpcyBoZWxkIGJ5IHRoZSBjdXJyZW50bHkgbWFuYWdlZCBWaXJ0dWFsIEh1Yi4gVGhlIE1BQyBhZGRyZXNzIHRhYmxlIGRhdGFiYXNlIGlzIGEgdGFibGUgdGhhdCB0aGUgVmlydHVhbCBIdWIgcmVxdWlyZXMgdG8gcGVyZm9ybSB0aGUgYWN0aW9uIG9mIHN3aXRjaGluZyBFdGhlcm5ldCBmcmFtZXMgYW5kIHRoZSBWaXJ0dWFsIEh1YiBkZWNpZGVzIHRoZSBzb3J0aW5nIGRlc3RpbmF0aW9uIHNlc3Npb24gb2YgZWFjaCBFdGhlcm5ldCBmcmFtZSBiYXNlZCBvbiB0aGUgTUFDIGFkZHJlc3MgdGFibGUgZGF0YWJhc2UuIFRoZSBNQUMgYWRkcmVzcyBkYXRhYmFzZSBpcyBidWlsdCBieSB0aGUgVmlydHVhbCBIdWIgYXV0b21hdGljYWxseSBhbmFseXppbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb21tdW5pY2F0aW9uLiAqL1xyXG4gICAgICAgIHRoaXMuRW51bU1hY1RhYmxlID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJFbnVtTWFjVGFibGVcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIERlbGV0ZSBNQUMgQWRkcmVzcyBUYWJsZSBFbnRyeS4gVXNlIHRoaXMgQVBJIHRvIG9wZXJhdGUgdGhlIE1BQyBhZGRyZXNzIHRhYmxlIGRhdGFiYXNlIGhlbGQgYnkgdGhlIGN1cnJlbnRseSBtYW5hZ2VkIFZpcnR1YWwgSHViIGFuZCBkZWxldGUgYSBzcGVjaWZpZWQgTUFDIGFkZHJlc3MgdGFibGUgZW50cnkgZnJvbSB0aGUgZGF0YWJhc2UuIFRvIGdldCB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgTUFDIGFkZHJlc3MgdGFibGUgZGF0YWJhc2UgdXNlIHRoZSBFbnVtTWFjVGFibGUgQVBJLiAqL1xyXG4gICAgICAgIHRoaXMuRGVsZXRlTWFjVGFibGUgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkRlbGV0ZU1hY1RhYmxlXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBHZXQgdGhlIElQIEFkZHJlc3MgVGFibGUgRGF0YWJhc2UuIFVzZSB0aGlzIHRvIGdldCB0aGUgSVAgYWRkcmVzcyB0YWJsZSBkYXRhYmFzZSB0aGF0IGlzIGhlbGQgYnkgdGhlIGN1cnJlbnRseSBtYW5hZ2VkIFZpcnR1YWwgSHViLiBUaGUgSVAgYWRkcmVzcyB0YWJsZSBkYXRhYmFzZSBpcyBhIHRhYmxlIHRoYXQgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgYW5hbHl6aW5nIHRoZSBjb250ZW50cyBvZiBjb21tdW5pY2F0aW9uIHNvIHRoYXQgdGhlIFZpcnR1YWwgSHViIGNhbiBhbHdheXMga25vdyB3aGljaCBzZXNzaW9uIGlzIHVzaW5nIHdoaWNoIElQIGFkZHJlc3MgYW5kIGl0IGlzIGZyZXF1ZW50bHkgdXNlZCBieSB0aGUgZW5naW5lIHRoYXQgYXBwbGllcyB0aGUgVmlydHVhbCBIdWIgc2VjdXJpdHkgcG9saWN5LiBCeSBzcGVjaWZ5aW5nIHRoZSBzZXNzaW9uIG5hbWUgeW91IGNhbiBnZXQgdGhlIElQIGFkZHJlc3MgdGFibGUgZW50cnkgdGhhdCBoYXMgYmVlbiBhc3NvY2lhdGVkIHdpdGggdGhhdCBzZXNzaW9uLiAqL1xyXG4gICAgICAgIHRoaXMuRW51bUlwVGFibGUgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkVudW1JcFRhYmxlXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBEZWxldGUgSVAgQWRkcmVzcyBUYWJsZSBFbnRyeS4gVXNlIHRoaXMgQVBJIHRvIG9wZXJhdGUgdGhlIElQIGFkZHJlc3MgdGFibGUgZGF0YWJhc2UgaGVsZCBieSB0aGUgY3VycmVudGx5IG1hbmFnZWQgVmlydHVhbCBIdWIgYW5kIGRlbGV0ZSBhIHNwZWNpZmllZCBJUCBhZGRyZXNzIHRhYmxlIGVudHJ5IGZyb20gdGhlIGRhdGFiYXNlLiBUbyBnZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IElQIGFkZHJlc3MgdGFibGUgZGF0YWJhc2UgdXNlIHRoZSBFbnVtSXBUYWJsZSBBUEkuICovXHJcbiAgICAgICAgdGhpcy5EZWxldGVJcFRhYmxlID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJEZWxldGVJcFRhYmxlXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBTZXQgdGhlIEtlZXAgQWxpdmUgSW50ZXJuZXQgQ29ubmVjdGlvbiBGdW5jdGlvbi4gVXNlIHRoaXMgdG8gc2V0IHRoZSBkZXN0aW5hdGlvbiBob3N0IG5hbWUgZXRjLiBvZiB0aGUgS2VlcCBBbGl2ZSBJbnRlcm5ldCBDb25uZWN0aW9uIEZ1bmN0aW9uLiBGb3IgbmV0d29yayBjb25uZWN0aW9uIGVudmlyb25tZW50cyB3aGVyZSBjb25uZWN0aW9ucyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGlzY29ubmVjdGVkIHdoZXJlIHRoZXJlIGFyZSBwZXJpb2RzIG9mIG5vIGNvbW11bmljYXRpb24gdGhhdCBhcmUgbG9uZ2VyIHRoYW4gYSBzZXQgcGVyaW9kLCBieSB1c2luZyB0aGUgS2VlcCBBbGl2ZSBJbnRlcm5ldCBDb25uZWN0aW9uIEZ1bmN0aW9uLCBpdCBpcyBwb3NzaWJsZSB0byBrZWVwIGFsaXZlIHRoZSBJbnRlcm5ldCBjb25uZWN0aW9uIGJ5IHNlbmRpbmcgcGFja2V0cyB0byBhIG5vbWluYXRlZCBzZXJ2ZXIgb24gdGhlIEludGVybmV0IGF0IHNldCBpbnRlcnZhbHMuIFdoZW4gdXNpbmcgdGhpcyBBUEksIHlvdSBjYW4gc3BlY2lmeSB0aGUgZm9sbG93aW5nOiBIb3N0IE5hbWUsIFBvcnQgTnVtYmVyLCBQYWNrZXQgU2VuZCBJbnRlcnZhbCwgYW5kIFByb3RvY29sLiBQYWNrZXRzIHNlbnQgdG8ga2VlcCBhbGl2ZSB0aGUgSW50ZXJuZXQgY29ubmVjdGlvbiB3aWxsIGhhdmUgcmFuZG9tIGNvbnRlbnQgYW5kIHBlcnNvbmFsIGluZm9ybWF0aW9uIHRoYXQgY291bGQgaWRlbnRpZnkgYSBjb21wdXRlciBvciB1c2VyIGlzIG5vdCBzZW50LiBZb3UgY2FuIHVzZSB0aGUgU2V0S2VlcCBBUEkgdG8gZW5hYmxlL2Rpc2FibGUgdGhlIEtlZXAgQWxpdmUgSW50ZXJuZXQgQ29ubmVjdGlvbiBGdW5jdGlvbi4gVG8gZXhlY3V0ZSB0aGlzIEFQSSBvbiBhIFZQTiBTZXJ2ZXIgb3IgVlBOIEJyaWRnZSwgeW91IG11c3QgaGF2ZSBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMuICovXHJcbiAgICAgICAgdGhpcy5TZXRLZWVwID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJTZXRLZWVwXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBHZXQgdGhlIEtlZXAgQWxpdmUgSW50ZXJuZXQgQ29ubmVjdGlvbiBGdW5jdGlvbi4gVXNlIHRoaXMgdG8gZ2V0IHRoZSBjdXJyZW50IHNldHRpbmcgY29udGVudHMgb2YgdGhlIEtlZXAgQWxpdmUgSW50ZXJuZXQgQ29ubmVjdGlvbiBGdW5jdGlvbi4gSW4gYWRkaXRpb24gdG8gdGhlIGRlc3RpbmF0aW9uJ3MgSG9zdCBOYW1lLCBQb3J0IE51bWJlciwgUGFja2V0IFNlbmQgSW50ZXJ2YWwgYW5kIFByb3RvY29sLCB5b3UgY2FuIG9idGFpbiB0aGUgY3VycmVudCBlbmFibGVkL2Rpc2FibGVkIHN0YXR1cyBvZiB0aGUgS2VlcCBBbGl2ZSBJbnRlcm5ldCBDb25uZWN0aW9uIEZ1bmN0aW9uLiAqL1xyXG4gICAgICAgIHRoaXMuR2V0S2VlcCA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiR2V0S2VlcFwiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogRW5hYmxlIHRoZSBWaXJ0dWFsIE5BVCBhbmQgREhDUCBTZXJ2ZXIgRnVuY3Rpb24gKFNlY3VyZU5BVCBGdW5jdGlvbikuIFVzZSB0aGlzIHRvIGVuYWJsZSB0aGUgVmlydHVhbCBOQVQgYW5kIERIQ1AgU2VydmVyIGZ1bmN0aW9uIChTZWN1cmVOQVQgRnVuY3Rpb24pIG9uIHRoZSBjdXJyZW50bHkgbWFuYWdlZCBWaXJ0dWFsIEh1YiBhbmQgYmVnaW4gaXRzIG9wZXJhdGlvbi4gQmVmb3JlIGV4ZWN1dGluZyB0aGlzIEFQSSwgeW91IG11c3QgZmlyc3QgY2hlY2sgdGhlIHNldHRpbmcgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgVmlydHVhbCBOQVQgZnVuY3Rpb24gYW5kIERIQ1AgU2VydmVyIGZ1bmN0aW9uIHVzaW5nIHRoZSBTZXRTZWN1cmVOQVRPcHRpb24gQVBJIGFuZCBHZXRTZWN1cmVOQVRPcHRpb24gQVBJLiBCeSBlbmFibGluZyB0aGUgU2VjdXJlTkFUIGZ1bmN0aW9uLCB5b3UgY2FuIHZpcnR1YWxseSBvcGVyYXRlIGEgTkFUIHJvdXRlciAoSVAgbWFzcXVlcmFkZSkgYW5kIHRoZSBESENQIFNlcnZlciBmdW5jdGlvbiBvbiBhIHZpcnR1YWwgbmV0d29yayBvbiB0aGUgVmlydHVhbCBIdWIuIFtXYXJuaW5nIGFib3V0IFNlY3VyZU5BVCBGdW5jdGlvbl0gVGhlIFNlY3VyZU5BVCBmdW5jdGlvbiBpcyByZWNvbW1lbmRlZCBvbmx5IGZvciBzeXN0ZW0gYWRtaW5pc3RyYXRvcnMgYW5kIHBlb3BsZSB3aXRoIGEgZGV0YWlsZWQga25vd2xlZGdlIG9mIG5ldHdvcmtzLiBJZiB5b3UgdXNlIHRoZSBTZWN1cmVOQVQgZnVuY3Rpb24gY29ycmVjdGx5LCBpdCBpcyBwb3NzaWJsZSB0byBhY2hpZXZlIGEgc2FmZSBmb3JtIG9mIHJlbW90ZSBhY2Nlc3MgdmlhIGEgVlBOLiBIb3dldmVyIHdoZW4gdXNlZCBpbiB0aGUgd3Jvbmcgd2F5LCBpdCBjYW4gcHV0IHRoZSBlbnRpcmUgbmV0d29yayBpbiBkYW5nZXIuIEFueW9uZSB3aG8gZG9lcyBub3QgaGF2ZSBhIHRob3JvdWdoIGtub3dsZWRnZSBvZiBuZXR3b3JrcyBhbmQgYW55b25lIHdobyBkb2VzIG5vdCBoYXZlIHRoZSBuZXR3b3JrIGFkbWluaXN0cmF0b3IncyBwZXJtaXNzaW9uIG11c3Qgbm90IGVuYWJsZSB0aGUgU2VjdXJlTkFUIGZ1bmN0aW9uLiBGb3IgYSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiB0aGUgU2VjdXJlTkFUIGZ1bmN0aW9uLCBwbGVhc2UgcmVmZXIgdG8gdGhlIFZQTiBTZXJ2ZXIncyBtYW51YWwgYW5kIG9ubGluZSBkb2N1bWVudGF0aW9uLiBZb3UgY2Fubm90IGV4ZWN1dGUgdGhpcyBBUEkgZm9yIFZpcnR1YWwgSHVicyBvZiBWUE4gU2VydmVycyBvcGVyYXRpbmcgYXMgYSBjbHVzdGVyLiAqL1xyXG4gICAgICAgIHRoaXMuRW5hYmxlU2VjdXJlTkFUID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJFbmFibGVTZWN1cmVOQVRcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIERpc2FibGUgdGhlIFZpcnR1YWwgTkFUIGFuZCBESENQIFNlcnZlciBGdW5jdGlvbiAoU2VjdXJlTkFUIEZ1bmN0aW9uKS4gVXNlIHRoaXMgdG8gZGlzYWJsZSB0aGUgVmlydHVhbCBOQVQgYW5kIERIQ1AgU2VydmVyIGZ1bmN0aW9uIChTZWN1cmVOQVQgRnVuY3Rpb24pIG9uIHRoZSBjdXJyZW50bHkgbWFuYWdlZCBWaXJ0dWFsIEh1Yi4gQnkgZXhlY3V0aW5nIHRoaXMgQVBJIHRoZSBWaXJ0dWFsIE5BVCBmdW5jdGlvbiBpbW1lZGlhdGVseSBzdG9wcyBvcGVyYXRpbmcgYW5kIHRoZSBWaXJ0dWFsIERIQ1AgU2VydmVyIGZ1bmN0aW9uIGRlbGV0ZXMgdGhlIERIQ1AgbGVhc2UgZGF0YWJhc2UgYW5kIHN0b3BzIHRoZSBzZXJ2aWNlLiBZb3UgY2Fubm90IGV4ZWN1dGUgdGhpcyBBUEkgZm9yIFZpcnR1YWwgSHVicyBvZiBWUE4gU2VydmVycyBvcGVyYXRpbmcgYXMgYSBjbHVzdGVyLiAqL1xyXG4gICAgICAgIHRoaXMuRGlzYWJsZVNlY3VyZU5BVCA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiRGlzYWJsZVNlY3VyZU5BVFwiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogQ2hhbmdlIFNldHRpbmdzIG9mIFNlY3VyZU5BVCBGdW5jdGlvbi4gVXNlIHRoaXMgdG8gY2hhbmdlIGFuZCBzYXZlIHRoZSB2aXJ0dWFsIGhvc3QgbmV0d29yayBpbnRlcmZhY2Ugc2V0dGluZ3MsIHZpcnR1YWwgTkFUIGZ1bmN0aW9uIHNldHRpbmdzIGFuZCB2aXJ0dWFsIERIQ1Agc2VydmVyIHNldHRpbmdzIG9mIHRoZSBWaXJ0dWFsIE5BVCBhbmQgREhDUCBTZXJ2ZXIgZnVuY3Rpb24gKFNlY3VyZU5BVCBmdW5jdGlvbikgb24gdGhlIGN1cnJlbnRseSBtYW5hZ2VkIFZpcnR1YWwgSHViLiBUaGUgU2VjdXJlTkFUIGZ1bmN0aW9uIGhvbGRzIG9uZSB2aXJ0dWFsIG5ldHdvcmsgYWRhcHRlciBvbiB0aGUgTDIgc2VnbWVudCBpbnNpZGUgdGhlIFZpcnR1YWwgSHViIGFuZCBpdCBoYXMgYmVlbiBhc3NpZ25lZCBhIE1BQyBhZGRyZXNzIGFuZCBhbiBJUCBhZGRyZXNzLiBCeSBkb2luZyB0aGlzLCBhbm90aGVyIGhvc3QgY29ubmVjdGVkIHRvIHRoZSBzYW1lIEwyIHNlZ21lbnQgaXMgYWJsZSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBTZWN1cmVOQVQgdmlydHVhbCBob3N0IGFzIGlmIGl0IGlzIGFuIGFjdHVhbCBJUCBob3N0IGV4aXN0aW5nIG9uIHRoZSBuZXR3b3JrLiBbV2FybmluZyBhYm91dCBTZWN1cmVOQVQgRnVuY3Rpb25dIFRoZSBTZWN1cmVOQVQgZnVuY3Rpb24gaXMgcmVjb21tZW5kZWQgb25seSBmb3Igc3lzdGVtIGFkbWluaXN0cmF0b3JzIGFuZCBwZW9wbGUgd2l0aCBhIGRldGFpbGVkIGtub3dsZWRnZSBvZiBuZXR3b3Jrcy4gSWYgeW91IHVzZSB0aGUgU2VjdXJlTkFUIGZ1bmN0aW9uIGNvcnJlY3RseSwgaXQgaXMgcG9zc2libGUgdG8gYWNoaWV2ZSBhIHNhZmUgZm9ybSBvZiByZW1vdGUgYWNjZXNzIHZpYSBhIFZQTi4gSG93ZXZlciB3aGVuIHVzZWQgaW4gdGhlIHdyb25nIHdheSwgaXQgY2FuIHB1dCB0aGUgZW50aXJlIG5ldHdvcmsgaW4gZGFuZ2VyLiBBbnlvbmUgd2hvIGRvZXMgbm90IGhhdmUgYSB0aG9yb3VnaCBrbm93bGVkZ2Ugb2YgbmV0d29ya3MgYW5kIGFueW9uZSB3aG8gZG9lcyBub3QgaGF2ZSB0aGUgbmV0d29yayBhZG1pbmlzdHJhdG9ycyBwZXJtaXNzaW9uIG11c3Qgbm90IGVuYWJsZSB0aGUgU2VjdXJlTkFUIGZ1bmN0aW9uLiBGb3IgYSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiB0aGUgU2VjdXJlTkFUIGZ1bmN0aW9uLCBwbGVhc2UgcmVmZXIgdG8gdGhlIFZQTiBTZXJ2ZXIncyBtYW51YWwgYW5kIG9ubGluZSBkb2N1bWVudGF0aW9uLiBZb3UgY2Fubm90IGV4ZWN1dGUgdGhpcyBBUEkgZm9yIFZpcnR1YWwgSHVicyBvZiBWUE4gU2VydmVycyBvcGVyYXRpbmcgYXMgYSBjbHVzdGVyLiAqL1xyXG4gICAgICAgIHRoaXMuU2V0U2VjdXJlTkFUT3B0aW9uID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJTZXRTZWN1cmVOQVRPcHRpb25cIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIEdldCBTZXR0aW5ncyBvZiBTZWN1cmVOQVQgRnVuY3Rpb24uIFRoaXMgQVBJIGdldCB0aGUgcmVnaXN0ZXJlZCBzZXR0aW5ncyBmb3IgdGhlIFNlY3VyZU5BVCBmdW5jdGlvbiB3aGljaCBpcyBzZXQgYnkgdGhlIFNldFNlY3VyZU5BVE9wdGlvbiBBUEkuICovXHJcbiAgICAgICAgdGhpcy5HZXRTZWN1cmVOQVRPcHRpb24gPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkdldFNlY3VyZU5BVE9wdGlvblwiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogR2V0IFZpcnR1YWwgTkFUIEZ1bmN0aW9uIFNlc3Npb24gVGFibGUgb2YgU2VjdXJlTkFUIEZ1bmN0aW9uLiBVc2UgdGhpcyB0byBnZXQgdGhlIHRhYmxlIG9mIFRDUCBhbmQgVURQIHNlc3Npb25zIGN1cnJlbnRseSBjb21tdW5pY2F0aW5nIHZpYSB0aGUgVmlydHVhbCBOQVQgKE5BVCB0YWJsZSkgaW4gY2FzZXMgd2hlbiB0aGUgVmlydHVhbCBOQVQgZnVuY3Rpb24gaXMgb3BlcmF0aW5nIG9uIHRoZSBjdXJyZW50bHkgbWFuYWdlZCBWaXJ0dWFsIEh1Yi4gWW91IGNhbm5vdCBleGVjdXRlIHRoaXMgQVBJIGZvciBWaXJ0dWFsIEh1YnMgb2YgVlBOIFNlcnZlcnMgb3BlcmF0aW5nIGFzIGEgY2x1c3Rlci4gKi9cclxuICAgICAgICB0aGlzLkVudW1OQVQgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkVudW1OQVRcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIEdldCBWaXJ0dWFsIERIQ1AgU2VydmVyIEZ1bmN0aW9uIExlYXNlIFRhYmxlIG9mIFNlY3VyZU5BVCBGdW5jdGlvbi4gVXNlIHRoaXMgdG8gZ2V0IHRoZSBsZWFzZSB0YWJsZSBvZiBJUCBhZGRyZXNzZXMsIGhlbGQgYnkgdGhlIFZpcnR1YWwgREhDUCBTZXJ2ZXIsIHRoYXQgYXJlIGFzc2lnbmVkIHRvIGNsaWVudHMgaW4gY2FzZXMgd2hlbiB0aGUgVmlydHVhbCBOQVQgZnVuY3Rpb24gaXMgb3BlcmF0aW5nIG9uIHRoZSBjdXJyZW50bHkgbWFuYWdlZCBWaXJ0dWFsIEh1Yi4gWW91IGNhbm5vdCBleGVjdXRlIHRoaXMgQVBJIGZvciBWaXJ0dWFsIEh1YnMgb2YgVlBOIFNlcnZlcnMgb3BlcmF0aW5nIGFzIGEgY2x1c3Rlci4gKi9cclxuICAgICAgICB0aGlzLkVudW1ESENQID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJFbnVtREhDUFwiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogR2V0IHRoZSBPcGVyYXRpbmcgU3RhdHVzIG9mIHRoZSBWaXJ0dWFsIE5BVCBhbmQgREhDUCBTZXJ2ZXIgRnVuY3Rpb24gKFNlY3VyZU5BVCBGdW5jdGlvbikuIFVzZSB0aGlzIHRvIGdldCB0aGUgb3BlcmF0aW5nIHN0YXR1cyBvZiB0aGUgVmlydHVhbCBOQVQgYW5kIERIQ1AgU2VydmVyIGZ1bmN0aW9uIChTZWN1cmVOQVQgRnVuY3Rpb24pIHdoZW4gaXQgaXMgb3BlcmF0aW5nIG9uIHRoZSBjdXJyZW50bHkgbWFuYWdlZCBWaXJ0dWFsIEh1Yi4gWW91IGNhbm5vdCBleGVjdXRlIHRoaXMgQVBJIGZvciBWaXJ0dWFsIEh1YnMgb2YgVlBOIFNlcnZlcnMgb3BlcmF0aW5nIGFzIGEgY2x1c3Rlci4gKi9cclxuICAgICAgICB0aGlzLkdldFNlY3VyZU5BVFN0YXR1cyA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiR2V0U2VjdXJlTkFUU3RhdHVzXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBHZXQgTGlzdCBvZiBOZXR3b3JrIEFkYXB0ZXJzIFVzYWJsZSBhcyBMb2NhbCBCcmlkZ2UuIFVzZSB0aGlzIHRvIGdldCBhIGxpc3Qgb2YgRXRoZXJuZXQgZGV2aWNlcyAobmV0d29yayBhZGFwdGVycykgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIGJyaWRnZSBkZXN0aW5hdGlvbiBkZXZpY2UgYXMgcGFydCBvZiBhIExvY2FsIEJyaWRnZSBjb25uZWN0aW9uLiBJZiBwb3NzaWJsZSwgbmV0d29yayBjb25uZWN0aW9uIG5hbWUgaXMgZGlzcGxheWVkLiBZb3UgY2FuIHVzZSBhIGRldmljZSBkaXNwbGF5ZWQgaGVyZSBieSB1c2luZyB0aGUgQWRkTG9jYWxCcmlkZ2UgQVBJLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbXVzdCBoYXZlIFZQTiBTZXJ2ZXIgYWRtaW5pc3RyYXRvciBwcml2aWxlZ2VzLiAqL1xyXG4gICAgICAgIHRoaXMuRW51bUV0aGVybmV0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiRW51bUV0aGVybmV0XCIsIG5ldyBWcG5ScGNFbnVtRXRoKCkpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIENyZWF0ZSBMb2NhbCBCcmlkZ2UgQ29ubmVjdGlvbi4gVXNlIHRoaXMgdG8gY3JlYXRlIGEgbmV3IExvY2FsIEJyaWRnZSBjb25uZWN0aW9uIG9uIHRoZSBWUE4gU2VydmVyLiBCeSB1c2luZyBhIExvY2FsIEJyaWRnZSwgeW91IGNhbiBjb25maWd1cmUgYSBMYXllciAyIGJyaWRnZSBjb25uZWN0aW9uIGJldHdlZW4gYSBWaXJ0dWFsIEh1YiBvcGVyYXRpbmcgb24gdGhpcyBWUE4gc2VydmVyIGFuZCBhIHBoeXNpY2FsIEV0aGVybmV0IERldmljZSAoTmV0d29yayBBZGFwdGVyKS4gWW91IGNhbiBjcmVhdGUgYSB0YXAgZGV2aWNlICh2aXJ0dWFsIG5ldHdvcmsgaW50ZXJmYWNlKSBvbiB0aGUgc3lzdGVtIGFuZCBjb25uZWN0IGEgYnJpZGdlIGJldHdlZW4gVmlydHVhbCBIdWJzICh0aGUgdGFwIGRldmljZSBpcyBvbmx5IHN1cHBvcnRlZCBieSBMaW51eCB2ZXJzaW9ucykuIEl0IGlzIHBvc3NpYmxlIHRvIGVzdGFibGlzaCBhIGJyaWRnZSB0byBhbiBvcGVyYXRpbmcgbmV0d29yayBhZGFwdGVyIG9mIHlvdXIgY2hvaWNlIGZvciB0aGUgYnJpZGdlIGRlc3RpbmF0aW9uIEV0aGVybmV0IGRldmljZSAobmV0d29yayBhZGFwdGVyKSwgYnV0IGluIGhpZ2ggbG9hZCBlbnZpcm9ubWVudHMsIHdlIHJlY29tbWVuZCB5b3UgcHJlcGFyZSBhIG5ldHdvcmsgYWRhcHRlciBkZWRpY2F0ZWQgdG8gc2VydmUgYXMgYSBicmlkZ2UuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBtdXN0IGhhdmUgVlBOIFNlcnZlciBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMuICovXHJcbiAgICAgICAgdGhpcy5BZGRMb2NhbEJyaWRnZSA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiQWRkTG9jYWxCcmlkZ2VcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIERlbGV0ZSBMb2NhbCBCcmlkZ2UgQ29ubmVjdGlvbi4gVXNlIHRoaXMgdG8gZGVsZXRlIGFuIGV4aXN0aW5nIExvY2FsIEJyaWRnZSBjb25uZWN0aW9uLiBUbyBnZXQgYSBsaXN0IG9mIGN1cnJlbnQgTG9jYWwgQnJpZGdlIGNvbm5lY3Rpb25zIHVzZSB0aGUgRW51bUxvY2FsQnJpZGdlIEFQSS4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG11c3QgaGF2ZSBWUE4gU2VydmVyIGFkbWluaXN0cmF0b3IgcHJpdmlsZWdlcy4gKi9cclxuICAgICAgICB0aGlzLkRlbGV0ZUxvY2FsQnJpZGdlID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJEZWxldGVMb2NhbEJyaWRnZVwiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogR2V0IExpc3Qgb2YgTG9jYWwgQnJpZGdlIENvbm5lY3Rpb24uIFVzZSB0aGlzIHRvIGdldCBhIGxpc3Qgb2YgdGhlIGN1cnJlbnRseSBkZWZpbmVkIExvY2FsIEJyaWRnZSBjb25uZWN0aW9ucy4gWW91IGNhbiBnZXQgdGhlIExvY2FsIEJyaWRnZSBjb25uZWN0aW9uIFZpcnR1YWwgSHViIG5hbWUgYW5kIHRoZSBicmlkZ2UgZGVzdGluYXRpb24gRXRoZXJuZXQgZGV2aWNlIChuZXR3b3JrIGFkYXB0ZXIpIG5hbWUgb3IgdGFwIGRldmljZSBuYW1lLCBhcyB3ZWxsIGFzIHRoZSBvcGVyYXRpbmcgc3RhdHVzLiAqL1xyXG4gICAgICAgIHRoaXMuRW51bUxvY2FsQnJpZGdlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiRW51bUxvY2FsQnJpZGdlXCIsIG5ldyBWcG5ScGNFbnVtTG9jYWxCcmlkZ2UoKSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogR2V0IHdoZXRoZXIgdGhlIGxvY2FsYnJpZGdlIGZ1bmN0aW9uIGlzIHN1cHBvcnRlZCBvbiB0aGUgY3VycmVudCBzeXN0ZW0uICovXHJcbiAgICAgICAgdGhpcy5HZXRCcmlkZ2VTdXBwb3J0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiR2V0QnJpZGdlU3VwcG9ydFwiLCBuZXcgVnBuUnBjQnJpZGdlU3VwcG9ydCgpKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBSZWJvb3QgVlBOIFNlcnZlciBTZXJ2aWNlLiBVc2UgdGhpcyB0byByZXN0YXJ0IHRoZSBWUE4gU2VydmVyIHNlcnZpY2UuIFdoZW4geW91IHJlc3RhcnQgdGhlIFZQTiBTZXJ2ZXIsIGFsbCBjdXJyZW50bHkgY29ubmVjdGVkIHNlc3Npb25zIGFuZCBUQ1AgY29ubmVjdGlvbnMgd2lsbCBiZSBkaXNjb25uZWN0ZWQgYW5kIG5vIG5ldyBjb25uZWN0aW9ucyB3aWxsIGJlIGFjY2VwdGVkIHVudGlsIHRoZSByZXN0YXJ0IHByb2Nlc3MgaGFzIGNvbXBsZXRlZC4gQnkgdXNpbmcgdGhpcyBBUEksIG9ubHkgdGhlIFZQTiBTZXJ2ZXIgc2VydmljZSBwcm9ncmFtIHdpbGwgYmUgcmVzdGFydGVkIGFuZCB0aGUgcGh5c2ljYWwgY29tcHV0ZXIgdGhhdCBWUE4gU2VydmVyIGlzIG9wZXJhdGluZyBvbiBkb2VzIG5vdCByZXN0YXJ0LiBUaGlzIG1hbmFnZW1lbnQgc2Vzc2lvbiB3aWxsIGFsc28gYmUgZGlzY29ubmVjdGVkLCBzbyB5b3Ugd2lsbCBuZWVkIHRvIHJlY29ubmVjdCB0byBjb250aW51ZSBtYW5hZ2VtZW50LiBBbHNvLCBieSBzcGVjaWZ5aW5nIHRoZSBcIkludFZhbHVlXCIgcGFyYW1ldGVyIHRvIFwiMVwiLCB0aGUgY29udGVudHMgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSAoLmNvbmZpZykgaGVsZCBieSB0aGUgY3VycmVudCBWUE4gU2VydmVyIHdpbGwgYmUgaW5pdGlhbGl6ZWQuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBtdXN0IGhhdmUgVlBOIFNlcnZlciBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMuICovXHJcbiAgICAgICAgdGhpcy5SZWJvb3RTZXJ2ZXIgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIlJlYm9vdFNlcnZlclwiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogR2V0IExpc3Qgb2YgU2VydmVyIEZ1bmN0aW9ucyAvIENhcGFiaWxpdHkuIFVzZSB0aGlzIGdldCBhIGxpc3Qgb2YgZnVuY3Rpb25zIGFuZCBjYXBhYmlsaXR5IG9mIHRoZSBWUE4gU2VydmVyIGN1cnJlbnRseSBjb25uZWN0ZWQgYW5kIGJlaW5nIG1hbmFnZWQuIFRoZSBmdW5jdGlvbiBhbmQgY2FwYWJpbGl0eSBvZiBWUE4gU2VydmVycyBhcmUgZGlmZmVyZW50IGRlcGVuZGluZyBvbiB0aGUgb3BlcmF0aW5nIFZQTiBzZXJ2ZXIncyBlZGl0aW9uIGFuZCB2ZXJzaW9uLiBVc2luZyB0aGlzIEFQSSwgeW91IGNhbiBmaW5kIG91dCB0aGUgY2FwYWJpbGl0eSBvZiB0aGUgdGFyZ2V0IFZQTiBTZXJ2ZXIgYW5kIHJlcG9ydCBpdC4gKi9cclxuICAgICAgICB0aGlzLkdldENhcHMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJHZXRDYXBzXCIsIG5ldyBWcG5DYXBzbGlzdCgpKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBHZXQgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvZiB0aGUgVlBOIFNlcnZlci4gVXNlIHRoaXMgdG8gZ2V0IGEgdGV4dCBmaWxlICguY29uZmlnIGZpbGUpIHRoYXQgY29udGFpbnMgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBjb250ZW50cyBvZiB0aGUgVlBOIHNlcnZlci4gWW91IGNhbiBnZXQgdGhlIHN0YXR1cyBvbiB0aGUgVlBOIFNlcnZlciBhdCB0aGUgaW5zdGFudCB0aGlzIEFQSSBpcyBleGVjdXRlZC4gWW91IGNhbiBlZGl0IHRoZSBjb25maWd1cmF0aW9uIGZpbGUgYnkgdXNpbmcgYSByZWd1bGFyIHRleHQgZWRpdG9yLiBUbyB3cml0ZSBhbiBlZGl0ZWQgY29uZmlndXJhdGlvbiB0byB0aGUgVlBOIFNlcnZlciwgdXNlIHRoZSBTZXRDb25maWcgQVBJLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbXVzdCBoYXZlIFZQTiBTZXJ2ZXIgYWRtaW5pc3RyYXRvciBwcml2aWxlZ2VzLiAqL1xyXG4gICAgICAgIHRoaXMuR2V0Q29uZmlnID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiR2V0Q29uZmlnXCIsIG5ldyBWcG5ScGNDb25maWcoKSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogV3JpdGUgQ29uZmlndXJhdGlvbiBGaWxlIHRvIFZQTiBTZXJ2ZXIuIFVzZSB0aGlzIHRvIHdyaXRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgdG8gdGhlIFZQTiBTZXJ2ZXIuIEJ5IGV4ZWN1dGluZyB0aGlzIEFQSSwgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiBmaWxlIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgVlBOIFNlcnZlciBhbmQgdGhlIFZQTiBTZXJ2ZXIgcHJvZ3JhbSB3aWxsIGF1dG9tYXRpY2FsbHkgcmVzdGFydCBhbmQgdXBvbiByZXN0YXJ0LCBvcGVyYXRlIGFjY29yZGluZyB0byB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gY29udGVudHMuIEJlY2F1c2UgaXQgaXMgZGlmZmljdWx0IGZvciBhbiBhZG1pbmlzdHJhdG9yIHRvIHdyaXRlIGFsbCB0aGUgY29udGVudHMgb2YgYSBjb25maWd1cmF0aW9uIGZpbGUsIHdlIHJlY29tbWVuZCB5b3UgdXNlIHRoZSBHZXRDb25maWcgQVBJIHRvIGdldCB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgVlBOIFNlcnZlciBjb25maWd1cmF0aW9uIGFuZCBzYXZlIGl0IHRvIGZpbGUuIFlvdSBjYW4gdGhlbiBlZGl0IHRoZXNlIGNvbnRlbnRzIGluIGEgcmVndWxhciB0ZXh0IGVkaXRvciBhbmQgdGhlbiB1c2UgdGhlIFNldENvbmZpZyBBUEkgdG8gcmV3cml0ZSB0aGUgY29udGVudHMgdG8gdGhlIFZQTiBTZXJ2ZXIuIFRoaXMgQVBJIGlzIGZvciBwZW9wbGUgd2l0aCBhIGRldGFpbGVkIGtub3dsZWRnZSBvZiB0aGUgVlBOIFNlcnZlciBhbmQgaWYgYW4gaW5jb3JyZWN0bHkgY29uZmlndXJlZCBjb25maWd1cmF0aW9uIGZpbGUgaXMgd3JpdHRlbiB0byB0aGUgVlBOIFNlcnZlciwgaXQgbm90IG9ubHkgY291bGQgY2F1c2UgZXJyb3JzLCBpdCBjb3VsZCBhbHNvIHJlc3VsdCBpbiB0aGUgbG9zdCBvZiB0aGUgY3VycmVudCBzZXR0aW5nIGRhdGEuIFRha2Ugc3BlY2lhbCBjYXJlIHdoZW4gY2Fycnlpbmcgb3V0IHRoaXMgYWN0aW9uLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbXVzdCBoYXZlIFZQTiBTZXJ2ZXIgYWRtaW5pc3RyYXRvciBwcml2aWxlZ2VzLiAqL1xyXG4gICAgICAgIHRoaXMuU2V0Q29uZmlnID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJTZXRDb25maWdcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIEdldCBWaXJ0dWFsIEh1YiBBZG1pbmlzdHJhdGlvbiBPcHRpb24gZGVmYXVsdCB2YWx1ZXMuICovXHJcbiAgICAgICAgdGhpcy5HZXREZWZhdWx0SHViQWRtaW5PcHRpb25zID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJHZXREZWZhdWx0SHViQWRtaW5PcHRpb25zXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBHZXQgTGlzdCBvZiBWaXJ0dWFsIEh1YiBBZG1pbmlzdHJhdGlvbiBPcHRpb25zLiBVc2UgdGhpcyB0byBnZXQgYSBsaXN0IG9mIFZpcnR1YWwgSHViIGFkbWluaXN0cmF0aW9uIG9wdGlvbnMgdGhhdCBhcmUgc2V0IG9uIHRoZSBjdXJyZW50bHkgbWFuYWdlZCBWaXJ0dWFsIEh1Yi4gVGhlIHB1cnBvc2Ugb2YgdGhlIFZpcnR1YWwgSHViIGFkbWluaXN0cmF0aW9uIG9wdGlvbnMgaXMgZm9yIHRoZSBWUE4gU2VydmVyIEFkbWluaXN0cmF0b3IgdG8gc2V0IGxpbWl0cyBmb3IgdGhlIHNldHRpbmcgcmFuZ2VzIHdoZW4gdGhlIGFkbWluaXN0cmF0aW9uIG9mIHRoZSBWaXJ0dWFsIEh1YiBpcyB0byBiZSB0cnVzdGVkIHRvIGVhY2ggVmlydHVhbCBIdWIgYWRtaW5pc3RyYXRvci4gT25seSBhbiBhZG1pbmlzdHJhdG9yIHdpdGggYWRtaW5pc3RyYXRpb24gcHJpdmlsZWdlcyBmb3IgdGhpcyBlbnRpcmUgVlBOIFNlcnZlciBpcyBhYmxlIHRvIGFkZCwgZWRpdCBhbmQgZGVsZXRlIHRoZSBWaXJ0dWFsIEh1YiBhZG1pbmlzdHJhdGlvbiBvcHRpb25zLiBUaGUgVmlydHVhbCBIdWIgYWRtaW5pc3RyYXRvcnMgYXJlIHVuYWJsZSB0byBtYWtlIGNoYW5nZXMgdG8gdGhlIGFkbWluaXN0cmF0aW9uIG9wdGlvbnMsIGhvd2V2ZXIgdGhleSBhcmUgYWJsZSB0byB2aWV3IHRoZW0uIFRoZXJlIGlzIGFuIGV4Y2VwdGlvbiBob3dldmVyLiBJZiBhbGxvd19odWJfYWRtaW5fY2hhbmdlX29wdGlvbiBpcyBzZXQgdG8gXCIxXCIsIGV2ZW4gVmlydHVhbCBIdWIgYWRtaW5pc3RyYXRvcnMgYXJlIGFibGUgdG8gZWRpdCB0aGUgYWRtaW5pc3RyYXRpb24gb3B0aW9ucy4gVGhpcyBBUEkgY2Fubm90IGJlIGludm9rZWQgb24gVlBOIEJyaWRnZS4gWW91IGNhbm5vdCBleGVjdXRlIHRoaXMgQVBJIGZvciBWaXJ0dWFsIEh1YnMgb2YgVlBOIFNlcnZlcnMgb3BlcmF0aW5nIGFzIGEgY2x1c3RlciBtZW1iZXIuICovXHJcbiAgICAgICAgdGhpcy5HZXRIdWJBZG1pbk9wdGlvbnMgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkdldEh1YkFkbWluT3B0aW9uc1wiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogU2V0IFZhbHVlcyBvZiBWaXJ0dWFsIEh1YiBBZG1pbmlzdHJhdGlvbiBPcHRpb25zLiBVc2UgdGhpcyB0byBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBWaXJ0dWFsIEh1YiBhZG1pbmlzdHJhdGlvbiBvcHRpb25zIHRoYXQgYXJlIHNldCBvbiB0aGUgY3VycmVudGx5IG1hbmFnZWQgVmlydHVhbCBIdWIuIFRoZSBwdXJwb3NlIG9mIHRoZSBWaXJ0dWFsIEh1YiBhZG1pbmlzdHJhdGlvbiBvcHRpb25zIGlzIGZvciB0aGUgVlBOIFNlcnZlciBBZG1pbmlzdHJhdG9yIHRvIHNldCBsaW1pdHMgZm9yIHRoZSBzZXR0aW5nIHJhbmdlcyB3aGVuIHRoZSBhZG1pbmlzdHJhdGlvbiBvZiB0aGUgVmlydHVhbCBIdWIgaXMgdG8gYmUgdHJ1c3RlZCB0byBlYWNoIFZpcnR1YWwgSHViIGFkbWluaXN0cmF0b3IuIE9ubHkgYW4gYWRtaW5pc3RyYXRvciB3aXRoIGFkbWluaXN0cmF0aW9uIHByaXZpbGVnZXMgZm9yIHRoaXMgZW50aXJlIFZQTiBTZXJ2ZXIgaXMgYWJsZSB0byBhZGQsIGVkaXQgYW5kIGRlbGV0ZSB0aGUgVmlydHVhbCBIdWIgYWRtaW5pc3RyYXRpb24gb3B0aW9ucy4gVGhlIFZpcnR1YWwgSHViIGFkbWluaXN0cmF0b3JzIGFyZSB1bmFibGUgdG8gbWFrZSBjaGFuZ2VzIHRvIHRoZSBhZG1pbmlzdHJhdGlvbiBvcHRpb25zLCBob3dldmVyIHRoZXkgYXJlIGFibGUgdG8gdmlldyB0aGVtLiBUaGVyZSBpcyBhbiBleGNlcHRpb24gaG93ZXZlci4gSWYgYWxsb3dfaHViX2FkbWluX2NoYW5nZV9vcHRpb24gaXMgc2V0IHRvIFwiMVwiLCBldmVuIFZpcnR1YWwgSHViIGFkbWluaXN0cmF0b3JzIGFyZSBhYmxlIHRvIGVkaXQgdGhlIGFkbWluaXN0cmF0aW9uIG9wdGlvbnMuIFRoaXMgQVBJIGNhbm5vdCBiZSBpbnZva2VkIG9uIFZQTiBCcmlkZ2UuIFlvdSBjYW5ub3QgZXhlY3V0ZSB0aGlzIEFQSSBmb3IgVmlydHVhbCBIdWJzIG9mIFZQTiBTZXJ2ZXJzIG9wZXJhdGluZyBhcyBhIGNsdXN0ZXIgbWVtYmVyLiAqL1xyXG4gICAgICAgIHRoaXMuU2V0SHViQWRtaW5PcHRpb25zID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJTZXRIdWJBZG1pbk9wdGlvbnNcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIEdldCBMaXN0IG9mIFZpcnR1YWwgSHViIEV4dGVuZGVkIE9wdGlvbnMuIFVzZSB0aGlzIHRvIGdldCBhIFZpcnR1YWwgSHViIEV4dGVuZGVkIE9wdGlvbnMgTGlzdCB0aGF0IGlzIHNldCBvbiB0aGUgY3VycmVudGx5IG1hbmFnZWQgVmlydHVhbCBIdWIuIFZpcnR1YWwgSHViIEV4dGVuZGVkIE9wdGlvbiBlbmFibGVzIHlvdSB0byBjb25maWd1cmUgbW9yZSBkZXRhaWwgc2V0dGluZ3Mgb2YgdGhlIFZpcnR1YWwgSHViLiBCeSBkZWZhdWx0LCBib3RoIFZQTiBTZXJ2ZXIncyBnbG9iYWwgYWRtaW5pc3RyYXRvcnMgYW5kIGluZGl2aWR1YWwgVmlydHVhbCBIdWIncyBhZG1pbmlzdHJhdG9ycyBjYW4gbW9kaWZ5IHRoZSBWaXJ0dWFsIEh1YiBFeHRlbmRlZCBPcHRpb25zLiBIb3dldmVyLCBpZiB0aGUgZGVueV9odWJfYWRtaW5fY2hhbmdlX2V4dF9vcHRpb24gaXMgc2V0IHRvIDEgb24gdGhlIFZpcnR1YWwgSHViIEFkbWluIE9wdGlvbnMsIHRoZSBpbmRpdmlkdWFsIFZpcnR1YWwgSHViJ3MgYWRtaW5pc3RyYXRvcnMgY2Fubm90IG1vZGlmeSB0aGUgVmlydHVhbCBIdWIgRXh0ZW5kZWQgT3B0aW9ucy4gVGhpcyBBUEkgY2Fubm90IGJlIGludm9rZWQgb24gVlBOIEJyaWRnZS4gWW91IGNhbm5vdCBleGVjdXRlIHRoaXMgQVBJIGZvciBWaXJ0dWFsIEh1YnMgb2YgVlBOIFNlcnZlcnMgb3BlcmF0aW5nIGFzIGEgY2x1c3RlciBtZW1iZXIuICovXHJcbiAgICAgICAgdGhpcy5HZXRIdWJFeHRPcHRpb25zID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJHZXRIdWJFeHRPcHRpb25zXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBTZXQgYSBWYWx1ZSBvZiBWaXJ0dWFsIEh1YiBFeHRlbmRlZCBPcHRpb25zLiBVc2UgdGhpcyB0byBzZXQgYSB2YWx1ZSBpbiB0aGUgVmlydHVhbCBIdWIgRXh0ZW5kZWQgT3B0aW9ucyBMaXN0IHRoYXQgaXMgc2V0IG9uIHRoZSBjdXJyZW50bHkgbWFuYWdlZCBWaXJ0dWFsIEh1Yi4gVmlydHVhbCBIdWIgRXh0ZW5kZWQgT3B0aW9uIGVuYWJsZXMgeW91IHRvIGNvbmZpZ3VyZSBtb3JlIGRldGFpbCBzZXR0aW5ncyBvZiB0aGUgVmlydHVhbCBIdWIuIEJ5IGRlZmF1bHQsIGJvdGggVlBOIFNlcnZlcidzIGdsb2JhbCBhZG1pbmlzdHJhdG9ycyBhbmQgaW5kaXZpZHVhbCBWaXJ0dWFsIEh1YidzIGFkbWluaXN0cmF0b3JzIGNhbiBtb2RpZnkgdGhlIFZpcnR1YWwgSHViIEV4dGVuZGVkIE9wdGlvbnMuIEhvd2V2ZXIsIGlmIHRoZSBkZW55X2h1Yl9hZG1pbl9jaGFuZ2VfZXh0X29wdGlvbiBpcyBzZXQgdG8gMSBvbiB0aGUgVmlydHVhbCBIdWIgQWRtaW4gT3B0aW9ucywgdGhlIGluZGl2aWR1YWwgVmlydHVhbCBIdWIncyBhZG1pbmlzdHJhdG9ycyBjYW5ub3QgbW9kaWZ5IHRoZSBWaXJ0dWFsIEh1YiBFeHRlbmRlZCBPcHRpb25zLiBUaGlzIEFQSSBjYW5ub3QgYmUgaW52b2tlZCBvbiBWUE4gQnJpZGdlLiBZb3UgY2Fubm90IGV4ZWN1dGUgdGhpcyBBUEkgZm9yIFZpcnR1YWwgSHVicyBvZiBWUE4gU2VydmVycyBvcGVyYXRpbmcgYXMgYSBjbHVzdGVyIG1lbWJlci4gKi9cclxuICAgICAgICB0aGlzLlNldEh1YkV4dE9wdGlvbnMgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIlNldEh1YkV4dE9wdGlvbnNcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIERlZmluZSBOZXcgVmlydHVhbCBMYXllciAzIFN3aXRjaC4gVXNlIHRoaXMgdG8gZGVmaW5lIGEgbmV3IFZpcnR1YWwgTGF5ZXIgMyBTd2l0Y2ggb24gdGhlIFZQTiBTZXJ2ZXIuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBtdXN0IGhhdmUgVlBOIFNlcnZlciBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMuIEFsc28sIHRoaXMgQVBJIGRvZXMgbm90IG9wZXJhdGUgb24gVlBOIEJyaWRnZS4gW0V4cGxhbmF0aW9uIG9uIFZpcnR1YWwgTGF5ZXIgMyBTd2l0Y2ggRnVuY3Rpb25dIFlvdSBjYW4gZGVmaW5lIFZpcnR1YWwgTGF5ZXIgMyBTd2l0Y2hlcyBiZXR3ZWVuIG11bHRpcGxlIFZpcnR1YWwgSHVicyBvcGVyYXRpbmcgb24gdGhpcyBWUE4gU2VydmVyIGFuZCBjb25maWd1cmUgcm91dGluZyBiZXR3ZWVuIGRpZmZlcmVudCBJUCBuZXR3b3Jrcy4gW0NhdXRpb24gYWJvdXQgdGhlIFZpcnR1YWwgTGF5ZXIgMyBTd2l0Y2ggRnVuY3Rpb25dIFRoZSBWaXJ0dWFsIExheWVyIDMgU3dpdGNoIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQgZm9yIG5ldHdvcmsgYWRtaW5pc3RyYXRvcnMgYW5kIG90aGVyIHBlb3BsZSB3aG8ga25vdyBhIGxvdCBhYm91dCBuZXR3b3JrcyBhbmQgSVAgcm91dGluZy4gSWYgeW91IGFyZSB1c2luZyB0aGUgcmVndWxhciBWUE4gZnVuY3Rpb25zLCB5b3UgZG8gbm90IG5lZWQgdG8gdXNlIHRoZSBWaXJ0dWFsIExheWVyIDMgU3dpdGNoIGZ1bmN0aW9ucy4gSWYgdGhlIFZpcnR1YWwgTGF5ZXIgMyBTd2l0Y2ggZnVuY3Rpb25zIGFyZSB0byBiZSB1c2VkLCB0aGUgcGVyc29uIHdobyBjb25maWd1cmVzIHRoZW0gbXVzdCBoYXZlIHN1ZmZpY2llbnQga25vd2xlZGdlIG9mIElQIHJvdXRpbmcgYW5kIGJlIHBlcmZlY3RseSBjYXBhYmxlIG9mIG5vdCBpbXBhY3RpbmcgdGhlIG5ldHdvcmsuICovXHJcbiAgICAgICAgdGhpcy5BZGRMM1N3aXRjaCA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiQWRkTDNTd2l0Y2hcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIERlbGV0ZSBWaXJ0dWFsIExheWVyIDMgU3dpdGNoLiBVc2UgdGhpcyB0byBkZWxldGUgYW4gZXhpc3RpbmcgVmlydHVhbCBMYXllciAzIFN3aXRjaCB0aGF0IGlzIGRlZmluZWQgb24gdGhlIFZQTiBTZXJ2ZXIuIFdoZW4gdGhlIHNwZWNpZmllZCBWaXJ0dWFsIExheWVyIDMgU3dpdGNoIGlzIG9wZXJhdGluZywgaXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGRlbGV0ZWQgYWZ0ZXIgb3BlcmF0aW9uIHN0b3BzLiBUbyBnZXQgYSBsaXN0IG9mIGV4aXN0aW5nIFZpcnR1YWwgTGF5ZXIgMyBTd2l0Y2hlcywgdXNlIHRoZSBFbnVtTDNTd2l0Y2ggQVBJLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbXVzdCBoYXZlIFZQTiBTZXJ2ZXIgYWRtaW5pc3RyYXRvciBwcml2aWxlZ2VzLiBBbHNvLCB0aGlzIEFQSSBkb2VzIG5vdCBvcGVyYXRlIG9uIFZQTiBCcmlkZ2UuICovXHJcbiAgICAgICAgdGhpcy5EZWxMM1N3aXRjaCA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiRGVsTDNTd2l0Y2hcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIEdldCBMaXN0IG9mIFZpcnR1YWwgTGF5ZXIgMyBTd2l0Y2hlcy4gVXNlIHRoaXMgdG8gZGVmaW5lIGEgbmV3IFZpcnR1YWwgTGF5ZXIgMyBTd2l0Y2ggb24gdGhlIFZQTiBTZXJ2ZXIuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBtdXN0IGhhdmUgVlBOIFNlcnZlciBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMuIEFsc28sIHRoaXMgQVBJIGRvZXMgbm90IG9wZXJhdGUgb24gVlBOIEJyaWRnZS4gW0V4cGxhbmF0aW9uIG9uIFZpcnR1YWwgTGF5ZXIgMyBTd2l0Y2ggRnVuY3Rpb25dIFlvdSBjYW4gZGVmaW5lIFZpcnR1YWwgTGF5ZXIgMyBTd2l0Y2hlcyBiZXR3ZWVuIG11bHRpcGxlIFZpcnR1YWwgSHVicyBvcGVyYXRpbmcgb24gdGhpcyBWUE4gU2VydmVyIGFuZCBjb25maWd1cmUgcm91dGluZyBiZXR3ZWVuIGRpZmZlcmVudCBJUCBuZXR3b3Jrcy4gW0NhdXRpb24gYWJvdXQgdGhlIFZpcnR1YWwgTGF5ZXIgMyBTd2l0Y2ggRnVuY3Rpb25dIFRoZSBWaXJ0dWFsIExheWVyIDMgU3dpdGNoIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQgZm9yIG5ldHdvcmsgYWRtaW5pc3RyYXRvcnMgYW5kIG90aGVyIHBlb3BsZSB3aG8ga25vdyBhIGxvdCBhYm91dCBuZXR3b3JrcyBhbmQgSVAgcm91dGluZy4gSWYgeW91IGFyZSB1c2luZyB0aGUgcmVndWxhciBWUE4gZnVuY3Rpb25zLCB5b3UgZG8gbm90IG5lZWQgdG8gdXNlIHRoZSBWaXJ0dWFsIExheWVyIDMgU3dpdGNoIGZ1bmN0aW9ucy4gSWYgdGhlIFZpcnR1YWwgTGF5ZXIgMyBTd2l0Y2ggZnVuY3Rpb25zIGFyZSB0byBiZSB1c2VkLCB0aGUgcGVyc29uIHdobyBjb25maWd1cmVzIHRoZW0gbXVzdCBoYXZlIHN1ZmZpY2llbnQga25vd2xlZGdlIG9mIElQIHJvdXRpbmcgYW5kIGJlIHBlcmZlY3RseSBjYXBhYmxlIG9mIG5vdCBpbXBhY3RpbmcgdGhlIG5ldHdvcmsuICovXHJcbiAgICAgICAgdGhpcy5FbnVtTDNTd2l0Y2ggPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJFbnVtTDNTd2l0Y2hcIiwgbmV3IFZwblJwY0VudW1MM1N3KCkpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIFN0YXJ0IFZpcnR1YWwgTGF5ZXIgMyBTd2l0Y2ggT3BlcmF0aW9uLiBVc2UgdGhpcyB0byBzdGFydCB0aGUgb3BlcmF0aW9uIG9mIGFuIGV4aXN0aW5nIFZpcnR1YWwgTGF5ZXIgMyBTd2l0Y2ggZGVmaW5lZCBvbiB0aGUgVlBOIFNlcnZlciB3aG9zZSBvcGVyYXRpb24gaXMgY3VycmVudGx5IHN0b3BwZWQuIFRvIGdldCBhIGxpc3Qgb2YgZXhpc3RpbmcgVmlydHVhbCBMYXllciAzIFN3aXRjaGVzLCB1c2UgdGhlIEVudW1MM1N3aXRjaCBBUEkuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBtdXN0IGhhdmUgVlBOIFNlcnZlciBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMuIEFsc28sIHRoaXMgQVBJIGRvZXMgbm90IG9wZXJhdGUgb24gVlBOIEJyaWRnZS4gW0V4cGxhbmF0aW9uIG9uIFZpcnR1YWwgTGF5ZXIgMyBTd2l0Y2ggRnVuY3Rpb25dIFlvdSBjYW4gZGVmaW5lIFZpcnR1YWwgTGF5ZXIgMyBTd2l0Y2hlcyBiZXR3ZWVuIG11bHRpcGxlIFZpcnR1YWwgSHVicyBvcGVyYXRpbmcgb24gdGhpcyBWUE4gU2VydmVyIGFuZCBjb25maWd1cmUgcm91dGluZyBiZXR3ZWVuIGRpZmZlcmVudCBJUCBuZXR3b3Jrcy4gW0NhdXRpb24gYWJvdXQgdGhlIFZpcnR1YWwgTGF5ZXIgMyBTd2l0Y2ggRnVuY3Rpb25dIFRoZSBWaXJ0dWFsIExheWVyIDMgU3dpdGNoIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQgZm9yIG5ldHdvcmsgYWRtaW5pc3RyYXRvcnMgYW5kIG90aGVyIHBlb3BsZSB3aG8ga25vdyBhIGxvdCBhYm91dCBuZXR3b3JrcyBhbmQgSVAgcm91dGluZy4gSWYgeW91IGFyZSB1c2luZyB0aGUgcmVndWxhciBWUE4gZnVuY3Rpb25zLCB5b3UgZG8gbm90IG5lZWQgdG8gdXNlIHRoZSBWaXJ0dWFsIExheWVyIDMgU3dpdGNoIGZ1bmN0aW9ucy4gSWYgdGhlIFZpcnR1YWwgTGF5ZXIgMyBTd2l0Y2ggZnVuY3Rpb25zIGFyZSB0byBiZSB1c2VkLCB0aGUgcGVyc29uIHdobyBjb25maWd1cmVzIHRoZW0gbXVzdCBoYXZlIHN1ZmZpY2llbnQga25vd2xlZGdlIG9mIElQIHJvdXRpbmcgYW5kIGJlIHBlcmZlY3RseSBjYXBhYmxlIG9mIG5vdCBpbXBhY3RpbmcgdGhlIG5ldHdvcmsuICovXHJcbiAgICAgICAgdGhpcy5TdGFydEwzU3dpdGNoID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJTdGFydEwzU3dpdGNoXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBTdG9wIFZpcnR1YWwgTGF5ZXIgMyBTd2l0Y2ggT3BlcmF0aW9uLiBVc2UgdGhpcyB0byBzdG9wIHRoZSBvcGVyYXRpb24gb2YgYW4gZXhpc3RpbmcgVmlydHVhbCBMYXllciAzIFN3aXRjaCBkZWZpbmVkIG9uIHRoZSBWUE4gU2VydmVyIHdob3NlIG9wZXJhdGlvbiBpcyBjdXJyZW50bHkgb3BlcmF0aW5nLiBUbyBnZXQgYSBsaXN0IG9mIGV4aXN0aW5nIFZpcnR1YWwgTGF5ZXIgMyBTd2l0Y2hlcywgdXNlIHRoZSBFbnVtTDNTd2l0Y2ggQVBJLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbXVzdCBoYXZlIFZQTiBTZXJ2ZXIgYWRtaW5pc3RyYXRvciBwcml2aWxlZ2VzLiAqL1xyXG4gICAgICAgIHRoaXMuU3RvcEwzU3dpdGNoID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJTdG9wTDNTd2l0Y2hcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIEFkZCBWaXJ0dWFsIEludGVyZmFjZSB0byBWaXJ0dWFsIExheWVyIDMgU3dpdGNoLiBVc2UgdGhpcyB0byBhZGQgdG8gYSBzcGVjaWZpZWQgVmlydHVhbCBMYXllciAzIFN3aXRjaCwgYSB2aXJ0dWFsIGludGVyZmFjZSB0aGF0IGNvbm5lY3RzIHRvIGEgVmlydHVhbCBIdWIgb3BlcmF0aW5nIG9uIHRoZSBzYW1lIFZQTiBTZXJ2ZXIuIFlvdSBjYW4gZGVmaW5lIG11bHRpcGxlIHZpcnR1YWwgaW50ZXJmYWNlcyBhbmQgcm91dGluZyB0YWJsZXMgZm9yIGEgc2luZ2xlIFZpcnR1YWwgTGF5ZXIgMyBTd2l0Y2guIEEgdmlydHVhbCBpbnRlcmZhY2UgaXMgYXNzb2NpYXRlZCB0byBhIHZpcnR1YWwgSHViIGFuZCBvcGVyYXRlcyBhcyBhIHNpbmdsZSBJUCBob3N0IG9uIHRoZSBWaXJ0dWFsIEh1YiB3aGVuIHRoYXQgVmlydHVhbCBIdWIgaXMgb3BlcmF0aW5nLiBXaGVuIG11bHRpcGxlIHZpcnR1YWwgaW50ZXJmYWNlcyB0aGF0IHJlc3BlY3RpdmVseSBiZWxvbmcgdG8gYSBkaWZmZXJlbnQgSVAgbmV0d29yayBvZiBhIGRpZmZlcmVudCBWaXJ0dWFsIEh1YiBhcmUgZGVmaW5lZCwgSVAgcm91dGluZyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcGVyZm9ybWVkIGJldHdlZW4gdGhlc2UgaW50ZXJmYWNlcy4gWW91IG11c3QgZGVmaW5lIHRoZSBJUCBuZXR3b3JrIHNwYWNlIHRoYXQgdGhlIHZpcnR1YWwgaW50ZXJmYWNlIGJlbG9uZ3MgdG8gYW5kIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBpbnRlcmZhY2UgaXRzZWxmLiBBbHNvLCB5b3UgbXVzdCBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBWaXJ0dWFsIEh1YiB0aGF0IHRoZSBpbnRlcmZhY2Ugd2lsbCBjb25uZWN0IHRvLiBZb3UgY2FuIHNwZWNpZnkgYSBWaXJ0dWFsIEh1YiB0aGF0IGN1cnJlbnRseSBkb2Vzbid0IGV4aXN0IGZvciB0aGUgVmlydHVhbCBIdWIgbmFtZS4gVGhlIHZpcnR1YWwgaW50ZXJmYWNlIG11c3QgaGF2ZSBvbmUgSVAgYWRkcmVzcyBpbiB0aGUgVmlydHVhbCBIdWIuIFlvdSBhbHNvIG11c3Qgc3BlY2lmeSB0aGUgc3VibmV0IG1hc2sgb2YgYW4gSVAgbmV0d29yayB0aGF0IHRoZSBJUCBhZGRyZXNzIGJlbG9uZ3MgdG8uIFJvdXRpbmcgdmlhIHRoZSBWaXJ0dWFsIExheWVyIDMgU3dpdGNoZXMgb2YgSVAgc3BhY2VzIG9mIG11bHRpcGxlIHZpcnR1YWwgSHVicyBvcGVyYXRlcyBiYXNlZCBvbiB0aGUgSVAgYWRkcmVzcyBpcyBzcGVjaWZpZWQgaGVyZS4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG11c3QgaGF2ZSBWUE4gU2VydmVyIGFkbWluaXN0cmF0b3IgcHJpdmlsZWdlcy4gQWxzbywgdGhpcyBBUEkgZG9lcyBub3Qgb3BlcmF0ZSBvbiBWUE4gQnJpZGdlLiBUbyBleGVjdXRlIHRoaXMgQVBJLCB0aGUgdGFyZ2V0IFZpcnR1YWwgTGF5ZXIgMyBTd2l0Y2ggbXVzdCBiZSBzdG9wcGVkLiBJZiBpdCBpcyBub3Qgc3RvcHBlZCwgZmlyc3QgdXNlIHRoZSBTdG9wTDNTd2l0Y2ggQVBJIHRvIHN0b3AgaXQgYW5kIHRoZW4gZXhlY3V0ZSB0aGlzIEFQSS4gKi9cclxuICAgICAgICB0aGlzLkFkZEwzSWYgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkFkZEwzSWZcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIERlbGV0ZSBWaXJ0dWFsIEludGVyZmFjZSBvZiBWaXJ0dWFsIExheWVyIDMgU3dpdGNoLiBVc2UgdGhpcyB0byBkZWxldGUgYSB2aXJ0dWFsIGludGVyZmFjZSBhbHJlYWR5IGRlZmluZWQgaW4gdGhlIHNwZWNpZmllZCBWaXJ0dWFsIExheWVyIDMgU3dpdGNoLiBZb3UgY2FuIGdldCBhIGxpc3Qgb2YgdGhlIHZpcnR1YWwgaW50ZXJmYWNlcyBjdXJyZW50bHkgZGVmaW5lZCwgYnkgdXNpbmcgdGhlIEVudW1MM0lmIEFQSS4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG11c3QgaGF2ZSBWUE4gU2VydmVyIGFkbWluaXN0cmF0b3IgcHJpdmlsZWdlcy4gQWxzbywgdGhpcyBBUEkgZG9lcyBub3Qgb3BlcmF0ZSBvbiBWUE4gQnJpZGdlLiBUbyBleGVjdXRlIHRoaXMgQVBJLCB0aGUgdGFyZ2V0IFZpcnR1YWwgTGF5ZXIgMyBTd2l0Y2ggbXVzdCBiZSBzdG9wcGVkLiBJZiBpdCBpcyBub3Qgc3RvcHBlZCwgZmlyc3QgdXNlIHRoZSBTdG9wTDNTd2l0Y2ggQVBJIHRvIHN0b3AgaXQgYW5kIHRoZW4gZXhlY3V0ZSB0aGlzIEFQSS4gKi9cclxuICAgICAgICB0aGlzLkRlbEwzSWYgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkRlbEwzSWZcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIEdldCBMaXN0IG9mIEludGVyZmFjZXMgUmVnaXN0ZXJlZCBvbiB0aGUgVmlydHVhbCBMYXllciAzIFN3aXRjaC4gVXNlIHRoaXMgdG8gZ2V0IGEgbGlzdCBvZiB2aXJ0dWFsIGludGVyZmFjZXMgd2hlbiB2aXJ0dWFsIGludGVyZmFjZXMgaGF2ZSBiZWVuIGRlZmluZWQgb24gYSBzcGVjaWZpZWQgVmlydHVhbCBMYXllciAzIFN3aXRjaC4gWW91IGNhbiBkZWZpbmUgbXVsdGlwbGUgdmlydHVhbCBpbnRlcmZhY2VzIGFuZCByb3V0aW5nIHRhYmxlcyBmb3IgYSBzaW5nbGUgVmlydHVhbCBMYXllciAzIFN3aXRjaC4gQSB2aXJ0dWFsIGludGVyZmFjZSBpcyBhc3NvY2lhdGVkIHRvIGEgdmlydHVhbCBIdWIgYW5kIG9wZXJhdGVzIGFzIGEgc2luZ2xlIElQIGhvc3Qgb24gdGhlIFZpcnR1YWwgSHViIHdoZW4gdGhhdCBWaXJ0dWFsIEh1YiBpcyBvcGVyYXRpbmcuIFdoZW4gbXVsdGlwbGUgdmlydHVhbCBpbnRlcmZhY2VzIHRoYXQgcmVzcGVjdGl2ZWx5IGJlbG9uZyB0byBhIGRpZmZlcmVudCBJUCBuZXR3b3JrIG9mIGEgZGlmZmVyZW50IFZpcnR1YWwgSHViIGFyZSBkZWZpbmVkLCBJUCByb3V0aW5nIHdpbGwgYmUgYXV0b21hdGljYWxseSBwZXJmb3JtZWQgYmV0d2VlbiB0aGVzZSBpbnRlcmZhY2VzLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbXVzdCBoYXZlIFZQTiBTZXJ2ZXIgYWRtaW5pc3RyYXRvciBwcml2aWxlZ2VzLiBBbHNvLCB0aGlzIEFQSSBkb2VzIG5vdCBvcGVyYXRlIG9uIFZQTiBCcmlkZ2UuICovXHJcbiAgICAgICAgdGhpcy5FbnVtTDNJZiA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiRW51bUwzSWZcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIEFkZCBSb3V0aW5nIFRhYmxlIEVudHJ5IGZvciBWaXJ0dWFsIExheWVyIDMgU3dpdGNoLiBIZXJlIHlvdSBjYW4gYWRkIGEgbmV3IHJvdXRpbmcgdGFibGUgZW50cnkgdG8gdGhlIHJvdXRpbmcgdGFibGUgb2YgdGhlIHNwZWNpZmllZCBWaXJ0dWFsIExheWVyIDMgU3dpdGNoLiBJZiB0aGUgZGVzdGluYXRpb24gSVAgYWRkcmVzcyBvZiB0aGUgSVAgcGFja2V0IGRvZXMgbm90IGJlbG9uZyB0byBhbnkgSVAgbmV0d29yayB0aGF0IGJlbG9uZ3MgdG8gYSB2aXJ0dWFsIGludGVyZmFjZSwgdGhlIElQIHJvdXRpbmcgZW5naW5lIG9mIHRoZSBWaXJ0dWFsIExheWVyIDMgU3dpdGNoIHdpbGwgcmVmZXJlbmNlIHRoZSByb3V0aW5nIHRhYmxlIGFuZCBleGVjdXRlIHJvdXRpbmcuIFlvdSBtdXN0IHNwZWNpZnkgdGhlIGNvbnRlbnRzIG9mIHRoZSByb3V0aW5nIHRhYmxlIGVudHJ5IHRvIGJlIGFkZGVkIHRvIHRoZSBWaXJ0dWFsIExheWVyIDMgU3dpdGNoLiBZb3UgbXVzdCBzcGVjaWZ5IGFueSBJUCBhZGRyZXNzIHRoYXQgYmVsb25ncyB0byB0aGUgc2FtZSBJUCBuZXR3b3JrIGluIHRoZSB2aXJ0dWFsIGludGVyZmFjZSBvZiB0aGlzIFZpcnR1YWwgTGF5ZXIgMyBTd2l0Y2ggYXMgdGhlIGdhdGV3YXkgYWRkcmVzcy4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG11c3QgaGF2ZSBWUE4gU2VydmVyIGFkbWluaXN0cmF0b3IgcHJpdmlsZWdlcy4gQWxzbywgdGhpcyBBUEkgZG9lcyBub3Qgb3BlcmF0ZSBvbiBWUE4gQnJpZGdlLiBUbyBleGVjdXRlIHRoaXMgQVBJLCB0aGUgdGFyZ2V0IFZpcnR1YWwgTGF5ZXIgMyBTd2l0Y2ggbXVzdCBiZSBzdG9wcGVkLiBJZiBpdCBpcyBub3Qgc3RvcHBlZCwgZmlyc3QgdXNlIHRoZSBTdG9wTDNTd2l0Y2ggQVBJIHRvIHN0b3AgaXQgYW5kIHRoZW4gZXhlY3V0ZSB0aGlzIEFQSS4gKi9cclxuICAgICAgICB0aGlzLkFkZEwzVGFibGUgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkFkZEwzVGFibGVcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIERlbGV0ZSBSb3V0aW5nIFRhYmxlIEVudHJ5IG9mIFZpcnR1YWwgTGF5ZXIgMyBTd2l0Y2guIFVzZSB0aGlzIHRvIGRlbGV0ZSBhIHJvdXRpbmcgdGFibGUgZW50cnkgdGhhdCBpcyBkZWZpbmVkIGluIHRoZSBzcGVjaWZpZWQgVmlydHVhbCBMYXllciAzIFN3aXRjaC4gWW91IGNhbiBnZXQgYSBsaXN0IG9mIHRoZSBhbHJlYWR5IGRlZmluZWQgcm91dGluZyB0YWJsZSBlbnRyaWVzIGJ5IHVzaW5nIHRoZSBFbnVtTDNUYWJsZSBBUEkuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBtdXN0IGhhdmUgVlBOIFNlcnZlciBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMuIEFsc28sIHRoaXMgQVBJIGRvZXMgbm90IG9wZXJhdGUgb24gVlBOIEJyaWRnZS4gVG8gZXhlY3V0ZSB0aGlzIEFQSSwgdGhlIHRhcmdldCBWaXJ0dWFsIExheWVyIDMgU3dpdGNoIG11c3QgYmUgc3RvcHBlZC4gSWYgaXQgaXMgbm90IHN0b3BwZWQsIGZpcnN0IHVzZSB0aGUgU3RvcEwzU3dpdGNoIEFQSSB0byBzdG9wIGl0IGFuZCB0aGVuIGV4ZWN1dGUgdGhpcyBBUEkuICovXHJcbiAgICAgICAgdGhpcy5EZWxMM1RhYmxlID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJEZWxMM1RhYmxlXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBHZXQgTGlzdCBvZiBSb3V0aW5nIFRhYmxlcyBvZiBWaXJ0dWFsIExheWVyIDMgU3dpdGNoLiBVc2UgdGhpcyB0byBnZXQgYSBsaXN0IG9mIHJvdXRpbmcgdGFibGVzIHdoZW4gcm91dGluZyB0YWJsZXMgaGF2ZSBiZWVuIGRlZmluZWQgb24gYSBzcGVjaWZpZWQgVmlydHVhbCBMYXllciAzIFN3aXRjaC4gSWYgdGhlIGRlc3RpbmF0aW9uIElQIGFkZHJlc3Mgb2YgdGhlIElQIHBhY2tldCBkb2VzIG5vdCBiZWxvbmcgdG8gYW55IElQIG5ldHdvcmsgdGhhdCBiZWxvbmdzIHRvIGEgdmlydHVhbCBpbnRlcmZhY2UsIHRoZSBJUCByb3V0aW5nIGVuZ2luZSBvZiB0aGUgVmlydHVhbCBMYXllciAzIFN3aXRjaCB3aWxsIHJlZmVyZW5jZSB0aGlzIHJvdXRpbmcgdGFibGUgYW5kIGV4ZWN1dGUgcm91dGluZy4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG11c3QgaGF2ZSBWUE4gU2VydmVyIGFkbWluaXN0cmF0b3IgcHJpdmlsZWdlcy4gQWxzbywgdGhpcyBBUEkgZG9lcyBub3Qgb3BlcmF0ZSBvbiBWUE4gQnJpZGdlLiAqL1xyXG4gICAgICAgIHRoaXMuRW51bUwzVGFibGUgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkVudW1MM1RhYmxlXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBHZXQgTGlzdCBvZiBDZXJ0aWZpY2F0ZXMgUmV2b2NhdGlvbiBMaXN0LiBVc2UgdGhpcyB0byBnZXQgYSBDZXJ0aWZpY2F0ZXMgUmV2b2NhdGlvbiBMaXN0IHRoYXQgaXMgc2V0IG9uIHRoZSBjdXJyZW50bHkgbWFuYWdlZCBWaXJ0dWFsIEh1Yi4gQnkgcmVnaXN0ZXJpbmcgY2VydGlmaWNhdGVzIGluIHRoZSBDZXJ0aWZpY2F0ZXMgUmV2b2NhdGlvbiBMaXN0LCB0aGUgY2xpZW50cyB3aG8gcHJvdmlkZSB0aGVzZSBjZXJ0aWZpY2F0ZXMgd2lsbCBiZSB1bmFibGUgdG8gY29ubmVjdCB0byB0aGlzIFZpcnR1YWwgSHViIHVzaW5nIGNlcnRpZmljYXRlIGF1dGhlbnRpY2F0aW9uIG1vZGUuIE5vcm1hbGx5IHdpdGggdGhpcyBmdW5jdGlvbiwgaW4gY2FzZXMgd2hlcmUgdGhlIHNlY3VyaXR5IG9mIGEgcHJpdmF0ZSBrZXkgaGFzIGJlZW4gY29tcHJvbWlzZWQgb3Igd2hlcmUgYSBwZXJzb24gaG9sZGluZyBhIGNlcnRpZmljYXRlIGhhcyBiZWVuIHN0cmlwcGVkIG9mIHRoZWlyIHByaXZpbGVnZXMsIGJ5IHJlZ2lzdGVyaW5nIHRoYXQgY2VydGlmaWNhdGUgYXMgaW52YWxpZCBvbiB0aGUgVmlydHVhbCBIdWIsIGl0IGlzIHBvc3NpYmxlIHRvIGRlbnkgdXNlciBhdXRoZW50aWNhdGlvbiB3aGVuIHRoYXQgY2VydGlmaWNhdGUgaXMgdXNlZCBieSBhIGNsaWVudCB0byBjb25uZWN0IHRvIHRoZSBWaXJ0dWFsIEh1Yi4gVGhpcyBBUEkgY2Fubm90IGJlIGludm9rZWQgb24gVlBOIEJyaWRnZS4gWW91IGNhbm5vdCBleGVjdXRlIHRoaXMgQVBJIGZvciBWaXJ0dWFsIEh1YnMgb2YgVlBOIFNlcnZlcnMgb3BlcmF0aW5nIGFzIGEgY2x1c3Rlci4gKi9cclxuICAgICAgICB0aGlzLkVudW1DcmwgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkVudW1DcmxcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIEFkZCBhIFJldm9rZWQgQ2VydGlmaWNhdGUuIFVzZSB0aGlzIHRvIGFkZCBhIG5ldyByZXZva2VkIGNlcnRpZmljYXRlIGRlZmluaXRpb24gaW4gdGhlIENlcnRpZmljYXRlIFJldm9jYXRpb24gTGlzdCB0aGF0IGlzIHNldCBvbiB0aGUgY3VycmVudGx5IG1hbmFnZWQgVmlydHVhbCBIdWIuIFNwZWNpZnkgdGhlIGNvbnRlbnRzIHRvIGJlIHJlZ2lzdGVyZWQgaW4gdGhlIENlcnRpZmljYXRlIFJldm9jYXRpb24gTGlzdCBieSB1c2luZyB0aGUgcGFyYW1ldGVycyBvZiB0aGlzIEFQSS4gV2hlbiBhIHVzZXIgY29ubmVjdHMgdG8gYSBWaXJ0dWFsIEh1YiBpbiBjZXJ0aWZpY2F0ZSBhdXRoZW50aWNhdGlvbiBtb2RlIGFuZCB0aGF0IGNlcnRpZmljYXRlIG1hdGNoZXMgMSBvciBtb3JlIG9mIHRoZSBjb250ZW50cyByZWdpc3RlcmVkIGluIHRoZSBjZXJ0aWZpY2F0ZXMgcmV2b2NhdGlvbiBsaXN0LCB0aGUgdXNlciBpcyBkZW5pZWQgY29ubmVjdGlvbi4gQSBjZXJ0aWZpY2F0ZSB0aGF0IG1hdGNoZXMgYWxsIHRoZSBjb25kaXRpb25zIHRoYXQgYXJlIGRlZmluZWQgYnkgdGhlIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGJ5IHRoaXMgQVBJIHdpbGwgYmUganVkZ2VkIGFzIGludmFsaWQuIFRoZSBpdGVtcyB0aGF0IGNhbiBiZSBzZXQgYXJlIGFzIGZvbGxvd3M6IE5hbWUgKENOKSwgT3JnYW5pemF0aW9uIChPKSwgT3JnYW5pemF0aW9uIFVuaXQgKE9VKSwgQ291bnRyeSAoQyksIFN0YXRlIChTVCksIExvY2FsZSAoTCksIFNlcmlhbCBOdW1iZXIgKGhleGFkZWNpbWFsKSwgTUQ1IERpZ2VzdCBWYWx1ZSAoaGV4YWRlY2ltYWwsIDEyOCBiaXQpLCBhbmQgU0hBLTEgRGlnZXN0IFZhbHVlIChoZXhhZGVjaW1hbCwgMTYwIGJpdCkuIEZvciB0aGUgc3BlY2lmaWNhdGlvbiBvZiBhIGRpZ2VzdCB2YWx1ZSAoaGFzaCB2YWx1ZSkgYSBjZXJ0aWZpY2F0ZSBpcyBvcHRpb25hbGx5IHNwZWNpZmllZCBkZXBlbmRpbmcgb24gdGhlIGNpcmN1bXN0YW5jZXMuIE5vcm1hbGx5IHdoZW4gYSBNRDUgb3IgU0hBLTEgZGlnZXN0IHZhbHVlIGlzIGlucHV0LCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGlucHV0IHRoZSBvdGhlciBpdGVtcy4gVGhpcyBBUEkgY2Fubm90IGJlIGludm9rZWQgb24gVlBOIEJyaWRnZS4gWW91IGNhbm5vdCBleGVjdXRlIHRoaXMgQVBJIGZvciBWaXJ0dWFsIEh1YnMgb2YgVlBOIFNlcnZlcnMgb3BlcmF0aW5nIGFzIGEgY2x1c3Rlci4gKi9cclxuICAgICAgICB0aGlzLkFkZENybCA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiQWRkQ3JsXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBEZWxldGUgYSBSZXZva2VkIENlcnRpZmljYXRlLiBVc2UgdGhpcyB0byBzcGVjaWZ5IGFuZCBkZWxldGUgYSByZXZva2VkIGNlcnRpZmljYXRlIGRlZmluaXRpb24gZnJvbSB0aGUgY2VydGlmaWNhdGUgcmV2b2NhdGlvbiBsaXN0IHRoYXQgaXMgc2V0IG9uIHRoZSBjdXJyZW50bHkgbWFuYWdlZCBWaXJ0dWFsIEh1Yi4gVG8gZ2V0IHRoZSBsaXN0IG9mIGN1cnJlbnRseSByZWdpc3RlcmVkIHJldm9rZWQgY2VydGlmaWNhdGUgZGVmaW5pdGlvbnMsIHVzZSB0aGUgRW51bUNybCBBUEkuIFRoaXMgQVBJIGNhbm5vdCBiZSBpbnZva2VkIG9uIFZQTiBCcmlkZ2UuIFlvdSBjYW5ub3QgZXhlY3V0ZSB0aGlzIEFQSSBmb3IgVmlydHVhbCBIdWJzIG9mIFZQTiBTZXJ2ZXJzIG9wZXJhdGluZyBhcyBhIGNsdXN0ZXIuICovXHJcbiAgICAgICAgdGhpcy5EZWxDcmwgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkRlbENybFwiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogR2V0IGEgUmV2b2tlZCBDZXJ0aWZpY2F0ZS4gVXNlIHRoaXMgdG8gc3BlY2lmeSBhbmQgZ2V0IHRoZSBjb250ZW50cyBvZiBhIHJldm9rZWQgY2VydGlmaWNhdGUgZGVmaW5pdGlvbiBmcm9tIHRoZSBDZXJ0aWZpY2F0ZXMgUmV2b2NhdGlvbiBMaXN0IHRoYXQgaXMgc2V0IG9uIHRoZSBjdXJyZW50bHkgbWFuYWdlZCBWaXJ0dWFsIEh1Yi4gVG8gZ2V0IHRoZSBsaXN0IG9mIGN1cnJlbnRseSByZWdpc3RlcmVkIHJldm9rZWQgY2VydGlmaWNhdGUgZGVmaW5pdGlvbnMsIHVzZSB0aGUgRW51bUNybCBBUEkuIFRoaXMgQVBJIGNhbm5vdCBiZSBpbnZva2VkIG9uIFZQTiBCcmlkZ2UuIFlvdSBjYW5ub3QgZXhlY3V0ZSB0aGlzIEFQSSBmb3IgVmlydHVhbCBIdWJzIG9mIFZQTiBTZXJ2ZXJzIG9wZXJhdGluZyBhcyBhIGNsdXN0ZXIuICovXHJcbiAgICAgICAgdGhpcy5HZXRDcmwgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkdldENybFwiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogQ2hhbmdlIEV4aXN0aW5nIENSTCAoQ2VydGlmaWNhdGUgUmV2b2NhdGlvbiBMaXN0KSBFbnRyeS4gVXNlIHRoaXMgdG8gYWx0ZXIgYW4gZXhpc3RpbmcgcmV2b2tlZCBjZXJ0aWZpY2F0ZSBkZWZpbml0aW9uIGluIHRoZSBDZXJ0aWZpY2F0ZSBSZXZvY2F0aW9uIExpc3QgdGhhdCBpcyBzZXQgb24gdGhlIGN1cnJlbnRseSBtYW5hZ2VkIFZpcnR1YWwgSHViLiBTcGVjaWZ5IHRoZSBjb250ZW50cyB0byBiZSByZWdpc3RlcmVkIGluIHRoZSBDZXJ0aWZpY2F0ZSBSZXZvY2F0aW9uIExpc3QgYnkgdXNpbmcgdGhlIHBhcmFtZXRlcnMgb2YgdGhpcyBBUEkuIFdoZW4gYSB1c2VyIGNvbm5lY3RzIHRvIGEgVmlydHVhbCBIdWIgaW4gY2VydGlmaWNhdGUgYXV0aGVudGljYXRpb24gbW9kZSBhbmQgdGhhdCBjZXJ0aWZpY2F0ZSBtYXRjaGVzIDEgb3IgbW9yZSBvZiB0aGUgY29udGVudHMgcmVnaXN0ZXJlZCBpbiB0aGUgY2VydGlmaWNhdGVzIHJldm9jYXRpb24gbGlzdCwgdGhlIHVzZXIgaXMgZGVuaWVkIGNvbm5lY3Rpb24uIEEgY2VydGlmaWNhdGUgdGhhdCBtYXRjaGVzIGFsbCB0aGUgY29uZGl0aW9ucyB0aGF0IGFyZSBkZWZpbmVkIGJ5IHRoZSBwYXJhbWV0ZXJzIHNwZWNpZmllZCBieSB0aGlzIEFQSSB3aWxsIGJlIGp1ZGdlZCBhcyBpbnZhbGlkLiBUaGUgaXRlbXMgdGhhdCBjYW4gYmUgc2V0IGFyZSBhcyBmb2xsb3dzOiBOYW1lIChDTiksIE9yZ2FuaXphdGlvbiAoTyksIE9yZ2FuaXphdGlvbiBVbml0IChPVSksIENvdW50cnkgKEMpLCBTdGF0ZSAoU1QpLCBMb2NhbGUgKEwpLCBTZXJpYWwgTnVtYmVyIChoZXhhZGVjaW1hbCksIE1ENSBEaWdlc3QgVmFsdWUgKGhleGFkZWNpbWFsLCAxMjggYml0KSwgYW5kIFNIQS0xIERpZ2VzdCBWYWx1ZSAoaGV4YWRlY2ltYWwsIDE2MCBiaXQpLiBGb3IgdGhlIHNwZWNpZmljYXRpb24gb2YgYSBkaWdlc3QgdmFsdWUgKGhhc2ggdmFsdWUpIGEgY2VydGlmaWNhdGUgaXMgb3B0aW9uYWxseSBzcGVjaWZpZWQgZGVwZW5kaW5nIG9uIHRoZSBjaXJjdW1zdGFuY2VzLiBOb3JtYWxseSB3aGVuIGEgTUQ1IG9yIFNIQS0xIGRpZ2VzdCB2YWx1ZSBpcyBpbnB1dCwgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBpbnB1dCB0aGUgb3RoZXIgaXRlbXMuIFRoaXMgQVBJIGNhbm5vdCBiZSBpbnZva2VkIG9uIFZQTiBCcmlkZ2UuIFlvdSBjYW5ub3QgZXhlY3V0ZSB0aGlzIEFQSSBmb3IgVmlydHVhbCBIdWJzIG9mIFZQTiBTZXJ2ZXJzIG9wZXJhdGluZyBhcyBhIGNsdXN0ZXIuICovXHJcbiAgICAgICAgdGhpcy5TZXRDcmwgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIlNldENybFwiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogQWRkIFJ1bGUgdG8gU291cmNlIElQIEFkZHJlc3MgTGltaXQgTGlzdC4gVXNlIHRoaXMgdG8gYWRkIGEgbmV3IHJ1bGUgdG8gdGhlIFNvdXJjZSBJUCBBZGRyZXNzIExpbWl0IExpc3QgdGhhdCBpcyBzZXQgb24gdGhlIGN1cnJlbnRseSBtYW5hZ2VkIFZpcnR1YWwgSHViLiBUaGUgaXRlbXMgc2V0IGhlcmUgd2lsbCBiZSB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGFsbG93IG9yIGRlbnkgY29ubmVjdGlvbiBmcm9tIGEgVlBOIENsaWVudCB3aGVuIHRoaXMgY2xpZW50IGF0dGVtcHRzIGNvbm5lY3Rpb24gdG8gdGhlIFZpcnR1YWwgSHViLiBZb3UgY2FuIHNwZWNpZnkgYSBjbGllbnQgSVAgYWRkcmVzcywgb3IgSVAgYWRkcmVzcyBvciBtYXNrIHRvIG1hdGNoIHRoZSBydWxlIGFzIHRoZSBjb250ZW50cyBvZiB0aGUgcnVsZSBpdGVtLiBCeSBzcGVjaWZ5aW5nIGFuIElQIGFkZHJlc3Mgb25seSwgdGhlcmUgd2lsbCBvbmx5IGJlIG9uZSBzcGVjaWZpZWQgY29tcHV0ZXIgdGhhdCB3aWxsIG1hdGNoIHRoZSBydWxlLCBidXQgYnkgc3BlY2lmeWluZyBhbiBJUCBuZXQgbWFzayBhZGRyZXNzIG9yIHN1Ym5ldCBtYXNrIGFkZHJlc3MsIGFsbCB0aGUgY29tcHV0ZXJzIGluIHRoZSByYW5nZSBvZiB0aGF0IHN1Ym5ldCB3aWxsIG1hdGNoIHRoZSBydWxlLiBZb3UgY2FuIHNwZWNpZnkgdGhlIHByaW9yaXR5IGZvciB0aGUgcnVsZS4gWW91IGNhbiBzcGVjaWZ5IGFuIGludGVnZXIgb2YgMSBvciBncmVhdGVyIGZvciB0aGUgcHJpb3JpdHkgYW5kIHRoZSBzbWFsbGVyIHRoZSBudW1iZXIsIHRoZSBoaWdoZXIgdGhlIHByaW9yaXR5LiBUbyBnZXQgYSBsaXN0IG9mIHRoZSBjdXJyZW50bHkgcmVnaXN0ZXJlZCBTb3VyY2UgSVAgQWRkcmVzcyBMaW1pdCBMaXN0LCB1c2UgdGhlIEdldEFjTGlzdCBBUEkuIFRoaXMgQVBJIGNhbm5vdCBiZSBpbnZva2VkIG9uIFZQTiBCcmlkZ2UuIFlvdSBjYW5ub3QgZXhlY3V0ZSB0aGlzIEFQSSBmb3IgVmlydHVhbCBIdWJzIG9mIFZQTiBTZXJ2ZXJzIG9wZXJhdGluZyBhcyBhIGNsdXN0ZXIuICovXHJcbiAgICAgICAgdGhpcy5TZXRBY0xpc3QgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIlNldEFjTGlzdFwiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogR2V0IExpc3Qgb2YgUnVsZSBJdGVtcyBvZiBTb3VyY2UgSVAgQWRkcmVzcyBMaW1pdCBMaXN0LiBVc2UgdGhpcyB0byBnZXQgYSBsaXN0IG9mIFNvdXJjZSBJUCBBZGRyZXNzIExpbWl0IExpc3QgcnVsZXMgdGhhdCBpcyBzZXQgb24gdGhlIGN1cnJlbnRseSBtYW5hZ2VkIFZpcnR1YWwgSHViLiBZb3UgY2FuIGFsbG93IG9yIGRlbnkgVlBOIGNvbm5lY3Rpb25zIHRvIHRoaXMgVmlydHVhbCBIdWIgYWNjb3JkaW5nIHRvIHRoZSBjbGllbnQgY29tcHV0ZXIncyBzb3VyY2UgSVAgYWRkcmVzcy4gWW91IGNhbiBkZWZpbmUgbXVsdGlwbGUgcnVsZXMgYW5kIHNldCBhIHByaW9yaXR5IGZvciBlYWNoIHJ1bGUuIFRoZSBzZWFyY2ggcHJvY2VlZHMgZnJvbSB0aGUgcnVsZSB3aXRoIHRoZSBoaWdoZXN0IG9yZGVyIG9yIHByaW9yaXR5IGFuZCBiYXNlZCBvbiB0aGUgYWN0aW9uIG9mIHRoZSBydWxlIHRoYXQgdGhlIElQIGFkZHJlc3MgZmlyc3QgbWF0Y2hlcywgdGhlIGNvbm5lY3Rpb24gZnJvbSB0aGUgY2xpZW50IGlzIGVpdGhlciBhbGxvd2VkIG9yIGRlbmllZC4gVGhpcyBBUEkgY2Fubm90IGJlIGludm9rZWQgb24gVlBOIEJyaWRnZS4gWW91IGNhbm5vdCBleGVjdXRlIHRoaXMgQVBJIGZvciBWaXJ0dWFsIEh1YnMgb2YgVlBOIFNlcnZlcnMgb3BlcmF0aW5nIGFzIGEgY2x1c3Rlci4gKi9cclxuICAgICAgICB0aGlzLkdldEFjTGlzdCA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiR2V0QWNMaXN0XCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBHZXQgTGlzdCBvZiBMb2cgRmlsZXMuIFVzZSB0aGlzIHRvIGRpc3BsYXkgYSBsaXN0IG9mIGxvZyBmaWxlcyBvdXRwdXR0ZWQgYnkgdGhlIFZQTiBTZXJ2ZXIgdGhhdCBoYXZlIGJlZW4gc2F2ZWQgb24gdGhlIFZQTiBTZXJ2ZXIgY29tcHV0ZXIuIEJ5IHNwZWNpZnlpbmcgYSBsb2cgZmlsZSBmaWxlIG5hbWUgZGlzcGxheWVkIGhlcmUgYW5kIGNhbGxpbmcgaXQgdXNpbmcgdGhlIFJlYWRMb2dGaWxlIEFQSSB5b3UgY2FuIGRvd25sb2FkIHRoZSBjb250ZW50cyBvZiB0aGUgbG9nIGZpbGUuIElmIHlvdSBhcmUgY29ubmVjdGVkIHRvIHRoZSBWUE4gU2VydmVyIGluIHNlcnZlciBhZG1pbiBtb2RlLCB5b3UgY2FuIGRpc3BsYXkgb3IgZG93bmxvYWQgdGhlIHBhY2tldCBsb2dzIGFuZCBzZWN1cml0eSBsb2dzIG9mIGFsbCBWaXJ0dWFsIEh1YnMgYW5kIHRoZSBzZXJ2ZXIgbG9nIG9mIHRoZSBWUE4gU2VydmVyLiBXaGVuIGNvbm5lY3RlZCBpbiBWaXJ0dWFsIEh1YiBBZG1pbiBNb2RlLCB5b3UgYXJlIGFibGUgdG8gdmlldyBvciBkb3dubG9hZCBvbmx5IHRoZSBwYWNrZXQgbG9nIGFuZCBzZWN1cml0eSBsb2cgb2YgdGhlIFZpcnR1YWwgSHViIHRoYXQgaXMgdGhlIHRhcmdldCBvZiBtYW5hZ2VtZW50LiAqL1xyXG4gICAgICAgIHRoaXMuRW51bUxvZ0ZpbGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJFbnVtTG9nRmlsZVwiLCBuZXcgVnBuUnBjRW51bUxvZ0ZpbGUoKSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogRG93bmxvYWQgYSBwYXJ0IG9mIExvZyBGaWxlLiBVc2UgdGhpcyB0byBkb3dubG9hZCB0aGUgbG9nIGZpbGUgdGhhdCBpcyBzYXZlZCBvbiB0aGUgVlBOIFNlcnZlciBjb21wdXRlci4gVG8gZG93bmxvYWQgdGhlIGxvZyBmaWxlIGZpcnN0IGdldCB0aGUgbGlzdCBvZiBsb2cgZmlsZXMgdXNpbmcgdGhlIEVudW1Mb2dGaWxlIEFQSSBhbmQgdGhlbiBkb3dubG9hZCB0aGUgbG9nIGZpbGUgdXNpbmcgdGhlIFJlYWRMb2dGaWxlIEFQSS4gSWYgeW91IGFyZSBjb25uZWN0ZWQgdG8gdGhlIFZQTiBTZXJ2ZXIgaW4gc2VydmVyIGFkbWluIG1vZGUsIHlvdSBjYW4gZGlzcGxheSBvciBkb3dubG9hZCB0aGUgcGFja2V0IGxvZ3MgYW5kIHNlY3VyaXR5IGxvZ3Mgb2YgYWxsIFZpcnR1YWwgSHVicyBhbmQgdGhlIHNlcnZlciBsb2cgb2YgdGhlIFZQTiBTZXJ2ZXIuIFdoZW4gY29ubmVjdGVkIGluIFZpcnR1YWwgSHViIEFkbWluIE1vZGUsIHlvdSBhcmUgYWJsZSB0byB2aWV3IG9yIGRvd25sb2FkIG9ubHkgdGhlIHBhY2tldCBsb2cgYW5kIHNlY3VyaXR5IGxvZyBvZiB0aGUgVmlydHVhbCBIdWIgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIG1hbmFnZW1lbnQuICovXHJcbiAgICAgICAgdGhpcy5SZWFkTG9nRmlsZSA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiUmVhZExvZ0ZpbGVcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIFNldCBzeXNsb2cgU2VuZCBGdW5jdGlvbi4gVXNlIHRoaXMgdG8gc2V0IHRoZSB1c2FnZSBvZiBzeXNsb2cgc2VuZCBmdW5jdGlvbiBhbmQgd2hpY2ggc3lzbG9nIHNlcnZlciB0byB1c2UuICovXHJcbiAgICAgICAgdGhpcy5TZXRTeXNMb2cgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIlNldFN5c0xvZ1wiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogR2V0IHN5c2xvZyBTZW5kIEZ1bmN0aW9uLiBUaGlzIGFsbG93cyB5b3UgdG8gZ2V0IHRoZSBjdXJyZW50IHNldHRpbmcgY29udGVudHMgb2YgdGhlIHN5c2xvZyBzZW5kIGZ1bmN0aW9uLiBZb3UgY2FuIGdldCB0aGUgdXNhZ2Ugc2V0dGluZyBvZiB0aGUgc3lzbG9nIGZ1bmN0aW9uIGFuZCB0aGUgaG9zdCBuYW1lIGFuZCBwb3J0IG51bWJlciBvZiB0aGUgc3lzbG9nIHNlcnZlciB0byB1c2UuICovXHJcbiAgICAgICAgdGhpcy5HZXRTeXNMb2cgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkdldFN5c0xvZ1wiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogU2V0IFRvZGF5J3MgTWVzc2FnZSBvZiBWaXJ0dWFsIEh1Yi4gVGhlIG1lc3NhZ2Ugd2lsbCBiZSBkaXNwbGF5ZWQgb24gVlBOIENsaWVudCBVSSB3aGVuIGEgdXNlciB3aWxsIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gdG8gdGhlIFZpcnR1YWwgSHViLiAqL1xyXG4gICAgICAgIHRoaXMuU2V0SHViTXNnID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJTZXRIdWJNc2dcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIEdldCBUb2RheSdzIE1lc3NhZ2Ugb2YgVmlydHVhbCBIdWIuIFRoZSBtZXNzYWdlIHdpbGwgYmUgZGlzcGxheWVkIG9uIFZQTiBDbGllbnQgVUkgd2hlbiBhIHVzZXIgd2lsbCBlc3RhYmxpc2ggYSBjb25uZWN0aW9uIHRvIHRoZSBWaXJ0dWFsIEh1Yi4gKi9cclxuICAgICAgICB0aGlzLkdldEh1Yk1zZyA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiR2V0SHViTXNnXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBSYWlzZSBhIHZpdGFsIGVycm9yIG9uIHRoZSBWUE4gU2VydmVyIC8gQnJpZGdlIHRvIHRlcm1pbmF0ZSB0aGUgcHJvY2VzcyBmb3JjZWZ1bGx5LiBUaGlzIEFQSSB3aWxsIHJhaXNlIGEgZmF0YWwgZXJyb3IgKG1lbW9yeSBhY2Nlc3MgdmlvbGF0aW9uKSBvbiB0aGUgVlBOIFNlcnZlciAvIEJyaWRnZSBydW5uaW5nIHByb2Nlc3MgaW4gb3JkZXIgdG8gY3Jhc2ggdGhlIHByb2Nlc3MuIEFzIHRoZSByZXN1bHQsIFZQTiBTZXJ2ZXIgLyBCcmlkZ2Ugd2lsbCBiZSB0ZXJtaW5hdGVkIGFuZCByZXN0YXJ0ZWQgaWYgaXQgaXMgcnVubmluZyBhcyBhIHNlcnZpY2UgbW9kZS4gSWYgdGhlIFZQTiBTZXJ2ZXIgaXMgcnVubmluZyBhcyBhIHVzZXIgbW9kZSwgdGhlIHByb2Nlc3Mgd2lsbCBub3QgYXV0b21hdGljYWxseSByZXN0YXJ0ZWQuIFRoaXMgQVBJIGlzIGZvciBhIHNpdHVhdGlvbiB3aGVuIHRoZSBWUE4gU2VydmVyIC8gQnJpZGdlIGlzIHVuZGVyIGEgbm9uLXJlY292ZXJhYmxlIGVycm9yIG9yIHRoZSBwcm9jZXNzIGlzIGluIGFuIGluZmluaXRlIGxvb3AuIFRoaXMgQVBJIHdpbGwgZGlzY29ubmVjdCBhbGwgVlBOIFNlc3Npb25zIG9uIHRoZSBWUE4gU2VydmVyIC8gQnJpZGdlLiBBbGwgdW5zYXZlZCBzZXR0aW5ncyBpbiB0aGUgbWVtb3J5IG9mIFZQTiBTZXJ2ZXIgLyBCcmlkZ2Ugd2lsbCBiZSBsb3N0LiBCZWZvcmUgcnVuIHRoaXMgQVBJLCBjYWxsIHRoZSBGbHVzaCBBUEkgdG8gdHJ5IHRvIHNhdmUgdm9sYXRpbGUgZGF0YSB0byB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiBUbyBleGVjdXRlIHRoaXMgQVBJLCB5b3UgbXVzdCBoYXZlIFZQTiBTZXJ2ZXIgLyBWUE4gQnJpZGdlIGFkbWluaXN0cmF0b3IgcHJpdmlsZWdlcy4gKi9cclxuICAgICAgICB0aGlzLkNyYXNoID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJDcmFzaFwiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogR2V0IHRoZSBtZXNzYWdlIGZvciBhZG1pbmlzdHJhdG9ycy4gKi9cclxuICAgICAgICB0aGlzLkdldEFkbWluTXNnID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiR2V0QWRtaW5Nc2dcIiwgbmV3IFZwblJwY01zZygpKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBTYXZlIEFsbCBWb2xhdGlsZSBEYXRhIG9mIFZQTiBTZXJ2ZXIgLyBCcmlkZ2UgdG8gdGhlIENvbmZpZ3VyYXRpb24gRmlsZS4gVGhlIG51bWJlciBvZiBjb25maWd1cmF0aW9uIGZpbGUgYnl0ZXMgd2lsbCBiZSByZXR1cm5lZCBhcyB0aGUgXCJJbnRWYWx1ZVwiIHBhcmFtZXRlci4gTm9ybWFsbHksIHRoZSBWUE4gU2VydmVyIC8gVlBOIEJyaWRnZSByZXRhaW5zIHRoZSB2b2xhdGlsZSBjb25maWd1cmF0aW9uIGRhdGEgaW4gbWVtb3J5LiBJdCBpcyBmbHVzaGVkIHRvIHRoZSBkaXNrIGFzIHZwbl9zZXJ2ZXIuY29uZmlnIG9yIHZwbl9icmlkZ2UuY29uZmlnIHBlcmlvZGljYWxseS4gVGhlIHBlcmlvZCBpcyAzMDAgc2Vjb25kcyAoNSBtaW51dGVzKSBieSBkZWZhdWx0LiAoVGhlIHBlcmlvZCBjYW4gYmUgYWx0ZXJlZCBieSBtb2RpZnlpbmcgdGhlIEF1dG9TYXZlQ29uZmlnU3BhbiBpdGVtIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuKSBUaGUgZGF0YSB3aWxsIGJlIHNhdmVkIG9uIHRoZSB0aW1pbmcgb2Ygc2h1dHRpbmcgZG93biBub3JtYWxseSBvZiB0aGUgVlBOIFNlcnZlciAvIEJyaWRnZS4gRXhlY3V0ZSB0aGUgRmx1c2ggQVBJIHRvIG1ha2UgdGhlIFZQTiBTZXJ2ZXIgLyBCcmlkZ2Ugc2F2ZSB0aGUgc2V0dGluZ3MgdG8gdGhlIGZpbGUgaW1tZWRpYXRlbHkuIFRoZSBzZXR0aW5nIGRhdGEgd2lsbCBiZSBzdG9yZWQgb24gdGhlIGRpc2sgZHJpdmUgb2YgdGhlIHNlcnZlciBjb21wdXRlci4gVXNlIHRoZSBGbHVzaCBBUEkgaW4gYSBzaXR1YXRpb24gdGhhdCB5b3UgZG8gbm90IGhhdmUgYW4gZW5vdWdoIHRpbWUgdG8gc2h1dCBkb3duIHRoZSBzZXJ2ZXIgcHJvY2VzcyBub3JtYWxseS4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG11c3QgaGF2ZSBWUE4gU2VydmVyIGFkbWluaXN0cmF0b3IgcHJpdmlsZWdlcy4gVG8gZXhlY3V0ZSB0aGlzIEFQSSwgeW91IG11c3QgaGF2ZSBWUE4gU2VydmVyIC8gVlBOIEJyaWRnZSBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMuICovXHJcbiAgICAgICAgdGhpcy5GbHVzaCA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiRmx1c2hcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIEVuYWJsZSBvciBEaXNhYmxlIElQc2VjIFZQTiBTZXJ2ZXIgRnVuY3Rpb24uIEVuYWJsZSBvciBEaXNhYmxlIElQc2VjIFZQTiBTZXJ2ZXIgRnVuY3Rpb24gb24gdGhlIFZQTiBTZXJ2ZXIuIElmIHlvdSBlbmFibGUgdGhpcyBmdW5jdGlvbiwgVmlydHVhbCBIdWJzIG9uIHRoZSBWUE4gU2VydmVyIHdpbGwgYmUgYWJsZSB0byBhY2NlcHQgUmVtb3RlLUFjY2VzcyBWUE4gY29ubmVjdGlvbnMgZnJvbSBMMlRQLWNvbXBhdGlibGUgUENzLCBNYWMgT1MgWCBhbmQgU21hcnRwaG9uZXMsIGFuZCBhbHNvIGNhbiBhY2NlcHQgRXRoZXJJUCBTaXRlLXRvLVNpdGUgVlBOIENvbm5lY3Rpb24uIFZQTiBDb25uZWN0aW9ucyBmcm9tIFNtYXJ0cGhvbmVzIHN1Y2hsaWtlIGlQaG9uZSwgaVBhZCBhbmQgQW5kcm9pZCwgYW5kIGFsc28gZnJvbSBuYXRpdmUgVlBOIENsaWVudHMgb24gTWFjIE9TIFggYW5kIFdpbmRvd3MgY2FuIGJlIGFjY2VwdGVkLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbXVzdCBoYXZlIFZQTiBTZXJ2ZXIgYWRtaW5pc3RyYXRvciBwcml2aWxlZ2VzLiBUaGlzIEFQSSBjYW5ub3QgYmUgaW52b2tlZCBvbiBWUE4gQnJpZGdlLiBZb3UgY2Fubm90IGV4ZWN1dGUgdGhpcyBBUEkgZm9yIFZpcnR1YWwgSHVicyBvZiBWUE4gU2VydmVycyBvcGVyYXRpbmcgYXMgYSBjbHVzdGVyLiAqL1xyXG4gICAgICAgIHRoaXMuU2V0SVBzZWNTZXJ2aWNlcyA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiU2V0SVBzZWNTZXJ2aWNlc1wiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogR2V0IHRoZSBDdXJyZW50IElQc2VjIFZQTiBTZXJ2ZXIgU2V0dGluZ3MuIEdldCBhbmQgdmlldyB0aGUgY3VycmVudCBJUHNlYyBWUE4gU2VydmVyIHNldHRpbmdzIG9uIHRoZSBWUE4gU2VydmVyLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbXVzdCBoYXZlIFZQTiBTZXJ2ZXIgYWRtaW5pc3RyYXRvciBwcml2aWxlZ2VzLiBUaGlzIEFQSSBjYW5ub3QgYmUgaW52b2tlZCBvbiBWUE4gQnJpZGdlLiBZb3UgY2Fubm90IGV4ZWN1dGUgdGhpcyBBUEkgZm9yIFZpcnR1YWwgSHVicyBvZiBWUE4gU2VydmVycyBvcGVyYXRpbmcgYXMgYSBjbHVzdGVyLiAqL1xyXG4gICAgICAgIHRoaXMuR2V0SVBzZWNTZXJ2aWNlcyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkdldElQc2VjU2VydmljZXNcIiwgbmV3IFZwbklQc2VjU2VydmljZXMoKSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogQWRkIE5ldyBFdGhlcklQIC8gTDJUUHYzIG92ZXIgSVBzZWMgQ2xpZW50IFNldHRpbmcgdG8gQWNjZXB0IEV0aHJlSVAgLyBMMlRQdjMgQ2xpZW50IERldmljZXMuIEFkZCBhIG5ldyBzZXR0aW5nIGVudHJ5IHRvIGVuYWJsZSB0aGUgRXRoZXJJUCAvIEwyVFB2MyBvdmVyIElQc2VjIFNlcnZlciBGdW5jdGlvbiB0byBhY2NlcHQgY2xpZW50IGRldmljZXMuIEluIG9yZGVyIHRvIGFjY2VwdCBjb25uZWN0aW9ucyBmcm9tIHJvdXRlcnMgYnkgdGhlIEV0aGVySVAgLyBMMlRQdjMgb3ZlciBJUHNlYyBTZXJ2ZXIgRnVuY3Rpb24sIHlvdSBoYXZlIHRvIGRlZmluZSB0aGUgcmVsYXRpb24gdGFibGUgYmV0d2VlbiBhbiBJUHNlYyBQaGFzZSAxIHN0cmluZyB3aGljaCBpcyBwcmVzZW50ZWQgYnkgY2xpZW50IGRldmljZXMgb2YgRXRoZXJJUCAvIEwyVFB2MyBvdmVyIElQc2VjIGNvbXBhdGlibGUgcm91dGVyLCBhbmQgdGhlIGRlc2lnbmF0aW9uIG9mIHRoZSBkZXN0aW5hdGlvbiBWaXJ0dWFsIEh1Yi4gQWZ0ZXIgeW91IGFkZCBhIGRlZmluaXRpb24gZW50cnkgYnkgQWRkRXRoZXJJcElkIEFQSSwgdGhlIGRlZmluZWQgY29ubmVjdGlvbiBzZXR0aW5nIHRvIHRoZSBWaXJ0dWFsIEh1YiB3aWxsIGJlIGFwcGxpZWQgb24gdGhlIGxvZ2luLWF0dGVwdGluZyBzZXNzaW9uIGZyb20gYW4gRXRoZXJJUCAvIEwyVFB2MyBvdmVyIElQc2VjIGNsaWVudCBkZXZpY2UuIFRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgaW4gYW4gZW50cnkgbXVzdCBiZSByZWdpc3RlcmVkIG9uIHRoZSBWaXJ0dWFsIEh1Yi4gQW4gRXRoZXJJUCAvIEwyVFB2MyBjbGllbnQgd2lsbCBiZSByZWdhcmRlZCBhcyBpdCBjb25uZWN0ZWQgdGhlIFZpcnR1YWwgSFVCIHdpdGggdGhlIGlkZW50aWZpY2F0aW9uIG9mIHRoZSBhYm92ZSB1c2VyIGluZm9ybWF0aW9uLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbXVzdCBoYXZlIFZQTiBTZXJ2ZXIgYWRtaW5pc3RyYXRvciBwcml2aWxlZ2VzLiBUaGlzIEFQSSBjYW5ub3QgYmUgaW52b2tlZCBvbiBWUE4gQnJpZGdlLiBZb3UgY2Fubm90IGV4ZWN1dGUgdGhpcyBBUEkgZm9yIFZpcnR1YWwgSHVicyBvZiBWUE4gU2VydmVycyBvcGVyYXRpbmcgYXMgYSBjbHVzdGVyLiAqL1xyXG4gICAgICAgIHRoaXMuQWRkRXRoZXJJcElkID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJBZGRFdGhlcklwSWRcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIEdldCB0aGUgQ3VycmVudCBMaXN0IG9mIEV0aGVySVAgLyBMMlRQdjMgQ2xpZW50IERldmljZSBFbnRyeSBEZWZpbml0aW9ucy4gVGhpcyBBUEkgZ2V0cyBhbmQgc2hvd3MgdGhlIGxpc3Qgb2YgZW50cmllcyB0byBhY2NlcHQgVlBOIGNsaWVudHMgYnkgRXRoZXJJUCAvIEwyVFB2MyBvdmVyIElQc2VjIEZ1bmN0aW9uLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbXVzdCBoYXZlIFZQTiBTZXJ2ZXIgYWRtaW5pc3RyYXRvciBwcml2aWxlZ2VzLiBUaGlzIEFQSSBjYW5ub3QgYmUgaW52b2tlZCBvbiBWUE4gQnJpZGdlLiBZb3UgY2Fubm90IGV4ZWN1dGUgdGhpcyBBUEkgZm9yIFZpcnR1YWwgSHVicyBvZiBWUE4gU2VydmVycyBvcGVyYXRpbmcgYXMgYSBjbHVzdGVyLiAqL1xyXG4gICAgICAgIHRoaXMuR2V0RXRoZXJJcElkID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJHZXRFdGhlcklwSWRcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIERlbGV0ZSBhbiBFdGhlcklQIC8gTDJUUHYzIG92ZXIgSVBzZWMgQ2xpZW50IFNldHRpbmcuIFRoaXMgQVBJIGRlbGV0ZXMgYW4gZW50cnkgdG8gYWNjZXB0IFZQTiBjbGllbnRzIGJ5IEV0aGVySVAgLyBMMlRQdjMgb3ZlciBJUHNlYyBGdW5jdGlvbi4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG11c3QgaGF2ZSBWUE4gU2VydmVyIGFkbWluaXN0cmF0b3IgcHJpdmlsZWdlcy4gVGhpcyBBUEkgY2Fubm90IGJlIGludm9rZWQgb24gVlBOIEJyaWRnZS4gWW91IGNhbm5vdCBleGVjdXRlIHRoaXMgQVBJIGZvciBWaXJ0dWFsIEh1YnMgb2YgVlBOIFNlcnZlcnMgb3BlcmF0aW5nIGFzIGEgY2x1c3Rlci4gKi9cclxuICAgICAgICB0aGlzLkRlbGV0ZUV0aGVySXBJZCA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiRGVsZXRlRXRoZXJJcElkXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBHZXQgdGhlIEN1cnJlbnQgTGlzdCBvZiBFdGhlcklQIC8gTDJUUHYzIENsaWVudCBEZXZpY2UgRW50cnkgRGVmaW5pdGlvbnMuIFRoaXMgQVBJIGdldHMgYW5kIHNob3dzIHRoZSBsaXN0IG9mIGVudHJpZXMgdG8gYWNjZXB0IFZQTiBjbGllbnRzIGJ5IEV0aGVySVAgLyBMMlRQdjMgb3ZlciBJUHNlYyBGdW5jdGlvbi4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG11c3QgaGF2ZSBWUE4gU2VydmVyIGFkbWluaXN0cmF0b3IgcHJpdmlsZWdlcy4gVGhpcyBBUEkgY2Fubm90IGJlIGludm9rZWQgb24gVlBOIEJyaWRnZS4gWW91IGNhbm5vdCBleGVjdXRlIHRoaXMgQVBJIGZvciBWaXJ0dWFsIEh1YnMgb2YgVlBOIFNlcnZlcnMgb3BlcmF0aW5nIGFzIGEgY2x1c3Rlci4gKi9cclxuICAgICAgICB0aGlzLkVudW1FdGhlcklwSWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJFbnVtRXRoZXJJcElkXCIsIG5ldyBWcG5ScGNFbnVtRXRoZXJJcElkKCkpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIFNldCBTZXR0aW5ncyBmb3IgT3BlblZQTiBDbG9uZSBTZXJ2ZXIgRnVuY3Rpb24uIFRoZSBWUE4gU2VydmVyIGhhcyB0aGUgY2xvbmUgZnVuY3Rpb25zIG9mIE9wZW5WUE4gc29mdHdhcmUgcHJvZHVjdHMgYnkgT3BlblZQTiBUZWNobm9sb2dpZXMsIEluYy4gQW55IE9wZW5WUE4gQ2xpZW50cyBjYW4gY29ubmVjdCB0byB0aGlzIFZQTiBTZXJ2ZXIuIFRoZSBtYW5uZXIgdG8gc3BlY2lmeSBhIHVzZXJuYW1lIHRvIGNvbm5lY3QgdG8gdGhlIFZpcnR1YWwgSHViLCBhbmQgdGhlIHNlbGVjdGlvbiBydWxlIG9mIGRlZmF1bHQgSHViIGJ5IHVzaW5nIHRoaXMgY2xvbmUgc2VydmVyIGZ1bmN0aW9ucyBhcmUgc2FtZSB0byB0aGUgSVBzZWMgU2VydmVyIGZ1bmN0aW9ucy4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG11c3QgaGF2ZSBWUE4gU2VydmVyIGFkbWluaXN0cmF0b3IgcHJpdmlsZWdlcy4gVGhpcyBBUEkgY2Fubm90IGJlIGludm9rZWQgb24gVlBOIEJyaWRnZS4gWW91IGNhbm5vdCBleGVjdXRlIHRoaXMgQVBJIGZvciBWaXJ0dWFsIEh1YnMgb2YgVlBOIFNlcnZlcnMgb3BlcmF0aW5nIGFzIGEgY2x1c3Rlci4gKi9cclxuICAgICAgICB0aGlzLlNldE9wZW5WcG5Tc3RwQ29uZmlnID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJTZXRPcGVuVnBuU3N0cENvbmZpZ1wiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogR2V0IHRoZSBDdXJyZW50IFNldHRpbmdzIG9mIE9wZW5WUE4gQ2xvbmUgU2VydmVyIEZ1bmN0aW9uLiBHZXQgYW5kIHNob3cgdGhlIGN1cnJlbnQgc2V0dGluZ3Mgb2YgT3BlblZQTiBDbG9uZSBTZXJ2ZXIgRnVuY3Rpb24uIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBtdXN0IGhhdmUgVlBOIFNlcnZlciBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMuIFRoaXMgQVBJIGNhbm5vdCBiZSBpbnZva2VkIG9uIFZQTiBCcmlkZ2UuIFlvdSBjYW5ub3QgZXhlY3V0ZSB0aGlzIEFQSSBmb3IgVmlydHVhbCBIdWJzIG9mIFZQTiBTZXJ2ZXJzIG9wZXJhdGluZyBhcyBhIGNsdXN0ZXIuICovXHJcbiAgICAgICAgdGhpcy5HZXRPcGVuVnBuU3N0cENvbmZpZyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkdldE9wZW5WcG5Tc3RwQ29uZmlnXCIsIG5ldyBWcG5PcGVuVnBuU3N0cENvbmZpZygpKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBTaG93IHRoZSBDdXJyZW50IFN0YXR1cyBvZiBEeW5hbWljIEROUyBGdW5jdGlvbi4gR2V0IGFuZCBzaG93IHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgRHluYW1pYyBETlMgZnVuY3Rpb24uIFRoZSBEeW5hbWljIEROUyBhc3NpZ25zIGEgdW5pcXVlIGFuZCBwZXJtYW5lbnQgRE5TIGhvc3RuYW1lIGZvciB0aGlzIFZQTiBTZXJ2ZXIuIFlvdSBjYW4gdXNlIHRoYXQgaG9zdG5hbWUgdG8gc3BlY2lmeSB0aGlzIFZQTiBTZXJ2ZXIgb24gdGhlIHNldHRpbmdzIGZvciBWUE4gQ2xpZW50IGFuZCBWUE4gQnJpZGdlLiBZb3UgbmVlZCBub3QgdG8gcmVnaXN0ZXIgYW5kIGtlZXAgYSBkb21haW4gbmFtZS4gQWxzbywgaWYgeW91ciBJU1AgYXNzaWduZXMgeW91IGEgZHluYW1pYyAobm90LWZpeGVkKSBJUCBhZGRyZXNzLCB0aGUgY29ycmVzcG9uZGluZyBJUCBhZGRyZXNzIG9mIHlvdXIgRHluYW1pYyBETlMgaG9zdG5hbWUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNoYW5nZWQuIEl0IGVuYWJsZXMgeW91IHRvIGtlZXAgcnVubmluZyB0aGUgVlBOIFNlcnZlciBieSB1c2luZyBvbmx5IGEgZHluYW1pYyBJUCBhZGRyZXNzLiBUaGVyZWZvcmUsIHlvdSBuZWVkIG5vdCBhbnkgbG9uZ2VyIHRvIGtlZXAgc3RhdGljIGdsb2JhbCBJUCBhZGRyZXNzZXMgd2l0aCBleHBlbnNlcyBtb250aGx5IGNvc3RzLiBbQ2F1dGlvbl0gVG8gZGlzYWJsZSB0aGUgRHluYW1pYyBETlMgRnVuY3Rpb24sIG1vZGlmeSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIG9mIFZQTiBTZXJ2ZXIuIFRoZSBcImRlY2xhcmUgcm9vdFwiIGRpcmVjdGl2ZSBoYXMgdGhlIFwiZGVjbGFyZSBERG5zQ2xpZW50XCIgZGlyZWN0aXZlLiBJbiB0aGlzIGRpcmVjdGl2ZSwgeW91IGNhbiBzd2l0Y2ggXCJib29sIERpc2FibGVcIiBmcm9tIGZhbHNlIHRvIHRydWUsIGFuZCByZWJvb3QgdGhlIFZQTiBTZXJ2ZXIsIHRoZW4gdGhlIER5bmFtaWMgRE5TIEZ1bmN0aW9uIHdpbGwgYmUgZGlzYWJsZWQuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBtdXN0IGhhdmUgVlBOIFNlcnZlciBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMuIFRoaXMgQVBJIGNhbm5vdCBiZSBpbnZva2VkIG9uIFZQTiBCcmlkZ2UuICovXHJcbiAgICAgICAgdGhpcy5HZXRERG5zQ2xpZW50U3RhdHVzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiR2V0RERuc0NsaWVudFN0YXR1c1wiLCBuZXcgVnBuRERuc0NsaWVudFN0YXR1cygpKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBTZXQgdGhlIER5bmFtaWMgRE5TIEhvc3RuYW1lLiBZb3UgbXVzdCBzcGVjaWZ5IHRoZSBuZXcgaG9zdG5hbWUgb24gdGhlIFN0clZhbHVlX3N0ciBmaWVsZC4gWW91IGNhbiB1c2UgdGhpcyBBUEkgdG8gY2hhbmdlIHRoZSBob3N0bmFtZSBhc3NpZ25lZCBieSB0aGUgRHluYW1pYyBETlMgZnVuY3Rpb24uIFRoZSBjdXJyZW50bHkgYXNzaWduZWQgaG9zdG5hbWUgY2FuIGJlIHNob3dlbiBieSB0aGUgR2V0RERuc0NsaWVudFN0YXR1cyBBUEkuIFRoZSBEeW5hbWljIEROUyBhc3NpZ25zIGEgdW5pcXVlIGFuZCBwZXJtYW5lbnQgRE5TIGhvc3RuYW1lIGZvciB0aGlzIFZQTiBTZXJ2ZXIuIFlvdSBjYW4gdXNlIHRoYXQgaG9zdG5hbWUgdG8gc3BlY2lmeSB0aGlzIFZQTiBTZXJ2ZXIgb24gdGhlIHNldHRpbmdzIGZvciBWUE4gQ2xpZW50IGFuZCBWUE4gQnJpZGdlLiBZb3UgbmVlZCBub3QgdG8gcmVnaXN0ZXIgYW5kIGtlZXAgYSBkb21haW4gbmFtZS4gQWxzbywgaWYgeW91ciBJU1AgYXNzaWduZXMgeW91IGEgZHluYW1pYyAobm90LWZpeGVkKSBJUCBhZGRyZXNzLCB0aGUgY29ycmVzcG9uZGluZyBJUCBhZGRyZXNzIG9mIHlvdXIgRHluYW1pYyBETlMgaG9zdG5hbWUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNoYW5nZWQuIEl0IGVuYWJsZXMgeW91IHRvIGtlZXAgcnVubmluZyB0aGUgVlBOIFNlcnZlciBieSB1c2luZyBvbmx5IGEgZHluYW1pYyBJUCBhZGRyZXNzLiBUaGVyZWZvcmUsIHlvdSBuZWVkIG5vdCBhbnkgbG9uZ2VyIHRvIGtlZXAgc3RhdGljIGdsb2JhbCBJUCBhZGRyZXNzZXMgd2l0aCBleHBlbnNlcyBtb250aGx5IGNvc3RzLiBbQ2F1dGlvbl0gVG8gZGlzYWJsZSB0aGUgRHluYW1pYyBETlMgRnVuY3Rpb24sIG1vZGlmeSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIG9mIFZQTiBTZXJ2ZXIuIFRoZSBcImRlY2xhcmUgcm9vdFwiIGRpcmVjdGl2ZSBoYXMgdGhlIFwiZGVjbGFyZSBERG5zQ2xpZW50XCIgZGlyZWN0aXZlLiBJbiB0aGlzIGRpcmVjdGl2ZSwgeW91IGNhbiBzd2l0Y2ggXCJib29sIERpc2FibGVcIiBmcm9tIGZhbHNlIHRvIHRydWUsIGFuZCByZWJvb3QgdGhlIFZQTiBTZXJ2ZXIsIHRoZW4gdGhlIER5bmFtaWMgRE5TIEZ1bmN0aW9uIHdpbGwgYmUgZGlzYWJsZWQuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBtdXN0IGhhdmUgVlBOIFNlcnZlciBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMuIFRoaXMgQVBJIGNhbm5vdCBiZSBpbnZva2VkIG9uIFZQTiBCcmlkZ2UuICovXHJcbiAgICAgICAgdGhpcy5DaGFuZ2VERG5zQ2xpZW50SG9zdG5hbWUgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkNoYW5nZUREbnNDbGllbnRIb3N0bmFtZVwiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogR2VuZXJhdGUgTmV3IFNlbGYtU2lnbmVkIENlcnRpZmljYXRlIHdpdGggU3BlY2lmaWVkIENOIChDb21tb24gTmFtZSkgYW5kIFJlZ2lzdGVyIG9uIFZQTiBTZXJ2ZXIuIFlvdSBjYW4gc3BlY2lmeSB0aGUgbmV3IENOIChjb21tb24gbmFtZSkgdmFsdWUgb24gdGhlIFN0clZhbHVlX3N0ciBmaWVsZC4gWW91IGNhbiB1c2UgdGhpcyBBUEkgdG8gcmVwbGFjZSB0aGUgY3VycmVudCBjZXJ0aWZpY2F0ZSBvbiB0aGUgVlBOIFNlcnZlciB0byBhIG5ldyBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSB3aGljaCBoYXMgdGhlIENOIChDb21tb24gTmFtZSkgdmFsdWUgaW4gdGhlIGZpZWxkcy4gVGhpcyBBUEkgaXMgY29udmVuaWVudCBpZiB5b3UgYXJlIHBsYW5uaW5nIHRvIHVzZSBNaWNyb3NvZnQgU1NUUCBWUE4gQ2xvbmUgU2VydmVyIEZ1bmN0aW9uLiBCZWNhdXNlIG9mIHRoZSB2YWx1ZSBvZiBDTiAoQ29tbW9uIE5hbWUpIG9uIHRoZSBTU0wgY2VydGlmaWNhdGUgb2YgVlBOIFNlcnZlciBtdXN0IG1hdGNoIHRvIHRoZSBob3N0bmFtZSBzcGVjaWZpZWQgb24gdGhlIFNTVFAgVlBOIGNsaWVudC4gVGhpcyBBUEkgd2lsbCBkZWxldGUgdGhlIGV4aXN0aW5nIFNTTCBjZXJ0aWZpY2F0ZSBvZiB0aGUgVlBOIFNlcnZlci4gSXQgaXMgcmVjb21tZW5kZWQgdG8gYmFja3VwIHRoZSBjdXJyZW50IFNTTCBjZXJ0aWZpY2F0ZSBhbmQgcHJpdmF0ZSBrZXkgYnkgdXNpbmcgdGhlIEdldFNlcnZlckNlcnQgQVBJIGJlZm9yZWhhbmQuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBtdXN0IGhhdmUgVlBOIFNlcnZlciBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMuIFRoaXMgQVBJIGNhbm5vdCBiZSBpbnZva2VkIG9uIFZQTiBCcmlkZ2UuIFlvdSBjYW5ub3QgZXhlY3V0ZSB0aGlzIEFQSSBmb3IgVmlydHVhbCBIdWJzIG9mIFZQTiBTZXJ2ZXJzIG9wZXJhdGluZyBhcyBhIGNsdXN0ZXIuICovXHJcbiAgICAgICAgdGhpcy5SZWdlbmVyYXRlU2VydmVyQ2VydCA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiUmVnZW5lcmF0ZVNlcnZlckNlcnRcIiwgaW5fcGFyYW0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIEdlbmVyYXRlIGEgU2FtcGxlIFNldHRpbmcgRmlsZSBmb3IgT3BlblZQTiBDbGllbnQuIE9yaWdpbmFsbHksIHRoZSBPcGVuVlBOIENsaWVudCByZXF1aXJlcyBhIHVzZXIgdG8gd3JpdGUgYSB2ZXJ5IGRpZmZpY3VsdCBjb25maWd1cmF0aW9uIGZpbGUgbWFudWFsbHkuIFRoaXMgQVBJIGhlbHBzIHlvdSB0byBtYWtlIGEgdXNlZnVsIGNvbmZpZ3VyYXRpb24gc2FtcGxlLiBXaGF0IHlvdSBuZWVkIHRvIGdlbmVyYXRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSBPcGVuVlBOIENsaWVudCBpcyB0byBydW4gdGhpcyBBUEkuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBtdXN0IGhhdmUgVlBOIFNlcnZlciBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMuIFRoaXMgQVBJIGNhbm5vdCBiZSBpbnZva2VkIG9uIFZQTiBCcmlkZ2UuIFlvdSBjYW5ub3QgZXhlY3V0ZSB0aGlzIEFQSSBmb3IgVmlydHVhbCBIdWJzIG9mIFZQTiBTZXJ2ZXJzIG9wZXJhdGluZyBhcyBhIGNsdXN0ZXIuICovXHJcbiAgICAgICAgdGhpcy5NYWtlT3BlblZwbkNvbmZpZ0ZpbGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJNYWtlT3BlblZwbkNvbmZpZ0ZpbGVcIiwgbmV3IFZwblJwY1JlYWRMb2dGaWxlKCkpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqIEVuYWJsZSAvIERpc2FibGUgdGhlIFZQTiBvdmVyIElDTVAgLyBWUE4gb3ZlciBETlMgU2VydmVyIEZ1bmN0aW9uLiBZb3UgY2FuIGVzdGFibGlzaCBhIFZQTiBvbmx5IHdpdGggSUNNUCBvciBETlMgcGFja2V0cyBldmVuIGlmIHRoZXJlIGlzIGEgZmlyZXdhbGwgb3Igcm91dGVycyB3aGljaCBibG9ja3MgVENQL0lQIGNvbW11bmljYXRpb25zLiBZb3UgaGF2ZSB0byBlbmFibGUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYmVmb3JlaGFuZC4gV2FybmluZzogVXNlIHRoaXMgZnVuY3Rpb24gZm9yIGVtZXJnZW5jeSBvbmx5LiBJdCBpcyBoZWxwZnVsIHdoZW4gYSBmaXJld2FsbCBvciByb3V0ZXIgaXMgbWlzY29uZmlndXJlZCB0byBibG9ja3MgVENQL0lQLCBidXQgZWl0aGVyIElDTVAgb3IgRE5TIGlzIG5vdCBibG9ja2VkLiBJdCBpcyBub3QgZm9yIGxvbmctdGVybSBzdGFibGUgdXNpbmcuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBtdXN0IGhhdmUgVlBOIFNlcnZlciBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMuIFRoaXMgQVBJIGNhbm5vdCBiZSBpbnZva2VkIG9uIFZQTiBCcmlkZ2UuICovXHJcbiAgICAgICAgdGhpcy5TZXRTcGVjaWFsTGlzdGVuZXIgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIlNldFNwZWNpYWxMaXN0ZW5lclwiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogR2V0IEN1cnJlbnQgU2V0dGluZyBvZiB0aGUgVlBOIG92ZXIgSUNNUCAvIFZQTiBvdmVyIEROUyBGdW5jdGlvbi4gR2V0IGFuZCBzaG93IHRoZSBjdXJyZW50IFZQTiBvdmVyIElDTVAgLyBWUE4gb3ZlciBETlMgRnVuY3Rpb24gc3RhdHVzLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbXVzdCBoYXZlIFZQTiBTZXJ2ZXIgYWRtaW5pc3RyYXRvciBwcml2aWxlZ2VzLiBUaGlzIEFQSSBjYW5ub3QgYmUgaW52b2tlZCBvbiBWUE4gQnJpZGdlLiAqL1xyXG4gICAgICAgIHRoaXMuR2V0U3BlY2lhbExpc3RlbmVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiR2V0U3BlY2lhbExpc3RlbmVyXCIsIG5ldyBWcG5ScGNTcGVjaWFsTGlzdGVuZXIoKSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogU2hvdyB0aGUgY3VycmVudCBzdGF0dXMgb2YgVlBOIEF6dXJlIGZ1bmN0aW9uLiBHZXQgYW5kIHNob3cgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBWUE4gQXp1cmUgZnVuY3Rpb24uIFZQTiBBenVyZSBtYWtlcyBpdCBlYXNpZXIgdG8gZXN0YWJsaXNoIGEgVlBOIFNlc3Npb24gZnJvbSB5b3VyIGhvbWUgUEMgdG8geW91ciBvZmZpY2UgUEMuIFdoaWxlIGEgVlBOIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQsIHlvdSBjYW4gYWNjZXNzIHRvIGFueSBvdGhlciBzZXJ2ZXJzIG9uIHRoZSBwcml2YXRlIG5ldHdvcmsgb2YgeW91ciBjb21wYW55LiBZb3UgZG9uJ3QgbmVlZCBhIGdsb2JhbCBJUCBhZGRyZXNzIG9uIHRoZSBvZmZpY2UgUEMgKFZQTiBTZXJ2ZXIpLiBJdCBjYW4gd29yayBiZWhpbmQgZmlyZXdhbGxzIG9yIE5BVHMuIE5vIG5ldHdvcmsgYWRtaW5pc3RyYXRvcidzIGNvbmZpZ3VyYXRpb24gcmVxdWlyZWQuIFlvdSBjYW4gdXNlIHRoZSBidWlsdC1pbiBTU1RQLVZQTiBDbGllbnQgb2YgV2luZG93cyBpbiB5b3VyIGhvbWUgUEMuIFZQTiBBenVyZSBpcyBhIGNsb3VkIFZQTiBzZXJ2aWNlIG9wZXJhdGVkIGJ5IFNvZnRFdGhlciBDb3Jwb3JhdGlvbi4gVlBOIEF6dXJlIGlzIGZyZWUgb2YgY2hhcmdlIGFuZCBhdmFpbGFibGUgdG8gYW55b25lLiBWaXNpdCBodHRwOi8vd3d3LnZwbmF6dXJlLm5ldC8gdG8gc2VlIGRldGFpbHMgYW5kIGhvdy10by11c2UgaW5zdHJ1Y3Rpb25zLiBUaGUgVlBOIEF6dXJlIGhvc3RuYW1lIGlzIHNhbWUgdG8gdGhlIGhvc3RuYW1lIG9mIHRoZSBEeW5hbWljIEROUyBzZXR0aW5nLCBidXQgYWx0ZXJpbmcgdGhlIGRvbWFpbiBzdWZmaXggdG8gXCJ2cG5henVyZS5uZXRcIi4gVG8gY2hhbmdlIHRoZSBob3N0bmFtZSB1c2UgdGhlIENoYW5nZUREbnNDbGllbnRIb3N0bmFtZSBBUEkuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBtdXN0IGhhdmUgVlBOIFNlcnZlciBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMuIFRoaXMgQVBJIGNhbm5vdCBiZSBpbnZva2VkIG9uIFZQTiBCcmlkZ2UuIFlvdSBjYW5ub3QgZXhlY3V0ZSB0aGlzIEFQSSBmb3IgVmlydHVhbCBIdWJzIG9mIFZQTiBTZXJ2ZXJzIG9wZXJhdGluZyBhcyBhIGNsdXN0ZXIuICovXHJcbiAgICAgICAgdGhpcy5HZXRBenVyZVN0YXR1cyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIkdldEF6dXJlU3RhdHVzXCIsIG5ldyBWcG5ScGNBenVyZVN0YXR1cygpKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBFbmFibGUgLyBEaXNhYmxlIFZQTiBBenVyZSBGdW5jdGlvbi4gRW5hYmxlIG9yIGRpc2FibGUgdGhlIFZQTiBBenVyZSBmdW5jdGlvbi4gVlBOIEF6dXJlIG1ha2VzIGl0IGVhc2llciB0byBlc3RhYmxpc2ggYSBWUE4gU2Vzc2lvbiBmcm9tIHlvdXIgaG9tZSBQQyB0byB5b3VyIG9mZmljZSBQQy4gV2hpbGUgYSBWUE4gY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCwgeW91IGNhbiBhY2Nlc3MgdG8gYW55IG90aGVyIHNlcnZlcnMgb24gdGhlIHByaXZhdGUgbmV0d29yayBvZiB5b3VyIGNvbXBhbnkuIFlvdSBkb24ndCBuZWVkIGEgZ2xvYmFsIElQIGFkZHJlc3Mgb24gdGhlIG9mZmljZSBQQyAoVlBOIFNlcnZlcikuIEl0IGNhbiB3b3JrIGJlaGluZCBmaXJld2FsbHMgb3IgTkFUcy4gTm8gbmV0d29yayBhZG1pbmlzdHJhdG9yJ3MgY29uZmlndXJhdGlvbiByZXF1aXJlZC4gWW91IGNhbiB1c2UgdGhlIGJ1aWx0LWluIFNTVFAtVlBOIENsaWVudCBvZiBXaW5kb3dzIGluIHlvdXIgaG9tZSBQQy4gVlBOIEF6dXJlIGlzIGEgY2xvdWQgVlBOIHNlcnZpY2Ugb3BlcmF0ZWQgYnkgU29mdEV0aGVyIENvcnBvcmF0aW9uLiBWUE4gQXp1cmUgaXMgZnJlZSBvZiBjaGFyZ2UgYW5kIGF2YWlsYWJsZSB0byBhbnlvbmUuIFZpc2l0IGh0dHA6Ly93d3cudnBuYXp1cmUubmV0LyB0byBzZWUgZGV0YWlscyBhbmQgaG93LXRvLXVzZSBpbnN0cnVjdGlvbnMuIFRoZSBWUE4gQXp1cmUgaG9zdG5hbWUgaXMgc2FtZSB0byB0aGUgaG9zdG5hbWUgb2YgdGhlIER5bmFtaWMgRE5TIHNldHRpbmcsIGJ1dCBhbHRlcmluZyB0aGUgZG9tYWluIHN1ZmZpeCB0byBcInZwbmF6dXJlLm5ldFwiLiBUbyBjaGFuZ2UgdGhlIGhvc3RuYW1lIHVzZSB0aGUgQ2hhbmdlRERuc0NsaWVudEhvc3RuYW1lIEFQSS4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG11c3QgaGF2ZSBWUE4gU2VydmVyIGFkbWluaXN0cmF0b3IgcHJpdmlsZWdlcy4gVGhpcyBBUEkgY2Fubm90IGJlIGludm9rZWQgb24gVlBOIEJyaWRnZS4gWW91IGNhbm5vdCBleGVjdXRlIHRoaXMgQVBJIGZvciBWaXJ0dWFsIEh1YnMgb2YgVlBOIFNlcnZlcnMgb3BlcmF0aW5nIGFzIGEgY2x1c3Rlci4gKi9cclxuICAgICAgICB0aGlzLlNldEF6dXJlU3RhdHVzID0gZnVuY3Rpb24gKGluX3BhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJTZXRBenVyZVN0YXR1c1wiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogR2V0IHRoZSBQcm94eSBTZXR0aW5ncyBmb3IgQ29ubmVjdGluZyB0byB0aGUgREROUyBzZXJ2ZXIuICovXHJcbiAgICAgICAgdGhpcy5HZXRERG5zSW50ZXJuZXRTZXR0bmcgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DYWxsQXN5bmMoXCJHZXRERG5zSW50ZXJuZXRTZXR0bmdcIiwgbmV3IFZwbkludGVybmV0U2V0dGluZygpKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBTZXQgdGhlIFByb3h5IFNldHRpbmdzIGZvciBDb25uZWN0aW5nIHRvIHRoZSBERE5TIHNlcnZlci4gKi9cclxuICAgICAgICB0aGlzLlNldEREbnNJbnRlcm5ldFNldHRuZyA9IGZ1bmN0aW9uIChpbl9wYXJhbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiU2V0RERuc0ludGVybmV0U2V0dG5nXCIsIGluX3BhcmFtKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKiBTZXQgdGhlIFZQTiBHYXRlIFNlcnZlciBDb25maWd1cmF0aW9uLiBUaGlzIEFQSSBpcyB2YWxpZCBmb3IgV2luMzIgYmluYXJ5IGRpc3RyaWJ1dGlvbiBvZiB0aGUgU3RhYmxlIEVkaXRpb24gb2YgU29mdEV0aGVyIFZQTiBTZXJ2ZXIuICovXHJcbiAgICAgICAgdGhpcy5TZXRWZ3NDb25maWcgPSBmdW5jdGlvbiAoaW5fcGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNhbGxBc3luYyhcIlNldFZnc0NvbmZpZ1wiLCBpbl9wYXJhbSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiogR2V0IHRoZSBWUE4gR2F0ZSBTZXJ2ZXIgQ29uZmlndXJhdGlvbi4gVGhpcyBBUEkgaXMgdmFsaWQgZm9yIFdpbjMyIGJpbmFyeSBkaXN0cmlidXRpb24gb2YgdGhlIFN0YWJsZSBFZGl0aW9uIG9mIFNvZnRFdGhlciBWUE4gU2VydmVyLiAqL1xyXG4gICAgICAgIHRoaXMuR2V0VmdzQ29uZmlnID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2FsbEFzeW5jKFwiR2V0VmdzQ29uZmlnXCIsIG5ldyBWcG5WZ3NDb25maWcoKSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2YXIgaGVhZGVycyA9IHt9O1xyXG4gICAgICAgIHZhciBzZW5kX2NyZWRlbnRpYWxzID0gZmFsc2U7XHJcbiAgICAgICAgbm9kZWpzX2h0dHBzX2NsaWVudF9yZWplY3RfdW50cnVzdGVkX3NlcnZlcl9jZXJ0ID0gaXNfbnVsbChub2RlanNfaHR0cHNfY2xpZW50X3JlamVjdF91bnRydXN0ZWRfc2VydmVyX2NlcnQpID8gZmFsc2UgOiBub2RlanNfaHR0cHNfY2xpZW50X3JlamVjdF91bnRydXN0ZWRfc2VydmVyX2NlcnQ7XHJcbiAgICAgICAgaWYgKGlzX251bGwodnBuc2VydmVyX2hvc3RuYW1lKSkge1xyXG4gICAgICAgICAgICB0aGlzLnJwY191cmwgPSBcIi9hcGkvXCI7XHJcbiAgICAgICAgICAgIHNlbmRfY3JlZGVudGlhbHMgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGlzX251bGwodnBuc2VydmVyX3BvcnQpKVxyXG4gICAgICAgICAgICAgICAgdnBuc2VydmVyX3BvcnQgPSA0NDM7XHJcbiAgICAgICAgICAgIHRoaXMucnBjX3VybCA9IFwiaHR0cHM6Ly9cIiArIHZwbnNlcnZlcl9ob3N0bmFtZSArIFwiOlwiICsgdnBuc2VydmVyX3BvcnQgKyBcIi9hcGkvXCI7XHJcbiAgICAgICAgICAgIGhlYWRlcnNbXCJYLVZQTkFETUlOLUhVQk5BTUVcIl0gPSBpc19udWxsKGh1Ym5hbWUpID8gXCJcIiA6IGh1Ym5hbWU7XHJcbiAgICAgICAgICAgIGhlYWRlcnNbXCJYLVZQTkFETUlOLVBBU1NXT1JEXCJdID0gaXNfbnVsbChwYXNzd29yZCkgPyBcIlwiIDogcGFzc3dvcmQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpc19udWxsKG5vZGVqc19odHRwc19jbGllbnRfcmVqZWN0X3VudHJ1c3RlZF9zZXJ2ZXJfY2VydCkpXHJcbiAgICAgICAgICAgIG5vZGVqc19odHRwc19jbGllbnRfcmVqZWN0X3VudHJ1c3RlZF9zZXJ2ZXJfY2VydCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucnBjX2NsaWVudCA9IG5ldyBKc29uUnBjQ2xpZW50KHRoaXMucnBjX3VybCwgaGVhZGVycywgc2VuZF9jcmVkZW50aWFscywgbm9kZWpzX2h0dHBzX2NsaWVudF9yZWplY3RfdW50cnVzdGVkX3NlcnZlcl9jZXJ0KTtcclxuICAgIH1cclxuICAgIC8qKiBEZXRlcm1pbmUgaWYgdGhpcyBKYXZhU2NyaXB0IGVudmlyb25tZW50IGlzIG9uIHRoZSBOb2RlLmpzIG9yIG5vdC4gKi9cclxuICAgIFZwblNlcnZlclJwYy5Jc05vZGVKUyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gaXNfbm9kZV9qcztcclxuICAgIH07XHJcbiAgICAvKiogU2V0IHRoZSBkZWJ1ZyBtb2RlIGZsYWcgKi9cclxuICAgIFZwblNlcnZlclJwYy5TZXREZWJ1Z01vZGUgPSBmdW5jdGlvbiAoZmxhZykge1xyXG4gICAgICAgIGRlYnVnX21vZGUgPSBmbGFnO1xyXG4gICAgfTtcclxuICAgIC8vIC0tIFV0aWxpdHkgZnVuY3Rpb25zIC0tXHJcbiAgICAvKiogQ2FsbCBhIFJQQyBwcm9jZWR1cmUgKi9cclxuICAgIFZwblNlcnZlclJwYy5wcm90b3R5cGUuQ2FsbEFzeW5jID0gZnVuY3Rpb24gKG1ldGhvZF9uYW1lLCByZXF1ZXN0KSB7XHJcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgcmVzcG9uc2U7XHJcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucnBjX2NsaWVudC5DYWxsQXN5bmMobWV0aG9kX25hbWUsIHJlcXVlc3QpXTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gX2Euc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVzcG9uc2VdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gVnBuU2VydmVyUnBjO1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblNlcnZlclJwYyA9IFZwblNlcnZlclJwYztcclxuLy8gLS0tIFR5cGVzIC0tLVxyXG4vKiogSVAgUHJvdG9jb2wgTnVtYmVycyAqL1xyXG52YXIgVnBuSXBQcm90b2NvbE51bWJlcjtcclxuKGZ1bmN0aW9uIChWcG5JcFByb3RvY29sTnVtYmVyKSB7XHJcbiAgICAvKiogSUNNUCBmb3IgSVB2NCAqL1xyXG4gICAgVnBuSXBQcm90b2NvbE51bWJlcltWcG5JcFByb3RvY29sTnVtYmVyW1wiSUNNUHY0XCJdID0gMV0gPSBcIklDTVB2NFwiO1xyXG4gICAgLyoqIFRDUCAqL1xyXG4gICAgVnBuSXBQcm90b2NvbE51bWJlcltWcG5JcFByb3RvY29sTnVtYmVyW1wiVENQXCJdID0gNl0gPSBcIlRDUFwiO1xyXG4gICAgLyoqIFVEUCAqL1xyXG4gICAgVnBuSXBQcm90b2NvbE51bWJlcltWcG5JcFByb3RvY29sTnVtYmVyW1wiVURQXCJdID0gMTddID0gXCJVRFBcIjtcclxuICAgIC8qKiBJQ01QIGZvciBJUHY2ICovXHJcbiAgICBWcG5JcFByb3RvY29sTnVtYmVyW1ZwbklwUHJvdG9jb2xOdW1iZXJbXCJJQ01QdjZcIl0gPSA1OF0gPSBcIklDTVB2NlwiO1xyXG59KShWcG5JcFByb3RvY29sTnVtYmVyID0gZXhwb3J0cy5WcG5JcFByb3RvY29sTnVtYmVyIHx8IChleHBvcnRzLlZwbklwUHJvdG9jb2xOdW1iZXIgPSB7fSkpO1xyXG4vKiogVGhlIGJvZHkgb2YgdGhlIEFjY2VzcyBsaXN0ICovXHJcbnZhciBWcG5BY2Nlc3MgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuQWNjZXNzJyBjbGFzczogVGhlIGJvZHkgb2YgdGhlIEFjY2VzcyBsaXN0ICovXHJcbiAgICBmdW5jdGlvbiBWcG5BY2Nlc3MoaW5pdCkge1xyXG4gICAgICAgIC8qKiBJRCAqL1xyXG4gICAgICAgIHRoaXMuSWRfdTMyID0gMDtcclxuICAgICAgICAvKiogU3BlY2lmeSBhIGRlc2NyaXB0aW9uIChub3RlKSBmb3IgdGhpcyBydWxlICovXHJcbiAgICAgICAgdGhpcy5Ob3RlX3V0ZiA9IFwiXCI7XHJcbiAgICAgICAgLyoqIEVuYWJsZWQgZmxhZyAodHJ1ZTogZW5hYmxlZCwgZmFsc2U6IGRpc2FibGVkKSAqL1xyXG4gICAgICAgIHRoaXMuQWN0aXZlX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogU3BlY2lmeSBhbiBpbnRlZ2VyIG9mIDEgb3IgaGlnaGVyIHRvIGluZGljYXRlIHRoZSBwcmlvcml0eSBvZiB0aGUgcnVsZS4gSGlnaGVyIHByaW9yaXR5IGlzIGdpdmVuIHRvIHJ1bGVzIHdpdGggdGhlIGxvd2VyIHByaW9yaXR5IHZhbHVlcy4gKi9cclxuICAgICAgICB0aGlzLlByaW9yaXR5X3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIFRoZSBmbGFnIGlmIHRoZSBydWxlIGlzIERJU0NBUkQgb3BlcmF0aW9uIG9yIFBBU1Mgb3BlcmF0aW9uLiBXaGVuIGEgcGFja2V0IG1hdGNoZXMgdGhpcyBydWxlIGNvbmRpdGlvbiwgdGhpcyBvcGVyYXRpb24gaXMgZGVjaWRlZC4gV2hlbiB0aGUgb3BlcmF0aW9uIG9mIHRoZSBydWxlIGlzIFBBU1MsIHRoZSBwYWNrZXQgaXMgYWxsb3dlZCB0byBwYXNzLCBvdGhlcndpc2UgdGhlIHBhY2tldCB3aWxsIGJlIGRpc2NhcmRlZC4gKi9cclxuICAgICAgICB0aGlzLkRpc2NhcmRfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBUaGUgZmxhZyBpZiB0aGUgcnVsZSBpcyBmb3IgSVB2Ni4gU3BlY2lmeSBmYWxzZSBmb3IgSVB2NCwgb3Igc3BlY2lmeSB0cnVlIGZvciBJUHY2LiAqL1xyXG4gICAgICAgIHRoaXMuSXNJUHY2X2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogVmFsaWQgb25seSBpZiB0aGUgcnVsZSBpcyBJUHY0IG1vZGUgKElzSVB2Nl9ib29sID09IGZhbHNlKS4gU3BlY2lmeSBhIHNvdXJjZSBJUHY0IGFkZHJlc3MgYXMgYSBydWxlIGNvbmRpdGlvbi4gWW91IG11c3QgYWxzbyBzcGVjaWZ5IHRoZSBTcmNTdWJuZXRNYXNrX2lwIGZpZWxkLiAqL1xyXG4gICAgICAgIHRoaXMuU3JjSXBBZGRyZXNzX2lwID0gXCJcIjtcclxuICAgICAgICAvKiogVmFsaWQgb25seSBpZiB0aGUgcnVsZSBpcyBJUHY0IG1vZGUgKElzSVB2Nl9ib29sID09IGZhbHNlKS4gU3BlY2lmeSBhIHNvdXJjZSBJUHY0IHN1Ym5ldCBtYXNrIGFzIGEgcnVsZSBjb25kaXRpb24uIFwiMC4wLjAuMFwiIG1lYW5zIGFsbCBob3N0cy4gXCIyNTUuMjU1LjI1NS4yNTVcIiBtZWFucyBvbmUgc2luZ2xlIGhvc3QuICovXHJcbiAgICAgICAgdGhpcy5TcmNTdWJuZXRNYXNrX2lwID0gXCJcIjtcclxuICAgICAgICAvKiogVmFsaWQgb25seSBpZiB0aGUgcnVsZSBpcyBJUHY0IG1vZGUgKElzSVB2Nl9ib29sID09IGZhbHNlKS4gU3BlY2lmeSBhIGRlc3RpbmF0aW9uIElQdjQgYWRkcmVzcyBhcyBhIHJ1bGUgY29uZGl0aW9uLiBZb3UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlIERlc3RTdWJuZXRNYXNrX2lwIGZpZWxkLiAqL1xyXG4gICAgICAgIHRoaXMuRGVzdElwQWRkcmVzc19pcCA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFZhbGlkIG9ubHkgaWYgdGhlIHJ1bGUgaXMgSVB2NCBtb2RlIChJc0lQdjZfYm9vbCA9PSBmYWxzZSkuIFNwZWNpZnkgYSBkZXN0aW5hdGlvbiBJUHY0IHN1Ym5ldCBtYXNrIGFzIGEgcnVsZSBjb25kaXRpb24uIFwiMC4wLjAuMFwiIG1lYW5zIGFsbCBob3N0cy4gXCIyNTUuMjU1LjI1NS4yNTVcIiBtZWFucyBvbmUgc2luZ2xlIGhvc3QuICovXHJcbiAgICAgICAgdGhpcy5EZXN0U3VibmV0TWFza19pcCA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFZhbGlkIG9ubHkgaWYgdGhlIHJ1bGUgaXMgSVB2NiBtb2RlIChJc0lQdjZfYm9vbCA9PSB0cnVlKS4gU3BlY2lmeSBhIHNvdXJjZSBJUHY2IGFkZHJlc3MgYXMgYSBydWxlIGNvbmRpdGlvbi4gVGhlIGZpZWxkIG11c3QgYmUgYSBieXRlIGFycmF5IG9mIDE2IGJ5dGVzICgxMjggYml0cykgdG8gY29udGFpbiB0aGUgSVB2NiBhZGRyZXNzIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlIFNyY1N1Ym5ldE1hc2s2X2JpbiBmaWVsZC4gKi9cclxuICAgICAgICB0aGlzLlNyY0lwQWRkcmVzczZfYmluID0gbmV3IFVpbnQ4QXJyYXkoW10pO1xyXG4gICAgICAgIC8qKiBWYWxpZCBvbmx5IGlmIHRoZSBydWxlIGlzIElQdjYgbW9kZSAoSXNJUHY2X2Jvb2wgPT0gdHJ1ZSkuIFNwZWNpZnkgYSBzb3VyY2UgSVB2NiBzdWJuZXQgbWFzayBhcyBhIHJ1bGUgY29uZGl0aW9uLiBUaGUgZmllbGQgbXVzdCBiZSBhIGJ5dGUgYXJyYXkgb2YgMTYgYnl0ZXMgKDEyOCBiaXRzKSB0byBjb250YWluIHRoZSBJUHY2IHN1Ym5ldCBtYXNrIGluIGJpbmFyeSBmb3JtLiAqL1xyXG4gICAgICAgIHRoaXMuU3JjU3VibmV0TWFzazZfYmluID0gbmV3IFVpbnQ4QXJyYXkoW10pO1xyXG4gICAgICAgIC8qKiBWYWxpZCBvbmx5IGlmIHRoZSBydWxlIGlzIElQdjYgbW9kZSAoSXNJUHY2X2Jvb2wgPT0gdHJ1ZSkuIFNwZWNpZnkgYSBkZXN0aW5hdGlvbiBJUHY2IGFkZHJlc3MgYXMgYSBydWxlIGNvbmRpdGlvbi4gVGhlIGZpZWxkIG11c3QgYmUgYSBieXRlIGFycmF5IG9mIDE2IGJ5dGVzICgxMjggYml0cykgdG8gY29udGFpbiB0aGUgSVB2NiBhZGRyZXNzIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlIERlc3RTdWJuZXRNYXNrNl9iaW4gZmllbGQuICovXHJcbiAgICAgICAgdGhpcy5EZXN0SXBBZGRyZXNzNl9iaW4gPSBuZXcgVWludDhBcnJheShbXSk7XHJcbiAgICAgICAgLyoqIFZhbGlkIG9ubHkgaWYgdGhlIHJ1bGUgaXMgSVB2NiBtb2RlIChJc0lQdjZfYm9vbCA9PSB0cnVlKS4gU3BlY2lmeSBhIGRlc3RpbmF0aW9uIElQdjYgc3VibmV0IG1hc2sgYXMgYSBydWxlIGNvbmRpdGlvbi4gVGhlIGZpZWxkIG11c3QgYmUgYSBieXRlIGFycmF5IG9mIDE2IGJ5dGVzICgxMjggYml0cykgdG8gY29udGFpbiB0aGUgSVB2NiBzdWJuZXQgbWFzayBpbiBiaW5hcnkgZm9ybS4gKi9cclxuICAgICAgICB0aGlzLkRlc3RTdWJuZXRNYXNrNl9iaW4gPSBuZXcgVWludDhBcnJheShbXSk7XHJcbiAgICAgICAgLyoqIFRoZSBJUCBwcm90b2NvbCBudW1iZXIgKi9cclxuICAgICAgICB0aGlzLlByb3RvY29sX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIFRoZSBTdGFydCBWYWx1ZSBvZiB0aGUgU291cmNlIFBvcnQgTnVtYmVyIFJhbmdlLiBJZiB0aGUgc3BlY2lmaWVkIHByb3RvY29sIGlzIFRDUC9JUCBvciBVRFAvSVAsIHNwZWNpZnkgdGhlIHNvdXJjZSBwb3J0IG51bWJlciBhcyB0aGUgcnVsZSBjb25kaXRpb24uIFByb3RvY29scyBvdGhlciB0aGFuIHRoaXMgd2lsbCBiZSBpZ25vcmVkLiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBydWxlcyB3aWxsIGFwcGx5IHRvIGFsbCBwb3J0IG51bWJlcnMuICovXHJcbiAgICAgICAgdGhpcy5TcmNQb3J0U3RhcnRfdTMyID0gMDtcclxuICAgICAgICAvKiogVGhlIEVuZCBWYWx1ZSBvZiB0aGUgU291cmNlIFBvcnQgTnVtYmVyIFJhbmdlLiBJZiB0aGUgc3BlY2lmaWVkIHByb3RvY29sIGlzIFRDUC9JUCBvciBVRFAvSVAsIHNwZWNpZnkgdGhlIHNvdXJjZSBwb3J0IG51bWJlciBhcyB0aGUgcnVsZSBjb25kaXRpb24uIFByb3RvY29scyBvdGhlciB0aGFuIHRoaXMgd2lsbCBiZSBpZ25vcmVkLiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBydWxlcyB3aWxsIGFwcGx5IHRvIGFsbCBwb3J0IG51bWJlcnMuICovXHJcbiAgICAgICAgdGhpcy5TcmNQb3J0RW5kX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIFRoZSBTdGFydCBWYWx1ZSBvZiB0aGUgRGVzdGluYXRpb24gUG9ydCBOdW1iZXIgUmFuZ2UuIElmIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wgaXMgVENQL0lQIG9yIFVEUC9JUCwgc3BlY2lmeSB0aGUgZGVzdGluYXRpb24gcG9ydCBudW1iZXIgYXMgdGhlIHJ1bGUgY29uZGl0aW9uLiBQcm90b2NvbHMgb3RoZXIgdGhhbiB0aGlzIHdpbGwgYmUgaWdub3JlZC4gV2hlbiB0aGlzIHBhcmFtZXRlciBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgcnVsZXMgd2lsbCBhcHBseSB0byBhbGwgcG9ydCBudW1iZXJzLiAqL1xyXG4gICAgICAgIHRoaXMuRGVzdFBvcnRTdGFydF91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBUaGUgRW5kIFZhbHVlIG9mIHRoZSBEZXN0aW5hdGlvbiBQb3J0IE51bWJlciBSYW5nZS4gSWYgdGhlIHNwZWNpZmllZCBwcm90b2NvbCBpcyBUQ1AvSVAgb3IgVURQL0lQLCBzcGVjaWZ5IHRoZSBkZXN0aW5hdGlvbiBwb3J0IG51bWJlciBhcyB0aGUgcnVsZSBjb25kaXRpb24uIFByb3RvY29scyBvdGhlciB0aGFuIHRoaXMgd2lsbCBiZSBpZ25vcmVkLiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBydWxlcyB3aWxsIGFwcGx5IHRvIGFsbCBwb3J0IG51bWJlcnMuICovXHJcbiAgICAgICAgdGhpcy5EZXN0UG9ydEVuZF91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBTb3VyY2UgdXNlciBuYW1lLiBZb3UgY2FuIGFwcGx5IHRoaXMgcnVsZSB0byBvbmx5IHRoZSBwYWNrZXRzIHNlbnQgYnkgYSB1c2VyIHNlc3Npb24gb2YgYSB1c2VyIG5hbWUgdGhhdCBoYXMgYmVlbiBzcGVjaWZpZWQgYXMgYSBydWxlIGNvbmRpdGlvbi4gSW4gdGhpcyBjYXNlLCBzcGVjaWZ5IHRoZSB1c2VyIG5hbWUuICovXHJcbiAgICAgICAgdGhpcy5TcmNVc2VybmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBEZXN0aW5hdGlvbiB1c2VyIG5hbWUuIFlvdSBjYW4gYXBwbHkgdGhpcyBydWxlIHRvIG9ubHkgdGhlIHBhY2tldHMgcmVjZWl2ZWQgYnkgYSB1c2VyIHNlc3Npb24gb2YgYSB1c2VyIG5hbWUgdGhhdCBoYXMgYmVlbiBzcGVjaWZpZWQgYXMgYSBydWxlIGNvbmRpdGlvbi4gSW4gdGhpcyBjYXNlLCBzcGVjaWZ5IHRoZSB1c2VyIG5hbWUuICovXHJcbiAgICAgICAgdGhpcy5EZXN0VXNlcm5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogU3BlY2lmeSB0cnVlIGlmIHlvdSB3YW50IHRvIGNoZWNrIHRoZSBzb3VyY2UgTUFDIGFkZHJlc3MuICovXHJcbiAgICAgICAgdGhpcy5DaGVja1NyY01hY19ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNvdXJjZSBNQUMgYWRkcmVzcyAoNiBieXRlcyksIHZhbGlkIG9ubHkgaWYgQ2hlY2tTcmNNYWNfYm9vbCA9PSB0cnVlLiAqL1xyXG4gICAgICAgIHRoaXMuU3JjTWFjQWRkcmVzc19iaW4gPSBuZXcgVWludDhBcnJheShbXSk7XHJcbiAgICAgICAgLyoqIFNvdXJjZSBNQUMgYWRkcmVzcyBtYXNrICg2IGJ5dGVzKSwgdmFsaWQgb25seSBpZiBDaGVja1NyY01hY19ib29sID09IHRydWUuICovXHJcbiAgICAgICAgdGhpcy5TcmNNYWNNYXNrX2JpbiA9IG5ldyBVaW50OEFycmF5KFtdKTtcclxuICAgICAgICAvKiogU3BlY2lmeSB0cnVlIGlmIHlvdSB3YW50IHRvIGNoZWNrIHRoZSBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcy4gKi9cclxuICAgICAgICB0aGlzLkNoZWNrRHN0TWFjX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogRGVzdGluYXRpb24gTUFDIGFkZHJlc3MgKDYgYnl0ZXMpLCB2YWxpZCBvbmx5IGlmIENoZWNrU3JjTWFjX2Jvb2wgPT0gdHJ1ZS4gKi9cclxuICAgICAgICB0aGlzLkRzdE1hY0FkZHJlc3NfYmluID0gbmV3IFVpbnQ4QXJyYXkoW10pO1xyXG4gICAgICAgIC8qKiBEZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyBtYXNrICg2IGJ5dGVzKSwgdmFsaWQgb25seSBpZiBDaGVja1NyY01hY19ib29sID09IHRydWUuICovXHJcbiAgICAgICAgdGhpcy5Ec3RNYWNNYXNrX2JpbiA9IG5ldyBVaW50OEFycmF5KFtdKTtcclxuICAgICAgICAvKiogU3BlY2lmeSB0cnVlIGlmIHlvdSB3YW50IHRvIGNoZWNrIHRoZSBzdGF0ZSBvZiB0aGUgVENQIGNvbm5lY3Rpb24uICovXHJcbiAgICAgICAgdGhpcy5DaGVja1RjcFN0YXRlX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogVmFsaWQgb25seSBpZiBDaGVja1RjcFN0YXRlX2Jvb2wgPT0gdHJ1ZS4gU2V0IHRoaXMgZmllbGQgdHJ1ZSB0byBtYXRjaCBvbmx5IFRDUC1lc3RhYmxpc2hlZCBwYWNrZXRzLiBTZXQgdGhpcyBmaWVsZCBmYWxzZSB0byBtYXRjaCBvbmx5IFRDUC1ub24gZXN0YWJsaXNoZWQgcGFja2V0cy4gKi9cclxuICAgICAgICB0aGlzLkVzdGFibGlzaGVkX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogU2V0IHRoaXMgdmFsdWUgdG8gZ2VuZXJhdGUgZGVsYXlzIHdoZW4gcGFja2V0cyBpcyBwYXNzaW5nLiBTcGVjaWZ5IHRoZSBkZWxheSBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzLiBTcGVjaWZ5IDAgbWVhbnMgbm8gZGVsYXlzIHRvIGdlbmVyYXRlLiBUaGUgZGVsYXlzIG11c3QgYmUgMTAwMDAgbWlsbGlzZWNvbmRzIGF0IG1vc3QuICovXHJcbiAgICAgICAgdGhpcy5EZWxheV91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBTZXQgdGhpcyB2YWx1ZSB0byBnZW5lcmF0ZSBqaXR0ZXJzIHdoZW4gcGFja2V0cyBpcyBwYXNzaW5nLiBTcGVjaWZ5IHRoZSByYXRpbyBvZiBmbHVjdHVhdGlvbiBvZiBqaXR0ZXJzIHdpdGhpbiAwJSB0byAxMDAlIHJhbmdlLiBTcGVjaWZ5IDAgbWVhbnMgbm8gaml0dGVycyB0byBnZW5lcmF0ZS4gKi9cclxuICAgICAgICB0aGlzLkppdHRlcl91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBTZXQgdGhpcyB2YWx1ZSB0byBnZW5lcmF0ZSBwYWNrZXQgbG9zc2VzIHdoZW4gcGFja2V0cyBpcyBwYXNzaW5nLiBTcGVjaWZ5IHRoZSByYXRpbyBvZiBwYWNrZXQgbG9zc2VzIHdpdGhpbiAwJSB0byAxMDAlIHJhbmdlLiBTcGVjaWZ5IDAgbWVhbnMgbm8gcGFja2V0IGxvc3NlcyB0byBnZW5lcmF0ZS4gKi9cclxuICAgICAgICB0aGlzLkxvc3NfdTMyID0gMDtcclxuICAgICAgICAvKiogVGhlIHNwZWNpZmllZCBVUkwgd2lsbCBiZSBtYW5kYXRvcnkgcmVwbGllZCB0byB0aGUgY2xpZW50IGFzIGEgcmVzcG9uc2UgZm9yIFRDUCBjb25uZWN0aW5nIHJlcXVlc3QgcGFja2V0cyB3aGljaCBtYXRjaGVzIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgYWNjZXNzIGxpc3QgZW50cnkgdmlhIHRoaXMgVmlydHVhbCBIdWIuIFRvIHVzZSB0aGlzIHNldHRpbmcsIHlvdSBjYW4gZW5mb3JjZSB0aGUgd2ViIGJyb3dzZXIgb2YgdGhlIFZQTiBDbGllbnQgY29tcHV0ZXIgdG8gc2hvdyB0aGUgc3BlY2lmaWVkIHdlYiBzaXRlIHdoZW4gdGhhdCB3ZWIgYnJvd3NlciB0cmllcyB0byBhY2Nlc3MgdGhlIHNwZWNpZmljIElQIGFkZHJlc3MuICovXHJcbiAgICAgICAgdGhpcy5SZWRpcmVjdFVybF9zdHIgPSBcIlwiO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuQWNjZXNzO1xyXG59KCkpO1xyXG5leHBvcnRzLlZwbkFjY2VzcyA9IFZwbkFjY2VzcztcclxuLyoqIEFkZCBhbiBpdGVtIHRvIEFjY2VzcyBMaXN0ICovXHJcbnZhciBWcG5ScGNBZGRBY2Nlc3MgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjQWRkQWNjZXNzJyBjbGFzczogQWRkIGFuIGl0ZW0gdG8gQWNjZXNzIExpc3QgKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY0FkZEFjY2Vzcyhpbml0KSB7XHJcbiAgICAgICAgLyoqIFRoZSBWaXJ0dWFsIEh1YiBuYW1lICovXHJcbiAgICAgICAgdGhpcy5IdWJOYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIEFjY2VzcyBsaXN0IChNdXN0IGJlIGEgc2luZ2xlIGl0ZW0pICovXHJcbiAgICAgICAgdGhpcy5BY2Nlc3NMaXN0U2luZ2xlID0gW107XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNBZGRBY2Nlc3M7XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjQWRkQWNjZXNzID0gVnBuUnBjQWRkQWNjZXNzO1xyXG4vKiogQWRkIENBIHRvIEhVQiAqL1xyXG52YXIgVnBuUnBjSHViQWRkQ0EgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjSHViQWRkQ0EnIGNsYXNzOiBBZGQgQ0EgdG8gSFVCICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNIdWJBZGRDQShpbml0KSB7XHJcbiAgICAgICAgLyoqIFRoZSBWaXJ0dWFsIEh1YiBuYW1lICovXHJcbiAgICAgICAgdGhpcy5IdWJOYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFRoZSBib2R5IG9mIHRoZSBYLjUwOSBjZXJ0aWZpY2F0ZSAqL1xyXG4gICAgICAgIHRoaXMuQ2VydF9iaW4gPSBuZXcgVWludDhBcnJheShbXSk7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNIdWJBZGRDQTtcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNIdWJBZGRDQSA9IFZwblJwY0h1YkFkZENBO1xyXG4vKiogQ1JMIGVudHJ5ICovXHJcbnZhciBWcG5ScGNDcmwgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjQ3JsJyBjbGFzczogQ1JMIGVudHJ5ICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNDcmwoaW5pdCkge1xyXG4gICAgICAgIC8qKiBUaGUgVmlydHVhbCBIdWIgbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuSHViTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBLZXkgSUQgKi9cclxuICAgICAgICB0aGlzLktleV91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBDTiwgb3B0aW9uYWwgKi9cclxuICAgICAgICB0aGlzLkNvbW1vbk5hbWVfdXRmID0gXCJcIjtcclxuICAgICAgICAvKiogTywgb3B0aW9uYWwgKi9cclxuICAgICAgICB0aGlzLk9yZ2FuaXphdGlvbl91dGYgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBPVSwgb3B0aW9uYWwgKi9cclxuICAgICAgICB0aGlzLlVuaXRfdXRmID0gXCJcIjtcclxuICAgICAgICAvKiogQywgb3B0aW9uYWwgKi9cclxuICAgICAgICB0aGlzLkNvdW50cnlfdXRmID0gXCJcIjtcclxuICAgICAgICAvKiogU1QsIG9wdGlvbmFsICovXHJcbiAgICAgICAgdGhpcy5TdGF0ZV91dGYgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBMLCBvcHRpb25hbCAqL1xyXG4gICAgICAgIHRoaXMuTG9jYWxfdXRmID0gXCJcIjtcclxuICAgICAgICAvKiogU2VyaWFsLCBvcHRpb25hbCAqL1xyXG4gICAgICAgIHRoaXMuU2VyaWFsX2JpbiA9IG5ldyBVaW50OEFycmF5KFtdKTtcclxuICAgICAgICAvKiogTUQ1IERpZ2VzdCwgb3B0aW9uYWwgKi9cclxuICAgICAgICB0aGlzLkRpZ2VzdE1ENV9iaW4gPSBuZXcgVWludDhBcnJheShbXSk7XHJcbiAgICAgICAgLyoqIFNIQTEgRGlnZXN0LCBvcHRpb25hbCAqL1xyXG4gICAgICAgIHRoaXMuRGlnZXN0U0hBMV9iaW4gPSBuZXcgVWludDhBcnJheShbXSk7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNDcmw7XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjQ3JsID0gVnBuUnBjQ3JsO1xyXG4vKiogRXRoZXJJUCBrZXkgbGlzdCBlbnRyeSAqL1xyXG52YXIgVnBuRXRoZXJJcElkID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwbkV0aGVySXBJZCcgY2xhc3M6IEV0aGVySVAga2V5IGxpc3QgZW50cnkgKi9cclxuICAgIGZ1bmN0aW9uIFZwbkV0aGVySXBJZChpbml0KSB7XHJcbiAgICAgICAgLyoqIFNwZWNpZnkgYW4gSVNBS01QIFBoYXNlIDEgSUQuIFRoZSBJRCBtdXN0IGJlIGV4YWN0bHkgc2FtZSBhcyBhIElEIGluIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBFdGhlcklQIC8gTDJUUHYzIENsaWVudC4gWW91IGNhbiBzcGVjaWZ5IElQIGFkZHJlc3MgYXMgd2VsbCBhcyBjaGFyYWN0ZXJzIGFzIElELCBpZiB0aGUgRXRoZXJJUCBDbGllbnQgdXNlcyBJUCBhZGRyZXNzIGFzIFBoYXNlIDEgSUQuIElmIHlvdSBzcGVjaWZ5ICcqJyAoYXN0ZXJpc2spLCBpdCB3aWxsIGJlIGEgd2lsZGNhcmQgdG8gbWF0Y2ggYW55IGNsaWVudHMgd2hpY2ggZG9lc24ndCBtYXRjaCBvdGhlciBleHBsaWNpdCBydWxlcy4gKi9cclxuICAgICAgICB0aGlzLklkX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIFZpcnR1YWwgSHViIHRvIGNvbm5lY3QuICovXHJcbiAgICAgICAgdGhpcy5IdWJOYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFNwZWNpZnkgdGhlIHVzZXJuYW1lIHRvIGxvZ2luIHRvIHRoZSBkZXN0aW5hdGlvbiBWaXJ0dWFsIEh1Yi4gKi9cclxuICAgICAgICB0aGlzLlVzZXJOYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFNwZWNpZnkgdGhlIHBhc3N3b3JkIHRvIGxvZ2luIHRvIHRoZSBkZXN0aW5hdGlvbiBWaXJ0dWFsIEh1Yi4gKi9cclxuICAgICAgICB0aGlzLlBhc3N3b3JkX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5FdGhlcklwSWQ7XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuRXRoZXJJcElkID0gVnBuRXRoZXJJcElkO1xyXG4vKiogTGF5ZXItMyB2aXJ0dWFsIGludGVyZmFjZSAqL1xyXG52YXIgVnBuUnBjTDNJZiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNMM0lmJyBjbGFzczogTGF5ZXItMyB2aXJ0dWFsIGludGVyZmFjZSAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjTDNJZihpbml0KSB7XHJcbiAgICAgICAgLyoqIEwzIHN3aXRjaCBuYW1lICovXHJcbiAgICAgICAgdGhpcy5OYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFZpcnR1YWwgSFVCIG5hbWUgKi9cclxuICAgICAgICB0aGlzLkh1Yk5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogSVAgYWRkcmVzcyAqL1xyXG4gICAgICAgIHRoaXMuSXBBZGRyZXNzX2lwID0gXCJcIjtcclxuICAgICAgICAvKiogU3VibmV0IG1hc2sgKi9cclxuICAgICAgICB0aGlzLlN1Ym5ldE1hc2tfaXAgPSBcIlwiO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjTDNJZjtcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNMM0lmID0gVnBuUnBjTDNJZjtcclxuLyoqIExheWVyLTMgc3dpdGNoICovXHJcbnZhciBWcG5ScGNMM1N3ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwblJwY0wzU3cnIGNsYXNzOiBMYXllci0zIHN3aXRjaCAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjTDNTdyhpbml0KSB7XHJcbiAgICAgICAgLyoqIExheWVyLTMgU3dpdGNoIG5hbWUgKi9cclxuICAgICAgICB0aGlzLk5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY0wzU3c7XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjTDNTdyA9IFZwblJwY0wzU3c7XHJcbi8qKiBSb3V0aW5nIHRhYmxlICovXHJcbnZhciBWcG5ScGNMM1RhYmxlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwblJwY0wzVGFibGUnIGNsYXNzOiBSb3V0aW5nIHRhYmxlICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNMM1RhYmxlKGluaXQpIHtcclxuICAgICAgICAvKiogTDMgc3dpdGNoIG5hbWUgKi9cclxuICAgICAgICB0aGlzLk5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogTmV0d29yayBhZGRyZXNzICovXHJcbiAgICAgICAgdGhpcy5OZXR3b3JrQWRkcmVzc19pcCA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFN1Ym5ldCBtYXNrICovXHJcbiAgICAgICAgdGhpcy5TdWJuZXRNYXNrX2lwID0gXCJcIjtcclxuICAgICAgICAvKiogR2F0ZXdheSBhZGRyZXNzICovXHJcbiAgICAgICAgdGhpcy5HYXRld2F5QWRkcmVzc19pcCA9IFwiXCI7XHJcbiAgICAgICAgLyoqIE1ldHJpYyAqL1xyXG4gICAgICAgIHRoaXMuTWV0cmljX3UzMiA9IDA7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNMM1RhYmxlO1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY0wzVGFibGUgPSBWcG5ScGNMM1RhYmxlO1xyXG4vKiogR2VuZXJpYyBwYXJhbWV0ZXIgdG8gY29udGFpbiB1MzIsIHU2NCwgYXNjaWlfc3RyaW5nIGFuZCB1bmljb2RlIHN0cmluZyAqL1xyXG52YXIgVnBuUnBjVGVzdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNUZXN0JyBjbGFzczogR2VuZXJpYyBwYXJhbWV0ZXIgdG8gY29udGFpbiB1MzIsIHU2NCwgYXNjaWlfc3RyaW5nIGFuZCB1bmljb2RlIHN0cmluZyAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjVGVzdChpbml0KSB7XHJcbiAgICAgICAgLyoqIEEgMzItYml0IGludGVnZXIgZmllbGQgKi9cclxuICAgICAgICB0aGlzLkludFZhbHVlX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIEEgNjQtYml0IGludGVnZXIgZmllbGQgKi9cclxuICAgICAgICB0aGlzLkludDY0VmFsdWVfdTY0ID0gMDtcclxuICAgICAgICAvKiogQW4gQXNjaWkgc3RyaW5nIGZpZWxkICovXHJcbiAgICAgICAgdGhpcy5TdHJWYWx1ZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBBbiBVVEYtOCBzdHJpbmcgZmllbGQgKi9cclxuICAgICAgICB0aGlzLlVuaVN0clZhbHVlX3V0ZiA9IFwiXCI7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNUZXN0O1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY1Rlc3QgPSBWcG5ScGNUZXN0O1xyXG4vKiogTG9jYWwgQnJpZGdlIGxpc3QgaXRlbSAqL1xyXG52YXIgVnBuUnBjTG9jYWxCcmlkZ2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjTG9jYWxCcmlkZ2UnIGNsYXNzOiBMb2NhbCBCcmlkZ2UgbGlzdCBpdGVtICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNMb2NhbEJyaWRnZShpbml0KSB7XHJcbiAgICAgICAgLyoqIFBoeXNpY2FsIEV0aGVybmV0IGRldmljZSBuYW1lICovXHJcbiAgICAgICAgdGhpcy5EZXZpY2VOYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFRoZSBWaXJ0dWFsIEh1YiBuYW1lICovXHJcbiAgICAgICAgdGhpcy5IdWJOYW1lTEJfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogT25saW5lIGZsYWcgKi9cclxuICAgICAgICB0aGlzLk9ubGluZV9ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFJ1bm5pbmcgZmxhZyAqL1xyXG4gICAgICAgIHRoaXMuQWN0aXZlX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogU3BlY2lmeSB0cnVlIGlmIHlvdSBhcmUgdXNpbmcgYSB0YXAgZGV2aWNlIHJhdGhlciB0aGFuIGEgbmV0d29yayBhZGFwdGVyIGZvciB0aGUgYnJpZGdlIGRlc3RpbmF0aW9uIChvbmx5IHN1cHBvcnRlZCBmb3IgTGludXggdmVyc2lvbnMpLiAqL1xyXG4gICAgICAgIHRoaXMuVGFwTW9kZV9ib29sID0gZmFsc2U7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNMb2NhbEJyaWRnZTtcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNMb2NhbEJyaWRnZSA9IFZwblJwY0xvY2FsQnJpZGdlO1xyXG4vKiogQ3JlYXRlLCBjb25maWd1cmUsIGFuZCBnZXQgdGhlIGdyb3VwICovXHJcbnZhciBWcG5ScGNTZXRHcm91cCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNTZXRHcm91cCcgY2xhc3M6IENyZWF0ZSwgY29uZmlndXJlLCBhbmQgZ2V0IHRoZSBncm91cCAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjU2V0R3JvdXAoaW5pdCkge1xyXG4gICAgICAgIC8qKiBUaGUgVmlydHVhbCBIdWIgbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuSHViTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBUaGUgZ3JvdXAgbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBPcHRpb25hbCByZWFsIG5hbWUgKGZ1bGwgbmFtZSkgb2YgdGhlIGdyb3VwLCBhbGxvdyB1c2luZyBhbnkgVW5pY29kZSBjaGFyYWN0ZXJzICovXHJcbiAgICAgICAgdGhpcy5SZWFsbmFtZV91dGYgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBPcHRpb25hbCwgc3BlY2lmeSBhIGRlc2NyaXB0aW9uIG9mIHRoZSBncm91cCAqL1xyXG4gICAgICAgIHRoaXMuTm90ZV91dGYgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBOdW1iZXIgb2YgYnJvYWRjYXN0IHBhY2tldHMgKFJlY3YpICovXHJcbiAgICAgICAgdGhpc1tcIlJlY3YuQnJvYWRjYXN0Qnl0ZXNfdTY0XCJdID0gMDtcclxuICAgICAgICAvKiogQnJvYWRjYXN0IGJ5dGVzIChSZWN2KSAqL1xyXG4gICAgICAgIHRoaXNbXCJSZWN2LkJyb2FkY2FzdENvdW50X3U2NFwiXSA9IDA7XHJcbiAgICAgICAgLyoqIFVuaWNhc3QgY291bnQgKFJlY3YpICovXHJcbiAgICAgICAgdGhpc1tcIlJlY3YuVW5pY2FzdEJ5dGVzX3U2NFwiXSA9IDA7XHJcbiAgICAgICAgLyoqIFVuaWNhc3QgYnl0ZXMgKFJlY3YpICovXHJcbiAgICAgICAgdGhpc1tcIlJlY3YuVW5pY2FzdENvdW50X3U2NFwiXSA9IDA7XHJcbiAgICAgICAgLyoqIE51bWJlciBvZiBicm9hZGNhc3QgcGFja2V0cyAoU2VuZCkgKi9cclxuICAgICAgICB0aGlzW1wiU2VuZC5Ccm9hZGNhc3RCeXRlc191NjRcIl0gPSAwO1xyXG4gICAgICAgIC8qKiBCcm9hZGNhc3QgYnl0ZXMgKFNlbmQpICovXHJcbiAgICAgICAgdGhpc1tcIlNlbmQuQnJvYWRjYXN0Q291bnRfdTY0XCJdID0gMDtcclxuICAgICAgICAvKiogVW5pY2FzdCBieXRlcyAoU2VuZCkgKi9cclxuICAgICAgICB0aGlzW1wiU2VuZC5VbmljYXN0Qnl0ZXNfdTY0XCJdID0gMDtcclxuICAgICAgICAvKiogVW5pY2FzdCBieXRlcyAoU2VuZCkgKi9cclxuICAgICAgICB0aGlzW1wiU2VuZC5VbmljYXN0Q291bnRfdTY0XCJdID0gMDtcclxuICAgICAgICAvKiogVGhlIGZsYWcgd2hldGhlciB0byB1c2Ugc2VjdXJpdHkgcG9saWN5ICovXHJcbiAgICAgICAgdGhpcy5Vc2VQb2xpY3lfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IEFsbG93IEFjY2Vzcy4gVGhlIHVzZXJzLCB3aGljaCB0aGlzIHBvbGljeSB2YWx1ZSBpcyB0cnVlLCBoYXZlIHBlcm1pc3Npb24gdG8gbWFrZSBWUE4gY29ubmVjdGlvbiB0byBWUE4gU2VydmVyLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6QWNjZXNzX2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBGaWx0ZXIgREhDUCBQYWNrZXRzIChJUHY0KS4gQWxsIElQdjQgREhDUCBwYWNrZXRzIGluIHNlc3Npb25zIGRlZmluZWQgdGhpcyBwb2xpY3kgd2lsbCBiZSBmaWx0ZXJlZC4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5OkRIQ1BGaWx0ZXJfYm9vbFwiXSA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IERpc2FsbG93IERIQ1AgU2VydmVyIE9wZXJhdGlvbiAoSVB2NCkuIENvbXB1dGVycyBjb25uZWN0ZWQgdG8gc2Vzc2lvbnMgdGhhdCBoYXZlIHRoaXMgcG9saWN5IHNldHRpbmcgd2lsbCBub3QgYmUgYWxsb3dlZCB0byBiZWNvbWUgYSBESENQIHNlcnZlciBhbmQgZGlzdHJpYnV0ZSBJUHY0IGFkZHJlc3NlcyB0byBESENQIGNsaWVudHMuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpESENQTm9TZXJ2ZXJfYm9vbFwiXSA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IEVuZm9yY2UgREhDUCBBbGxvY2F0ZWQgSVAgQWRkcmVzc2VzIChJUHY0KS4gQ29tcHV0ZXJzIGluIHNlc3Npb25zIHRoYXQgaGF2ZSB0aGlzIHBvbGljeSBzZXR0aW5nIHdpbGwgb25seSBiZSBhYmxlIHRvIHVzZSBJUHY0IGFkZHJlc3NlcyBhbGxvY2F0ZWQgYnkgYSBESENQIHNlcnZlciBvbiB0aGUgdmlydHVhbCBuZXR3b3JrIHNpZGUuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpESENQRm9yY2VfYm9vbFwiXSA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IERlbnkgQnJpZGdlIE9wZXJhdGlvbi4gQnJpZGdlLW1vZGUgY29ubmVjdGlvbnMgYXJlIGRlbmllZCBmb3IgdXNlciBzZXNzaW9ucyB0aGF0IGhhdmUgdGhpcyBwb2xpY3kgc2V0dGluZy4gRXZlbiBpbiBjYXNlcyB3aGVuIHRoZSBFdGhlcm5ldCBCcmlkZ2UgaXMgY29uZmlndXJlZCBpbiB0aGUgY2xpZW50IHNpZGUsIGNvbW11bmljYXRpb24gd2lsbCBub3QgYmUgcG9zc2libGUuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpOb0JyaWRnZV9ib29sXCJdID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogRGVueSBSb3V0aW5nIE9wZXJhdGlvbiAoSVB2NCkuIElQdjQgcm91dGluZyB3aWxsIGJlIGRlbmllZCBmb3Igc2Vzc2lvbnMgdGhhdCBoYXZlIHRoaXMgcG9saWN5IHNldHRpbmcuIEV2ZW4gaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIElQIHJvdXRlciBpcyBvcGVyYXRpbmcgb24gdGhlIHVzZXIgY2xpZW50IHNpZGUsIGNvbW11bmljYXRpb24gd2lsbCBub3QgYmUgcG9zc2libGUuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpOb1JvdXRpbmdfYm9vbFwiXSA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IERlbnkgTUFDIEFkZHJlc3NlcyBEdXBsaWNhdGlvbi4gVGhlIHVzZSBvZiBkdXBsaWNhdGluZyBNQUMgYWRkcmVzc2VzIHRoYXQgYXJlIGluIHVzZSBieSBjb21wdXRlcnMgb2YgZGlmZmVyZW50IHNlc3Npb25zIGNhbm5vdCBiZSB1c2VkIGJ5IHNlc3Npb25zIHdpdGggdGhpcyBwb2xpY3kgc2V0dGluZy4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5OkNoZWNrTWFjX2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBEZW55IElQIEFkZHJlc3MgRHVwbGljYXRpb24gKElQdjQpLiBUaGUgdXNlIG9mIGR1cGxpY2F0aW5nIElQdjQgYWRkcmVzc2VzIHRoYXQgYXJlIGluIHVzZSBieSBjb21wdXRlcnMgb2YgZGlmZmVyZW50IHNlc3Npb25zIGNhbm5vdCBiZSB1c2VkIGJ5IHNlc3Npb25zIHdpdGggdGhpcyBwb2xpY3kgc2V0dGluZy4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5OkNoZWNrSVBfYm9vbFwiXSA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IERlbnkgTm9uLUFSUCAvIE5vbi1ESENQIC8gTm9uLUlDTVB2NiBicm9hZGNhc3RzLiBUaGUgc2VuZGluZyBvciByZWNlaXZpbmcgb2YgYnJvYWRjYXN0IHBhY2tldHMgdGhhdCBhcmUgbm90IEFSUCBwcm90b2NvbCwgREhDUCBwcm90b2NvbCwgbm9yIElDTVB2NiBvbiB0aGUgdmlydHVhbCBuZXR3b3JrIHdpbGwgbm90IGJlIGFsbG93ZWQgZm9yIHNlc3Npb25zIHdpdGggdGhpcyBwb2xpY3kgc2V0dGluZy4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5OkFycERoY3BPbmx5X2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBQcml2YWN5IEZpbHRlciBNb2RlLiBBbGwgZGlyZWN0IGNvbW11bmljYXRpb24gYmV0d2VlbiBzZXNzaW9ucyB3aXRoIHRoZSBwcml2YWN5IGZpbHRlciBtb2RlIHBvbGljeSBzZXR0aW5nIHdpbGwgYmUgZmlsdGVyZWQuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpQcml2YWN5RmlsdGVyX2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBEZW55IE9wZXJhdGlvbiBhcyBUQ1AvSVAgU2VydmVyIChJUHY0KS4gQ29tcHV0ZXJzIG9mIHNlc3Npb25zIHdpdGggdGhpcyBwb2xpY3kgc2V0dGluZyBjYW4ndCBsaXN0ZW4gYW5kIGFjY2VwdCBUQ1AvSVAgY29ubmVjdGlvbnMgaW4gSVB2NC4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5Ok5vU2VydmVyX2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBVbmxpbWl0ZWQgTnVtYmVyIG9mIEJyb2FkY2FzdHMuIElmIGEgY29tcHV0ZXIgb2YgYSBzZXNzaW9uIHdpdGggdGhpcyBwb2xpY3kgc2V0dGluZyBzZW5kcyBicm9hZGNhc3QgcGFja2V0cyBvZiBhIG51bWJlciB1bnVzdWFsbHkgbGFyZ2VyIHRoYW4gd2hhdCB3b3VsZCBiZSBjb25zaWRlcmVkIG5vcm1hbCBvbiB0aGUgdmlydHVhbCBuZXR3b3JrLCB0aGVyZSB3aWxsIGJlIG5vIGF1dG9tYXRpYyBsaW1pdGluZy4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5Ok5vQnJvYWRjYXN0TGltaXRlcl9ib29sXCJdID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogQWxsb3cgTW9uaXRvcmluZyBNb2RlLiBVc2VycyB3aXRoIHRoaXMgcG9saWN5IHNldHRpbmcgd2lsbCBiZSBncmFudGVkIHRvIGNvbm5lY3QgdG8gdGhlIFZpcnR1YWwgSHViIGluIE1vbml0b3JpbmcgTW9kZS4gU2Vzc2lvbnMgaW4gTW9uaXRvcmluZyBNb2RlIGFyZSBhYmxlIHRvIG1vbml0b3IgKHRhcCkgYWxsIHBhY2tldHMgZmxvd2luZyB0aHJvdWdoIHRoZSBWaXJ0dWFsIEh1Yi4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5Ok1vbml0b3JQb3J0X2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBNYXhpbXVtIE51bWJlciBvZiBUQ1AgQ29ubmVjdGlvbnMuIEZvciBzZXNzaW9ucyB3aXRoIHRoaXMgcG9saWN5IHNldHRpbmcsIHRoaXMgc2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcGh5c2ljYWwgVENQIGNvbm5lY3Rpb25zIGNvbnNpc3RzIGluIGEgcGh5c2ljYWwgVlBOIHNlc3Npb24uICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpNYXhDb25uZWN0aW9uX3UzMlwiXSA9IDA7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogVGltZS1vdXQgUGVyaW9kLiBGb3Igc2Vzc2lvbnMgd2l0aCB0aGlzIHBvbGljeSBzZXR0aW5nLCB0aGlzIHNldHMsIGluIHNlY29uZHMsIHRoZSB0aW1lLW91dCBwZXJpb2QgdG8gd2FpdCBiZWZvcmUgZGlzY29ubmVjdGluZyBhIHNlc3Npb24gd2hlbiBjb21tdW5pY2F0aW9uIHRyb3VibGUgb2NjdXJzIGJldHdlZW4gdGhlIFZQTiBDbGllbnQgLyBWUE4gU2VydmVyLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6VGltZU91dF91MzJcIl0gPSAwO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IE1heGltdW0gTnVtYmVyIG9mIE1BQyBBZGRyZXNzZXMuIEZvciBzZXNzaW9ucyB3aXRoIHRoaXMgcG9saWN5IHNldHRpbmcsIHRoaXMgbGltaXRzIHRoZSBudW1iZXIgb2YgTUFDIGFkZHJlc3NlcyBwZXIgc2Vzc2lvbi4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5Ok1heE1hY191MzJcIl0gPSAwO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IE1heGltdW0gTnVtYmVyIG9mIElQIEFkZHJlc3NlcyAoSVB2NCkuIEZvciBzZXNzaW9ucyB3aXRoIHRoaXMgcG9saWN5IHNldHRpbmcsIHRoaXMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgSVB2NCBhZGRyZXNzZXMgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZCBmb3IgYSBzaW5nbGUgc2Vzc2lvbi4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5Ok1heElQX3UzMlwiXSA9IDA7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogVXBsb2FkIEJhbmR3aWR0aC4gRm9yIHNlc3Npb25zIHdpdGggdGhpcyBwb2xpY3kgc2V0dGluZywgdGhpcyBsaW1pdHMgdGhlIHRyYWZmaWMgYmFuZHdpZHRoIHRoYXQgaXMgaW4gdGhlIGlud2FyZHMgZGlyZWN0aW9uIGZyb20gb3V0c2lkZSB0byBpbnNpZGUgdGhlIFZpcnR1YWwgSHViLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6TWF4VXBsb2FkX3UzMlwiXSA9IDA7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogRG93bmxvYWQgQmFuZHdpZHRoLiBGb3Igc2Vzc2lvbnMgd2l0aCB0aGlzIHBvbGljeSBzZXR0aW5nLCB0aGlzIGxpbWl0cyB0aGUgdHJhZmZpYyBiYW5kd2lkdGggdGhhdCBpcyBpbiB0aGUgb3V0d2FyZHMgZGlyZWN0aW9uIGZyb20gaW5zaWRlIHRoZSBWaXJ0dWFsIEh1YiB0byBvdXRzaWRlIHRoZSBWaXJ0dWFsIEh1Yi4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5Ok1heERvd25sb2FkX3UzMlwiXSA9IDA7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogRGVueSBDaGFuZ2luZyBQYXNzd29yZC4gVGhlIHVzZXJzIHdoaWNoIHVzZSBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiB3aXRoIHRoaXMgcG9saWN5IHNldHRpbmcgYXJlIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSB0aGVpciBvd24gcGFzc3dvcmQgZnJvbSB0aGUgVlBOIENsaWVudCBNYW5hZ2VyIG9yIHNpbWlsYXIuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpGaXhQYXNzd29yZF9ib29sXCJdID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogTWF4aW11bSBOdW1iZXIgb2YgTXVsdGlwbGUgTG9naW5zLiBVc2VycyB3aXRoIHRoaXMgcG9saWN5IHNldHRpbmcgYXJlIHVuYWJsZSB0byBoYXZlIG1vcmUgdGhhbiB0aGlzIG51bWJlciBvZiBjb25jdXJyZW50IGxvZ2lucy4gQnJpZGdlIE1vZGUgc2Vzc2lvbnMgYXJlIG5vdCBzdWJqZWN0cyB0byB0aGlzIHBvbGljeS4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5Ok11bHRpTG9naW5zX3UzMlwiXSA9IDA7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogRGVueSBWb0lQIC8gUW9TIEZ1bmN0aW9uLiBVc2VycyB3aXRoIHRoaXMgc2VjdXJpdHkgcG9saWN5IGFyZSB1bmFibGUgdG8gdXNlIFZvSVAgLyBRb1MgZnVuY3Rpb25zIGluIFZQTiBjb25uZWN0aW9uIHNlc3Npb25zLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6Tm9Rb1NfYm9vbFwiXSA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IEZpbHRlciBSUyAvIFJBIFBhY2tldHMgKElQdjYpLiBBbGwgSUNNUHY2IHBhY2tldHMgd2hpY2ggdGhlIG1lc3NhZ2UtdHlwZSBpcyAxMzMgKFJvdXRlciBTb2xpY2l0YXRpb24pIG9yIDEzNCAoUm91dGVyIEFkdmVydGlzZW1lbnQpIGluIHNlc3Npb25zIGRlZmluZWQgdGhpcyBwb2xpY3kgd2lsbCBiZSBmaWx0ZXJlZC4gQXMgYSByZXN1bHQsIGFuIElQdjYgY2xpZW50IHdpbGwgYmUgdW5hYmxlIHRvIHVzZSBJUHY2IGFkZHJlc3MgcHJlZml4IGF1dG8gZGV0ZWN0aW9uIGFuZCBJUHY2IGRlZmF1bHQgZ2F0ZXdheSBhdXRvIGRldGVjdGlvbi4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5OlJTYW5kUkFGaWx0ZXJfYm9vbFwiXSA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IEZpbHRlciBSQSBQYWNrZXRzIChJUHY2KS4gQWxsIElDTVB2NiBwYWNrZXRzIHdoaWNoIHRoZSBtZXNzYWdlLXR5cGUgaXMgMTM0IChSb3V0ZXIgQWR2ZXJ0aXNlbWVudCkgaW4gc2Vzc2lvbnMgZGVmaW5lZCB0aGlzIHBvbGljeSB3aWxsIGJlIGZpbHRlcmVkLiBBcyBhIHJlc3VsdCwgYSBtYWxpY2lvdXMgdXNlcnMgd2lsbCBiZSB1bmFibGUgdG8gc3ByZWFkIGlsbGVnYWwgSVB2NiBwcmVmaXggb3IgZGVmYXVsdCBnYXRld2F5IGFkdmVydGlzZW1lbnRzIG9uIHRoZSBuZXR3b3JrLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6UkFGaWx0ZXJfYm9vbFwiXSA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IEZpbHRlciBESENQIFBhY2tldHMgKElQdjYpLiBBbGwgSVB2NiBESENQIHBhY2tldHMgaW4gc2Vzc2lvbnMgZGVmaW5lZCB0aGlzIHBvbGljeSB3aWxsIGJlIGZpbHRlcmVkLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6REhDUHY2RmlsdGVyX2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBEaXNhbGxvdyBESENQIFNlcnZlciBPcGVyYXRpb24gKElQdjYpLiBDb21wdXRlcnMgY29ubmVjdGVkIHRvIHNlc3Npb25zIHRoYXQgaGF2ZSB0aGlzIHBvbGljeSBzZXR0aW5nIHdpbGwgbm90IGJlIGFsbG93ZWQgdG8gYmVjb21lIGEgREhDUCBzZXJ2ZXIgYW5kIGRpc3RyaWJ1dGUgSVB2NiBhZGRyZXNzZXMgdG8gREhDUCBjbGllbnRzLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6REhDUHY2Tm9TZXJ2ZXJfYm9vbFwiXSA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IERlbnkgUm91dGluZyBPcGVyYXRpb24gKElQdjYpLiBJUHY2IHJvdXRpbmcgd2lsbCBiZSBkZW5pZWQgZm9yIHNlc3Npb25zIHRoYXQgaGF2ZSB0aGlzIHBvbGljeSBzZXR0aW5nLiBFdmVuIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBJUCByb3V0ZXIgaXMgb3BlcmF0aW5nIG9uIHRoZSB1c2VyIGNsaWVudCBzaWRlLCBjb21tdW5pY2F0aW9uIHdpbGwgbm90IGJlIHBvc3NpYmxlLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6Tm9Sb3V0aW5nVjZfYm9vbFwiXSA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IERlbnkgSVAgQWRkcmVzcyBEdXBsaWNhdGlvbiAoSVB2NikuIFRoZSB1c2Ugb2YgZHVwbGljYXRpbmcgSVB2NiBhZGRyZXNzZXMgdGhhdCBhcmUgaW4gdXNlIGJ5IGNvbXB1dGVycyBvZiBkaWZmZXJlbnQgc2Vzc2lvbnMgY2Fubm90IGJlIHVzZWQgYnkgc2Vzc2lvbnMgd2l0aCB0aGlzIHBvbGljeSBzZXR0aW5nLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6Q2hlY2tJUHY2X2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBEZW55IE9wZXJhdGlvbiBhcyBUQ1AvSVAgU2VydmVyIChJUHY2KS4gQ29tcHV0ZXJzIG9mIHNlc3Npb25zIHdpdGggdGhpcyBwb2xpY3kgc2V0dGluZyBjYW4ndCBsaXN0ZW4gYW5kIGFjY2VwdCBUQ1AvSVAgY29ubmVjdGlvbnMgaW4gSVB2Ni4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5Ok5vU2VydmVyVjZfYm9vbFwiXSA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IE1heGltdW0gTnVtYmVyIG9mIElQIEFkZHJlc3NlcyAoSVB2NikuIEZvciBzZXNzaW9ucyB3aXRoIHRoaXMgcG9saWN5IHNldHRpbmcsIHRoaXMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgSVB2NiBhZGRyZXNzZXMgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZCBmb3IgYSBzaW5nbGUgc2Vzc2lvbi4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5Ok1heElQdjZfdTMyXCJdID0gMDtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBEaXNhbGxvdyBQYXNzd29yZCBTYXZlIGluIFZQTiBDbGllbnQuIEZvciB1c2VycyB3aXRoIHRoaXMgcG9saWN5IHNldHRpbmcsIHdoZW4gdGhlIHVzZXIgaXMgdXNpbmcgKnN0YW5kYXJkKiBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiwgdGhlIHVzZXIgd2lsbCBiZSB1bmFibGUgdG8gc2F2ZSB0aGUgcGFzc3dvcmQgaW4gVlBOIENsaWVudC4gVGhlIHVzZXIgd2lsbCBiZSByZXF1aXJlZCB0byBpbnB1dCBwYXNzd29yZHMgZm9yIGV2ZXJ5IHRpbWUgdG8gY29ubmVjdCBhIFZQTi4gVGhpcyB3aWxsIGltcHJvdmUgdGhlIHNlY3VyaXR5LiBJZiB0aGlzIHBvbGljeSBpcyBlbmFibGVkLCBWUE4gQ2xpZW50IFZlcnNpb24gMi4wIHdpbGwgYmUgZGVuaWVkIHRvIGFjY2Vzcy4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5Ok5vU2F2ZVBhc3N3b3JkX2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBWUE4gQ2xpZW50IEF1dG9tYXRpYyBEaXNjb25uZWN0LiBGb3IgdXNlcnMgd2l0aCB0aGlzIHBvbGljeSBzZXR0aW5nLCBhIHVzZXIncyBWUE4gc2Vzc2lvbiB3aWxsIGJlIGRpc2Nvbm5lY3RlZCBhdXRvbWF0aWNhbGx5IGFmdGVyIHRoZSBzcGVjaWZpYyBwZXJpb2Qgd2lsbCBlbGFwc2UuIEluIHRoaXMgY2FzZSBubyBhdXRvbWF0aWMgcmUtY29ubmVjdGlvbiB3aWxsIGJlIHBlcmZvcm1lZC4gVGhpcyBjYW4gcHJldmVudCBhIGxvdCBvZiBpbmFjdGl2ZSBWUE4gU2Vzc2lvbnMuIElmIHRoaXMgcG9saWN5IGlzIGVuYWJsZWQsIFZQTiBDbGllbnQgVmVyc2lvbiAyLjAgd2lsbCBiZSBkZW5pZWQgdG8gYWNjZXNzLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6QXV0b0Rpc2Nvbm5lY3RfdTMyXCJdID0gMDtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBGaWx0ZXIgQWxsIElQdjQgUGFja2V0cy4gQWxsIElQdjQgYW5kIEFSUCBwYWNrZXRzIGluIHNlc3Npb25zIGRlZmluZWQgdGhpcyBwb2xpY3kgd2lsbCBiZSBmaWx0ZXJlZC4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5OkZpbHRlcklQdjRfYm9vbFwiXSA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IEZpbHRlciBBbGwgSVB2NiBQYWNrZXRzLiBBbGwgSVB2NiBwYWNrZXRzIGluIHNlc3Npb25zIGRlZmluZWQgdGhpcyBwb2xpY3kgd2lsbCBiZSBmaWx0ZXJlZC4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5OkZpbHRlcklQdjZfYm9vbFwiXSA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IEZpbHRlciBBbGwgTm9uLUlQIFBhY2tldHMuIEFsbCBub24tSVAgcGFja2V0cyBpbiBzZXNzaW9ucyBkZWZpbmVkIHRoaXMgcG9saWN5IHdpbGwgYmUgZmlsdGVyZWQuIFwiTm9uLUlQIHBhY2tldFwiIG1lYW4gYSBwYWNrZXQgd2hpY2ggaXMgbm90IElQdjQsIEFSUCBub3IgSVB2Ni4gQW55IHRhZ2dlZC1WTEFOIHBhY2tldHMgdmlhIHRoZSBWaXJ0dWFsIEh1YiB3aWxsIGJlIHJlZ2FyZGVkIGFzIG5vbi1JUCBwYWNrZXRzLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6RmlsdGVyTm9uSVBfYm9vbFwiXSA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IE5vIERlZmF1bHQtUm91dGVyIG9uIElQdjYgUkEuIEluIGFsbCBWUE4gU2Vzc2lvbnMgZGVmaW5lcyB0aGlzIHBvbGljeSwgYW55IElQdjYgUkEgKFJvdXRlciBBZHZlcnRpc2VtZW50KSBwYWNrZXQgd2l0aCBub24temVybyB2YWx1ZSBpbiB0aGUgcm91dGVyLWxpZmV0aW1lIHdpbGwgc2V0IHRvIHplcm8tdmFsdWUuIFRoaXMgaXMgZWZmZWN0aXZlIHRvIGF2b2lkIHRoZSBob3JyaWJsZSBiZWhhdmlvciBmcm9tIHRoZSBJUHY2IHJvdXRpbmcgY29uZnVzaW9uIHdoaWNoIGlzIGNhdXNlZCBieSB0aGUgVlBOIGNsaWVudCdzIGF0dGVtcHRzIHRvIHVzZSB0aGUgcmVtb3RlLXNpZGUgSVB2NiByb3V0ZXIgYXMgaXRzIGxvY2FsIElQdjYgcm91dGVyLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6Tm9JUHY2RGVmYXVsdFJvdXRlckluUkFfYm9vbFwiXSA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IE5vIERlZmF1bHQtUm91dGVyIG9uIElQdjYgUkEgKHBoeXNpY2FsIElQdjYpLiBJbiBhbGwgVlBOIFNlc3Npb25zIGRlZmluZXMgdGhpcyBwb2xpY3kgKG9ubHkgd2hlbiB0aGUgcGh5c2ljYWwgY29tbXVuaWNhdGlvbiBwcm90b2NvbCBiZXR3ZWVuIFZQTiBDbGllbnQgLyBWUE4gQnJpZGdlIGFuZCBWUE4gU2VydmVyIGlzIElQdjYpLCBhbnkgSVB2NiBSQSAoUm91dGVyIEFkdmVydGlzZW1lbnQpIHBhY2tldCB3aXRoIG5vbi16ZXJvIHZhbHVlIGluIHRoZSByb3V0ZXItbGlmZXRpbWUgd2lsbCBzZXQgdG8gemVyby12YWx1ZS4gVGhpcyBpcyBlZmZlY3RpdmUgdG8gYXZvaWQgdGhlIGhvcnJpYmxlIGJlaGF2aW9yIGZyb20gdGhlIElQdjYgcm91dGluZyBjb25mdXNpb24gd2hpY2ggaXMgY2F1c2VkIGJ5IHRoZSBWUE4gY2xpZW50J3MgYXR0ZW1wdHMgdG8gdXNlIHRoZSByZW1vdGUtc2lkZSBJUHY2IHJvdXRlciBhcyBpdHMgbG9jYWwgSVB2NiByb3V0ZXIuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpOb0lQdjZEZWZhdWx0Um91dGVySW5SQVdoZW5JUHY2X2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBWTEFOIElEIChJRUVFODAyLjFRKS4gWW91IGNhbiBzcGVjaWZ5IHRoZSBWTEFOIElEIG9uIHRoZSBzZWN1cml0eSBwb2xpY3kuIEFsbCBWUE4gU2Vzc2lvbnMgZGVmaW5lcyB0aGlzIHBvbGljeSwgYWxsIEV0aGVybmV0IHBhY2tldHMgdG93YXJkIHRoZSBWaXJ0dWFsIEh1YiBmcm9tIHRoZSB1c2VyIHdpbGwgYmUgaW5zZXJ0ZWQgYSBWTEFOIHRhZyAoSUVFRSA4MDIuMVEpIHdpdGggdGhlIFZMQU4gSUQuIFRoZSB1c2VyIGNhbiBhbHNvIHJlY2VpdmUgb25seSBwYWNrZXRzIHdpdGggYSBWTEFOIHRhZyB3aGljaCBoYXMgdGhlIHNhbWUgVkxBTiBJRC4gKFJlY2VpdmluZyBwcm9jZXNzIHJlbW92ZXMgdGhlIFZMQU4gdGFnIGF1dG9tYXRpY2FsbHkuKSBBbnkgRXRoZXJuZXQgcGFja2V0cyB3aXRoIGFueSBvdGhlciBWTEFOIElEcyBvciBub24tVkxBTiBwYWNrZXRzIHdpbGwgbm90IGJlIHJlY2VpdmVkLiBBbGwgVlBOIFNlc3Npb25zIHdpdGhvdXQgdGhpcyBwb2xpY3kgZGVmaW5pdGlvbiBjYW4gc2VuZCAvIHJlY2VpdmUgYW55IGtpbmRzIG9mIEV0aGVybmV0IHBhY2tldHMgcmVnYXJkbGVzcyBvZiBWTEFOIHRhZ3MsIGFuZCBWTEFOIHRhZ3MgYXJlIG5vdCBpbnNlcnRlZCBvciByZW1vdmVkIGF1dG9tYXRpY2FsbHkuIEFueSB0YWdnZWQtVkxBTiBwYWNrZXRzIHZpYSB0aGUgVmlydHVhbCBIdWIgd2lsbCBiZSByZWdhcmRlZCBhcyBub24tSVAgcGFja2V0cy4gVGhlcmVmb3JlLCB0YWdnZWQtVkxBTiBwYWNrZXRzIGFyZSBub3Qgc3ViamVjdHMgZm9yIElQdjQgLyBJUHY2IHNlY3VyaXR5IHBvbGljaWVzLCBhY2Nlc3MgbGlzdHMgbm9yIG90aGVyIElQdjQgLyBJUHY2IHNwZWNpZmljIGRlZXAgcHJvY2Vzc2luZy4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5OlZMYW5JZF91MzJcIl0gPSAwO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IFdoZXRoZXIgdmVyc2lvbiAzLjAgKG11c3QgYmUgdHJ1ZSkgKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5OlZlcjNfYm9vbFwiXSA9IGZhbHNlO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjU2V0R3JvdXA7XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjU2V0R3JvdXAgPSBWcG5ScGNTZXRHcm91cDtcclxuLyoqIEh1YiB0eXBlcyAqL1xyXG52YXIgVnBuUnBjSHViVHlwZTtcclxuKGZ1bmN0aW9uIChWcG5ScGNIdWJUeXBlKSB7XHJcbiAgICAvKiogU3RhbmQtYWxvbmUgSFVCICovXHJcbiAgICBWcG5ScGNIdWJUeXBlW1ZwblJwY0h1YlR5cGVbXCJTdGFuZGFsb25lXCJdID0gMF0gPSBcIlN0YW5kYWxvbmVcIjtcclxuICAgIC8qKiBTdGF0aWMgSFVCICovXHJcbiAgICBWcG5ScGNIdWJUeXBlW1ZwblJwY0h1YlR5cGVbXCJGYXJtU3RhdGljXCJdID0gMV0gPSBcIkZhcm1TdGF0aWNcIjtcclxuICAgIC8qKiBEeW5hbWljIEhVQiAqL1xyXG4gICAgVnBuUnBjSHViVHlwZVtWcG5ScGNIdWJUeXBlW1wiRmFybUR5bmFtaWNcIl0gPSAyXSA9IFwiRmFybUR5bmFtaWNcIjtcclxufSkoVnBuUnBjSHViVHlwZSA9IGV4cG9ydHMuVnBuUnBjSHViVHlwZSB8fCAoZXhwb3J0cy5WcG5ScGNIdWJUeXBlID0ge30pKTtcclxuLyoqIENyZWF0ZSBhIEhVQiAqL1xyXG52YXIgVnBuUnBjQ3JlYXRlSHViID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwblJwY0NyZWF0ZUh1YicgY2xhc3M6IENyZWF0ZSBhIEhVQiAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjQ3JlYXRlSHViKGluaXQpIHtcclxuICAgICAgICAvKiogU3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgVmlydHVhbCBIdWIgdG8gY3JlYXRlIC8gdXBkYXRlLiAqL1xyXG4gICAgICAgIHRoaXMuSHViTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBTcGVjaWZ5IGFuIGFkbWluaXN0cmF0b3IgcGFzc3dvcmQgd2hlbiB0aGUgYWRtaW5pc3RyYXRvciBwYXNzd29yZCBpcyBnb2luZyB0byBiZSBzZXQgZm9yIHRoZSBWaXJ0dWFsIEh1Yi4gT24gdGhlIHVwZGF0ZSwgbGVhdmUgaXQgdG8gZW1wdHkgc3RyaW5nIGlmIHlvdSBkb24ndCB3YW50IHRvIGNoYW5nZSB0aGUgcGFzc3dvcmQuICovXHJcbiAgICAgICAgdGhpcy5BZG1pblBhc3N3b3JkUGxhaW5UZXh0X3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIE9ubGluZSBmbGFnICovXHJcbiAgICAgICAgdGhpcy5PbmxpbmVfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBNYXhpbXVtIG51bWJlciBvZiBWUE4gc2Vzc2lvbnMgKi9cclxuICAgICAgICB0aGlzLk1heFNlc3Npb25fdTMyID0gMDtcclxuICAgICAgICAvKiogTm8gRW51bSBmbGFnLiBCeSBlbmFibGluZyB0aGlzIG9wdGlvbiwgdGhlIFZQTiBDbGllbnQgdXNlciB3aWxsIGJlIHVuYWJsZSB0byBlbnVtZXJhdGUgdGhpcyBWaXJ0dWFsIEh1YiBldmVuIGlmIHRoZXkgc2VuZCBhIFZpcnR1YWwgSHViIGVudW1lcmF0aW9uIHJlcXVlc3QgdG8gdGhlIFZQTiBTZXJ2ZXIuICovXHJcbiAgICAgICAgdGhpcy5Ob0VudW1fYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBUeXBlIG9mIHRoZSBWaXJ0dWFsIEh1YiAoVmFsaWQgb25seSBmb3IgQ2x1c3RlcmVkIFZQTiBTZXJ2ZXJzKSAqL1xyXG4gICAgICAgIHRoaXMuSHViVHlwZV91MzIgPSAwO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjQ3JlYXRlSHViO1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY0NyZWF0ZUh1YiA9IFZwblJwY0NyZWF0ZUh1YjtcclxudmFyIFZwblJwY0NsaWVudEF1dGhUeXBlO1xyXG4oZnVuY3Rpb24gKFZwblJwY0NsaWVudEF1dGhUeXBlKSB7XHJcbiAgICAvKiogQW5vbnltb3VzIGF1dGhlbnRpY2F0aW9uICovXHJcbiAgICBWcG5ScGNDbGllbnRBdXRoVHlwZVtWcG5ScGNDbGllbnRBdXRoVHlwZVtcIkFub255bW91c1wiXSA9IDBdID0gXCJBbm9ueW1vdXNcIjtcclxuICAgIC8qKiBTSEEtMCBoYXNoZWQgcGFzc3dvcmQgYXV0aGVudGljYXRpb24gKi9cclxuICAgIFZwblJwY0NsaWVudEF1dGhUeXBlW1ZwblJwY0NsaWVudEF1dGhUeXBlW1wiU0hBMF9IYXNoZWRfUGFzc3dvcmRcIl0gPSAxXSA9IFwiU0hBMF9IYXNoZWRfUGFzc3dvcmRcIjtcclxuICAgIC8qKiBQbGFpbiBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiAqL1xyXG4gICAgVnBuUnBjQ2xpZW50QXV0aFR5cGVbVnBuUnBjQ2xpZW50QXV0aFR5cGVbXCJQbGFpblBhc3N3b3JkXCJdID0gMl0gPSBcIlBsYWluUGFzc3dvcmRcIjtcclxuICAgIC8qKiBDZXJ0aWZpY2F0ZSBhdXRoZW50aWNhdGlvbiAqL1xyXG4gICAgVnBuUnBjQ2xpZW50QXV0aFR5cGVbVnBuUnBjQ2xpZW50QXV0aFR5cGVbXCJDZXJ0XCJdID0gM10gPSBcIkNlcnRcIjtcclxufSkoVnBuUnBjQ2xpZW50QXV0aFR5cGUgPSBleHBvcnRzLlZwblJwY0NsaWVudEF1dGhUeXBlIHx8IChleHBvcnRzLlZwblJwY0NsaWVudEF1dGhUeXBlID0ge30pKTtcclxuLyoqIENyZWF0ZSBhbmQgc2V0IG9mIGxpbmsgKi9cclxudmFyIFZwblJwY0NyZWF0ZUxpbmsgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjQ3JlYXRlTGluaycgY2xhc3M6IENyZWF0ZSBhbmQgc2V0IG9mIGxpbmsgKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY0NyZWF0ZUxpbmsoaW5pdCkge1xyXG4gICAgICAgIC8qKiBUaGUgVmlydHVhbCBIdWIgbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuSHViTmFtZV9FeF9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBPbmxpbmUgZmxhZyAqL1xyXG4gICAgICAgIHRoaXMuT25saW5lX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogVGhlIGZsYWcgdG8gZW5hYmxlIHZhbGlkYXRpb24gZm9yIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgKi9cclxuICAgICAgICB0aGlzLkNoZWNrU2VydmVyQ2VydF9ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFRoZSBib2R5IG9mIHNlcnZlciBYLjUwOSBjZXJ0aWZpY2F0ZSB0byBjb21wYXJlLiBWYWxpZCBvbmx5IGlmIHRoZSBDaGVja1NlcnZlckNlcnRfYm9vbCBmbGFnIGlzIHRydWUuICovXHJcbiAgICAgICAgdGhpcy5TZXJ2ZXJDZXJ0X2JpbiA9IG5ldyBVaW50OEFycmF5KFtdKTtcclxuICAgICAgICAvKiogQ2xpZW50IE9wdGlvbiBQYXJhbWV0ZXJzOiBTcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBDYXNjYWRlIENvbm5lY3Rpb24gKi9cclxuICAgICAgICB0aGlzLkFjY291bnROYW1lX3V0ZiA9IFwiXCI7XHJcbiAgICAgICAgLyoqIENsaWVudCBPcHRpb24gUGFyYW1ldGVyczogU3BlY2lmeSB0aGUgaG9zdG5hbWUgb2YgdGhlIGRlc3RpbmF0aW9uIFZQTiBTZXJ2ZXIuIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGJ5IElQIGFkZHJlc3MuICovXHJcbiAgICAgICAgdGhpcy5Ib3N0bmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBDbGllbnQgT3B0aW9uIFBhcmFtZXRlcnM6IFNwZWNpZnkgdGhlIHBvcnQgbnVtYmVyIG9mIHRoZSBkZXN0aW5hdGlvbiBWUE4gU2VydmVyLiAqL1xyXG4gICAgICAgIHRoaXMuUG9ydF91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBDbGllbnQgT3B0aW9uIFBhcmFtZXRlcnM6IFRoZSB0eXBlIG9mIHRoZSBwcm94eSBzZXJ2ZXIgKi9cclxuICAgICAgICB0aGlzLlByb3h5VHlwZV91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBDbGllbnQgT3B0aW9uIFBhcmFtZXRlcnM6IFRoZSBob3N0bmFtZSBvciBJUCBhZGRyZXNzIG9mIHRoZSBwcm94eSBzZXJ2ZXIgbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuUHJveHlOYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIENsaWVudCBPcHRpb24gUGFyYW1ldGVyczogVGhlIHBvcnQgbnVtYmVyIG9mIHRoZSBwcm94eSBzZXJ2ZXIgKi9cclxuICAgICAgICB0aGlzLlByb3h5UG9ydF91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBDbGllbnQgT3B0aW9uIFBhcmFtZXRlcnM6IFRoZSB1c2VybmFtZSB0byBjb25uZWN0IHRvIHRoZSBwcm94eSBzZXJ2ZXIgKi9cclxuICAgICAgICB0aGlzLlByb3h5VXNlcm5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogQ2xpZW50IE9wdGlvbiBQYXJhbWV0ZXJzOiBUaGUgcGFzc3dvcmQgdG8gY29ubmVjdCB0byB0aGUgcHJveHkgc2VydmVyICovXHJcbiAgICAgICAgdGhpcy5Qcm94eVBhc3N3b3JkX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIENsaWVudCBPcHRpb24gUGFyYW1ldGVyczogVGhlIFZpcnR1YWwgSHViIG9uIHRoZSBkZXN0aW5hdGlvbiBWUE4gU2VydmVyICovXHJcbiAgICAgICAgdGhpcy5IdWJOYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIENsaWVudCBPcHRpb24gUGFyYW1ldGVyczogTnVtYmVyIG9mIFRDUCBDb25uZWN0aW9ucyB0byBVc2UgaW4gVlBOIENvbW11bmljYXRpb24gKi9cclxuICAgICAgICB0aGlzLk1heENvbm5lY3Rpb25fdTMyID0gMDtcclxuICAgICAgICAvKiogQ2xpZW50IE9wdGlvbiBQYXJhbWV0ZXJzOiBUaGUgZmxhZyB0byBlbmFibGUgdGhlIGVuY3J5cHRpb24gb24gdGhlIGNvbW11bmljYXRpb24gKi9cclxuICAgICAgICB0aGlzLlVzZUVuY3J5cHRfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBDbGllbnQgT3B0aW9uIFBhcmFtZXRlcnM6IEVuYWJsZSAvIERpc2FibGUgRGF0YSBDb21wcmVzc2lvbiB3aGVuIENvbW11bmljYXRpbmcgYnkgQ2FzY2FkZSBDb25uZWN0aW9uICovXHJcbiAgICAgICAgdGhpcy5Vc2VDb21wcmVzc19ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIENsaWVudCBPcHRpb24gUGFyYW1ldGVyczogU3BlY2lmeSB0cnVlIHdoZW4gZW5hYmxpbmcgaGFsZiBkdXBsZXggbW9kZS4gV2hlbiB1c2luZyB0d28gb3IgbW9yZSBUQ1AgY29ubmVjdGlvbnMgZm9yIFZQTiBjb21tdW5pY2F0aW9uLCBpdCBpcyBwb3NzaWJsZSB0byB1c2UgSGFsZiBEdXBsZXggTW9kZS4gQnkgZW5hYmxpbmcgaGFsZiBkdXBsZXggbW9kZSBpdCBpcyBwb3NzaWJsZSB0byBhdXRvbWF0aWNhbGx5IGZpeCBkYXRhIHRyYW5zbWlzc2lvbiBkaXJlY3Rpb24gYXMgaGFsZiBhbmQgaGFsZiBmb3IgZWFjaCBUQ1AgY29ubmVjdGlvbi4gSW4gdGhlIGNhc2Ugd2hlcmUgYSBWUE4gdXNpbmcgOCBUQ1AgY29ubmVjdGlvbnMgaXMgZXN0YWJsaXNoZWQsIGZvciBleGFtcGxlLCB3aGVuIGhhbGYtZHVwbGV4IGlzIGVuYWJsZWQsIGNvbW11bmljYXRpb24gY2FuIGJlIGZpeGVzIHNvIHRoYXQgNCBUQ1AgY29ubmVjdGlvbnMgYXJlIGRlZGljYXRlZCB0byB0aGUgdXBsb2FkIGRpcmVjdGlvbiBhbmQgdGhlIG90aGVyIDQgY29ubmVjdGlvbnMgYXJlIGRlZGljYXRlZCB0byB0aGUgZG93bmxvYWQgZGlyZWN0aW9uLiAqL1xyXG4gICAgICAgIHRoaXMuSGFsZkNvbm5lY3Rpb25fYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBDbGllbnQgT3B0aW9uIFBhcmFtZXRlcnM6IENvbm5lY3Rpb24gYXR0ZW1wdCBpbnRlcnZhbCB3aGVuIGFkZGl0aW9uYWwgY29ubmVjdGlvbiB3aWxsIGJlIGVzdGFibGlzaGVkICovXHJcbiAgICAgICAgdGhpcy5BZGRpdGlvbmFsQ29ubmVjdGlvbkludGVydmFsX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIENsaWVudCBPcHRpb24gUGFyYW1ldGVyczogQ29ubmVjdGlvbiBMaWZlIG9mIEVhY2ggVENQIENvbm5lY3Rpb24gKDAgZm9yIG5vIGtlZXAtYWxpdmUpICovXHJcbiAgICAgICAgdGhpcy5Db25uZWN0aW9uRGlzY29ubmVjdFNwYW5fdTMyID0gMDtcclxuICAgICAgICAvKiogQ2xpZW50IE9wdGlvbiBQYXJhbWV0ZXJzOiBEaXNhYmxlIFFvUyBDb250cm9sIEZ1bmN0aW9uIGlmIHRoZSB2YWx1ZSBpcyB0cnVlICovXHJcbiAgICAgICAgdGhpcy5EaXNhYmxlUW9TX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogQ2xpZW50IE9wdGlvbiBQYXJhbWV0ZXJzOiBEbyBub3QgdXNlIFRMUyAxLnggb2YgdGhlIHZhbHVlIGlzIHRydWUgKi9cclxuICAgICAgICB0aGlzLk5vVGxzMV9ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIENsaWVudCBPcHRpb24gUGFyYW1ldGVyczogRG8gbm90IHVzZSBVRFAgYWNjZWxlcmF0aW9uIG1vZGUgaWYgdGhlIHZhbHVlIGlzIHRydWUgKi9cclxuICAgICAgICB0aGlzLk5vVWRwQWNjZWxlcmF0aW9uX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogQXV0aGVudGljYXRpb24gdHlwZSAqL1xyXG4gICAgICAgIHRoaXMuQXV0aFR5cGVfdTMyID0gMDtcclxuICAgICAgICAvKiogVXNlciBuYW1lICovXHJcbiAgICAgICAgdGhpcy5Vc2VybmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBTSEEtMCBIYXNoZWQgcGFzc3dvcmQuIFZhbGlkIG9ubHkgaWYgQ2xpZW50QXV0aF9BdXRoVHlwZV91MzIgPT0gU0hBMF9IYXNoZWRfUGFzc3dvcmQgKDEpLiBUaGUgU0hBLTAgaGFzaGVkIHBhc3N3b3JkIG11c3QgYmUgY2FsdWNsYXRlZCBieSB0aGUgU0hBMChVcHBlckNhc2UodXNlcm5hbWVfYXNjaWlfc3RyaW5nKSArIHBhc3N3b3JkX2FzY2lpX3N0cmluZykuICovXHJcbiAgICAgICAgdGhpcy5IYXNoZWRQYXNzd29yZF9iaW4gPSBuZXcgVWludDhBcnJheShbXSk7XHJcbiAgICAgICAgLyoqIFBsYWludGV4dCBQYXNzd29yZC4gVmFsaWQgb25seSBpZiBDbGllbnRBdXRoX0F1dGhUeXBlX3UzMiA9PSBQbGFpblBhc3N3b3JkICgyKS4gKi9cclxuICAgICAgICB0aGlzLlBsYWluUGFzc3dvcmRfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogQ2xpZW50IGNlcnRpZmljYXRlLiBWYWxpZCBvbmx5IGlmIENsaWVudEF1dGhfQXV0aFR5cGVfdTMyID09IENlcnQgKDMpLiAqL1xyXG4gICAgICAgIHRoaXMuQ2xpZW50WF9iaW4gPSBuZXcgVWludDhBcnJheShbXSk7XHJcbiAgICAgICAgLyoqIENsaWVudCBwcml2YXRlIGtleSBvZiB0aGUgY2VydGlmaWNhdGUuIFZhbGlkIG9ubHkgaWYgQ2xpZW50QXV0aF9BdXRoVHlwZV91MzIgPT0gQ2VydCAoMykuICovXHJcbiAgICAgICAgdGhpcy5DbGllbnRLX2JpbiA9IG5ldyBVaW50OEFycmF5KFtdKTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBGaWx0ZXIgREhDUCBQYWNrZXRzIChJUHY0KS4gQWxsIElQdjQgREhDUCBwYWNrZXRzIGluIHNlc3Npb25zIGRlZmluZWQgdGhpcyBwb2xpY3kgd2lsbCBiZSBmaWx0ZXJlZC4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5OkRIQ1BGaWx0ZXJfYm9vbFwiXSA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IERpc2FsbG93IERIQ1AgU2VydmVyIE9wZXJhdGlvbiAoSVB2NCkuIENvbXB1dGVycyBjb25uZWN0ZWQgdG8gc2Vzc2lvbnMgdGhhdCBoYXZlIHRoaXMgcG9saWN5IHNldHRpbmcgd2lsbCBub3QgYmUgYWxsb3dlZCB0byBiZWNvbWUgYSBESENQIHNlcnZlciBhbmQgZGlzdHJpYnV0ZSBJUHY0IGFkZHJlc3NlcyB0byBESENQIGNsaWVudHMuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpESENQTm9TZXJ2ZXJfYm9vbFwiXSA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IEVuZm9yY2UgREhDUCBBbGxvY2F0ZWQgSVAgQWRkcmVzc2VzIChJUHY0KS4gQ29tcHV0ZXJzIGluIHNlc3Npb25zIHRoYXQgaGF2ZSB0aGlzIHBvbGljeSBzZXR0aW5nIHdpbGwgb25seSBiZSBhYmxlIHRvIHVzZSBJUHY0IGFkZHJlc3NlcyBhbGxvY2F0ZWQgYnkgYSBESENQIHNlcnZlciBvbiB0aGUgdmlydHVhbCBuZXR3b3JrIHNpZGUuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpESENQRm9yY2VfYm9vbFwiXSA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IFByb2hpYml0IHRoZSBkdXBsaWNhdGUgTUFDIGFkZHJlc3MgKi9cclxuICAgICAgICB0aGlzLlNlY1BvbF9DaGVja01hY19ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogUHJvaGliaXQgYSBkdXBsaWNhdGUgSVAgYWRkcmVzcyAoSVB2NCkgKi9cclxuICAgICAgICB0aGlzLlNlY1BvbF9DaGVja0lQX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBEZW55IE5vbi1BUlAgLyBOb24tREhDUCAvIE5vbi1JQ01QdjYgYnJvYWRjYXN0cy4gVGhlIHNlbmRpbmcgb3IgcmVjZWl2aW5nIG9mIGJyb2FkY2FzdCBwYWNrZXRzIHRoYXQgYXJlIG5vdCBBUlAgcHJvdG9jb2wsIERIQ1AgcHJvdG9jb2wsIG5vciBJQ01QdjYgb24gdGhlIHZpcnR1YWwgbmV0d29yayB3aWxsIG5vdCBiZSBhbGxvd2VkIGZvciBzZXNzaW9ucyB3aXRoIHRoaXMgcG9saWN5IHNldHRpbmcuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpBcnBEaGNwT25seV9ib29sXCJdID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogUHJpdmFjeSBGaWx0ZXIgTW9kZS4gQWxsIGRpcmVjdCBjb21tdW5pY2F0aW9uIGJldHdlZW4gc2Vzc2lvbnMgd2l0aCB0aGUgcHJpdmFjeSBmaWx0ZXIgbW9kZSBwb2xpY3kgc2V0dGluZyB3aWxsIGJlIGZpbHRlcmVkLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6UHJpdmFjeUZpbHRlcl9ib29sXCJdID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogRGVueSBPcGVyYXRpb24gYXMgVENQL0lQIFNlcnZlciAoSVB2NCkuIENvbXB1dGVycyBvZiBzZXNzaW9ucyB3aXRoIHRoaXMgcG9saWN5IHNldHRpbmcgY2FuJ3QgbGlzdGVuIGFuZCBhY2NlcHQgVENQL0lQIGNvbm5lY3Rpb25zIGluIElQdjQuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpOb1NlcnZlcl9ib29sXCJdID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogVW5saW1pdGVkIE51bWJlciBvZiBCcm9hZGNhc3RzLiBJZiBhIGNvbXB1dGVyIG9mIGEgc2Vzc2lvbiB3aXRoIHRoaXMgcG9saWN5IHNldHRpbmcgc2VuZHMgYnJvYWRjYXN0IHBhY2tldHMgb2YgYSBudW1iZXIgdW51c3VhbGx5IGxhcmdlciB0aGFuIHdoYXQgd291bGQgYmUgY29uc2lkZXJlZCBub3JtYWwgb24gdGhlIHZpcnR1YWwgbmV0d29yaywgdGhlcmUgd2lsbCBiZSBubyBhdXRvbWF0aWMgbGltaXRpbmcuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpOb0Jyb2FkY2FzdExpbWl0ZXJfYm9vbFwiXSA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IE1heGltdW0gTnVtYmVyIG9mIE1BQyBBZGRyZXNzZXMuIEZvciBzZXNzaW9ucyB3aXRoIHRoaXMgcG9saWN5IHNldHRpbmcsIHRoaXMgbGltaXRzIHRoZSBudW1iZXIgb2YgTUFDIGFkZHJlc3NlcyBwZXIgc2Vzc2lvbi4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5Ok1heE1hY191MzJcIl0gPSAwO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IE1heGltdW0gTnVtYmVyIG9mIElQIEFkZHJlc3NlcyAoSVB2NCkuIEZvciBzZXNzaW9ucyB3aXRoIHRoaXMgcG9saWN5IHNldHRpbmcsIHRoaXMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgSVB2NCBhZGRyZXNzZXMgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZCBmb3IgYSBzaW5nbGUgc2Vzc2lvbi4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5Ok1heElQX3UzMlwiXSA9IDA7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogVXBsb2FkIEJhbmR3aWR0aC4gRm9yIHNlc3Npb25zIHdpdGggdGhpcyBwb2xpY3kgc2V0dGluZywgdGhpcyBsaW1pdHMgdGhlIHRyYWZmaWMgYmFuZHdpZHRoIHRoYXQgaXMgaW4gdGhlIGlud2FyZHMgZGlyZWN0aW9uIGZyb20gb3V0c2lkZSB0byBpbnNpZGUgdGhlIFZpcnR1YWwgSHViLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6TWF4VXBsb2FkX3UzMlwiXSA9IDA7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogRG93bmxvYWQgQmFuZHdpZHRoLiBGb3Igc2Vzc2lvbnMgd2l0aCB0aGlzIHBvbGljeSBzZXR0aW5nLCB0aGlzIGxpbWl0cyB0aGUgdHJhZmZpYyBiYW5kd2lkdGggdGhhdCBpcyBpbiB0aGUgb3V0d2FyZHMgZGlyZWN0aW9uIGZyb20gaW5zaWRlIHRoZSBWaXJ0dWFsIEh1YiB0byBvdXRzaWRlIHRoZSBWaXJ0dWFsIEh1Yi4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5Ok1heERvd25sb2FkX3UzMlwiXSA9IDA7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogRmlsdGVyIFJTIC8gUkEgUGFja2V0cyAoSVB2NikuIEFsbCBJQ01QdjYgcGFja2V0cyB3aGljaCB0aGUgbWVzc2FnZS10eXBlIGlzIDEzMyAoUm91dGVyIFNvbGljaXRhdGlvbikgb3IgMTM0IChSb3V0ZXIgQWR2ZXJ0aXNlbWVudCkgaW4gc2Vzc2lvbnMgZGVmaW5lZCB0aGlzIHBvbGljeSB3aWxsIGJlIGZpbHRlcmVkLiBBcyBhIHJlc3VsdCwgYW4gSVB2NiBjbGllbnQgd2lsbCBiZSB1bmFibGUgdG8gdXNlIElQdjYgYWRkcmVzcyBwcmVmaXggYXV0byBkZXRlY3Rpb24gYW5kIElQdjYgZGVmYXVsdCBnYXRld2F5IGF1dG8gZGV0ZWN0aW9uLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6UlNhbmRSQUZpbHRlcl9ib29sXCJdID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogRmlsdGVyIHRoZSByb3V0ZXIgYWR2ZXJ0aXNlbWVudCBwYWNrZXQgKElQdjYpICovXHJcbiAgICAgICAgdGhpcy5TZWNQb2xfUkFGaWx0ZXJfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IEZpbHRlciBESENQIFBhY2tldHMgKElQdjYpLiBBbGwgSVB2NiBESENQIHBhY2tldHMgaW4gc2Vzc2lvbnMgZGVmaW5lZCB0aGlzIHBvbGljeSB3aWxsIGJlIGZpbHRlcmVkLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6REhDUHY2RmlsdGVyX2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBEaXNhbGxvdyBESENQIFNlcnZlciBPcGVyYXRpb24gKElQdjYpLiBDb21wdXRlcnMgY29ubmVjdGVkIHRvIHNlc3Npb25zIHRoYXQgaGF2ZSB0aGlzIHBvbGljeSBzZXR0aW5nIHdpbGwgbm90IGJlIGFsbG93ZWQgdG8gYmVjb21lIGEgREhDUCBzZXJ2ZXIgYW5kIGRpc3RyaWJ1dGUgSVB2NiBhZGRyZXNzZXMgdG8gREhDUCBjbGllbnRzLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6REhDUHY2Tm9TZXJ2ZXJfYm9vbFwiXSA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IFByb2hpYml0IHRoZSBkdXBsaWNhdGUgSVAgYWRkcmVzcyAoSVB2NikgKi9cclxuICAgICAgICB0aGlzLlNlY1BvbF9DaGVja0lQdjZfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IERlbnkgT3BlcmF0aW9uIGFzIFRDUC9JUCBTZXJ2ZXIgKElQdjYpLiBDb21wdXRlcnMgb2Ygc2Vzc2lvbnMgd2l0aCB0aGlzIHBvbGljeSBzZXR0aW5nIGNhbid0IGxpc3RlbiBhbmQgYWNjZXB0IFRDUC9JUCBjb25uZWN0aW9ucyBpbiBJUHY2LiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6Tm9TZXJ2ZXJWNl9ib29sXCJdID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogTWF4aW11bSBOdW1iZXIgb2YgSVAgQWRkcmVzc2VzIChJUHY2KS4gRm9yIHNlc3Npb25zIHdpdGggdGhpcyBwb2xpY3kgc2V0dGluZywgdGhpcyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBJUHY2IGFkZHJlc3NlcyB0aGF0IGNhbiBiZSByZWdpc3RlcmVkIGZvciBhIHNpbmdsZSBzZXNzaW9uLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6TWF4SVB2Nl91MzJcIl0gPSAwO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IEZpbHRlciBBbGwgSVB2NCBQYWNrZXRzLiBBbGwgSVB2NCBhbmQgQVJQIHBhY2tldHMgaW4gc2Vzc2lvbnMgZGVmaW5lZCB0aGlzIHBvbGljeSB3aWxsIGJlIGZpbHRlcmVkLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6RmlsdGVySVB2NF9ib29sXCJdID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogRmlsdGVyIEFsbCBJUHY2IFBhY2tldHMuIEFsbCBJUHY2IHBhY2tldHMgaW4gc2Vzc2lvbnMgZGVmaW5lZCB0aGlzIHBvbGljeSB3aWxsIGJlIGZpbHRlcmVkLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6RmlsdGVySVB2Nl9ib29sXCJdID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogRmlsdGVyIEFsbCBOb24tSVAgUGFja2V0cy4gQWxsIG5vbi1JUCBwYWNrZXRzIGluIHNlc3Npb25zIGRlZmluZWQgdGhpcyBwb2xpY3kgd2lsbCBiZSBmaWx0ZXJlZC4gXCJOb24tSVAgcGFja2V0XCIgbWVhbiBhIHBhY2tldCB3aGljaCBpcyBub3QgSVB2NCwgQVJQIG5vciBJUHY2LiBBbnkgdGFnZ2VkLVZMQU4gcGFja2V0cyB2aWEgdGhlIFZpcnR1YWwgSHViIHdpbGwgYmUgcmVnYXJkZWQgYXMgbm9uLUlQIHBhY2tldHMuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpGaWx0ZXJOb25JUF9ib29sXCJdID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogTm8gRGVmYXVsdC1Sb3V0ZXIgb24gSVB2NiBSQS4gSW4gYWxsIFZQTiBTZXNzaW9ucyBkZWZpbmVzIHRoaXMgcG9saWN5LCBhbnkgSVB2NiBSQSAoUm91dGVyIEFkdmVydGlzZW1lbnQpIHBhY2tldCB3aXRoIG5vbi16ZXJvIHZhbHVlIGluIHRoZSByb3V0ZXItbGlmZXRpbWUgd2lsbCBzZXQgdG8gemVyby12YWx1ZS4gVGhpcyBpcyBlZmZlY3RpdmUgdG8gYXZvaWQgdGhlIGhvcnJpYmxlIGJlaGF2aW9yIGZyb20gdGhlIElQdjYgcm91dGluZyBjb25mdXNpb24gd2hpY2ggaXMgY2F1c2VkIGJ5IHRoZSBWUE4gY2xpZW50J3MgYXR0ZW1wdHMgdG8gdXNlIHRoZSByZW1vdGUtc2lkZSBJUHY2IHJvdXRlciBhcyBpdHMgbG9jYWwgSVB2NiByb3V0ZXIuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpOb0lQdjZEZWZhdWx0Um91dGVySW5SQV9ib29sXCJdID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogVkxBTiBJRCAoSUVFRTgwMi4xUSkuIFlvdSBjYW4gc3BlY2lmeSB0aGUgVkxBTiBJRCBvbiB0aGUgc2VjdXJpdHkgcG9saWN5LiBBbGwgVlBOIFNlc3Npb25zIGRlZmluZXMgdGhpcyBwb2xpY3ksIGFsbCBFdGhlcm5ldCBwYWNrZXRzIHRvd2FyZCB0aGUgVmlydHVhbCBIdWIgZnJvbSB0aGUgdXNlciB3aWxsIGJlIGluc2VydGVkIGEgVkxBTiB0YWcgKElFRUUgODAyLjFRKSB3aXRoIHRoZSBWTEFOIElELiBUaGUgdXNlciBjYW4gYWxzbyByZWNlaXZlIG9ubHkgcGFja2V0cyB3aXRoIGEgVkxBTiB0YWcgd2hpY2ggaGFzIHRoZSBzYW1lIFZMQU4gSUQuIChSZWNlaXZpbmcgcHJvY2VzcyByZW1vdmVzIHRoZSBWTEFOIHRhZyBhdXRvbWF0aWNhbGx5LikgQW55IEV0aGVybmV0IHBhY2tldHMgd2l0aCBhbnkgb3RoZXIgVkxBTiBJRHMgb3Igbm9uLVZMQU4gcGFja2V0cyB3aWxsIG5vdCBiZSByZWNlaXZlZC4gQWxsIFZQTiBTZXNzaW9ucyB3aXRob3V0IHRoaXMgcG9saWN5IGRlZmluaXRpb24gY2FuIHNlbmQgLyByZWNlaXZlIGFueSBraW5kcyBvZiBFdGhlcm5ldCBwYWNrZXRzIHJlZ2FyZGxlc3Mgb2YgVkxBTiB0YWdzLCBhbmQgVkxBTiB0YWdzIGFyZSBub3QgaW5zZXJ0ZWQgb3IgcmVtb3ZlZCBhdXRvbWF0aWNhbGx5LiBBbnkgdGFnZ2VkLVZMQU4gcGFja2V0cyB2aWEgdGhlIFZpcnR1YWwgSHViIHdpbGwgYmUgcmVnYXJkZWQgYXMgbm9uLUlQIHBhY2tldHMuIFRoZXJlZm9yZSwgdGFnZ2VkLVZMQU4gcGFja2V0cyBhcmUgbm90IHN1YmplY3RzIGZvciBJUHY0IC8gSVB2NiBzZWN1cml0eSBwb2xpY2llcywgYWNjZXNzIGxpc3RzIG5vciBvdGhlciBJUHY0IC8gSVB2NiBzcGVjaWZpYyBkZWVwIHByb2Nlc3NpbmcuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpWTGFuSWRfdTMyXCJdID0gMDtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBXaGV0aGVyIHZlcnNpb24gMy4wIChtdXN0IGJlIHRydWUpICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpWZXIzX2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY0NyZWF0ZUxpbms7XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjQ3JlYXRlTGluayA9IFZwblJwY0NyZWF0ZUxpbms7XHJcbi8qKiBMaXN0ZW5lciAqL1xyXG52YXIgVnBuUnBjTGlzdGVuZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjTGlzdGVuZXInIGNsYXNzOiBMaXN0ZW5lciAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjTGlzdGVuZXIoaW5pdCkge1xyXG4gICAgICAgIC8qKiBQb3J0IG51bWJlciAoUmFuZ2U6IDEgLSA2NTUzNSkgKi9cclxuICAgICAgICB0aGlzLlBvcnRfdTMyID0gMDtcclxuICAgICAgICAvKiogQWN0aXZlIHN0YXRlICovXHJcbiAgICAgICAgdGhpcy5FbmFibGVfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjTGlzdGVuZXI7XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjTGlzdGVuZXIgPSBWcG5ScGNMaXN0ZW5lcjtcclxuLyoqIFVzZXIgYXV0aGVudGljYXRpb24gdHlwZSAoc2VydmVyIHNpZGUpICovXHJcbnZhciBWcG5ScGNVc2VyQXV0aFR5cGU7XHJcbihmdW5jdGlvbiAoVnBuUnBjVXNlckF1dGhUeXBlKSB7XHJcbiAgICAvKiogQW5vbnltb3VzIGF1dGhlbnRpY2F0aW9uICovXHJcbiAgICBWcG5ScGNVc2VyQXV0aFR5cGVbVnBuUnBjVXNlckF1dGhUeXBlW1wiQW5vbnltb3VzXCJdID0gMF0gPSBcIkFub255bW91c1wiO1xyXG4gICAgLyoqIFBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uICovXHJcbiAgICBWcG5ScGNVc2VyQXV0aFR5cGVbVnBuUnBjVXNlckF1dGhUeXBlW1wiUGFzc3dvcmRcIl0gPSAxXSA9IFwiUGFzc3dvcmRcIjtcclxuICAgIC8qKiBVc2VyIGNlcnRpZmljYXRlIGF1dGhlbnRpY2F0aW9uICovXHJcbiAgICBWcG5ScGNVc2VyQXV0aFR5cGVbVnBuUnBjVXNlckF1dGhUeXBlW1wiVXNlckNlcnRcIl0gPSAyXSA9IFwiVXNlckNlcnRcIjtcclxuICAgIC8qKiBSb290IGNlcnRpZmljYXRlIHdoaWNoIGlzIGlzc3VlZCBieSB0cnVzdGVkIENlcnRpZmljYXRlIEF1dGhvcml0eSAqL1xyXG4gICAgVnBuUnBjVXNlckF1dGhUeXBlW1ZwblJwY1VzZXJBdXRoVHlwZVtcIlJvb3RDZXJ0XCJdID0gM10gPSBcIlJvb3RDZXJ0XCI7XHJcbiAgICAvKiogUmFkaXVzIGF1dGhlbnRpY2F0aW9uICovXHJcbiAgICBWcG5ScGNVc2VyQXV0aFR5cGVbVnBuUnBjVXNlckF1dGhUeXBlW1wiUmFkaXVzXCJdID0gNF0gPSBcIlJhZGl1c1wiO1xyXG4gICAgLyoqIFdpbmRvd3MgTlQgYXV0aGVudGljYXRpb24gKi9cclxuICAgIFZwblJwY1VzZXJBdXRoVHlwZVtWcG5ScGNVc2VyQXV0aFR5cGVbXCJOVERvbWFpblwiXSA9IDVdID0gXCJOVERvbWFpblwiO1xyXG59KShWcG5ScGNVc2VyQXV0aFR5cGUgPSBleHBvcnRzLlZwblJwY1VzZXJBdXRoVHlwZSB8fCAoZXhwb3J0cy5WcG5ScGNVc2VyQXV0aFR5cGUgPSB7fSkpO1xyXG4vKiogQ3JlYXRlLCBjb25maWd1cmUsIGFuZCBnZXQgdGhlIHVzZXIgKi9cclxudmFyIFZwblJwY1NldFVzZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjU2V0VXNlcicgY2xhc3M6IENyZWF0ZSwgY29uZmlndXJlLCBhbmQgZ2V0IHRoZSB1c2VyICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNTZXRVc2VyKGluaXQpIHtcclxuICAgICAgICAvKiogVGhlIFZpcnR1YWwgSHViIG5hbWUgKi9cclxuICAgICAgICB0aGlzLkh1Yk5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogU3BlY2lmeSB0aGUgdXNlciBuYW1lIG9mIHRoZSB1c2VyICovXHJcbiAgICAgICAgdGhpcy5OYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIEFzc2lnbmVkIGdyb3VwIG5hbWUgZm9yIHRoZSB1c2VyICovXHJcbiAgICAgICAgdGhpcy5Hcm91cE5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogT3B0aW9uYWwgcmVhbCBuYW1lIChmdWxsIG5hbWUpIG9mIHRoZSB1c2VyLCBhbGxvdyB1c2luZyBhbnkgVW5pY29kZSBjaGFyYWN0ZXJzICovXHJcbiAgICAgICAgdGhpcy5SZWFsbmFtZV91dGYgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBPcHRpb25hbCBVc2VyIERlc2NyaXB0aW9uICovXHJcbiAgICAgICAgdGhpcy5Ob3RlX3V0ZiA9IFwiXCI7XHJcbiAgICAgICAgLyoqIENyZWF0aW9uIGRhdGUgYW5kIHRpbWUgKi9cclxuICAgICAgICB0aGlzLkNyZWF0ZWRUaW1lX2R0ID0gbmV3IERhdGUoKTtcclxuICAgICAgICAvKiogTGFzdCBtb2RpZmllZCBkYXRlIGFuZCB0aW1lICovXHJcbiAgICAgICAgdGhpcy5VcGRhdGVkVGltZV9kdCA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgLyoqIEV4cGlyYXRpb24gZGF0ZSBhbmQgdGltZSAqL1xyXG4gICAgICAgIHRoaXMuRXhwaXJlVGltZV9kdCA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgLyoqIEF1dGhlbnRpY2F0aW9uIG1ldGhvZCBvZiB0aGUgdXNlciAqL1xyXG4gICAgICAgIHRoaXMuQXV0aFR5cGVfdTMyID0gMDtcclxuICAgICAgICAvKiogVXNlciBwYXNzd29yZCwgdmFsaWQgb25seSBpZiBBdXRoVHlwZV91MzIgPT0gUGFzc3dvcmQoMSkuIFZhbGlkIG9ubHkgdG8gY3JlYXRlIG9yIHNldCBvcGVyYXRpb25zLiAqL1xyXG4gICAgICAgIHRoaXMuQXV0aF9QYXNzd29yZF9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBVc2VyIGNlcnRpZmljYXRlLCB2YWxpZCBvbmx5IGlmIEF1dGhUeXBlX3UzMiA9PSBVc2VyQ2VydCgyKS4gKi9cclxuICAgICAgICB0aGlzLlVzZXJYX2JpbiA9IG5ldyBVaW50OEFycmF5KFtdKTtcclxuICAgICAgICAvKiogQ2VydGlmaWNhdGUgU2VyaWFsIE51bWJlciwgb3B0aW9uYWwsIHZhbGlkIG9ubHkgaWYgQXV0aFR5cGVfdTMyID09IFJvb3RDZXJ0KDMpLiAqL1xyXG4gICAgICAgIHRoaXMuU2VyaWFsX2JpbiA9IG5ldyBVaW50OEFycmF5KFtdKTtcclxuICAgICAgICAvKiogQ2VydGlmaWNhdGUgQ29tbW9uIE5hbWUsIG9wdGlvbmFsLCB2YWxpZCBvbmx5IGlmIEF1dGhUeXBlX3UzMiA9PSBSb290Q2VydCgzKS4gKi9cclxuICAgICAgICB0aGlzLkNvbW1vbk5hbWVfdXRmID0gXCJcIjtcclxuICAgICAgICAvKiogVXNlcm5hbWUgaW4gUkFESVVTIHNlcnZlciwgb3B0aW9uYWwsIHZhbGlkIG9ubHkgaWYgQXV0aFR5cGVfdTMyID09IFJhZGl1cyg0KS4gKi9cclxuICAgICAgICB0aGlzLlJhZGl1c1VzZXJuYW1lX3V0ZiA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFVzZXJuYW1lIGluIE5UIERvbWFpbiBzZXJ2ZXIsIG9wdGlvbmFsLCB2YWxpZCBvbmx5IGlmIEF1dGhUeXBlX3UzMiA9PSBOVCg1KS4gKi9cclxuICAgICAgICB0aGlzLk50VXNlcm5hbWVfdXRmID0gXCJcIjtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIHRvdGFsIGxvZ2lucyBvZiB0aGUgdXNlciAqL1xyXG4gICAgICAgIHRoaXMuTnVtTG9naW5fdTMyID0gMDtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIGJyb2FkY2FzdCBwYWNrZXRzIChSZWN2KSAqL1xyXG4gICAgICAgIHRoaXNbXCJSZWN2LkJyb2FkY2FzdEJ5dGVzX3U2NFwiXSA9IDA7XHJcbiAgICAgICAgLyoqIEJyb2FkY2FzdCBieXRlcyAoUmVjdikgKi9cclxuICAgICAgICB0aGlzW1wiUmVjdi5Ccm9hZGNhc3RDb3VudF91NjRcIl0gPSAwO1xyXG4gICAgICAgIC8qKiBVbmljYXN0IGNvdW50IChSZWN2KSAqL1xyXG4gICAgICAgIHRoaXNbXCJSZWN2LlVuaWNhc3RCeXRlc191NjRcIl0gPSAwO1xyXG4gICAgICAgIC8qKiBVbmljYXN0IGJ5dGVzIChSZWN2KSAqL1xyXG4gICAgICAgIHRoaXNbXCJSZWN2LlVuaWNhc3RDb3VudF91NjRcIl0gPSAwO1xyXG4gICAgICAgIC8qKiBOdW1iZXIgb2YgYnJvYWRjYXN0IHBhY2tldHMgKFNlbmQpICovXHJcbiAgICAgICAgdGhpc1tcIlNlbmQuQnJvYWRjYXN0Qnl0ZXNfdTY0XCJdID0gMDtcclxuICAgICAgICAvKiogQnJvYWRjYXN0IGJ5dGVzIChTZW5kKSAqL1xyXG4gICAgICAgIHRoaXNbXCJTZW5kLkJyb2FkY2FzdENvdW50X3U2NFwiXSA9IDA7XHJcbiAgICAgICAgLyoqIFVuaWNhc3QgYnl0ZXMgKFNlbmQpICovXHJcbiAgICAgICAgdGhpc1tcIlNlbmQuVW5pY2FzdEJ5dGVzX3U2NFwiXSA9IDA7XHJcbiAgICAgICAgLyoqIFVuaWNhc3QgYnl0ZXMgKFNlbmQpICovXHJcbiAgICAgICAgdGhpc1tcIlNlbmQuVW5pY2FzdENvdW50X3U2NFwiXSA9IDA7XHJcbiAgICAgICAgLyoqIFRoZSBmbGFnIHdoZXRoZXIgdG8gdXNlIHNlY3VyaXR5IHBvbGljeSAqL1xyXG4gICAgICAgIHRoaXMuVXNlUG9saWN5X2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBBbGxvdyBBY2Nlc3MuIFRoZSB1c2Vycywgd2hpY2ggdGhpcyBwb2xpY3kgdmFsdWUgaXMgdHJ1ZSwgaGF2ZSBwZXJtaXNzaW9uIHRvIG1ha2UgVlBOIGNvbm5lY3Rpb24gdG8gVlBOIFNlcnZlci4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5OkFjY2Vzc19ib29sXCJdID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogRmlsdGVyIERIQ1AgUGFja2V0cyAoSVB2NCkuIEFsbCBJUHY0IERIQ1AgcGFja2V0cyBpbiBzZXNzaW9ucyBkZWZpbmVkIHRoaXMgcG9saWN5IHdpbGwgYmUgZmlsdGVyZWQuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpESENQRmlsdGVyX2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBEaXNhbGxvdyBESENQIFNlcnZlciBPcGVyYXRpb24gKElQdjQpLiBDb21wdXRlcnMgY29ubmVjdGVkIHRvIHNlc3Npb25zIHRoYXQgaGF2ZSB0aGlzIHBvbGljeSBzZXR0aW5nIHdpbGwgbm90IGJlIGFsbG93ZWQgdG8gYmVjb21lIGEgREhDUCBzZXJ2ZXIgYW5kIGRpc3RyaWJ1dGUgSVB2NCBhZGRyZXNzZXMgdG8gREhDUCBjbGllbnRzLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6REhDUE5vU2VydmVyX2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBFbmZvcmNlIERIQ1AgQWxsb2NhdGVkIElQIEFkZHJlc3NlcyAoSVB2NCkuIENvbXB1dGVycyBpbiBzZXNzaW9ucyB0aGF0IGhhdmUgdGhpcyBwb2xpY3kgc2V0dGluZyB3aWxsIG9ubHkgYmUgYWJsZSB0byB1c2UgSVB2NCBhZGRyZXNzZXMgYWxsb2NhdGVkIGJ5IGEgREhDUCBzZXJ2ZXIgb24gdGhlIHZpcnR1YWwgbmV0d29yayBzaWRlLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6REhDUEZvcmNlX2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBEZW55IEJyaWRnZSBPcGVyYXRpb24uIEJyaWRnZS1tb2RlIGNvbm5lY3Rpb25zIGFyZSBkZW5pZWQgZm9yIHVzZXIgc2Vzc2lvbnMgdGhhdCBoYXZlIHRoaXMgcG9saWN5IHNldHRpbmcuIEV2ZW4gaW4gY2FzZXMgd2hlbiB0aGUgRXRoZXJuZXQgQnJpZGdlIGlzIGNvbmZpZ3VyZWQgaW4gdGhlIGNsaWVudCBzaWRlLCBjb21tdW5pY2F0aW9uIHdpbGwgbm90IGJlIHBvc3NpYmxlLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6Tm9CcmlkZ2VfYm9vbFwiXSA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IERlbnkgUm91dGluZyBPcGVyYXRpb24gKElQdjQpLiBJUHY0IHJvdXRpbmcgd2lsbCBiZSBkZW5pZWQgZm9yIHNlc3Npb25zIHRoYXQgaGF2ZSB0aGlzIHBvbGljeSBzZXR0aW5nLiBFdmVuIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBJUCByb3V0ZXIgaXMgb3BlcmF0aW5nIG9uIHRoZSB1c2VyIGNsaWVudCBzaWRlLCBjb21tdW5pY2F0aW9uIHdpbGwgbm90IGJlIHBvc3NpYmxlLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6Tm9Sb3V0aW5nX2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBEZW55IE1BQyBBZGRyZXNzZXMgRHVwbGljYXRpb24uIFRoZSB1c2Ugb2YgZHVwbGljYXRpbmcgTUFDIGFkZHJlc3NlcyB0aGF0IGFyZSBpbiB1c2UgYnkgY29tcHV0ZXJzIG9mIGRpZmZlcmVudCBzZXNzaW9ucyBjYW5ub3QgYmUgdXNlZCBieSBzZXNzaW9ucyB3aXRoIHRoaXMgcG9saWN5IHNldHRpbmcuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpDaGVja01hY19ib29sXCJdID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogRGVueSBJUCBBZGRyZXNzIER1cGxpY2F0aW9uIChJUHY0KS4gVGhlIHVzZSBvZiBkdXBsaWNhdGluZyBJUHY0IGFkZHJlc3NlcyB0aGF0IGFyZSBpbiB1c2UgYnkgY29tcHV0ZXJzIG9mIGRpZmZlcmVudCBzZXNzaW9ucyBjYW5ub3QgYmUgdXNlZCBieSBzZXNzaW9ucyB3aXRoIHRoaXMgcG9saWN5IHNldHRpbmcuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpDaGVja0lQX2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBEZW55IE5vbi1BUlAgLyBOb24tREhDUCAvIE5vbi1JQ01QdjYgYnJvYWRjYXN0cy4gVGhlIHNlbmRpbmcgb3IgcmVjZWl2aW5nIG9mIGJyb2FkY2FzdCBwYWNrZXRzIHRoYXQgYXJlIG5vdCBBUlAgcHJvdG9jb2wsIERIQ1AgcHJvdG9jb2wsIG5vciBJQ01QdjYgb24gdGhlIHZpcnR1YWwgbmV0d29yayB3aWxsIG5vdCBiZSBhbGxvd2VkIGZvciBzZXNzaW9ucyB3aXRoIHRoaXMgcG9saWN5IHNldHRpbmcuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpBcnBEaGNwT25seV9ib29sXCJdID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogUHJpdmFjeSBGaWx0ZXIgTW9kZS4gQWxsIGRpcmVjdCBjb21tdW5pY2F0aW9uIGJldHdlZW4gc2Vzc2lvbnMgd2l0aCB0aGUgcHJpdmFjeSBmaWx0ZXIgbW9kZSBwb2xpY3kgc2V0dGluZyB3aWxsIGJlIGZpbHRlcmVkLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6UHJpdmFjeUZpbHRlcl9ib29sXCJdID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogRGVueSBPcGVyYXRpb24gYXMgVENQL0lQIFNlcnZlciAoSVB2NCkuIENvbXB1dGVycyBvZiBzZXNzaW9ucyB3aXRoIHRoaXMgcG9saWN5IHNldHRpbmcgY2FuJ3QgbGlzdGVuIGFuZCBhY2NlcHQgVENQL0lQIGNvbm5lY3Rpb25zIGluIElQdjQuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpOb1NlcnZlcl9ib29sXCJdID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogVW5saW1pdGVkIE51bWJlciBvZiBCcm9hZGNhc3RzLiBJZiBhIGNvbXB1dGVyIG9mIGEgc2Vzc2lvbiB3aXRoIHRoaXMgcG9saWN5IHNldHRpbmcgc2VuZHMgYnJvYWRjYXN0IHBhY2tldHMgb2YgYSBudW1iZXIgdW51c3VhbGx5IGxhcmdlciB0aGFuIHdoYXQgd291bGQgYmUgY29uc2lkZXJlZCBub3JtYWwgb24gdGhlIHZpcnR1YWwgbmV0d29yaywgdGhlcmUgd2lsbCBiZSBubyBhdXRvbWF0aWMgbGltaXRpbmcuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpOb0Jyb2FkY2FzdExpbWl0ZXJfYm9vbFwiXSA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IEFsbG93IE1vbml0b3JpbmcgTW9kZS4gVXNlcnMgd2l0aCB0aGlzIHBvbGljeSBzZXR0aW5nIHdpbGwgYmUgZ3JhbnRlZCB0byBjb25uZWN0IHRvIHRoZSBWaXJ0dWFsIEh1YiBpbiBNb25pdG9yaW5nIE1vZGUuIFNlc3Npb25zIGluIE1vbml0b3JpbmcgTW9kZSBhcmUgYWJsZSB0byBtb25pdG9yICh0YXApIGFsbCBwYWNrZXRzIGZsb3dpbmcgdGhyb3VnaCB0aGUgVmlydHVhbCBIdWIuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpNb25pdG9yUG9ydF9ib29sXCJdID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogTWF4aW11bSBOdW1iZXIgb2YgVENQIENvbm5lY3Rpb25zLiBGb3Igc2Vzc2lvbnMgd2l0aCB0aGlzIHBvbGljeSBzZXR0aW5nLCB0aGlzIHNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHBoeXNpY2FsIFRDUCBjb25uZWN0aW9ucyBjb25zaXN0cyBpbiBhIHBoeXNpY2FsIFZQTiBzZXNzaW9uLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6TWF4Q29ubmVjdGlvbl91MzJcIl0gPSAwO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IFRpbWUtb3V0IFBlcmlvZC4gRm9yIHNlc3Npb25zIHdpdGggdGhpcyBwb2xpY3kgc2V0dGluZywgdGhpcyBzZXRzLCBpbiBzZWNvbmRzLCB0aGUgdGltZS1vdXQgcGVyaW9kIHRvIHdhaXQgYmVmb3JlIGRpc2Nvbm5lY3RpbmcgYSBzZXNzaW9uIHdoZW4gY29tbXVuaWNhdGlvbiB0cm91YmxlIG9jY3VycyBiZXR3ZWVuIHRoZSBWUE4gQ2xpZW50IC8gVlBOIFNlcnZlci4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5OlRpbWVPdXRfdTMyXCJdID0gMDtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBNYXhpbXVtIE51bWJlciBvZiBNQUMgQWRkcmVzc2VzLiBGb3Igc2Vzc2lvbnMgd2l0aCB0aGlzIHBvbGljeSBzZXR0aW5nLCB0aGlzIGxpbWl0cyB0aGUgbnVtYmVyIG9mIE1BQyBhZGRyZXNzZXMgcGVyIHNlc3Npb24uICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpNYXhNYWNfdTMyXCJdID0gMDtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBNYXhpbXVtIE51bWJlciBvZiBJUCBBZGRyZXNzZXMgKElQdjQpLiBGb3Igc2Vzc2lvbnMgd2l0aCB0aGlzIHBvbGljeSBzZXR0aW5nLCB0aGlzIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIElQdjQgYWRkcmVzc2VzIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQgZm9yIGEgc2luZ2xlIHNlc3Npb24uICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpNYXhJUF91MzJcIl0gPSAwO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IFVwbG9hZCBCYW5kd2lkdGguIEZvciBzZXNzaW9ucyB3aXRoIHRoaXMgcG9saWN5IHNldHRpbmcsIHRoaXMgbGltaXRzIHRoZSB0cmFmZmljIGJhbmR3aWR0aCB0aGF0IGlzIGluIHRoZSBpbndhcmRzIGRpcmVjdGlvbiBmcm9tIG91dHNpZGUgdG8gaW5zaWRlIHRoZSBWaXJ0dWFsIEh1Yi4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5Ok1heFVwbG9hZF91MzJcIl0gPSAwO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IERvd25sb2FkIEJhbmR3aWR0aC4gRm9yIHNlc3Npb25zIHdpdGggdGhpcyBwb2xpY3kgc2V0dGluZywgdGhpcyBsaW1pdHMgdGhlIHRyYWZmaWMgYmFuZHdpZHRoIHRoYXQgaXMgaW4gdGhlIG91dHdhcmRzIGRpcmVjdGlvbiBmcm9tIGluc2lkZSB0aGUgVmlydHVhbCBIdWIgdG8gb3V0c2lkZSB0aGUgVmlydHVhbCBIdWIuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpNYXhEb3dubG9hZF91MzJcIl0gPSAwO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IERlbnkgQ2hhbmdpbmcgUGFzc3dvcmQuIFRoZSB1c2VycyB3aGljaCB1c2UgcGFzc3dvcmQgYXV0aGVudGljYXRpb24gd2l0aCB0aGlzIHBvbGljeSBzZXR0aW5nIGFyZSBub3QgYWxsb3dlZCB0byBjaGFuZ2UgdGhlaXIgb3duIHBhc3N3b3JkIGZyb20gdGhlIFZQTiBDbGllbnQgTWFuYWdlciBvciBzaW1pbGFyLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6Rml4UGFzc3dvcmRfYm9vbFwiXSA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IE1heGltdW0gTnVtYmVyIG9mIE11bHRpcGxlIExvZ2lucy4gVXNlcnMgd2l0aCB0aGlzIHBvbGljeSBzZXR0aW5nIGFyZSB1bmFibGUgdG8gaGF2ZSBtb3JlIHRoYW4gdGhpcyBudW1iZXIgb2YgY29uY3VycmVudCBsb2dpbnMuIEJyaWRnZSBNb2RlIHNlc3Npb25zIGFyZSBub3Qgc3ViamVjdHMgdG8gdGhpcyBwb2xpY3kuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpNdWx0aUxvZ2luc191MzJcIl0gPSAwO1xyXG4gICAgICAgIC8qKiBTZWN1cml0eSBwb2xpY3k6IERlbnkgVm9JUCAvIFFvUyBGdW5jdGlvbi4gVXNlcnMgd2l0aCB0aGlzIHNlY3VyaXR5IHBvbGljeSBhcmUgdW5hYmxlIHRvIHVzZSBWb0lQIC8gUW9TIGZ1bmN0aW9ucyBpbiBWUE4gY29ubmVjdGlvbiBzZXNzaW9ucy4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5Ok5vUW9TX2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBGaWx0ZXIgUlMgLyBSQSBQYWNrZXRzIChJUHY2KS4gQWxsIElDTVB2NiBwYWNrZXRzIHdoaWNoIHRoZSBtZXNzYWdlLXR5cGUgaXMgMTMzIChSb3V0ZXIgU29saWNpdGF0aW9uKSBvciAxMzQgKFJvdXRlciBBZHZlcnRpc2VtZW50KSBpbiBzZXNzaW9ucyBkZWZpbmVkIHRoaXMgcG9saWN5IHdpbGwgYmUgZmlsdGVyZWQuIEFzIGEgcmVzdWx0LCBhbiBJUHY2IGNsaWVudCB3aWxsIGJlIHVuYWJsZSB0byB1c2UgSVB2NiBhZGRyZXNzIHByZWZpeCBhdXRvIGRldGVjdGlvbiBhbmQgSVB2NiBkZWZhdWx0IGdhdGV3YXkgYXV0byBkZXRlY3Rpb24uICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpSU2FuZFJBRmlsdGVyX2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBGaWx0ZXIgUkEgUGFja2V0cyAoSVB2NikuIEFsbCBJQ01QdjYgcGFja2V0cyB3aGljaCB0aGUgbWVzc2FnZS10eXBlIGlzIDEzNCAoUm91dGVyIEFkdmVydGlzZW1lbnQpIGluIHNlc3Npb25zIGRlZmluZWQgdGhpcyBwb2xpY3kgd2lsbCBiZSBmaWx0ZXJlZC4gQXMgYSByZXN1bHQsIGEgbWFsaWNpb3VzIHVzZXJzIHdpbGwgYmUgdW5hYmxlIHRvIHNwcmVhZCBpbGxlZ2FsIElQdjYgcHJlZml4IG9yIGRlZmF1bHQgZ2F0ZXdheSBhZHZlcnRpc2VtZW50cyBvbiB0aGUgbmV0d29yay4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5OlJBRmlsdGVyX2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBGaWx0ZXIgREhDUCBQYWNrZXRzIChJUHY2KS4gQWxsIElQdjYgREhDUCBwYWNrZXRzIGluIHNlc3Npb25zIGRlZmluZWQgdGhpcyBwb2xpY3kgd2lsbCBiZSBmaWx0ZXJlZC4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5OkRIQ1B2NkZpbHRlcl9ib29sXCJdID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogRGlzYWxsb3cgREhDUCBTZXJ2ZXIgT3BlcmF0aW9uIChJUHY2KS4gQ29tcHV0ZXJzIGNvbm5lY3RlZCB0byBzZXNzaW9ucyB0aGF0IGhhdmUgdGhpcyBwb2xpY3kgc2V0dGluZyB3aWxsIG5vdCBiZSBhbGxvd2VkIHRvIGJlY29tZSBhIERIQ1Agc2VydmVyIGFuZCBkaXN0cmlidXRlIElQdjYgYWRkcmVzc2VzIHRvIERIQ1AgY2xpZW50cy4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5OkRIQ1B2Nk5vU2VydmVyX2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBEZW55IFJvdXRpbmcgT3BlcmF0aW9uIChJUHY2KS4gSVB2NiByb3V0aW5nIHdpbGwgYmUgZGVuaWVkIGZvciBzZXNzaW9ucyB0aGF0IGhhdmUgdGhpcyBwb2xpY3kgc2V0dGluZy4gRXZlbiBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgSVAgcm91dGVyIGlzIG9wZXJhdGluZyBvbiB0aGUgdXNlciBjbGllbnQgc2lkZSwgY29tbXVuaWNhdGlvbiB3aWxsIG5vdCBiZSBwb3NzaWJsZS4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5Ok5vUm91dGluZ1Y2X2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBEZW55IElQIEFkZHJlc3MgRHVwbGljYXRpb24gKElQdjYpLiBUaGUgdXNlIG9mIGR1cGxpY2F0aW5nIElQdjYgYWRkcmVzc2VzIHRoYXQgYXJlIGluIHVzZSBieSBjb21wdXRlcnMgb2YgZGlmZmVyZW50IHNlc3Npb25zIGNhbm5vdCBiZSB1c2VkIGJ5IHNlc3Npb25zIHdpdGggdGhpcyBwb2xpY3kgc2V0dGluZy4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5OkNoZWNrSVB2Nl9ib29sXCJdID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogRGVueSBPcGVyYXRpb24gYXMgVENQL0lQIFNlcnZlciAoSVB2NikuIENvbXB1dGVycyBvZiBzZXNzaW9ucyB3aXRoIHRoaXMgcG9saWN5IHNldHRpbmcgY2FuJ3QgbGlzdGVuIGFuZCBhY2NlcHQgVENQL0lQIGNvbm5lY3Rpb25zIGluIElQdjYuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpOb1NlcnZlclY2X2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBNYXhpbXVtIE51bWJlciBvZiBJUCBBZGRyZXNzZXMgKElQdjYpLiBGb3Igc2Vzc2lvbnMgd2l0aCB0aGlzIHBvbGljeSBzZXR0aW5nLCB0aGlzIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIElQdjYgYWRkcmVzc2VzIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQgZm9yIGEgc2luZ2xlIHNlc3Npb24uICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpNYXhJUHY2X3UzMlwiXSA9IDA7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogRGlzYWxsb3cgUGFzc3dvcmQgU2F2ZSBpbiBWUE4gQ2xpZW50LiBGb3IgdXNlcnMgd2l0aCB0aGlzIHBvbGljeSBzZXR0aW5nLCB3aGVuIHRoZSB1c2VyIGlzIHVzaW5nICpzdGFuZGFyZCogcGFzc3dvcmQgYXV0aGVudGljYXRpb24sIHRoZSB1c2VyIHdpbGwgYmUgdW5hYmxlIHRvIHNhdmUgdGhlIHBhc3N3b3JkIGluIFZQTiBDbGllbnQuIFRoZSB1c2VyIHdpbGwgYmUgcmVxdWlyZWQgdG8gaW5wdXQgcGFzc3dvcmRzIGZvciBldmVyeSB0aW1lIHRvIGNvbm5lY3QgYSBWUE4uIFRoaXMgd2lsbCBpbXByb3ZlIHRoZSBzZWN1cml0eS4gSWYgdGhpcyBwb2xpY3kgaXMgZW5hYmxlZCwgVlBOIENsaWVudCBWZXJzaW9uIDIuMCB3aWxsIGJlIGRlbmllZCB0byBhY2Nlc3MuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpOb1NhdmVQYXNzd29yZF9ib29sXCJdID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogVlBOIENsaWVudCBBdXRvbWF0aWMgRGlzY29ubmVjdC4gRm9yIHVzZXJzIHdpdGggdGhpcyBwb2xpY3kgc2V0dGluZywgYSB1c2VyJ3MgVlBOIHNlc3Npb24gd2lsbCBiZSBkaXNjb25uZWN0ZWQgYXV0b21hdGljYWxseSBhZnRlciB0aGUgc3BlY2lmaWMgcGVyaW9kIHdpbGwgZWxhcHNlLiBJbiB0aGlzIGNhc2Ugbm8gYXV0b21hdGljIHJlLWNvbm5lY3Rpb24gd2lsbCBiZSBwZXJmb3JtZWQuIFRoaXMgY2FuIHByZXZlbnQgYSBsb3Qgb2YgaW5hY3RpdmUgVlBOIFNlc3Npb25zLiBJZiB0aGlzIHBvbGljeSBpcyBlbmFibGVkLCBWUE4gQ2xpZW50IFZlcnNpb24gMi4wIHdpbGwgYmUgZGVuaWVkIHRvIGFjY2Vzcy4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5OkF1dG9EaXNjb25uZWN0X3UzMlwiXSA9IDA7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogRmlsdGVyIEFsbCBJUHY0IFBhY2tldHMuIEFsbCBJUHY0IGFuZCBBUlAgcGFja2V0cyBpbiBzZXNzaW9ucyBkZWZpbmVkIHRoaXMgcG9saWN5IHdpbGwgYmUgZmlsdGVyZWQuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpGaWx0ZXJJUHY0X2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBGaWx0ZXIgQWxsIElQdjYgUGFja2V0cy4gQWxsIElQdjYgcGFja2V0cyBpbiBzZXNzaW9ucyBkZWZpbmVkIHRoaXMgcG9saWN5IHdpbGwgYmUgZmlsdGVyZWQuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpGaWx0ZXJJUHY2X2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBGaWx0ZXIgQWxsIE5vbi1JUCBQYWNrZXRzLiBBbGwgbm9uLUlQIHBhY2tldHMgaW4gc2Vzc2lvbnMgZGVmaW5lZCB0aGlzIHBvbGljeSB3aWxsIGJlIGZpbHRlcmVkLiBcIk5vbi1JUCBwYWNrZXRcIiBtZWFuIGEgcGFja2V0IHdoaWNoIGlzIG5vdCBJUHY0LCBBUlAgbm9yIElQdjYuIEFueSB0YWdnZWQtVkxBTiBwYWNrZXRzIHZpYSB0aGUgVmlydHVhbCBIdWIgd2lsbCBiZSByZWdhcmRlZCBhcyBub24tSVAgcGFja2V0cy4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5OkZpbHRlck5vbklQX2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBObyBEZWZhdWx0LVJvdXRlciBvbiBJUHY2IFJBLiBJbiBhbGwgVlBOIFNlc3Npb25zIGRlZmluZXMgdGhpcyBwb2xpY3ksIGFueSBJUHY2IFJBIChSb3V0ZXIgQWR2ZXJ0aXNlbWVudCkgcGFja2V0IHdpdGggbm9uLXplcm8gdmFsdWUgaW4gdGhlIHJvdXRlci1saWZldGltZSB3aWxsIHNldCB0byB6ZXJvLXZhbHVlLiBUaGlzIGlzIGVmZmVjdGl2ZSB0byBhdm9pZCB0aGUgaG9ycmlibGUgYmVoYXZpb3IgZnJvbSB0aGUgSVB2NiByb3V0aW5nIGNvbmZ1c2lvbiB3aGljaCBpcyBjYXVzZWQgYnkgdGhlIFZQTiBjbGllbnQncyBhdHRlbXB0cyB0byB1c2UgdGhlIHJlbW90ZS1zaWRlIElQdjYgcm91dGVyIGFzIGl0cyBsb2NhbCBJUHY2IHJvdXRlci4gKi9cclxuICAgICAgICB0aGlzW1wicG9saWN5Ok5vSVB2NkRlZmF1bHRSb3V0ZXJJblJBX2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBObyBEZWZhdWx0LVJvdXRlciBvbiBJUHY2IFJBIChwaHlzaWNhbCBJUHY2KS4gSW4gYWxsIFZQTiBTZXNzaW9ucyBkZWZpbmVzIHRoaXMgcG9saWN5IChvbmx5IHdoZW4gdGhlIHBoeXNpY2FsIGNvbW11bmljYXRpb24gcHJvdG9jb2wgYmV0d2VlbiBWUE4gQ2xpZW50IC8gVlBOIEJyaWRnZSBhbmQgVlBOIFNlcnZlciBpcyBJUHY2KSwgYW55IElQdjYgUkEgKFJvdXRlciBBZHZlcnRpc2VtZW50KSBwYWNrZXQgd2l0aCBub24temVybyB2YWx1ZSBpbiB0aGUgcm91dGVyLWxpZmV0aW1lIHdpbGwgc2V0IHRvIHplcm8tdmFsdWUuIFRoaXMgaXMgZWZmZWN0aXZlIHRvIGF2b2lkIHRoZSBob3JyaWJsZSBiZWhhdmlvciBmcm9tIHRoZSBJUHY2IHJvdXRpbmcgY29uZnVzaW9uIHdoaWNoIGlzIGNhdXNlZCBieSB0aGUgVlBOIGNsaWVudCdzIGF0dGVtcHRzIHRvIHVzZSB0aGUgcmVtb3RlLXNpZGUgSVB2NiByb3V0ZXIgYXMgaXRzIGxvY2FsIElQdjYgcm91dGVyLiAqL1xyXG4gICAgICAgIHRoaXNbXCJwb2xpY3k6Tm9JUHY2RGVmYXVsdFJvdXRlckluUkFXaGVuSVB2Nl9ib29sXCJdID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNlY3VyaXR5IHBvbGljeTogVkxBTiBJRCAoSUVFRTgwMi4xUSkuIFlvdSBjYW4gc3BlY2lmeSB0aGUgVkxBTiBJRCBvbiB0aGUgc2VjdXJpdHkgcG9saWN5LiBBbGwgVlBOIFNlc3Npb25zIGRlZmluZXMgdGhpcyBwb2xpY3ksIGFsbCBFdGhlcm5ldCBwYWNrZXRzIHRvd2FyZCB0aGUgVmlydHVhbCBIdWIgZnJvbSB0aGUgdXNlciB3aWxsIGJlIGluc2VydGVkIGEgVkxBTiB0YWcgKElFRUUgODAyLjFRKSB3aXRoIHRoZSBWTEFOIElELiBUaGUgdXNlciBjYW4gYWxzbyByZWNlaXZlIG9ubHkgcGFja2V0cyB3aXRoIGEgVkxBTiB0YWcgd2hpY2ggaGFzIHRoZSBzYW1lIFZMQU4gSUQuIChSZWNlaXZpbmcgcHJvY2VzcyByZW1vdmVzIHRoZSBWTEFOIHRhZyBhdXRvbWF0aWNhbGx5LikgQW55IEV0aGVybmV0IHBhY2tldHMgd2l0aCBhbnkgb3RoZXIgVkxBTiBJRHMgb3Igbm9uLVZMQU4gcGFja2V0cyB3aWxsIG5vdCBiZSByZWNlaXZlZC4gQWxsIFZQTiBTZXNzaW9ucyB3aXRob3V0IHRoaXMgcG9saWN5IGRlZmluaXRpb24gY2FuIHNlbmQgLyByZWNlaXZlIGFueSBraW5kcyBvZiBFdGhlcm5ldCBwYWNrZXRzIHJlZ2FyZGxlc3Mgb2YgVkxBTiB0YWdzLCBhbmQgVkxBTiB0YWdzIGFyZSBub3QgaW5zZXJ0ZWQgb3IgcmVtb3ZlZCBhdXRvbWF0aWNhbGx5LiBBbnkgdGFnZ2VkLVZMQU4gcGFja2V0cyB2aWEgdGhlIFZpcnR1YWwgSHViIHdpbGwgYmUgcmVnYXJkZWQgYXMgbm9uLUlQIHBhY2tldHMuIFRoZXJlZm9yZSwgdGFnZ2VkLVZMQU4gcGFja2V0cyBhcmUgbm90IHN1YmplY3RzIGZvciBJUHY0IC8gSVB2NiBzZWN1cml0eSBwb2xpY2llcywgYWNjZXNzIGxpc3RzIG5vciBvdGhlciBJUHY0IC8gSVB2NiBzcGVjaWZpYyBkZWVwIHByb2Nlc3NpbmcuICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpWTGFuSWRfdTMyXCJdID0gMDtcclxuICAgICAgICAvKiogU2VjdXJpdHkgcG9saWN5OiBXaGV0aGVyIHZlcnNpb24gMy4wIChtdXN0IGJlIHRydWUpICovXHJcbiAgICAgICAgdGhpc1tcInBvbGljeTpWZXIzX2Jvb2xcIl0gPSBmYWxzZTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY1NldFVzZXI7XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjU2V0VXNlciA9IFZwblJwY1NldFVzZXI7XHJcbi8qKiBEZWxldGUgdGhlIGFjY2VzcyBsaXN0ICovXHJcbnZhciBWcG5ScGNEZWxldGVBY2Nlc3MgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjRGVsZXRlQWNjZXNzJyBjbGFzczogRGVsZXRlIHRoZSBhY2Nlc3MgbGlzdCAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjRGVsZXRlQWNjZXNzKGluaXQpIHtcclxuICAgICAgICAvKiogVGhlIFZpcnR1YWwgSHViIG5hbWUgKi9cclxuICAgICAgICB0aGlzLkh1Yk5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogSUQgKi9cclxuICAgICAgICB0aGlzLklkX3UzMiA9IDA7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNEZWxldGVBY2Nlc3M7XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjRGVsZXRlQWNjZXNzID0gVnBuUnBjRGVsZXRlQWNjZXNzO1xyXG4vKiogRGVsZXRlIHRoZSBDQSBvZiBIVUIgKi9cclxudmFyIFZwblJwY0h1YkRlbGV0ZUNBID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwblJwY0h1YkRlbGV0ZUNBJyBjbGFzczogRGVsZXRlIHRoZSBDQSBvZiBIVUIgKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY0h1YkRlbGV0ZUNBKGluaXQpIHtcclxuICAgICAgICAvKiogVGhlIFZpcnR1YWwgSHViIG5hbWUgKi9cclxuICAgICAgICB0aGlzLkh1Yk5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogQ2VydGlmaWNhdGUga2V5IGlkIHRvIGJlIGRlbGV0ZWQgKi9cclxuICAgICAgICB0aGlzLktleV91MzIgPSAwO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjSHViRGVsZXRlQ0E7XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjSHViRGVsZXRlQ0EgPSBWcG5ScGNIdWJEZWxldGVDQTtcclxuLyoqIERlbGV0aW5nIGEgdXNlciBvciBncm91cCAqL1xyXG52YXIgVnBuUnBjRGVsZXRlVXNlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNEZWxldGVVc2VyJyBjbGFzczogRGVsZXRpbmcgYSB1c2VyIG9yIGdyb3VwICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNEZWxldGVVc2VyKGluaXQpIHtcclxuICAgICAgICAvKiogVGhlIFZpcnR1YWwgSHViIG5hbWUgKi9cclxuICAgICAgICB0aGlzLkh1Yk5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogVXNlciBvciBncm91cCBuYW1lICovXHJcbiAgICAgICAgdGhpcy5OYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNEZWxldGVVc2VyO1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY0RlbGV0ZVVzZXIgPSBWcG5ScGNEZWxldGVVc2VyO1xyXG4vKiogRGVsZXRlIHRoZSBIVUIgKi9cclxudmFyIFZwblJwY0RlbGV0ZUh1YiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNEZWxldGVIdWInIGNsYXNzOiBEZWxldGUgdGhlIEhVQiAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjRGVsZXRlSHViKGluaXQpIHtcclxuICAgICAgICAvKiogVGhlIFZpcnR1YWwgSHViIG5hbWUgKi9cclxuICAgICAgICB0aGlzLkh1Yk5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY0RlbGV0ZUh1YjtcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNEZWxldGVIdWIgPSBWcG5ScGNEZWxldGVIdWI7XHJcbi8qKiBEZWxldGUgdGhlIHRhYmxlICovXHJcbnZhciBWcG5ScGNEZWxldGVUYWJsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNEZWxldGVUYWJsZScgY2xhc3M6IERlbGV0ZSB0aGUgdGFibGUgKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY0RlbGV0ZVRhYmxlKGluaXQpIHtcclxuICAgICAgICAvKiogVGhlIFZpcnR1YWwgSHViIG5hbWUgKi9cclxuICAgICAgICB0aGlzLkh1Yk5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogS2V5IElEICovXHJcbiAgICAgICAgdGhpcy5LZXlfdTMyID0gMDtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY0RlbGV0ZVRhYmxlO1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY0RlbGV0ZVRhYmxlID0gVnBuUnBjRGVsZXRlVGFibGU7XHJcbi8qKiBTcGVjaWZ5IHRoZSBMaW5rICovXHJcbnZhciBWcG5ScGNMaW5rID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwblJwY0xpbmsnIGNsYXNzOiBTcGVjaWZ5IHRoZSBMaW5rICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNMaW5rKGluaXQpIHtcclxuICAgICAgICAvKiogVGhlIFZpcnR1YWwgSHViIG5hbWUgKi9cclxuICAgICAgICB0aGlzLkh1Yk5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGNhc2NhZGUgY29ubmVjdGlvbiAqL1xyXG4gICAgICAgIHRoaXMuQWNjb3VudE5hbWVfdXRmID0gXCJcIjtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY0xpbms7XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjTGluayA9IFZwblJwY0xpbms7XHJcbi8qKiBEaXNjb25uZWN0IHRoZSBzZXNzaW9uICovXHJcbnZhciBWcG5ScGNEZWxldGVTZXNzaW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwblJwY0RlbGV0ZVNlc3Npb24nIGNsYXNzOiBEaXNjb25uZWN0IHRoZSBzZXNzaW9uICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNEZWxldGVTZXNzaW9uKGluaXQpIHtcclxuICAgICAgICAvKiogVGhlIFZpcnR1YWwgSHViIG5hbWUgKi9cclxuICAgICAgICB0aGlzLkh1Yk5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogU2Vzc2lvbiBuYW1lICovXHJcbiAgICAgICAgdGhpcy5OYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNEZWxldGVTZXNzaW9uO1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY0RlbGV0ZVNlc3Npb24gPSBWcG5ScGNEZWxldGVTZXNzaW9uO1xyXG4vKiogU3BlY2lmeSB0aGUgSFVCICovXHJcbnZhciBWcG5ScGNIdWIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjSHViJyBjbGFzczogU3BlY2lmeSB0aGUgSFVCICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNIdWIoaW5pdCkge1xyXG4gICAgICAgIC8qKiBUaGUgVmlydHVhbCBIdWIgbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuSHViTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjSHViO1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY0h1YiA9IFZwblJwY0h1YjtcclxuLyoqIERpc2Nvbm5lY3QgYSBjb25uZWN0aW9uICovXHJcbnZhciBWcG5ScGNEaXNjb25uZWN0Q29ubmVjdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNEaXNjb25uZWN0Q29ubmVjdGlvbicgY2xhc3M6IERpc2Nvbm5lY3QgYSBjb25uZWN0aW9uICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNEaXNjb25uZWN0Q29ubmVjdGlvbihpbml0KSB7XHJcbiAgICAgICAgLyoqIENvbm5lY3Rpb24gbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjRGlzY29ubmVjdENvbm5lY3Rpb247XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjRGlzY29ubmVjdENvbm5lY3Rpb24gPSBWcG5ScGNEaXNjb25uZWN0Q29ubmVjdGlvbjtcclxuLyoqIEVudW1lcmF0aW9uIG9mIHRoZSBhY2Nlc3MgbGlzdCAqL1xyXG52YXIgVnBuUnBjRW51bUFjY2Vzc0xpc3QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjRW51bUFjY2Vzc0xpc3QnIGNsYXNzOiBFbnVtZXJhdGlvbiBvZiB0aGUgYWNjZXNzIGxpc3QgKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY0VudW1BY2Nlc3NMaXN0KGluaXQpIHtcclxuICAgICAgICAvKiogVGhlIFZpcnR1YWwgSHViIG5hbWUgKi9cclxuICAgICAgICB0aGlzLkh1Yk5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogQWNjZXNzIGxpc3QgKi9cclxuICAgICAgICB0aGlzLkFjY2Vzc0xpc3QgPSBbXTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY0VudW1BY2Nlc3NMaXN0O1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY0VudW1BY2Nlc3NMaXN0ID0gVnBuUnBjRW51bUFjY2Vzc0xpc3Q7XHJcbi8qKiBDQSBlbnVtZXJhdGlvbiBpdGVtcyBvZiBIVUIgKi9cclxudmFyIFZwblJwY0h1YkVudW1DQUl0ZW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjSHViRW51bUNBSXRlbScgY2xhc3M6IENBIGVudW1lcmF0aW9uIGl0ZW1zIG9mIEhVQiAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjSHViRW51bUNBSXRlbShpbml0KSB7XHJcbiAgICAgICAgLyoqIFRoZSBrZXkgaWQgb2YgdGhlIGl0ZW0gKi9cclxuICAgICAgICB0aGlzLktleV91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBTdWJqZWN0ICovXHJcbiAgICAgICAgdGhpcy5TdWJqZWN0TmFtZV91dGYgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBJc3N1ZXIgKi9cclxuICAgICAgICB0aGlzLklzc3Vlck5hbWVfdXRmID0gXCJcIjtcclxuICAgICAgICAvKiogRXhwaXJhdGlvbiBkYXRlICovXHJcbiAgICAgICAgdGhpcy5FeHBpcmVzX2R0ID0gbmV3IERhdGUoKTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY0h1YkVudW1DQUl0ZW07XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjSHViRW51bUNBSXRlbSA9IFZwblJwY0h1YkVudW1DQUl0ZW07XHJcbi8qKiBDQSBlbnVtZXJhdGlvbiBvZiBIVUIgKi9cclxudmFyIFZwblJwY0h1YkVudW1DQSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNIdWJFbnVtQ0EnIGNsYXNzOiBDQSBlbnVtZXJhdGlvbiBvZiBIVUIgKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY0h1YkVudW1DQShpbml0KSB7XHJcbiAgICAgICAgLyoqIFRoZSBWaXJ0dWFsIEh1YiBuYW1lICovXHJcbiAgICAgICAgdGhpcy5IdWJOYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFRoZSBsaXN0IG9mIENBICovXHJcbiAgICAgICAgdGhpcy5DQUxpc3QgPSBbXTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY0h1YkVudW1DQTtcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNIdWJFbnVtQ0EgPSBWcG5ScGNIdWJFbnVtQ0E7XHJcbi8qKiBUeXBlIG9mIGNvbm5lY3Rpb24gKi9cclxudmFyIFZwblJwY0Nvbm5lY3Rpb25UeXBlO1xyXG4oZnVuY3Rpb24gKFZwblJwY0Nvbm5lY3Rpb25UeXBlKSB7XHJcbiAgICAvKiogVlBOIENsaWVudCAqL1xyXG4gICAgVnBuUnBjQ29ubmVjdGlvblR5cGVbVnBuUnBjQ29ubmVjdGlvblR5cGVbXCJDbGllbnRcIl0gPSAwXSA9IFwiQ2xpZW50XCI7XHJcbiAgICAvKiogRHVyaW5nIGluaXRpYWxpemF0aW9uICovXHJcbiAgICBWcG5ScGNDb25uZWN0aW9uVHlwZVtWcG5ScGNDb25uZWN0aW9uVHlwZVtcIkluaXRcIl0gPSAxXSA9IFwiSW5pdFwiO1xyXG4gICAgLyoqIExvZ2luIGNvbm5lY3Rpb24gKi9cclxuICAgIFZwblJwY0Nvbm5lY3Rpb25UeXBlW1ZwblJwY0Nvbm5lY3Rpb25UeXBlW1wiTG9naW5cIl0gPSAyXSA9IFwiTG9naW5cIjtcclxuICAgIC8qKiBBZGRpdGlvbmFsIGNvbm5lY3Rpb24gKi9cclxuICAgIFZwblJwY0Nvbm5lY3Rpb25UeXBlW1ZwblJwY0Nvbm5lY3Rpb25UeXBlW1wiQWRkaXRpb25hbFwiXSA9IDNdID0gXCJBZGRpdGlvbmFsXCI7XHJcbiAgICAvKiogUlBDIGZvciBzZXJ2ZXIgZmFybSAqL1xyXG4gICAgVnBuUnBjQ29ubmVjdGlvblR5cGVbVnBuUnBjQ29ubmVjdGlvblR5cGVbXCJGYXJtUnBjXCJdID0gNF0gPSBcIkZhcm1ScGNcIjtcclxuICAgIC8qKiBSUEMgZm9yIE1hbmFnZW1lbnQgKi9cclxuICAgIFZwblJwY0Nvbm5lY3Rpb25UeXBlW1ZwblJwY0Nvbm5lY3Rpb25UeXBlW1wiQWRtaW5ScGNcIl0gPSA1XSA9IFwiQWRtaW5ScGNcIjtcclxuICAgIC8qKiBIVUIgZW51bWVyYXRpb24gKi9cclxuICAgIFZwblJwY0Nvbm5lY3Rpb25UeXBlW1ZwblJwY0Nvbm5lY3Rpb25UeXBlW1wiRW51bUh1YlwiXSA9IDZdID0gXCJFbnVtSHViXCI7XHJcbiAgICAvKiogUGFzc3dvcmQgY2hhbmdlICovXHJcbiAgICBWcG5ScGNDb25uZWN0aW9uVHlwZVtWcG5ScGNDb25uZWN0aW9uVHlwZVtcIlBhc3N3b3JkXCJdID0gN10gPSBcIlBhc3N3b3JkXCI7XHJcbiAgICAvKiogU1NUUCAqL1xyXG4gICAgVnBuUnBjQ29ubmVjdGlvblR5cGVbVnBuUnBjQ29ubmVjdGlvblR5cGVbXCJTU1RQXCJdID0gOF0gPSBcIlNTVFBcIjtcclxuICAgIC8qKiBPcGVuVlBOICovXHJcbiAgICBWcG5ScGNDb25uZWN0aW9uVHlwZVtWcG5ScGNDb25uZWN0aW9uVHlwZVtcIk9wZW5WUE5cIl0gPSA5XSA9IFwiT3BlblZQTlwiO1xyXG59KShWcG5ScGNDb25uZWN0aW9uVHlwZSA9IGV4cG9ydHMuVnBuUnBjQ29ubmVjdGlvblR5cGUgfHwgKGV4cG9ydHMuVnBuUnBjQ29ubmVjdGlvblR5cGUgPSB7fSkpO1xyXG4vKiogQ29ubmVjdGlvbiBlbnVtZXJhdGlvbiBpdGVtcyAqL1xyXG52YXIgVnBuUnBjRW51bUNvbm5lY3Rpb25JdGVtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwblJwY0VudW1Db25uZWN0aW9uSXRlbScgY2xhc3M6IENvbm5lY3Rpb24gZW51bWVyYXRpb24gaXRlbXMgKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY0VudW1Db25uZWN0aW9uSXRlbShpbml0KSB7XHJcbiAgICAgICAgLyoqIENvbm5lY3Rpb24gbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBIb3N0IG5hbWUgKi9cclxuICAgICAgICB0aGlzLkhvc3RuYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIElQIGFkZHJlc3MgKi9cclxuICAgICAgICB0aGlzLklwX2lwID0gXCJcIjtcclxuICAgICAgICAvKiogUG9ydCBudW1iZXIgKi9cclxuICAgICAgICB0aGlzLlBvcnRfdTMyID0gMDtcclxuICAgICAgICAvKiogQ29ubmVjdGVkIHRpbWUgKi9cclxuICAgICAgICB0aGlzLkNvbm5lY3RlZFRpbWVfZHQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIC8qKiBDb25uZWN0aW9uIHR5cGUgKi9cclxuICAgICAgICB0aGlzLlR5cGVfdTMyID0gMDtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY0VudW1Db25uZWN0aW9uSXRlbTtcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNFbnVtQ29ubmVjdGlvbkl0ZW0gPSBWcG5ScGNFbnVtQ29ubmVjdGlvbkl0ZW07XHJcbi8qKiBDb25uZWN0aW9uIGVudW1lcmF0aW9uICovXHJcbnZhciBWcG5ScGNFbnVtQ29ubmVjdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNFbnVtQ29ubmVjdGlvbicgY2xhc3M6IENvbm5lY3Rpb24gZW51bWVyYXRpb24gKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY0VudW1Db25uZWN0aW9uKGluaXQpIHtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIGNvbm5lY3Rpb25zICovXHJcbiAgICAgICAgdGhpcy5OdW1Db25uZWN0aW9uX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIENvbm5lY3Rpb24gbGlzdCAqL1xyXG4gICAgICAgIHRoaXMuQ29ubmVjdGlvbkxpc3QgPSBbXTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY0VudW1Db25uZWN0aW9uO1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY0VudW1Db25uZWN0aW9uID0gVnBuUnBjRW51bUNvbm5lY3Rpb247XHJcbi8qKiBFbnVtIENSTCBJdGVtICovXHJcbnZhciBWcG5ScGNFbnVtQ3JsSXRlbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNFbnVtQ3JsSXRlbScgY2xhc3M6IEVudW0gQ1JMIEl0ZW0gKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY0VudW1DcmxJdGVtKGluaXQpIHtcclxuICAgICAgICAvKiogS2V5IElEICovXHJcbiAgICAgICAgdGhpcy5LZXlfdTMyID0gMDtcclxuICAgICAgICAvKiogVGhlIGNvbnRlbnRzIG9mIHRoZSBDUkwgaXRlbSAqL1xyXG4gICAgICAgIHRoaXMuQ3JsSW5mb191dGYgPSBcIlwiO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjRW51bUNybEl0ZW07XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjRW51bUNybEl0ZW0gPSBWcG5ScGNFbnVtQ3JsSXRlbTtcclxuLyoqIEVudW0gQ1JMICovXHJcbnZhciBWcG5ScGNFbnVtQ3JsID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwblJwY0VudW1DcmwnIGNsYXNzOiBFbnVtIENSTCAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjRW51bUNybChpbml0KSB7XHJcbiAgICAgICAgLyoqIFRoZSBWaXJ0dWFsIEh1YiBuYW1lICovXHJcbiAgICAgICAgdGhpcy5IdWJOYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIENSTCBsaXN0ICovXHJcbiAgICAgICAgdGhpcy5DUkxMaXN0ID0gW107XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNFbnVtQ3JsO1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY0VudW1DcmwgPSBWcG5ScGNFbnVtQ3JsO1xyXG4vKiogUlBDX0VOVU1fREhDUF9JVEVNICovXHJcbnZhciBWcG5ScGNFbnVtRGhjcEl0ZW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjRW51bURoY3BJdGVtJyBjbGFzczogUlBDX0VOVU1fREhDUF9JVEVNICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNFbnVtRGhjcEl0ZW0oaW5pdCkge1xyXG4gICAgICAgIC8qKiBJRCAqL1xyXG4gICAgICAgIHRoaXMuSWRfdTMyID0gMDtcclxuICAgICAgICAvKiogTGVhc2UgdGltZSAqL1xyXG4gICAgICAgIHRoaXMuTGVhc2VkVGltZV9kdCA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgLyoqIEV4cGlyYXRpb24gZGF0ZSAqL1xyXG4gICAgICAgIHRoaXMuRXhwaXJlVGltZV9kdCA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgLyoqIE1BQyBhZGRyZXNzICovXHJcbiAgICAgICAgdGhpcy5NYWNBZGRyZXNzX2JpbiA9IG5ldyBVaW50OEFycmF5KFtdKTtcclxuICAgICAgICAvKiogSVAgYWRkcmVzcyAqL1xyXG4gICAgICAgIHRoaXMuSXBBZGRyZXNzX2lwID0gXCJcIjtcclxuICAgICAgICAvKiogU3VibmV0IG1hc2sgKi9cclxuICAgICAgICB0aGlzLk1hc2tfdTMyID0gMDtcclxuICAgICAgICAvKiogSG9zdCBuYW1lICovXHJcbiAgICAgICAgdGhpcy5Ib3N0bmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjRW51bURoY3BJdGVtO1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY0VudW1EaGNwSXRlbSA9IFZwblJwY0VudW1EaGNwSXRlbTtcclxuLyoqIFJQQ19FTlVNX0RIQ1AgKi9cclxudmFyIFZwblJwY0VudW1EaGNwID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwblJwY0VudW1EaGNwJyBjbGFzczogUlBDX0VOVU1fREhDUCAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjRW51bURoY3AoaW5pdCkge1xyXG4gICAgICAgIC8qKiBWaXJ0dWFsIEh1YiBOYW1lICovXHJcbiAgICAgICAgdGhpcy5IdWJOYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIERIQ1AgSXRlbSAqL1xyXG4gICAgICAgIHRoaXMuRGhjcFRhYmxlID0gW107XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNFbnVtRGhjcDtcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNFbnVtRGhjcCA9IFZwblJwY0VudW1EaGNwO1xyXG4vKiogRXRoZXJJUCBzZXR0aW5nIGxpc3QgKi9cclxudmFyIFZwblJwY0VudW1FdGhlcklwSWQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjRW51bUV0aGVySXBJZCcgY2xhc3M6IEV0aGVySVAgc2V0dGluZyBsaXN0ICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNFbnVtRXRoZXJJcElkKGluaXQpIHtcclxuICAgICAgICAvKiogU2V0dGluZyBsaXN0ICovXHJcbiAgICAgICAgdGhpcy5TZXR0aW5ncyA9IFtdO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjRW51bUV0aGVySXBJZDtcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNFbnVtRXRoZXJJcElkID0gVnBuUnBjRW51bUV0aGVySXBJZDtcclxuLyoqIEV0aGVybmV0IE5ldHdvcmsgQWRhcHRlcnMgbGlzdCBpdGVtICovXHJcbnZhciBWcG5ScGNFbnVtRXRoSXRlbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNFbnVtRXRoSXRlbScgY2xhc3M6IEV0aGVybmV0IE5ldHdvcmsgQWRhcHRlcnMgbGlzdCBpdGVtICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNFbnVtRXRoSXRlbShpbml0KSB7XHJcbiAgICAgICAgLyoqIERldmljZSBuYW1lICovXHJcbiAgICAgICAgdGhpcy5EZXZpY2VOYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIE5ldHdvcmsgY29ubmVjdGlvbiBuYW1lIChkZXNjcmlwdGlvbikgKi9cclxuICAgICAgICB0aGlzLk5ldHdvcmtDb25uZWN0aW9uTmFtZV91dGYgPSBcIlwiO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjRW51bUV0aEl0ZW07XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjRW51bUV0aEl0ZW0gPSBWcG5ScGNFbnVtRXRoSXRlbTtcclxuLyoqIEV0aGVybmV0IE5ldHdvcmsgQWRhcHRlcnMgbGlzdCAqL1xyXG52YXIgVnBuUnBjRW51bUV0aCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNFbnVtRXRoJyBjbGFzczogRXRoZXJuZXQgTmV0d29yayBBZGFwdGVycyBsaXN0ICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNFbnVtRXRoKGluaXQpIHtcclxuICAgICAgICAvKiogRXRoZXJuZXQgTmV0d29yayBBZGFwdGVycyBsaXN0ICovXHJcbiAgICAgICAgdGhpcy5FdGhMaXN0ID0gW107XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNFbnVtRXRoO1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY0VudW1FdGggPSBWcG5ScGNFbnVtRXRoO1xyXG4vKiogU2VydmVyIGZhcm0gbWVtYmVycyBlbnVtZXJhdGlvbiBpdGVtcyAqL1xyXG52YXIgVnBuUnBjRW51bUZhcm1JdGVtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwblJwY0VudW1GYXJtSXRlbScgY2xhc3M6IFNlcnZlciBmYXJtIG1lbWJlcnMgZW51bWVyYXRpb24gaXRlbXMgKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY0VudW1GYXJtSXRlbShpbml0KSB7XHJcbiAgICAgICAgLyoqIElEICovXHJcbiAgICAgICAgdGhpcy5JZF91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBDb250cm9sbGVyICovXHJcbiAgICAgICAgdGhpcy5Db250cm9sbGVyX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogQ29ubmVjdGlvbiB0aW1lICovXHJcbiAgICAgICAgdGhpcy5Db25uZWN0ZWRUaW1lX2R0ID0gbmV3IERhdGUoKTtcclxuICAgICAgICAvKiogSVAgYWRkcmVzcyAqL1xyXG4gICAgICAgIHRoaXMuSXBfaXAgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBIb3N0IG5hbWUgKi9cclxuICAgICAgICB0aGlzLkhvc3RuYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFBvaW50ICovXHJcbiAgICAgICAgdGhpcy5Qb2ludF91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBOdW1iZXIgb2Ygc2Vzc2lvbnMgKi9cclxuICAgICAgICB0aGlzLk51bVNlc3Npb25zX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIE51bWJlciBvZiBUQ1AgY29ubmVjdGlvbnMgKi9cclxuICAgICAgICB0aGlzLk51bVRjcENvbm5lY3Rpb25zX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIE51bWJlciBvZiBIVUJzICovXHJcbiAgICAgICAgdGhpcy5OdW1IdWJzX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIE51bWJlciBvZiBhc3NpZ25lZCBjbGllbnQgbGljZW5zZXMgKi9cclxuICAgICAgICB0aGlzLkFzc2lnbmVkQ2xpZW50TGljZW5zZV91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBOdW1iZXIgb2YgYXNzaWduZWQgYnJpZGdlIGxpY2Vuc2VzICovXHJcbiAgICAgICAgdGhpcy5Bc3NpZ25lZEJyaWRnZUxpY2Vuc2VfdTMyID0gMDtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY0VudW1GYXJtSXRlbTtcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNFbnVtRmFybUl0ZW0gPSBWcG5ScGNFbnVtRmFybUl0ZW07XHJcbi8qKiBTZXJ2ZXIgZmFybSBtZW1iZXIgZW51bWVyYXRpb24gKi9cclxudmFyIFZwblJwY0VudW1GYXJtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwblJwY0VudW1GYXJtJyBjbGFzczogU2VydmVyIGZhcm0gbWVtYmVyIGVudW1lcmF0aW9uICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNFbnVtRmFybShpbml0KSB7XHJcbiAgICAgICAgLyoqIE51bWJlciBvZiBDbHVzdGVyIE1lbWJlcnMgKi9cclxuICAgICAgICB0aGlzLk51bUZhcm1fdTMyID0gMDtcclxuICAgICAgICAvKiogQ2x1c3RlciBNZW1iZXJzIGxpc3QgKi9cclxuICAgICAgICB0aGlzLkZhcm1NZW1iZXJMaXN0ID0gW107XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNFbnVtRmFybTtcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNFbnVtRmFybSA9IFZwblJwY0VudW1GYXJtO1xyXG4vKiogRW51bWVyYXRpb24gaXRlbXMgaW4gdGhlIGdyb3VwICovXHJcbnZhciBWcG5ScGNFbnVtR3JvdXBJdGVtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwblJwY0VudW1Hcm91cEl0ZW0nIGNsYXNzOiBFbnVtZXJhdGlvbiBpdGVtcyBpbiB0aGUgZ3JvdXAgKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY0VudW1Hcm91cEl0ZW0oaW5pdCkge1xyXG4gICAgICAgIC8qKiBVc2VyIG5hbWUgKi9cclxuICAgICAgICB0aGlzLk5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogUmVhbCBuYW1lICovXHJcbiAgICAgICAgdGhpcy5SZWFsbmFtZV91dGYgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBOb3RlICovXHJcbiAgICAgICAgdGhpcy5Ob3RlX3V0ZiA9IFwiXCI7XHJcbiAgICAgICAgLyoqIE51bWJlciBvZiB1c2VycyAqL1xyXG4gICAgICAgIHRoaXMuTnVtVXNlcnNfdTMyID0gMDtcclxuICAgICAgICAvKiogQWNjZXNzIGRlbmllZCAqL1xyXG4gICAgICAgIHRoaXMuRGVueUFjY2Vzc19ib29sID0gZmFsc2U7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNFbnVtR3JvdXBJdGVtO1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY0VudW1Hcm91cEl0ZW0gPSBWcG5ScGNFbnVtR3JvdXBJdGVtO1xyXG4vKiogR3JvdXAgZW51bWVyYXRpb24gKi9cclxudmFyIFZwblJwY0VudW1Hcm91cCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNFbnVtR3JvdXAnIGNsYXNzOiBHcm91cCBlbnVtZXJhdGlvbiAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjRW51bUdyb3VwKGluaXQpIHtcclxuICAgICAgICAvKiogVGhlIFZpcnR1YWwgSHViIG5hbWUgKi9cclxuICAgICAgICB0aGlzLkh1Yk5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogR3JvdXAgbGlzdCAqL1xyXG4gICAgICAgIHRoaXMuR3JvdXBMaXN0ID0gW107XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNFbnVtR3JvdXA7XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjRW51bUdyb3VwID0gVnBuUnBjRW51bUdyb3VwO1xyXG4vKiogRW51bWVyYXRpb24gaXRlbXMgb2YgSFVCICovXHJcbnZhciBWcG5ScGNFbnVtSHViSXRlbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNFbnVtSHViSXRlbScgY2xhc3M6IEVudW1lcmF0aW9uIGl0ZW1zIG9mIEhVQiAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjRW51bUh1Ykl0ZW0oaW5pdCkge1xyXG4gICAgICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgVmlydHVhbCBIdWIgKi9cclxuICAgICAgICB0aGlzLkh1Yk5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogT25saW5lIHN0YXRlICovXHJcbiAgICAgICAgdGhpcy5PbmxpbmVfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBUeXBlIG9mIEhVQiAoVmFsaWQgb25seSBmb3IgQ2x1c3RlcmVkIFZQTiBTZXJ2ZXJzKSAqL1xyXG4gICAgICAgIHRoaXMuSHViVHlwZV91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBOdW1iZXIgb2YgdXNlcnMgKi9cclxuICAgICAgICB0aGlzLk51bVVzZXJzX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIE51bWJlciBvZiByZWdpc3RlcmVkIGdyb3VwcyAqL1xyXG4gICAgICAgIHRoaXMuTnVtR3JvdXBzX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIE51bWJlciBvZiByZWdpc3RlcmVkIHNlc3Npb25zICovXHJcbiAgICAgICAgdGhpcy5OdW1TZXNzaW9uc191MzIgPSAwO1xyXG4gICAgICAgIC8qKiBOdW1iZXIgb2YgY3VycmVudCBNQUMgdGFibGUgZW50cmllcyAqL1xyXG4gICAgICAgIHRoaXMuTnVtTWFjVGFibGVzX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIE51bWJlciBvZiBjdXJyZW50IElQIHRhYmxlIGVudHJpZXMgKi9cclxuICAgICAgICB0aGlzLk51bUlwVGFibGVzX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIExhc3QgY29tbXVuaWNhdGlvbiBkYXRlIGFuZCB0aW1lICovXHJcbiAgICAgICAgdGhpcy5MYXN0Q29tbVRpbWVfZHQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIC8qKiBMYXN0IGxvZ2luIGRhdGUgYW5kIHRpbWUgKi9cclxuICAgICAgICB0aGlzLkxhc3RMb2dpblRpbWVfZHQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIC8qKiBDcmVhdGlvbiBkYXRlIGFuZCB0aW1lICovXHJcbiAgICAgICAgdGhpcy5DcmVhdGVkVGltZV9kdCA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgLyoqIE51bWJlciBvZiBhY2N1bXVsYXRlZCBsb2dpbnMgKi9cclxuICAgICAgICB0aGlzLk51bUxvZ2luX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIFdoZXRoZXIgdGhlIHRyYWZmaWMgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgKi9cclxuICAgICAgICB0aGlzLklzVHJhZmZpY0ZpbGxlZF9ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIE51bWJlciBvZiBicm9hZGNhc3QgcGFja2V0cyAoUmVjdikgKi9cclxuICAgICAgICB0aGlzW1wiRXguUmVjdi5Ccm9hZGNhc3RCeXRlc191NjRcIl0gPSAwO1xyXG4gICAgICAgIC8qKiBCcm9hZGNhc3QgYnl0ZXMgKFJlY3YpICovXHJcbiAgICAgICAgdGhpc1tcIkV4LlJlY3YuQnJvYWRjYXN0Q291bnRfdTY0XCJdID0gMDtcclxuICAgICAgICAvKiogVW5pY2FzdCBjb3VudCAoUmVjdikgKi9cclxuICAgICAgICB0aGlzW1wiRXguUmVjdi5VbmljYXN0Qnl0ZXNfdTY0XCJdID0gMDtcclxuICAgICAgICAvKiogVW5pY2FzdCBieXRlcyAoUmVjdikgKi9cclxuICAgICAgICB0aGlzW1wiRXguUmVjdi5VbmljYXN0Q291bnRfdTY0XCJdID0gMDtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIGJyb2FkY2FzdCBwYWNrZXRzIChTZW5kKSAqL1xyXG4gICAgICAgIHRoaXNbXCJFeC5TZW5kLkJyb2FkY2FzdEJ5dGVzX3U2NFwiXSA9IDA7XHJcbiAgICAgICAgLyoqIEJyb2FkY2FzdCBieXRlcyAoU2VuZCkgKi9cclxuICAgICAgICB0aGlzW1wiRXguU2VuZC5Ccm9hZGNhc3RDb3VudF91NjRcIl0gPSAwO1xyXG4gICAgICAgIC8qKiBVbmljYXN0IGJ5dGVzIChTZW5kKSAqL1xyXG4gICAgICAgIHRoaXNbXCJFeC5TZW5kLlVuaWNhc3RCeXRlc191NjRcIl0gPSAwO1xyXG4gICAgICAgIC8qKiBVbmljYXN0IGJ5dGVzIChTZW5kKSAqL1xyXG4gICAgICAgIHRoaXNbXCJFeC5TZW5kLlVuaWNhc3RDb3VudF91NjRcIl0gPSAwO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjRW51bUh1Ykl0ZW07XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjRW51bUh1Ykl0ZW0gPSBWcG5ScGNFbnVtSHViSXRlbTtcclxuLyoqIEVudW1lcmF0aW9uIG9mIEhVQiAqL1xyXG52YXIgVnBuUnBjRW51bUh1YiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNFbnVtSHViJyBjbGFzczogRW51bWVyYXRpb24gb2YgSFVCICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNFbnVtSHViKGluaXQpIHtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIFZpcnR1YWwgSHVicyAqL1xyXG4gICAgICAgIHRoaXMuTnVtSHViX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIFZpcnR1YWwgSHVicyAqL1xyXG4gICAgICAgIHRoaXMuSHViTGlzdCA9IFtdO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjRW51bUh1YjtcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNFbnVtSHViID0gVnBuUnBjRW51bUh1YjtcclxuLyoqIEVudW1lcmF0aW9uIGl0ZW1zIG9mIElQIHRhYmxlICovXHJcbnZhciBWcG5ScGNFbnVtSXBUYWJsZUl0ZW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjRW51bUlwVGFibGVJdGVtJyBjbGFzczogRW51bWVyYXRpb24gaXRlbXMgb2YgSVAgdGFibGUgKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY0VudW1JcFRhYmxlSXRlbShpbml0KSB7XHJcbiAgICAgICAgLyoqIEtleSBJRCAqL1xyXG4gICAgICAgIHRoaXMuS2V5X3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIFNlc3Npb24gbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuU2Vzc2lvbk5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogSVAgYWRkcmVzcyAqL1xyXG4gICAgICAgIHRoaXMuSXBBZGRyZXNzX2lwID0gXCJcIjtcclxuICAgICAgICAvKiogQXNzaWduZWQgYnkgdGhlIERIQ1AgKi9cclxuICAgICAgICB0aGlzLkRoY3BBbGxvY2F0ZWRfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBDcmVhdGlvbiBkYXRlIGFuZCB0aW1lICovXHJcbiAgICAgICAgdGhpcy5DcmVhdGVkVGltZV9kdCA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgLyoqIFVwZGF0aW5nIGRhdGUgKi9cclxuICAgICAgICB0aGlzLlVwZGF0ZWRUaW1lX2R0ID0gbmV3IERhdGUoKTtcclxuICAgICAgICAvKiogUmVtb3RlIGl0ZW1zICovXHJcbiAgICAgICAgdGhpcy5SZW1vdGVJdGVtX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogUmVtb3RlIGhvc3QgbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuUmVtb3RlSG9zdG5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY0VudW1JcFRhYmxlSXRlbTtcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNFbnVtSXBUYWJsZUl0ZW0gPSBWcG5ScGNFbnVtSXBUYWJsZUl0ZW07XHJcbi8qKiBFbnVtZXJhdGlvbiBvZiBJUCB0YWJsZSAqL1xyXG52YXIgVnBuUnBjRW51bUlwVGFibGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjRW51bUlwVGFibGUnIGNsYXNzOiBFbnVtZXJhdGlvbiBvZiBJUCB0YWJsZSAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjRW51bUlwVGFibGUoaW5pdCkge1xyXG4gICAgICAgIC8qKiBUaGUgVmlydHVhbCBIdWIgbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuSHViTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBNQUMgdGFibGUgKi9cclxuICAgICAgICB0aGlzLklwVGFibGUgPSBbXTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY0VudW1JcFRhYmxlO1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY0VudW1JcFRhYmxlID0gVnBuUnBjRW51bUlwVGFibGU7XHJcbi8qKiBMYXllci0zIGludGVyZmFjZSBlbnVtZXJhdGlvbiAqL1xyXG52YXIgVnBuUnBjRW51bUwzSWYgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjRW51bUwzSWYnIGNsYXNzOiBMYXllci0zIGludGVyZmFjZSBlbnVtZXJhdGlvbiAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjRW51bUwzSWYoaW5pdCkge1xyXG4gICAgICAgIC8qKiBMYXllci0zIHN3aXRjaCBuYW1lICovXHJcbiAgICAgICAgdGhpcy5OYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIExheWVyLTMgaW50ZXJmYWNlIGxpc3QgKi9cclxuICAgICAgICB0aGlzLkwzSUZMaXN0ID0gW107XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNFbnVtTDNJZjtcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNFbnVtTDNJZiA9IFZwblJwY0VudW1MM0lmO1xyXG4vKiogTGF5ZXItMyBzd2l0Y2ggZW51bWVyYXRpb24gaXRlbSAqL1xyXG52YXIgVnBuUnBjRW51bUwzU3dJdGVtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwblJwY0VudW1MM1N3SXRlbScgY2xhc3M6IExheWVyLTMgc3dpdGNoIGVudW1lcmF0aW9uIGl0ZW0gKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY0VudW1MM1N3SXRlbShpbml0KSB7XHJcbiAgICAgICAgLyoqIE5hbWUgb2YgdGhlIGxheWVyLTMgc3dpdGNoICovXHJcbiAgICAgICAgdGhpcy5OYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIE51bWJlciBvZiBsYXllci0zIHN3aXRjaCB2aXJ0dWFsIGludGVyZmFjZXMgKi9cclxuICAgICAgICB0aGlzLk51bUludGVyZmFjZXNfdTMyID0gMDtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIHJvdXRpbmcgdGFibGVzICovXHJcbiAgICAgICAgdGhpcy5OdW1UYWJsZXNfdTMyID0gMDtcclxuICAgICAgICAvKiogQWN0aXZhdGVkIGZsYWcgKi9cclxuICAgICAgICB0aGlzLkFjdGl2ZV9ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIE9ubGluZSBmbGFnICovXHJcbiAgICAgICAgdGhpcy5PbmxpbmVfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjRW51bUwzU3dJdGVtO1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY0VudW1MM1N3SXRlbSA9IFZwblJwY0VudW1MM1N3SXRlbTtcclxuLyoqIExheWVyLTMgc3dpdGNoIGVudW1lcmF0aW9uICovXHJcbnZhciBWcG5ScGNFbnVtTDNTdyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNFbnVtTDNTdycgY2xhc3M6IExheWVyLTMgc3dpdGNoIGVudW1lcmF0aW9uICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNFbnVtTDNTdyhpbml0KSB7XHJcbiAgICAgICAgLyoqIExheWVyLTMgc3dpdGNoIGxpc3QgKi9cclxuICAgICAgICB0aGlzLkwzU1dMaXN0ID0gW107XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNFbnVtTDNTdztcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNFbnVtTDNTdyA9IFZwblJwY0VudW1MM1N3O1xyXG4vKiogUm91dGluZyB0YWJsZSBlbnVtZXJhdGlvbiAqL1xyXG52YXIgVnBuUnBjRW51bUwzVGFibGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjRW51bUwzVGFibGUnIGNsYXNzOiBSb3V0aW5nIHRhYmxlIGVudW1lcmF0aW9uICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNFbnVtTDNUYWJsZShpbml0KSB7XHJcbiAgICAgICAgLyoqIEwzIHN3aXRjaCBuYW1lICovXHJcbiAgICAgICAgdGhpcy5OYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFJvdXRpbmcgdGFibGUgaXRlbSBsaXN0ICovXHJcbiAgICAgICAgdGhpcy5MM1RhYmxlID0gW107XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNFbnVtTDNUYWJsZTtcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNFbnVtTDNUYWJsZSA9IFZwblJwY0VudW1MM1RhYmxlO1xyXG4vKiogQ2FzY2FkZSBDb25uZWN0aW9uIEVudW1lcmF0aW9uICovXHJcbnZhciBWcG5ScGNFbnVtTGlua0l0ZW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjRW51bUxpbmtJdGVtJyBjbGFzczogQ2FzY2FkZSBDb25uZWN0aW9uIEVudW1lcmF0aW9uICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNFbnVtTGlua0l0ZW0oaW5pdCkge1xyXG4gICAgICAgIC8qKiBUaGUgbmFtZSBvZiBjYXNjYWRlIGNvbm5lY3Rpb24gKi9cclxuICAgICAgICB0aGlzLkFjY291bnROYW1lX3V0ZiA9IFwiXCI7XHJcbiAgICAgICAgLyoqIE9ubGluZSBmbGFnICovXHJcbiAgICAgICAgdGhpcy5PbmxpbmVfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBUaGUgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgY2FzY2FkZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkICovXHJcbiAgICAgICAgdGhpcy5Db25uZWN0ZWRfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBUaGUgZXJyb3IgbGFzdCBvY2N1cnJlZCBpZiB0aGUgY2FzY2FkZSBjb25uZWN0aW9uIGlzIGluIHRoZSBmYWlsIHN0YXRlICovXHJcbiAgICAgICAgdGhpcy5MYXN0RXJyb3JfdTMyID0gMDtcclxuICAgICAgICAvKiogQ29ubmVjdGlvbiBjb21wbGV0aW9uIHRpbWUgKi9cclxuICAgICAgICB0aGlzLkNvbm5lY3RlZFRpbWVfZHQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIC8qKiBIb3N0IG5hbWUgb2YgdGhlIGRlc3RpbmF0aW9uIFZQTiBzZXJ2ZXIgKi9cclxuICAgICAgICB0aGlzLkhvc3RuYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFRoZSBWaXJ0dWFsIEh1YiBuYW1lICovXHJcbiAgICAgICAgdGhpcy5UYXJnZXRIdWJOYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNFbnVtTGlua0l0ZW07XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjRW51bUxpbmtJdGVtID0gVnBuUnBjRW51bUxpbmtJdGVtO1xyXG4vKiogRW51bWVyYXRpb24gb2YgdGhlIGxpbmsgKi9cclxudmFyIFZwblJwY0VudW1MaW5rID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwblJwY0VudW1MaW5rJyBjbGFzczogRW51bWVyYXRpb24gb2YgdGhlIGxpbmsgKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY0VudW1MaW5rKGluaXQpIHtcclxuICAgICAgICAvKiogVGhlIFZpcnR1YWwgSHViIG5hbWUgKi9cclxuICAgICAgICB0aGlzLkh1Yk5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIGNhc2NhZGUgY29ubmVjdGlvbnMgKi9cclxuICAgICAgICB0aGlzLk51bUxpbmtfdTMyID0gMDtcclxuICAgICAgICAvKiogVGhlIGxpc3Qgb2YgY2FzY2FkZSBjb25uZWN0aW9ucyAqL1xyXG4gICAgICAgIHRoaXMuTGlua0xpc3QgPSBbXTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY0VudW1MaW5rO1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY0VudW1MaW5rID0gVnBuUnBjRW51bUxpbms7XHJcbi8qKiBMaXN0IG9mIGxpc3RlbmVycyBpdGVtICovXHJcbnZhciBWcG5ScGNMaXN0ZW5lckxpc3RJdGVtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwblJwY0xpc3RlbmVyTGlzdEl0ZW0nIGNsYXNzOiBMaXN0IG9mIGxpc3RlbmVycyBpdGVtICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNMaXN0ZW5lckxpc3RJdGVtKGluaXQpIHtcclxuICAgICAgICAvKiogVENQIHBvcnQgbnVtYmVyIChyYW5nZTogMSAtIDY1NTM1KSAqL1xyXG4gICAgICAgIHRoaXMuUG9ydHNfdTMyID0gMDtcclxuICAgICAgICAvKiogQWN0aXZlIHN0YXRlICovXHJcbiAgICAgICAgdGhpcy5FbmFibGVzX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogVGhlIGZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIGVycm9yIG9jY3VycmVkIG9uIHRoZSBsaXN0ZW5lciBwb3J0ICovXHJcbiAgICAgICAgdGhpcy5FcnJvcnNfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjTGlzdGVuZXJMaXN0SXRlbTtcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNMaXN0ZW5lckxpc3RJdGVtID0gVnBuUnBjTGlzdGVuZXJMaXN0SXRlbTtcclxuLyoqIExpc3Qgb2YgbGlzdGVuZXJzICovXHJcbnZhciBWcG5ScGNMaXN0ZW5lckxpc3QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjTGlzdGVuZXJMaXN0JyBjbGFzczogTGlzdCBvZiBsaXN0ZW5lcnMgKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY0xpc3RlbmVyTGlzdChpbml0KSB7XHJcbiAgICAgICAgLyoqIExpc3Qgb2YgbGlzdGVuZXIgaXRlbXMgKi9cclxuICAgICAgICB0aGlzLkxpc3RlbmVyTGlzdCA9IFtdO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjTGlzdGVuZXJMaXN0O1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY0xpc3RlbmVyTGlzdCA9IFZwblJwY0xpc3RlbmVyTGlzdDtcclxuLyoqIExvY2FsIEJyaWRnZSBlbnVtZXJhdGlvbiAqL1xyXG52YXIgVnBuUnBjRW51bUxvY2FsQnJpZGdlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwblJwY0VudW1Mb2NhbEJyaWRnZScgY2xhc3M6IExvY2FsIEJyaWRnZSBlbnVtZXJhdGlvbiAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjRW51bUxvY2FsQnJpZGdlKGluaXQpIHtcclxuICAgICAgICAvKiogTG9jYWwgQnJpZGdlIGxpc3QgKi9cclxuICAgICAgICB0aGlzLkxvY2FsQnJpZGdlTGlzdCA9IFtdO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjRW51bUxvY2FsQnJpZGdlO1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY0VudW1Mb2NhbEJyaWRnZSA9IFZwblJwY0VudW1Mb2NhbEJyaWRnZTtcclxuLyoqIExvZyBmaWxlIGVudW1lcmF0aW9uICovXHJcbnZhciBWcG5ScGNFbnVtTG9nRmlsZUl0ZW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjRW51bUxvZ0ZpbGVJdGVtJyBjbGFzczogTG9nIGZpbGUgZW51bWVyYXRpb24gKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY0VudW1Mb2dGaWxlSXRlbShpbml0KSB7XHJcbiAgICAgICAgLyoqIFNlcnZlciBuYW1lICovXHJcbiAgICAgICAgdGhpcy5TZXJ2ZXJOYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIEZpbGUgcGF0aCAqL1xyXG4gICAgICAgIHRoaXMuRmlsZVBhdGhfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogRmlsZSBzaXplICovXHJcbiAgICAgICAgdGhpcy5GaWxlU2l6ZV91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBMYXN0IHdyaXRlIGRhdGUgKi9cclxuICAgICAgICB0aGlzLlVwZGF0ZWRUaW1lX2R0ID0gbmV3IERhdGUoKTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY0VudW1Mb2dGaWxlSXRlbTtcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNFbnVtTG9nRmlsZUl0ZW0gPSBWcG5ScGNFbnVtTG9nRmlsZUl0ZW07XHJcbi8qKiBMb2cgZmlsZSBlbnVtZXJhdGlvbiAqL1xyXG52YXIgVnBuUnBjRW51bUxvZ0ZpbGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjRW51bUxvZ0ZpbGUnIGNsYXNzOiBMb2cgZmlsZSBlbnVtZXJhdGlvbiAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjRW51bUxvZ0ZpbGUoaW5pdCkge1xyXG4gICAgICAgIC8qKiBMb2cgZmlsZSBsaXN0ICovXHJcbiAgICAgICAgdGhpcy5Mb2dGaWxlcyA9IFtdO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjRW51bUxvZ0ZpbGU7XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjRW51bUxvZ0ZpbGUgPSBWcG5ScGNFbnVtTG9nRmlsZTtcclxuLyoqIEVudW1lcmF0aW9uIGl0ZW1zIG9mIHRoZSBNQUMgdGFibGUgKi9cclxudmFyIFZwblJwY0VudW1NYWNUYWJsZUl0ZW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjRW51bU1hY1RhYmxlSXRlbScgY2xhc3M6IEVudW1lcmF0aW9uIGl0ZW1zIG9mIHRoZSBNQUMgdGFibGUgKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY0VudW1NYWNUYWJsZUl0ZW0oaW5pdCkge1xyXG4gICAgICAgIC8qKiBLZXkgSUQgKi9cclxuICAgICAgICB0aGlzLktleV91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBTZXNzaW9uIG5hbWUgKi9cclxuICAgICAgICB0aGlzLlNlc3Npb25OYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIE1BQyBhZGRyZXNzICovXHJcbiAgICAgICAgdGhpcy5NYWNBZGRyZXNzX2JpbiA9IG5ldyBVaW50OEFycmF5KFtdKTtcclxuICAgICAgICAvKiogQ3JlYXRpb24gZGF0ZSBhbmQgdGltZSAqL1xyXG4gICAgICAgIHRoaXMuQ3JlYXRlZFRpbWVfZHQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIC8qKiBVcGRhdGluZyBkYXRlICovXHJcbiAgICAgICAgdGhpcy5VcGRhdGVkVGltZV9kdCA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgLyoqIFJlbW90ZSBpdGVtcyAqL1xyXG4gICAgICAgIHRoaXMuUmVtb3RlSXRlbV9ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFJlbW90ZSBob3N0IG5hbWUgKi9cclxuICAgICAgICB0aGlzLlJlbW90ZUhvc3RuYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFZMQU4gSUQgKi9cclxuICAgICAgICB0aGlzLlZsYW5JZF91MzIgPSAwO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjRW51bU1hY1RhYmxlSXRlbTtcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNFbnVtTWFjVGFibGVJdGVtID0gVnBuUnBjRW51bU1hY1RhYmxlSXRlbTtcclxuLyoqIEVudW1lcmF0aW9uIG9mIHRoZSBNQUMgdGFibGUgKi9cclxudmFyIFZwblJwY0VudW1NYWNUYWJsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNFbnVtTWFjVGFibGUnIGNsYXNzOiBFbnVtZXJhdGlvbiBvZiB0aGUgTUFDIHRhYmxlICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNFbnVtTWFjVGFibGUoaW5pdCkge1xyXG4gICAgICAgIC8qKiBUaGUgVmlydHVhbCBIdWIgbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuSHViTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBNQUMgdGFibGUgKi9cclxuICAgICAgICB0aGlzLk1hY1RhYmxlID0gW107XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNFbnVtTWFjVGFibGU7XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjRW51bU1hY1RhYmxlID0gVnBuUnBjRW51bU1hY1RhYmxlO1xyXG4vKiogTkFUIEVudHJ5IFByb3RvY29sIE51bWJlciAqL1xyXG52YXIgVnBuUnBjTmF0UHJvdG9jb2w7XHJcbihmdW5jdGlvbiAoVnBuUnBjTmF0UHJvdG9jb2wpIHtcclxuICAgIC8qKiBUQ1AgKi9cclxuICAgIFZwblJwY05hdFByb3RvY29sW1ZwblJwY05hdFByb3RvY29sW1wiVENQXCJdID0gMF0gPSBcIlRDUFwiO1xyXG4gICAgLyoqIFVEUCAqL1xyXG4gICAgVnBuUnBjTmF0UHJvdG9jb2xbVnBuUnBjTmF0UHJvdG9jb2xbXCJVRFBcIl0gPSAxXSA9IFwiVURQXCI7XHJcbiAgICAvKiogRE5TICovXHJcbiAgICBWcG5ScGNOYXRQcm90b2NvbFtWcG5ScGNOYXRQcm90b2NvbFtcIkROU1wiXSA9IDJdID0gXCJETlNcIjtcclxuICAgIC8qKiBJQ01QICovXHJcbiAgICBWcG5ScGNOYXRQcm90b2NvbFtWcG5ScGNOYXRQcm90b2NvbFtcIklDTVBcIl0gPSAzXSA9IFwiSUNNUFwiO1xyXG59KShWcG5ScGNOYXRQcm90b2NvbCA9IGV4cG9ydHMuVnBuUnBjTmF0UHJvdG9jb2wgfHwgKGV4cG9ydHMuVnBuUnBjTmF0UHJvdG9jb2wgPSB7fSkpO1xyXG4vKiogU3RhdGUgb2YgTkFUIHNlc3Npb24gKFRDUCkgKi9cclxudmFyIFZwblJwY05hdFRjcFN0YXRlO1xyXG4oZnVuY3Rpb24gKFZwblJwY05hdFRjcFN0YXRlKSB7XHJcbiAgICAvKiogQ29ubmVjdGluZyAqL1xyXG4gICAgVnBuUnBjTmF0VGNwU3RhdGVbVnBuUnBjTmF0VGNwU3RhdGVbXCJDb25uZWN0aW5nXCJdID0gMF0gPSBcIkNvbm5lY3RpbmdcIjtcclxuICAgIC8qKiBTZW5kIHRoZSBSU1QgKENvbm5lY3Rpb24gZmFpbHVyZSBvciBkaXNjb25uZWN0ZWQpICovXHJcbiAgICBWcG5ScGNOYXRUY3BTdGF0ZVtWcG5ScGNOYXRUY3BTdGF0ZVtcIlNlbmRSZXNldFwiXSA9IDFdID0gXCJTZW5kUmVzZXRcIjtcclxuICAgIC8qKiBDb25uZWN0aW9uIGNvbXBsZXRlICovXHJcbiAgICBWcG5ScGNOYXRUY3BTdGF0ZVtWcG5ScGNOYXRUY3BTdGF0ZVtcIkNvbm5lY3RlZFwiXSA9IDJdID0gXCJDb25uZWN0ZWRcIjtcclxuICAgIC8qKiBDb25uZWN0aW9uIGVzdGFibGlzaGVkICovXHJcbiAgICBWcG5ScGNOYXRUY3BTdGF0ZVtWcG5ScGNOYXRUY3BTdGF0ZVtcIkVzdGFibGlzaGVkXCJdID0gM10gPSBcIkVzdGFibGlzaGVkXCI7XHJcbiAgICAvKiogV2FpdCBmb3Igc29ja2V0IGRpc2Nvbm5lY3Rpb24gKi9cclxuICAgIFZwblJwY05hdFRjcFN0YXRlW1ZwblJwY05hdFRjcFN0YXRlW1wiV2FpdERpc2Nvbm5lY3RcIl0gPSA0XSA9IFwiV2FpdERpc2Nvbm5lY3RcIjtcclxufSkoVnBuUnBjTmF0VGNwU3RhdGUgPSBleHBvcnRzLlZwblJwY05hdFRjcFN0YXRlIHx8IChleHBvcnRzLlZwblJwY05hdFRjcFN0YXRlID0ge30pKTtcclxuLyoqIFZwblJwY0VudW1OYXQgTGlzdCBJdGVtICovXHJcbnZhciBWcG5ScGNFbnVtTmF0SXRlbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNFbnVtTmF0SXRlbScgY2xhc3M6IFZwblJwY0VudW1OYXQgTGlzdCBJdGVtICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNFbnVtTmF0SXRlbShpbml0KSB7XHJcbiAgICAgICAgLyoqIElEICovXHJcbiAgICAgICAgdGhpcy5JZF91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBQcm90b2NvbCAqL1xyXG4gICAgICAgIHRoaXMuUHJvdG9jb2xfdTMyID0gMDtcclxuICAgICAgICAvKiogU291cmNlIElQIGFkZHJlc3MgKi9cclxuICAgICAgICB0aGlzLlNyY0lwX2lwID0gXCJcIjtcclxuICAgICAgICAvKiogU291cmNlIGhvc3QgbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuU3JjSG9zdF9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBTb3VyY2UgcG9ydCBudW1iZXIgKi9cclxuICAgICAgICB0aGlzLlNyY1BvcnRfdTMyID0gMDtcclxuICAgICAgICAvKiogRGVzdGluYXRpb24gSVAgYWRkcmVzcyAqL1xyXG4gICAgICAgIHRoaXMuRGVzdElwX2lwID0gXCJcIjtcclxuICAgICAgICAvKiogRGVzdGluYXRpb24gaG9zdCBuYW1lICovXHJcbiAgICAgICAgdGhpcy5EZXN0SG9zdF9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBEZXN0aW5hdGlvbiBwb3J0IG51bWJlciAqL1xyXG4gICAgICAgIHRoaXMuRGVzdFBvcnRfdTMyID0gMDtcclxuICAgICAgICAvKiogQ29ubmVjdGlvbiB0aW1lICovXHJcbiAgICAgICAgdGhpcy5DcmVhdGVkVGltZV9kdCA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgLyoqIExhc3QgY29tbXVuaWNhdGlvbiB0aW1lICovXHJcbiAgICAgICAgdGhpcy5MYXN0Q29tbVRpbWVfZHQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIC8qKiBUcmFuc21pc3Npb24gc2l6ZSAqL1xyXG4gICAgICAgIHRoaXMuU2VuZFNpemVfdTY0ID0gMDtcclxuICAgICAgICAvKiogUmVjZWl2ZSBzaXplICovXHJcbiAgICAgICAgdGhpcy5SZWN2U2l6ZV91NjQgPSAwO1xyXG4gICAgICAgIC8qKiBUQ1Agc3RhdGUgKi9cclxuICAgICAgICB0aGlzLlRjcFN0YXR1c191MzIgPSAwO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjRW51bU5hdEl0ZW07XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjRW51bU5hdEl0ZW0gPSBWcG5ScGNFbnVtTmF0SXRlbTtcclxuLyoqIFJQQ19FTlVNX05BVCAqL1xyXG52YXIgVnBuUnBjRW51bU5hdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNFbnVtTmF0JyBjbGFzczogUlBDX0VOVU1fTkFUICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNFbnVtTmF0KGluaXQpIHtcclxuICAgICAgICAvKiogVmlydHVhbCBIdWIgTmFtZSAqL1xyXG4gICAgICAgIHRoaXMuSHViTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBOQVQgaXRlbSAqL1xyXG4gICAgICAgIHRoaXMuTmF0VGFibGUgPSBbXTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY0VudW1OYXQ7XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjRW51bU5hdCA9IFZwblJwY0VudW1OYXQ7XHJcbi8qKiBFbnVtZXJhdGlvbiBpdGVtIG9mIFZQTiBzZXNzaW9uICovXHJcbnZhciBWcG5ScGNFbnVtU2Vzc2lvbkl0ZW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjRW51bVNlc3Npb25JdGVtJyBjbGFzczogRW51bWVyYXRpb24gaXRlbSBvZiBWUE4gc2Vzc2lvbiAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjRW51bVNlc3Npb25JdGVtKGluaXQpIHtcclxuICAgICAgICAvKiogU2Vzc2lvbiBuYW1lICovXHJcbiAgICAgICAgdGhpcy5OYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFJlbW90ZSBzZXNzaW9uICovXHJcbiAgICAgICAgdGhpcy5SZW1vdGVTZXNzaW9uX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogUmVtb3RlIHNlcnZlciBuYW1lICovXHJcbiAgICAgICAgdGhpcy5SZW1vdGVIb3N0bmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBVc2VyIG5hbWUgKi9cclxuICAgICAgICB0aGlzLlVzZXJuYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIElQIGFkZHJlc3MgKi9cclxuICAgICAgICB0aGlzLkNsaWVudElQX2lwID0gXCJcIjtcclxuICAgICAgICAvKiogSG9zdCBuYW1lICovXHJcbiAgICAgICAgdGhpcy5Ib3N0bmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBNYXhpbXVtIG51bWJlciBvZiB1bmRlcmx5aW5nIFRDUCBjb25uZWN0aW9ucyAqL1xyXG4gICAgICAgIHRoaXMuTWF4TnVtVGNwX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIE51bWJlciBvZiBjdXJyZW50IHVuZGVybHlpbmcgVENQIGNvbm5lY3Rpb25zICovXHJcbiAgICAgICAgdGhpcy5DdXJyZW50TnVtVGNwX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIFBhY2tldCBzaXplIHRyYW5zbWl0dGVkICovXHJcbiAgICAgICAgdGhpcy5QYWNrZXRTaXplX3U2NCA9IDA7XHJcbiAgICAgICAgLyoqIE51bWJlciBvZiBwYWNrZXRzIHRyYW5zbWl0dGVkICovXHJcbiAgICAgICAgdGhpcy5QYWNrZXROdW1fdTY0ID0gMDtcclxuICAgICAgICAvKiogSXMgYSBDYXNjYWRlIFZQTiBzZXNzaW9uICovXHJcbiAgICAgICAgdGhpcy5MaW5rTW9kZV9ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIElzIGEgU2VjdXJlTkFUIFZQTiBzZXNzaW9uICovXHJcbiAgICAgICAgdGhpcy5TZWN1cmVOQVRNb2RlX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogSXMgdGhlIFZQTiBzZXNzaW9uIGZvciBMb2NhbCBCcmlkZ2UgKi9cclxuICAgICAgICB0aGlzLkJyaWRnZU1vZGVfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBJcyBhIExheWVyLTMgU3dpdGNoIFZQTiBzZXNzaW9uICovXHJcbiAgICAgICAgdGhpcy5MYXllcjNNb2RlX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogSXMgaW4gQnJpZGdlIE1vZGUgKi9cclxuICAgICAgICB0aGlzLkNsaWVudF9CcmlkZ2VNb2RlX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogSXMgaW4gTW9uaXRvciBNb2RlICovXHJcbiAgICAgICAgdGhpcy5DbGllbnRfTW9uaXRvck1vZGVfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBWTEFOIElEICovXHJcbiAgICAgICAgdGhpcy5WTGFuSWRfdTMyID0gMDtcclxuICAgICAgICAvKiogVW5pcXVlIElEIG9mIHRoZSBWUE4gU2Vzc2lvbiAqL1xyXG4gICAgICAgIHRoaXMuVW5pcXVlSWRfYmluID0gbmV3IFVpbnQ4QXJyYXkoW10pO1xyXG4gICAgICAgIC8qKiBDcmVhdGlvbiBkYXRlIGFuZCB0aW1lICovXHJcbiAgICAgICAgdGhpcy5DcmVhdGVkVGltZV9kdCA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgLyoqIExhc3QgY29tbXVuaWNhdGlvbiBkYXRlIGFuZCB0aW1lICovXHJcbiAgICAgICAgdGhpcy5MYXN0Q29tbVRpbWVfZHQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjRW51bVNlc3Npb25JdGVtO1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY0VudW1TZXNzaW9uSXRlbSA9IFZwblJwY0VudW1TZXNzaW9uSXRlbTtcclxuLyoqIEVudW1lcmF0ZSBWUE4gc2Vzc2lvbnMgKi9cclxudmFyIFZwblJwY0VudW1TZXNzaW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwblJwY0VudW1TZXNzaW9uJyBjbGFzczogRW51bWVyYXRlIFZQTiBzZXNzaW9ucyAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjRW51bVNlc3Npb24oaW5pdCkge1xyXG4gICAgICAgIC8qKiBUaGUgVmlydHVhbCBIdWIgbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuSHViTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBWUE4gc2Vzc2lvbnMgbGlzdCAqL1xyXG4gICAgICAgIHRoaXMuU2Vzc2lvbkxpc3QgPSBbXTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY0VudW1TZXNzaW9uO1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY0VudW1TZXNzaW9uID0gVnBuUnBjRW51bVNlc3Npb247XHJcbi8qKiBFbnVtZXJhdGlvbiBpdGVtIG9mIHVzZXIgKi9cclxudmFyIFZwblJwY0VudW1Vc2VySXRlbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNFbnVtVXNlckl0ZW0nIGNsYXNzOiBFbnVtZXJhdGlvbiBpdGVtIG9mIHVzZXIgKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY0VudW1Vc2VySXRlbShpbml0KSB7XHJcbiAgICAgICAgLyoqIFVzZXIgbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBHcm91cCBuYW1lICovXHJcbiAgICAgICAgdGhpcy5Hcm91cE5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogUmVhbCBuYW1lICovXHJcbiAgICAgICAgdGhpcy5SZWFsbmFtZV91dGYgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBOb3RlICovXHJcbiAgICAgICAgdGhpcy5Ob3RlX3V0ZiA9IFwiXCI7XHJcbiAgICAgICAgLyoqIEF1dGhlbnRpY2F0aW9uIG1ldGhvZCAqL1xyXG4gICAgICAgIHRoaXMuQXV0aFR5cGVfdTMyID0gMDtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIGxvZ2lucyAqL1xyXG4gICAgICAgIHRoaXMuTnVtTG9naW5fdTMyID0gMDtcclxuICAgICAgICAvKiogTGFzdCBsb2dpbiBkYXRlIGFuZCB0aW1lICovXHJcbiAgICAgICAgdGhpcy5MYXN0TG9naW5UaW1lX2R0ID0gbmV3IERhdGUoKTtcclxuICAgICAgICAvKiogQWNjZXNzIGRlbmllZCAqL1xyXG4gICAgICAgIHRoaXMuRGVueUFjY2Vzc19ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIEZsYWcgb2Ygd2hldGhlciB0aGUgdHJhZmZpYyB2YXJpYWJsZSBpcyBzZXQgKi9cclxuICAgICAgICB0aGlzLklzVHJhZmZpY0ZpbGxlZF9ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIEZsYWcgb2Ygd2hldGhlciBleHBpcmF0aW9uIGRhdGUgdmFyaWFibGUgaXMgc2V0ICovXHJcbiAgICAgICAgdGhpcy5Jc0V4cGlyZXNGaWxsZWRfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBFeHBpcmF0aW9uIGRhdGUgKi9cclxuICAgICAgICB0aGlzLkV4cGlyZXNfZHQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIC8qKiBOdW1iZXIgb2YgYnJvYWRjYXN0IHBhY2tldHMgKFJlY3YpICovXHJcbiAgICAgICAgdGhpc1tcIkV4LlJlY3YuQnJvYWRjYXN0Qnl0ZXNfdTY0XCJdID0gMDtcclxuICAgICAgICAvKiogQnJvYWRjYXN0IGJ5dGVzIChSZWN2KSAqL1xyXG4gICAgICAgIHRoaXNbXCJFeC5SZWN2LkJyb2FkY2FzdENvdW50X3U2NFwiXSA9IDA7XHJcbiAgICAgICAgLyoqIFVuaWNhc3QgY291bnQgKFJlY3YpICovXHJcbiAgICAgICAgdGhpc1tcIkV4LlJlY3YuVW5pY2FzdEJ5dGVzX3U2NFwiXSA9IDA7XHJcbiAgICAgICAgLyoqIFVuaWNhc3QgYnl0ZXMgKFJlY3YpICovXHJcbiAgICAgICAgdGhpc1tcIkV4LlJlY3YuVW5pY2FzdENvdW50X3U2NFwiXSA9IDA7XHJcbiAgICAgICAgLyoqIE51bWJlciBvZiBicm9hZGNhc3QgcGFja2V0cyAoU2VuZCkgKi9cclxuICAgICAgICB0aGlzW1wiRXguU2VuZC5Ccm9hZGNhc3RCeXRlc191NjRcIl0gPSAwO1xyXG4gICAgICAgIC8qKiBCcm9hZGNhc3QgYnl0ZXMgKFNlbmQpICovXHJcbiAgICAgICAgdGhpc1tcIkV4LlNlbmQuQnJvYWRjYXN0Q291bnRfdTY0XCJdID0gMDtcclxuICAgICAgICAvKiogVW5pY2FzdCBieXRlcyAoU2VuZCkgKi9cclxuICAgICAgICB0aGlzW1wiRXguU2VuZC5VbmljYXN0Qnl0ZXNfdTY0XCJdID0gMDtcclxuICAgICAgICAvKiogVW5pY2FzdCBieXRlcyAoU2VuZCkgKi9cclxuICAgICAgICB0aGlzW1wiRXguU2VuZC5VbmljYXN0Q291bnRfdTY0XCJdID0gMDtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY0VudW1Vc2VySXRlbTtcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNFbnVtVXNlckl0ZW0gPSBWcG5ScGNFbnVtVXNlckl0ZW07XHJcbi8qKiBFbnVtZXJhdGlvbiBvZiB1c2VyICovXHJcbnZhciBWcG5ScGNFbnVtVXNlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNFbnVtVXNlcicgY2xhc3M6IEVudW1lcmF0aW9uIG9mIHVzZXIgKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY0VudW1Vc2VyKGluaXQpIHtcclxuICAgICAgICAvKiogVGhlIFZpcnR1YWwgSHViIG5hbWUgKi9cclxuICAgICAgICB0aGlzLkh1Yk5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogVXNlciBsaXN0ICovXHJcbiAgICAgICAgdGhpcy5Vc2VyTGlzdCA9IFtdO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjRW51bVVzZXI7XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjRW51bVVzZXIgPSBWcG5ScGNFbnVtVXNlcjtcclxuLyoqIFNvdXJjZSBJUCBBZGRyZXNzIExpbWl0IExpc3QgSXRlbSAqL1xyXG52YXIgVnBuQWMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuQWMnIGNsYXNzOiBTb3VyY2UgSVAgQWRkcmVzcyBMaW1pdCBMaXN0IEl0ZW0gKi9cclxuICAgIGZ1bmN0aW9uIFZwbkFjKGluaXQpIHtcclxuICAgICAgICAvKiogSUQgKi9cclxuICAgICAgICB0aGlzLklkX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIFByaW9yaXR5ICovXHJcbiAgICAgICAgdGhpcy5Qcmlvcml0eV91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBEZW55IGFjY2VzcyAqL1xyXG4gICAgICAgIHRoaXMuRGVueV9ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNldCB0cnVlIGlmIHlvdSB3YW50IHRvIHNwZWNpZnkgdGhlIFN1Ym5ldE1hc2tfaXAgaXRlbS4gKi9cclxuICAgICAgICB0aGlzLk1hc2tlZF9ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIElQIGFkZHJlc3MgKi9cclxuICAgICAgICB0aGlzLklwQWRkcmVzc19pcCA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFN1Ym5ldCBtYXNrLCB2YWxpZCBvbmx5IGlmIE1hc2tlZF9ib29sID09IHRydWUgKi9cclxuICAgICAgICB0aGlzLlN1Ym5ldE1hc2tfaXAgPSBcIlwiO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuQWM7XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuQWMgPSBWcG5BYztcclxuLyoqIFNvdXJjZSBJUCBBZGRyZXNzIExpbWl0IExpc3QgKi9cclxudmFyIFZwblJwY0FjTGlzdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNBY0xpc3QnIGNsYXNzOiBTb3VyY2UgSVAgQWRkcmVzcyBMaW1pdCBMaXN0ICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNBY0xpc3QoaW5pdCkge1xyXG4gICAgICAgIC8qKiBUaGUgVmlydHVhbCBIdWIgbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuSHViTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBTb3VyY2UgSVAgQWRkcmVzcyBMaW1pdCBMaXN0ICovXHJcbiAgICAgICAgdGhpcy5BQ0xpc3QgPSBbXTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY0FjTGlzdDtcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNBY0xpc3QgPSBWcG5ScGNBY0xpc3Q7XHJcbi8qKiBNZXNzYWdlICovXHJcbnZhciBWcG5ScGNNc2cgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjTXNnJyBjbGFzczogTWVzc2FnZSAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjTXNnKGluaXQpIHtcclxuICAgICAgICAvKiogVGhlIFZpcnR1YWwgSHViIG5hbWUgKi9cclxuICAgICAgICB0aGlzLkh1Yk5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogTWVzc2FnZSAoVW5pY29kZSBzdHJpbmdzIGFjY2VwdGFibGUpICovXHJcbiAgICAgICAgdGhpcy5Nc2dfYmluID0gbmV3IFVpbnQ4QXJyYXkoW10pO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjTXNnO1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY01zZyA9IFZwblJwY01zZztcclxuLyoqIEdldCAvIFNldCB0aGUgQXp1cmUgc3RhdGUgKi9cclxudmFyIFZwblJwY0F6dXJlU3RhdHVzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwblJwY0F6dXJlU3RhdHVzJyBjbGFzczogR2V0IC8gU2V0IHRoZSBBenVyZSBzdGF0ZSAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjQXp1cmVTdGF0dXMoaW5pdCkge1xyXG4gICAgICAgIC8qKiBXaGV0aGVyIFZQTiBBenVyZSBGdW5jdGlvbiBpcyBFbmFibGVkICovXHJcbiAgICAgICAgdGhpcy5Jc0VuYWJsZWRfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBXaGV0aGVyIGNvbm5lY3Rpb24gdG8gVlBOIEF6dXJlIENsb3VkIFNlcnZlciBpcyBlc3RhYmxpc2hlZCAqL1xyXG4gICAgICAgIHRoaXMuSXNDb25uZWN0ZWRfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjQXp1cmVTdGF0dXM7XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjQXp1cmVTdGF0dXMgPSBWcG5ScGNBenVyZVN0YXR1cztcclxuLyoqIExvY2FsIEJyaWRnZSBzdXBwb3J0IGluZm9ybWF0aW9uICovXHJcbnZhciBWcG5ScGNCcmlkZ2VTdXBwb3J0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwblJwY0JyaWRnZVN1cHBvcnQnIGNsYXNzOiBMb2NhbCBCcmlkZ2Ugc3VwcG9ydCBpbmZvcm1hdGlvbiAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjQnJpZGdlU3VwcG9ydChpbml0KSB7XHJcbiAgICAgICAgLyoqIFdoZXRoZXIgdGhlIE9TIHN1cHBvcnRzIHRoZSBMb2NhbCBCcmlkZ2UgZnVuY3Rpb24gKi9cclxuICAgICAgICB0aGlzLklzQnJpZGdlU3VwcG9ydGVkT3NfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBXaGV0aGVyIFdpblBjYXAgaXMgbmVjZXNzYXJ5IHRvIGluc3RhbGwgKi9cclxuICAgICAgICB0aGlzLklzV2luUGNhcE5lZWRlZF9ib29sID0gZmFsc2U7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNCcmlkZ2VTdXBwb3J0O1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY0JyaWRnZVN1cHBvcnQgPSBWcG5ScGNCcmlkZ2VTdXBwb3J0O1xyXG4vKiogR2V0IHRoZSBDQSBvZiBIVUIgKi9cclxudmFyIFZwblJwY0h1YkdldENBID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwblJwY0h1YkdldENBJyBjbGFzczogR2V0IHRoZSBDQSBvZiBIVUIgKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY0h1YkdldENBKGluaXQpIHtcclxuICAgICAgICAvKiogVGhlIFZpcnR1YWwgSHViIG5hbWUgKi9cclxuICAgICAgICB0aGlzLkh1Yk5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogVGhlIGtleSBpZCBvZiB0aGUgY2VydGlmaWNhdGUgKi9cclxuICAgICAgICB0aGlzLktleV91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBUaGUgYm9keSBvZiB0aGUgWC41MDkgY2VydGlmaWNhdGUgKi9cclxuICAgICAgICB0aGlzLkNlcnRfYmluID0gbmV3IFVpbnQ4QXJyYXkoW10pO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjSHViR2V0Q0E7XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjSHViR2V0Q0EgPSBWcG5ScGNIdWJHZXRDQTtcclxuLyoqIENhcHMgaXRlbSBvZiB0aGUgVlBOIFNlcnZlciAqL1xyXG52YXIgVnBuQ2FwcyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5DYXBzJyBjbGFzczogQ2FwcyBpdGVtIG9mIHRoZSBWUE4gU2VydmVyICovXHJcbiAgICBmdW5jdGlvbiBWcG5DYXBzKGluaXQpIHtcclxuICAgICAgICAvKiogTmFtZSAqL1xyXG4gICAgICAgIHRoaXMuQ2Fwc05hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogVmFsdWUgKi9cclxuICAgICAgICB0aGlzLkNhcHNWYWx1ZV91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBEZXNjcnB0aW9uICovXHJcbiAgICAgICAgdGhpcy5DYXBzRGVzY3JwdGlvbl91dGYgPSBcIlwiO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuQ2FwcztcclxufSgpKTtcclxuZXhwb3J0cy5WcG5DYXBzID0gVnBuQ2FwcztcclxuLyoqIENhcHMgbGlzdCBvZiB0aGUgVlBOIFNlcnZlciAqL1xyXG52YXIgVnBuQ2Fwc2xpc3QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuQ2Fwc2xpc3QnIGNsYXNzOiBDYXBzIGxpc3Qgb2YgdGhlIFZQTiBTZXJ2ZXIgKi9cclxuICAgIGZ1bmN0aW9uIFZwbkNhcHNsaXN0KGluaXQpIHtcclxuICAgICAgICAvKiogQ2FwcyBsaXN0IG9mIHRoZSBWUE4gU2VydmVyICovXHJcbiAgICAgICAgdGhpcy5DYXBzTGlzdCA9IFtdO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuQ2Fwc2xpc3Q7XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuQ2Fwc2xpc3QgPSBWcG5DYXBzbGlzdDtcclxuLyoqIENvbmZpZyBvcGVyYXRpb24gKi9cclxudmFyIFZwblJwY0NvbmZpZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNDb25maWcnIGNsYXNzOiBDb25maWcgb3BlcmF0aW9uICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNDb25maWcoaW5pdCkge1xyXG4gICAgICAgIC8qKiBGaWxlIG5hbWUgKHZhbGlkIG9ubHkgZm9yIHJldHVybmluZyBmcm9tIHRoZSBzZXJ2ZXIpICovXHJcbiAgICAgICAgdGhpcy5GaWxlTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBGaWxlIGRhdGEgKi9cclxuICAgICAgICB0aGlzLkZpbGVEYXRhX2JpbiA9IG5ldyBVaW50OEFycmF5KFtdKTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY0NvbmZpZztcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNDb25maWcgPSBWcG5ScGNDb25maWc7XHJcbi8qKiBDb25uZWN0aW9uIGluZm9ybWF0aW9uICovXHJcbnZhciBWcG5ScGNDb25uZWN0aW9uSW5mbyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNDb25uZWN0aW9uSW5mbycgY2xhc3M6IENvbm5lY3Rpb24gaW5mb3JtYXRpb24gKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY0Nvbm5lY3Rpb25JbmZvKGluaXQpIHtcclxuICAgICAgICAvKiogQ29ubmVjdGlvbiBuYW1lICovXHJcbiAgICAgICAgdGhpcy5OYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFR5cGUgKi9cclxuICAgICAgICB0aGlzLlR5cGVfdTMyID0gMDtcclxuICAgICAgICAvKiogSG9zdCBuYW1lICovXHJcbiAgICAgICAgdGhpcy5Ib3N0bmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBJUCBhZGRyZXNzICovXHJcbiAgICAgICAgdGhpcy5JcF9pcCA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFBvcnQgbnVtYmVyICovXHJcbiAgICAgICAgdGhpcy5Qb3J0X3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIENvbm5lY3RlZCB0aW1lICovXHJcbiAgICAgICAgdGhpcy5Db25uZWN0ZWRUaW1lX2R0ID0gbmV3IERhdGUoKTtcclxuICAgICAgICAvKiogU2VydmVyIHN0cmluZyAqL1xyXG4gICAgICAgIHRoaXMuU2VydmVyU3RyX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFNlcnZlciB2ZXJzaW9uICovXHJcbiAgICAgICAgdGhpcy5TZXJ2ZXJWZXJfdTMyID0gMDtcclxuICAgICAgICAvKiogU2VydmVyIGJ1aWxkIG51bWJlciAqL1xyXG4gICAgICAgIHRoaXMuU2VydmVyQnVpbGRfdTMyID0gMDtcclxuICAgICAgICAvKiogQ2xpZW50IHN0cmluZyAqL1xyXG4gICAgICAgIHRoaXMuQ2xpZW50U3RyX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIENsaWVudCB2ZXJzaW9uICovXHJcbiAgICAgICAgdGhpcy5DbGllbnRWZXJfdTMyID0gMDtcclxuICAgICAgICAvKiogQ2xpZW50IGJ1aWxkIG51bWJlciAqL1xyXG4gICAgICAgIHRoaXMuQ2xpZW50QnVpbGRfdTMyID0gMDtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY0Nvbm5lY3Rpb25JbmZvO1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY0Nvbm5lY3Rpb25JbmZvID0gVnBuUnBjQ29ubmVjdGlvbkluZm87XHJcbi8qKiBQcm94eSB0eXBlICovXHJcbnZhciBWcG5ScGNQcm94eVR5cGU7XHJcbihmdW5jdGlvbiAoVnBuUnBjUHJveHlUeXBlKSB7XHJcbiAgICAvKiogRGlyZWN0IFRDUCBjb25uZWN0aW9uICovXHJcbiAgICBWcG5ScGNQcm94eVR5cGVbVnBuUnBjUHJveHlUeXBlW1wiRGlyZWN0XCJdID0gMF0gPSBcIkRpcmVjdFwiO1xyXG4gICAgLyoqIENvbm5lY3Rpb24gdmlhIEhUVFAgcHJveHkgc2VydmVyICovXHJcbiAgICBWcG5ScGNQcm94eVR5cGVbVnBuUnBjUHJveHlUeXBlW1wiSFRUUFwiXSA9IDFdID0gXCJIVFRQXCI7XHJcbiAgICAvKiogQ29ubmVjdGlvbiB2aWEgU09DS1MgcHJveHkgc2VydmVyICovXHJcbiAgICBWcG5ScGNQcm94eVR5cGVbVnBuUnBjUHJveHlUeXBlW1wiU09DS1NcIl0gPSAyXSA9IFwiU09DS1NcIjtcclxufSkoVnBuUnBjUHJveHlUeXBlID0gZXhwb3J0cy5WcG5ScGNQcm94eVR5cGUgfHwgKGV4cG9ydHMuVnBuUnBjUHJveHlUeXBlID0ge30pKTtcclxuLyoqIFRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgREROUyAqL1xyXG52YXIgVnBuRERuc0NsaWVudFN0YXR1cyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ERG5zQ2xpZW50U3RhdHVzJyBjbGFzczogVGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBERE5TICovXHJcbiAgICBmdW5jdGlvbiBWcG5ERG5zQ2xpZW50U3RhdHVzKGluaXQpIHtcclxuICAgICAgICAvKiogTGFzdCBlcnJvciBjb2RlIChJUHY0KSAqL1xyXG4gICAgICAgIHRoaXMuRXJyX0lQdjRfdTMyID0gMDtcclxuICAgICAgICAvKiogTGFzdCBlcnJvciBzdHJpbmcgKElQdjQpICovXHJcbiAgICAgICAgdGhpcy5FcnJTdHJfSVB2NF91dGYgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBMYXN0IGVycm9yIGNvZGUgKElQdjYpICovXHJcbiAgICAgICAgdGhpcy5FcnJfSVB2Nl91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBMYXN0IGVycm9yIHN0cmluZyAoSVB2NikgKi9cclxuICAgICAgICB0aGlzLkVyclN0cl9JUHY2X3V0ZiA9IFwiXCI7XHJcbiAgICAgICAgLyoqIEN1cnJlbnQgREROUyBob3N0IG5hbWUgKi9cclxuICAgICAgICB0aGlzLkN1cnJlbnRIb3N0TmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBDdXJyZW50IEZRRE4gb2YgdGhlIERETlMgaG9zdG5hbWUgKi9cclxuICAgICAgICB0aGlzLkN1cnJlbnRGcWRuX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIERETlMgc3VmZml4ICovXHJcbiAgICAgICAgdGhpcy5EbnNTdWZmaXhfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogQ3VycmVudCBJUHY0IGFkZHJlc3Mgb2YgdGhlIFZQTiBTZXJ2ZXIgKi9cclxuICAgICAgICB0aGlzLkN1cnJlbnRJUHY0X3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIEN1cnJlbnQgSVB2NiBhZGRyZXNzIG9mIHRoZSBWUE4gU2VydmVyICovXHJcbiAgICAgICAgdGhpcy5DdXJyZW50SVB2Nl9zdHIgPSBcIlwiO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuRERuc0NsaWVudFN0YXR1cztcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ERG5zQ2xpZW50U3RhdHVzID0gVnBuRERuc0NsaWVudFN0YXR1cztcclxuLyoqIEludGVybmV0IGNvbm5lY3Rpb24gc2V0dGluZ3MgKi9cclxudmFyIFZwbkludGVybmV0U2V0dGluZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5JbnRlcm5ldFNldHRpbmcnIGNsYXNzOiBJbnRlcm5ldCBjb25uZWN0aW9uIHNldHRpbmdzICovXHJcbiAgICBmdW5jdGlvbiBWcG5JbnRlcm5ldFNldHRpbmcoaW5pdCkge1xyXG4gICAgICAgIC8qKiBUeXBlIG9mIHByb3h5IHNlcnZlciAqL1xyXG4gICAgICAgIHRoaXMuUHJveHlUeXBlX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIFByb3h5IHNlcnZlciBob3N0IG5hbWUgKi9cclxuICAgICAgICB0aGlzLlByb3h5SG9zdE5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogUHJveHkgc2VydmVyIHBvcnQgbnVtYmVyICovXHJcbiAgICAgICAgdGhpcy5Qcm94eVBvcnRfdTMyID0gMDtcclxuICAgICAgICAvKiogUHJveHkgc2VydmVyIHVzZXIgbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuUHJveHlVc2VybmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBQcm94eSBzZXJ2ZXIgcGFzc3dvcmQgKi9cclxuICAgICAgICB0aGlzLlByb3h5UGFzc3dvcmRfc3RyID0gXCJcIjtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwbkludGVybmV0U2V0dGluZztcclxufSgpKTtcclxuZXhwb3J0cy5WcG5JbnRlcm5ldFNldHRpbmcgPSBWcG5JbnRlcm5ldFNldHRpbmc7XHJcbi8qKiBBZG1pbmlzdHJhdGlvbiBvcHRpb25zICovXHJcbnZhciBWcG5BZG1pbk9wdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5BZG1pbk9wdGlvbicgY2xhc3M6IEFkbWluaXN0cmF0aW9uIG9wdGlvbnMgKi9cclxuICAgIGZ1bmN0aW9uIFZwbkFkbWluT3B0aW9uKGluaXQpIHtcclxuICAgICAgICAvKiogTmFtZSAqL1xyXG4gICAgICAgIHRoaXMuTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBEYXRhICovXHJcbiAgICAgICAgdGhpcy5WYWx1ZV91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBEZXNjcnB0aW9uICovXHJcbiAgICAgICAgdGhpcy5EZXNjcnB0aW9uX3V0ZiA9IFwiXCI7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5BZG1pbk9wdGlvbjtcclxufSgpKTtcclxuZXhwb3J0cy5WcG5BZG1pbk9wdGlvbiA9IFZwbkFkbWluT3B0aW9uO1xyXG4vKiogQWRtaW5pc3RyYXRpb24gb3B0aW9ucyBsaXN0ICovXHJcbnZhciBWcG5ScGNBZG1pbk9wdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNBZG1pbk9wdGlvbicgY2xhc3M6IEFkbWluaXN0cmF0aW9uIG9wdGlvbnMgbGlzdCAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjQWRtaW5PcHRpb24oaW5pdCkge1xyXG4gICAgICAgIC8qKiBWaXJ0dWFsIEhVQiBuYW1lICovXHJcbiAgICAgICAgdGhpcy5IdWJOYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIExpc3QgZGF0YSAqL1xyXG4gICAgICAgIHRoaXMuQWRtaW5PcHRpb25MaXN0ID0gW107XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNBZG1pbk9wdGlvbjtcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNBZG1pbk9wdGlvbiA9IFZwblJwY0FkbWluT3B0aW9uO1xyXG4vKiogQ29ubmVjdGlvbiBzdGF0ZSB0byB0aGUgY29udHJvbGxlciAqL1xyXG52YXIgVnBuUnBjRmFybUNvbm5lY3Rpb25TdGF0dXMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjRmFybUNvbm5lY3Rpb25TdGF0dXMnIGNsYXNzOiBDb25uZWN0aW9uIHN0YXRlIHRvIHRoZSBjb250cm9sbGVyICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNGYXJtQ29ubmVjdGlvblN0YXR1cyhpbml0KSB7XHJcbiAgICAgICAgLyoqIElQIGFkZHJlc3MgKi9cclxuICAgICAgICB0aGlzLklwX2lwID0gXCJcIjtcclxuICAgICAgICAvKiogUG9ydCBudW1iZXIgKi9cclxuICAgICAgICB0aGlzLlBvcnRfdTMyID0gMDtcclxuICAgICAgICAvKiogT25saW5lIHN0YXRlICovXHJcbiAgICAgICAgdGhpcy5PbmxpbmVfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBMYXN0IGVycm9yIGNvZGUgKi9cclxuICAgICAgICB0aGlzLkxhc3RFcnJvcl91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBDb25uZWN0aW9uIHN0YXJ0IHRpbWUgKi9cclxuICAgICAgICB0aGlzLlN0YXJ0ZWRUaW1lX2R0ID0gbmV3IERhdGUoKTtcclxuICAgICAgICAvKiogRmlyc3QgY29ubmVjdGlvbiB0aW1lICovXHJcbiAgICAgICAgdGhpcy5GaXJzdENvbm5lY3RlZFRpbWVfZHQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIC8qKiBDb25uZWN0aW9uIHRpbWUgb2YgdGhpcyB0aW1lICovXHJcbiAgICAgICAgdGhpcy5DdXJyZW50Q29ubmVjdGVkVGltZV9kdCA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgLyoqIE51bWJlciBvZiByZXRyaWVzICovXHJcbiAgICAgICAgdGhpcy5OdW1UcnlfdTMyID0gMDtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIGNvbm5lY3Rpb24gY291bnQgKi9cclxuICAgICAgICB0aGlzLk51bUNvbm5lY3RlZF91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBDb25uZWN0aW9uIGZhaWx1cmUgY291bnQgKi9cclxuICAgICAgICB0aGlzLk51bUZhaWxlZF91MzIgPSAwO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjRmFybUNvbm5lY3Rpb25TdGF0dXM7XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjRmFybUNvbm5lY3Rpb25TdGF0dXMgPSBWcG5ScGNGYXJtQ29ubmVjdGlvblN0YXR1cztcclxuLyoqIEhVQiBpdGVtIG9mIGVhY2ggZmFybSBtZW1iZXIgKi9cclxudmFyIFZwblJwY0Zhcm1IdWIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjRmFybUh1YicgY2xhc3M6IEhVQiBpdGVtIG9mIGVhY2ggZmFybSBtZW1iZXIgKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY0Zhcm1IdWIoaW5pdCkge1xyXG4gICAgICAgIC8qKiBUaGUgVmlydHVhbCBIdWIgbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuSHViTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBEeW5hbWljIEhVQiAqL1xyXG4gICAgICAgIHRoaXMuRHluYW1pY0h1Yl9ib29sID0gZmFsc2U7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNGYXJtSHViO1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY0Zhcm1IdWIgPSBWcG5ScGNGYXJtSHViO1xyXG4vKiogU2VydmVyIGZhcm0gbWVtYmVyIGluZm9ybWF0aW9uIGFjcXVpc2l0aW9uICovXHJcbnZhciBWcG5ScGNGYXJtSW5mbyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNGYXJtSW5mbycgY2xhc3M6IFNlcnZlciBmYXJtIG1lbWJlciBpbmZvcm1hdGlvbiBhY3F1aXNpdGlvbiAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjRmFybUluZm8oaW5pdCkge1xyXG4gICAgICAgIC8qKiBJRCAqL1xyXG4gICAgICAgIHRoaXMuSWRfdTMyID0gMDtcclxuICAgICAgICAvKiogVGhlIGZsYWcgaWYgdGhlIHNlcnZlciBpcyBDbHVzdGVyIENvbnRyb2xsZXIgKGZhbHNlOiBDbHVzdGVyIE1lbWJlciBzZXJ2ZXJzKSAqL1xyXG4gICAgICAgIHRoaXMuQ29udHJvbGxlcl9ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIENvbm5lY3Rpb24gRXN0YWJsaXNoZWQgVGltZSAqL1xyXG4gICAgICAgIHRoaXMuQ29ubmVjdGVkVGltZV9kdCA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgLyoqIElQIGFkZHJlc3MgKi9cclxuICAgICAgICB0aGlzLklwX2lwID0gXCJcIjtcclxuICAgICAgICAvKiogSG9zdCBuYW1lICovXHJcbiAgICAgICAgdGhpcy5Ib3N0bmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBQb2ludCAqL1xyXG4gICAgICAgIHRoaXMuUG9pbnRfdTMyID0gMDtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIFB1YmxpYyBQb3J0cyAqL1xyXG4gICAgICAgIHRoaXMuTnVtUG9ydF91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBQdWJsaWMgUG9ydHMgKi9cclxuICAgICAgICB0aGlzLlBvcnRzX3UzMiA9IFtdO1xyXG4gICAgICAgIC8qKiBTZXJ2ZXIgY2VydGlmaWNhdGUgKi9cclxuICAgICAgICB0aGlzLlNlcnZlckNlcnRfYmluID0gbmV3IFVpbnQ4QXJyYXkoW10pO1xyXG4gICAgICAgIC8qKiBOdW1iZXIgb2YgZmFybSBIVUIgKi9cclxuICAgICAgICB0aGlzLk51bUZhcm1IdWJfdTMyID0gMDtcclxuICAgICAgICAvKiogVGhlIGhvc3RlZCBWaXJ0dWFsIEh1YiBsaXN0ICovXHJcbiAgICAgICAgdGhpcy5IdWJzTGlzdCA9IFtdO1xyXG4gICAgICAgIC8qKiBOdW1iZXIgb2YgaG9zdGVkIFZQTiBzZXNzaW9ucyAqL1xyXG4gICAgICAgIHRoaXMuTnVtU2Vzc2lvbnNfdTMyID0gMDtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIFRDUCBjb25uZWN0aW9ucyAqL1xyXG4gICAgICAgIHRoaXMuTnVtVGNwQ29ubmVjdGlvbnNfdTMyID0gMDtcclxuICAgICAgICAvKiogUGVyZm9ybWFuY2UgU3RhbmRhcmQgUmF0aW8gKi9cclxuICAgICAgICB0aGlzLldlaWdodF91MzIgPSAwO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjRmFybUluZm87XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjRmFybUluZm8gPSBWcG5ScGNGYXJtSW5mbztcclxuLyoqIFNlcnZlciBmYXJtIGNvbmZpZ3VyYXRpb24gKi9cclxudmFyIFZwblJwY0Zhcm0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjRmFybScgY2xhc3M6IFNlcnZlciBmYXJtIGNvbmZpZ3VyYXRpb24gKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY0Zhcm0oaW5pdCkge1xyXG4gICAgICAgIC8qKiBUeXBlIG9mIHNlcnZlciAqL1xyXG4gICAgICAgIHRoaXMuU2VydmVyVHlwZV91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBWYWxpZCBvbmx5IGZvciBDbHVzdGVyIE1lbWJlciBzZXJ2ZXJzLiBOdW1iZXIgb2YgdGhlIFBvcnRzX3UzMiBlbGVtZW50LiAqL1xyXG4gICAgICAgIHRoaXMuTnVtUG9ydF91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBWYWxpZCBvbmx5IGZvciBDbHVzdGVyIE1lbWJlciBzZXJ2ZXJzLiBTcGVjaWZ5IHRoZSBsaXN0IG9mIHB1YmxpYyBwb3J0IG51bWJlcnMgb24gdGhpcyBzZXJ2ZXIuIFRoZSBsaXN0IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgcHVibGljIHBvcnQgbnVtYmVyIHNldCwgYW5kIGl0IGlzIGFsc28gcG9zc2libGUgdG8gc2V0IG11bHRpcGxlIHB1YmxpYyBwb3J0IG51bWJlcnMuICovXHJcbiAgICAgICAgdGhpcy5Qb3J0c191MzIgPSBbXTtcclxuICAgICAgICAvKiogVmFsaWQgb25seSBmb3IgQ2x1c3RlciBNZW1iZXIgc2VydmVycy4gU3BlY2lmeSB0aGUgcHVibGljIElQIGFkZHJlc3Mgb2YgdGhpcyBzZXJ2ZXIuIElmIHlvdSB3aXNoIHRvIGxlYXZlIHB1YmxpYyBJUCBhZGRyZXNzIHVuc3BlY2lmaWVkLCBzcGVjaWZ5IHRoZSBlbXB0eSBzdHJpbmcuIFdoZW4gYSBwdWJsaWMgSVAgYWRkcmVzcyBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgbmV0d29yayBpbnRlcmZhY2UgdXNlZCB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIGNsdXN0ZXIgY29udHJvbGxlciB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgdXNlZC4gKi9cclxuICAgICAgICB0aGlzLlB1YmxpY0lwX2lwID0gXCJcIjtcclxuICAgICAgICAvKiogVmFsaWQgb25seSBmb3IgQ2x1c3RlciBNZW1iZXIgc2VydmVycy4gU3BlY2lmeSB0aGUgaG9zdCBuYW1lIG9yIElQIGFkZHJlc3Mgb2YgdGhlIGRlc3RpbmF0aW9uIGNsdXN0ZXIgY29udHJvbGxlci4gKi9cclxuICAgICAgICB0aGlzLkNvbnRyb2xsZXJOYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFZhbGlkIG9ubHkgZm9yIENsdXN0ZXIgTWVtYmVyIHNlcnZlcnMuIFNwZWNpZnkgdGhlIFRDUCBwb3J0IG51bWJlciBvZiB0aGUgZGVzdGluYXRpb24gY2x1c3RlciBjb250cm9sbGVyLiAqL1xyXG4gICAgICAgIHRoaXMuQ29udHJvbGxlclBvcnRfdTMyID0gMDtcclxuICAgICAgICAvKiogVmFsaWQgb25seSBmb3IgQ2x1c3RlciBNZW1iZXIgc2VydmVycy4gU3BlY2lmeSB0aGUgcGFzc3dvcmQgcmVxdWlyZWQgdG8gY29ubmVjdCB0byB0aGUgZGVzdGluYXRpb24gY29udHJvbGxlci4gSXQgbmVlZHMgdG8gYmUgdGhlIHNhbWUgYXMgYW4gYWRtaW5pc3RyYXRvciBwYXNzd29yZCBvbiB0aGUgZGVzdGluYXRpb24gY29udHJvbGxlci4gKi9cclxuICAgICAgICB0aGlzLk1lbWJlclBhc3N3b3JkUGxhaW50ZXh0X3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFRoaXMgc2V0cyBhIHZhbHVlIGZvciB0aGUgcGVyZm9ybWFuY2Ugc3RhbmRhcmQgcmF0aW8gb2YgdGhpcyBWUE4gU2VydmVyLiBUaGlzIGlzIHRoZSBzdGFuZGFyZCB2YWx1ZSBmb3Igd2hlbiBsb2FkIGJhbGFuY2luZyBpcyBwZXJmb3JtZWQgaW4gdGhlIGNsdXN0ZXIuIEZvciBleGFtcGxlLCBtYWtpbmcgb25seSBvbmUgbWFjaGluZSAyMDAgd2hpbGUgdGhlIG90aGVyIG1lbWJlcnMgaGF2ZSBhIHN0YXR1cyBvZiAxMDAsIHdpbGwgcmVndWxhdGUgdGhhdCBtYWNoaW5lIHRvIHJlY2VpdmUgdHdpY2UgYXMgbWFueSBjb25uZWN0aW9ucyBhcyB0aGUgb3RoZXIgbWVtYmVycy4gU3BlY2lmeSAxIG9yIGhpZ2hlciBmb3IgdGhlIHZhbHVlLiBJZiB0aGlzIHBhcmFtZXRlciBpcyBsZWZ0IHVuc3BlY2lmaWVkLCAxMDAgd2lsbCBiZSB1c2VkLiAqL1xyXG4gICAgICAgIHRoaXMuV2VpZ2h0X3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIFZhbGlkIG9ubHkgZm9yIENsdXN0ZXIgQ29udHJvbGxlciBzZXJ2ZXIuIEJ5IHNwZWNpZnlpbmcgdHJ1ZSwgdGhlIFZQTiBTZXJ2ZXIgd2lsbCBvcGVyYXRlIG9ubHkgYXMgYSBjb250cm9sbGVyIG9uIHRoZSBjbHVzdGVyIGFuZCBpdCB3aWxsIGFsd2F5cyBkaXN0cmlidXRlIGdlbmVyYWwgVlBOIENsaWVudCBjb25uZWN0aW9ucyB0byBtZW1iZXJzIG90aGVyIHRoYW4gaXRzZWxmLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gaGlnaC1sb2FkIGVudmlyb25tZW50cy4gKi9cclxuICAgICAgICB0aGlzLkNvbnRyb2xsZXJPbmx5X2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY0Zhcm07XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjRmFybSA9IFZwblJwY0Zhcm07XHJcbi8qKiBMb2cgc3dpdGNoIHR5cGUgKi9cclxudmFyIFZwblJwY0xvZ1N3aXRjaFR5cGU7XHJcbihmdW5jdGlvbiAoVnBuUnBjTG9nU3dpdGNoVHlwZSkge1xyXG4gICAgLyoqIE5vIHN3aXRjaGluZyAqL1xyXG4gICAgVnBuUnBjTG9nU3dpdGNoVHlwZVtWcG5ScGNMb2dTd2l0Y2hUeXBlW1wiTm9cIl0gPSAwXSA9IFwiTm9cIjtcclxuICAgIC8qKiBTZWNvbmRseSBiYXNpcyAqL1xyXG4gICAgVnBuUnBjTG9nU3dpdGNoVHlwZVtWcG5ScGNMb2dTd2l0Y2hUeXBlW1wiU2Vjb25kXCJdID0gMV0gPSBcIlNlY29uZFwiO1xyXG4gICAgLyoqIE1pbnV0ZWx5IGJhc2lzICovXHJcbiAgICBWcG5ScGNMb2dTd2l0Y2hUeXBlW1ZwblJwY0xvZ1N3aXRjaFR5cGVbXCJNaW51dGVcIl0gPSAyXSA9IFwiTWludXRlXCI7XHJcbiAgICAvKiogSG91cmx5IGJhc2lzICovXHJcbiAgICBWcG5ScGNMb2dTd2l0Y2hUeXBlW1ZwblJwY0xvZ1N3aXRjaFR5cGVbXCJIb3VyXCJdID0gM10gPSBcIkhvdXJcIjtcclxuICAgIC8qKiBEYWlseSBiYXNpcyAqL1xyXG4gICAgVnBuUnBjTG9nU3dpdGNoVHlwZVtWcG5ScGNMb2dTd2l0Y2hUeXBlW1wiRGF5XCJdID0gNF0gPSBcIkRheVwiO1xyXG4gICAgLyoqIE1vbnRobHkgYmFzaXMgKi9cclxuICAgIFZwblJwY0xvZ1N3aXRjaFR5cGVbVnBuUnBjTG9nU3dpdGNoVHlwZVtcIk1vbnRoXCJdID0gNV0gPSBcIk1vbnRoXCI7XHJcbn0pKFZwblJwY0xvZ1N3aXRjaFR5cGUgPSBleHBvcnRzLlZwblJwY0xvZ1N3aXRjaFR5cGUgfHwgKGV4cG9ydHMuVnBuUnBjTG9nU3dpdGNoVHlwZSA9IHt9KSk7XHJcbi8qKiBQYWNrZXQgbG9nIHNldHRpbmdzICovXHJcbnZhciBWcG5ScGNQYWNrZXRMb2dTZXR0aW5nO1xyXG4oZnVuY3Rpb24gKFZwblJwY1BhY2tldExvZ1NldHRpbmcpIHtcclxuICAgIC8qKiBOb3Qgc2F2ZSAqL1xyXG4gICAgVnBuUnBjUGFja2V0TG9nU2V0dGluZ1tWcG5ScGNQYWNrZXRMb2dTZXR0aW5nW1wiTm9uZVwiXSA9IDBdID0gXCJOb25lXCI7XHJcbiAgICAvKiogT25seSBoZWFkZXIgKi9cclxuICAgIFZwblJwY1BhY2tldExvZ1NldHRpbmdbVnBuUnBjUGFja2V0TG9nU2V0dGluZ1tcIkhlYWRlclwiXSA9IDFdID0gXCJIZWFkZXJcIjtcclxuICAgIC8qKiBBbGwgcGF5bG9hZHMgKi9cclxuICAgIFZwblJwY1BhY2tldExvZ1NldHRpbmdbVnBuUnBjUGFja2V0TG9nU2V0dGluZ1tcIkFsbFwiXSA9IDJdID0gXCJBbGxcIjtcclxufSkoVnBuUnBjUGFja2V0TG9nU2V0dGluZyA9IGV4cG9ydHMuVnBuUnBjUGFja2V0TG9nU2V0dGluZyB8fCAoZXhwb3J0cy5WcG5ScGNQYWNrZXRMb2dTZXR0aW5nID0ge30pKTtcclxuLyoqIFBhY2tldCBsb2cgc2V0dGluZ3MgYXJyYXkgaW5kZXggKi9cclxudmFyIFZwblJwY1BhY2tldExvZ1NldHRpbmdJbmRleDtcclxuKGZ1bmN0aW9uIChWcG5ScGNQYWNrZXRMb2dTZXR0aW5nSW5kZXgpIHtcclxuICAgIC8qKiBUQ1AgY29ubmVjdGlvbiBsb2cgKi9cclxuICAgIFZwblJwY1BhY2tldExvZ1NldHRpbmdJbmRleFtWcG5ScGNQYWNrZXRMb2dTZXR0aW5nSW5kZXhbXCJUY3BDb25uZWN0aW9uXCJdID0gMF0gPSBcIlRjcENvbm5lY3Rpb25cIjtcclxuICAgIC8qKiBUQ1AgcGFja2V0IGxvZyAqL1xyXG4gICAgVnBuUnBjUGFja2V0TG9nU2V0dGluZ0luZGV4W1ZwblJwY1BhY2tldExvZ1NldHRpbmdJbmRleFtcIlRjcEFsbFwiXSA9IDFdID0gXCJUY3BBbGxcIjtcclxuICAgIC8qKiBESENQIExvZyAqL1xyXG4gICAgVnBuUnBjUGFja2V0TG9nU2V0dGluZ0luZGV4W1ZwblJwY1BhY2tldExvZ1NldHRpbmdJbmRleFtcIkRoY3BcIl0gPSAyXSA9IFwiRGhjcFwiO1xyXG4gICAgLyoqIFVEUCBsb2cgKi9cclxuICAgIFZwblJwY1BhY2tldExvZ1NldHRpbmdJbmRleFtWcG5ScGNQYWNrZXRMb2dTZXR0aW5nSW5kZXhbXCJVZHBcIl0gPSAzXSA9IFwiVWRwXCI7XHJcbiAgICAvKiogSUNNUCBsb2cgKi9cclxuICAgIFZwblJwY1BhY2tldExvZ1NldHRpbmdJbmRleFtWcG5ScGNQYWNrZXRMb2dTZXR0aW5nSW5kZXhbXCJJY21wXCJdID0gNF0gPSBcIkljbXBcIjtcclxuICAgIC8qKiBJUCBsb2cgKi9cclxuICAgIFZwblJwY1BhY2tldExvZ1NldHRpbmdJbmRleFtWcG5ScGNQYWNrZXRMb2dTZXR0aW5nSW5kZXhbXCJJcFwiXSA9IDVdID0gXCJJcFwiO1xyXG4gICAgLyoqIEFSUCBsb2cgKi9cclxuICAgIFZwblJwY1BhY2tldExvZ1NldHRpbmdJbmRleFtWcG5ScGNQYWNrZXRMb2dTZXR0aW5nSW5kZXhbXCJBcnBcIl0gPSA2XSA9IFwiQXJwXCI7XHJcbiAgICAvKiogRXRoZXJuZXQgbG9nICovXHJcbiAgICBWcG5ScGNQYWNrZXRMb2dTZXR0aW5nSW5kZXhbVnBuUnBjUGFja2V0TG9nU2V0dGluZ0luZGV4W1wiRXRoZXJuZXRcIl0gPSA3XSA9IFwiRXRoZXJuZXRcIjtcclxufSkoVnBuUnBjUGFja2V0TG9nU2V0dGluZ0luZGV4ID0gZXhwb3J0cy5WcG5ScGNQYWNrZXRMb2dTZXR0aW5nSW5kZXggfHwgKGV4cG9ydHMuVnBuUnBjUGFja2V0TG9nU2V0dGluZ0luZGV4ID0ge30pKTtcclxuLyoqIEhVQiBsb2cgc2V0dGluZ3MgKi9cclxudmFyIFZwblJwY0h1YkxvZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNIdWJMb2cnIGNsYXNzOiBIVUIgbG9nIHNldHRpbmdzICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNIdWJMb2coaW5pdCkge1xyXG4gICAgICAgIC8qKiBUaGUgVmlydHVhbCBIdWIgbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuSHViTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBUaGUgZmxhZyB0byBlbmFibGUgLyBkaXNhYmxlIHNhdmluZyB0aGUgc2VjdXJpdHkgbG9nICovXHJcbiAgICAgICAgdGhpcy5TYXZlU2VjdXJpdHlMb2dfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBUaGUgbG9nIGZpbGVuYW1lIHN3aXRjaGluZyBzZXR0aW5nIG9mIHRoZSBzZWN1cml0eSBsb2cgKi9cclxuICAgICAgICB0aGlzLlNlY3VyaXR5TG9nU3dpdGNoVHlwZV91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBUaGUgZmxhZyB0byBlbmFibGUgLyBkaXNhYmxlIHNhdmluZyB0aGUgc2VjdXJpdHkgbG9nICovXHJcbiAgICAgICAgdGhpcy5TYXZlUGFja2V0TG9nX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogVGhlIGxvZyBmaWxlbmFtZSBzd2l0Y2hpbmcgc2V0dGluZ3Mgb2YgdGhlIHBhY2tldCBsb2dzICovXHJcbiAgICAgICAgdGhpcy5QYWNrZXRMb2dTd2l0Y2hUeXBlX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIFNwZWNpZnkgdGhlIHNhdmUgY29udGVudHMgb2YgdGhlIHBhY2tldCBsb2dzICh1aW50ICogMTYgYXJyYXkpLiBUaGUgaW5kZXggbnVtYmVyczogVGNwQ29ubmVjdGlvbiA9IDAsIFRjcEFsbCA9IDEsIERIQ1AgPSAyLCBVRFAgPSAzLCBJQ01QID0gNCwgSVAgPSA1LCBBUlAgPSA2LCBFdGhlcm5ldCA9IDcuICovXHJcbiAgICAgICAgdGhpcy5QYWNrZXRMb2dDb25maWdfdTMyID0gW107XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNIdWJMb2c7XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjSHViTG9nID0gVnBuUnBjSHViTG9nO1xyXG4vKiogUkFESVVTIHNlcnZlciBvcHRpb25zICovXHJcbnZhciBWcG5ScGNSYWRpdXMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjUmFkaXVzJyBjbGFzczogUkFESVVTIHNlcnZlciBvcHRpb25zICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNSYWRpdXMoaW5pdCkge1xyXG4gICAgICAgIC8qKiBUaGUgVmlydHVhbCBIdWIgbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuSHViTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBSQURJVVMgc2VydmVyIG5hbWUgKi9cclxuICAgICAgICB0aGlzLlJhZGl1c1NlcnZlck5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogUkFESVVTIHBvcnQgbnVtYmVyICovXHJcbiAgICAgICAgdGhpcy5SYWRpdXNQb3J0X3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIFNlY3JldCBrZXkgKi9cclxuICAgICAgICB0aGlzLlJhZGl1c1NlY3JldF9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBSYWRpdXMgcmV0cnkgaW50ZXJ2YWwgKi9cclxuICAgICAgICB0aGlzLlJhZGl1c1JldHJ5SW50ZXJ2YWxfdTMyID0gMDtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY1JhZGl1cztcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNSYWRpdXMgPSBWcG5ScGNSYWRpdXM7XHJcbi8qKiBHZXQgdGhlIHN0YXRlIEhVQiAqL1xyXG52YXIgVnBuUnBjSHViU3RhdHVzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwblJwY0h1YlN0YXR1cycgY2xhc3M6IEdldCB0aGUgc3RhdGUgSFVCICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNIdWJTdGF0dXMoaW5pdCkge1xyXG4gICAgICAgIC8qKiBUaGUgVmlydHVhbCBIdWIgbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuSHViTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBPbmxpbmUgKi9cclxuICAgICAgICB0aGlzLk9ubGluZV9ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFR5cGUgb2YgSFVCICovXHJcbiAgICAgICAgdGhpcy5IdWJUeXBlX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIE51bWJlciBvZiBzZXNzaW9ucyAqL1xyXG4gICAgICAgIHRoaXMuTnVtU2Vzc2lvbnNfdTMyID0gMDtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIHNlc3Npb25zIChjbGllbnQgbW9kZSkgKi9cclxuICAgICAgICB0aGlzLk51bVNlc3Npb25zQ2xpZW50X3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIE51bWJlciBvZiBzZXNzaW9ucyAoYnJpZGdlIG1vZGUpICovXHJcbiAgICAgICAgdGhpcy5OdW1TZXNzaW9uc0JyaWRnZV91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBOdW1iZXIgb2YgQWNjZXNzIGxpc3QgZW50cmllcyAqL1xyXG4gICAgICAgIHRoaXMuTnVtQWNjZXNzTGlzdHNfdTMyID0gMDtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIHVzZXJzICovXHJcbiAgICAgICAgdGhpcy5OdW1Vc2Vyc191MzIgPSAwO1xyXG4gICAgICAgIC8qKiBOdW1iZXIgb2YgZ3JvdXBzICovXHJcbiAgICAgICAgdGhpcy5OdW1Hcm91cHNfdTMyID0gMDtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIE1BQyB0YWJsZSBlbnRyaWVzICovXHJcbiAgICAgICAgdGhpcy5OdW1NYWNUYWJsZXNfdTMyID0gMDtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIElQIHRhYmxlIGVudHJpZXMgKi9cclxuICAgICAgICB0aGlzLk51bUlwVGFibGVzX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIE51bWJlciBvZiBicm9hZGNhc3QgcGFja2V0cyAoUmVjdikgKi9cclxuICAgICAgICB0aGlzW1wiUmVjdi5Ccm9hZGNhc3RCeXRlc191NjRcIl0gPSAwO1xyXG4gICAgICAgIC8qKiBCcm9hZGNhc3QgYnl0ZXMgKFJlY3YpICovXHJcbiAgICAgICAgdGhpc1tcIlJlY3YuQnJvYWRjYXN0Q291bnRfdTY0XCJdID0gMDtcclxuICAgICAgICAvKiogVW5pY2FzdCBjb3VudCAoUmVjdikgKi9cclxuICAgICAgICB0aGlzW1wiUmVjdi5VbmljYXN0Qnl0ZXNfdTY0XCJdID0gMDtcclxuICAgICAgICAvKiogVW5pY2FzdCBieXRlcyAoUmVjdikgKi9cclxuICAgICAgICB0aGlzW1wiUmVjdi5VbmljYXN0Q291bnRfdTY0XCJdID0gMDtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIGJyb2FkY2FzdCBwYWNrZXRzIChTZW5kKSAqL1xyXG4gICAgICAgIHRoaXNbXCJTZW5kLkJyb2FkY2FzdEJ5dGVzX3U2NFwiXSA9IDA7XHJcbiAgICAgICAgLyoqIEJyb2FkY2FzdCBieXRlcyAoU2VuZCkgKi9cclxuICAgICAgICB0aGlzW1wiU2VuZC5Ccm9hZGNhc3RDb3VudF91NjRcIl0gPSAwO1xyXG4gICAgICAgIC8qKiBVbmljYXN0IGJ5dGVzIChTZW5kKSAqL1xyXG4gICAgICAgIHRoaXNbXCJTZW5kLlVuaWNhc3RCeXRlc191NjRcIl0gPSAwO1xyXG4gICAgICAgIC8qKiBVbmljYXN0IGJ5dGVzIChTZW5kKSAqL1xyXG4gICAgICAgIHRoaXNbXCJTZW5kLlVuaWNhc3RDb3VudF91NjRcIl0gPSAwO1xyXG4gICAgICAgIC8qKiBXaGV0aGVyIFNlY3VyZU5BVCBpcyBlbmFibGVkICovXHJcbiAgICAgICAgdGhpcy5TZWN1cmVOQVRFbmFibGVkX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogTGFzdCBjb21tdW5pY2F0aW9uIGRhdGUgYW5kIHRpbWUgKi9cclxuICAgICAgICB0aGlzLkxhc3RDb21tVGltZV9kdCA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgLyoqIExhc3QgbG9naW4gZGF0ZSBhbmQgdGltZSAqL1xyXG4gICAgICAgIHRoaXMuTGFzdExvZ2luVGltZV9kdCA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgLyoqIENyZWF0aW9uIGRhdGUgYW5kIHRpbWUgKi9cclxuICAgICAgICB0aGlzLkNyZWF0ZWRUaW1lX2R0ID0gbmV3IERhdGUoKTtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIGxvZ2lucyAqL1xyXG4gICAgICAgIHRoaXMuTnVtTG9naW5fdTMyID0gMDtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY0h1YlN0YXR1cztcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNIdWJTdGF0dXMgPSBWcG5ScGNIdWJTdGF0dXM7XHJcbi8qKiBMaXN0IG9mIHNlcnZpY2VzIHByb3ZpZGVkIGJ5IElQc2VjIHNlcnZlciAqL1xyXG52YXIgVnBuSVBzZWNTZXJ2aWNlcyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5JUHNlY1NlcnZpY2VzJyBjbGFzczogTGlzdCBvZiBzZXJ2aWNlcyBwcm92aWRlZCBieSBJUHNlYyBzZXJ2ZXIgKi9cclxuICAgIGZ1bmN0aW9uIFZwbklQc2VjU2VydmljZXMoaW5pdCkge1xyXG4gICAgICAgIC8qKiBFbmFibGUgb3IgRGlzYWJsZSB0aGUgTDJUUCBTZXJ2ZXIgRnVuY3Rpb24gKFJhdyBMMlRQIHdpdGggTm8gRW5jcnlwdGlvbnMpLiBUbyBhY2NlcHQgc3BlY2lhbCBWUE4gY2xpZW50cywgZW5hYmxlIHRoaXMgb3B0aW9uLiAqL1xyXG4gICAgICAgIHRoaXMuTDJUUF9SYXdfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBFbmFibGUgb3IgRGlzYWJsZSB0aGUgTDJUUCBvdmVyIElQc2VjIFNlcnZlciBGdW5jdGlvbi4gVG8gYWNjZXB0IFZQTiBjb25uZWN0aW9ucyBmcm9tIGlQaG9uZSwgaVBhZCwgQW5kcm9pZCwgV2luZG93cyBvciBNYWMgT1MgWCwgZW5hYmxlIHRoaXMgb3B0aW9uLiAqL1xyXG4gICAgICAgIHRoaXMuTDJUUF9JUHNlY19ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIEVuYWJsZSBvciBEaXNhYmxlIHRoZSBFdGhlcklQIC8gTDJUUHYzIG92ZXIgSVBzZWMgU2VydmVyIEZ1bmN0aW9uIChmb3Igc2l0ZS10by1zaXRlIFZQTiBTZXJ2ZXIgZnVuY3Rpb24pLiBSb3V0ZXIgUHJvZHVjdHMgd2hpY2ggYXJlIGNvbXBhdGlibGUgd2l0aCBFdGhlcklQIG92ZXIgSVBzZWMgY2FuIGNvbm5lY3QgdG8gVmlydHVhbCBIdWJzIG9uIHRoZSBWUE4gU2VydmVyIGFuZCBlc3RhYmxpc2ggTGF5ZXItMiAoRXRoZXJuZXQpIEJyaWRnaW5nLiAqL1xyXG4gICAgICAgIHRoaXMuRXRoZXJJUF9JUHNlY19ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNwZWNpZnkgdGhlIElQc2VjIFByZS1TaGFyZWQgS2V5LiBBbiBJUHNlYyBQcmUtU2hhcmVkIEtleSBpcyBhbHNvIGNhbGxlZCBhcyBcIlBTS1wiIG9yIFwic2VjcmV0XCIuIFNwZWNpZnkgaXQgZXF1YWwgb3IgbGVzcyB0aGFuIDggbGV0dGVycywgYW5kIGRpc3RyaWJ1dGUgaXQgdG8gZXZlcnkgdXNlcnMgd2hvIHdpbGwgY29ubmVjdCB0byB0aGUgVlBOIFNlcnZlci4gUGxlYXNlIG5vdGU6IEdvb2dsZSBBbmRyb2lkIDQuMCBoYXMgYSBidWcgd2hpY2ggYSBQcmUtU2hhcmVkIEtleSB3aXRoIDEwIG9yIG1vcmUgbGV0dGVycyBjYXVzZXMgYSB1bmV4cGVjdGVkIGJlaGF2aW9yLiBGb3IgdGhhdCByZWFzb24sIHRoZSBsZXR0ZXJzIG9mIGEgUHJlLVNoYXJlZCBLZXkgc2hvdWxkIGJlIDkgb3IgbGVzcyBjaGFyYWN0ZXJzLiAqL1xyXG4gICAgICAgIHRoaXMuSVBzZWNfU2VjcmV0X3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFNwZWNpZnkgdGhlIGRlZmF1bHQgVmlydHVhbCBIVUIgaW4gYSBjYXNlIG9mIG9taXR0aW5nIHRoZSBuYW1lIG9mIEhVQiBvbiB0aGUgVXNlcm5hbWUuIFVzZXJzIHNob3VsZCBzcGVjaWZ5IHRoZWlyIHVzZXJuYW1lIHN1Y2ggYXMgXCJVc2VybmFtZUBUYXJnZXQgVmlydHVhbCBIVUIgTmFtZVwiIHRvIGNvbm5lY3QgdGhpcyBMMlRQIFNlcnZlci4gSWYgdGhlIGRlc2lnbmF0aW9uIG9mIHRoZSBWaXJ0dWFsIEh1YiBpcyBvbWl0dGVkLCB0aGUgYWJvdmUgSFVCIHdpbGwgYmUgdXNlZCBhcyB0aGUgdGFyZ2V0LiAqL1xyXG4gICAgICAgIHRoaXMuTDJUUF9EZWZhdWx0SHViX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5JUHNlY1NlcnZpY2VzO1xyXG59KCkpO1xyXG5leHBvcnRzLlZwbklQc2VjU2VydmljZXMgPSBWcG5JUHNlY1NlcnZpY2VzO1xyXG4vKiogS2VlcCBhbGl2ZSBwcm90b2NvbCAqL1xyXG52YXIgVnBuUnBjS2VlcEFsaXZlUHJvdG9jb2w7XHJcbihmdW5jdGlvbiAoVnBuUnBjS2VlcEFsaXZlUHJvdG9jb2wpIHtcclxuICAgIC8qKiBUQ1AgKi9cclxuICAgIFZwblJwY0tlZXBBbGl2ZVByb3RvY29sW1ZwblJwY0tlZXBBbGl2ZVByb3RvY29sW1wiVENQXCJdID0gMF0gPSBcIlRDUFwiO1xyXG4gICAgLyoqIFVEUCAqL1xyXG4gICAgVnBuUnBjS2VlcEFsaXZlUHJvdG9jb2xbVnBuUnBjS2VlcEFsaXZlUHJvdG9jb2xbXCJVRFBcIl0gPSAxXSA9IFwiVURQXCI7XHJcbn0pKFZwblJwY0tlZXBBbGl2ZVByb3RvY29sID0gZXhwb3J0cy5WcG5ScGNLZWVwQWxpdmVQcm90b2NvbCB8fCAoZXhwb3J0cy5WcG5ScGNLZWVwQWxpdmVQcm90b2NvbCA9IHt9KSk7XHJcbi8qKiBLZWVwIEFsaXZlIHNldHRpbmdzICovXHJcbnZhciBWcG5ScGNLZWVwID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwblJwY0tlZXAnIGNsYXNzOiBLZWVwIEFsaXZlIHNldHRpbmdzICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNLZWVwKGluaXQpIHtcclxuICAgICAgICAvKiogVGhlIGZsYWcgdG8gZW5hYmxlIGtlZXAtYWxpdmUgdG8gdGhlIEludGVybmV0ICovXHJcbiAgICAgICAgdGhpcy5Vc2VLZWVwQ29ubmVjdF9ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNwZWNpZnkgdGhlIGhvc3QgbmFtZSBvciBJUCBhZGRyZXNzIG9mIHRoZSBkZXN0aW5hdGlvbiAqL1xyXG4gICAgICAgIHRoaXMuS2VlcENvbm5lY3RIb3N0X3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFNwZWNpZnkgdGhlIHBvcnQgbnVtYmVyIG9mIHRoZSBkZXN0aW5hdGlvbiAqL1xyXG4gICAgICAgIHRoaXMuS2VlcENvbm5lY3RQb3J0X3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIFByb3RvY29sIHR5cGUgKi9cclxuICAgICAgICB0aGlzLktlZXBDb25uZWN0UHJvdG9jb2xfdTMyID0gMDtcclxuICAgICAgICAvKiogSW50ZXJ2YWwgQmV0d2VlbiBQYWNrZXRzIFNlbmRzIChTZWNvbmRzKSAqL1xyXG4gICAgICAgIHRoaXMuS2VlcENvbm5lY3RJbnRlcnZhbF91MzIgPSAwO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjS2VlcDtcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNLZWVwID0gVnBuUnBjS2VlcDtcclxuLyoqIFN0YXRlIG9mIHRoZSBjbGllbnQgc2Vzc2lvbiAqL1xyXG52YXIgVnBuUnBjQ2xpZW50U2Vzc2lvblN0YXR1cztcclxuKGZ1bmN0aW9uIChWcG5ScGNDbGllbnRTZXNzaW9uU3RhdHVzKSB7XHJcbiAgICAvKiogQ29ubmVjdGluZyAqL1xyXG4gICAgVnBuUnBjQ2xpZW50U2Vzc2lvblN0YXR1c1tWcG5ScGNDbGllbnRTZXNzaW9uU3RhdHVzW1wiQ29ubmVjdGluZ1wiXSA9IDBdID0gXCJDb25uZWN0aW5nXCI7XHJcbiAgICAvKiogTmVnb3RpYXRpbmcgKi9cclxuICAgIFZwblJwY0NsaWVudFNlc3Npb25TdGF0dXNbVnBuUnBjQ2xpZW50U2Vzc2lvblN0YXR1c1tcIk5lZ290aWF0aW9uXCJdID0gMV0gPSBcIk5lZ290aWF0aW9uXCI7XHJcbiAgICAvKiogRHVyaW5nIHVzZXIgYXV0aGVudGljYXRpb24gKi9cclxuICAgIFZwblJwY0NsaWVudFNlc3Npb25TdGF0dXNbVnBuUnBjQ2xpZW50U2Vzc2lvblN0YXR1c1tcIkF1dGhcIl0gPSAyXSA9IFwiQXV0aFwiO1xyXG4gICAgLyoqIENvbm5lY3Rpb24gY29tcGxldGUgKi9cclxuICAgIFZwblJwY0NsaWVudFNlc3Npb25TdGF0dXNbVnBuUnBjQ2xpZW50U2Vzc2lvblN0YXR1c1tcIkVzdGFibGlzaGVkXCJdID0gM10gPSBcIkVzdGFibGlzaGVkXCI7XHJcbiAgICAvKiogV2FpdCB0byByZXRyeSAqL1xyXG4gICAgVnBuUnBjQ2xpZW50U2Vzc2lvblN0YXR1c1tWcG5ScGNDbGllbnRTZXNzaW9uU3RhdHVzW1wiUmV0cnlcIl0gPSA0XSA9IFwiUmV0cnlcIjtcclxuICAgIC8qKiBJZGxlIHN0YXRlICovXHJcbiAgICBWcG5ScGNDbGllbnRTZXNzaW9uU3RhdHVzW1ZwblJwY0NsaWVudFNlc3Npb25TdGF0dXNbXCJJZGxlXCJdID0gNV0gPSBcIklkbGVcIjtcclxufSkoVnBuUnBjQ2xpZW50U2Vzc2lvblN0YXR1cyA9IGV4cG9ydHMuVnBuUnBjQ2xpZW50U2Vzc2lvblN0YXR1cyB8fCAoZXhwb3J0cy5WcG5ScGNDbGllbnRTZXNzaW9uU3RhdHVzID0ge30pKTtcclxuLyoqIEdldCB0aGUgbGluayBzdGF0ZSAqL1xyXG52YXIgVnBuUnBjTGlua1N0YXR1cyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNMaW5rU3RhdHVzJyBjbGFzczogR2V0IHRoZSBsaW5rIHN0YXRlICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNMaW5rU3RhdHVzKGluaXQpIHtcclxuICAgICAgICAvKiogVGhlIFZpcnR1YWwgSHViIG5hbWUgKi9cclxuICAgICAgICB0aGlzLkh1Yk5hbWVfRXhfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGNhc2NhZGUgY29ubmVjdGlvbiAqL1xyXG4gICAgICAgIHRoaXMuQWNjb3VudE5hbWVfdXRmID0gXCJcIjtcclxuICAgICAgICAvKiogVGhlIGZsYWcgd2hldGhlciB0aGUgY2FzY2FkZSBjb25uZWN0aW9uIGlzIGVuYWJsZWQgKi9cclxuICAgICAgICB0aGlzLkFjdGl2ZV9ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFRoZSBmbGFnIHdoZXRoZXIgdGhlIGNhc2NhZGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCAqL1xyXG4gICAgICAgIHRoaXMuQ29ubmVjdGVkX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogVGhlIHNlc3Npb24gc3RhdHVzICovXHJcbiAgICAgICAgdGhpcy5TZXNzaW9uU3RhdHVzX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIFRoZSBkZXN0aW5hdGlvbiBWUE4gc2VydmVyIG5hbWUgKi9cclxuICAgICAgICB0aGlzLlNlcnZlck5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogVGhlIHBvcnQgbnVtYmVyIG9mIHRoZSBzZXJ2ZXIgKi9cclxuICAgICAgICB0aGlzLlNlcnZlclBvcnRfdTMyID0gMDtcclxuICAgICAgICAvKiogU2VydmVyIHByb2R1Y3QgbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuU2VydmVyUHJvZHVjdE5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogU2VydmVyIHByb2R1Y3QgdmVyc2lvbiAqL1xyXG4gICAgICAgIHRoaXMuU2VydmVyUHJvZHVjdFZlcl91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBTZXJ2ZXIgcHJvZHVjdCBidWlsZCBudW1iZXIgKi9cclxuICAgICAgICB0aGlzLlNlcnZlclByb2R1Y3RCdWlsZF91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBTZXJ2ZXIncyBYLjUwOSBjZXJ0aWZpY2F0ZSAqL1xyXG4gICAgICAgIHRoaXMuU2VydmVyWF9iaW4gPSBuZXcgVWludDhBcnJheShbXSk7XHJcbiAgICAgICAgLyoqIENsaWVudCBjZXJ0aWZpY2F0ZSAqL1xyXG4gICAgICAgIHRoaXMuQ2xpZW50WF9iaW4gPSBuZXcgVWludDhBcnJheShbXSk7XHJcbiAgICAgICAgLyoqIENvbm5lY3Rpb24gc3RhcnQgdGltZSAqL1xyXG4gICAgICAgIHRoaXMuU3RhcnRUaW1lX2R0ID0gbmV3IERhdGUoKTtcclxuICAgICAgICAvKiogQ29ubmVjdGlvbiBjb21wbGV0aW9uIHRpbWUgb2YgdGhlIGZpcnN0IGNvbm5lY3Rpb24gKi9cclxuICAgICAgICB0aGlzLkZpcnN0Q29ubmVjdGlvbkVzdGFibGlzaWVkVGltZV9kdCA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgLyoqIENvbm5lY3Rpb24gY29tcGxldGlvbiB0aW1lIG9mIHRoaXMgY29ubmVjdGlvbiAqL1xyXG4gICAgICAgIHRoaXMuQ3VycmVudENvbm5lY3Rpb25Fc3RhYmxpc2hUaW1lX2R0ID0gbmV3IERhdGUoKTtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIGNvbm5lY3Rpb25zIGhhdmUgYmVlbiBlc3RhYmxpc2hlZCBzbyBmYXIgKi9cclxuICAgICAgICB0aGlzLk51bUNvbm5lY3Rpb25zRWF0YWJsaXNoZWRfdTMyID0gMDtcclxuICAgICAgICAvKiogSGFsZi1jb25uZWN0aW9uICovXHJcbiAgICAgICAgdGhpcy5IYWxmQ29ubmVjdGlvbl9ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFZvSVAgLyBRb1MgKi9cclxuICAgICAgICB0aGlzLlFvU19ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIE1heGltdW0gbnVtYmVyIG9mIHRoZSB1bmRlcmx5aW5nIFRDUCBjb25uZWN0aW9ucyAqL1xyXG4gICAgICAgIHRoaXMuTWF4VGNwQ29ubmVjdGlvbnNfdTMyID0gMDtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIGN1cnJlbnQgdW5kZXJseWluZyBUQ1AgY29ubmVjdGlvbnMgKi9cclxuICAgICAgICB0aGlzLk51bVRjcENvbm5lY3Rpb25zX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIE51bWJlciBvZiB1bmRlcmx5aW5nIGluYm91bmQgVENQIGNvbm5lY3Rpb25zICovXHJcbiAgICAgICAgdGhpcy5OdW1UY3BDb25uZWN0aW9uc1VwbG9hZF91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBOdW1iZXIgb2YgdW5kZXJseWluZyBvdXRib3VuZCBUQ1AgY29ubmVjdGlvbnMgKi9cclxuICAgICAgICB0aGlzLk51bVRjcENvbm5lY3Rpb25zRG93bmxvYWRfdTMyID0gMDtcclxuICAgICAgICAvKiogVXNlIG9mIGVuY3J5cHRpb24gKi9cclxuICAgICAgICB0aGlzLlVzZUVuY3J5cHRfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBDaXBoZXIgYWxnb3JpdGhtIG5hbWUgKi9cclxuICAgICAgICB0aGlzLkNpcGhlck5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogVXNlIG9mIGNvbXByZXNzaW9uICovXHJcbiAgICAgICAgdGhpcy5Vc2VDb21wcmVzc19ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFRoZSBmbGFnIHdoZXRoZXIgdGhpcyBpcyBhIFItVURQIHNlc3Npb24gKi9cclxuICAgICAgICB0aGlzLklzUlVEUFNlc3Npb25fYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBVbmRlcmx5aW5nIHBoeXNpY2FsIGNvbW11bmljYXRpb24gcHJvdG9jb2wgKi9cclxuICAgICAgICB0aGlzLlVuZGVybGF5UHJvdG9jb2xfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogVGhlIFVEUCBhY2NlbGVyYXRpb24gaXMgZW5hYmxlZCAqL1xyXG4gICAgICAgIHRoaXMuSXNVZHBBY2NlbGVyYXRpb25FbmFibGVkX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogVGhlIFVEUCBhY2NlbGVyYXRpb24gaXMgYmVpbmcgYWN0dWFsbHkgdXNlZCAqL1xyXG4gICAgICAgIHRoaXMuSXNVc2luZ1VkcEFjY2VsZXJhdGlvbl9ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNlc3Npb24gbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuU2Vzc2lvbk5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogQ29ubmVjdGlvbiBuYW1lICovXHJcbiAgICAgICAgdGhpcy5Db25uZWN0aW9uTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBTZXNzaW9uIGtleSAqL1xyXG4gICAgICAgIHRoaXMuU2Vzc2lvbktleV9iaW4gPSBuZXcgVWludDhBcnJheShbXSk7XHJcbiAgICAgICAgLyoqIFRvdGFsIHRyYW5zbWl0dGVkIGRhdGEgc2l6ZSAqL1xyXG4gICAgICAgIHRoaXMuVG90YWxTZW5kU2l6ZV91NjQgPSAwO1xyXG4gICAgICAgIC8qKiBUb3RhbCByZWNlaXZlZCBkYXRhIHNpemUgKi9cclxuICAgICAgICB0aGlzLlRvdGFsUmVjdlNpemVfdTY0ID0gMDtcclxuICAgICAgICAvKiogVG90YWwgdHJhbnNtaXR0ZWQgZGF0YSBzaXplIChubyBjb21wcmVzc2lvbikgKi9cclxuICAgICAgICB0aGlzLlRvdGFsU2VuZFNpemVSZWFsX3U2NCA9IDA7XHJcbiAgICAgICAgLyoqIFRvdGFsIHJlY2VpdmVkIGRhdGEgc2l6ZSAobm8gY29tcHJlc3Npb24pICovXHJcbiAgICAgICAgdGhpcy5Ub3RhbFJlY3ZTaXplUmVhbF91NjQgPSAwO1xyXG4gICAgICAgIC8qKiBUaGUgZmxhZyB3aGV0aGVyIHRoZSBWUE4gc2Vzc2lvbiBpcyBCcmlkZ2UgTW9kZSAqL1xyXG4gICAgICAgIHRoaXMuSXNCcmlkZ2VNb2RlX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogVGhlIGZsYWcgd2hldGhlciB0aGUgVlBOIHNlc3Npb24gaXMgTW9uaXRvciBtb2RlICovXHJcbiAgICAgICAgdGhpcy5Jc01vbml0b3JNb2RlX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogVkxBTiBJRCAqL1xyXG4gICAgICAgIHRoaXMuVkxhbklkX3UzMiA9IDA7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNMaW5rU3RhdHVzO1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY0xpbmtTdGF0dXMgPSBWcG5ScGNMaW5rU3RhdHVzO1xyXG4vKiogU2V0dGluZyBvZiBTU1RQIGFuZCBPcGVuVlBOICovXHJcbnZhciBWcG5PcGVuVnBuU3N0cENvbmZpZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5PcGVuVnBuU3N0cENvbmZpZycgY2xhc3M6IFNldHRpbmcgb2YgU1NUUCBhbmQgT3BlblZQTiAqL1xyXG4gICAgZnVuY3Rpb24gVnBuT3BlblZwblNzdHBDb25maWcoaW5pdCkge1xyXG4gICAgICAgIC8qKiBTcGVjaWZ5IHRydWUgdG8gZW5hYmxlIHRoZSBPcGVuVlBOIENsb25lIFNlcnZlciBGdW5jdGlvbi4gU3BlY2lmeSBmYWxzZSB0byBkaXNhYmxlLiAqL1xyXG4gICAgICAgIHRoaXMuRW5hYmxlT3BlblZQTl9ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFNwZWNpZnkgVURQIHBvcnRzIHRvIGxpc3RlbiBmb3IgT3BlblZQTi4gTXVsdGlwbGUgVURQIHBvcnRzIGNhbiBiZSBzcGVjaWZpZWQgd2l0aCBzcGxpdHRpbmcgYnkgc3BhY2Ugb3IgY29tbWEgbGV0dGVycywgZm9yIGV4YW1wbGU6IFwiMTE5NCwgMjAwMSwgMjAxMCwgMjAxMlwiLiBUaGUgZGVmYXVsdCBwb3J0IGZvciBPcGVuVlBOIGlzIFVEUCAxMTk0LiBZb3UgY2FuIHNwZWNpZnkgYW55IG90aGVyIFVEUCBwb3J0cy4gKi9cclxuICAgICAgICB0aGlzLk9wZW5WUE5Qb3J0TGlzdF9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBwZWNpZnkgdHJ1ZSB0byBlbmFibGUgdGhlIE1pY3Jvc29mdCBTU1RQIFZQTiBDbG9uZSBTZXJ2ZXIgRnVuY3Rpb24uIFNwZWNpZnkgZmFsc2UgdG8gZGlzYWJsZS4gKi9cclxuICAgICAgICB0aGlzLkVuYWJsZVNTVFBfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuT3BlblZwblNzdHBDb25maWc7XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuT3BlblZwblNzdHBDb25maWcgPSBWcG5PcGVuVnBuU3N0cENvbmZpZztcclxuLyoqIFZpcnR1YWwgaG9zdCBvcHRpb24gKi9cclxudmFyIFZwblZoT3B0aW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwblZoT3B0aW9uJyBjbGFzczogVmlydHVhbCBob3N0IG9wdGlvbiAqL1xyXG4gICAgZnVuY3Rpb24gVnBuVmhPcHRpb24oaW5pdCkge1xyXG4gICAgICAgIC8qKiBUYXJnZXQgVmlydHVhbCBIVUIgbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuUnBjSHViTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBNQUMgYWRkcmVzcyAqL1xyXG4gICAgICAgIHRoaXMuTWFjQWRkcmVzc19iaW4gPSBuZXcgVWludDhBcnJheShbXSk7XHJcbiAgICAgICAgLyoqIElQIGFkZHJlc3MgKi9cclxuICAgICAgICB0aGlzLklwX2lwID0gXCJcIjtcclxuICAgICAgICAvKiogU3VibmV0IG1hc2sgKi9cclxuICAgICAgICB0aGlzLk1hc2tfaXAgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBVc2UgZmxhZyBvZiB0aGUgVmlydHVhbCBOQVQgZnVuY3Rpb24gKi9cclxuICAgICAgICB0aGlzLlVzZU5hdF9ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIE1UVSB2YWx1ZSAoU3RhbmRhcmQ6IDE1MDApICovXHJcbiAgICAgICAgdGhpcy5NdHVfdTMyID0gMDtcclxuICAgICAgICAvKiogTkFUIFRDUCB0aW1lb3V0IGluIHNlY29uZHMgKi9cclxuICAgICAgICB0aGlzLk5hdFRjcFRpbWVvdXRfdTMyID0gMDtcclxuICAgICAgICAvKiogTkFUIFVEUCB0aW1lb3V0IGluIHNlY29uZHMgKi9cclxuICAgICAgICB0aGlzLk5hdFVkcFRpbWVvdXRfdTMyID0gMDtcclxuICAgICAgICAvKiogVXNpbmcgZmxhZyBvZiBESENQIGZ1bmN0aW9uICovXHJcbiAgICAgICAgdGhpcy5Vc2VEaGNwX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogU3BlY2lmeSB0aGUgc3RhcnQgcG9pbnQgb2YgdGhlIGFkZHJlc3MgYmFuZCB0byBiZSBkaXN0cmlidXRlZCB0byB0aGUgY2xpZW50LiAoRXhhbXBsZTogMTkyLjE2OC4zMC4xMCkgKi9cclxuICAgICAgICB0aGlzLkRoY3BMZWFzZUlQU3RhcnRfaXAgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBTcGVjaWZ5IHRoZSBlbmQgcG9pbnQgb2YgdGhlIGFkZHJlc3MgYmFuZCB0byBiZSBkaXN0cmlidXRlZCB0byB0aGUgY2xpZW50LiAoRXhhbXBsZTogMTkyLjE2OC4zMC4yMDApICovXHJcbiAgICAgICAgdGhpcy5EaGNwTGVhc2VJUEVuZF9pcCA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFNwZWNpZnkgdGhlIHN1Ym5ldCBtYXNrIHRvIGJlIHNwZWNpZmllZCBmb3IgdGhlIGNsaWVudC4gKEV4YW1wbGU6IDI1NS4yNTUuMjU1LjApICovXHJcbiAgICAgICAgdGhpcy5EaGNwU3VibmV0TWFza19pcCA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFNwZWNpZnkgdGhlIGV4cGlyYXRpb24gZGF0ZSBpbiBzZWNvbmQgdW5pdHMgZm9yIGxlYXNpbmcgYW4gSVAgYWRkcmVzcyB0byBhIGNsaWVudC4gKi9cclxuICAgICAgICB0aGlzLkRoY3BFeHBpcmVUaW1lU3Bhbl91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBTcGVjaWZ5IHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBkZWZhdWx0IGdhdGV3YXkgdG8gYmUgbm90aWZpZWQgdG8gdGhlIGNsaWVudC4gWW91IGNhbiBzcGVjaWZ5IGEgU2VjdXJlTkFUIFZpcnR1YWwgSG9zdCBJUCBhZGRyZXNzIGZvciB0aGlzIHdoZW4gdGhlIFNlY3VyZU5BVCBGdW5jdGlvbidzIFZpcnR1YWwgTkFUIEZ1bmN0aW9uIGhhcyBiZWVuIGVuYWJsZWQgYW5kIGlzIGJlaW5nIHVzZWQgYWxzby4gSWYgeW91IHNwZWNpZnkgMCBvciBub25lLCB0aGVuIHRoZSBjbGllbnQgd2lsbCBub3QgYmUgbm90aWZpZWQgb2YgdGhlIGRlZmF1bHQgZ2F0ZXdheS4gKi9cclxuICAgICAgICB0aGlzLkRoY3BHYXRld2F5QWRkcmVzc19pcCA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFNwZWNpZnkgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIHByaW1hcnkgRE5TIFNlcnZlciB0byBiZSBub3RpZmllZCB0byB0aGUgY2xpZW50LiBZb3UgY2FuIHNwZWNpZnkgYSBTZWN1cmVOQVQgVmlydHVhbCBIb3N0IElQIGFkZHJlc3MgZm9yIHRoaXMgd2hlbiB0aGUgU2VjdXJlTkFUIEZ1bmN0aW9uJ3MgVmlydHVhbCBOQVQgRnVuY3Rpb24gaGFzIGJlZW4gZW5hYmxlZCBhbmQgaXMgYmVpbmcgdXNlZCBhbHNvLiBJZiB5b3Ugc3BlY2lmeSBlbXB0eSwgdGhlbiB0aGUgY2xpZW50IHdpbGwgbm90IGJlIG5vdGlmaWVkIG9mIHRoZSBETlMgU2VydmVyIGFkZHJlc3MuICovXHJcbiAgICAgICAgdGhpcy5EaGNwRG5zU2VydmVyQWRkcmVzc19pcCA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFNwZWNpZnkgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIHNlY29uZGFyeSBETlMgU2VydmVyIHRvIGJlIG5vdGlmaWVkIHRvIHRoZSBjbGllbnQuIFlvdSBjYW4gc3BlY2lmeSBhIFNlY3VyZU5BVCBWaXJ0dWFsIEhvc3QgSVAgYWRkcmVzcyBmb3IgdGhpcyB3aGVuIHRoZSBTZWN1cmVOQVQgRnVuY3Rpb24ncyBWaXJ0dWFsIE5BVCBGdW5jdGlvbiBoYXMgYmVlbiBlbmFibGVkIGFuZCBpcyBiZWluZyB1c2VkIGFsc28uIElmIHlvdSBzcGVjaWZ5IGVtcHR5LCB0aGVuIHRoZSBjbGllbnQgd2lsbCBub3QgYmUgbm90aWZpZWQgb2YgdGhlIEROUyBTZXJ2ZXIgYWRkcmVzcy4gKi9cclxuICAgICAgICB0aGlzLkRoY3BEbnNTZXJ2ZXJBZGRyZXNzMl9pcCA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFNwZWNpZnkgdGhlIGRvbWFpbiBuYW1lIHRvIGJlIG5vdGlmaWVkIHRvIHRoZSBjbGllbnQuIElmIHlvdSBzcGVjaWZ5IG5vbmUsIHRoZW4gdGhlIGNsaWVudCB3aWxsIG5vdCBiZSBub3RpZmllZCBvZiB0aGUgZG9tYWluIG5hbWUuICovXHJcbiAgICAgICAgdGhpcy5EaGNwRG9tYWluTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBTcGVjaWZ5IHdoZXRoZXIgb3Igbm90IHRvIHNhdmUgdGhlIFZpcnR1YWwgREhDUCBTZXJ2ZXIgb3BlcmF0aW9uIGluIHRoZSBWaXJ0dWFsIEh1YiBzZWN1cml0eSBsb2cuIFNwZWNpZnkgdHJ1ZSB0byBzYXZlIGl0LiBUaGlzIHZhbHVlIGlzIGludGVybGlua2VkIHdpdGggdGhlIFZpcnR1YWwgTkFUIEZ1bmN0aW9uIGxvZyBzYXZlIHNldHRpbmcuICovXHJcbiAgICAgICAgdGhpcy5TYXZlTG9nX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogVGhlIGZsYWcgdG8gZW5hYmxlIHRoZSBEaGNwUHVzaFJvdXRlc19zdHIgZmllbGQuICovXHJcbiAgICAgICAgdGhpcy5BcHBseURoY3BQdXNoUm91dGVzX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogU3BlY2lmeSB0aGUgc3RhdGljIHJvdXRpbmcgdGFibGUgdG8gcHVzaC4gRXhhbXBsZTogXCIxOTIuMTY4LjUuMC8yNTUuMjU1LjI1NS4wLzE5Mi4xNjguNC4yNTQsIDEwLjAuMC4wLzI1NS4wLjAuMC8xOTIuMTY4LjQuMjUzXCIgU3BsaXQgbXVsdGlwbGUgZW50cmllcyAobWF4aW11bTogNjQgZW50cmllcykgYnkgY29tbWEgb3Igc3BhY2UgY2hhcmFjdGVycy4gRWFjaCBlbnRyeSBtdXN0IGJlIHNwZWNpZmllZCBpbiB0aGUgXCJJUCBuZXR3b3JrIGFkZHJlc3Mvc3VibmV0IG1hc2svZ2F0ZXdheSBJUCBhZGRyZXNzXCIgZm9ybWF0LiBUaGlzIFZpcnR1YWwgREhDUCBTZXJ2ZXIgY2FuIHB1c2ggdGhlIGNsYXNzbGVzcyBzdGF0aWMgcm91dGVzIChSRkMgMzQ0Mikgd2l0aCBESENQIHJlcGx5IG1lc3NhZ2VzIHRvIFZQTiBjbGllbnRzLiBXaGV0aGVyIG9yIG5vdCBhIFZQTiBjbGllbnQgY2FuIHJlY29nbml6ZSB0aGUgY2xhc3NsZXNzIHN0YXRpYyByb3V0ZXMgKFJGQyAzNDQyKSBkZXBlbmRzIG9uIHRoZSB0YXJnZXQgVlBOIGNsaWVudCBzb2Z0d2FyZS4gU29mdEV0aGVyIFZQTiBDbGllbnQgYW5kIE9wZW5WUE4gQ2xpZW50IGFyZSBzdXBwb3J0aW5nIHRoZSBjbGFzc2xlc3Mgc3RhdGljIHJvdXRlcy4gT24gTDJUUC9JUHNlYyBhbmQgTVMtU1NUUCBwcm90b2NvbHMsIHRoZSBjb21wYXRpYmlsaXR5IGRlcGVuZHMgb24gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjbGllbnQgc29mdHdhcmUuIFlvdSBjYW4gcmVhbGl6ZSB0aGUgc3BsaXQgdHVubmVsaW5nIGlmIHlvdSBjbGVhciB0aGUgZGVmYXVsdCBnYXRld2F5IGZpZWxkIG9uIHRoZSBWaXJ0dWFsIERIQ1AgU2VydmVyIG9wdGlvbnMuIE9uIHRoZSBjbGllbnQgc2lkZSwgTDJUUC9JUHNlYyBhbmQgTVMtU1NUUCBjbGllbnRzIG5lZWQgdG8gYmUgY29uZmlndXJlZCBub3QgdG8gc2V0IHVwIHRoZSBkZWZhdWx0IGdhdGV3YXkgZm9yIHRoZSBzcGxpdCB0dW5uZWxpbmcgdXNhZ2UuIFlvdSBjYW4gYWxzbyBwdXNoIHRoZSBjbGFzc2xlc3Mgc3RhdGljIHJvdXRlcyAoUkZDIDM0NDIpIGJ5IHlvdXIgZXhpc3RpbmcgZXh0ZXJuYWwgREhDUCBzZXJ2ZXIuIEluIHRoYXQgY2FzZSwgZGlzYWJsZSB0aGUgVmlydHVhbCBESENQIFNlcnZlciBmdW5jdGlvbiBvbiBTZWN1cmVOQVQsIGFuZCB5b3UgbmVlZCBub3QgdG8gc2V0IHVwIHRoZSBjbGFzc2xlc3Mgcm91dGVzIG9uIHRoaXMgQVBJLiBTZWUgdGhlIFJGQyAzNDQyIHRvIHVuZGVyc3RhbmQgdGhlIGNsYXNzbGVzcyByb3V0ZXMuICovXHJcbiAgICAgICAgdGhpcy5EaGNwUHVzaFJvdXRlc19zdHIgPSBcIlwiO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuVmhPcHRpb247XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuVmhPcHRpb24gPSBWcG5WaE9wdGlvbjtcclxuLyoqIFJQQ19OQVRfU1RBVFVTICovXHJcbnZhciBWcG5ScGNOYXRTdGF0dXMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjTmF0U3RhdHVzJyBjbGFzczogUlBDX05BVF9TVEFUVVMgKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY05hdFN0YXR1cyhpbml0KSB7XHJcbiAgICAgICAgLyoqIFZpcnR1YWwgSHViIE5hbWUgKi9cclxuICAgICAgICB0aGlzLkh1Yk5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIFRDUCBzZXNzaW9ucyAqL1xyXG4gICAgICAgIHRoaXMuTnVtVGNwU2Vzc2lvbnNfdTMyID0gMDtcclxuICAgICAgICAvKiogTnRtYmVyIG9mIFVEUCBzZXNzaW9ucyAqL1xyXG4gICAgICAgIHRoaXMuTnVtVWRwU2Vzc2lvbnNfdTMyID0gMDtcclxuICAgICAgICAvKiogTnltYmVyIG9mIElDTVAgc2Vzc2lvbnMgKi9cclxuICAgICAgICB0aGlzLk51bUljbXBTZXNzaW9uc191MzIgPSAwO1xyXG4gICAgICAgIC8qKiBOdW1iZXIgb2YgRE5TIHNlc3Npb25zICovXHJcbiAgICAgICAgdGhpcy5OdW1EbnNTZXNzaW9uc191MzIgPSAwO1xyXG4gICAgICAgIC8qKiBOdW1iZXIgb2YgREhDUCBjbGllbnRzICovXHJcbiAgICAgICAgdGhpcy5OdW1EaGNwQ2xpZW50c191MzIgPSAwO1xyXG4gICAgICAgIC8qKiBXaGV0aGVyIHRoZSBOQVQgaXMgb3BlcmF0aW5nIGluIHRoZSBLZXJuZWwgTW9kZSAqL1xyXG4gICAgICAgIHRoaXMuSXNLZXJuZWxNb2RlX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogV2hldGhlciB0aGUgTkFUIGlzIG9wZXJhdGluZyBpbiB0aGUgUmF3IElQIE1vZGUgKi9cclxuICAgICAgICB0aGlzLklzUmF3SXBNb2RlX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY05hdFN0YXR1cztcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNOYXRTdGF0dXMgPSBWcG5ScGNOYXRTdGF0dXM7XHJcbi8qKiBLZXkgcGFpciAqL1xyXG52YXIgVnBuUnBjS2V5UGFpciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNLZXlQYWlyJyBjbGFzczogS2V5IHBhaXIgKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY0tleVBhaXIoaW5pdCkge1xyXG4gICAgICAgIC8qKiBUaGUgYm9keSBvZiB0aGUgY2VydGlmaWNhdGUgKi9cclxuICAgICAgICB0aGlzLkNlcnRfYmluID0gbmV3IFVpbnQ4QXJyYXkoW10pO1xyXG4gICAgICAgIC8qKiBUaGUgYm9keSBvZiB0aGUgcHJpdmF0ZSBrZXkgKi9cclxuICAgICAgICB0aGlzLktleV9iaW4gPSBuZXcgVWludDhBcnJheShbXSk7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNLZXlQYWlyO1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY0tleVBhaXIgPSBWcG5ScGNLZXlQYWlyO1xyXG4vKiogU2luZ2xlIHN0cmluZyB2YWx1ZSAqL1xyXG52YXIgVnBuUnBjU3RyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwblJwY1N0cicgY2xhc3M6IFNpbmdsZSBzdHJpbmcgdmFsdWUgKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY1N0cihpbml0KSB7XHJcbiAgICAgICAgLyoqIEEgc3RyaW5nIHZhbHVlICovXHJcbiAgICAgICAgdGhpcy5TdHJpbmdfc3RyID0gXCJcIjtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY1N0cjtcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNTdHIgPSBWcG5ScGNTdHI7XHJcbi8qKiBUeXBlIG9mIFZQTiBTZXJ2ZXIgKi9cclxudmFyIFZwblJwY1NlcnZlclR5cGU7XHJcbihmdW5jdGlvbiAoVnBuUnBjU2VydmVyVHlwZSkge1xyXG4gICAgLyoqIFN0YW5kLWFsb25lIHNlcnZlciAqL1xyXG4gICAgVnBuUnBjU2VydmVyVHlwZVtWcG5ScGNTZXJ2ZXJUeXBlW1wiU3RhbmRhbG9uZVwiXSA9IDBdID0gXCJTdGFuZGFsb25lXCI7XHJcbiAgICAvKiogRmFybSBjb250cm9sbGVyIHNlcnZlciAqL1xyXG4gICAgVnBuUnBjU2VydmVyVHlwZVtWcG5ScGNTZXJ2ZXJUeXBlW1wiRmFybUNvbnRyb2xsZXJcIl0gPSAxXSA9IFwiRmFybUNvbnRyb2xsZXJcIjtcclxuICAgIC8qKiBGYXJtIG1lbWJlciBzZXJ2ZXIgKi9cclxuICAgIFZwblJwY1NlcnZlclR5cGVbVnBuUnBjU2VydmVyVHlwZVtcIkZhcm1NZW1iZXJcIl0gPSAyXSA9IFwiRmFybU1lbWJlclwiO1xyXG59KShWcG5ScGNTZXJ2ZXJUeXBlID0gZXhwb3J0cy5WcG5ScGNTZXJ2ZXJUeXBlIHx8IChleHBvcnRzLlZwblJwY1NlcnZlclR5cGUgPSB7fSkpO1xyXG4vKiogT3BlcmF0aW5nIHN5c3RlbSB0eXBlICovXHJcbnZhciBWcG5ScGNPc1R5cGU7XHJcbihmdW5jdGlvbiAoVnBuUnBjT3NUeXBlKSB7XHJcbiAgICAvKiogV2luZG93cyA5NSAqL1xyXG4gICAgVnBuUnBjT3NUeXBlW1ZwblJwY09zVHlwZVtcIldJTkRPV1NfOTVcIl0gPSAxMTAwXSA9IFwiV0lORE9XU185NVwiO1xyXG4gICAgLyoqIFdpbmRvd3MgOTggKi9cclxuICAgIFZwblJwY09zVHlwZVtWcG5ScGNPc1R5cGVbXCJXSU5ET1dTXzk4XCJdID0gMTIwMF0gPSBcIldJTkRPV1NfOThcIjtcclxuICAgIC8qKiBXaW5kb3dzIE1lICovXHJcbiAgICBWcG5ScGNPc1R5cGVbVnBuUnBjT3NUeXBlW1wiV0lORE9XU19NRVwiXSA9IDEzMDBdID0gXCJXSU5ET1dTX01FXCI7XHJcbiAgICAvKiogV2luZG93cyAodW5rbm93bikgKi9cclxuICAgIFZwblJwY09zVHlwZVtWcG5ScGNPc1R5cGVbXCJXSU5ET1dTX1VOS05PV05cIl0gPSAxNDAwXSA9IFwiV0lORE9XU19VTktOT1dOXCI7XHJcbiAgICAvKiogV2luZG93cyBOVCA0LjAgV29ya3N0YXRpb24gKi9cclxuICAgIFZwblJwY09zVHlwZVtWcG5ScGNPc1R5cGVbXCJXSU5ET1dTX05UXzRfV09SS1NUQVRJT05cIl0gPSAyMTAwXSA9IFwiV0lORE9XU19OVF80X1dPUktTVEFUSU9OXCI7XHJcbiAgICAvKiogV2luZG93cyBOVCA0LjAgU2VydmVyICovXHJcbiAgICBWcG5ScGNPc1R5cGVbVnBuUnBjT3NUeXBlW1wiV0lORE9XU19OVF80X1NFUlZFUlwiXSA9IDIxMTBdID0gXCJXSU5ET1dTX05UXzRfU0VSVkVSXCI7XHJcbiAgICAvKiogV2luZG93cyBOVCA0LjAgU2VydmVyLCBFbnRlcnByaXNlIEVkaXRpb24gKi9cclxuICAgIFZwblJwY09zVHlwZVtWcG5ScGNPc1R5cGVbXCJXSU5ET1dTX05UXzRfU0VSVkVSX0VOVEVSUFJJU0VcIl0gPSAyMTExXSA9IFwiV0lORE9XU19OVF80X1NFUlZFUl9FTlRFUlBSSVNFXCI7XHJcbiAgICAvKiogV2luZG93cyBOVCA0LjAgVGVybWluYWwgU2VydmVyICovXHJcbiAgICBWcG5ScGNPc1R5cGVbVnBuUnBjT3NUeXBlW1wiV0lORE9XU19OVF80X1RFUk1JTkFMX1NFUlZFUlwiXSA9IDIxMTJdID0gXCJXSU5ET1dTX05UXzRfVEVSTUlOQUxfU0VSVkVSXCI7XHJcbiAgICAvKiogQmFja09mZmljZSBTZXJ2ZXIgNC41ICovXHJcbiAgICBWcG5ScGNPc1R5cGVbVnBuUnBjT3NUeXBlW1wiV0lORE9XU19OVF80X0JBQ0tPRkZJQ0VcIl0gPSAyMTEzXSA9IFwiV0lORE9XU19OVF80X0JBQ0tPRkZJQ0VcIjtcclxuICAgIC8qKiBTbWFsbCBCdXNpbmVzcyBTZXJ2ZXIgNC41ICovXHJcbiAgICBWcG5ScGNPc1R5cGVbVnBuUnBjT3NUeXBlW1wiV0lORE9XU19OVF80X1NNU1wiXSA9IDIxMTRdID0gXCJXSU5ET1dTX05UXzRfU01TXCI7XHJcbiAgICAvKiogV2luZG93cyAyMDAwIFByb2Zlc3Npb25hbCAqL1xyXG4gICAgVnBuUnBjT3NUeXBlW1ZwblJwY09zVHlwZVtcIldJTkRPV1NfMjAwMF9QUk9GRVNTSU9OQUxcIl0gPSAyMjAwXSA9IFwiV0lORE9XU18yMDAwX1BST0ZFU1NJT05BTFwiO1xyXG4gICAgLyoqIFdpbmRvd3MgMjAwMCBTZXJ2ZXIgKi9cclxuICAgIFZwblJwY09zVHlwZVtWcG5ScGNPc1R5cGVbXCJXSU5ET1dTXzIwMDBfU0VSVkVSXCJdID0gMjIxMV0gPSBcIldJTkRPV1NfMjAwMF9TRVJWRVJcIjtcclxuICAgIC8qKiBXaW5kb3dzIDIwMDAgQWR2YW5jZWQgU2VydmVyICovXHJcbiAgICBWcG5ScGNPc1R5cGVbVnBuUnBjT3NUeXBlW1wiV0lORE9XU18yMDAwX0FEVkFOQ0VEX1NFUlZFUlwiXSA9IDIyMTJdID0gXCJXSU5ET1dTXzIwMDBfQURWQU5DRURfU0VSVkVSXCI7XHJcbiAgICAvKiogV2luZG93cyAyMDAwIERhdGFjZW50ZXIgU2VydmVyICovXHJcbiAgICBWcG5ScGNPc1R5cGVbVnBuUnBjT3NUeXBlW1wiV0lORE9XU18yMDAwX0RBVEFDRU5URVJfU0VSVkVSXCJdID0gMjIxM10gPSBcIldJTkRPV1NfMjAwMF9EQVRBQ0VOVEVSX1NFUlZFUlwiO1xyXG4gICAgLyoqIEJhY2tPZmZpY2UgU2VydmVyIDIwMDAgKi9cclxuICAgIFZwblJwY09zVHlwZVtWcG5ScGNPc1R5cGVbXCJXSU5ET1dTXzIwMDBfQkFDS09GRklDRVwiXSA9IDIyMTRdID0gXCJXSU5ET1dTXzIwMDBfQkFDS09GRklDRVwiO1xyXG4gICAgLyoqIFNtYWxsIEJ1c2luZXNzIFNlcnZlciAyMDAwICovXHJcbiAgICBWcG5ScGNPc1R5cGVbVnBuUnBjT3NUeXBlW1wiV0lORE9XU18yMDAwX1NCU1wiXSA9IDIyMTVdID0gXCJXSU5ET1dTXzIwMDBfU0JTXCI7XHJcbiAgICAvKiogV2luZG93cyBYUCBIb21lIEVkaXRpb24gKi9cclxuICAgIFZwblJwY09zVHlwZVtWcG5ScGNPc1R5cGVbXCJXSU5ET1dTX1hQX0hPTUVcIl0gPSAyMzAwXSA9IFwiV0lORE9XU19YUF9IT01FXCI7XHJcbiAgICAvKiogV2luZG93cyBYUCBQcm9mZXNzaW9uYWwgKi9cclxuICAgIFZwblJwY09zVHlwZVtWcG5ScGNPc1R5cGVbXCJXSU5ET1dTX1hQX1BST0ZFU1NJT05BTFwiXSA9IDIzMDFdID0gXCJXSU5ET1dTX1hQX1BST0ZFU1NJT05BTFwiO1xyXG4gICAgLyoqIFdpbmRvd3MgU2VydmVyIDIwMDMgV2ViIEVkaXRpb24gKi9cclxuICAgIFZwblJwY09zVHlwZVtWcG5ScGNPc1R5cGVbXCJXSU5ET1dTXzIwMDNfV0VCXCJdID0gMjQxMF0gPSBcIldJTkRPV1NfMjAwM19XRUJcIjtcclxuICAgIC8qKiBXaW5kb3dzIFNlcnZlciAyMDAzIFN0YW5kYXJkIEVkaXRpb24gKi9cclxuICAgIFZwblJwY09zVHlwZVtWcG5ScGNPc1R5cGVbXCJXSU5ET1dTXzIwMDNfU1RBTkRBUkRcIl0gPSAyNDExXSA9IFwiV0lORE9XU18yMDAzX1NUQU5EQVJEXCI7XHJcbiAgICAvKiogV2luZG93cyBTZXJ2ZXIgMjAwMyBFbnRlcnByaXNlIEVkaXRpb24gKi9cclxuICAgIFZwblJwY09zVHlwZVtWcG5ScGNPc1R5cGVbXCJXSU5ET1dTXzIwMDNfRU5URVJQUklTRVwiXSA9IDI0MTJdID0gXCJXSU5ET1dTXzIwMDNfRU5URVJQUklTRVwiO1xyXG4gICAgLyoqIFdpbmRvd3MgU2VydmVyIDIwMDMgRGF0YUNlbnRlciBFZGl0aW9uICovXHJcbiAgICBWcG5ScGNPc1R5cGVbVnBuUnBjT3NUeXBlW1wiV0lORE9XU18yMDAzX0RBVEFDRU5URVJcIl0gPSAyNDEzXSA9IFwiV0lORE9XU18yMDAzX0RBVEFDRU5URVJcIjtcclxuICAgIC8qKiBCYWNrT2ZmaWNlIFNlcnZlciAyMDAzICovXHJcbiAgICBWcG5ScGNPc1R5cGVbVnBuUnBjT3NUeXBlW1wiV0lORE9XU18yMDAzX0JBQ0tPRkZJQ0VcIl0gPSAyNDE0XSA9IFwiV0lORE9XU18yMDAzX0JBQ0tPRkZJQ0VcIjtcclxuICAgIC8qKiBTbWFsbCBCdXNpbmVzcyBTZXJ2ZXIgMjAwMyAqL1xyXG4gICAgVnBuUnBjT3NUeXBlW1ZwblJwY09zVHlwZVtcIldJTkRPV1NfMjAwM19TQlNcIl0gPSAyNDE1XSA9IFwiV0lORE9XU18yMDAzX1NCU1wiO1xyXG4gICAgLyoqIFdpbmRvd3MgVmlzdGEgKi9cclxuICAgIFZwblJwY09zVHlwZVtWcG5ScGNPc1R5cGVbXCJXSU5ET1dTX0xPTkdIT1JOX1BST0ZFU1NJT05BTFwiXSA9IDI1MDBdID0gXCJXSU5ET1dTX0xPTkdIT1JOX1BST0ZFU1NJT05BTFwiO1xyXG4gICAgLyoqIFdpbmRvd3MgU2VydmVyIDIwMDggKi9cclxuICAgIFZwblJwY09zVHlwZVtWcG5ScGNPc1R5cGVbXCJXSU5ET1dTX0xPTkdIT1JOX1NFUlZFUlwiXSA9IDI1MTBdID0gXCJXSU5ET1dTX0xPTkdIT1JOX1NFUlZFUlwiO1xyXG4gICAgLyoqIFdpbmRvd3MgNyAqL1xyXG4gICAgVnBuUnBjT3NUeXBlW1ZwblJwY09zVHlwZVtcIldJTkRPV1NfN1wiXSA9IDI2MDBdID0gXCJXSU5ET1dTXzdcIjtcclxuICAgIC8qKiBXaW5kb3dzIFNlcnZlciAyMDA4IFIyICovXHJcbiAgICBWcG5ScGNPc1R5cGVbVnBuUnBjT3NUeXBlW1wiV0lORE9XU19TRVJWRVJfMjAwOF9SMlwiXSA9IDI2MTBdID0gXCJXSU5ET1dTX1NFUlZFUl8yMDA4X1IyXCI7XHJcbiAgICAvKiogV2luZG93cyA4ICovXHJcbiAgICBWcG5ScGNPc1R5cGVbVnBuUnBjT3NUeXBlW1wiV0lORE9XU184XCJdID0gMjcwMF0gPSBcIldJTkRPV1NfOFwiO1xyXG4gICAgLyoqIFdpbmRvd3MgU2VydmVyIDIwMTIgKi9cclxuICAgIFZwblJwY09zVHlwZVtWcG5ScGNPc1R5cGVbXCJXSU5ET1dTX1NFUlZFUl84XCJdID0gMjcxMF0gPSBcIldJTkRPV1NfU0VSVkVSXzhcIjtcclxuICAgIC8qKiBXaW5kb3dzIDguMSAqL1xyXG4gICAgVnBuUnBjT3NUeXBlW1ZwblJwY09zVHlwZVtcIldJTkRPV1NfODFcIl0gPSAyNzAxXSA9IFwiV0lORE9XU184MVwiO1xyXG4gICAgLyoqIFdpbmRvd3MgU2VydmVyIDIwMTIgUjIgKi9cclxuICAgIFZwblJwY09zVHlwZVtWcG5ScGNPc1R5cGVbXCJXSU5ET1dTX1NFUlZFUl84MVwiXSA9IDI3MTFdID0gXCJXSU5ET1dTX1NFUlZFUl84MVwiO1xyXG4gICAgLyoqIFdpbmRvd3MgMTAgKi9cclxuICAgIFZwblJwY09zVHlwZVtWcG5ScGNPc1R5cGVbXCJXSU5ET1dTXzEwXCJdID0gMjcwMl0gPSBcIldJTkRPV1NfMTBcIjtcclxuICAgIC8qKiBXaW5kb3dzIFNlcnZlciAxMCAqL1xyXG4gICAgVnBuUnBjT3NUeXBlW1ZwblJwY09zVHlwZVtcIldJTkRPV1NfU0VSVkVSXzEwXCJdID0gMjcxMl0gPSBcIldJTkRPV1NfU0VSVkVSXzEwXCI7XHJcbiAgICAvKiogV2luZG93cyAxMSBvciBsYXRlciAqL1xyXG4gICAgVnBuUnBjT3NUeXBlW1ZwblJwY09zVHlwZVtcIldJTkRPV1NfMTFcIl0gPSAyODAwXSA9IFwiV0lORE9XU18xMVwiO1xyXG4gICAgLyoqIFdpbmRvd3MgU2VydmVyIDExIG9yIGxhdGVyICovXHJcbiAgICBWcG5ScGNPc1R5cGVbVnBuUnBjT3NUeXBlW1wiV0lORE9XU19TRVJWRVJfMTFcIl0gPSAyODEwXSA9IFwiV0lORE9XU19TRVJWRVJfMTFcIjtcclxuICAgIC8qKiBVbmtub3duIFVOSVggKi9cclxuICAgIFZwblJwY09zVHlwZVtWcG5ScGNPc1R5cGVbXCJVTklYX1VOS05PV05cIl0gPSAzMDAwXSA9IFwiVU5JWF9VTktOT1dOXCI7XHJcbiAgICAvKiogTGludXggKi9cclxuICAgIFZwblJwY09zVHlwZVtWcG5ScGNPc1R5cGVbXCJMSU5VWFwiXSA9IDMxMDBdID0gXCJMSU5VWFwiO1xyXG4gICAgLyoqIFNvbGFyaXMgKi9cclxuICAgIFZwblJwY09zVHlwZVtWcG5ScGNPc1R5cGVbXCJTT0xBUklTXCJdID0gMzIwMF0gPSBcIlNPTEFSSVNcIjtcclxuICAgIC8qKiBDeWd3aW4gKi9cclxuICAgIFZwblJwY09zVHlwZVtWcG5ScGNPc1R5cGVbXCJDWUdXSU5cIl0gPSAzMzAwXSA9IFwiQ1lHV0lOXCI7XHJcbiAgICAvKiogQlNEICovXHJcbiAgICBWcG5ScGNPc1R5cGVbVnBuUnBjT3NUeXBlW1wiQlNEXCJdID0gMzQwMF0gPSBcIkJTRFwiO1xyXG4gICAgLyoqIE1hY09TIFggKi9cclxuICAgIFZwblJwY09zVHlwZVtWcG5ScGNPc1R5cGVbXCJNQUNPU19YXCJdID0gMzUwMF0gPSBcIk1BQ09TX1hcIjtcclxufSkoVnBuUnBjT3NUeXBlID0gZXhwb3J0cy5WcG5ScGNPc1R5cGUgfHwgKGV4cG9ydHMuVnBuUnBjT3NUeXBlID0ge30pKTtcclxuLyoqIFZQTiBTZXJ2ZXIgSW5mb3JtYXRpb24gKi9cclxudmFyIFZwblJwY1NlcnZlckluZm8gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjU2VydmVySW5mbycgY2xhc3M6IFZQTiBTZXJ2ZXIgSW5mb3JtYXRpb24gKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY1NlcnZlckluZm8oaW5pdCkge1xyXG4gICAgICAgIC8qKiBTZXJ2ZXIgcHJvZHVjdCBuYW1lICovXHJcbiAgICAgICAgdGhpcy5TZXJ2ZXJQcm9kdWN0TmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBTZXJ2ZXIgdmVyc2lvbiBzdHJpbmcgKi9cclxuICAgICAgICB0aGlzLlNlcnZlclZlcnNpb25TdHJpbmdfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogU2VydmVyIGJ1aWxkIGluZm9ybWF0aW9uIHN0cmluZyAqL1xyXG4gICAgICAgIHRoaXMuU2VydmVyQnVpbGRJbmZvU3RyaW5nX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFNlcnZlciB2ZXJzaW9uIGludGVnZXIgdmFsdWUgKi9cclxuICAgICAgICB0aGlzLlNlcnZlclZlckludF91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBTZXJ2ZXIgYnVpbGQgbnVtYmVyIGludGVnZXIgdmFsdWUgKi9cclxuICAgICAgICB0aGlzLlNlcnZlckJ1aWxkSW50X3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIFNlcnZlciBob3N0IG5hbWUgKi9cclxuICAgICAgICB0aGlzLlNlcnZlckhvc3ROYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFR5cGUgb2Ygc2VydmVyICovXHJcbiAgICAgICAgdGhpcy5TZXJ2ZXJUeXBlX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIEJ1aWxkIGRhdGUgYW5kIHRpbWUgb2YgdGhlIHNlcnZlciAqL1xyXG4gICAgICAgIHRoaXMuU2VydmVyQnVpbGREYXRlX2R0ID0gbmV3IERhdGUoKTtcclxuICAgICAgICAvKiogRmFtaWx5IG5hbWUgKi9cclxuICAgICAgICB0aGlzLlNlcnZlckZhbWlseU5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogT1MgdHlwZSAqL1xyXG4gICAgICAgIHRoaXMuT3NUeXBlX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIFNlcnZpY2UgcGFjayBudW1iZXIgKi9cclxuICAgICAgICB0aGlzLk9zU2VydmljZVBhY2tfdTMyID0gMDtcclxuICAgICAgICAvKiogT1Mgc3lzdGVtIG5hbWUgKi9cclxuICAgICAgICB0aGlzLk9zU3lzdGVtTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBPUyBwcm9kdWN0IG5hbWUgKi9cclxuICAgICAgICB0aGlzLk9zUHJvZHVjdE5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogT1MgdmVuZG9yIG5hbWUgKi9cclxuICAgICAgICB0aGlzLk9zVmVuZG9yTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBPUyB2ZXJzaW9uICovXHJcbiAgICAgICAgdGhpcy5Pc1ZlcnNpb25fc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogS2VybmVsIG5hbWUgKi9cclxuICAgICAgICB0aGlzLktlcm5lbE5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogS2VybmVsIHZlcnNpb24gKi9cclxuICAgICAgICB0aGlzLktlcm5lbFZlcnNpb25fc3RyID0gXCJcIjtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY1NlcnZlckluZm87XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuUnBjU2VydmVySW5mbyA9IFZwblJwY1NlcnZlckluZm87XHJcbi8qKiBTZXJ2ZXIgc3RhdHVzICovXHJcbnZhciBWcG5ScGNTZXJ2ZXJTdGF0dXMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjU2VydmVyU3RhdHVzJyBjbGFzczogU2VydmVyIHN0YXR1cyAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjU2VydmVyU3RhdHVzKGluaXQpIHtcclxuICAgICAgICAvKiogVHlwZSBvZiBzZXJ2ZXIgKi9cclxuICAgICAgICB0aGlzLlNlcnZlclR5cGVfdTMyID0gMDtcclxuICAgICAgICAvKiogVG90YWwgbnVtYmVyIG9mIFRDUCBjb25uZWN0aW9ucyAqL1xyXG4gICAgICAgIHRoaXMuTnVtVGNwQ29ubmVjdGlvbnNfdTMyID0gMDtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIExvY2FsIFRDUCBjb25uZWN0aW9ucyAqL1xyXG4gICAgICAgIHRoaXMuTnVtVGNwQ29ubmVjdGlvbnNMb2NhbF91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBOdW1iZXIgb2YgcmVtb3RlIFRDUCBjb25uZWN0aW9ucyAqL1xyXG4gICAgICAgIHRoaXMuTnVtVGNwQ29ubmVjdGlvbnNSZW1vdGVfdTMyID0gMDtcclxuICAgICAgICAvKiogVG90YWwgbnVtYmVyIG9mIEhVQnMgKi9cclxuICAgICAgICB0aGlzLk51bUh1YlRvdGFsX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIE55bWJlciBvZiBzdGFuZC1hbG9uZSBIVUIgKi9cclxuICAgICAgICB0aGlzLk51bUh1YlN0YW5kYWxvbmVfdTMyID0gMDtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIHN0YXRpYyBIVUJzICovXHJcbiAgICAgICAgdGhpcy5OdW1IdWJTdGF0aWNfdTMyID0gMDtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIER5bmFtaWMgSFVCcyAqL1xyXG4gICAgICAgIHRoaXMuTnVtSHViRHluYW1pY191MzIgPSAwO1xyXG4gICAgICAgIC8qKiBUb3RhbCBudW1iZXIgb2Ygc2Vzc2lvbnMgKi9cclxuICAgICAgICB0aGlzLk51bVNlc3Npb25zVG90YWxfdTMyID0gMDtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIGxvY2FsIFZQTiBzZXNzaW9ucyAqL1xyXG4gICAgICAgIHRoaXMuTnVtU2Vzc2lvbnNMb2NhbF91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBUaGUgbnVtYmVyIG9mIHJlbW90ZSBzZXNzaW9ucyAqL1xyXG4gICAgICAgIHRoaXMuTnVtU2Vzc2lvbnNSZW1vdGVfdTMyID0gMDtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIE1BQyB0YWJsZSBlbnRyaWVzICh0b3RhbCBzdW0gb2YgYWxsIFZpcnR1YWwgSHVicykgKi9cclxuICAgICAgICB0aGlzLk51bU1hY1RhYmxlc191MzIgPSAwO1xyXG4gICAgICAgIC8qKiBOdW1iZXIgb2YgSVAgdGFibGUgZW50cmllcyAodG90YWwgc3VtIG9mIGFsbCBWaXJ0dWFsIEh1YnMpICovXHJcbiAgICAgICAgdGhpcy5OdW1JcFRhYmxlc191MzIgPSAwO1xyXG4gICAgICAgIC8qKiBOdW1iZXIgb2YgdXNlcnMgKHRvdGFsIHN1bSBvZiBhbGwgVmlydHVhbCBIdWJzKSAqL1xyXG4gICAgICAgIHRoaXMuTnVtVXNlcnNfdTMyID0gMDtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIGdyb3VwcyAodG90YWwgc3VtIG9mIGFsbCBWaXJ0dWFsIEh1YnMpICovXHJcbiAgICAgICAgdGhpcy5OdW1Hcm91cHNfdTMyID0gMDtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIGFzc2lnbmVkIGJyaWRnZSBsaWNlbnNlcyAoVXNlZnVsIHRvIG1ha2UgYSBjb21tZXJjaWFsIHZlcnNpb24pICovXHJcbiAgICAgICAgdGhpcy5Bc3NpZ25lZEJyaWRnZUxpY2Vuc2VzX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIE51bWJlciBvZiBhc3NpZ25lZCBjbGllbnQgbGljZW5zZXMgKFVzZWZ1bCB0byBtYWtlIGEgY29tbWVyY2lhbCB2ZXJzaW9uKSAqL1xyXG4gICAgICAgIHRoaXMuQXNzaWduZWRDbGllbnRMaWNlbnNlc191MzIgPSAwO1xyXG4gICAgICAgIC8qKiBOdW1iZXIgb2YgQXNzaWduZWQgYnJpZGdlIGxpY2Vuc2UgKGNsdXN0ZXItd2lkZSksIHVzZWZ1bCB0byBtYWtlIGEgY29tbWVyY2lhbCB2ZXJzaW9uICovXHJcbiAgICAgICAgdGhpcy5Bc3NpZ25lZEJyaWRnZUxpY2Vuc2VzVG90YWxfdTMyID0gMDtcclxuICAgICAgICAvKiogTnVtYmVyIG9mIGFzc2lnbmVkIGNsaWVudCBsaWNlbnNlcyAoY2x1c3Rlci13aWRlKSwgdXNlZnVsIHRvIG1ha2UgYSBjb21tZXJjaWFsIHZlcnNpb24gKi9cclxuICAgICAgICB0aGlzLkFzc2lnbmVkQ2xpZW50TGljZW5zZXNUb3RhbF91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBOdW1iZXIgb2YgYnJvYWRjYXN0IHBhY2tldHMgKFJlY3YpICovXHJcbiAgICAgICAgdGhpc1tcIlJlY3YuQnJvYWRjYXN0Qnl0ZXNfdTY0XCJdID0gMDtcclxuICAgICAgICAvKiogQnJvYWRjYXN0IGJ5dGVzIChSZWN2KSAqL1xyXG4gICAgICAgIHRoaXNbXCJSZWN2LkJyb2FkY2FzdENvdW50X3U2NFwiXSA9IDA7XHJcbiAgICAgICAgLyoqIFVuaWNhc3QgY291bnQgKFJlY3YpICovXHJcbiAgICAgICAgdGhpc1tcIlJlY3YuVW5pY2FzdEJ5dGVzX3U2NFwiXSA9IDA7XHJcbiAgICAgICAgLyoqIFVuaWNhc3QgYnl0ZXMgKFJlY3YpICovXHJcbiAgICAgICAgdGhpc1tcIlJlY3YuVW5pY2FzdENvdW50X3U2NFwiXSA9IDA7XHJcbiAgICAgICAgLyoqIE51bWJlciBvZiBicm9hZGNhc3QgcGFja2V0cyAoU2VuZCkgKi9cclxuICAgICAgICB0aGlzW1wiU2VuZC5Ccm9hZGNhc3RCeXRlc191NjRcIl0gPSAwO1xyXG4gICAgICAgIC8qKiBCcm9hZGNhc3QgYnl0ZXMgKFNlbmQpICovXHJcbiAgICAgICAgdGhpc1tcIlNlbmQuQnJvYWRjYXN0Q291bnRfdTY0XCJdID0gMDtcclxuICAgICAgICAvKiogVW5pY2FzdCBieXRlcyAoU2VuZCkgKi9cclxuICAgICAgICB0aGlzW1wiU2VuZC5VbmljYXN0Qnl0ZXNfdTY0XCJdID0gMDtcclxuICAgICAgICAvKiogVW5pY2FzdCBieXRlcyAoU2VuZCkgKi9cclxuICAgICAgICB0aGlzW1wiU2VuZC5VbmljYXN0Q291bnRfdTY0XCJdID0gMDtcclxuICAgICAgICAvKiogQ3VycmVudCB0aW1lICovXHJcbiAgICAgICAgdGhpcy5DdXJyZW50VGltZV9kdCA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgLyoqIDY0IGJpdCBIaWdoLVByZWNpc2lvbiBMb2dpY2FsIFN5c3RlbSBDbG9jayAqL1xyXG4gICAgICAgIHRoaXMuQ3VycmVudFRpY2tfdTY0ID0gMDtcclxuICAgICAgICAvKiogVlBOIFNlcnZlciBTdGFydC11cCB0aW1lICovXHJcbiAgICAgICAgdGhpcy5TdGFydFRpbWVfZHQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIC8qKiBNZW1vcnkgaW5mb3JtYXRpb246IFRvdGFsIE1lbW9yeSAqL1xyXG4gICAgICAgIHRoaXMuVG90YWxNZW1vcnlfdTY0ID0gMDtcclxuICAgICAgICAvKiogTWVtb3J5IGluZm9ybWF0aW9uOiBVc2VkIE1lbW9yeSAqL1xyXG4gICAgICAgIHRoaXMuVXNlZE1lbW9yeV91NjQgPSAwO1xyXG4gICAgICAgIC8qKiBNZW1vcnkgaW5mb3JtYXRpb246IEZyZWUgTWVtb3J5ICovXHJcbiAgICAgICAgdGhpcy5GcmVlTWVtb3J5X3U2NCA9IDA7XHJcbiAgICAgICAgLyoqIE1lbW9yeSBpbmZvcm1hdGlvbjogVG90YWwgUGh5cyAqL1xyXG4gICAgICAgIHRoaXMuVG90YWxQaHlzX3U2NCA9IDA7XHJcbiAgICAgICAgLyoqIE1lbW9yeSBpbmZvcm1hdGlvbjogVXNlZCBQaHlzICovXHJcbiAgICAgICAgdGhpcy5Vc2VkUGh5c191NjQgPSAwO1xyXG4gICAgICAgIC8qKiBNZW1vcnkgaW5mb3JtYXRpb246IEZyZWUgUGh5cyAqL1xyXG4gICAgICAgIHRoaXMuRnJlZVBoeXNfdTY0ID0gMDtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY1NlcnZlclN0YXR1cztcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNTZXJ2ZXJTdGF0dXMgPSBWcG5ScGNTZXJ2ZXJTdGF0dXM7XHJcbi8qKiBWUE4gU2Vzc2lvbiBzdGF0dXMgKi9cclxudmFyIFZwblJwY1Nlc3Npb25TdGF0dXMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuUnBjU2Vzc2lvblN0YXR1cycgY2xhc3M6IFZQTiBTZXNzaW9uIHN0YXR1cyAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjU2Vzc2lvblN0YXR1cyhpbml0KSB7XHJcbiAgICAgICAgLyoqIFRoZSBWaXJ0dWFsIEh1YiBuYW1lICovXHJcbiAgICAgICAgdGhpcy5IdWJOYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFZQTiBzZXNzaW9uIG5hbWUgKi9cclxuICAgICAgICB0aGlzLk5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogVXNlciBuYW1lICovXHJcbiAgICAgICAgdGhpcy5Vc2VybmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBSZWFsIHVzZXIgbmFtZSB3aGljaCB3YXMgdXNlZCBmb3IgdGhlIGF1dGhlbnRpY2F0aW9uICovXHJcbiAgICAgICAgdGhpcy5SZWFsVXNlcm5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogR3JvdXAgbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuR3JvdXBOYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIElzIENhc2NhZGUgU2Vzc2lvbiAqL1xyXG4gICAgICAgIHRoaXMuTGlua01vZGVfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBDbGllbnQgSVAgYWRkcmVzcyAqL1xyXG4gICAgICAgIHRoaXMuQ2xpZW50X0lwX0FkZHJlc3NfaXAgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBDbGllbnQgaG9zdCBuYW1lICovXHJcbiAgICAgICAgdGhpcy5TZXNzaW9uU3RhdHVzX0NsaWVudEhvc3ROYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIE9wZXJhdGlvbiBmbGFnICovXHJcbiAgICAgICAgdGhpcy5BY3RpdmVfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBDb25uZWN0ZWQgZmxhZyAqL1xyXG4gICAgICAgIHRoaXMuQ29ubmVjdGVkX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogU3RhdGUgb2YgdGhlIGNsaWVudCBzZXNzaW9uICovXHJcbiAgICAgICAgdGhpcy5TZXNzaW9uU3RhdHVzX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIFNlcnZlciBuYW1lICovXHJcbiAgICAgICAgdGhpcy5TZXJ2ZXJOYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFBvcnQgbnVtYmVyIG9mIHRoZSBzZXJ2ZXIgKi9cclxuICAgICAgICB0aGlzLlNlcnZlclBvcnRfdTMyID0gMDtcclxuICAgICAgICAvKiogU2VydmVyIHByb2R1Y3QgbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuU2VydmVyUHJvZHVjdE5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogU2VydmVyIHByb2R1Y3QgdmVyc2lvbiAqL1xyXG4gICAgICAgIHRoaXMuU2VydmVyUHJvZHVjdFZlcl91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBTZXJ2ZXIgcHJvZHVjdCBidWlsZCBudW1iZXIgKi9cclxuICAgICAgICB0aGlzLlNlcnZlclByb2R1Y3RCdWlsZF91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBDb25uZWN0aW9uIHN0YXJ0IHRpbWUgKi9cclxuICAgICAgICB0aGlzLlN0YXJ0VGltZV9kdCA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgLyoqIENvbm5lY3Rpb24gY29tcGxldGlvbiB0aW1lIG9mIHRoZSBmaXJzdCBjb25uZWN0aW9uICovXHJcbiAgICAgICAgdGhpcy5GaXJzdENvbm5lY3Rpb25Fc3RhYmxpc2llZFRpbWVfZHQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIC8qKiBDb25uZWN0aW9uIGNvbXBsZXRpb24gdGltZSBvZiB0aGlzIGNvbm5lY3Rpb24gKi9cclxuICAgICAgICB0aGlzLkN1cnJlbnRDb25uZWN0aW9uRXN0YWJsaXNoVGltZV9kdCA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgLyoqIE51bWJlciBvZiBjb25uZWN0aW9ucyBoYXZlIGJlZW4gZXN0YWJsaXNoZWQgc28gZmFyICovXHJcbiAgICAgICAgdGhpcy5OdW1Db25uZWN0aW9uc0VhdGFibGlzaGVkX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIEhhbGYtY29ubmVjdGlvbiAqL1xyXG4gICAgICAgIHRoaXMuSGFsZkNvbm5lY3Rpb25fYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBWb0lQIC8gUW9TICovXHJcbiAgICAgICAgdGhpcy5Rb1NfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBNYXhpbXVtIG51bWJlciBvZiB0aGUgdW5kZXJseWluZyBUQ1AgY29ubmVjdGlvbnMgKi9cclxuICAgICAgICB0aGlzLk1heFRjcENvbm5lY3Rpb25zX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIE51bWJlciBvZiBjdXJyZW50IHVuZGVybHlpbmcgVENQIGNvbm5lY3Rpb25zICovXHJcbiAgICAgICAgdGhpcy5OdW1UY3BDb25uZWN0aW9uc191MzIgPSAwO1xyXG4gICAgICAgIC8qKiBOdW1iZXIgb2YgaW5ib3VuZCB1bmRlcmx5aW5nIGNvbm5lY3Rpb25zICovXHJcbiAgICAgICAgdGhpcy5OdW1UY3BDb25uZWN0aW9uc1VwbG9hZF91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBOdW1iZXIgb2Ygb3V0Ym91bmQgdW5kZXJseWluZyBjb25uZWN0aW9ucyAqL1xyXG4gICAgICAgIHRoaXMuTnVtVGNwQ29ubmVjdGlvbnNEb3dubG9hZF91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBVc2Ugb2YgZW5jcnlwdGlvbiAqL1xyXG4gICAgICAgIHRoaXMuVXNlRW5jcnlwdF9ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIENpcGhlciBhbGdvcml0aG0gbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuQ2lwaGVyTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBVc2Ugb2YgY29tcHJlc3Npb24gKi9cclxuICAgICAgICB0aGlzLlVzZUNvbXByZXNzX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogSXMgUi1VRFAgc2Vzc2lvbiAqL1xyXG4gICAgICAgIHRoaXMuSXNSVURQU2Vzc2lvbl9ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFBoeXNpY2FsIHVuZGVybHlpbmcgY29tbXVuaWNhdGlvbiBwcm90b2NvbCAqL1xyXG4gICAgICAgIHRoaXMuVW5kZXJsYXlQcm90b2NvbF9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBUaGUgVURQIGFjY2VsZXJhdGlvbiBpcyBlbmFibGVkICovXHJcbiAgICAgICAgdGhpcy5Jc1VkcEFjY2VsZXJhdGlvbkVuYWJsZWRfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBVc2luZyB0aGUgVURQIGFjY2VsZXJhdGlvbiBmdW5jdGlvbiAqL1xyXG4gICAgICAgIHRoaXMuSXNVc2luZ1VkcEFjY2VsZXJhdGlvbl9ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFZQTiBzZXNzaW9uIG5hbWUgKi9cclxuICAgICAgICB0aGlzLlNlc3Npb25OYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIENvbm5lY3Rpb24gbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuQ29ubmVjdGlvbk5hbWVfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogU2Vzc2lvbiBrZXkgKi9cclxuICAgICAgICB0aGlzLlNlc3Npb25LZXlfYmluID0gbmV3IFVpbnQ4QXJyYXkoW10pO1xyXG4gICAgICAgIC8qKiBUb3RhbCB0cmFuc21pdHRlZCBkYXRhIHNpemUgKi9cclxuICAgICAgICB0aGlzLlRvdGFsU2VuZFNpemVfdTY0ID0gMDtcclxuICAgICAgICAvKiogVG90YWwgcmVjZWl2ZWQgZGF0YSBzaXplICovXHJcbiAgICAgICAgdGhpcy5Ub3RhbFJlY3ZTaXplX3U2NCA9IDA7XHJcbiAgICAgICAgLyoqIFRvdGFsIHRyYW5zbWl0dGVkIGRhdGEgc2l6ZSAobm8gY29tcHJlc3Npb24pICovXHJcbiAgICAgICAgdGhpcy5Ub3RhbFNlbmRTaXplUmVhbF91NjQgPSAwO1xyXG4gICAgICAgIC8qKiBUb3RhbCByZWNlaXZlZCBkYXRhIHNpemUgKG5vIGNvbXByZXNzaW9uKSAqL1xyXG4gICAgICAgIHRoaXMuVG90YWxSZWN2U2l6ZVJlYWxfdTY0ID0gMDtcclxuICAgICAgICAvKiogSXMgQnJpZGdlIE1vZGUgKi9cclxuICAgICAgICB0aGlzLklzQnJpZGdlTW9kZV9ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIElzIE1vbml0b3IgbW9kZSAqL1xyXG4gICAgICAgIHRoaXMuSXNNb25pdG9yTW9kZV9ib29sID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFZMQU4gSUQgKi9cclxuICAgICAgICB0aGlzLlZMYW5JZF91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBDbGllbnQgcHJvZHVjdCBuYW1lICovXHJcbiAgICAgICAgdGhpcy5DbGllbnRQcm9kdWN0TmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBDbGllbnQgdmVyc2lvbiAqL1xyXG4gICAgICAgIHRoaXMuQ2xpZW50UHJvZHVjdFZlcl91MzIgPSAwO1xyXG4gICAgICAgIC8qKiBDbGllbnQgYnVpbGQgbnVtYmVyICovXHJcbiAgICAgICAgdGhpcy5DbGllbnRQcm9kdWN0QnVpbGRfdTMyID0gMDtcclxuICAgICAgICAvKiogQ2xpZW50IE9TIG5hbWUgKi9cclxuICAgICAgICB0aGlzLkNsaWVudE9zTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBDbGllbnQgT1MgdmVyc2lvbiAqL1xyXG4gICAgICAgIHRoaXMuQ2xpZW50T3NWZXJfc3RyID0gXCJcIjtcclxuICAgICAgICAvKiogQ2xpZW50IE9TIFByb2R1Y3QgSUQgKi9cclxuICAgICAgICB0aGlzLkNsaWVudE9zUHJvZHVjdElkX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIENsaWVudCBob3N0IG5hbWUgKi9cclxuICAgICAgICB0aGlzLkNsaWVudEhvc3RuYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIFVuaXF1ZSBJRCAqL1xyXG4gICAgICAgIHRoaXMuVW5pcXVlSWRfYmluID0gbmV3IFVpbnQ4QXJyYXkoW10pO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuUnBjU2Vzc2lvblN0YXR1cztcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNTZXNzaW9uU3RhdHVzID0gVnBuUnBjU2Vzc2lvblN0YXR1cztcclxuLyoqIFNldCB0aGUgc3BlY2lhbCBsaXN0ZW5lciAqL1xyXG52YXIgVnBuUnBjU3BlY2lhbExpc3RlbmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwblJwY1NwZWNpYWxMaXN0ZW5lcicgY2xhc3M6IFNldCB0aGUgc3BlY2lhbCBsaXN0ZW5lciAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjU3BlY2lhbExpc3RlbmVyKGluaXQpIHtcclxuICAgICAgICAvKiogVGhlIGZsYWcgdG8gYWN0aXZhdGUgdGhlIFZQTiBvdmVyIElDTVAgc2VydmVyIGZ1bmN0aW9uICovXHJcbiAgICAgICAgdGhpcy5WcG5PdmVySWNtcExpc3RlbmVyX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogVGhlIGZsYWcgdG8gYWN0aXZhdGUgdGhlIFZQTiBvdmVyIEROUyBmdW5jdGlvbiAqL1xyXG4gICAgICAgIHRoaXMuVnBuT3ZlckRuc0xpc3RlbmVyX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY1NwZWNpYWxMaXN0ZW5lcjtcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNTcGVjaWFsTGlzdGVuZXIgPSBWcG5ScGNTcGVjaWFsTGlzdGVuZXI7XHJcbi8qKiBTeXNsb2cgY29uZmlndXJhdGlvbiAqL1xyXG52YXIgVnBuU3lzbG9nU2F2ZVR5cGU7XHJcbihmdW5jdGlvbiAoVnBuU3lzbG9nU2F2ZVR5cGUpIHtcclxuICAgIC8qKiBEbyBub3QgdXNlIHN5c2xvZyAqL1xyXG4gICAgVnBuU3lzbG9nU2F2ZVR5cGVbVnBuU3lzbG9nU2F2ZVR5cGVbXCJOb25lXCJdID0gMF0gPSBcIk5vbmVcIjtcclxuICAgIC8qKiBPbmx5IHNlcnZlciBsb2cgKi9cclxuICAgIFZwblN5c2xvZ1NhdmVUeXBlW1ZwblN5c2xvZ1NhdmVUeXBlW1wiU2VydmVyTG9nXCJdID0gMV0gPSBcIlNlcnZlckxvZ1wiO1xyXG4gICAgLyoqIFNlcnZlciBhbmQgVmlydHVhbCBIVUIgc2VjdXJpdHkgbG9nICovXHJcbiAgICBWcG5TeXNsb2dTYXZlVHlwZVtWcG5TeXNsb2dTYXZlVHlwZVtcIlNlcnZlckFuZEh1YlNlY3VyaXR5TG9nXCJdID0gMl0gPSBcIlNlcnZlckFuZEh1YlNlY3VyaXR5TG9nXCI7XHJcbiAgICAvKiogU2VydmVyLCBWaXJ0dWFsIEhVQiBzZWN1cml0eSwgYW5kIHBhY2tldCBsb2cgKi9cclxuICAgIFZwblN5c2xvZ1NhdmVUeXBlW1ZwblN5c2xvZ1NhdmVUeXBlW1wiU2VydmVyQW5kSHViQWxsTG9nXCJdID0gM10gPSBcIlNlcnZlckFuZEh1YkFsbExvZ1wiO1xyXG59KShWcG5TeXNsb2dTYXZlVHlwZSA9IGV4cG9ydHMuVnBuU3lzbG9nU2F2ZVR5cGUgfHwgKGV4cG9ydHMuVnBuU3lzbG9nU2F2ZVR5cGUgPSB7fSkpO1xyXG4vKiogU3lzbG9nIGNvbmZpZ3VyYXRpb24gKi9cclxudmFyIFZwblN5c2xvZ1NldHRpbmcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSAnVnBuU3lzbG9nU2V0dGluZycgY2xhc3M6IFN5c2xvZyBjb25maWd1cmF0aW9uICovXHJcbiAgICBmdW5jdGlvbiBWcG5TeXNsb2dTZXR0aW5nKGluaXQpIHtcclxuICAgICAgICAvKiogVGhlIGJlaGF2aW9yIG9mIHRoZSBzeXNsb2cgZnVuY3Rpb24gKi9cclxuICAgICAgICB0aGlzLlNhdmVUeXBlX3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIFNwZWNpZnkgdGhlIGhvc3QgbmFtZSBvciBJUCBhZGRyZXNzIG9mIHRoZSBzeXNsb2cgc2VydmVyICovXHJcbiAgICAgICAgdGhpcy5Ib3N0bmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBTcGVjaWZ5IHRoZSBwb3J0IG51bWJlciBvZiB0aGUgc3lzbG9nIHNlcnZlciAqL1xyXG4gICAgICAgIHRoaXMuUG9ydF91MzIgPSAwO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVnBuU3lzbG9nU2V0dGluZztcclxufSgpKTtcclxuZXhwb3J0cy5WcG5TeXNsb2dTZXR0aW5nID0gVnBuU3lzbG9nU2V0dGluZztcclxuLyoqIFZQTiBHYXRlIFNlcnZlciBDb25maWcgKi9cclxudmFyIFZwblZnc0NvbmZpZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5WZ3NDb25maWcnIGNsYXNzOiBWUE4gR2F0ZSBTZXJ2ZXIgQ29uZmlnICovXHJcbiAgICBmdW5jdGlvbiBWcG5WZ3NDb25maWcoaW5pdCkge1xyXG4gICAgICAgIC8qKiBBY3RpdmUgZmxhZyAqL1xyXG4gICAgICAgIHRoaXMuSXNFbmFibGVkX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogTWVzc2FnZSAqL1xyXG4gICAgICAgIHRoaXMuTWVzc2FnZV91dGYgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBPd25lciBuYW1lICovXHJcbiAgICAgICAgdGhpcy5Pd25lcl91dGYgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBBYnVzZSBlbWFpbCAqL1xyXG4gICAgICAgIHRoaXMuQWJ1c2VfdXRmID0gXCJcIjtcclxuICAgICAgICAvKiogTG9nIHNhdmUgZmxhZyAqL1xyXG4gICAgICAgIHRoaXMuTm9Mb2dfYm9vbCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBTYXZlIGxvZyBwZXJtYW5lbnRseSAqL1xyXG4gICAgICAgIHRoaXMuTG9nUGVybWFuZW50X2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICAvKiogRW5hYmxlIHRoZSBMMlRQIFZQTiBmdW5jdGlvbiAqL1xyXG4gICAgICAgIHRoaXMuRW5hYmxlTDJUUF9ib29sID0gZmFsc2U7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5WZ3NDb25maWc7XHJcbn0oKSk7XHJcbmV4cG9ydHMuVnBuVmdzQ29uZmlnID0gVnBuVmdzQ29uZmlnO1xyXG4vKiogUmVhZCBhIExvZyBmaWxlICovXHJcbnZhciBWcG5ScGNSZWFkTG9nRmlsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNSZWFkTG9nRmlsZScgY2xhc3M6IFJlYWQgYSBMb2cgZmlsZSAqL1xyXG4gICAgZnVuY3Rpb24gVnBuUnBjUmVhZExvZ0ZpbGUoaW5pdCkge1xyXG4gICAgICAgIC8qKiBTZXJ2ZXIgbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuU2VydmVyTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBGaWxlIFBhdGggKi9cclxuICAgICAgICB0aGlzLkZpbGVQYXRoX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIE9mZnNldCB0byBkb3dubG9hZC4gWW91IGhhdmUgdG8gY2FsbCB0aGUgUmVhZExvZ0ZpbGUgQVBJIG11bHRpcGxlIHRpbWVzIHRvIGRvd25sb2FkIHRoZSBlbnRpcmUgbG9nIGZpbGUgd2l0aCByZXF1ZXN0aW5nIGEgcGFydCBvZiB0aGUgZmlsZSBieSBzcGVjaWZ5aW5nIHRoZSBPZmZzZXRfdTMyIGZpZWxkLiAqL1xyXG4gICAgICAgIHRoaXMuT2Zmc2V0X3UzMiA9IDA7XHJcbiAgICAgICAgLyoqIFJlY2VpdmVkIGJ1ZmZlciAqL1xyXG4gICAgICAgIHRoaXMuQnVmZmVyX2JpbiA9IG5ldyBVaW50OEFycmF5KFtdKTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY1JlYWRMb2dGaWxlO1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY1JlYWRMb2dGaWxlID0gVnBuUnBjUmVhZExvZ0ZpbGU7XHJcbi8qKiBSZW5hbWUgbGluayAqL1xyXG52YXIgVnBuUnBjUmVuYW1lTGluayA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlICdWcG5ScGNSZW5hbWVMaW5rJyBjbGFzczogUmVuYW1lIGxpbmsgKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY1JlbmFtZUxpbmsoaW5pdCkge1xyXG4gICAgICAgIC8qKiBUaGUgVmlydHVhbCBIdWIgbmFtZSAqL1xyXG4gICAgICAgIHRoaXMuSHViTmFtZV9zdHIgPSBcIlwiO1xyXG4gICAgICAgIC8qKiBUaGUgb2xkIG5hbWUgb2YgdGhlIGNhc2NhZGUgY29ubmVjdGlvbiAqL1xyXG4gICAgICAgIHRoaXMuT2xkQWNjb3VudE5hbWVfdXRmID0gXCJcIjtcclxuICAgICAgICAvKiogVGhlIG5ldyBuYW1lIG9mIHRoZSBjYXNjYWRlIGNvbm5lY3Rpb24gKi9cclxuICAgICAgICB0aGlzLk5ld0FjY291bnROYW1lX3V0ZiA9IFwiXCI7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNSZW5hbWVMaW5rO1xyXG59KCkpO1xyXG5leHBvcnRzLlZwblJwY1JlbmFtZUxpbmsgPSBWcG5ScGNSZW5hbWVMaW5rO1xyXG4vKiogT25saW5lIG9yIG9mZmxpbmUgdGhlIEhVQiAqL1xyXG52YXIgVnBuUnBjU2V0SHViT25saW5lID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwblJwY1NldEh1Yk9ubGluZScgY2xhc3M6IE9ubGluZSBvciBvZmZsaW5lIHRoZSBIVUIgKi9cclxuICAgIGZ1bmN0aW9uIFZwblJwY1NldEh1Yk9ubGluZShpbml0KSB7XHJcbiAgICAgICAgLyoqIFRoZSBWaXJ0dWFsIEh1YiBuYW1lICovXHJcbiAgICAgICAgdGhpcy5IdWJOYW1lX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgLyoqIE9ubGluZSAvIG9mZmxpbmUgZmxhZyAqL1xyXG4gICAgICAgIHRoaXMuT25saW5lX2Jvb2wgPSBmYWxzZTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGluaXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFZwblJwY1NldEh1Yk9ubGluZTtcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNTZXRIdWJPbmxpbmUgPSBWcG5ScGNTZXRIdWJPbmxpbmU7XHJcbi8qKiBTZXQgUGFzc3dvcmQgKi9cclxudmFyIFZwblJwY1NldFBhc3N3b3JkID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgJ1ZwblJwY1NldFBhc3N3b3JkJyBjbGFzczogU2V0IFBhc3N3b3JkICovXHJcbiAgICBmdW5jdGlvbiBWcG5ScGNTZXRQYXNzd29yZChpbml0KSB7XHJcbiAgICAgICAgLyoqIFRoZSBwbGFpbnRleHQgcGFzc3dvcmQgKi9cclxuICAgICAgICB0aGlzLlBsYWluVGV4dFBhc3N3b3JkX3N0ciA9IFwiXCI7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBpbml0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBWcG5ScGNTZXRQYXNzd29yZDtcclxufSgpKTtcclxuZXhwb3J0cy5WcG5ScGNTZXRQYXNzd29yZCA9IFZwblJwY1NldFBhc3N3b3JkO1xyXG4vLyAtLS0gVXRpbGl0eSBjb2RlcyAtLS1cclxuLyoqIEpTT04tUlBDIHJlcXVlc3QgY2xhc3MuIFNlZSBodHRwczovL3d3dy5qc29ucnBjLm9yZy9zcGVjaWZpY2F0aW9uICovXHJcbnZhciBKc29uUnBjUmVxdWVzdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIEpzb25ScGNSZXF1ZXN0KG1ldGhvZCwgcGFyYW0sIGlkKSB7XHJcbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gdm9pZCAwKSB7IG1ldGhvZCA9IFwiXCI7IH1cclxuICAgICAgICBpZiAocGFyYW0gPT09IHZvaWQgMCkgeyBwYXJhbSA9IG51bGw7IH1cclxuICAgICAgICBpZiAoaWQgPT09IHZvaWQgMCkgeyBpZCA9IFwiXCI7IH1cclxuICAgICAgICB0aGlzLmpzb25ycGMgPSBcIjIuMFwiO1xyXG4gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xyXG4gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW07XHJcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIEpzb25ScGNSZXF1ZXN0O1xyXG59KCkpO1xyXG5leHBvcnRzLkpzb25ScGNSZXF1ZXN0ID0gSnNvblJwY1JlcXVlc3Q7XHJcbi8qKiBKU09OLVJQQyBlcnJvciBjbGFzcy4gU2VlIGh0dHBzOi8vd3d3Lmpzb25ycGMub3JnL3NwZWNpZmljYXRpb24gKi9cclxudmFyIEpzb25ScGNFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIEpzb25ScGNFcnJvcihjb2RlLCBtZXNzYWdlLCBkYXRhKSB7XHJcbiAgICAgICAgaWYgKGNvZGUgPT09IHZvaWQgMCkgeyBjb2RlID0gMDsgfVxyXG4gICAgICAgIGlmIChtZXNzYWdlID09PSB2b2lkIDApIHsgbWVzc2FnZSA9IFwiXCI7IH1cclxuICAgICAgICBpZiAoZGF0YSA9PT0gdm9pZCAwKSB7IGRhdGEgPSBudWxsOyB9XHJcbiAgICAgICAgdGhpcy5jb2RlID0gY29kZTtcclxuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gSnNvblJwY0Vycm9yO1xyXG59KCkpO1xyXG5leHBvcnRzLkpzb25ScGNFcnJvciA9IEpzb25ScGNFcnJvcjtcclxuLyoqIEpTT04tUlBDIHJlc3BvbnNlIGNsYXNzIHdpdGggZ2VuZXJpY3MgKi9cclxudmFyIEpzb25ScGNSZXNwb25zZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIEpzb25ScGNSZXNwb25zZSgpIHtcclxuICAgICAgICB0aGlzLmpzb25ycGMgPSBcIjIuMFwiO1xyXG4gICAgICAgIHRoaXMucmVzdWx0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLmVycm9yID0gbnVsbDtcclxuICAgICAgICB0aGlzLmlkID0gXCJcIjtcclxuICAgIH1cclxuICAgIHJldHVybiBKc29uUnBjUmVzcG9uc2U7XHJcbn0oKSk7XHJcbmV4cG9ydHMuSnNvblJwY1Jlc3BvbnNlID0gSnNvblJwY1Jlc3BvbnNlO1xyXG4vKiogSlNPTi1SUEMgY2xpZW50IGNsYXNzLiBTZWUgaHR0cHM6Ly93d3cuanNvbnJwYy5vcmcvc3BlY2lmaWNhdGlvbiAqL1xyXG52YXIgSnNvblJwY0NsaWVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKlxyXG4gICAgICogSlNPTi1SUEMgY2xpZW50IGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgKiBAcGFyYW0gdXJsIFRoZSBVUkxcclxuICAgICAqIEBwYXJhbSBoZWFkZXJzIEFkZGl0aW9uYWwgSFRUUCBoZWFkZXJzXHJcbiAgICAgKiBAcGFyYW0gc2VuZF9jcmVkZW50aWFsIFNldCB0cnVlIHRvIHVzZSB0aGUgc2FtZSBjcmVkZW50aWFsIHdpdGggdGhlIGJyb3dzaW5nIHdlYiBzaXRlLiBWYWxpZCBvbmx5IGlmIHRoZSBjb2RlIGlzIHJ1bm5pbmcgb24gdGhlIHdlYiBicm93c2VyLlxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBKc29uUnBjQ2xpZW50KHVybCwgaGVhZGVycywgc2VuZF9jcmVkZW50aWFsLCBub2RlanNfaHR0cHNfY2xpZW50X3JlamVjdF91bnRydXN0ZWRfc2VydmVyX2NlcnQpIHtcclxuICAgICAgICB0aGlzLkJhc2VVcmwgPSB1cmw7XHJcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVycztcclxuICAgICAgICB0aGlzLmNsaWVudCA9IG5ldyBIdHRwQ2xpZW50KCk7XHJcbiAgICAgICAgdGhpcy5jbGllbnQuU2VuZENyZWRlbnRpYWwgPSBzZW5kX2NyZWRlbnRpYWw7XHJcbiAgICAgICAgdGhpcy5jbGllbnQuTm9kZUpTX0hUVFBTX0NsaWVudF9SZWplY3RfVW5hdXRob3JpemVkID0gbm9kZWpzX2h0dHBzX2NsaWVudF9yZWplY3RfdW50cnVzdGVkX3NlcnZlcl9jZXJ0O1xyXG4gICAgfVxyXG4gICAgLyoqIEEgdXRpbGl0eSBmdW5jdGlvbiB0byBjb252ZXJ0IGFueSBvYmplY3QgdG8gSlNPTiBzdHJpbmcgKi9cclxuICAgIEpzb25ScGNDbGllbnQuT2JqZWN0VG9Kc29uID0gZnVuY3Rpb24gKG9iaikge1xyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGlmIChrZXkuZW5kc1dpdGgoXCJfYmluXCIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gVXRpbF9CYXNlNjRfRW5jb2RlKHZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgfSwgNCk7XHJcbiAgICB9O1xyXG4gICAgLyoqIEEgdXRpbGl0eSBmdW5jdGlvbiB0byBjb252ZXJ0IEpTT04gc3RyaW5nIHRvIG9iamVjdCAqL1xyXG4gICAgSnNvblJwY0NsaWVudC5Kc29uVG9PYmplY3QgPSBmdW5jdGlvbiAoc3RyKSB7XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgICAgICBpZiAoa2V5LmVuZHNXaXRoKFwiX2JpblwiKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFV0aWxfQmFzZTY0X0RlY29kZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoa2V5LmVuZHNXaXRoKFwiX2R0XCIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIENhbGwgYSBzaW5nbGUgUlBDIGNhbGwgKHdpdGhvdXQgZXJyb3IgY2hlY2spLiBZb3UgY2FuIHdhaXQgZm9yIHRoZSByZXNwb25zZSB3aXRoIFByb21pc2U8c3RyaW5nPiBvciBhd2FpdCBzdGF0ZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0gbWV0aG9kX25hbWUgVGhlIG5hbWUgb2YgUlBDIG1ldGhvZFxyXG4gICAgICogQHBhcmFtIHBhcmFtIFRoZSBwYXJhbWV0ZXJzXHJcbiAgICAgKi9cclxuICAgIEpzb25ScGNDbGllbnQucHJvdG90eXBlLkNhbGxJbnRlcm5hbEFzeW5jID0gZnVuY3Rpb24gKG1ldGhvZF9uYW1lLCBwYXJhbSkge1xyXG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGlkLCByZXEsIHJlcV9zdHJpbmcsIGh0dHBfcmVzcG9uc2UsIHJldF9zdHJpbmc7XHJcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gXCIxXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcSA9IG5ldyBKc29uUnBjUmVxdWVzdChtZXRob2RfbmFtZSwgcGFyYW0sIGlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxX3N0cmluZyA9IEpzb25ScGNDbGllbnQuT2JqZWN0VG9Kc29uKHJlcSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z19tb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIi0tLSBSUEMgUmVxdWVzdCBCb2R5IC0tLVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcV9zdHJpbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jbGllbnQuUG9zdEFzeW5jKHRoaXMuQmFzZVVybCwgdGhpcy5oZWFkZXJzLCByZXFfc3RyaW5nLCBcImFwcGxpY2F0aW9uL2pzb25cIildO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaHR0cF9yZXNwb25zZSA9IF9hLnNlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0X3N0cmluZyA9IGh0dHBfcmVzcG9uc2UuQm9keTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnX21vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiLS0tIFJQQyBSZXNwb25zZSBCb2R5IC0tLVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJldF9zdHJpbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCByZXRfc3RyaW5nXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsIGEgc2luZ2xlIFJQQyBjYWxsICh3aXRoIGVycm9yIGNoZWNrKS4gWW91IGNhbiB3YWl0IGZvciB0aGUgcmVzcG9uc2Ugd2l0aCBQcm9taXNlPFRSZXN1bHQ+IG9yIGF3YWl0IHN0YXRlbWVudC4gSW4gdGhlIGNhc2Ugb2YgZXJyb3IsIGl0IHdpbGwgYmUgdGhyb3duLlxyXG4gICAgICogQHBhcmFtIG1ldGhvZF9uYW1lIFRoZSBuYW1lIG9mIFJQQyBtZXRob2RcclxuICAgICAqIEBwYXJhbSBwYXJhbSBUaGUgcGFyYW1ldGVyc1xyXG4gICAgICovXHJcbiAgICBKc29uUnBjQ2xpZW50LnByb3RvdHlwZS5DYWxsQXN5bmMgPSBmdW5jdGlvbiAobWV0aG9kX25hbWUsIHBhcmFtKSB7XHJcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgcmV0X3N0cmluZywgcmV0O1xyXG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLkNhbGxJbnRlcm5hbEFzeW5jKG1ldGhvZF9uYW1lLCBwYXJhbSldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0X3N0cmluZyA9IF9hLnNlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gSlNPTi5wYXJzZShyZXRfc3RyaW5nKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzX251bGwocmV0LmVycm9yKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKc29uUnBjRXhjZXB0aW9uKHJldC5lcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJldC5yZXN1bHRdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gSnNvblJwY0NsaWVudDtcclxufSgpKTtcclxuZXhwb3J0cy5Kc29uUnBjQ2xpZW50ID0gSnNvblJwY0NsaWVudDtcclxuLyoqIEpTT04tUlBDIGV4Y2VwdGlvbiBjbGFzcyAqL1xyXG52YXIgSnNvblJwY0V4Y2VwdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcclxuICAgIF9fZXh0ZW5kcyhKc29uUnBjRXhjZXB0aW9uLCBfc3VwZXIpO1xyXG4gICAgZnVuY3Rpb24gSnNvblJwY0V4Y2VwdGlvbihlcnJvcikge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIFwiQ29kZT1cIiArIGVycm9yLmNvZGUgKyBcIiwgTWVzc2FnZT1cIiArIGVycm9yLm1lc3NhZ2UpIHx8IHRoaXM7XHJcbiAgICAgICAgX3RoaXMuRXJyb3IgPSBlcnJvcjtcclxuICAgICAgICByZXR1cm4gX3RoaXM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gSnNvblJwY0V4Y2VwdGlvbjtcclxufShFcnJvcikpO1xyXG5leHBvcnRzLkpzb25ScGNFeGNlcHRpb24gPSBKc29uUnBjRXhjZXB0aW9uO1xyXG4vKiogSFRUUCBjbGllbnQgZXhjZXB0aW9uIGNsYXNzICovXHJcbnZhciBIdHRwQ2xpZW50RXhjZXB0aW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xyXG4gICAgX19leHRlbmRzKEh0dHBDbGllbnRFeGNlcHRpb24sIF9zdXBlcik7XHJcbiAgICBmdW5jdGlvbiBIdHRwQ2xpZW50RXhjZXB0aW9uKG1lc3NhZ2UpIHtcclxuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgbWVzc2FnZSkgfHwgdGhpcztcclxuICAgIH1cclxuICAgIHJldHVybiBIdHRwQ2xpZW50RXhjZXB0aW9uO1xyXG59KEVycm9yKSk7XHJcbmV4cG9ydHMuSHR0cENsaWVudEV4Y2VwdGlvbiA9IEh0dHBDbGllbnRFeGNlcHRpb247XHJcbi8qKiBIVFRQIGNsaWVudCByZXNwb25zZSBjbGFzcyAqL1xyXG52YXIgSHR0cENsaWVudFJlc3BvbnNlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gSHR0cENsaWVudFJlc3BvbnNlKCkge1xyXG4gICAgICAgIHRoaXMuQm9keSA9IFwiXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gSHR0cENsaWVudFJlc3BvbnNlO1xyXG59KCkpO1xyXG5leHBvcnRzLkh0dHBDbGllbnRSZXNwb25zZSA9IEh0dHBDbGllbnRSZXNwb25zZTtcclxuLyoqIEFuIEhUVFAgY2xpZW50IHdoaWNoIGNhbiBiZSB1c2VkIGluIGJvdGggd2ViIGJyb3dzZXJzIGFuZCBOb2RlLmpzICovXHJcbnZhciBIdHRwQ2xpZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gSHR0cENsaWVudCgpIHtcclxuICAgICAgICB0aGlzLlRpbWVvdXRNc2VjcyA9IDYwICogNSAqIDEwMDA7XHJcbiAgICAgICAgdGhpcy5TZW5kQ3JlZGVudGlhbCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5Ob2RlSlNfSFRUUFNfQ2xpZW50X1JlamVjdF9VbmF1dGhvcml6ZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIC8qKiBQb3N0IG1ldGhvZC4gSW4gd2ViIGJyb3dzZXJzIHRoaXMgZnVuY3Rpb24gd2lsbCBwcm9jZXNzIHRoZSByZXF1ZXN0IGJ5IGl0c2VsZi4gSW4gTm9kZS5qcyB0aGlzIGZ1bmN0aW9uIHdpbGwgY2FsbCBQb3N0QXN5bmNfTm9kZUpTKCkgaW5zdGVhZC4gKi9cclxuICAgIEh0dHBDbGllbnQucHJvdG90eXBlLlBvc3RBc3luYyA9IGZ1bmN0aW9uICh1cmwsIGhlYWRlcnMsIHJlcV9ib2R5LCByZXFfbWVkaWFfdHlwZSkge1xyXG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGZldGNoX2hlYWRlcl9saXN0LCBfaSwgX2EsIG5hbWVfMSwgZmV0Y2hfaW5pdCwgZmV0Y2hfcmVzcG9uc2UsIHJldCwgX2I7XHJcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2MpIHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2MubGFiZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc19ub2RlX2pzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5Qb3N0QXN5bmNfTm9kZUpTKHVybCwgaGVhZGVycywgcmVxX2JvZHksIHJlcV9tZWRpYV90eXBlKV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hfaGVhZGVyX2xpc3QgPSBuZXcgSGVhZGVycygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKF9pID0gMCwgX2EgPSBPYmplY3Qua2V5cyhoZWFkZXJzKTsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfMSA9IF9hW19pXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoX2hlYWRlcl9saXN0LmFwcGVuZChuYW1lXzEsIGhlYWRlcnNbbmFtZV8xXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hfaW5pdCA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU6IFwiY29yc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogZmV0Y2hfaGVhZGVyX2xpc3QsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFsczogKHRoaXMuU2VuZENyZWRlbnRpYWwgPyBcImluY2x1ZGVcIiA6IFwib21pdFwiKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZTogXCJuby1jYWNoZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcGFsaXZlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3Q6IFwiZm9sbG93XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5OiByZXFfYm9keVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBmZXRjaCh1cmwsIGZldGNoX2luaXQpXTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoX3Jlc3BvbnNlID0gX2Muc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmV0Y2hfcmVzcG9uc2Uub2sgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSHR0cENsaWVudEV4Y2VwdGlvbihcIkhUVFAgRXJyb3I6IFwiICsgZmV0Y2hfcmVzcG9uc2Uuc3RhdHVzICsgXCIgXCIgKyBmZXRjaF9yZXNwb25zZS5zdGF0dXNUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBuZXcgSHR0cENsaWVudFJlc3BvbnNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gcmV0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBmZXRjaF9yZXNwb25zZS50ZXh0KCldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgX2IuQm9keSA9IF9jLnNlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJldF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIC8qKiBQb3N0IG1ldGhvZCBmb3IgTm9kZS5qcy4gKi9cclxuICAgIEh0dHBDbGllbnQucHJvdG90eXBlLlBvc3RBc3luY19Ob2RlSlMgPSBmdW5jdGlvbiAodXJsLCBoZWFkZXJzLCByZXFfYm9keSwgcmVxX21lZGlhX3R5cGUpIHtcclxuICAgICAgICB2YXIgaHR0cHMgPSByZXF1aXJlKFwiaHR0cHNcIik7XHJcbiAgICAgICAgdmFyIGtlZXBBbGl2ZUFnZW50ID0gbmV3IGh0dHBzLkFnZW50KHsga2VlcEFsaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgIHZhciB1cmxwYXJzZSA9IHJlcXVpcmUoXCJ1cmxcIik7XHJcbiAgICAgICAgdmFyIHVybG9iaiA9IHVybHBhcnNlLnBhcnNlKHVybCk7XHJcbiAgICAgICAgaWYgKGlzX251bGwodXJsb2JqLmhvc3QpKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVUkwgaXMgaW52YWxpZC5cIik7XHJcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIGhvc3Q6IHVybG9iai5ob3N0bmFtZSxcclxuICAgICAgICAgICAgcG9ydDogdXJsb2JqLnBvcnQsXHJcbiAgICAgICAgICAgIHBhdGg6IHVybG9iai5wYXRoLFxyXG4gICAgICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IHRoaXMuTm9kZUpTX0hUVFBTX0NsaWVudF9SZWplY3RfVW5hdXRob3JpemVkLFxyXG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgICAgICAgICB0aW1lb3V0OiB0aGlzLlRpbWVvdXRNc2VjcyxcclxuICAgICAgICAgICAgYWdlbnQ6IGtlZXBBbGl2ZUFnZW50XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgICAgICB2YXIgcmVxID0gaHR0cHMucmVxdWVzdChvcHRpb25zLCBmdW5jdGlvbiAocmVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzLnN0YXR1c0NvZGUgIT09IDIwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgSHR0cENsaWVudEV4Y2VwdGlvbihcIkhUVFAgRXJyb3I6IFwiICsgcmVzLnN0YXR1c0NvZGUgKyBcIiBcIiArIHJlcy5zdGF0dXNNZXNzYWdlKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVjdl9zdHIgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgcmVzLm9uKFwiZGF0YVwiLCBmdW5jdGlvbiAoYm9keSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlY3Zfc3RyICs9IGJvZHk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJlcy5vbihcImVuZFwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IG5ldyBIdHRwQ2xpZW50UmVzcG9uc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICByZXQuQm9keSA9IHJlY3Zfc3RyO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmV0KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KS5vbihcImVycm9yXCIsIGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBPYmplY3Qua2V5cyhoZWFkZXJzKTsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBuYW1lXzIgPSBfYVtfaV07XHJcbiAgICAgICAgICAgICAgICByZXEuc2V0SGVhZGVyKG5hbWVfMiwgIWlzX251bGwoaGVhZGVyc1tuYW1lXzJdKSA/IGhlYWRlcnNbbmFtZV8yXSA6IFwiXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlcS5zZXRIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgcmVxX21lZGlhX3R5cGUpO1xyXG4gICAgICAgICAgICByZXEuc2V0SGVhZGVyKFwiQ29udGVudC1MZW5ndGhcIiwgQnVmZmVyLmJ5dGVMZW5ndGgocmVxX2JvZHkpKTtcclxuICAgICAgICAgICAgcmVxLndyaXRlKHJlcV9ib2R5KTtcclxuICAgICAgICAgICAgcmVxLmVuZCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBIdHRwQ2xpZW50O1xyXG59KCkpO1xyXG5leHBvcnRzLkh0dHBDbGllbnQgPSBIdHRwQ2xpZW50O1xyXG4vLy8vLy8vLyBCRUdJTjogQmFzZTY0IGVuY29kZSAvIGRlY29kZSB1dGlsaXR5IGZ1bmN0aW9ucyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9iZWF0Z2FtbWl0L2Jhc2U2NC1qc1xyXG4vLyBUaGUgTUlUIExpY2Vuc2UoTUlUKVxyXG4vLyBDb3B5cmlnaHQoYykgMjAxNFxyXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XHJcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxyXG4vLyAgICAgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xyXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZCAvIG9yIHNlbGxcclxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXHJcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XHJcbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXHJcbi8vICAgICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cclxuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxyXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcclxuLy8gICAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuSU4gTk8gRVZFTlQgU0hBTEwgVEhFXHJcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcclxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcclxuLy8gICAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cclxuLy8gVEhFIFNPRlRXQVJFLlxyXG52YXIgbG9va3VwID0gW107XHJcbnZhciByZXZMb29rdXAgPSBbXTtcclxudmFyIGNvZGUgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky9cIjtcclxuZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNvZGUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcclxuICAgIGxvb2t1cFtpXSA9IGNvZGVbaV07XHJcbiAgICByZXZMb29rdXBbY29kZS5jaGFyQ29kZUF0KGkpXSA9IGk7XHJcbn1cclxuLy8gU3VwcG9ydCBkZWNvZGluZyBVUkwtc2FmZSBiYXNlNjQgc3RyaW5ncywgYXMgTm9kZS5qcyBkb2VzLlxyXG4vLyBTZWU6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Jhc2U2NCNVUkxfYXBwbGljYXRpb25zXHJcbnJldkxvb2t1cFtcIi1cIi5jaGFyQ29kZUF0KDApXSA9IDYyO1xyXG5yZXZMb29rdXBbXCJfXCIuY2hhckNvZGVBdCgwKV0gPSA2MztcclxuZnVuY3Rpb24gZ2V0TGVucyhiNjQpIHtcclxuICAgIHZhciBsZW4gPSBiNjQubGVuZ3RoO1xyXG4gICAgaWYgKGxlbiAlIDQgPiAwKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNFwiKTtcclxuICAgIH1cclxuICAgIC8vIFRyaW0gb2ZmIGV4dHJhIGJ5dGVzIGFmdGVyIHBsYWNlaG9sZGVyIGJ5dGVzIGFyZSBmb3VuZFxyXG4gICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYmVhdGdhbW1pdC9iYXNlNjQtanMvaXNzdWVzLzQyXHJcbiAgICB2YXIgdmFsaWRMZW4gPSBiNjQuaW5kZXhPZihcIj1cIik7XHJcbiAgICBpZiAodmFsaWRMZW4gPT09IC0xKVxyXG4gICAgICAgIHZhbGlkTGVuID0gbGVuO1xyXG4gICAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IHZhbGlkTGVuID09PSBsZW5cclxuICAgICAgICA/IDBcclxuICAgICAgICA6IDQgLSAodmFsaWRMZW4gJSA0KTtcclxuICAgIHJldHVybiBbdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbl07XHJcbn1cclxuLy8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhXHJcbmZ1bmN0aW9uIGJ5dGVMZW5ndGgoYjY0KSB7XHJcbiAgICB2YXIgbGVucyA9IGdldExlbnMoYjY0KTtcclxuICAgIHZhciB2YWxpZExlbiA9IGxlbnNbMF07XHJcbiAgICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXTtcclxuICAgIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlbjtcclxufVxyXG5mdW5jdGlvbiBfYnl0ZUxlbmd0aChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pIHtcclxuICAgIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlbjtcclxufVxyXG5mdW5jdGlvbiBVdGlsX0Jhc2U2NF9EZWNvZGUoYjY0KSB7XHJcbiAgICB2YXIgdG1wO1xyXG4gICAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NCk7XHJcbiAgICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdO1xyXG4gICAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV07XHJcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoX2J5dGVMZW5ndGgoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSk7XHJcbiAgICB2YXIgY3VyQnl0ZSA9IDA7XHJcbiAgICAvLyBpZiB0aGVyZSBhcmUgcGxhY2Vob2xkZXJzLCBvbmx5IGdldCB1cCB0byB0aGUgbGFzdCBjb21wbGV0ZSA0IGNoYXJzXHJcbiAgICB2YXIgbGVuID0gcGxhY2VIb2xkZXJzTGVuID4gMFxyXG4gICAgICAgID8gdmFsaWRMZW4gLSA0XHJcbiAgICAgICAgOiB2YWxpZExlbjtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcclxuICAgICAgICB0bXAgPVxyXG4gICAgICAgICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxOCkgfFxyXG4gICAgICAgICAgICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyKSB8XHJcbiAgICAgICAgICAgICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfFxyXG4gICAgICAgICAgICAgICAgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV07XHJcbiAgICAgICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDE2KSAmIDB4RkY7XHJcbiAgICAgICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRjtcclxuICAgICAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkY7XHJcbiAgICB9XHJcbiAgICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAyKSB7XHJcbiAgICAgICAgdG1wID1cclxuICAgICAgICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfFxyXG4gICAgICAgICAgICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpO1xyXG4gICAgICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRjtcclxuICAgIH1cclxuICAgIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDEpIHtcclxuICAgICAgICB0bXAgPVxyXG4gICAgICAgICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCkgfFxyXG4gICAgICAgICAgICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHxcclxuICAgICAgICAgICAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA+PiAyKTtcclxuICAgICAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gOCkgJiAweEZGO1xyXG4gICAgICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRjtcclxuICAgIH1cclxuICAgIHJldHVybiBhcnI7XHJcbn1cclxuZXhwb3J0cy5VdGlsX0Jhc2U2NF9EZWNvZGUgPSBVdGlsX0Jhc2U2NF9EZWNvZGU7XHJcbmZ1bmN0aW9uIHRyaXBsZXRUb0Jhc2U2NChudW0pIHtcclxuICAgIHJldHVybiBsb29rdXBbbnVtID4+IDE4ICYgMHgzRl0gK1xyXG4gICAgICAgIGxvb2t1cFtudW0gPj4gMTIgJiAweDNGXSArXHJcbiAgICAgICAgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gK1xyXG4gICAgICAgIGxvb2t1cFtudW0gJiAweDNGXTtcclxufVxyXG5mdW5jdGlvbiBlbmNvZGVDaHVuayh1aW50OCwgc3RhcnQsIGVuZCkge1xyXG4gICAgdmFyIHRtcDtcclxuICAgIHZhciBvdXRwdXQgPSBbXTtcclxuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XHJcbiAgICAgICAgdG1wID1cclxuICAgICAgICAgICAgKCh1aW50OFtpXSA8PCAxNikgJiAweEZGMDAwMCkgK1xyXG4gICAgICAgICAgICAgICAgKCh1aW50OFtpICsgMV0gPDwgOCkgJiAweEZGMDApICtcclxuICAgICAgICAgICAgICAgICh1aW50OFtpICsgMl0gJiAweEZGKTtcclxuICAgICAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb3V0cHV0LmpvaW4oXCJcIik7XHJcbn1cclxuZnVuY3Rpb24gVXRpbF9CYXNlNjRfRW5jb2RlKHVpbnQ4KSB7XHJcbiAgICB2YXIgdG1wO1xyXG4gICAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aDtcclxuICAgIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMzsgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcclxuICAgIHZhciBwYXJ0cyA9IFtdO1xyXG4gICAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODM7IC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xyXG4gICAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxyXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbjIgPSBsZW4gLSBleHRyYUJ5dGVzOyBpIDwgbGVuMjsgaSArPSBtYXhDaHVua0xlbmd0aCkge1xyXG4gICAgICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsodWludDgsIGksIChpICsgbWF4Q2h1bmtMZW5ndGgpID4gbGVuMiA/IGxlbjIgOiAoaSArIG1heENodW5rTGVuZ3RoKSkpO1xyXG4gICAgfVxyXG4gICAgLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xyXG4gICAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcclxuICAgICAgICB0bXAgPSB1aW50OFtsZW4gLSAxXTtcclxuICAgICAgICBwYXJ0cy5wdXNoKGxvb2t1cFt0bXAgPj4gMl0gK1xyXG4gICAgICAgICAgICBsb29rdXBbKHRtcCA8PCA0KSAmIDB4M0ZdICtcclxuICAgICAgICAgICAgXCI9PVwiKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcclxuICAgICAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyB1aW50OFtsZW4gLSAxXTtcclxuICAgICAgICBwYXJ0cy5wdXNoKGxvb2t1cFt0bXAgPj4gMTBdICtcclxuICAgICAgICAgICAgbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXSArXHJcbiAgICAgICAgICAgIGxvb2t1cFsodG1wIDw8IDIpICYgMHgzRl0gK1xyXG4gICAgICAgICAgICBcIj1cIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFydHMuam9pbihcIlwiKTtcclxufVxyXG5leHBvcnRzLlV0aWxfQmFzZTY0X0VuY29kZSA9IFV0aWxfQmFzZTY0X0VuY29kZTtcclxuLy8vLy8vLy8gRU5EOiBCYXNlNjQgZW5jb2RlIC8gZGVjb2RlIHV0aWxpdHkgZnVuY3Rpb25zIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2JlYXRnYW1taXQvYmFzZTY0LWpzXHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZwbnJwYy5qcy5tYXAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/vpnrpc/dist/vpnrpc.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/webpack/buildin/global.js":
+/*!***********************************!*\
+ !*** (webpack)/buildin/global.js ***!
+ \***********************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvd2VicGFjay9idWlsZGluL2dsb2JhbC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcz9jZDAwIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/webpack/buildin/global.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/webpack/buildin/module.js":
+/*!***********************************!*\
+ !*** (webpack)/buildin/module.js ***!
+ \***********************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvd2VicGFjay9idWlsZGluL21vZHVsZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLyh3ZWJwYWNrKS9idWlsZGluL21vZHVsZS5qcz9jZWQyIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obW9kdWxlKSB7XG5cdGlmICghbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xuXHRcdG1vZHVsZS5kZXByZWNhdGUgPSBmdW5jdGlvbigpIHt9O1xuXHRcdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxuXHRcdGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImxvYWRlZFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5sO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwiaWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUuaTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRtb2R1bGUud2VicGFja1BvbHlmaWxsID0gMTtcblx0fVxuXHRyZXR1cm4gbW9kdWxlO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/webpack/buildin/module.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/whatwg-fetch/fetch.js":
+/*!********************************************!*\
+ !*** ./node_modules/whatwg-fetch/fetch.js ***!
+ \********************************************/
+/*! exports provided: Headers, Request, Response, DOMException, fetch */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Headers\", function() { return Headers; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Request\", function() { return Request; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Response\", function() { return Response; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"DOMException\", function() { return DOMException; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fetch\", function() { return fetch; });\nvar support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob:\n 'FileReader' in self &&\n 'Blob' in self &&\n (function() {\n try {\n new Blob()\n return true\n } catch (e) {\n return false\n }\n })(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n}\n\nfunction isDataView(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n}\n\nif (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ]\n\n var isArrayBufferView =\n ArrayBuffer.isView ||\n function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n}\n\nfunction normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n}\n\nfunction normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n}\n\n// Build a destructive iterator for the value list\nfunction iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n}\n\nfunction Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n } else if (Array.isArray(headers)) {\n headers.forEach(function(header) {\n this.append(header[0], header[1])\n }, this)\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n}\n\nHeaders.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue + ', ' + value : value\n}\n\nHeaders.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n}\n\nHeaders.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n}\n\nHeaders.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n}\n\nHeaders.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n}\n\nHeaders.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n}\n\nHeaders.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) {\n items.push(name)\n })\n return iteratorFor(items)\n}\n\nHeaders.prototype.values = function() {\n var items = []\n this.forEach(function(value) {\n items.push(value)\n })\n return iteratorFor(items)\n}\n\nHeaders.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) {\n items.push([name, value])\n })\n return iteratorFor(items)\n}\n\nif (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n}\n\nfunction consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n}\n\nfunction fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n}\n\nfunction readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n}\n\nfunction readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n}\n\nfunction readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n}\n\nfunction bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n}\n\nfunction Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (!body) {\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n this._bodyText = body = Object.prototype.toString.call(body)\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n}\n\n// HTTP methods whose capitalization should be normalized\nvar methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\nfunction normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return methods.indexOf(upcased) > -1 ? upcased : method\n}\n\nfunction Request(input, options) {\n options = options || {}\n var body = options.body\n\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n this.signal = input.signal\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n } else {\n this.url = String(input)\n }\n\n this.credentials = options.credentials || this.credentials || 'same-origin'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.signal = options.signal || this.signal\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n}\n\nRequest.prototype.clone = function() {\n return new Request(this, {body: this._bodyInit})\n}\n\nfunction decode(body) {\n var form = new FormData()\n body\n .trim()\n .split('&')\n .forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n}\n\nfunction parseHeaders(rawHeaders) {\n var headers = new Headers()\n // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n // https://tools.ietf.org/html/rfc7230#section-3.2\n var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ')\n preProcessedHeaders.split(/\\r?\\n/).forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n headers.append(key, value)\n }\n })\n return headers\n}\n\nBody.call(Request.prototype)\n\nfunction Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = options.status === undefined ? 200 : options.status\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = 'statusText' in options ? options.statusText : 'OK'\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n}\n\nBody.call(Response.prototype)\n\nResponse.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n}\n\nResponse.error = function() {\n var response = new Response(null, {status: 0, statusText: ''})\n response.type = 'error'\n return response\n}\n\nvar redirectStatuses = [301, 302, 303, 307, 308]\n\nResponse.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n}\n\nvar DOMException = self.DOMException\ntry {\n new DOMException()\n} catch (err) {\n DOMException = function(message, name) {\n this.message = message\n this.name = name\n var error = Error(message)\n this.stack = error.stack\n }\n DOMException.prototype = Object.create(Error.prototype)\n DOMException.prototype.constructor = DOMException\n}\n\nfunction fetch(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n\n if (request.signal && request.signal.aborted) {\n return reject(new DOMException('Aborted', 'AbortError'))\n }\n\n var xhr = new XMLHttpRequest()\n\n function abortXhr() {\n xhr.abort()\n }\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.onabort = function() {\n reject(new DOMException('Aborted', 'AbortError'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n } else if (request.credentials === 'omit') {\n xhr.withCredentials = false\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n if (request.signal) {\n request.signal.addEventListener('abort', abortXhr)\n\n xhr.onreadystatechange = function() {\n // DONE (success or failure)\n if (xhr.readyState === 4) {\n request.signal.removeEventListener('abort', abortXhr)\n }\n }\n }\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n}\n\nfetch.polyfill = true\n\nif (!self.fetch) {\n self.fetch = fetch\n self.Headers = Headers\n self.Request = Request\n self.Response = Response\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvd2hhdHdnLWZldGNoL2ZldGNoLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvd2hhdHdnLWZldGNoL2ZldGNoLmpzPzZkOTMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHN1cHBvcnQgPSB7XG4gIHNlYXJjaFBhcmFtczogJ1VSTFNlYXJjaFBhcmFtcycgaW4gc2VsZixcbiAgaXRlcmFibGU6ICdTeW1ib2wnIGluIHNlbGYgJiYgJ2l0ZXJhdG9yJyBpbiBTeW1ib2wsXG4gIGJsb2I6XG4gICAgJ0ZpbGVSZWFkZXInIGluIHNlbGYgJiZcbiAgICAnQmxvYicgaW4gc2VsZiAmJlxuICAgIChmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBCbG9iKClcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfSkoKSxcbiAgZm9ybURhdGE6ICdGb3JtRGF0YScgaW4gc2VsZixcbiAgYXJyYXlCdWZmZXI6ICdBcnJheUJ1ZmZlcicgaW4gc2VsZlxufVxuXG5mdW5jdGlvbiBpc0RhdGFWaWV3KG9iaikge1xuICByZXR1cm4gb2JqICYmIERhdGFWaWV3LnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKG9iailcbn1cblxuaWYgKHN1cHBvcnQuYXJyYXlCdWZmZXIpIHtcbiAgdmFyIHZpZXdDbGFzc2VzID0gW1xuICAgICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICAnW29iamVjdCBVaW50MzJBcnJheV0nLFxuICAgICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nXG4gIF1cblxuICB2YXIgaXNBcnJheUJ1ZmZlclZpZXcgPVxuICAgIEFycmF5QnVmZmVyLmlzVmlldyB8fFxuICAgIGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB2aWV3Q2xhc3Nlcy5pbmRleE9mKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopKSA+IC0xXG4gICAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOYW1lKG5hbWUpIHtcbiAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgIG5hbWUgPSBTdHJpbmcobmFtZSlcbiAgfVxuICBpZiAoL1teYS16MC05XFwtIyQlJicqKy5eX2B8fl0vaS50ZXN0KG5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBjaGFyYWN0ZXIgaW4gaGVhZGVyIGZpZWxkIG5hbWUnKVxuICB9XG4gIHJldHVybiBuYW1lLnRvTG93ZXJDYXNlKClcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVmFsdWUodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSlcbiAgfVxuICByZXR1cm4gdmFsdWVcbn1cblxuLy8gQnVpbGQgYSBkZXN0cnVjdGl2ZSBpdGVyYXRvciBmb3IgdGhlIHZhbHVlIGxpc3RcbmZ1bmN0aW9uIGl0ZXJhdG9yRm9yKGl0ZW1zKSB7XG4gIHZhciBpdGVyYXRvciA9IHtcbiAgICBuZXh0OiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGl0ZW1zLnNoaWZ0KClcbiAgICAgIHJldHVybiB7ZG9uZTogdmFsdWUgPT09IHVuZGVmaW5lZCwgdmFsdWU6IHZhbHVlfVxuICAgIH1cbiAgfVxuXG4gIGlmIChzdXBwb3J0Lml0ZXJhYmxlKSB7XG4gICAgaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGl0ZXJhdG9yXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGl0ZXJhdG9yXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBIZWFkZXJzKGhlYWRlcnMpIHtcbiAgdGhpcy5tYXAgPSB7fVxuXG4gIGlmIChoZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycykge1xuICAgIGhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgdGhpcy5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgfSwgdGhpcylcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGhlYWRlcnMpKSB7XG4gICAgaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKGhlYWRlcikge1xuICAgICAgdGhpcy5hcHBlbmQoaGVhZGVyWzBdLCBoZWFkZXJbMV0pXG4gICAgfSwgdGhpcylcbiAgfSBlbHNlIGlmIChoZWFkZXJzKSB7XG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaGVhZGVycykuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgICB0aGlzLmFwcGVuZChuYW1lLCBoZWFkZXJzW25hbWVdKVxuICAgIH0sIHRoaXMpXG4gIH1cbn1cblxuSGVhZGVycy5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgbmFtZSA9IG5vcm1hbGl6ZU5hbWUobmFtZSlcbiAgdmFsdWUgPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSlcbiAgdmFyIG9sZFZhbHVlID0gdGhpcy5tYXBbbmFtZV1cbiAgdGhpcy5tYXBbbmFtZV0gPSBvbGRWYWx1ZSA/IG9sZFZhbHVlICsgJywgJyArIHZhbHVlIDogdmFsdWVcbn1cblxuSGVhZGVycy5wcm90b3R5cGVbJ2RlbGV0ZSddID0gZnVuY3Rpb24obmFtZSkge1xuICBkZWxldGUgdGhpcy5tYXBbbm9ybWFsaXplTmFtZShuYW1lKV1cbn1cblxuSGVhZGVycy5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24obmFtZSkge1xuICBuYW1lID0gbm9ybWFsaXplTmFtZShuYW1lKVxuICByZXR1cm4gdGhpcy5oYXMobmFtZSkgPyB0aGlzLm1hcFtuYW1lXSA6IG51bGxcbn1cblxuSGVhZGVycy5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24obmFtZSkge1xuICByZXR1cm4gdGhpcy5tYXAuaGFzT3duUHJvcGVydHkobm9ybWFsaXplTmFtZShuYW1lKSlcbn1cblxuSGVhZGVycy5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdGhpcy5tYXBbbm9ybWFsaXplTmFtZShuYW1lKV0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSlcbn1cblxuSGVhZGVycy5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gIGZvciAodmFyIG5hbWUgaW4gdGhpcy5tYXApIHtcbiAgICBpZiAodGhpcy5tYXAuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdGhpcy5tYXBbbmFtZV0sIG5hbWUsIHRoaXMpXG4gICAgfVxuICB9XG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGl0ZW1zID0gW11cbiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgaXRlbXMucHVzaChuYW1lKVxuICB9KVxuICByZXR1cm4gaXRlcmF0b3JGb3IoaXRlbXMpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaXRlbXMgPSBbXVxuICB0aGlzLmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICBpdGVtcy5wdXNoKHZhbHVlKVxuICB9KVxuICByZXR1cm4gaXRlcmF0b3JGb3IoaXRlbXMpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGl0ZW1zID0gW11cbiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgaXRlbXMucHVzaChbbmFtZSwgdmFsdWVdKVxuICB9KVxuICByZXR1cm4gaXRlcmF0b3JGb3IoaXRlbXMpXG59XG5cbmlmIChzdXBwb3J0Lml0ZXJhYmxlKSB7XG4gIEhlYWRlcnMucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBIZWFkZXJzLnByb3RvdHlwZS5lbnRyaWVzXG59XG5cbmZ1bmN0aW9uIGNvbnN1bWVkKGJvZHkpIHtcbiAgaWYgKGJvZHkuYm9keVVzZWQpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFR5cGVFcnJvcignQWxyZWFkeSByZWFkJykpXG4gIH1cbiAgYm9keS5ib2R5VXNlZCA9IHRydWVcbn1cblxuZnVuY3Rpb24gZmlsZVJlYWRlclJlYWR5KHJlYWRlcikge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVzb2x2ZShyZWFkZXIucmVzdWx0KVxuICAgIH1cbiAgICByZWFkZXIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVqZWN0KHJlYWRlci5lcnJvcilcbiAgICB9XG4gIH0pXG59XG5cbmZ1bmN0aW9uIHJlYWRCbG9iQXNBcnJheUJ1ZmZlcihibG9iKSB7XG4gIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpXG4gIHZhciBwcm9taXNlID0gZmlsZVJlYWRlclJlYWR5KHJlYWRlcilcbiAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpXG4gIHJldHVybiBwcm9taXNlXG59XG5cbmZ1bmN0aW9uIHJlYWRCbG9iQXNUZXh0KGJsb2IpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKClcbiAgdmFyIHByb21pc2UgPSBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKVxuICByZWFkZXIucmVhZEFzVGV4dChibG9iKVxuICByZXR1cm4gcHJvbWlzZVxufVxuXG5mdW5jdGlvbiByZWFkQXJyYXlCdWZmZXJBc1RleHQoYnVmKSB7XG4gIHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKVxuICB2YXIgY2hhcnMgPSBuZXcgQXJyYXkodmlldy5sZW5ndGgpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aWV3Lmxlbmd0aDsgaSsrKSB7XG4gICAgY2hhcnNbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHZpZXdbaV0pXG4gIH1cbiAgcmV0dXJuIGNoYXJzLmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGJ1ZmZlckNsb25lKGJ1Zikge1xuICBpZiAoYnVmLnNsaWNlKSB7XG4gICAgcmV0dXJuIGJ1Zi5zbGljZSgwKVxuICB9IGVsc2Uge1xuICAgIHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmLmJ5dGVMZW5ndGgpXG4gICAgdmlldy5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmKSlcbiAgICByZXR1cm4gdmlldy5idWZmZXJcbiAgfVxufVxuXG5mdW5jdGlvbiBCb2R5KCkge1xuICB0aGlzLmJvZHlVc2VkID0gZmFsc2VcblxuICB0aGlzLl9pbml0Qm9keSA9IGZ1bmN0aW9uKGJvZHkpIHtcbiAgICB0aGlzLl9ib2R5SW5pdCA9IGJvZHlcbiAgICBpZiAoIWJvZHkpIHtcbiAgICAgIHRoaXMuX2JvZHlUZXh0ID0gJydcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fYm9keVRleHQgPSBib2R5XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LmJsb2IgJiYgQmxvYi5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgdGhpcy5fYm9keUJsb2IgPSBib2R5XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LmZvcm1EYXRhICYmIEZvcm1EYXRhLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICB0aGlzLl9ib2R5Rm9ybURhdGEgPSBib2R5XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LnNlYXJjaFBhcmFtcyAmJiBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgIHRoaXMuX2JvZHlUZXh0ID0gYm9keS50b1N0cmluZygpXG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LmFycmF5QnVmZmVyICYmIHN1cHBvcnQuYmxvYiAmJiBpc0RhdGFWaWV3KGJvZHkpKSB7XG4gICAgICB0aGlzLl9ib2R5QXJyYXlCdWZmZXIgPSBidWZmZXJDbG9uZShib2R5LmJ1ZmZlcilcbiAgICAgIC8vIElFIDEwLTExIGNhbid0IGhhbmRsZSBhIERhdGFWaWV3IGJvZHkuXG4gICAgICB0aGlzLl9ib2R5SW5pdCA9IG5ldyBCbG9iKFt0aGlzLl9ib2R5QXJyYXlCdWZmZXJdKVxuICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5hcnJheUJ1ZmZlciAmJiAoQXJyYXlCdWZmZXIucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkgfHwgaXNBcnJheUJ1ZmZlclZpZXcoYm9keSkpKSB7XG4gICAgICB0aGlzLl9ib2R5QXJyYXlCdWZmZXIgPSBidWZmZXJDbG9uZShib2R5KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHkgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYm9keSlcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpKSB7XG4gICAgICBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsICd0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTgnKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5QmxvYiAmJiB0aGlzLl9ib2R5QmxvYi50eXBlKSB7XG4gICAgICAgIHRoaXMuaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsIHRoaXMuX2JvZHlCbG9iLnR5cGUpXG4gICAgICB9IGVsc2UgaWYgKHN1cHBvcnQuc2VhcmNoUGFyYW1zICYmIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLTgnKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChzdXBwb3J0LmJsb2IpIHtcbiAgICB0aGlzLmJsb2IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciByZWplY3RlZCA9IGNvbnN1bWVkKHRoaXMpXG4gICAgICBpZiAocmVqZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdGVkXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9ib2R5QmxvYikge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlCbG9iKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgQmxvYihbdGhpcy5fYm9keUFycmF5QnVmZmVyXSkpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlGb3JtRGF0YSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCByZWFkIEZvcm1EYXRhIGJvZHkgYXMgYmxvYicpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLl9ib2R5VGV4dF0pKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuYXJyYXlCdWZmZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIGNvbnN1bWVkKHRoaXMpIHx8IFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5ibG9iKCkudGhlbihyZWFkQmxvYkFzQXJyYXlCdWZmZXIpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdGhpcy50ZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcylcbiAgICBpZiAocmVqZWN0ZWQpIHtcbiAgICAgIHJldHVybiByZWplY3RlZFxuICAgIH1cblxuICAgIGlmICh0aGlzLl9ib2R5QmxvYikge1xuICAgICAgcmV0dXJuIHJlYWRCbG9iQXNUZXh0KHRoaXMuX2JvZHlCbG9iKVxuICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUFycmF5QnVmZmVyKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlYWRBcnJheUJ1ZmZlckFzVGV4dCh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpKVxuICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUZvcm1EYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCByZWFkIEZvcm1EYXRhIGJvZHkgYXMgdGV4dCcpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keVRleHQpXG4gICAgfVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuZm9ybURhdGEpIHtcbiAgICB0aGlzLmZvcm1EYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXh0KCkudGhlbihkZWNvZGUpXG4gICAgfVxuICB9XG5cbiAgdGhpcy5qc29uID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudGV4dCgpLnRoZW4oSlNPTi5wYXJzZSlcbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhUVFAgbWV0aG9kcyB3aG9zZSBjYXBpdGFsaXphdGlvbiBzaG91bGQgYmUgbm9ybWFsaXplZFxudmFyIG1ldGhvZHMgPSBbJ0RFTEVURScsICdHRVQnLCAnSEVBRCcsICdPUFRJT05TJywgJ1BPU1QnLCAnUFVUJ11cblxuZnVuY3Rpb24gbm9ybWFsaXplTWV0aG9kKG1ldGhvZCkge1xuICB2YXIgdXBjYXNlZCA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpXG4gIHJldHVybiBtZXRob2RzLmluZGV4T2YodXBjYXNlZCkgPiAtMSA/IHVwY2FzZWQgOiBtZXRob2Rcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJlcXVlc3QoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgdmFyIGJvZHkgPSBvcHRpb25zLmJvZHlcblxuICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7XG4gICAgaWYgKGlucHV0LmJvZHlVc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBbHJlYWR5IHJlYWQnKVxuICAgIH1cbiAgICB0aGlzLnVybCA9IGlucHV0LnVybFxuICAgIHRoaXMuY3JlZGVudGlhbHMgPSBpbnB1dC5jcmVkZW50aWFsc1xuICAgIGlmICghb3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhpbnB1dC5oZWFkZXJzKVxuICAgIH1cbiAgICB0aGlzLm1ldGhvZCA9IGlucHV0Lm1ldGhvZFxuICAgIHRoaXMubW9kZSA9IGlucHV0Lm1vZGVcbiAgICB0aGlzLnNpZ25hbCA9IGlucHV0LnNpZ25hbFxuICAgIGlmICghYm9keSAmJiBpbnB1dC5fYm9keUluaXQgIT0gbnVsbCkge1xuICAgICAgYm9keSA9IGlucHV0Ll9ib2R5SW5pdFxuICAgICAgaW5wdXQuYm9keVVzZWQgPSB0cnVlXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRoaXMudXJsID0gU3RyaW5nKGlucHV0KVxuICB9XG5cbiAgdGhpcy5jcmVkZW50aWFscyA9IG9wdGlvbnMuY3JlZGVudGlhbHMgfHwgdGhpcy5jcmVkZW50aWFscyB8fCAnc2FtZS1vcmlnaW4nXG4gIGlmIChvcHRpb25zLmhlYWRlcnMgfHwgIXRoaXMuaGVhZGVycykge1xuICAgIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKG9wdGlvbnMuaGVhZGVycylcbiAgfVxuICB0aGlzLm1ldGhvZCA9IG5vcm1hbGl6ZU1ldGhvZChvcHRpb25zLm1ldGhvZCB8fCB0aGlzLm1ldGhvZCB8fCAnR0VUJylcbiAgdGhpcy5tb2RlID0gb3B0aW9ucy5tb2RlIHx8IHRoaXMubW9kZSB8fCBudWxsXG4gIHRoaXMuc2lnbmFsID0gb3B0aW9ucy5zaWduYWwgfHwgdGhpcy5zaWduYWxcbiAgdGhpcy5yZWZlcnJlciA9IG51bGxcblxuICBpZiAoKHRoaXMubWV0aG9kID09PSAnR0VUJyB8fCB0aGlzLm1ldGhvZCA9PT0gJ0hFQUQnKSAmJiBib2R5KSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9keSBub3QgYWxsb3dlZCBmb3IgR0VUIG9yIEhFQUQgcmVxdWVzdHMnKVxuICB9XG4gIHRoaXMuX2luaXRCb2R5KGJvZHkpXG59XG5cblJlcXVlc3QucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUmVxdWVzdCh0aGlzLCB7Ym9keTogdGhpcy5fYm9keUluaXR9KVxufVxuXG5mdW5jdGlvbiBkZWNvZGUoYm9keSkge1xuICB2YXIgZm9ybSA9IG5ldyBGb3JtRGF0YSgpXG4gIGJvZHlcbiAgICAudHJpbSgpXG4gICAgLnNwbGl0KCcmJylcbiAgICAuZm9yRWFjaChmdW5jdGlvbihieXRlcykge1xuICAgICAgaWYgKGJ5dGVzKSB7XG4gICAgICAgIHZhciBzcGxpdCA9IGJ5dGVzLnNwbGl0KCc9JylcbiAgICAgICAgdmFyIG5hbWUgPSBzcGxpdC5zaGlmdCgpLnJlcGxhY2UoL1xcKy9nLCAnICcpXG4gICAgICAgIHZhciB2YWx1ZSA9IHNwbGl0LmpvaW4oJz0nKS5yZXBsYWNlKC9cXCsvZywgJyAnKVxuICAgICAgICBmb3JtLmFwcGVuZChkZWNvZGVVUklDb21wb25lbnQobmFtZSksIGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpXG4gICAgICB9XG4gICAgfSlcbiAgcmV0dXJuIGZvcm1cbn1cblxuZnVuY3Rpb24gcGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpIHtcbiAgdmFyIGhlYWRlcnMgPSBuZXcgSGVhZGVycygpXG4gIC8vIFJlcGxhY2UgaW5zdGFuY2VzIG9mIFxcclxcbiBhbmQgXFxuIGZvbGxvd2VkIGJ5IGF0IGxlYXN0IG9uZSBzcGFjZSBvciBob3Jpem9udGFsIHRhYiB3aXRoIGEgc3BhY2VcbiAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzAjc2VjdGlvbi0zLjJcbiAgdmFyIHByZVByb2Nlc3NlZEhlYWRlcnMgPSByYXdIZWFkZXJzLnJlcGxhY2UoL1xccj9cXG5bXFx0IF0rL2csICcgJylcbiAgcHJlUHJvY2Vzc2VkSGVhZGVycy5zcGxpdCgvXFxyP1xcbi8pLmZvckVhY2goZnVuY3Rpb24obGluZSkge1xuICAgIHZhciBwYXJ0cyA9IGxpbmUuc3BsaXQoJzonKVxuICAgIHZhciBrZXkgPSBwYXJ0cy5zaGlmdCgpLnRyaW0oKVxuICAgIGlmIChrZXkpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHBhcnRzLmpvaW4oJzonKS50cmltKClcbiAgICAgIGhlYWRlcnMuYXBwZW5kKGtleSwgdmFsdWUpXG4gICAgfVxuICB9KVxuICByZXR1cm4gaGVhZGVyc1xufVxuXG5Cb2R5LmNhbGwoUmVxdWVzdC5wcm90b3R5cGUpXG5cbmV4cG9ydCBmdW5jdGlvbiBSZXNwb25zZShib2R5SW5pdCwgb3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge31cbiAgfVxuXG4gIHRoaXMudHlwZSA9ICdkZWZhdWx0J1xuICB0aGlzLnN0YXR1cyA9IG9wdGlvbnMuc3RhdHVzID09PSB1bmRlZmluZWQgPyAyMDAgOiBvcHRpb25zLnN0YXR1c1xuICB0aGlzLm9rID0gdGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgMzAwXG4gIHRoaXMuc3RhdHVzVGV4dCA9ICdzdGF0dXNUZXh0JyBpbiBvcHRpb25zID8gb3B0aW9ucy5zdGF0dXNUZXh0IDogJ09LJ1xuICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpXG4gIHRoaXMudXJsID0gb3B0aW9ucy51cmwgfHwgJydcbiAgdGhpcy5faW5pdEJvZHkoYm9keUluaXQpXG59XG5cbkJvZHkuY2FsbChSZXNwb25zZS5wcm90b3R5cGUpXG5cblJlc3BvbnNlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuX2JvZHlJbml0LCB7XG4gICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICBzdGF0dXNUZXh0OiB0aGlzLnN0YXR1c1RleHQsXG4gICAgaGVhZGVyczogbmV3IEhlYWRlcnModGhpcy5oZWFkZXJzKSxcbiAgICB1cmw6IHRoaXMudXJsXG4gIH0pXG59XG5cblJlc3BvbnNlLmVycm9yID0gZnVuY3Rpb24oKSB7XG4gIHZhciByZXNwb25zZSA9IG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiAwLCBzdGF0dXNUZXh0OiAnJ30pXG4gIHJlc3BvbnNlLnR5cGUgPSAnZXJyb3InXG4gIHJldHVybiByZXNwb25zZVxufVxuXG52YXIgcmVkaXJlY3RTdGF0dXNlcyA9IFszMDEsIDMwMiwgMzAzLCAzMDcsIDMwOF1cblxuUmVzcG9uc2UucmVkaXJlY3QgPSBmdW5jdGlvbih1cmwsIHN0YXR1cykge1xuICBpZiAocmVkaXJlY3RTdGF0dXNlcy5pbmRleE9mKHN0YXR1cykgPT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgc3RhdHVzIGNvZGUnKVxuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IHtsb2NhdGlvbjogdXJsfX0pXG59XG5cbmV4cG9ydCB2YXIgRE9NRXhjZXB0aW9uID0gc2VsZi5ET01FeGNlcHRpb25cbnRyeSB7XG4gIG5ldyBET01FeGNlcHRpb24oKVxufSBjYXRjaCAoZXJyKSB7XG4gIERPTUV4Y2VwdGlvbiA9IGZ1bmN0aW9uKG1lc3NhZ2UsIG5hbWUpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlXG4gICAgdGhpcy5uYW1lID0gbmFtZVxuICAgIHZhciBlcnJvciA9IEVycm9yKG1lc3NhZ2UpXG4gICAgdGhpcy5zdGFjayA9IGVycm9yLnN0YWNrXG4gIH1cbiAgRE9NRXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKVxuICBET01FeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRE9NRXhjZXB0aW9uXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmZXRjaChpbnB1dCwgaW5pdCkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIHJlcXVlc3QgPSBuZXcgUmVxdWVzdChpbnB1dCwgaW5pdClcblxuICAgIGlmIChyZXF1ZXN0LnNpZ25hbCAmJiByZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICByZXR1cm4gcmVqZWN0KG5ldyBET01FeGNlcHRpb24oJ0Fib3J0ZWQnLCAnQWJvcnRFcnJvcicpKVxuICAgIH1cblxuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuXG4gICAgZnVuY3Rpb24gYWJvcnRYaHIoKSB7XG4gICAgICB4aHIuYWJvcnQoKVxuICAgIH1cblxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBzdGF0dXM6IHhoci5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHhoci5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiBwYXJzZUhlYWRlcnMoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpIHx8ICcnKVxuICAgICAgfVxuICAgICAgb3B0aW9ucy51cmwgPSAncmVzcG9uc2VVUkwnIGluIHhociA/IHhoci5yZXNwb25zZVVSTCA6IG9wdGlvbnMuaGVhZGVycy5nZXQoJ1gtUmVxdWVzdC1VUkwnKVxuICAgICAgdmFyIGJvZHkgPSAncmVzcG9uc2UnIGluIHhociA/IHhoci5yZXNwb25zZSA6IHhoci5yZXNwb25zZVRleHRcbiAgICAgIHJlc29sdmUobmV3IFJlc3BvbnNlKGJvZHksIG9wdGlvbnMpKVxuICAgIH1cblxuICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICByZWplY3QobmV3IFR5cGVFcnJvcignTmV0d29yayByZXF1ZXN0IGZhaWxlZCcpKVxuICAgIH1cblxuICAgIHhoci5vbnRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlamVjdChuZXcgVHlwZUVycm9yKCdOZXR3b3JrIHJlcXVlc3QgZmFpbGVkJykpXG4gICAgfVxuXG4gICAgeGhyLm9uYWJvcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlamVjdChuZXcgRE9NRXhjZXB0aW9uKCdBYm9ydGVkJywgJ0Fib3J0RXJyb3InKSlcbiAgICB9XG5cbiAgICB4aHIub3BlbihyZXF1ZXN0Lm1ldGhvZCwgcmVxdWVzdC51cmwsIHRydWUpXG5cbiAgICBpZiAocmVxdWVzdC5jcmVkZW50aWFscyA9PT0gJ2luY2x1ZGUnKSB7XG4gICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gdHJ1ZVxuICAgIH0gZWxzZSBpZiAocmVxdWVzdC5jcmVkZW50aWFscyA9PT0gJ29taXQnKSB7XG4gICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoJ3Jlc3BvbnNlVHlwZScgaW4geGhyICYmIHN1cHBvcnQuYmxvYikge1xuICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdibG9iJ1xuICAgIH1cblxuICAgIHJlcXVlc3QuaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCB2YWx1ZSlcbiAgICB9KVxuXG4gICAgaWYgKHJlcXVlc3Quc2lnbmFsKSB7XG4gICAgICByZXF1ZXN0LnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0WGhyKVxuXG4gICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIERPTkUgKHN1Y2Nlc3Mgb3IgZmFpbHVyZSlcbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgICAgcmVxdWVzdC5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydFhocilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5zZW5kKHR5cGVvZiByZXF1ZXN0Ll9ib2R5SW5pdCA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogcmVxdWVzdC5fYm9keUluaXQpXG4gIH0pXG59XG5cbmZldGNoLnBvbHlmaWxsID0gdHJ1ZVxuXG5pZiAoIXNlbGYuZmV0Y2gpIHtcbiAgc2VsZi5mZXRjaCA9IGZldGNoXG4gIHNlbGYuSGVhZGVycyA9IEhlYWRlcnNcbiAgc2VsZi5SZXF1ZXN0ID0gUmVxdWVzdFxuICBzZWxmLlJlc3BvbnNlID0gUmVzcG9uc2Vcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/whatwg-fetch/fetch.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/xtend/immutable.js":
+/*!*****************************************!*\
+ !*** ./node_modules/xtend/immutable.js ***!
+ \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("module.exports = extend\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction extend() {\n var target = {}\n\n for (var i = 0; i < arguments.length; i++) {\n var source = arguments[i]\n\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n target[key] = source[key]\n }\n }\n }\n\n return target\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMveHRlbmQvaW1tdXRhYmxlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMveHRlbmQvaW1tdXRhYmxlLmpzPzUzYTgiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBleHRlbmRcblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gZXh0ZW5kKCkge1xuICAgIHZhciB0YXJnZXQgPSB7fVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXVxuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXRcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/xtend/immutable.js\n");
+
+/***/ }),
+
+/***/ "./src/ts/main.ts":
+/*!************************!*\
+ !*** ./src/ts/main.ts ***!
+ \************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\r\n// Test sample code for SoftEther VPN Server JSON-RPC Stub\r\n// Runs on both web browsers and Node.js\r\n// \r\n// Licensed under the Apache License 2.0\r\n// Copyright (c) 2014-2018 SoftEther VPN Project\r\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nvar __generator = (this && this.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\nvar __importStar = (this && this.__importStar) || function (mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result[\"default\"] = mod;\r\n return result;\r\n};\r\nexports.__esModule = true;\r\n// On the web browser uncomment below imports as necessary to support old browsers.\r\n__webpack_require__(/*! core-js/es/promise */ \"./node_modules/core-js/es/promise/index.js\");\r\n__webpack_require__(/*! core-js/es/string */ \"./node_modules/core-js/es/string/index.js\");\r\n__webpack_require__(/*! whatwg-fetch */ \"./node_modules/whatwg-fetch/fetch.js\");\r\nvar $ = __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\");\r\n// Import the vpnrpc.ts RPC stub.\r\nvar VPN = __importStar(__webpack_require__(/*! vpnrpc/dist/vpnrpc */ \"./node_modules/vpnrpc/dist/vpnrpc.js\"));\r\n// Output JSON-RPC request / reply strings to the debug console.\r\nVPN.VpnServerRpc.SetDebugMode(true);\r\nvar api;\r\n// Creating the VpnServerRpc class instance here.\r\nif (VPN.VpnServerRpc.IsNodeJS() === false) // // Determine if this JavaScript environment is on the Node.js or not\r\n {\r\n // On the web browser. We do not need to specify any hostname, port or credential as the web browser already knows it.\r\n api = new VPN.VpnServerRpc();\r\n}\r\nelse {\r\n // On the Node.js. We need to specify the target VPN Server's hostname, port and credential.\r\n api = new VPN.VpnServerRpc(\"127.0.0.1\", 443, \"\", \"PASSWORD_HERE\", false);\r\n}\r\n/** API test for 'Test', test RPC function */\r\nfunction Test_Test() {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var a, b;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n console.log(\"Begin: Test_Test\");\r\n a = new VPN.VpnRpcTest({\r\n IntValue_u32: 12345,\r\n });\r\n return [4 /*yield*/, api.Test(a)];\r\n case 1:\r\n b = _a.sent();\r\n console.log(b);\r\n console.log(\"End: Test_Test\");\r\n console.log(\"-----\");\r\n console.log();\r\n return [2 /*return*/];\r\n }\r\n });\r\n });\r\n}\r\nexports.Test_Test = Test_Test;\r\nfunction ListVirtualHubs(id) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var ul, hubList;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n ul = $(id);\r\n ul.children().remove();\r\n return [4 /*yield*/, api.EnumHub()];\r\n case 1:\r\n hubList = _a.sent();\r\n hubList.HubList.forEach(function (hub) {\r\n ul.append(\"<li><strong><a href='./hub.html?\" + hub.HubName_str + \"'>\" + hub.HubName_str + \"</a></strong><br>\" + ConcatKeysToHtml(hub) + \"</li>\");\r\n });\r\n return [2 /*return*/];\r\n }\r\n });\r\n });\r\n}\r\nexports.ListVirtualHubs = ListVirtualHubs;\r\nfunction ShowVpnServerInfo(idInfo, idStatus) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var infoList, statusList, serverInfo, serverStatus;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n infoList = $(idInfo);\r\n statusList = $(idStatus);\r\n return [4 /*yield*/, api.GetServerInfo()];\r\n case 1:\r\n serverInfo = _a.sent();\r\n return [4 /*yield*/, api.GetServerStatus()];\r\n case 2:\r\n serverStatus = _a.sent();\r\n Object.keys(serverInfo).forEach(function (key) {\r\n infoList.append(\"<li>\" + key + \": \\\"\" + serverInfo[key] + \"\\\"</li>\");\r\n });\r\n Object.keys(serverStatus).forEach(function (key) {\r\n statusList.append(\"<li>\" + key + \": \\\"\" + serverStatus[key] + \"\\\"</li>\");\r\n });\r\n return [2 /*return*/];\r\n }\r\n });\r\n });\r\n}\r\nexports.ShowVpnServerInfo = ShowVpnServerInfo;\r\nfunction CreateNewHub(hubName, idList) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var param, ex_1;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n if (hubName == null || hubName == \"\") {\r\n alert(\"Virtual Hub name is empty.\");\r\n return [2 /*return*/];\r\n }\r\n _a.label = 1;\r\n case 1:\r\n _a.trys.push([1, 3, , 4]);\r\n param = new VPN.VpnRpcCreateHub({\r\n HubName_str: hubName,\r\n Online_bool: true,\r\n HubType_u32: VPN.VpnRpcHubType.Standalone,\r\n });\r\n return [4 /*yield*/, api.CreateHub(param)];\r\n case 2:\r\n _a.sent();\r\n ListVirtualHubs(idList);\r\n alert(\"The Virtual Hub '\" + hubName + \"' is created.\");\r\n return [3 /*break*/, 4];\r\n case 3:\r\n ex_1 = _a.sent();\r\n alert(ex_1);\r\n return [3 /*break*/, 4];\r\n case 4: return [2 /*return*/];\r\n }\r\n });\r\n });\r\n}\r\nexports.CreateNewHub = CreateNewHub;\r\nfunction ConcatKeysToHtml(obj) {\r\n var ret = \"\";\r\n Object.keys(obj).forEach(function (key) {\r\n ret += key + \": \\\"\" + obj[key] + \"\\\"<BR>\";\r\n });\r\n return ret;\r\n}\r\nfunction DeleteVirtualHub(queryString) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var hubNameInput, deleteHubParam, ex_2;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n hubNameInput = queryString;\r\n if (hubNameInput.length >= 1 && hubNameInput.charAt(0) == \"?\")\r\n hubNameInput = hubNameInput.substring(1);\r\n _a.label = 1;\r\n case 1:\r\n _a.trys.push([1, 3, , 4]);\r\n deleteHubParam = new VPN.VpnRpcDeleteHub({\r\n HubName_str: hubNameInput,\r\n });\r\n return [4 /*yield*/, api.DeleteHub(deleteHubParam)];\r\n case 2:\r\n _a.sent();\r\n alert(\"The Virtual Hub '\" + hubNameInput + \"' is deleted.\");\r\n window.location.href = \"./\";\r\n return [3 /*break*/, 4];\r\n case 3:\r\n ex_2 = _a.sent();\r\n alert(ex_2);\r\n return [3 /*break*/, 4];\r\n case 4: return [2 /*return*/];\r\n }\r\n });\r\n });\r\n}\r\nexports.DeleteVirtualHub = DeleteVirtualHub;\r\nfunction HubAdminPage(queryString) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var hubNameInput, getHubParam, hubInfo, enumUserParam, enumUserRet, userListHtmlItem_1, enumSessionParam, enumSessionsRet, sessionListHtmlItem_1, ex_3;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n hubNameInput = queryString;\r\n if (hubNameInput.length >= 1 && hubNameInput.charAt(0) == \"?\")\r\n hubNameInput = hubNameInput.substring(1);\r\n _a.label = 1;\r\n case 1:\r\n _a.trys.push([1, 5, , 6]);\r\n getHubParam = new VPN.VpnRpcCreateHub({\r\n HubName_str: hubNameInput,\r\n });\r\n return [4 /*yield*/, api.GetHub(getHubParam)];\r\n case 2:\r\n hubInfo = _a.sent();\r\n $(\"#HUB_NAME\").append(\"Virtual Hub \\\"\" + hubInfo.HubName_str + \"\\\"\");\r\n enumUserParam = new VPN.VpnRpcEnumUser({\r\n HubName_str: hubInfo.HubName_str,\r\n });\r\n return [4 /*yield*/, api.EnumUser(enumUserParam)];\r\n case 3:\r\n enumUserRet = _a.sent();\r\n userListHtmlItem_1 = $(\"#USERS_LIST\");\r\n enumUserRet.UserList.forEach(function (user) {\r\n userListHtmlItem_1.append(\"<li><strong>\" + user.Name_str + \"</strong><BR>\" + ConcatKeysToHtml(user) + \"</li>\");\r\n });\r\n enumSessionParam = new VPN.VpnRpcEnumSession({\r\n HubName_str: hubInfo.HubName_str,\r\n });\r\n return [4 /*yield*/, api.EnumSession(enumSessionParam)];\r\n case 4:\r\n enumSessionsRet = _a.sent();\r\n sessionListHtmlItem_1 = $(\"#SESSIONS_LIST\");\r\n enumSessionsRet.SessionList.forEach(function (session) {\r\n sessionListHtmlItem_1.append(\"<li><strong>\" + session.Name_str + \"</strong><br>\" + ConcatKeysToHtml(session) + \"</li>\");\r\n });\r\n return [3 /*break*/, 6];\r\n case 5:\r\n ex_3 = _a.sent();\r\n alert(ex_3);\r\n return [3 /*break*/, 6];\r\n case 6: return [2 /*return*/];\r\n }\r\n });\r\n });\r\n}\r\nexports.HubAdminPage = HubAdminPage;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdHMvbWFpbi50cy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vc3JjL3RzL21haW4udHM/NjRmNCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUZXN0IHNhbXBsZSBjb2RlIGZvciBTb2Z0RXRoZXIgVlBOIFNlcnZlciBKU09OLVJQQyBTdHViXHJcbi8vIFJ1bnMgb24gYm90aCB3ZWIgYnJvd3NlcnMgYW5kIE5vZGUuanNcclxuLy8gXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSAyLjBcclxuLy8gQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggU29mdEV0aGVyIFZQTiBQcm9qZWN0XHJcblxyXG4vLyBPbiB0aGUgd2ViIGJyb3dzZXIgdW5jb21tZW50IGJlbG93IGltcG9ydHMgYXMgbmVjZXNzYXJ5IHRvIHN1cHBvcnQgb2xkIGJyb3dzZXJzLlxyXG5pbXBvcnQgXCJjb3JlLWpzL2VzL3Byb21pc2VcIjtcclxuaW1wb3J0IFwiY29yZS1qcy9lcy9zdHJpbmdcIjtcclxuaW1wb3J0IFwid2hhdHdnLWZldGNoXCI7XHJcblxyXG5pbXBvcnQgJCA9IHJlcXVpcmUoJ2pxdWVyeScpO1xyXG5cclxuLy8gSW1wb3J0IHRoZSB2cG5ycGMudHMgUlBDIHN0dWIuXHJcbmltcG9ydCAqIGFzIFZQTiBmcm9tIFwidnBucnBjL2Rpc3QvdnBucnBjXCI7XHJcblxyXG4vLyBPdXRwdXQgSlNPTi1SUEMgcmVxdWVzdCAvIHJlcGx5IHN0cmluZ3MgdG8gdGhlIGRlYnVnIGNvbnNvbGUuXHJcblZQTi5WcG5TZXJ2ZXJScGMuU2V0RGVidWdNb2RlKHRydWUpO1xyXG5cclxubGV0IGFwaTogVlBOLlZwblNlcnZlclJwYztcclxuLy8gQ3JlYXRpbmcgdGhlIFZwblNlcnZlclJwYyBjbGFzcyBpbnN0YW5jZSBoZXJlLlxyXG5pZiAoVlBOLlZwblNlcnZlclJwYy5Jc05vZGVKUygpID09PSBmYWxzZSkgLy8gLy8gRGV0ZXJtaW5lIGlmIHRoaXMgSmF2YVNjcmlwdCBlbnZpcm9ubWVudCBpcyBvbiB0aGUgTm9kZS5qcyBvciBub3Rcclxue1xyXG4gICAgLy8gT24gdGhlIHdlYiBicm93c2VyLiBXZSBkbyBub3QgbmVlZCB0byBzcGVjaWZ5IGFueSBob3N0bmFtZSwgcG9ydCBvciBjcmVkZW50aWFsIGFzIHRoZSB3ZWIgYnJvd3NlciBhbHJlYWR5IGtub3dzIGl0LlxyXG4gICAgYXBpID0gbmV3IFZQTi5WcG5TZXJ2ZXJScGMoKTtcclxufVxyXG5lbHNlXHJcbntcclxuICAgIC8vIE9uIHRoZSBOb2RlLmpzLiBXZSBuZWVkIHRvIHNwZWNpZnkgdGhlIHRhcmdldCBWUE4gU2VydmVyJ3MgaG9zdG5hbWUsIHBvcnQgYW5kIGNyZWRlbnRpYWwuXHJcbiAgICBhcGkgPSBuZXcgVlBOLlZwblNlcnZlclJwYyhcIjEyNy4wLjAuMVwiLCA0NDMsIFwiXCIsIFwiUEFTU1dPUkRfSEVSRVwiLCBmYWxzZSk7XHJcbn1cclxuXHJcblxyXG4vKiogQVBJIHRlc3QgZm9yICdUZXN0JywgdGVzdCBSUEMgZnVuY3Rpb24gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIFRlc3RfVGVzdCgpOiBQcm9taXNlPHZvaWQ+XHJcbntcclxuICAgIGNvbnNvbGUubG9nKFwiQmVnaW46IFRlc3RfVGVzdFwiKTtcclxuICAgIGxldCBhOiBWUE4uVnBuUnBjVGVzdCA9IG5ldyBWUE4uVnBuUnBjVGVzdChcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIEludFZhbHVlX3UzMjogMTIzNDUsXHJcbiAgICAgICAgfSk7XHJcbiAgICBsZXQgYjogVlBOLlZwblJwY1Rlc3QgPSBhd2FpdCBhcGkuVGVzdChhKTtcclxuICAgIGNvbnNvbGUubG9nKGIpO1xyXG4gICAgY29uc29sZS5sb2coXCJFbmQ6IFRlc3RfVGVzdFwiKTtcclxuICAgIGNvbnNvbGUubG9nKFwiLS0tLS1cIik7XHJcbiAgICBjb25zb2xlLmxvZygpO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gTGlzdFZpcnR1YWxIdWJzKGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+XHJcbntcclxuICAgIGxldCB1bDogSlF1ZXJ5PEhUTUxFbGVtZW50PiA9ICQoaWQpO1xyXG5cclxuICAgIHVsLmNoaWxkcmVuKCkucmVtb3ZlKCk7XHJcblxyXG4gICAgbGV0IGh1Ykxpc3QgPSBhd2FpdCBhcGkuRW51bUh1YigpO1xyXG5cclxuICAgIGh1Ykxpc3QuSHViTGlzdC5mb3JFYWNoKGh1YiA9PlxyXG4gICAge1xyXG4gICAgICAgIHVsLmFwcGVuZChcIjxsaT48c3Ryb25nPjxhIGhyZWY9Jy4vaHViLmh0bWw/XCIgKyBodWIuSHViTmFtZV9zdHIgKyBcIic+XCIgKyBodWIuSHViTmFtZV9zdHIgKyBcIjwvYT48L3N0cm9uZz48YnI+XCIgKyBDb25jYXRLZXlzVG9IdG1sKGh1YikgKyBcIjwvbGk+XCIpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBTaG93VnBuU2VydmVySW5mbyhpZEluZm86IHN0cmluZywgaWRTdGF0dXM6IHN0cmluZyk6IFByb21pc2U8dm9pZD5cclxue1xyXG4gICAgbGV0IGluZm9MaXN0ID0gJChpZEluZm8pO1xyXG4gICAgbGV0IHN0YXR1c0xpc3QgPSAkKGlkU3RhdHVzKTtcclxuXHJcbiAgICBsZXQgc2VydmVySW5mbyA9IGF3YWl0IGFwaS5HZXRTZXJ2ZXJJbmZvKCk7XHJcblxyXG4gICAgbGV0IHNlcnZlclN0YXR1cyA9IGF3YWl0IGFwaS5HZXRTZXJ2ZXJTdGF0dXMoKTtcclxuXHJcbiAgICBPYmplY3Qua2V5cyhzZXJ2ZXJJbmZvKS5mb3JFYWNoKGtleSA9PlxyXG4gICAge1xyXG4gICAgICAgIGluZm9MaXN0LmFwcGVuZChcIjxsaT5cIiArIGtleSArIFwiOiBcXFwiXCIgKyAoPGFueT5zZXJ2ZXJJbmZvKVtrZXldICsgXCJcXFwiPC9saT5cIik7XHJcbiAgICB9KTtcclxuXHJcbiAgICBPYmplY3Qua2V5cyhzZXJ2ZXJTdGF0dXMpLmZvckVhY2goa2V5ID0+XHJcbiAgICB7XHJcbiAgICAgICAgc3RhdHVzTGlzdC5hcHBlbmQoXCI8bGk+XCIgKyBrZXkgKyBcIjogXFxcIlwiICsgKDxhbnk+c2VydmVyU3RhdHVzKVtrZXldICsgXCJcXFwiPC9saT5cIik7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIENyZWF0ZU5ld0h1YihodWJOYW1lOiBzdHJpbmcsIGlkTGlzdDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxyXG57XHJcbiAgICBpZiAoaHViTmFtZSA9PSBudWxsIHx8IGh1Yk5hbWUgPT0gXCJcIilcclxuICAgIHtcclxuICAgICAgICBhbGVydChcIlZpcnR1YWwgSHViIG5hbWUgaXMgZW1wdHkuXCIpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0cnlcclxuICAgIHtcclxuICAgICAgICBsZXQgcGFyYW06IFZQTi5WcG5ScGNDcmVhdGVIdWIgPSBuZXcgVlBOLlZwblJwY0NyZWF0ZUh1YihcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgSHViTmFtZV9zdHI6IGh1Yk5hbWUsXHJcbiAgICAgICAgICAgICAgICBPbmxpbmVfYm9vbDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIEh1YlR5cGVfdTMyOiBWUE4uVnBuUnBjSHViVHlwZS5TdGFuZGFsb25lLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBcclxuICAgICAgICBhd2FpdCBhcGkuQ3JlYXRlSHViKHBhcmFtKTtcclxuICAgICAgXHJcbiAgICAgICAgTGlzdFZpcnR1YWxIdWJzKGlkTGlzdCk7XHJcblxyXG4gICAgICAgIGFsZXJ0KFwiVGhlIFZpcnR1YWwgSHViICdcIiArIGh1Yk5hbWUgKyBcIicgaXMgY3JlYXRlZC5cIik7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXgpXHJcbiAgICB7XHJcbiAgICAgICAgYWxlcnQoZXgpO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBDb25jYXRLZXlzVG9IdG1sKG9iajogYW55KTogc3RyaW5nXHJcbntcclxuICAgIGxldCByZXQ6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGtleSA9PlxyXG4gICAge1xyXG4gICAgICAgIHJldCArPSBrZXkgKyBcIjogXFxcIlwiICsgKDxhbnk+b2JqKVtrZXldICsgXCJcXFwiPEJSPlwiO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHJldDtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIERlbGV0ZVZpcnR1YWxIdWIocXVlcnlTdHJpbmc6IHN0cmluZyk6IFByb21pc2U8dm9pZD5cclxue1xyXG4gICAgbGV0IGh1Yk5hbWVJbnB1dCA9IHF1ZXJ5U3RyaW5nO1xyXG4gICAgaWYgKGh1Yk5hbWVJbnB1dC5sZW5ndGggPj0gMSAmJiBodWJOYW1lSW5wdXQuY2hhckF0KDApID09IFwiP1wiKSBodWJOYW1lSW5wdXQgPSBodWJOYW1lSW5wdXQuc3Vic3RyaW5nKDEpO1xyXG5cclxuICAgIHRyeVxyXG4gICAge1xyXG4gICAgICAgIGxldCBkZWxldGVIdWJQYXJhbTogVlBOLlZwblJwY0RlbGV0ZUh1YiA9IG5ldyBWUE4uVnBuUnBjRGVsZXRlSHViKFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBIdWJOYW1lX3N0cjogaHViTmFtZUlucHV0LFxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgYXdhaXQgYXBpLkRlbGV0ZUh1YihkZWxldGVIdWJQYXJhbSk7XHJcblxyXG4gICAgICAgIGFsZXJ0KFwiVGhlIFZpcnR1YWwgSHViICdcIiArIGh1Yk5hbWVJbnB1dCArIFwiJyBpcyBkZWxldGVkLlwiKTtcclxuXHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBcIi4vXCI7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXgpXHJcbiAgICB7XHJcbiAgICAgICAgYWxlcnQoZXgpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gSHViQWRtaW5QYWdlKHF1ZXJ5U3RyaW5nOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+XHJcbntcclxuICAgIGxldCBodWJOYW1lSW5wdXQgPSBxdWVyeVN0cmluZztcclxuICAgIGlmIChodWJOYW1lSW5wdXQubGVuZ3RoID49IDEgJiYgaHViTmFtZUlucHV0LmNoYXJBdCgwKSA9PSBcIj9cIikgaHViTmFtZUlucHV0ID0gaHViTmFtZUlucHV0LnN1YnN0cmluZygxKTtcclxuXHJcbiAgICB0cnlcclxuICAgIHtcclxuICAgICAgICBsZXQgZ2V0SHViUGFyYW06IFZQTi5WcG5ScGNDcmVhdGVIdWIgPSBuZXcgVlBOLlZwblJwY0NyZWF0ZUh1YihcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgSHViTmFtZV9zdHI6IGh1Yk5hbWVJbnB1dCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IGh1YkluZm8gPSBhd2FpdCBhcGkuR2V0SHViKGdldEh1YlBhcmFtKTtcclxuXHJcbiAgICAgICAgJChcIiNIVUJfTkFNRVwiKS5hcHBlbmQoXCJWaXJ0dWFsIEh1YiBcXFwiXCIgKyBodWJJbmZvLkh1Yk5hbWVfc3RyICsgXCJcXFwiXCIpO1xyXG5cclxuICAgICAgICAvLyBVc2VyIGxpc3RcclxuICAgICAgICBsZXQgZW51bVVzZXJQYXJhbTogVlBOLlZwblJwY0VudW1Vc2VyID0gbmV3IFZQTi5WcG5ScGNFbnVtVXNlcihcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgSHViTmFtZV9zdHI6IGh1YkluZm8uSHViTmFtZV9zdHIsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCBlbnVtVXNlclJldCA9IGF3YWl0IGFwaS5FbnVtVXNlcihlbnVtVXNlclBhcmFtKTtcclxuXHJcbiAgICAgICAgbGV0IHVzZXJMaXN0SHRtbEl0ZW0gPSAkKFwiI1VTRVJTX0xJU1RcIik7XHJcblxyXG4gICAgICAgIGVudW1Vc2VyUmV0LlVzZXJMaXN0LmZvckVhY2godXNlciA9PlxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdXNlckxpc3RIdG1sSXRlbS5hcHBlbmQoXCI8bGk+PHN0cm9uZz5cIiArIHVzZXIuTmFtZV9zdHIgKyBcIjwvc3Ryb25nPjxCUj5cIiArIENvbmNhdEtleXNUb0h0bWwodXNlcikgKyBcIjwvbGk+XCIpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBTZXNzaW9ucyBsaXN0XHJcbiAgICAgICAgbGV0IGVudW1TZXNzaW9uUGFyYW06IFZQTi5WcG5ScGNFbnVtU2Vzc2lvbiA9IG5ldyBWUE4uVnBuUnBjRW51bVNlc3Npb24oXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIEh1Yk5hbWVfc3RyOiBodWJJbmZvLkh1Yk5hbWVfc3RyLFxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbGV0IGVudW1TZXNzaW9uc1JldCA9IGF3YWl0IGFwaS5FbnVtU2Vzc2lvbihlbnVtU2Vzc2lvblBhcmFtKTtcclxuXHJcbiAgICAgICAgbGV0IHNlc3Npb25MaXN0SHRtbEl0ZW0gPSAkKFwiI1NFU1NJT05TX0xJU1RcIik7XHJcblxyXG4gICAgICAgIGVudW1TZXNzaW9uc1JldC5TZXNzaW9uTGlzdC5mb3JFYWNoKHNlc3Npb24gPT5cclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHNlc3Npb25MaXN0SHRtbEl0ZW0uYXBwZW5kKFwiPGxpPjxzdHJvbmc+XCIgKyBzZXNzaW9uLk5hbWVfc3RyICsgXCI8L3N0cm9uZz48YnI+XCIgKyBDb25jYXRLZXlzVG9IdG1sKHNlc3Npb24pICsgXCI8L2xpPlwiKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGNhdGNoIChleClcclxuICAgIHtcclxuICAgICAgICBhbGVydChleCk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5cclxuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTs7Ozs7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUNBO0FBWkE7QUFjQTs7Ozs7O0FBRUE7QUFFQTtBQUVBOztBQUFBO0FBRUE7QUFFQTtBQUNBOzs7OztBQUNBO0FBWkE7QUFjQTs7Ozs7O0FBRUE7QUFDQTtBQUVBOztBQUFBO0FBRUE7O0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7Ozs7O0FBQ0E7QUFsQkE7QUFvQkE7Ozs7OztBQUVBO0FBRUE7QUFDQTtBQUNBOzs7O0FBSUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUFBO0FBRUE7QUFFQTs7OztBQUlBOzs7Ozs7QUFFQTtBQTNCQTtBQTZCQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7QUFFQTtBQUNBO0FBQUE7Ozs7QUFJQTtBQUVBO0FBQ0E7QUFFQTs7QUFBQTtBQUVBO0FBRUE7Ozs7QUFJQTs7Ozs7O0FBRUE7QUF0QkE7QUF3QkE7Ozs7OztBQUVBO0FBQ0E7QUFBQTs7OztBQUlBO0FBRUE7QUFDQTtBQUVBOztBQUFBO0FBRUE7QUFHQTtBQUVBO0FBQ0E7QUFFQTs7QUFBQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBRUE7O0FBQUE7QUFFQTtBQUVBO0FBRUE7QUFDQTs7OztBQUlBOzs7Ozs7QUFFQTtBQWxEQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/ts/main.ts\n");
+
+/***/ }),
+
+/***/ 0:
+/*!**********************!*\
+ !*** util (ignored) ***!
+ \**********************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("/* (ignored) *///# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTL3V0aWwgKGlnbm9yZWQpPzIyOWIiXSwic291cmNlc0NvbnRlbnQiOlsiLyogKGlnbm9yZWQpICovIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///0\n");
+
+/***/ }),
+
+/***/ 1:
+/*!**********************!*\
+ !*** util (ignored) ***!
+ \**********************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("/* (ignored) *///# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTL3V0aWwgKGlnbm9yZWQpPzc1NzEiXSwic291cmNlc0NvbnRlbnQiOlsiLyogKGlnbm9yZWQpICovIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1\n");
+
+/***/ })
+
+/******/ }); \ No newline at end of file
diff --git a/src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts b/src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts
new file mode 100644
index 00000000..df54aca4
--- /dev/null
+++ b/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 \ No newline at end of file
diff --git a/src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts.map b/src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts.map
new file mode 100644
index 00000000..1a58485e
--- /dev/null
+++ b/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"} \ No newline at end of file
diff --git a/src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts b/src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts
new file mode 100644
index 00000000..b598573a
--- /dev/null
+++ b/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 \ No newline at end of file
diff --git a/src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts.map b/src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts.map
new file mode 100644
index 00000000..7c8411cf
--- /dev/null
+++ b/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"} \ No newline at end of file
diff --git a/src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts b/src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts
new file mode 100644
index 00000000..f42ee525
--- /dev/null
+++ b/src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts
@@ -0,0 +1,2 @@
+export {};
+//# sourceMappingURL=vpnadmin.d.ts.map \ No newline at end of file
diff --git a/src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts.map b/src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts.map
new file mode 100644
index 00000000..470be6e1
--- /dev/null
+++ b/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":""} \ No newline at end of file
diff --git a/src/bin/hamcore/wwwroot/admin/default/package-lock.json b/src/bin/hamcore/wwwroot/admin/default/package-lock.json
new file mode 100644
index 00000000..1f10a1c2
--- /dev/null
+++ b/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"
+ }
+ }
+ }
+}
diff --git a/src/bin/hamcore/wwwroot/admin/default/package.json b/src/bin/hamcore/wwwroot/admin/default/package.json
new file mode 100644
index 00000000..feaf56c8
--- /dev/null
+++ b/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"
+ }
+}
diff --git a/src/bin/hamcore/wwwroot/admin/default/src/ts/main.ts b/src/bin/hamcore/wwwroot/admin/default/src/ts/main.ts
new file mode 100644
index 00000000..017c3501
--- /dev/null
+++ b/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);
+ }
+}
+
+
+
diff --git a/src/bin/hamcore/wwwroot/admin/default/theme.css b/src/bin/hamcore/wwwroot/admin/default/theme.css
new file mode 100644
index 00000000..4d238bc1
--- /dev/null
+++ b/src/bin/hamcore/wwwroot/admin/default/theme.css
@@ -0,0 +1,18 @@
+body {
+ padding-top: 70px;
+ padding-bottom: 30px;
+}
+
+.theme-dropdown .dropdown-menu {
+ position: static;
+ display: block;
+ margin-bottom: 20px;
+}
+
+.theme-showcase > p > .btn {
+ margin: 5px 0;
+}
+
+.theme-showcase .navbar .container {
+ width: auto;
+}
diff --git a/src/bin/hamcore/wwwroot/admin/default/tsconfig.json b/src/bin/hamcore/wwwroot/admin/default/tsconfig.json
new file mode 100644
index 00000000..dd886d71
--- /dev/null
+++ b/src/bin/hamcore/wwwroot/admin/default/tsconfig.json
@@ -0,0 +1,68 @@
+{
+ "compileOnSave": true,
+ "compilerOptions": {
+ "target": "ES3", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */
+ "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
+ // "lib": [], /* Specify library files to be included in the compilation. */
+ "lib": [
+ "dom",
+ "es2015.promise",
+ "es5"
+ ],
+ // "allowJs": true, /* Allow javascript files to be compiled. */
+ // "checkJs": true, /* Report errors in .js files. */
+ // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
+ "declaration": true, /* Generates corresponding '.d.ts' file. */
+ "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
+ "sourceMap": true, /* Generates corresponding '.map' file. */
+ // "outFile": "./", /* Concatenate and emit output to single file. */
+ // "outDir": "./", /* Redirect output structure to the directory. */
+ // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
+ // "composite": true, /* Enable project compilation */
+ // "removeComments": true, /* Do not emit comments to output. */
+ // "noEmit": true, /* Do not emit outputs. */
+ // "importHelpers": true, /* Import emit helpers from 'tslib'. */
+ // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
+ // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
+ /* Strict Type-Checking Options */
+ "strict": true, /* Enable all strict type-checking options. */
+ // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
+ // "strictNullChecks": true, /* Enable strict null checks. */
+ // "strictFunctionTypes": true, /* Enable strict checking of function types. */
+ // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
+ // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
+ // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
+ /* Additional Checks */
+ // "noUnusedLocals": true, /* Report errors on unused locals. */
+ // "noUnusedParameters": true, /* Report errors on unused parameters. */
+ // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
+ // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
+ /* Module Resolution Options */
+ // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
+ // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
+ // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
+ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
+ // "typeRoots": [], /* List of folders to include type definitions from. */
+ // "types": [], /* Type declaration files to be included in compilation. */
+ // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
+ "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
+ // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
+ /* Source Map Options */
+ // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
+ // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
+ // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
+ // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
+ /* Experimental Options */
+ // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
+ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
+ "watch": false,
+ "rootDir": "src/ts/",
+ "outDir": "out_transpiled_js/"
+ },
+ "include": [
+ "src/ts/**/*.ts"
+ ],
+ "exclude": [
+ "node_modules"
+ ]
+} \ No newline at end of file
diff --git a/src/bin/hamcore/wwwroot/admin/default/tsconfig_webpack.json b/src/bin/hamcore/wwwroot/admin/default/tsconfig_webpack.json
new file mode 100644
index 00000000..66d651e1
--- /dev/null
+++ b/src/bin/hamcore/wwwroot/admin/default/tsconfig_webpack.json
@@ -0,0 +1,68 @@
+{
+ "compileOnSave": true,
+ "compilerOptions": {
+ "target": "ES3", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */
+ "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
+ // "lib": [], /* Specify library files to be included in the compilation. */
+ "lib": [
+ "dom",
+ "es2015.promise",
+ "es5"
+ ],
+ // "allowJs": true, /* Allow javascript files to be compiled. */
+ // "checkJs": true, /* Report errors in .js files. */
+ // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
+ "declaration": true, /* Generates corresponding '.d.ts' file. */
+ "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
+ "sourceMap": true, /* Generates corresponding '.map' file. */
+ // "outFile": "./", /* Concatenate and emit output to single file. */
+ // "outDir": "./", /* Redirect output structure to the directory. */
+ // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
+ // "composite": true, /* Enable project compilation */
+ // "removeComments": true, /* Do not emit comments to output. */
+ // "noEmit": true, /* Do not emit outputs. */
+ // "importHelpers": true, /* Import emit helpers from 'tslib'. */
+ // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
+ // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
+ /* Strict Type-Checking Options */
+ "strict": true, /* Enable all strict type-checking options. */
+ // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
+ // "strictNullChecks": true, /* Enable strict null checks. */
+ // "strictFunctionTypes": true, /* Enable strict checking of function types. */
+ // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
+ // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
+ // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
+ /* Additional Checks */
+ // "noUnusedLocals": true, /* Report errors on unused locals. */
+ // "noUnusedParameters": true, /* Report errors on unused parameters. */
+ // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
+ // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
+ /* Module Resolution Options */
+ // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
+ // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
+ // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
+ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
+ // "typeRoots": [], /* List of folders to include type definitions from. */
+ // "types": [], /* Type declaration files to be included in compilation. */
+ // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
+ "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
+ // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
+ /* Source Map Options */
+ // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
+ // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
+ // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
+ // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
+ /* Experimental Options */
+ // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
+ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
+ "watch": false,
+ "rootDir": "src/",
+ "outDir": "out_webpack/"
+ },
+ "include": [
+ "src/ts/**/*.ts"
+ ],
+ "exclude": [
+ "node_modules"
+ ]
+} \ No newline at end of file
diff --git a/src/bin/hamcore/wwwroot/admin/default/tslint.json b/src/bin/hamcore/wwwroot/admin/default/tslint.json
new file mode 100644
index 00000000..65e800a7
--- /dev/null
+++ b/src/bin/hamcore/wwwroot/admin/default/tslint.json
@@ -0,0 +1,20 @@
+{
+ "defaultSeverity": "warn",
+ "extends": [
+ "tslint:recommended"
+ ],
+ "jsRules": {},
+ "rules": {
+ "comment-format": false,
+ "no-consecutive-blank-lines": false,
+ "no-trailing-whitespace": false,
+ "no-console": false,
+ "prefer-const": false,
+ "one-line": false,
+ "only-arrow-functions": false,
+ "space-before-function-paren": false,
+ "trailing-comma": false,
+ "no-empty": false,
+ },
+ "rulesDirectory": []
+} \ No newline at end of file
diff --git a/src/bin/hamcore/wwwroot/admin/default/webpack.config.js b/src/bin/hamcore/wwwroot/admin/default/webpack.config.js
new file mode 100644
index 00000000..e988fe5f
--- /dev/null
+++ b/src/bin/hamcore/wwwroot/admin/default/webpack.config.js
@@ -0,0 +1,38 @@
+const path = require('path');
+
+module.exports = {
+ mode: "development", // "production" | "development" | "none"
+
+ entry: "./src/ts/main.ts",
+ devtool: 'inline-source-map',
+
+ output: {
+ path: path.join(__dirname, "out_webpack"),
+ filename: "bundle.js",
+ libraryTarget: 'var',
+ library: 'JS'
+ },
+
+ module: {
+ rules: [{
+ test: /\.ts$/,
+ loader: "ts-loader",
+ options:
+ {
+ configFile: "tsconfig_webpack.json"
+ },
+ include: path.join(__dirname, "./src/ts/"),
+ exclude: /node_modules/
+ }]
+ },
+
+ resolve: {
+ modules: [
+ "node_modules",
+ ],
+ extensions: [
+ ".ts",
+ ".js"
+ ]
+ }
+};
diff --git a/src/bin/hamcore/wwwroot/admin/index.html b/src/bin/hamcore/wwwroot/admin/index.html
new file mode 100644
index 00000000..03d063dc
--- /dev/null
+++ b/src/bin/hamcore/wwwroot/admin/index.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="uft-8">
+<script>
+location.href = "/admin/default/";
+</script>
+<title>Redirecting</title>
+</head>
+<body>
+<h1>Redirecting</h1>
+<p>Redirecting...<br>
+<p><a href="/admin/default/">Click here</a></p>
+</body>
+</html>
diff --git a/src/bin/hamcore/wwwroot/index.html b/src/bin/hamcore/wwwroot/index.html
new file mode 100644
index 00000000..8faeb33b
--- /dev/null
+++ b/src/bin/hamcore/wwwroot/index.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<!-- 9C37197CA7C2428388C2E6E59B829B30 -->
+
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+<title>SoftEther VPN Server</title>
+</head>
+
+<body>
+
+<h1>SoftEther VPN Server / Bridge</h1>
+<p>For VPN users:</p>
+<ul>
+ <li>Connect to this VPN Server<ul>
+ <li>by <a href="https://www.softether-download.com/">Official SoftEther VPN
+ Client (download)</a></li>
+ <li>by <a href="https://www.softether.org/">L2TP/IPsec, OpenVPN or SSTP
+ traditional clients</a></li>
+ </ul>
+ </li>
+</ul>
+<p>For VPN administrators:</p>
+<ul>
+ <li>Manage this VPN Server or VPN Bridge<ul>
+ <li>by <a href="https://www.softether-download.com/">SoftEther VPN
+ Server Manager GUI for Windows / macOS (download)</a> (Recommended)</li>
+ <li>by <a href="https://www.google.com/search?q=vpncmd">SoftEther VPN
+ Command Line Management Utility (vpncmd)</a> for CUI</li>
+ <li>by <a href="/api/">JSON-RPC API</a> from your favorite programming
+ language (JavaScript, TypeScript, Java, Python, Ruby, C#, ... etc.)<br />
+ (ID: &#39;administrator&#39;, Password: same to the VPN Server&#39;s password.
+ Default: empty)</li>
+ <li>by <a href="/admin/">Built-in HTML5 Web Administration Console</a>
+ (New, under construction)<br />
+ (ID: &#39;administrator&#39;, Password: same to the VPN Server&#39;s password.
+ Default: empty)<br />
+ <br />
+ </li>
+ </ul>
+ </li>
+ <li>If you want to disable this embedded web server and JSON-RPC server:<ol>
+ <li>Stop the daemon.</li>
+ <li>Modify the value of <strong>&quot;bool DisableJsonRpcWebApi&quot;</strong>
+ from <strong>&quot;false&quot;</strong> to <strong>&quot;true&quot;</strong> on the
+ vpn_server.config or vpn_bridge.config.</li>
+ <li>Restart the daemon.</li>
+ </ol>
+ </li>
+</ul>
+
+<p>&nbsp;</p>
+
+</body>
+
+</html>
diff --git a/src/bin/vpnweb.cab b/src/bin/vpnweb.cab
index 73ed0f0d..473b1855 100644
--- a/src/bin/vpnweb.cab
+++ b/src/bin/vpnweb.cab
Binary files differ
diff --git a/src/bin/vpnweb.ocx b/src/bin/vpnweb.ocx
index 0fcb2488..6484ad0b 100644
--- a/src/bin/vpnweb.ocx
+++ b/src/bin/vpnweb.ocx
Binary files differ
diff --git a/src/makefiles/freebsd_32bit.mak b/src/makefiles/freebsd_32bit.mak
index 4a2c8d70..8dbf6ea3 100644
--- a/src/makefiles/freebsd_32bit.mak
+++ b/src/makefiles/freebsd_32bit.mak
@@ -89,7 +89,7 @@ HEADERS_MAYAQUA=src/Mayaqua/Cfg.h src/Mayaqua/cryptoki.h src/Mayaqua/Encrypt.h s
HEADERS_CEDAR=src/Cedar/Account.h src/Cedar/Admin.h src/Cedar/AzureClient.h src/Cedar/AzureServer.h src/Cedar/Bridge.h src/Cedar/BridgeUnix.h src/Cedar/BridgeWin32.h src/Cedar/Cedar.h src/Cedar/CedarPch.h src/Cedar/CedarType.h src/Cedar/Client.h src/Cedar/CM.h src/Cedar/CMInner.h src/Cedar/Command.h src/Cedar/Connection.h src/Cedar/Console.h src/Cedar/Database.h src/Cedar/DDNS.h src/Cedar/EM.h src/Cedar/EMInner.h src/Cedar/EtherLog.h src/Cedar/Hub.h src/Cedar/Interop_OpenVPN.h src/Cedar/Interop_SSTP.h src/Cedar/IPsec.h src/Cedar/IPsec_EtherIP.h src/Cedar/IPsec_IKE.h src/Cedar/IPsec_IkePacket.h src/Cedar/IPsec_IPC.h src/Cedar/IPsec_L2TP.h src/Cedar/IPsec_PPP.h src/Cedar/IPsec_Win7.h src/Cedar/IPsec_Win7Inner.h src/Cedar/Layer3.h src/Cedar/Link.h src/Cedar/Listener.h src/Cedar/Logging.h src/Cedar/Nat.h src/Cedar/NativeStack.h src/Cedar/netcfgn.h src/Cedar/netcfgx.h src/Cedar/NM.h src/Cedar/NMInner.h src/Cedar/NullLan.h src/Cedar/Protocol.h src/Cedar/Radius.h src/Cedar/Remote.h src/Cedar/Sam.h src/Cedar/SecureInfo.h src/Cedar/SecureNAT.h src/Cedar/SeLowUser.h src/Cedar/Server.h src/Cedar/Session.h src/Cedar/SM.h src/Cedar/SMInner.h src/Cedar/SW.h src/Cedar/SWInner.h src/Cedar/UdpAccel.h src/Cedar/UT.h src/Cedar/VG.h src/Cedar/Virtual.h src/Cedar/VLan.h src/Cedar/VLanUnix.h src/Cedar/VLanWin32.h src/Cedar/WaterMark.h src/Cedar/WebUI.h src/Cedar/Win32Com.h src/Cedar/winpcap/bittypes.h src/Cedar/winpcap/bucket_lookup.h src/Cedar/winpcap/count_packets.h src/Cedar/winpcap/Devioctl.h src/Cedar/winpcap/Gnuc.h src/Cedar/winpcap/ip6_misc.h src/Cedar/winpcap/memory_t.h src/Cedar/winpcap/normal_lookup.h src/Cedar/winpcap/Ntddndis.h src/Cedar/winpcap/Ntddpack.h src/Cedar/winpcap/Packet32.h src/Cedar/winpcap/pcap.h src/Cedar/winpcap/pcap-bpf.h src/Cedar/winpcap/pcap-int.h src/Cedar/winpcap/pcap-stdinc.h src/Cedar/winpcap/pthread.h src/Cedar/winpcap/remote-ext.h src/Cedar/winpcap/sched.h src/Cedar/winpcap/semaphore.h src/Cedar/winpcap/tcp_session.h src/Cedar/winpcap/time_calls.h src/Cedar/winpcap/tme.h src/Cedar/winpcap/Win32-Extensions.h src/Cedar/WinUi.h src/Cedar/Wpc.h
OBJECTS_MAYAQUA=tmp/objs/Mayaqua/Cfg.o tmp/objs/Mayaqua/Encrypt.o tmp/objs/Mayaqua/FileIO.o tmp/objs/Mayaqua/Internat.o tmp/objs/Mayaqua/Kernel.o tmp/objs/Mayaqua/Mayaqua.o tmp/objs/Mayaqua/Memory.o tmp/objs/Mayaqua/Microsoft.o tmp/objs/Mayaqua/Network.o tmp/objs/Mayaqua/Object.o tmp/objs/Mayaqua/OS.o tmp/objs/Mayaqua/Pack.o tmp/objs/Mayaqua/Secure.o tmp/objs/Mayaqua/Str.o tmp/objs/Mayaqua/Table.o tmp/objs/Mayaqua/TcpIp.o tmp/objs/Mayaqua/Tick64.o tmp/objs/Mayaqua/Tracking.o tmp/objs/Mayaqua/Unix.o tmp/objs/Mayaqua/Win32.o
OBJECTS_CEDAR=tmp/objs/Cedar/Account.o tmp/objs/Cedar/Admin.o tmp/objs/Cedar/AzureClient.o tmp/objs/Cedar/AzureServer.o tmp/objs/Cedar/Bridge.o tmp/objs/Cedar/BridgeUnix.o tmp/objs/Cedar/BridgeWin32.o tmp/objs/Cedar/Cedar.o tmp/objs/Cedar/CedarPch.o tmp/objs/Cedar/Client.o tmp/objs/Cedar/CM.o tmp/objs/Cedar/Command.o tmp/objs/Cedar/Connection.o tmp/objs/Cedar/Console.o tmp/objs/Cedar/Database.o tmp/objs/Cedar/DDNS.o tmp/objs/Cedar/EM.o tmp/objs/Cedar/EtherLog.o tmp/objs/Cedar/Hub.o tmp/objs/Cedar/Interop_OpenVPN.o tmp/objs/Cedar/Interop_SSTP.o tmp/objs/Cedar/IPsec.o tmp/objs/Cedar/IPsec_EtherIP.o tmp/objs/Cedar/IPsec_IKE.o tmp/objs/Cedar/IPsec_IkePacket.o tmp/objs/Cedar/IPsec_IPC.o tmp/objs/Cedar/IPsec_L2TP.o tmp/objs/Cedar/IPsec_PPP.o tmp/objs/Cedar/IPsec_Win7.o tmp/objs/Cedar/Layer3.o tmp/objs/Cedar/Link.o tmp/objs/Cedar/Listener.o tmp/objs/Cedar/Logging.o tmp/objs/Cedar/Nat.o tmp/objs/Cedar/NativeStack.o tmp/objs/Cedar/NM.o tmp/objs/Cedar/NullLan.o tmp/objs/Cedar/Protocol.o tmp/objs/Cedar/Radius.o tmp/objs/Cedar/Remote.o tmp/objs/Cedar/Sam.o tmp/objs/Cedar/SecureInfo.o tmp/objs/Cedar/SecureNAT.o tmp/objs/Cedar/SeLowUser.o tmp/objs/Cedar/Server.o tmp/objs/Cedar/Session.o tmp/objs/Cedar/SM.o tmp/objs/Cedar/SW.o tmp/objs/Cedar/UdpAccel.o tmp/objs/Cedar/UT.o tmp/objs/Cedar/VG.o tmp/objs/Cedar/Virtual.o tmp/objs/Cedar/VLan.o tmp/objs/Cedar/VLanUnix.o tmp/objs/Cedar/VLanWin32.o tmp/objs/Cedar/WaterMark.o tmp/objs/Cedar/WebUI.o tmp/objs/Cedar/WinUi.o tmp/objs/Cedar/Wpc.o
-HAMCORE_FILES=src/bin/hamcore/authors.txt src/bin/hamcore/backup_dir_readme.txt src/bin/hamcore/empty.config src/bin/hamcore/empty_sevpnclient.config src/bin/hamcore/eula.txt src/bin/hamcore/install_src.dat src/bin/hamcore/lang.config src/bin/hamcore/languages.txt src/bin/hamcore/languages_wine.txt src/bin/hamcore/legal.txt src/bin/hamcore/openvpn_readme.pdf src/bin/hamcore/openvpn_readme.txt src/bin/hamcore/openvpn_sample.ovpn src/bin/hamcore/root_certs.dat src/bin/hamcore/SOURCES_OF_BINARY_FILES.TXT src/bin/hamcore/strtable_cn.stb src/bin/hamcore/strtable_en.stb src/bin/hamcore/strtable_ja.stb src/bin/hamcore/vpnweb_sample_cn.htm src/bin/hamcore/vpnweb_sample_en.htm src/bin/hamcore/vpnweb_sample_ja.htm src/bin/hamcore/warning_cn.txt src/bin/hamcore/warning_en.txt src/bin/hamcore/warning_ja.txt src/bin/hamcore/webui/cryptcom.cgi src/bin/hamcore/webui/edituser.cgi src/bin/hamcore/webui/error.cgi src/bin/hamcore/webui/hub.cgi src/bin/hamcore/webui/license.cgi src/bin/hamcore/webui/listener.cgi src/bin/hamcore/webui/localbridge.cgi src/bin/hamcore/webui/login.cgi src/bin/hamcore/webui/newhub.cgi src/bin/hamcore/webui/redirect.cgi src/bin/hamcore/webui/securenat.cgi src/bin/hamcore/webui/server.cgi src/bin/hamcore/webui/session.cgi src/bin/hamcore/webui/user.cgi src/bin/hamcore/webui/webui.css
+HAMCORE_FILES=src/bin/hamcore/authors.txt src/bin/hamcore/backup_dir_readme.txt src/bin/hamcore/empty.config src/bin/hamcore/empty_sevpnclient.config src/bin/hamcore/eula.txt src/bin/hamcore/install_src.dat src/bin/hamcore/languages.txt src/bin/hamcore/languages_wine.txt src/bin/hamcore/legal.txt src/bin/hamcore/openvpn_readme.pdf src/bin/hamcore/openvpn_readme.txt src/bin/hamcore/openvpn_sample.ovpn src/bin/hamcore/root_certs.dat src/bin/hamcore/SOURCES_OF_BINARY_FILES.TXT src/bin/hamcore/strtable_cn.stb src/bin/hamcore/strtable_en.stb src/bin/hamcore/strtable_ja.stb src/bin/hamcore/vpnserver_api_doc.html src/bin/hamcore/vpnweb_sample_cn.htm src/bin/hamcore/vpnweb_sample_en.htm src/bin/hamcore/vpnweb_sample_ja.htm src/bin/hamcore/warning_cn.txt src/bin/hamcore/warning_en.txt src/bin/hamcore/warning_ja.txt src/bin/hamcore/webui/cryptcom.cgi src/bin/hamcore/webui/edituser.cgi src/bin/hamcore/webui/error.cgi src/bin/hamcore/webui/hub.cgi src/bin/hamcore/webui/license.cgi src/bin/hamcore/webui/listener.cgi src/bin/hamcore/webui/localbridge.cgi src/bin/hamcore/webui/login.cgi src/bin/hamcore/webui/newhub.cgi src/bin/hamcore/webui/redirect.cgi src/bin/hamcore/webui/securenat.cgi src/bin/hamcore/webui/server.cgi src/bin/hamcore/webui/session.cgi src/bin/hamcore/webui/user.cgi src/bin/hamcore/webui/webui.css src/bin/hamcore/wwwroot/admin/default/.gitignore src/bin/hamcore/wwwroot/admin/default/.vscode/launch.json src/bin/hamcore/wwwroot/admin/default/.vscode/settings.json src/bin/hamcore/wwwroot/admin/default/.vscode/tasks.json src/bin/hamcore/wwwroot/admin/default/hub.html src/bin/hamcore/wwwroot/admin/default/include_footer.html src/bin/hamcore/wwwroot/admin/default/include_head.html src/bin/hamcore/wwwroot/admin/default/include_menu.html src/bin/hamcore/wwwroot/admin/default/index.html src/bin/hamcore/wwwroot/admin/default/out_webpack/bundle.js src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts.map src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts.map src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts.map src/bin/hamcore/wwwroot/admin/default/package.json src/bin/hamcore/wwwroot/admin/default/package-lock.json src/bin/hamcore/wwwroot/admin/default/src/ts/main.ts src/bin/hamcore/wwwroot/admin/default/theme.css src/bin/hamcore/wwwroot/admin/default/tsconfig.json src/bin/hamcore/wwwroot/admin/default/tsconfig_webpack.json src/bin/hamcore/wwwroot/admin/default/tslint.json src/bin/hamcore/wwwroot/admin/default/webpack.config.js src/bin/hamcore/wwwroot/admin/index.html src/bin/hamcore/wwwroot/admin/README.md src/bin/hamcore/wwwroot/index.html
# Build Action
default: build
diff --git a/src/makefiles/freebsd_64bit.mak b/src/makefiles/freebsd_64bit.mak
index 8819752e..5180f457 100644
--- a/src/makefiles/freebsd_64bit.mak
+++ b/src/makefiles/freebsd_64bit.mak
@@ -89,7 +89,7 @@ HEADERS_MAYAQUA=src/Mayaqua/Cfg.h src/Mayaqua/cryptoki.h src/Mayaqua/Encrypt.h s
HEADERS_CEDAR=src/Cedar/Account.h src/Cedar/Admin.h src/Cedar/AzureClient.h src/Cedar/AzureServer.h src/Cedar/Bridge.h src/Cedar/BridgeUnix.h src/Cedar/BridgeWin32.h src/Cedar/Cedar.h src/Cedar/CedarPch.h src/Cedar/CedarType.h src/Cedar/Client.h src/Cedar/CM.h src/Cedar/CMInner.h src/Cedar/Command.h src/Cedar/Connection.h src/Cedar/Console.h src/Cedar/Database.h src/Cedar/DDNS.h src/Cedar/EM.h src/Cedar/EMInner.h src/Cedar/EtherLog.h src/Cedar/Hub.h src/Cedar/Interop_OpenVPN.h src/Cedar/Interop_SSTP.h src/Cedar/IPsec.h src/Cedar/IPsec_EtherIP.h src/Cedar/IPsec_IKE.h src/Cedar/IPsec_IkePacket.h src/Cedar/IPsec_IPC.h src/Cedar/IPsec_L2TP.h src/Cedar/IPsec_PPP.h src/Cedar/IPsec_Win7.h src/Cedar/IPsec_Win7Inner.h src/Cedar/Layer3.h src/Cedar/Link.h src/Cedar/Listener.h src/Cedar/Logging.h src/Cedar/Nat.h src/Cedar/NativeStack.h src/Cedar/netcfgn.h src/Cedar/netcfgx.h src/Cedar/NM.h src/Cedar/NMInner.h src/Cedar/NullLan.h src/Cedar/Protocol.h src/Cedar/Radius.h src/Cedar/Remote.h src/Cedar/Sam.h src/Cedar/SecureInfo.h src/Cedar/SecureNAT.h src/Cedar/SeLowUser.h src/Cedar/Server.h src/Cedar/Session.h src/Cedar/SM.h src/Cedar/SMInner.h src/Cedar/SW.h src/Cedar/SWInner.h src/Cedar/UdpAccel.h src/Cedar/UT.h src/Cedar/VG.h src/Cedar/Virtual.h src/Cedar/VLan.h src/Cedar/VLanUnix.h src/Cedar/VLanWin32.h src/Cedar/WaterMark.h src/Cedar/WebUI.h src/Cedar/Win32Com.h src/Cedar/winpcap/bittypes.h src/Cedar/winpcap/bucket_lookup.h src/Cedar/winpcap/count_packets.h src/Cedar/winpcap/Devioctl.h src/Cedar/winpcap/Gnuc.h src/Cedar/winpcap/ip6_misc.h src/Cedar/winpcap/memory_t.h src/Cedar/winpcap/normal_lookup.h src/Cedar/winpcap/Ntddndis.h src/Cedar/winpcap/Ntddpack.h src/Cedar/winpcap/Packet32.h src/Cedar/winpcap/pcap.h src/Cedar/winpcap/pcap-bpf.h src/Cedar/winpcap/pcap-int.h src/Cedar/winpcap/pcap-stdinc.h src/Cedar/winpcap/pthread.h src/Cedar/winpcap/remote-ext.h src/Cedar/winpcap/sched.h src/Cedar/winpcap/semaphore.h src/Cedar/winpcap/tcp_session.h src/Cedar/winpcap/time_calls.h src/Cedar/winpcap/tme.h src/Cedar/winpcap/Win32-Extensions.h src/Cedar/WinUi.h src/Cedar/Wpc.h
OBJECTS_MAYAQUA=tmp/objs/Mayaqua/Cfg.o tmp/objs/Mayaqua/Encrypt.o tmp/objs/Mayaqua/FileIO.o tmp/objs/Mayaqua/Internat.o tmp/objs/Mayaqua/Kernel.o tmp/objs/Mayaqua/Mayaqua.o tmp/objs/Mayaqua/Memory.o tmp/objs/Mayaqua/Microsoft.o tmp/objs/Mayaqua/Network.o tmp/objs/Mayaqua/Object.o tmp/objs/Mayaqua/OS.o tmp/objs/Mayaqua/Pack.o tmp/objs/Mayaqua/Secure.o tmp/objs/Mayaqua/Str.o tmp/objs/Mayaqua/Table.o tmp/objs/Mayaqua/TcpIp.o tmp/objs/Mayaqua/Tick64.o tmp/objs/Mayaqua/Tracking.o tmp/objs/Mayaqua/Unix.o tmp/objs/Mayaqua/Win32.o
OBJECTS_CEDAR=tmp/objs/Cedar/Account.o tmp/objs/Cedar/Admin.o tmp/objs/Cedar/AzureClient.o tmp/objs/Cedar/AzureServer.o tmp/objs/Cedar/Bridge.o tmp/objs/Cedar/BridgeUnix.o tmp/objs/Cedar/BridgeWin32.o tmp/objs/Cedar/Cedar.o tmp/objs/Cedar/CedarPch.o tmp/objs/Cedar/Client.o tmp/objs/Cedar/CM.o tmp/objs/Cedar/Command.o tmp/objs/Cedar/Connection.o tmp/objs/Cedar/Console.o tmp/objs/Cedar/Database.o tmp/objs/Cedar/DDNS.o tmp/objs/Cedar/EM.o tmp/objs/Cedar/EtherLog.o tmp/objs/Cedar/Hub.o tmp/objs/Cedar/Interop_OpenVPN.o tmp/objs/Cedar/Interop_SSTP.o tmp/objs/Cedar/IPsec.o tmp/objs/Cedar/IPsec_EtherIP.o tmp/objs/Cedar/IPsec_IKE.o tmp/objs/Cedar/IPsec_IkePacket.o tmp/objs/Cedar/IPsec_IPC.o tmp/objs/Cedar/IPsec_L2TP.o tmp/objs/Cedar/IPsec_PPP.o tmp/objs/Cedar/IPsec_Win7.o tmp/objs/Cedar/Layer3.o tmp/objs/Cedar/Link.o tmp/objs/Cedar/Listener.o tmp/objs/Cedar/Logging.o tmp/objs/Cedar/Nat.o tmp/objs/Cedar/NativeStack.o tmp/objs/Cedar/NM.o tmp/objs/Cedar/NullLan.o tmp/objs/Cedar/Protocol.o tmp/objs/Cedar/Radius.o tmp/objs/Cedar/Remote.o tmp/objs/Cedar/Sam.o tmp/objs/Cedar/SecureInfo.o tmp/objs/Cedar/SecureNAT.o tmp/objs/Cedar/SeLowUser.o tmp/objs/Cedar/Server.o tmp/objs/Cedar/Session.o tmp/objs/Cedar/SM.o tmp/objs/Cedar/SW.o tmp/objs/Cedar/UdpAccel.o tmp/objs/Cedar/UT.o tmp/objs/Cedar/VG.o tmp/objs/Cedar/Virtual.o tmp/objs/Cedar/VLan.o tmp/objs/Cedar/VLanUnix.o tmp/objs/Cedar/VLanWin32.o tmp/objs/Cedar/WaterMark.o tmp/objs/Cedar/WebUI.o tmp/objs/Cedar/WinUi.o tmp/objs/Cedar/Wpc.o
-HAMCORE_FILES=src/bin/hamcore/authors.txt src/bin/hamcore/backup_dir_readme.txt src/bin/hamcore/empty.config src/bin/hamcore/empty_sevpnclient.config src/bin/hamcore/eula.txt src/bin/hamcore/install_src.dat src/bin/hamcore/lang.config src/bin/hamcore/languages.txt src/bin/hamcore/languages_wine.txt src/bin/hamcore/legal.txt src/bin/hamcore/openvpn_readme.pdf src/bin/hamcore/openvpn_readme.txt src/bin/hamcore/openvpn_sample.ovpn src/bin/hamcore/root_certs.dat src/bin/hamcore/SOURCES_OF_BINARY_FILES.TXT src/bin/hamcore/strtable_cn.stb src/bin/hamcore/strtable_en.stb src/bin/hamcore/strtable_ja.stb src/bin/hamcore/vpnweb_sample_cn.htm src/bin/hamcore/vpnweb_sample_en.htm src/bin/hamcore/vpnweb_sample_ja.htm src/bin/hamcore/warning_cn.txt src/bin/hamcore/warning_en.txt src/bin/hamcore/warning_ja.txt src/bin/hamcore/webui/cryptcom.cgi src/bin/hamcore/webui/edituser.cgi src/bin/hamcore/webui/error.cgi src/bin/hamcore/webui/hub.cgi src/bin/hamcore/webui/license.cgi src/bin/hamcore/webui/listener.cgi src/bin/hamcore/webui/localbridge.cgi src/bin/hamcore/webui/login.cgi src/bin/hamcore/webui/newhub.cgi src/bin/hamcore/webui/redirect.cgi src/bin/hamcore/webui/securenat.cgi src/bin/hamcore/webui/server.cgi src/bin/hamcore/webui/session.cgi src/bin/hamcore/webui/user.cgi src/bin/hamcore/webui/webui.css
+HAMCORE_FILES=src/bin/hamcore/authors.txt src/bin/hamcore/backup_dir_readme.txt src/bin/hamcore/empty.config src/bin/hamcore/empty_sevpnclient.config src/bin/hamcore/eula.txt src/bin/hamcore/install_src.dat src/bin/hamcore/languages.txt src/bin/hamcore/languages_wine.txt src/bin/hamcore/legal.txt src/bin/hamcore/openvpn_readme.pdf src/bin/hamcore/openvpn_readme.txt src/bin/hamcore/openvpn_sample.ovpn src/bin/hamcore/root_certs.dat src/bin/hamcore/SOURCES_OF_BINARY_FILES.TXT src/bin/hamcore/strtable_cn.stb src/bin/hamcore/strtable_en.stb src/bin/hamcore/strtable_ja.stb src/bin/hamcore/vpnserver_api_doc.html src/bin/hamcore/vpnweb_sample_cn.htm src/bin/hamcore/vpnweb_sample_en.htm src/bin/hamcore/vpnweb_sample_ja.htm src/bin/hamcore/warning_cn.txt src/bin/hamcore/warning_en.txt src/bin/hamcore/warning_ja.txt src/bin/hamcore/webui/cryptcom.cgi src/bin/hamcore/webui/edituser.cgi src/bin/hamcore/webui/error.cgi src/bin/hamcore/webui/hub.cgi src/bin/hamcore/webui/license.cgi src/bin/hamcore/webui/listener.cgi src/bin/hamcore/webui/localbridge.cgi src/bin/hamcore/webui/login.cgi src/bin/hamcore/webui/newhub.cgi src/bin/hamcore/webui/redirect.cgi src/bin/hamcore/webui/securenat.cgi src/bin/hamcore/webui/server.cgi src/bin/hamcore/webui/session.cgi src/bin/hamcore/webui/user.cgi src/bin/hamcore/webui/webui.css src/bin/hamcore/wwwroot/admin/default/.gitignore src/bin/hamcore/wwwroot/admin/default/.vscode/launch.json src/bin/hamcore/wwwroot/admin/default/.vscode/settings.json src/bin/hamcore/wwwroot/admin/default/.vscode/tasks.json src/bin/hamcore/wwwroot/admin/default/hub.html src/bin/hamcore/wwwroot/admin/default/include_footer.html src/bin/hamcore/wwwroot/admin/default/include_head.html src/bin/hamcore/wwwroot/admin/default/include_menu.html src/bin/hamcore/wwwroot/admin/default/index.html src/bin/hamcore/wwwroot/admin/default/out_webpack/bundle.js src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts.map src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts.map src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts.map src/bin/hamcore/wwwroot/admin/default/package.json src/bin/hamcore/wwwroot/admin/default/package-lock.json src/bin/hamcore/wwwroot/admin/default/src/ts/main.ts src/bin/hamcore/wwwroot/admin/default/theme.css src/bin/hamcore/wwwroot/admin/default/tsconfig.json src/bin/hamcore/wwwroot/admin/default/tsconfig_webpack.json src/bin/hamcore/wwwroot/admin/default/tslint.json src/bin/hamcore/wwwroot/admin/default/webpack.config.js src/bin/hamcore/wwwroot/admin/index.html src/bin/hamcore/wwwroot/admin/README.md src/bin/hamcore/wwwroot/index.html
# Build Action
default: build
diff --git a/src/makefiles/linux_32bit.mak b/src/makefiles/linux_32bit.mak
index 385bcab8..b4f2ab06 100644
--- a/src/makefiles/linux_32bit.mak
+++ b/src/makefiles/linux_32bit.mak
@@ -89,7 +89,7 @@ HEADERS_MAYAQUA=src/Mayaqua/Cfg.h src/Mayaqua/cryptoki.h src/Mayaqua/Encrypt.h s
HEADERS_CEDAR=src/Cedar/Account.h src/Cedar/Admin.h src/Cedar/AzureClient.h src/Cedar/AzureServer.h src/Cedar/Bridge.h src/Cedar/BridgeUnix.h src/Cedar/BridgeWin32.h src/Cedar/Cedar.h src/Cedar/CedarPch.h src/Cedar/CedarType.h src/Cedar/Client.h src/Cedar/CM.h src/Cedar/CMInner.h src/Cedar/Command.h src/Cedar/Connection.h src/Cedar/Console.h src/Cedar/Database.h src/Cedar/DDNS.h src/Cedar/EM.h src/Cedar/EMInner.h src/Cedar/EtherLog.h src/Cedar/Hub.h src/Cedar/Interop_OpenVPN.h src/Cedar/Interop_SSTP.h src/Cedar/IPsec.h src/Cedar/IPsec_EtherIP.h src/Cedar/IPsec_IKE.h src/Cedar/IPsec_IkePacket.h src/Cedar/IPsec_IPC.h src/Cedar/IPsec_L2TP.h src/Cedar/IPsec_PPP.h src/Cedar/IPsec_Win7.h src/Cedar/IPsec_Win7Inner.h src/Cedar/Layer3.h src/Cedar/Link.h src/Cedar/Listener.h src/Cedar/Logging.h src/Cedar/Nat.h src/Cedar/NativeStack.h src/Cedar/netcfgn.h src/Cedar/netcfgx.h src/Cedar/NM.h src/Cedar/NMInner.h src/Cedar/NullLan.h src/Cedar/Protocol.h src/Cedar/Radius.h src/Cedar/Remote.h src/Cedar/Sam.h src/Cedar/SecureInfo.h src/Cedar/SecureNAT.h src/Cedar/SeLowUser.h src/Cedar/Server.h src/Cedar/Session.h src/Cedar/SM.h src/Cedar/SMInner.h src/Cedar/SW.h src/Cedar/SWInner.h src/Cedar/UdpAccel.h src/Cedar/UT.h src/Cedar/VG.h src/Cedar/Virtual.h src/Cedar/VLan.h src/Cedar/VLanUnix.h src/Cedar/VLanWin32.h src/Cedar/WaterMark.h src/Cedar/WebUI.h src/Cedar/Win32Com.h src/Cedar/winpcap/bittypes.h src/Cedar/winpcap/bucket_lookup.h src/Cedar/winpcap/count_packets.h src/Cedar/winpcap/Devioctl.h src/Cedar/winpcap/Gnuc.h src/Cedar/winpcap/ip6_misc.h src/Cedar/winpcap/memory_t.h src/Cedar/winpcap/normal_lookup.h src/Cedar/winpcap/Ntddndis.h src/Cedar/winpcap/Ntddpack.h src/Cedar/winpcap/Packet32.h src/Cedar/winpcap/pcap.h src/Cedar/winpcap/pcap-bpf.h src/Cedar/winpcap/pcap-int.h src/Cedar/winpcap/pcap-stdinc.h src/Cedar/winpcap/pthread.h src/Cedar/winpcap/remote-ext.h src/Cedar/winpcap/sched.h src/Cedar/winpcap/semaphore.h src/Cedar/winpcap/tcp_session.h src/Cedar/winpcap/time_calls.h src/Cedar/winpcap/tme.h src/Cedar/winpcap/Win32-Extensions.h src/Cedar/WinUi.h src/Cedar/Wpc.h
OBJECTS_MAYAQUA=tmp/objs/Mayaqua/Cfg.o tmp/objs/Mayaqua/Encrypt.o tmp/objs/Mayaqua/FileIO.o tmp/objs/Mayaqua/Internat.o tmp/objs/Mayaqua/Kernel.o tmp/objs/Mayaqua/Mayaqua.o tmp/objs/Mayaqua/Memory.o tmp/objs/Mayaqua/Microsoft.o tmp/objs/Mayaqua/Network.o tmp/objs/Mayaqua/Object.o tmp/objs/Mayaqua/OS.o tmp/objs/Mayaqua/Pack.o tmp/objs/Mayaqua/Secure.o tmp/objs/Mayaqua/Str.o tmp/objs/Mayaqua/Table.o tmp/objs/Mayaqua/TcpIp.o tmp/objs/Mayaqua/Tick64.o tmp/objs/Mayaqua/Tracking.o tmp/objs/Mayaqua/Unix.o tmp/objs/Mayaqua/Win32.o
OBJECTS_CEDAR=tmp/objs/Cedar/Account.o tmp/objs/Cedar/Admin.o tmp/objs/Cedar/AzureClient.o tmp/objs/Cedar/AzureServer.o tmp/objs/Cedar/Bridge.o tmp/objs/Cedar/BridgeUnix.o tmp/objs/Cedar/BridgeWin32.o tmp/objs/Cedar/Cedar.o tmp/objs/Cedar/CedarPch.o tmp/objs/Cedar/Client.o tmp/objs/Cedar/CM.o tmp/objs/Cedar/Command.o tmp/objs/Cedar/Connection.o tmp/objs/Cedar/Console.o tmp/objs/Cedar/Database.o tmp/objs/Cedar/DDNS.o tmp/objs/Cedar/EM.o tmp/objs/Cedar/EtherLog.o tmp/objs/Cedar/Hub.o tmp/objs/Cedar/Interop_OpenVPN.o tmp/objs/Cedar/Interop_SSTP.o tmp/objs/Cedar/IPsec.o tmp/objs/Cedar/IPsec_EtherIP.o tmp/objs/Cedar/IPsec_IKE.o tmp/objs/Cedar/IPsec_IkePacket.o tmp/objs/Cedar/IPsec_IPC.o tmp/objs/Cedar/IPsec_L2TP.o tmp/objs/Cedar/IPsec_PPP.o tmp/objs/Cedar/IPsec_Win7.o tmp/objs/Cedar/Layer3.o tmp/objs/Cedar/Link.o tmp/objs/Cedar/Listener.o tmp/objs/Cedar/Logging.o tmp/objs/Cedar/Nat.o tmp/objs/Cedar/NativeStack.o tmp/objs/Cedar/NM.o tmp/objs/Cedar/NullLan.o tmp/objs/Cedar/Protocol.o tmp/objs/Cedar/Radius.o tmp/objs/Cedar/Remote.o tmp/objs/Cedar/Sam.o tmp/objs/Cedar/SecureInfo.o tmp/objs/Cedar/SecureNAT.o tmp/objs/Cedar/SeLowUser.o tmp/objs/Cedar/Server.o tmp/objs/Cedar/Session.o tmp/objs/Cedar/SM.o tmp/objs/Cedar/SW.o tmp/objs/Cedar/UdpAccel.o tmp/objs/Cedar/UT.o tmp/objs/Cedar/VG.o tmp/objs/Cedar/Virtual.o tmp/objs/Cedar/VLan.o tmp/objs/Cedar/VLanUnix.o tmp/objs/Cedar/VLanWin32.o tmp/objs/Cedar/WaterMark.o tmp/objs/Cedar/WebUI.o tmp/objs/Cedar/WinUi.o tmp/objs/Cedar/Wpc.o
-HAMCORE_FILES=src/bin/hamcore/authors.txt src/bin/hamcore/backup_dir_readme.txt src/bin/hamcore/empty.config src/bin/hamcore/empty_sevpnclient.config src/bin/hamcore/eula.txt src/bin/hamcore/install_src.dat src/bin/hamcore/lang.config src/bin/hamcore/languages.txt src/bin/hamcore/languages_wine.txt src/bin/hamcore/legal.txt src/bin/hamcore/openvpn_readme.pdf src/bin/hamcore/openvpn_readme.txt src/bin/hamcore/openvpn_sample.ovpn src/bin/hamcore/root_certs.dat src/bin/hamcore/SOURCES_OF_BINARY_FILES.TXT src/bin/hamcore/strtable_cn.stb src/bin/hamcore/strtable_en.stb src/bin/hamcore/strtable_ja.stb src/bin/hamcore/vpnweb_sample_cn.htm src/bin/hamcore/vpnweb_sample_en.htm src/bin/hamcore/vpnweb_sample_ja.htm src/bin/hamcore/warning_cn.txt src/bin/hamcore/warning_en.txt src/bin/hamcore/warning_ja.txt src/bin/hamcore/webui/cryptcom.cgi src/bin/hamcore/webui/edituser.cgi src/bin/hamcore/webui/error.cgi src/bin/hamcore/webui/hub.cgi src/bin/hamcore/webui/license.cgi src/bin/hamcore/webui/listener.cgi src/bin/hamcore/webui/localbridge.cgi src/bin/hamcore/webui/login.cgi src/bin/hamcore/webui/newhub.cgi src/bin/hamcore/webui/redirect.cgi src/bin/hamcore/webui/securenat.cgi src/bin/hamcore/webui/server.cgi src/bin/hamcore/webui/session.cgi src/bin/hamcore/webui/user.cgi src/bin/hamcore/webui/webui.css
+HAMCORE_FILES=src/bin/hamcore/authors.txt src/bin/hamcore/backup_dir_readme.txt src/bin/hamcore/empty.config src/bin/hamcore/empty_sevpnclient.config src/bin/hamcore/eula.txt src/bin/hamcore/install_src.dat src/bin/hamcore/languages.txt src/bin/hamcore/languages_wine.txt src/bin/hamcore/legal.txt src/bin/hamcore/openvpn_readme.pdf src/bin/hamcore/openvpn_readme.txt src/bin/hamcore/openvpn_sample.ovpn src/bin/hamcore/root_certs.dat src/bin/hamcore/SOURCES_OF_BINARY_FILES.TXT src/bin/hamcore/strtable_cn.stb src/bin/hamcore/strtable_en.stb src/bin/hamcore/strtable_ja.stb src/bin/hamcore/vpnserver_api_doc.html src/bin/hamcore/vpnweb_sample_cn.htm src/bin/hamcore/vpnweb_sample_en.htm src/bin/hamcore/vpnweb_sample_ja.htm src/bin/hamcore/warning_cn.txt src/bin/hamcore/warning_en.txt src/bin/hamcore/warning_ja.txt src/bin/hamcore/webui/cryptcom.cgi src/bin/hamcore/webui/edituser.cgi src/bin/hamcore/webui/error.cgi src/bin/hamcore/webui/hub.cgi src/bin/hamcore/webui/license.cgi src/bin/hamcore/webui/listener.cgi src/bin/hamcore/webui/localbridge.cgi src/bin/hamcore/webui/login.cgi src/bin/hamcore/webui/newhub.cgi src/bin/hamcore/webui/redirect.cgi src/bin/hamcore/webui/securenat.cgi src/bin/hamcore/webui/server.cgi src/bin/hamcore/webui/session.cgi src/bin/hamcore/webui/user.cgi src/bin/hamcore/webui/webui.css src/bin/hamcore/wwwroot/admin/default/.gitignore src/bin/hamcore/wwwroot/admin/default/.vscode/launch.json src/bin/hamcore/wwwroot/admin/default/.vscode/settings.json src/bin/hamcore/wwwroot/admin/default/.vscode/tasks.json src/bin/hamcore/wwwroot/admin/default/hub.html src/bin/hamcore/wwwroot/admin/default/include_footer.html src/bin/hamcore/wwwroot/admin/default/include_head.html src/bin/hamcore/wwwroot/admin/default/include_menu.html src/bin/hamcore/wwwroot/admin/default/index.html src/bin/hamcore/wwwroot/admin/default/out_webpack/bundle.js src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts.map src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts.map src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts.map src/bin/hamcore/wwwroot/admin/default/package.json src/bin/hamcore/wwwroot/admin/default/package-lock.json src/bin/hamcore/wwwroot/admin/default/src/ts/main.ts src/bin/hamcore/wwwroot/admin/default/theme.css src/bin/hamcore/wwwroot/admin/default/tsconfig.json src/bin/hamcore/wwwroot/admin/default/tsconfig_webpack.json src/bin/hamcore/wwwroot/admin/default/tslint.json src/bin/hamcore/wwwroot/admin/default/webpack.config.js src/bin/hamcore/wwwroot/admin/index.html src/bin/hamcore/wwwroot/admin/README.md src/bin/hamcore/wwwroot/index.html
# Build Action
default: build
diff --git a/src/makefiles/linux_64bit.mak b/src/makefiles/linux_64bit.mak
index ff78822c..c078b1b0 100644
--- a/src/makefiles/linux_64bit.mak
+++ b/src/makefiles/linux_64bit.mak
@@ -89,7 +89,7 @@ HEADERS_MAYAQUA=src/Mayaqua/Cfg.h src/Mayaqua/cryptoki.h src/Mayaqua/Encrypt.h s
HEADERS_CEDAR=src/Cedar/Account.h src/Cedar/Admin.h src/Cedar/AzureClient.h src/Cedar/AzureServer.h src/Cedar/Bridge.h src/Cedar/BridgeUnix.h src/Cedar/BridgeWin32.h src/Cedar/Cedar.h src/Cedar/CedarPch.h src/Cedar/CedarType.h src/Cedar/Client.h src/Cedar/CM.h src/Cedar/CMInner.h src/Cedar/Command.h src/Cedar/Connection.h src/Cedar/Console.h src/Cedar/Database.h src/Cedar/DDNS.h src/Cedar/EM.h src/Cedar/EMInner.h src/Cedar/EtherLog.h src/Cedar/Hub.h src/Cedar/Interop_OpenVPN.h src/Cedar/Interop_SSTP.h src/Cedar/IPsec.h src/Cedar/IPsec_EtherIP.h src/Cedar/IPsec_IKE.h src/Cedar/IPsec_IkePacket.h src/Cedar/IPsec_IPC.h src/Cedar/IPsec_L2TP.h src/Cedar/IPsec_PPP.h src/Cedar/IPsec_Win7.h src/Cedar/IPsec_Win7Inner.h src/Cedar/Layer3.h src/Cedar/Link.h src/Cedar/Listener.h src/Cedar/Logging.h src/Cedar/Nat.h src/Cedar/NativeStack.h src/Cedar/netcfgn.h src/Cedar/netcfgx.h src/Cedar/NM.h src/Cedar/NMInner.h src/Cedar/NullLan.h src/Cedar/Protocol.h src/Cedar/Radius.h src/Cedar/Remote.h src/Cedar/Sam.h src/Cedar/SecureInfo.h src/Cedar/SecureNAT.h src/Cedar/SeLowUser.h src/Cedar/Server.h src/Cedar/Session.h src/Cedar/SM.h src/Cedar/SMInner.h src/Cedar/SW.h src/Cedar/SWInner.h src/Cedar/UdpAccel.h src/Cedar/UT.h src/Cedar/VG.h src/Cedar/Virtual.h src/Cedar/VLan.h src/Cedar/VLanUnix.h src/Cedar/VLanWin32.h src/Cedar/WaterMark.h src/Cedar/WebUI.h src/Cedar/Win32Com.h src/Cedar/winpcap/bittypes.h src/Cedar/winpcap/bucket_lookup.h src/Cedar/winpcap/count_packets.h src/Cedar/winpcap/Devioctl.h src/Cedar/winpcap/Gnuc.h src/Cedar/winpcap/ip6_misc.h src/Cedar/winpcap/memory_t.h src/Cedar/winpcap/normal_lookup.h src/Cedar/winpcap/Ntddndis.h src/Cedar/winpcap/Ntddpack.h src/Cedar/winpcap/Packet32.h src/Cedar/winpcap/pcap.h src/Cedar/winpcap/pcap-bpf.h src/Cedar/winpcap/pcap-int.h src/Cedar/winpcap/pcap-stdinc.h src/Cedar/winpcap/pthread.h src/Cedar/winpcap/remote-ext.h src/Cedar/winpcap/sched.h src/Cedar/winpcap/semaphore.h src/Cedar/winpcap/tcp_session.h src/Cedar/winpcap/time_calls.h src/Cedar/winpcap/tme.h src/Cedar/winpcap/Win32-Extensions.h src/Cedar/WinUi.h src/Cedar/Wpc.h
OBJECTS_MAYAQUA=tmp/objs/Mayaqua/Cfg.o tmp/objs/Mayaqua/Encrypt.o tmp/objs/Mayaqua/FileIO.o tmp/objs/Mayaqua/Internat.o tmp/objs/Mayaqua/Kernel.o tmp/objs/Mayaqua/Mayaqua.o tmp/objs/Mayaqua/Memory.o tmp/objs/Mayaqua/Microsoft.o tmp/objs/Mayaqua/Network.o tmp/objs/Mayaqua/Object.o tmp/objs/Mayaqua/OS.o tmp/objs/Mayaqua/Pack.o tmp/objs/Mayaqua/Secure.o tmp/objs/Mayaqua/Str.o tmp/objs/Mayaqua/Table.o tmp/objs/Mayaqua/TcpIp.o tmp/objs/Mayaqua/Tick64.o tmp/objs/Mayaqua/Tracking.o tmp/objs/Mayaqua/Unix.o tmp/objs/Mayaqua/Win32.o
OBJECTS_CEDAR=tmp/objs/Cedar/Account.o tmp/objs/Cedar/Admin.o tmp/objs/Cedar/AzureClient.o tmp/objs/Cedar/AzureServer.o tmp/objs/Cedar/Bridge.o tmp/objs/Cedar/BridgeUnix.o tmp/objs/Cedar/BridgeWin32.o tmp/objs/Cedar/Cedar.o tmp/objs/Cedar/CedarPch.o tmp/objs/Cedar/Client.o tmp/objs/Cedar/CM.o tmp/objs/Cedar/Command.o tmp/objs/Cedar/Connection.o tmp/objs/Cedar/Console.o tmp/objs/Cedar/Database.o tmp/objs/Cedar/DDNS.o tmp/objs/Cedar/EM.o tmp/objs/Cedar/EtherLog.o tmp/objs/Cedar/Hub.o tmp/objs/Cedar/Interop_OpenVPN.o tmp/objs/Cedar/Interop_SSTP.o tmp/objs/Cedar/IPsec.o tmp/objs/Cedar/IPsec_EtherIP.o tmp/objs/Cedar/IPsec_IKE.o tmp/objs/Cedar/IPsec_IkePacket.o tmp/objs/Cedar/IPsec_IPC.o tmp/objs/Cedar/IPsec_L2TP.o tmp/objs/Cedar/IPsec_PPP.o tmp/objs/Cedar/IPsec_Win7.o tmp/objs/Cedar/Layer3.o tmp/objs/Cedar/Link.o tmp/objs/Cedar/Listener.o tmp/objs/Cedar/Logging.o tmp/objs/Cedar/Nat.o tmp/objs/Cedar/NativeStack.o tmp/objs/Cedar/NM.o tmp/objs/Cedar/NullLan.o tmp/objs/Cedar/Protocol.o tmp/objs/Cedar/Radius.o tmp/objs/Cedar/Remote.o tmp/objs/Cedar/Sam.o tmp/objs/Cedar/SecureInfo.o tmp/objs/Cedar/SecureNAT.o tmp/objs/Cedar/SeLowUser.o tmp/objs/Cedar/Server.o tmp/objs/Cedar/Session.o tmp/objs/Cedar/SM.o tmp/objs/Cedar/SW.o tmp/objs/Cedar/UdpAccel.o tmp/objs/Cedar/UT.o tmp/objs/Cedar/VG.o tmp/objs/Cedar/Virtual.o tmp/objs/Cedar/VLan.o tmp/objs/Cedar/VLanUnix.o tmp/objs/Cedar/VLanWin32.o tmp/objs/Cedar/WaterMark.o tmp/objs/Cedar/WebUI.o tmp/objs/Cedar/WinUi.o tmp/objs/Cedar/Wpc.o
-HAMCORE_FILES=src/bin/hamcore/authors.txt src/bin/hamcore/backup_dir_readme.txt src/bin/hamcore/empty.config src/bin/hamcore/empty_sevpnclient.config src/bin/hamcore/eula.txt src/bin/hamcore/install_src.dat src/bin/hamcore/lang.config src/bin/hamcore/languages.txt src/bin/hamcore/languages_wine.txt src/bin/hamcore/legal.txt src/bin/hamcore/openvpn_readme.pdf src/bin/hamcore/openvpn_readme.txt src/bin/hamcore/openvpn_sample.ovpn src/bin/hamcore/root_certs.dat src/bin/hamcore/SOURCES_OF_BINARY_FILES.TXT src/bin/hamcore/strtable_cn.stb src/bin/hamcore/strtable_en.stb src/bin/hamcore/strtable_ja.stb src/bin/hamcore/vpnweb_sample_cn.htm src/bin/hamcore/vpnweb_sample_en.htm src/bin/hamcore/vpnweb_sample_ja.htm src/bin/hamcore/warning_cn.txt src/bin/hamcore/warning_en.txt src/bin/hamcore/warning_ja.txt src/bin/hamcore/webui/cryptcom.cgi src/bin/hamcore/webui/edituser.cgi src/bin/hamcore/webui/error.cgi src/bin/hamcore/webui/hub.cgi src/bin/hamcore/webui/license.cgi src/bin/hamcore/webui/listener.cgi src/bin/hamcore/webui/localbridge.cgi src/bin/hamcore/webui/login.cgi src/bin/hamcore/webui/newhub.cgi src/bin/hamcore/webui/redirect.cgi src/bin/hamcore/webui/securenat.cgi src/bin/hamcore/webui/server.cgi src/bin/hamcore/webui/session.cgi src/bin/hamcore/webui/user.cgi src/bin/hamcore/webui/webui.css
+HAMCORE_FILES=src/bin/hamcore/authors.txt src/bin/hamcore/backup_dir_readme.txt src/bin/hamcore/empty.config src/bin/hamcore/empty_sevpnclient.config src/bin/hamcore/eula.txt src/bin/hamcore/install_src.dat src/bin/hamcore/languages.txt src/bin/hamcore/languages_wine.txt src/bin/hamcore/legal.txt src/bin/hamcore/openvpn_readme.pdf src/bin/hamcore/openvpn_readme.txt src/bin/hamcore/openvpn_sample.ovpn src/bin/hamcore/root_certs.dat src/bin/hamcore/SOURCES_OF_BINARY_FILES.TXT src/bin/hamcore/strtable_cn.stb src/bin/hamcore/strtable_en.stb src/bin/hamcore/strtable_ja.stb src/bin/hamcore/vpnserver_api_doc.html src/bin/hamcore/vpnweb_sample_cn.htm src/bin/hamcore/vpnweb_sample_en.htm src/bin/hamcore/vpnweb_sample_ja.htm src/bin/hamcore/warning_cn.txt src/bin/hamcore/warning_en.txt src/bin/hamcore/warning_ja.txt src/bin/hamcore/webui/cryptcom.cgi src/bin/hamcore/webui/edituser.cgi src/bin/hamcore/webui/error.cgi src/bin/hamcore/webui/hub.cgi src/bin/hamcore/webui/license.cgi src/bin/hamcore/webui/listener.cgi src/bin/hamcore/webui/localbridge.cgi src/bin/hamcore/webui/login.cgi src/bin/hamcore/webui/newhub.cgi src/bin/hamcore/webui/redirect.cgi src/bin/hamcore/webui/securenat.cgi src/bin/hamcore/webui/server.cgi src/bin/hamcore/webui/session.cgi src/bin/hamcore/webui/user.cgi src/bin/hamcore/webui/webui.css src/bin/hamcore/wwwroot/admin/default/.gitignore src/bin/hamcore/wwwroot/admin/default/.vscode/launch.json src/bin/hamcore/wwwroot/admin/default/.vscode/settings.json src/bin/hamcore/wwwroot/admin/default/.vscode/tasks.json src/bin/hamcore/wwwroot/admin/default/hub.html src/bin/hamcore/wwwroot/admin/default/include_footer.html src/bin/hamcore/wwwroot/admin/default/include_head.html src/bin/hamcore/wwwroot/admin/default/include_menu.html src/bin/hamcore/wwwroot/admin/default/index.html src/bin/hamcore/wwwroot/admin/default/out_webpack/bundle.js src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts.map src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts.map src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts.map src/bin/hamcore/wwwroot/admin/default/package.json src/bin/hamcore/wwwroot/admin/default/package-lock.json src/bin/hamcore/wwwroot/admin/default/src/ts/main.ts src/bin/hamcore/wwwroot/admin/default/theme.css src/bin/hamcore/wwwroot/admin/default/tsconfig.json src/bin/hamcore/wwwroot/admin/default/tsconfig_webpack.json src/bin/hamcore/wwwroot/admin/default/tslint.json src/bin/hamcore/wwwroot/admin/default/webpack.config.js src/bin/hamcore/wwwroot/admin/index.html src/bin/hamcore/wwwroot/admin/README.md src/bin/hamcore/wwwroot/index.html
# Build Action
default: build
diff --git a/src/makefiles/macos_32bit.mak b/src/makefiles/macos_32bit.mak
index 0957275b..7f021eb9 100644
--- a/src/makefiles/macos_32bit.mak
+++ b/src/makefiles/macos_32bit.mak
@@ -89,7 +89,7 @@ HEADERS_MAYAQUA=src/Mayaqua/Cfg.h src/Mayaqua/cryptoki.h src/Mayaqua/Encrypt.h s
HEADERS_CEDAR=src/Cedar/Account.h src/Cedar/Admin.h src/Cedar/AzureClient.h src/Cedar/AzureServer.h src/Cedar/Bridge.h src/Cedar/BridgeUnix.h src/Cedar/BridgeWin32.h src/Cedar/Cedar.h src/Cedar/CedarPch.h src/Cedar/CedarType.h src/Cedar/Client.h src/Cedar/CM.h src/Cedar/CMInner.h src/Cedar/Command.h src/Cedar/Connection.h src/Cedar/Console.h src/Cedar/Database.h src/Cedar/DDNS.h src/Cedar/EM.h src/Cedar/EMInner.h src/Cedar/EtherLog.h src/Cedar/Hub.h src/Cedar/Interop_OpenVPN.h src/Cedar/Interop_SSTP.h src/Cedar/IPsec.h src/Cedar/IPsec_EtherIP.h src/Cedar/IPsec_IKE.h src/Cedar/IPsec_IkePacket.h src/Cedar/IPsec_IPC.h src/Cedar/IPsec_L2TP.h src/Cedar/IPsec_PPP.h src/Cedar/IPsec_Win7.h src/Cedar/IPsec_Win7Inner.h src/Cedar/Layer3.h src/Cedar/Link.h src/Cedar/Listener.h src/Cedar/Logging.h src/Cedar/Nat.h src/Cedar/NativeStack.h src/Cedar/netcfgn.h src/Cedar/netcfgx.h src/Cedar/NM.h src/Cedar/NMInner.h src/Cedar/NullLan.h src/Cedar/Protocol.h src/Cedar/Radius.h src/Cedar/Remote.h src/Cedar/Sam.h src/Cedar/SecureInfo.h src/Cedar/SecureNAT.h src/Cedar/SeLowUser.h src/Cedar/Server.h src/Cedar/Session.h src/Cedar/SM.h src/Cedar/SMInner.h src/Cedar/SW.h src/Cedar/SWInner.h src/Cedar/UdpAccel.h src/Cedar/UT.h src/Cedar/VG.h src/Cedar/Virtual.h src/Cedar/VLan.h src/Cedar/VLanUnix.h src/Cedar/VLanWin32.h src/Cedar/WaterMark.h src/Cedar/WebUI.h src/Cedar/Win32Com.h src/Cedar/winpcap/bittypes.h src/Cedar/winpcap/bucket_lookup.h src/Cedar/winpcap/count_packets.h src/Cedar/winpcap/Devioctl.h src/Cedar/winpcap/Gnuc.h src/Cedar/winpcap/ip6_misc.h src/Cedar/winpcap/memory_t.h src/Cedar/winpcap/normal_lookup.h src/Cedar/winpcap/Ntddndis.h src/Cedar/winpcap/Ntddpack.h src/Cedar/winpcap/Packet32.h src/Cedar/winpcap/pcap.h src/Cedar/winpcap/pcap-bpf.h src/Cedar/winpcap/pcap-int.h src/Cedar/winpcap/pcap-stdinc.h src/Cedar/winpcap/pthread.h src/Cedar/winpcap/remote-ext.h src/Cedar/winpcap/sched.h src/Cedar/winpcap/semaphore.h src/Cedar/winpcap/tcp_session.h src/Cedar/winpcap/time_calls.h src/Cedar/winpcap/tme.h src/Cedar/winpcap/Win32-Extensions.h src/Cedar/WinUi.h src/Cedar/Wpc.h
OBJECTS_MAYAQUA=tmp/objs/Mayaqua/Cfg.o tmp/objs/Mayaqua/Encrypt.o tmp/objs/Mayaqua/FileIO.o tmp/objs/Mayaqua/Internat.o tmp/objs/Mayaqua/Kernel.o tmp/objs/Mayaqua/Mayaqua.o tmp/objs/Mayaqua/Memory.o tmp/objs/Mayaqua/Microsoft.o tmp/objs/Mayaqua/Network.o tmp/objs/Mayaqua/Object.o tmp/objs/Mayaqua/OS.o tmp/objs/Mayaqua/Pack.o tmp/objs/Mayaqua/Secure.o tmp/objs/Mayaqua/Str.o tmp/objs/Mayaqua/Table.o tmp/objs/Mayaqua/TcpIp.o tmp/objs/Mayaqua/Tick64.o tmp/objs/Mayaqua/Tracking.o tmp/objs/Mayaqua/Unix.o tmp/objs/Mayaqua/Win32.o
OBJECTS_CEDAR=tmp/objs/Cedar/Account.o tmp/objs/Cedar/Admin.o tmp/objs/Cedar/AzureClient.o tmp/objs/Cedar/AzureServer.o tmp/objs/Cedar/Bridge.o tmp/objs/Cedar/BridgeUnix.o tmp/objs/Cedar/BridgeWin32.o tmp/objs/Cedar/Cedar.o tmp/objs/Cedar/CedarPch.o tmp/objs/Cedar/Client.o tmp/objs/Cedar/CM.o tmp/objs/Cedar/Command.o tmp/objs/Cedar/Connection.o tmp/objs/Cedar/Console.o tmp/objs/Cedar/Database.o tmp/objs/Cedar/DDNS.o tmp/objs/Cedar/EM.o tmp/objs/Cedar/EtherLog.o tmp/objs/Cedar/Hub.o tmp/objs/Cedar/Interop_OpenVPN.o tmp/objs/Cedar/Interop_SSTP.o tmp/objs/Cedar/IPsec.o tmp/objs/Cedar/IPsec_EtherIP.o tmp/objs/Cedar/IPsec_IKE.o tmp/objs/Cedar/IPsec_IkePacket.o tmp/objs/Cedar/IPsec_IPC.o tmp/objs/Cedar/IPsec_L2TP.o tmp/objs/Cedar/IPsec_PPP.o tmp/objs/Cedar/IPsec_Win7.o tmp/objs/Cedar/Layer3.o tmp/objs/Cedar/Link.o tmp/objs/Cedar/Listener.o tmp/objs/Cedar/Logging.o tmp/objs/Cedar/Nat.o tmp/objs/Cedar/NativeStack.o tmp/objs/Cedar/NM.o tmp/objs/Cedar/NullLan.o tmp/objs/Cedar/Protocol.o tmp/objs/Cedar/Radius.o tmp/objs/Cedar/Remote.o tmp/objs/Cedar/Sam.o tmp/objs/Cedar/SecureInfo.o tmp/objs/Cedar/SecureNAT.o tmp/objs/Cedar/SeLowUser.o tmp/objs/Cedar/Server.o tmp/objs/Cedar/Session.o tmp/objs/Cedar/SM.o tmp/objs/Cedar/SW.o tmp/objs/Cedar/UdpAccel.o tmp/objs/Cedar/UT.o tmp/objs/Cedar/VG.o tmp/objs/Cedar/Virtual.o tmp/objs/Cedar/VLan.o tmp/objs/Cedar/VLanUnix.o tmp/objs/Cedar/VLanWin32.o tmp/objs/Cedar/WaterMark.o tmp/objs/Cedar/WebUI.o tmp/objs/Cedar/WinUi.o tmp/objs/Cedar/Wpc.o
-HAMCORE_FILES=src/bin/hamcore/authors.txt src/bin/hamcore/backup_dir_readme.txt src/bin/hamcore/empty.config src/bin/hamcore/empty_sevpnclient.config src/bin/hamcore/eula.txt src/bin/hamcore/install_src.dat src/bin/hamcore/lang.config src/bin/hamcore/languages.txt src/bin/hamcore/languages_wine.txt src/bin/hamcore/legal.txt src/bin/hamcore/openvpn_readme.pdf src/bin/hamcore/openvpn_readme.txt src/bin/hamcore/openvpn_sample.ovpn src/bin/hamcore/root_certs.dat src/bin/hamcore/SOURCES_OF_BINARY_FILES.TXT src/bin/hamcore/strtable_cn.stb src/bin/hamcore/strtable_en.stb src/bin/hamcore/strtable_ja.stb src/bin/hamcore/vpnweb_sample_cn.htm src/bin/hamcore/vpnweb_sample_en.htm src/bin/hamcore/vpnweb_sample_ja.htm src/bin/hamcore/warning_cn.txt src/bin/hamcore/warning_en.txt src/bin/hamcore/warning_ja.txt src/bin/hamcore/webui/cryptcom.cgi src/bin/hamcore/webui/edituser.cgi src/bin/hamcore/webui/error.cgi src/bin/hamcore/webui/hub.cgi src/bin/hamcore/webui/license.cgi src/bin/hamcore/webui/listener.cgi src/bin/hamcore/webui/localbridge.cgi src/bin/hamcore/webui/login.cgi src/bin/hamcore/webui/newhub.cgi src/bin/hamcore/webui/redirect.cgi src/bin/hamcore/webui/securenat.cgi src/bin/hamcore/webui/server.cgi src/bin/hamcore/webui/session.cgi src/bin/hamcore/webui/user.cgi src/bin/hamcore/webui/webui.css
+HAMCORE_FILES=src/bin/hamcore/authors.txt src/bin/hamcore/backup_dir_readme.txt src/bin/hamcore/empty.config src/bin/hamcore/empty_sevpnclient.config src/bin/hamcore/eula.txt src/bin/hamcore/install_src.dat src/bin/hamcore/languages.txt src/bin/hamcore/languages_wine.txt src/bin/hamcore/legal.txt src/bin/hamcore/openvpn_readme.pdf src/bin/hamcore/openvpn_readme.txt src/bin/hamcore/openvpn_sample.ovpn src/bin/hamcore/root_certs.dat src/bin/hamcore/SOURCES_OF_BINARY_FILES.TXT src/bin/hamcore/strtable_cn.stb src/bin/hamcore/strtable_en.stb src/bin/hamcore/strtable_ja.stb src/bin/hamcore/vpnserver_api_doc.html src/bin/hamcore/vpnweb_sample_cn.htm src/bin/hamcore/vpnweb_sample_en.htm src/bin/hamcore/vpnweb_sample_ja.htm src/bin/hamcore/warning_cn.txt src/bin/hamcore/warning_en.txt src/bin/hamcore/warning_ja.txt src/bin/hamcore/webui/cryptcom.cgi src/bin/hamcore/webui/edituser.cgi src/bin/hamcore/webui/error.cgi src/bin/hamcore/webui/hub.cgi src/bin/hamcore/webui/license.cgi src/bin/hamcore/webui/listener.cgi src/bin/hamcore/webui/localbridge.cgi src/bin/hamcore/webui/login.cgi src/bin/hamcore/webui/newhub.cgi src/bin/hamcore/webui/redirect.cgi src/bin/hamcore/webui/securenat.cgi src/bin/hamcore/webui/server.cgi src/bin/hamcore/webui/session.cgi src/bin/hamcore/webui/user.cgi src/bin/hamcore/webui/webui.css src/bin/hamcore/wwwroot/admin/default/.gitignore src/bin/hamcore/wwwroot/admin/default/.vscode/launch.json src/bin/hamcore/wwwroot/admin/default/.vscode/settings.json src/bin/hamcore/wwwroot/admin/default/.vscode/tasks.json src/bin/hamcore/wwwroot/admin/default/hub.html src/bin/hamcore/wwwroot/admin/default/include_footer.html src/bin/hamcore/wwwroot/admin/default/include_head.html src/bin/hamcore/wwwroot/admin/default/include_menu.html src/bin/hamcore/wwwroot/admin/default/index.html src/bin/hamcore/wwwroot/admin/default/out_webpack/bundle.js src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts.map src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts.map src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts.map src/bin/hamcore/wwwroot/admin/default/package.json src/bin/hamcore/wwwroot/admin/default/package-lock.json src/bin/hamcore/wwwroot/admin/default/src/ts/main.ts src/bin/hamcore/wwwroot/admin/default/theme.css src/bin/hamcore/wwwroot/admin/default/tsconfig.json src/bin/hamcore/wwwroot/admin/default/tsconfig_webpack.json src/bin/hamcore/wwwroot/admin/default/tslint.json src/bin/hamcore/wwwroot/admin/default/webpack.config.js src/bin/hamcore/wwwroot/admin/index.html src/bin/hamcore/wwwroot/admin/README.md src/bin/hamcore/wwwroot/index.html
# Build Action
default: build
diff --git a/src/makefiles/macos_64bit.mak b/src/makefiles/macos_64bit.mak
index b5727946..e313ad16 100644
--- a/src/makefiles/macos_64bit.mak
+++ b/src/makefiles/macos_64bit.mak
@@ -89,7 +89,7 @@ HEADERS_MAYAQUA=src/Mayaqua/Cfg.h src/Mayaqua/cryptoki.h src/Mayaqua/Encrypt.h s
HEADERS_CEDAR=src/Cedar/Account.h src/Cedar/Admin.h src/Cedar/AzureClient.h src/Cedar/AzureServer.h src/Cedar/Bridge.h src/Cedar/BridgeUnix.h src/Cedar/BridgeWin32.h src/Cedar/Cedar.h src/Cedar/CedarPch.h src/Cedar/CedarType.h src/Cedar/Client.h src/Cedar/CM.h src/Cedar/CMInner.h src/Cedar/Command.h src/Cedar/Connection.h src/Cedar/Console.h src/Cedar/Database.h src/Cedar/DDNS.h src/Cedar/EM.h src/Cedar/EMInner.h src/Cedar/EtherLog.h src/Cedar/Hub.h src/Cedar/Interop_OpenVPN.h src/Cedar/Interop_SSTP.h src/Cedar/IPsec.h src/Cedar/IPsec_EtherIP.h src/Cedar/IPsec_IKE.h src/Cedar/IPsec_IkePacket.h src/Cedar/IPsec_IPC.h src/Cedar/IPsec_L2TP.h src/Cedar/IPsec_PPP.h src/Cedar/IPsec_Win7.h src/Cedar/IPsec_Win7Inner.h src/Cedar/Layer3.h src/Cedar/Link.h src/Cedar/Listener.h src/Cedar/Logging.h src/Cedar/Nat.h src/Cedar/NativeStack.h src/Cedar/netcfgn.h src/Cedar/netcfgx.h src/Cedar/NM.h src/Cedar/NMInner.h src/Cedar/NullLan.h src/Cedar/Protocol.h src/Cedar/Radius.h src/Cedar/Remote.h src/Cedar/Sam.h src/Cedar/SecureInfo.h src/Cedar/SecureNAT.h src/Cedar/SeLowUser.h src/Cedar/Server.h src/Cedar/Session.h src/Cedar/SM.h src/Cedar/SMInner.h src/Cedar/SW.h src/Cedar/SWInner.h src/Cedar/UdpAccel.h src/Cedar/UT.h src/Cedar/VG.h src/Cedar/Virtual.h src/Cedar/VLan.h src/Cedar/VLanUnix.h src/Cedar/VLanWin32.h src/Cedar/WaterMark.h src/Cedar/WebUI.h src/Cedar/Win32Com.h src/Cedar/winpcap/bittypes.h src/Cedar/winpcap/bucket_lookup.h src/Cedar/winpcap/count_packets.h src/Cedar/winpcap/Devioctl.h src/Cedar/winpcap/Gnuc.h src/Cedar/winpcap/ip6_misc.h src/Cedar/winpcap/memory_t.h src/Cedar/winpcap/normal_lookup.h src/Cedar/winpcap/Ntddndis.h src/Cedar/winpcap/Ntddpack.h src/Cedar/winpcap/Packet32.h src/Cedar/winpcap/pcap.h src/Cedar/winpcap/pcap-bpf.h src/Cedar/winpcap/pcap-int.h src/Cedar/winpcap/pcap-stdinc.h src/Cedar/winpcap/pthread.h src/Cedar/winpcap/remote-ext.h src/Cedar/winpcap/sched.h src/Cedar/winpcap/semaphore.h src/Cedar/winpcap/tcp_session.h src/Cedar/winpcap/time_calls.h src/Cedar/winpcap/tme.h src/Cedar/winpcap/Win32-Extensions.h src/Cedar/WinUi.h src/Cedar/Wpc.h
OBJECTS_MAYAQUA=tmp/objs/Mayaqua/Cfg.o tmp/objs/Mayaqua/Encrypt.o tmp/objs/Mayaqua/FileIO.o tmp/objs/Mayaqua/Internat.o tmp/objs/Mayaqua/Kernel.o tmp/objs/Mayaqua/Mayaqua.o tmp/objs/Mayaqua/Memory.o tmp/objs/Mayaqua/Microsoft.o tmp/objs/Mayaqua/Network.o tmp/objs/Mayaqua/Object.o tmp/objs/Mayaqua/OS.o tmp/objs/Mayaqua/Pack.o tmp/objs/Mayaqua/Secure.o tmp/objs/Mayaqua/Str.o tmp/objs/Mayaqua/Table.o tmp/objs/Mayaqua/TcpIp.o tmp/objs/Mayaqua/Tick64.o tmp/objs/Mayaqua/Tracking.o tmp/objs/Mayaqua/Unix.o tmp/objs/Mayaqua/Win32.o
OBJECTS_CEDAR=tmp/objs/Cedar/Account.o tmp/objs/Cedar/Admin.o tmp/objs/Cedar/AzureClient.o tmp/objs/Cedar/AzureServer.o tmp/objs/Cedar/Bridge.o tmp/objs/Cedar/BridgeUnix.o tmp/objs/Cedar/BridgeWin32.o tmp/objs/Cedar/Cedar.o tmp/objs/Cedar/CedarPch.o tmp/objs/Cedar/Client.o tmp/objs/Cedar/CM.o tmp/objs/Cedar/Command.o tmp/objs/Cedar/Connection.o tmp/objs/Cedar/Console.o tmp/objs/Cedar/Database.o tmp/objs/Cedar/DDNS.o tmp/objs/Cedar/EM.o tmp/objs/Cedar/EtherLog.o tmp/objs/Cedar/Hub.o tmp/objs/Cedar/Interop_OpenVPN.o tmp/objs/Cedar/Interop_SSTP.o tmp/objs/Cedar/IPsec.o tmp/objs/Cedar/IPsec_EtherIP.o tmp/objs/Cedar/IPsec_IKE.o tmp/objs/Cedar/IPsec_IkePacket.o tmp/objs/Cedar/IPsec_IPC.o tmp/objs/Cedar/IPsec_L2TP.o tmp/objs/Cedar/IPsec_PPP.o tmp/objs/Cedar/IPsec_Win7.o tmp/objs/Cedar/Layer3.o tmp/objs/Cedar/Link.o tmp/objs/Cedar/Listener.o tmp/objs/Cedar/Logging.o tmp/objs/Cedar/Nat.o tmp/objs/Cedar/NativeStack.o tmp/objs/Cedar/NM.o tmp/objs/Cedar/NullLan.o tmp/objs/Cedar/Protocol.o tmp/objs/Cedar/Radius.o tmp/objs/Cedar/Remote.o tmp/objs/Cedar/Sam.o tmp/objs/Cedar/SecureInfo.o tmp/objs/Cedar/SecureNAT.o tmp/objs/Cedar/SeLowUser.o tmp/objs/Cedar/Server.o tmp/objs/Cedar/Session.o tmp/objs/Cedar/SM.o tmp/objs/Cedar/SW.o tmp/objs/Cedar/UdpAccel.o tmp/objs/Cedar/UT.o tmp/objs/Cedar/VG.o tmp/objs/Cedar/Virtual.o tmp/objs/Cedar/VLan.o tmp/objs/Cedar/VLanUnix.o tmp/objs/Cedar/VLanWin32.o tmp/objs/Cedar/WaterMark.o tmp/objs/Cedar/WebUI.o tmp/objs/Cedar/WinUi.o tmp/objs/Cedar/Wpc.o
-HAMCORE_FILES=src/bin/hamcore/authors.txt src/bin/hamcore/backup_dir_readme.txt src/bin/hamcore/empty.config src/bin/hamcore/empty_sevpnclient.config src/bin/hamcore/eula.txt src/bin/hamcore/install_src.dat src/bin/hamcore/lang.config src/bin/hamcore/languages.txt src/bin/hamcore/languages_wine.txt src/bin/hamcore/legal.txt src/bin/hamcore/openvpn_readme.pdf src/bin/hamcore/openvpn_readme.txt src/bin/hamcore/openvpn_sample.ovpn src/bin/hamcore/root_certs.dat src/bin/hamcore/SOURCES_OF_BINARY_FILES.TXT src/bin/hamcore/strtable_cn.stb src/bin/hamcore/strtable_en.stb src/bin/hamcore/strtable_ja.stb src/bin/hamcore/vpnweb_sample_cn.htm src/bin/hamcore/vpnweb_sample_en.htm src/bin/hamcore/vpnweb_sample_ja.htm src/bin/hamcore/warning_cn.txt src/bin/hamcore/warning_en.txt src/bin/hamcore/warning_ja.txt src/bin/hamcore/webui/cryptcom.cgi src/bin/hamcore/webui/edituser.cgi src/bin/hamcore/webui/error.cgi src/bin/hamcore/webui/hub.cgi src/bin/hamcore/webui/license.cgi src/bin/hamcore/webui/listener.cgi src/bin/hamcore/webui/localbridge.cgi src/bin/hamcore/webui/login.cgi src/bin/hamcore/webui/newhub.cgi src/bin/hamcore/webui/redirect.cgi src/bin/hamcore/webui/securenat.cgi src/bin/hamcore/webui/server.cgi src/bin/hamcore/webui/session.cgi src/bin/hamcore/webui/user.cgi src/bin/hamcore/webui/webui.css
+HAMCORE_FILES=src/bin/hamcore/authors.txt src/bin/hamcore/backup_dir_readme.txt src/bin/hamcore/empty.config src/bin/hamcore/empty_sevpnclient.config src/bin/hamcore/eula.txt src/bin/hamcore/install_src.dat src/bin/hamcore/languages.txt src/bin/hamcore/languages_wine.txt src/bin/hamcore/legal.txt src/bin/hamcore/openvpn_readme.pdf src/bin/hamcore/openvpn_readme.txt src/bin/hamcore/openvpn_sample.ovpn src/bin/hamcore/root_certs.dat src/bin/hamcore/SOURCES_OF_BINARY_FILES.TXT src/bin/hamcore/strtable_cn.stb src/bin/hamcore/strtable_en.stb src/bin/hamcore/strtable_ja.stb src/bin/hamcore/vpnserver_api_doc.html src/bin/hamcore/vpnweb_sample_cn.htm src/bin/hamcore/vpnweb_sample_en.htm src/bin/hamcore/vpnweb_sample_ja.htm src/bin/hamcore/warning_cn.txt src/bin/hamcore/warning_en.txt src/bin/hamcore/warning_ja.txt src/bin/hamcore/webui/cryptcom.cgi src/bin/hamcore/webui/edituser.cgi src/bin/hamcore/webui/error.cgi src/bin/hamcore/webui/hub.cgi src/bin/hamcore/webui/license.cgi src/bin/hamcore/webui/listener.cgi src/bin/hamcore/webui/localbridge.cgi src/bin/hamcore/webui/login.cgi src/bin/hamcore/webui/newhub.cgi src/bin/hamcore/webui/redirect.cgi src/bin/hamcore/webui/securenat.cgi src/bin/hamcore/webui/server.cgi src/bin/hamcore/webui/session.cgi src/bin/hamcore/webui/user.cgi src/bin/hamcore/webui/webui.css src/bin/hamcore/wwwroot/admin/default/.gitignore src/bin/hamcore/wwwroot/admin/default/.vscode/launch.json src/bin/hamcore/wwwroot/admin/default/.vscode/settings.json src/bin/hamcore/wwwroot/admin/default/.vscode/tasks.json src/bin/hamcore/wwwroot/admin/default/hub.html src/bin/hamcore/wwwroot/admin/default/include_footer.html src/bin/hamcore/wwwroot/admin/default/include_head.html src/bin/hamcore/wwwroot/admin/default/include_menu.html src/bin/hamcore/wwwroot/admin/default/index.html src/bin/hamcore/wwwroot/admin/default/out_webpack/bundle.js src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts.map src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts.map src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts.map src/bin/hamcore/wwwroot/admin/default/package.json src/bin/hamcore/wwwroot/admin/default/package-lock.json src/bin/hamcore/wwwroot/admin/default/src/ts/main.ts src/bin/hamcore/wwwroot/admin/default/theme.css src/bin/hamcore/wwwroot/admin/default/tsconfig.json src/bin/hamcore/wwwroot/admin/default/tsconfig_webpack.json src/bin/hamcore/wwwroot/admin/default/tslint.json src/bin/hamcore/wwwroot/admin/default/webpack.config.js src/bin/hamcore/wwwroot/admin/index.html src/bin/hamcore/wwwroot/admin/README.md src/bin/hamcore/wwwroot/index.html
# Build Action
default: build
diff --git a/src/makefiles/openbsd_32bit.mak b/src/makefiles/openbsd_32bit.mak
index b664989b..e5711e1a 100644
--- a/src/makefiles/openbsd_32bit.mak
+++ b/src/makefiles/openbsd_32bit.mak
@@ -89,7 +89,7 @@ HEADERS_MAYAQUA=src/Mayaqua/Cfg.h src/Mayaqua/cryptoki.h src/Mayaqua/Encrypt.h s
HEADERS_CEDAR=src/Cedar/Account.h src/Cedar/Admin.h src/Cedar/AzureClient.h src/Cedar/AzureServer.h src/Cedar/Bridge.h src/Cedar/BridgeUnix.h src/Cedar/BridgeWin32.h src/Cedar/Cedar.h src/Cedar/CedarPch.h src/Cedar/CedarType.h src/Cedar/Client.h src/Cedar/CM.h src/Cedar/CMInner.h src/Cedar/Command.h src/Cedar/Connection.h src/Cedar/Console.h src/Cedar/Database.h src/Cedar/DDNS.h src/Cedar/EM.h src/Cedar/EMInner.h src/Cedar/EtherLog.h src/Cedar/Hub.h src/Cedar/Interop_OpenVPN.h src/Cedar/Interop_SSTP.h src/Cedar/IPsec.h src/Cedar/IPsec_EtherIP.h src/Cedar/IPsec_IKE.h src/Cedar/IPsec_IkePacket.h src/Cedar/IPsec_IPC.h src/Cedar/IPsec_L2TP.h src/Cedar/IPsec_PPP.h src/Cedar/IPsec_Win7.h src/Cedar/IPsec_Win7Inner.h src/Cedar/Layer3.h src/Cedar/Link.h src/Cedar/Listener.h src/Cedar/Logging.h src/Cedar/Nat.h src/Cedar/NativeStack.h src/Cedar/netcfgn.h src/Cedar/netcfgx.h src/Cedar/NM.h src/Cedar/NMInner.h src/Cedar/NullLan.h src/Cedar/Protocol.h src/Cedar/Radius.h src/Cedar/Remote.h src/Cedar/Sam.h src/Cedar/SecureInfo.h src/Cedar/SecureNAT.h src/Cedar/SeLowUser.h src/Cedar/Server.h src/Cedar/Session.h src/Cedar/SM.h src/Cedar/SMInner.h src/Cedar/SW.h src/Cedar/SWInner.h src/Cedar/UdpAccel.h src/Cedar/UT.h src/Cedar/VG.h src/Cedar/Virtual.h src/Cedar/VLan.h src/Cedar/VLanUnix.h src/Cedar/VLanWin32.h src/Cedar/WaterMark.h src/Cedar/WebUI.h src/Cedar/Win32Com.h src/Cedar/winpcap/bittypes.h src/Cedar/winpcap/bucket_lookup.h src/Cedar/winpcap/count_packets.h src/Cedar/winpcap/Devioctl.h src/Cedar/winpcap/Gnuc.h src/Cedar/winpcap/ip6_misc.h src/Cedar/winpcap/memory_t.h src/Cedar/winpcap/normal_lookup.h src/Cedar/winpcap/Ntddndis.h src/Cedar/winpcap/Ntddpack.h src/Cedar/winpcap/Packet32.h src/Cedar/winpcap/pcap.h src/Cedar/winpcap/pcap-bpf.h src/Cedar/winpcap/pcap-int.h src/Cedar/winpcap/pcap-stdinc.h src/Cedar/winpcap/pthread.h src/Cedar/winpcap/remote-ext.h src/Cedar/winpcap/sched.h src/Cedar/winpcap/semaphore.h src/Cedar/winpcap/tcp_session.h src/Cedar/winpcap/time_calls.h src/Cedar/winpcap/tme.h src/Cedar/winpcap/Win32-Extensions.h src/Cedar/WinUi.h src/Cedar/Wpc.h
OBJECTS_MAYAQUA=tmp/objs/Mayaqua/Cfg.o tmp/objs/Mayaqua/Encrypt.o tmp/objs/Mayaqua/FileIO.o tmp/objs/Mayaqua/Internat.o tmp/objs/Mayaqua/Kernel.o tmp/objs/Mayaqua/Mayaqua.o tmp/objs/Mayaqua/Memory.o tmp/objs/Mayaqua/Microsoft.o tmp/objs/Mayaqua/Network.o tmp/objs/Mayaqua/Object.o tmp/objs/Mayaqua/OS.o tmp/objs/Mayaqua/Pack.o tmp/objs/Mayaqua/Secure.o tmp/objs/Mayaqua/Str.o tmp/objs/Mayaqua/Table.o tmp/objs/Mayaqua/TcpIp.o tmp/objs/Mayaqua/Tick64.o tmp/objs/Mayaqua/Tracking.o tmp/objs/Mayaqua/Unix.o tmp/objs/Mayaqua/Win32.o
OBJECTS_CEDAR=tmp/objs/Cedar/Account.o tmp/objs/Cedar/Admin.o tmp/objs/Cedar/AzureClient.o tmp/objs/Cedar/AzureServer.o tmp/objs/Cedar/Bridge.o tmp/objs/Cedar/BridgeUnix.o tmp/objs/Cedar/BridgeWin32.o tmp/objs/Cedar/Cedar.o tmp/objs/Cedar/CedarPch.o tmp/objs/Cedar/Client.o tmp/objs/Cedar/CM.o tmp/objs/Cedar/Command.o tmp/objs/Cedar/Connection.o tmp/objs/Cedar/Console.o tmp/objs/Cedar/Database.o tmp/objs/Cedar/DDNS.o tmp/objs/Cedar/EM.o tmp/objs/Cedar/EtherLog.o tmp/objs/Cedar/Hub.o tmp/objs/Cedar/Interop_OpenVPN.o tmp/objs/Cedar/Interop_SSTP.o tmp/objs/Cedar/IPsec.o tmp/objs/Cedar/IPsec_EtherIP.o tmp/objs/Cedar/IPsec_IKE.o tmp/objs/Cedar/IPsec_IkePacket.o tmp/objs/Cedar/IPsec_IPC.o tmp/objs/Cedar/IPsec_L2TP.o tmp/objs/Cedar/IPsec_PPP.o tmp/objs/Cedar/IPsec_Win7.o tmp/objs/Cedar/Layer3.o tmp/objs/Cedar/Link.o tmp/objs/Cedar/Listener.o tmp/objs/Cedar/Logging.o tmp/objs/Cedar/Nat.o tmp/objs/Cedar/NativeStack.o tmp/objs/Cedar/NM.o tmp/objs/Cedar/NullLan.o tmp/objs/Cedar/Protocol.o tmp/objs/Cedar/Radius.o tmp/objs/Cedar/Remote.o tmp/objs/Cedar/Sam.o tmp/objs/Cedar/SecureInfo.o tmp/objs/Cedar/SecureNAT.o tmp/objs/Cedar/SeLowUser.o tmp/objs/Cedar/Server.o tmp/objs/Cedar/Session.o tmp/objs/Cedar/SM.o tmp/objs/Cedar/SW.o tmp/objs/Cedar/UdpAccel.o tmp/objs/Cedar/UT.o tmp/objs/Cedar/VG.o tmp/objs/Cedar/Virtual.o tmp/objs/Cedar/VLan.o tmp/objs/Cedar/VLanUnix.o tmp/objs/Cedar/VLanWin32.o tmp/objs/Cedar/WaterMark.o tmp/objs/Cedar/WebUI.o tmp/objs/Cedar/WinUi.o tmp/objs/Cedar/Wpc.o
-HAMCORE_FILES=src/bin/hamcore/authors.txt src/bin/hamcore/backup_dir_readme.txt src/bin/hamcore/empty.config src/bin/hamcore/empty_sevpnclient.config src/bin/hamcore/eula.txt src/bin/hamcore/install_src.dat src/bin/hamcore/lang.config src/bin/hamcore/languages.txt src/bin/hamcore/languages_wine.txt src/bin/hamcore/legal.txt src/bin/hamcore/openvpn_readme.pdf src/bin/hamcore/openvpn_readme.txt src/bin/hamcore/openvpn_sample.ovpn src/bin/hamcore/root_certs.dat src/bin/hamcore/SOURCES_OF_BINARY_FILES.TXT src/bin/hamcore/strtable_cn.stb src/bin/hamcore/strtable_en.stb src/bin/hamcore/strtable_ja.stb src/bin/hamcore/vpnweb_sample_cn.htm src/bin/hamcore/vpnweb_sample_en.htm src/bin/hamcore/vpnweb_sample_ja.htm src/bin/hamcore/warning_cn.txt src/bin/hamcore/warning_en.txt src/bin/hamcore/warning_ja.txt src/bin/hamcore/webui/cryptcom.cgi src/bin/hamcore/webui/edituser.cgi src/bin/hamcore/webui/error.cgi src/bin/hamcore/webui/hub.cgi src/bin/hamcore/webui/license.cgi src/bin/hamcore/webui/listener.cgi src/bin/hamcore/webui/localbridge.cgi src/bin/hamcore/webui/login.cgi src/bin/hamcore/webui/newhub.cgi src/bin/hamcore/webui/redirect.cgi src/bin/hamcore/webui/securenat.cgi src/bin/hamcore/webui/server.cgi src/bin/hamcore/webui/session.cgi src/bin/hamcore/webui/user.cgi src/bin/hamcore/webui/webui.css
+HAMCORE_FILES=src/bin/hamcore/authors.txt src/bin/hamcore/backup_dir_readme.txt src/bin/hamcore/empty.config src/bin/hamcore/empty_sevpnclient.config src/bin/hamcore/eula.txt src/bin/hamcore/install_src.dat src/bin/hamcore/languages.txt src/bin/hamcore/languages_wine.txt src/bin/hamcore/legal.txt src/bin/hamcore/openvpn_readme.pdf src/bin/hamcore/openvpn_readme.txt src/bin/hamcore/openvpn_sample.ovpn src/bin/hamcore/root_certs.dat src/bin/hamcore/SOURCES_OF_BINARY_FILES.TXT src/bin/hamcore/strtable_cn.stb src/bin/hamcore/strtable_en.stb src/bin/hamcore/strtable_ja.stb src/bin/hamcore/vpnserver_api_doc.html src/bin/hamcore/vpnweb_sample_cn.htm src/bin/hamcore/vpnweb_sample_en.htm src/bin/hamcore/vpnweb_sample_ja.htm src/bin/hamcore/warning_cn.txt src/bin/hamcore/warning_en.txt src/bin/hamcore/warning_ja.txt src/bin/hamcore/webui/cryptcom.cgi src/bin/hamcore/webui/edituser.cgi src/bin/hamcore/webui/error.cgi src/bin/hamcore/webui/hub.cgi src/bin/hamcore/webui/license.cgi src/bin/hamcore/webui/listener.cgi src/bin/hamcore/webui/localbridge.cgi src/bin/hamcore/webui/login.cgi src/bin/hamcore/webui/newhub.cgi src/bin/hamcore/webui/redirect.cgi src/bin/hamcore/webui/securenat.cgi src/bin/hamcore/webui/server.cgi src/bin/hamcore/webui/session.cgi src/bin/hamcore/webui/user.cgi src/bin/hamcore/webui/webui.css src/bin/hamcore/wwwroot/admin/default/.gitignore src/bin/hamcore/wwwroot/admin/default/.vscode/launch.json src/bin/hamcore/wwwroot/admin/default/.vscode/settings.json src/bin/hamcore/wwwroot/admin/default/.vscode/tasks.json src/bin/hamcore/wwwroot/admin/default/hub.html src/bin/hamcore/wwwroot/admin/default/include_footer.html src/bin/hamcore/wwwroot/admin/default/include_head.html src/bin/hamcore/wwwroot/admin/default/include_menu.html src/bin/hamcore/wwwroot/admin/default/index.html src/bin/hamcore/wwwroot/admin/default/out_webpack/bundle.js src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts.map src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts.map src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts.map src/bin/hamcore/wwwroot/admin/default/package.json src/bin/hamcore/wwwroot/admin/default/package-lock.json src/bin/hamcore/wwwroot/admin/default/src/ts/main.ts src/bin/hamcore/wwwroot/admin/default/theme.css src/bin/hamcore/wwwroot/admin/default/tsconfig.json src/bin/hamcore/wwwroot/admin/default/tsconfig_webpack.json src/bin/hamcore/wwwroot/admin/default/tslint.json src/bin/hamcore/wwwroot/admin/default/webpack.config.js src/bin/hamcore/wwwroot/admin/index.html src/bin/hamcore/wwwroot/admin/README.md src/bin/hamcore/wwwroot/index.html
# Build Action
default: build
diff --git a/src/makefiles/openbsd_64bit.mak b/src/makefiles/openbsd_64bit.mak
index 28a02f3e..80f65701 100644
--- a/src/makefiles/openbsd_64bit.mak
+++ b/src/makefiles/openbsd_64bit.mak
@@ -89,7 +89,7 @@ HEADERS_MAYAQUA=src/Mayaqua/Cfg.h src/Mayaqua/cryptoki.h src/Mayaqua/Encrypt.h s
HEADERS_CEDAR=src/Cedar/Account.h src/Cedar/Admin.h src/Cedar/AzureClient.h src/Cedar/AzureServer.h src/Cedar/Bridge.h src/Cedar/BridgeUnix.h src/Cedar/BridgeWin32.h src/Cedar/Cedar.h src/Cedar/CedarPch.h src/Cedar/CedarType.h src/Cedar/Client.h src/Cedar/CM.h src/Cedar/CMInner.h src/Cedar/Command.h src/Cedar/Connection.h src/Cedar/Console.h src/Cedar/Database.h src/Cedar/DDNS.h src/Cedar/EM.h src/Cedar/EMInner.h src/Cedar/EtherLog.h src/Cedar/Hub.h src/Cedar/Interop_OpenVPN.h src/Cedar/Interop_SSTP.h src/Cedar/IPsec.h src/Cedar/IPsec_EtherIP.h src/Cedar/IPsec_IKE.h src/Cedar/IPsec_IkePacket.h src/Cedar/IPsec_IPC.h src/Cedar/IPsec_L2TP.h src/Cedar/IPsec_PPP.h src/Cedar/IPsec_Win7.h src/Cedar/IPsec_Win7Inner.h src/Cedar/Layer3.h src/Cedar/Link.h src/Cedar/Listener.h src/Cedar/Logging.h src/Cedar/Nat.h src/Cedar/NativeStack.h src/Cedar/netcfgn.h src/Cedar/netcfgx.h src/Cedar/NM.h src/Cedar/NMInner.h src/Cedar/NullLan.h src/Cedar/Protocol.h src/Cedar/Radius.h src/Cedar/Remote.h src/Cedar/Sam.h src/Cedar/SecureInfo.h src/Cedar/SecureNAT.h src/Cedar/SeLowUser.h src/Cedar/Server.h src/Cedar/Session.h src/Cedar/SM.h src/Cedar/SMInner.h src/Cedar/SW.h src/Cedar/SWInner.h src/Cedar/UdpAccel.h src/Cedar/UT.h src/Cedar/VG.h src/Cedar/Virtual.h src/Cedar/VLan.h src/Cedar/VLanUnix.h src/Cedar/VLanWin32.h src/Cedar/WaterMark.h src/Cedar/WebUI.h src/Cedar/Win32Com.h src/Cedar/winpcap/bittypes.h src/Cedar/winpcap/bucket_lookup.h src/Cedar/winpcap/count_packets.h src/Cedar/winpcap/Devioctl.h src/Cedar/winpcap/Gnuc.h src/Cedar/winpcap/ip6_misc.h src/Cedar/winpcap/memory_t.h src/Cedar/winpcap/normal_lookup.h src/Cedar/winpcap/Ntddndis.h src/Cedar/winpcap/Ntddpack.h src/Cedar/winpcap/Packet32.h src/Cedar/winpcap/pcap.h src/Cedar/winpcap/pcap-bpf.h src/Cedar/winpcap/pcap-int.h src/Cedar/winpcap/pcap-stdinc.h src/Cedar/winpcap/pthread.h src/Cedar/winpcap/remote-ext.h src/Cedar/winpcap/sched.h src/Cedar/winpcap/semaphore.h src/Cedar/winpcap/tcp_session.h src/Cedar/winpcap/time_calls.h src/Cedar/winpcap/tme.h src/Cedar/winpcap/Win32-Extensions.h src/Cedar/WinUi.h src/Cedar/Wpc.h
OBJECTS_MAYAQUA=tmp/objs/Mayaqua/Cfg.o tmp/objs/Mayaqua/Encrypt.o tmp/objs/Mayaqua/FileIO.o tmp/objs/Mayaqua/Internat.o tmp/objs/Mayaqua/Kernel.o tmp/objs/Mayaqua/Mayaqua.o tmp/objs/Mayaqua/Memory.o tmp/objs/Mayaqua/Microsoft.o tmp/objs/Mayaqua/Network.o tmp/objs/Mayaqua/Object.o tmp/objs/Mayaqua/OS.o tmp/objs/Mayaqua/Pack.o tmp/objs/Mayaqua/Secure.o tmp/objs/Mayaqua/Str.o tmp/objs/Mayaqua/Table.o tmp/objs/Mayaqua/TcpIp.o tmp/objs/Mayaqua/Tick64.o tmp/objs/Mayaqua/Tracking.o tmp/objs/Mayaqua/Unix.o tmp/objs/Mayaqua/Win32.o
OBJECTS_CEDAR=tmp/objs/Cedar/Account.o tmp/objs/Cedar/Admin.o tmp/objs/Cedar/AzureClient.o tmp/objs/Cedar/AzureServer.o tmp/objs/Cedar/Bridge.o tmp/objs/Cedar/BridgeUnix.o tmp/objs/Cedar/BridgeWin32.o tmp/objs/Cedar/Cedar.o tmp/objs/Cedar/CedarPch.o tmp/objs/Cedar/Client.o tmp/objs/Cedar/CM.o tmp/objs/Cedar/Command.o tmp/objs/Cedar/Connection.o tmp/objs/Cedar/Console.o tmp/objs/Cedar/Database.o tmp/objs/Cedar/DDNS.o tmp/objs/Cedar/EM.o tmp/objs/Cedar/EtherLog.o tmp/objs/Cedar/Hub.o tmp/objs/Cedar/Interop_OpenVPN.o tmp/objs/Cedar/Interop_SSTP.o tmp/objs/Cedar/IPsec.o tmp/objs/Cedar/IPsec_EtherIP.o tmp/objs/Cedar/IPsec_IKE.o tmp/objs/Cedar/IPsec_IkePacket.o tmp/objs/Cedar/IPsec_IPC.o tmp/objs/Cedar/IPsec_L2TP.o tmp/objs/Cedar/IPsec_PPP.o tmp/objs/Cedar/IPsec_Win7.o tmp/objs/Cedar/Layer3.o tmp/objs/Cedar/Link.o tmp/objs/Cedar/Listener.o tmp/objs/Cedar/Logging.o tmp/objs/Cedar/Nat.o tmp/objs/Cedar/NativeStack.o tmp/objs/Cedar/NM.o tmp/objs/Cedar/NullLan.o tmp/objs/Cedar/Protocol.o tmp/objs/Cedar/Radius.o tmp/objs/Cedar/Remote.o tmp/objs/Cedar/Sam.o tmp/objs/Cedar/SecureInfo.o tmp/objs/Cedar/SecureNAT.o tmp/objs/Cedar/SeLowUser.o tmp/objs/Cedar/Server.o tmp/objs/Cedar/Session.o tmp/objs/Cedar/SM.o tmp/objs/Cedar/SW.o tmp/objs/Cedar/UdpAccel.o tmp/objs/Cedar/UT.o tmp/objs/Cedar/VG.o tmp/objs/Cedar/Virtual.o tmp/objs/Cedar/VLan.o tmp/objs/Cedar/VLanUnix.o tmp/objs/Cedar/VLanWin32.o tmp/objs/Cedar/WaterMark.o tmp/objs/Cedar/WebUI.o tmp/objs/Cedar/WinUi.o tmp/objs/Cedar/Wpc.o
-HAMCORE_FILES=src/bin/hamcore/authors.txt src/bin/hamcore/backup_dir_readme.txt src/bin/hamcore/empty.config src/bin/hamcore/empty_sevpnclient.config src/bin/hamcore/eula.txt src/bin/hamcore/install_src.dat src/bin/hamcore/lang.config src/bin/hamcore/languages.txt src/bin/hamcore/languages_wine.txt src/bin/hamcore/legal.txt src/bin/hamcore/openvpn_readme.pdf src/bin/hamcore/openvpn_readme.txt src/bin/hamcore/openvpn_sample.ovpn src/bin/hamcore/root_certs.dat src/bin/hamcore/SOURCES_OF_BINARY_FILES.TXT src/bin/hamcore/strtable_cn.stb src/bin/hamcore/strtable_en.stb src/bin/hamcore/strtable_ja.stb src/bin/hamcore/vpnweb_sample_cn.htm src/bin/hamcore/vpnweb_sample_en.htm src/bin/hamcore/vpnweb_sample_ja.htm src/bin/hamcore/warning_cn.txt src/bin/hamcore/warning_en.txt src/bin/hamcore/warning_ja.txt src/bin/hamcore/webui/cryptcom.cgi src/bin/hamcore/webui/edituser.cgi src/bin/hamcore/webui/error.cgi src/bin/hamcore/webui/hub.cgi src/bin/hamcore/webui/license.cgi src/bin/hamcore/webui/listener.cgi src/bin/hamcore/webui/localbridge.cgi src/bin/hamcore/webui/login.cgi src/bin/hamcore/webui/newhub.cgi src/bin/hamcore/webui/redirect.cgi src/bin/hamcore/webui/securenat.cgi src/bin/hamcore/webui/server.cgi src/bin/hamcore/webui/session.cgi src/bin/hamcore/webui/user.cgi src/bin/hamcore/webui/webui.css
+HAMCORE_FILES=src/bin/hamcore/authors.txt src/bin/hamcore/backup_dir_readme.txt src/bin/hamcore/empty.config src/bin/hamcore/empty_sevpnclient.config src/bin/hamcore/eula.txt src/bin/hamcore/install_src.dat src/bin/hamcore/languages.txt src/bin/hamcore/languages_wine.txt src/bin/hamcore/legal.txt src/bin/hamcore/openvpn_readme.pdf src/bin/hamcore/openvpn_readme.txt src/bin/hamcore/openvpn_sample.ovpn src/bin/hamcore/root_certs.dat src/bin/hamcore/SOURCES_OF_BINARY_FILES.TXT src/bin/hamcore/strtable_cn.stb src/bin/hamcore/strtable_en.stb src/bin/hamcore/strtable_ja.stb src/bin/hamcore/vpnserver_api_doc.html src/bin/hamcore/vpnweb_sample_cn.htm src/bin/hamcore/vpnweb_sample_en.htm src/bin/hamcore/vpnweb_sample_ja.htm src/bin/hamcore/warning_cn.txt src/bin/hamcore/warning_en.txt src/bin/hamcore/warning_ja.txt src/bin/hamcore/webui/cryptcom.cgi src/bin/hamcore/webui/edituser.cgi src/bin/hamcore/webui/error.cgi src/bin/hamcore/webui/hub.cgi src/bin/hamcore/webui/license.cgi src/bin/hamcore/webui/listener.cgi src/bin/hamcore/webui/localbridge.cgi src/bin/hamcore/webui/login.cgi src/bin/hamcore/webui/newhub.cgi src/bin/hamcore/webui/redirect.cgi src/bin/hamcore/webui/securenat.cgi src/bin/hamcore/webui/server.cgi src/bin/hamcore/webui/session.cgi src/bin/hamcore/webui/user.cgi src/bin/hamcore/webui/webui.css src/bin/hamcore/wwwroot/admin/default/.gitignore src/bin/hamcore/wwwroot/admin/default/.vscode/launch.json src/bin/hamcore/wwwroot/admin/default/.vscode/settings.json src/bin/hamcore/wwwroot/admin/default/.vscode/tasks.json src/bin/hamcore/wwwroot/admin/default/hub.html src/bin/hamcore/wwwroot/admin/default/include_footer.html src/bin/hamcore/wwwroot/admin/default/include_head.html src/bin/hamcore/wwwroot/admin/default/include_menu.html src/bin/hamcore/wwwroot/admin/default/index.html src/bin/hamcore/wwwroot/admin/default/out_webpack/bundle.js src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts.map src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts.map src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts.map src/bin/hamcore/wwwroot/admin/default/package.json src/bin/hamcore/wwwroot/admin/default/package-lock.json src/bin/hamcore/wwwroot/admin/default/src/ts/main.ts src/bin/hamcore/wwwroot/admin/default/theme.css src/bin/hamcore/wwwroot/admin/default/tsconfig.json src/bin/hamcore/wwwroot/admin/default/tsconfig_webpack.json src/bin/hamcore/wwwroot/admin/default/tslint.json src/bin/hamcore/wwwroot/admin/default/webpack.config.js src/bin/hamcore/wwwroot/admin/index.html src/bin/hamcore/wwwroot/admin/README.md src/bin/hamcore/wwwroot/index.html
# Build Action
default: build
diff --git a/src/makefiles/solaris_32bit.mak b/src/makefiles/solaris_32bit.mak
index 6085c9f0..40b163f3 100644
--- a/src/makefiles/solaris_32bit.mak
+++ b/src/makefiles/solaris_32bit.mak
@@ -89,7 +89,7 @@ HEADERS_MAYAQUA=src/Mayaqua/Cfg.h src/Mayaqua/cryptoki.h src/Mayaqua/Encrypt.h s
HEADERS_CEDAR=src/Cedar/Account.h src/Cedar/Admin.h src/Cedar/AzureClient.h src/Cedar/AzureServer.h src/Cedar/Bridge.h src/Cedar/BridgeUnix.h src/Cedar/BridgeWin32.h src/Cedar/Cedar.h src/Cedar/CedarPch.h src/Cedar/CedarType.h src/Cedar/Client.h src/Cedar/CM.h src/Cedar/CMInner.h src/Cedar/Command.h src/Cedar/Connection.h src/Cedar/Console.h src/Cedar/Database.h src/Cedar/DDNS.h src/Cedar/EM.h src/Cedar/EMInner.h src/Cedar/EtherLog.h src/Cedar/Hub.h src/Cedar/Interop_OpenVPN.h src/Cedar/Interop_SSTP.h src/Cedar/IPsec.h src/Cedar/IPsec_EtherIP.h src/Cedar/IPsec_IKE.h src/Cedar/IPsec_IkePacket.h src/Cedar/IPsec_IPC.h src/Cedar/IPsec_L2TP.h src/Cedar/IPsec_PPP.h src/Cedar/IPsec_Win7.h src/Cedar/IPsec_Win7Inner.h src/Cedar/Layer3.h src/Cedar/Link.h src/Cedar/Listener.h src/Cedar/Logging.h src/Cedar/Nat.h src/Cedar/NativeStack.h src/Cedar/netcfgn.h src/Cedar/netcfgx.h src/Cedar/NM.h src/Cedar/NMInner.h src/Cedar/NullLan.h src/Cedar/Protocol.h src/Cedar/Radius.h src/Cedar/Remote.h src/Cedar/Sam.h src/Cedar/SecureInfo.h src/Cedar/SecureNAT.h src/Cedar/SeLowUser.h src/Cedar/Server.h src/Cedar/Session.h src/Cedar/SM.h src/Cedar/SMInner.h src/Cedar/SW.h src/Cedar/SWInner.h src/Cedar/UdpAccel.h src/Cedar/UT.h src/Cedar/VG.h src/Cedar/Virtual.h src/Cedar/VLan.h src/Cedar/VLanUnix.h src/Cedar/VLanWin32.h src/Cedar/WaterMark.h src/Cedar/WebUI.h src/Cedar/Win32Com.h src/Cedar/winpcap/bittypes.h src/Cedar/winpcap/bucket_lookup.h src/Cedar/winpcap/count_packets.h src/Cedar/winpcap/Devioctl.h src/Cedar/winpcap/Gnuc.h src/Cedar/winpcap/ip6_misc.h src/Cedar/winpcap/memory_t.h src/Cedar/winpcap/normal_lookup.h src/Cedar/winpcap/Ntddndis.h src/Cedar/winpcap/Ntddpack.h src/Cedar/winpcap/Packet32.h src/Cedar/winpcap/pcap.h src/Cedar/winpcap/pcap-bpf.h src/Cedar/winpcap/pcap-int.h src/Cedar/winpcap/pcap-stdinc.h src/Cedar/winpcap/pthread.h src/Cedar/winpcap/remote-ext.h src/Cedar/winpcap/sched.h src/Cedar/winpcap/semaphore.h src/Cedar/winpcap/tcp_session.h src/Cedar/winpcap/time_calls.h src/Cedar/winpcap/tme.h src/Cedar/winpcap/Win32-Extensions.h src/Cedar/WinUi.h src/Cedar/Wpc.h
OBJECTS_MAYAQUA=tmp/objs/Mayaqua/Cfg.o tmp/objs/Mayaqua/Encrypt.o tmp/objs/Mayaqua/FileIO.o tmp/objs/Mayaqua/Internat.o tmp/objs/Mayaqua/Kernel.o tmp/objs/Mayaqua/Mayaqua.o tmp/objs/Mayaqua/Memory.o tmp/objs/Mayaqua/Microsoft.o tmp/objs/Mayaqua/Network.o tmp/objs/Mayaqua/Object.o tmp/objs/Mayaqua/OS.o tmp/objs/Mayaqua/Pack.o tmp/objs/Mayaqua/Secure.o tmp/objs/Mayaqua/Str.o tmp/objs/Mayaqua/Table.o tmp/objs/Mayaqua/TcpIp.o tmp/objs/Mayaqua/Tick64.o tmp/objs/Mayaqua/Tracking.o tmp/objs/Mayaqua/Unix.o tmp/objs/Mayaqua/Win32.o
OBJECTS_CEDAR=tmp/objs/Cedar/Account.o tmp/objs/Cedar/Admin.o tmp/objs/Cedar/AzureClient.o tmp/objs/Cedar/AzureServer.o tmp/objs/Cedar/Bridge.o tmp/objs/Cedar/BridgeUnix.o tmp/objs/Cedar/BridgeWin32.o tmp/objs/Cedar/Cedar.o tmp/objs/Cedar/CedarPch.o tmp/objs/Cedar/Client.o tmp/objs/Cedar/CM.o tmp/objs/Cedar/Command.o tmp/objs/Cedar/Connection.o tmp/objs/Cedar/Console.o tmp/objs/Cedar/Database.o tmp/objs/Cedar/DDNS.o tmp/objs/Cedar/EM.o tmp/objs/Cedar/EtherLog.o tmp/objs/Cedar/Hub.o tmp/objs/Cedar/Interop_OpenVPN.o tmp/objs/Cedar/Interop_SSTP.o tmp/objs/Cedar/IPsec.o tmp/objs/Cedar/IPsec_EtherIP.o tmp/objs/Cedar/IPsec_IKE.o tmp/objs/Cedar/IPsec_IkePacket.o tmp/objs/Cedar/IPsec_IPC.o tmp/objs/Cedar/IPsec_L2TP.o tmp/objs/Cedar/IPsec_PPP.o tmp/objs/Cedar/IPsec_Win7.o tmp/objs/Cedar/Layer3.o tmp/objs/Cedar/Link.o tmp/objs/Cedar/Listener.o tmp/objs/Cedar/Logging.o tmp/objs/Cedar/Nat.o tmp/objs/Cedar/NativeStack.o tmp/objs/Cedar/NM.o tmp/objs/Cedar/NullLan.o tmp/objs/Cedar/Protocol.o tmp/objs/Cedar/Radius.o tmp/objs/Cedar/Remote.o tmp/objs/Cedar/Sam.o tmp/objs/Cedar/SecureInfo.o tmp/objs/Cedar/SecureNAT.o tmp/objs/Cedar/SeLowUser.o tmp/objs/Cedar/Server.o tmp/objs/Cedar/Session.o tmp/objs/Cedar/SM.o tmp/objs/Cedar/SW.o tmp/objs/Cedar/UdpAccel.o tmp/objs/Cedar/UT.o tmp/objs/Cedar/VG.o tmp/objs/Cedar/Virtual.o tmp/objs/Cedar/VLan.o tmp/objs/Cedar/VLanUnix.o tmp/objs/Cedar/VLanWin32.o tmp/objs/Cedar/WaterMark.o tmp/objs/Cedar/WebUI.o tmp/objs/Cedar/WinUi.o tmp/objs/Cedar/Wpc.o
-HAMCORE_FILES=src/bin/hamcore/authors.txt src/bin/hamcore/backup_dir_readme.txt src/bin/hamcore/empty.config src/bin/hamcore/empty_sevpnclient.config src/bin/hamcore/eula.txt src/bin/hamcore/install_src.dat src/bin/hamcore/lang.config src/bin/hamcore/languages.txt src/bin/hamcore/languages_wine.txt src/bin/hamcore/legal.txt src/bin/hamcore/openvpn_readme.pdf src/bin/hamcore/openvpn_readme.txt src/bin/hamcore/openvpn_sample.ovpn src/bin/hamcore/root_certs.dat src/bin/hamcore/SOURCES_OF_BINARY_FILES.TXT src/bin/hamcore/strtable_cn.stb src/bin/hamcore/strtable_en.stb src/bin/hamcore/strtable_ja.stb src/bin/hamcore/vpnweb_sample_cn.htm src/bin/hamcore/vpnweb_sample_en.htm src/bin/hamcore/vpnweb_sample_ja.htm src/bin/hamcore/warning_cn.txt src/bin/hamcore/warning_en.txt src/bin/hamcore/warning_ja.txt src/bin/hamcore/webui/cryptcom.cgi src/bin/hamcore/webui/edituser.cgi src/bin/hamcore/webui/error.cgi src/bin/hamcore/webui/hub.cgi src/bin/hamcore/webui/license.cgi src/bin/hamcore/webui/listener.cgi src/bin/hamcore/webui/localbridge.cgi src/bin/hamcore/webui/login.cgi src/bin/hamcore/webui/newhub.cgi src/bin/hamcore/webui/redirect.cgi src/bin/hamcore/webui/securenat.cgi src/bin/hamcore/webui/server.cgi src/bin/hamcore/webui/session.cgi src/bin/hamcore/webui/user.cgi src/bin/hamcore/webui/webui.css
+HAMCORE_FILES=src/bin/hamcore/authors.txt src/bin/hamcore/backup_dir_readme.txt src/bin/hamcore/empty.config src/bin/hamcore/empty_sevpnclient.config src/bin/hamcore/eula.txt src/bin/hamcore/install_src.dat src/bin/hamcore/languages.txt src/bin/hamcore/languages_wine.txt src/bin/hamcore/legal.txt src/bin/hamcore/openvpn_readme.pdf src/bin/hamcore/openvpn_readme.txt src/bin/hamcore/openvpn_sample.ovpn src/bin/hamcore/root_certs.dat src/bin/hamcore/SOURCES_OF_BINARY_FILES.TXT src/bin/hamcore/strtable_cn.stb src/bin/hamcore/strtable_en.stb src/bin/hamcore/strtable_ja.stb src/bin/hamcore/vpnserver_api_doc.html src/bin/hamcore/vpnweb_sample_cn.htm src/bin/hamcore/vpnweb_sample_en.htm src/bin/hamcore/vpnweb_sample_ja.htm src/bin/hamcore/warning_cn.txt src/bin/hamcore/warning_en.txt src/bin/hamcore/warning_ja.txt src/bin/hamcore/webui/cryptcom.cgi src/bin/hamcore/webui/edituser.cgi src/bin/hamcore/webui/error.cgi src/bin/hamcore/webui/hub.cgi src/bin/hamcore/webui/license.cgi src/bin/hamcore/webui/listener.cgi src/bin/hamcore/webui/localbridge.cgi src/bin/hamcore/webui/login.cgi src/bin/hamcore/webui/newhub.cgi src/bin/hamcore/webui/redirect.cgi src/bin/hamcore/webui/securenat.cgi src/bin/hamcore/webui/server.cgi src/bin/hamcore/webui/session.cgi src/bin/hamcore/webui/user.cgi src/bin/hamcore/webui/webui.css src/bin/hamcore/wwwroot/admin/default/.gitignore src/bin/hamcore/wwwroot/admin/default/.vscode/launch.json src/bin/hamcore/wwwroot/admin/default/.vscode/settings.json src/bin/hamcore/wwwroot/admin/default/.vscode/tasks.json src/bin/hamcore/wwwroot/admin/default/hub.html src/bin/hamcore/wwwroot/admin/default/include_footer.html src/bin/hamcore/wwwroot/admin/default/include_head.html src/bin/hamcore/wwwroot/admin/default/include_menu.html src/bin/hamcore/wwwroot/admin/default/index.html src/bin/hamcore/wwwroot/admin/default/out_webpack/bundle.js src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts.map src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts.map src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts.map src/bin/hamcore/wwwroot/admin/default/package.json src/bin/hamcore/wwwroot/admin/default/package-lock.json src/bin/hamcore/wwwroot/admin/default/src/ts/main.ts src/bin/hamcore/wwwroot/admin/default/theme.css src/bin/hamcore/wwwroot/admin/default/tsconfig.json src/bin/hamcore/wwwroot/admin/default/tsconfig_webpack.json src/bin/hamcore/wwwroot/admin/default/tslint.json src/bin/hamcore/wwwroot/admin/default/webpack.config.js src/bin/hamcore/wwwroot/admin/index.html src/bin/hamcore/wwwroot/admin/README.md src/bin/hamcore/wwwroot/index.html
# Build Action
default: build
diff --git a/src/makefiles/solaris_64bit.mak b/src/makefiles/solaris_64bit.mak
index 94427037..faea5f69 100644
--- a/src/makefiles/solaris_64bit.mak
+++ b/src/makefiles/solaris_64bit.mak
@@ -89,7 +89,7 @@ HEADERS_MAYAQUA=src/Mayaqua/Cfg.h src/Mayaqua/cryptoki.h src/Mayaqua/Encrypt.h s
HEADERS_CEDAR=src/Cedar/Account.h src/Cedar/Admin.h src/Cedar/AzureClient.h src/Cedar/AzureServer.h src/Cedar/Bridge.h src/Cedar/BridgeUnix.h src/Cedar/BridgeWin32.h src/Cedar/Cedar.h src/Cedar/CedarPch.h src/Cedar/CedarType.h src/Cedar/Client.h src/Cedar/CM.h src/Cedar/CMInner.h src/Cedar/Command.h src/Cedar/Connection.h src/Cedar/Console.h src/Cedar/Database.h src/Cedar/DDNS.h src/Cedar/EM.h src/Cedar/EMInner.h src/Cedar/EtherLog.h src/Cedar/Hub.h src/Cedar/Interop_OpenVPN.h src/Cedar/Interop_SSTP.h src/Cedar/IPsec.h src/Cedar/IPsec_EtherIP.h src/Cedar/IPsec_IKE.h src/Cedar/IPsec_IkePacket.h src/Cedar/IPsec_IPC.h src/Cedar/IPsec_L2TP.h src/Cedar/IPsec_PPP.h src/Cedar/IPsec_Win7.h src/Cedar/IPsec_Win7Inner.h src/Cedar/Layer3.h src/Cedar/Link.h src/Cedar/Listener.h src/Cedar/Logging.h src/Cedar/Nat.h src/Cedar/NativeStack.h src/Cedar/netcfgn.h src/Cedar/netcfgx.h src/Cedar/NM.h src/Cedar/NMInner.h src/Cedar/NullLan.h src/Cedar/Protocol.h src/Cedar/Radius.h src/Cedar/Remote.h src/Cedar/Sam.h src/Cedar/SecureInfo.h src/Cedar/SecureNAT.h src/Cedar/SeLowUser.h src/Cedar/Server.h src/Cedar/Session.h src/Cedar/SM.h src/Cedar/SMInner.h src/Cedar/SW.h src/Cedar/SWInner.h src/Cedar/UdpAccel.h src/Cedar/UT.h src/Cedar/VG.h src/Cedar/Virtual.h src/Cedar/VLan.h src/Cedar/VLanUnix.h src/Cedar/VLanWin32.h src/Cedar/WaterMark.h src/Cedar/WebUI.h src/Cedar/Win32Com.h src/Cedar/winpcap/bittypes.h src/Cedar/winpcap/bucket_lookup.h src/Cedar/winpcap/count_packets.h src/Cedar/winpcap/Devioctl.h src/Cedar/winpcap/Gnuc.h src/Cedar/winpcap/ip6_misc.h src/Cedar/winpcap/memory_t.h src/Cedar/winpcap/normal_lookup.h src/Cedar/winpcap/Ntddndis.h src/Cedar/winpcap/Ntddpack.h src/Cedar/winpcap/Packet32.h src/Cedar/winpcap/pcap.h src/Cedar/winpcap/pcap-bpf.h src/Cedar/winpcap/pcap-int.h src/Cedar/winpcap/pcap-stdinc.h src/Cedar/winpcap/pthread.h src/Cedar/winpcap/remote-ext.h src/Cedar/winpcap/sched.h src/Cedar/winpcap/semaphore.h src/Cedar/winpcap/tcp_session.h src/Cedar/winpcap/time_calls.h src/Cedar/winpcap/tme.h src/Cedar/winpcap/Win32-Extensions.h src/Cedar/WinUi.h src/Cedar/Wpc.h
OBJECTS_MAYAQUA=tmp/objs/Mayaqua/Cfg.o tmp/objs/Mayaqua/Encrypt.o tmp/objs/Mayaqua/FileIO.o tmp/objs/Mayaqua/Internat.o tmp/objs/Mayaqua/Kernel.o tmp/objs/Mayaqua/Mayaqua.o tmp/objs/Mayaqua/Memory.o tmp/objs/Mayaqua/Microsoft.o tmp/objs/Mayaqua/Network.o tmp/objs/Mayaqua/Object.o tmp/objs/Mayaqua/OS.o tmp/objs/Mayaqua/Pack.o tmp/objs/Mayaqua/Secure.o tmp/objs/Mayaqua/Str.o tmp/objs/Mayaqua/Table.o tmp/objs/Mayaqua/TcpIp.o tmp/objs/Mayaqua/Tick64.o tmp/objs/Mayaqua/Tracking.o tmp/objs/Mayaqua/Unix.o tmp/objs/Mayaqua/Win32.o
OBJECTS_CEDAR=tmp/objs/Cedar/Account.o tmp/objs/Cedar/Admin.o tmp/objs/Cedar/AzureClient.o tmp/objs/Cedar/AzureServer.o tmp/objs/Cedar/Bridge.o tmp/objs/Cedar/BridgeUnix.o tmp/objs/Cedar/BridgeWin32.o tmp/objs/Cedar/Cedar.o tmp/objs/Cedar/CedarPch.o tmp/objs/Cedar/Client.o tmp/objs/Cedar/CM.o tmp/objs/Cedar/Command.o tmp/objs/Cedar/Connection.o tmp/objs/Cedar/Console.o tmp/objs/Cedar/Database.o tmp/objs/Cedar/DDNS.o tmp/objs/Cedar/EM.o tmp/objs/Cedar/EtherLog.o tmp/objs/Cedar/Hub.o tmp/objs/Cedar/Interop_OpenVPN.o tmp/objs/Cedar/Interop_SSTP.o tmp/objs/Cedar/IPsec.o tmp/objs/Cedar/IPsec_EtherIP.o tmp/objs/Cedar/IPsec_IKE.o tmp/objs/Cedar/IPsec_IkePacket.o tmp/objs/Cedar/IPsec_IPC.o tmp/objs/Cedar/IPsec_L2TP.o tmp/objs/Cedar/IPsec_PPP.o tmp/objs/Cedar/IPsec_Win7.o tmp/objs/Cedar/Layer3.o tmp/objs/Cedar/Link.o tmp/objs/Cedar/Listener.o tmp/objs/Cedar/Logging.o tmp/objs/Cedar/Nat.o tmp/objs/Cedar/NativeStack.o tmp/objs/Cedar/NM.o tmp/objs/Cedar/NullLan.o tmp/objs/Cedar/Protocol.o tmp/objs/Cedar/Radius.o tmp/objs/Cedar/Remote.o tmp/objs/Cedar/Sam.o tmp/objs/Cedar/SecureInfo.o tmp/objs/Cedar/SecureNAT.o tmp/objs/Cedar/SeLowUser.o tmp/objs/Cedar/Server.o tmp/objs/Cedar/Session.o tmp/objs/Cedar/SM.o tmp/objs/Cedar/SW.o tmp/objs/Cedar/UdpAccel.o tmp/objs/Cedar/UT.o tmp/objs/Cedar/VG.o tmp/objs/Cedar/Virtual.o tmp/objs/Cedar/VLan.o tmp/objs/Cedar/VLanUnix.o tmp/objs/Cedar/VLanWin32.o tmp/objs/Cedar/WaterMark.o tmp/objs/Cedar/WebUI.o tmp/objs/Cedar/WinUi.o tmp/objs/Cedar/Wpc.o
-HAMCORE_FILES=src/bin/hamcore/authors.txt src/bin/hamcore/backup_dir_readme.txt src/bin/hamcore/empty.config src/bin/hamcore/empty_sevpnclient.config src/bin/hamcore/eula.txt src/bin/hamcore/install_src.dat src/bin/hamcore/lang.config src/bin/hamcore/languages.txt src/bin/hamcore/languages_wine.txt src/bin/hamcore/legal.txt src/bin/hamcore/openvpn_readme.pdf src/bin/hamcore/openvpn_readme.txt src/bin/hamcore/openvpn_sample.ovpn src/bin/hamcore/root_certs.dat src/bin/hamcore/SOURCES_OF_BINARY_FILES.TXT src/bin/hamcore/strtable_cn.stb src/bin/hamcore/strtable_en.stb src/bin/hamcore/strtable_ja.stb src/bin/hamcore/vpnweb_sample_cn.htm src/bin/hamcore/vpnweb_sample_en.htm src/bin/hamcore/vpnweb_sample_ja.htm src/bin/hamcore/warning_cn.txt src/bin/hamcore/warning_en.txt src/bin/hamcore/warning_ja.txt src/bin/hamcore/webui/cryptcom.cgi src/bin/hamcore/webui/edituser.cgi src/bin/hamcore/webui/error.cgi src/bin/hamcore/webui/hub.cgi src/bin/hamcore/webui/license.cgi src/bin/hamcore/webui/listener.cgi src/bin/hamcore/webui/localbridge.cgi src/bin/hamcore/webui/login.cgi src/bin/hamcore/webui/newhub.cgi src/bin/hamcore/webui/redirect.cgi src/bin/hamcore/webui/securenat.cgi src/bin/hamcore/webui/server.cgi src/bin/hamcore/webui/session.cgi src/bin/hamcore/webui/user.cgi src/bin/hamcore/webui/webui.css
+HAMCORE_FILES=src/bin/hamcore/authors.txt src/bin/hamcore/backup_dir_readme.txt src/bin/hamcore/empty.config src/bin/hamcore/empty_sevpnclient.config src/bin/hamcore/eula.txt src/bin/hamcore/install_src.dat src/bin/hamcore/languages.txt src/bin/hamcore/languages_wine.txt src/bin/hamcore/legal.txt src/bin/hamcore/openvpn_readme.pdf src/bin/hamcore/openvpn_readme.txt src/bin/hamcore/openvpn_sample.ovpn src/bin/hamcore/root_certs.dat src/bin/hamcore/SOURCES_OF_BINARY_FILES.TXT src/bin/hamcore/strtable_cn.stb src/bin/hamcore/strtable_en.stb src/bin/hamcore/strtable_ja.stb src/bin/hamcore/vpnserver_api_doc.html src/bin/hamcore/vpnweb_sample_cn.htm src/bin/hamcore/vpnweb_sample_en.htm src/bin/hamcore/vpnweb_sample_ja.htm src/bin/hamcore/warning_cn.txt src/bin/hamcore/warning_en.txt src/bin/hamcore/warning_ja.txt src/bin/hamcore/webui/cryptcom.cgi src/bin/hamcore/webui/edituser.cgi src/bin/hamcore/webui/error.cgi src/bin/hamcore/webui/hub.cgi src/bin/hamcore/webui/license.cgi src/bin/hamcore/webui/listener.cgi src/bin/hamcore/webui/localbridge.cgi src/bin/hamcore/webui/login.cgi src/bin/hamcore/webui/newhub.cgi src/bin/hamcore/webui/redirect.cgi src/bin/hamcore/webui/securenat.cgi src/bin/hamcore/webui/server.cgi src/bin/hamcore/webui/session.cgi src/bin/hamcore/webui/user.cgi src/bin/hamcore/webui/webui.css src/bin/hamcore/wwwroot/admin/default/.gitignore src/bin/hamcore/wwwroot/admin/default/.vscode/launch.json src/bin/hamcore/wwwroot/admin/default/.vscode/settings.json src/bin/hamcore/wwwroot/admin/default/.vscode/tasks.json src/bin/hamcore/wwwroot/admin/default/hub.html src/bin/hamcore/wwwroot/admin/default/include_footer.html src/bin/hamcore/wwwroot/admin/default/include_head.html src/bin/hamcore/wwwroot/admin/default/include_menu.html src/bin/hamcore/wwwroot/admin/default/index.html src/bin/hamcore/wwwroot/admin/default/out_webpack/bundle.js src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/index.d.ts.map src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/main.d.ts.map src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts src/bin/hamcore/wwwroot/admin/default/out_webpack/ts/vpnadmin.d.ts.map src/bin/hamcore/wwwroot/admin/default/package.json src/bin/hamcore/wwwroot/admin/default/package-lock.json src/bin/hamcore/wwwroot/admin/default/src/ts/main.ts src/bin/hamcore/wwwroot/admin/default/theme.css src/bin/hamcore/wwwroot/admin/default/tsconfig.json src/bin/hamcore/wwwroot/admin/default/tsconfig_webpack.json src/bin/hamcore/wwwroot/admin/default/tslint.json src/bin/hamcore/wwwroot/admin/default/webpack.config.js src/bin/hamcore/wwwroot/admin/index.html src/bin/hamcore/wwwroot/admin/README.md src/bin/hamcore/wwwroot/index.html
# Build Action
default: build
diff --git a/src/vpnweb/vpnweb.h b/src/vpnweb/vpnweb.h
index b2b4f269..a3f890d9 100644
--- a/src/vpnweb/vpnweb.h
+++ b/src/vpnweb/vpnweb.h
@@ -4,7 +4,7 @@
/* File created by MIDL compiler version 7.00.0500 */
-/* at Thu Feb 28 18:40:10 2019
+/* at Sun Jul 07 19:58:30 2019
*/
/* Compiler settings for .\vpnweb.idl:
Oicf, W1, Zp8, env=Win32 (32b run)
diff --git a/src/vpnweb/vpnweb_i.c b/src/vpnweb/vpnweb_i.c
index 8747f44c..ca3c4a3f 100644
--- a/src/vpnweb/vpnweb_i.c
+++ b/src/vpnweb/vpnweb_i.c
@@ -6,7 +6,7 @@
/* File created by MIDL compiler version 7.00.0500 */
-/* at Thu Feb 28 18:40:10 2019
+/* at Sun Jul 07 19:58:30 2019
*/
/* Compiler settings for .\vpnweb.idl:
Oicf, W1, Zp8, env=Win32 (32b run)
diff --git a/src/vpnweb/vpnweb_p.c b/src/vpnweb/vpnweb_p.c
index ebc5b8ff..824006cc 100644
--- a/src/vpnweb/vpnweb_p.c
+++ b/src/vpnweb/vpnweb_p.c
@@ -4,7 +4,7 @@
/* File created by MIDL compiler version 7.00.0500 */
-/* at Thu Feb 28 18:40:10 2019
+/* at Sun Jul 07 19:58:30 2019
*/
/* Compiler settings for .\vpnweb.idl:
Oicf, W1, Zp8, env=Win32 (32b run)