From 7369808b8408a16efcd3bf2b2a743ea1cc94a1b5 Mon Sep 17 00:00:00 2001 From: Quentin McGaw Date: Sat, 13 Jun 2020 14:08:29 -0400 Subject: [PATCH] Refactor (#174) - Goal was to simplify main.go complexity - Use common structures and interfaces for all vpn providers - Moved files around - Removed some alias models --- README.md | 2 +- cmd/gluetun/main.go | 163 ++---- go.mod | 6 +- go.sum | 8 + internal/constants/cyberghost.go | 372 ++++++------ internal/constants/mullvad.go | 530 +++++++++--------- internal/constants/pia.go | 127 ++--- internal/constants/splash.go | 4 +- internal/constants/surfshark.go | 308 +++++----- internal/constants/windscribe.go | 144 ++--- internal/cyberghost/cyberghost.go | 23 - internal/models/alias.go | 20 +- internal/models/cyberghost.go | 9 - internal/models/mullvad.go | 12 - internal/models/pia.go | 8 - internal/models/selection.go | 100 ++++ internal/models/servers.go | 33 ++ internal/models/surfshark.go | 8 - internal/models/windscribe.go | 8 - internal/mullvad/mullvad.go | 28 - internal/params/cyberghost.go | 11 +- internal/params/mullvad.go | 20 +- internal/params/openvpn.go | 7 +- internal/params/params.go | 18 +- internal/params/pia.go | 24 +- internal/params/surfshark.go | 7 +- internal/params/windscribe.go | 5 +- internal/pia/conf.go | 135 ----- internal/pia/pia.go | 43 -- internal/pia/portforward.go | 50 -- internal/provider/constants.go | 5 + .../conf.go => provider/cyberghost.go} | 45 +- .../{mullvad/conf.go => provider/mullvad.go} | 57 +- internal/provider/pia.go | 199 +++++++ internal/provider/provider.go | 38 ++ .../conf.go => provider/surfshark.go} | 52 +- .../conf.go => provider/windscribe.go} | 55 +- internal/settings/cyberghost.go | 54 -- internal/settings/mullvad.go | 56 -- internal/settings/openvpn.go | 38 +- internal/settings/pia.go | 74 --- internal/settings/providers.go | 137 +++++ internal/settings/settings.go | 42 +- internal/settings/surfshark.go | 42 -- internal/settings/windscribe.go | 49 -- internal/surfshark/surfshark.go | 24 - internal/windscribe/windscribe.go | 23 - 47 files changed, 1530 insertions(+), 1693 deletions(-) delete mode 100644 internal/cyberghost/cyberghost.go delete mode 100644 internal/models/cyberghost.go delete mode 100644 internal/models/mullvad.go delete mode 100644 internal/models/pia.go create mode 100644 internal/models/selection.go create mode 100644 internal/models/servers.go delete mode 100644 internal/models/surfshark.go delete mode 100644 internal/models/windscribe.go delete mode 100644 internal/mullvad/mullvad.go delete mode 100644 internal/pia/conf.go delete mode 100644 internal/pia/pia.go delete mode 100644 internal/pia/portforward.go create mode 100644 internal/provider/constants.go rename internal/{cyberghost/conf.go => provider/cyberghost.go} (64%) rename internal/{mullvad/conf.go => provider/mullvad.go} (54%) create mode 100644 internal/provider/pia.go create mode 100644 internal/provider/provider.go rename internal/{surfshark/conf.go => provider/surfshark.go} (57%) rename internal/{windscribe/conf.go => provider/windscribe.go} (57%) delete mode 100644 internal/settings/cyberghost.go delete mode 100644 internal/settings/mullvad.go delete mode 100644 internal/settings/pia.go create mode 100644 internal/settings/providers.go delete mode 100644 internal/settings/surfshark.go delete mode 100644 internal/settings/windscribe.go delete mode 100644 internal/surfshark/surfshark.go delete mode 100644 internal/windscribe/windscribe.go diff --git a/README.md b/README.md index 70841aa4..a969afaf 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ *Lightweight swiss-knife-like VPN client to tunnel to Private Internet Access, Mullvad, Windscribe, Surfshark and Cyberghost VPN servers, using Go, OpenVPN, iptables, DNS over TLS, ShadowSocks and Tinyproxy* -**ANNOUNCEMENT**: *New wiki available [here](https://github.com/qdm12/private-internet-access-docker/wiki)* +**ANNOUNCEMENT**: *Rather big code refactoring so things may break but I'll fix anything super quickly* diff --git a/cmd/gluetun/main.go b/cmd/gluetun/main.go index 8adade66..80a9f916 100644 --- a/cmd/gluetun/main.go +++ b/cmd/gluetun/main.go @@ -18,23 +18,19 @@ import ( "github.com/qdm12/private-internet-access-docker/internal/alpine" "github.com/qdm12/private-internet-access-docker/internal/cli" "github.com/qdm12/private-internet-access-docker/internal/constants" - "github.com/qdm12/private-internet-access-docker/internal/cyberghost" "github.com/qdm12/private-internet-access-docker/internal/dns" "github.com/qdm12/private-internet-access-docker/internal/firewall" "github.com/qdm12/private-internet-access-docker/internal/models" - "github.com/qdm12/private-internet-access-docker/internal/mullvad" "github.com/qdm12/private-internet-access-docker/internal/openvpn" "github.com/qdm12/private-internet-access-docker/internal/params" - "github.com/qdm12/private-internet-access-docker/internal/pia" + "github.com/qdm12/private-internet-access-docker/internal/provider" "github.com/qdm12/private-internet-access-docker/internal/publicip" "github.com/qdm12/private-internet-access-docker/internal/routing" "github.com/qdm12/private-internet-access-docker/internal/server" "github.com/qdm12/private-internet-access-docker/internal/settings" "github.com/qdm12/private-internet-access-docker/internal/shadowsocks" "github.com/qdm12/private-internet-access-docker/internal/splash" - "github.com/qdm12/private-internet-access-docker/internal/surfshark" "github.com/qdm12/private-internet-access-docker/internal/tinyproxy" - "github.com/qdm12/private-internet-access-docker/internal/windscribe" ) func main() { @@ -77,11 +73,6 @@ func _main(background context.Context, args []string) int { dnsConf := dns.NewConfigurator(logger, client, fileManager) firewallConf := firewall.NewConfigurator(logger) routingConf := routing.NewRouting(logger, fileManager) - piaConf := pia.NewConfigurator(client, fileManager, firewallConf) - mullvadConf := mullvad.NewConfigurator(fileManager, logger) - windscribeConf := windscribe.NewConfigurator(fileManager) - surfsharkConf := surfshark.NewConfigurator(fileManager) - cyberghostConf := cyberghost.NewConfigurator(fileManager) tinyProxyConf := tinyproxy.NewConfigurator(fileManager, logger) shadowsocksConf := shadowsocks.NewConfigurator(fileManager, logger) streamMerger := command.NewStreamMerger() @@ -98,6 +89,8 @@ func _main(background context.Context, args []string) int { fatalOnError(err) logger.Info(allSettings.String()) + providerConf := provider.New(allSettings.VPNSP, logger, client, fileManager, firewallConf) + if !allSettings.Firewall.Enabled { firewallConf.Disable() } @@ -115,25 +108,11 @@ func _main(background context.Context, args []string) int { fatalOnError(err) } - var openVPNUser, openVPNPassword string - switch allSettings.VPNSP { - case constants.PrivateInternetAccess: - openVPNUser = allSettings.PIA.User - openVPNPassword = allSettings.PIA.Password - case constants.Mullvad: - openVPNUser = allSettings.Mullvad.User - openVPNPassword = "m" - case constants.Windscribe: - openVPNUser = allSettings.Windscribe.User - openVPNPassword = allSettings.Windscribe.Password - case constants.Surfshark: - openVPNUser = allSettings.Surfshark.User - openVPNPassword = allSettings.Surfshark.Password - case constants.Cyberghost: - openVPNUser = allSettings.Cyberghost.User - openVPNPassword = allSettings.Cyberghost.Password - } - err = ovpnConf.WriteAuthFile(openVPNUser, openVPNPassword, allSettings.System.UID, allSettings.System.GID) + err = ovpnConf.WriteAuthFile( + allSettings.OpenVPN.User, + allSettings.OpenVPN.Password, + allSettings.System.UID, + allSettings.System.GID) fatalOnError(err) defaultInterface, defaultGateway, defaultSubnet, err := routingConf.DefaultRoute() @@ -156,96 +135,18 @@ func _main(background context.Context, args []string) int { waiter := command.NewWaiter() - var connections []models.OpenVPNConnection - switch allSettings.VPNSP { - case constants.PrivateInternetAccess: - connections, err = piaConf.GetOpenVPNConnections( - allSettings.PIA.Region, - allSettings.OpenVPN.NetworkProtocol, - allSettings.PIA.Encryption, - allSettings.OpenVPN.TargetIP) - if err != nil { - break - } - err = piaConf.BuildConf( - connections, - allSettings.PIA.Encryption, - allSettings.OpenVPN.Verbosity, - allSettings.System.UID, - allSettings.System.GID, - allSettings.OpenVPN.Root, - allSettings.OpenVPN.Cipher, - allSettings.OpenVPN.Auth) - case constants.Mullvad: - connections, err = mullvadConf.GetOpenVPNConnections( - allSettings.Mullvad.Country, - allSettings.Mullvad.City, - allSettings.Mullvad.ISP, - allSettings.OpenVPN.NetworkProtocol, - allSettings.Mullvad.Port, - allSettings.OpenVPN.TargetIP) - if err != nil { - break - } - err = mullvadConf.BuildConf( - connections, - allSettings.OpenVPN.Verbosity, - allSettings.System.UID, - allSettings.System.GID, - allSettings.OpenVPN.Root, - allSettings.OpenVPN.Cipher) - case constants.Windscribe: - connections, err = windscribeConf.GetOpenVPNConnections( - allSettings.Windscribe.Region, - allSettings.OpenVPN.NetworkProtocol, - allSettings.Windscribe.Port, - allSettings.OpenVPN.TargetIP) - if err != nil { - break - } - err = windscribeConf.BuildConf( - connections, - allSettings.OpenVPN.Verbosity, - allSettings.System.UID, - allSettings.System.GID, - allSettings.OpenVPN.Root, - allSettings.OpenVPN.Cipher, - allSettings.OpenVPN.Auth) - case constants.Surfshark: - connections, err = surfsharkConf.GetOpenVPNConnections( - allSettings.Surfshark.Region, - allSettings.OpenVPN.NetworkProtocol, - allSettings.OpenVPN.TargetIP) - if err != nil { - break - } - err = surfsharkConf.BuildConf( - connections, - allSettings.OpenVPN.Verbosity, - allSettings.System.UID, - allSettings.System.GID, - allSettings.OpenVPN.Root, - allSettings.OpenVPN.Cipher, - allSettings.OpenVPN.Auth) - case constants.Cyberghost: - connections, err = cyberghostConf.GetOpenVPNConnections( - allSettings.Cyberghost.Group, - allSettings.Cyberghost.Region, - allSettings.OpenVPN.NetworkProtocol, - allSettings.OpenVPN.TargetIP) - if err != nil { - break - } - err = cyberghostConf.BuildConf( - connections, - allSettings.Cyberghost.ClientKey, - allSettings.OpenVPN.Verbosity, - allSettings.System.UID, - allSettings.System.GID, - allSettings.OpenVPN.Root, - allSettings.OpenVPN.Cipher, - allSettings.OpenVPN.Auth) - } + connections, err := providerConf.GetOpenVPNConnections(allSettings.Provider.ServerSelection) + fatalOnError(err) + err = providerConf.BuildConf( + connections, + allSettings.OpenVPN.Verbosity, + allSettings.System.UID, + allSettings.System.GID, + allSettings.OpenVPN.Root, + allSettings.OpenVPN.Cipher, + allSettings.OpenVPN.Auth, + allSettings.Provider.ExtraConfigOptions, + ) fatalOnError(err) err = routingConf.AddRoutesVia(ctx, allSettings.Firewall.AllowedSubnets, defaultGateway, defaultInterface) @@ -328,7 +229,7 @@ func _main(background context.Context, args []string) int { return case <-connectedCh: // blocks until openvpn is connected onConnected(ctx, allSettings, logger, dnsConf, fileManager, waiter, - streamMerger, httpServer, routingConf, defaultInterface, piaConf, firstRun) + streamMerger, httpServer, routingConf, defaultInterface, providerConf, firstRun) firstRun = false } } @@ -354,9 +255,9 @@ func _main(background context.Context, args []string) int { logger.Error(err) exitStatus = 1 } - if allSettings.PIA.PortForwarding.Enabled { - logger.Info("Clearing forwarded port status file %s", allSettings.PIA.PortForwarding.Filepath) - if err := fileManager.Remove(string(allSettings.PIA.PortForwarding.Filepath)); err != nil { + if allSettings.Provider.PortForwarding.Enabled { + logger.Info("Clearing forwarded port status file %s", allSettings.Provider.PortForwarding.Filepath) + if err := fileManager.Remove(string(allSettings.Provider.PortForwarding.Filepath)); err != nil { logger.Error(err) exitStatus = 1 } @@ -469,11 +370,11 @@ func onConnected(ctx context.Context, allSettings settings.Settings, logger logging.Logger, dnsConf dns.Configurator, fileManager files.FileManager, waiter command.Waiter, streamMerger command.StreamMerger, httpServer server.Server, routingConf routing.Routing, defaultInterface string, - piaConf pia.Configurator, firstRun bool, + providerConf provider.Provider, firstRun bool, ) { - if allSettings.PIA.PortForwarding.Enabled { + if allSettings.Provider.PortForwarding.Enabled { time.AfterFunc(5*time.Second, func() { - setupPortForwarding(logger, piaConf, allSettings.PIA, allSettings.System.UID, allSettings.System.GID) + setupPortForwarding(logger, providerConf, allSettings.Provider.PortForwarding.Filepath, allSettings.System.UID, allSettings.System.GID) }) } if allSettings.DNS.Enabled && firstRun { @@ -616,12 +517,12 @@ func unboundRunLoop(ctx context.Context, logger logging.Logger, dnsConf dns.Conf } } -func setupPortForwarding(logger logging.Logger, piaConf pia.Configurator, settings settings.PIA, uid, gid int) { +func setupPortForwarding(logger logging.Logger, providerConf provider.Provider, filepath models.Filepath, uid, gid int) { pfLogger := logger.WithPrefix("port forwarding: ") var port uint16 var err error for { - port, err = piaConf.GetPortForward() + port, err = providerConf.GetPortForward() if err != nil { pfLogger.Error(err) pfLogger.Info("retrying in 5 seconds...") @@ -631,13 +532,13 @@ func setupPortForwarding(logger logging.Logger, piaConf pia.Configurator, settin break } } - pfLogger.Info("writing forwarded port to %s", settings.PortForwarding.Filepath) - if err := piaConf.WritePortForward(settings.PortForwarding.Filepath, port, uid, gid); err != nil { + pfLogger.Info("writing forwarded port to %s", filepath) + if err := providerConf.WritePortForward(filepath, port, uid, gid); err != nil { pfLogger.Error(err) } ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() - if err := piaConf.AllowPortForwardFirewall(ctx, constants.TUN, port); err != nil { + if err := providerConf.AllowPortForwardFirewall(ctx, constants.TUN, port); err != nil { pfLogger.Error(err) } } diff --git a/go.mod b/go.mod index 9b571f7b..664d3bcb 100644 --- a/go.mod +++ b/go.mod @@ -5,8 +5,8 @@ go 1.14 require ( github.com/fatih/color v1.9.0 github.com/golang/mock v1.4.3 - github.com/kyokomi/emoji v2.2.2+incompatible + github.com/kyokomi/emoji v2.2.4+incompatible github.com/qdm12/golibs v0.0.0-20200528010515-765b7cd4f0db - github.com/stretchr/testify v1.5.1 - golang.org/x/sys v0.0.0-20200523222454-059865788121 + github.com/stretchr/testify v1.6.1 + golang.org/x/sys v0.0.0-20200610111108-226ff32320da ) diff --git a/go.sum b/go.sum index 66c58133..30831fbb 100644 --- a/go.sum +++ b/go.sum @@ -52,6 +52,8 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kyokomi/emoji v2.2.2+incompatible h1:gaQFbK2+uSxOR4iGZprJAbpmtqTrHhSdgOyIMD6Oidc= github.com/kyokomi/emoji v2.2.2+incompatible/go.mod h1:mZ6aGCD7yk8j6QY6KICwnZ2pxoszVseX1DNoGtU2tBA= +github.com/kyokomi/emoji v2.2.4+incompatible h1:np0woGKwx9LiHAQmwZx79Oc0rHpNw3o+3evou4BEPv4= +github.com/kyokomi/emoji v2.2.4+incompatible/go.mod h1:mZ6aGCD7yk8j6QY6KICwnZ2pxoszVseX1DNoGtU2tBA= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 h1:2gxZ0XQIU/5z3Z3bUBu+FXuk2pFbkN6tcwi/pjyaDic= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= @@ -81,6 +83,8 @@ github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJy github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= go.uber.org/atomic v1.5.0 h1:OI5t8sDa1Or+q8AeE+yKeB/SDYioSHAgcVljj9JIETY= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/multierr v1.3.0 h1:sFPn2GLc3poCkfrpIXGhBD2X0CMIo4Q/zSULXrj/+uc= @@ -108,6 +112,8 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121 h1:rITEj+UZHYC927n8GT97eC3zrpzXdb/voyeOuVKS46o= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200610111108-226ff32320da h1:bGb80FudwxpeucJUjPYJXuJ8Hk91vNtfvrymzwiei38= +golang.org/x/sys v0.0.0-20200610111108-226ff32320da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -126,6 +132,8 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= diff --git a/internal/constants/cyberghost.go b/internal/constants/cyberghost.go index 89e14bff..4ebdacd5 100644 --- a/internal/constants/cyberghost.go +++ b/internal/constants/cyberghost.go @@ -15,7 +15,7 @@ const ( func CyberghostRegionChoices() (choices []string) { uniqueChoices := map[string]struct{}{} for _, server := range CyberghostServers() { - uniqueChoices[string(server.Region)] = struct{}{} + uniqueChoices[server.Region] = struct{}{} } for choice := range uniqueChoices { choices = append(choices, choice) @@ -29,7 +29,7 @@ func CyberghostRegionChoices() (choices []string) { func CyberghostGroupChoices() (choices []string) { uniqueChoices := map[string]struct{}{} for _, server := range CyberghostServers() { - uniqueChoices[string(server.Group)] = struct{}{} + uniqueChoices[server.Group] = struct{}{} } for choice := range uniqueChoices { choices = append(choices, choice) @@ -42,189 +42,189 @@ func CyberghostGroupChoices() (choices []string) { func CyberghostServers() []models.CyberghostServer { return []models.CyberghostServer{ - {Region: models.CyberghostRegion("Albania"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{31, 171, 152, 99}, {31, 171, 152, 100}, {31, 171, 152, 102}, {31, 171, 152, 105}, {31, 171, 152, 107}, {31, 171, 152, 109}, {31, 171, 152, 133}, {31, 171, 152, 135}, {31, 171, 152, 136}, {31, 171, 152, 139}}}, - {Region: models.CyberghostRegion("Albania"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{31, 171, 152, 99}, {31, 171, 152, 101}, {31, 171, 152, 103}, {31, 171, 152, 105}, {31, 171, 152, 106}, {31, 171, 152, 133}, {31, 171, 152, 135}, {31, 171, 152, 137}, {31, 171, 152, 138}, {31, 171, 152, 139}}}, - {Region: models.CyberghostRegion("Algeria"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 133, 91, 7}, {45, 133, 91, 9}, {45, 133, 91, 12}, {45, 133, 91, 15}, {45, 133, 91, 17}, {45, 133, 91, 18}, {45, 133, 91, 20}, {45, 133, 91, 23}, {45, 133, 91, 24}, {45, 133, 91, 26}}}, - {Region: models.CyberghostRegion("Algeria"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 133, 91, 7}, {45, 133, 91, 10}, {45, 133, 91, 11}, {45, 133, 91, 15}, {45, 133, 91, 17}, {45, 133, 91, 18}, {45, 133, 91, 21}, {45, 133, 91, 25}, {45, 133, 91, 26}, {45, 133, 91, 29}}}, - {Region: models.CyberghostRegion("Andorra"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 139, 49, 10}, {45, 139, 49, 14}, {45, 139, 49, 15}, {45, 139, 49, 16}, {45, 139, 49, 17}, {45, 139, 49, 18}, {45, 139, 49, 19}, {45, 139, 49, 23}, {45, 139, 49, 25}, {45, 139, 49, 28}}}, - {Region: models.CyberghostRegion("Andorra"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 139, 49, 7}, {45, 139, 49, 9}, {45, 139, 49, 10}, {45, 139, 49, 12}, {45, 139, 49, 15}, {45, 139, 49, 16}, {45, 139, 49, 17}, {45, 139, 49, 25}, {45, 139, 49, 27}, {45, 139, 49, 28}}}, - {Region: models.CyberghostRegion("Argentina"), Group: models.CyberghostGroup("Premium TCP USA"), IPs: []net.IP{{190, 106, 130, 16}, {190, 106, 130, 17}, {190, 106, 130, 20}, {190, 106, 130, 22}, {190, 106, 130, 23}, {190, 106, 130, 34}, {190, 106, 130, 37}, {190, 106, 130, 38}, {190, 106, 130, 44}, {190, 106, 130, 45}}}, - {Region: models.CyberghostRegion("Argentina"), Group: models.CyberghostGroup("Premium UDP USA"), IPs: []net.IP{{190, 106, 130, 15}, {190, 106, 130, 16}, {190, 106, 130, 18}, {190, 106, 130, 19}, {190, 106, 130, 20}, {190, 106, 130, 34}, {190, 106, 130, 36}, {190, 106, 130, 37}, {190, 106, 130, 43}, {190, 106, 130, 52}}}, - {Region: models.CyberghostRegion("Armenia"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 139, 50, 10}, {45, 139, 50, 12}, {45, 139, 50, 14}, {45, 139, 50, 18}, {45, 139, 50, 19}, {45, 139, 50, 20}, {45, 139, 50, 21}, {45, 139, 50, 26}, {45, 139, 50, 27}, {45, 139, 50, 29}}}, - {Region: models.CyberghostRegion("Armenia"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 139, 50, 8}, {45, 139, 50, 10}, {45, 139, 50, 11}, {45, 139, 50, 14}, {45, 139, 50, 18}, {45, 139, 50, 20}, {45, 139, 50, 24}, {45, 139, 50, 26}, {45, 139, 50, 27}, {45, 139, 50, 29}}}, - {Region: models.CyberghostRegion("Australia"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{27, 50, 79, 3}, {27, 50, 79, 4}, {27, 50, 79, 5}, {27, 50, 79, 6}, {27, 50, 79, 9}, {27, 50, 79, 12}, {27, 50, 79, 14}, {103, 13, 101, 171}, {202, 130, 33, 114}, {202, 130, 33, 118}}}, - {Region: models.CyberghostRegion("Australia"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{27, 50, 79, 3}, {27, 50, 79, 6}, {27, 50, 79, 9}, {27, 50, 79, 10}, {27, 50, 79, 11}, {27, 50, 79, 13}, {103, 13, 101, 174}, {202, 130, 33, 114}, {202, 130, 33, 117}, {202, 130, 33, 118}}}, - {Region: models.CyberghostRegion("Austria"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{89, 187, 168, 133}, {89, 187, 168, 144}, {89, 187, 168, 150}, {89, 187, 168, 151}, {89, 187, 168, 162}, {89, 187, 168, 163}, {89, 187, 168, 164}, {89, 187, 168, 167}, {89, 187, 168, 178}, {89, 187, 168, 182}}}, - {Region: models.CyberghostRegion("Austria"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{89, 187, 168, 138}, {89, 187, 168, 139}, {89, 187, 168, 149}, {89, 187, 168, 150}, {89, 187, 168, 161}, {89, 187, 168, 165}, {89, 187, 168, 167}, {89, 187, 168, 168}, {89, 187, 168, 174}, {89, 187, 168, 182}}}, - {Region: models.CyberghostRegion("Bahamas"), Group: models.CyberghostGroup("Premium TCP USA"), IPs: []net.IP{{45, 132, 143, 8}, {45, 132, 143, 10}, {45, 132, 143, 11}, {45, 132, 143, 19}, {45, 132, 143, 24}, {45, 132, 143, 28}, {45, 132, 143, 31}, {45, 132, 143, 42}, {45, 132, 143, 43}, {45, 132, 143, 44}}}, - {Region: models.CyberghostRegion("Bahamas"), Group: models.CyberghostGroup("Premium UDP USA"), IPs: []net.IP{{45, 132, 143, 1}, {45, 132, 143, 2}, {45, 132, 143, 3}, {45, 132, 143, 5}, {45, 132, 143, 7}, {45, 132, 143, 18}, {45, 132, 143, 23}, {45, 132, 143, 30}, {45, 132, 143, 32}, {45, 132, 143, 48}}}, - {Region: models.CyberghostRegion("Bangladesh"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{45, 132, 142, 3}, {45, 132, 142, 8}, {45, 132, 142, 12}, {45, 132, 142, 20}, {45, 132, 142, 22}, {45, 132, 142, 26}, {45, 132, 142, 27}, {45, 132, 142, 37}, {45, 132, 142, 39}, {45, 132, 142, 42}}}, - {Region: models.CyberghostRegion("Bangladesh"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{45, 132, 142, 6}, {45, 132, 142, 8}, {45, 132, 142, 13}, {45, 132, 142, 18}, {45, 132, 142, 33}, {45, 132, 142, 35}, {45, 132, 142, 38}, {45, 132, 142, 41}, {45, 132, 142, 42}, {45, 132, 142, 45}}}, - {Region: models.CyberghostRegion("Belarus"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 132, 194, 3}, {45, 132, 194, 4}, {45, 132, 194, 26}, {45, 132, 194, 28}, {45, 132, 194, 34}, {45, 132, 194, 38}, {45, 132, 194, 39}, {45, 132, 194, 42}, {45, 132, 194, 44}, {45, 132, 194, 48}}}, - {Region: models.CyberghostRegion("Belarus"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 132, 194, 4}, {45, 132, 194, 5}, {45, 132, 194, 9}, {45, 132, 194, 10}, {45, 132, 194, 20}, {45, 132, 194, 25}, {45, 132, 194, 29}, {45, 132, 194, 31}, {45, 132, 194, 40}, {45, 132, 194, 45}}}, - {Region: models.CyberghostRegion("Belgium"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{37, 120, 143, 52}, {37, 120, 143, 55}, {37, 120, 143, 58}, {185, 210, 217, 10}, {185, 210, 217, 54}, {185, 210, 217, 244}, {185, 210, 217, 251}, {185, 232, 21, 119}, {193, 9, 114, 228}, {193, 9, 114, 230}}}, - {Region: models.CyberghostRegion("Belgium"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{5, 253, 205, 22}, {5, 253, 205, 23}, {37, 120, 143, 165}, {185, 210, 217, 14}, {185, 210, 217, 248}, {185, 210, 217, 254}, {193, 9, 114, 212}, {193, 9, 114, 213}, {193, 9, 114, 219}, {193, 9, 114, 228}}}, - {Region: models.CyberghostRegion("Bosnia and Herzegovina"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{185, 99, 3, 57}, {185, 99, 3, 58}, {185, 99, 3, 72}, {185, 99, 3, 73}, {185, 99, 3, 74}, {185, 99, 3, 130}, {185, 99, 3, 131}, {185, 99, 3, 134}, {185, 99, 3, 135}, {185, 99, 3, 136}}}, - {Region: models.CyberghostRegion("Bosnia and Herzegovina"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{185, 99, 3, 57}, {185, 99, 3, 58}, {185, 99, 3, 72}, {185, 99, 3, 73}, {185, 99, 3, 74}, {185, 99, 3, 130}, {185, 99, 3, 131}, {185, 99, 3, 134}, {185, 99, 3, 135}, {185, 99, 3, 136}}}, - {Region: models.CyberghostRegion("Brazil"), Group: models.CyberghostGroup("Premium TCP USA"), IPs: []net.IP{{45, 231, 207, 65}, {45, 231, 207, 67}, {45, 231, 207, 68}, {45, 231, 207, 69}, {45, 231, 207, 75}, {177, 67, 81, 170}, {181, 41, 203, 98}, {181, 41, 203, 100}, {181, 41, 203, 102}, {181, 41, 203, 110}}}, - {Region: models.CyberghostRegion("Brazil"), Group: models.CyberghostGroup("Premium UDP USA"), IPs: []net.IP{{45, 231, 207, 77}, {177, 67, 81, 163}, {177, 67, 81, 164}, {177, 67, 81, 165}, {177, 67, 81, 167}, {177, 67, 81, 170}, {177, 67, 81, 173}, {177, 67, 81, 174}, {181, 41, 203, 103}, {181, 41, 203, 104}}}, - {Region: models.CyberghostRegion("Bulgaria"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{37, 120, 152, 99}, {37, 120, 152, 102}, {37, 120, 152, 103}, {37, 120, 152, 104}, {37, 120, 152, 105}, {37, 120, 152, 106}, {37, 120, 152, 107}, {37, 120, 152, 108}, {37, 120, 152, 109}, {37, 120, 152, 110}}}, - {Region: models.CyberghostRegion("Bulgaria"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{37, 120, 152, 99}, {37, 120, 152, 100}, {37, 120, 152, 101}, {37, 120, 152, 103}, {37, 120, 152, 104}, {37, 120, 152, 105}, {37, 120, 152, 107}, {37, 120, 152, 108}, {37, 120, 152, 109}, {37, 120, 152, 110}}}, - {Region: models.CyberghostRegion("Cambodia"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{188, 215, 235, 36}, {188, 215, 235, 38}, {188, 215, 235, 39}, {188, 215, 235, 40}, {188, 215, 235, 43}, {188, 215, 235, 46}, {188, 215, 235, 47}, {188, 215, 235, 48}, {188, 215, 235, 51}, {188, 215, 235, 54}}}, - {Region: models.CyberghostRegion("Cambodia"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{188, 215, 235, 35}, {188, 215, 235, 36}, {188, 215, 235, 37}, {188, 215, 235, 38}, {188, 215, 235, 45}, {188, 215, 235, 46}, {188, 215, 235, 52}, {188, 215, 235, 53}, {188, 215, 235, 55}, {188, 215, 235, 58}}}, - {Region: models.CyberghostRegion("Canada"), Group: models.CyberghostGroup("Premium TCP USA"), IPs: []net.IP{{37, 120, 205, 8}, {37, 120, 205, 28}, {104, 245, 145, 163}, {104, 245, 146, 38}, {104, 245, 146, 101}, {176, 113, 74, 44}, {176, 113, 74, 52}, {176, 113, 74, 67}, {176, 113, 74, 126}, {176, 113, 74, 217}}}, - {Region: models.CyberghostRegion("Canada"), Group: models.CyberghostGroup("Premium UDP USA"), IPs: []net.IP{{37, 120, 205, 40}, {54, 39, 11, 194}, {104, 245, 145, 164}, {104, 245, 146, 41}, {139, 28, 218, 86}, {139, 28, 218, 87}, {176, 113, 74, 19}, {176, 113, 74, 25}, {176, 113, 74, 30}, {176, 113, 74, 195}}}, - {Region: models.CyberghostRegion("Chile"), Group: models.CyberghostGroup("Premium TCP USA"), IPs: []net.IP{{190, 105, 239, 129}, {190, 105, 239, 130}, {190, 105, 239, 131}, {190, 105, 239, 132}, {190, 105, 239, 133}, {190, 105, 239, 134}, {190, 105, 239, 135}, {190, 105, 239, 136}, {190, 105, 239, 137}, {190, 105, 239, 138}}}, - {Region: models.CyberghostRegion("Chile"), Group: models.CyberghostGroup("Premium UDP USA"), IPs: []net.IP{{190, 105, 239, 129}, {190, 105, 239, 130}, {190, 105, 239, 131}, {190, 105, 239, 132}, {190, 105, 239, 133}, {190, 105, 239, 134}, {190, 105, 239, 135}, {190, 105, 239, 136}, {190, 105, 239, 137}, {190, 105, 239, 138}}}, - {Region: models.CyberghostRegion("China"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{45, 132, 193, 2}, {45, 132, 193, 3}, {45, 132, 193, 9}, {45, 132, 193, 10}, {45, 132, 193, 12}, {45, 132, 193, 13}, {45, 132, 193, 32}, {45, 132, 193, 36}, {45, 132, 193, 43}, {45, 132, 193, 45}}}, - {Region: models.CyberghostRegion("China"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{45, 132, 193, 2}, {45, 132, 193, 3}, {45, 132, 193, 4}, {45, 132, 193, 14}, {45, 132, 193, 19}, {45, 132, 193, 22}, {45, 132, 193, 30}, {45, 132, 193, 35}, {45, 132, 193, 36}, {45, 132, 193, 42}}}, - {Region: models.CyberghostRegion("Colombia"), Group: models.CyberghostGroup("Premium TCP USA"), IPs: []net.IP{{190, 105, 229, 19}, {190, 105, 229, 20}, {190, 105, 229, 21}, {190, 105, 229, 22}}}, - {Region: models.CyberghostRegion("Colombia"), Group: models.CyberghostGroup("Premium UDP USA"), IPs: []net.IP{{190, 105, 229, 19}, {190, 105, 229, 20}, {190, 105, 229, 21}, {190, 105, 229, 22}}}, - {Region: models.CyberghostRegion("Costa Rica"), Group: models.CyberghostGroup("Premium TCP USA"), IPs: []net.IP{{143, 202, 160, 67}, {143, 202, 160, 69}, {143, 202, 160, 70}, {143, 202, 160, 72}, {143, 202, 160, 73}, {143, 202, 160, 74}, {143, 202, 160, 75}, {143, 202, 160, 76}, {143, 202, 160, 77}, {143, 202, 160, 78}}}, - {Region: models.CyberghostRegion("Costa Rica"), Group: models.CyberghostGroup("Premium UDP USA"), IPs: []net.IP{{143, 202, 160, 67}, {143, 202, 160, 68}, {143, 202, 160, 69}, {143, 202, 160, 70}, {143, 202, 160, 71}, {143, 202, 160, 73}, {143, 202, 160, 74}, {143, 202, 160, 75}, {143, 202, 160, 76}, {143, 202, 160, 78}}}, - {Region: models.CyberghostRegion("Cyprus"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 132, 137, 8}, {45, 132, 137, 11}, {45, 132, 137, 12}, {45, 132, 137, 15}, {45, 132, 137, 17}, {45, 132, 137, 18}, {45, 132, 137, 19}, {45, 132, 137, 23}, {45, 132, 137, 26}, {45, 132, 137, 28}}}, - {Region: models.CyberghostRegion("Cyprus"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 132, 137, 8}, {45, 132, 137, 10}, {45, 132, 137, 16}, {45, 132, 137, 19}, {45, 132, 137, 20}, {45, 132, 137, 21}, {45, 132, 137, 22}, {45, 132, 137, 23}, {45, 132, 137, 25}, {45, 132, 137, 28}}}, - {Region: models.CyberghostRegion("Czech Republic"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{195, 181, 160, 66}, {195, 181, 160, 72}, {195, 181, 161, 7}, {195, 181, 161, 9}, {195, 181, 161, 10}, {195, 181, 161, 11}, {195, 181, 161, 14}, {195, 181, 161, 17}, {195, 181, 161, 23}, {195, 181, 161, 25}}}, - {Region: models.CyberghostRegion("Czech Republic"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{185, 216, 35, 231}, {185, 216, 35, 232}, {185, 216, 35, 235}, {195, 181, 160, 75}, {195, 181, 161, 2}, {195, 181, 161, 8}, {195, 181, 161, 15}, {195, 181, 161, 16}, {195, 181, 161, 23}, {195, 181, 161, 25}}}, - {Region: models.CyberghostRegion("Denmark"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{37, 120, 145, 93}, {37, 120, 194, 39}, {37, 120, 194, 41}, {37, 120, 194, 53}, {95, 174, 65, 166}, {95, 174, 65, 167}, {95, 174, 65, 174}, {185, 206, 224, 230}, {185, 206, 224, 235}, {185, 206, 224, 253}}}, - {Region: models.CyberghostRegion("Denmark"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{37, 120, 145, 84}, {37, 120, 145, 88}, {37, 120, 194, 38}, {37, 120, 194, 58}, {95, 174, 65, 163}, {95, 174, 65, 165}, {185, 206, 224, 227}, {185, 206, 224, 243}, {185, 206, 224, 245}, {185, 206, 224, 253}}}, - {Region: models.CyberghostRegion("Egypt"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 132, 139, 7}, {45, 132, 139, 22}, {45, 132, 139, 24}, {45, 132, 139, 27}, {45, 132, 139, 28}, {45, 132, 139, 29}, {188, 214, 122, 36}, {188, 214, 122, 41}, {188, 214, 122, 52}, {188, 214, 122, 56}}}, - {Region: models.CyberghostRegion("Egypt"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 132, 139, 7}, {45, 132, 139, 17}, {45, 132, 139, 18}, {45, 132, 139, 22}, {45, 132, 139, 23}, {188, 214, 122, 41}, {188, 214, 122, 48}, {188, 214, 122, 49}, {188, 214, 122, 51}, {188, 214, 122, 61}}}, - {Region: models.CyberghostRegion("Estonia"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{77, 247, 111, 6}, {77, 247, 111, 11}, {77, 247, 111, 52}, {77, 247, 111, 53}, {77, 247, 111, 55}, {77, 247, 111, 56}, {77, 247, 111, 57}, {77, 247, 111, 60}, {77, 247, 111, 61}, {77, 247, 111, 62}}}, - {Region: models.CyberghostRegion("Estonia"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{77, 247, 111, 3}, {77, 247, 111, 4}, {77, 247, 111, 5}, {77, 247, 111, 7}, {77, 247, 111, 11}, {77, 247, 111, 12}, {77, 247, 111, 52}, {77, 247, 111, 53}, {77, 247, 111, 55}, {77, 247, 111, 59}}}, - {Region: models.CyberghostRegion("Finland"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{194, 34, 133, 171}, {194, 34, 133, 172}, {194, 34, 133, 176}, {194, 34, 133, 179}, {194, 34, 133, 180}, {194, 34, 133, 195}, {194, 34, 133, 196}, {194, 34, 133, 204}, {194, 34, 133, 207}, {194, 34, 133, 208}}}, - {Region: models.CyberghostRegion("Finland"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{194, 34, 133, 163}, {194, 34, 133, 164}, {194, 34, 133, 167}, {194, 34, 133, 178}, {194, 34, 133, 192}, {194, 34, 133, 201}, {194, 34, 133, 205}, {194, 34, 133, 206}, {194, 34, 133, 208}, {194, 34, 133, 214}}}, - {Region: models.CyberghostRegion("France"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{84, 17, 60, 21}, {84, 17, 60, 33}, {84, 17, 60, 89}, {84, 17, 60, 92}, {84, 17, 60, 114}, {84, 17, 61, 23}, {84, 17, 61, 43}, {84, 17, 61, 111}, {84, 17, 61, 235}, {151, 106, 8, 36}}}, - {Region: models.CyberghostRegion("France"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{84, 17, 60, 8}, {84, 17, 60, 54}, {84, 17, 60, 161}, {84, 17, 60, 188}, {84, 17, 61, 32}, {84, 17, 61, 101}, {84, 17, 61, 163}, {84, 17, 61, 187}, {84, 17, 61, 213}, {151, 106, 8, 46}}}, - {Region: models.CyberghostRegion("Georgia"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 132, 138, 7}, {45, 132, 138, 8}, {45, 132, 138, 9}, {45, 132, 138, 12}, {45, 132, 138, 14}, {45, 132, 138, 18}, {45, 132, 138, 19}, {45, 132, 138, 20}, {45, 132, 138, 23}, {45, 132, 138, 27}}}, - {Region: models.CyberghostRegion("Georgia"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 132, 138, 7}, {45, 132, 138, 8}, {45, 132, 138, 9}, {45, 132, 138, 10}, {45, 132, 138, 17}, {45, 132, 138, 18}, {45, 132, 138, 25}, {45, 132, 138, 26}, {45, 132, 138, 27}, {45, 132, 138, 28}}}, - {Region: models.CyberghostRegion("Germany"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{37, 120, 217, 110}, {84, 17, 48, 75}, {84, 17, 48, 100}, {84, 17, 48, 182}, {84, 17, 49, 129}, {154, 28, 188, 50}, {154, 28, 188, 128}, {178, 162, 208, 155}, {178, 162, 209, 72}, {178, 162, 216, 49}}}, - {Region: models.CyberghostRegion("Germany"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{37, 120, 217, 5}, {37, 120, 217, 27}, {84, 17, 48, 20}, {84, 17, 48, 64}, {84, 17, 48, 68}, {84, 17, 48, 182}, {84, 17, 49, 141}, {84, 17, 49, 144}, {154, 28, 188, 90}, {154, 28, 188, 143}}}, - {Region: models.CyberghostRegion("Greece"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{154, 57, 3, 130}, {154, 57, 3, 132}, {154, 57, 3, 135}, {154, 57, 3, 138}, {154, 57, 3, 140}, {188, 123, 126, 168}, {188, 123, 126, 170}, {188, 123, 126, 176}, {188, 123, 126, 177}, {188, 123, 126, 178}}}, - {Region: models.CyberghostRegion("Greece"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{154, 57, 3, 130}, {154, 57, 3, 132}, {154, 57, 3, 133}, {154, 57, 3, 137}, {188, 123, 126, 167}, {188, 123, 126, 170}, {188, 123, 126, 172}, {188, 123, 126, 173}, {188, 123, 126, 174}, {188, 123, 126, 177}}}, - {Region: models.CyberghostRegion("Greenland"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 131, 209, 8}, {45, 131, 209, 9}, {45, 131, 209, 12}, {45, 131, 209, 16}, {45, 131, 209, 18}, {45, 131, 209, 20}, {45, 131, 209, 22}, {45, 131, 209, 23}, {45, 131, 209, 26}, {45, 131, 209, 27}}}, - {Region: models.CyberghostRegion("Greenland"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 131, 209, 6}, {45, 131, 209, 11}, {45, 131, 209, 19}, {45, 131, 209, 20}, {45, 131, 209, 21}, {45, 131, 209, 23}, {45, 131, 209, 26}, {45, 131, 209, 27}, {45, 131, 209, 28}, {45, 131, 209, 29}}}, - {Region: models.CyberghostRegion("Hong Kong"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{84, 17, 56, 130}, {84, 17, 56, 136}, {84, 17, 56, 148}, {84, 17, 56, 149}, {84, 17, 56, 152}, {84, 17, 56, 172}, {84, 17, 56, 173}, {84, 17, 56, 175}, {84, 17, 56, 176}, {84, 17, 56, 181}}}, - {Region: models.CyberghostRegion("Hong Kong"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{84, 17, 56, 133}, {84, 17, 56, 140}, {84, 17, 56, 146}, {84, 17, 56, 151}, {84, 17, 56, 162}, {84, 17, 56, 166}, {84, 17, 56, 172}, {84, 17, 56, 174}, {84, 17, 56, 176}, {84, 17, 56, 182}}}, - {Region: models.CyberghostRegion("Hungary"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{185, 104, 187, 83}, {185, 104, 187, 85}, {185, 104, 187, 86}, {185, 104, 187, 92}, {185, 189, 114, 116}, {185, 189, 114, 119}, {185, 189, 114, 120}, {185, 189, 114, 121}, {185, 189, 114, 124}, {185, 189, 114, 125}}}, - {Region: models.CyberghostRegion("Hungary"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{185, 104, 187, 83}, {185, 104, 187, 85}, {185, 104, 187, 93}, {185, 189, 114, 115}, {185, 189, 114, 118}, {185, 189, 114, 119}, {185, 189, 114, 120}, {185, 189, 114, 121}, {185, 189, 114, 123}, {185, 189, 114, 125}}}, - {Region: models.CyberghostRegion("Iceland"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{213, 167, 139, 19}, {213, 167, 139, 20}, {213, 167, 139, 21}, {213, 167, 139, 22}, {213, 167, 139, 23}, {213, 167, 139, 24}, {213, 167, 139, 25}, {213, 167, 139, 26}, {213, 167, 139, 28}, {213, 167, 139, 30}}}, - {Region: models.CyberghostRegion("Iceland"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{213, 167, 139, 19}, {213, 167, 139, 21}, {213, 167, 139, 22}, {213, 167, 139, 24}, {213, 167, 139, 25}, {213, 167, 139, 26}, {213, 167, 139, 27}, {213, 167, 139, 28}, {213, 167, 139, 29}, {213, 167, 139, 30}}}, - {Region: models.CyberghostRegion("India"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{43, 241, 71, 115}, {43, 241, 71, 118}, {43, 241, 71, 120}, {43, 241, 71, 122}, {43, 241, 71, 125}, {43, 241, 71, 147}, {43, 241, 71, 148}, {43, 241, 71, 149}, {43, 241, 71, 154}, {43, 241, 71, 156}}}, - {Region: models.CyberghostRegion("India"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{43, 241, 71, 116}, {43, 241, 71, 117}, {43, 241, 71, 118}, {43, 241, 71, 122}, {43, 241, 71, 125}, {43, 241, 71, 147}, {43, 241, 71, 148}, {43, 241, 71, 153}, {43, 241, 71, 155}, {43, 241, 71, 156}}}, - {Region: models.CyberghostRegion("Indonesia"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{113, 20, 29, 243}, {113, 20, 29, 244}, {113, 20, 29, 246}, {113, 20, 29, 247}, {113, 20, 29, 248}, {113, 20, 29, 249}, {113, 20, 29, 250}, {113, 20, 29, 251}, {113, 20, 29, 252}, {113, 20, 29, 254}}}, - {Region: models.CyberghostRegion("Indonesia"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{113, 20, 29, 243}, {113, 20, 29, 245}, {113, 20, 29, 246}, {113, 20, 29, 247}, {113, 20, 29, 248}, {113, 20, 29, 249}, {113, 20, 29, 250}, {113, 20, 29, 251}, {113, 20, 29, 252}, {113, 20, 29, 253}}}, - {Region: models.CyberghostRegion("Iran"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 131, 4, 10}, {45, 131, 4, 16}, {45, 131, 4, 17}, {45, 131, 4, 18}, {45, 131, 4, 20}, {45, 131, 4, 21}, {45, 131, 4, 22}, {45, 131, 4, 24}, {45, 131, 4, 25}, {45, 131, 4, 28}}}, - {Region: models.CyberghostRegion("Iran"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 131, 4, 6}, {45, 131, 4, 8}, {45, 131, 4, 12}, {45, 131, 4, 14}, {45, 131, 4, 15}, {45, 131, 4, 20}, {45, 131, 4, 23}, {45, 131, 4, 24}, {45, 131, 4, 27}, {45, 131, 4, 28}}}, - {Region: models.CyberghostRegion("Ireland"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{84, 247, 48, 3}, {84, 247, 48, 4}, {84, 247, 48, 5}, {84, 247, 48, 8}, {84, 247, 48, 9}, {84, 247, 48, 10}, {84, 247, 48, 11}, {84, 247, 48, 12}, {84, 247, 48, 19}, {84, 247, 48, 21}}}, - {Region: models.CyberghostRegion("Ireland"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{84, 247, 48, 3}, {84, 247, 48, 13}, {84, 247, 48, 14}, {84, 247, 48, 20}, {84, 247, 48, 21}, {84, 247, 48, 23}, {84, 247, 48, 24}, {84, 247, 48, 25}, {84, 247, 48, 26}, {84, 247, 48, 27}}}, - {Region: models.CyberghostRegion("Isle of Man"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 132, 140, 7}, {45, 132, 140, 8}, {45, 132, 140, 10}, {45, 132, 140, 11}, {45, 132, 140, 15}, {45, 132, 140, 17}, {45, 132, 140, 18}, {45, 132, 140, 19}, {45, 132, 140, 27}, {45, 132, 140, 28}}}, - {Region: models.CyberghostRegion("Isle of Man"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 132, 140, 7}, {45, 132, 140, 9}, {45, 132, 140, 10}, {45, 132, 140, 16}, {45, 132, 140, 19}, {45, 132, 140, 20}, {45, 132, 140, 21}, {45, 132, 140, 25}, {45, 132, 140, 26}, {45, 132, 140, 28}}}, - {Region: models.CyberghostRegion("Israel"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{160, 116, 0, 163}, {160, 116, 0, 164}, {160, 116, 0, 166}, {160, 116, 0, 167}, {160, 116, 0, 169}, {160, 116, 0, 170}, {160, 116, 0, 171}, {160, 116, 0, 172}, {160, 116, 0, 173}, {160, 116, 0, 174}}}, - {Region: models.CyberghostRegion("Israel"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{160, 116, 0, 163}, {160, 116, 0, 165}, {160, 116, 0, 166}, {160, 116, 0, 167}, {160, 116, 0, 168}, {160, 116, 0, 169}, {160, 116, 0, 170}, {160, 116, 0, 172}, {160, 116, 0, 173}, {160, 116, 0, 174}}}, - {Region: models.CyberghostRegion("Italy"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{84, 17, 58, 11}, {84, 17, 58, 19}, {87, 101, 94, 70}, {87, 101, 94, 116}, {185, 217, 71, 133}, {185, 217, 71, 137}, {212, 102, 55, 100}, {212, 102, 55, 123}, {212, 102, 55, 139}, {212, 102, 55, 184}}}, - {Region: models.CyberghostRegion("Italy"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{84, 17, 58, 7}, {84, 17, 58, 100}, {84, 17, 58, 103}, {84, 17, 58, 104}, {87, 101, 94, 116}, {87, 101, 94, 124}, {185, 217, 71, 132}, {185, 217, 71, 134}, {212, 102, 55, 156}, {212, 102, 55, 167}}}, - {Region: models.CyberghostRegion("Japan"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{156, 146, 35, 5}, {156, 146, 35, 8}, {156, 146, 35, 9}, {156, 146, 35, 17}, {156, 146, 35, 20}, {156, 146, 35, 33}, {156, 146, 35, 36}, {156, 146, 35, 42}, {156, 146, 35, 45}, {156, 146, 35, 50}}}, - {Region: models.CyberghostRegion("Japan"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{156, 146, 35, 6}, {156, 146, 35, 8}, {156, 146, 35, 19}, {156, 146, 35, 22}, {156, 146, 35, 27}, {156, 146, 35, 32}, {156, 146, 35, 35}, {156, 146, 35, 37}, {156, 146, 35, 41}, {156, 146, 35, 47}}}, - {Region: models.CyberghostRegion("Kazakhstan"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 133, 88, 7}, {45, 133, 88, 11}, {45, 133, 88, 12}, {45, 133, 88, 13}, {45, 133, 88, 14}, {45, 133, 88, 20}, {45, 133, 88, 23}, {45, 133, 88, 24}, {45, 133, 88, 26}, {45, 133, 88, 28}}}, - {Region: models.CyberghostRegion("Kazakhstan"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 133, 88, 8}, {45, 133, 88, 12}, {45, 133, 88, 13}, {45, 133, 88, 15}, {45, 133, 88, 19}, {45, 133, 88, 20}, {45, 133, 88, 24}, {45, 133, 88, 25}, {45, 133, 88, 26}, {45, 133, 88, 28}}}, - {Region: models.CyberghostRegion("Kenya"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{62, 12, 118, 195}, {62, 12, 118, 196}, {62, 12, 118, 197}, {62, 12, 118, 198}, {62, 12, 118, 199}, {62, 12, 118, 200}, {62, 12, 118, 201}, {62, 12, 118, 202}, {62, 12, 118, 203}, {62, 12, 118, 204}}}, - {Region: models.CyberghostRegion("Kenya"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{62, 12, 118, 195}, {62, 12, 118, 196}, {62, 12, 118, 197}, {62, 12, 118, 198}, {62, 12, 118, 199}, {62, 12, 118, 200}, {62, 12, 118, 201}, {62, 12, 118, 202}, {62, 12, 118, 203}, {62, 12, 118, 204}}}, - {Region: models.CyberghostRegion("Korea"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{27, 255, 75, 227}, {27, 255, 75, 229}, {27, 255, 75, 233}, {27, 255, 75, 234}, {27, 255, 75, 235}, {27, 255, 75, 236}, {27, 255, 75, 248}, {27, 255, 75, 249}, {27, 255, 75, 251}, {27, 255, 75, 254}}}, - {Region: models.CyberghostRegion("Korea"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{27, 255, 75, 228}, {27, 255, 75, 229}, {27, 255, 75, 230}, {27, 255, 75, 231}, {27, 255, 75, 234}, {27, 255, 75, 235}, {27, 255, 75, 244}, {27, 255, 75, 245}, {27, 255, 75, 246}, {27, 255, 75, 247}}}, - {Region: models.CyberghostRegion("Latvia"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{109, 248, 148, 244}, {109, 248, 148, 251}, {109, 248, 148, 252}, {109, 248, 148, 253}, {109, 248, 149, 19}, {109, 248, 149, 20}, {109, 248, 149, 21}, {109, 248, 149, 22}, {109, 248, 149, 24}, {109, 248, 149, 27}}}, - {Region: models.CyberghostRegion("Latvia"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{109, 248, 148, 248}, {109, 248, 148, 252}, {109, 248, 148, 253}, {109, 248, 148, 254}, {109, 248, 149, 19}, {109, 248, 149, 20}, {109, 248, 149, 21}, {109, 248, 149, 24}, {109, 248, 149, 28}, {109, 248, 149, 29}}}, - {Region: models.CyberghostRegion("Liechtenstein"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 139, 48, 6}, {45, 139, 48, 7}, {45, 139, 48, 9}, {45, 139, 48, 16}, {45, 139, 48, 17}, {45, 139, 48, 19}, {45, 139, 48, 20}, {45, 139, 48, 22}, {45, 139, 48, 23}, {45, 139, 48, 27}}}, - {Region: models.CyberghostRegion("Liechtenstein"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 139, 48, 9}, {45, 139, 48, 12}, {45, 139, 48, 15}, {45, 139, 48, 16}, {45, 139, 48, 17}, {45, 139, 48, 18}, {45, 139, 48, 24}, {45, 139, 48, 26}, {45, 139, 48, 28}, {45, 139, 48, 29}}}, - {Region: models.CyberghostRegion("Lithuania"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{85, 206, 162, 211}, {85, 206, 162, 213}, {85, 206, 162, 214}, {85, 206, 162, 216}, {85, 206, 162, 219}, {85, 206, 162, 220}, {85, 206, 165, 18}, {85, 206, 165, 20}, {85, 206, 165, 24}, {85, 206, 165, 25}}}, - {Region: models.CyberghostRegion("Lithuania"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{85, 206, 162, 210}, {85, 206, 162, 211}, {85, 206, 162, 214}, {85, 206, 162, 215}, {85, 206, 162, 220}, {85, 206, 162, 221}, {85, 206, 162, 222}, {85, 206, 165, 18}, {85, 206, 165, 25}, {85, 206, 165, 26}}}, - {Region: models.CyberghostRegion("Luxembourg"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{5, 253, 204, 5}, {5, 253, 204, 6}, {5, 253, 204, 9}, {5, 253, 204, 10}, {5, 253, 204, 12}, {5, 253, 204, 14}, {5, 253, 204, 20}, {5, 253, 204, 23}, {5, 253, 204, 29}, {5, 253, 204, 30}}}, - {Region: models.CyberghostRegion("Luxembourg"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{5, 253, 204, 7}, {5, 253, 204, 11}, {5, 253, 204, 20}, {5, 253, 204, 22}, {5, 253, 204, 23}, {5, 253, 204, 26}, {5, 253, 204, 27}, {5, 253, 204, 28}, {5, 253, 204, 29}, {5, 253, 204, 30}}}, - {Region: models.CyberghostRegion("Macao"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{45, 137, 197, 8}, {45, 137, 197, 9}, {45, 137, 197, 12}, {45, 137, 197, 14}, {45, 137, 197, 17}, {45, 137, 197, 33}, {45, 137, 197, 35}, {45, 137, 197, 42}, {45, 137, 197, 45}, {45, 137, 197, 47}}}, - {Region: models.CyberghostRegion("Macao"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{45, 137, 197, 2}, {45, 137, 197, 7}, {45, 137, 197, 18}, {45, 137, 197, 19}, {45, 137, 197, 28}, {45, 137, 197, 30}, {45, 137, 197, 33}, {45, 137, 197, 35}, {45, 137, 197, 44}, {45, 137, 197, 47}}}, - {Region: models.CyberghostRegion("Macedonia"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{185, 225, 28, 3}, {185, 225, 28, 4}, {185, 225, 28, 5}, {185, 225, 28, 6}, {185, 225, 28, 7}, {185, 225, 28, 8}, {185, 225, 28, 9}, {185, 225, 28, 10}, {185, 225, 28, 11}, {185, 225, 28, 12}}}, - {Region: models.CyberghostRegion("Macedonia"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{185, 225, 28, 3}, {185, 225, 28, 4}, {185, 225, 28, 5}, {185, 225, 28, 6}, {185, 225, 28, 7}, {185, 225, 28, 8}, {185, 225, 28, 9}, {185, 225, 28, 10}, {185, 225, 28, 11}, {185, 225, 28, 12}}}, - {Region: models.CyberghostRegion("Malaysia"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{139, 5, 177, 69}, {139, 5, 177, 70}, {139, 5, 177, 71}, {139, 5, 177, 72}, {139, 5, 177, 73}, {139, 5, 177, 74}, {139, 5, 177, 75}, {139, 5, 177, 76}, {139, 5, 177, 77}, {139, 5, 177, 78}}}, - {Region: models.CyberghostRegion("Malaysia"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{139, 5, 177, 69}, {139, 5, 177, 70}, {139, 5, 177, 71}, {139, 5, 177, 72}, {139, 5, 177, 73}, {139, 5, 177, 74}, {139, 5, 177, 75}, {139, 5, 177, 76}, {139, 5, 177, 77}, {139, 5, 177, 78}}}, - {Region: models.CyberghostRegion("Malta"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 137, 198, 6}, {45, 137, 198, 8}, {45, 137, 198, 9}, {45, 137, 198, 11}, {45, 137, 198, 16}, {45, 137, 198, 18}, {45, 137, 198, 22}, {45, 137, 198, 23}, {45, 137, 198, 25}, {45, 137, 198, 27}}}, - {Region: models.CyberghostRegion("Malta"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 137, 198, 8}, {45, 137, 198, 10}, {45, 137, 198, 12}, {45, 137, 198, 13}, {45, 137, 198, 16}, {45, 137, 198, 17}, {45, 137, 198, 21}, {45, 137, 198, 23}, {45, 137, 198, 26}, {45, 137, 198, 28}}}, - {Region: models.CyberghostRegion("Mexico"), Group: models.CyberghostGroup("Premium TCP USA"), IPs: []net.IP{{45, 133, 180, 99}, {45, 133, 180, 106}, {45, 133, 180, 107}, {45, 133, 180, 108}, {45, 133, 180, 115}, {45, 133, 180, 118}, {45, 133, 180, 119}, {45, 133, 180, 121}, {45, 133, 180, 122}, {45, 133, 180, 123}}}, - {Region: models.CyberghostRegion("Mexico"), Group: models.CyberghostGroup("Premium UDP USA"), IPs: []net.IP{{45, 133, 180, 99}, {45, 133, 180, 101}, {45, 133, 180, 104}, {45, 133, 180, 105}, {45, 133, 180, 106}, {45, 133, 180, 115}, {45, 133, 180, 117}, {45, 133, 180, 118}, {45, 133, 180, 120}, {45, 133, 180, 121}}}, - {Region: models.CyberghostRegion("Moldova"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{178, 175, 130, 243}, {178, 175, 130, 245}, {178, 175, 130, 250}, {178, 175, 130, 251}, {178, 175, 130, 253}, {178, 175, 130, 254}, {178, 175, 142, 131}, {178, 175, 142, 132}, {178, 175, 142, 133}, {178, 175, 142, 134}}}, - {Region: models.CyberghostRegion("Moldova"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{178, 175, 130, 243}, {178, 175, 130, 244}, {178, 175, 130, 245}, {178, 175, 130, 246}, {178, 175, 130, 250}, {178, 175, 130, 251}, {178, 175, 130, 253}, {178, 175, 130, 254}, {178, 175, 142, 132}, {178, 175, 142, 133}}}, - {Region: models.CyberghostRegion("Monaco"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 137, 199, 7}, {45, 137, 199, 9}, {45, 137, 199, 11}, {45, 137, 199, 12}, {45, 137, 199, 14}, {45, 137, 199, 16}, {45, 137, 199, 20}, {45, 137, 199, 24}, {45, 137, 199, 25}, {45, 137, 199, 29}}}, - {Region: models.CyberghostRegion("Monaco"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 137, 199, 6}, {45, 137, 199, 7}, {45, 137, 199, 10}, {45, 137, 199, 16}, {45, 137, 199, 18}, {45, 137, 199, 22}, {45, 137, 199, 23}, {45, 137, 199, 24}, {45, 137, 199, 25}, {45, 137, 199, 27}}}, - {Region: models.CyberghostRegion("Mongolia"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{45, 139, 51, 4}, {45, 139, 51, 13}, {45, 139, 51, 14}, {45, 139, 51, 17}, {45, 139, 51, 18}, {45, 139, 51, 22}, {45, 139, 51, 23}, {45, 139, 51, 32}, {45, 139, 51, 44}, {45, 139, 51, 48}}}, - {Region: models.CyberghostRegion("Mongolia"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{45, 139, 51, 3}, {45, 139, 51, 6}, {45, 139, 51, 11}, {45, 139, 51, 12}, {45, 139, 51, 17}, {45, 139, 51, 20}, {45, 139, 51, 28}, {45, 139, 51, 30}, {45, 139, 51, 37}, {45, 139, 51, 41}}}, - {Region: models.CyberghostRegion("Montenegro"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 131, 208, 6}, {45, 131, 208, 7}, {45, 131, 208, 8}, {45, 131, 208, 9}, {45, 131, 208, 10}, {45, 131, 208, 13}, {45, 131, 208, 14}, {45, 131, 208, 20}, {45, 131, 208, 24}, {45, 131, 208, 28}}}, - {Region: models.CyberghostRegion("Montenegro"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 131, 208, 6}, {45, 131, 208, 8}, {45, 131, 208, 9}, {45, 131, 208, 12}, {45, 131, 208, 16}, {45, 131, 208, 20}, {45, 131, 208, 22}, {45, 131, 208, 24}, {45, 131, 208, 26}, {45, 131, 208, 28}}}, - {Region: models.CyberghostRegion("Morocco"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 131, 211, 6}, {45, 131, 211, 9}, {45, 131, 211, 11}, {45, 131, 211, 13}, {45, 131, 211, 18}, {45, 131, 211, 21}, {45, 131, 211, 22}, {45, 131, 211, 23}, {45, 131, 211, 28}, {45, 131, 211, 29}}}, - {Region: models.CyberghostRegion("Morocco"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 131, 211, 9}, {45, 131, 211, 10}, {45, 131, 211, 13}, {45, 131, 211, 18}, {45, 131, 211, 20}, {45, 131, 211, 21}, {45, 131, 211, 25}, {45, 131, 211, 26}, {45, 131, 211, 28}, {45, 131, 211, 29}}}, - {Region: models.CyberghostRegion("Netherlands"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{84, 17, 47, 3}, {84, 17, 47, 20}, {84, 17, 47, 39}, {84, 17, 47, 42}, {84, 17, 47, 74}, {84, 17, 47, 111}, {139, 28, 217, 199}, {185, 132, 177, 136}, {190, 2, 149, 196}, {195, 181, 172, 69}}}, - {Region: models.CyberghostRegion("Netherlands"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{84, 17, 47, 4}, {84, 17, 47, 8}, {84, 17, 47, 12}, {84, 17, 47, 38}, {84, 17, 47, 68}, {185, 132, 177, 235}, {190, 2, 149, 28}, {190, 2, 149, 30}, {190, 2, 149, 208}, {195, 181, 172, 79}}}, - {Region: models.CyberghostRegion("New Zealand"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{103, 231, 91, 131}, {103, 231, 91, 132}, {103, 231, 91, 133}, {103, 231, 91, 134}, {103, 231, 91, 135}, {103, 231, 91, 136}, {103, 231, 91, 137}, {103, 231, 91, 138}, {103, 231, 91, 139}, {103, 231, 91, 140}}}, - {Region: models.CyberghostRegion("New Zealand"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{103, 231, 91, 131}, {103, 231, 91, 132}, {103, 231, 91, 133}, {103, 231, 91, 134}, {103, 231, 91, 135}, {103, 231, 91, 136}, {103, 231, 91, 137}, {103, 231, 91, 138}, {103, 231, 91, 139}, {103, 231, 91, 140}}}, - {Region: models.CyberghostRegion("Nigeria"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 137, 196, 6}, {45, 137, 196, 10}, {45, 137, 196, 12}, {45, 137, 196, 13}, {45, 137, 196, 15}, {45, 137, 196, 16}, {45, 137, 196, 17}, {45, 137, 196, 20}, {45, 137, 196, 24}, {45, 137, 196, 29}}}, - {Region: models.CyberghostRegion("Nigeria"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 137, 196, 6}, {45, 137, 196, 7}, {45, 137, 196, 8}, {45, 137, 196, 9}, {45, 137, 196, 12}, {45, 137, 196, 13}, {45, 137, 196, 14}, {45, 137, 196, 20}, {45, 137, 196, 28}, {45, 137, 196, 29}}}, - {Region: models.CyberghostRegion("Norway"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 12, 223, 131}, {45, 12, 223, 135}, {45, 12, 223, 136}, {45, 12, 223, 138}, {185, 206, 225, 231}, {185, 206, 225, 233}, {185, 253, 97, 235}, {185, 253, 97, 236}, {185, 253, 97, 247}, {185, 253, 97, 253}}}, - {Region: models.CyberghostRegion("Norway"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 12, 223, 132}, {45, 12, 223, 137}, {45, 12, 223, 138}, {45, 12, 223, 141}, {185, 206, 225, 27}, {185, 206, 225, 30}, {185, 253, 97, 245}, {185, 253, 97, 246}, {185, 253, 97, 248}, {185, 253, 97, 249}}}, - {Region: models.CyberghostRegion("Pakistan"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{103, 76, 3, 244}, {103, 76, 3, 245}, {103, 76, 3, 246}, {103, 76, 3, 247}, {103, 76, 3, 248}, {103, 76, 3, 249}, {103, 76, 3, 250}, {103, 76, 3, 251}, {103, 76, 3, 252}, {103, 76, 3, 253}}}, - {Region: models.CyberghostRegion("Pakistan"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{103, 76, 3, 244}, {103, 76, 3, 245}, {103, 76, 3, 246}, {103, 76, 3, 247}, {103, 76, 3, 248}, {103, 76, 3, 249}, {103, 76, 3, 250}, {103, 76, 3, 251}, {103, 76, 3, 252}, {103, 76, 3, 253}}}, - {Region: models.CyberghostRegion("Panama"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 131, 210, 9}, {45, 131, 210, 10}, {45, 131, 210, 14}, {45, 131, 210, 15}, {45, 131, 210, 16}, {45, 131, 210, 21}, {45, 131, 210, 22}, {45, 131, 210, 23}, {45, 131, 210, 24}, {45, 131, 210, 26}}}, - {Region: models.CyberghostRegion("Panama"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 131, 210, 6}, {45, 131, 210, 8}, {45, 131, 210, 9}, {45, 131, 210, 12}, {45, 131, 210, 14}, {45, 131, 210, 18}, {45, 131, 210, 19}, {45, 131, 210, 25}, {45, 131, 210, 28}, {45, 131, 210, 29}}}, - {Region: models.CyberghostRegion("Philippines"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{188, 214, 125, 39}, {188, 214, 125, 45}, {188, 214, 125, 47}, {188, 214, 125, 49}, {188, 214, 125, 50}, {188, 214, 125, 51}, {188, 214, 125, 53}, {188, 214, 125, 57}, {188, 214, 125, 58}, {188, 214, 125, 61}}}, - {Region: models.CyberghostRegion("Philippines"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{188, 214, 125, 35}, {188, 214, 125, 36}, {188, 214, 125, 37}, {188, 214, 125, 48}, {188, 214, 125, 55}, {188, 214, 125, 56}, {188, 214, 125, 57}, {188, 214, 125, 58}, {188, 214, 125, 59}, {188, 214, 125, 62}}}, - {Region: models.CyberghostRegion("Poland"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{37, 120, 156, 11}, {37, 120, 156, 17}, {37, 120, 156, 23}, {37, 120, 156, 25}, {37, 120, 156, 26}, {51, 75, 56, 35}, {51, 75, 56, 37}, {51, 75, 56, 41}, {54, 37, 238, 36}, {54, 37, 238, 43}}}, - {Region: models.CyberghostRegion("Poland"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{37, 120, 156, 8}, {37, 120, 156, 10}, {37, 120, 156, 12}, {37, 120, 156, 18}, {37, 120, 156, 19}, {37, 120, 156, 24}, {51, 75, 56, 33}, {51, 75, 56, 40}, {51, 75, 56, 41}, {54, 37, 238, 33}}}, - {Region: models.CyberghostRegion("Portugal"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{89, 26, 243, 47}, {89, 26, 243, 48}, {89, 26, 243, 50}, {89, 26, 243, 51}, {89, 26, 243, 54}, {89, 26, 243, 58}, {89, 26, 243, 60}, {185, 90, 57, 172}, {185, 90, 57, 176}, {185, 90, 57, 179}}}, - {Region: models.CyberghostRegion("Portugal"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{89, 26, 243, 47}, {89, 26, 243, 50}, {89, 26, 243, 51}, {89, 26, 243, 53}, {89, 26, 243, 58}, {185, 90, 57, 173}, {185, 90, 57, 175}, {185, 90, 57, 176}, {185, 90, 57, 178}, {185, 90, 57, 179}}}, - {Region: models.CyberghostRegion("Qatar"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 131, 7, 6}, {45, 131, 7, 9}, {45, 131, 7, 10}, {45, 131, 7, 13}, {45, 131, 7, 16}, {45, 131, 7, 17}, {45, 131, 7, 20}, {45, 131, 7, 22}, {45, 131, 7, 23}, {45, 131, 7, 28}}}, - {Region: models.CyberghostRegion("Qatar"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 131, 7, 8}, {45, 131, 7, 9}, {45, 131, 7, 14}, {45, 131, 7, 15}, {45, 131, 7, 16}, {45, 131, 7, 17}, {45, 131, 7, 23}, {45, 131, 7, 27}, {45, 131, 7, 28}, {45, 131, 7, 29}}}, - {Region: models.CyberghostRegion("Romania"), Group: models.CyberghostGroup("NoSpy TCP Europe"), IPs: []net.IP{{85, 9, 20, 134}, {85, 9, 20, 135}, {85, 9, 20, 137}, {85, 9, 20, 138}, {85, 9, 20, 139}, {85, 9, 20, 147}, {85, 9, 20, 149}, {85, 9, 20, 154}, {85, 9, 20, 248}, {85, 9, 20, 249}}}, - {Region: models.CyberghostRegion("Romania"), Group: models.CyberghostGroup("NoSpy UDP Europe"), IPs: []net.IP{{85, 9, 20, 134}, {85, 9, 20, 138}, {85, 9, 20, 139}, {85, 9, 20, 144}, {85, 9, 20, 145}, {85, 9, 20, 147}, {85, 9, 20, 148}, {85, 9, 20, 151}, {85, 9, 20, 248}, {85, 9, 20, 249}}}, - {Region: models.CyberghostRegion("Romania"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{193, 176, 84, 44}, {193, 176, 84, 49}, {193, 176, 84, 51}, {193, 176, 84, 52}, {193, 176, 84, 88}, {193, 176, 84, 121}, {193, 176, 84, 126}, {193, 176, 85, 72}, {193, 176, 85, 74}, {193, 176, 85, 101}}}, - {Region: models.CyberghostRegion("Romania"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{193, 176, 84, 46}, {193, 176, 84, 47}, {193, 176, 84, 48}, {193, 176, 84, 49}, {193, 176, 84, 90}, {193, 176, 84, 125}, {193, 176, 85, 68}, {193, 176, 85, 72}, {193, 176, 85, 78}, {193, 176, 85, 91}}}, - {Region: models.CyberghostRegion("Russian Federation"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 132, 192, 42}, {45, 132, 192, 43}, {45, 132, 192, 49}, {45, 132, 192, 60}, {45, 132, 192, 63}, {45, 132, 192, 66}, {45, 132, 192, 78}, {45, 132, 192, 80}, {45, 132, 192, 85}, {45, 132, 192, 96}}}, - {Region: models.CyberghostRegion("Russian Federation"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 132, 192, 11}, {45, 132, 192, 15}, {45, 132, 192, 24}, {45, 132, 192, 32}, {45, 132, 192, 43}, {45, 132, 192, 49}, {45, 132, 192, 55}, {45, 132, 192, 63}, {45, 132, 192, 65}, {45, 132, 192, 95}}}, - {Region: models.CyberghostRegion("Saudi Arabia"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 131, 6, 7}, {45, 131, 6, 10}, {45, 131, 6, 12}, {45, 131, 6, 13}, {45, 131, 6, 21}, {45, 131, 6, 23}, {45, 131, 6, 24}, {45, 131, 6, 25}, {45, 131, 6, 26}, {45, 131, 6, 28}}}, - {Region: models.CyberghostRegion("Saudi Arabia"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 131, 6, 7}, {45, 131, 6, 9}, {45, 131, 6, 14}, {45, 131, 6, 15}, {45, 131, 6, 18}, {45, 131, 6, 19}, {45, 131, 6, 22}, {45, 131, 6, 24}, {45, 131, 6, 28}, {45, 131, 6, 29}}}, - {Region: models.CyberghostRegion("Serbia"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{37, 120, 193, 179}, {37, 120, 193, 181}, {37, 120, 193, 182}, {37, 120, 193, 183}, {37, 120, 193, 184}, {37, 120, 193, 186}, {37, 120, 193, 190}, {141, 98, 103, 37}, {141, 98, 103, 43}, {141, 98, 103, 46}}}, - {Region: models.CyberghostRegion("Serbia"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{37, 120, 193, 179}, {37, 120, 193, 182}, {37, 120, 193, 183}, {37, 120, 193, 188}, {37, 120, 193, 189}, {37, 120, 193, 190}, {141, 98, 103, 35}, {141, 98, 103, 40}, {141, 98, 103, 42}, {141, 98, 103, 46}}}, - {Region: models.CyberghostRegion("Singapore"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{37, 120, 151, 55}, {37, 120, 151, 60}, {37, 120, 151, 131}, {37, 120, 151, 139}, {84, 17, 39, 168}, {84, 17, 39, 175}, {84, 17, 39, 176}, {84, 17, 39, 179}, {84, 17, 39, 182}, {84, 17, 39, 185}}}, - {Region: models.CyberghostRegion("Singapore"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{37, 120, 151, 51}, {37, 120, 151, 57}, {37, 120, 151, 131}, {37, 120, 151, 132}, {37, 120, 151, 140}, {37, 120, 151, 141}, {84, 17, 39, 165}, {84, 17, 39, 169}, {84, 17, 39, 171}, {84, 17, 39, 180}}}, - {Region: models.CyberghostRegion("Slovakia"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{185, 245, 85, 227}, {185, 245, 85, 228}, {185, 245, 85, 229}, {185, 245, 85, 230}, {185, 245, 85, 231}, {185, 245, 85, 232}, {185, 245, 85, 233}, {185, 245, 85, 234}, {185, 245, 85, 235}, {185, 245, 85, 236}}}, - {Region: models.CyberghostRegion("Slovakia"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{185, 245, 85, 227}, {185, 245, 85, 228}, {185, 245, 85, 229}, {185, 245, 85, 230}, {185, 245, 85, 231}, {185, 245, 85, 232}, {185, 245, 85, 233}, {185, 245, 85, 234}, {185, 245, 85, 235}, {185, 245, 85, 236}}}, - {Region: models.CyberghostRegion("Slovenia"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{146, 247, 25, 79}, {146, 247, 25, 80}, {146, 247, 25, 81}, {146, 247, 25, 83}, {146, 247, 25, 84}, {146, 247, 25, 85}, {146, 247, 25, 86}, {146, 247, 25, 87}, {146, 247, 25, 88}, {146, 247, 25, 90}}}, - {Region: models.CyberghostRegion("Slovenia"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{146, 247, 25, 80}, {146, 247, 25, 81}, {146, 247, 25, 82}, {146, 247, 25, 83}, {146, 247, 25, 84}, {146, 247, 25, 85}, {146, 247, 25, 86}, {146, 247, 25, 87}, {146, 247, 25, 88}, {146, 247, 25, 89}}}, - {Region: models.CyberghostRegion("South Africa"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{165, 73, 248, 211}, {165, 73, 248, 214}, {165, 73, 248, 222}, {165, 73, 248, 227}, {165, 73, 248, 229}, {165, 73, 248, 230}, {165, 73, 248, 231}, {165, 73, 248, 234}, {165, 73, 248, 236}, {165, 73, 248, 237}}}, - {Region: models.CyberghostRegion("South Africa"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{197, 85, 7, 26}, {197, 85, 7, 27}, {197, 85, 7, 28}, {197, 85, 7, 29}, {197, 85, 7, 30}, {197, 85, 7, 31}, {197, 85, 7, 131}, {197, 85, 7, 132}, {197, 85, 7, 133}, {197, 85, 7, 134}}}, - {Region: models.CyberghostRegion("South Africa"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{165, 73, 248, 212}, {165, 73, 248, 215}, {165, 73, 248, 217}, {165, 73, 248, 218}, {165, 73, 248, 219}, {165, 73, 248, 222}, {165, 73, 248, 227}, {165, 73, 248, 230}, {165, 73, 248, 234}, {165, 73, 248, 237}}}, - {Region: models.CyberghostRegion("South Africa"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{197, 85, 7, 26}, {197, 85, 7, 27}, {197, 85, 7, 28}, {197, 85, 7, 29}, {197, 85, 7, 30}, {197, 85, 7, 31}, {197, 85, 7, 131}, {197, 85, 7, 132}, {197, 85, 7, 133}, {197, 85, 7, 134}}}, - {Region: models.CyberghostRegion("Spain"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{37, 120, 142, 163}, {37, 120, 142, 166}, {37, 120, 142, 167}, {84, 17, 62, 138}, {84, 17, 62, 141}, {84, 17, 62, 145}, {84, 17, 62, 147}, {84, 17, 62, 152}, {185, 93, 3, 113}, {185, 93, 182, 139}}}, - {Region: models.CyberghostRegion("Spain"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{37, 120, 142, 150}, {37, 120, 142, 157}, {37, 120, 142, 165}, {84, 17, 62, 139}, {84, 17, 62, 142}, {185, 93, 3, 109}, {185, 93, 3, 111}, {185, 93, 3, 113}, {185, 93, 182, 136}, {185, 93, 182, 138}}}, - {Region: models.CyberghostRegion("Sri Lanka"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 132, 136, 6}, {45, 132, 136, 7}, {45, 132, 136, 8}, {45, 132, 136, 12}, {45, 132, 136, 13}, {45, 132, 136, 17}, {45, 132, 136, 21}, {45, 132, 136, 22}, {45, 132, 136, 26}, {45, 132, 136, 27}}}, - {Region: models.CyberghostRegion("Sri Lanka"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 132, 136, 7}, {45, 132, 136, 9}, {45, 132, 136, 10}, {45, 132, 136, 11}, {45, 132, 136, 12}, {45, 132, 136, 15}, {45, 132, 136, 20}, {45, 132, 136, 21}, {45, 132, 136, 27}, {45, 132, 136, 29}}}, - {Region: models.CyberghostRegion("Sweden"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{46, 246, 65, 151}, {46, 246, 65, 156}, {46, 246, 65, 157}, {46, 246, 65, 167}, {46, 246, 65, 203}, {46, 246, 65, 221}, {91, 132, 138, 51}, {188, 126, 64, 101}, {188, 126, 66, 3}, {188, 126, 66, 8}}}, - {Region: models.CyberghostRegion("Sweden"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{46, 246, 65, 167}, {46, 246, 65, 170}, {46, 246, 65, 172}, {46, 246, 65, 181}, {46, 246, 65, 214}, {46, 246, 65, 215}, {91, 132, 138, 57}, {188, 126, 66, 8}, {188, 126, 66, 24}, {188, 126, 66, 29}}}, - {Region: models.CyberghostRegion("Switzerland"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{84, 17, 52, 14}, {84, 17, 52, 39}, {84, 17, 52, 68}, {84, 17, 52, 73}, {84, 17, 52, 84}, {89, 187, 165, 131}, {185, 32, 222, 8}, {185, 32, 222, 105}, {195, 225, 118, 38}, {195, 225, 118, 56}}}, - {Region: models.CyberghostRegion("Switzerland"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{84, 17, 52, 15}, {84, 17, 52, 20}, {84, 17, 52, 36}, {84, 17, 52, 52}, {84, 17, 52, 62}, {84, 17, 52, 75}, {91, 132, 136, 174}, {91, 132, 136, 205}, {91, 132, 136, 206}, {185, 32, 222, 113}}}, - {Region: models.CyberghostRegion("Taiwan"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{45, 133, 181, 102}, {45, 133, 181, 105}, {45, 133, 181, 106}, {45, 133, 181, 108}, {45, 133, 181, 110}, {45, 133, 181, 112}, {45, 133, 181, 114}, {45, 133, 181, 117}, {45, 133, 181, 120}, {45, 133, 181, 124}}}, - {Region: models.CyberghostRegion("Taiwan"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{45, 133, 181, 102}, {45, 133, 181, 103}, {45, 133, 181, 110}, {45, 133, 181, 111}, {45, 133, 181, 112}, {45, 133, 181, 114}, {45, 133, 181, 118}, {45, 133, 181, 120}, {45, 133, 181, 125}, {45, 133, 181, 126}}}, - {Region: models.CyberghostRegion("Thailand"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{119, 59, 98, 238}, {119, 59, 98, 239}, {119, 59, 98, 243}, {119, 59, 98, 244}, {119, 59, 98, 248}, {119, 59, 98, 249}, {119, 59, 121, 165}, {119, 59, 121, 166}, {119, 59, 121, 171}, {119, 59, 121, 173}}}, - {Region: models.CyberghostRegion("Thailand"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{119, 59, 98, 214}, {119, 59, 98, 238}, {119, 59, 98, 244}, {119, 59, 98, 247}, {119, 59, 121, 163}, {119, 59, 121, 165}, {119, 59, 121, 166}, {119, 59, 121, 167}, {119, 59, 121, 173}, {119, 59, 121, 175}}}, - {Region: models.CyberghostRegion("Turkey"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{188, 213, 34, 9}, {188, 213, 34, 22}, {188, 213, 34, 24}, {188, 213, 34, 27}, {188, 213, 34, 28}, {188, 213, 34, 35}, {188, 213, 34, 41}, {188, 213, 34, 44}, {188, 213, 34, 45}, {188, 213, 34, 46}}}, - {Region: models.CyberghostRegion("Turkey"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{188, 213, 34, 3}, {188, 213, 34, 13}, {188, 213, 34, 18}, {188, 213, 34, 25}, {188, 213, 34, 27}, {188, 213, 34, 30}, {188, 213, 34, 35}, {188, 213, 34, 37}, {188, 213, 34, 38}, {188, 213, 34, 44}}}, - {Region: models.CyberghostRegion("Ukraine"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{31, 28, 161, 21}, {31, 28, 163, 34}, {31, 28, 163, 35}, {31, 28, 163, 38}, {31, 28, 163, 50}, {62, 149, 7, 164}, {62, 149, 7, 167}, {62, 149, 29, 50}, {62, 149, 29, 53}, {62, 149, 29, 56}}}, - {Region: models.CyberghostRegion("Ukraine"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{31, 28, 161, 20}, {31, 28, 161, 28}, {31, 28, 161, 30}, {31, 28, 163, 37}, {31, 28, 163, 45}, {31, 28, 163, 53}, {31, 28, 163, 56}, {31, 28, 163, 59}, {62, 149, 7, 168}, {62, 149, 29, 56}}}, - {Region: models.CyberghostRegion("United Arab Emirates"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 131, 5, 6}, {45, 131, 5, 9}, {45, 131, 5, 12}, {45, 131, 5, 14}, {45, 131, 5, 16}, {45, 131, 5, 17}, {45, 131, 5, 18}, {45, 131, 5, 27}, {45, 131, 5, 28}, {45, 131, 5, 29}}}, - {Region: models.CyberghostRegion("United Arab Emirates"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 131, 5, 8}, {45, 131, 5, 14}, {45, 131, 5, 15}, {45, 131, 5, 20}, {45, 131, 5, 22}, {45, 131, 5, 23}, {45, 131, 5, 24}, {45, 131, 5, 26}, {45, 131, 5, 28}, {45, 131, 5, 29}}}, - {Region: models.CyberghostRegion("United Kingdom"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{37, 120, 133, 134}, {37, 120, 133, 140}, {84, 17, 51, 32}, {84, 17, 51, 75}, {89, 238, 138, 243}, {89, 238, 183, 230}, {95, 154, 200, 144}, {95, 154, 200, 186}, {141, 98, 100, 56}, {141, 98, 100, 61}}}, - {Region: models.CyberghostRegion("United Kingdom"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{37, 120, 133, 134}, {37, 120, 159, 35}, {81, 92, 206, 172}, {84, 17, 51, 34}, {84, 17, 51, 110}, {84, 17, 51, 115}, {89, 238, 135, 59}, {95, 154, 200, 147}, {95, 154, 200, 149}, {141, 98, 100, 58}}}, - {Region: models.CyberghostRegion("United States"), Group: models.CyberghostGroup("Premium TCP USA"), IPs: []net.IP{{23, 105, 160, 184}, {38, 131, 126, 150}, {84, 17, 35, 32}, {89, 187, 182, 7}, {89, 187, 182, 31}, {176, 113, 72, 153}, {176, 113, 72, 167}, {192, 96, 203, 150}, {199, 115, 119, 238}, {212, 102, 41, 4}}}, - {Region: models.CyberghostRegion("United States"), Group: models.CyberghostGroup("Premium UDP USA"), IPs: []net.IP{{23, 19, 68, 56}, {23, 82, 78, 29}, {23, 105, 191, 36}, {23, 105, 191, 51}, {84, 17, 35, 8}, {89, 187, 171, 138}, {108, 62, 96, 33}, {176, 113, 72, 151}, {192, 96, 203, 154}, {199, 115, 117, 70}}}, - {Region: models.CyberghostRegion("Venezuela"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 133, 89, 6}, {45, 133, 89, 9}, {45, 133, 89, 11}, {45, 133, 89, 15}, {45, 133, 89, 17}, {45, 133, 89, 18}, {45, 133, 89, 22}, {45, 133, 89, 24}, {45, 133, 89, 26}, {45, 133, 89, 29}}}, - {Region: models.CyberghostRegion("Venezuela"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 133, 89, 8}, {45, 133, 89, 9}, {45, 133, 89, 15}, {45, 133, 89, 17}, {45, 133, 89, 21}, {45, 133, 89, 22}, {45, 133, 89, 25}, {45, 133, 89, 26}, {45, 133, 89, 27}, {45, 133, 89, 29}}}, - {Region: models.CyberghostRegion("Vietnam"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{45, 117, 79, 118}, {45, 117, 79, 123}, {45, 117, 79, 124}, {45, 117, 79, 125}, {103, 238, 214, 131}, {103, 238, 214, 134}, {103, 238, 214, 135}, {103, 238, 214, 136}, {103, 238, 214, 137}, {103, 238, 214, 140}}}, - {Region: models.CyberghostRegion("Vietnam"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{45, 117, 79, 114}, {45, 117, 79, 116}, {45, 117, 79, 117}, {45, 117, 79, 118}, {45, 117, 79, 123}, {103, 238, 214, 134}, {103, 238, 214, 135}, {103, 238, 214, 136}, {103, 238, 214, 137}, {103, 238, 214, 140}}}, + {Region: "Albania", Group: "Premium TCP Europe", IPs: []net.IP{{31, 171, 152, 99}, {31, 171, 152, 100}, {31, 171, 152, 102}, {31, 171, 152, 105}, {31, 171, 152, 107}, {31, 171, 152, 109}, {31, 171, 152, 133}, {31, 171, 152, 135}, {31, 171, 152, 136}, {31, 171, 152, 139}}}, + {Region: "Albania", Group: "Premium UDP Europe", IPs: []net.IP{{31, 171, 152, 99}, {31, 171, 152, 101}, {31, 171, 152, 103}, {31, 171, 152, 105}, {31, 171, 152, 106}, {31, 171, 152, 133}, {31, 171, 152, 135}, {31, 171, 152, 137}, {31, 171, 152, 138}, {31, 171, 152, 139}}}, + {Region: "Algeria", Group: "Premium TCP Europe", IPs: []net.IP{{45, 133, 91, 7}, {45, 133, 91, 9}, {45, 133, 91, 12}, {45, 133, 91, 15}, {45, 133, 91, 17}, {45, 133, 91, 18}, {45, 133, 91, 20}, {45, 133, 91, 23}, {45, 133, 91, 24}, {45, 133, 91, 26}}}, + {Region: "Algeria", Group: "Premium UDP Europe", IPs: []net.IP{{45, 133, 91, 7}, {45, 133, 91, 10}, {45, 133, 91, 11}, {45, 133, 91, 15}, {45, 133, 91, 17}, {45, 133, 91, 18}, {45, 133, 91, 21}, {45, 133, 91, 25}, {45, 133, 91, 26}, {45, 133, 91, 29}}}, + {Region: "Andorra", Group: "Premium TCP Europe", IPs: []net.IP{{45, 139, 49, 10}, {45, 139, 49, 14}, {45, 139, 49, 15}, {45, 139, 49, 16}, {45, 139, 49, 17}, {45, 139, 49, 18}, {45, 139, 49, 19}, {45, 139, 49, 23}, {45, 139, 49, 25}, {45, 139, 49, 28}}}, + {Region: "Andorra", Group: "Premium UDP Europe", IPs: []net.IP{{45, 139, 49, 7}, {45, 139, 49, 9}, {45, 139, 49, 10}, {45, 139, 49, 12}, {45, 139, 49, 15}, {45, 139, 49, 16}, {45, 139, 49, 17}, {45, 139, 49, 25}, {45, 139, 49, 27}, {45, 139, 49, 28}}}, + {Region: "Argentina", Group: "Premium TCP USA", IPs: []net.IP{{190, 106, 130, 16}, {190, 106, 130, 17}, {190, 106, 130, 20}, {190, 106, 130, 22}, {190, 106, 130, 23}, {190, 106, 130, 34}, {190, 106, 130, 37}, {190, 106, 130, 38}, {190, 106, 130, 44}, {190, 106, 130, 45}}}, + {Region: "Argentina", Group: "Premium UDP USA", IPs: []net.IP{{190, 106, 130, 15}, {190, 106, 130, 16}, {190, 106, 130, 18}, {190, 106, 130, 19}, {190, 106, 130, 20}, {190, 106, 130, 34}, {190, 106, 130, 36}, {190, 106, 130, 37}, {190, 106, 130, 43}, {190, 106, 130, 52}}}, + {Region: "Armenia", Group: "Premium TCP Europe", IPs: []net.IP{{45, 139, 50, 10}, {45, 139, 50, 12}, {45, 139, 50, 14}, {45, 139, 50, 18}, {45, 139, 50, 19}, {45, 139, 50, 20}, {45, 139, 50, 21}, {45, 139, 50, 26}, {45, 139, 50, 27}, {45, 139, 50, 29}}}, + {Region: "Armenia", Group: "Premium UDP Europe", IPs: []net.IP{{45, 139, 50, 8}, {45, 139, 50, 10}, {45, 139, 50, 11}, {45, 139, 50, 14}, {45, 139, 50, 18}, {45, 139, 50, 20}, {45, 139, 50, 24}, {45, 139, 50, 26}, {45, 139, 50, 27}, {45, 139, 50, 29}}}, + {Region: "Australia", Group: "Premium TCP Asia", IPs: []net.IP{{27, 50, 79, 3}, {27, 50, 79, 4}, {27, 50, 79, 5}, {27, 50, 79, 6}, {27, 50, 79, 9}, {27, 50, 79, 12}, {27, 50, 79, 14}, {103, 13, 101, 171}, {202, 130, 33, 114}, {202, 130, 33, 118}}}, + {Region: "Australia", Group: "Premium UDP Asia", IPs: []net.IP{{27, 50, 79, 3}, {27, 50, 79, 6}, {27, 50, 79, 9}, {27, 50, 79, 10}, {27, 50, 79, 11}, {27, 50, 79, 13}, {103, 13, 101, 174}, {202, 130, 33, 114}, {202, 130, 33, 117}, {202, 130, 33, 118}}}, + {Region: "Austria", Group: "Premium TCP Europe", IPs: []net.IP{{89, 187, 168, 133}, {89, 187, 168, 144}, {89, 187, 168, 150}, {89, 187, 168, 151}, {89, 187, 168, 162}, {89, 187, 168, 163}, {89, 187, 168, 164}, {89, 187, 168, 167}, {89, 187, 168, 178}, {89, 187, 168, 182}}}, + {Region: "Austria", Group: "Premium UDP Europe", IPs: []net.IP{{89, 187, 168, 138}, {89, 187, 168, 139}, {89, 187, 168, 149}, {89, 187, 168, 150}, {89, 187, 168, 161}, {89, 187, 168, 165}, {89, 187, 168, 167}, {89, 187, 168, 168}, {89, 187, 168, 174}, {89, 187, 168, 182}}}, + {Region: "Bahamas", Group: "Premium TCP USA", IPs: []net.IP{{45, 132, 143, 8}, {45, 132, 143, 10}, {45, 132, 143, 11}, {45, 132, 143, 19}, {45, 132, 143, 24}, {45, 132, 143, 28}, {45, 132, 143, 31}, {45, 132, 143, 42}, {45, 132, 143, 43}, {45, 132, 143, 44}}}, + {Region: "Bahamas", Group: "Premium UDP USA", IPs: []net.IP{{45, 132, 143, 1}, {45, 132, 143, 2}, {45, 132, 143, 3}, {45, 132, 143, 5}, {45, 132, 143, 7}, {45, 132, 143, 18}, {45, 132, 143, 23}, {45, 132, 143, 30}, {45, 132, 143, 32}, {45, 132, 143, 48}}}, + {Region: "Bangladesh", Group: "Premium TCP Asia", IPs: []net.IP{{45, 132, 142, 3}, {45, 132, 142, 8}, {45, 132, 142, 12}, {45, 132, 142, 20}, {45, 132, 142, 22}, {45, 132, 142, 26}, {45, 132, 142, 27}, {45, 132, 142, 37}, {45, 132, 142, 39}, {45, 132, 142, 42}}}, + {Region: "Bangladesh", Group: "Premium UDP Asia", IPs: []net.IP{{45, 132, 142, 6}, {45, 132, 142, 8}, {45, 132, 142, 13}, {45, 132, 142, 18}, {45, 132, 142, 33}, {45, 132, 142, 35}, {45, 132, 142, 38}, {45, 132, 142, 41}, {45, 132, 142, 42}, {45, 132, 142, 45}}}, + {Region: "Belarus", Group: "Premium TCP Europe", IPs: []net.IP{{45, 132, 194, 3}, {45, 132, 194, 4}, {45, 132, 194, 26}, {45, 132, 194, 28}, {45, 132, 194, 34}, {45, 132, 194, 38}, {45, 132, 194, 39}, {45, 132, 194, 42}, {45, 132, 194, 44}, {45, 132, 194, 48}}}, + {Region: "Belarus", Group: "Premium UDP Europe", IPs: []net.IP{{45, 132, 194, 4}, {45, 132, 194, 5}, {45, 132, 194, 9}, {45, 132, 194, 10}, {45, 132, 194, 20}, {45, 132, 194, 25}, {45, 132, 194, 29}, {45, 132, 194, 31}, {45, 132, 194, 40}, {45, 132, 194, 45}}}, + {Region: "Belgium", Group: "Premium TCP Europe", IPs: []net.IP{{37, 120, 143, 52}, {37, 120, 143, 55}, {37, 120, 143, 58}, {185, 210, 217, 10}, {185, 210, 217, 54}, {185, 210, 217, 244}, {185, 210, 217, 251}, {185, 232, 21, 119}, {193, 9, 114, 228}, {193, 9, 114, 230}}}, + {Region: "Belgium", Group: "Premium UDP Europe", IPs: []net.IP{{5, 253, 205, 22}, {5, 253, 205, 23}, {37, 120, 143, 165}, {185, 210, 217, 14}, {185, 210, 217, 248}, {185, 210, 217, 254}, {193, 9, 114, 212}, {193, 9, 114, 213}, {193, 9, 114, 219}, {193, 9, 114, 228}}}, + {Region: "Bosnia and Herzegovina", Group: "Premium TCP Europe", IPs: []net.IP{{185, 99, 3, 57}, {185, 99, 3, 58}, {185, 99, 3, 72}, {185, 99, 3, 73}, {185, 99, 3, 74}, {185, 99, 3, 130}, {185, 99, 3, 131}, {185, 99, 3, 134}, {185, 99, 3, 135}, {185, 99, 3, 136}}}, + {Region: "Bosnia and Herzegovina", Group: "Premium UDP Europe", IPs: []net.IP{{185, 99, 3, 57}, {185, 99, 3, 58}, {185, 99, 3, 72}, {185, 99, 3, 73}, {185, 99, 3, 74}, {185, 99, 3, 130}, {185, 99, 3, 131}, {185, 99, 3, 134}, {185, 99, 3, 135}, {185, 99, 3, 136}}}, + {Region: "Brazil", Group: "Premium TCP USA", IPs: []net.IP{{45, 231, 207, 65}, {45, 231, 207, 67}, {45, 231, 207, 68}, {45, 231, 207, 69}, {45, 231, 207, 75}, {177, 67, 81, 170}, {181, 41, 203, 98}, {181, 41, 203, 100}, {181, 41, 203, 102}, {181, 41, 203, 110}}}, + {Region: "Brazil", Group: "Premium UDP USA", IPs: []net.IP{{45, 231, 207, 77}, {177, 67, 81, 163}, {177, 67, 81, 164}, {177, 67, 81, 165}, {177, 67, 81, 167}, {177, 67, 81, 170}, {177, 67, 81, 173}, {177, 67, 81, 174}, {181, 41, 203, 103}, {181, 41, 203, 104}}}, + {Region: "Bulgaria", Group: "Premium TCP Europe", IPs: []net.IP{{37, 120, 152, 99}, {37, 120, 152, 102}, {37, 120, 152, 103}, {37, 120, 152, 104}, {37, 120, 152, 105}, {37, 120, 152, 106}, {37, 120, 152, 107}, {37, 120, 152, 108}, {37, 120, 152, 109}, {37, 120, 152, 110}}}, + {Region: "Bulgaria", Group: "Premium UDP Europe", IPs: []net.IP{{37, 120, 152, 99}, {37, 120, 152, 100}, {37, 120, 152, 101}, {37, 120, 152, 103}, {37, 120, 152, 104}, {37, 120, 152, 105}, {37, 120, 152, 107}, {37, 120, 152, 108}, {37, 120, 152, 109}, {37, 120, 152, 110}}}, + {Region: "Cambodia", Group: "Premium TCP Asia", IPs: []net.IP{{188, 215, 235, 36}, {188, 215, 235, 38}, {188, 215, 235, 39}, {188, 215, 235, 40}, {188, 215, 235, 43}, {188, 215, 235, 46}, {188, 215, 235, 47}, {188, 215, 235, 48}, {188, 215, 235, 51}, {188, 215, 235, 54}}}, + {Region: "Cambodia", Group: "Premium UDP Asia", IPs: []net.IP{{188, 215, 235, 35}, {188, 215, 235, 36}, {188, 215, 235, 37}, {188, 215, 235, 38}, {188, 215, 235, 45}, {188, 215, 235, 46}, {188, 215, 235, 52}, {188, 215, 235, 53}, {188, 215, 235, 55}, {188, 215, 235, 58}}}, + {Region: "Canada", Group: "Premium TCP USA", IPs: []net.IP{{37, 120, 205, 8}, {37, 120, 205, 28}, {104, 245, 145, 163}, {104, 245, 146, 38}, {104, 245, 146, 101}, {176, 113, 74, 44}, {176, 113, 74, 52}, {176, 113, 74, 67}, {176, 113, 74, 126}, {176, 113, 74, 217}}}, + {Region: "Canada", Group: "Premium UDP USA", IPs: []net.IP{{37, 120, 205, 40}, {54, 39, 11, 194}, {104, 245, 145, 164}, {104, 245, 146, 41}, {139, 28, 218, 86}, {139, 28, 218, 87}, {176, 113, 74, 19}, {176, 113, 74, 25}, {176, 113, 74, 30}, {176, 113, 74, 195}}}, + {Region: "Chile", Group: "Premium TCP USA", IPs: []net.IP{{190, 105, 239, 129}, {190, 105, 239, 130}, {190, 105, 239, 131}, {190, 105, 239, 132}, {190, 105, 239, 133}, {190, 105, 239, 134}, {190, 105, 239, 135}, {190, 105, 239, 136}, {190, 105, 239, 137}, {190, 105, 239, 138}}}, + {Region: "Chile", Group: "Premium UDP USA", IPs: []net.IP{{190, 105, 239, 129}, {190, 105, 239, 130}, {190, 105, 239, 131}, {190, 105, 239, 132}, {190, 105, 239, 133}, {190, 105, 239, 134}, {190, 105, 239, 135}, {190, 105, 239, 136}, {190, 105, 239, 137}, {190, 105, 239, 138}}}, + {Region: "China", Group: "Premium TCP Asia", IPs: []net.IP{{45, 132, 193, 2}, {45, 132, 193, 3}, {45, 132, 193, 9}, {45, 132, 193, 10}, {45, 132, 193, 12}, {45, 132, 193, 13}, {45, 132, 193, 32}, {45, 132, 193, 36}, {45, 132, 193, 43}, {45, 132, 193, 45}}}, + {Region: "China", Group: "Premium UDP Asia", IPs: []net.IP{{45, 132, 193, 2}, {45, 132, 193, 3}, {45, 132, 193, 4}, {45, 132, 193, 14}, {45, 132, 193, 19}, {45, 132, 193, 22}, {45, 132, 193, 30}, {45, 132, 193, 35}, {45, 132, 193, 36}, {45, 132, 193, 42}}}, + {Region: "Colombia", Group: "Premium TCP USA", IPs: []net.IP{{190, 105, 229, 19}, {190, 105, 229, 20}, {190, 105, 229, 21}, {190, 105, 229, 22}}}, + {Region: "Colombia", Group: "Premium UDP USA", IPs: []net.IP{{190, 105, 229, 19}, {190, 105, 229, 20}, {190, 105, 229, 21}, {190, 105, 229, 22}}}, + {Region: "Costa Rica", Group: "Premium TCP USA", IPs: []net.IP{{143, 202, 160, 67}, {143, 202, 160, 69}, {143, 202, 160, 70}, {143, 202, 160, 72}, {143, 202, 160, 73}, {143, 202, 160, 74}, {143, 202, 160, 75}, {143, 202, 160, 76}, {143, 202, 160, 77}, {143, 202, 160, 78}}}, + {Region: "Costa Rica", Group: "Premium UDP USA", IPs: []net.IP{{143, 202, 160, 67}, {143, 202, 160, 68}, {143, 202, 160, 69}, {143, 202, 160, 70}, {143, 202, 160, 71}, {143, 202, 160, 73}, {143, 202, 160, 74}, {143, 202, 160, 75}, {143, 202, 160, 76}, {143, 202, 160, 78}}}, + {Region: "Cyprus", Group: "Premium TCP Europe", IPs: []net.IP{{45, 132, 137, 8}, {45, 132, 137, 11}, {45, 132, 137, 12}, {45, 132, 137, 15}, {45, 132, 137, 17}, {45, 132, 137, 18}, {45, 132, 137, 19}, {45, 132, 137, 23}, {45, 132, 137, 26}, {45, 132, 137, 28}}}, + {Region: "Cyprus", Group: "Premium UDP Europe", IPs: []net.IP{{45, 132, 137, 8}, {45, 132, 137, 10}, {45, 132, 137, 16}, {45, 132, 137, 19}, {45, 132, 137, 20}, {45, 132, 137, 21}, {45, 132, 137, 22}, {45, 132, 137, 23}, {45, 132, 137, 25}, {45, 132, 137, 28}}}, + {Region: "Czech Republic", Group: "Premium TCP Europe", IPs: []net.IP{{195, 181, 160, 66}, {195, 181, 160, 72}, {195, 181, 161, 7}, {195, 181, 161, 9}, {195, 181, 161, 10}, {195, 181, 161, 11}, {195, 181, 161, 14}, {195, 181, 161, 17}, {195, 181, 161, 23}, {195, 181, 161, 25}}}, + {Region: "Czech Republic", Group: "Premium UDP Europe", IPs: []net.IP{{185, 216, 35, 231}, {185, 216, 35, 232}, {185, 216, 35, 235}, {195, 181, 160, 75}, {195, 181, 161, 2}, {195, 181, 161, 8}, {195, 181, 161, 15}, {195, 181, 161, 16}, {195, 181, 161, 23}, {195, 181, 161, 25}}}, + {Region: "Denmark", Group: "Premium TCP Europe", IPs: []net.IP{{37, 120, 145, 93}, {37, 120, 194, 39}, {37, 120, 194, 41}, {37, 120, 194, 53}, {95, 174, 65, 166}, {95, 174, 65, 167}, {95, 174, 65, 174}, {185, 206, 224, 230}, {185, 206, 224, 235}, {185, 206, 224, 253}}}, + {Region: "Denmark", Group: "Premium UDP Europe", IPs: []net.IP{{37, 120, 145, 84}, {37, 120, 145, 88}, {37, 120, 194, 38}, {37, 120, 194, 58}, {95, 174, 65, 163}, {95, 174, 65, 165}, {185, 206, 224, 227}, {185, 206, 224, 243}, {185, 206, 224, 245}, {185, 206, 224, 253}}}, + {Region: "Egypt", Group: "Premium TCP Europe", IPs: []net.IP{{45, 132, 139, 7}, {45, 132, 139, 22}, {45, 132, 139, 24}, {45, 132, 139, 27}, {45, 132, 139, 28}, {45, 132, 139, 29}, {188, 214, 122, 36}, {188, 214, 122, 41}, {188, 214, 122, 52}, {188, 214, 122, 56}}}, + {Region: "Egypt", Group: "Premium UDP Europe", IPs: []net.IP{{45, 132, 139, 7}, {45, 132, 139, 17}, {45, 132, 139, 18}, {45, 132, 139, 22}, {45, 132, 139, 23}, {188, 214, 122, 41}, {188, 214, 122, 48}, {188, 214, 122, 49}, {188, 214, 122, 51}, {188, 214, 122, 61}}}, + {Region: "Estonia", Group: "Premium TCP Europe", IPs: []net.IP{{77, 247, 111, 6}, {77, 247, 111, 11}, {77, 247, 111, 52}, {77, 247, 111, 53}, {77, 247, 111, 55}, {77, 247, 111, 56}, {77, 247, 111, 57}, {77, 247, 111, 60}, {77, 247, 111, 61}, {77, 247, 111, 62}}}, + {Region: "Estonia", Group: "Premium UDP Europe", IPs: []net.IP{{77, 247, 111, 3}, {77, 247, 111, 4}, {77, 247, 111, 5}, {77, 247, 111, 7}, {77, 247, 111, 11}, {77, 247, 111, 12}, {77, 247, 111, 52}, {77, 247, 111, 53}, {77, 247, 111, 55}, {77, 247, 111, 59}}}, + {Region: "Finland", Group: "Premium TCP Europe", IPs: []net.IP{{194, 34, 133, 171}, {194, 34, 133, 172}, {194, 34, 133, 176}, {194, 34, 133, 179}, {194, 34, 133, 180}, {194, 34, 133, 195}, {194, 34, 133, 196}, {194, 34, 133, 204}, {194, 34, 133, 207}, {194, 34, 133, 208}}}, + {Region: "Finland", Group: "Premium UDP Europe", IPs: []net.IP{{194, 34, 133, 163}, {194, 34, 133, 164}, {194, 34, 133, 167}, {194, 34, 133, 178}, {194, 34, 133, 192}, {194, 34, 133, 201}, {194, 34, 133, 205}, {194, 34, 133, 206}, {194, 34, 133, 208}, {194, 34, 133, 214}}}, + {Region: "France", Group: "Premium TCP Europe", IPs: []net.IP{{84, 17, 60, 21}, {84, 17, 60, 33}, {84, 17, 60, 89}, {84, 17, 60, 92}, {84, 17, 60, 114}, {84, 17, 61, 23}, {84, 17, 61, 43}, {84, 17, 61, 111}, {84, 17, 61, 235}, {151, 106, 8, 36}}}, + {Region: "France", Group: "Premium UDP Europe", IPs: []net.IP{{84, 17, 60, 8}, {84, 17, 60, 54}, {84, 17, 60, 161}, {84, 17, 60, 188}, {84, 17, 61, 32}, {84, 17, 61, 101}, {84, 17, 61, 163}, {84, 17, 61, 187}, {84, 17, 61, 213}, {151, 106, 8, 46}}}, + {Region: "Georgia", Group: "Premium TCP Europe", IPs: []net.IP{{45, 132, 138, 7}, {45, 132, 138, 8}, {45, 132, 138, 9}, {45, 132, 138, 12}, {45, 132, 138, 14}, {45, 132, 138, 18}, {45, 132, 138, 19}, {45, 132, 138, 20}, {45, 132, 138, 23}, {45, 132, 138, 27}}}, + {Region: "Georgia", Group: "Premium UDP Europe", IPs: []net.IP{{45, 132, 138, 7}, {45, 132, 138, 8}, {45, 132, 138, 9}, {45, 132, 138, 10}, {45, 132, 138, 17}, {45, 132, 138, 18}, {45, 132, 138, 25}, {45, 132, 138, 26}, {45, 132, 138, 27}, {45, 132, 138, 28}}}, + {Region: "Germany", Group: "Premium TCP Europe", IPs: []net.IP{{37, 120, 217, 110}, {84, 17, 48, 75}, {84, 17, 48, 100}, {84, 17, 48, 182}, {84, 17, 49, 129}, {154, 28, 188, 50}, {154, 28, 188, 128}, {178, 162, 208, 155}, {178, 162, 209, 72}, {178, 162, 216, 49}}}, + {Region: "Germany", Group: "Premium UDP Europe", IPs: []net.IP{{37, 120, 217, 5}, {37, 120, 217, 27}, {84, 17, 48, 20}, {84, 17, 48, 64}, {84, 17, 48, 68}, {84, 17, 48, 182}, {84, 17, 49, 141}, {84, 17, 49, 144}, {154, 28, 188, 90}, {154, 28, 188, 143}}}, + {Region: "Greece", Group: "Premium TCP Europe", IPs: []net.IP{{154, 57, 3, 130}, {154, 57, 3, 132}, {154, 57, 3, 135}, {154, 57, 3, 138}, {154, 57, 3, 140}, {188, 123, 126, 168}, {188, 123, 126, 170}, {188, 123, 126, 176}, {188, 123, 126, 177}, {188, 123, 126, 178}}}, + {Region: "Greece", Group: "Premium UDP Europe", IPs: []net.IP{{154, 57, 3, 130}, {154, 57, 3, 132}, {154, 57, 3, 133}, {154, 57, 3, 137}, {188, 123, 126, 167}, {188, 123, 126, 170}, {188, 123, 126, 172}, {188, 123, 126, 173}, {188, 123, 126, 174}, {188, 123, 126, 177}}}, + {Region: "Greenland", Group: "Premium TCP Europe", IPs: []net.IP{{45, 131, 209, 8}, {45, 131, 209, 9}, {45, 131, 209, 12}, {45, 131, 209, 16}, {45, 131, 209, 18}, {45, 131, 209, 20}, {45, 131, 209, 22}, {45, 131, 209, 23}, {45, 131, 209, 26}, {45, 131, 209, 27}}}, + {Region: "Greenland", Group: "Premium UDP Europe", IPs: []net.IP{{45, 131, 209, 6}, {45, 131, 209, 11}, {45, 131, 209, 19}, {45, 131, 209, 20}, {45, 131, 209, 21}, {45, 131, 209, 23}, {45, 131, 209, 26}, {45, 131, 209, 27}, {45, 131, 209, 28}, {45, 131, 209, 29}}}, + {Region: "Hong Kong", Group: "Premium TCP Asia", IPs: []net.IP{{84, 17, 56, 130}, {84, 17, 56, 136}, {84, 17, 56, 148}, {84, 17, 56, 149}, {84, 17, 56, 152}, {84, 17, 56, 172}, {84, 17, 56, 173}, {84, 17, 56, 175}, {84, 17, 56, 176}, {84, 17, 56, 181}}}, + {Region: "Hong Kong", Group: "Premium UDP Asia", IPs: []net.IP{{84, 17, 56, 133}, {84, 17, 56, 140}, {84, 17, 56, 146}, {84, 17, 56, 151}, {84, 17, 56, 162}, {84, 17, 56, 166}, {84, 17, 56, 172}, {84, 17, 56, 174}, {84, 17, 56, 176}, {84, 17, 56, 182}}}, + {Region: "Hungary", Group: "Premium TCP Europe", IPs: []net.IP{{185, 104, 187, 83}, {185, 104, 187, 85}, {185, 104, 187, 86}, {185, 104, 187, 92}, {185, 189, 114, 116}, {185, 189, 114, 119}, {185, 189, 114, 120}, {185, 189, 114, 121}, {185, 189, 114, 124}, {185, 189, 114, 125}}}, + {Region: "Hungary", Group: "Premium UDP Europe", IPs: []net.IP{{185, 104, 187, 83}, {185, 104, 187, 85}, {185, 104, 187, 93}, {185, 189, 114, 115}, {185, 189, 114, 118}, {185, 189, 114, 119}, {185, 189, 114, 120}, {185, 189, 114, 121}, {185, 189, 114, 123}, {185, 189, 114, 125}}}, + {Region: "Iceland", Group: "Premium TCP Europe", IPs: []net.IP{{213, 167, 139, 19}, {213, 167, 139, 20}, {213, 167, 139, 21}, {213, 167, 139, 22}, {213, 167, 139, 23}, {213, 167, 139, 24}, {213, 167, 139, 25}, {213, 167, 139, 26}, {213, 167, 139, 28}, {213, 167, 139, 30}}}, + {Region: "Iceland", Group: "Premium UDP Europe", IPs: []net.IP{{213, 167, 139, 19}, {213, 167, 139, 21}, {213, 167, 139, 22}, {213, 167, 139, 24}, {213, 167, 139, 25}, {213, 167, 139, 26}, {213, 167, 139, 27}, {213, 167, 139, 28}, {213, 167, 139, 29}, {213, 167, 139, 30}}}, + {Region: "India", Group: "Premium TCP Europe", IPs: []net.IP{{43, 241, 71, 115}, {43, 241, 71, 118}, {43, 241, 71, 120}, {43, 241, 71, 122}, {43, 241, 71, 125}, {43, 241, 71, 147}, {43, 241, 71, 148}, {43, 241, 71, 149}, {43, 241, 71, 154}, {43, 241, 71, 156}}}, + {Region: "India", Group: "Premium UDP Europe", IPs: []net.IP{{43, 241, 71, 116}, {43, 241, 71, 117}, {43, 241, 71, 118}, {43, 241, 71, 122}, {43, 241, 71, 125}, {43, 241, 71, 147}, {43, 241, 71, 148}, {43, 241, 71, 153}, {43, 241, 71, 155}, {43, 241, 71, 156}}}, + {Region: "Indonesia", Group: "Premium TCP Asia", IPs: []net.IP{{113, 20, 29, 243}, {113, 20, 29, 244}, {113, 20, 29, 246}, {113, 20, 29, 247}, {113, 20, 29, 248}, {113, 20, 29, 249}, {113, 20, 29, 250}, {113, 20, 29, 251}, {113, 20, 29, 252}, {113, 20, 29, 254}}}, + {Region: "Indonesia", Group: "Premium UDP Asia", IPs: []net.IP{{113, 20, 29, 243}, {113, 20, 29, 245}, {113, 20, 29, 246}, {113, 20, 29, 247}, {113, 20, 29, 248}, {113, 20, 29, 249}, {113, 20, 29, 250}, {113, 20, 29, 251}, {113, 20, 29, 252}, {113, 20, 29, 253}}}, + {Region: "Iran", Group: "Premium TCP Europe", IPs: []net.IP{{45, 131, 4, 10}, {45, 131, 4, 16}, {45, 131, 4, 17}, {45, 131, 4, 18}, {45, 131, 4, 20}, {45, 131, 4, 21}, {45, 131, 4, 22}, {45, 131, 4, 24}, {45, 131, 4, 25}, {45, 131, 4, 28}}}, + {Region: "Iran", Group: "Premium UDP Europe", IPs: []net.IP{{45, 131, 4, 6}, {45, 131, 4, 8}, {45, 131, 4, 12}, {45, 131, 4, 14}, {45, 131, 4, 15}, {45, 131, 4, 20}, {45, 131, 4, 23}, {45, 131, 4, 24}, {45, 131, 4, 27}, {45, 131, 4, 28}}}, + {Region: "Ireland", Group: "Premium TCP Europe", IPs: []net.IP{{84, 247, 48, 3}, {84, 247, 48, 4}, {84, 247, 48, 5}, {84, 247, 48, 8}, {84, 247, 48, 9}, {84, 247, 48, 10}, {84, 247, 48, 11}, {84, 247, 48, 12}, {84, 247, 48, 19}, {84, 247, 48, 21}}}, + {Region: "Ireland", Group: "Premium UDP Europe", IPs: []net.IP{{84, 247, 48, 3}, {84, 247, 48, 13}, {84, 247, 48, 14}, {84, 247, 48, 20}, {84, 247, 48, 21}, {84, 247, 48, 23}, {84, 247, 48, 24}, {84, 247, 48, 25}, {84, 247, 48, 26}, {84, 247, 48, 27}}}, + {Region: "Isle of Man", Group: "Premium TCP Europe", IPs: []net.IP{{45, 132, 140, 7}, {45, 132, 140, 8}, {45, 132, 140, 10}, {45, 132, 140, 11}, {45, 132, 140, 15}, {45, 132, 140, 17}, {45, 132, 140, 18}, {45, 132, 140, 19}, {45, 132, 140, 27}, {45, 132, 140, 28}}}, + {Region: "Isle of Man", Group: "Premium UDP Europe", IPs: []net.IP{{45, 132, 140, 7}, {45, 132, 140, 9}, {45, 132, 140, 10}, {45, 132, 140, 16}, {45, 132, 140, 19}, {45, 132, 140, 20}, {45, 132, 140, 21}, {45, 132, 140, 25}, {45, 132, 140, 26}, {45, 132, 140, 28}}}, + {Region: "Israel", Group: "Premium TCP Europe", IPs: []net.IP{{160, 116, 0, 163}, {160, 116, 0, 164}, {160, 116, 0, 166}, {160, 116, 0, 167}, {160, 116, 0, 169}, {160, 116, 0, 170}, {160, 116, 0, 171}, {160, 116, 0, 172}, {160, 116, 0, 173}, {160, 116, 0, 174}}}, + {Region: "Israel", Group: "Premium UDP Europe", IPs: []net.IP{{160, 116, 0, 163}, {160, 116, 0, 165}, {160, 116, 0, 166}, {160, 116, 0, 167}, {160, 116, 0, 168}, {160, 116, 0, 169}, {160, 116, 0, 170}, {160, 116, 0, 172}, {160, 116, 0, 173}, {160, 116, 0, 174}}}, + {Region: "Italy", Group: "Premium TCP Europe", IPs: []net.IP{{84, 17, 58, 11}, {84, 17, 58, 19}, {87, 101, 94, 70}, {87, 101, 94, 116}, {185, 217, 71, 133}, {185, 217, 71, 137}, {212, 102, 55, 100}, {212, 102, 55, 123}, {212, 102, 55, 139}, {212, 102, 55, 184}}}, + {Region: "Italy", Group: "Premium UDP Europe", IPs: []net.IP{{84, 17, 58, 7}, {84, 17, 58, 100}, {84, 17, 58, 103}, {84, 17, 58, 104}, {87, 101, 94, 116}, {87, 101, 94, 124}, {185, 217, 71, 132}, {185, 217, 71, 134}, {212, 102, 55, 156}, {212, 102, 55, 167}}}, + {Region: "Japan", Group: "Premium TCP Asia", IPs: []net.IP{{156, 146, 35, 5}, {156, 146, 35, 8}, {156, 146, 35, 9}, {156, 146, 35, 17}, {156, 146, 35, 20}, {156, 146, 35, 33}, {156, 146, 35, 36}, {156, 146, 35, 42}, {156, 146, 35, 45}, {156, 146, 35, 50}}}, + {Region: "Japan", Group: "Premium UDP Asia", IPs: []net.IP{{156, 146, 35, 6}, {156, 146, 35, 8}, {156, 146, 35, 19}, {156, 146, 35, 22}, {156, 146, 35, 27}, {156, 146, 35, 32}, {156, 146, 35, 35}, {156, 146, 35, 37}, {156, 146, 35, 41}, {156, 146, 35, 47}}}, + {Region: "Kazakhstan", Group: "Premium TCP Europe", IPs: []net.IP{{45, 133, 88, 7}, {45, 133, 88, 11}, {45, 133, 88, 12}, {45, 133, 88, 13}, {45, 133, 88, 14}, {45, 133, 88, 20}, {45, 133, 88, 23}, {45, 133, 88, 24}, {45, 133, 88, 26}, {45, 133, 88, 28}}}, + {Region: "Kazakhstan", Group: "Premium UDP Europe", IPs: []net.IP{{45, 133, 88, 8}, {45, 133, 88, 12}, {45, 133, 88, 13}, {45, 133, 88, 15}, {45, 133, 88, 19}, {45, 133, 88, 20}, {45, 133, 88, 24}, {45, 133, 88, 25}, {45, 133, 88, 26}, {45, 133, 88, 28}}}, + {Region: "Kenya", Group: "Premium TCP Asia", IPs: []net.IP{{62, 12, 118, 195}, {62, 12, 118, 196}, {62, 12, 118, 197}, {62, 12, 118, 198}, {62, 12, 118, 199}, {62, 12, 118, 200}, {62, 12, 118, 201}, {62, 12, 118, 202}, {62, 12, 118, 203}, {62, 12, 118, 204}}}, + {Region: "Kenya", Group: "Premium UDP Asia", IPs: []net.IP{{62, 12, 118, 195}, {62, 12, 118, 196}, {62, 12, 118, 197}, {62, 12, 118, 198}, {62, 12, 118, 199}, {62, 12, 118, 200}, {62, 12, 118, 201}, {62, 12, 118, 202}, {62, 12, 118, 203}, {62, 12, 118, 204}}}, + {Region: "Korea", Group: "Premium TCP Asia", IPs: []net.IP{{27, 255, 75, 227}, {27, 255, 75, 229}, {27, 255, 75, 233}, {27, 255, 75, 234}, {27, 255, 75, 235}, {27, 255, 75, 236}, {27, 255, 75, 248}, {27, 255, 75, 249}, {27, 255, 75, 251}, {27, 255, 75, 254}}}, + {Region: "Korea", Group: "Premium UDP Asia", IPs: []net.IP{{27, 255, 75, 228}, {27, 255, 75, 229}, {27, 255, 75, 230}, {27, 255, 75, 231}, {27, 255, 75, 234}, {27, 255, 75, 235}, {27, 255, 75, 244}, {27, 255, 75, 245}, {27, 255, 75, 246}, {27, 255, 75, 247}}}, + {Region: "Latvia", Group: "Premium TCP Europe", IPs: []net.IP{{109, 248, 148, 244}, {109, 248, 148, 251}, {109, 248, 148, 252}, {109, 248, 148, 253}, {109, 248, 149, 19}, {109, 248, 149, 20}, {109, 248, 149, 21}, {109, 248, 149, 22}, {109, 248, 149, 24}, {109, 248, 149, 27}}}, + {Region: "Latvia", Group: "Premium UDP Europe", IPs: []net.IP{{109, 248, 148, 248}, {109, 248, 148, 252}, {109, 248, 148, 253}, {109, 248, 148, 254}, {109, 248, 149, 19}, {109, 248, 149, 20}, {109, 248, 149, 21}, {109, 248, 149, 24}, {109, 248, 149, 28}, {109, 248, 149, 29}}}, + {Region: "Liechtenstein", Group: "Premium TCP Europe", IPs: []net.IP{{45, 139, 48, 6}, {45, 139, 48, 7}, {45, 139, 48, 9}, {45, 139, 48, 16}, {45, 139, 48, 17}, {45, 139, 48, 19}, {45, 139, 48, 20}, {45, 139, 48, 22}, {45, 139, 48, 23}, {45, 139, 48, 27}}}, + {Region: "Liechtenstein", Group: "Premium UDP Europe", IPs: []net.IP{{45, 139, 48, 9}, {45, 139, 48, 12}, {45, 139, 48, 15}, {45, 139, 48, 16}, {45, 139, 48, 17}, {45, 139, 48, 18}, {45, 139, 48, 24}, {45, 139, 48, 26}, {45, 139, 48, 28}, {45, 139, 48, 29}}}, + {Region: "Lithuania", Group: "Premium TCP Europe", IPs: []net.IP{{85, 206, 162, 211}, {85, 206, 162, 213}, {85, 206, 162, 214}, {85, 206, 162, 216}, {85, 206, 162, 219}, {85, 206, 162, 220}, {85, 206, 165, 18}, {85, 206, 165, 20}, {85, 206, 165, 24}, {85, 206, 165, 25}}}, + {Region: "Lithuania", Group: "Premium UDP Europe", IPs: []net.IP{{85, 206, 162, 210}, {85, 206, 162, 211}, {85, 206, 162, 214}, {85, 206, 162, 215}, {85, 206, 162, 220}, {85, 206, 162, 221}, {85, 206, 162, 222}, {85, 206, 165, 18}, {85, 206, 165, 25}, {85, 206, 165, 26}}}, + {Region: "Luxembourg", Group: "Premium TCP Europe", IPs: []net.IP{{5, 253, 204, 5}, {5, 253, 204, 6}, {5, 253, 204, 9}, {5, 253, 204, 10}, {5, 253, 204, 12}, {5, 253, 204, 14}, {5, 253, 204, 20}, {5, 253, 204, 23}, {5, 253, 204, 29}, {5, 253, 204, 30}}}, + {Region: "Luxembourg", Group: "Premium UDP Europe", IPs: []net.IP{{5, 253, 204, 7}, {5, 253, 204, 11}, {5, 253, 204, 20}, {5, 253, 204, 22}, {5, 253, 204, 23}, {5, 253, 204, 26}, {5, 253, 204, 27}, {5, 253, 204, 28}, {5, 253, 204, 29}, {5, 253, 204, 30}}}, + {Region: "Macao", Group: "Premium TCP Asia", IPs: []net.IP{{45, 137, 197, 8}, {45, 137, 197, 9}, {45, 137, 197, 12}, {45, 137, 197, 14}, {45, 137, 197, 17}, {45, 137, 197, 33}, {45, 137, 197, 35}, {45, 137, 197, 42}, {45, 137, 197, 45}, {45, 137, 197, 47}}}, + {Region: "Macao", Group: "Premium UDP Asia", IPs: []net.IP{{45, 137, 197, 2}, {45, 137, 197, 7}, {45, 137, 197, 18}, {45, 137, 197, 19}, {45, 137, 197, 28}, {45, 137, 197, 30}, {45, 137, 197, 33}, {45, 137, 197, 35}, {45, 137, 197, 44}, {45, 137, 197, 47}}}, + {Region: "Macedonia", Group: "Premium TCP Europe", IPs: []net.IP{{185, 225, 28, 3}, {185, 225, 28, 4}, {185, 225, 28, 5}, {185, 225, 28, 6}, {185, 225, 28, 7}, {185, 225, 28, 8}, {185, 225, 28, 9}, {185, 225, 28, 10}, {185, 225, 28, 11}, {185, 225, 28, 12}}}, + {Region: "Macedonia", Group: "Premium UDP Europe", IPs: []net.IP{{185, 225, 28, 3}, {185, 225, 28, 4}, {185, 225, 28, 5}, {185, 225, 28, 6}, {185, 225, 28, 7}, {185, 225, 28, 8}, {185, 225, 28, 9}, {185, 225, 28, 10}, {185, 225, 28, 11}, {185, 225, 28, 12}}}, + {Region: "Malaysia", Group: "Premium TCP Asia", IPs: []net.IP{{139, 5, 177, 69}, {139, 5, 177, 70}, {139, 5, 177, 71}, {139, 5, 177, 72}, {139, 5, 177, 73}, {139, 5, 177, 74}, {139, 5, 177, 75}, {139, 5, 177, 76}, {139, 5, 177, 77}, {139, 5, 177, 78}}}, + {Region: "Malaysia", Group: "Premium UDP Asia", IPs: []net.IP{{139, 5, 177, 69}, {139, 5, 177, 70}, {139, 5, 177, 71}, {139, 5, 177, 72}, {139, 5, 177, 73}, {139, 5, 177, 74}, {139, 5, 177, 75}, {139, 5, 177, 76}, {139, 5, 177, 77}, {139, 5, 177, 78}}}, + {Region: "Malta", Group: "Premium TCP Europe", IPs: []net.IP{{45, 137, 198, 6}, {45, 137, 198, 8}, {45, 137, 198, 9}, {45, 137, 198, 11}, {45, 137, 198, 16}, {45, 137, 198, 18}, {45, 137, 198, 22}, {45, 137, 198, 23}, {45, 137, 198, 25}, {45, 137, 198, 27}}}, + {Region: "Malta", Group: "Premium UDP Europe", IPs: []net.IP{{45, 137, 198, 8}, {45, 137, 198, 10}, {45, 137, 198, 12}, {45, 137, 198, 13}, {45, 137, 198, 16}, {45, 137, 198, 17}, {45, 137, 198, 21}, {45, 137, 198, 23}, {45, 137, 198, 26}, {45, 137, 198, 28}}}, + {Region: "Mexico", Group: "Premium TCP USA", IPs: []net.IP{{45, 133, 180, 99}, {45, 133, 180, 106}, {45, 133, 180, 107}, {45, 133, 180, 108}, {45, 133, 180, 115}, {45, 133, 180, 118}, {45, 133, 180, 119}, {45, 133, 180, 121}, {45, 133, 180, 122}, {45, 133, 180, 123}}}, + {Region: "Mexico", Group: "Premium UDP USA", IPs: []net.IP{{45, 133, 180, 99}, {45, 133, 180, 101}, {45, 133, 180, 104}, {45, 133, 180, 105}, {45, 133, 180, 106}, {45, 133, 180, 115}, {45, 133, 180, 117}, {45, 133, 180, 118}, {45, 133, 180, 120}, {45, 133, 180, 121}}}, + {Region: "Moldova", Group: "Premium TCP Europe", IPs: []net.IP{{178, 175, 130, 243}, {178, 175, 130, 245}, {178, 175, 130, 250}, {178, 175, 130, 251}, {178, 175, 130, 253}, {178, 175, 130, 254}, {178, 175, 142, 131}, {178, 175, 142, 132}, {178, 175, 142, 133}, {178, 175, 142, 134}}}, + {Region: "Moldova", Group: "Premium UDP Europe", IPs: []net.IP{{178, 175, 130, 243}, {178, 175, 130, 244}, {178, 175, 130, 245}, {178, 175, 130, 246}, {178, 175, 130, 250}, {178, 175, 130, 251}, {178, 175, 130, 253}, {178, 175, 130, 254}, {178, 175, 142, 132}, {178, 175, 142, 133}}}, + {Region: "Monaco", Group: "Premium TCP Europe", IPs: []net.IP{{45, 137, 199, 7}, {45, 137, 199, 9}, {45, 137, 199, 11}, {45, 137, 199, 12}, {45, 137, 199, 14}, {45, 137, 199, 16}, {45, 137, 199, 20}, {45, 137, 199, 24}, {45, 137, 199, 25}, {45, 137, 199, 29}}}, + {Region: "Monaco", Group: "Premium UDP Europe", IPs: []net.IP{{45, 137, 199, 6}, {45, 137, 199, 7}, {45, 137, 199, 10}, {45, 137, 199, 16}, {45, 137, 199, 18}, {45, 137, 199, 22}, {45, 137, 199, 23}, {45, 137, 199, 24}, {45, 137, 199, 25}, {45, 137, 199, 27}}}, + {Region: "Mongolia", Group: "Premium TCP Asia", IPs: []net.IP{{45, 139, 51, 4}, {45, 139, 51, 13}, {45, 139, 51, 14}, {45, 139, 51, 17}, {45, 139, 51, 18}, {45, 139, 51, 22}, {45, 139, 51, 23}, {45, 139, 51, 32}, {45, 139, 51, 44}, {45, 139, 51, 48}}}, + {Region: "Mongolia", Group: "Premium UDP Asia", IPs: []net.IP{{45, 139, 51, 3}, {45, 139, 51, 6}, {45, 139, 51, 11}, {45, 139, 51, 12}, {45, 139, 51, 17}, {45, 139, 51, 20}, {45, 139, 51, 28}, {45, 139, 51, 30}, {45, 139, 51, 37}, {45, 139, 51, 41}}}, + {Region: "Montenegro", Group: "Premium TCP Europe", IPs: []net.IP{{45, 131, 208, 6}, {45, 131, 208, 7}, {45, 131, 208, 8}, {45, 131, 208, 9}, {45, 131, 208, 10}, {45, 131, 208, 13}, {45, 131, 208, 14}, {45, 131, 208, 20}, {45, 131, 208, 24}, {45, 131, 208, 28}}}, + {Region: "Montenegro", Group: "Premium UDP Europe", IPs: []net.IP{{45, 131, 208, 6}, {45, 131, 208, 8}, {45, 131, 208, 9}, {45, 131, 208, 12}, {45, 131, 208, 16}, {45, 131, 208, 20}, {45, 131, 208, 22}, {45, 131, 208, 24}, {45, 131, 208, 26}, {45, 131, 208, 28}}}, + {Region: "Morocco", Group: "Premium TCP Europe", IPs: []net.IP{{45, 131, 211, 6}, {45, 131, 211, 9}, {45, 131, 211, 11}, {45, 131, 211, 13}, {45, 131, 211, 18}, {45, 131, 211, 21}, {45, 131, 211, 22}, {45, 131, 211, 23}, {45, 131, 211, 28}, {45, 131, 211, 29}}}, + {Region: "Morocco", Group: "Premium UDP Europe", IPs: []net.IP{{45, 131, 211, 9}, {45, 131, 211, 10}, {45, 131, 211, 13}, {45, 131, 211, 18}, {45, 131, 211, 20}, {45, 131, 211, 21}, {45, 131, 211, 25}, {45, 131, 211, 26}, {45, 131, 211, 28}, {45, 131, 211, 29}}}, + {Region: "Netherlands", Group: "Premium TCP Europe", IPs: []net.IP{{84, 17, 47, 3}, {84, 17, 47, 20}, {84, 17, 47, 39}, {84, 17, 47, 42}, {84, 17, 47, 74}, {84, 17, 47, 111}, {139, 28, 217, 199}, {185, 132, 177, 136}, {190, 2, 149, 196}, {195, 181, 172, 69}}}, + {Region: "Netherlands", Group: "Premium UDP Europe", IPs: []net.IP{{84, 17, 47, 4}, {84, 17, 47, 8}, {84, 17, 47, 12}, {84, 17, 47, 38}, {84, 17, 47, 68}, {185, 132, 177, 235}, {190, 2, 149, 28}, {190, 2, 149, 30}, {190, 2, 149, 208}, {195, 181, 172, 79}}}, + {Region: "New Zealand", Group: "Premium TCP Asia", IPs: []net.IP{{103, 231, 91, 131}, {103, 231, 91, 132}, {103, 231, 91, 133}, {103, 231, 91, 134}, {103, 231, 91, 135}, {103, 231, 91, 136}, {103, 231, 91, 137}, {103, 231, 91, 138}, {103, 231, 91, 139}, {103, 231, 91, 140}}}, + {Region: "New Zealand", Group: "Premium UDP Asia", IPs: []net.IP{{103, 231, 91, 131}, {103, 231, 91, 132}, {103, 231, 91, 133}, {103, 231, 91, 134}, {103, 231, 91, 135}, {103, 231, 91, 136}, {103, 231, 91, 137}, {103, 231, 91, 138}, {103, 231, 91, 139}, {103, 231, 91, 140}}}, + {Region: "Nigeria", Group: "Premium TCP Europe", IPs: []net.IP{{45, 137, 196, 6}, {45, 137, 196, 10}, {45, 137, 196, 12}, {45, 137, 196, 13}, {45, 137, 196, 15}, {45, 137, 196, 16}, {45, 137, 196, 17}, {45, 137, 196, 20}, {45, 137, 196, 24}, {45, 137, 196, 29}}}, + {Region: "Nigeria", Group: "Premium UDP Europe", IPs: []net.IP{{45, 137, 196, 6}, {45, 137, 196, 7}, {45, 137, 196, 8}, {45, 137, 196, 9}, {45, 137, 196, 12}, {45, 137, 196, 13}, {45, 137, 196, 14}, {45, 137, 196, 20}, {45, 137, 196, 28}, {45, 137, 196, 29}}}, + {Region: "Norway", Group: "Premium TCP Europe", IPs: []net.IP{{45, 12, 223, 131}, {45, 12, 223, 135}, {45, 12, 223, 136}, {45, 12, 223, 138}, {185, 206, 225, 231}, {185, 206, 225, 233}, {185, 253, 97, 235}, {185, 253, 97, 236}, {185, 253, 97, 247}, {185, 253, 97, 253}}}, + {Region: "Norway", Group: "Premium UDP Europe", IPs: []net.IP{{45, 12, 223, 132}, {45, 12, 223, 137}, {45, 12, 223, 138}, {45, 12, 223, 141}, {185, 206, 225, 27}, {185, 206, 225, 30}, {185, 253, 97, 245}, {185, 253, 97, 246}, {185, 253, 97, 248}, {185, 253, 97, 249}}}, + {Region: "Pakistan", Group: "Premium TCP Europe", IPs: []net.IP{{103, 76, 3, 244}, {103, 76, 3, 245}, {103, 76, 3, 246}, {103, 76, 3, 247}, {103, 76, 3, 248}, {103, 76, 3, 249}, {103, 76, 3, 250}, {103, 76, 3, 251}, {103, 76, 3, 252}, {103, 76, 3, 253}}}, + {Region: "Pakistan", Group: "Premium UDP Europe", IPs: []net.IP{{103, 76, 3, 244}, {103, 76, 3, 245}, {103, 76, 3, 246}, {103, 76, 3, 247}, {103, 76, 3, 248}, {103, 76, 3, 249}, {103, 76, 3, 250}, {103, 76, 3, 251}, {103, 76, 3, 252}, {103, 76, 3, 253}}}, + {Region: "Panama", Group: "Premium TCP Europe", IPs: []net.IP{{45, 131, 210, 9}, {45, 131, 210, 10}, {45, 131, 210, 14}, {45, 131, 210, 15}, {45, 131, 210, 16}, {45, 131, 210, 21}, {45, 131, 210, 22}, {45, 131, 210, 23}, {45, 131, 210, 24}, {45, 131, 210, 26}}}, + {Region: "Panama", Group: "Premium UDP Europe", IPs: []net.IP{{45, 131, 210, 6}, {45, 131, 210, 8}, {45, 131, 210, 9}, {45, 131, 210, 12}, {45, 131, 210, 14}, {45, 131, 210, 18}, {45, 131, 210, 19}, {45, 131, 210, 25}, {45, 131, 210, 28}, {45, 131, 210, 29}}}, + {Region: "Philippines", Group: "Premium TCP Asia", IPs: []net.IP{{188, 214, 125, 39}, {188, 214, 125, 45}, {188, 214, 125, 47}, {188, 214, 125, 49}, {188, 214, 125, 50}, {188, 214, 125, 51}, {188, 214, 125, 53}, {188, 214, 125, 57}, {188, 214, 125, 58}, {188, 214, 125, 61}}}, + {Region: "Philippines", Group: "Premium UDP Asia", IPs: []net.IP{{188, 214, 125, 35}, {188, 214, 125, 36}, {188, 214, 125, 37}, {188, 214, 125, 48}, {188, 214, 125, 55}, {188, 214, 125, 56}, {188, 214, 125, 57}, {188, 214, 125, 58}, {188, 214, 125, 59}, {188, 214, 125, 62}}}, + {Region: "Poland", Group: "Premium TCP Europe", IPs: []net.IP{{37, 120, 156, 11}, {37, 120, 156, 17}, {37, 120, 156, 23}, {37, 120, 156, 25}, {37, 120, 156, 26}, {51, 75, 56, 35}, {51, 75, 56, 37}, {51, 75, 56, 41}, {54, 37, 238, 36}, {54, 37, 238, 43}}}, + {Region: "Poland", Group: "Premium UDP Europe", IPs: []net.IP{{37, 120, 156, 8}, {37, 120, 156, 10}, {37, 120, 156, 12}, {37, 120, 156, 18}, {37, 120, 156, 19}, {37, 120, 156, 24}, {51, 75, 56, 33}, {51, 75, 56, 40}, {51, 75, 56, 41}, {54, 37, 238, 33}}}, + {Region: "Portugal", Group: "Premium TCP Europe", IPs: []net.IP{{89, 26, 243, 47}, {89, 26, 243, 48}, {89, 26, 243, 50}, {89, 26, 243, 51}, {89, 26, 243, 54}, {89, 26, 243, 58}, {89, 26, 243, 60}, {185, 90, 57, 172}, {185, 90, 57, 176}, {185, 90, 57, 179}}}, + {Region: "Portugal", Group: "Premium UDP Europe", IPs: []net.IP{{89, 26, 243, 47}, {89, 26, 243, 50}, {89, 26, 243, 51}, {89, 26, 243, 53}, {89, 26, 243, 58}, {185, 90, 57, 173}, {185, 90, 57, 175}, {185, 90, 57, 176}, {185, 90, 57, 178}, {185, 90, 57, 179}}}, + {Region: "Qatar", Group: "Premium TCP Europe", IPs: []net.IP{{45, 131, 7, 6}, {45, 131, 7, 9}, {45, 131, 7, 10}, {45, 131, 7, 13}, {45, 131, 7, 16}, {45, 131, 7, 17}, {45, 131, 7, 20}, {45, 131, 7, 22}, {45, 131, 7, 23}, {45, 131, 7, 28}}}, + {Region: "Qatar", Group: "Premium UDP Europe", IPs: []net.IP{{45, 131, 7, 8}, {45, 131, 7, 9}, {45, 131, 7, 14}, {45, 131, 7, 15}, {45, 131, 7, 16}, {45, 131, 7, 17}, {45, 131, 7, 23}, {45, 131, 7, 27}, {45, 131, 7, 28}, {45, 131, 7, 29}}}, + {Region: "Romania", Group: "NoSpy TCP Europe", IPs: []net.IP{{85, 9, 20, 134}, {85, 9, 20, 135}, {85, 9, 20, 137}, {85, 9, 20, 138}, {85, 9, 20, 139}, {85, 9, 20, 147}, {85, 9, 20, 149}, {85, 9, 20, 154}, {85, 9, 20, 248}, {85, 9, 20, 249}}}, + {Region: "Romania", Group: "NoSpy UDP Europe", IPs: []net.IP{{85, 9, 20, 134}, {85, 9, 20, 138}, {85, 9, 20, 139}, {85, 9, 20, 144}, {85, 9, 20, 145}, {85, 9, 20, 147}, {85, 9, 20, 148}, {85, 9, 20, 151}, {85, 9, 20, 248}, {85, 9, 20, 249}}}, + {Region: "Romania", Group: "Premium TCP Europe", IPs: []net.IP{{193, 176, 84, 44}, {193, 176, 84, 49}, {193, 176, 84, 51}, {193, 176, 84, 52}, {193, 176, 84, 88}, {193, 176, 84, 121}, {193, 176, 84, 126}, {193, 176, 85, 72}, {193, 176, 85, 74}, {193, 176, 85, 101}}}, + {Region: "Romania", Group: "Premium UDP Europe", IPs: []net.IP{{193, 176, 84, 46}, {193, 176, 84, 47}, {193, 176, 84, 48}, {193, 176, 84, 49}, {193, 176, 84, 90}, {193, 176, 84, 125}, {193, 176, 85, 68}, {193, 176, 85, 72}, {193, 176, 85, 78}, {193, 176, 85, 91}}}, + {Region: "Russian Federation", Group: "Premium TCP Europe", IPs: []net.IP{{45, 132, 192, 42}, {45, 132, 192, 43}, {45, 132, 192, 49}, {45, 132, 192, 60}, {45, 132, 192, 63}, {45, 132, 192, 66}, {45, 132, 192, 78}, {45, 132, 192, 80}, {45, 132, 192, 85}, {45, 132, 192, 96}}}, + {Region: "Russian Federation", Group: "Premium UDP Europe", IPs: []net.IP{{45, 132, 192, 11}, {45, 132, 192, 15}, {45, 132, 192, 24}, {45, 132, 192, 32}, {45, 132, 192, 43}, {45, 132, 192, 49}, {45, 132, 192, 55}, {45, 132, 192, 63}, {45, 132, 192, 65}, {45, 132, 192, 95}}}, + {Region: "Saudi Arabia", Group: "Premium TCP Europe", IPs: []net.IP{{45, 131, 6, 7}, {45, 131, 6, 10}, {45, 131, 6, 12}, {45, 131, 6, 13}, {45, 131, 6, 21}, {45, 131, 6, 23}, {45, 131, 6, 24}, {45, 131, 6, 25}, {45, 131, 6, 26}, {45, 131, 6, 28}}}, + {Region: "Saudi Arabia", Group: "Premium UDP Europe", IPs: []net.IP{{45, 131, 6, 7}, {45, 131, 6, 9}, {45, 131, 6, 14}, {45, 131, 6, 15}, {45, 131, 6, 18}, {45, 131, 6, 19}, {45, 131, 6, 22}, {45, 131, 6, 24}, {45, 131, 6, 28}, {45, 131, 6, 29}}}, + {Region: "Serbia", Group: "Premium TCP Europe", IPs: []net.IP{{37, 120, 193, 179}, {37, 120, 193, 181}, {37, 120, 193, 182}, {37, 120, 193, 183}, {37, 120, 193, 184}, {37, 120, 193, 186}, {37, 120, 193, 190}, {141, 98, 103, 37}, {141, 98, 103, 43}, {141, 98, 103, 46}}}, + {Region: "Serbia", Group: "Premium UDP Europe", IPs: []net.IP{{37, 120, 193, 179}, {37, 120, 193, 182}, {37, 120, 193, 183}, {37, 120, 193, 188}, {37, 120, 193, 189}, {37, 120, 193, 190}, {141, 98, 103, 35}, {141, 98, 103, 40}, {141, 98, 103, 42}, {141, 98, 103, 46}}}, + {Region: "Singapore", Group: "Premium TCP Asia", IPs: []net.IP{{37, 120, 151, 55}, {37, 120, 151, 60}, {37, 120, 151, 131}, {37, 120, 151, 139}, {84, 17, 39, 168}, {84, 17, 39, 175}, {84, 17, 39, 176}, {84, 17, 39, 179}, {84, 17, 39, 182}, {84, 17, 39, 185}}}, + {Region: "Singapore", Group: "Premium UDP Asia", IPs: []net.IP{{37, 120, 151, 51}, {37, 120, 151, 57}, {37, 120, 151, 131}, {37, 120, 151, 132}, {37, 120, 151, 140}, {37, 120, 151, 141}, {84, 17, 39, 165}, {84, 17, 39, 169}, {84, 17, 39, 171}, {84, 17, 39, 180}}}, + {Region: "Slovakia", Group: "Premium TCP Europe", IPs: []net.IP{{185, 245, 85, 227}, {185, 245, 85, 228}, {185, 245, 85, 229}, {185, 245, 85, 230}, {185, 245, 85, 231}, {185, 245, 85, 232}, {185, 245, 85, 233}, {185, 245, 85, 234}, {185, 245, 85, 235}, {185, 245, 85, 236}}}, + {Region: "Slovakia", Group: "Premium UDP Europe", IPs: []net.IP{{185, 245, 85, 227}, {185, 245, 85, 228}, {185, 245, 85, 229}, {185, 245, 85, 230}, {185, 245, 85, 231}, {185, 245, 85, 232}, {185, 245, 85, 233}, {185, 245, 85, 234}, {185, 245, 85, 235}, {185, 245, 85, 236}}}, + {Region: "Slovenia", Group: "Premium TCP Europe", IPs: []net.IP{{146, 247, 25, 79}, {146, 247, 25, 80}, {146, 247, 25, 81}, {146, 247, 25, 83}, {146, 247, 25, 84}, {146, 247, 25, 85}, {146, 247, 25, 86}, {146, 247, 25, 87}, {146, 247, 25, 88}, {146, 247, 25, 90}}}, + {Region: "Slovenia", Group: "Premium UDP Europe", IPs: []net.IP{{146, 247, 25, 80}, {146, 247, 25, 81}, {146, 247, 25, 82}, {146, 247, 25, 83}, {146, 247, 25, 84}, {146, 247, 25, 85}, {146, 247, 25, 86}, {146, 247, 25, 87}, {146, 247, 25, 88}, {146, 247, 25, 89}}}, + {Region: "South Africa", Group: "Premium TCP Asia", IPs: []net.IP{{165, 73, 248, 211}, {165, 73, 248, 214}, {165, 73, 248, 222}, {165, 73, 248, 227}, {165, 73, 248, 229}, {165, 73, 248, 230}, {165, 73, 248, 231}, {165, 73, 248, 234}, {165, 73, 248, 236}, {165, 73, 248, 237}}}, + {Region: "South Africa", Group: "Premium TCP Europe", IPs: []net.IP{{197, 85, 7, 26}, {197, 85, 7, 27}, {197, 85, 7, 28}, {197, 85, 7, 29}, {197, 85, 7, 30}, {197, 85, 7, 31}, {197, 85, 7, 131}, {197, 85, 7, 132}, {197, 85, 7, 133}, {197, 85, 7, 134}}}, + {Region: "South Africa", Group: "Premium UDP Asia", IPs: []net.IP{{165, 73, 248, 212}, {165, 73, 248, 215}, {165, 73, 248, 217}, {165, 73, 248, 218}, {165, 73, 248, 219}, {165, 73, 248, 222}, {165, 73, 248, 227}, {165, 73, 248, 230}, {165, 73, 248, 234}, {165, 73, 248, 237}}}, + {Region: "South Africa", Group: "Premium UDP Europe", IPs: []net.IP{{197, 85, 7, 26}, {197, 85, 7, 27}, {197, 85, 7, 28}, {197, 85, 7, 29}, {197, 85, 7, 30}, {197, 85, 7, 31}, {197, 85, 7, 131}, {197, 85, 7, 132}, {197, 85, 7, 133}, {197, 85, 7, 134}}}, + {Region: "Spain", Group: "Premium TCP Europe", IPs: []net.IP{{37, 120, 142, 163}, {37, 120, 142, 166}, {37, 120, 142, 167}, {84, 17, 62, 138}, {84, 17, 62, 141}, {84, 17, 62, 145}, {84, 17, 62, 147}, {84, 17, 62, 152}, {185, 93, 3, 113}, {185, 93, 182, 139}}}, + {Region: "Spain", Group: "Premium UDP Europe", IPs: []net.IP{{37, 120, 142, 150}, {37, 120, 142, 157}, {37, 120, 142, 165}, {84, 17, 62, 139}, {84, 17, 62, 142}, {185, 93, 3, 109}, {185, 93, 3, 111}, {185, 93, 3, 113}, {185, 93, 182, 136}, {185, 93, 182, 138}}}, + {Region: "Sri Lanka", Group: "Premium TCP Europe", IPs: []net.IP{{45, 132, 136, 6}, {45, 132, 136, 7}, {45, 132, 136, 8}, {45, 132, 136, 12}, {45, 132, 136, 13}, {45, 132, 136, 17}, {45, 132, 136, 21}, {45, 132, 136, 22}, {45, 132, 136, 26}, {45, 132, 136, 27}}}, + {Region: "Sri Lanka", Group: "Premium UDP Europe", IPs: []net.IP{{45, 132, 136, 7}, {45, 132, 136, 9}, {45, 132, 136, 10}, {45, 132, 136, 11}, {45, 132, 136, 12}, {45, 132, 136, 15}, {45, 132, 136, 20}, {45, 132, 136, 21}, {45, 132, 136, 27}, {45, 132, 136, 29}}}, + {Region: "Sweden", Group: "Premium TCP Europe", IPs: []net.IP{{46, 246, 65, 151}, {46, 246, 65, 156}, {46, 246, 65, 157}, {46, 246, 65, 167}, {46, 246, 65, 203}, {46, 246, 65, 221}, {91, 132, 138, 51}, {188, 126, 64, 101}, {188, 126, 66, 3}, {188, 126, 66, 8}}}, + {Region: "Sweden", Group: "Premium UDP Europe", IPs: []net.IP{{46, 246, 65, 167}, {46, 246, 65, 170}, {46, 246, 65, 172}, {46, 246, 65, 181}, {46, 246, 65, 214}, {46, 246, 65, 215}, {91, 132, 138, 57}, {188, 126, 66, 8}, {188, 126, 66, 24}, {188, 126, 66, 29}}}, + {Region: "Switzerland", Group: "Premium TCP Europe", IPs: []net.IP{{84, 17, 52, 14}, {84, 17, 52, 39}, {84, 17, 52, 68}, {84, 17, 52, 73}, {84, 17, 52, 84}, {89, 187, 165, 131}, {185, 32, 222, 8}, {185, 32, 222, 105}, {195, 225, 118, 38}, {195, 225, 118, 56}}}, + {Region: "Switzerland", Group: "Premium UDP Europe", IPs: []net.IP{{84, 17, 52, 15}, {84, 17, 52, 20}, {84, 17, 52, 36}, {84, 17, 52, 52}, {84, 17, 52, 62}, {84, 17, 52, 75}, {91, 132, 136, 174}, {91, 132, 136, 205}, {91, 132, 136, 206}, {185, 32, 222, 113}}}, + {Region: "Taiwan", Group: "Premium TCP Asia", IPs: []net.IP{{45, 133, 181, 102}, {45, 133, 181, 105}, {45, 133, 181, 106}, {45, 133, 181, 108}, {45, 133, 181, 110}, {45, 133, 181, 112}, {45, 133, 181, 114}, {45, 133, 181, 117}, {45, 133, 181, 120}, {45, 133, 181, 124}}}, + {Region: "Taiwan", Group: "Premium UDP Asia", IPs: []net.IP{{45, 133, 181, 102}, {45, 133, 181, 103}, {45, 133, 181, 110}, {45, 133, 181, 111}, {45, 133, 181, 112}, {45, 133, 181, 114}, {45, 133, 181, 118}, {45, 133, 181, 120}, {45, 133, 181, 125}, {45, 133, 181, 126}}}, + {Region: "Thailand", Group: "Premium TCP Asia", IPs: []net.IP{{119, 59, 98, 238}, {119, 59, 98, 239}, {119, 59, 98, 243}, {119, 59, 98, 244}, {119, 59, 98, 248}, {119, 59, 98, 249}, {119, 59, 121, 165}, {119, 59, 121, 166}, {119, 59, 121, 171}, {119, 59, 121, 173}}}, + {Region: "Thailand", Group: "Premium UDP Asia", IPs: []net.IP{{119, 59, 98, 214}, {119, 59, 98, 238}, {119, 59, 98, 244}, {119, 59, 98, 247}, {119, 59, 121, 163}, {119, 59, 121, 165}, {119, 59, 121, 166}, {119, 59, 121, 167}, {119, 59, 121, 173}, {119, 59, 121, 175}}}, + {Region: "Turkey", Group: "Premium TCP Europe", IPs: []net.IP{{188, 213, 34, 9}, {188, 213, 34, 22}, {188, 213, 34, 24}, {188, 213, 34, 27}, {188, 213, 34, 28}, {188, 213, 34, 35}, {188, 213, 34, 41}, {188, 213, 34, 44}, {188, 213, 34, 45}, {188, 213, 34, 46}}}, + {Region: "Turkey", Group: "Premium UDP Europe", IPs: []net.IP{{188, 213, 34, 3}, {188, 213, 34, 13}, {188, 213, 34, 18}, {188, 213, 34, 25}, {188, 213, 34, 27}, {188, 213, 34, 30}, {188, 213, 34, 35}, {188, 213, 34, 37}, {188, 213, 34, 38}, {188, 213, 34, 44}}}, + {Region: "Ukraine", Group: "Premium TCP Europe", IPs: []net.IP{{31, 28, 161, 21}, {31, 28, 163, 34}, {31, 28, 163, 35}, {31, 28, 163, 38}, {31, 28, 163, 50}, {62, 149, 7, 164}, {62, 149, 7, 167}, {62, 149, 29, 50}, {62, 149, 29, 53}, {62, 149, 29, 56}}}, + {Region: "Ukraine", Group: "Premium UDP Europe", IPs: []net.IP{{31, 28, 161, 20}, {31, 28, 161, 28}, {31, 28, 161, 30}, {31, 28, 163, 37}, {31, 28, 163, 45}, {31, 28, 163, 53}, {31, 28, 163, 56}, {31, 28, 163, 59}, {62, 149, 7, 168}, {62, 149, 29, 56}}}, + {Region: "United Arab Emirates", Group: "Premium TCP Europe", IPs: []net.IP{{45, 131, 5, 6}, {45, 131, 5, 9}, {45, 131, 5, 12}, {45, 131, 5, 14}, {45, 131, 5, 16}, {45, 131, 5, 17}, {45, 131, 5, 18}, {45, 131, 5, 27}, {45, 131, 5, 28}, {45, 131, 5, 29}}}, + {Region: "United Arab Emirates", Group: "Premium UDP Europe", IPs: []net.IP{{45, 131, 5, 8}, {45, 131, 5, 14}, {45, 131, 5, 15}, {45, 131, 5, 20}, {45, 131, 5, 22}, {45, 131, 5, 23}, {45, 131, 5, 24}, {45, 131, 5, 26}, {45, 131, 5, 28}, {45, 131, 5, 29}}}, + {Region: "United Kingdom", Group: "Premium TCP Europe", IPs: []net.IP{{37, 120, 133, 134}, {37, 120, 133, 140}, {84, 17, 51, 32}, {84, 17, 51, 75}, {89, 238, 138, 243}, {89, 238, 183, 230}, {95, 154, 200, 144}, {95, 154, 200, 186}, {141, 98, 100, 56}, {141, 98, 100, 61}}}, + {Region: "United Kingdom", Group: "Premium UDP Europe", IPs: []net.IP{{37, 120, 133, 134}, {37, 120, 159, 35}, {81, 92, 206, 172}, {84, 17, 51, 34}, {84, 17, 51, 110}, {84, 17, 51, 115}, {89, 238, 135, 59}, {95, 154, 200, 147}, {95, 154, 200, 149}, {141, 98, 100, 58}}}, + {Region: "United States", Group: "Premium TCP USA", IPs: []net.IP{{23, 105, 160, 184}, {38, 131, 126, 150}, {84, 17, 35, 32}, {89, 187, 182, 7}, {89, 187, 182, 31}, {176, 113, 72, 153}, {176, 113, 72, 167}, {192, 96, 203, 150}, {199, 115, 119, 238}, {212, 102, 41, 4}}}, + {Region: "United States", Group: "Premium UDP USA", IPs: []net.IP{{23, 19, 68, 56}, {23, 82, 78, 29}, {23, 105, 191, 36}, {23, 105, 191, 51}, {84, 17, 35, 8}, {89, 187, 171, 138}, {108, 62, 96, 33}, {176, 113, 72, 151}, {192, 96, 203, 154}, {199, 115, 117, 70}}}, + {Region: "Venezuela", Group: "Premium TCP Europe", IPs: []net.IP{{45, 133, 89, 6}, {45, 133, 89, 9}, {45, 133, 89, 11}, {45, 133, 89, 15}, {45, 133, 89, 17}, {45, 133, 89, 18}, {45, 133, 89, 22}, {45, 133, 89, 24}, {45, 133, 89, 26}, {45, 133, 89, 29}}}, + {Region: "Venezuela", Group: "Premium UDP Europe", IPs: []net.IP{{45, 133, 89, 8}, {45, 133, 89, 9}, {45, 133, 89, 15}, {45, 133, 89, 17}, {45, 133, 89, 21}, {45, 133, 89, 22}, {45, 133, 89, 25}, {45, 133, 89, 26}, {45, 133, 89, 27}, {45, 133, 89, 29}}}, + {Region: "Vietnam", Group: "Premium TCP Asia", IPs: []net.IP{{45, 117, 79, 118}, {45, 117, 79, 123}, {45, 117, 79, 124}, {45, 117, 79, 125}, {103, 238, 214, 131}, {103, 238, 214, 134}, {103, 238, 214, 135}, {103, 238, 214, 136}, {103, 238, 214, 137}, {103, 238, 214, 140}}}, + {Region: "Vietnam", Group: "Premium UDP Asia", IPs: []net.IP{{45, 117, 79, 114}, {45, 117, 79, 116}, {45, 117, 79, 117}, {45, 117, 79, 118}, {45, 117, 79, 123}, {103, 238, 214, 134}, {103, 238, 214, 135}, {103, 238, 214, 136}, {103, 238, 214, 137}, {103, 238, 214, 140}}}, } } diff --git a/internal/constants/mullvad.go b/internal/constants/mullvad.go index 2430aa61..9dc0338f 100644 --- a/internal/constants/mullvad.go +++ b/internal/constants/mullvad.go @@ -2,6 +2,7 @@ package constants import ( "net" + "sort" "github.com/qdm12/private-internet-access-docker/internal/models" ) @@ -13,37 +14,46 @@ const ( func MullvadCountryChoices() (choices []string) { uniqueChoices := map[string]struct{}{} for _, server := range mullvadServers() { - uniqueChoices[string(server.Country)] = struct{}{} + uniqueChoices[server.Country] = struct{}{} } for choice := range uniqueChoices { choices = append(choices, choice) } + sort.Slice(choices, func(i, j int) bool { + return choices[i] < choices[j] + }) return choices } func MullvadCityChoices() (choices []string) { uniqueChoices := map[string]struct{}{} for _, server := range mullvadServers() { - uniqueChoices[string(server.City)] = struct{}{} + uniqueChoices[server.City] = struct{}{} } for choice := range uniqueChoices { choices = append(choices, choice) } + sort.Slice(choices, func(i, j int) bool { + return choices[i] < choices[j] + }) return choices } -func MullvadProviderChoices() (choices []string) { +func MullvadISPChoices() (choices []string) { uniqueChoices := map[string]struct{}{} for _, server := range mullvadServers() { - uniqueChoices[string(server.Provider)] = struct{}{} + uniqueChoices[server.ISP] = struct{}{} } for choice := range uniqueChoices { choices = append(choices, choice) } + sort.Slice(choices, func(i, j int) bool { + return choices[i] < choices[j] + }) return choices } -func MullvadServerFilter(country models.MullvadCountry, city models.MullvadCity, provider models.MullvadProvider) (servers []models.MullvadServer) { +func MullvadServerFilter(country, city, isp string) (servers []models.MullvadServer) { for _, server := range mullvadServers() { if len(country) == 0 { server.Country = "" @@ -51,10 +61,10 @@ func MullvadServerFilter(country models.MullvadCountry, city models.MullvadCity, if len(city) == 0 { server.City = "" } - if len(provider) == 0 { - server.Provider = "" + if len(isp) == 0 { + server.ISP = "" } - if server.Country == country && server.City == city && server.Provider == provider { + if server.Country == country && server.City == city && server.ISP == isp { servers = append(servers, server) } } @@ -64,602 +74,602 @@ func MullvadServerFilter(country models.MullvadCountry, city models.MullvadCity, func mullvadServers() []models.MullvadServer { return []models.MullvadServer{ { - Country: models.MullvadCountry("united arab emirates"), - City: models.MullvadCity("dubai"), - Provider: models.MullvadProvider("m247"), + Country: "united arab emirates", + City: "dubai", + ISP: "m247", IPs: []net.IP{{45, 9, 249, 34}}, DefaultPort: 1194, }, { - Country: models.MullvadCountry("albania"), - City: models.MullvadCity("tirana"), - Provider: models.MullvadProvider("iregister"), + Country: "albania", + City: "tirana", + ISP: "iregister", IPs: []net.IP{{31, 171, 154, 210}}, DefaultPort: 1197, }, { - Country: models.MullvadCountry("austria"), - City: models.MullvadCity("wien"), - Provider: models.MullvadProvider("m247"), + Country: "austria", + City: "wien", + ISP: "m247", IPs: []net.IP{{37, 120, 155, 250}, {217, 64, 127, 138}, {217, 64, 127, 202}}, DefaultPort: 1196, }, { - Country: models.MullvadCountry("australia"), - City: models.MullvadCity("adelaide"), - Provider: models.MullvadProvider("intergrid"), + Country: "australia", + City: "adelaide", + ISP: "intergrid", IPs: []net.IP{{116, 206, 231, 58}}, DefaultPort: 1300, }, { - Country: models.MullvadCountry("australia"), - City: models.MullvadCity("brisbane"), - Provider: models.MullvadProvider("intergrid"), + Country: "australia", + City: "brisbane", + ISP: "intergrid", IPs: []net.IP{{43, 245, 160, 162}}, DefaultPort: 1300, }, { - Country: models.MullvadCountry("australia"), - City: models.MullvadCity("canberra"), - Provider: models.MullvadProvider("intergrid"), + Country: "australia", + City: "canberra", + ISP: "intergrid", IPs: []net.IP{{116, 206, 229, 98}}, DefaultPort: 1300, }, { - Country: models.MullvadCountry("australia"), - City: models.MullvadCity("melbourne"), - Provider: models.MullvadProvider("intergrid"), + Country: "australia", + City: "melbourne", + ISP: "intergrid", IPs: []net.IP{{116, 206, 228, 202}, {116, 206, 228, 242}, {116, 206, 230, 98}}, DefaultPort: 1300, }, { - Country: models.MullvadCountry("australia"), - City: models.MullvadCity("perth"), - Provider: models.MullvadProvider("intergrid"), + Country: "australia", + City: "perth", + ISP: "intergrid", IPs: []net.IP{{103, 77, 235, 66}}, DefaultPort: 1300, }, { - Country: models.MullvadCountry("australia"), - City: models.MullvadCity("sydney"), - Provider: models.MullvadProvider("intergrid"), + Country: "australia", + City: "sydney", + ISP: "intergrid", IPs: []net.IP{{43, 245, 162, 130}, {103, 77, 232, 130}, {103, 77, 232, 146}}, DefaultPort: 1300, }, { - Country: models.MullvadCountry("australia"), - City: models.MullvadCity("sydney"), - Provider: models.MullvadProvider("m247"), + Country: "australia", + City: "sydney", + ISP: "m247", IPs: []net.IP{{217, 138, 204, 82}, {217, 138, 204, 98}, {217, 138, 204, 66}}, DefaultPort: 1300, }, { - Country: models.MullvadCountry("belgium"), - City: models.MullvadCity("brussels"), - Provider: models.MullvadProvider("m247"), + Country: "belgium", + City: "brussels", + ISP: "m247", IPs: []net.IP{{37, 120, 218, 146}, {37, 120, 218, 138}, {91, 207, 57, 50}, {37, 120, 143, 138}, {185, 104, 186, 202}}, DefaultPort: 1300, }, { - Country: models.MullvadCountry("bulgaria"), - City: models.MullvadCity("sofia"), - Provider: models.MullvadProvider("m247"), + Country: "bulgaria", + City: "sofia", + ISP: "m247", IPs: []net.IP{{185, 94, 192, 42}, {185, 94, 192, 66}}, DefaultPort: 1300, }, { - Country: models.MullvadCountry("brazil"), - City: models.MullvadCity("sao paulo"), - Provider: models.MullvadProvider("qnax"), + Country: "brazil", + City: "sao paulo", + ISP: "qnax", IPs: []net.IP{{191, 101, 62, 178}}, DefaultPort: 1301, }, { - Country: models.MullvadCountry("brazil"), - City: models.MullvadCity("sao paulo"), - Provider: models.MullvadProvider("heficed"), + Country: "brazil", + City: "sao paulo", + ISP: "heficed", IPs: []net.IP{{177, 67, 80, 186}}, DefaultPort: 1300, }, { - Country: models.MullvadCountry("canada"), - City: models.MullvadCity("montreal"), - Provider: models.MullvadProvider("m247"), + Country: "canada", + City: "montreal", + ISP: "m247", IPs: []net.IP{{139, 28, 218, 114}, {217, 138, 200, 194}, {217, 138, 200, 186}, {87, 101, 92, 146}, {176, 113, 74, 178}, {37, 120, 205, 114}, {87, 101, 92, 138}, {37, 120, 205, 122}, {217, 138, 200, 210}, {217, 138, 200, 202}}, DefaultPort: 1300, }, { - Country: models.MullvadCountry("canada"), - City: models.MullvadCity("toronto"), - Provider: models.MullvadProvider("amanah"), + Country: "canada", + City: "toronto", + ISP: "amanah", IPs: []net.IP{{184, 75, 214, 130}, {162, 219, 176, 250}}, DefaultPort: 1300, }, { - Country: models.MullvadCountry("canada"), - City: models.MullvadCity("vancouver"), - Provider: models.MullvadProvider("100tb"), + Country: "canada", + City: "vancouver", + ISP: "100tb", IPs: []net.IP{{172, 83, 40, 34}, {172, 83, 40, 38}}, DefaultPort: 1300, }, { - Country: models.MullvadCountry("canada"), - City: models.MullvadCity("vancouver"), - Provider: models.MullvadProvider("esecuredata"), + Country: "canada", + City: "vancouver", + ISP: "esecuredata", IPs: []net.IP{{71, 19, 249, 81}, {176, 113, 74, 186}, {71, 19, 248, 240}}, DefaultPort: 1300, }, { - Country: models.MullvadCountry("switzerland"), - City: models.MullvadCity("zurich"), - Provider: models.MullvadProvider("31173"), + Country: "switzerland", + City: "zurich", + ISP: "31173", IPs: []net.IP{{193, 32, 127, 82}, {193, 32, 127, 81}, {193, 32, 127, 83}, {193, 32, 127, 84}}, Owned: true, DefaultPort: 1301, }, { - Country: models.MullvadCountry("zwitzerland"), - City: models.MullvadCity("zurich"), - Provider: models.MullvadProvider("m247"), + Country: "zwitzerland", + City: "zurich", + ISP: "m247", IPs: []net.IP{{185, 212, 170, 50}, {185, 183, 104, 82}, {185, 9, 18, 98}, {82, 102, 24, 130}, {82, 102, 24, 186}, {185, 212, 170, 162}, {185, 9, 18, 114}}, DefaultPort: 1301, }, { - Country: models.MullvadCountry("switzerland"), - City: models.MullvadCity("zurich"), - Provider: models.MullvadProvider("privateLayer"), + Country: "switzerland", + City: "zurich", + ISP: "privateLayer", IPs: []net.IP{{179, 43, 128, 170}, {81, 17, 20, 34}}, DefaultPort: 1301, }, { - Country: models.MullvadCountry("czech republic"), - City: models.MullvadCity("prague"), - Provider: models.MullvadProvider("m247"), + Country: "czech republic", + City: "prague", + ISP: "m247", IPs: []net.IP{{217, 138, 199, 82}, {217, 138, 199, 74}}, DefaultPort: 1197, }, { - Country: models.MullvadCountry("germany"), - City: models.MullvadCity("frankfurt"), - Provider: models.MullvadProvider("31173"), + Country: "germany", + City: "frankfurt", + ISP: "31173", IPs: []net.IP{{185, 213, 155, 132}, {185, 213, 155, 140}, {185, 213, 155, 136}, {185, 213, 155, 133}, {185, 213, 155, 144}, {185, 213, 155, 143}, {185, 213, 155, 138}, {185, 213, 155, 142}, {185, 213, 155, 139}, {185, 213, 155, 135}, {185, 213, 155, 145}, {185, 213, 155, 137}, {185, 213, 155, 131}, {185, 213, 155, 134}, {185, 213, 155, 141}}, Owned: true, DefaultPort: 1197, }, { - Country: models.MullvadCountry("germany"), - City: models.MullvadCity("frankfurt"), - Provider: models.MullvadProvider("m247"), + Country: "germany", + City: "frankfurt", + ISP: "m247", IPs: []net.IP{{82, 102, 16, 90}, {185, 104, 184, 186}, {77, 243, 183, 202}}, DefaultPort: 1197, }, { - Country: models.MullvadCountry("denmark"), - City: models.MullvadCity("copenhagen"), - Provider: models.MullvadProvider("31173"), + Country: "denmark", + City: "copenhagen", + ISP: "31173", IPs: []net.IP{{141, 98, 254, 71}, {141, 98, 254, 72}}, Owned: true, DefaultPort: 1195, }, { - Country: models.MullvadCountry("denmark"), - City: models.MullvadCity("copenhagen"), - Provider: models.MullvadProvider("m247"), + Country: "denmark", + City: "copenhagen", + ISP: "m247", IPs: []net.IP{{185, 206, 224, 114}, {185, 206, 224, 119}}, DefaultPort: 1195, }, { - Country: models.MullvadCountry("denmark"), - City: models.MullvadCity("copenhagen"), - Provider: models.MullvadProvider("blix"), + Country: "denmark", + City: "copenhagen", + ISP: "blix", IPs: []net.IP{{134, 90, 149, 138}}, DefaultPort: 1195, }, { - Country: models.MullvadCountry("denmark"), - City: models.MullvadCity("copenhagen"), - Provider: models.MullvadProvider("asergo"), + Country: "denmark", + City: "copenhagen", + ISP: "asergo", IPs: []net.IP{{82, 103, 140, 213}}, DefaultPort: 1195, }, { - Country: models.MullvadCountry("spain"), - City: models.MullvadCity("madrid"), - Provider: models.MullvadProvider("m247"), + Country: "spain", + City: "madrid", + ISP: "m247", IPs: []net.IP{{195, 206, 107, 146}, {45, 152, 183, 42}, {89, 238, 178, 74}, {45, 152, 183, 26}, {89, 238, 178, 34}}, DefaultPort: 1195, }, { - Country: models.MullvadCountry("finland"), - City: models.MullvadCity("helsinki"), - Provider: models.MullvadProvider("creanova"), + Country: "finland", + City: "helsinki", + ISP: "creanova", IPs: []net.IP{{185, 204, 1, 174}, {185, 204, 1, 176}, {185, 212, 149, 201}, {185, 204, 1, 175}, {185, 204, 1, 173}, {185, 204, 1, 172}, {185, 204, 1, 171}}, Owned: true, DefaultPort: 1196, }, { - Country: models.MullvadCountry("france"), - City: models.MullvadCity("paris"), - Provider: models.MullvadProvider("31173"), + Country: "france", + City: "paris", + ISP: "31173", IPs: []net.IP{{193, 32, 126, 83}, {193, 32, 126, 82}, {193, 32, 126, 81}, {193, 32, 126, 84}}, Owned: true, DefaultPort: 1301, }, { - Country: models.MullvadCountry("france"), - City: models.MullvadCity("paris"), - Provider: models.MullvadProvider("m247"), + Country: "france", + City: "paris", + ISP: "m247", IPs: []net.IP{{185, 189, 113, 82}, {185, 156, 173, 218}, {185, 128, 25, 162}}, DefaultPort: 1301, }, { - Country: models.MullvadCountry("uk"), - City: models.MullvadCity("london"), - Provider: models.MullvadProvider("31173"), + Country: "uk", + City: "london", + ISP: "31173", IPs: []net.IP{{141, 98, 252, 133}, {141, 98, 252, 139}, {141, 98, 252, 137}, {141, 98, 252, 143}, {141, 98, 252, 142}, {141, 98, 252, 132}, {141, 98, 252, 134}, {141, 98, 252, 140}, {141, 98, 252, 141}, {141, 98, 252, 136}, {141, 98, 252, 144}, {141, 98, 252, 131}, {141, 98, 252, 135}, {141, 98, 252, 138}}, Owned: true, DefaultPort: 1196, }, { - Country: models.MullvadCountry("uk"), - City: models.MullvadCity("london"), - Provider: models.MullvadProvider("m247"), + Country: "uk", + City: "london", + ISP: "m247", IPs: []net.IP{{185, 200, 118, 105}, {185, 212, 168, 244}}, DefaultPort: 1196, }, { - Country: models.MullvadCountry("uk"), - City: models.MullvadCity("manchester"), - Provider: models.MullvadProvider("m247"), + Country: "uk", + City: "manchester", + ISP: "m247", IPs: []net.IP{{89, 238, 130, 66}, {81, 92, 205, 10}, {89, 238, 130, 74}, {81, 92, 205, 18}, {81, 92, 205, 26}, {89, 238, 183, 244}, {89, 238, 132, 36}, {217, 151, 98, 68}, {37, 120, 159, 164}, {89, 238, 183, 60}}, DefaultPort: 1196, }, { - Country: models.MullvadCountry("greece"), - City: models.MullvadCity("athens"), - Provider: models.MullvadProvider("aweb"), + Country: "greece", + City: "athens", + ISP: "aweb", IPs: []net.IP{{185, 226, 67, 168}}, DefaultPort: 1302, }, { - Country: models.MullvadCountry("hong kong"), - City: models.MullvadCity("hong kong"), - Provider: models.MullvadProvider("leaseweb"), + Country: "hong kong", + City: "hong kong", + ISP: "leaseweb", IPs: []net.IP{{209, 58, 185, 53}, {209, 58, 184, 146}}, DefaultPort: 1194, }, { - Country: models.MullvadCountry("hungary"), - City: models.MullvadCity("budapest"), - Provider: models.MullvadProvider("m247"), + Country: "hungary", + City: "budapest", + ISP: "m247", IPs: []net.IP{{185, 94, 190, 138}, {185, 189, 114, 10}}, DefaultPort: 1300, }, { - Country: models.MullvadCountry("ireland"), - City: models.MullvadCity("dublin"), - Provider: models.MullvadProvider("m247"), + Country: "ireland", + City: "dublin", + ISP: "m247", IPs: []net.IP{{217, 138, 222, 90}, {217, 138, 222, 82}}, DefaultPort: 1197, }, { - Country: models.MullvadCountry("israel"), - City: models.MullvadCity("tel aviv"), - Provider: models.MullvadProvider("hqserv"), + Country: "israel", + City: "tel aviv", + ISP: "hqserv", IPs: []net.IP{{185, 191, 207, 210}}, DefaultPort: 1301, }, { - Country: models.MullvadCountry("italy"), - City: models.MullvadCity("milan"), - Provider: models.MullvadProvider("m247"), + Country: "italy", + City: "milan", + ISP: "m247", IPs: []net.IP{{217, 138, 197, 106}, {217, 64, 113, 180}, {217, 138, 197, 98}, {217, 138, 197, 114}, {217, 64, 113, 183}}, DefaultPort: 1300, }, { - Country: models.MullvadCountry("japan"), - City: models.MullvadCity("tokyo"), - Provider: models.MullvadProvider("m247"), + Country: "japan", + City: "tokyo", + ISP: "m247", IPs: []net.IP{{37, 120, 210, 138}, {193, 148, 16, 218}, {37, 120, 210, 146}, {185, 242, 4, 50}, {37, 120, 210, 122}}, DefaultPort: 1300, }, { - Country: models.MullvadCountry("luxembourg"), - City: models.MullvadCity("luxembourg"), - Provider: models.MullvadProvider("evoluso"), + Country: "luxembourg", + City: "luxembourg", + ISP: "evoluso", IPs: []net.IP{{92, 223, 89, 160}, {92, 223, 89, 182}}, DefaultPort: 1301, }, { - Country: models.MullvadCountry("latvia"), - City: models.MullvadCity("riga"), - Provider: models.MullvadProvider("makonix"), + Country: "latvia", + City: "riga", + ISP: "makonix", IPs: []net.IP{{31, 170, 22, 2}}, DefaultPort: 1300, }, { - Country: models.MullvadCountry("moldova"), - City: models.MullvadCity("chisinau"), - Provider: models.MullvadProvider("trabia"), + Country: "moldova", + City: "chisinau", + ISP: "trabia", IPs: []net.IP{{178, 175, 142, 194}}, DefaultPort: 1197, }, { - Country: models.MullvadCountry("netherlands"), - City: models.MullvadCity("amsterdam"), - Provider: models.MullvadProvider("31173"), + Country: "netherlands", + City: "amsterdam", + ISP: "31173", IPs: []net.IP{{185, 65, 134, 139}, {185, 65, 134, 133}, {185, 65, 134, 148}, {185, 65, 134, 147}, {185, 65, 134, 141}, {185, 65, 134, 140}, {185, 65, 134, 145}, {185, 65, 134, 132}, {185, 65, 134, 146}, {185, 65, 134, 143}, {185, 65, 134, 134}, {185, 65, 134, 136}, {185, 65, 134, 135}, {185, 65, 134, 142}, {185, 65, 134, 144}}, Owned: true, DefaultPort: 1194, }, { - Country: models.MullvadCountry("norway"), - City: models.MullvadCity("oslo"), - Provider: models.MullvadProvider("blix"), + Country: "norway", + City: "oslo", + ISP: "blix", IPs: []net.IP{{91, 90, 44, 13}, {91, 90, 44, 18}, {91, 90, 44, 12}, {91, 90, 44, 15}, {91, 90, 44, 16}, {91, 90, 44, 17}, {91, 90, 44, 14}, {91, 90, 44, 11}}, Owned: true, DefaultPort: 1302, }, { - Country: models.MullvadCountry("new zealand"), - City: models.MullvadCity("auckland"), - Provider: models.MullvadProvider("intergrid"), + Country: "new zealand", + City: "auckland", + ISP: "intergrid", IPs: []net.IP{{103, 231, 91, 114}}, DefaultPort: 1195, }, { - Country: models.MullvadCountry("poland"), - City: models.MullvadCity("warsaw"), - Provider: models.MullvadProvider("m247"), + Country: "poland", + City: "warsaw", + ISP: "m247", IPs: []net.IP{{37, 120, 211, 202}, {37, 120, 156, 162}, {185, 244, 214, 210}, {37, 120, 211, 186}, {185, 244, 214, 215}, {37, 120, 211, 194}}, DefaultPort: 1194, }, { - Country: models.MullvadCountry("portugal"), - City: models.MullvadCity("lisbon"), - Provider: models.MullvadProvider("dotsi"), + Country: "portugal", + City: "lisbon", + ISP: "dotsi", IPs: []net.IP{{5, 206, 231, 214}}, DefaultPort: 1194, }, { - Country: models.MullvadCountry("romania"), - City: models.MullvadCity("bucharest"), - Provider: models.MullvadProvider("m247"), + Country: "romania", + City: "bucharest", + ISP: "m247", IPs: []net.IP{{89, 40, 181, 146}, {185, 181, 100, 202}, {89, 40, 181, 82}, {185, 45, 13, 10}, {89, 40, 181, 210}}, DefaultPort: 1301, }, { - Country: models.MullvadCountry("serbia"), - City: models.MullvadCity("belgrade"), - Provider: models.MullvadProvider("m247"), + Country: "serbia", + City: "belgrade", + ISP: "m247", IPs: []net.IP{{141, 98, 103, 50}}, DefaultPort: 1301, }, { - Country: models.MullvadCountry("serbia"), - City: models.MullvadCity("nis"), - Provider: models.MullvadProvider("ninet"), + Country: "serbia", + City: "nis", + ISP: "ninet", IPs: []net.IP{{176, 104, 107, 118}}, DefaultPort: 1301, }, { - Country: models.MullvadCountry("sweden"), - City: models.MullvadCity("gothenburg"), - Provider: models.MullvadProvider("31173"), + Country: "sweden", + City: "gothenburg", + ISP: "31173", IPs: []net.IP{{185, 213, 154, 139}, {185, 213, 154, 141}, {185, 213, 154, 140}, {185, 213, 154, 132}, {185, 213, 154, 135}, {185, 213, 154, 138}, {185, 213, 154, 133}, {185, 213, 154, 131}, {185, 213, 154, 134}, {185, 213, 154, 142}, {185, 213, 154, 137}}, Owned: true, DefaultPort: 1302, }, { - Country: models.MullvadCountry("sweden"), - City: models.MullvadCity("helsingborg"), - Provider: models.MullvadProvider("31173"), + Country: "sweden", + City: "helsingborg", + ISP: "31173", IPs: []net.IP{{185, 213, 152, 133}, {185, 213, 152, 132}, {185, 213, 152, 138}, {185, 213, 152, 131}, {185, 213, 152, 137}}, Owned: true, DefaultPort: 1302, }, { - Country: models.MullvadCountry("sweden"), - City: models.MullvadCity("malmo"), - Provider: models.MullvadProvider("31173"), + Country: "sweden", + City: "malmo", + ISP: "31173", IPs: []net.IP{{193, 138, 218, 138}, {45, 83, 220, 87}, {141, 98, 255, 94}, {141, 98, 255, 85}, {141, 98, 255, 87}, {141, 98, 255, 92}, {45, 83, 220, 84}, {141, 98, 255, 86}, {45, 83, 220, 81}, {193, 138, 218, 135}, {193, 138, 218, 131}, {193, 138, 218, 136}, {141, 98, 255, 88}, {141, 98, 255, 91}, {193, 138, 218, 133}, {45, 83, 220, 89}, {45, 83, 220, 88}, {141, 98, 255, 84}, {141, 98, 255, 89}, {193, 138, 218, 134}, {45, 83, 220, 86}, {141, 98, 255, 83}, {45, 83, 220, 85}, {141, 98, 255, 90}, {141, 98, 255, 93}, {193, 138, 218, 132}, {193, 138, 218, 137}, {45, 83, 220, 91}}, Owned: true, DefaultPort: 1302, }, { - Country: models.MullvadCountry("sweden"), - City: models.MullvadCity("stockholm"), - Provider: models.MullvadProvider("31173"), + Country: "sweden", + City: "stockholm", + ISP: "31173", IPs: []net.IP{{185, 65, 135, 150}, {185, 65, 135, 153}, {185, 65, 135, 151}, {185, 65, 135, 149}, {185, 65, 135, 141}, {185, 65, 135, 144}, {185, 65, 135, 145}, {185, 65, 135, 140}, {185, 65, 135, 134}, {185, 65, 135, 139}, {185, 65, 135, 131}, {185, 65, 135, 152}, {185, 65, 135, 146}, {185, 65, 135, 138}, {185, 65, 135, 143}, {185, 65, 135, 135}, {185, 65, 135, 154}, {185, 65, 135, 136}, {185, 65, 135, 133}, {185, 65, 135, 132}}, Owned: true, DefaultPort: 1302, }, { - Country: models.MullvadCountry("singapore"), - City: models.MullvadCity("singapore"), - Provider: models.MullvadProvider("m247"), + Country: "singapore", + City: "singapore", + ISP: "m247", IPs: []net.IP{{37, 120, 208, 218}, {37, 120, 208, 234}, {37, 120, 208, 226}, {185, 128, 24, 50}}, DefaultPort: 1196, }, { - Country: models.MullvadCountry("singapore"), - City: models.MullvadCity("singapore"), - Provider: models.MullvadProvider("leaseweb"), + Country: "singapore", + City: "singapore", + ISP: "leaseweb", IPs: []net.IP{{103, 254, 153, 82}}, DefaultPort: 1196, }, { - Country: models.MullvadCountry("usa"), - City: models.MullvadCity("atlanta"), - Provider: models.MullvadProvider("100tb"), + Country: "usa", + City: "atlanta", + ISP: "100tb", IPs: []net.IP{{208, 84, 153, 142}, {107, 152, 108, 62}}, DefaultPort: 1194, }, { - Country: models.MullvadCountry("usa"), - City: models.MullvadCity("atlanta"), - Provider: models.MullvadProvider("quadranet"), + Country: "usa", + City: "atlanta", + ISP: "quadranet", IPs: []net.IP{{104, 129, 24, 242}}, DefaultPort: 1194, }, { - Country: models.MullvadCountry("usa"), - City: models.MullvadCity("atlanta"), - Provider: models.MullvadProvider("micfo"), + Country: "usa", + City: "atlanta", + ISP: "micfo", IPs: []net.IP{{155, 254, 96, 2}, {155, 254, 96, 18}, {155, 254, 96, 34}}, // 1 missing DefaultPort: 1194, }, { - Country: models.MullvadCountry("usa"), - City: models.MullvadCity("chicago"), - Provider: models.MullvadProvider("tzulo"), + Country: "usa", + City: "chicago", + ISP: "tzulo", IPs: []net.IP{{68, 235, 43, 18}, {68, 235, 43, 26}, {68, 235, 43, 42}, {68, 235, 43, 50}, {68, 235, 43, 58}, {68, 235, 43, 66}, {68, 235, 43, 74}}, // 3 missing DefaultPort: 1194, }, { - Country: models.MullvadCountry("usa"), - City: models.MullvadCity("chicago"), - Provider: models.MullvadProvider("quadranet"), + Country: "usa", + City: "chicago", + ISP: "quadranet", IPs: []net.IP{}, // 1 missing DefaultPort: 1194, }, { - Country: models.MullvadCountry("usa"), - City: models.MullvadCity("dallas"), - Provider: models.MullvadProvider("quadranet"), + Country: "usa", + City: "dallas", + ISP: "quadranet", IPs: []net.IP{{96, 44, 145, 18}}, DefaultPort: 1194, }, { - Country: models.MullvadCountry("usa"), - City: models.MullvadCity("dallas"), - Provider: models.MullvadProvider("100tb"), + Country: "usa", + City: "dallas", + ISP: "100tb", IPs: []net.IP{{104, 200, 142, 50}, {107, 152, 102, 106}}, DefaultPort: 1194, }, { - Country: models.MullvadCountry("usa"), - City: models.MullvadCity("denver"), - Provider: models.MullvadProvider("tzulo"), + Country: "usa", + City: "denver", + ISP: "tzulo", IPs: []net.IP{{198, 54, 128, 74}}, // 1 missing DefaultPort: 1194, }, { - Country: models.MullvadCountry("usa"), - City: models.MullvadCity("los angeles"), - Provider: models.MullvadProvider("m247"), + Country: "usa", + City: "los angeles", + ISP: "m247", IPs: []net.IP{{45, 152, 182, 66}, {45, 152, 182, 74}, {45, 83, 89, 162}, {185, 230, 126, 146}}, // 7 missing DefaultPort: 1194, }, { - Country: models.MullvadCountry("usa"), - City: models.MullvadCity("los angeles"), - Provider: models.MullvadProvider("tzulo"), + Country: "usa", + City: "los angeles", + ISP: "tzulo", IPs: []net.IP{{198, 54, 129, 74}}, // 1 missing DefaultPort: 1194, }, { - Country: models.MullvadCountry("usa"), - City: models.MullvadCity("los angeles"), - Provider: models.MullvadProvider("100tb"), + Country: "usa", + City: "los angeles", + ISP: "100tb", IPs: []net.IP{{104, 200, 152, 66}, {107, 181, 168, 130}}, DefaultPort: 1194, }, { - Country: models.MullvadCountry("usa"), - City: models.MullvadCity("los angeles"), - Provider: models.MullvadProvider("choopa"), + Country: "usa", + City: "los angeles", + ISP: "choopa", IPs: []net.IP{{104, 238, 143, 58}}, // 1 missing DefaultPort: 1194, }, { - Country: models.MullvadCountry("usa"), - City: models.MullvadCity("miami"), - Provider: models.MullvadProvider("m247"), + Country: "usa", + City: "miami", + ISP: "m247", IPs: []net.IP{{37, 120, 215, 130}, {193, 37, 252, 138}, {193, 37, 252, 154}, {37, 120, 215, 138}}, // 1 missing DefaultPort: 1194, }, { - Country: models.MullvadCountry("usa"), - City: models.MullvadCity("miami"), - Provider: models.MullvadProvider("100tb"), + Country: "usa", + City: "miami", + ISP: "100tb", IPs: []net.IP{{172, 98, 76, 114}}, DefaultPort: 1194, }, { - Country: models.MullvadCountry("usa"), - City: models.MullvadCity("miami"), - Provider: models.MullvadProvider("micfo"), + Country: "usa", + City: "miami", + ISP: "micfo", IPs: []net.IP{}, // 1 missing DefaultPort: 1194, }, { - Country: models.MullvadCountry("usa"), - City: models.MullvadCity("new york"), - Provider: models.MullvadProvider("m247"), + Country: "usa", + City: "new york", + ISP: "m247", IPs: []net.IP{{185, 232, 22, 66}, {185, 232, 22, 98}, {193, 148, 18, 250}, {185, 232, 22, 10}, {217, 138, 206, 10}, {193, 148, 18, 218}, {193, 148, 18, 226}, {193, 148, 18, 194}, {87, 101, 95, 98}, {87, 101, 95, 114}, {87, 101, 95, 122}, {212, 103, 48, 226}, {176, 113, 72, 226}, {217, 138, 198, 250}, {217, 138, 206, 58}}, // 5 missing DefaultPort: 1194, }, { - Country: models.MullvadCountry("usa"), - City: models.MullvadCity("new york"), - Provider: models.MullvadProvider("100tb"), + Country: "usa", + City: "new york", + ISP: "100tb", IPs: []net.IP{{107, 182, 226, 206}, {107, 182, 226, 218}}, DefaultPort: 1194, }, { - Country: models.MullvadCountry("usa"), - City: models.MullvadCity("phoenix"), - Provider: models.MullvadProvider("100tb"), + Country: "usa", + City: "phoenix", + ISP: "100tb", IPs: []net.IP{}, // 1 missing DefaultPort: 1194, }, { - Country: models.MullvadCountry("usa"), - City: models.MullvadCity("phoenix"), - Provider: models.MullvadProvider("micfo"), + Country: "usa", + City: "phoenix", + ISP: "micfo", IPs: []net.IP{{192, 200, 24, 82}}, // 1 missing DefaultPort: 1194, }, { - Country: models.MullvadCountry("usa"), - City: models.MullvadCity("piscataway"), - Provider: models.MullvadProvider("choopa"), + Country: "usa", + City: "piscataway", + ISP: "choopa", IPs: []net.IP{{108, 61, 78, 138}, {108, 61, 48, 115}, {66, 55, 147, 59}}, DefaultPort: 1194, }, { - Country: models.MullvadCountry("usa"), - City: models.MullvadCity("seattle"), - Provider: models.MullvadProvider("100tb"), + Country: "usa", + City: "seattle", + ISP: "100tb", IPs: []net.IP{{104, 200, 129, 202}, {104, 200, 129, 150}, {104, 200, 129, 110}}, // 1 missing DefaultPort: 1194, }, { - Country: models.MullvadCountry("usa"), - City: models.MullvadCity("seattle"), - Provider: models.MullvadProvider("micfo"), + Country: "usa", + City: "seattle", + ISP: "micfo", IPs: []net.IP{{104, 128, 136, 146}}, DefaultPort: 1194, }, { - Country: models.MullvadCountry("usa"), - City: models.MullvadCity("san francisco"), - Provider: models.MullvadProvider("micfo"), + Country: "usa", + City: "san francisco", + ISP: "micfo", IPs: []net.IP{{209, 209, 238, 34}}, // 1 missing DefaultPort: 1194, }, { - Country: models.MullvadCountry("usa"), - City: models.MullvadCity("salt lake city"), - Provider: models.MullvadProvider("100tb"), + Country: "usa", + City: "salt lake city", + ISP: "100tb", IPs: []net.IP{{107, 182, 238, 229}, {107, 182, 235, 233}, {67, 212, 238, 236}, {67, 212, 238, 237}, {67, 212, 238, 239}, {107, 182, 239, 185}, {107, 182, 239, 170}}, // 2 missing DefaultPort: 1194, }, { - Country: models.MullvadCountry("usa"), - City: models.MullvadCity("secaucus"), - Provider: models.MullvadProvider("quadranet"), + Country: "usa", + City: "secaucus", + ISP: "quadranet", IPs: []net.IP{{23, 226, 131, 154}}, // 1 missing DefaultPort: 1194, }, diff --git a/internal/constants/pia.go b/internal/constants/pia.go index e91f4706..8a0f7bcc 100644 --- a/internal/constants/pia.go +++ b/internal/constants/pia.go @@ -7,78 +7,75 @@ import ( ) const ( - // PIAEncryptionNormal is the normal level of encryption for communication with PIA servers - PIAEncryptionNormal models.PIAEncryption = "normal" - // PIAEncryptionStrong is the strong level of encryption for communication with PIA servers - PIAEncryptionStrong models.PIAEncryption = "strong" + PIAEncryptionPresetNormal = "normal" + PIAEncryptionPresetStrong = "strong" + PiaX509CRLNormal = "MIICWDCCAUAwDQYJKoZIhvcNAQENBQAwgegxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTETMBEGA1UEBxMKTG9zQW5nZWxlczEgMB4GA1UEChMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxIDAeBgNVBAsTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMSAwHgYDVQQDExdQcml2YXRlIEludGVybmV0IEFjY2VzczEgMB4GA1UEKRMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxLzAtBgkqhkiG9w0BCQEWIHNlY3VyZUBwcml2YXRlaW50ZXJuZXRhY2Nlc3MuY29tFw0xNjA3MDgxOTAwNDZaFw0zNjA3MDMxOTAwNDZaMCYwEQIBARcMMTYwNzA4MTkwMDQ2MBECAQYXDDE2MDcwODE5MDA0NjANBgkqhkiG9w0BAQ0FAAOCAQEAQZo9X97ci8EcPYu/uK2HB152OZbeZCINmYyluLDOdcSvg6B5jI+ffKN3laDvczsG6CxmY3jNyc79XVpEYUnq4rT3FfveW1+Ralf+Vf38HdpwB8EWB4hZlQ205+21CALLvZvR8HcPxC9KEnev1mU46wkTiov0EKc+EdRxkj5yMgv0V2Reze7AP+NQ9ykvDScH4eYCsmufNpIjBLhpLE2cuZZXBLcPhuRzVoU3l7A9lvzG9mjA5YijHJGHNjlWFqyrn1CfYS6koa4TGEPngBoAziWRbDGdhEgJABHrpoaFYaL61zqyMR6jC0K2ps9qyZAN74LEBedEfK7tBOzWMwr58A==" + PiaX509CRLStrong = "MIIDWDCCAUAwDQYJKoZIhvcNAQENBQAwgegxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTETMBEGA1UEBxMKTG9zQW5nZWxlczEgMB4GA1UEChMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxIDAeBgNVBAsTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMSAwHgYDVQQDExdQcml2YXRlIEludGVybmV0IEFjY2VzczEgMB4GA1UEKRMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxLzAtBgkqhkiG9w0BCQEWIHNlY3VyZUBwcml2YXRlaW50ZXJuZXRhY2Nlc3MuY29tFw0xNjA3MDgxOTAwNDZaFw0zNjA3MDMxOTAwNDZaMCYwEQIBARcMMTYwNzA4MTkwMDQ2MBECAQYXDDE2MDcwODE5MDA0NjANBgkqhkiG9w0BAQ0FAAOCAgEAppFfEpGsasjB1QgJcosGpzbf2kfRhM84o2TlqY1ua+Gi5TMdKydA3LJcNTjlI9a0TYAJfeRX5IkpoglSUuHuJgXhP3nEvX10mjXDpcu/YvM8TdE5JV2+EGqZ80kFtBeOq94WcpiVKFTR4fO+VkOK9zwspFfb1cNs9rHvgJ1QMkRUF8PpLN6AkntHY0+6DnigtSaKqldqjKTDTv2OeH3nPoh80SGrt0oCOmYKfWTJGpggMGKvIdvU3vH9+EuILZKKIskt+1dwdfA5Bkz1GLmiQG7+9ZZBQUjBG9Dos4hfX/rwJ3eU8oUIm4WoTz9rb71SOEuUUjP5NPy9HNx2vx+cVvLsTF4ZDZaUztW9o9JmIURDtbeyqxuHN3prlPWB6aj73IIm2dsDQvs3XXwRIxs8NwLbJ6CyEuvEOVCskdM8rdADWx1J0lRNlOJ0Z8ieLLEmYAA834VN1SboB6wJIAPxQU3rcBhXqO9y8aa2oRMg8NxZ5gr+PnKVMqag1x0IxbIgLxtkXQvxXxQHEMSODzvcOfK/nBRBsqTj30P+R87sU8titOoxNeRnBDRNhdEy/QGAqGh62ShPpQUCJdnKRiRTjnil9hMQHevoSuFKeEMO30FQL7BZyo37GFU+q1WPCplVZgCP9hC8Rn5K2+f6KLFo5bhtowSmu+GY1yZtg+RTtsA=" + PIACertificateNormal = "MIIFqzCCBJOgAwIBAgIJAKZ7D5Yv87qDMA0GCSqGSIb3DQEBDQUAMIHoMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEzARBgNVBAcTCkxvc0FuZ2VsZXMxIDAeBgNVBAoTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMSAwHgYDVQQLExdQcml2YXRlIEludGVybmV0IEFjY2VzczEgMB4GA1UEAxMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxIDAeBgNVBCkTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMS8wLQYJKoZIhvcNAQkBFiBzZWN1cmVAcHJpdmF0ZWludGVybmV0YWNjZXNzLmNvbTAeFw0xNDA0MTcxNzM1MThaFw0zNDA0MTIxNzM1MThaMIHoMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEzARBgNVBAcTCkxvc0FuZ2VsZXMxIDAeBgNVBAoTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMSAwHgYDVQQLExdQcml2YXRlIEludGVybmV0IEFjY2VzczEgMB4GA1UEAxMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxIDAeBgNVBCkTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMS8wLQYJKoZIhvcNAQkBFiBzZWN1cmVAcHJpdmF0ZWludGVybmV0YWNjZXNzLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPXDL1L9tX6DGf36liA7UBTy5I869z0UVo3lImfOs/GSiFKPtInlesP65577nd7UNzzXlH/P/CnFPdBWlLp5ze3HRBCc/Avgr5CdMRkEsySL5GHBZsx6w2cayQ2EcRhVTwWpcdldeNO+pPr9rIgPrtXqT4SWViTQRBeGM8CDxAyTopTsobjSiYZCF9Ta1gunl0G/8Vfp+SXfYCC+ZzWvP+L1pFhPRqzQQ8k+wMZIovObK1s+nlwPaLyayzw9a8sUnvWB/5rGPdIYnQWPgoNlLN9HpSmsAcw2z8DXI9pIxbr74cb3/HSfuYGOLkRqrOk6h4RCOfuWoTrZup1uEOn+fw8CAwEAAaOCAVQwggFQMB0GA1UdDgQWBBQv63nQ/pJAt5tLy8VJcbHe22ZOsjCCAR8GA1UdIwSCARYwggESgBQv63nQ/pJAt5tLy8VJcbHe22ZOsqGB7qSB6zCB6DELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRMwEQYDVQQHEwpMb3NBbmdlbGVzMSAwHgYDVQQKExdQcml2YXRlIEludGVybmV0IEFjY2VzczEgMB4GA1UECxMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxIDAeBgNVBAMTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMSAwHgYDVQQpExdQcml2YXRlIEludGVybmV0IEFjY2VzczEvMC0GCSqGSIb3DQEJARYgc2VjdXJlQHByaXZhdGVpbnRlcm5ldGFjY2Vzcy5jb22CCQCmew+WL/O6gzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBDQUAA4IBAQAna5PgrtxfwTumD4+3/SYvwoD66cB8IcK//h1mCzAduU8KgUXocLx7QgJWo9lnZ8xUryXvWab2usg4fqk7FPi00bED4f4qVQFVfGfPZIH9QQ7/48bPM9RyfzImZWUCenK37pdw4Bvgoys2rHLHbGen7f28knT2j/cbMxd78tQc20TIObGjo8+ISTRclSTRBtyCGohseKYpTS9himFERpUgNtefvYHbn70mIOzfOJFTVqfrptf9jXa9N8Mpy3ayfodz1wiqdteqFXkTYoSDctgKMiZ6GdocK9nMroQipIQtpnwd4yBDWIyC6Bvlkrq5TQUtYDQ8z9v+DMO6iwyIDRiU" + PIACertificateStrong = "MIIHqzCCBZOgAwIBAgIJAJ0u+vODZJntMA0GCSqGSIb3DQEBDQUAMIHoMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEzARBgNVBAcTCkxvc0FuZ2VsZXMxIDAeBgNVBAoTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMSAwHgYDVQQLExdQcml2YXRlIEludGVybmV0IEFjY2VzczEgMB4GA1UEAxMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxIDAeBgNVBCkTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMS8wLQYJKoZIhvcNAQkBFiBzZWN1cmVAcHJpdmF0ZWludGVybmV0YWNjZXNzLmNvbTAeFw0xNDA0MTcxNzQwMzNaFw0zNDA0MTIxNzQwMzNaMIHoMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEzARBgNVBAcTCkxvc0FuZ2VsZXMxIDAeBgNVBAoTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMSAwHgYDVQQLExdQcml2YXRlIEludGVybmV0IEFjY2VzczEgMB4GA1UEAxMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxIDAeBgNVBCkTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMS8wLQYJKoZIhvcNAQkBFiBzZWN1cmVAcHJpdmF0ZWludGVybmV0YWNjZXNzLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALVkhjumaqBbL8aSgj6xbX1QPTfTd1qHsAZd2B97m8Vw31c/2yQgZNf5qZY0+jOIHULNDe4R9TIvyBEbvnAg/OkPw8n/+ScgYOeH876VUXzjLDBnDb8DLr/+w9oVsuDeFJ9KV2UFM1OYX0SnkHnrYAN2QLF98ESK4NCSU01h5zkcgmQ+qKSfA9Ny0/UpsKPBFqsQ25NvjDWFhCpeqCHKUJ4Be27CDbSl7lAkBuHMPHJs8f8xPgAbHRXZOxVCpayZ2SNDfCwsnGWpWFoMGvdMbygngCn6jA/W1VSFOlRlfLuuGe7QFfDwA0jaLCxuWt/BgZylp7tAzYKR8lnWmtUCPm4+BtjyVDYtDCiGBD9Z4P13RFWvJHw5aapx/5W/CuvVyI7pKwvc2IT+KPxCUhH1XI8ca5RN3C9NoPJJf6qpg4g0rJH3aaWkoMRrYvQ+5PXXYUzjtRHImghRGd/ydERYoAZXuGSbPkm9Y/p2X8unLcW+F0xpJD98+ZI+tzSsI99Zs5wijSUGYr9/j18KHFTMQ8n+1jauc5bCCegN27dPeKXNSZ5riXFL2XX6BkY68y58UaNzmeGMiUL9BOV1iV+PMb7B7PYs7oFLjAhh0EdyvfHkrh/ZV9BEhtFa7yXp8XR0J6vz1YV9R6DYJmLjOEbhU8N0gc3tZm4Qz39lIIG6w3FDAgMBAAGjggFUMIIBUDAdBgNVHQ4EFgQUrsRtyWJftjpdRM0+925Y6Cl08SUwggEfBgNVHSMEggEWMIIBEoAUrsRtyWJftjpdRM0+925Y6Cl08SWhge6kgeswgegxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTETMBEGA1UEBxMKTG9zQW5nZWxlczEgMB4GA1UEChMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxIDAeBgNVBAsTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMSAwHgYDVQQDExdQcml2YXRlIEludGVybmV0IEFjY2VzczEgMB4GA1UEKRMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxLzAtBgkqhkiG9w0BCQEWIHNlY3VyZUBwcml2YXRlaW50ZXJuZXRhY2Nlc3MuY29tggkAnS7684Nkme0wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQ0FAAOCAgEAJsfhsPk3r8kLXLxY+v+vHzbr4ufNtqnL9/1Uuf8NrsCtpXAoyZ0YqfbkWx3NHTZ7OE9ZRhdMP/RqHQE1p4N4Sa1nZKhTKasV6KhHDqSCt/dvEm89xWm2MVA7nyzQxVlHa9AkcBaemcXEiyT19XdpiXOP4Vhs+J1R5m8zQOxZlV1GtF9vsXmJqWZpOVPmZ8f35BCsYPvv4yMewnrtAC8PFEK/bOPeYcKN50bol22QYaZuLfpkHfNiFTnfMh8sl/ablPyNY7DUNiP5DRcMdIwmfGQxR5WEQoHL3yPJ42LkB5zs6jIm26DGNXfwura/mi105+ENH1CaROtRYwkiHb08U6qLXXJz80mWJkT90nr8Asj35xN2cUppg74nG3YVav/38P48T56hG1NHbYF5uOCske19F6wi9maUoto/3vEr0rnXJUp2KODmKdvBI7co245lHBABWikk8VfejQSlCtDBXn644ZMtAdoxKNfR2WTFVEwJiyd1Fzx0yujuiXDROLhISLQDRjVVAvawrAtLZWYK31bY7KlezPlQnl/D9Asxe85l8jO5+0LdJ6VyOs/Hd4w52alDW/MFySDZSfQHMTIc30hLBJ8OnCEIvluVQQ2UQvoW+no177N9L2Y+M9TcTA62ZyMXShHQGeh20rb4kK8f+iFX8NxtdHVSkxMEFSfDDyQ=" ) -const ( - PiaX509CRLNormal = "MIICWDCCAUAwDQYJKoZIhvcNAQENBQAwgegxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTETMBEGA1UEBxMKTG9zQW5nZWxlczEgMB4GA1UEChMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxIDAeBgNVBAsTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMSAwHgYDVQQDExdQcml2YXRlIEludGVybmV0IEFjY2VzczEgMB4GA1UEKRMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxLzAtBgkqhkiG9w0BCQEWIHNlY3VyZUBwcml2YXRlaW50ZXJuZXRhY2Nlc3MuY29tFw0xNjA3MDgxOTAwNDZaFw0zNjA3MDMxOTAwNDZaMCYwEQIBARcMMTYwNzA4MTkwMDQ2MBECAQYXDDE2MDcwODE5MDA0NjANBgkqhkiG9w0BAQ0FAAOCAQEAQZo9X97ci8EcPYu/uK2HB152OZbeZCINmYyluLDOdcSvg6B5jI+ffKN3laDvczsG6CxmY3jNyc79XVpEYUnq4rT3FfveW1+Ralf+Vf38HdpwB8EWB4hZlQ205+21CALLvZvR8HcPxC9KEnev1mU46wkTiov0EKc+EdRxkj5yMgv0V2Reze7AP+NQ9ykvDScH4eYCsmufNpIjBLhpLE2cuZZXBLcPhuRzVoU3l7A9lvzG9mjA5YijHJGHNjlWFqyrn1CfYS6koa4TGEPngBoAziWRbDGdhEgJABHrpoaFYaL61zqyMR6jC0K2ps9qyZAN74LEBedEfK7tBOzWMwr58A==" - PiaX509CRLStrong = "MIIDWDCCAUAwDQYJKoZIhvcNAQENBQAwgegxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTETMBEGA1UEBxMKTG9zQW5nZWxlczEgMB4GA1UEChMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxIDAeBgNVBAsTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMSAwHgYDVQQDExdQcml2YXRlIEludGVybmV0IEFjY2VzczEgMB4GA1UEKRMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxLzAtBgkqhkiG9w0BCQEWIHNlY3VyZUBwcml2YXRlaW50ZXJuZXRhY2Nlc3MuY29tFw0xNjA3MDgxOTAwNDZaFw0zNjA3MDMxOTAwNDZaMCYwEQIBARcMMTYwNzA4MTkwMDQ2MBECAQYXDDE2MDcwODE5MDA0NjANBgkqhkiG9w0BAQ0FAAOCAgEAppFfEpGsasjB1QgJcosGpzbf2kfRhM84o2TlqY1ua+Gi5TMdKydA3LJcNTjlI9a0TYAJfeRX5IkpoglSUuHuJgXhP3nEvX10mjXDpcu/YvM8TdE5JV2+EGqZ80kFtBeOq94WcpiVKFTR4fO+VkOK9zwspFfb1cNs9rHvgJ1QMkRUF8PpLN6AkntHY0+6DnigtSaKqldqjKTDTv2OeH3nPoh80SGrt0oCOmYKfWTJGpggMGKvIdvU3vH9+EuILZKKIskt+1dwdfA5Bkz1GLmiQG7+9ZZBQUjBG9Dos4hfX/rwJ3eU8oUIm4WoTz9rb71SOEuUUjP5NPy9HNx2vx+cVvLsTF4ZDZaUztW9o9JmIURDtbeyqxuHN3prlPWB6aj73IIm2dsDQvs3XXwRIxs8NwLbJ6CyEuvEOVCskdM8rdADWx1J0lRNlOJ0Z8ieLLEmYAA834VN1SboB6wJIAPxQU3rcBhXqO9y8aa2oRMg8NxZ5gr+PnKVMqag1x0IxbIgLxtkXQvxXxQHEMSODzvcOfK/nBRBsqTj30P+R87sU8titOoxNeRnBDRNhdEy/QGAqGh62ShPpQUCJdnKRiRTjnil9hMQHevoSuFKeEMO30FQL7BZyo37GFU+q1WPCplVZgCP9hC8Rn5K2+f6KLFo5bhtowSmu+GY1yZtg+RTtsA=" - PIACertificateNormal = "MIIFqzCCBJOgAwIBAgIJAKZ7D5Yv87qDMA0GCSqGSIb3DQEBDQUAMIHoMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEzARBgNVBAcTCkxvc0FuZ2VsZXMxIDAeBgNVBAoTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMSAwHgYDVQQLExdQcml2YXRlIEludGVybmV0IEFjY2VzczEgMB4GA1UEAxMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxIDAeBgNVBCkTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMS8wLQYJKoZIhvcNAQkBFiBzZWN1cmVAcHJpdmF0ZWludGVybmV0YWNjZXNzLmNvbTAeFw0xNDA0MTcxNzM1MThaFw0zNDA0MTIxNzM1MThaMIHoMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEzARBgNVBAcTCkxvc0FuZ2VsZXMxIDAeBgNVBAoTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMSAwHgYDVQQLExdQcml2YXRlIEludGVybmV0IEFjY2VzczEgMB4GA1UEAxMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxIDAeBgNVBCkTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMS8wLQYJKoZIhvcNAQkBFiBzZWN1cmVAcHJpdmF0ZWludGVybmV0YWNjZXNzLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPXDL1L9tX6DGf36liA7UBTy5I869z0UVo3lImfOs/GSiFKPtInlesP65577nd7UNzzXlH/P/CnFPdBWlLp5ze3HRBCc/Avgr5CdMRkEsySL5GHBZsx6w2cayQ2EcRhVTwWpcdldeNO+pPr9rIgPrtXqT4SWViTQRBeGM8CDxAyTopTsobjSiYZCF9Ta1gunl0G/8Vfp+SXfYCC+ZzWvP+L1pFhPRqzQQ8k+wMZIovObK1s+nlwPaLyayzw9a8sUnvWB/5rGPdIYnQWPgoNlLN9HpSmsAcw2z8DXI9pIxbr74cb3/HSfuYGOLkRqrOk6h4RCOfuWoTrZup1uEOn+fw8CAwEAAaOCAVQwggFQMB0GA1UdDgQWBBQv63nQ/pJAt5tLy8VJcbHe22ZOsjCCAR8GA1UdIwSCARYwggESgBQv63nQ/pJAt5tLy8VJcbHe22ZOsqGB7qSB6zCB6DELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRMwEQYDVQQHEwpMb3NBbmdlbGVzMSAwHgYDVQQKExdQcml2YXRlIEludGVybmV0IEFjY2VzczEgMB4GA1UECxMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxIDAeBgNVBAMTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMSAwHgYDVQQpExdQcml2YXRlIEludGVybmV0IEFjY2VzczEvMC0GCSqGSIb3DQEJARYgc2VjdXJlQHByaXZhdGVpbnRlcm5ldGFjY2Vzcy5jb22CCQCmew+WL/O6gzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBDQUAA4IBAQAna5PgrtxfwTumD4+3/SYvwoD66cB8IcK//h1mCzAduU8KgUXocLx7QgJWo9lnZ8xUryXvWab2usg4fqk7FPi00bED4f4qVQFVfGfPZIH9QQ7/48bPM9RyfzImZWUCenK37pdw4Bvgoys2rHLHbGen7f28knT2j/cbMxd78tQc20TIObGjo8+ISTRclSTRBtyCGohseKYpTS9himFERpUgNtefvYHbn70mIOzfOJFTVqfrptf9jXa9N8Mpy3ayfodz1wiqdteqFXkTYoSDctgKMiZ6GdocK9nMroQipIQtpnwd4yBDWIyC6Bvlkrq5TQUtYDQ8z9v+DMO6iwyIDRiU" - PIACertificateStrong = "MIIHqzCCBZOgAwIBAgIJAJ0u+vODZJntMA0GCSqGSIb3DQEBDQUAMIHoMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEzARBgNVBAcTCkxvc0FuZ2VsZXMxIDAeBgNVBAoTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMSAwHgYDVQQLExdQcml2YXRlIEludGVybmV0IEFjY2VzczEgMB4GA1UEAxMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxIDAeBgNVBCkTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMS8wLQYJKoZIhvcNAQkBFiBzZWN1cmVAcHJpdmF0ZWludGVybmV0YWNjZXNzLmNvbTAeFw0xNDA0MTcxNzQwMzNaFw0zNDA0MTIxNzQwMzNaMIHoMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEzARBgNVBAcTCkxvc0FuZ2VsZXMxIDAeBgNVBAoTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMSAwHgYDVQQLExdQcml2YXRlIEludGVybmV0IEFjY2VzczEgMB4GA1UEAxMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxIDAeBgNVBCkTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMS8wLQYJKoZIhvcNAQkBFiBzZWN1cmVAcHJpdmF0ZWludGVybmV0YWNjZXNzLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALVkhjumaqBbL8aSgj6xbX1QPTfTd1qHsAZd2B97m8Vw31c/2yQgZNf5qZY0+jOIHULNDe4R9TIvyBEbvnAg/OkPw8n/+ScgYOeH876VUXzjLDBnDb8DLr/+w9oVsuDeFJ9KV2UFM1OYX0SnkHnrYAN2QLF98ESK4NCSU01h5zkcgmQ+qKSfA9Ny0/UpsKPBFqsQ25NvjDWFhCpeqCHKUJ4Be27CDbSl7lAkBuHMPHJs8f8xPgAbHRXZOxVCpayZ2SNDfCwsnGWpWFoMGvdMbygngCn6jA/W1VSFOlRlfLuuGe7QFfDwA0jaLCxuWt/BgZylp7tAzYKR8lnWmtUCPm4+BtjyVDYtDCiGBD9Z4P13RFWvJHw5aapx/5W/CuvVyI7pKwvc2IT+KPxCUhH1XI8ca5RN3C9NoPJJf6qpg4g0rJH3aaWkoMRrYvQ+5PXXYUzjtRHImghRGd/ydERYoAZXuGSbPkm9Y/p2X8unLcW+F0xpJD98+ZI+tzSsI99Zs5wijSUGYr9/j18KHFTMQ8n+1jauc5bCCegN27dPeKXNSZ5riXFL2XX6BkY68y58UaNzmeGMiUL9BOV1iV+PMb7B7PYs7oFLjAhh0EdyvfHkrh/ZV9BEhtFa7yXp8XR0J6vz1YV9R6DYJmLjOEbhU8N0gc3tZm4Qz39lIIG6w3FDAgMBAAGjggFUMIIBUDAdBgNVHQ4EFgQUrsRtyWJftjpdRM0+925Y6Cl08SUwggEfBgNVHSMEggEWMIIBEoAUrsRtyWJftjpdRM0+925Y6Cl08SWhge6kgeswgegxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTETMBEGA1UEBxMKTG9zQW5nZWxlczEgMB4GA1UEChMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxIDAeBgNVBAsTF1ByaXZhdGUgSW50ZXJuZXQgQWNjZXNzMSAwHgYDVQQDExdQcml2YXRlIEludGVybmV0IEFjY2VzczEgMB4GA1UEKRMXUHJpdmF0ZSBJbnRlcm5ldCBBY2Nlc3MxLzAtBgkqhkiG9w0BCQEWIHNlY3VyZUBwcml2YXRlaW50ZXJuZXRhY2Nlc3MuY29tggkAnS7684Nkme0wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQ0FAAOCAgEAJsfhsPk3r8kLXLxY+v+vHzbr4ufNtqnL9/1Uuf8NrsCtpXAoyZ0YqfbkWx3NHTZ7OE9ZRhdMP/RqHQE1p4N4Sa1nZKhTKasV6KhHDqSCt/dvEm89xWm2MVA7nyzQxVlHa9AkcBaemcXEiyT19XdpiXOP4Vhs+J1R5m8zQOxZlV1GtF9vsXmJqWZpOVPmZ8f35BCsYPvv4yMewnrtAC8PFEK/bOPeYcKN50bol22QYaZuLfpkHfNiFTnfMh8sl/ablPyNY7DUNiP5DRcMdIwmfGQxR5WEQoHL3yPJ42LkB5zs6jIm26DGNXfwura/mi105+ENH1CaROtRYwkiHb08U6qLXXJz80mWJkT90nr8Asj35xN2cUppg74nG3YVav/38P48T56hG1NHbYF5uOCske19F6wi9maUoto/3vEr0rnXJUp2KODmKdvBI7co245lHBABWikk8VfejQSlCtDBXn644ZMtAdoxKNfR2WTFVEwJiyd1Fzx0yujuiXDROLhISLQDRjVVAvawrAtLZWYK31bY7KlezPlQnl/D9Asxe85l8jO5+0LdJ6VyOs/Hd4w52alDW/MFySDZSfQHMTIc30hLBJ8OnCEIvluVQQ2UQvoW+no177N9L2Y+M9TcTA62ZyMXShHQGeh20rb4kK8f+iFX8NxtdHVSkxMEFSfDDyQ=" -) - -func PIAGeoChoices() (regions []string) { - for _, server := range PIAServers() { - regions = append(regions, string(server.Region)) +func PIAGeoChoices() (choices []string) { + servers := PIAServers() + choices = make([]string, len(servers)) + for i := range servers { + choices[i] = servers[i].Region } - return regions + return choices } func PIAServers() []models.PIAServer { return []models.PIAServer{ - {Region: models.PIARegion("AU Melbourne"), IPs: []net.IP{{27, 50, 82, 131}, {27, 50, 82, 133}, {43, 250, 204, 81}, {43, 250, 204, 83}, {43, 250, 204, 89}, {43, 250, 204, 93}, {43, 250, 204, 95}, {43, 250, 204, 97}, {43, 250, 204, 99}, {43, 250, 204, 101}, {43, 250, 204, 103}, {43, 250, 204, 109}, {43, 250, 204, 111}, {43, 250, 204, 115}, {43, 250, 204, 117}, {43, 250, 204, 119}, {43, 250, 204, 123}, {43, 250, 204, 125}, {118, 127, 62, 227}, {221, 121, 139, 175}}}, - {Region: models.PIARegion("AU Perth"), IPs: []net.IP{{43, 250, 205, 59}, {43, 250, 205, 95}}}, - {Region: models.PIARegion("AU Sydney"), IPs: []net.IP{{27, 50, 70, 87}, {27, 50, 81, 117}, {103, 13, 102, 113}, {103, 13, 102, 119}, {103, 13, 102, 121}, {103, 13, 102, 123}, {103, 13, 102, 127}, {118, 127, 60, 53}, {118, 127, 60, 61}, {221, 121, 145, 145}, {221, 121, 145, 147}}}, - {Region: models.PIARegion("Austria"), IPs: []net.IP{{185, 210, 219, 147}, {185, 210, 219, 154}, {185, 210, 219, 155}, {185, 216, 34, 226}, {185, 216, 34, 227}, {185, 216, 34, 228}, {185, 216, 34, 229}, {185, 216, 34, 230}, {185, 216, 34, 231}, {185, 216, 34, 232}, {185, 216, 34, 233}, {185, 216, 34, 236}, {185, 216, 34, 237}, {185, 216, 34, 238}}}, - {Region: models.PIARegion("Belgium"), IPs: []net.IP{{77, 243, 191, 18}, {77, 243, 191, 19}, {77, 243, 191, 20}, {77, 243, 191, 22}, {77, 243, 191, 26}, {77, 243, 191, 27}, {185, 104, 186, 26}, {185, 232, 21, 29}}}, - {Region: models.PIARegion("CA Montreal"), IPs: []net.IP{{199, 229, 249, 130}, {199, 229, 249, 136}, {199, 229, 249, 141}, {199, 229, 249, 146}, {199, 229, 249, 149}, {199, 229, 249, 151}, {199, 229, 249, 155}, {199, 229, 249, 157}, {199, 229, 249, 178}, {199, 229, 249, 184}, {199, 229, 249, 185}, {199, 229, 249, 189}, {199, 229, 249, 190}, {199, 229, 249, 200}}}, - {Region: models.PIARegion("CA Toronto"), IPs: []net.IP{{172, 98, 67, 5}, {172, 98, 67, 6}, {172, 98, 67, 9}, {172, 98, 67, 12}, {172, 98, 67, 16}, {172, 98, 67, 17}, {172, 98, 67, 20}, {172, 98, 67, 31}, {172, 98, 67, 34}, {172, 98, 67, 45}, {172, 98, 67, 47}, {172, 98, 67, 48}, {172, 98, 67, 49}, {172, 98, 67, 60}, {172, 98, 67, 68}, {172, 98, 67, 73}, {172, 98, 67, 76}, {172, 98, 67, 82}, {172, 98, 67, 90}, {172, 98, 67, 95}}}, - {Region: models.PIARegion("CA Vancouver"), IPs: []net.IP{{107, 181, 189, 71}, {107, 181, 189, 77}, {107, 181, 189, 83}, {172, 83, 40, 20}, {172, 83, 40, 23}, {172, 83, 40, 26}, {172, 83, 40, 99}, {172, 83, 40, 104}, {172, 83, 40, 106}, {172, 83, 40, 111}, {172, 83, 40, 112}}}, - {Region: models.PIARegion("Czech Republic"), IPs: []net.IP{{89, 238, 186, 228}, {89, 238, 186, 229}, {89, 238, 186, 230}, {185, 216, 35, 66}, {185, 216, 35, 67}, {185, 216, 35, 68}, {185, 216, 35, 69}, {185, 242, 6, 26}, {185, 242, 6, 27}, {185, 242, 6, 28}, {185, 242, 6, 30}}}, - {Region: models.PIARegion("DE Berlin"), IPs: []net.IP{{185, 230, 127, 228}, {185, 230, 127, 231}, {185, 230, 127, 233}, {185, 230, 127, 234}, {185, 230, 127, 236}, {185, 230, 127, 237}, {185, 230, 127, 240}, {185, 230, 127, 241}, {185, 230, 127, 243}, {193, 176, 86, 122}, {193, 176, 86, 123}, {193, 176, 86, 124}, {193, 176, 86, 130}, {193, 176, 86, 142}, {193, 176, 86, 146}, {193, 176, 86, 154}, {193, 176, 86, 158}, {193, 176, 86, 166}, {193, 176, 86, 178}, {194, 36, 108, 6}}}, - {Region: models.PIARegion("DE Frankfurt"), IPs: []net.IP{{185, 220, 70, 132}, {185, 220, 70, 133}, {185, 220, 70, 134}, {185, 220, 70, 136}, {185, 220, 70, 138}, {185, 220, 70, 139}, {185, 220, 70, 140}, {185, 220, 70, 143}, {185, 220, 70, 145}, {185, 220, 70, 147}, {185, 220, 70, 148}, {185, 220, 70, 149}, {185, 220, 70, 150}, {185, 220, 70, 152}, {185, 220, 70, 153}, {185, 220, 70, 162}, {185, 220, 70, 164}, {185, 220, 70, 166}, {185, 220, 70, 172}, {185, 220, 70, 174}}}, - {Region: models.PIARegion("Denmark"), IPs: []net.IP{{82, 102, 20, 162}, {82, 102, 20, 163}, {82, 102, 20, 164}, {82, 102, 20, 165}, {82, 102, 20, 166}, {82, 102, 20, 168}, {82, 102, 20, 169}, {82, 102, 20, 170}, {82, 102, 20, 171}, {82, 102, 20, 172}, {82, 102, 20, 173}, {82, 102, 20, 174}, {82, 102, 20, 175}, {82, 102, 20, 176}, {82, 102, 20, 177}, {82, 102, 20, 178}, {82, 102, 20, 179}, {82, 102, 20, 180}, {82, 102, 20, 182}, {82, 102, 20, 183}}}, - {Region: models.PIARegion("Finlan"), IPs: []net.IP{{196, 244, 191, 2}, {196, 244, 191, 10}, {196, 244, 191, 18}, {196, 244, 191, 26}, {196, 244, 191, 42}, {196, 244, 191, 50}, {196, 244, 191, 58}, {196, 244, 191, 74}, {196, 244, 191, 82}, {196, 244, 191, 90}, {196, 244, 191, 98}, {196, 244, 191, 106}, {196, 244, 191, 114}, {196, 244, 191, 122}, {196, 244, 191, 138}, {196, 244, 191, 146}}}, - {Region: models.PIARegion("France"), IPs: []net.IP{{194, 99, 106, 148}, {194, 187, 249, 35}, {194, 187, 249, 37}, {194, 187, 249, 38}, {194, 187, 249, 39}, {194, 187, 249, 43}, {194, 187, 249, 44}, {194, 187, 249, 47}, {194, 187, 249, 48}, {194, 187, 249, 54}, {194, 187, 249, 57}, {194, 187, 249, 59}, {194, 187, 249, 61}, {194, 187, 249, 62}, {194, 187, 249, 179}, {194, 187, 249, 180}, {194, 187, 249, 182}, {194, 187, 249, 183}, {194, 187, 249, 187}, {194, 187, 249, 190}}}, - {Region: models.PIARegion("Hong Kong"), IPs: []net.IP{{84, 17, 37, 1}, {84, 17, 37, 23}, {84, 17, 37, 45}, {119, 81, 135, 2}, {119, 81, 135, 5}, {119, 81, 135, 28}, {119, 81, 135, 29}, {119, 81, 135, 47}, {119, 81, 135, 51}, {119, 81, 135, 53}, {119, 81, 253, 212}, {119, 81, 253, 218}, {119, 81, 253, 226}, {119, 81, 253, 227}, {119, 81, 253, 229}, {119, 81, 253, 230}, {119, 81, 253, 241}, {119, 81, 253, 242}, {161, 202, 39, 240}, {161, 202, 44, 94}}}, - {Region: models.PIARegion("Hungary"), IPs: []net.IP{{185, 128, 26, 18}, {185, 128, 26, 19}, {185, 128, 26, 20}, {185, 128, 26, 21}, {185, 128, 26, 22}, {185, 128, 26, 23}, {185, 128, 26, 24}, {185, 189, 114, 98}}}, - {Region: models.PIARegion("India"), IPs: []net.IP{{150, 242, 12, 155}, {150, 242, 12, 171}, {150, 242, 12, 187}}}, - {Region: models.PIARegion("Ireland"), IPs: []net.IP{{23, 92, 127, 2}, {23, 92, 127, 10}, {23, 92, 127, 18}, {23, 92, 127, 34}, {23, 92, 127, 42}, {23, 92, 127, 50}, {23, 92, 127, 58}, {23, 92, 127, 66}}}, - {Region: models.PIARegion("Israel"), IPs: []net.IP{{31, 168, 172, 136}, {31, 168, 172, 142}, {31, 168, 172, 143}, {31, 168, 172, 145}, {31, 168, 172, 146}, {31, 168, 172, 147}}}, - {Region: models.PIARegion("Italy"), IPs: []net.IP{{82, 102, 21, 98}, {82, 102, 21, 211}, {82, 102, 21, 214}, {82, 102, 21, 217}}}, - {Region: models.PIARegion("Japan"), IPs: []net.IP{{103, 208, 220, 130}, {103, 208, 220, 132}, {103, 208, 220, 135}, {103, 208, 220, 138}}}, - {Region: models.PIARegion("Luxembourg"), IPs: []net.IP{{92, 223, 89, 133}, {92, 223, 89, 134}, {92, 223, 89, 135}, {92, 223, 89, 136}, {92, 223, 89, 137}, {92, 223, 89, 138}, {92, 223, 89, 140}, {92, 223, 89, 142}}}, - {Region: models.PIARegion("Mexico"), IPs: []net.IP{{169, 57, 0, 200}, {169, 57, 0, 205}, {169, 57, 0, 211}, {169, 57, 0, 212}, {169, 57, 0, 214}, {169, 57, 0, 217}, {169, 57, 0, 218}, {169, 57, 0, 219}, {169, 57, 0, 221}, {169, 57, 0, 224}, {169, 57, 0, 225}, {169, 57, 0, 229}, {169, 57, 0, 230}, {169, 57, 0, 231}, {169, 57, 0, 233}, {169, 57, 0, 235}, {169, 57, 0, 238}, {169, 57, 0, 243}, {169, 57, 0, 247}, {169, 57, 0, 248}}}, - {Region: models.PIARegion("Netherlands"), IPs: []net.IP{{46, 166, 138, 145}, {46, 166, 138, 161}, {46, 166, 138, 170}, {46, 166, 138, 175}, {46, 166, 186, 247}, {46, 166, 188, 202}, {46, 166, 188, 216}, {46, 166, 190, 176}, {46, 166, 190, 179}, {46, 166, 190, 182}, {46, 166, 190, 183}, {46, 166, 190, 184}, {46, 166, 190, 186}, {46, 166, 190, 194}, {46, 166, 190, 219}, {46, 166, 190, 222}, {46, 166, 190, 227}, {46, 166, 190, 236}, {77, 247, 182, 241}, {109, 201, 154, 182}}}, - {Region: models.PIARegion("New Zealand"), IPs: []net.IP{{103, 231, 90, 171}, {103, 231, 90, 172}, {103, 231, 90, 173}, {103, 231, 90, 174}, {103, 231, 91, 34}, {103, 231, 91, 66}, {103, 231, 91, 67}, {103, 231, 91, 69}, {103, 231, 91, 70}, {103, 231, 91, 74}}}, - {Region: models.PIARegion("Norway"), IPs: []net.IP{{82, 102, 27, 50}, {82, 102, 27, 51}, {82, 102, 27, 52}, {82, 102, 27, 53}, {82, 102, 27, 54}, {82, 102, 27, 55}, {82, 102, 27, 56}, {82, 102, 27, 57}, {82, 102, 27, 74}, {82, 102, 27, 75}, {82, 102, 27, 76}, {82, 102, 27, 116}, {82, 102, 27, 117}, {82, 102, 27, 118}, {82, 102, 27, 125}, {82, 102, 27, 126}, {185, 206, 225, 222}, {185, 253, 97, 226}, {185, 253, 97, 227}, {185, 253, 97, 228}}}, - {Region: models.PIARegion("Poland"), IPs: []net.IP{{185, 244, 214, 14}, {185, 244, 214, 194}, {185, 244, 214, 196}, {185, 244, 214, 197}, {185, 244, 214, 198}, {185, 244, 214, 199}, {185, 244, 214, 200}}}, - {Region: models.PIARegion("Romania"), IPs: []net.IP{{86, 105, 25, 66}, {86, 105, 25, 68}, {86, 105, 25, 69}, {86, 105, 25, 70}, {86, 105, 25, 74}, {86, 105, 25, 75}, {86, 105, 25, 76}, {86, 105, 25, 77}, {86, 105, 25, 78}, {89, 33, 8, 38}, {89, 33, 8, 42}, {94, 176, 148, 34}, {94, 176, 148, 35}, {185, 45, 12, 126}, {185, 210, 218, 98}, {185, 210, 218, 99}, {185, 210, 218, 100}, {185, 210, 218, 101}, {185, 210, 218, 104}, {185, 210, 218, 105}}}, - {Region: models.PIARegion("Singapore"), IPs: []net.IP{{37, 120, 208, 66}, {37, 120, 208, 67}, {37, 120, 208, 68}, {37, 120, 208, 69}, {37, 120, 208, 71}, {37, 120, 208, 72}, {37, 120, 208, 73}, {37, 120, 208, 74}, {37, 120, 208, 75}, {37, 120, 208, 76}, {37, 120, 208, 77}, {37, 120, 208, 78}, {37, 120, 208, 79}, {37, 120, 208, 80}, {37, 120, 208, 81}, {37, 120, 208, 82}, {37, 120, 208, 83}}}, - {Region: models.PIARegion("Spain"), IPs: []net.IP{{37, 120, 148, 86}, {185, 230, 124, 53}, {194, 99, 104, 30}}}, - {Region: models.PIARegion("Sweden"), IPs: []net.IP{{45, 12, 220, 165}, {45, 12, 220, 171}, {45, 12, 220, 197}, {45, 12, 220, 199}, {45, 12, 220, 203}, {45, 12, 220, 205}, {45, 12, 220, 207}, {45, 12, 220, 208}, {45, 12, 220, 210}, {45, 12, 220, 213}, {45, 12, 220, 215}, {45, 12, 220, 221}, {45, 12, 220, 222}, {45, 12, 220, 236}, {45, 12, 220, 241}, {45, 12, 220, 249}, {45, 12, 220, 253}, {45, 83, 91, 20}, {45, 83, 91, 26}, {45, 83, 91, 28}}}, - {Region: models.PIARegion("Switzerland"), IPs: []net.IP{{82, 102, 24, 250}, {82, 102, 24, 252}, {91, 132, 136, 45}, {91, 132, 136, 53}, {185, 156, 175, 86}, {185, 156, 175, 93}, {185, 212, 170, 180}, {185, 212, 170, 183}, {185, 230, 125, 34}, {185, 230, 125, 35}, {185, 230, 125, 36}, {185, 230, 125, 38}, {185, 230, 125, 43}, {185, 230, 125, 45}, {185, 230, 125, 49}, {185, 230, 125, 51}, {185, 230, 125, 86}, {195, 206, 105, 215}, {195, 206, 105, 216}, {212, 102, 36, 1}}}, - {Region: models.PIARegion("UAE"), IPs: []net.IP{{45, 9, 250, 42}, {45, 9, 250, 46}, {45, 9, 250, 62}}}, - {Region: models.PIARegion("UK London"), IPs: []net.IP{{89, 238, 150, 8}, {89, 238, 150, 10}, {89, 238, 150, 17}, {89, 238, 150, 20}, {89, 238, 150, 21}, {89, 238, 150, 22}, {89, 238, 150, 23}, {89, 238, 154, 19}, {89, 238, 154, 116}, {89, 238, 154, 117}, {89, 238, 154, 124}, {89, 238, 154, 125}, {89, 238, 154, 165}, {89, 238, 154, 169}, {89, 238, 154, 171}, {89, 238, 154, 173}, {89, 238, 154, 228}, {89, 238, 154, 239}, {89, 238, 154, 247}, {185, 253, 98, 94}}}, - {Region: models.PIARegion("UK Manchester"), IPs: []net.IP{{89, 238, 137, 37}, {89, 238, 137, 39}, {89, 238, 137, 40}, {89, 238, 137, 41}, {89, 238, 137, 42}, {89, 238, 137, 43}, {89, 238, 139, 4}, {89, 238, 139, 5}, {89, 238, 139, 7}, {89, 238, 139, 8}, {89, 238, 139, 9}, {89, 238, 139, 10}, {89, 238, 139, 11}, {89, 238, 139, 12}, {89, 238, 139, 13}, {89, 238, 139, 52}, {89, 238, 139, 53}, {89, 238, 139, 55}, {89, 238, 139, 57}, {89, 238, 139, 58}}}, - {Region: models.PIARegion("UK Southampton"), IPs: []net.IP{{31, 24, 226, 132}, {31, 24, 226, 136}, {31, 24, 226, 147}, {31, 24, 226, 186}, {31, 24, 226, 188}, {31, 24, 226, 204}, {31, 24, 226, 205}, {31, 24, 226, 209}, {31, 24, 226, 219}, {31, 24, 226, 220}, {31, 24, 226, 222}, {31, 24, 226, 224}, {31, 24, 226, 225}, {31, 24, 226, 227}, {31, 24, 226, 232}, {31, 24, 226, 233}, {31, 24, 226, 235}, {31, 24, 226, 236}, {31, 24, 226, 241}, {31, 24, 226, 244}}}, - {Region: models.PIARegion("US Atlanta"), IPs: []net.IP{{66, 115, 168, 10}, {66, 115, 168, 19}, {66, 115, 168, 21}, {66, 115, 168, 23}, {66, 115, 168, 26}, {66, 115, 168, 28}, {66, 115, 169, 195}, {66, 115, 169, 209}, {66, 115, 169, 217}, {66, 115, 169, 218}, {66, 115, 169, 221}, {66, 115, 169, 226}, {66, 115, 169, 230}, {66, 115, 169, 233}, {66, 115, 169, 235}, {66, 115, 169, 237}, {66, 115, 169, 239}, {66, 115, 169, 240}, {66, 115, 169, 242}, {66, 115, 169, 244}}}, - {Region: models.PIARegion("US California"), IPs: []net.IP{{91, 207, 175, 53}, {91, 207, 175, 70}, {91, 207, 175, 71}, {91, 207, 175, 99}, {91, 207, 175, 101}, {91, 207, 175, 104}, {91, 207, 175, 110}, {91, 207, 175, 112}, {91, 207, 175, 166}, {91, 207, 175, 170}, {91, 207, 175, 177}, {91, 207, 175, 178}, {91, 207, 175, 207}, {91, 207, 175, 227}, {91, 207, 175, 228}, {91, 207, 175, 236}, {91, 207, 175, 252}, {185, 245, 87, 179}, {185, 245, 87, 216}, {212, 103, 49, 162}}}, - {Region: models.PIARegion("US Chicago"), IPs: []net.IP{{104, 200, 153, 96}, {199, 116, 115, 130}, {199, 116, 115, 131}, {199, 116, 115, 132}, {199, 116, 115, 133}, {199, 116, 115, 134}, {199, 116, 115, 135}, {199, 116, 115, 136}, {199, 116, 115, 137}, {199, 116, 115, 138}, {199, 116, 115, 139}, {199, 116, 115, 140}, {199, 116, 115, 141}, {199, 116, 115, 142}, {199, 116, 115, 143}, {199, 116, 115, 144}, {199, 116, 115, 145}, {199, 116, 115, 146}, {199, 116, 115, 147}, {199, 116, 115, 148}}}, - {Region: models.PIARegion("US Denver"), IPs: []net.IP{{174, 128, 225, 2}, {174, 128, 225, 106}, {174, 128, 225, 186}, {174, 128, 226, 10}, {174, 128, 226, 18}, {174, 128, 227, 226}, {174, 128, 242, 234}, {174, 128, 243, 114}, {174, 128, 243, 122}, {174, 128, 245, 106}, {174, 128, 250, 18}, {198, 148, 82, 82}, {198, 148, 88, 250}, {199, 115, 97, 202}, {199, 115, 98, 146}, {199, 115, 98, 226}, {199, 115, 99, 82}, {199, 115, 99, 218}, {199, 115, 101, 178}, {199, 115, 102, 154}}}, - {Region: models.PIARegion("US East"), IPs: []net.IP{{193, 37, 253, 50}, {193, 37, 253, 52}, {193, 37, 253, 105}, {193, 37, 253, 136}, {193, 37, 253, 137}, {194, 59, 251, 27}, {194, 59, 251, 37}, {194, 59, 251, 52}, {194, 59, 251, 68}, {194, 59, 251, 78}, {194, 59, 251, 80}, {194, 59, 251, 85}, {194, 59, 251, 87}, {194, 59, 251, 108}, {194, 59, 251, 136}, {194, 59, 251, 141}, {194, 59, 251, 166}, {194, 59, 251, 168}, {194, 59, 251, 218}, {194, 59, 251, 248}}}, - {Region: models.PIARegion("US Florida"), IPs: []net.IP{{193, 37, 252, 3}, {193, 37, 252, 6}, {193, 37, 252, 8}, {193, 37, 252, 11}, {193, 37, 252, 16}, {193, 37, 252, 19}, {193, 37, 252, 21}, {193, 37, 252, 48}, {193, 37, 252, 51}, {193, 37, 252, 53}, {193, 37, 252, 54}, {193, 37, 252, 58}, {193, 37, 252, 59}, {193, 37, 252, 70}, {193, 37, 252, 78}, {193, 37, 252, 82}, {193, 37, 252, 102}, {193, 37, 252, 105}, {193, 37, 252, 123}, {193, 37, 252, 126}}}, - {Region: models.PIARegion("US Houston"), IPs: []net.IP{{74, 81, 88, 26}, {74, 81, 88, 42}, {74, 81, 88, 58}, {74, 81, 88, 66}, {74, 81, 88, 114}, {74, 81, 88, 130}, {205, 251, 148, 34}, {205, 251, 148, 42}, {205, 251, 148, 66}, {205, 251, 148, 74}, {205, 251, 148, 82}, {205, 251, 148, 98}, {205, 251, 148, 138}, {205, 251, 150, 146}, {205, 251, 150, 194}, {205, 251, 150, 210}, {205, 251, 150, 218}, {205, 251, 150, 226}, {205, 251, 150, 234}, {205, 251, 151, 42}}}, - {Region: models.PIARegion("US Las Vegas"), IPs: []net.IP{{162, 251, 236, 2}, {162, 251, 236, 4}, {162, 251, 236, 5}, {162, 251, 236, 7}, {162, 251, 236, 8}, {162, 251, 236, 9}, {199, 127, 56, 82}, {199, 127, 56, 83}, {199, 127, 56, 84}, {199, 127, 56, 86}, {199, 127, 56, 87}, {199, 127, 56, 88}, {199, 127, 56, 89}, {199, 127, 56, 91}, {199, 127, 56, 114}, {199, 127, 56, 115}, {199, 127, 56, 117}, {199, 127, 56, 118}, {199, 127, 56, 119}, {199, 127, 56, 121}}}, - {Region: models.PIARegion("US New York City"), IPs: []net.IP{{107, 182, 231, 32}, {107, 182, 231, 37}, {107, 182, 231, 39}, {173, 244, 223, 122}, {209, 95, 50, 14}, {209, 95, 50, 16}, {209, 95, 50, 50}, {209, 95, 50, 55}, {209, 95, 50, 85}, {209, 95, 50, 89}, {209, 95, 50, 92}, {209, 95, 50, 93}, {209, 95, 50, 95}, {209, 95, 50, 99}, {209, 95, 50, 107}, {209, 95, 50, 113}, {209, 95, 50, 132}, {209, 95, 50, 133}, {209, 95, 50, 135}, {209, 95, 51, 22}}}, - {Region: models.PIARegion("US Seattle"), IPs: []net.IP{{104, 200, 154, 9}, {104, 200, 154, 11}, {104, 200, 154, 19}, {104, 200, 154, 21}, {104, 200, 154, 29}, {104, 200, 154, 37}, {104, 200, 154, 41}, {104, 200, 154, 44}, {104, 200, 154, 51}, {104, 200, 154, 58}, {104, 200, 154, 63}, {104, 200, 154, 69}, {104, 200, 154, 70}, {104, 200, 154, 72}, {104, 200, 154, 78}, {104, 200, 154, 79}, {104, 200, 154, 84}, {104, 200, 154, 87}, {104, 200, 154, 88}, {104, 200, 154, 97}}}, - {Region: models.PIARegion("US Silicon Valley"), IPs: []net.IP{{199, 116, 118, 134}, {199, 116, 118, 137}, {199, 116, 118, 140}, {199, 116, 118, 148}, {199, 116, 118, 150}, {199, 116, 118, 156}, {199, 116, 118, 163}, {199, 116, 118, 166}, {199, 116, 118, 168}, {199, 116, 118, 169}, {199, 116, 118, 196}, {199, 116, 118, 202}, {199, 116, 118, 209}, {199, 116, 118, 211}, {199, 116, 118, 215}, {199, 116, 118, 226}, {199, 116, 118, 227}, {199, 116, 118, 236}, {199, 116, 118, 237}, {199, 116, 118, 246}}}, - {Region: models.PIARegion("US Texas"), IPs: []net.IP{{162, 216, 46, 21}, {162, 216, 46, 25}, {162, 216, 46, 40}, {162, 216, 46, 51}, {162, 216, 46, 56}, {162, 216, 46, 57}, {162, 216, 46, 72}, {162, 216, 46, 76}, {162, 216, 46, 81}, {162, 216, 46, 106}, {162, 216, 46, 107}, {162, 216, 46, 117}, {162, 216, 46, 119}, {162, 216, 46, 121}, {162, 216, 46, 131}, {162, 216, 46, 136}, {162, 216, 46, 139}, {162, 216, 46, 141}, {162, 216, 46, 164}, {162, 216, 46, 171}}}, - {Region: models.PIARegion("US Washington DC"), IPs: []net.IP{{70, 32, 0, 24}, {70, 32, 0, 46}, {70, 32, 0, 55}, {70, 32, 0, 76}, {70, 32, 0, 121}, {70, 32, 0, 137}, {70, 32, 0, 153}, {70, 32, 0, 155}, {70, 32, 0, 165}, {70, 32, 0, 166}, {70, 32, 0, 167}, {70, 32, 0, 168}, {70, 32, 0, 169}, {70, 32, 0, 170}, {70, 32, 0, 172}, {70, 32, 0, 173}, {70, 32, 0, 176}, {70, 32, 0, 177}, {70, 32, 0, 178}, {70, 32, 0, 179}}}, - {Region: models.PIARegion("US West"), IPs: []net.IP{{104, 200, 151, 9}, {104, 200, 151, 13}, {104, 200, 151, 16}, {104, 200, 151, 17}, {104, 200, 151, 23}, {104, 200, 151, 24}, {104, 200, 151, 32}, {104, 200, 151, 35}, {104, 200, 151, 36}, {104, 200, 151, 37}, {104, 200, 151, 39}, {104, 200, 151, 41}, {104, 200, 151, 43}, {104, 200, 151, 47}, {104, 200, 151, 54}, {104, 200, 151, 59}, {104, 200, 151, 73}, {104, 200, 151, 75}, {104, 200, 151, 76}, {104, 200, 151, 88}}}, + {Region: "AU Melbourne", IPs: []net.IP{{27, 50, 82, 131}, {27, 50, 82, 133}, {43, 250, 204, 81}, {43, 250, 204, 83}, {43, 250, 204, 89}, {43, 250, 204, 93}, {43, 250, 204, 95}, {43, 250, 204, 97}, {43, 250, 204, 99}, {43, 250, 204, 101}, {43, 250, 204, 103}, {43, 250, 204, 109}, {43, 250, 204, 111}, {43, 250, 204, 115}, {43, 250, 204, 117}, {43, 250, 204, 119}, {43, 250, 204, 123}, {43, 250, 204, 125}, {118, 127, 62, 227}, {221, 121, 139, 175}}}, + {Region: "AU Perth", IPs: []net.IP{{43, 250, 205, 59}, {43, 250, 205, 95}}}, + {Region: "AU Sydney", IPs: []net.IP{{27, 50, 70, 87}, {27, 50, 81, 117}, {103, 13, 102, 113}, {103, 13, 102, 119}, {103, 13, 102, 121}, {103, 13, 102, 123}, {103, 13, 102, 127}, {118, 127, 60, 53}, {118, 127, 60, 61}, {221, 121, 145, 145}, {221, 121, 145, 147}}}, + {Region: "Austria", IPs: []net.IP{{185, 210, 219, 147}, {185, 210, 219, 154}, {185, 210, 219, 155}, {185, 216, 34, 226}, {185, 216, 34, 227}, {185, 216, 34, 228}, {185, 216, 34, 229}, {185, 216, 34, 230}, {185, 216, 34, 231}, {185, 216, 34, 232}, {185, 216, 34, 233}, {185, 216, 34, 236}, {185, 216, 34, 237}, {185, 216, 34, 238}}}, + {Region: "Belgium", IPs: []net.IP{{77, 243, 191, 18}, {77, 243, 191, 19}, {77, 243, 191, 20}, {77, 243, 191, 22}, {77, 243, 191, 26}, {77, 243, 191, 27}, {185, 104, 186, 26}, {185, 232, 21, 29}}}, + {Region: "CA Montreal", IPs: []net.IP{{199, 229, 249, 130}, {199, 229, 249, 136}, {199, 229, 249, 141}, {199, 229, 249, 146}, {199, 229, 249, 149}, {199, 229, 249, 151}, {199, 229, 249, 155}, {199, 229, 249, 157}, {199, 229, 249, 178}, {199, 229, 249, 184}, {199, 229, 249, 185}, {199, 229, 249, 189}, {199, 229, 249, 190}, {199, 229, 249, 200}}}, + {Region: "CA Toronto", IPs: []net.IP{{172, 98, 67, 5}, {172, 98, 67, 6}, {172, 98, 67, 9}, {172, 98, 67, 12}, {172, 98, 67, 16}, {172, 98, 67, 17}, {172, 98, 67, 20}, {172, 98, 67, 31}, {172, 98, 67, 34}, {172, 98, 67, 45}, {172, 98, 67, 47}, {172, 98, 67, 48}, {172, 98, 67, 49}, {172, 98, 67, 60}, {172, 98, 67, 68}, {172, 98, 67, 73}, {172, 98, 67, 76}, {172, 98, 67, 82}, {172, 98, 67, 90}, {172, 98, 67, 95}}}, + {Region: "CA Vancouver", IPs: []net.IP{{107, 181, 189, 71}, {107, 181, 189, 77}, {107, 181, 189, 83}, {172, 83, 40, 20}, {172, 83, 40, 23}, {172, 83, 40, 26}, {172, 83, 40, 99}, {172, 83, 40, 104}, {172, 83, 40, 106}, {172, 83, 40, 111}, {172, 83, 40, 112}}}, + {Region: "Czech Republic", IPs: []net.IP{{89, 238, 186, 228}, {89, 238, 186, 229}, {89, 238, 186, 230}, {185, 216, 35, 66}, {185, 216, 35, 67}, {185, 216, 35, 68}, {185, 216, 35, 69}, {185, 242, 6, 26}, {185, 242, 6, 27}, {185, 242, 6, 28}, {185, 242, 6, 30}}}, + {Region: "DE Berlin", IPs: []net.IP{{185, 230, 127, 228}, {185, 230, 127, 231}, {185, 230, 127, 233}, {185, 230, 127, 234}, {185, 230, 127, 236}, {185, 230, 127, 237}, {185, 230, 127, 240}, {185, 230, 127, 241}, {185, 230, 127, 243}, {193, 176, 86, 122}, {193, 176, 86, 123}, {193, 176, 86, 124}, {193, 176, 86, 130}, {193, 176, 86, 142}, {193, 176, 86, 146}, {193, 176, 86, 154}, {193, 176, 86, 158}, {193, 176, 86, 166}, {193, 176, 86, 178}, {194, 36, 108, 6}}}, + {Region: "DE Frankfurt", IPs: []net.IP{{185, 220, 70, 132}, {185, 220, 70, 133}, {185, 220, 70, 134}, {185, 220, 70, 136}, {185, 220, 70, 138}, {185, 220, 70, 139}, {185, 220, 70, 140}, {185, 220, 70, 143}, {185, 220, 70, 145}, {185, 220, 70, 147}, {185, 220, 70, 148}, {185, 220, 70, 149}, {185, 220, 70, 150}, {185, 220, 70, 152}, {185, 220, 70, 153}, {185, 220, 70, 162}, {185, 220, 70, 164}, {185, 220, 70, 166}, {185, 220, 70, 172}, {185, 220, 70, 174}}}, + {Region: "Denmark", IPs: []net.IP{{82, 102, 20, 162}, {82, 102, 20, 163}, {82, 102, 20, 164}, {82, 102, 20, 165}, {82, 102, 20, 166}, {82, 102, 20, 168}, {82, 102, 20, 169}, {82, 102, 20, 170}, {82, 102, 20, 171}, {82, 102, 20, 172}, {82, 102, 20, 173}, {82, 102, 20, 174}, {82, 102, 20, 175}, {82, 102, 20, 176}, {82, 102, 20, 177}, {82, 102, 20, 178}, {82, 102, 20, 179}, {82, 102, 20, 180}, {82, 102, 20, 182}, {82, 102, 20, 183}}}, + {Region: "Finlan", IPs: []net.IP{{196, 244, 191, 2}, {196, 244, 191, 10}, {196, 244, 191, 18}, {196, 244, 191, 26}, {196, 244, 191, 42}, {196, 244, 191, 50}, {196, 244, 191, 58}, {196, 244, 191, 74}, {196, 244, 191, 82}, {196, 244, 191, 90}, {196, 244, 191, 98}, {196, 244, 191, 106}, {196, 244, 191, 114}, {196, 244, 191, 122}, {196, 244, 191, 138}, {196, 244, 191, 146}}}, + {Region: "France", IPs: []net.IP{{194, 99, 106, 148}, {194, 187, 249, 35}, {194, 187, 249, 37}, {194, 187, 249, 38}, {194, 187, 249, 39}, {194, 187, 249, 43}, {194, 187, 249, 44}, {194, 187, 249, 47}, {194, 187, 249, 48}, {194, 187, 249, 54}, {194, 187, 249, 57}, {194, 187, 249, 59}, {194, 187, 249, 61}, {194, 187, 249, 62}, {194, 187, 249, 179}, {194, 187, 249, 180}, {194, 187, 249, 182}, {194, 187, 249, 183}, {194, 187, 249, 187}, {194, 187, 249, 190}}}, + {Region: "Hong Kong", IPs: []net.IP{{84, 17, 37, 1}, {84, 17, 37, 23}, {84, 17, 37, 45}, {119, 81, 135, 2}, {119, 81, 135, 5}, {119, 81, 135, 28}, {119, 81, 135, 29}, {119, 81, 135, 47}, {119, 81, 135, 51}, {119, 81, 135, 53}, {119, 81, 253, 212}, {119, 81, 253, 218}, {119, 81, 253, 226}, {119, 81, 253, 227}, {119, 81, 253, 229}, {119, 81, 253, 230}, {119, 81, 253, 241}, {119, 81, 253, 242}, {161, 202, 39, 240}, {161, 202, 44, 94}}}, + {Region: "Hungary", IPs: []net.IP{{185, 128, 26, 18}, {185, 128, 26, 19}, {185, 128, 26, 20}, {185, 128, 26, 21}, {185, 128, 26, 22}, {185, 128, 26, 23}, {185, 128, 26, 24}, {185, 189, 114, 98}}}, + {Region: "India", IPs: []net.IP{{150, 242, 12, 155}, {150, 242, 12, 171}, {150, 242, 12, 187}}}, + {Region: "Ireland", IPs: []net.IP{{23, 92, 127, 2}, {23, 92, 127, 10}, {23, 92, 127, 18}, {23, 92, 127, 34}, {23, 92, 127, 42}, {23, 92, 127, 50}, {23, 92, 127, 58}, {23, 92, 127, 66}}}, + {Region: "Israel", IPs: []net.IP{{31, 168, 172, 136}, {31, 168, 172, 142}, {31, 168, 172, 143}, {31, 168, 172, 145}, {31, 168, 172, 146}, {31, 168, 172, 147}}}, + {Region: "Italy", IPs: []net.IP{{82, 102, 21, 98}, {82, 102, 21, 211}, {82, 102, 21, 214}, {82, 102, 21, 217}}}, + {Region: "Japan", IPs: []net.IP{{103, 208, 220, 130}, {103, 208, 220, 132}, {103, 208, 220, 135}, {103, 208, 220, 138}}}, + {Region: "Luxembourg", IPs: []net.IP{{92, 223, 89, 133}, {92, 223, 89, 134}, {92, 223, 89, 135}, {92, 223, 89, 136}, {92, 223, 89, 137}, {92, 223, 89, 138}, {92, 223, 89, 140}, {92, 223, 89, 142}}}, + {Region: "Mexico", IPs: []net.IP{{169, 57, 0, 200}, {169, 57, 0, 205}, {169, 57, 0, 211}, {169, 57, 0, 212}, {169, 57, 0, 214}, {169, 57, 0, 217}, {169, 57, 0, 218}, {169, 57, 0, 219}, {169, 57, 0, 221}, {169, 57, 0, 224}, {169, 57, 0, 225}, {169, 57, 0, 229}, {169, 57, 0, 230}, {169, 57, 0, 231}, {169, 57, 0, 233}, {169, 57, 0, 235}, {169, 57, 0, 238}, {169, 57, 0, 243}, {169, 57, 0, 247}, {169, 57, 0, 248}}}, + {Region: "Netherlands", IPs: []net.IP{{46, 166, 138, 145}, {46, 166, 138, 161}, {46, 166, 138, 170}, {46, 166, 138, 175}, {46, 166, 186, 247}, {46, 166, 188, 202}, {46, 166, 188, 216}, {46, 166, 190, 176}, {46, 166, 190, 179}, {46, 166, 190, 182}, {46, 166, 190, 183}, {46, 166, 190, 184}, {46, 166, 190, 186}, {46, 166, 190, 194}, {46, 166, 190, 219}, {46, 166, 190, 222}, {46, 166, 190, 227}, {46, 166, 190, 236}, {77, 247, 182, 241}, {109, 201, 154, 182}}}, + {Region: "New Zealand", IPs: []net.IP{{103, 231, 90, 171}, {103, 231, 90, 172}, {103, 231, 90, 173}, {103, 231, 90, 174}, {103, 231, 91, 34}, {103, 231, 91, 66}, {103, 231, 91, 67}, {103, 231, 91, 69}, {103, 231, 91, 70}, {103, 231, 91, 74}}}, + {Region: "Norway", IPs: []net.IP{{82, 102, 27, 50}, {82, 102, 27, 51}, {82, 102, 27, 52}, {82, 102, 27, 53}, {82, 102, 27, 54}, {82, 102, 27, 55}, {82, 102, 27, 56}, {82, 102, 27, 57}, {82, 102, 27, 74}, {82, 102, 27, 75}, {82, 102, 27, 76}, {82, 102, 27, 116}, {82, 102, 27, 117}, {82, 102, 27, 118}, {82, 102, 27, 125}, {82, 102, 27, 126}, {185, 206, 225, 222}, {185, 253, 97, 226}, {185, 253, 97, 227}, {185, 253, 97, 228}}}, + {Region: "Poland", IPs: []net.IP{{185, 244, 214, 14}, {185, 244, 214, 194}, {185, 244, 214, 196}, {185, 244, 214, 197}, {185, 244, 214, 198}, {185, 244, 214, 199}, {185, 244, 214, 200}}}, + {Region: "Romania", IPs: []net.IP{{86, 105, 25, 66}, {86, 105, 25, 68}, {86, 105, 25, 69}, {86, 105, 25, 70}, {86, 105, 25, 74}, {86, 105, 25, 75}, {86, 105, 25, 76}, {86, 105, 25, 77}, {86, 105, 25, 78}, {89, 33, 8, 38}, {89, 33, 8, 42}, {94, 176, 148, 34}, {94, 176, 148, 35}, {185, 45, 12, 126}, {185, 210, 218, 98}, {185, 210, 218, 99}, {185, 210, 218, 100}, {185, 210, 218, 101}, {185, 210, 218, 104}, {185, 210, 218, 105}}}, + {Region: "Singapore", IPs: []net.IP{{37, 120, 208, 66}, {37, 120, 208, 67}, {37, 120, 208, 68}, {37, 120, 208, 69}, {37, 120, 208, 71}, {37, 120, 208, 72}, {37, 120, 208, 73}, {37, 120, 208, 74}, {37, 120, 208, 75}, {37, 120, 208, 76}, {37, 120, 208, 77}, {37, 120, 208, 78}, {37, 120, 208, 79}, {37, 120, 208, 80}, {37, 120, 208, 81}, {37, 120, 208, 82}, {37, 120, 208, 83}}}, + {Region: "Spain", IPs: []net.IP{{37, 120, 148, 86}, {185, 230, 124, 53}, {194, 99, 104, 30}}}, + {Region: "Sweden", IPs: []net.IP{{45, 12, 220, 165}, {45, 12, 220, 171}, {45, 12, 220, 197}, {45, 12, 220, 199}, {45, 12, 220, 203}, {45, 12, 220, 205}, {45, 12, 220, 207}, {45, 12, 220, 208}, {45, 12, 220, 210}, {45, 12, 220, 213}, {45, 12, 220, 215}, {45, 12, 220, 221}, {45, 12, 220, 222}, {45, 12, 220, 236}, {45, 12, 220, 241}, {45, 12, 220, 249}, {45, 12, 220, 253}, {45, 83, 91, 20}, {45, 83, 91, 26}, {45, 83, 91, 28}}}, + {Region: "Switzerland", IPs: []net.IP{{82, 102, 24, 250}, {82, 102, 24, 252}, {91, 132, 136, 45}, {91, 132, 136, 53}, {185, 156, 175, 86}, {185, 156, 175, 93}, {185, 212, 170, 180}, {185, 212, 170, 183}, {185, 230, 125, 34}, {185, 230, 125, 35}, {185, 230, 125, 36}, {185, 230, 125, 38}, {185, 230, 125, 43}, {185, 230, 125, 45}, {185, 230, 125, 49}, {185, 230, 125, 51}, {185, 230, 125, 86}, {195, 206, 105, 215}, {195, 206, 105, 216}, {212, 102, 36, 1}}}, + {Region: "UAE", IPs: []net.IP{{45, 9, 250, 42}, {45, 9, 250, 46}, {45, 9, 250, 62}}}, + {Region: "UK London", IPs: []net.IP{{89, 238, 150, 8}, {89, 238, 150, 10}, {89, 238, 150, 17}, {89, 238, 150, 20}, {89, 238, 150, 21}, {89, 238, 150, 22}, {89, 238, 150, 23}, {89, 238, 154, 19}, {89, 238, 154, 116}, {89, 238, 154, 117}, {89, 238, 154, 124}, {89, 238, 154, 125}, {89, 238, 154, 165}, {89, 238, 154, 169}, {89, 238, 154, 171}, {89, 238, 154, 173}, {89, 238, 154, 228}, {89, 238, 154, 239}, {89, 238, 154, 247}, {185, 253, 98, 94}}}, + {Region: "UK Manchester", IPs: []net.IP{{89, 238, 137, 37}, {89, 238, 137, 39}, {89, 238, 137, 40}, {89, 238, 137, 41}, {89, 238, 137, 42}, {89, 238, 137, 43}, {89, 238, 139, 4}, {89, 238, 139, 5}, {89, 238, 139, 7}, {89, 238, 139, 8}, {89, 238, 139, 9}, {89, 238, 139, 10}, {89, 238, 139, 11}, {89, 238, 139, 12}, {89, 238, 139, 13}, {89, 238, 139, 52}, {89, 238, 139, 53}, {89, 238, 139, 55}, {89, 238, 139, 57}, {89, 238, 139, 58}}}, + {Region: "UK Southampton", IPs: []net.IP{{31, 24, 226, 132}, {31, 24, 226, 136}, {31, 24, 226, 147}, {31, 24, 226, 186}, {31, 24, 226, 188}, {31, 24, 226, 204}, {31, 24, 226, 205}, {31, 24, 226, 209}, {31, 24, 226, 219}, {31, 24, 226, 220}, {31, 24, 226, 222}, {31, 24, 226, 224}, {31, 24, 226, 225}, {31, 24, 226, 227}, {31, 24, 226, 232}, {31, 24, 226, 233}, {31, 24, 226, 235}, {31, 24, 226, 236}, {31, 24, 226, 241}, {31, 24, 226, 244}}}, + {Region: "US Atlanta", IPs: []net.IP{{66, 115, 168, 10}, {66, 115, 168, 19}, {66, 115, 168, 21}, {66, 115, 168, 23}, {66, 115, 168, 26}, {66, 115, 168, 28}, {66, 115, 169, 195}, {66, 115, 169, 209}, {66, 115, 169, 217}, {66, 115, 169, 218}, {66, 115, 169, 221}, {66, 115, 169, 226}, {66, 115, 169, 230}, {66, 115, 169, 233}, {66, 115, 169, 235}, {66, 115, 169, 237}, {66, 115, 169, 239}, {66, 115, 169, 240}, {66, 115, 169, 242}, {66, 115, 169, 244}}}, + {Region: "US California", IPs: []net.IP{{91, 207, 175, 53}, {91, 207, 175, 70}, {91, 207, 175, 71}, {91, 207, 175, 99}, {91, 207, 175, 101}, {91, 207, 175, 104}, {91, 207, 175, 110}, {91, 207, 175, 112}, {91, 207, 175, 166}, {91, 207, 175, 170}, {91, 207, 175, 177}, {91, 207, 175, 178}, {91, 207, 175, 207}, {91, 207, 175, 227}, {91, 207, 175, 228}, {91, 207, 175, 236}, {91, 207, 175, 252}, {185, 245, 87, 179}, {185, 245, 87, 216}, {212, 103, 49, 162}}}, + {Region: "US Chicago", IPs: []net.IP{{104, 200, 153, 96}, {199, 116, 115, 130}, {199, 116, 115, 131}, {199, 116, 115, 132}, {199, 116, 115, 133}, {199, 116, 115, 134}, {199, 116, 115, 135}, {199, 116, 115, 136}, {199, 116, 115, 137}, {199, 116, 115, 138}, {199, 116, 115, 139}, {199, 116, 115, 140}, {199, 116, 115, 141}, {199, 116, 115, 142}, {199, 116, 115, 143}, {199, 116, 115, 144}, {199, 116, 115, 145}, {199, 116, 115, 146}, {199, 116, 115, 147}, {199, 116, 115, 148}}}, + {Region: "US Denver", IPs: []net.IP{{174, 128, 225, 2}, {174, 128, 225, 106}, {174, 128, 225, 186}, {174, 128, 226, 10}, {174, 128, 226, 18}, {174, 128, 227, 226}, {174, 128, 242, 234}, {174, 128, 243, 114}, {174, 128, 243, 122}, {174, 128, 245, 106}, {174, 128, 250, 18}, {198, 148, 82, 82}, {198, 148, 88, 250}, {199, 115, 97, 202}, {199, 115, 98, 146}, {199, 115, 98, 226}, {199, 115, 99, 82}, {199, 115, 99, 218}, {199, 115, 101, 178}, {199, 115, 102, 154}}}, + {Region: "US East", IPs: []net.IP{{193, 37, 253, 50}, {193, 37, 253, 52}, {193, 37, 253, 105}, {193, 37, 253, 136}, {193, 37, 253, 137}, {194, 59, 251, 27}, {194, 59, 251, 37}, {194, 59, 251, 52}, {194, 59, 251, 68}, {194, 59, 251, 78}, {194, 59, 251, 80}, {194, 59, 251, 85}, {194, 59, 251, 87}, {194, 59, 251, 108}, {194, 59, 251, 136}, {194, 59, 251, 141}, {194, 59, 251, 166}, {194, 59, 251, 168}, {194, 59, 251, 218}, {194, 59, 251, 248}}}, + {Region: "US Florida", IPs: []net.IP{{193, 37, 252, 3}, {193, 37, 252, 6}, {193, 37, 252, 8}, {193, 37, 252, 11}, {193, 37, 252, 16}, {193, 37, 252, 19}, {193, 37, 252, 21}, {193, 37, 252, 48}, {193, 37, 252, 51}, {193, 37, 252, 53}, {193, 37, 252, 54}, {193, 37, 252, 58}, {193, 37, 252, 59}, {193, 37, 252, 70}, {193, 37, 252, 78}, {193, 37, 252, 82}, {193, 37, 252, 102}, {193, 37, 252, 105}, {193, 37, 252, 123}, {193, 37, 252, 126}}}, + {Region: "US Houston", IPs: []net.IP{{74, 81, 88, 26}, {74, 81, 88, 42}, {74, 81, 88, 58}, {74, 81, 88, 66}, {74, 81, 88, 114}, {74, 81, 88, 130}, {205, 251, 148, 34}, {205, 251, 148, 42}, {205, 251, 148, 66}, {205, 251, 148, 74}, {205, 251, 148, 82}, {205, 251, 148, 98}, {205, 251, 148, 138}, {205, 251, 150, 146}, {205, 251, 150, 194}, {205, 251, 150, 210}, {205, 251, 150, 218}, {205, 251, 150, 226}, {205, 251, 150, 234}, {205, 251, 151, 42}}}, + {Region: "US Las Vegas", IPs: []net.IP{{162, 251, 236, 2}, {162, 251, 236, 4}, {162, 251, 236, 5}, {162, 251, 236, 7}, {162, 251, 236, 8}, {162, 251, 236, 9}, {199, 127, 56, 82}, {199, 127, 56, 83}, {199, 127, 56, 84}, {199, 127, 56, 86}, {199, 127, 56, 87}, {199, 127, 56, 88}, {199, 127, 56, 89}, {199, 127, 56, 91}, {199, 127, 56, 114}, {199, 127, 56, 115}, {199, 127, 56, 117}, {199, 127, 56, 118}, {199, 127, 56, 119}, {199, 127, 56, 121}}}, + {Region: "US New York City", IPs: []net.IP{{107, 182, 231, 32}, {107, 182, 231, 37}, {107, 182, 231, 39}, {173, 244, 223, 122}, {209, 95, 50, 14}, {209, 95, 50, 16}, {209, 95, 50, 50}, {209, 95, 50, 55}, {209, 95, 50, 85}, {209, 95, 50, 89}, {209, 95, 50, 92}, {209, 95, 50, 93}, {209, 95, 50, 95}, {209, 95, 50, 99}, {209, 95, 50, 107}, {209, 95, 50, 113}, {209, 95, 50, 132}, {209, 95, 50, 133}, {209, 95, 50, 135}, {209, 95, 51, 22}}}, + {Region: "US Seattle", IPs: []net.IP{{104, 200, 154, 9}, {104, 200, 154, 11}, {104, 200, 154, 19}, {104, 200, 154, 21}, {104, 200, 154, 29}, {104, 200, 154, 37}, {104, 200, 154, 41}, {104, 200, 154, 44}, {104, 200, 154, 51}, {104, 200, 154, 58}, {104, 200, 154, 63}, {104, 200, 154, 69}, {104, 200, 154, 70}, {104, 200, 154, 72}, {104, 200, 154, 78}, {104, 200, 154, 79}, {104, 200, 154, 84}, {104, 200, 154, 87}, {104, 200, 154, 88}, {104, 200, 154, 97}}}, + {Region: "US Silicon Valley", IPs: []net.IP{{199, 116, 118, 134}, {199, 116, 118, 137}, {199, 116, 118, 140}, {199, 116, 118, 148}, {199, 116, 118, 150}, {199, 116, 118, 156}, {199, 116, 118, 163}, {199, 116, 118, 166}, {199, 116, 118, 168}, {199, 116, 118, 169}, {199, 116, 118, 196}, {199, 116, 118, 202}, {199, 116, 118, 209}, {199, 116, 118, 211}, {199, 116, 118, 215}, {199, 116, 118, 226}, {199, 116, 118, 227}, {199, 116, 118, 236}, {199, 116, 118, 237}, {199, 116, 118, 246}}}, + {Region: "US Texas", IPs: []net.IP{{162, 216, 46, 21}, {162, 216, 46, 25}, {162, 216, 46, 40}, {162, 216, 46, 51}, {162, 216, 46, 56}, {162, 216, 46, 57}, {162, 216, 46, 72}, {162, 216, 46, 76}, {162, 216, 46, 81}, {162, 216, 46, 106}, {162, 216, 46, 107}, {162, 216, 46, 117}, {162, 216, 46, 119}, {162, 216, 46, 121}, {162, 216, 46, 131}, {162, 216, 46, 136}, {162, 216, 46, 139}, {162, 216, 46, 141}, {162, 216, 46, 164}, {162, 216, 46, 171}}}, + {Region: "US Washington DC", IPs: []net.IP{{70, 32, 0, 24}, {70, 32, 0, 46}, {70, 32, 0, 55}, {70, 32, 0, 76}, {70, 32, 0, 121}, {70, 32, 0, 137}, {70, 32, 0, 153}, {70, 32, 0, 155}, {70, 32, 0, 165}, {70, 32, 0, 166}, {70, 32, 0, 167}, {70, 32, 0, 168}, {70, 32, 0, 169}, {70, 32, 0, 170}, {70, 32, 0, 172}, {70, 32, 0, 173}, {70, 32, 0, 176}, {70, 32, 0, 177}, {70, 32, 0, 178}, {70, 32, 0, 179}}}, + {Region: "US West", IPs: []net.IP{{104, 200, 151, 9}, {104, 200, 151, 13}, {104, 200, 151, 16}, {104, 200, 151, 17}, {104, 200, 151, 23}, {104, 200, 151, 24}, {104, 200, 151, 32}, {104, 200, 151, 35}, {104, 200, 151, 36}, {104, 200, 151, 37}, {104, 200, 151, 39}, {104, 200, 151, 41}, {104, 200, 151, 43}, {104, 200, 151, 47}, {104, 200, 151, 54}, {104, 200, 151, 59}, {104, 200, 151, 73}, {104, 200, 151, 75}, {104, 200, 151, 76}, {104, 200, 151, 88}}}, } } diff --git a/internal/constants/splash.go b/internal/constants/splash.go index 71c85ce8..7db053eb 100644 --- a/internal/constants/splash.go +++ b/internal/constants/splash.go @@ -2,9 +2,9 @@ package constants const ( // Announcement is a message announcement - Announcement = "New VPN provider supported surfshark.com" + Announcement = "Big code refactor, things may break but I'll fix them quickly!" // AnnouncementExpiration is the expiration date of the announcement in format yyyy-mm-dd - AnnouncementExpiration = "2020-06-20" + AnnouncementExpiration = "2020-06-25" ) const ( diff --git a/internal/constants/surfshark.go b/internal/constants/surfshark.go index 15e21625..8cf7aa54 100644 --- a/internal/constants/surfshark.go +++ b/internal/constants/surfshark.go @@ -11,164 +11,164 @@ const ( SurfsharkOpenvpnStaticKeyV1 = "b02cb1d7c6fee5d4f89b8de72b51a8d0c7b282631d6fc19be1df6ebae9e2779e6d9f097058a31c97f57f0c35526a44ae09a01d1284b50b954d9246725a1ead1ff224a102ed9ab3da0152a15525643b2eee226c37041dc55539d475183b889a10e18bb94f079a4a49888da566b99783460ece01daaf93548beea6c827d9674897e7279ff1a19cb092659e8c1860fbad0db4ad0ad5732f1af4655dbd66214e552f04ed8fd0104e1d4bf99c249ac229ce169d9ba22068c6c0ab742424760911d4636aafb4b85f0c952a9ce4275bc821391aa65fcd0d2394f006e3fba0fd34c4bc4ab260f4b45dec3285875589c97d3087c9134d3a3aa2f904512e85aa2dc2202498" ) -func SurfsharkServers() []models.SurfsharkServer { - return []models.SurfsharkServer{ - {Region: models.SurfsharkRegion("Albania"), IPs: []net.IP{{31, 171, 152, 195}, {31, 171, 152, 197}, {31, 171, 154, 147}, {31, 171, 154, 149}, {31, 171, 154, 163}, {31, 171, 154, 165}}}, - {Region: models.SurfsharkRegion("Australia Adelaide"), IPs: []net.IP{{45, 248, 79, 19}, {45, 248, 79, 21}, {45, 248, 79, 27}, {45, 248, 79, 29}, {45, 248, 79, 35}, {45, 248, 79, 37}, {45, 248, 79, 51}, {45, 248, 79, 53}, {45, 248, 79, 67}, {45, 248, 79, 69}, {45, 248, 79, 83}, {45, 248, 79, 85}}}, - {Region: models.SurfsharkRegion("Australia Brisbane"), IPs: []net.IP{{45, 248, 77, 235}, {45, 248, 77, 237}, {144, 48, 39, 11}, {144, 48, 39, 13}, {144, 48, 39, 67}, {144, 48, 39, 69}, {144, 48, 39, 83}, {144, 48, 39, 85}, {144, 48, 39, 107}, {144, 48, 39, 109}, {144, 48, 39, 123}, {144, 48, 39, 125}, {144, 48, 39, 131}, {144, 48, 39, 133}}}, - {Region: models.SurfsharkRegion("Australia Melbourne"), IPs: []net.IP{{103, 192, 80, 131}, {103, 192, 80, 133}, {103, 192, 80, 139}, {103, 192, 80, 141}, {103, 192, 80, 147}, {103, 192, 80, 149}, {144, 48, 38, 19}, {144, 48, 38, 21}, {144, 48, 38, 139}, {144, 48, 38, 141}, {144, 48, 38, 147}, {144, 48, 38, 149}, {144, 48, 38, 179}, {144, 48, 38, 181}, {144, 48, 38, 183}}}, - {Region: models.SurfsharkRegion("Australia Perth"), IPs: []net.IP{{45, 248, 78, 43}, {45, 248, 78, 45}, {124, 150, 139, 27}, {124, 150, 139, 29}, {124, 150, 139, 35}, {124, 150, 139, 37}, {124, 150, 139, 43}, {124, 150, 139, 45}, {124, 150, 139, 123}, {124, 150, 139, 125}, {124, 150, 139, 179}, {124, 150, 139, 181}}}, - {Region: models.SurfsharkRegion("Australia Sydney"), IPs: []net.IP{{45, 125, 247, 43}, {45, 125, 247, 45}, {45, 125, 247, 91}, {45, 125, 247, 93}, {45, 125, 247, 195}, {45, 125, 247, 197}, {45, 248, 76, 171}, {45, 248, 76, 173}, {103, 25, 59, 51}, {103, 25, 59, 53}, {103, 25, 59, 83}, {103, 25, 59, 85}, {103, 25, 59, 87}, {180, 149, 228, 115}, {180, 149, 228, 117}}}, - {Region: models.SurfsharkRegion("Australia US"), IPs: []net.IP{{45, 76, 117, 108}}}, - {Region: models.SurfsharkRegion("Austria"), IPs: []net.IP{{5, 253, 207, 51}, {5, 253, 207, 53}, {5, 253, 207, 83}, {5, 253, 207, 85}, {37, 120, 212, 75}, {37, 120, 212, 77}, {37, 120, 212, 131}, {37, 120, 212, 133}, {37, 120, 212, 139}, {37, 120, 212, 141}, {37, 120, 212, 147}, {37, 120, 212, 149}, {91, 132, 139, 99}, {91, 132, 139, 101}, {91, 132, 139, 105}, {91, 132, 139, 107}}}, - {Region: models.SurfsharkRegion("Azerbaijan"), IPs: []net.IP{{94, 20, 21, 85}, {94, 20, 21, 87}}}, - {Region: models.SurfsharkRegion("Belgium"), IPs: []net.IP{{5, 253, 205, 99}, {5, 253, 205, 101}, {5, 253, 205, 179}, {5, 253, 205, 181}, {5, 253, 205, 211}, {5, 253, 205, 213}, {5, 253, 205, 227}, {5, 253, 205, 229}, {37, 120, 143, 117}, {37, 120, 143, 121}, {37, 120, 143, 125}, {37, 120, 218, 251}, {37, 120, 218, 253}, {89, 249, 73, 195}, {89, 249, 73, 197}, {185, 104, 186, 75}, {185, 104, 186, 77}, {185, 232, 21, 51}, {185, 232, 21, 53}}}, - {Region: models.SurfsharkRegion("Bosnia and Herzegovina "), IPs: []net.IP{{185, 99, 3, 12}, {185, 99, 3, 207}, {185, 99, 3, 214}, {185, 164, 34, 252}, {185, 212, 111, 6}, {185, 212, 111, 41}, {185, 212, 111, 59}}}, - {Region: models.SurfsharkRegion("Brazil"), IPs: []net.IP{{181, 215, 183, 244}, {181, 215, 183, 248}, {191, 96, 70, 171}}}, - {Region: models.SurfsharkRegion("Bulgaria"), IPs: []net.IP{{37, 120, 152, 35}, {37, 120, 152, 37}, {37, 120, 152, 39}, {37, 120, 152, 195}, {37, 120, 152, 197}, {217, 138, 202, 19}, {217, 138, 202, 21}}}, - {Region: models.SurfsharkRegion("Canada Montreal"), IPs: []net.IP{{172, 98, 82, 83}, {172, 98, 82, 85}, {172, 98, 82, 243}, {172, 98, 82, 245}, {198, 8, 85, 3}, {198, 8, 85, 5}, {198, 8, 85, 19}, {198, 8, 85, 21}, {198, 8, 85, 35}, {198, 8, 85, 37}, {198, 8, 85, 40}, {198, 8, 85, 42}, {198, 8, 85, 45}, {198, 8, 85, 47}, {198, 8, 85, 69}, {198, 8, 85, 72}, {198, 8, 85, 74}, {198, 8, 85, 77}, {198, 8, 85, 79}, {198, 8, 85, 82}, {198, 8, 85, 84}, {198, 8, 85, 87}, {198, 8, 85, 131}, {198, 8, 85, 133}}}, - {Region: models.SurfsharkRegion("Canada Toronto"), IPs: []net.IP{{68, 71, 244, 131}, {68, 71, 244, 134}, {68, 71, 244, 195}, {68, 71, 244, 197}, {68, 71, 244, 200}, {68, 71, 244, 202}, {68, 71, 244, 210}, {68, 71, 244, 212}, {68, 71, 244, 215}, {68, 71, 244, 217}, {68, 71, 244, 220}, {68, 71, 244, 222}, {104, 200, 138, 3}, {104, 200, 138, 5}, {104, 200, 138, 7}, {104, 200, 138, 147}, {104, 200, 138, 149}, {104, 200, 138, 152}, {104, 200, 138, 154}, {104, 200, 138, 163}, {104, 200, 138, 165}, {162, 253, 71, 211}, {162, 253, 71, 213}, {162, 253, 71, 215}}}, - {Region: models.SurfsharkRegion("Canada US"), IPs: []net.IP{{159, 203, 57, 80}}}, - {Region: models.SurfsharkRegion("Canada Vancouver"), IPs: []net.IP{{66, 115, 147, 67}, {66, 115, 147, 69}, {66, 115, 147, 72}, {66, 115, 147, 74}, {66, 115, 147, 79}, {66, 115, 147, 82}, {66, 115, 147, 84}, {66, 115, 147, 87}, {66, 115, 147, 89}, {66, 115, 147, 92}, {66, 115, 147, 94}, {104, 200, 132, 35}, {104, 200, 132, 37}, {104, 200, 132, 39}, {107, 181, 177, 179}, {107, 181, 177, 181}, {107, 181, 177, 183}, {172, 83, 40, 147}, {172, 83, 40, 149}, {208, 78, 41, 195}, {208, 78, 41, 197}, {208, 78, 41, 200}, {208, 78, 41, 202}}}, - {Region: models.SurfsharkRegion("Chile"), IPs: []net.IP{{31, 169, 121, 16}, {131, 221, 32, 195}}}, - {Region: models.SurfsharkRegion("Colombia"), IPs: []net.IP{{45, 129, 32, 15}}}, - {Region: models.SurfsharkRegion("Costa Rica"), IPs: []net.IP{{176, 227, 241, 21}}}, - {Region: models.SurfsharkRegion("Croatia"), IPs: []net.IP{{85, 10, 56, 226}, {85, 10, 56, 228}, {89, 164, 99, 109}, {89, 164, 99, 111}}}, - {Region: models.SurfsharkRegion("Cyprus"), IPs: []net.IP{{195, 47, 194, 40}, {195, 47, 194, 42}}}, - {Region: models.SurfsharkRegion("Czech Republic"), IPs: []net.IP{{95, 168, 209, 111}, {185, 152, 64, 151}, {185, 152, 64, 178}, {193, 9, 112, 179}, {193, 9, 112, 181}, {193, 9, 112, 183}, {193, 9, 112, 195}, {193, 9, 112, 197}, {193, 9, 112, 199}}}, - {Region: models.SurfsharkRegion("Denmark"), IPs: []net.IP{{37, 120, 145, 19}, {37, 120, 145, 21}, {37, 120, 194, 91}, {37, 120, 194, 93}, {37, 120, 194, 99}, {37, 120, 194, 101}, {37, 120, 194, 107}, {37, 120, 194, 109}, {37, 120, 194, 115}, {37, 120, 194, 117}, {37, 120, 194, 123}, {37, 120, 194, 125}, {37, 120, 194, 163}, {37, 120, 194, 165}, {45, 12, 221, 163}, {45, 12, 221, 165}, {45, 12, 221, 167}, {45, 12, 221, 179}, {45, 12, 221, 181}, {45, 12, 221, 183}, {95, 174, 65, 67}, {95, 174, 65, 69}, {95, 174, 65, 71}}}, - {Region: models.SurfsharkRegion("Estonia"), IPs: []net.IP{{165, 231, 163, 3}, {165, 231, 163, 5}, {165, 231, 163, 7}, {165, 231, 163, 19}, {165, 231, 163, 21}, {165, 231, 163, 23}, {185, 174, 159, 51}, {185, 174, 159, 53}, {185, 174, 159, 59}, {185, 174, 159, 61}, {185, 174, 159, 67}, {185, 174, 159, 69}}}, - {Region: models.SurfsharkRegion("Finland"), IPs: []net.IP{{196, 244, 191, 163}, {196, 244, 191, 165}, {196, 244, 191, 195}, {196, 244, 191, 197}}}, - {Region: models.SurfsharkRegion("France Bordeaux"), IPs: []net.IP{{185, 108, 106, 19}, {185, 108, 106, 21}, {185, 108, 106, 51}, {185, 108, 106, 53}, {185, 108, 106, 67}, {185, 108, 106, 69}, {185, 108, 106, 140}, {185, 108, 106, 142}, {185, 108, 106, 144}, {185, 108, 106, 146}, {185, 108, 106, 148}, {185, 108, 106, 150}, {185, 108, 106, 152}, {185, 108, 106, 154}, {185, 108, 106, 158}, {185, 108, 106, 160}, {185, 108, 106, 162}, {185, 108, 106, 164}, {185, 108, 106, 166}}}, - {Region: models.SurfsharkRegion("France Marseilles"), IPs: []net.IP{{185, 166, 84, 5}, {185, 166, 84, 19}, {185, 166, 84, 23}, {185, 166, 84, 29}, {185, 166, 84, 31}, {185, 166, 84, 36}, {185, 166, 84, 38}, {185, 166, 84, 51}, {185, 166, 84, 55}, {185, 166, 84, 57}, {185, 166, 84, 59}, {185, 166, 84, 61}, {185, 166, 84, 63}, {185, 166, 84, 75}, {185, 166, 84, 79}, {185, 166, 84, 81}, {185, 166, 84, 87}, {185, 166, 84, 89}, {185, 166, 84, 93}, {185, 166, 84, 95}}}, - {Region: models.SurfsharkRegion("France Paris"), IPs: []net.IP{{45, 83, 90, 179}, {45, 83, 90, 181}, {45, 83, 90, 183}, {45, 89, 174, 59}, {45, 89, 174, 61}, {45, 89, 174, 85}, {45, 89, 174, 91}, {45, 89, 174, 93}, {45, 89, 174, 101}, {45, 89, 174, 103}, {84, 17, 43, 178}, {84, 17, 43, 180}, {84, 17, 43, 183}, {84, 17, 43, 185}, {84, 17, 60, 235}, {84, 17, 60, 250}, {84, 247, 51, 235}, {84, 247, 51, 243}, {84, 247, 51, 245}, {84, 247, 51, 253}, {185, 246, 211, 69}, {185, 246, 211, 103}, {217, 138, 207, 243}, {217, 138, 207, 245}}}, - {Region: models.SurfsharkRegion("France Sweden"), IPs: []net.IP{{199, 247, 8, 20}}}, - {Region: models.SurfsharkRegion("Germany Berlin"), IPs: []net.IP{{37, 120, 217, 131}, {37, 120, 217, 147}, {37, 120, 217, 149}, {37, 120, 217, 179}, {37, 120, 217, 181}, {152, 89, 163, 19}, {152, 89, 163, 21}, {152, 89, 163, 23}, {152, 89, 163, 227}, {152, 89, 163, 229}, {152, 89, 163, 231}, {152, 89, 163, 243}, {193, 176, 86, 195}, {193, 176, 86, 199}, {217, 138, 216, 59}, {217, 138, 216, 61}, {217, 138, 216, 219}, {217, 138, 216, 227}, {217, 138, 216, 229}, {217, 138, 216, 235}, {217, 138, 216, 237}, {217, 138, 216, 243}, {217, 138, 216, 245}, {217, 138, 216, 251}, {217, 138, 216, 253}}}, - {Region: models.SurfsharkRegion("Germany Frankfurt am Main st001"), IPs: []net.IP{{45, 87, 212, 179}}}, - {Region: models.SurfsharkRegion("Germany Frankfurt am Main st002"), IPs: []net.IP{{45, 87, 212, 181}}}, - {Region: models.SurfsharkRegion("Germany Frankfurt am Main st003"), IPs: []net.IP{{45, 87, 212, 183}}}, - {Region: models.SurfsharkRegion("Germany Frankfurt am Main"), IPs: []net.IP{{37, 120, 196, 53}, {37, 120, 196, 59}, {37, 120, 196, 61}, {37, 120, 196, 173}, {37, 120, 197, 11}, {37, 120, 197, 13}, {82, 102, 16, 99}, {82, 102, 16, 101}, {84, 16, 240, 174}, {84, 16, 240, 176}, {89, 187, 169, 104}, {89, 187, 169, 119}, {185, 59, 220, 144}, {185, 59, 220, 150}, {185, 59, 220, 168}, {185, 59, 220, 172}, {185, 93, 180, 101}, {185, 102, 219, 6}, {185, 102, 219, 47}, {185, 102, 219, 49}, {185, 158, 135, 36}}}, - {Region: models.SurfsharkRegion("Germany Munich"), IPs: []net.IP{{178, 238, 231, 53}, {178, 238, 231, 55}}}, - {Region: models.SurfsharkRegion("Germany Nuremberg"), IPs: []net.IP{{62, 171, 149, 160}, {62, 171, 149, 162}, {62, 171, 151, 180}, {62, 171, 151, 182}}}, - {Region: models.SurfsharkRegion("Germany Singapour"), IPs: []net.IP{{159, 89, 14, 157}}}, - {Region: models.SurfsharkRegion("Germany UK"), IPs: []net.IP{{46, 101, 250, 73}}}, - {Region: models.SurfsharkRegion("Greece"), IPs: []net.IP{{87, 239, 248, 78}, {87, 239, 248, 80}, {87, 239, 248, 82}, {87, 239, 248, 85}, {87, 239, 248, 87}, {185, 226, 65, 150}}}, - {Region: models.SurfsharkRegion("Hong Kong"), IPs: []net.IP{{64, 120, 121, 216}, {64, 120, 121, 232}, {64, 120, 121, 234}, {64, 120, 121, 236}, {64, 120, 121, 238}, {64, 120, 121, 240}, {64, 120, 121, 244}, {64, 120, 121, 246}, {64, 120, 121, 248}, {84, 17, 37, 154}, {84, 17, 37, 156}, {84, 17, 37, 158}, {84, 17, 37, 160}, {84, 17, 57, 185}, {209, 58, 186, 10}, {209, 58, 186, 12}, {209, 58, 186, 14}, {209, 58, 186, 16}, {209, 58, 186, 18}}}, - {Region: models.SurfsharkRegion("Hungary"), IPs: []net.IP{{37, 120, 144, 147}, {37, 120, 144, 149}, {37, 120, 144, 151}, {37, 120, 144, 197}, {37, 120, 144, 199}, {37, 120, 144, 211}, {37, 120, 144, 213}, {37, 120, 144, 215}, {37, 120, 144, 243}, {37, 120, 144, 245}}}, - {Region: models.SurfsharkRegion("Iceland"), IPs: []net.IP{{82, 221, 128, 156}}}, - {Region: models.SurfsharkRegion("India Chennai"), IPs: []net.IP{{103, 94, 27, 99}, {103, 94, 27, 101}, {103, 94, 27, 115}, {103, 94, 27, 117}, {103, 94, 27, 179}, {103, 94, 27, 181}, {103, 94, 27, 227}, {103, 94, 27, 229}, {103, 108, 117, 131}, {103, 108, 117, 133}, {103, 108, 117, 147}, {103, 108, 117, 149}, {103, 108, 117, 151}}}, - {Region: models.SurfsharkRegion("India Indore"), IPs: []net.IP{{103, 39, 132, 187}, {103, 39, 132, 189}, {103, 73, 189, 219}, {103, 73, 189, 221}, {137, 59, 52, 107}, {137, 59, 52, 109}}}, - {Region: models.SurfsharkRegion("India Mumbai"), IPs: []net.IP{{103, 221, 233, 61}, {103, 221, 233, 86}, {103, 221, 233, 88}, {103, 221, 233, 89}, {103, 221, 233, 91}, {165, 231, 253, 147}, {165, 231, 253, 149}, {165, 231, 253, 163}}}, - {Region: models.SurfsharkRegion("India UK"), IPs: []net.IP{{134, 209, 148, 122}}}, - {Region: models.SurfsharkRegion("Indonesia"), IPs: []net.IP{{103, 227, 255, 211}, {103, 227, 255, 213}, {103, 227, 255, 215}}}, - {Region: models.SurfsharkRegion("Ireland"), IPs: []net.IP{{185, 108, 128, 114}, {185, 108, 128, 118}, {185, 108, 128, 159}, {185, 108, 128, 161}, {185, 108, 128, 181}, {185, 108, 128, 183}, {185, 108, 128, 185}, {217, 138, 222, 43}, {217, 138, 222, 45}, {217, 138, 222, 51}, {217, 138, 222, 53}}}, - {Region: models.SurfsharkRegion("Israel"), IPs: []net.IP{{87, 239, 255, 107}, {87, 239, 255, 109}, {87, 239, 255, 111}, {87, 239, 255, 114}, {87, 239, 255, 116}, {87, 239, 255, 119}, {87, 239, 255, 121}}}, - {Region: models.SurfsharkRegion("Italy Milan"), IPs: []net.IP{{37, 120, 201, 23}, {37, 120, 201, 67}, {37, 120, 201, 69}, {37, 120, 201, 71}, {45, 9, 251, 163}, {84, 17, 58, 136}, {84, 17, 58, 146}, {84, 17, 58, 148}, {84, 17, 58, 150}, {84, 17, 58, 152}, {84, 17, 58, 154}, {84, 17, 58, 156}, {84, 17, 58, 159}, {84, 17, 58, 161}, {84, 17, 58, 190}, {84, 17, 58, 195}, {84, 17, 58, 197}, {84, 17, 58, 200}, {84, 17, 58, 207}, {95, 174, 64, 69}, {95, 174, 64, 71}, {185, 128, 27, 41}, {212, 102, 54, 145}, {212, 102, 54, 160}, {212, 102, 54, 162}}}, - {Region: models.SurfsharkRegion("Japan Tokyo st001"), IPs: []net.IP{{45, 87, 213, 19}}}, - {Region: models.SurfsharkRegion("Japan Tokyo st002"), IPs: []net.IP{{45, 87, 213, 21}}}, - {Region: models.SurfsharkRegion("Japan Tokyo st003"), IPs: []net.IP{{45, 87, 213, 23}}}, - {Region: models.SurfsharkRegion("Japan Tokyo st004"), IPs: []net.IP{{217, 138, 212, 19}}}, - {Region: models.SurfsharkRegion("Japan Tokyo st005"), IPs: []net.IP{{217, 138, 212, 21}}}, - {Region: models.SurfsharkRegion("Japan Tokyo st006"), IPs: []net.IP{{82, 102, 28, 123}}}, - {Region: models.SurfsharkRegion("Japan Tokyo st007"), IPs: []net.IP{{82, 102, 28, 125}}}, - {Region: models.SurfsharkRegion("Japan Tokyo"), IPs: []net.IP{{45, 87, 213, 3}, {45, 87, 213, 5}, {45, 87, 213, 7}, {45, 87, 213, 83}, {45, 87, 213, 85}, {45, 87, 213, 87}, {45, 87, 213, 101}, {45, 87, 213, 103}, {45, 87, 213, 105}, {45, 87, 213, 211}, {45, 87, 213, 213}, {45, 87, 213, 243}, {45, 87, 213, 245}, {84, 17, 34, 24}, {84, 17, 34, 26}, {84, 17, 34, 44}, {84, 17, 34, 46}, {89, 187, 161, 2}, {89, 187, 161, 4}, {89, 187, 161, 239}, {89, 187, 161, 241}, {103, 208, 221, 227}, {103, 208, 221, 229}, {185, 242, 4, 163}}}, - {Region: models.SurfsharkRegion("Kazakhstan"), IPs: []net.IP{{45, 136, 56, 54}, {45, 136, 56, 57}, {45, 136, 56, 61}, {45, 136, 56, 64}}}, - {Region: models.SurfsharkRegion("Korea"), IPs: []net.IP{{27, 255, 77, 195}, {27, 255, 77, 197}, {27, 255, 77, 226}, {61, 14, 210, 227}, {61, 14, 210, 229}, {61, 14, 210, 232}, {61, 14, 210, 234}, {61, 14, 210, 237}, {61, 14, 210, 239}, {61, 14, 210, 242}, {61, 14, 210, 244}, {61, 97, 243, 119}, {61, 97, 243, 124}, {103, 249, 28, 215}, {103, 249, 28, 227}, {103, 249, 28, 229}, {103, 249, 28, 231}}}, - {Region: models.SurfsharkRegion("Latvia"), IPs: []net.IP{{91, 203, 70, 186}, {91, 203, 70, 188}, {188, 92, 78, 135}, {188, 92, 78, 137}, {188, 92, 78, 140}, {188, 92, 78, 142}, {188, 92, 78, 145}, {188, 92, 78, 147}, {188, 92, 78, 150}, {188, 92, 78, 152}}}, - {Region: models.SurfsharkRegion("Libya"), IPs: []net.IP{{41, 208, 72, 157}, {41, 208, 72, 204}, {41, 208, 72, 207}}}, - {Region: models.SurfsharkRegion("Luxembourg"), IPs: []net.IP{{185, 153, 151, 60}, {185, 153, 151, 62}, {185, 153, 151, 64}, {185, 153, 151, 66}, {185, 153, 151, 68}, {185, 153, 151, 70}, {185, 153, 151, 73}, {185, 153, 151, 75}, {185, 153, 151, 78}, {185, 153, 151, 80}, {185, 153, 151, 82}, {185, 153, 151, 83}, {185, 153, 151, 85}, {185, 153, 151, 87}, {185, 153, 151, 91}}}, - {Region: models.SurfsharkRegion("Malaysia"), IPs: []net.IP{{42, 0, 30, 135}, {42, 0, 30, 160}, {42, 0, 30, 162}, {42, 0, 30, 164}, {42, 0, 30, 177}, {42, 0, 30, 179}, {42, 0, 30, 209}, {42, 0, 30, 213}, {42, 0, 30, 215}}}, - {Region: models.SurfsharkRegion("Moldova"), IPs: []net.IP{{178, 175, 148, 39}}}, - {Region: models.SurfsharkRegion("Netherlands Amsterdam st001"), IPs: []net.IP{{81, 19, 209, 51}}}, - {Region: models.SurfsharkRegion("Netherlands Amsterdam"), IPs: []net.IP{{81, 19, 208, 56}, {81, 19, 208, 68}, {81, 19, 209, 20}, {81, 19, 209, 57}, {81, 19, 209, 113}, {81, 19, 209, 124}, {89, 46, 223, 78}, {89, 46, 223, 86}, {89, 46, 223, 92}, {89, 46, 223, 100}, {89, 46, 223, 104}, {89, 46, 223, 106}, {89, 46, 223, 212}, {89, 46, 223, 214}, {89, 46, 223, 217}, {89, 46, 223, 222}, {89, 46, 223, 224}, {89, 46, 223, 227}, {89, 187, 174, 231}, {185, 59, 222, 92}, {185, 59, 222, 94}, {185, 59, 222, 166}, {185, 59, 222, 168}, {185, 232, 20, 131}}}, - {Region: models.SurfsharkRegion("Netherlands US"), IPs: []net.IP{{188, 166, 98, 91}}}, - {Region: models.SurfsharkRegion("New Zealand"), IPs: []net.IP{{180, 149, 231, 3}, {180, 149, 231, 11}, {180, 149, 231, 13}, {180, 149, 231, 43}, {180, 149, 231, 45}, {180, 149, 231, 67}, {180, 149, 231, 69}, {180, 149, 231, 115}, {180, 149, 231, 117}, {180, 149, 231, 119}, {180, 149, 231, 163}, {180, 149, 231, 165}}}, - {Region: models.SurfsharkRegion("Nigeria"), IPs: []net.IP{{102, 165, 23, 4}, {102, 165, 23, 6}, {102, 165, 23, 38}, {102, 165, 23, 40}, {102, 165, 23, 42}}}, - {Region: models.SurfsharkRegion("North Macedonia"), IPs: []net.IP{{185, 225, 28, 67}, {185, 225, 28, 69}, {185, 225, 28, 83}, {185, 225, 28, 85}, {185, 225, 28, 91}, {185, 225, 28, 93}, {185, 225, 28, 99}, {185, 225, 28, 101}, {185, 225, 28, 107}, {185, 225, 28, 109}}}, - {Region: models.SurfsharkRegion("Norway"), IPs: []net.IP{{45, 12, 223, 67}, {45, 12, 223, 69}, {45, 12, 223, 71}, {45, 12, 223, 195}, {45, 12, 223, 197}, {45, 12, 223, 211}, {45, 12, 223, 213}, {84, 247, 50, 27}, {84, 247, 50, 29}, {84, 247, 50, 67}, {84, 247, 50, 69}, {95, 174, 66, 35}, {95, 174, 66, 37}, {95, 174, 66, 39}, {95, 174, 66, 41}}}, - {Region: models.SurfsharkRegion("Paraguay"), IPs: []net.IP{{181, 40, 18, 47}, {181, 40, 18, 56}, {181, 40, 18, 59}, {186, 16, 32, 163}, {186, 16, 32, 173}}}, - {Region: models.SurfsharkRegion("Philippines"), IPs: []net.IP{{45, 134, 224, 3}, {45, 134, 224, 5}, {45, 134, 224, 8}, {45, 134, 224, 10}}}, - {Region: models.SurfsharkRegion("Poland Gdansk"), IPs: []net.IP{{5, 187, 49, 187}, {5, 187, 49, 189}, {5, 187, 53, 51}, {5, 187, 53, 53}, {5, 187, 53, 55}}}, - {Region: models.SurfsharkRegion("Poland Warsaw"), IPs: []net.IP{{5, 253, 206, 67}, {5, 253, 206, 69}, {5, 253, 206, 71}, {5, 253, 206, 227}, {5, 253, 206, 229}, {84, 17, 55, 132}, {84, 17, 55, 134}, {185, 246, 208, 72}, {185, 246, 208, 77}, {185, 246, 208, 105}, {185, 246, 208, 107}, {185, 246, 208, 176}, {185, 246, 208, 182}}}, - {Region: models.SurfsharkRegion("Portugal Lisbon"), IPs: []net.IP{{5, 154, 174, 26}, {5, 154, 174, 65}, {5, 154, 174, 67}, {5, 154, 174, 75}, {5, 154, 174, 77}, {5, 154, 174, 99}, {5, 154, 174, 101}, {5, 154, 174, 115}, {5, 154, 174, 117}, {5, 154, 174, 171}, {5, 154, 174, 173}, {5, 154, 174, 179}, {5, 154, 174, 181}, {5, 154, 174, 187}, {5, 154, 174, 189}, {5, 154, 174, 211}, {5, 154, 174, 213}, {5, 154, 174, 219}, {5, 154, 174, 221}, {5, 154, 174, 227}, {5, 154, 174, 229}}}, - {Region: models.SurfsharkRegion("Portugal Loule"), IPs: []net.IP{{176, 61, 146, 84}, {176, 61, 146, 86}, {176, 61, 146, 106}, {176, 61, 146, 108}, {176, 61, 146, 113}, {176, 61, 146, 116}, {176, 61, 146, 118}, {176, 61, 146, 121}, {176, 61, 146, 123}, {176, 61, 148, 60}, {176, 61, 148, 62}}}, - {Region: models.SurfsharkRegion("Portugal Porto"), IPs: []net.IP{{194, 39, 127, 21}, {194, 39, 127, 23}, {194, 39, 127, 36}, {194, 39, 127, 38}, {194, 39, 127, 231}, {194, 39, 127, 233}, {194, 39, 127, 240}, {194, 39, 127, 242}, {194, 39, 127, 244}}}, - {Region: models.SurfsharkRegion("Romania"), IPs: []net.IP{{86, 106, 137, 147}, {86, 106, 137, 149}, {194, 68, 44, 61}}}, - {Region: models.SurfsharkRegion("Russia Moscow"), IPs: []net.IP{{213, 183, 56, 18}, {213, 183, 56, 145}, {213, 183, 56, 160}, {213, 183, 56, 166}, {213, 183, 56, 233}, {213, 183, 56, 236}}}, - {Region: models.SurfsharkRegion("Russia St. Petersburg"), IPs: []net.IP{{213, 183, 54, 23}, {213, 183, 54, 109}, {213, 183, 54, 143}, {213, 183, 54, 165}}}, - {Region: models.SurfsharkRegion("Serbia"), IPs: []net.IP{{37, 120, 193, 51}, {37, 120, 193, 53}, {152, 89, 160, 115}, {152, 89, 160, 117}, {152, 89, 160, 119}, {152, 89, 160, 121}, {152, 89, 160, 123}, {152, 89, 160, 125}, {152, 89, 160, 211}, {152, 89, 160, 213}, {152, 89, 160, 215}}}, - {Region: models.SurfsharkRegion("Singapore Hong Kong"), IPs: []net.IP{{206, 189, 83, 129}}}, - {Region: models.SurfsharkRegion("Singapore Netherlands"), IPs: []net.IP{{104, 248, 148, 18}}}, - {Region: models.SurfsharkRegion("Singapore st001"), IPs: []net.IP{{217, 138, 201, 91}}}, - {Region: models.SurfsharkRegion("Singapore st002"), IPs: []net.IP{{217, 138, 201, 93}}}, - {Region: models.SurfsharkRegion("Singapore st003"), IPs: []net.IP{{84, 247, 49, 19}}}, - {Region: models.SurfsharkRegion("Singapore st004"), IPs: []net.IP{{84, 247, 49, 21}}}, - {Region: models.SurfsharkRegion("Singapore"), IPs: []net.IP{{89, 187, 163, 130}, {89, 187, 163, 132}, {89, 187, 163, 134}, {89, 187, 163, 136}, {103, 254, 153, 171}, {103, 254, 153, 176}, {103, 254, 155, 229}, {103, 254, 155, 241}, {209, 58, 170, 134}, {209, 58, 170, 142}, {209, 58, 170, 144}, {209, 58, 170, 146}, {209, 58, 170, 159}, {209, 58, 170, 163}, {209, 58, 170, 164}, {209, 58, 170, 169}, {209, 58, 170, 172}, {209, 58, 176, 43}, {209, 58, 176, 45}, {209, 58, 176, 47}}}, - {Region: models.SurfsharkRegion("Slovekia"), IPs: []net.IP{{37, 120, 221, 3}, {37, 120, 221, 5}, {193, 37, 255, 35}, {193, 37, 255, 37}, {193, 37, 255, 39}, {193, 37, 255, 41}}}, - {Region: models.SurfsharkRegion("Slovenia"), IPs: []net.IP{{195, 158, 249, 36}, {195, 158, 249, 38}, {195, 158, 249, 40}, {195, 158, 249, 42}}}, - {Region: models.SurfsharkRegion("South Africa"), IPs: []net.IP{{154, 127, 49, 226}, {154, 127, 49, 228}, {154, 127, 49, 230}, {154, 127, 49, 232}, {196, 251, 250, 111}}}, - {Region: models.SurfsharkRegion("Spain Barcelona"), IPs: []net.IP{{37, 120, 142, 133}, {37, 120, 142, 135}, {185, 188, 61, 5}, {185, 188, 61, 7}}}, - {Region: models.SurfsharkRegion("Spain Madrid"), IPs: []net.IP{{37, 120, 148, 213}, {82, 102, 17, 179}, {82, 102, 17, 181}, {82, 102, 17, 183}, {82, 102, 17, 185}, {84, 17, 62, 163}, {84, 17, 62, 165}, {84, 17, 62, 181}, {89, 37, 95, 7}, {89, 37, 95, 9}, {89, 37, 95, 11}, {89, 37, 95, 15}, {89, 37, 95, 17}, {89, 37, 95, 19}, {89, 37, 95, 25}, {188, 208, 141, 98}, {188, 208, 141, 114}, {212, 102, 48, 2}, {212, 102, 48, 4}, {212, 102, 48, 8}, {212, 102, 48, 10}, {212, 102, 48, 13}, {212, 102, 48, 15}, {212, 102, 48, 18}, {212, 102, 48, 20}}}, - {Region: models.SurfsharkRegion("Spain Valencia"), IPs: []net.IP{{185, 153, 150, 44}, {185, 153, 150, 46}, {185, 153, 150, 48}, {185, 153, 150, 50}, {185, 153, 150, 52}, {185, 153, 150, 54}, {185, 153, 150, 56}, {185, 153, 150, 58}, {196, 196, 150, 67}, {196, 196, 150, 69}, {196, 196, 150, 71}, {196, 196, 150, 83}, {196, 196, 150, 85}}}, - {Region: models.SurfsharkRegion("Sweden"), IPs: []net.IP{{45, 83, 91, 131}, {45, 83, 91, 133}, {45, 83, 91, 135}, {45, 83, 91, 147}, {45, 83, 91, 149}, {45, 83, 91, 151}, {46, 227, 69, 23}, {46, 227, 69, 25}, {46, 227, 69, 27}, {46, 227, 69, 29}, {185, 76, 9, 34}, {185, 76, 9, 36}, {185, 76, 9, 39}, {185, 76, 9, 41}, {185, 76, 9, 44}, {185, 76, 9, 46}, {185, 76, 9, 49}, {185, 76, 9, 51}}}, - {Region: models.SurfsharkRegion("Switzerland"), IPs: []net.IP{{37, 120, 213, 3}, {37, 120, 213, 7}, {45, 12, 222, 245}, {84, 17, 53, 86}, {84, 17, 53, 166}, {84, 17, 53, 168}, {84, 17, 53, 208}, {84, 17, 53, 210}, {84, 17, 53, 212}, {84, 17, 53, 216}, {84, 17, 53, 219}, {84, 17, 53, 221}, {84, 17, 53, 223}, {84, 17, 53, 225}, {84, 17, 53, 227}, {84, 39, 112, 35}}}, - {Region: models.SurfsharkRegion("Taiwan"), IPs: []net.IP{{2, 58, 241, 3}, {2, 58, 241, 5}, {2, 58, 242, 43}, {2, 58, 242, 45}, {2, 58, 242, 155}, {2, 58, 242, 157}, {2, 58, 243, 51}, {2, 58, 243, 53}, {103, 51, 140, 70}, {103, 51, 140, 72}, {103, 51, 140, 74}, {103, 98, 74, 227}, {103, 98, 74, 229}, {103, 98, 75, 71}, {103, 98, 75, 73}, {103, 103, 128, 30}}}, - {Region: models.SurfsharkRegion("Thailand"), IPs: []net.IP{{45, 64, 186, 134}, {45, 64, 186, 163}, {103, 253, 74, 7}}}, - {Region: models.SurfsharkRegion("Turkey"), IPs: []net.IP{{185, 195, 79, 3}}}, - {Region: models.SurfsharkRegion("UK France"), IPs: []net.IP{{188, 166, 168, 247}}}, - {Region: models.SurfsharkRegion("UK Germany"), IPs: []net.IP{{45, 77, 58, 16}}}, - {Region: models.SurfsharkRegion("UK Glasgow"), IPs: []net.IP{{185, 108, 105, 5}, {185, 108, 105, 13}, {185, 108, 105, 18}, {185, 108, 105, 20}, {185, 108, 105, 22}, {185, 108, 105, 40}}}, - {Region: models.SurfsharkRegion("UK London st001"), IPs: []net.IP{{217, 146, 82, 83}}}, - {Region: models.SurfsharkRegion("UK London st002"), IPs: []net.IP{{185, 134, 22, 80}}}, - {Region: models.SurfsharkRegion("UK London st003"), IPs: []net.IP{{185, 134, 22, 92}}}, - {Region: models.SurfsharkRegion("UK London st004"), IPs: []net.IP{{185, 44, 76, 186}}}, - {Region: models.SurfsharkRegion("UK London st005"), IPs: []net.IP{{185, 44, 76, 188}}}, - {Region: models.SurfsharkRegion("UK London"), IPs: []net.IP{{5, 226, 139, 65}, {5, 226, 139, 225}, {81, 19, 210, 234}, {89, 35, 29, 71}, {178, 239, 166, 222}, {178, 239, 166, 227}, {178, 239, 166, 234}, {178, 239, 166, 250}, {185, 16, 206, 69}, {185, 38, 148, 228}, {185, 38, 150, 41}, {185, 38, 150, 88}, {185, 38, 150, 124}, {185, 44, 76, 167}, {185, 44, 76, 172}, {185, 114, 224, 53}, {185, 114, 224, 115}, {185, 114, 224, 119}, {185, 125, 207, 155}, {185, 125, 207, 177}, {185, 134, 22, 191}, {185, 193, 36, 208}, {195, 140, 215, 42}}}, - {Region: models.SurfsharkRegion("UK Manchester"), IPs: []net.IP{{37, 120, 200, 2}, {86, 106, 136, 67}, {86, 106, 136, 69}, {86, 106, 136, 85}, {89, 238, 130, 196}, {89, 238, 140, 226}, {89, 238, 140, 227}, {89, 238, 140, 229}, {89, 238, 143, 100}, {89, 238, 143, 101}, {89, 238, 143, 103}, {89, 238, 143, 105}, {92, 119, 176, 19}, {92, 119, 176, 21}, {92, 119, 176, 23}, {192, 145, 126, 130}, {192, 145, 126, 131}, {192, 145, 126, 133}, {193, 148, 17, 82}, {193, 148, 17, 130}, {195, 12, 48, 212}, {195, 12, 48, 213}, {195, 12, 48, 215}, {195, 12, 48, 217}, {217, 138, 196, 91}}}, - {Region: models.SurfsharkRegion("US Atlanta"), IPs: []net.IP{{66, 115, 154, 131}, {66, 115, 154, 133}, {66, 115, 154, 135}, {66, 115, 154, 147}, {66, 115, 154, 149}, {66, 115, 154, 151}, {66, 115, 169, 35}, {66, 115, 175, 35}, {66, 115, 175, 37}, {66, 115, 175, 40}, {66, 115, 175, 42}, {66, 115, 175, 45}, {66, 115, 175, 47}, {66, 115, 175, 50}, {66, 115, 175, 52}, {185, 93, 0, 143}, {185, 93, 0, 146}}}, - {Region: models.SurfsharkRegion("US Bend"), IPs: []net.IP{{45, 43, 14, 73}, {45, 43, 14, 75}, {45, 43, 14, 83}, {45, 43, 14, 85}, {45, 43, 14, 93}, {45, 43, 14, 95}, {45, 43, 14, 103}, {45, 43, 14, 105}, {154, 16, 168, 184}, {154, 16, 168, 186}, {154, 16, 168, 188}}}, - {Region: models.SurfsharkRegion("US Boston"), IPs: []net.IP{{173, 237, 207, 11}, {173, 237, 207, 13}, {173, 237, 207, 15}, {173, 237, 207, 21}, {173, 237, 207, 25}, {173, 237, 207, 30}, {173, 237, 207, 32}, {173, 237, 207, 36}, {173, 237, 207, 38}, {173, 237, 207, 42}, {173, 237, 207, 44}, {192, 34, 83, 230}, {192, 34, 83, 232}, {192, 34, 83, 234}, {192, 34, 83, 236}, {199, 217, 107, 20}, {199, 217, 107, 22}, {199, 217, 107, 25}, {199, 217, 107, 27}}}, - {Region: models.SurfsharkRegion("US Buffalo"), IPs: []net.IP{{107, 174, 20, 130}, {107, 174, 20, 132}, {107, 174, 20, 134}, {107, 175, 104, 82}, {107, 175, 104, 84}, {107, 175, 104, 86}, {172, 93, 153, 146}, {172, 93, 153, 148}, {172, 93, 153, 150}}}, - {Region: models.SurfsharkRegion("US Charlotte"), IPs: []net.IP{{66, 11, 124, 136}, {66, 11, 124, 138}, {66, 11, 124, 140}, {66, 11, 124, 142}, {66, 11, 124, 144}, {155, 254, 28, 141}, {155, 254, 29, 163}, {155, 254, 29, 165}, {155, 254, 31, 182}, {155, 254, 31, 184}, {192, 154, 253, 67}, {192, 154, 253, 69}, {192, 154, 254, 135}, {192, 154, 254, 137}, {192, 154, 255, 52}, {192, 154, 255, 54}}}, - {Region: models.SurfsharkRegion("US Chicago"), IPs: []net.IP{{74, 119, 146, 115}, {74, 119, 146, 117}, {74, 119, 146, 119}, {74, 119, 146, 133}, {74, 119, 146, 179}, {74, 119, 146, 181}, {74, 119, 146, 183}, {74, 119, 146, 195}, {74, 119, 146, 197}, {74, 119, 146, 199}, {74, 119, 146, 211}, {89, 187, 182, 173}, {89, 187, 182, 175}, {107, 152, 100, 19}, {107, 152, 100, 21}, {107, 152, 100, 24}, {107, 152, 100, 26}, {184, 170, 250, 69}, {184, 170, 250, 74}, {184, 170, 250, 149}, {184, 170, 250, 154}}}, - {Region: models.SurfsharkRegion("US Dallas"), IPs: []net.IP{{66, 115, 177, 131}, {66, 115, 177, 133}, {66, 115, 177, 136}, {66, 115, 177, 138}, {66, 115, 177, 141}, {66, 115, 177, 143}, {66, 115, 177, 146}, {66, 115, 177, 148}, {66, 115, 177, 151}, {66, 115, 177, 153}, {66, 115, 177, 156}, {66, 115, 177, 158}, {89, 187, 175, 165}, {89, 187, 175, 167}, {107, 181, 173, 163}, {172, 241, 114, 87}, {212, 102, 40, 66}, {212, 102, 40, 68}, {212, 102, 40, 71}, {212, 102, 40, 73}, {212, 102, 40, 76}, {212, 102, 40, 78}, {212, 102, 40, 81}}}, - {Region: models.SurfsharkRegion("US Denver"), IPs: []net.IP{{174, 128, 245, 3}, {174, 128, 245, 5}, {212, 102, 44, 66}, {212, 102, 44, 68}, {212, 102, 44, 71}, {212, 102, 44, 73}, {212, 102, 44, 76}, {212, 102, 44, 78}, {212, 102, 44, 81}, {212, 102, 44, 83}, {212, 102, 44, 86}, {212, 102, 44, 88}, {212, 102, 44, 91}, {212, 102, 44, 93}}}, - {Region: models.SurfsharkRegion("US Gahanna"), IPs: []net.IP{{104, 244, 208, 35}, {104, 244, 208, 37}, {104, 244, 208, 99}, {104, 244, 208, 101}, {104, 244, 208, 107}, {104, 244, 208, 203}, {104, 244, 208, 205}, {104, 244, 208, 229}, {104, 244, 208, 231}, {104, 244, 209, 51}, {104, 244, 209, 53}, {104, 244, 211, 139}, {104, 244, 211, 141}, {104, 244, 211, 171}, {104, 244, 211, 173}, {104, 244, 211, 179}}}, - {Region: models.SurfsharkRegion("US Houston"), IPs: []net.IP{{104, 148, 30, 35}, {104, 148, 30, 37}, {104, 148, 30, 39}, {104, 148, 30, 53}, {104, 148, 30, 55}, {104, 148, 30, 83}, {104, 148, 30, 85}, {104, 148, 30, 87}, {199, 10, 64, 67}, {199, 10, 64, 69}, {199, 10, 64, 83}, {199, 10, 64, 85}, {199, 10, 64, 99}, {199, 10, 64, 101}, {199, 10, 64, 115}, {199, 10, 64, 117}}}, - {Region: models.SurfsharkRegion("US Kansas City"), IPs: []net.IP{{63, 141, 236, 243}, {63, 141, 248, 179}, {63, 141, 248, 181}, {107, 150, 39, 43}, {173, 208, 202, 59}, {173, 208, 202, 61}, {198, 204, 231, 147}, {198, 204, 231, 149}, {204, 12, 208, 115}, {204, 12, 208, 117}}}, - {Region: models.SurfsharkRegion("US Las Vegas"), IPs: []net.IP{{89, 187, 187, 147}, {89, 187, 187, 149}, {185, 242, 5, 211}, {185, 242, 5, 213}, {185, 242, 5, 215}}}, - {Region: models.SurfsharkRegion("US Latham"), IPs: []net.IP{{45, 43, 19, 66}, {45, 43, 19, 68}, {45, 43, 19, 74}, {45, 43, 19, 76}, {45, 43, 19, 82}, {45, 43, 19, 84}, {45, 43, 19, 90}, {45, 43, 19, 92}, {154, 16, 169, 3}, {154, 16, 169, 5}, {154, 16, 169, 7}}}, - {Region: models.SurfsharkRegion("US Los Angeles"), IPs: []net.IP{{38, 95, 110, 67}, {38, 95, 110, 71}, {89, 187, 187, 66}, {89, 187, 187, 68}, {89, 187, 187, 71}, {89, 187, 187, 73}, {89, 187, 187, 76}, {89, 187, 187, 78}, {89, 187, 187, 81}, {89, 187, 187, 83}, {89, 187, 187, 86}, {172, 83, 44, 83}, {184, 170, 243, 199}, {184, 170, 243, 211}, {192, 111, 134, 67}, {192, 111, 134, 78}, {192, 111, 134, 80}, {192, 111, 134, 195}, {192, 111, 134, 202}, {192, 111, 134, 207}, {192, 111, 134, 210}, {192, 111, 134, 215}, {192, 111, 134, 217}, {192, 111, 134, 220}, {192, 111, 134, 222}}}, - {Region: models.SurfsharkRegion("US Maryland"), IPs: []net.IP{{23, 82, 8, 173}, {23, 105, 160, 134}, {23, 105, 160, 138}, {23, 105, 160, 144}, {23, 105, 163, 94}, {207, 244, 67, 147}, {207, 244, 67, 149}, {207, 244, 84, 40}, {207, 244, 84, 42}, {207, 244, 84, 44}, {207, 244, 84, 58}, {207, 244, 127, 116}, {207, 244, 127, 118}}}, - {Region: models.SurfsharkRegion("US Miami"), IPs: []net.IP{{89, 187, 173, 250}, {107, 181, 164, 35}, {107, 181, 164, 37}, {172, 83, 42, 23}, {172, 83, 42, 39}, {172, 83, 42, 53}, {172, 83, 42, 55}, {172, 83, 42, 83}, {172, 83, 42, 85}, {172, 83, 42, 131}, {172, 83, 42, 133}, {172, 83, 42, 136}, {172, 83, 42, 138}, {172, 83, 42, 141}, {172, 83, 42, 143}, {172, 83, 42, 146}, {172, 83, 42, 151}, {172, 83, 42, 153}, {172, 83, 42, 156}, {172, 83, 42, 158}, {193, 37, 252, 195}, {193, 37, 252, 197}}}, - {Region: models.SurfsharkRegion("US Netherlands"), IPs: []net.IP{{142, 93, 58, 71}}}, - {Region: models.SurfsharkRegion("US New York City mp001"), IPs: []net.IP{{45, 55, 60, 159}}}, - {Region: models.SurfsharkRegion("US New York City st001"), IPs: []net.IP{{92, 119, 177, 19}}}, - {Region: models.SurfsharkRegion("US New York City st002"), IPs: []net.IP{{92, 119, 177, 21}}}, - {Region: models.SurfsharkRegion("US New York City st003"), IPs: []net.IP{{92, 119, 177, 23}}}, - {Region: models.SurfsharkRegion("US New York City st004"), IPs: []net.IP{{193, 148, 18, 51}}}, - {Region: models.SurfsharkRegion("US New York City st005"), IPs: []net.IP{{193, 148, 18, 53}}}, - {Region: models.SurfsharkRegion("US New York City"), IPs: []net.IP{{37, 120, 202, 3}, {37, 120, 202, 5}, {84, 17, 35, 66}, {84, 17, 35, 73}, {84, 17, 35, 76}, {84, 17, 35, 78}, {84, 17, 35, 86}, {84, 17, 35, 91}, {89, 187, 177, 120}, {89, 187, 177, 122}, {89, 187, 178, 92}, {89, 187, 178, 94}, {98, 142, 220, 35}, {98, 142, 220, 37}, {107, 152, 101, 163}, {172, 98, 78, 227}, {192, 40, 59, 229}, {192, 40, 59, 240}, {199, 36, 221, 85}, {199, 36, 221, 99}, {199, 36, 221, 104}, {199, 36, 221, 111}, {199, 36, 221, 114}, {199, 36, 221, 116}, {199, 36, 221, 119}}}, - {Region: models.SurfsharkRegion("US Orlando"), IPs: []net.IP{{198, 147, 22, 83}, {198, 147, 22, 85}, {198, 147, 22, 87}, {198, 147, 22, 131}, {198, 147, 22, 133}, {198, 147, 22, 135}, {198, 147, 22, 147}, {198, 147, 22, 149}, {198, 147, 22, 151}, {198, 147, 22, 163}, {198, 147, 22, 165}, {198, 147, 22, 167}, {198, 147, 22, 195}, {198, 147, 22, 197}, {198, 147, 22, 211}, {198, 147, 22, 213}}}, - {Region: models.SurfsharkRegion("US Phoenix"), IPs: []net.IP{{23, 83, 128, 233}, {23, 83, 128, 235}, {23, 83, 128, 239}, {23, 83, 128, 241}, {23, 83, 128, 243}, {107, 181, 184, 115}, {107, 181, 184, 117}, {172, 98, 87, 35}, {172, 98, 87, 37}, {184, 170, 240, 147}, {184, 170, 240, 149}, {184, 170, 240, 151}, {184, 170, 240, 179}, {184, 170, 240, 181}, {199, 58, 187, 3}, {199, 58, 187, 5}, {199, 58, 187, 8}, {199, 58, 187, 10}, {199, 58, 187, 13}, {199, 58, 187, 15}, {199, 58, 187, 18}, {199, 58, 187, 23}, {199, 58, 187, 25}, {199, 58, 187, 67}, {199, 58, 187, 69}}}, - {Region: models.SurfsharkRegion("US Portugal"), IPs: []net.IP{{142, 93, 81, 242}}}, - {Region: models.SurfsharkRegion("US Saint Louis"), IPs: []net.IP{{148, 72, 170, 108}, {148, 72, 174, 36}, {148, 72, 174, 38}, {148, 72, 174, 41}, {148, 72, 174, 43}, {148, 72, 174, 46}, {148, 72, 174, 51}, {148, 72, 174, 53}}}, - {Region: models.SurfsharkRegion("US Salt Lake City"), IPs: []net.IP{{104, 200, 131, 5}, {104, 200, 131, 7}, {104, 200, 131, 9}, {104, 200, 131, 165}, {104, 200, 131, 167}, {104, 200, 131, 170}, {104, 200, 131, 172}}}, - {Region: models.SurfsharkRegion("US San Francisco"), IPs: []net.IP{{107, 181, 166, 35}, {107, 181, 166, 37}, {107, 181, 166, 39}, {107, 181, 166, 51}, {107, 181, 166, 55}, {107, 181, 166, 83}, {107, 181, 166, 85}, {107, 181, 166, 227}, {107, 181, 166, 229}, {198, 8, 81, 35}, {198, 8, 81, 37}, {209, 58, 128, 48}, {209, 58, 128, 50}}}, - {Region: models.SurfsharkRegion("US Seatle"), IPs: []net.IP{{84, 17, 41, 73}, {84, 17, 41, 75}, {84, 17, 41, 77}, {84, 17, 41, 79}, {84, 17, 41, 81}, {84, 17, 41, 83}, {84, 17, 41, 85}, {104, 200, 129, 243}, {104, 200, 129, 245}, {198, 8, 80, 83}, {198, 8, 80, 85}, {198, 8, 80, 87}, {198, 8, 80, 227}, {198, 8, 80, 229}, {199, 229, 250, 163}, {199, 229, 250, 165}, {199, 229, 250, 167}}}, - {Region: models.SurfsharkRegion("US Tampa"), IPs: []net.IP{{66, 206, 23, 5}, {74, 50, 117, 106}, {74, 50, 117, 119}, {74, 50, 117, 121}, {74, 50, 117, 125}, {162, 220, 56, 98}, {162, 220, 56, 100}, {162, 220, 63, 226}, {162, 220, 63, 232}, {162, 220, 63, 246}, {162, 220, 63, 248}, {209, 216, 92, 197}, {209, 216, 92, 200}, {209, 216, 92, 202}, {209, 216, 92, 205}, {209, 216, 92, 207}, {209, 216, 92, 210}, {209, 216, 92, 212}, {209, 216, 92, 215}, {209, 216, 92, 217}, {209, 216, 92, 220}, {209, 216, 92, 222}, {209, 216, 92, 225}, {209, 216, 92, 227}}}, - {Region: models.SurfsharkRegion("Ukraine"), IPs: []net.IP{{45, 9, 238, 23}, {45, 9, 238, 30}, {45, 9, 238, 38}, {45, 9, 238, 47}}}, - {Region: models.SurfsharkRegion("United Arab Emirates"), IPs: []net.IP{{45, 9, 249, 243}, {45, 9, 249, 245}, {45, 9, 249, 247}, {45, 9, 250, 99}, {45, 9, 250, 101}, {45, 9, 250, 103}}}, - {Region: models.SurfsharkRegion("Vietnam"), IPs: []net.IP{{202, 143, 110, 32}}}, - {Region: models.SurfsharkRegion("italy Rome"), IPs: []net.IP{{82, 102, 26, 61}, {82, 102, 26, 114}, {82, 102, 26, 115}, {82, 102, 26, 117}, {87, 101, 94, 210}, {87, 101, 94, 211}, {87, 101, 94, 213}, {87, 101, 94, 215}, {87, 101, 94, 226}, {185, 217, 71, 2}, {185, 217, 71, 3}, {185, 217, 71, 5}, {185, 217, 71, 18}, {185, 217, 71, 50}, {185, 217, 71, 187}, {185, 217, 71, 195}, {185, 217, 71, 197}, {185, 217, 71, 211}, {185, 217, 71, 243}, {185, 217, 71, 251}, {185, 217, 71, 253}, {217, 138, 219, 235}, {217, 138, 219, 237}, {217, 138, 219, 251}}}, - } -} - func SurfsharkRegionChoices() (choices []string) { servers := SurfsharkServers() choices = make([]string, len(servers)) for i := range servers { - choices[i] = string(servers[i].Region) + choices[i] = servers[i].Region } return choices } + +func SurfsharkServers() []models.SurfsharkServer { + return []models.SurfsharkServer{ + {Region: "Albania", IPs: []net.IP{{31, 171, 152, 195}, {31, 171, 152, 197}, {31, 171, 154, 147}, {31, 171, 154, 149}, {31, 171, 154, 163}, {31, 171, 154, 165}}}, + {Region: "Australia Adelaide", IPs: []net.IP{{45, 248, 79, 19}, {45, 248, 79, 21}, {45, 248, 79, 27}, {45, 248, 79, 29}, {45, 248, 79, 35}, {45, 248, 79, 37}, {45, 248, 79, 51}, {45, 248, 79, 53}, {45, 248, 79, 67}, {45, 248, 79, 69}, {45, 248, 79, 83}, {45, 248, 79, 85}}}, + {Region: "Australia Brisbane", IPs: []net.IP{{45, 248, 77, 235}, {45, 248, 77, 237}, {144, 48, 39, 11}, {144, 48, 39, 13}, {144, 48, 39, 67}, {144, 48, 39, 69}, {144, 48, 39, 83}, {144, 48, 39, 85}, {144, 48, 39, 107}, {144, 48, 39, 109}, {144, 48, 39, 123}, {144, 48, 39, 125}, {144, 48, 39, 131}, {144, 48, 39, 133}}}, + {Region: "Australia Melbourne", IPs: []net.IP{{103, 192, 80, 131}, {103, 192, 80, 133}, {103, 192, 80, 139}, {103, 192, 80, 141}, {103, 192, 80, 147}, {103, 192, 80, 149}, {144, 48, 38, 19}, {144, 48, 38, 21}, {144, 48, 38, 139}, {144, 48, 38, 141}, {144, 48, 38, 147}, {144, 48, 38, 149}, {144, 48, 38, 179}, {144, 48, 38, 181}, {144, 48, 38, 183}}}, + {Region: "Australia Perth", IPs: []net.IP{{45, 248, 78, 43}, {45, 248, 78, 45}, {124, 150, 139, 27}, {124, 150, 139, 29}, {124, 150, 139, 35}, {124, 150, 139, 37}, {124, 150, 139, 43}, {124, 150, 139, 45}, {124, 150, 139, 123}, {124, 150, 139, 125}, {124, 150, 139, 179}, {124, 150, 139, 181}}}, + {Region: "Australia Sydney", IPs: []net.IP{{45, 125, 247, 43}, {45, 125, 247, 45}, {45, 125, 247, 91}, {45, 125, 247, 93}, {45, 125, 247, 195}, {45, 125, 247, 197}, {45, 248, 76, 171}, {45, 248, 76, 173}, {103, 25, 59, 51}, {103, 25, 59, 53}, {103, 25, 59, 83}, {103, 25, 59, 85}, {103, 25, 59, 87}, {180, 149, 228, 115}, {180, 149, 228, 117}}}, + {Region: "Australia US", IPs: []net.IP{{45, 76, 117, 108}}}, + {Region: "Austria", IPs: []net.IP{{5, 253, 207, 51}, {5, 253, 207, 53}, {5, 253, 207, 83}, {5, 253, 207, 85}, {37, 120, 212, 75}, {37, 120, 212, 77}, {37, 120, 212, 131}, {37, 120, 212, 133}, {37, 120, 212, 139}, {37, 120, 212, 141}, {37, 120, 212, 147}, {37, 120, 212, 149}, {91, 132, 139, 99}, {91, 132, 139, 101}, {91, 132, 139, 105}, {91, 132, 139, 107}}}, + {Region: "Azerbaijan", IPs: []net.IP{{94, 20, 21, 85}, {94, 20, 21, 87}}}, + {Region: "Belgium", IPs: []net.IP{{5, 253, 205, 99}, {5, 253, 205, 101}, {5, 253, 205, 179}, {5, 253, 205, 181}, {5, 253, 205, 211}, {5, 253, 205, 213}, {5, 253, 205, 227}, {5, 253, 205, 229}, {37, 120, 143, 117}, {37, 120, 143, 121}, {37, 120, 143, 125}, {37, 120, 218, 251}, {37, 120, 218, 253}, {89, 249, 73, 195}, {89, 249, 73, 197}, {185, 104, 186, 75}, {185, 104, 186, 77}, {185, 232, 21, 51}, {185, 232, 21, 53}}}, + {Region: "Bosnia and Herzegovina ", IPs: []net.IP{{185, 99, 3, 12}, {185, 99, 3, 207}, {185, 99, 3, 214}, {185, 164, 34, 252}, {185, 212, 111, 6}, {185, 212, 111, 41}, {185, 212, 111, 59}}}, + {Region: "Brazil", IPs: []net.IP{{181, 215, 183, 244}, {181, 215, 183, 248}, {191, 96, 70, 171}}}, + {Region: "Bulgaria", IPs: []net.IP{{37, 120, 152, 35}, {37, 120, 152, 37}, {37, 120, 152, 39}, {37, 120, 152, 195}, {37, 120, 152, 197}, {217, 138, 202, 19}, {217, 138, 202, 21}}}, + {Region: "Canada Montreal", IPs: []net.IP{{172, 98, 82, 83}, {172, 98, 82, 85}, {172, 98, 82, 243}, {172, 98, 82, 245}, {198, 8, 85, 3}, {198, 8, 85, 5}, {198, 8, 85, 19}, {198, 8, 85, 21}, {198, 8, 85, 35}, {198, 8, 85, 37}, {198, 8, 85, 40}, {198, 8, 85, 42}, {198, 8, 85, 45}, {198, 8, 85, 47}, {198, 8, 85, 69}, {198, 8, 85, 72}, {198, 8, 85, 74}, {198, 8, 85, 77}, {198, 8, 85, 79}, {198, 8, 85, 82}, {198, 8, 85, 84}, {198, 8, 85, 87}, {198, 8, 85, 131}, {198, 8, 85, 133}}}, + {Region: "Canada Toronto", IPs: []net.IP{{68, 71, 244, 131}, {68, 71, 244, 134}, {68, 71, 244, 195}, {68, 71, 244, 197}, {68, 71, 244, 200}, {68, 71, 244, 202}, {68, 71, 244, 210}, {68, 71, 244, 212}, {68, 71, 244, 215}, {68, 71, 244, 217}, {68, 71, 244, 220}, {68, 71, 244, 222}, {104, 200, 138, 3}, {104, 200, 138, 5}, {104, 200, 138, 7}, {104, 200, 138, 147}, {104, 200, 138, 149}, {104, 200, 138, 152}, {104, 200, 138, 154}, {104, 200, 138, 163}, {104, 200, 138, 165}, {162, 253, 71, 211}, {162, 253, 71, 213}, {162, 253, 71, 215}}}, + {Region: "Canada US", IPs: []net.IP{{159, 203, 57, 80}}}, + {Region: "Canada Vancouver", IPs: []net.IP{{66, 115, 147, 67}, {66, 115, 147, 69}, {66, 115, 147, 72}, {66, 115, 147, 74}, {66, 115, 147, 79}, {66, 115, 147, 82}, {66, 115, 147, 84}, {66, 115, 147, 87}, {66, 115, 147, 89}, {66, 115, 147, 92}, {66, 115, 147, 94}, {104, 200, 132, 35}, {104, 200, 132, 37}, {104, 200, 132, 39}, {107, 181, 177, 179}, {107, 181, 177, 181}, {107, 181, 177, 183}, {172, 83, 40, 147}, {172, 83, 40, 149}, {208, 78, 41, 195}, {208, 78, 41, 197}, {208, 78, 41, 200}, {208, 78, 41, 202}}}, + {Region: "Chile", IPs: []net.IP{{31, 169, 121, 16}, {131, 221, 32, 195}}}, + {Region: "Colombia", IPs: []net.IP{{45, 129, 32, 15}}}, + {Region: "Costa Rica", IPs: []net.IP{{176, 227, 241, 21}}}, + {Region: "Croatia", IPs: []net.IP{{85, 10, 56, 226}, {85, 10, 56, 228}, {89, 164, 99, 109}, {89, 164, 99, 111}}}, + {Region: "Cyprus", IPs: []net.IP{{195, 47, 194, 40}, {195, 47, 194, 42}}}, + {Region: "Czech Republic", IPs: []net.IP{{95, 168, 209, 111}, {185, 152, 64, 151}, {185, 152, 64, 178}, {193, 9, 112, 179}, {193, 9, 112, 181}, {193, 9, 112, 183}, {193, 9, 112, 195}, {193, 9, 112, 197}, {193, 9, 112, 199}}}, + {Region: "Denmark", IPs: []net.IP{{37, 120, 145, 19}, {37, 120, 145, 21}, {37, 120, 194, 91}, {37, 120, 194, 93}, {37, 120, 194, 99}, {37, 120, 194, 101}, {37, 120, 194, 107}, {37, 120, 194, 109}, {37, 120, 194, 115}, {37, 120, 194, 117}, {37, 120, 194, 123}, {37, 120, 194, 125}, {37, 120, 194, 163}, {37, 120, 194, 165}, {45, 12, 221, 163}, {45, 12, 221, 165}, {45, 12, 221, 167}, {45, 12, 221, 179}, {45, 12, 221, 181}, {45, 12, 221, 183}, {95, 174, 65, 67}, {95, 174, 65, 69}, {95, 174, 65, 71}}}, + {Region: "Estonia", IPs: []net.IP{{165, 231, 163, 3}, {165, 231, 163, 5}, {165, 231, 163, 7}, {165, 231, 163, 19}, {165, 231, 163, 21}, {165, 231, 163, 23}, {185, 174, 159, 51}, {185, 174, 159, 53}, {185, 174, 159, 59}, {185, 174, 159, 61}, {185, 174, 159, 67}, {185, 174, 159, 69}}}, + {Region: "Finland", IPs: []net.IP{{196, 244, 191, 163}, {196, 244, 191, 165}, {196, 244, 191, 195}, {196, 244, 191, 197}}}, + {Region: "France Bordeaux", IPs: []net.IP{{185, 108, 106, 19}, {185, 108, 106, 21}, {185, 108, 106, 51}, {185, 108, 106, 53}, {185, 108, 106, 67}, {185, 108, 106, 69}, {185, 108, 106, 140}, {185, 108, 106, 142}, {185, 108, 106, 144}, {185, 108, 106, 146}, {185, 108, 106, 148}, {185, 108, 106, 150}, {185, 108, 106, 152}, {185, 108, 106, 154}, {185, 108, 106, 158}, {185, 108, 106, 160}, {185, 108, 106, 162}, {185, 108, 106, 164}, {185, 108, 106, 166}}}, + {Region: "France Marseilles", IPs: []net.IP{{185, 166, 84, 5}, {185, 166, 84, 19}, {185, 166, 84, 23}, {185, 166, 84, 29}, {185, 166, 84, 31}, {185, 166, 84, 36}, {185, 166, 84, 38}, {185, 166, 84, 51}, {185, 166, 84, 55}, {185, 166, 84, 57}, {185, 166, 84, 59}, {185, 166, 84, 61}, {185, 166, 84, 63}, {185, 166, 84, 75}, {185, 166, 84, 79}, {185, 166, 84, 81}, {185, 166, 84, 87}, {185, 166, 84, 89}, {185, 166, 84, 93}, {185, 166, 84, 95}}}, + {Region: "France Paris", IPs: []net.IP{{45, 83, 90, 179}, {45, 83, 90, 181}, {45, 83, 90, 183}, {45, 89, 174, 59}, {45, 89, 174, 61}, {45, 89, 174, 85}, {45, 89, 174, 91}, {45, 89, 174, 93}, {45, 89, 174, 101}, {45, 89, 174, 103}, {84, 17, 43, 178}, {84, 17, 43, 180}, {84, 17, 43, 183}, {84, 17, 43, 185}, {84, 17, 60, 235}, {84, 17, 60, 250}, {84, 247, 51, 235}, {84, 247, 51, 243}, {84, 247, 51, 245}, {84, 247, 51, 253}, {185, 246, 211, 69}, {185, 246, 211, 103}, {217, 138, 207, 243}, {217, 138, 207, 245}}}, + {Region: "France Sweden", IPs: []net.IP{{199, 247, 8, 20}}}, + {Region: "Germany Berlin", IPs: []net.IP{{37, 120, 217, 131}, {37, 120, 217, 147}, {37, 120, 217, 149}, {37, 120, 217, 179}, {37, 120, 217, 181}, {152, 89, 163, 19}, {152, 89, 163, 21}, {152, 89, 163, 23}, {152, 89, 163, 227}, {152, 89, 163, 229}, {152, 89, 163, 231}, {152, 89, 163, 243}, {193, 176, 86, 195}, {193, 176, 86, 199}, {217, 138, 216, 59}, {217, 138, 216, 61}, {217, 138, 216, 219}, {217, 138, 216, 227}, {217, 138, 216, 229}, {217, 138, 216, 235}, {217, 138, 216, 237}, {217, 138, 216, 243}, {217, 138, 216, 245}, {217, 138, 216, 251}, {217, 138, 216, 253}}}, + {Region: "Germany Frankfurt am Main st001", IPs: []net.IP{{45, 87, 212, 179}}}, + {Region: "Germany Frankfurt am Main st002", IPs: []net.IP{{45, 87, 212, 181}}}, + {Region: "Germany Frankfurt am Main st003", IPs: []net.IP{{45, 87, 212, 183}}}, + {Region: "Germany Frankfurt am Main", IPs: []net.IP{{37, 120, 196, 53}, {37, 120, 196, 59}, {37, 120, 196, 61}, {37, 120, 196, 173}, {37, 120, 197, 11}, {37, 120, 197, 13}, {82, 102, 16, 99}, {82, 102, 16, 101}, {84, 16, 240, 174}, {84, 16, 240, 176}, {89, 187, 169, 104}, {89, 187, 169, 119}, {185, 59, 220, 144}, {185, 59, 220, 150}, {185, 59, 220, 168}, {185, 59, 220, 172}, {185, 93, 180, 101}, {185, 102, 219, 6}, {185, 102, 219, 47}, {185, 102, 219, 49}, {185, 158, 135, 36}}}, + {Region: "Germany Munich", IPs: []net.IP{{178, 238, 231, 53}, {178, 238, 231, 55}}}, + {Region: "Germany Nuremberg", IPs: []net.IP{{62, 171, 149, 160}, {62, 171, 149, 162}, {62, 171, 151, 180}, {62, 171, 151, 182}}}, + {Region: "Germany Singapour", IPs: []net.IP{{159, 89, 14, 157}}}, + {Region: "Germany UK", IPs: []net.IP{{46, 101, 250, 73}}}, + {Region: "Greece", IPs: []net.IP{{87, 239, 248, 78}, {87, 239, 248, 80}, {87, 239, 248, 82}, {87, 239, 248, 85}, {87, 239, 248, 87}, {185, 226, 65, 150}}}, + {Region: "Hong Kong", IPs: []net.IP{{64, 120, 121, 216}, {64, 120, 121, 232}, {64, 120, 121, 234}, {64, 120, 121, 236}, {64, 120, 121, 238}, {64, 120, 121, 240}, {64, 120, 121, 244}, {64, 120, 121, 246}, {64, 120, 121, 248}, {84, 17, 37, 154}, {84, 17, 37, 156}, {84, 17, 37, 158}, {84, 17, 37, 160}, {84, 17, 57, 185}, {209, 58, 186, 10}, {209, 58, 186, 12}, {209, 58, 186, 14}, {209, 58, 186, 16}, {209, 58, 186, 18}}}, + {Region: "Hungary", IPs: []net.IP{{37, 120, 144, 147}, {37, 120, 144, 149}, {37, 120, 144, 151}, {37, 120, 144, 197}, {37, 120, 144, 199}, {37, 120, 144, 211}, {37, 120, 144, 213}, {37, 120, 144, 215}, {37, 120, 144, 243}, {37, 120, 144, 245}}}, + {Region: "Iceland", IPs: []net.IP{{82, 221, 128, 156}}}, + {Region: "India Chennai", IPs: []net.IP{{103, 94, 27, 99}, {103, 94, 27, 101}, {103, 94, 27, 115}, {103, 94, 27, 117}, {103, 94, 27, 179}, {103, 94, 27, 181}, {103, 94, 27, 227}, {103, 94, 27, 229}, {103, 108, 117, 131}, {103, 108, 117, 133}, {103, 108, 117, 147}, {103, 108, 117, 149}, {103, 108, 117, 151}}}, + {Region: "India Indore", IPs: []net.IP{{103, 39, 132, 187}, {103, 39, 132, 189}, {103, 73, 189, 219}, {103, 73, 189, 221}, {137, 59, 52, 107}, {137, 59, 52, 109}}}, + {Region: "India Mumbai", IPs: []net.IP{{103, 221, 233, 61}, {103, 221, 233, 86}, {103, 221, 233, 88}, {103, 221, 233, 89}, {103, 221, 233, 91}, {165, 231, 253, 147}, {165, 231, 253, 149}, {165, 231, 253, 163}}}, + {Region: "India UK", IPs: []net.IP{{134, 209, 148, 122}}}, + {Region: "Indonesia", IPs: []net.IP{{103, 227, 255, 211}, {103, 227, 255, 213}, {103, 227, 255, 215}}}, + {Region: "Ireland", IPs: []net.IP{{185, 108, 128, 114}, {185, 108, 128, 118}, {185, 108, 128, 159}, {185, 108, 128, 161}, {185, 108, 128, 181}, {185, 108, 128, 183}, {185, 108, 128, 185}, {217, 138, 222, 43}, {217, 138, 222, 45}, {217, 138, 222, 51}, {217, 138, 222, 53}}}, + {Region: "Israel", IPs: []net.IP{{87, 239, 255, 107}, {87, 239, 255, 109}, {87, 239, 255, 111}, {87, 239, 255, 114}, {87, 239, 255, 116}, {87, 239, 255, 119}, {87, 239, 255, 121}}}, + {Region: "Italy Milan", IPs: []net.IP{{37, 120, 201, 23}, {37, 120, 201, 67}, {37, 120, 201, 69}, {37, 120, 201, 71}, {45, 9, 251, 163}, {84, 17, 58, 136}, {84, 17, 58, 146}, {84, 17, 58, 148}, {84, 17, 58, 150}, {84, 17, 58, 152}, {84, 17, 58, 154}, {84, 17, 58, 156}, {84, 17, 58, 159}, {84, 17, 58, 161}, {84, 17, 58, 190}, {84, 17, 58, 195}, {84, 17, 58, 197}, {84, 17, 58, 200}, {84, 17, 58, 207}, {95, 174, 64, 69}, {95, 174, 64, 71}, {185, 128, 27, 41}, {212, 102, 54, 145}, {212, 102, 54, 160}, {212, 102, 54, 162}}}, + {Region: "Japan Tokyo st001", IPs: []net.IP{{45, 87, 213, 19}}}, + {Region: "Japan Tokyo st002", IPs: []net.IP{{45, 87, 213, 21}}}, + {Region: "Japan Tokyo st003", IPs: []net.IP{{45, 87, 213, 23}}}, + {Region: "Japan Tokyo st004", IPs: []net.IP{{217, 138, 212, 19}}}, + {Region: "Japan Tokyo st005", IPs: []net.IP{{217, 138, 212, 21}}}, + {Region: "Japan Tokyo st006", IPs: []net.IP{{82, 102, 28, 123}}}, + {Region: "Japan Tokyo st007", IPs: []net.IP{{82, 102, 28, 125}}}, + {Region: "Japan Tokyo", IPs: []net.IP{{45, 87, 213, 3}, {45, 87, 213, 5}, {45, 87, 213, 7}, {45, 87, 213, 83}, {45, 87, 213, 85}, {45, 87, 213, 87}, {45, 87, 213, 101}, {45, 87, 213, 103}, {45, 87, 213, 105}, {45, 87, 213, 211}, {45, 87, 213, 213}, {45, 87, 213, 243}, {45, 87, 213, 245}, {84, 17, 34, 24}, {84, 17, 34, 26}, {84, 17, 34, 44}, {84, 17, 34, 46}, {89, 187, 161, 2}, {89, 187, 161, 4}, {89, 187, 161, 239}, {89, 187, 161, 241}, {103, 208, 221, 227}, {103, 208, 221, 229}, {185, 242, 4, 163}}}, + {Region: "Kazakhstan", IPs: []net.IP{{45, 136, 56, 54}, {45, 136, 56, 57}, {45, 136, 56, 61}, {45, 136, 56, 64}}}, + {Region: "Korea", IPs: []net.IP{{27, 255, 77, 195}, {27, 255, 77, 197}, {27, 255, 77, 226}, {61, 14, 210, 227}, {61, 14, 210, 229}, {61, 14, 210, 232}, {61, 14, 210, 234}, {61, 14, 210, 237}, {61, 14, 210, 239}, {61, 14, 210, 242}, {61, 14, 210, 244}, {61, 97, 243, 119}, {61, 97, 243, 124}, {103, 249, 28, 215}, {103, 249, 28, 227}, {103, 249, 28, 229}, {103, 249, 28, 231}}}, + {Region: "Latvia", IPs: []net.IP{{91, 203, 70, 186}, {91, 203, 70, 188}, {188, 92, 78, 135}, {188, 92, 78, 137}, {188, 92, 78, 140}, {188, 92, 78, 142}, {188, 92, 78, 145}, {188, 92, 78, 147}, {188, 92, 78, 150}, {188, 92, 78, 152}}}, + {Region: "Libya", IPs: []net.IP{{41, 208, 72, 157}, {41, 208, 72, 204}, {41, 208, 72, 207}}}, + {Region: "Luxembourg", IPs: []net.IP{{185, 153, 151, 60}, {185, 153, 151, 62}, {185, 153, 151, 64}, {185, 153, 151, 66}, {185, 153, 151, 68}, {185, 153, 151, 70}, {185, 153, 151, 73}, {185, 153, 151, 75}, {185, 153, 151, 78}, {185, 153, 151, 80}, {185, 153, 151, 82}, {185, 153, 151, 83}, {185, 153, 151, 85}, {185, 153, 151, 87}, {185, 153, 151, 91}}}, + {Region: "Malaysia", IPs: []net.IP{{42, 0, 30, 135}, {42, 0, 30, 160}, {42, 0, 30, 162}, {42, 0, 30, 164}, {42, 0, 30, 177}, {42, 0, 30, 179}, {42, 0, 30, 209}, {42, 0, 30, 213}, {42, 0, 30, 215}}}, + {Region: "Moldova", IPs: []net.IP{{178, 175, 148, 39}}}, + {Region: "Netherlands Amsterdam st001", IPs: []net.IP{{81, 19, 209, 51}}}, + {Region: "Netherlands Amsterdam", IPs: []net.IP{{81, 19, 208, 56}, {81, 19, 208, 68}, {81, 19, 209, 20}, {81, 19, 209, 57}, {81, 19, 209, 113}, {81, 19, 209, 124}, {89, 46, 223, 78}, {89, 46, 223, 86}, {89, 46, 223, 92}, {89, 46, 223, 100}, {89, 46, 223, 104}, {89, 46, 223, 106}, {89, 46, 223, 212}, {89, 46, 223, 214}, {89, 46, 223, 217}, {89, 46, 223, 222}, {89, 46, 223, 224}, {89, 46, 223, 227}, {89, 187, 174, 231}, {185, 59, 222, 92}, {185, 59, 222, 94}, {185, 59, 222, 166}, {185, 59, 222, 168}, {185, 232, 20, 131}}}, + {Region: "Netherlands US", IPs: []net.IP{{188, 166, 98, 91}}}, + {Region: "New Zealand", IPs: []net.IP{{180, 149, 231, 3}, {180, 149, 231, 11}, {180, 149, 231, 13}, {180, 149, 231, 43}, {180, 149, 231, 45}, {180, 149, 231, 67}, {180, 149, 231, 69}, {180, 149, 231, 115}, {180, 149, 231, 117}, {180, 149, 231, 119}, {180, 149, 231, 163}, {180, 149, 231, 165}}}, + {Region: "Nigeria", IPs: []net.IP{{102, 165, 23, 4}, {102, 165, 23, 6}, {102, 165, 23, 38}, {102, 165, 23, 40}, {102, 165, 23, 42}}}, + {Region: "North Macedonia", IPs: []net.IP{{185, 225, 28, 67}, {185, 225, 28, 69}, {185, 225, 28, 83}, {185, 225, 28, 85}, {185, 225, 28, 91}, {185, 225, 28, 93}, {185, 225, 28, 99}, {185, 225, 28, 101}, {185, 225, 28, 107}, {185, 225, 28, 109}}}, + {Region: "Norway", IPs: []net.IP{{45, 12, 223, 67}, {45, 12, 223, 69}, {45, 12, 223, 71}, {45, 12, 223, 195}, {45, 12, 223, 197}, {45, 12, 223, 211}, {45, 12, 223, 213}, {84, 247, 50, 27}, {84, 247, 50, 29}, {84, 247, 50, 67}, {84, 247, 50, 69}, {95, 174, 66, 35}, {95, 174, 66, 37}, {95, 174, 66, 39}, {95, 174, 66, 41}}}, + {Region: "Paraguay", IPs: []net.IP{{181, 40, 18, 47}, {181, 40, 18, 56}, {181, 40, 18, 59}, {186, 16, 32, 163}, {186, 16, 32, 173}}}, + {Region: "Philippines", IPs: []net.IP{{45, 134, 224, 3}, {45, 134, 224, 5}, {45, 134, 224, 8}, {45, 134, 224, 10}}}, + {Region: "Poland Gdansk", IPs: []net.IP{{5, 187, 49, 187}, {5, 187, 49, 189}, {5, 187, 53, 51}, {5, 187, 53, 53}, {5, 187, 53, 55}}}, + {Region: "Poland Warsaw", IPs: []net.IP{{5, 253, 206, 67}, {5, 253, 206, 69}, {5, 253, 206, 71}, {5, 253, 206, 227}, {5, 253, 206, 229}, {84, 17, 55, 132}, {84, 17, 55, 134}, {185, 246, 208, 72}, {185, 246, 208, 77}, {185, 246, 208, 105}, {185, 246, 208, 107}, {185, 246, 208, 176}, {185, 246, 208, 182}}}, + {Region: "Portugal Lisbon", IPs: []net.IP{{5, 154, 174, 26}, {5, 154, 174, 65}, {5, 154, 174, 67}, {5, 154, 174, 75}, {5, 154, 174, 77}, {5, 154, 174, 99}, {5, 154, 174, 101}, {5, 154, 174, 115}, {5, 154, 174, 117}, {5, 154, 174, 171}, {5, 154, 174, 173}, {5, 154, 174, 179}, {5, 154, 174, 181}, {5, 154, 174, 187}, {5, 154, 174, 189}, {5, 154, 174, 211}, {5, 154, 174, 213}, {5, 154, 174, 219}, {5, 154, 174, 221}, {5, 154, 174, 227}, {5, 154, 174, 229}}}, + {Region: "Portugal Loule", IPs: []net.IP{{176, 61, 146, 84}, {176, 61, 146, 86}, {176, 61, 146, 106}, {176, 61, 146, 108}, {176, 61, 146, 113}, {176, 61, 146, 116}, {176, 61, 146, 118}, {176, 61, 146, 121}, {176, 61, 146, 123}, {176, 61, 148, 60}, {176, 61, 148, 62}}}, + {Region: "Portugal Porto", IPs: []net.IP{{194, 39, 127, 21}, {194, 39, 127, 23}, {194, 39, 127, 36}, {194, 39, 127, 38}, {194, 39, 127, 231}, {194, 39, 127, 233}, {194, 39, 127, 240}, {194, 39, 127, 242}, {194, 39, 127, 244}}}, + {Region: "Romania", IPs: []net.IP{{86, 106, 137, 147}, {86, 106, 137, 149}, {194, 68, 44, 61}}}, + {Region: "Russia Moscow", IPs: []net.IP{{213, 183, 56, 18}, {213, 183, 56, 145}, {213, 183, 56, 160}, {213, 183, 56, 166}, {213, 183, 56, 233}, {213, 183, 56, 236}}}, + {Region: "Russia St. Petersburg", IPs: []net.IP{{213, 183, 54, 23}, {213, 183, 54, 109}, {213, 183, 54, 143}, {213, 183, 54, 165}}}, + {Region: "Serbia", IPs: []net.IP{{37, 120, 193, 51}, {37, 120, 193, 53}, {152, 89, 160, 115}, {152, 89, 160, 117}, {152, 89, 160, 119}, {152, 89, 160, 121}, {152, 89, 160, 123}, {152, 89, 160, 125}, {152, 89, 160, 211}, {152, 89, 160, 213}, {152, 89, 160, 215}}}, + {Region: "Singapore Hong Kong", IPs: []net.IP{{206, 189, 83, 129}}}, + {Region: "Singapore Netherlands", IPs: []net.IP{{104, 248, 148, 18}}}, + {Region: "Singapore st001", IPs: []net.IP{{217, 138, 201, 91}}}, + {Region: "Singapore st002", IPs: []net.IP{{217, 138, 201, 93}}}, + {Region: "Singapore st003", IPs: []net.IP{{84, 247, 49, 19}}}, + {Region: "Singapore st004", IPs: []net.IP{{84, 247, 49, 21}}}, + {Region: "Singapore", IPs: []net.IP{{89, 187, 163, 130}, {89, 187, 163, 132}, {89, 187, 163, 134}, {89, 187, 163, 136}, {103, 254, 153, 171}, {103, 254, 153, 176}, {103, 254, 155, 229}, {103, 254, 155, 241}, {209, 58, 170, 134}, {209, 58, 170, 142}, {209, 58, 170, 144}, {209, 58, 170, 146}, {209, 58, 170, 159}, {209, 58, 170, 163}, {209, 58, 170, 164}, {209, 58, 170, 169}, {209, 58, 170, 172}, {209, 58, 176, 43}, {209, 58, 176, 45}, {209, 58, 176, 47}}}, + {Region: "Slovekia", IPs: []net.IP{{37, 120, 221, 3}, {37, 120, 221, 5}, {193, 37, 255, 35}, {193, 37, 255, 37}, {193, 37, 255, 39}, {193, 37, 255, 41}}}, + {Region: "Slovenia", IPs: []net.IP{{195, 158, 249, 36}, {195, 158, 249, 38}, {195, 158, 249, 40}, {195, 158, 249, 42}}}, + {Region: "South Africa", IPs: []net.IP{{154, 127, 49, 226}, {154, 127, 49, 228}, {154, 127, 49, 230}, {154, 127, 49, 232}, {196, 251, 250, 111}}}, + {Region: "Spain Barcelona", IPs: []net.IP{{37, 120, 142, 133}, {37, 120, 142, 135}, {185, 188, 61, 5}, {185, 188, 61, 7}}}, + {Region: "Spain Madrid", IPs: []net.IP{{37, 120, 148, 213}, {82, 102, 17, 179}, {82, 102, 17, 181}, {82, 102, 17, 183}, {82, 102, 17, 185}, {84, 17, 62, 163}, {84, 17, 62, 165}, {84, 17, 62, 181}, {89, 37, 95, 7}, {89, 37, 95, 9}, {89, 37, 95, 11}, {89, 37, 95, 15}, {89, 37, 95, 17}, {89, 37, 95, 19}, {89, 37, 95, 25}, {188, 208, 141, 98}, {188, 208, 141, 114}, {212, 102, 48, 2}, {212, 102, 48, 4}, {212, 102, 48, 8}, {212, 102, 48, 10}, {212, 102, 48, 13}, {212, 102, 48, 15}, {212, 102, 48, 18}, {212, 102, 48, 20}}}, + {Region: "Spain Valencia", IPs: []net.IP{{185, 153, 150, 44}, {185, 153, 150, 46}, {185, 153, 150, 48}, {185, 153, 150, 50}, {185, 153, 150, 52}, {185, 153, 150, 54}, {185, 153, 150, 56}, {185, 153, 150, 58}, {196, 196, 150, 67}, {196, 196, 150, 69}, {196, 196, 150, 71}, {196, 196, 150, 83}, {196, 196, 150, 85}}}, + {Region: "Sweden", IPs: []net.IP{{45, 83, 91, 131}, {45, 83, 91, 133}, {45, 83, 91, 135}, {45, 83, 91, 147}, {45, 83, 91, 149}, {45, 83, 91, 151}, {46, 227, 69, 23}, {46, 227, 69, 25}, {46, 227, 69, 27}, {46, 227, 69, 29}, {185, 76, 9, 34}, {185, 76, 9, 36}, {185, 76, 9, 39}, {185, 76, 9, 41}, {185, 76, 9, 44}, {185, 76, 9, 46}, {185, 76, 9, 49}, {185, 76, 9, 51}}}, + {Region: "Switzerland", IPs: []net.IP{{37, 120, 213, 3}, {37, 120, 213, 7}, {45, 12, 222, 245}, {84, 17, 53, 86}, {84, 17, 53, 166}, {84, 17, 53, 168}, {84, 17, 53, 208}, {84, 17, 53, 210}, {84, 17, 53, 212}, {84, 17, 53, 216}, {84, 17, 53, 219}, {84, 17, 53, 221}, {84, 17, 53, 223}, {84, 17, 53, 225}, {84, 17, 53, 227}, {84, 39, 112, 35}}}, + {Region: "Taiwan", IPs: []net.IP{{2, 58, 241, 3}, {2, 58, 241, 5}, {2, 58, 242, 43}, {2, 58, 242, 45}, {2, 58, 242, 155}, {2, 58, 242, 157}, {2, 58, 243, 51}, {2, 58, 243, 53}, {103, 51, 140, 70}, {103, 51, 140, 72}, {103, 51, 140, 74}, {103, 98, 74, 227}, {103, 98, 74, 229}, {103, 98, 75, 71}, {103, 98, 75, 73}, {103, 103, 128, 30}}}, + {Region: "Thailand", IPs: []net.IP{{45, 64, 186, 134}, {45, 64, 186, 163}, {103, 253, 74, 7}}}, + {Region: "Turkey", IPs: []net.IP{{185, 195, 79, 3}}}, + {Region: "UK France", IPs: []net.IP{{188, 166, 168, 247}}}, + {Region: "UK Germany", IPs: []net.IP{{45, 77, 58, 16}}}, + {Region: "UK Glasgow", IPs: []net.IP{{185, 108, 105, 5}, {185, 108, 105, 13}, {185, 108, 105, 18}, {185, 108, 105, 20}, {185, 108, 105, 22}, {185, 108, 105, 40}}}, + {Region: "UK London st001", IPs: []net.IP{{217, 146, 82, 83}}}, + {Region: "UK London st002", IPs: []net.IP{{185, 134, 22, 80}}}, + {Region: "UK London st003", IPs: []net.IP{{185, 134, 22, 92}}}, + {Region: "UK London st004", IPs: []net.IP{{185, 44, 76, 186}}}, + {Region: "UK London st005", IPs: []net.IP{{185, 44, 76, 188}}}, + {Region: "UK London", IPs: []net.IP{{5, 226, 139, 65}, {5, 226, 139, 225}, {81, 19, 210, 234}, {89, 35, 29, 71}, {178, 239, 166, 222}, {178, 239, 166, 227}, {178, 239, 166, 234}, {178, 239, 166, 250}, {185, 16, 206, 69}, {185, 38, 148, 228}, {185, 38, 150, 41}, {185, 38, 150, 88}, {185, 38, 150, 124}, {185, 44, 76, 167}, {185, 44, 76, 172}, {185, 114, 224, 53}, {185, 114, 224, 115}, {185, 114, 224, 119}, {185, 125, 207, 155}, {185, 125, 207, 177}, {185, 134, 22, 191}, {185, 193, 36, 208}, {195, 140, 215, 42}}}, + {Region: "UK Manchester", IPs: []net.IP{{37, 120, 200, 2}, {86, 106, 136, 67}, {86, 106, 136, 69}, {86, 106, 136, 85}, {89, 238, 130, 196}, {89, 238, 140, 226}, {89, 238, 140, 227}, {89, 238, 140, 229}, {89, 238, 143, 100}, {89, 238, 143, 101}, {89, 238, 143, 103}, {89, 238, 143, 105}, {92, 119, 176, 19}, {92, 119, 176, 21}, {92, 119, 176, 23}, {192, 145, 126, 130}, {192, 145, 126, 131}, {192, 145, 126, 133}, {193, 148, 17, 82}, {193, 148, 17, 130}, {195, 12, 48, 212}, {195, 12, 48, 213}, {195, 12, 48, 215}, {195, 12, 48, 217}, {217, 138, 196, 91}}}, + {Region: "US Atlanta", IPs: []net.IP{{66, 115, 154, 131}, {66, 115, 154, 133}, {66, 115, 154, 135}, {66, 115, 154, 147}, {66, 115, 154, 149}, {66, 115, 154, 151}, {66, 115, 169, 35}, {66, 115, 175, 35}, {66, 115, 175, 37}, {66, 115, 175, 40}, {66, 115, 175, 42}, {66, 115, 175, 45}, {66, 115, 175, 47}, {66, 115, 175, 50}, {66, 115, 175, 52}, {185, 93, 0, 143}, {185, 93, 0, 146}}}, + {Region: "US Bend", IPs: []net.IP{{45, 43, 14, 73}, {45, 43, 14, 75}, {45, 43, 14, 83}, {45, 43, 14, 85}, {45, 43, 14, 93}, {45, 43, 14, 95}, {45, 43, 14, 103}, {45, 43, 14, 105}, {154, 16, 168, 184}, {154, 16, 168, 186}, {154, 16, 168, 188}}}, + {Region: "US Boston", IPs: []net.IP{{173, 237, 207, 11}, {173, 237, 207, 13}, {173, 237, 207, 15}, {173, 237, 207, 21}, {173, 237, 207, 25}, {173, 237, 207, 30}, {173, 237, 207, 32}, {173, 237, 207, 36}, {173, 237, 207, 38}, {173, 237, 207, 42}, {173, 237, 207, 44}, {192, 34, 83, 230}, {192, 34, 83, 232}, {192, 34, 83, 234}, {192, 34, 83, 236}, {199, 217, 107, 20}, {199, 217, 107, 22}, {199, 217, 107, 25}, {199, 217, 107, 27}}}, + {Region: "US Buffalo", IPs: []net.IP{{107, 174, 20, 130}, {107, 174, 20, 132}, {107, 174, 20, 134}, {107, 175, 104, 82}, {107, 175, 104, 84}, {107, 175, 104, 86}, {172, 93, 153, 146}, {172, 93, 153, 148}, {172, 93, 153, 150}}}, + {Region: "US Charlotte", IPs: []net.IP{{66, 11, 124, 136}, {66, 11, 124, 138}, {66, 11, 124, 140}, {66, 11, 124, 142}, {66, 11, 124, 144}, {155, 254, 28, 141}, {155, 254, 29, 163}, {155, 254, 29, 165}, {155, 254, 31, 182}, {155, 254, 31, 184}, {192, 154, 253, 67}, {192, 154, 253, 69}, {192, 154, 254, 135}, {192, 154, 254, 137}, {192, 154, 255, 52}, {192, 154, 255, 54}}}, + {Region: "US Chicago", IPs: []net.IP{{74, 119, 146, 115}, {74, 119, 146, 117}, {74, 119, 146, 119}, {74, 119, 146, 133}, {74, 119, 146, 179}, {74, 119, 146, 181}, {74, 119, 146, 183}, {74, 119, 146, 195}, {74, 119, 146, 197}, {74, 119, 146, 199}, {74, 119, 146, 211}, {89, 187, 182, 173}, {89, 187, 182, 175}, {107, 152, 100, 19}, {107, 152, 100, 21}, {107, 152, 100, 24}, {107, 152, 100, 26}, {184, 170, 250, 69}, {184, 170, 250, 74}, {184, 170, 250, 149}, {184, 170, 250, 154}}}, + {Region: "US Dallas", IPs: []net.IP{{66, 115, 177, 131}, {66, 115, 177, 133}, {66, 115, 177, 136}, {66, 115, 177, 138}, {66, 115, 177, 141}, {66, 115, 177, 143}, {66, 115, 177, 146}, {66, 115, 177, 148}, {66, 115, 177, 151}, {66, 115, 177, 153}, {66, 115, 177, 156}, {66, 115, 177, 158}, {89, 187, 175, 165}, {89, 187, 175, 167}, {107, 181, 173, 163}, {172, 241, 114, 87}, {212, 102, 40, 66}, {212, 102, 40, 68}, {212, 102, 40, 71}, {212, 102, 40, 73}, {212, 102, 40, 76}, {212, 102, 40, 78}, {212, 102, 40, 81}}}, + {Region: "US Denver", IPs: []net.IP{{174, 128, 245, 3}, {174, 128, 245, 5}, {212, 102, 44, 66}, {212, 102, 44, 68}, {212, 102, 44, 71}, {212, 102, 44, 73}, {212, 102, 44, 76}, {212, 102, 44, 78}, {212, 102, 44, 81}, {212, 102, 44, 83}, {212, 102, 44, 86}, {212, 102, 44, 88}, {212, 102, 44, 91}, {212, 102, 44, 93}}}, + {Region: "US Gahanna", IPs: []net.IP{{104, 244, 208, 35}, {104, 244, 208, 37}, {104, 244, 208, 99}, {104, 244, 208, 101}, {104, 244, 208, 107}, {104, 244, 208, 203}, {104, 244, 208, 205}, {104, 244, 208, 229}, {104, 244, 208, 231}, {104, 244, 209, 51}, {104, 244, 209, 53}, {104, 244, 211, 139}, {104, 244, 211, 141}, {104, 244, 211, 171}, {104, 244, 211, 173}, {104, 244, 211, 179}}}, + {Region: "US Houston", IPs: []net.IP{{104, 148, 30, 35}, {104, 148, 30, 37}, {104, 148, 30, 39}, {104, 148, 30, 53}, {104, 148, 30, 55}, {104, 148, 30, 83}, {104, 148, 30, 85}, {104, 148, 30, 87}, {199, 10, 64, 67}, {199, 10, 64, 69}, {199, 10, 64, 83}, {199, 10, 64, 85}, {199, 10, 64, 99}, {199, 10, 64, 101}, {199, 10, 64, 115}, {199, 10, 64, 117}}}, + {Region: "US Kansas City", IPs: []net.IP{{63, 141, 236, 243}, {63, 141, 248, 179}, {63, 141, 248, 181}, {107, 150, 39, 43}, {173, 208, 202, 59}, {173, 208, 202, 61}, {198, 204, 231, 147}, {198, 204, 231, 149}, {204, 12, 208, 115}, {204, 12, 208, 117}}}, + {Region: "US Las Vegas", IPs: []net.IP{{89, 187, 187, 147}, {89, 187, 187, 149}, {185, 242, 5, 211}, {185, 242, 5, 213}, {185, 242, 5, 215}}}, + {Region: "US Latham", IPs: []net.IP{{45, 43, 19, 66}, {45, 43, 19, 68}, {45, 43, 19, 74}, {45, 43, 19, 76}, {45, 43, 19, 82}, {45, 43, 19, 84}, {45, 43, 19, 90}, {45, 43, 19, 92}, {154, 16, 169, 3}, {154, 16, 169, 5}, {154, 16, 169, 7}}}, + {Region: "US Los Angeles", IPs: []net.IP{{38, 95, 110, 67}, {38, 95, 110, 71}, {89, 187, 187, 66}, {89, 187, 187, 68}, {89, 187, 187, 71}, {89, 187, 187, 73}, {89, 187, 187, 76}, {89, 187, 187, 78}, {89, 187, 187, 81}, {89, 187, 187, 83}, {89, 187, 187, 86}, {172, 83, 44, 83}, {184, 170, 243, 199}, {184, 170, 243, 211}, {192, 111, 134, 67}, {192, 111, 134, 78}, {192, 111, 134, 80}, {192, 111, 134, 195}, {192, 111, 134, 202}, {192, 111, 134, 207}, {192, 111, 134, 210}, {192, 111, 134, 215}, {192, 111, 134, 217}, {192, 111, 134, 220}, {192, 111, 134, 222}}}, + {Region: "US Maryland", IPs: []net.IP{{23, 82, 8, 173}, {23, 105, 160, 134}, {23, 105, 160, 138}, {23, 105, 160, 144}, {23, 105, 163, 94}, {207, 244, 67, 147}, {207, 244, 67, 149}, {207, 244, 84, 40}, {207, 244, 84, 42}, {207, 244, 84, 44}, {207, 244, 84, 58}, {207, 244, 127, 116}, {207, 244, 127, 118}}}, + {Region: "US Miami", IPs: []net.IP{{89, 187, 173, 250}, {107, 181, 164, 35}, {107, 181, 164, 37}, {172, 83, 42, 23}, {172, 83, 42, 39}, {172, 83, 42, 53}, {172, 83, 42, 55}, {172, 83, 42, 83}, {172, 83, 42, 85}, {172, 83, 42, 131}, {172, 83, 42, 133}, {172, 83, 42, 136}, {172, 83, 42, 138}, {172, 83, 42, 141}, {172, 83, 42, 143}, {172, 83, 42, 146}, {172, 83, 42, 151}, {172, 83, 42, 153}, {172, 83, 42, 156}, {172, 83, 42, 158}, {193, 37, 252, 195}, {193, 37, 252, 197}}}, + {Region: "US Netherlands", IPs: []net.IP{{142, 93, 58, 71}}}, + {Region: "US New York City mp001", IPs: []net.IP{{45, 55, 60, 159}}}, + {Region: "US New York City st001", IPs: []net.IP{{92, 119, 177, 19}}}, + {Region: "US New York City st002", IPs: []net.IP{{92, 119, 177, 21}}}, + {Region: "US New York City st003", IPs: []net.IP{{92, 119, 177, 23}}}, + {Region: "US New York City st004", IPs: []net.IP{{193, 148, 18, 51}}}, + {Region: "US New York City st005", IPs: []net.IP{{193, 148, 18, 53}}}, + {Region: "US New York City", IPs: []net.IP{{37, 120, 202, 3}, {37, 120, 202, 5}, {84, 17, 35, 66}, {84, 17, 35, 73}, {84, 17, 35, 76}, {84, 17, 35, 78}, {84, 17, 35, 86}, {84, 17, 35, 91}, {89, 187, 177, 120}, {89, 187, 177, 122}, {89, 187, 178, 92}, {89, 187, 178, 94}, {98, 142, 220, 35}, {98, 142, 220, 37}, {107, 152, 101, 163}, {172, 98, 78, 227}, {192, 40, 59, 229}, {192, 40, 59, 240}, {199, 36, 221, 85}, {199, 36, 221, 99}, {199, 36, 221, 104}, {199, 36, 221, 111}, {199, 36, 221, 114}, {199, 36, 221, 116}, {199, 36, 221, 119}}}, + {Region: "US Orlando", IPs: []net.IP{{198, 147, 22, 83}, {198, 147, 22, 85}, {198, 147, 22, 87}, {198, 147, 22, 131}, {198, 147, 22, 133}, {198, 147, 22, 135}, {198, 147, 22, 147}, {198, 147, 22, 149}, {198, 147, 22, 151}, {198, 147, 22, 163}, {198, 147, 22, 165}, {198, 147, 22, 167}, {198, 147, 22, 195}, {198, 147, 22, 197}, {198, 147, 22, 211}, {198, 147, 22, 213}}}, + {Region: "US Phoenix", IPs: []net.IP{{23, 83, 128, 233}, {23, 83, 128, 235}, {23, 83, 128, 239}, {23, 83, 128, 241}, {23, 83, 128, 243}, {107, 181, 184, 115}, {107, 181, 184, 117}, {172, 98, 87, 35}, {172, 98, 87, 37}, {184, 170, 240, 147}, {184, 170, 240, 149}, {184, 170, 240, 151}, {184, 170, 240, 179}, {184, 170, 240, 181}, {199, 58, 187, 3}, {199, 58, 187, 5}, {199, 58, 187, 8}, {199, 58, 187, 10}, {199, 58, 187, 13}, {199, 58, 187, 15}, {199, 58, 187, 18}, {199, 58, 187, 23}, {199, 58, 187, 25}, {199, 58, 187, 67}, {199, 58, 187, 69}}}, + {Region: "US Portugal", IPs: []net.IP{{142, 93, 81, 242}}}, + {Region: "US Saint Louis", IPs: []net.IP{{148, 72, 170, 108}, {148, 72, 174, 36}, {148, 72, 174, 38}, {148, 72, 174, 41}, {148, 72, 174, 43}, {148, 72, 174, 46}, {148, 72, 174, 51}, {148, 72, 174, 53}}}, + {Region: "US Salt Lake City", IPs: []net.IP{{104, 200, 131, 5}, {104, 200, 131, 7}, {104, 200, 131, 9}, {104, 200, 131, 165}, {104, 200, 131, 167}, {104, 200, 131, 170}, {104, 200, 131, 172}}}, + {Region: "US San Francisco", IPs: []net.IP{{107, 181, 166, 35}, {107, 181, 166, 37}, {107, 181, 166, 39}, {107, 181, 166, 51}, {107, 181, 166, 55}, {107, 181, 166, 83}, {107, 181, 166, 85}, {107, 181, 166, 227}, {107, 181, 166, 229}, {198, 8, 81, 35}, {198, 8, 81, 37}, {209, 58, 128, 48}, {209, 58, 128, 50}}}, + {Region: "US Seatle", IPs: []net.IP{{84, 17, 41, 73}, {84, 17, 41, 75}, {84, 17, 41, 77}, {84, 17, 41, 79}, {84, 17, 41, 81}, {84, 17, 41, 83}, {84, 17, 41, 85}, {104, 200, 129, 243}, {104, 200, 129, 245}, {198, 8, 80, 83}, {198, 8, 80, 85}, {198, 8, 80, 87}, {198, 8, 80, 227}, {198, 8, 80, 229}, {199, 229, 250, 163}, {199, 229, 250, 165}, {199, 229, 250, 167}}}, + {Region: "US Tampa", IPs: []net.IP{{66, 206, 23, 5}, {74, 50, 117, 106}, {74, 50, 117, 119}, {74, 50, 117, 121}, {74, 50, 117, 125}, {162, 220, 56, 98}, {162, 220, 56, 100}, {162, 220, 63, 226}, {162, 220, 63, 232}, {162, 220, 63, 246}, {162, 220, 63, 248}, {209, 216, 92, 197}, {209, 216, 92, 200}, {209, 216, 92, 202}, {209, 216, 92, 205}, {209, 216, 92, 207}, {209, 216, 92, 210}, {209, 216, 92, 212}, {209, 216, 92, 215}, {209, 216, 92, 217}, {209, 216, 92, 220}, {209, 216, 92, 222}, {209, 216, 92, 225}, {209, 216, 92, 227}}}, + {Region: "Ukraine", IPs: []net.IP{{45, 9, 238, 23}, {45, 9, 238, 30}, {45, 9, 238, 38}, {45, 9, 238, 47}}}, + {Region: "United Arab Emirates", IPs: []net.IP{{45, 9, 249, 243}, {45, 9, 249, 245}, {45, 9, 249, 247}, {45, 9, 250, 99}, {45, 9, 250, 101}, {45, 9, 250, 103}}}, + {Region: "Vietnam", IPs: []net.IP{{202, 143, 110, 32}}}, + {Region: "italy Rome", IPs: []net.IP{{82, 102, 26, 61}, {82, 102, 26, 114}, {82, 102, 26, 115}, {82, 102, 26, 117}, {87, 101, 94, 210}, {87, 101, 94, 211}, {87, 101, 94, 213}, {87, 101, 94, 215}, {87, 101, 94, 226}, {185, 217, 71, 2}, {185, 217, 71, 3}, {185, 217, 71, 5}, {185, 217, 71, 18}, {185, 217, 71, 50}, {185, 217, 71, 187}, {185, 217, 71, 195}, {185, 217, 71, 197}, {185, 217, 71, 211}, {185, 217, 71, 243}, {185, 217, 71, 251}, {185, 217, 71, 253}, {217, 138, 219, 235}, {217, 138, 219, 237}, {217, 138, 219, 251}}}, + } +} diff --git a/internal/constants/windscribe.go b/internal/constants/windscribe.go index 9e826e10..1c20577e 100644 --- a/internal/constants/windscribe.go +++ b/internal/constants/windscribe.go @@ -12,82 +12,84 @@ const ( ) func WindscribeRegionChoices() (choices []string) { - for _, server := range WindscribeServers() { - choices = append(choices, string(server.Region)) + servers := WindscribeServers() + choices = make([]string, len(servers)) + for i := range servers { + choices[i] = servers[i].Region } return choices } func WindscribeServers() []models.WindscribeServer { return []models.WindscribeServer{ - {Region: models.WindscribeRegion("Albania"), IPs: []net.IP{{31, 171, 152, 179}}}, - {Region: models.WindscribeRegion("Argentina"), IPs: []net.IP{{167, 250, 6, 121}, {190, 105, 236, 19}, {190, 105, 236, 32}, {190, 105, 236, 50}}}, - {Region: models.WindscribeRegion("Australia"), IPs: []net.IP{{43, 245, 160, 35}, {45, 121, 208, 160}, {45, 121, 209, 160}, {45, 121, 210, 208}, {103, 62, 50, 208}, {103, 77, 233, 67}, {103, 77, 234, 211}, {103, 108, 92, 83}, {116, 90, 72, 243}, {116, 206, 228, 67}, {116, 206, 229, 131}}}, - {Region: models.WindscribeRegion("Austria"), IPs: []net.IP{{89, 187, 168, 66}, {217, 64, 127, 11}}}, - {Region: models.WindscribeRegion("Azerbaijan"), IPs: []net.IP{{85, 132, 61, 123}}}, - {Region: models.WindscribeRegion("Belgium"), IPs: []net.IP{{185, 232, 21, 131}, {194, 187, 251, 147}}}, - {Region: models.WindscribeRegion("Bosnia"), IPs: []net.IP{{185, 99, 3, 24}}}, - {Region: models.WindscribeRegion("Brazil"), IPs: []net.IP{{177, 54, 144, 68}, {177, 67, 80, 59}, {189, 1, 172, 12}}}, - {Region: models.WindscribeRegion("Bulgaria"), IPs: []net.IP{{185, 94, 192, 35}}}, - {Region: models.WindscribeRegion("Canada East"), IPs: []net.IP{{23, 154, 160, 177}, {66, 70, 148, 80}, {104, 227, 235, 129}, {104, 254, 92, 11}, {104, 254, 92, 91}, {144, 168, 163, 160}, {144, 168, 163, 193}, {184, 75, 212, 91}, {192, 190, 19, 65}, {192, 190, 19, 97}, {198, 8, 85, 195}, {198, 8, 85, 210}, {199, 204, 208, 158}}}, - {Region: models.WindscribeRegion("Canada West"), IPs: []net.IP{{104, 218, 61, 1}, {104, 218, 61, 33}, {162, 221, 207, 95}, {208, 78, 41, 1}, {208, 78, 41, 131}, {208, 78, 41, 163}}}, - {Region: models.WindscribeRegion("Colombia"), IPs: []net.IP{{138, 121, 203, 203}, {138, 186, 141, 155}}}, - {Region: models.WindscribeRegion("Croatia"), IPs: []net.IP{{85, 10, 56, 252}}}, - {Region: models.WindscribeRegion("Cyprus"), IPs: []net.IP{{157, 97, 132, 43}}}, - {Region: models.WindscribeRegion("Czech Republic"), IPs: []net.IP{{185, 156, 174, 11}, {185, 246, 210, 2}}}, - {Region: models.WindscribeRegion("Denmark"), IPs: []net.IP{{134, 90, 149, 147}, {185, 206, 224, 195}}}, - {Region: models.WindscribeRegion("Estona"), IPs: []net.IP{{46, 22, 211, 251}, {196, 196, 216, 131}}}, - {Region: models.WindscribeRegion("Fake Antarctica"), IPs: []net.IP{{23, 154, 160, 212}, {23, 154, 160, 222}}}, - {Region: models.WindscribeRegion("Finland"), IPs: []net.IP{{185, 112, 82, 227}, {194, 34, 133, 82}}}, - {Region: models.WindscribeRegion("France"), IPs: []net.IP{{45, 89, 174, 35}, {82, 102, 18, 35}, {84, 17, 42, 2}, {84, 17, 42, 34}, {185, 156, 173, 187}}}, - {Region: models.WindscribeRegion("Georgia"), IPs: []net.IP{{188, 93, 90, 83}}}, - {Region: models.WindscribeRegion("Germany"), IPs: []net.IP{{45, 87, 212, 51}, {89, 249, 65, 19}, {185, 130, 184, 195}, {195, 181, 170, 66}, {195, 181, 175, 98}, {217, 138, 194, 115}}}, - {Region: models.WindscribeRegion("Greece"), IPs: []net.IP{{78, 108, 38, 155}, {185, 226, 64, 111}, {188, 123, 126, 146}}}, - {Region: models.WindscribeRegion("Hong Kong"), IPs: []net.IP{{84, 17, 57, 114}, {103, 10, 197, 99}}}, - {Region: models.WindscribeRegion("Hungary"), IPs: []net.IP{{185, 104, 187, 43}}}, - {Region: models.WindscribeRegion("Iceland"), IPs: []net.IP{{82, 221, 139, 38}, {185, 165, 170, 2}}}, - {Region: models.WindscribeRegion("India"), IPs: []net.IP{{103, 205, 140, 227}, {169, 38, 68, 188}, {169, 38, 72, 12}, {169, 38, 72, 14}}}, - {Region: models.WindscribeRegion("Indonesia"), IPs: []net.IP{{45, 127, 134, 91}}}, - {Region: models.WindscribeRegion("Ireland"), IPs: []net.IP{{185, 24, 232, 146}, {185, 104, 219, 2}}}, - {Region: models.WindscribeRegion("Israel"), IPs: []net.IP{{160, 116, 0, 27}, {185, 191, 205, 139}}}, - {Region: models.WindscribeRegion("Italy"), IPs: []net.IP{{37, 120, 135, 83}, {37, 120, 207, 19}, {84, 17, 59, 66}, {87, 101, 94, 195}, {89, 40, 182, 3}}}, - {Region: models.WindscribeRegion("Japan"), IPs: []net.IP{{89, 187, 161, 114}, {193, 148, 16, 243}}}, - {Region: models.WindscribeRegion("Latvia"), IPs: []net.IP{{85, 254, 72, 23}}}, - {Region: models.WindscribeRegion("Lithuania"), IPs: []net.IP{{85, 206, 163, 225}}}, - {Region: models.WindscribeRegion("Macedonia"), IPs: []net.IP{{185, 225, 28, 51}}}, - {Region: models.WindscribeRegion("Malaysia"), IPs: []net.IP{{103, 106, 250, 31}, {103, 212, 69, 232}}}, - {Region: models.WindscribeRegion("Mexico"), IPs: []net.IP{{143, 255, 57, 67}, {190, 103, 179, 211}, {190, 103, 179, 217}, {201, 131, 125, 107}}}, - {Region: models.WindscribeRegion("Moldova"), IPs: []net.IP{{178, 175, 144, 123}}}, - {Region: models.WindscribeRegion("Netherlands"), IPs: []net.IP{{37, 120, 192, 19}, {46, 166, 143, 98}, {72, 11, 157, 35}, {72, 11, 157, 67}, {84, 17, 46, 2}, {185, 212, 171, 131}, {185, 253, 96, 3}}}, - {Region: models.WindscribeRegion("New Zealand"), IPs: []net.IP{{103, 62, 49, 113}, {103, 108, 94, 163}}}, - {Region: models.WindscribeRegion("Norway"), IPs: []net.IP{{37, 120, 203, 67}, {185, 206, 225, 131}}}, - {Region: models.WindscribeRegion("Philippines"), IPs: []net.IP{{103, 103, 0, 118}}}, - {Region: models.WindscribeRegion("Poland"), IPs: []net.IP{{5, 133, 11, 116}, {84, 17, 55, 98}, {185, 244, 214, 35}}}, - {Region: models.WindscribeRegion("Portugal"), IPs: []net.IP{{94, 46, 13, 215}, {185, 15, 21, 66}}}, - {Region: models.WindscribeRegion("Romania"), IPs: []net.IP{{89, 46, 103, 147}, {91, 207, 102, 147}}}, - {Region: models.WindscribeRegion("Russia"), IPs: []net.IP{{94, 242, 62, 19}, {94, 242, 62, 67}, {95, 213, 193, 195}, {95, 213, 193, 227}, {185, 22, 175, 132}, {188, 124, 42, 99}, {188, 124, 42, 115}}}, - {Region: models.WindscribeRegion("Serbia"), IPs: []net.IP{{141, 98, 103, 19}}}, - {Region: models.WindscribeRegion("Singapore"), IPs: []net.IP{{82, 102, 25, 131}, {89, 187, 162, 130}, {103, 62, 48, 224}, {185, 200, 117, 163}}}, - {Region: models.WindscribeRegion("Slovakia"), IPs: []net.IP{{185, 245, 85, 3}}}, - {Region: models.WindscribeRegion("Slovenia"), IPs: []net.IP{{146, 247, 24, 207}}}, - {Region: models.WindscribeRegion("South Africa"), IPs: []net.IP{{129, 232, 167, 211}, {165, 73, 248, 91}, {197, 242, 156, 53}, {197, 242, 157, 235}}}, - {Region: models.WindscribeRegion("South Korea"), IPs: []net.IP{{103, 212, 223, 3}, {218, 232, 76, 179}}}, - {Region: models.WindscribeRegion("Spain"), IPs: []net.IP{{37, 120, 142, 227}, {89, 238, 178, 43}, {185, 253, 99, 131}, {217, 138, 218, 99}}}, - {Region: models.WindscribeRegion("Sweden"), IPs: []net.IP{{31, 13, 191, 67}, {195, 181, 166, 129}}}, - {Region: models.WindscribeRegion("Switzerland"), IPs: []net.IP{{31, 7, 57, 242}, {37, 120, 213, 163}, {84, 17, 53, 2}, {89, 187, 165, 98}, {185, 156, 175, 179}}}, - {Region: models.WindscribeRegion("Thailand"), IPs: []net.IP{{27, 254, 130, 221}}}, - {Region: models.WindscribeRegion("Tunisia"), IPs: []net.IP{{41, 231, 5, 23}}}, - {Region: models.WindscribeRegion("Turkey"), IPs: []net.IP{{45, 123, 118, 156}, {45, 123, 119, 11}, {79, 98, 131, 43}, {176, 53, 113, 163}, {185, 125, 33, 227}}}, - {Region: models.WindscribeRegion("Ukraine"), IPs: []net.IP{{45, 141, 156, 11}, {45, 141, 156, 50}}}, - {Region: models.WindscribeRegion("United Arab Emirates"), IPs: []net.IP{{45, 9, 249, 43}}}, - {Region: models.WindscribeRegion("United kingdom"), IPs: []net.IP{{2, 58, 29, 17}, {81, 92, 207, 69}, {84, 17, 50, 130}, {89, 238, 131, 131}, {89, 238, 135, 133}, {89, 238, 150, 229}, {185, 212, 168, 133}, {212, 102, 63, 32}, {212, 102, 63, 62}, {217, 138, 254, 51}}}, - {Region: models.WindscribeRegion("US Central"), IPs: []net.IP{{67, 212, 238, 196}, {69, 12, 94, 67}, {104, 129, 18, 3}, {104, 223, 92, 163}, {107, 150, 31, 67}, {107, 150, 31, 131}, {107, 161, 86, 131}, {107, 182, 234, 240}, {161, 129, 70, 195}, {162, 222, 198, 67}, {172, 241, 26, 78}, {172, 241, 131, 129}, {198, 12, 76, 211}, {198, 54, 128, 116}, {198, 55, 125, 195}, {199, 115, 96, 83}, {204, 44, 112, 131}, {206, 217, 139, 19}, {206, 217, 143, 131}}}, - {Region: models.WindscribeRegion("Us East"), IPs: []net.IP{{23, 82, 136, 93}, {23, 83, 91, 170}, {23, 105, 170, 139}, {23, 226, 141, 195}, {38, 132, 118, 227}, {67, 21, 32, 145}, {68, 235, 35, 12}, {68, 235, 50, 227}, {86, 106, 87, 83}, {104, 168, 34, 147}, {104, 223, 127, 195}, {107, 150, 29, 131}, {142, 234, 200, 176}, {156, 96, 59, 102}, {162, 222, 195, 67}, {167, 160, 167, 195}, {167, 160, 172, 3}, {173, 44, 36, 67}, {173, 208, 45, 33}, {185, 232, 22, 195}, {198, 12, 64, 35}, {198, 147, 22, 225}, {206, 217, 128, 3}, {206, 217, 129, 227}, {217, 138, 255, 179}}}, - {Region: models.WindscribeRegion("US West"), IPs: []net.IP{{23, 83, 130, 166}, {23, 83, 131, 187}, {23, 94, 74, 99}, {37, 120, 147, 163}, {64, 120, 2, 174}, {66, 115, 176, 3}, {82, 102, 30, 67}, {89, 187, 185, 34}, {89, 187, 187, 98}, {104, 129, 3, 67}, {104, 129, 3, 163}, {104, 129, 56, 67}, {104, 129, 56, 131}, {104, 152, 222, 33}, {167, 88, 60, 227}, {167, 88, 60, 243}, {172, 241, 214, 202}, {172, 241, 250, 131}, {172, 255, 125, 141}, {185, 236, 200, 35}, {192, 3, 20, 51}, {198, 12, 116, 195}, {198, 23, 242, 147}, {209, 58, 129, 121}, {216, 45, 53, 131}, {217, 138, 217, 51}, {217, 138, 217, 211}}}, - {Region: models.WindscribeRegion("Vietnam"), IPs: []net.IP{{103, 9, 76, 197}, {103, 9, 79, 186}, {103, 9, 79, 219}}}, - {Region: models.WindscribeRegion("Windflix CA"), IPs: []net.IP{{104, 218, 60, 111}, {104, 254, 92, 99}}}, - {Region: models.WindscribeRegion("Windflix JP"), IPs: []net.IP{{5, 181, 235, 67}}}, - {Region: models.WindscribeRegion("Windflix UK"), IPs: []net.IP{{45, 9, 248, 3}, {81, 92, 200, 85}, {89, 47, 62, 83}}}, - {Region: models.WindscribeRegion("Windflix US"), IPs: []net.IP{{23, 105, 170, 130}, {23, 105, 170, 151}, {185, 232, 22, 131}, {204, 44, 112, 67}, {217, 138, 206, 211}}}, + {Region: "Albania", IPs: []net.IP{{31, 171, 152, 179}}}, + {Region: "Argentina", IPs: []net.IP{{167, 250, 6, 121}, {190, 105, 236, 19}, {190, 105, 236, 32}, {190, 105, 236, 50}}}, + {Region: "Australia", IPs: []net.IP{{43, 245, 160, 35}, {45, 121, 208, 160}, {45, 121, 209, 160}, {45, 121, 210, 208}, {103, 62, 50, 208}, {103, 77, 233, 67}, {103, 77, 234, 211}, {103, 108, 92, 83}, {116, 90, 72, 243}, {116, 206, 228, 67}, {116, 206, 229, 131}}}, + {Region: "Austria", IPs: []net.IP{{89, 187, 168, 66}, {217, 64, 127, 11}}}, + {Region: "Azerbaijan", IPs: []net.IP{{85, 132, 61, 123}}}, + {Region: "Belgium", IPs: []net.IP{{185, 232, 21, 131}, {194, 187, 251, 147}}}, + {Region: "Bosnia", IPs: []net.IP{{185, 99, 3, 24}}}, + {Region: "Brazil", IPs: []net.IP{{177, 54, 144, 68}, {177, 67, 80, 59}, {189, 1, 172, 12}}}, + {Region: "Bulgaria", IPs: []net.IP{{185, 94, 192, 35}}}, + {Region: "Canada East", IPs: []net.IP{{23, 154, 160, 177}, {66, 70, 148, 80}, {104, 227, 235, 129}, {104, 254, 92, 11}, {104, 254, 92, 91}, {144, 168, 163, 160}, {144, 168, 163, 193}, {184, 75, 212, 91}, {192, 190, 19, 65}, {192, 190, 19, 97}, {198, 8, 85, 195}, {198, 8, 85, 210}, {199, 204, 208, 158}}}, + {Region: "Canada West", IPs: []net.IP{{104, 218, 61, 1}, {104, 218, 61, 33}, {162, 221, 207, 95}, {208, 78, 41, 1}, {208, 78, 41, 131}, {208, 78, 41, 163}}}, + {Region: "Colombia", IPs: []net.IP{{138, 121, 203, 203}, {138, 186, 141, 155}}}, + {Region: "Croatia", IPs: []net.IP{{85, 10, 56, 252}}}, + {Region: "Cyprus", IPs: []net.IP{{157, 97, 132, 43}}}, + {Region: "Czech Republic", IPs: []net.IP{{185, 156, 174, 11}, {185, 246, 210, 2}}}, + {Region: "Denmark", IPs: []net.IP{{134, 90, 149, 147}, {185, 206, 224, 195}}}, + {Region: "Estona", IPs: []net.IP{{46, 22, 211, 251}, {196, 196, 216, 131}}}, + {Region: "Fake Antarctica", IPs: []net.IP{{23, 154, 160, 212}, {23, 154, 160, 222}}}, + {Region: "Finland", IPs: []net.IP{{185, 112, 82, 227}, {194, 34, 133, 82}}}, + {Region: "France", IPs: []net.IP{{45, 89, 174, 35}, {82, 102, 18, 35}, {84, 17, 42, 2}, {84, 17, 42, 34}, {185, 156, 173, 187}}}, + {Region: "Georgia", IPs: []net.IP{{188, 93, 90, 83}}}, + {Region: "Germany", IPs: []net.IP{{45, 87, 212, 51}, {89, 249, 65, 19}, {185, 130, 184, 195}, {195, 181, 170, 66}, {195, 181, 175, 98}, {217, 138, 194, 115}}}, + {Region: "Greece", IPs: []net.IP{{78, 108, 38, 155}, {185, 226, 64, 111}, {188, 123, 126, 146}}}, + {Region: "Hong Kong", IPs: []net.IP{{84, 17, 57, 114}, {103, 10, 197, 99}}}, + {Region: "Hungary", IPs: []net.IP{{185, 104, 187, 43}}}, + {Region: "Iceland", IPs: []net.IP{{82, 221, 139, 38}, {185, 165, 170, 2}}}, + {Region: "India", IPs: []net.IP{{103, 205, 140, 227}, {169, 38, 68, 188}, {169, 38, 72, 12}, {169, 38, 72, 14}}}, + {Region: "Indonesia", IPs: []net.IP{{45, 127, 134, 91}}}, + {Region: "Ireland", IPs: []net.IP{{185, 24, 232, 146}, {185, 104, 219, 2}}}, + {Region: "Israel", IPs: []net.IP{{160, 116, 0, 27}, {185, 191, 205, 139}}}, + {Region: "Italy", IPs: []net.IP{{37, 120, 135, 83}, {37, 120, 207, 19}, {84, 17, 59, 66}, {87, 101, 94, 195}, {89, 40, 182, 3}}}, + {Region: "Japan", IPs: []net.IP{{89, 187, 161, 114}, {193, 148, 16, 243}}}, + {Region: "Latvia", IPs: []net.IP{{85, 254, 72, 23}}}, + {Region: "Lithuania", IPs: []net.IP{{85, 206, 163, 225}}}, + {Region: "Macedonia", IPs: []net.IP{{185, 225, 28, 51}}}, + {Region: "Malaysia", IPs: []net.IP{{103, 106, 250, 31}, {103, 212, 69, 232}}}, + {Region: "Mexico", IPs: []net.IP{{143, 255, 57, 67}, {190, 103, 179, 211}, {190, 103, 179, 217}, {201, 131, 125, 107}}}, + {Region: "Moldova", IPs: []net.IP{{178, 175, 144, 123}}}, + {Region: "Netherlands", IPs: []net.IP{{37, 120, 192, 19}, {46, 166, 143, 98}, {72, 11, 157, 35}, {72, 11, 157, 67}, {84, 17, 46, 2}, {185, 212, 171, 131}, {185, 253, 96, 3}}}, + {Region: "New Zealand", IPs: []net.IP{{103, 62, 49, 113}, {103, 108, 94, 163}}}, + {Region: "Norway", IPs: []net.IP{{37, 120, 203, 67}, {185, 206, 225, 131}}}, + {Region: "Philippines", IPs: []net.IP{{103, 103, 0, 118}}}, + {Region: "Poland", IPs: []net.IP{{5, 133, 11, 116}, {84, 17, 55, 98}, {185, 244, 214, 35}}}, + {Region: "Portugal", IPs: []net.IP{{94, 46, 13, 215}, {185, 15, 21, 66}}}, + {Region: "Romania", IPs: []net.IP{{89, 46, 103, 147}, {91, 207, 102, 147}}}, + {Region: "Russia", IPs: []net.IP{{94, 242, 62, 19}, {94, 242, 62, 67}, {95, 213, 193, 195}, {95, 213, 193, 227}, {185, 22, 175, 132}, {188, 124, 42, 99}, {188, 124, 42, 115}}}, + {Region: "Serbia", IPs: []net.IP{{141, 98, 103, 19}}}, + {Region: "Singapore", IPs: []net.IP{{82, 102, 25, 131}, {89, 187, 162, 130}, {103, 62, 48, 224}, {185, 200, 117, 163}}}, + {Region: "Slovakia", IPs: []net.IP{{185, 245, 85, 3}}}, + {Region: "Slovenia", IPs: []net.IP{{146, 247, 24, 207}}}, + {Region: "South Africa", IPs: []net.IP{{129, 232, 167, 211}, {165, 73, 248, 91}, {197, 242, 156, 53}, {197, 242, 157, 235}}}, + {Region: "South Korea", IPs: []net.IP{{103, 212, 223, 3}, {218, 232, 76, 179}}}, + {Region: "Spain", IPs: []net.IP{{37, 120, 142, 227}, {89, 238, 178, 43}, {185, 253, 99, 131}, {217, 138, 218, 99}}}, + {Region: "Sweden", IPs: []net.IP{{31, 13, 191, 67}, {195, 181, 166, 129}}}, + {Region: "Switzerland", IPs: []net.IP{{31, 7, 57, 242}, {37, 120, 213, 163}, {84, 17, 53, 2}, {89, 187, 165, 98}, {185, 156, 175, 179}}}, + {Region: "Thailand", IPs: []net.IP{{27, 254, 130, 221}}}, + {Region: "Tunisia", IPs: []net.IP{{41, 231, 5, 23}}}, + {Region: "Turkey", IPs: []net.IP{{45, 123, 118, 156}, {45, 123, 119, 11}, {79, 98, 131, 43}, {176, 53, 113, 163}, {185, 125, 33, 227}}}, + {Region: "Ukraine", IPs: []net.IP{{45, 141, 156, 11}, {45, 141, 156, 50}}}, + {Region: "United Arab Emirates", IPs: []net.IP{{45, 9, 249, 43}}}, + {Region: "United kingdom", IPs: []net.IP{{2, 58, 29, 17}, {81, 92, 207, 69}, {84, 17, 50, 130}, {89, 238, 131, 131}, {89, 238, 135, 133}, {89, 238, 150, 229}, {185, 212, 168, 133}, {212, 102, 63, 32}, {212, 102, 63, 62}, {217, 138, 254, 51}}}, + {Region: "US Central", IPs: []net.IP{{67, 212, 238, 196}, {69, 12, 94, 67}, {104, 129, 18, 3}, {104, 223, 92, 163}, {107, 150, 31, 67}, {107, 150, 31, 131}, {107, 161, 86, 131}, {107, 182, 234, 240}, {161, 129, 70, 195}, {162, 222, 198, 67}, {172, 241, 26, 78}, {172, 241, 131, 129}, {198, 12, 76, 211}, {198, 54, 128, 116}, {198, 55, 125, 195}, {199, 115, 96, 83}, {204, 44, 112, 131}, {206, 217, 139, 19}, {206, 217, 143, 131}}}, + {Region: "Us East", IPs: []net.IP{{23, 82, 136, 93}, {23, 83, 91, 170}, {23, 105, 170, 139}, {23, 226, 141, 195}, {38, 132, 118, 227}, {67, 21, 32, 145}, {68, 235, 35, 12}, {68, 235, 50, 227}, {86, 106, 87, 83}, {104, 168, 34, 147}, {104, 223, 127, 195}, {107, 150, 29, 131}, {142, 234, 200, 176}, {156, 96, 59, 102}, {162, 222, 195, 67}, {167, 160, 167, 195}, {167, 160, 172, 3}, {173, 44, 36, 67}, {173, 208, 45, 33}, {185, 232, 22, 195}, {198, 12, 64, 35}, {198, 147, 22, 225}, {206, 217, 128, 3}, {206, 217, 129, 227}, {217, 138, 255, 179}}}, + {Region: "US West", IPs: []net.IP{{23, 83, 130, 166}, {23, 83, 131, 187}, {23, 94, 74, 99}, {37, 120, 147, 163}, {64, 120, 2, 174}, {66, 115, 176, 3}, {82, 102, 30, 67}, {89, 187, 185, 34}, {89, 187, 187, 98}, {104, 129, 3, 67}, {104, 129, 3, 163}, {104, 129, 56, 67}, {104, 129, 56, 131}, {104, 152, 222, 33}, {167, 88, 60, 227}, {167, 88, 60, 243}, {172, 241, 214, 202}, {172, 241, 250, 131}, {172, 255, 125, 141}, {185, 236, 200, 35}, {192, 3, 20, 51}, {198, 12, 116, 195}, {198, 23, 242, 147}, {209, 58, 129, 121}, {216, 45, 53, 131}, {217, 138, 217, 51}, {217, 138, 217, 211}}}, + {Region: "Vietnam", IPs: []net.IP{{103, 9, 76, 197}, {103, 9, 79, 186}, {103, 9, 79, 219}}}, + {Region: "Windflix CA", IPs: []net.IP{{104, 218, 60, 111}, {104, 254, 92, 99}}}, + {Region: "Windflix JP", IPs: []net.IP{{5, 181, 235, 67}}}, + {Region: "Windflix UK", IPs: []net.IP{{45, 9, 248, 3}, {81, 92, 200, 85}, {89, 47, 62, 83}}}, + {Region: "Windflix US", IPs: []net.IP{{23, 105, 170, 130}, {23, 105, 170, 151}, {185, 232, 22, 131}, {204, 44, 112, 67}, {217, 138, 206, 211}}}, } } diff --git a/internal/cyberghost/cyberghost.go b/internal/cyberghost/cyberghost.go deleted file mode 100644 index f638e4e1..00000000 --- a/internal/cyberghost/cyberghost.go +++ /dev/null @@ -1,23 +0,0 @@ -package cyberghost - -import ( - "net" - - "github.com/qdm12/golibs/files" - "github.com/qdm12/private-internet-access-docker/internal/models" -) - -// Configurator contains methods to read and modify the openvpn configuration to connect as a client -type Configurator interface { - GetOpenVPNConnections(group models.CyberghostGroup, region models.CyberghostRegion, protocol models.NetworkProtocol, targetIP net.IP) (connections []models.OpenVPNConnection, err error) - BuildConf(connections []models.OpenVPNConnection, clientKey string, verbosity, uid, gid int, root bool, cipher, auth string) (err error) -} - -type configurator struct { - fileManager files.FileManager -} - -// NewConfigurator returns a new Configurator object -func NewConfigurator(fileManager files.FileManager) Configurator { - return &configurator{fileManager: fileManager} -} diff --git a/internal/models/alias.go b/internal/models/alias.go index 1e233492..65c88c46 100644 --- a/internal/models/alias.go +++ b/internal/models/alias.go @@ -7,24 +7,6 @@ type ( DNSProvider string // DNSHost is the DNS host to use for TLS validation DNSHost string - // PIAEncryption defines the level of encryption for communication with PIA servers - PIAEncryption string - // PIARegion is used to define the list of regions available for PIA - PIARegion string - // MullvadCountry is used as the country for a Mullvad server - MullvadCountry string - // MullvadCity is used as the city for a Mullvad server - MullvadCity string - // MullvadProvider is used as the Internet service provider for a Mullvad server - MullvadProvider string - // WindscribeCity is used as the region for a Windscribe server - WindscribeRegion string - // SurfsharkRegion is used as the region for a Surfshark server - SurfsharkRegion string - // CyberghostRegion is the country name for a Cyberghost server - CyberghostRegion string - // CyberghostGroup is the server group for a Cyberghost server - CyberghostGroup string // URL is an HTTP(s) URL address URL string // Filepath is a local filesytem file path @@ -32,7 +14,7 @@ type ( // TinyProxyLogLevel is the log level for TinyProxy TinyProxyLogLevel string // VPNProvider is the name of the VPN provider to be used - VPNProvider string + VPNProvider string // TODO // NetworkProtocol contains the network protocol to be used to communicate with the VPN servers NetworkProtocol string ) diff --git a/internal/models/cyberghost.go b/internal/models/cyberghost.go deleted file mode 100644 index caa698cb..00000000 --- a/internal/models/cyberghost.go +++ /dev/null @@ -1,9 +0,0 @@ -package models - -import "net" - -type CyberghostServer struct { - Region CyberghostRegion - Group CyberghostGroup - IPs []net.IP -} diff --git a/internal/models/mullvad.go b/internal/models/mullvad.go deleted file mode 100644 index b9126961..00000000 --- a/internal/models/mullvad.go +++ /dev/null @@ -1,12 +0,0 @@ -package models - -import "net" - -type MullvadServer struct { - IPs []net.IP - Country MullvadCountry - City MullvadCity - Provider MullvadProvider - Owned bool - DefaultPort uint16 -} diff --git a/internal/models/pia.go b/internal/models/pia.go deleted file mode 100644 index ad4a498d..00000000 --- a/internal/models/pia.go +++ /dev/null @@ -1,8 +0,0 @@ -package models - -import "net" - -type PIAServer struct { - IPs []net.IP - Region PIARegion -} diff --git a/internal/models/selection.go b/internal/models/selection.go new file mode 100644 index 00000000..67645b78 --- /dev/null +++ b/internal/models/selection.go @@ -0,0 +1,100 @@ +package models + +import ( + "fmt" + "net" + "strings" +) + +// ProviderSettings contains settings specific to a VPN provider +type ProviderSettings struct { + Name VPNProvider + ServerSelection ServerSelection + ExtraConfigOptions ExtraConfigOptions + PortForwarding PortForwarding +} + +type ServerSelection struct { + // Common + Protocol NetworkProtocol + TargetIP net.IP + + // Cyberghost, PIA, Surfshark, Windscribe + Region string + + // Cyberghost + Group string + + // Mullvad + Country string + City string + ISP string + Owned bool + + // Mullvad, Windscribe + CustomPort uint16 + + // PIA + EncryptionPreset string +} + +type ExtraConfigOptions struct { + ClientKey string // Cyberghost + EncryptionPreset string // PIA +} + +// PortForwarding contains settings for port forwarding +type PortForwarding struct { + Enabled bool + Filepath Filepath +} + +func (p *PortForwarding) String() string { + if p.Enabled { + return fmt.Sprintf("on, saved in %s", p.Filepath) + } + return "off" +} + +func (p *ProviderSettings) String() string { + settingsList := []string{ + fmt.Sprintf("%s settings:", strings.Title(string(p.Name))), + "Network protocol: " + string(p.ServerSelection.Protocol), + } + switch strings.ToLower(string(p.Name)) { + case "private internet access": + settingsList = []string{ + "Region: " + p.ServerSelection.Region, + "Encryption preset: " + p.ExtraConfigOptions.EncryptionPreset, + "Port forwarding: " + p.PortForwarding.String(), + } + case "mullvad": + settingsList = []string{ + "Country: " + p.ServerSelection.Country, + "City: " + p.ServerSelection.City, + "ISP: " + p.ServerSelection.ISP, + "Custom port: " + string(p.ServerSelection.CustomPort), + } + case "windscribe": + settingsList = []string{ + "Region: " + p.ServerSelection.Region, + "Custom port: " + string(p.ServerSelection.CustomPort), + } + case "surfshark": + settingsList = []string{ + "Region: " + p.ServerSelection.Region, + } + case "cyberghost": + settingsList = []string{ + "ClientKey: [redacted]", + "Group: " + p.ServerSelection.Group, + "Region: " + p.ServerSelection.Region, + } + } + if p.ServerSelection.TargetIP != nil { + settingsList = append(settingsList, + "Target IP address: "+string(p.ServerSelection.TargetIP), + ) + } + return strings.Join(settingsList, "\n |--") +} diff --git a/internal/models/servers.go b/internal/models/servers.go new file mode 100644 index 00000000..6d11676a --- /dev/null +++ b/internal/models/servers.go @@ -0,0 +1,33 @@ +package models + +import "net" + +type PIAServer struct { + IPs []net.IP + Region string +} + +type MullvadServer struct { + IPs []net.IP + Country string + City string + ISP string + Owned bool + DefaultPort uint16 +} + +type WindscribeServer struct { + Region string + IPs []net.IP +} + +type SurfsharkServer struct { + Region string + IPs []net.IP +} + +type CyberghostServer struct { + Region string + Group string + IPs []net.IP +} diff --git a/internal/models/surfshark.go b/internal/models/surfshark.go deleted file mode 100644 index 4bb1932a..00000000 --- a/internal/models/surfshark.go +++ /dev/null @@ -1,8 +0,0 @@ -package models - -import "net" - -type SurfsharkServer struct { - Region SurfsharkRegion - IPs []net.IP -} diff --git a/internal/models/windscribe.go b/internal/models/windscribe.go deleted file mode 100644 index c794023c..00000000 --- a/internal/models/windscribe.go +++ /dev/null @@ -1,8 +0,0 @@ -package models - -import "net" - -type WindscribeServer struct { - Region WindscribeRegion - IPs []net.IP -} diff --git a/internal/mullvad/mullvad.go b/internal/mullvad/mullvad.go deleted file mode 100644 index c5d57f7c..00000000 --- a/internal/mullvad/mullvad.go +++ /dev/null @@ -1,28 +0,0 @@ -package mullvad - -import ( - "net" - - "github.com/qdm12/golibs/files" - "github.com/qdm12/golibs/logging" - "github.com/qdm12/private-internet-access-docker/internal/models" -) - -// Configurator contains methods to read and modify the openvpn configuration to connect as a client -type Configurator interface { - GetOpenVPNConnections(country models.MullvadCountry, city models.MullvadCity, provider models.MullvadProvider, protocol models.NetworkProtocol, customPort uint16, targetIP net.IP) (connections []models.OpenVPNConnection, err error) - BuildConf(connections []models.OpenVPNConnection, verbosity, uid, gid int, root bool, cipher string) (err error) -} - -type configurator struct { - fileManager files.FileManager - logger logging.Logger -} - -// NewConfigurator returns a new Configurator object -func NewConfigurator(fileManager files.FileManager, logger logging.Logger) Configurator { - return &configurator{ - fileManager: fileManager, - logger: logger.WithPrefix("Mullvad configurator: "), - } -} diff --git a/internal/params/cyberghost.go b/internal/params/cyberghost.go index 961895ef..d8f59c4b 100644 --- a/internal/params/cyberghost.go +++ b/internal/params/cyberghost.go @@ -1,25 +1,22 @@ package params import ( - "strings" - libparams "github.com/qdm12/golibs/params" "github.com/qdm12/private-internet-access-docker/internal/constants" - "github.com/qdm12/private-internet-access-docker/internal/models" ) // GetCyberghostGroup obtains the server group for the Cyberghost server from the // environment variable CYBERGHOST_GROUP -func (p *reader) GetCyberghostGroup() (region models.CyberghostGroup, err error) { +func (p *reader) GetCyberghostGroup() (group string, err error) { s, err := p.envParams.GetValueIfInside("CYBERGHOST_GROUP", constants.CyberghostGroupChoices()) - return models.CyberghostGroup(strings.ToLower(s)), err + return s, err } // GetCyberghostRegion obtains the country name for the Cyberghost server from the // environment variable REGION -func (p *reader) GetCyberghostRegion() (region models.CyberghostRegion, err error) { +func (p *reader) GetCyberghostRegion() (region string, err error) { s, err := p.envParams.GetValueIfInside("REGION", constants.CyberghostRegionChoices()) - return models.CyberghostRegion(strings.ToLower(s)), err + return s, err } // GetCyberghostClientKey obtains the one line client key to use for openvpn from the diff --git a/internal/params/mullvad.go b/internal/params/mullvad.go index aba58d13..8abff3d4 100644 --- a/internal/params/mullvad.go +++ b/internal/params/mullvad.go @@ -1,35 +1,29 @@ package params import ( - "strings" - libparams "github.com/qdm12/golibs/params" "github.com/qdm12/private-internet-access-docker/internal/constants" - "github.com/qdm12/private-internet-access-docker/internal/models" ) // GetMullvadCountry obtains the country for the Mullvad server from the // environment variable COUNTRY -func (r *reader) GetMullvadCountry() (country models.MullvadCountry, err error) { +func (r *reader) GetMullvadCountry() (country string, err error) { choices := append(constants.MullvadCountryChoices(), "") - s, err := r.envParams.GetValueIfInside("COUNTRY", choices) - return models.MullvadCountry(strings.ToLower(s)), err + return r.envParams.GetValueIfInside("COUNTRY", choices) } // GetMullvadCity obtains the city for the Mullvad server from the // environment variable CITY -func (r *reader) GetMullvadCity() (country models.MullvadCity, err error) { +func (r *reader) GetMullvadCity() (country string, err error) { choices := append(constants.MullvadCityChoices(), "") - s, err := r.envParams.GetValueIfInside("CITY", choices) - return models.MullvadCity(strings.ToLower(s)), err + return r.envParams.GetValueIfInside("CITY", choices) } // GetMullvadISP obtains the ISP for the Mullvad server from the // environment variable ISP -func (r *reader) GetMullvadISP() (country models.MullvadProvider, err error) { - choices := append(constants.MullvadProviderChoices(), "") - s, err := r.envParams.GetValueIfInside("ISP", choices) - return models.MullvadProvider(strings.ToLower(s)), err +func (r *reader) GetMullvadISP() (isp string, err error) { + choices := append(constants.MullvadISPChoices(), "") + return r.envParams.GetValueIfInside("ISP", choices) } // GetMullvadPort obtains the port to reach the Mullvad server on from the diff --git a/internal/params/openvpn.go b/internal/params/openvpn.go index 4d6d813a..025e1982 100644 --- a/internal/params/openvpn.go +++ b/internal/params/openvpn.go @@ -3,7 +3,6 @@ package params import ( "fmt" "net" - "strings" libparams "github.com/qdm12/golibs/params" "github.com/qdm12/private-internet-access-docker/internal/models" @@ -70,13 +69,11 @@ func (r *reader) GetTargetIP() (ip net.IP, err error) { // GetOpenVPNCipher obtains a custom cipher to use with OpenVPN // from the environment variable OPENVPN_CIPHER func (r *reader) GetOpenVPNCipher() (cipher string, err error) { - cipher, err = r.envParams.GetEnv("OPENVPN_CIPHER") - return strings.ToLower(cipher), err + return r.envParams.GetEnv("OPENVPN_CIPHER") } // GetOpenVPNAuth obtains a custom auth algorithm to use with OpenVPN // from the environment variable OPENVPN_AUTH func (r *reader) GetOpenVPNAuth() (auth string, err error) { - auth, err = r.envParams.GetEnv("OPENVPN_AUTH") - return strings.ToLower(auth), err + return r.envParams.GetEnv("OPENVPN_AUTH") } diff --git a/internal/params/params.go b/internal/params/params.go index dee148db..f682f183 100644 --- a/internal/params/params.go +++ b/internal/params/params.go @@ -53,25 +53,25 @@ type Reader interface { // PIA getters GetPortForwarding() (activated bool, err error) GetPortForwardingStatusFilepath() (filepath models.Filepath, err error) - GetPIAEncryption() (models.PIAEncryption, error) - GetPIARegion() (models.PIARegion, error) + GetPIAEncryptionPreset() (preset string, err error) + GetPIARegion() (region string, err error) // Mullvad getters - GetMullvadCountry() (country models.MullvadCountry, err error) - GetMullvadCity() (country models.MullvadCity, err error) - GetMullvadISP() (country models.MullvadProvider, err error) + GetMullvadCountry() (country string, err error) + GetMullvadCity() (country string, err error) + GetMullvadISP() (country string, err error) GetMullvadPort() (port uint16, err error) // Windscribe getters - GetWindscribeRegion() (country models.WindscribeRegion, err error) + GetWindscribeRegion() (country string, err error) GetWindscribePort(protocol models.NetworkProtocol) (port uint16, err error) // Surfshark getters - GetSurfsharkRegion() (country models.SurfsharkRegion, err error) + GetSurfsharkRegion() (country string, err error) // Cyberghost getters - GetCyberghostGroup() (region models.CyberghostGroup, err error) - GetCyberghostRegion() (region models.CyberghostRegion, err error) + GetCyberghostGroup() (group string, err error) + GetCyberghostRegion() (region string, err error) GetCyberghostClientKey() (clientKey string, err error) // Shadowsocks getters diff --git a/internal/params/pia.go b/internal/params/pia.go index 4ddd17c3..fefefe91 100644 --- a/internal/params/pia.go +++ b/internal/params/pia.go @@ -32,29 +32,37 @@ func (r *reader) GetPortForwardingStatusFilepath() (filepath models.Filepath, er return models.Filepath(filepathStr), err } -// GetPIAEncryption obtains the encryption level for the PIA connection +// GetPIAEncryptionPreset obtains the encryption level for the PIA connection // from the environment variable PIA_ENCRYPTION, and using ENCRYPTION for // retro compatibility -func (r *reader) GetPIAEncryption() (models.PIAEncryption, error) { +func (r *reader) GetPIAEncryptionPreset() (preset string, err error) { // Retro-compatibility - s, err := r.envParams.GetValueIfInside("ENCRYPTION", []string{"normal", "strong", ""}) + s, err := r.envParams.GetValueIfInside("ENCRYPTION", []string{ + constants.PIAEncryptionPresetNormal, + constants.PIAEncryptionPresetStrong, + ""}) if err != nil { return "", err } else if len(s) != 0 { r.logger.Warn("You are using the old environment variable ENCRYPTION, please consider changing it to PIA_ENCRYPTION") - return models.PIAEncryption(s), nil + return s, nil } - s, err = r.envParams.GetValueIfInside("PIA_ENCRYPTION", []string{"normal", "strong"}, libparams.Default("strong")) - return models.PIAEncryption(s), err + return r.envParams.GetValueIfInside( + "PIA_ENCRYPTION", + []string{ + constants.PIAEncryptionPresetNormal, + constants.PIAEncryptionPresetStrong, + }, + libparams.Default(constants.PIAEncryptionPresetStrong)) } // GetPIARegion obtains the region for the PIA server from the // environment variable REGION -func (r *reader) GetPIARegion() (region models.PIARegion, err error) { +func (r *reader) GetPIARegion() (region string, err error) { choices := append(constants.PIAGeoChoices(), "") s, err := r.envParams.GetValueIfInside("REGION", choices) if len(s) == 0 { // Suggestion by @rorph https://github.com/rorph s = choices[rand.Int()%len(choices)] //nolint:gosec } - return models.PIARegion(s), err + return s, err } diff --git a/internal/params/surfshark.go b/internal/params/surfshark.go index 30dda280..c67727c7 100644 --- a/internal/params/surfshark.go +++ b/internal/params/surfshark.go @@ -1,15 +1,12 @@ package params import ( - "strings" - "github.com/qdm12/private-internet-access-docker/internal/constants" - "github.com/qdm12/private-internet-access-docker/internal/models" ) // GetSurfsharkRegion obtains the region for the Surfshark server from the // environment variable REGION -func (r *reader) GetSurfsharkRegion() (region models.SurfsharkRegion, err error) { +func (r *reader) GetSurfsharkRegion() (region string, err error) { s, err := r.envParams.GetValueIfInside("REGION", constants.SurfsharkRegionChoices()) - return models.SurfsharkRegion(strings.ToLower(s)), err + return s, err } diff --git a/internal/params/windscribe.go b/internal/params/windscribe.go index 102bb16b..71408a62 100644 --- a/internal/params/windscribe.go +++ b/internal/params/windscribe.go @@ -2,7 +2,6 @@ package params import ( "fmt" - "strings" libparams "github.com/qdm12/golibs/params" "github.com/qdm12/private-internet-access-docker/internal/constants" @@ -11,9 +10,9 @@ import ( // GetWindscribeRegion obtains the region for the Windscribe server from the // environment variable REGION -func (r *reader) GetWindscribeRegion() (region models.WindscribeRegion, err error) { +func (r *reader) GetWindscribeRegion() (region string, err error) { s, err := r.envParams.GetValueIfInside("REGION", constants.WindscribeRegionChoices()) - return models.WindscribeRegion(strings.ToLower(s)), err + return s, err } // GetMullvadPort obtains the port to reach the Mullvad server on from the diff --git a/internal/pia/conf.go b/internal/pia/conf.go deleted file mode 100644 index 73c43ce8..00000000 --- a/internal/pia/conf.go +++ /dev/null @@ -1,135 +0,0 @@ -package pia - -import ( - "fmt" - "net" - "strings" - - "github.com/qdm12/golibs/files" - "github.com/qdm12/private-internet-access-docker/internal/constants" - "github.com/qdm12/private-internet-access-docker/internal/models" -) - -func (c *configurator) GetOpenVPNConnections(region models.PIARegion, protocol models.NetworkProtocol, encryption models.PIAEncryption, targetIP net.IP) (connections []models.OpenVPNConnection, err error) { - var IPs []net.IP - for _, server := range constants.PIAServers() { - if strings.EqualFold(string(server.Region), string(region)) { - IPs = server.IPs - } - } - if len(IPs) == 0 { - return nil, fmt.Errorf("no IP found for region %q", region) - } - if targetIP != nil { - found := false - for i := range IPs { - if IPs[i].Equal(targetIP) { - found = true - break - } - } - if !found { - return nil, fmt.Errorf("target IP address %q not found in IP addresses", targetIP) - } - IPs = []net.IP{targetIP} - } - var port uint16 - switch protocol { - case constants.TCP: - switch encryption { - case constants.PIAEncryptionNormal: - port = 502 - case constants.PIAEncryptionStrong: - port = 501 - } - case constants.UDP: - switch encryption { - case constants.PIAEncryptionNormal: - port = 1198 - case constants.PIAEncryptionStrong: - port = 1197 - } - } - if port == 0 { - return nil, fmt.Errorf("combination of protocol %q and encryption %q does not yield any port number", protocol, encryption) - } - for _, IP := range IPs { - connections = append(connections, models.OpenVPNConnection{IP: IP, Port: port, Protocol: protocol}) - } - return connections, nil -} - -func (c *configurator) BuildConf(connections []models.OpenVPNConnection, encryption models.PIAEncryption, verbosity, uid, gid int, root bool, cipher, auth string) (err error) { - var X509CRL, certificate string - if encryption == constants.PIAEncryptionNormal { - if len(cipher) == 0 { - cipher = "aes-128-cbc" - } - if len(auth) == 0 { - auth = "sha1" - } - X509CRL = constants.PiaX509CRLNormal - certificate = constants.PIACertificateNormal - } else { // strong encryption - if len(cipher) == 0 { - cipher = "aes-256-cbc" - } - if len(auth) == 0 { - auth = "sha256" - } - X509CRL = constants.PiaX509CRLStrong - certificate = constants.PIACertificateStrong - } - lines := []string{ - "client", - "dev tun", - "nobind", - "persist-key", - "remote-cert-tls server", - - // PIA specific - "ping 300", // Ping every 5 minutes to prevent a timeout error - "reneg-sec 0", - "compress", // allow PIA server to choose the compression to use - - // Added constant values - "auth-nocache", - "mute-replay-warnings", - "pull-filter ignore \"auth-token\"", // prevent auth failed loops - "auth-retry nointeract", - "remote-random", - "suppress-timestamps", - - // Modified variables - fmt.Sprintf("verb %d", verbosity), - fmt.Sprintf("auth-user-pass %s", constants.OpenVPNAuthConf), - fmt.Sprintf("proto %s", string(connections[0].Protocol)), - fmt.Sprintf("cipher %s", cipher), - fmt.Sprintf("auth %s", auth), - } - if strings.HasSuffix(cipher, "-gcm") { - lines = append(lines, "ncp-disable") - } - if !root { - lines = append(lines, "user nonrootuser") - } - for _, connection := range connections { - lines = append(lines, fmt.Sprintf("remote %s %d", connection.IP.String(), connection.Port)) - } - lines = append(lines, []string{ - "", - "-----BEGIN X509 CRL-----", - X509CRL, - "-----END X509 CRL-----", - "", - }...) - lines = append(lines, []string{ - "", - "-----BEGIN CERTIFICATE-----", - certificate, - "-----END CERTIFICATE-----", - "", - "", - }...) - return c.fileManager.WriteLinesToFile(string(constants.OpenVPNConf), lines, files.Ownership(uid, gid), files.Permissions(0400)) -} diff --git a/internal/pia/pia.go b/internal/pia/pia.go deleted file mode 100644 index f2390672..00000000 --- a/internal/pia/pia.go +++ /dev/null @@ -1,43 +0,0 @@ -package pia - -import ( - "context" - "net" - - "github.com/qdm12/golibs/crypto/random" - "github.com/qdm12/golibs/files" - "github.com/qdm12/golibs/network" - "github.com/qdm12/golibs/verification" - "github.com/qdm12/private-internet-access-docker/internal/firewall" - "github.com/qdm12/private-internet-access-docker/internal/models" -) - -// Configurator contains methods to read and modify the openvpn configuration to connect as a client -type Configurator interface { - GetOpenVPNConnections(region models.PIARegion, protocol models.NetworkProtocol, - encryption models.PIAEncryption, targetIP net.IP) (connections []models.OpenVPNConnection, err error) - BuildConf(connections []models.OpenVPNConnection, encryption models.PIAEncryption, verbosity, uid, gid int, root bool, cipher, auth string) (err error) - GetPortForward() (port uint16, err error) - WritePortForward(filepath models.Filepath, port uint16, uid, gid int) (err error) - AllowPortForwardFirewall(ctx context.Context, device models.VPNDevice, port uint16) (err error) -} - -type configurator struct { - client network.Client - fileManager files.FileManager - firewall firewall.Configurator - random random.Random - verifyPort func(port string) error - lookupIP func(host string) ([]net.IP, error) -} - -// NewConfigurator returns a new Configurator object -func NewConfigurator(client network.Client, fileManager files.FileManager, firewall firewall.Configurator) Configurator { - return &configurator{ - client: client, - fileManager: fileManager, - firewall: firewall, - random: random.NewRandom(), - verifyPort: verification.NewVerifier().VerifyPort, - lookupIP: net.LookupIP} -} diff --git a/internal/pia/portforward.go b/internal/pia/portforward.go deleted file mode 100644 index 116aa2b5..00000000 --- a/internal/pia/portforward.go +++ /dev/null @@ -1,50 +0,0 @@ -package pia - -import ( - "context" - "encoding/hex" - "encoding/json" - "fmt" - "net/http" - - "github.com/qdm12/golibs/files" - "github.com/qdm12/private-internet-access-docker/internal/constants" - "github.com/qdm12/private-internet-access-docker/internal/models" -) - -func (c *configurator) GetPortForward() (port uint16, err error) { - b, err := c.random.GenerateRandomBytes(32) - if err != nil { - return 0, err - } - clientID := hex.EncodeToString(b) - url := fmt.Sprintf("%s/?client_id=%s", constants.PIAPortForwardURL, clientID) - content, status, err := c.client.GetContent(url) - switch { - case err != nil: - return 0, err - case status != http.StatusOK: - return 0, fmt.Errorf("status is %d for %s; does your PIA server support port forwarding?", status, url) - case len(content) == 0: - return 0, fmt.Errorf("port forwarding is already activated on this connection, has expired, or you are not connected to a PIA region that supports port forwarding") - } - body := struct { - Port uint16 `json:"port"` - }{} - if err := json.Unmarshal(content, &body); err != nil { - return 0, fmt.Errorf("port forwarding response: %w", err) - } - return body.Port, nil -} - -func (c *configurator) WritePortForward(filepath models.Filepath, port uint16, uid, gid int) (err error) { - return c.fileManager.WriteLinesToFile( - string(filepath), - []string{fmt.Sprintf("%d", port)}, - files.Ownership(uid, gid), - files.Permissions(0400)) -} - -func (c *configurator) AllowPortForwardFirewall(ctx context.Context, device models.VPNDevice, port uint16) (err error) { - return c.firewall.AllowInputTrafficOnPort(ctx, device, port) -} diff --git a/internal/provider/constants.go b/internal/provider/constants.go new file mode 100644 index 00000000..bfd76cf3 --- /dev/null +++ b/internal/provider/constants.go @@ -0,0 +1,5 @@ +package provider + +const ( + aes256cbc = "aes-256-cbc" +) diff --git a/internal/cyberghost/conf.go b/internal/provider/cyberghost.go similarity index 64% rename from internal/cyberghost/conf.go rename to internal/provider/cyberghost.go index 8c45d738..8a4ec1b2 100644 --- a/internal/cyberghost/conf.go +++ b/internal/provider/cyberghost.go @@ -1,6 +1,7 @@ -package cyberghost +package provider import ( + "context" "fmt" "net" "strings" @@ -10,38 +11,46 @@ import ( "github.com/qdm12/private-internet-access-docker/internal/models" ) -func (c *configurator) GetOpenVPNConnections(group models.CyberghostGroup, region models.CyberghostRegion, protocol models.NetworkProtocol, targetIP net.IP) (connections []models.OpenVPNConnection, err error) { +type cyberghost struct { + fileManager files.FileManager +} + +func newCyberghost(fileManager files.FileManager) *cyberghost { + return &cyberghost{fileManager: fileManager} +} + +func (c *cyberghost) GetOpenVPNConnections(selection models.ServerSelection) (connections []models.OpenVPNConnection, err error) { var IPs []net.IP for _, server := range constants.CyberghostServers() { - if strings.EqualFold(string(server.Region), string(region)) && strings.EqualFold(string(server.Group), string(group)) { + if strings.EqualFold(server.Region, selection.Region) && strings.EqualFold(server.Group, selection.Group) { IPs = server.IPs } } if len(IPs) == 0 { - return nil, fmt.Errorf("no IP found for group %q and region %q", group, region) + return nil, fmt.Errorf("no IP found for group %q and region %q", selection.Group, selection.Region) } - if targetIP != nil { + if selection.TargetIP != nil { found := false for i := range IPs { - if IPs[i].Equal(targetIP) { + if IPs[i].Equal(selection.TargetIP) { found = true break } } if !found { - return nil, fmt.Errorf("target IP address %q not found in IP addresses", targetIP) + return nil, fmt.Errorf("target IP address %q not found in IP addresses", selection.TargetIP) } - IPs = []net.IP{targetIP} + IPs = []net.IP{selection.TargetIP} } for _, IP := range IPs { - connections = append(connections, models.OpenVPNConnection{IP: IP, Port: 1443, Protocol: protocol}) + connections = append(connections, models.OpenVPNConnection{IP: IP, Port: 1443, Protocol: selection.Protocol}) } return connections, nil } -func (c *configurator) BuildConf(connections []models.OpenVPNConnection, clientKey string, verbosity, uid, gid int, root bool, cipher, auth string) (err error) { +func (c *cyberghost) BuildConf(connections []models.OpenVPNConnection, verbosity, uid, gid int, root bool, cipher, auth string, extras models.ExtraConfigOptions) (err error) { if len(cipher) == 0 { - cipher = "AES-256-CBC" + cipher = aes256cbc } if len(auth) == 0 { auth = "SHA256" @@ -105,10 +114,22 @@ func (c *configurator) BuildConf(connections []models.OpenVPNConnection, clientK lines = append(lines, []string{ "", "-----BEGIN PRIVATE KEY-----", - clientKey, + extras.ClientKey, "-----END PRIVATE KEY-----", "", "", }...) return c.fileManager.WriteLinesToFile(string(constants.OpenVPNConf), lines, files.Ownership(uid, gid), files.Permissions(0400)) } + +func (c *cyberghost) GetPortForward() (port uint16, err error) { + panic("port forwarding is not supported for cyberghost") +} + +func (c *cyberghost) WritePortForward(filepath models.Filepath, port uint16, uid, gid int) (err error) { + panic("port forwarding is not supported for cyberghost") +} + +func (c *cyberghost) AllowPortForwardFirewall(ctx context.Context, device models.VPNDevice, port uint16) (err error) { + panic("port forwarding is not supported for cyberghost") +} diff --git a/internal/mullvad/conf.go b/internal/provider/mullvad.go similarity index 54% rename from internal/mullvad/conf.go rename to internal/provider/mullvad.go index 45931916..2beee465 100644 --- a/internal/mullvad/conf.go +++ b/internal/provider/mullvad.go @@ -1,46 +1,59 @@ -package mullvad +package provider import ( + "context" "fmt" - "net" "github.com/qdm12/golibs/files" + "github.com/qdm12/golibs/logging" "github.com/qdm12/private-internet-access-docker/internal/constants" "github.com/qdm12/private-internet-access-docker/internal/models" ) -func (c *configurator) GetOpenVPNConnections(country models.MullvadCountry, city models.MullvadCity, provider models.MullvadProvider, protocol models.NetworkProtocol, customPort uint16, targetIP net.IP) (connections []models.OpenVPNConnection, err error) { - servers := constants.MullvadServerFilter(country, city, provider) +type mullvad struct { + fileManager files.FileManager + logger logging.Logger +} + +func newMullvad(fileManager files.FileManager, logger logging.Logger) *mullvad { + return &mullvad{ + fileManager: fileManager, + logger: logger.WithPrefix("Mullvad configurator: "), + } +} + +func (m *mullvad) GetOpenVPNConnections(selection models.ServerSelection) (connections []models.OpenVPNConnection, err error) { + servers := constants.MullvadServerFilter(selection.Country, selection.City, selection.ISP) if len(servers) == 0 { - return nil, fmt.Errorf("no server found for country %q, city %q and ISP %q", country, city, provider) + return nil, fmt.Errorf("no server found for country %q, city %q and ISP %q", selection.Country, selection.City, selection.ISP) } for _, server := range servers { port := server.DefaultPort - if customPort > 0 { - port = customPort + if selection.CustomPort > 0 { + port = selection.CustomPort } for _, IP := range server.IPs { - if targetIP != nil { - if targetIP.Equal(IP) { - return []models.OpenVPNConnection{{IP: IP, Port: port, Protocol: protocol}}, nil + if selection.TargetIP != nil { + if selection.TargetIP.Equal(IP) { + return []models.OpenVPNConnection{{IP: IP, Port: port, Protocol: selection.Protocol}}, nil } } else { - connections = append(connections, models.OpenVPNConnection{IP: IP, Port: port, Protocol: protocol}) + connections = append(connections, models.OpenVPNConnection{IP: IP, Port: port, Protocol: selection.Protocol}) } } } - if targetIP != nil { - return nil, fmt.Errorf("target IP address %q not found in IP addresses", targetIP) + if selection.TargetIP != nil { + return nil, fmt.Errorf("target IP address %q not found in IP addresses", selection.TargetIP) } return connections, nil } -func (c *configurator) BuildConf(connections []models.OpenVPNConnection, verbosity, uid, gid int, root bool, cipher string) (err error) { +func (m *mullvad) BuildConf(connections []models.OpenVPNConnection, verbosity, uid, gid int, root bool, cipher, auth string, extras models.ExtraConfigOptions) (err error) { if len(connections) == 0 { return fmt.Errorf("at least one connection string is expected") } if len(cipher) == 0 { - cipher = "AES-256-CBC" + cipher = aes256cbc } lines := []string{ "client", @@ -86,5 +99,17 @@ func (c *configurator) BuildConf(connections []models.OpenVPNConnection, verbosi "", "", }...) - return c.fileManager.WriteLinesToFile(string(constants.OpenVPNConf), lines, files.Ownership(uid, gid), files.Permissions(0400)) + return m.fileManager.WriteLinesToFile(string(constants.OpenVPNConf), lines, files.Ownership(uid, gid), files.Permissions(0400)) +} + +func (m *mullvad) GetPortForward() (port uint16, err error) { + panic("port forwarding is not supported for mullvad") +} + +func (m *mullvad) WritePortForward(filepath models.Filepath, port uint16, uid, gid int) (err error) { + panic("port forwarding is not supported for mullvad") +} + +func (m *mullvad) AllowPortForwardFirewall(ctx context.Context, device models.VPNDevice, port uint16) (err error) { + panic("port forwarding is not supported for mullvad") } diff --git a/internal/provider/pia.go b/internal/provider/pia.go new file mode 100644 index 00000000..dd9cec05 --- /dev/null +++ b/internal/provider/pia.go @@ -0,0 +1,199 @@ +package provider + +import ( + "context" + "encoding/hex" + "encoding/json" + "fmt" + "net" + "net/http" + "strings" + + "github.com/qdm12/golibs/crypto/random" + "github.com/qdm12/golibs/files" + "github.com/qdm12/golibs/network" + "github.com/qdm12/golibs/verification" + "github.com/qdm12/private-internet-access-docker/internal/constants" + "github.com/qdm12/private-internet-access-docker/internal/firewall" + "github.com/qdm12/private-internet-access-docker/internal/models" +) + +type pia struct { + client network.Client + fileManager files.FileManager + firewall firewall.Configurator + random random.Random + verifyPort func(port string) error + lookupIP func(host string) ([]net.IP, error) +} + +func newPrivateInternetAccess(client network.Client, fileManager files.FileManager, firewall firewall.Configurator) *pia { + return &pia{ + client: client, + fileManager: fileManager, + firewall: firewall, + random: random.NewRandom(), + verifyPort: verification.NewVerifier().VerifyPort, + lookupIP: net.LookupIP} +} + +func (p *pia) GetOpenVPNConnections(selection models.ServerSelection) (connections []models.OpenVPNConnection, err error) { + var IPs []net.IP + for _, server := range constants.PIAServers() { + if strings.EqualFold(server.Region, selection.Region) { + IPs = server.IPs + } + } + if len(IPs) == 0 { + return nil, fmt.Errorf("no IP found for region %q", selection.Region) + } + if selection.TargetIP != nil { + found := false + for i := range IPs { + if IPs[i].Equal(selection.TargetIP) { + found = true + break + } + } + if !found { + return nil, fmt.Errorf("target IP address %q not found in IP addresses", selection.TargetIP) + } + IPs = []net.IP{selection.TargetIP} + } + var port uint16 + switch selection.Protocol { + case constants.TCP: + switch selection.EncryptionPreset { + case constants.PIAEncryptionPresetNormal: + port = 502 + case constants.PIAEncryptionPresetStrong: + port = 501 + } + case constants.UDP: + switch selection.EncryptionPreset { + case constants.PIAEncryptionPresetNormal: + port = 1198 + case constants.PIAEncryptionPresetStrong: + port = 1197 + } + } + if port == 0 { + return nil, fmt.Errorf("combination of protocol %q and encryption %q does not yield any port number", selection.Protocol, selection.EncryptionPreset) + } + for _, IP := range IPs { + connections = append(connections, models.OpenVPNConnection{IP: IP, Port: port, Protocol: selection.Protocol}) + } + return connections, nil +} + +func (p *pia) BuildConf(connections []models.OpenVPNConnection, verbosity, uid, gid int, root bool, cipher, auth string, extras models.ExtraConfigOptions) (err error) { + var X509CRL, certificate string + if extras.EncryptionPreset == constants.PIAEncryptionPresetNormal { + if len(cipher) == 0 { + cipher = "aes-128-cbc" + } + if len(auth) == 0 { + auth = "sha1" + } + X509CRL = constants.PiaX509CRLNormal + certificate = constants.PIACertificateNormal + } else { // strong encryption + if len(cipher) == 0 { + cipher = aes256cbc + } + if len(auth) == 0 { + auth = "sha256" + } + X509CRL = constants.PiaX509CRLStrong + certificate = constants.PIACertificateStrong + } + lines := []string{ + "client", + "dev tun", + "nobind", + "persist-key", + "remote-cert-tls server", + + // PIA specific + "ping 300", // Ping every 5 minutes to prevent a timeout error + "reneg-sec 0", + "compress", // allow PIA server to choose the compression to use + + // Added constant values + "auth-nocache", + "mute-replay-warnings", + "pull-filter ignore \"auth-token\"", // prevent auth failed loops + "auth-retry nointeract", + "remote-random", + "suppress-timestamps", + + // Modified variables + fmt.Sprintf("verb %d", verbosity), + fmt.Sprintf("auth-user-pass %s", constants.OpenVPNAuthConf), + fmt.Sprintf("proto %s", string(connections[0].Protocol)), + fmt.Sprintf("cipher %s", cipher), + fmt.Sprintf("auth %s", auth), + } + if strings.HasSuffix(cipher, "-gcm") { + lines = append(lines, "ncp-disable") + } + if !root { + lines = append(lines, "user nonrootuser") + } + for _, connection := range connections { + lines = append(lines, fmt.Sprintf("remote %s %d", connection.IP.String(), connection.Port)) + } + lines = append(lines, []string{ + "", + "-----BEGIN X509 CRL-----", + X509CRL, + "-----END X509 CRL-----", + "", + }...) + lines = append(lines, []string{ + "", + "-----BEGIN CERTIFICATE-----", + certificate, + "-----END CERTIFICATE-----", + "", + "", + }...) + return p.fileManager.WriteLinesToFile(string(constants.OpenVPNConf), lines, files.Ownership(uid, gid), files.Permissions(0400)) +} + +func (p *pia) GetPortForward() (port uint16, err error) { + b, err := p.random.GenerateRandomBytes(32) + if err != nil { + return 0, err + } + clientID := hex.EncodeToString(b) + url := fmt.Sprintf("%s/?client_id=%s", constants.PIAPortForwardURL, clientID) + content, status, err := p.client.GetContent(url) + switch { + case err != nil: + return 0, err + case status != http.StatusOK: + return 0, fmt.Errorf("status is %d for %s; does your PIA server support port forwarding?", status, url) + case len(content) == 0: + return 0, fmt.Errorf("port forwarding is already activated on this connection, has expired, or you are not connected to a PIA region that supports port forwarding") + } + body := struct { + Port uint16 `json:"port"` + }{} + if err := json.Unmarshal(content, &body); err != nil { + return 0, fmt.Errorf("port forwarding response: %w", err) + } + return body.Port, nil +} + +func (p *pia) WritePortForward(filepath models.Filepath, port uint16, uid, gid int) (err error) { + return p.fileManager.WriteLinesToFile( + string(filepath), + []string{fmt.Sprintf("%d", port)}, + files.Ownership(uid, gid), + files.Permissions(0400)) +} + +func (p *pia) AllowPortForwardFirewall(ctx context.Context, device models.VPNDevice, port uint16) (err error) { + return p.firewall.AllowInputTrafficOnPort(ctx, device, port) +} diff --git a/internal/provider/provider.go b/internal/provider/provider.go new file mode 100644 index 00000000..61380f76 --- /dev/null +++ b/internal/provider/provider.go @@ -0,0 +1,38 @@ +package provider + +import ( + "context" + + "github.com/qdm12/golibs/files" + "github.com/qdm12/golibs/logging" + "github.com/qdm12/golibs/network" + "github.com/qdm12/private-internet-access-docker/internal/constants" + "github.com/qdm12/private-internet-access-docker/internal/firewall" + "github.com/qdm12/private-internet-access-docker/internal/models" +) + +// Provider contains methods to read and modify the openvpn configuration to connect as a client +type Provider interface { + GetOpenVPNConnections(selection models.ServerSelection) (connections []models.OpenVPNConnection, err error) + BuildConf(connections []models.OpenVPNConnection, verbosity, uid, gid int, root bool, cipher, auth string, extras models.ExtraConfigOptions) (err error) + GetPortForward() (port uint16, err error) + WritePortForward(filepath models.Filepath, port uint16, uid, gid int) (err error) + AllowPortForwardFirewall(ctx context.Context, device models.VPNDevice, port uint16) (err error) +} + +func New(provider models.VPNProvider, logger logging.Logger, client network.Client, fileManager files.FileManager, firewall firewall.Configurator) Provider { + switch provider { + case constants.PrivateInternetAccess: + return newPrivateInternetAccess(client, fileManager, firewall) + case constants.Mullvad: + return newMullvad(fileManager, logger) + case constants.Windscribe: + return newWindscribe(fileManager) + case constants.Surfshark: + return newSurfshark(fileManager) + case constants.Cyberghost: + return newCyberghost(fileManager) + default: + return nil // should never occur + } +} diff --git a/internal/surfshark/conf.go b/internal/provider/surfshark.go similarity index 57% rename from internal/surfshark/conf.go rename to internal/provider/surfshark.go index cc14caf2..dbea1719 100644 --- a/internal/surfshark/conf.go +++ b/internal/provider/surfshark.go @@ -1,6 +1,7 @@ -package surfshark +package provider import ( + "context" "fmt" "net" "strings" @@ -10,47 +11,56 @@ import ( "github.com/qdm12/private-internet-access-docker/internal/models" ) -func (c *configurator) GetOpenVPNConnections(region models.SurfsharkRegion, protocol models.NetworkProtocol, targetIP net.IP) (connections []models.OpenVPNConnection, err error) { +type surfshark struct { + fileManager files.FileManager + lookupIP func(host string) ([]net.IP, error) +} + +func newSurfshark(fileManager files.FileManager) *surfshark { + return &surfshark{fileManager, net.LookupIP} +} + +func (s *surfshark) GetOpenVPNConnections(selection models.ServerSelection) (connections []models.OpenVPNConnection, err error) { var IPs []net.IP for _, server := range constants.SurfsharkServers() { - if strings.EqualFold(string(server.Region), string(region)) { + if strings.EqualFold(server.Region, selection.Region) { IPs = server.IPs } } if len(IPs) == 0 { - return nil, fmt.Errorf("no IP found for region %q", region) + return nil, fmt.Errorf("no IP found for region %q", selection.Region) } - if targetIP != nil { + if selection.TargetIP != nil { found := false for i := range IPs { - if IPs[i].Equal(targetIP) { + if IPs[i].Equal(selection.TargetIP) { found = true break } } if !found { - return nil, fmt.Errorf("target IP address %q not found in IP addresses", targetIP) + return nil, fmt.Errorf("target IP address %q not found in IP addresses", selection.TargetIP) } - IPs = []net.IP{targetIP} + IPs = []net.IP{selection.TargetIP} } var port uint16 switch { - case protocol == constants.TCP: + case selection.Protocol == constants.TCP: port = 1443 - case protocol == constants.UDP: + case selection.Protocol == constants.UDP: port = 1194 default: - return nil, fmt.Errorf("protocol %q is unknown", protocol) + return nil, fmt.Errorf("protocol %q is unknown", selection.Protocol) } for _, IP := range IPs { - connections = append(connections, models.OpenVPNConnection{IP: IP, Port: port, Protocol: protocol}) + connections = append(connections, models.OpenVPNConnection{IP: IP, Port: port, Protocol: selection.Protocol}) } return connections, nil } -func (c *configurator) BuildConf(connections []models.OpenVPNConnection, verbosity, uid, gid int, root bool, cipher, auth string) (err error) { +func (s *surfshark) BuildConf(connections []models.OpenVPNConnection, verbosity, uid, gid int, root bool, cipher, auth string, extras models.ExtraConfigOptions) (err error) { if len(cipher) == 0 { - cipher = "AES-256-CBC" + cipher = aes256cbc } if len(auth) == 0 { auth = "SHA512" @@ -110,5 +120,17 @@ func (c *configurator) BuildConf(connections []models.OpenVPNConnection, verbosi "", "", }...) - return c.fileManager.WriteLinesToFile(string(constants.OpenVPNConf), lines, files.Ownership(uid, gid), files.Permissions(0400)) + return s.fileManager.WriteLinesToFile(string(constants.OpenVPNConf), lines, files.Ownership(uid, gid), files.Permissions(0400)) +} + +func (s *surfshark) GetPortForward() (port uint16, err error) { + panic("port forwarding is not supported for surfshark") +} + +func (s *surfshark) WritePortForward(filepath models.Filepath, port uint16, uid, gid int) (err error) { + panic("port forwarding is not supported for surfshark") +} + +func (s *surfshark) AllowPortForwardFirewall(ctx context.Context, device models.VPNDevice, port uint16) (err error) { + panic("port forwarding is not supported for surfshark") } diff --git a/internal/windscribe/conf.go b/internal/provider/windscribe.go similarity index 57% rename from internal/windscribe/conf.go rename to internal/provider/windscribe.go index 5f23b385..4e857bcf 100644 --- a/internal/windscribe/conf.go +++ b/internal/provider/windscribe.go @@ -1,6 +1,7 @@ -package windscribe +package provider import ( + "context" "fmt" "net" "strings" @@ -10,49 +11,57 @@ import ( "github.com/qdm12/private-internet-access-docker/internal/models" ) -func (c *configurator) GetOpenVPNConnections(region models.WindscribeRegion, protocol models.NetworkProtocol, customPort uint16, targetIP net.IP) (connections []models.OpenVPNConnection, err error) { +type windscribe struct { + fileManager files.FileManager +} + +func newWindscribe(fileManager files.FileManager) *windscribe { + return &windscribe{fileManager: fileManager} +} + +func (w *windscribe) GetOpenVPNConnections(selection models.ServerSelection) (connections []models.OpenVPNConnection, err error) { var IPs []net.IP for _, server := range constants.WindscribeServers() { - if strings.EqualFold(string(server.Region), string(region)) { + if strings.EqualFold(server.Region, selection.Region) { IPs = server.IPs } } if len(IPs) == 0 { - return nil, fmt.Errorf("no IP found for region %q", region) + return nil, fmt.Errorf("no IP found for region %q", selection.Region) } - if targetIP != nil { + if selection.TargetIP != nil { found := false for i := range IPs { - if IPs[i].Equal(targetIP) { + if IPs[i].Equal(selection.TargetIP) { found = true break } } if !found { - return nil, fmt.Errorf("target IP address %q not found in IP addresses", targetIP) + return nil, fmt.Errorf("target IP address %q not found in IP addresses", selection.TargetIP) } - IPs = []net.IP{targetIP} + IPs = []net.IP{selection.TargetIP} } var port uint16 switch { - case customPort > 0: - port = customPort - case protocol == constants.TCP: + case selection.CustomPort > 0: + port = selection.CustomPort + case selection.Protocol == constants.TCP: port = 1194 - case protocol == constants.UDP: + case selection.Protocol == constants.UDP: port = 443 default: - return nil, fmt.Errorf("protocol %q is unknown", protocol) + return nil, fmt.Errorf("protocol %q is unknown", selection.Protocol) } for _, IP := range IPs { - connections = append(connections, models.OpenVPNConnection{IP: IP, Port: port, Protocol: protocol}) + connections = append(connections, models.OpenVPNConnection{IP: IP, Port: port, Protocol: selection.Protocol}) } return connections, nil } -func (c *configurator) BuildConf(connections []models.OpenVPNConnection, verbosity, uid, gid int, root bool, cipher, auth string) (err error) { +func (w *windscribe) BuildConf(connections []models.OpenVPNConnection, verbosity, uid, gid int, root bool, cipher, auth string, extras models.ExtraConfigOptions) (err error) { if len(cipher) == 0 { - cipher = "AES-256-CBC" + cipher = aes256cbc } if len(auth) == 0 { auth = "sha512" @@ -108,5 +117,17 @@ func (c *configurator) BuildConf(connections []models.OpenVPNConnection, verbosi "", "", }...) - return c.fileManager.WriteLinesToFile(string(constants.OpenVPNConf), lines, files.Ownership(uid, gid), files.Permissions(0400)) + return w.fileManager.WriteLinesToFile(string(constants.OpenVPNConf), lines, files.Ownership(uid, gid), files.Permissions(0400)) +} + +func (w *windscribe) GetPortForward() (port uint16, err error) { + panic("port forwarding is not supported for windscribe") +} + +func (w *windscribe) WritePortForward(filepath models.Filepath, port uint16, uid, gid int) (err error) { + panic("port forwarding is not supported for windscribe") +} + +func (w *windscribe) AllowPortForwardFirewall(ctx context.Context, device models.VPNDevice, port uint16) (err error) { + panic("port forwarding is not supported for windscribe") } diff --git a/internal/settings/cyberghost.go b/internal/settings/cyberghost.go deleted file mode 100644 index 87ca9053..00000000 --- a/internal/settings/cyberghost.go +++ /dev/null @@ -1,54 +0,0 @@ -package settings - -import ( - "strings" - - "github.com/qdm12/private-internet-access-docker/internal/models" - "github.com/qdm12/private-internet-access-docker/internal/params" -) - -// Windscribe contains the settings to connect to a Windscribe server -type Cyberghost struct { - User string - Password string - ClientKey string - Group models.CyberghostGroup - Region models.CyberghostRegion -} - -func (c *Cyberghost) String() string { - settingsList := []string{ - "Cyberghost settings:", - "User: [redacted]", - "Password: [redacted]", - "ClientKey: [redacted]", - "Group: " + string(c.Group), - "Region: " + string(c.Region), - } - return strings.Join(settingsList, "\n |--") -} - -// GetCyberghostSettings obtains Cyberghost settings from environment variables using the params package. -func GetCyberghostSettings(paramsReader params.Reader) (settings Cyberghost, err error) { - settings.User, err = paramsReader.GetUser() - if err != nil { - return settings, err - } - settings.Password, err = paramsReader.GetPassword() - if err != nil { - return settings, err - } - settings.ClientKey, err = paramsReader.GetCyberghostClientKey() - if err != nil { - return settings, err - } - settings.Group, err = paramsReader.GetCyberghostGroup() - if err != nil { - return settings, err - } - settings.Region, err = paramsReader.GetCyberghostRegion() - if err != nil { - return settings, err - } - return settings, nil -} diff --git a/internal/settings/mullvad.go b/internal/settings/mullvad.go deleted file mode 100644 index 3b1c9c15..00000000 --- a/internal/settings/mullvad.go +++ /dev/null @@ -1,56 +0,0 @@ -package settings - -import ( - "strings" - - "github.com/qdm12/private-internet-access-docker/internal/models" - "github.com/qdm12/private-internet-access-docker/internal/params" -) - -// Mullvad contains the settings to connect to a Mullvad server -type Mullvad struct { - User string - Country models.MullvadCountry - City models.MullvadCity - ISP models.MullvadProvider - Port uint16 -} - -func (m *Mullvad) String() string { - settingsList := []string{ - "Mullvad settings:", - "User: [redacted]", - "Country: " + string(m.Country), - "City: " + string(m.City), - "ISP: " + string(m.ISP), - "Port: " + string(m.Port), - } - return strings.Join(settingsList, "\n |--") -} - -// GetMullvadSettings obtains Mullvad settings from environment variables using the params package. -func GetMullvadSettings(paramsReader params.Reader) (settings Mullvad, err error) { - settings.User, err = paramsReader.GetUser() - if err != nil { - return settings, err - } - // Remove spaces in user ID to simplify user's life, thanks @JeordyR - settings.User = strings.ReplaceAll(settings.User, " ", "") - settings.Country, err = paramsReader.GetMullvadCountry() - if err != nil { - return settings, err - } - settings.City, err = paramsReader.GetMullvadCity() - if err != nil { - return settings, err - } - settings.ISP, err = paramsReader.GetMullvadISP() - if err != nil { - return settings, err - } - settings.Port, err = paramsReader.GetMullvadPort() - if err != nil { - return settings, err - } - return settings, nil -} diff --git a/internal/settings/openvpn.go b/internal/settings/openvpn.go index cd86d502..1c6a9e7f 100644 --- a/internal/settings/openvpn.go +++ b/internal/settings/openvpn.go @@ -2,26 +2,30 @@ package settings import ( "fmt" - "net" "strings" - "github.com/qdm12/private-internet-access-docker/internal/models" "github.com/qdm12/private-internet-access-docker/internal/params" ) // OpenVPN contains settings to configure the OpenVPN client type OpenVPN struct { - NetworkProtocol models.NetworkProtocol - Verbosity int - Root bool - TargetIP net.IP - Cipher string - Auth string + User string + Password string + Verbosity int + Root bool + Cipher string + Auth string } // GetOpenVPNSettings obtains the OpenVPN settings using the params functions func GetOpenVPNSettings(paramsReader params.Reader) (settings OpenVPN, err error) { - settings.NetworkProtocol, err = paramsReader.GetNetworkProtocol() + settings.User, err = paramsReader.GetUser() + if err != nil { + return settings, err + } + // Remove spaces in user ID to simplify user's life, thanks @JeordyR + settings.User = strings.ReplaceAll(settings.User, " ", "") + settings.Password, err = paramsReader.GetPassword() if err != nil { return settings, err } @@ -33,10 +37,6 @@ func GetOpenVPNSettings(paramsReader params.Reader) (settings OpenVPN, err error if err != nil { return settings, err } - settings.TargetIP, err = paramsReader.GetTargetIP() - if err != nil { - return settings, err - } settings.Cipher, err = paramsReader.GetOpenVPNCipher() if err != nil { return settings, err @@ -55,12 +55,16 @@ func (o *OpenVPN) String() string { } settingsList := []string{ "OpenVPN settings:", - "Network protocol: " + string(o.NetworkProtocol), + "User: [redacted]", + "Password: [redacted]", "Verbosity level: " + fmt.Sprintf("%d", o.Verbosity), "Run as root: " + runAsRoot, - "Target IP address: " + o.TargetIP.String(), - "Custom cipher: " + o.Cipher, - "Custom auth algorithm: " + o.Auth, + } + if len(o.Cipher) > 0 { + settingsList = append(settingsList, "Custom cipher: "+o.Cipher) + } + if len(o.Auth) > 0 { + settingsList = append(settingsList, "Custom auth algorithm: "+o.Auth) } return strings.Join(settingsList, "\n|--") } diff --git a/internal/settings/pia.go b/internal/settings/pia.go deleted file mode 100644 index 5904cb51..00000000 --- a/internal/settings/pia.go +++ /dev/null @@ -1,74 +0,0 @@ -package settings - -import ( - "fmt" - "strings" - - "github.com/qdm12/private-internet-access-docker/internal/models" - "github.com/qdm12/private-internet-access-docker/internal/params" -) - -// PIA contains the settings to connect to a PIA server -type PIA struct { - User string - Password string - Encryption models.PIAEncryption - Region models.PIARegion - PortForwarding PortForwarding -} - -// PortForwarding contains settings for port forwarding -type PortForwarding struct { - Enabled bool - Filepath models.Filepath -} - -func (p *PortForwarding) String() string { - if p.Enabled { - return fmt.Sprintf("on, saved in %s", p.Filepath) - } - return "off" -} - -func (p *PIA) String() string { - settingsList := []string{ - "PIA settings:", - "User: [redacted]", - "Password: [redacted]", - "Region: " + string(p.Region), - "Encryption: " + string(p.Encryption), - "Port forwarding: " + p.PortForwarding.String(), - } - return strings.Join(settingsList, "\n |--") -} - -// GetPIASettings obtains PIA settings from environment variables using the params package. -func GetPIASettings(paramsReader params.Reader) (settings PIA, err error) { - settings.User, err = paramsReader.GetUser() - if err != nil { - return settings, err - } - settings.Password, err = paramsReader.GetPassword() - if err != nil { - return settings, err - } - settings.Encryption, err = paramsReader.GetPIAEncryption() - if err != nil { - return settings, err - } - settings.Region, err = paramsReader.GetPIARegion() - if err != nil { - return settings, err - } - settings.PortForwarding.Enabled, err = paramsReader.GetPortForwarding() - if err != nil { - return settings, err - } - if settings.PortForwarding.Enabled { - settings.PortForwarding.Filepath, err = paramsReader.GetPortForwardingStatusFilepath() - if err != nil { - return settings, err - } - } - return settings, nil -} diff --git a/internal/settings/providers.go b/internal/settings/providers.go new file mode 100644 index 00000000..52b249a9 --- /dev/null +++ b/internal/settings/providers.go @@ -0,0 +1,137 @@ +package settings + +import ( + "github.com/qdm12/private-internet-access-docker/internal/constants" + "github.com/qdm12/private-internet-access-docker/internal/models" + "github.com/qdm12/private-internet-access-docker/internal/params" +) + +// GetPIASettings obtains PIA settings from environment variables using the params package. +func GetPIASettings(paramsReader params.Reader) (settings models.ProviderSettings, err error) { + settings.Name = constants.PrivateInternetAccess + settings.ServerSelection.Protocol, err = paramsReader.GetNetworkProtocol() + if err != nil { + return settings, err + } + settings.ServerSelection.TargetIP, err = paramsReader.GetTargetIP() + if err != nil { + return settings, err + } + encryptionPreset, err := paramsReader.GetPIAEncryptionPreset() + if err != nil { + return settings, err + } + settings.ServerSelection.EncryptionPreset = encryptionPreset + settings.ExtraConfigOptions.EncryptionPreset = encryptionPreset + settings.ServerSelection.Region, err = paramsReader.GetPIARegion() + if err != nil { + return settings, err + } + settings.PortForwarding.Enabled, err = paramsReader.GetPortForwarding() + if err != nil { + return settings, err + } + if settings.PortForwarding.Enabled { + settings.PortForwarding.Filepath, err = paramsReader.GetPortForwardingStatusFilepath() + if err != nil { + return settings, err + } + } + return settings, nil +} + +// GetMullvadSettings obtains Mullvad settings from environment variables using the params package. +func GetMullvadSettings(paramsReader params.Reader) (settings models.ProviderSettings, err error) { + settings.Name = constants.Mullvad + settings.ServerSelection.Protocol, err = paramsReader.GetNetworkProtocol() + if err != nil { + return settings, err + } + settings.ServerSelection.TargetIP, err = paramsReader.GetTargetIP() + if err != nil { + return settings, err + } + settings.ServerSelection.Country, err = paramsReader.GetMullvadCountry() + if err != nil { + return settings, err + } + settings.ServerSelection.City, err = paramsReader.GetMullvadCity() + if err != nil { + return settings, err + } + settings.ServerSelection.ISP, err = paramsReader.GetMullvadISP() + if err != nil { + return settings, err + } + settings.ServerSelection.CustomPort, err = paramsReader.GetMullvadPort() + if err != nil { + return settings, err + } + return settings, nil +} + +// GetWindscribeSettings obtains Windscribe settings from environment variables using the params package. +func GetWindscribeSettings(paramsReader params.Reader) (settings models.ProviderSettings, err error) { + settings.Name = constants.Windscribe + settings.ServerSelection.Protocol, err = paramsReader.GetNetworkProtocol() + if err != nil { + return settings, err + } + settings.ServerSelection.TargetIP, err = paramsReader.GetTargetIP() + if err != nil { + return settings, err + } + settings.ServerSelection.Region, err = paramsReader.GetWindscribeRegion() + if err != nil { + return settings, err + } + settings.ServerSelection.CustomPort, err = paramsReader.GetWindscribePort(settings.ServerSelection.Protocol) + if err != nil { + return settings, err + } + return settings, nil +} + +// GetSurfsharkSettings obtains Surfshark settings from environment variables using the params package. +func GetSurfsharkSettings(paramsReader params.Reader) (settings models.ProviderSettings, err error) { + settings.Name = constants.Surfshark + settings.ServerSelection.Protocol, err = paramsReader.GetNetworkProtocol() + if err != nil { + return settings, err + } + settings.ServerSelection.TargetIP, err = paramsReader.GetTargetIP() + if err != nil { + return settings, err + } + settings.ServerSelection.Region, err = paramsReader.GetSurfsharkRegion() + if err != nil { + return settings, err + } + return settings, nil +} + +// GetCyberghostSettings obtains Cyberghost settings from environment variables using the params package. +func GetCyberghostSettings(paramsReader params.Reader) (settings models.ProviderSettings, err error) { + settings.Name = constants.Cyberghost + settings.ServerSelection.Protocol, err = paramsReader.GetNetworkProtocol() + if err != nil { + return settings, err + } + settings.ServerSelection.TargetIP, err = paramsReader.GetTargetIP() + if err != nil { + return settings, err + } + settings.ExtraConfigOptions.ClientKey, err = paramsReader.GetCyberghostClientKey() + if err != nil { + return settings, err + } + settings.ServerSelection.Group, err = paramsReader.GetCyberghostGroup() + if err != nil { + return settings, err + } + settings.ServerSelection.Region, err = paramsReader.GetCyberghostRegion() + if err != nil { + return settings, err + } + return settings, nil +} diff --git a/internal/settings/settings.go b/internal/settings/settings.go index a2271a75..a6d53ee3 100644 --- a/internal/settings/settings.go +++ b/internal/settings/settings.go @@ -13,11 +13,7 @@ import ( type Settings struct { VPNSP models.VPNProvider OpenVPN OpenVPN - PIA PIA - Mullvad Mullvad - Windscribe Windscribe - Surfshark Surfshark - Cyberghost Cyberghost + Provider models.ProviderSettings System System DNS DNS Firewall Firewall @@ -26,23 +22,10 @@ type Settings struct { } func (s *Settings) String() string { - var vpnServiceProviderSettings string - switch s.VPNSP { - case constants.PrivateInternetAccess: - vpnServiceProviderSettings = s.PIA.String() - case constants.Mullvad: - vpnServiceProviderSettings = s.Mullvad.String() - case constants.Windscribe: - vpnServiceProviderSettings = s.Windscribe.String() - case constants.Surfshark: - vpnServiceProviderSettings = s.Surfshark.String() - case constants.Cyberghost: - vpnServiceProviderSettings = s.Cyberghost.String() - } return strings.Join([]string{ "Settings summary below:", s.OpenVPN.String(), - vpnServiceProviderSettings, + s.Provider.String(), s.System.String(), s.DNS.String(), s.Firewall.String(), @@ -59,27 +42,30 @@ func GetAllSettings(paramsReader params.Reader) (settings Settings, err error) { if err != nil { return settings, err } - settings.OpenVPN, err = GetOpenVPNSettings(paramsReader) - if err != nil { - return settings, err - } switch settings.VPNSP { case constants.PrivateInternetAccess: - settings.PIA, err = GetPIASettings(paramsReader) + settings.Provider, err = GetPIASettings(paramsReader) case constants.Mullvad: - settings.Mullvad, err = GetMullvadSettings(paramsReader) + settings.Provider, err = GetMullvadSettings(paramsReader) case constants.Windscribe: - settings.Windscribe, err = GetWindscribeSettings(paramsReader, settings.OpenVPN.NetworkProtocol) + settings.Provider, err = GetWindscribeSettings(paramsReader) case constants.Surfshark: - settings.Surfshark, err = GetSurfsharkSettings(paramsReader) + settings.Provider, err = GetSurfsharkSettings(paramsReader) case constants.Cyberghost: - settings.Cyberghost, err = GetCyberghostSettings(paramsReader) + settings.Provider, err = GetCyberghostSettings(paramsReader) default: err = fmt.Errorf("VPN service provider %q is not valid", settings.VPNSP) } if err != nil { return settings, err } + settings.OpenVPN, err = GetOpenVPNSettings(paramsReader) + if err != nil { + return settings, err + } + if settings.VPNSP == constants.Mullvad { + settings.OpenVPN.Password = "m" + } settings.DNS, err = GetDNSSettings(paramsReader) if err != nil { return settings, err diff --git a/internal/settings/surfshark.go b/internal/settings/surfshark.go deleted file mode 100644 index e9478c12..00000000 --- a/internal/settings/surfshark.go +++ /dev/null @@ -1,42 +0,0 @@ -package settings - -import ( - "strings" - - "github.com/qdm12/private-internet-access-docker/internal/models" - "github.com/qdm12/private-internet-access-docker/internal/params" -) - -// Surfshark contains the settings to connect to a Surfshark server -type Surfshark struct { - User string - Password string - Region models.SurfsharkRegion -} - -func (s *Surfshark) String() string { - settingsList := []string{ - "Surfshark settings:", - "User: [redacted]", - "Password: [redacted]", - "Region: " + strings.Title(string(s.Region)), - } - return strings.Join(settingsList, "\n |--") -} - -// GetSurfsharkSettings obtains Surfshark settings from environment variables using the params package. -func GetSurfsharkSettings(paramsReader params.Reader) (settings Surfshark, err error) { - settings.User, err = paramsReader.GetUser() - if err != nil { - return settings, err - } - settings.Password, err = paramsReader.GetPassword() - if err != nil { - return settings, err - } - settings.Region, err = paramsReader.GetSurfsharkRegion() - if err != nil { - return settings, err - } - return settings, nil -} diff --git a/internal/settings/windscribe.go b/internal/settings/windscribe.go deleted file mode 100644 index 45fadf5e..00000000 --- a/internal/settings/windscribe.go +++ /dev/null @@ -1,49 +0,0 @@ -package settings - -import ( - "fmt" - "strings" - - "github.com/qdm12/private-internet-access-docker/internal/models" - "github.com/qdm12/private-internet-access-docker/internal/params" -) - -// Windscribe contains the settings to connect to a Windscribe server -type Windscribe struct { - User string - Password string - Region models.WindscribeRegion - Port uint16 -} - -func (w *Windscribe) String() string { - settingsList := []string{ - "Windscribe settings:", - "User: [redacted]", - "Password: [redacted]", - "Region: " + string(w.Region), - "Custom port: " + fmt.Sprintf("%d", w.Port), - } - return strings.Join(settingsList, "\n |--") -} - -// GetWindscribeSettings obtains Windscribe settings from environment variables using the params package. -func GetWindscribeSettings(paramsReader params.Reader, protocol models.NetworkProtocol) (settings Windscribe, err error) { - settings.User, err = paramsReader.GetUser() - if err != nil { - return settings, err - } - settings.Password, err = paramsReader.GetPassword() - if err != nil { - return settings, err - } - settings.Region, err = paramsReader.GetWindscribeRegion() - if err != nil { - return settings, err - } - settings.Port, err = paramsReader.GetWindscribePort(protocol) - if err != nil { - return settings, err - } - return settings, nil -} diff --git a/internal/surfshark/surfshark.go b/internal/surfshark/surfshark.go deleted file mode 100644 index d1f20beb..00000000 --- a/internal/surfshark/surfshark.go +++ /dev/null @@ -1,24 +0,0 @@ -package surfshark - -import ( - "net" - - "github.com/qdm12/golibs/files" - "github.com/qdm12/private-internet-access-docker/internal/models" -) - -// Configurator contains methods to read and modify the openvpn configuration to connect as a client -type Configurator interface { - GetOpenVPNConnections(region models.SurfsharkRegion, protocol models.NetworkProtocol, targetIP net.IP) (connections []models.OpenVPNConnection, err error) - BuildConf(connections []models.OpenVPNConnection, verbosity, uid, gid int, root bool, cipher, auth string) (err error) -} - -type configurator struct { - fileManager files.FileManager - lookupIP func(host string) ([]net.IP, error) -} - -// NewConfigurator returns a new Configurator object -func NewConfigurator(fileManager files.FileManager) Configurator { - return &configurator{fileManager, net.LookupIP} -} diff --git a/internal/windscribe/windscribe.go b/internal/windscribe/windscribe.go deleted file mode 100644 index 805ef041..00000000 --- a/internal/windscribe/windscribe.go +++ /dev/null @@ -1,23 +0,0 @@ -package windscribe - -import ( - "net" - - "github.com/qdm12/golibs/files" - "github.com/qdm12/private-internet-access-docker/internal/models" -) - -// Configurator contains methods to read and modify the openvpn configuration to connect as a client -type Configurator interface { - GetOpenVPNConnections(region models.WindscribeRegion, protocol models.NetworkProtocol, customPort uint16, targetIP net.IP) (connections []models.OpenVPNConnection, err error) - BuildConf(connections []models.OpenVPNConnection, verbosity, uid, gid int, root bool, cipher, auth string) (err error) -} - -type configurator struct { - fileManager files.FileManager -} - -// NewConfigurator returns a new Configurator object -func NewConfigurator(fileManager files.FileManager) Configurator { - return &configurator{fileManager: fileManager} -}