diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 93766aae7..82996ff13 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -12,7 +12,7 @@ jobs: - name: Install libpcap run: sudo apt-get install libpcap-dev - name: Set up Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: go-version-file: "go.mod" - name: Set up gotestfmt @@ -20,9 +20,6 @@ jobs: with: # Optional: pass GITHUB_TOKEN to avoid rate limiting. token: ${{ secrets.GITHUB_TOKEN }} - - name: Granting private modules access - run: | - git config --global url."https://${{ secrets.CI_PRIVATE_REPOS_GH_TOKEN }}:x-oauth-basic@github.com/".insteadOf "https://github.com/" - name: Run tests run: | set -euo pipefail diff --git a/README.md b/README.md index 825964010..a315c32cc 100644 --- a/README.md +++ b/README.md @@ -125,7 +125,7 @@ Library Version - this is the version of the flashlight library and is based on Application Version - this is like the original Version that's baked in at application build time. It is still used for displaying the version in the UI, checking enabled features, and auto-updates. This version is NOT compiled into the flashlight library but is handled by the applications themselves and passed to flashlight when necessary (for example when checking enabled features). ### When and how to update Library Version -Whenever we release a new version of the flashlight library, we tag it using standard [Go module version numbering], for example `git tag v7.5.3`. Then, we update lantern-desktop and android-lantern to use that version of the flashlight library. That's it. +Whenever we release a new version of the flashlight library, we tag it using standard [Go module version numbering], for example `git tag v7.5.3`. Then, we update lantern to use that version of the flashlight library. That's it. #### What about major version changes When changing major versions, for example v7 to v8, we need to udpate the package name as usual with Go. That means: diff --git a/apipb/legacy.go b/apipb/legacy.go new file mode 100644 index 000000000..7eb5fabf5 --- /dev/null +++ b/apipb/legacy.go @@ -0,0 +1,220 @@ +// Copied from lantern-cloud: e57d588aa976ca9d1a8531c92972e20a7d1640f9 +// +// This file should be kept in sync with lantern-cloud +package apipb + +import ( + "crypto/tls" + "encoding/base64" + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "math" + "net" + "strconv" + "strings" + + commonconfig "github.com/getlantern/common/config" +) + +// Values configured uniformly on all clients. Note that we have no mechanism for updating these +// values for existing client-proxy assignments. +const ( + tlsClientHelloSplitting = false + tlsClientHelloID = "HelloBrowser" +) + +// For flashlight, since it doesn't accept an empty string. +var defaultTLSSuites string + +func init() { + suites := make([]string, 0) + for _, suite := range tls.CipherSuites() { + suites = append(suites, fmt.Sprintf("0x%04x", suite.ID)) + } + + defaultTLSSuites = strings.Join(suites, ",") +} + +// ProxyToLegacyConfig converts a ProxyConnectConfig to the legacy format +func ProxyToLegacyConfig(cfg *ProxyConnectConfig) (*commonconfig.ProxyConfig, error) { + legacy := new(commonconfig.ProxyConfig) + + legacy.Name = cfg.Name + legacy.Addr = fmt.Sprintf("%s:%d", cfg.Addr, cfg.Port) + legacy.Cert = string(cfg.CertPem) + legacy.AuthToken = cfg.AuthToken + legacy.Trusted = cfg.Trusted + legacy.Bias = 9 // bias clients towards using lantern-cloud proxies + + if cfg.Location != nil { + legacy.Location = &commonconfig.ProxyConfig_ProxyLocation{ + City: cfg.Location.City, + Country: cfg.Location.Country, + CountryCode: cfg.Location.CountryCode, + Latitude: cfg.Location.Latitude, + Longitude: cfg.Location.Longitude, + } + } + + legacy.Track = cfg.Track + legacy.Region = "platinum" // TODO: is region required? + + switch pCfg := cfg.ProtocolConfig.(type) { + case *ProxyConnectConfig_ConnectCfgTls: + legacy.PluggableTransport = "https" + // currently, lantern-cloud uses multiplexing for all https connections so we set the + // multiplexed addr to the same as the addr + legacy.MultiplexedAddr = legacy.Addr + + // TLS-level config + legacy.TLSClientHelloSplitting = tlsClientHelloSplitting + legacy.TLSClientHelloID = tlsClientHelloID + legacy.TLSServerNameIndicator = pCfg.ConnectCfgTls.ServerNameIndicator + + ss, err := serializeTLSSessionState(pCfg.ConnectCfgTls.SessionState) + if err != nil { + return nil, fmt.Errorf("serialize TLS session error: %w", err) + } + + legacy.TLSClientSessionState = ss + legacy.PluggableTransportSettings = map[string]string{} + + if pCfg.ConnectCfgTls.TlsFrag != "" { + legacy.PluggableTransportSettings["tlsfrag"] = pCfg.ConnectCfgTls.TlsFrag + } + + case *ProxyConnectConfig_ConnectCfgTlsmasq: + legacy.PluggableTransport = "tlsmasq" + + // TLS-level config + legacy.TLSClientHelloSplitting = tlsClientHelloSplitting + legacy.TLSClientHelloID = tlsClientHelloID + + tlsmasqCfg := pCfg.ConnectCfgTlsmasq + + tlsmasqOrigin, _, err := net.SplitHostPort(tlsmasqCfg.OriginAddr) + if err != nil { + return nil, fmt.Errorf("bad tlsmasq origin addr: %w", err) + } + + tlsmasqSuites := strings.Join(tlsmasqCfg.TlsSupportedCipherSuites, ",") + + // An empty list should indicate the default, but flashlight doesn't + // like that. + if len(tlsmasqCfg.TlsSupportedCipherSuites) == 0 { + tlsmasqSuites = defaultTLSSuites + } + + legacy.PluggableTransportSettings = map[string]string{ + "tlsmasq_secret": hex.EncodeToString(tlsmasqCfg.Secret), + "tlsmasq_sni": tlsmasqOrigin, + "tlsmasq_tlsminversion": tlsmasqCfg.TlsMinVersion, + "tlsmasq_suites": tlsmasqSuites, + } + + if pCfg.ConnectCfgTlsmasq.TlsFrag != "" { + legacy.PluggableTransportSettings["tlsfrag"] = pCfg.ConnectCfgTlsmasq.TlsFrag + } + + case *ProxyConnectConfig_ConnectCfgShadowsocks: + legacy.PluggableTransport = "shadowsocks" + legacy.MultiplexedAddr = legacy.Addr + + ssCfg := pCfg.ConnectCfgShadowsocks + + legacy.PluggableTransportSettings = map[string]string{ + "shadowsocks_secret": ssCfg.Secret, + "shadowsocks_cipher": ssCfg.Cipher, + "shadowsocks_prefix_generator": ssCfg.PrefixGenerator, + "shadowsocks_with_tls": strconv.FormatBool(ssCfg.WithTls), + } + + case *ProxyConnectConfig_ConnectCfgBroflake: + legacy.PluggableTransport = "broflake" + legacy.Addr = "broflake" + + bbCfg := pCfg.ConnectCfgBroflake + legacy.StunServers = bbCfg.StunServers + + legacy.PluggableTransportSettings = map[string]string{ + "broflake_ctablesize": strconv.Itoa(int(bbCfg.CtableSize)), + "broflake_ptablesize": strconv.Itoa(int(bbCfg.PtableSize)), + "broflake_natfailtimeout": strconv.Itoa(int(bbCfg.NatFailTimeout)), + "broflake_icefailtimeout": strconv.Itoa(int(bbCfg.IceFailTimeout)), + "broflake_discoverysrv": bbCfg.DiscoverySrv, + "broflake_endpoint": bbCfg.Endpoint, + "broflake_egress_server_name": bbCfg.EgressServerName, + "broflake_egress_insecure_skip_verify": strconv.FormatBool(bbCfg.EgressInsecureSkipVerify), + "broflake_egress_ca": bbCfg.EgressCa, + "broflake_stunbatchsize": strconv.Itoa(int(bbCfg.StunBatchSize)), + } + + legacy.Bias = 10 // bias clients toward broflake + legacy.AllowedDomains = []string{ // currently, we only send ad traffic through Broflake + "doubleclick.net", + "adservice.google.com", + "adservice.google.com.hk", + "adservice.google.co.jp", + "adservice.google.nl", + "googlesyndication.com", + "googletagservices.com", + "googleadservices.com", + } + + case *ProxyConnectConfig_ConnectCfgStarbridge: + legacy.PluggableTransport = "starbridge" + + legacy.PluggableTransportSettings = map[string]string{ + "starbridge_public_key": pCfg.ConnectCfgStarbridge.PublicKey, + } + + case *ProxyConnectConfig_ConnectCfgAlgeneva: + legacy.PluggableTransport = "algeneva" + legacy.PluggableTransportSettings = map[string]string{ + "algeneva_strategy": pCfg.ConnectCfgAlgeneva.Strategy, + } + case *ProxyConnectConfig_ConnectCfgWater: + legacy.PluggableTransport = "water" + legacy.PluggableTransportSettings = map[string]string{ + "water_wasm": base64.StdEncoding.EncodeToString(pCfg.ConnectCfgWater.Wasm), + "water_transport": pCfg.ConnectCfgWater.Transport, + } + + default: + return nil, fmt.Errorf("unsupported protocol config: %T", cfg.ProtocolConfig) + } + + return legacy, nil +} + +// serializeTLSSessionState serializes the input TLS session state. This format is the one expected +// by clients in the legacy config. When we move away from the legacy config, clients can just read +// the session state out of the protcol buffers message. +func serializeTLSSessionState(ss *ProxyConnectConfig_TLSConfig_SessionState) (string, error) { + type sessionState struct { + SessionTicket []uint8 + Vers uint16 + CipherSuite uint16 + MasterSecret []byte + } + + if ss.Version > math.MaxUint16 { + return "", errors.New("invalid version") + } else if ss.CipherSuite > math.MaxUint16 { + return "", errors.New("invalid cipher suite") + } + + b, err := json.Marshal(sessionState{ + SessionTicket: ss.SessionTicket, + Vers: uint16(ss.Version), + CipherSuite: uint16(ss.CipherSuite), + MasterSecret: ss.MasterSecret, + }) + if err != nil { + return "", fmt.Errorf("marshal error: %w", err) + } + + return base64.StdEncoding.EncodeToString(b), nil +} diff --git a/apipb/types.pb.go b/apipb/types.pb.go index 98c28c5b2..70abf1762 100644 --- a/apipb/types.pb.go +++ b/apipb/types.pb.go @@ -1,11 +1,7 @@ -// -// Copied from lantern-cloud at a2ebb22f252f078477ab4bd0458a661089f82fea. DO NOT EDIT. -// - // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.26.0 -// protoc v3.21.5 +// protoc-gen-go v1.31.0 +// protoc v5.27.2 // source: apipb/types.proto package apipb @@ -13,6 +9,7 @@ package apipb import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" sync "sync" ) @@ -24,6 +21,365 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +// ConfigRequest is the request sent by the client that contains information about the client +// and the config it currently has. +type ConfigRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClientInfo *ConfigRequest_ClientInfo `protobuf:"bytes,1,opt,name=client_info,json=clientInfo,proto3" json:"client_info,omitempty"` + Proxy *ConfigRequest_Proxy `protobuf:"bytes,2,opt,name=proxy,proto3" json:"proxy,omitempty"` +} + +func (x *ConfigRequest) Reset() { + *x = ConfigRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_apipb_types_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ConfigRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ConfigRequest) ProtoMessage() {} + +func (x *ConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_apipb_types_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ConfigRequest.ProtoReflect.Descriptor instead. +func (*ConfigRequest) Descriptor() ([]byte, []int) { + return file_apipb_types_proto_rawDescGZIP(), []int{0} +} + +func (x *ConfigRequest) GetClientInfo() *ConfigRequest_ClientInfo { + if x != nil { + return x.ClientInfo + } + return nil +} + +func (x *ConfigRequest) GetProxy() *ConfigRequest_Proxy { + if x != nil { + return x.Proxy + } + return nil +} + +// ConfigResponse is the response sent by the server that contains the updated config for the +// client. +type ConfigResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ProToken string `protobuf:"bytes,1,opt,name=pro_token,json=proToken,proto3" json:"pro_token,omitempty"` + Country string `protobuf:"bytes,2,opt,name=country,proto3" json:"country,omitempty"` // country code + Ip string `protobuf:"bytes,3,opt,name=ip,proto3" json:"ip,omitempty"` // clients ip address + Proxy *ConfigResponse_Proxy `protobuf:"bytes,4,opt,name=proxy,proto3" json:"proxy,omitempty"` +} + +func (x *ConfigResponse) Reset() { + *x = ConfigResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_apipb_types_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ConfigResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ConfigResponse) ProtoMessage() {} + +func (x *ConfigResponse) ProtoReflect() protoreflect.Message { + mi := &file_apipb_types_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ConfigResponse.ProtoReflect.Descriptor instead. +func (*ConfigResponse) Descriptor() ([]byte, []int) { + return file_apipb_types_proto_rawDescGZIP(), []int{1} +} + +func (x *ConfigResponse) GetProToken() string { + if x != nil { + return x.ProToken + } + return "" +} + +func (x *ConfigResponse) GetCountry() string { + if x != nil { + return x.Country + } + return "" +} + +func (x *ConfigResponse) GetIp() string { + if x != nil { + return x.Ip + } + return "" +} + +func (x *ConfigResponse) GetProxy() *ConfigResponse_Proxy { + if x != nil { + return x.Proxy + } + return nil +} + +// ProxyConnectConfig contains all the data for connecting to a given proxy. +// This message structure is used directly by clients, so any changes *must* be +// backwards compatible. +type ProxyConnectConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // addr is the proxy's public IP address. + Addr string `protobuf:"bytes,1,opt,name=addr,proto3" json:"addr,omitempty"` + Track string `protobuf:"bytes,2,opt,name=track,proto3" json:"track,omitempty"` + Location *ProxyConnectConfig_ProxyLocation `protobuf:"bytes,3,opt,name=location,proto3" json:"location,omitempty"` + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` // Used for logging. + Port int32 `protobuf:"varint,5,opt,name=port,proto3" json:"port,omitempty"` + // General config. + CertPem []byte `protobuf:"bytes,10,opt,name=cert_pem,json=certPem,proto3" json:"cert_pem,omitempty"` + AuthToken string `protobuf:"bytes,11,opt,name=auth_token,json=authToken,proto3" json:"auth_token,omitempty"` + // Trusted indicates whether this proxy is "trusted". This term originates in Lantern's previous + // infrastructure in which proxy trust was based on cloud provider - some companies operate out + // of countries which are known to pressure or subvert domestic companies. With triangle routing, + // however, we do not run proxies on such providers - only on back-end, wholesale providers which + // we trust. Thus, "trust" is now based on protocol. If the proxy's protocol offers end-to-end + // security (encryption and authentication), we consider the proxy to be trusted. + // + // The value of this field only affects plain-text HTTP requests sent by the client; we do not + // send such requests through untrusted providers. + Trusted bool `protobuf:"varint,12,opt,name=trusted,proto3" json:"trusted,omitempty"` + // Types that are assignable to ProtocolConfig: + // + // *ProxyConnectConfig_ConnectCfgTls + // *ProxyConnectConfig_ConnectCfgTlsmasq + // *ProxyConnectConfig_ConnectCfgShadowsocks + // *ProxyConnectConfig_ConnectCfgBroflake + // *ProxyConnectConfig_ConnectCfgStarbridge + // *ProxyConnectConfig_ConnectCfgAlgeneva + // *ProxyConnectConfig_ConnectCfgWater + ProtocolConfig isProxyConnectConfig_ProtocolConfig `protobuf_oneof:"protocol_config"` +} + +func (x *ProxyConnectConfig) Reset() { + *x = ProxyConnectConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_apipb_types_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProxyConnectConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProxyConnectConfig) ProtoMessage() {} + +func (x *ProxyConnectConfig) ProtoReflect() protoreflect.Message { + mi := &file_apipb_types_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProxyConnectConfig.ProtoReflect.Descriptor instead. +func (*ProxyConnectConfig) Descriptor() ([]byte, []int) { + return file_apipb_types_proto_rawDescGZIP(), []int{2} +} + +func (x *ProxyConnectConfig) GetAddr() string { + if x != nil { + return x.Addr + } + return "" +} + +func (x *ProxyConnectConfig) GetTrack() string { + if x != nil { + return x.Track + } + return "" +} + +func (x *ProxyConnectConfig) GetLocation() *ProxyConnectConfig_ProxyLocation { + if x != nil { + return x.Location + } + return nil +} + +func (x *ProxyConnectConfig) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ProxyConnectConfig) GetPort() int32 { + if x != nil { + return x.Port + } + return 0 +} + +func (x *ProxyConnectConfig) GetCertPem() []byte { + if x != nil { + return x.CertPem + } + return nil +} + +func (x *ProxyConnectConfig) GetAuthToken() string { + if x != nil { + return x.AuthToken + } + return "" +} + +func (x *ProxyConnectConfig) GetTrusted() bool { + if x != nil { + return x.Trusted + } + return false +} + +func (m *ProxyConnectConfig) GetProtocolConfig() isProxyConnectConfig_ProtocolConfig { + if m != nil { + return m.ProtocolConfig + } + return nil +} + +func (x *ProxyConnectConfig) GetConnectCfgTls() *ProxyConnectConfig_TLSConfig { + if x, ok := x.GetProtocolConfig().(*ProxyConnectConfig_ConnectCfgTls); ok { + return x.ConnectCfgTls + } + return nil +} + +func (x *ProxyConnectConfig) GetConnectCfgTlsmasq() *ProxyConnectConfig_TLSMasqConfig { + if x, ok := x.GetProtocolConfig().(*ProxyConnectConfig_ConnectCfgTlsmasq); ok { + return x.ConnectCfgTlsmasq + } + return nil +} + +func (x *ProxyConnectConfig) GetConnectCfgShadowsocks() *ProxyConnectConfig_ShadowsocksConfig { + if x, ok := x.GetProtocolConfig().(*ProxyConnectConfig_ConnectCfgShadowsocks); ok { + return x.ConnectCfgShadowsocks + } + return nil +} + +func (x *ProxyConnectConfig) GetConnectCfgBroflake() *ProxyConnectConfig_BroflakeConfig { + if x, ok := x.GetProtocolConfig().(*ProxyConnectConfig_ConnectCfgBroflake); ok { + return x.ConnectCfgBroflake + } + return nil +} + +func (x *ProxyConnectConfig) GetConnectCfgStarbridge() *ProxyConnectConfig_StarbridgeConfig { + if x, ok := x.GetProtocolConfig().(*ProxyConnectConfig_ConnectCfgStarbridge); ok { + return x.ConnectCfgStarbridge + } + return nil +} + +func (x *ProxyConnectConfig) GetConnectCfgAlgeneva() *ProxyConnectConfig_AlgenevaConfig { + if x, ok := x.GetProtocolConfig().(*ProxyConnectConfig_ConnectCfgAlgeneva); ok { + return x.ConnectCfgAlgeneva + } + return nil +} + +func (x *ProxyConnectConfig) GetConnectCfgWater() *ProxyConnectConfig_WATERConfig { + if x, ok := x.GetProtocolConfig().(*ProxyConnectConfig_ConnectCfgWater); ok { + return x.ConnectCfgWater + } + return nil +} + +type isProxyConnectConfig_ProtocolConfig interface { + isProxyConnectConfig_ProtocolConfig() +} + +type ProxyConnectConfig_ConnectCfgTls struct { + ConnectCfgTls *ProxyConnectConfig_TLSConfig `protobuf:"bytes,20,opt,name=connect_cfg_tls,json=connectCfgTls,proto3,oneof"` +} + +type ProxyConnectConfig_ConnectCfgTlsmasq struct { + ConnectCfgTlsmasq *ProxyConnectConfig_TLSMasqConfig `protobuf:"bytes,21,opt,name=connect_cfg_tlsmasq,json=connectCfgTlsmasq,proto3,oneof"` +} + +type ProxyConnectConfig_ConnectCfgShadowsocks struct { + ConnectCfgShadowsocks *ProxyConnectConfig_ShadowsocksConfig `protobuf:"bytes,22,opt,name=connect_cfg_shadowsocks,json=connectCfgShadowsocks,proto3,oneof"` +} + +type ProxyConnectConfig_ConnectCfgBroflake struct { + ConnectCfgBroflake *ProxyConnectConfig_BroflakeConfig `protobuf:"bytes,23,opt,name=connect_cfg_broflake,json=connectCfgBroflake,proto3,oneof"` +} + +type ProxyConnectConfig_ConnectCfgStarbridge struct { + ConnectCfgStarbridge *ProxyConnectConfig_StarbridgeConfig `protobuf:"bytes,24,opt,name=connect_cfg_starbridge,json=connectCfgStarbridge,proto3,oneof"` +} + +type ProxyConnectConfig_ConnectCfgAlgeneva struct { + ConnectCfgAlgeneva *ProxyConnectConfig_AlgenevaConfig `protobuf:"bytes,25,opt,name=connect_cfg_algeneva,json=connectCfgAlgeneva,proto3,oneof"` +} + +type ProxyConnectConfig_ConnectCfgWater struct { + ConnectCfgWater *ProxyConnectConfig_WATERConfig `protobuf:"bytes,26,opt,name=connect_cfg_water,json=connectCfgWater,proto3,oneof"` +} + +func (*ProxyConnectConfig_ConnectCfgTls) isProxyConnectConfig_ProtocolConfig() {} + +func (*ProxyConnectConfig_ConnectCfgTlsmasq) isProxyConnectConfig_ProtocolConfig() {} + +func (*ProxyConnectConfig_ConnectCfgShadowsocks) isProxyConnectConfig_ProtocolConfig() {} + +func (*ProxyConnectConfig_ConnectCfgBroflake) isProxyConnectConfig_ProtocolConfig() {} + +func (*ProxyConnectConfig_ConnectCfgStarbridge) isProxyConnectConfig_ProtocolConfig() {} + +func (*ProxyConnectConfig_ConnectCfgAlgeneva) isProxyConnectConfig_ProtocolConfig() {} + +func (*ProxyConnectConfig_ConnectCfgWater) isProxyConnectConfig_ProtocolConfig() {} + // LegacyConnectConfig is the information required for a client to connect // to a proxy, for clients which get their config from config-server (it's // copied from there). @@ -62,7 +418,7 @@ type LegacyConnectConfig struct { func (x *LegacyConnectConfig) Reset() { *x = LegacyConnectConfig{} if protoimpl.UnsafeEnabled { - mi := &file_apipb_types_proto_msgTypes[0] + mi := &file_apipb_types_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -75,7 +431,7 @@ func (x *LegacyConnectConfig) String() string { func (*LegacyConnectConfig) ProtoMessage() {} func (x *LegacyConnectConfig) ProtoReflect() protoreflect.Message { - mi := &file_apipb_types_proto_msgTypes[0] + mi := &file_apipb_types_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -88,7 +444,7 @@ func (x *LegacyConnectConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use LegacyConnectConfig.ProtoReflect.Descriptor instead. func (*LegacyConnectConfig) Descriptor() ([]byte, []int) { - return file_apipb_types_proto_rawDescGZIP(), []int{0} + return file_apipb_types_proto_rawDescGZIP(), []int{3} } func (x *LegacyConnectConfig) GetName() string { @@ -281,7 +637,7 @@ type BypassRequest struct { func (x *BypassRequest) Reset() { *x = BypassRequest{} if protoimpl.UnsafeEnabled { - mi := &file_apipb_types_proto_msgTypes[1] + mi := &file_apipb_types_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -294,7 +650,7 @@ func (x *BypassRequest) String() string { func (*BypassRequest) ProtoMessage() {} func (x *BypassRequest) ProtoReflect() protoreflect.Message { - mi := &file_apipb_types_proto_msgTypes[1] + mi := &file_apipb_types_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -307,7 +663,7 @@ func (x *BypassRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BypassRequest.ProtoReflect.Descriptor instead. func (*BypassRequest) Descriptor() ([]byte, []int) { - return file_apipb_types_proto_rawDescGZIP(), []int{1} + return file_apipb_types_proto_rawDescGZIP(), []int{4} } func (x *BypassRequest) GetConfig() *LegacyConnectConfig { @@ -335,7 +691,7 @@ type BypassResponse struct { func (x *BypassResponse) Reset() { *x = BypassResponse{} if protoimpl.UnsafeEnabled { - mi := &file_apipb_types_proto_msgTypes[2] + mi := &file_apipb_types_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -348,7 +704,7 @@ func (x *BypassResponse) String() string { func (*BypassResponse) ProtoMessage() {} func (x *BypassResponse) ProtoReflect() protoreflect.Message { - mi := &file_apipb_types_proto_msgTypes[2] + mi := &file_apipb_types_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -361,7 +717,7 @@ func (x *BypassResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use BypassResponse.ProtoReflect.Descriptor instead. func (*BypassResponse) Descriptor() ([]byte, []int) { - return file_apipb_types_proto_rawDescGZIP(), []int{2} + return file_apipb_types_proto_rawDescGZIP(), []int{5} } func (x *BypassResponse) GetRandom() string { @@ -371,35 +727,36 @@ func (x *BypassResponse) GetRandom() string { return "" } -type LegacyConnectConfig_ProxyLocation struct { +type ConfigRequest_ClientInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - City string `protobuf:"bytes,1,opt,name=city,proto3" json:"city,omitempty"` - Country string `protobuf:"bytes,2,opt,name=country,proto3" json:"country,omitempty"` - CountryCode string `protobuf:"bytes,3,opt,name=country_code,json=countryCode,proto3" json:"country_code,omitempty"` - Latitude float32 `protobuf:"fixed32,4,opt,name=latitude,proto3" json:"latitude,omitempty"` - Longitude float32 `protobuf:"fixed32,5,opt,name=longitude,proto3" json:"longitude,omitempty"` + FlashlightVersion string `protobuf:"bytes,1,opt,name=flashlight_version,json=flashlightVersion,proto3" json:"flashlight_version,omitempty"` + ClientVersion string `protobuf:"bytes,2,opt,name=client_version,json=clientVersion,proto3" json:"client_version,omitempty"` + UserId string `protobuf:"bytes,3,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + ProToken string `protobuf:"bytes,4,opt,name=pro_token,json=proToken,proto3" json:"pro_token,omitempty"` + Country string `protobuf:"bytes,5,opt,name=country,proto3" json:"country,omitempty"` // country code + Ip string `protobuf:"bytes,6,opt,name=ip,proto3" json:"ip,omitempty"` // clients ip address } -func (x *LegacyConnectConfig_ProxyLocation) Reset() { - *x = LegacyConnectConfig_ProxyLocation{} +func (x *ConfigRequest_ClientInfo) Reset() { + *x = ConfigRequest_ClientInfo{} if protoimpl.UnsafeEnabled { - mi := &file_apipb_types_proto_msgTypes[3] + mi := &file_apipb_types_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *LegacyConnectConfig_ProxyLocation) String() string { +func (x *ConfigRequest_ClientInfo) String() string { return protoimpl.X.MessageStringOf(x) } -func (*LegacyConnectConfig_ProxyLocation) ProtoMessage() {} +func (*ConfigRequest_ClientInfo) ProtoMessage() {} -func (x *LegacyConnectConfig_ProxyLocation) ProtoReflect() protoreflect.Message { - mi := &file_apipb_types_proto_msgTypes[3] +func (x *ConfigRequest_ClientInfo) ProtoReflect() protoreflect.Message { + mi := &file_apipb_types_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -410,21 +767,852 @@ func (x *LegacyConnectConfig_ProxyLocation) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use LegacyConnectConfig_ProxyLocation.ProtoReflect.Descriptor instead. -func (*LegacyConnectConfig_ProxyLocation) Descriptor() ([]byte, []int) { +// Deprecated: Use ConfigRequest_ClientInfo.ProtoReflect.Descriptor instead. +func (*ConfigRequest_ClientInfo) Descriptor() ([]byte, []int) { return file_apipb_types_proto_rawDescGZIP(), []int{0, 0} } -func (x *LegacyConnectConfig_ProxyLocation) GetCity() string { +func (x *ConfigRequest_ClientInfo) GetFlashlightVersion() string { if x != nil { - return x.City + return x.FlashlightVersion } return "" } -func (x *LegacyConnectConfig_ProxyLocation) GetCountry() string { +func (x *ConfigRequest_ClientInfo) GetClientVersion() string { if x != nil { - return x.Country + return x.ClientVersion + } + return "" +} + +func (x *ConfigRequest_ClientInfo) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +func (x *ConfigRequest_ClientInfo) GetProToken() string { + if x != nil { + return x.ProToken + } + return "" +} + +func (x *ConfigRequest_ClientInfo) GetCountry() string { + if x != nil { + return x.Country + } + return "" +} + +func (x *ConfigRequest_ClientInfo) GetIp() string { + if x != nil { + return x.Ip + } + return "" +} + +type ConfigRequest_Proxy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Names []string `protobuf:"bytes,1,rep,name=names,proto3" json:"names,omitempty"` // list of proxy ids + LastRequest *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=last_request,json=lastRequest,proto3" json:"last_request,omitempty"` // last time client requested proxy config +} + +func (x *ConfigRequest_Proxy) Reset() { + *x = ConfigRequest_Proxy{} + if protoimpl.UnsafeEnabled { + mi := &file_apipb_types_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ConfigRequest_Proxy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ConfigRequest_Proxy) ProtoMessage() {} + +func (x *ConfigRequest_Proxy) ProtoReflect() protoreflect.Message { + mi := &file_apipb_types_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ConfigRequest_Proxy.ProtoReflect.Descriptor instead. +func (*ConfigRequest_Proxy) Descriptor() ([]byte, []int) { + return file_apipb_types_proto_rawDescGZIP(), []int{0, 1} +} + +func (x *ConfigRequest_Proxy) GetNames() []string { + if x != nil { + return x.Names + } + return nil +} + +func (x *ConfigRequest_Proxy) GetLastRequest() *timestamppb.Timestamp { + if x != nil { + return x.LastRequest + } + return nil +} + +type ConfigResponse_Proxy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Proxies []*ProxyConnectConfig `protobuf:"bytes,1,rep,name=proxies,proto3" json:"proxies,omitempty"` // list of proxy configs +} + +func (x *ConfigResponse_Proxy) Reset() { + *x = ConfigResponse_Proxy{} + if protoimpl.UnsafeEnabled { + mi := &file_apipb_types_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ConfigResponse_Proxy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ConfigResponse_Proxy) ProtoMessage() {} + +func (x *ConfigResponse_Proxy) ProtoReflect() protoreflect.Message { + mi := &file_apipb_types_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ConfigResponse_Proxy.ProtoReflect.Descriptor instead. +func (*ConfigResponse_Proxy) Descriptor() ([]byte, []int) { + return file_apipb_types_proto_rawDescGZIP(), []int{1, 0} +} + +func (x *ConfigResponse_Proxy) GetProxies() []*ProxyConnectConfig { + if x != nil { + return x.Proxies + } + return nil +} + +type ProxyConnectConfig_ProxyLocation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + City string `protobuf:"bytes,1,opt,name=city,proto3" json:"city,omitempty"` + Country string `protobuf:"bytes,2,opt,name=country,proto3" json:"country,omitempty"` + CountryCode string `protobuf:"bytes,3,opt,name=country_code,json=countryCode,proto3" json:"country_code,omitempty"` + Latitude float32 `protobuf:"fixed32,4,opt,name=latitude,proto3" json:"latitude,omitempty"` + Longitude float32 `protobuf:"fixed32,5,opt,name=longitude,proto3" json:"longitude,omitempty"` +} + +func (x *ProxyConnectConfig_ProxyLocation) Reset() { + *x = ProxyConnectConfig_ProxyLocation{} + if protoimpl.UnsafeEnabled { + mi := &file_apipb_types_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProxyConnectConfig_ProxyLocation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProxyConnectConfig_ProxyLocation) ProtoMessage() {} + +func (x *ProxyConnectConfig_ProxyLocation) ProtoReflect() protoreflect.Message { + mi := &file_apipb_types_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProxyConnectConfig_ProxyLocation.ProtoReflect.Descriptor instead. +func (*ProxyConnectConfig_ProxyLocation) Descriptor() ([]byte, []int) { + return file_apipb_types_proto_rawDescGZIP(), []int{2, 0} +} + +func (x *ProxyConnectConfig_ProxyLocation) GetCity() string { + if x != nil { + return x.City + } + return "" +} + +func (x *ProxyConnectConfig_ProxyLocation) GetCountry() string { + if x != nil { + return x.Country + } + return "" +} + +func (x *ProxyConnectConfig_ProxyLocation) GetCountryCode() string { + if x != nil { + return x.CountryCode + } + return "" +} + +func (x *ProxyConnectConfig_ProxyLocation) GetLatitude() float32 { + if x != nil { + return x.Latitude + } + return 0 +} + +func (x *ProxyConnectConfig_ProxyLocation) GetLongitude() float32 { + if x != nil { + return x.Longitude + } + return 0 +} + +// TLSConfig is configuration for proxies running TLS as a transport. +type ProxyConnectConfig_TLSConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SessionState *ProxyConnectConfig_TLSConfig_SessionState `protobuf:"bytes,1,opt,name=session_state,json=sessionState,proto3" json:"session_state,omitempty"` + TlsFrag string `protobuf:"bytes,2,opt,name=tls_frag,json=tlsFrag,proto3" json:"tls_frag,omitempty"` + ServerNameIndicator string `protobuf:"bytes,3,opt,name=server_name_indicator,json=serverNameIndicator,proto3" json:"server_name_indicator,omitempty"` +} + +func (x *ProxyConnectConfig_TLSConfig) Reset() { + *x = ProxyConnectConfig_TLSConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_apipb_types_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProxyConnectConfig_TLSConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProxyConnectConfig_TLSConfig) ProtoMessage() {} + +func (x *ProxyConnectConfig_TLSConfig) ProtoReflect() protoreflect.Message { + mi := &file_apipb_types_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProxyConnectConfig_TLSConfig.ProtoReflect.Descriptor instead. +func (*ProxyConnectConfig_TLSConfig) Descriptor() ([]byte, []int) { + return file_apipb_types_proto_rawDescGZIP(), []int{2, 1} +} + +func (x *ProxyConnectConfig_TLSConfig) GetSessionState() *ProxyConnectConfig_TLSConfig_SessionState { + if x != nil { + return x.SessionState + } + return nil +} + +func (x *ProxyConnectConfig_TLSConfig) GetTlsFrag() string { + if x != nil { + return x.TlsFrag + } + return "" +} + +func (x *ProxyConnectConfig_TLSConfig) GetServerNameIndicator() string { + if x != nil { + return x.ServerNameIndicator + } + return "" +} + +type ProxyConnectConfig_TLSMasqConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + OriginAddr string `protobuf:"bytes,1,opt,name=origin_addr,json=originAddr,proto3" json:"origin_addr,omitempty"` + Secret []byte `protobuf:"bytes,2,opt,name=secret,proto3" json:"secret,omitempty"` + // TLSMinVersion is the minimum version of TLS supported by the proxy + // server. This is represented as a hex-encoded string, like 0x0303. + TlsMinVersion string `protobuf:"bytes,3,opt,name=tls_min_version,json=tlsMinVersion,proto3" json:"tls_min_version,omitempty"` + TlsSupportedCipherSuites []string `protobuf:"bytes,4,rep,name=tls_supported_cipher_suites,json=tlsSupportedCipherSuites,proto3" json:"tls_supported_cipher_suites,omitempty"` + TlsFrag string `protobuf:"bytes,5,opt,name=tls_frag,json=tlsFrag,proto3" json:"tls_frag,omitempty"` +} + +func (x *ProxyConnectConfig_TLSMasqConfig) Reset() { + *x = ProxyConnectConfig_TLSMasqConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_apipb_types_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProxyConnectConfig_TLSMasqConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProxyConnectConfig_TLSMasqConfig) ProtoMessage() {} + +func (x *ProxyConnectConfig_TLSMasqConfig) ProtoReflect() protoreflect.Message { + mi := &file_apipb_types_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProxyConnectConfig_TLSMasqConfig.ProtoReflect.Descriptor instead. +func (*ProxyConnectConfig_TLSMasqConfig) Descriptor() ([]byte, []int) { + return file_apipb_types_proto_rawDescGZIP(), []int{2, 2} +} + +func (x *ProxyConnectConfig_TLSMasqConfig) GetOriginAddr() string { + if x != nil { + return x.OriginAddr + } + return "" +} + +func (x *ProxyConnectConfig_TLSMasqConfig) GetSecret() []byte { + if x != nil { + return x.Secret + } + return nil +} + +func (x *ProxyConnectConfig_TLSMasqConfig) GetTlsMinVersion() string { + if x != nil { + return x.TlsMinVersion + } + return "" +} + +func (x *ProxyConnectConfig_TLSMasqConfig) GetTlsSupportedCipherSuites() []string { + if x != nil { + return x.TlsSupportedCipherSuites + } + return nil +} + +func (x *ProxyConnectConfig_TLSMasqConfig) GetTlsFrag() string { + if x != nil { + return x.TlsFrag + } + return "" +} + +type ProxyConnectConfig_ShadowsocksConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Secret string `protobuf:"bytes,1,opt,name=secret,proto3" json:"secret,omitempty"` + Cipher string `protobuf:"bytes,2,opt,name=cipher,proto3" json:"cipher,omitempty"` + PrefixGenerator string `protobuf:"bytes,3,opt,name=prefix_generator,json=prefixGenerator,proto3" json:"prefix_generator,omitempty"` + WithTls bool `protobuf:"varint,4,opt,name=with_tls,json=withTls,proto3" json:"with_tls,omitempty"` +} + +func (x *ProxyConnectConfig_ShadowsocksConfig) Reset() { + *x = ProxyConnectConfig_ShadowsocksConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_apipb_types_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProxyConnectConfig_ShadowsocksConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProxyConnectConfig_ShadowsocksConfig) ProtoMessage() {} + +func (x *ProxyConnectConfig_ShadowsocksConfig) ProtoReflect() protoreflect.Message { + mi := &file_apipb_types_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProxyConnectConfig_ShadowsocksConfig.ProtoReflect.Descriptor instead. +func (*ProxyConnectConfig_ShadowsocksConfig) Descriptor() ([]byte, []int) { + return file_apipb_types_proto_rawDescGZIP(), []int{2, 3} +} + +func (x *ProxyConnectConfig_ShadowsocksConfig) GetSecret() string { + if x != nil { + return x.Secret + } + return "" +} + +func (x *ProxyConnectConfig_ShadowsocksConfig) GetCipher() string { + if x != nil { + return x.Cipher + } + return "" +} + +func (x *ProxyConnectConfig_ShadowsocksConfig) GetPrefixGenerator() string { + if x != nil { + return x.PrefixGenerator + } + return "" +} + +func (x *ProxyConnectConfig_ShadowsocksConfig) GetWithTls() bool { + if x != nil { + return x.WithTls + } + return false +} + +type ProxyConnectConfig_BroflakeConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CtableSize int32 `protobuf:"varint,1,opt,name=ctable_size,json=ctableSize,proto3" json:"ctable_size,omitempty"` + PtableSize int32 `protobuf:"varint,2,opt,name=ptable_size,json=ptableSize,proto3" json:"ptable_size,omitempty"` + NatFailTimeout int32 `protobuf:"varint,3,opt,name=nat_fail_timeout,json=natFailTimeout,proto3" json:"nat_fail_timeout,omitempty"` + IceFailTimeout int32 `protobuf:"varint,4,opt,name=ice_fail_timeout,json=iceFailTimeout,proto3" json:"ice_fail_timeout,omitempty"` + DiscoverySrv string `protobuf:"bytes,5,opt,name=discovery_srv,json=discoverySrv,proto3" json:"discovery_srv,omitempty"` + Endpoint string `protobuf:"bytes,6,opt,name=endpoint,proto3" json:"endpoint,omitempty"` + EgressServerName string `protobuf:"bytes,7,opt,name=egress_server_name,json=egressServerName,proto3" json:"egress_server_name,omitempty"` + EgressInsecureSkipVerify bool `protobuf:"varint,8,opt,name=egress_insecure_skip_verify,json=egressInsecureSkipVerify,proto3" json:"egress_insecure_skip_verify,omitempty"` + EgressCa string `protobuf:"bytes,9,opt,name=egress_ca,json=egressCa,proto3" json:"egress_ca,omitempty"` + StunBatchSize int32 `protobuf:"varint,10,opt,name=stun_batch_size,json=stunBatchSize,proto3" json:"stun_batch_size,omitempty"` + StunServers []string `protobuf:"bytes,11,rep,name=stun_servers,json=stunServers,proto3" json:"stun_servers,omitempty"` +} + +func (x *ProxyConnectConfig_BroflakeConfig) Reset() { + *x = ProxyConnectConfig_BroflakeConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_apipb_types_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProxyConnectConfig_BroflakeConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProxyConnectConfig_BroflakeConfig) ProtoMessage() {} + +func (x *ProxyConnectConfig_BroflakeConfig) ProtoReflect() protoreflect.Message { + mi := &file_apipb_types_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProxyConnectConfig_BroflakeConfig.ProtoReflect.Descriptor instead. +func (*ProxyConnectConfig_BroflakeConfig) Descriptor() ([]byte, []int) { + return file_apipb_types_proto_rawDescGZIP(), []int{2, 4} +} + +func (x *ProxyConnectConfig_BroflakeConfig) GetCtableSize() int32 { + if x != nil { + return x.CtableSize + } + return 0 +} + +func (x *ProxyConnectConfig_BroflakeConfig) GetPtableSize() int32 { + if x != nil { + return x.PtableSize + } + return 0 +} + +func (x *ProxyConnectConfig_BroflakeConfig) GetNatFailTimeout() int32 { + if x != nil { + return x.NatFailTimeout + } + return 0 +} + +func (x *ProxyConnectConfig_BroflakeConfig) GetIceFailTimeout() int32 { + if x != nil { + return x.IceFailTimeout + } + return 0 +} + +func (x *ProxyConnectConfig_BroflakeConfig) GetDiscoverySrv() string { + if x != nil { + return x.DiscoverySrv + } + return "" +} + +func (x *ProxyConnectConfig_BroflakeConfig) GetEndpoint() string { + if x != nil { + return x.Endpoint + } + return "" +} + +func (x *ProxyConnectConfig_BroflakeConfig) GetEgressServerName() string { + if x != nil { + return x.EgressServerName + } + return "" +} + +func (x *ProxyConnectConfig_BroflakeConfig) GetEgressInsecureSkipVerify() bool { + if x != nil { + return x.EgressInsecureSkipVerify + } + return false +} + +func (x *ProxyConnectConfig_BroflakeConfig) GetEgressCa() string { + if x != nil { + return x.EgressCa + } + return "" +} + +func (x *ProxyConnectConfig_BroflakeConfig) GetStunBatchSize() int32 { + if x != nil { + return x.StunBatchSize + } + return 0 +} + +func (x *ProxyConnectConfig_BroflakeConfig) GetStunServers() []string { + if x != nil { + return x.StunServers + } + return nil +} + +type ProxyConnectConfig_StarbridgeConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PublicKey string `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` +} + +func (x *ProxyConnectConfig_StarbridgeConfig) Reset() { + *x = ProxyConnectConfig_StarbridgeConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_apipb_types_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProxyConnectConfig_StarbridgeConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProxyConnectConfig_StarbridgeConfig) ProtoMessage() {} + +func (x *ProxyConnectConfig_StarbridgeConfig) ProtoReflect() protoreflect.Message { + mi := &file_apipb_types_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProxyConnectConfig_StarbridgeConfig.ProtoReflect.Descriptor instead. +func (*ProxyConnectConfig_StarbridgeConfig) Descriptor() ([]byte, []int) { + return file_apipb_types_proto_rawDescGZIP(), []int{2, 5} +} + +func (x *ProxyConnectConfig_StarbridgeConfig) GetPublicKey() string { + if x != nil { + return x.PublicKey + } + return "" +} + +type ProxyConnectConfig_AlgenevaConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Strategy string `protobuf:"bytes,1,opt,name=strategy,proto3" json:"strategy,omitempty"` +} + +func (x *ProxyConnectConfig_AlgenevaConfig) Reset() { + *x = ProxyConnectConfig_AlgenevaConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_apipb_types_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProxyConnectConfig_AlgenevaConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProxyConnectConfig_AlgenevaConfig) ProtoMessage() {} + +func (x *ProxyConnectConfig_AlgenevaConfig) ProtoReflect() protoreflect.Message { + mi := &file_apipb_types_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProxyConnectConfig_AlgenevaConfig.ProtoReflect.Descriptor instead. +func (*ProxyConnectConfig_AlgenevaConfig) Descriptor() ([]byte, []int) { + return file_apipb_types_proto_rawDescGZIP(), []int{2, 6} +} + +func (x *ProxyConnectConfig_AlgenevaConfig) GetStrategy() string { + if x != nil { + return x.Strategy + } + return "" +} + +type ProxyConnectConfig_WATERConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Wasm []byte `protobuf:"bytes,1,opt,name=wasm,proto3" json:"wasm,omitempty"` + Transport string `protobuf:"bytes,2,opt,name=transport,proto3" json:"transport,omitempty"` +} + +func (x *ProxyConnectConfig_WATERConfig) Reset() { + *x = ProxyConnectConfig_WATERConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_apipb_types_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProxyConnectConfig_WATERConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProxyConnectConfig_WATERConfig) ProtoMessage() {} + +func (x *ProxyConnectConfig_WATERConfig) ProtoReflect() protoreflect.Message { + mi := &file_apipb_types_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProxyConnectConfig_WATERConfig.ProtoReflect.Descriptor instead. +func (*ProxyConnectConfig_WATERConfig) Descriptor() ([]byte, []int) { + return file_apipb_types_proto_rawDescGZIP(), []int{2, 7} +} + +func (x *ProxyConnectConfig_WATERConfig) GetWasm() []byte { + if x != nil { + return x.Wasm + } + return nil +} + +func (x *ProxyConnectConfig_WATERConfig) GetTransport() string { + if x != nil { + return x.Transport + } + return "" +} + +// SessionState represents a utls.ClientSessionState. +type ProxyConnectConfig_TLSConfig_SessionState struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SessionTicket []byte `protobuf:"bytes,1,opt,name=session_ticket,json=sessionTicket,proto3" json:"session_ticket,omitempty"` + Version uint32 `protobuf:"varint,2,opt,name=version,proto3" json:"version,omitempty"` // actually a uint16 + CipherSuite uint32 `protobuf:"varint,3,opt,name=cipher_suite,json=cipherSuite,proto3" json:"cipher_suite,omitempty"` // actually a uint16 + MasterSecret []byte `protobuf:"bytes,4,opt,name=master_secret,json=masterSecret,proto3" json:"master_secret,omitempty"` +} + +func (x *ProxyConnectConfig_TLSConfig_SessionState) Reset() { + *x = ProxyConnectConfig_TLSConfig_SessionState{} + if protoimpl.UnsafeEnabled { + mi := &file_apipb_types_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProxyConnectConfig_TLSConfig_SessionState) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProxyConnectConfig_TLSConfig_SessionState) ProtoMessage() {} + +func (x *ProxyConnectConfig_TLSConfig_SessionState) ProtoReflect() protoreflect.Message { + mi := &file_apipb_types_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProxyConnectConfig_TLSConfig_SessionState.ProtoReflect.Descriptor instead. +func (*ProxyConnectConfig_TLSConfig_SessionState) Descriptor() ([]byte, []int) { + return file_apipb_types_proto_rawDescGZIP(), []int{2, 1, 0} +} + +func (x *ProxyConnectConfig_TLSConfig_SessionState) GetSessionTicket() []byte { + if x != nil { + return x.SessionTicket + } + return nil +} + +func (x *ProxyConnectConfig_TLSConfig_SessionState) GetVersion() uint32 { + if x != nil { + return x.Version + } + return 0 +} + +func (x *ProxyConnectConfig_TLSConfig_SessionState) GetCipherSuite() uint32 { + if x != nil { + return x.CipherSuite + } + return 0 +} + +func (x *ProxyConnectConfig_TLSConfig_SessionState) GetMasterSecret() []byte { + if x != nil { + return x.MasterSecret + } + return nil +} + +type LegacyConnectConfig_ProxyLocation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + City string `protobuf:"bytes,1,opt,name=city,proto3" json:"city,omitempty"` + Country string `protobuf:"bytes,2,opt,name=country,proto3" json:"country,omitempty"` + CountryCode string `protobuf:"bytes,3,opt,name=country_code,json=countryCode,proto3" json:"country_code,omitempty"` + Latitude float32 `protobuf:"fixed32,4,opt,name=latitude,proto3" json:"latitude,omitempty"` + Longitude float32 `protobuf:"fixed32,5,opt,name=longitude,proto3" json:"longitude,omitempty"` +} + +func (x *LegacyConnectConfig_ProxyLocation) Reset() { + *x = LegacyConnectConfig_ProxyLocation{} + if protoimpl.UnsafeEnabled { + mi := &file_apipb_types_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LegacyConnectConfig_ProxyLocation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LegacyConnectConfig_ProxyLocation) ProtoMessage() {} + +func (x *LegacyConnectConfig_ProxyLocation) ProtoReflect() protoreflect.Message { + mi := &file_apipb_types_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LegacyConnectConfig_ProxyLocation.ProtoReflect.Descriptor instead. +func (*LegacyConnectConfig_ProxyLocation) Descriptor() ([]byte, []int) { + return file_apipb_types_proto_rawDescGZIP(), []int{3, 0} +} + +func (x *LegacyConnectConfig_ProxyLocation) GetCity() string { + if x != nil { + return x.City + } + return "" +} + +func (x *LegacyConnectConfig_ProxyLocation) GetCountry() string { + if x != nil { + return x.Country } return "" } @@ -454,116 +1642,300 @@ var File_apipb_types_proto protoreflect.FileDescriptor var file_apipb_types_proto_rawDesc = []byte{ 0x0a, 0x11, 0x61, 0x70, 0x69, 0x70, 0x62, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x22, 0x99, 0x0c, 0x0a, 0x13, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, - 0x64, 0x64, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x63, 0x65, 0x72, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x75, 0x74, - 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, - 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, - 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x50, 0x72, 0x65, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x69, 0x61, 0x73, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x62, 0x69, 0x61, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x70, - 0x6c, 0x75, 0x67, 0x67, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, - 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x6c, 0x75, 0x67, 0x67, 0x61, - 0x62, 0x6c, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x76, 0x0a, 0x1c, - 0x70, 0x6c, 0x75, 0x67, 0x67, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, - 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x09, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x67, 0x61, 0x62, - 0x6c, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x1a, 0x70, 0x6c, 0x75, 0x67, 0x67, 0x61, - 0x62, 0x6c, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x45, 0x4e, 0x48, 0x54, 0x54, 0x50, 0x55, 0x52, - 0x4c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x45, 0x4e, 0x48, 0x54, 0x54, 0x50, 0x55, - 0x52, 0x4c, 0x12, 0x50, 0x0a, 0x25, 0x54, 0x4c, 0x53, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, - 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x5f, - 0x73, 0x75, 0x69, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x21, 0x54, 0x4c, 0x53, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, - 0x65, 0x72, 0x65, 0x64, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x12, 0x4e, 0x0a, 0x24, 0x54, 0x4c, 0x53, 0x4d, 0x6f, 0x62, 0x69, 0x6c, - 0x65, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, - 0x5f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x20, 0x54, 0x4c, 0x53, 0x4d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x4f, 0x72, 0x64, - 0x65, 0x72, 0x65, 0x64, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x54, 0x4c, 0x53, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x54, 0x4c, 0x53, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x3f, - 0x0a, 0x1c, 0x54, 0x4c, 0x53, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0e, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x54, 0x4c, 0x53, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, - 0x2b, 0x0a, 0x11, 0x54, 0x4c, 0x53, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x65, 0x6c, - 0x6c, 0x6f, 0x49, 0x44, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x54, 0x4c, 0x53, 0x43, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x49, 0x44, 0x12, 0x3a, 0x0a, 0x19, - 0x54, 0x4c, 0x53, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x5f, - 0x73, 0x70, 0x6c, 0x69, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x17, 0x54, 0x4c, 0x53, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x53, - 0x70, 0x6c, 0x69, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x36, 0x0a, 0x17, 0x54, 0x4c, 0x53, 0x43, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x54, 0x4c, 0x53, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x3e, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x12, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9a, 0x03, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x2a, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x1a, 0xc2, + 0x01, 0x0a, 0x0a, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, + 0x12, 0x66, 0x6c, 0x61, 0x73, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x66, 0x6c, 0x61, 0x73, 0x68, + 0x6c, 0x69, 0x67, 0x68, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, + 0x70, 0x72, 0x6f, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x72, 0x6f, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x70, 0x1a, 0x5c, 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0xbc, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x5f, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x70, 0x12, 0x2b, 0x0a, 0x05, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x1a, 0x36, 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x12, 0x2d, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x78, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x78, 0x69, 0x65, 0x73, + 0x22, 0x87, 0x12, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x74, + 0x72, 0x61, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x72, 0x61, 0x63, + 0x6b, 0x12, 0x3d, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x2d, 0x0a, 0x12, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x70, 0x61, 0x74, 0x68, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, - 0x29, 0x0a, 0x10, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, 0x65, 0x64, 0x5f, 0x61, - 0x64, 0x64, 0x72, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x70, 0x6c, 0x65, 0x78, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x12, 0x3c, 0x0a, 0x1a, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, 0x65, 0x64, 0x5f, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, - 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x05, 0x52, 0x18, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, 0x65, 0x64, 0x50, 0x68, 0x79, 0x73, 0x69, - 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x73, 0x12, 0x31, 0x0a, 0x14, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x70, 0x6c, 0x65, 0x78, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, - 0x78, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x60, 0x0a, 0x14, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x18, 0x17, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x4c, 0x65, 0x67, 0x61, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x65, 0x72, 0x74, + 0x5f, 0x70, 0x65, 0x6d, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x65, 0x72, 0x74, + 0x50, 0x65, 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x12, 0x47, 0x0a, 0x0f, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x66, 0x67, 0x5f, 0x74, 0x6c, 0x73, 0x18, + 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x54, 0x4c, 0x53, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, + 0x66, 0x67, 0x54, 0x6c, 0x73, 0x12, 0x53, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x5f, 0x63, 0x66, 0x67, 0x5f, 0x74, 0x6c, 0x73, 0x6d, 0x61, 0x73, 0x71, 0x18, 0x15, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x54, 0x4c, 0x53, 0x4d, 0x61, 0x73, 0x71, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x43, 0x66, 0x67, 0x54, 0x6c, 0x73, 0x6d, 0x61, 0x73, 0x71, 0x12, 0x5f, 0x0a, 0x17, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x66, 0x67, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, + 0x73, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x50, 0x72, + 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x73, 0x6f, 0x63, 0x6b, 0x73, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x48, 0x00, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x66, 0x67, + 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x73, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x56, 0x0a, 0x14, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x66, 0x67, 0x5f, 0x62, 0x72, 0x6f, 0x66, 0x6c, + 0x61, 0x6b, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x42, + 0x72, 0x6f, 0x66, 0x6c, 0x61, 0x6b, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, + 0x12, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x66, 0x67, 0x42, 0x72, 0x6f, 0x66, 0x6c, + 0x61, 0x6b, 0x65, 0x12, 0x5c, 0x0a, 0x16, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x63, + 0x66, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x18, 0x18, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x62, 0x72, 0x69, + 0x64, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x14, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x43, 0x66, 0x67, 0x53, 0x74, 0x61, 0x72, 0x62, 0x72, 0x69, 0x64, 0x67, + 0x65, 0x12, 0x56, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x66, 0x67, + 0x5f, 0x61, 0x6c, 0x67, 0x65, 0x6e, 0x65, 0x76, 0x61, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x41, 0x6c, 0x67, 0x65, 0x6e, 0x65, 0x76, 0x61, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x66, + 0x67, 0x41, 0x6c, 0x67, 0x65, 0x6e, 0x65, 0x76, 0x61, 0x12, 0x4d, 0x0a, 0x11, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x66, 0x67, 0x5f, 0x77, 0x61, 0x74, 0x65, 0x72, 0x18, 0x1a, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x57, 0x41, 0x54, 0x45, 0x52, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x43, 0x66, 0x67, 0x57, 0x61, 0x74, 0x65, 0x72, 0x1a, 0x9a, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x6f, + 0x78, 0x79, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x69, + 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79, 0x12, 0x18, + 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, + 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x6c, + 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, + 0x74, 0x75, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, + 0x69, 0x74, 0x75, 0x64, 0x65, 0x1a, 0xc5, 0x02, 0x0a, 0x09, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x4f, 0x0a, 0x0d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x50, 0x72, 0x6f, + 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, + 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x72, 0x61, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x46, 0x72, 0x61, 0x67, 0x12, + 0x32, 0x0a, 0x15, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x69, + 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, + 0x74, 0x6f, 0x72, 0x1a, 0x97, 0x01, 0x0a, 0x0c, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, + 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x73, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x5f, + 0x73, 0x75, 0x69, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x63, 0x69, 0x70, + 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0c, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x1a, 0xca, 0x01, + 0x0a, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x61, 0x73, 0x71, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x1f, 0x0a, 0x0b, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, + 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x3d, 0x0a, 0x1b, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x64, 0x5f, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x18, 0x74, 0x6c, 0x73, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x64, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x12, + 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x46, 0x72, 0x61, 0x67, 0x1a, 0x89, 0x01, 0x0a, 0x11, 0x53, + 0x68, 0x61, 0x64, 0x6f, 0x77, 0x73, 0x6f, 0x63, 0x6b, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x69, 0x70, 0x68, + 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, + 0x12, 0x29, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x77, + 0x69, 0x74, 0x68, 0x5f, 0x74, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x77, + 0x69, 0x74, 0x68, 0x54, 0x6c, 0x73, 0x1a, 0xbc, 0x03, 0x0a, 0x0e, 0x42, 0x72, 0x6f, 0x66, 0x6c, + 0x61, 0x6b, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x63, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0a, 0x70, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x6e, + 0x61, 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x61, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x54, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x69, 0x63, 0x65, 0x5f, 0x66, 0x61, 0x69, + 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0e, 0x69, 0x63, 0x65, 0x46, 0x61, 0x69, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, + 0x23, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x72, 0x76, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, + 0x79, 0x53, 0x72, 0x76, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x12, 0x2c, 0x0a, 0x12, 0x65, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x65, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3d, + 0x0a, 0x1b, 0x65, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, + 0x65, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x67, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x73, 0x65, 0x63, + 0x75, 0x72, 0x65, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x1b, 0x0a, + 0x09, 0x65, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x65, 0x67, 0x72, 0x65, 0x73, 0x73, 0x43, 0x61, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x74, + 0x75, 0x6e, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0d, 0x73, 0x74, 0x75, 0x6e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, + 0x7a, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x75, 0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x75, 0x6e, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x73, 0x1a, 0x31, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x72, 0x62, 0x72, 0x69, + 0x64, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x1a, 0x2c, 0x0a, 0x0e, 0x41, 0x6c, 0x67, 0x65, + 0x6e, 0x65, 0x76, 0x61, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x74, + 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, + 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x1a, 0x3f, 0x0a, 0x0b, 0x57, 0x41, 0x54, 0x45, 0x52, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x77, 0x61, 0x73, 0x6d, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x04, 0x77, 0x61, 0x73, 0x6d, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x11, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x99, 0x0c, 0x0a, 0x13, 0x4c, + 0x65, 0x67, 0x61, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, + 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x72, 0x74, 0x12, 0x1d, + 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x18, 0x0a, + 0x07, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x70, + 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0d, 0x6d, 0x61, 0x78, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x62, 0x69, 0x61, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x62, 0x69, + 0x61, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x70, 0x6c, 0x75, 0x67, 0x67, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x12, 0x70, 0x6c, 0x75, 0x67, 0x67, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, + 0x6f, 0x72, 0x74, 0x12, 0x76, 0x0a, 0x1c, 0x70, 0x6c, 0x75, 0x67, 0x67, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, 0x65, 0x64, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, - 0x6c, 0x65, 0x78, 0x65, 0x64, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x72, - 0x61, 0x63, 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x19, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x1a, 0x9a, 0x01, 0x0a, 0x0d, - 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, - 0x04, 0x63, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x69, 0x74, - 0x79, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, - 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, - 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, 0x6c, - 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x1a, 0x4d, 0x0a, 0x1f, 0x50, 0x6c, 0x75, 0x67, - 0x67, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x46, 0x0a, 0x18, 0x4d, 0x75, 0x6c, 0x74, 0x69, - 0x70, 0x6c, 0x65, 0x78, 0x65, 0x64, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x57, 0x0a, 0x0d, 0x42, 0x79, 0x70, 0x61, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2c, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, - 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x28, 0x0a, 0x0e, 0x42, 0x79, 0x70, 0x61, - 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x61, - 0x6e, 0x64, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x61, 0x6e, 0x64, - 0x6f, 0x6d, 0x42, 0x33, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x67, 0x65, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x2f, 0x6c, 0x61, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x63, 0x6d, 0x64, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x61, 0x70, 0x69, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x50, 0x6c, 0x75, 0x67, 0x67, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, + 0x72, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x1a, 0x70, 0x6c, 0x75, 0x67, 0x67, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, + 0x6f, 0x72, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x45, + 0x4e, 0x48, 0x54, 0x54, 0x50, 0x55, 0x52, 0x4c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x45, 0x4e, 0x48, 0x54, 0x54, 0x50, 0x55, 0x52, 0x4c, 0x12, 0x50, 0x0a, 0x25, 0x54, 0x4c, 0x53, + 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x5f, + 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x21, 0x54, 0x4c, 0x53, 0x44, 0x65, 0x73, + 0x6b, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x43, 0x69, 0x70, 0x68, 0x65, + 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x4e, 0x0a, 0x24, 0x54, + 0x4c, 0x53, 0x4d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, + 0x5f, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x20, 0x54, 0x4c, 0x53, 0x4d, 0x6f, + 0x62, 0x69, 0x6c, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x43, 0x69, 0x70, 0x68, 0x65, + 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x54, + 0x4c, 0x53, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x6e, + 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x54, + 0x4c, 0x53, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x6e, 0x64, 0x69, + 0x63, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x3f, 0x0a, 0x1c, 0x54, 0x4c, 0x53, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x54, 0x4c, 0x53, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x54, 0x4c, 0x53, 0x43, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x49, 0x44, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x10, 0x54, 0x4c, 0x53, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x6c, 0x6c, + 0x6f, 0x49, 0x44, 0x12, 0x3a, 0x0a, 0x19, 0x54, 0x4c, 0x53, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x5f, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x5f, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x54, 0x4c, 0x53, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, + 0x36, 0x0a, 0x17, 0x54, 0x4c, 0x53, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x15, 0x54, 0x4c, 0x53, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x4c, 0x65, 0x67, 0x61, + 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, + 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x12, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x13, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x11, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x74, 0x68, 0x45, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, + 0x6c, 0x65, 0x78, 0x65, 0x64, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, 0x65, 0x64, 0x41, 0x64, 0x64, + 0x72, 0x12, 0x3c, 0x0a, 0x1a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, 0x65, 0x64, + 0x5f, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x73, 0x18, + 0x15, 0x20, 0x01, 0x28, 0x05, 0x52, 0x18, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, + 0x65, 0x64, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x73, 0x12, + 0x31, 0x0a, 0x14, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, 0x65, 0x64, 0x5f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x12, 0x60, 0x0a, 0x14, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, 0x65, + 0x64, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x17, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2d, 0x2e, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, + 0x65, 0x64, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x13, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, 0x65, 0x64, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x18, 0x18, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x1a, 0x9a, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x63, 0x6f, + 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, + 0x79, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x1a, + 0x4d, 0x0a, 0x1f, 0x50, 0x6c, 0x75, 0x67, 0x67, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x46, + 0x0a, 0x18, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, 0x65, 0x64, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x57, 0x0a, 0x0d, 0x42, 0x79, 0x70, 0x61, 0x73, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x28, 0x0a, 0x0e, 0x42, 0x79, 0x70, 0x61, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x42, 0x28, 0x5a, 0x26, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x65, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x2f, 0x66, 0x6c, 0x61, 0x73, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x2f, 0x61, 0x70, + 0x69, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -578,25 +1950,55 @@ func file_apipb_types_proto_rawDescGZIP() []byte { return file_apipb_types_proto_rawDescData } -var file_apipb_types_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_apipb_types_proto_msgTypes = make([]protoimpl.MessageInfo, 21) var file_apipb_types_proto_goTypes = []interface{}{ - (*LegacyConnectConfig)(nil), // 0: LegacyConnectConfig - (*BypassRequest)(nil), // 1: BypassRequest - (*BypassResponse)(nil), // 2: BypassResponse - (*LegacyConnectConfig_ProxyLocation)(nil), // 3: LegacyConnectConfig.ProxyLocation - nil, // 4: LegacyConnectConfig.PluggableTransportSettingsEntry - nil, // 5: LegacyConnectConfig.MultiplexedSettingsEntry + (*ConfigRequest)(nil), // 0: ConfigRequest + (*ConfigResponse)(nil), // 1: ConfigResponse + (*ProxyConnectConfig)(nil), // 2: ProxyConnectConfig + (*LegacyConnectConfig)(nil), // 3: LegacyConnectConfig + (*BypassRequest)(nil), // 4: BypassRequest + (*BypassResponse)(nil), // 5: BypassResponse + (*ConfigRequest_ClientInfo)(nil), // 6: ConfigRequest.ClientInfo + (*ConfigRequest_Proxy)(nil), // 7: ConfigRequest.Proxy + (*ConfigResponse_Proxy)(nil), // 8: ConfigResponse.Proxy + (*ProxyConnectConfig_ProxyLocation)(nil), // 9: ProxyConnectConfig.ProxyLocation + (*ProxyConnectConfig_TLSConfig)(nil), // 10: ProxyConnectConfig.TLSConfig + (*ProxyConnectConfig_TLSMasqConfig)(nil), // 11: ProxyConnectConfig.TLSMasqConfig + (*ProxyConnectConfig_ShadowsocksConfig)(nil), // 12: ProxyConnectConfig.ShadowsocksConfig + (*ProxyConnectConfig_BroflakeConfig)(nil), // 13: ProxyConnectConfig.BroflakeConfig + (*ProxyConnectConfig_StarbridgeConfig)(nil), // 14: ProxyConnectConfig.StarbridgeConfig + (*ProxyConnectConfig_AlgenevaConfig)(nil), // 15: ProxyConnectConfig.AlgenevaConfig + (*ProxyConnectConfig_WATERConfig)(nil), // 16: ProxyConnectConfig.WATERConfig + (*ProxyConnectConfig_TLSConfig_SessionState)(nil), // 17: ProxyConnectConfig.TLSConfig.SessionState + (*LegacyConnectConfig_ProxyLocation)(nil), // 18: LegacyConnectConfig.ProxyLocation + nil, // 19: LegacyConnectConfig.PluggableTransportSettingsEntry + nil, // 20: LegacyConnectConfig.MultiplexedSettingsEntry + (*timestamppb.Timestamp)(nil), // 21: google.protobuf.Timestamp } var file_apipb_types_proto_depIdxs = []int32{ - 4, // 0: LegacyConnectConfig.pluggable_transport_settings:type_name -> LegacyConnectConfig.PluggableTransportSettingsEntry - 3, // 1: LegacyConnectConfig.location:type_name -> LegacyConnectConfig.ProxyLocation - 5, // 2: LegacyConnectConfig.multiplexed_settings:type_name -> LegacyConnectConfig.MultiplexedSettingsEntry - 0, // 3: BypassRequest.config:type_name -> LegacyConnectConfig - 4, // [4:4] is the sub-list for method output_type - 4, // [4:4] is the sub-list for method input_type - 4, // [4:4] is the sub-list for extension type_name - 4, // [4:4] is the sub-list for extension extendee - 0, // [0:4] is the sub-list for field type_name + 6, // 0: ConfigRequest.client_info:type_name -> ConfigRequest.ClientInfo + 7, // 1: ConfigRequest.proxy:type_name -> ConfigRequest.Proxy + 8, // 2: ConfigResponse.proxy:type_name -> ConfigResponse.Proxy + 9, // 3: ProxyConnectConfig.location:type_name -> ProxyConnectConfig.ProxyLocation + 10, // 4: ProxyConnectConfig.connect_cfg_tls:type_name -> ProxyConnectConfig.TLSConfig + 11, // 5: ProxyConnectConfig.connect_cfg_tlsmasq:type_name -> ProxyConnectConfig.TLSMasqConfig + 12, // 6: ProxyConnectConfig.connect_cfg_shadowsocks:type_name -> ProxyConnectConfig.ShadowsocksConfig + 13, // 7: ProxyConnectConfig.connect_cfg_broflake:type_name -> ProxyConnectConfig.BroflakeConfig + 14, // 8: ProxyConnectConfig.connect_cfg_starbridge:type_name -> ProxyConnectConfig.StarbridgeConfig + 15, // 9: ProxyConnectConfig.connect_cfg_algeneva:type_name -> ProxyConnectConfig.AlgenevaConfig + 16, // 10: ProxyConnectConfig.connect_cfg_water:type_name -> ProxyConnectConfig.WATERConfig + 19, // 11: LegacyConnectConfig.pluggable_transport_settings:type_name -> LegacyConnectConfig.PluggableTransportSettingsEntry + 18, // 12: LegacyConnectConfig.location:type_name -> LegacyConnectConfig.ProxyLocation + 20, // 13: LegacyConnectConfig.multiplexed_settings:type_name -> LegacyConnectConfig.MultiplexedSettingsEntry + 3, // 14: BypassRequest.config:type_name -> LegacyConnectConfig + 21, // 15: ConfigRequest.Proxy.last_request:type_name -> google.protobuf.Timestamp + 2, // 16: ConfigResponse.Proxy.proxies:type_name -> ProxyConnectConfig + 17, // 17: ProxyConnectConfig.TLSConfig.session_state:type_name -> ProxyConnectConfig.TLSConfig.SessionState + 18, // [18:18] is the sub-list for method output_type + 18, // [18:18] is the sub-list for method input_type + 18, // [18:18] is the sub-list for extension type_name + 18, // [18:18] is the sub-list for extension extendee + 0, // [0:18] is the sub-list for field type_name } func init() { file_apipb_types_proto_init() } @@ -606,7 +2008,7 @@ func file_apipb_types_proto_init() { } if !protoimpl.UnsafeEnabled { file_apipb_types_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LegacyConnectConfig); i { + switch v := v.(*ConfigRequest); i { case 0: return &v.state case 1: @@ -618,7 +2020,7 @@ func file_apipb_types_proto_init() { } } file_apipb_types_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BypassRequest); i { + switch v := v.(*ConfigResponse); i { case 0: return &v.state case 1: @@ -630,7 +2032,7 @@ func file_apipb_types_proto_init() { } } file_apipb_types_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BypassResponse); i { + switch v := v.(*ProxyConnectConfig); i { case 0: return &v.state case 1: @@ -642,6 +2044,186 @@ func file_apipb_types_proto_init() { } } file_apipb_types_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LegacyConnectConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apipb_types_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BypassRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apipb_types_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BypassResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apipb_types_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ConfigRequest_ClientInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apipb_types_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ConfigRequest_Proxy); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apipb_types_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ConfigResponse_Proxy); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apipb_types_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProxyConnectConfig_ProxyLocation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apipb_types_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProxyConnectConfig_TLSConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apipb_types_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProxyConnectConfig_TLSMasqConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apipb_types_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProxyConnectConfig_ShadowsocksConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apipb_types_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProxyConnectConfig_BroflakeConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apipb_types_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProxyConnectConfig_StarbridgeConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apipb_types_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProxyConnectConfig_AlgenevaConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apipb_types_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProxyConnectConfig_WATERConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apipb_types_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProxyConnectConfig_TLSConfig_SessionState); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apipb_types_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LegacyConnectConfig_ProxyLocation); i { case 0: return &v.state @@ -654,13 +2236,22 @@ func file_apipb_types_proto_init() { } } } + file_apipb_types_proto_msgTypes[2].OneofWrappers = []interface{}{ + (*ProxyConnectConfig_ConnectCfgTls)(nil), + (*ProxyConnectConfig_ConnectCfgTlsmasq)(nil), + (*ProxyConnectConfig_ConnectCfgShadowsocks)(nil), + (*ProxyConnectConfig_ConnectCfgBroflake)(nil), + (*ProxyConnectConfig_ConnectCfgStarbridge)(nil), + (*ProxyConnectConfig_ConnectCfgAlgeneva)(nil), + (*ProxyConnectConfig_ConnectCfgWater)(nil), + } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_apipb_types_proto_rawDesc, NumEnums: 0, - NumMessages: 6, + NumMessages: 21, NumExtensions: 0, NumServices: 0, }, diff --git a/apipb/types.proto b/apipb/types.proto index 35ece7cf5..2c8120286 100644 --- a/apipb/types.proto +++ b/apipb/types.proto @@ -1,9 +1,155 @@ +syntax = "proto3"; +import "google/protobuf/timestamp.proto"; +option go_package = "github.com/getlantern/flashlight/apipb"; + // -// Copied from lantern-cloud at a2ebb22f252f078477ab4bd0458a661089f82fea. DO NOT EDIT. -// +// Copied from lantern-cloud: e57d588aa976ca9d1a8531c92972e20a7d1640f9 +// +// The following should be kept in sync with lantern-cloud +// -syntax = "proto3"; -option go_package = "github.com/getlantern/lantern-cloud/cmd/api/apipb"; +// ConfigRequest is the request sent by the client that contains information about the client +// and the config it currently has. +message ConfigRequest { + ClientInfo client_info = 1; + Proxy proxy = 2; + + message ClientInfo { + string flashlight_version = 1; + string client_version = 2; + string user_id = 3; + string pro_token = 4; + string country = 5; // country code + string ip = 6; // clients ip address + } + message Proxy { + repeated string names = 1; // list of proxy ids + google.protobuf.Timestamp last_request = 2; // last time client requested proxy config + } +} + +// ConfigResponse is the response sent by the server that contains the updated config for the +// client. +message ConfigResponse { + string pro_token = 1; + string country = 2; // country code + string ip = 3; // clients ip address + Proxy proxy = 4; + message Proxy { + repeated ProxyConnectConfig proxies = 1; // list of proxy configs + } +} + +// ProxyConnectConfig contains all the data for connecting to a given proxy. +// This message structure is used directly by clients, so any changes *must* be +// backwards compatible. +message ProxyConnectConfig { + message ProxyLocation { + string city = 1; + string country = 2; + string country_code = 3; + float latitude = 4; + float longitude = 5; + } + + // addr is the proxy's public IP address. + string addr = 1; + string track = 2; + ProxyLocation location = 3; + string name = 4; // Used for logging. + int32 port = 5; + + // General config. + bytes cert_pem = 10; + string auth_token = 11; + + // Trusted indicates whether this proxy is "trusted". This term originates in Lantern's previous + // infrastructure in which proxy trust was based on cloud provider - some companies operate out + // of countries which are known to pressure or subvert domestic companies. With triangle routing, + // however, we do not run proxies on such providers - only on back-end, wholesale providers which + // we trust. Thus, "trust" is now based on protocol. If the proxy's protocol offers end-to-end + // security (encryption and authentication), we consider the proxy to be trusted. + // + // The value of this field only affects plain-text HTTP requests sent by the client; we do not + // send such requests through untrusted providers. + bool trusted = 12; + + // TLSConfig is configuration for proxies running TLS as a transport. + message TLSConfig { + + // SessionState represents a utls.ClientSessionState. + message SessionState { + bytes session_ticket = 1; + uint32 version = 2; // actually a uint16 + uint32 cipher_suite = 3; // actually a uint16 + bytes master_secret = 4; + } + + SessionState session_state = 1; + string tls_frag = 2; + string server_name_indicator = 3; + } + + message TLSMasqConfig { + string origin_addr = 1; + bytes secret = 2; + // TLSMinVersion is the minimum version of TLS supported by the proxy + // server. This is represented as a hex-encoded string, like 0x0303. + string tls_min_version = 3; + repeated string tls_supported_cipher_suites = 4; + string tls_frag = 5; + } + + message ShadowsocksConfig { + string secret = 1; + string cipher = 2; + string prefix_generator = 3; + bool with_tls = 4; + } + + message BroflakeConfig { + int32 ctable_size = 1; + int32 ptable_size = 2; + int32 nat_fail_timeout = 3; + int32 ice_fail_timeout = 4; + string discovery_srv = 5; + string endpoint = 6; + string egress_server_name = 7; + bool egress_insecure_skip_verify = 8; + string egress_ca = 9; + int32 stun_batch_size = 10; + repeated string stun_servers = 11; + } + + message StarbridgeConfig { + string public_key = 1; + } + + message AlgenevaConfig { + string strategy = 1; + } + + message WATERConfig { + bytes wasm = 1; + string transport = 2; + } + + oneof protocol_config { + TLSConfig connect_cfg_tls = 20; + TLSMasqConfig connect_cfg_tlsmasq = 21; + ShadowsocksConfig connect_cfg_shadowsocks = 22; + BroflakeConfig connect_cfg_broflake = 23; + StarbridgeConfig connect_cfg_starbridge = 24; + AlgenevaConfig connect_cfg_algeneva = 25; + WATERConfig connect_cfg_water = 26; + } +} + +// +// The following was copied from lantern-cloud at a2ebb22f252f078477ab4bd0458a661089f82fea. +// +// DO NOT EDIT. +// // LegacyConnectConfig is the information required for a client to connect // to a proxy, for clients which get their config from config-server (it's diff --git a/bypass/bypass_test.go b/bypass/bypass_test.go deleted file mode 100644 index 93983bfcc..000000000 --- a/bypass/bypass_test.go +++ /dev/null @@ -1,25 +0,0 @@ -package bypass - -import ( - "testing" - - "github.com/getlantern/common/config" - "github.com/getlantern/flashlight/v7/common" - - "github.com/stretchr/testify/assert" -) - -func TestHTTPRequest(t *testing.T) { - p := &proxy{ - ProxyConfig: &config.ProxyConfig{ - Addr: "http://cookies.com", - }, - } - uc := &common.NullUserConfig{} - - r, err := p.newRequest(uc, "https://iantem.io/v1/bypass") - assert.NoError(t, err) - - assert.Equal(t, "https://iantem.io/v1/bypass", r.URL.String()) - -} diff --git a/client/client_test.go b/client/client_test.go index 15d73ecba..01d26c417 100644 --- a/client/client_test.go +++ b/client/client_test.go @@ -6,7 +6,6 @@ import ( "context" "fmt" "io" - "io/ioutil" "net" "net/http" "net/http/httptest" @@ -18,15 +17,16 @@ import ( "time" "github.com/getlantern/detour" - "github.com/getlantern/flashlight/v7/common" - "github.com/getlantern/flashlight/v7/dialer" - "github.com/getlantern/flashlight/v7/domainrouting" - "github.com/getlantern/flashlight/v7/stats" "github.com/getlantern/golog" "github.com/getlantern/mockconn" "github.com/getlantern/shortcut" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/getlantern/flashlight/v7/common" + "github.com/getlantern/flashlight/v7/dialer" + "github.com/getlantern/flashlight/v7/domainrouting" + "github.com/getlantern/flashlight/v7/stats" ) var logger = golog.LoggerFor("client-test") @@ -337,7 +337,7 @@ func TestLeakingDomainsRequiringProxy(t *testing.T) { req, _ = http.NewRequest("GET", site.URL, nil) res, _ = roundTrip(client, req) - body, err := ioutil.ReadAll(res.Body) + body, err := io.ReadAll(res.Body) require.NoError(t, err) assert.Equal(t, 200, res.StatusCode, "should dial directly for random site if client is disconnected") assert.Equal(t, "abc", string(body), "should dial directly for random site if client is disconnected") @@ -356,7 +356,7 @@ func TestLeakingDomainsRequiringProxy(t *testing.T) { req, _ = http.NewRequest("GET", site.URL, nil) res, _ = roundTrip(client, req) - body, err = ioutil.ReadAll(res.Body) + body, err = io.ReadAll(res.Body) require.NoError(t, err) assert.Equal(t, 200, res.StatusCode, "should dial directly for domain with proxy domainrouting rule when client is disconnected") assert.Equal(t, "abc", string(body), "should dial directly for domain with proxy domainrouting rule when client is disconnected") diff --git a/common/const.go b/common/const.go index e386aa34e..67bb3f5e9 100644 --- a/common/const.go +++ b/common/const.go @@ -9,15 +9,11 @@ import ( ) const ( - // The following are over HTTP because proxies do not forward X-Forwarded-For - // with HTTPS and because we only support falling back to direct domain - // fronting through the local proxy for HTTP. + // UserConfigURL is the URL for fetching the per user proxy config. + UserConfigURL = "http://df.iantem.io/api/v1/config" - // ProxiesURL is the URL for fetching the per user proxy config. - ProxiesURL = "http://config.getiantem.org/proxies.yaml.gz" - - // ProxiesStagingURL is the URL for fetching the per user proxy config in a staging environment. - ProxiesStagingURL = "http://config-staging.getiantem.org/proxies.yaml.gz" + // UserConfigStagingURL is the URL for fetching the per user proxy config in a staging environment. + UserConfigStagingURL = "https://api-staging.iantem.io/config" // Sentry Configurations SentryTimeout = time.Second * 30 diff --git a/config/config.go b/config/config.go index 69fe42d49..f2f97e9ca 100644 --- a/config/config.go +++ b/config/config.go @@ -4,7 +4,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "net/http" "os" "path/filepath" @@ -212,6 +211,7 @@ func embeddedIsNewer(conf *config, opts *options) bool { if opts.embeddedRequired { sentry.CaptureException(log.Errorf("no embedded config for %v", opts.name)) } + return false } @@ -236,23 +236,25 @@ func yamlRoundTrip(o interface{}) interface{} { if o == nil { return nil } + var or interface{} - t := reflect.TypeOf(o) - if t.Kind() == reflect.Ptr { + if t := reflect.TypeOf(o); t.Kind() == reflect.Ptr { or = reflect.New(t.Elem()).Interface() } else { or = reflect.New(t).Interface() } + b, err := yaml.Marshal(o) if err != nil { log.Errorf("Unable to yaml round trip (marshal): %v %v", o, err) return o } - err = yaml.Unmarshal(b, or) - if err != nil { + + if err = yaml.Unmarshal(b, or); err != nil { log.Errorf("Unable to yaml round trip (unmarshal): %v %v", o, err) return o } + return or } @@ -290,12 +292,13 @@ func (conf *config) saved() (interface{}, error) { in = rot13.NewReader(infile) } - bytes, err := ioutil.ReadAll(in) + bytes, err := io.ReadAll(in) if err != nil { err = fmt.Errorf("error reading config from %v: %w", conf.filePath, err) log.Error(err.Error()) return nil, err } + if len(bytes) == 0 { return nil, fmt.Errorf("config exists but is empty at %v", conf.filePath) } @@ -314,6 +317,7 @@ func (conf *config) configFetcher(opName string, stopCh chan bool, dispatch func if sleepDuration == noSleep { sleepDuration = defaultSleep() } + select { case <-stopCh: log.Debug("Stopping polling") @@ -373,10 +377,12 @@ func (conf *config) doSaveOne(in []byte) error { if conf.obfuscate { out = rot13.NewWriter(outfile) } + _, err = out.Write(in) if err != nil { return fmt.Errorf("unable to write yaml to file %v: %w", conf.filePath, err) } + log.Debugf("Wrote file at %v", conf.filePath) return nil } diff --git a/config/config_test.go b/config/config_test.go index b007f43c7..789c32042 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -2,7 +2,6 @@ package config import ( "errors" - "io/ioutil" "net/http" "os" "testing" @@ -10,12 +9,10 @@ import ( "github.com/stretchr/testify/assert" - commonconfig "github.com/getlantern/common/config" "github.com/getlantern/fronted" "github.com/getlantern/golog" "github.com/getlantern/flashlight/v7/common" - "github.com/getlantern/flashlight/v7/embeddedconfig" ) func TestEmptyEmbedded(t *testing.T) { @@ -58,7 +55,7 @@ func TestEmbeddedIsNewer(t *testing.T) { func TestInvalidFile(t *testing.T) { logger := golog.LoggerFor("config-test") - tmpfile, err := ioutil.TempFile("", "invalid-test-file") + tmpfile, err := os.CreateTemp("", "invalid-test-file") if err != nil { logger.Fatal(err) } @@ -106,105 +103,8 @@ func TestObfuscated(t *testing.T) { }) } -// TestSaved tests reading stored proxies from disk -func TestSaved(t *testing.T) { - withTempDir(t, func(inTempDir func(string) string) { - file := inTempDir("proxies.yaml") - proxiesConfig := newProxiesConfig(t) - writeObfuscatedConfig(t, proxiesConfig, file) - - cfg := newConfig(file, &options{ - obfuscate: true, - unmarshaler: newProxiesUnmarshaler(), - }) - - pr, err := cfg.saved() - assert.Nil(t, err) - - proxies := pr.(map[string]*commonconfig.ProxyConfig) - chained := proxies["fallback-104.236.192.114"] - assert.True(t, chained != nil) - assert.Equal(t, "104.236.192.114:443", chained.Addr) - }) -} - -// TestEmbedded tests reading stored proxies from disk -func TestEmbedded(t *testing.T) { - withTempDir(t, func(inTempDir func(string) string) { - file := inTempDir("proxies.yaml") - - cfg := newConfig(file, &options{ - unmarshaler: newProxiesUnmarshaler(), - }) - - _, err := cfg.embedded(embeddedconfig.Proxies) - assert.NotNil(t, err) - }) -} - -func TestPollProxies(t *testing.T) { - withTempDir(t, func(inTempDir func(string) string) { - fronted.ConfigureForTest(t) - - file := inTempDir("proxies.yaml") - proxyConfig := newProxiesConfig(t) - writeObfuscatedConfig(t, proxyConfig, file) - - proxyChan := make(chan interface{}) - cfg := newConfig(file, &options{ - unmarshaler: newProxiesUnmarshaler(), - }) - var fi os.FileInfo - var err error - for i := 1; i <= 400; i++ { - fi, err = os.Stat(file) - if err == nil { - break - } - time.Sleep(200 * time.Millisecond) - } - if !assert.Nil(t, err) { - return - } - - mtime := fi.ModTime() - os.Remove(file) - - proxyConfigURLs, _ := startConfigServer(t, proxyConfig) - fetcher := newHttpFetcher(newTestUserConfig(), &http.Transport{}, proxyConfigURLs) - dispatch := func(cfg interface{}) { - proxyChan <- cfg - } - go cfg.configFetcher("testOpName", nil, dispatch, fetcher, func() time.Duration { return 1 * time.Hour }, log) - proxies := (<-proxyChan).(map[string]*commonconfig.ProxyConfig) - - assert.True(t, len(proxies) > 0) - for _, val := range proxies { - assert.True(t, val != nil) - assert.True(t, len(val.Addr) > 6) - } - - for i := 1; i <= 400; i++ { - fi, err = os.Stat(file) - if err == nil && fi != nil && fi.ModTime().After(mtime) { - //log.Debugf("Got newer mod time?") - break - } - time.Sleep(50 * time.Millisecond) - } - - fi, err = os.Stat(file) - - assert.NotNil(t, fi) - assert.Nil(t, err, "Got error: %v", err) - - assert.True(t, fi.ModTime().After(mtime)) - }) -} - // TestProductionGlobal validates certain properties of the live production global config func TestProductionGlobal(t *testing.T) { - testURL := common.GlobalURL // this should always point to the live production configuration (not staging etc) expectedProviders := map[string]bool{ diff --git a/config/fetcher_test.go b/config/fetcher_test.go index a2793134d..7b205ed5a 100644 --- a/config/fetcher_test.go +++ b/config/fetcher_test.go @@ -35,20 +35,15 @@ func TestStagingSetup(t *testing.T) { rt := &http.Transport{} var fetch *fetcher - fetch = newHttpFetcher(newTestUserConfig(), rt, common.ProxiesURL).(*fetcher) - - assert.Equal(t, "http://config.getiantem.org/proxies.yaml.gz", fetch.originURL) - - url := common.ProxiesURL + fetch = newHttpFetcher(newTestUserConfig(), rt, common.UserConfigURL).(*fetcher) + assert.Equal(t, common.UserConfigURL, fetch.originURL) // Blank flags should mean we use the default flags["cloudconfig"] = "" - fetch = newHttpFetcher(newTestUserConfig(), rt, url).(*fetcher) - - assert.Equal(t, "http://config.getiantem.org/proxies.yaml.gz", fetch.originURL) + fetch = newHttpFetcher(newTestUserConfig(), rt, common.UserConfigURL).(*fetcher) + assert.Equal(t, common.UserConfigURL, fetch.originURL) - stagingURL := common.ProxiesStagingURL flags["staging"] = true - fetch = newHttpFetcher(newTestUserConfig(), rt, stagingURL).(*fetcher) - assert.Equal(t, "http://config-staging.getiantem.org/proxies.yaml.gz", fetch.originURL) + fetch = newHttpFetcher(newTestUserConfig(), rt, common.UserConfigStagingURL).(*fetcher) + assert.Equal(t, common.UserConfigStagingURL, fetch.originURL) } diff --git a/config/global/global.go b/config/global/global.go index b439b1382..18ad8d674 100644 --- a/config/global/global.go +++ b/config/global/global.go @@ -1,5 +1,5 @@ // This package breaks out some global config handling to where it can be used externally without dependence on all flashlight config. -package globalConfig +package globalconfig import ( "errors" diff --git a/config/initializer.go b/config/initializer.go index d19aa9900..ee002d8aa 100644 --- a/config/initializer.go +++ b/config/initializer.go @@ -1,12 +1,10 @@ package config import ( - "errors" "net/http" "sync" "time" - commonconfig "github.com/getlantern/common/config" "github.com/getlantern/golog" "github.com/getlantern/yaml" @@ -19,33 +17,24 @@ const packageLogPrefix = "flashlight.config" var ( log = golog.LoggerFor(packageLogPrefix) - // DefaultProxyConfigPollInterval determines how frequently to fetch proxies.yaml - DefaultProxyConfigPollInterval = 1 * time.Minute - - // ForceProxyConfigPollInterval overrides how frequently to fetch proxies.yaml if set (does not honor values from global.yaml) - ForceProxyConfigPollInterval = 0 * time.Second - // DefaultGlobalConfigPollInterval determines how frequently to fetch global.yaml DefaultGlobalConfigPollInterval = 1 * time.Hour ) -// Init determines the URLs at which to fetch proxy and global config and -// passes those to InitWithURLs, which initializes the config setup for both -// fetching per-user proxies as well as the global config. It returns a function -// that can be used to stop the reading of configs. +// Init determines the URLs at which to fetch global config and passes those to InitWithURLs, which +// initializes the config setup for fetching the global config. It returns a function that can be +// used to stop the reading of configs. func Init( configDir string, flags map[string]interface{}, userConfig common.UserConfig, - proxiesDispatch func(interface{}, Source), onProxiesSaveError func(error), origGlobalDispatch func(interface{}, Source), onGlobalSaveError func(error), rt http.RoundTripper) (stop func()) { staging := isStaging(flags) - proxyConfigURL := checkOverrides(flags, getProxyURL(staging), "proxies.yaml.gz") globalConfigURL := checkOverrides(flags, getGlobalURL(staging), "global.yaml.gz") return InitWithURLs( - configDir, flags, userConfig, proxiesDispatch, onProxiesSaveError, - origGlobalDispatch, onGlobalSaveError, proxyConfigURL, globalConfigURL, rt) + configDir, flags, userConfig, + origGlobalDispatch, onGlobalSaveError, globalConfigURL, rt) } type cfgWithSource struct { @@ -53,35 +42,23 @@ type cfgWithSource struct { src Source } -// InitWithURLs initializes the config setup for both fetching per-user proxies -// as well as the global config given a set of URLs for fetching proxy and -// global config. It returns a function that can be used to stop the reading of -// configs. +// InitWithURLs initializes the config setup for fetching the global config from the given URL. It +// returns a function that can be used to stop the reading of configs. func InitWithURLs( configDir string, flags map[string]interface{}, userConfig common.UserConfig, - origProxiesDispatch func(interface{}, Source), onProxiesSaveError func(error), origGlobalDispatch func(interface{}, Source), onGlobalSaveError func(error), - proxyURL string, globalURL string, rt http.RoundTripper) (stop func()) { + globalURL string, rt http.RoundTripper, +) (stop func()) { var mx sync.RWMutex globalConfigPollInterval := DefaultGlobalConfigPollInterval - proxyConfigPollInterval := DefaultProxyConfigPollInterval - if ForceProxyConfigPollInterval > 0 { - proxyConfigPollInterval = ForceProxyConfigPollInterval - } globalDispatchCh := make(chan cfgWithSource) - proxiesDispatchCh := make(chan cfgWithSource) go func() { for c := range globalDispatchCh { origGlobalDispatch(c.cfg, c.src) } }() - go func() { - for c := range proxiesDispatchCh { - origProxiesDispatch(c.cfg, c.src) - } - }() globalDispatch := func(cfg interface{}, src Source) { globalConfig, ok := cfg.(*Global) @@ -90,9 +67,7 @@ func InitWithURLs( if globalConfig.GlobalConfigPollInterval > 0 { globalConfigPollInterval = globalConfig.GlobalConfigPollInterval } - if ForceProxyConfigPollInterval == 0 && globalConfig.ProxyConfigPollInterval > 0 { - proxyConfigPollInterval = globalConfig.ProxyConfigPollInterval - } + mx.Unlock() } // Rather than call `origGlobalDispatch` here, we are calling it in a @@ -103,35 +78,6 @@ func InitWithURLs( globalDispatchCh <- cfgWithSource{cfg, src} } - proxiesDispatch := func(cfg interface{}, src Source) { - proxiesDispatchCh <- cfgWithSource{cfg, src} - } - - // These are the options for fetching the per-user proxy config. - proxyOptions := &options{ - saveDir: configDir, - onSaveError: onProxiesSaveError, - obfuscate: obfuscate(flags), - name: "proxies.yaml", - originURL: proxyURL, - userConfig: userConfig, - unmarshaler: newProxiesUnmarshaler(), - dispatch: proxiesDispatch, - embeddedData: embeddedconfig.Proxies, - embeddedRequired: false, - sleep: func() time.Duration { - mx.RLock() - defer mx.RUnlock() - return proxyConfigPollInterval - }, - sticky: isSticky(flags), - rt: rt, - opName: "fetch_proxies", - // Proxies are not provided over the DHT (yet! ᕕ( ᐛ )ᕗ), so dhtupContext is not passed. - } - - stopProxies := pipeConfig(proxyOptions) - // These are the options for fetching the global config. globalOptions := &options{ saveDir: configDir, @@ -158,7 +104,6 @@ func InitWithURLs( return func() { log.Debug("*************** Stopping Config") - stopProxies() stopGlobal() } } @@ -177,19 +122,6 @@ func newGlobalUnmarshaler(flags map[string]interface{}) func(bytes []byte) (inte } } -func newProxiesUnmarshaler() func(bytes []byte) (interface{}, error) { - return func(bytes []byte) (interface{}, error) { - servers := make(map[string]*commonconfig.ProxyConfig) - if err := yaml.Unmarshal(bytes, servers); err != nil { - return nil, err - } - if len(servers) == 0 { - return nil, errors.New("no chained server") - } - return servers, nil - } -} - func obfuscate(flags map[string]interface{}) bool { return flags["readableconfig"] == nil || !flags["readableconfig"].(bool) } @@ -220,17 +152,6 @@ func checkOverrides(flags map[string]interface{}, return url } -// getProxyURL returns the proxy URL to use depending on whether or not -// we're in staging. -func getProxyURL(staging bool) string { - if staging { - log.Debug("Will obtain proxies.yaml from staging service") - return common.ProxiesStagingURL - } - log.Debug("Will obtain proxies.yaml from production service") - return common.ProxiesURL -} - // getGlobalURL returns the global URL to use depending on whether or not // we're in staging. func getGlobalURL(staging bool) string { diff --git a/config/initializer_test.go b/config/initializer_test.go index 1bb7199fc..07aa65eda 100644 --- a/config/initializer_test.go +++ b/config/initializer_test.go @@ -8,8 +8,8 @@ import ( "github.com/stretchr/testify/assert" - commonconfig "github.com/getlantern/common/config" "github.com/getlantern/eventual" + "github.com/getlantern/flashlight/v7/common" ) @@ -27,18 +27,13 @@ func TestInit(t *testing.T) { // Note these dispatch functions will receive multiple configs -- local ones, // embedded ones, and remote ones. - proxiesDispatch := func(cfg interface{}, src Source) { - proxies := cfg.(map[string]*commonconfig.ProxyConfig) - assert.True(t, len(proxies) > 0) - gotProxies.Set(true) - } globalDispatch := func(cfg interface{}, src Source) { global := cfg.(*Global) assert.True(t, len(global.Client.MasqueradeSets) > 1) gotGlobal.Set(true) } stop := Init( - ".", flags, newTestUserConfig(), proxiesDispatch, nil, globalDispatch, nil, &http.Transport{ + ".", flags, newTestUserConfig(), globalDispatch, nil, &http.Transport{ Proxy: func(req *http.Request) (*url.URL, error) { // the same token should also be configured on staging // config-server, staging proxies and staging DDF distributions. @@ -59,7 +54,6 @@ func TestInit(t *testing.T) { func TestInitWithURLs(t *testing.T) { withTempDir(t, func(inTempDir func(string) string) { globalConfig := newGlobalConfig(t) - proxiesConfig := newProxiesConfig(t) globalConfig.GlobalConfigPollInterval = 3 * time.Second globalConfig.ProxyConfigPollInterval = 1 * time.Second @@ -75,20 +69,15 @@ func TestInitWithURLs(t *testing.T) { // set up servers to serve global config and count number of requests globalConfigURL, globalReqCount := startConfigServer(t, globalConfig) - // set up servers to serve global config and count number of requests - proxyConfigURL, proxyReqCount := startConfigServer(t, proxiesConfig) - // set up and call InitWithURLs flags := make(map[string]interface{}) flags["staging"] = true - proxiesDispatch := func(interface{}, Source) {} globalDispatch := func(interface{}, Source) {} stop := InitWithURLs( inTempDir("."), flags, newTestUserConfig(), - proxiesDispatch, nil, globalDispatch, nil, - proxyConfigURL, globalConfigURL, &http.Transport{}) + globalConfigURL, &http.Transport{}) defer stop() // sleep some amount @@ -100,7 +89,6 @@ func TestInitWithURLs(t *testing.T) { // test that proxy & config servers were called the correct number of times assert.GreaterOrEqual(t, 3, int(globalReqCount()), "should have fetched global config every %v", globalConfig.GlobalConfigPollInterval) - assert.GreaterOrEqual(t, 7, int(proxyReqCount()), "should have fetched proxy config every %v", globalConfig.ProxyConfigPollInterval) }) } diff --git a/config/user/config.go b/config/user/config.go new file mode 100644 index 000000000..421e486b6 --- /dev/null +++ b/config/user/config.go @@ -0,0 +1,225 @@ +// Package userconfig provides a simple way to manage client configuration. It reads and writes +// configuration to disk and provides a way to listen for changes. +package userconfig + +import ( + "context" + "fmt" + "io" + "os" + "path/filepath" + "sync" + "sync/atomic" + + "github.com/getlantern/eventual/v2" + "github.com/getlantern/golog" + "github.com/getlantern/rot13" + "google.golang.org/protobuf/proto" + + "github.com/getlantern/flashlight/v7/apipb" +) + +const ( + DefaultConfigSaveDir = "" + DefaultConfigFilename = "user.conf" +) + +// alias for better readability. +// Using "UserConfig" since "Config" and "ClientConfig" is already taken. This may change in the +// future if they become available. +type UserConfig = apipb.ConfigResponse + +var ( + _config = &Config{ + config: eventual.NewValue(), + } + initCalled = atomic.Bool{} + log = golog.LoggerFor("userconfig") +) + +type Config struct { + // config is the current client config as a *UserConfig. + config eventual.Value + + // filePath is where we should save new configs and look for existing saved configs. + filePath string + // obfuscate specifies whether or not to obfuscate the config on disk. + obfuscate bool + + // listeners is a list of functions to call when the config changes. + listeners []func(old, new *UserConfig) + mu sync.Mutex +} + +func Init(saveDir string, obfuscate bool) (*Config, error) { + if !initCalled.CompareAndSwap(false, true) { + return _config, nil + } + + if saveDir == "" { + saveDir = DefaultConfigSaveDir + } + + _config.mu.Lock() + _config.filePath = filepath.Join(saveDir, DefaultConfigFilename) + _config.obfuscate = obfuscate + _config.mu.Unlock() + + saved, err := readExistingConfig(_config.filePath, obfuscate) + if err != nil { + log.Error(err) + return nil, err + } + + if saved == nil { + log.Debug("No existing userconfig found") + return _config, nil // no saved config + } + + log.Debug("Loaded saved config") + _config.config.Set(saved) + notifyListeners(nil, saved) + return _config, nil +} + +// GetConfig implements services.ConfigHandler +func (c *Config) GetConfig() *UserConfig { + v, _ := c.config.Get(eventual.DontWait) + conf, _ := v.(*UserConfig) + return conf +} + +// SetConfig implements services.ConfigHandler +func (c *Config) SetConfig(new *UserConfig) { + log.Debug("Setting user config") + old := c.GetConfig() + updated := new + if old != nil { + updated = proto.Clone(old).(*UserConfig) + if new.GetProxy() != nil && len(new.GetProxy().GetProxies()) > 0 { + // We will always recieve the full list of proxy configs from the server if there are any + // changes since we don't currently have a way to inform clients to delete an individual + // proxy config. So we want to overwrite the existing proxy configs with the new ones. + updated.Proxy = nil + } + + proto.Merge(updated, new) + } + + log.Tracef("Config changed:\nold:\n%+v\nnew:\n%+v\nmerged:\n%v", old, new, updated) + + c.config.Set(updated) + if err := saveConfig(c.filePath, updated, c.obfuscate); err != nil { + log.Errorf("Failed to save client config: %v", err) + } + + notifyListeners(old, updated) +} + +// GetConfig returns the current client config. An error is returned if the config is not available +// within the given timeout. +func GetConfig(ctx context.Context) (*UserConfig, error) { + conf, err := _config.config.Get(ctx) + if err != nil { + return nil, fmt.Errorf("failed to get config: %w", err) + } + + if conf == nil { + // This can only be due to a combination of unset config and expired context. + return nil, fmt.Errorf("config not yet set: %w", ctx.Err()) + } + + return conf.(*UserConfig), nil +} + +// readExistingConfig reads a config from a file at the specified path, filePath, +// deobfuscating it if obfuscate is true. +func readExistingConfig(filePath string, obfuscate bool) (*UserConfig, error) { + infile, err := os.Open(filePath) + if err != nil { + if os.IsNotExist(err) { + return nil, nil // file does not exist + } + + return nil, fmt.Errorf("unable to open config file %v for reading: %w", filePath, err) + } + defer infile.Close() + + log.Debugf("Reading existing config from %v", filePath) + var in io.Reader = infile + if obfuscate { + in = rot13.NewReader(infile) + } + + bytes, err := io.ReadAll(in) + if err != nil { + return nil, fmt.Errorf("failed to read config from %v: %w", filePath, err) + } + + if len(bytes) == 0 { // file is empty + // we treat an empty file as if it doesn't + return nil, nil + } + + conf := &UserConfig{} + if err = proto.Unmarshal(bytes, conf); err != nil { + return nil, err + } + + return conf, nil +} + +// saveConfig writes conf to a file at the specified path, filePath, obfuscating it if +// obfuscate is true. If the file already exists, it will be overwritten. +func saveConfig(filePath string, conf *UserConfig, obfuscate bool) error { + in, err := proto.Marshal(conf) + if err != nil { + return fmt.Errorf("unable to marshal config: %w", err) + } + + outfile, err := os.OpenFile(filePath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644) + if err != nil { + return fmt.Errorf("unable to open file %v for writing: %w", filePath, err) + } + defer outfile.Close() + + var out io.Writer = outfile + if obfuscate { + out = rot13.NewWriter(outfile) + } + + if _, err = out.Write(in); err != nil { + return fmt.Errorf("unable to write config to file %v: %w", filePath, err) + } + + return nil +} + +// OnConfigChange registers a function to be called on config change. This allows callers to +// respond to each change without having to constantly poll for changes. +func OnConfigChange(fn func(old, new *UserConfig)) { + _config.mu.Lock() + if _config.listeners == nil { + _config.listeners = make([]func(old, new *UserConfig), 0, 1) + } + + _config.listeners = append(_config.listeners, fn) + _config.mu.Unlock() +} + +func notifyListeners(old, new *UserConfig) { + log.Trace("Notifying listeners") + + _config.mu.Lock() + new = proto.Clone(new).(*UserConfig) + if old != nil { + old = proto.Clone(old).(*UserConfig) + } + + for _, fn := range _config.listeners { + // don't block the config service + go fn(old, new) + } + + _config.mu.Unlock() +} diff --git a/config/user/config_test.go b/config/user/config_test.go new file mode 100644 index 000000000..7fa57b594 --- /dev/null +++ b/config/user/config_test.go @@ -0,0 +1,193 @@ +package userconfig + +import ( + "fmt" + "io" + "os" + "strings" + "testing" + "time" + + "github.com/getlantern/eventual/v2" + "github.com/getlantern/rot13" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/proto" + + "github.com/getlantern/flashlight/v7/apipb" +) + +func TestInitWithSavedConfig(t *testing.T) { + conf := newTestConfig() + defer resetConfig() + + withTempConfigFile(t, conf, false, func(tmpfile *os.File) { + Init("", false) + existing, _ := GetConfig(eventual.DontWait) + + want := fmt.Sprintf("%+v", conf) + got := fmt.Sprintf("%+v", existing) + assert.Equal(t, want, got, "failed to read existing config file") + }) +} + +func TestNotifyOnConfig(t *testing.T) { + conf := newTestConfig() + defer resetConfig() + + withTempConfigFile(t, conf, false, func(tmpfile *os.File) { + called := make(chan struct{}, 1) + OnConfigChange(func(old, new *UserConfig) { + called <- struct{}{} + }) + + Init("", false) + _config.SetConfig(newTestConfig()) + + select { + case <-called: + t.Log("recieved config change notification") + case <-time.After(time.Second): + assert.Fail(t, "timeout waiting for config change notification") + } + }) +} + +func TestInvalidFile(t *testing.T) { + withTempConfigFile(t, nil, false, func(tmpfile *os.File) { + tmpfile.WriteString("real-list-of-lantern-ips: https://youtu.be/dQw4w9WgXcQ?t=85") + tmpfile.Sync() + + _, err := readExistingConfig(tmpfile.Name(), false) + assert.Error(t, err, "should get error if config file is invalid") + }) +} + +func TestReadObfuscatedConfig(t *testing.T) { + conf := newTestConfig() + withTempConfigFile(t, conf, true, func(tmpfile *os.File) { + fileConf, err := readExistingConfig(tmpfile.Name(), true) + assert.NoError(t, err, "unable to read obfuscated config file") + + want := fmt.Sprintf("%+v", conf) + got := fmt.Sprintf("%+v", fileConf) + assert.Equal(t, want, got, "obfuscated config file doesn't match") + }) +} + +func TestSaveObfuscatedConfig(t *testing.T) { + withTempConfigFile(t, nil, false, func(tmpfile *os.File) { + tmpfile.Close() + + conf := newTestConfig() + err := saveConfig(tmpfile.Name(), conf, true) + require.NoError(t, err, "unable to save obfuscated config file") + + file, err := os.Open(tmpfile.Name()) + require.NoError(t, err, "unable to open obfuscated config file") + defer file.Close() + + reader := rot13.NewReader(file) + buf, err := io.ReadAll(reader) + require.NoError(t, err, "unable to read obfuscated config file") + + fileConf := &UserConfig{} + assert.NoError(t, proto.Unmarshal(buf, fileConf), "unable to unmarshal obfuscated config file") + + want := fmt.Sprintf("%+v", conf) + got := fmt.Sprintf("%+v", fileConf) + assert.Equal(t, want, got, "obfuscated config file doesn't match") + }) +} + +func withTempConfigFile(t *testing.T, conf *UserConfig, obfuscate bool, f func(*os.File)) { + tmpfile, err := os.OpenFile(DefaultConfigFilename, os.O_CREATE|os.O_TRUNC|os.O_RDWR, 0644) + require.NoError(t, err, "couldn't create temp file") + defer func() { // clean up + tmpfile.Close() + os.Remove(tmpfile.Name()) + }() + + if conf != nil { + buf, _ := proto.Marshal(conf) + + var writer io.Writer = tmpfile + if obfuscate { + writer = rot13.NewWriter(tmpfile) + } + + _, err := writer.Write(buf) + require.NoError(t, err, "unable to write to test config file") + + tmpfile.Sync() + } + + f(tmpfile) +} + +const ( + token = "AF325DF3432FDS" + + shadowsocksSecret = "foobarbaz" + shadowsocksUpstream = "local" + shadowsocksCipher = "AEAD_CHACHA20_POLY1305" + + tlsmasqOriginAddr = "orgin.com" + tlsmasqSNI = "test.com" + tlsmasqSuites = "0xcca9,0x1301" // TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_AES_128_GCM_SHA256 + tlsmasqMinVersion = "0x0303" // TLS 1.2 + tlsmasqServerSecret = "d0cd0e2e50eb2ac7cb1dc2c94d1bc8871e48369970052ff866d1e7e876e77a13246980057f70d64a2bdffb545330279f69bce5fd" +) + +func newTestConfig() *UserConfig { + p0 := buildProxy("shadowsocks") + p1 := buildProxy("tlsmasq") + pCfg := []*apipb.ProxyConnectConfig{p0, p1} + return &UserConfig{ + ProToken: token, + Country: "Mars", + Ip: "109.117.115.107", + Proxy: &apipb.ConfigResponse_Proxy{Proxies: pCfg}, + } +} + +func buildProxy(proto string) *apipb.ProxyConnectConfig { + conf := &apipb.ProxyConnectConfig{ + Name: "AshKetchumAll", + AuthToken: token, + CertPem: []byte("cert"), + Addr: "localhost", + Port: 8080, + } + + switch proto { + case "tlsmasq": + conf.ProtocolConfig = &apipb.ProxyConnectConfig_ConnectCfgTlsmasq{ + ConnectCfgTlsmasq: &apipb.ProxyConnectConfig_TLSMasqConfig{ + OriginAddr: tlsmasqOriginAddr, + Secret: []byte(tlsmasqServerSecret), + TlsMinVersion: tlsmasqMinVersion, + TlsSupportedCipherSuites: strings.Split(tlsmasqSuites, ","), + }, + } + case "shadowsocks": + conf.ProtocolConfig = &apipb.ProxyConnectConfig_ConnectCfgShadowsocks{ + ConnectCfgShadowsocks: &apipb.ProxyConnectConfig_ShadowsocksConfig{ + Secret: shadowsocksSecret, + Cipher: shadowsocksCipher, + }, + } + default: + } + + return conf +} + +func resetConfig() { + _config.mu.Lock() + _config.config.Reset() + _config.filePath = "" + _config.obfuscate = false + _config.listeners = nil + _config.mu.Unlock() +} diff --git a/dialer/dialer.go b/dialer/dialer.go index 7dc0329cc..c11c016e1 100644 --- a/dialer/dialer.go +++ b/dialer/dialer.go @@ -11,6 +11,7 @@ import ( "io" "net" "runtime/debug" + "sync/atomic" "time" "github.com/getlantern/golog" @@ -18,10 +19,16 @@ import ( var log = golog.LoggerFor("dialer") +var currentDialer atomic.Value + // New creates a new dialer that first tries to connect as quickly as possilbe while also // optimizing for the fastest dialer. func New(opts *Options) Dialer { - return NewTwoPhaseDialer(opts, func(opts *Options, existing Dialer) Dialer { + if currentDialer.Load() != nil { + log.Debug("Closing existing dialer") + currentDialer.Load().(Dialer).Close() + } + d := NewTwoPhaseDialer(opts, func(opts *Options, existing Dialer) Dialer { bandit, err := NewBandit(opts) if err != nil { log.Errorf("Unable to create bandit: %v", err) @@ -29,10 +36,12 @@ func New(opts *Options) Dialer { } return bandit }) + currentDialer.Store(d) + return d } // NoDialer returns a dialer that does nothing. This is useful during startup -// until a real dialer is available. +// when we don't yet have proxies to dial through. func NoDialer() Dialer { return &noDialer{} } @@ -48,6 +57,11 @@ func (d *noDialer) DialContext(ctx context.Context, network, addr string) (net.C return nil, errors.New("no dialer available") } +func (d *noDialer) Close() {} + +// Make sure noDialer implements Dialer +var _ Dialer = (*noDialer)(nil) + const ( // NetworkConnect is a pseudo network name to instruct the dialer to establish // a CONNECT tunnel to the proxy. @@ -90,6 +104,9 @@ type Dialer interface { // DialContext dials out to the domain or IP address representing a destination site. DialContext(ctx context.Context, network, addr string) (net.Conn, error) + + // Close closes the dialer and cleans up any resources + Close() } // hasSucceedingDialer checks whether or not any of the given dialers is able to successfully dial our proxies diff --git a/dialer/fastconnect.go b/dialer/fastconnect.go index 055d7b389..1f473687f 100644 --- a/dialer/fastconnect.go +++ b/dialer/fastconnect.go @@ -29,8 +29,14 @@ type fastConnectDialer struct { next func(*Options, Dialer) Dialer opts *Options + + // Create a channel for stopping connections to dialers + stopCh chan struct{} } +// Make sure fastConnectDialer implements Dialer +var _ Dialer = (*fastConnectDialer)(nil) + func newFastConnectDialer(opts *Options, next func(opts *Options, existing Dialer) Dialer) *fastConnectDialer { if opts.OnError == nil { opts.OnError = func(error, bool) {} @@ -45,6 +51,7 @@ func newFastConnectDialer(opts *Options, next func(opts *Options, existing Diale opts: opts, next: next, topDialer: protectedDialer{}, + stopCh: make(chan struct{}, 10), } } @@ -76,6 +83,13 @@ func (fcd *fastConnectDialer) DialContext(ctx context.Context, network, addr str return conn, err } +func (fcd *fastConnectDialer) Close() { + // We don't call Stop on the Dialers themselves here because they are likely + // in use by other Dialers, such as the BanditDialer. + // Stop all dialing + fcd.stopCh <- struct{}{} +} + func (fcd *fastConnectDialer) onConnected(pd ProxyDialer, connectTime time.Duration) { log.Debugf("Connected to %v", pd.Name()) @@ -99,13 +113,20 @@ func (fcd *fastConnectDialer) connectAll(dialers []ProxyDialer) { return } log.Debugf("Dialing all dialers in parallel %#v", dialers) - // Loop until we're connected - for len(fcd.connected.dialers) < 2 { - fcd.parallelDial(dialers) - // Add jitter to avoid thundering herd - time.Sleep(time.Duration(rand.Intn(4000)) * time.Millisecond) + for { + // Loop until we're connected + if len(fcd.connected.dialers) < 2 { + fcd.parallelDial(dialers) + } else { + break + } + select { + case <-fcd.stopCh: + log.Debug("Stopping parallel dialing") + return + case <-time.After(time.Duration(rand.Intn(4000)) * time.Millisecond): + } } - // At this point, we've tried all of the dialers, and they've all either // succeeded or failed. diff --git a/dialer/two_phase_dialer.go b/dialer/two_phase_dialer.go index d27f0d0e1..e9d6511b9 100644 --- a/dialer/two_phase_dialer.go +++ b/dialer/two_phase_dialer.go @@ -16,6 +16,9 @@ type twoPhaseDialer struct { activeDialer activeDialer } +// Make sure twoPhaseDialer implements Dialer +var _ Dialer = (*twoPhaseDialer)(nil) + // NewTwoPhaseDialer creates a new dialer for checking proxy connectivity. func NewTwoPhaseDialer(opts *Options, next func(opts *Options, existing Dialer) Dialer) Dialer { log.Debugf("Creating new two phase dialer with %d dialers", len(opts.Dialers)) @@ -45,6 +48,14 @@ func (ccd *twoPhaseDialer) DialContext(ctx context.Context, network string, addr return td.DialContext(ctx, network, addr) } +// Close implements Dialer. +func (ccd *twoPhaseDialer) Close() { + td := ccd.activeDialer.get() + if td != nil { + td.Close() + } +} + // protectedDialer protects a dialer.Dialer with a RWMutex. We can't use an atomic.Value here // because Dialer is an interface. type activeDialer struct { diff --git a/domainrouting/domainrouting.go b/domainrouting/domainrouting.go index 428820f75..9273787b9 100644 --- a/domainrouting/domainrouting.go +++ b/domainrouting/domainrouting.go @@ -36,7 +36,15 @@ var ( // ensure that config-server requests in particular always go through a proxy // so that it can add the necessary authentication token and other headers. // Direct connections to these domains are not allowed. - domainsRequiringProxy = []string{"getiantem.org", "lantern.io", "getlantern.org", "ss7hc6jm.io", "beam.place", "beam.dance"} + domainsRequiringProxy = []string{ + "iantem.io", + "getiantem.org", + "lantern.io", + "getlantern.org", + "ss7hc6jm.io", + "beam.place", + "beam.dance", + } ) // ProxiedSitesConfig is a legacy config structure that provides backwards compatibility with old config formats diff --git a/embeddedconfig/global.yaml b/embeddedconfig/global.yaml index 9a2a4d481..750cf7296 100644 --- a/embeddedconfig/global.yaml +++ b/embeddedconfig/global.yaml @@ -271,2005 +271,2005 @@ client: usearbitrarysnis: true masquerades: - domain: a248.e.akamai.net - ipaddress: 23.47.50.114 + ipaddress: 96.16.55.172 - domain: a248.e.akamai.net - ipaddress: 104.117.247.99 + ipaddress: 23.56.3.147 - domain: a248.e.akamai.net - ipaddress: 104.117.247.174 + ipaddress: 23.38.189.206 - domain: a248.e.akamai.net - ipaddress: 23.47.48.77 + ipaddress: 23.47.50.227 - domain: a248.e.akamai.net - ipaddress: 23.47.48.58 + ipaddress: 23.47.50.10 - domain: a248.e.akamai.net - ipaddress: 23.38.189.221 + ipaddress: 23.192.223.76 - domain: a248.e.akamai.net - ipaddress: 23.47.48.48 + ipaddress: 23.47.50.57 - domain: a248.e.akamai.net - ipaddress: 23.47.48.186 + ipaddress: 23.47.51.16 - domain: a248.e.akamai.net - ipaddress: 23.47.48.90 + ipaddress: 23.222.28.11 - domain: a248.e.akamai.net - ipaddress: 23.222.28.30 + ipaddress: 23.222.28.179 - domain: a248.e.akamai.net - ipaddress: 23.47.49.234 + ipaddress: 104.97.85.28 - domain: a248.e.akamai.net - ipaddress: 104.117.247.102 + ipaddress: 104.97.85.10 - domain: a248.e.akamai.net - ipaddress: 23.47.50.249 + ipaddress: 23.53.126.30 - domain: a248.e.akamai.net - ipaddress: 23.222.28.98 + ipaddress: 23.53.126.204 - domain: a248.e.akamai.net - ipaddress: 23.38.189.233 + ipaddress: 184.150.49.46 - domain: a248.e.akamai.net - ipaddress: 184.150.49.11 + ipaddress: 23.47.50.214 - domain: a248.e.akamai.net - ipaddress: 23.47.51.115 + ipaddress: 23.222.28.157 - domain: a248.e.akamai.net - ipaddress: 23.47.50.73 + ipaddress: 23.222.28.35 - domain: a248.e.akamai.net - ipaddress: 23.47.50.117 + ipaddress: 23.56.3.203 - domain: a248.e.akamai.net - ipaddress: 23.47.49.77 + ipaddress: 23.47.50.60 - domain: a248.e.akamai.net - ipaddress: 23.192.228.24 + ipaddress: 23.38.189.110 - domain: a248.e.akamai.net - ipaddress: 23.47.49.237 + ipaddress: 96.16.55.15 - domain: a248.e.akamai.net - ipaddress: 184.150.42.37 + ipaddress: 96.16.55.148 - domain: a248.e.akamai.net - ipaddress: 23.220.162.26 + ipaddress: 23.192.223.40 - domain: a248.e.akamai.net - ipaddress: 23.47.49.173 + ipaddress: 104.97.85.148 - domain: a248.e.akamai.net - ipaddress: 23.205.214.53 + ipaddress: 23.222.28.49 - domain: a248.e.akamai.net - ipaddress: 104.117.247.38 + ipaddress: 23.192.223.46 - domain: a248.e.akamai.net - ipaddress: 23.47.52.103 + ipaddress: 23.38.125.205 - domain: a248.e.akamai.net - ipaddress: 23.195.90.18 + ipaddress: 23.52.128.83 - domain: a248.e.akamai.net - ipaddress: 23.220.84.28 + ipaddress: 23.193.184.14 - domain: a248.e.akamai.net - ipaddress: 23.204.139.150 + ipaddress: 23.52.128.237 - domain: a248.e.akamai.net - ipaddress: 23.195.90.16 + ipaddress: 23.193.184.139 - domain: a248.e.akamai.net - ipaddress: 23.67.75.182 + ipaddress: 23.197.49.145 - domain: a248.e.akamai.net - ipaddress: 23.48.149.19 + ipaddress: 184.150.49.34 - domain: a248.e.akamai.net - ipaddress: 23.215.55.218 + ipaddress: 184.25.50.87 - domain: a248.e.akamai.net - ipaddress: 23.47.52.75 + ipaddress: 23.48.23.185 - domain: a248.e.akamai.net - ipaddress: 2.16.10.176 + ipaddress: 184.24.77.154 - domain: a248.e.akamai.net - ipaddress: 2.16.238.26 + ipaddress: 184.25.50.137 - domain: a248.e.akamai.net - ipaddress: 92.122.244.37 + ipaddress: 23.55.161.16 - domain: a248.e.akamai.net - ipaddress: 2.16.238.151 + ipaddress: 23.0.174.219 - domain: a248.e.akamai.net - ipaddress: 184.24.77.54 + ipaddress: 23.10.249.37 - domain: a248.e.akamai.net - ipaddress: 23.2.13.10 + ipaddress: 23.10.249.171 - domain: a248.e.akamai.net - ipaddress: 23.205.214.36 + ipaddress: 23.192.223.117 - domain: a248.e.akamai.net - ipaddress: 23.47.49.158 + ipaddress: 23.202.34.50 - domain: a248.e.akamai.net - ipaddress: 23.55.178.215 + ipaddress: 23.202.34.86 - domain: a248.e.akamai.net - ipaddress: 23.202.35.171 + ipaddress: 104.97.85.16 - domain: a248.e.akamai.net - ipaddress: 23.202.35.225 + ipaddress: 104.97.85.165 - domain: a248.e.akamai.net - ipaddress: 104.91.68.204 + ipaddress: 2.16.154.188 - domain: a248.e.akamai.net - ipaddress: 104.91.68.8 + ipaddress: 88.221.132.144 - domain: a248.e.akamai.net - ipaddress: 23.202.35.98 + ipaddress: 23.35.105.163 - domain: a248.e.akamai.net - ipaddress: 104.91.68.101 + ipaddress: 96.16.55.95 - domain: a248.e.akamai.net - ipaddress: 184.150.49.6 + ipaddress: 23.47.51.85 - domain: a248.e.akamai.net - ipaddress: 2.16.103.6 + ipaddress: 23.49.60.167 - domain: a248.e.akamai.net - ipaddress: 23.47.48.231 + ipaddress: 23.10.249.140 - domain: a248.e.akamai.net - ipaddress: 2.16.154.119 + ipaddress: 23.49.60.186 - domain: a248.e.akamai.net - ipaddress: 23.215.55.143 + ipaddress: 23.55.161.21 - domain: a248.e.akamai.net - ipaddress: 23.47.51.85 + ipaddress: 23.193.96.38 - domain: a248.e.akamai.net - ipaddress: 184.24.77.198 + ipaddress: 23.193.96.20 - domain: a248.e.akamai.net - ipaddress: 2.16.238.20 + ipaddress: 23.62.212.67 - domain: a248.e.akamai.net - ipaddress: 96.17.72.52 + ipaddress: 23.62.212.86 - domain: a248.e.akamai.net - ipaddress: 23.67.75.65 + ipaddress: 23.55.161.188 - domain: a248.e.akamai.net - ipaddress: 2.16.103.113 + ipaddress: 23.72.249.29 - domain: a248.e.akamai.net - ipaddress: 23.47.49.171 + ipaddress: 23.49.104.59 - domain: a248.e.akamai.net - ipaddress: 184.150.49.96 + ipaddress: 23.193.184.16 - domain: a248.e.akamai.net - ipaddress: 23.215.55.136 + ipaddress: 23.53.126.187 - domain: a248.e.akamai.net - ipaddress: 23.220.162.80 + ipaddress: 23.38.125.8 - domain: a248.e.akamai.net - ipaddress: 184.24.77.167 + ipaddress: 23.212.62.73 - domain: a248.e.akamai.net - ipaddress: 104.117.247.147 + ipaddress: 23.35.104.10 - domain: a248.e.akamai.net - ipaddress: 23.202.35.87 + ipaddress: 23.38.189.40 - domain: a248.e.akamai.net - ipaddress: 184.24.77.150 + ipaddress: 23.193.186.42 - domain: a248.e.akamai.net - ipaddress: 23.202.35.4 + ipaddress: 23.208.31.143 - domain: a248.e.akamai.net - ipaddress: 23.35.105.169 + ipaddress: 23.193.184.152 - domain: a248.e.akamai.net - ipaddress: 23.47.52.68 + ipaddress: 96.16.55.7 - domain: a248.e.akamai.net - ipaddress: 23.220.70.110 + ipaddress: 23.193.186.39 - domain: a248.e.akamai.net - ipaddress: 23.205.214.19 + ipaddress: 23.44.5.213 - domain: a248.e.akamai.net - ipaddress: 23.47.50.199 + ipaddress: 23.47.50.108 - domain: a248.e.akamai.net - ipaddress: 23.48.149.8 + ipaddress: 23.38.125.21 - domain: a248.e.akamai.net - ipaddress: 96.17.72.185 + ipaddress: 23.38.125.216 - domain: a248.e.akamai.net - ipaddress: 23.220.70.88 + ipaddress: 23.212.62.87 - domain: a248.e.akamai.net - ipaddress: 23.192.228.232 + ipaddress: 184.150.49.160 - domain: a248.e.akamai.net - ipaddress: 23.47.48.144 + ipaddress: 23.47.50.13 - domain: a248.e.akamai.net - ipaddress: 104.91.68.254 + ipaddress: 23.202.34.150 - domain: a248.e.akamai.net - ipaddress: 23.47.48.86 + ipaddress: 23.49.104.114 - domain: a248.e.akamai.net - ipaddress: 23.55.51.15 + ipaddress: 23.55.161.62 - domain: a248.e.akamai.net - ipaddress: 23.2.16.31 + ipaddress: 184.150.49.52 - domain: a248.e.akamai.net - ipaddress: 23.216.77.60 + ipaddress: 23.208.31.163 - domain: a248.e.akamai.net - ipaddress: 104.117.247.64 + ipaddress: 23.47.50.102 - domain: a248.e.akamai.net - ipaddress: 23.67.75.146 + ipaddress: 23.38.189.167 - domain: a248.e.akamai.net - ipaddress: 184.150.154.9 + ipaddress: 23.193.96.61 - domain: a248.e.akamai.net - ipaddress: 23.67.75.79 + ipaddress: 23.35.105.132 - domain: a248.e.akamai.net - ipaddress: 23.47.52.115 + ipaddress: 23.56.3.207 - domain: a248.e.akamai.net - ipaddress: 23.55.110.191 + ipaddress: 2.16.103.10 - domain: a248.e.akamai.net - ipaddress: 2.16.238.72 + ipaddress: 23.52.128.230 - domain: a248.e.akamai.net - ipaddress: 23.202.34.60 + ipaddress: 23.55.161.36 - domain: a248.e.akamai.net - ipaddress: 23.36.163.28 + ipaddress: 23.222.28.119 - domain: a248.e.akamai.net - ipaddress: 23.205.214.64 + ipaddress: 184.150.49.16 - domain: a248.e.akamai.net - ipaddress: 23.220.162.23 + ipaddress: 23.222.28.85 - domain: a248.e.akamai.net - ipaddress: 23.47.51.83 + ipaddress: 23.208.31.149 - domain: a248.e.akamai.net - ipaddress: 2.19.126.70 + ipaddress: 23.56.3.46 - domain: a248.e.akamai.net - ipaddress: 23.202.34.168 + ipaddress: 23.62.212.90 - domain: a248.e.akamai.net - ipaddress: 23.202.34.247 + ipaddress: 104.97.85.44 - domain: a248.e.akamai.net - ipaddress: 23.47.49.92 + ipaddress: 23.208.31.175 - domain: a248.e.akamai.net - ipaddress: 23.222.28.119 + ipaddress: 23.35.104.115 - domain: a248.e.akamai.net - ipaddress: 23.47.50.234 + ipaddress: 23.38.189.139 - domain: a248.e.akamai.net - ipaddress: 23.38.189.46 + ipaddress: 23.208.31.61 - domain: a248.e.akamai.net - ipaddress: 23.48.149.162 + ipaddress: 23.60.96.135 - domain: a248.e.akamai.net - ipaddress: 88.221.132.75 + ipaddress: 104.84.150.162 - domain: a248.e.akamai.net - ipaddress: 2.19.126.218 + ipaddress: 23.38.189.190 - domain: a248.e.akamai.net - ipaddress: 23.50.131.92 + ipaddress: 23.35.105.197 - domain: a248.e.akamai.net - ipaddress: 23.217.136.166 + ipaddress: 184.24.77.161 - domain: a248.e.akamai.net - ipaddress: 23.48.149.149 + ipaddress: 23.38.189.197 - domain: a248.e.akamai.net - ipaddress: 23.47.51.79 + ipaddress: 23.72.249.20 - domain: a248.e.akamai.net - ipaddress: 23.202.35.101 + ipaddress: 23.193.182.25 - domain: a248.e.akamai.net - ipaddress: 23.202.34.19 + ipaddress: 23.192.223.25 - domain: a248.e.akamai.net - ipaddress: 23.2.16.72 + ipaddress: 23.38.189.152 - domain: a248.e.akamai.net - ipaddress: 184.50.87.124 + ipaddress: 23.220.161.25 - domain: a248.e.akamai.net - ipaddress: 23.220.84.148 + ipaddress: 23.35.104.162 - domain: a248.e.akamai.net - ipaddress: 104.91.68.165 + ipaddress: 23.49.60.64 - domain: a248.e.akamai.net - ipaddress: 184.24.77.47 + ipaddress: 23.35.104.153 - domain: a248.e.akamai.net - ipaddress: 23.205.214.61 + ipaddress: 184.24.77.21 - domain: a248.e.akamai.net - ipaddress: 23.216.77.61 + ipaddress: 184.25.50.147 - domain: a248.e.akamai.net - ipaddress: 23.208.31.148 + ipaddress: 23.55.161.195 - domain: a248.e.akamai.net - ipaddress: 23.67.75.166 + ipaddress: 2.16.103.42 - domain: a248.e.akamai.net - ipaddress: 23.192.228.11 + ipaddress: 23.53.126.34 - domain: a248.e.akamai.net - ipaddress: 23.222.28.145 + ipaddress: 23.49.60.107 - domain: a248.e.akamai.net - ipaddress: 23.2.13.181 + ipaddress: 88.221.132.209 - domain: a248.e.akamai.net - ipaddress: 184.24.77.37 + ipaddress: 23.202.35.59 - domain: a248.e.akamai.net - ipaddress: 88.221.132.64 + ipaddress: 23.38.125.215 - domain: a248.e.akamai.net - ipaddress: 2.19.126.206 + ipaddress: 23.222.28.138 - domain: a248.e.akamai.net - ipaddress: 104.91.68.20 + ipaddress: 23.10.249.11 - domain: a248.e.akamai.net - ipaddress: 23.2.13.65 + ipaddress: 23.35.104.13 - domain: a248.e.akamai.net - ipaddress: 184.150.49.81 + ipaddress: 23.62.212.97 - domain: a248.e.akamai.net - ipaddress: 2.19.204.158 + ipaddress: 2.16.103.46 - domain: a248.e.akamai.net - ipaddress: 184.150.49.104 + ipaddress: 23.10.249.28 - domain: a248.e.akamai.net - ipaddress: 23.202.34.242 + ipaddress: 23.55.161.12 - domain: a248.e.akamai.net - ipaddress: 104.91.68.18 + ipaddress: 23.202.34.46 - domain: a248.e.akamai.net - ipaddress: 23.205.214.38 + ipaddress: 184.150.58.140 - domain: a248.e.akamai.net - ipaddress: 23.38.189.208 + ipaddress: 23.2.16.181 - domain: a248.e.akamai.net - ipaddress: 2.19.204.180 + ipaddress: 23.55.161.187 - domain: a248.e.akamai.net - ipaddress: 23.50.131.91 + ipaddress: 23.222.28.125 - domain: a248.e.akamai.net - ipaddress: 2.16.154.34 + ipaddress: 184.24.77.210 - domain: a248.e.akamai.net - ipaddress: 23.220.70.166 + ipaddress: 23.202.35.159 - domain: a248.e.akamai.net - ipaddress: 88.221.132.107 + ipaddress: 104.84.150.190 - domain: a248.e.akamai.net - ipaddress: 2.16.103.36 + ipaddress: 23.49.60.204 - domain: a248.e.akamai.net - ipaddress: 23.49.104.115 + ipaddress: 23.55.161.63 - domain: a248.e.akamai.net - ipaddress: 96.17.72.171 + ipaddress: 23.202.35.194 - domain: a248.e.akamai.net - ipaddress: 92.122.244.41 + ipaddress: 23.222.28.21 - domain: a248.e.akamai.net - ipaddress: 184.150.42.132 + ipaddress: 23.56.3.66 - domain: a248.e.akamai.net - ipaddress: 23.202.35.160 + ipaddress: 23.50.131.23 - domain: a248.e.akamai.net - ipaddress: 184.150.154.111 + ipaddress: 23.55.161.68 - domain: a248.e.akamai.net - ipaddress: 23.67.75.233 + ipaddress: 23.56.3.9 - domain: a248.e.akamai.net - ipaddress: 184.24.77.170 + ipaddress: 23.53.126.139 - domain: a248.e.akamai.net - ipaddress: 2.19.126.80 + ipaddress: 23.56.3.201 - domain: a248.e.akamai.net - ipaddress: 2.19.204.16 + ipaddress: 23.35.104.84 - domain: a248.e.akamai.net - ipaddress: 23.55.51.199 + ipaddress: 23.192.223.197 - domain: a248.e.akamai.net - ipaddress: 23.55.110.190 + ipaddress: 184.25.50.183 - domain: a248.e.akamai.net - ipaddress: 23.220.84.132 + ipaddress: 23.35.104.57 - domain: a248.e.akamai.net - ipaddress: 125.56.219.65 + ipaddress: 2.16.103.44 - domain: a248.e.akamai.net - ipaddress: 23.220.162.219 + ipaddress: 23.72.249.138 - domain: a248.e.akamai.net - ipaddress: 23.47.49.159 + ipaddress: 96.16.55.212 - domain: a248.e.akamai.net - ipaddress: 23.216.77.48 + ipaddress: 23.47.50.98 - domain: a248.e.akamai.net - ipaddress: 23.55.110.80 + ipaddress: 23.56.3.90 - domain: a248.e.akamai.net - ipaddress: 23.202.34.59 + ipaddress: 23.53.42.35 - domain: a248.e.akamai.net - ipaddress: 2.16.103.20 + ipaddress: 23.10.249.50 - domain: a248.e.akamai.net - ipaddress: 23.50.131.220 + ipaddress: 184.150.49.80 - domain: a248.e.akamai.net - ipaddress: 23.47.49.23 + ipaddress: 23.52.128.51 - domain: a248.e.akamai.net - ipaddress: 184.150.154.4 + ipaddress: 96.16.55.27 - domain: a248.e.akamai.net - ipaddress: 23.48.149.167 + ipaddress: 184.24.77.64 - domain: a248.e.akamai.net - ipaddress: 104.117.247.146 + ipaddress: 184.25.51.41 - domain: a248.e.akamai.net - ipaddress: 23.220.70.156 + ipaddress: 23.72.249.18 - domain: a248.e.akamai.net - ipaddress: 23.33.126.161 + ipaddress: 23.192.223.69 - domain: a248.e.akamai.net - ipaddress: 23.216.77.31 + ipaddress: 184.25.50.61 - domain: a248.e.akamai.net - ipaddress: 23.55.110.183 + ipaddress: 23.47.51.11 - domain: a248.e.akamai.net - ipaddress: 104.91.68.139 + ipaddress: 23.47.50.82 - domain: a248.e.akamai.net - ipaddress: 184.150.154.80 + ipaddress: 23.193.186.18 - domain: a248.e.akamai.net - ipaddress: 23.216.77.19 + ipaddress: 23.38.189.151 - domain: a248.e.akamai.net - ipaddress: 23.38.189.172 + ipaddress: 23.47.50.27 - domain: a248.e.akamai.net - ipaddress: 184.24.77.21 + ipaddress: 23.44.4.210 - domain: a248.e.akamai.net - ipaddress: 23.55.110.208 + ipaddress: 23.208.31.194 - domain: a248.e.akamai.net - ipaddress: 184.150.154.16 + ipaddress: 23.55.161.180 - domain: a248.e.akamai.net - ipaddress: 23.47.50.76 + ipaddress: 23.47.50.170 - domain: a248.e.akamai.net - ipaddress: 23.192.228.12 + ipaddress: 23.0.174.18 - domain: a248.e.akamai.net - ipaddress: 23.202.34.103 + ipaddress: 23.56.3.254 - domain: a248.e.akamai.net - ipaddress: 184.150.42.34 + ipaddress: 23.55.161.146 - domain: a248.e.akamai.net - ipaddress: 23.67.75.152 + ipaddress: 23.50.131.198 - domain: a248.e.akamai.net - ipaddress: 23.216.77.219 + ipaddress: 23.38.189.189 - domain: a248.e.akamai.net - ipaddress: 23.55.110.69 + ipaddress: 23.38.189.44 - domain: a248.e.akamai.net - ipaddress: 23.55.178.209 + ipaddress: 104.97.85.171 - domain: a248.e.akamai.net - ipaddress: 23.2.13.152 + ipaddress: 23.44.5.234 - domain: a248.e.akamai.net - ipaddress: 23.49.104.174 + ipaddress: 23.49.104.201 - domain: a248.e.akamai.net - ipaddress: 23.220.70.34 + ipaddress: 23.208.31.19 - domain: a248.e.akamai.net - ipaddress: 23.38.189.81 + ipaddress: 23.202.34.35 - domain: a248.e.akamai.net - ipaddress: 23.192.228.22 + ipaddress: 23.0.174.211 - domain: a248.e.akamai.net - ipaddress: 23.47.52.123 + ipaddress: 23.220.162.16 - domain: a248.e.akamai.net - ipaddress: 23.35.105.197 + ipaddress: 184.150.49.117 - domain: a248.e.akamai.net - ipaddress: 23.2.13.69 + ipaddress: 184.150.49.88 - domain: a248.e.akamai.net - ipaddress: 23.202.34.151 + ipaddress: 104.97.85.61 - domain: a248.e.akamai.net - ipaddress: 23.195.90.19 + ipaddress: 23.197.49.56 - domain: a248.e.akamai.net - ipaddress: 23.55.110.79 + ipaddress: 104.97.85.184 - domain: a248.e.akamai.net - ipaddress: 23.55.178.154 + ipaddress: 23.52.128.135 - domain: a248.e.akamai.net - ipaddress: 23.47.48.132 + ipaddress: 184.25.50.81 - domain: a248.e.akamai.net - ipaddress: 23.195.90.62 + ipaddress: 96.16.55.82 - domain: a248.e.akamai.net - ipaddress: 104.91.68.201 + ipaddress: 23.193.186.26 - domain: a248.e.akamai.net - ipaddress: 184.24.77.82 + ipaddress: 184.25.50.73 - domain: a248.e.akamai.net - ipaddress: 2.16.238.21 + ipaddress: 184.25.51.32 - domain: a248.e.akamai.net - ipaddress: 23.47.49.79 + ipaddress: 23.10.249.145 - domain: a248.e.akamai.net - ipaddress: 23.47.48.78 + ipaddress: 23.47.50.125 - domain: a248.e.akamai.net - ipaddress: 23.47.48.10 + ipaddress: 23.50.131.80 - domain: a248.e.akamai.net - ipaddress: 23.215.55.216 + ipaddress: 23.222.28.83 - domain: a248.e.akamai.net - ipaddress: 23.47.51.80 + ipaddress: 104.97.85.141 - domain: a248.e.akamai.net - ipaddress: 23.55.110.207 + ipaddress: 23.47.50.141 - domain: a248.e.akamai.net - ipaddress: 104.117.247.140 + ipaddress: 23.48.23.142 - domain: a248.e.akamai.net - ipaddress: 104.91.68.35 + ipaddress: 23.56.3.78 - domain: a248.e.akamai.net - ipaddress: 2.16.238.212 + ipaddress: 23.197.49.187 - domain: a248.e.akamai.net - ipaddress: 23.55.178.230 + ipaddress: 23.56.3.56 - domain: a248.e.akamai.net - ipaddress: 23.47.51.81 + ipaddress: 23.62.212.106 - domain: a248.e.akamai.net - ipaddress: 23.35.105.185 + ipaddress: 23.192.223.232 - domain: a248.e.akamai.net - ipaddress: 184.24.77.28 + ipaddress: 23.47.50.182 - domain: a248.e.akamai.net - ipaddress: 2.19.126.6 + ipaddress: 96.16.55.152 - domain: a248.e.akamai.net - ipaddress: 23.55.110.205 + ipaddress: 23.192.223.16 - domain: a248.e.akamai.net - ipaddress: 23.55.51.19 + ipaddress: 23.193.96.76 - domain: a248.e.akamai.net - ipaddress: 23.2.16.85 + ipaddress: 23.38.189.153 - domain: a248.e.akamai.net - ipaddress: 23.217.136.149 + ipaddress: 23.202.34.38 - domain: a248.e.akamai.net - ipaddress: 184.150.42.49 + ipaddress: 23.35.105.61 - domain: a248.e.akamai.net - ipaddress: 23.202.35.183 + ipaddress: 23.193.96.181 - domain: a248.e.akamai.net - ipaddress: 104.91.68.98 + ipaddress: 23.208.31.30 - domain: a248.e.akamai.net - ipaddress: 2.19.204.187 + ipaddress: 104.97.85.48 - domain: a248.e.akamai.net - ipaddress: 23.202.35.224 + ipaddress: 23.193.96.97 - domain: a248.e.akamai.net - ipaddress: 23.47.52.55 + ipaddress: 23.222.28.79 - domain: a248.e.akamai.net - ipaddress: 23.216.77.6 + ipaddress: 23.35.104.62 - domain: a248.e.akamai.net - ipaddress: 23.67.75.186 + ipaddress: 23.55.161.192 - domain: a248.e.akamai.net - ipaddress: 104.91.68.49 + ipaddress: 23.55.161.10 - domain: a248.e.akamai.net - ipaddress: 23.47.48.13 + ipaddress: 104.123.71.96 - domain: a248.e.akamai.net - ipaddress: 2.19.204.151 + ipaddress: 23.38.189.108 - domain: a248.e.akamai.net - ipaddress: 23.49.104.41 + ipaddress: 23.53.126.48 - domain: a248.e.akamai.net - ipaddress: 23.47.50.35 + ipaddress: 23.44.5.225 - domain: a248.e.akamai.net - ipaddress: 2.19.126.68 + ipaddress: 23.38.189.161 - domain: a248.e.akamai.net - ipaddress: 23.47.48.105 + ipaddress: 23.202.35.209 - domain: a248.e.akamai.net - ipaddress: 23.55.51.89 + ipaddress: 23.202.34.247 - domain: a248.e.akamai.net - ipaddress: 92.122.244.10 + ipaddress: 23.53.126.71 - domain: a248.e.akamai.net - ipaddress: 23.55.178.113 + ipaddress: 23.38.189.250 - domain: a248.e.akamai.net - ipaddress: 23.195.90.63 + ipaddress: 104.97.85.166 - domain: a248.e.akamai.net - ipaddress: 184.150.154.97 + ipaddress: 104.97.85.45 - domain: a248.e.akamai.net - ipaddress: 2.16.10.215 + ipaddress: 23.49.104.26 - domain: a248.e.akamai.net - ipaddress: 23.47.52.219 + ipaddress: 23.52.128.196 - domain: a248.e.akamai.net - ipaddress: 23.55.178.47 + ipaddress: 23.60.96.141 - domain: a248.e.akamai.net - ipaddress: 2.16.103.73 + ipaddress: 184.24.77.171 - domain: a248.e.akamai.net - ipaddress: 23.55.178.57 + ipaddress: 184.25.51.12 - domain: a248.e.akamai.net - ipaddress: 23.38.189.206 + ipaddress: 23.56.3.182 - domain: a248.e.akamai.net - ipaddress: 184.24.77.78 + ipaddress: 104.97.85.138 - domain: a248.e.akamai.net - ipaddress: 23.192.228.148 + ipaddress: 104.84.150.182 - domain: a248.e.akamai.net - ipaddress: 23.202.34.53 + ipaddress: 23.35.105.137 - domain: a248.e.akamai.net - ipaddress: 23.55.178.137 + ipaddress: 23.2.16.200 - domain: a248.e.akamai.net - ipaddress: 23.220.84.36 + ipaddress: 23.192.223.52 - domain: a248.e.akamai.net - ipaddress: 23.47.50.95 + ipaddress: 23.62.212.75 - domain: a248.e.akamai.net - ipaddress: 23.202.35.81 + ipaddress: 23.202.34.213 - domain: a248.e.akamai.net - ipaddress: 23.35.105.127 + ipaddress: 23.202.34.57 - domain: a248.e.akamai.net - ipaddress: 23.220.70.114 + ipaddress: 23.50.131.211 - domain: a248.e.akamai.net - ipaddress: 23.220.70.73 + ipaddress: 23.208.31.165 - domain: a248.e.akamai.net - ipaddress: 92.122.244.46 + ipaddress: 184.25.50.123 - domain: a248.e.akamai.net - ipaddress: 23.47.49.125 + ipaddress: 23.56.3.179 - domain: a248.e.akamai.net - ipaddress: 23.49.104.3 + ipaddress: 23.35.104.139 - domain: a248.e.akamai.net - ipaddress: 23.202.34.91 + ipaddress: 23.55.161.196 - domain: a248.e.akamai.net - ipaddress: 23.47.52.211 + ipaddress: 23.44.5.199 - domain: a248.e.akamai.net - ipaddress: 104.91.68.11 + ipaddress: 184.25.50.117 - domain: a248.e.akamai.net - ipaddress: 88.221.132.130 + ipaddress: 23.222.28.46 - domain: a248.e.akamai.net - ipaddress: 23.205.214.31 + ipaddress: 23.47.50.71 - domain: a248.e.akamai.net - ipaddress: 92.122.244.23 + ipaddress: 104.84.150.173 - domain: a248.e.akamai.net - ipaddress: 23.222.28.177 + ipaddress: 23.192.223.79 - domain: a248.e.akamai.net - ipaddress: 23.205.214.29 + ipaddress: 23.44.4.221 - domain: a248.e.akamai.net - ipaddress: 23.202.34.72 + ipaddress: 23.220.162.26 - domain: a248.e.akamai.net - ipaddress: 23.47.50.154 + ipaddress: 23.202.35.144 - domain: a248.e.akamai.net - ipaddress: 23.47.49.162 + ipaddress: 23.193.184.36 - domain: a248.e.akamai.net - ipaddress: 96.17.72.254 + ipaddress: 184.24.77.197 - domain: a248.e.akamai.net - ipaddress: 23.220.70.113 + ipaddress: 184.150.49.66 - domain: a248.e.akamai.net - ipaddress: 23.48.149.147 + ipaddress: 23.192.223.109 - domain: a248.e.akamai.net - ipaddress: 23.2.16.49 + ipaddress: 23.56.3.62 - domain: a248.e.akamai.net - ipaddress: 23.47.52.110 + ipaddress: 23.208.31.70 - domain: a248.e.akamai.net - ipaddress: 23.205.214.39 + ipaddress: 23.56.3.11 - domain: a248.e.akamai.net - ipaddress: 104.117.247.133 + ipaddress: 23.55.161.30 - domain: a248.e.akamai.net - ipaddress: 23.220.70.145 + ipaddress: 23.222.28.91 - domain: a248.e.akamai.net - ipaddress: 23.47.48.157 + ipaddress: 23.35.104.173 - domain: a248.e.akamai.net - ipaddress: 23.55.51.4 + ipaddress: 23.212.62.83 - domain: a248.e.akamai.net - ipaddress: 23.47.48.203 + ipaddress: 23.49.60.207 - domain: a248.e.akamai.net - ipaddress: 184.150.49.136 + ipaddress: 23.49.60.172 - domain: a248.e.akamai.net - ipaddress: 23.47.49.247 + ipaddress: 23.208.31.34 - domain: a248.e.akamai.net - ipaddress: 23.47.50.239 + ipaddress: 184.24.77.43 - domain: a248.e.akamai.net - ipaddress: 2.19.204.143 + ipaddress: 23.2.16.206 - domain: a248.e.akamai.net - ipaddress: 2.16.154.155 + ipaddress: 23.222.28.106 - domain: a248.e.akamai.net - ipaddress: 23.222.28.63 + ipaddress: 23.56.3.163 - domain: a248.e.akamai.net - ipaddress: 23.192.228.26 + ipaddress: 23.193.184.30 - domain: a248.e.akamai.net - ipaddress: 23.55.178.206 + ipaddress: 104.97.85.145 - domain: a248.e.akamai.net - ipaddress: 2.16.154.128 + ipaddress: 23.49.104.24 - domain: a248.e.akamai.net - ipaddress: 23.192.228.229 + ipaddress: 184.25.50.18 - domain: a248.e.akamai.net - ipaddress: 23.35.105.118 + ipaddress: 23.49.60.96 - domain: a248.e.akamai.net - ipaddress: 23.215.55.143 + ipaddress: 23.52.128.96 - domain: a248.e.akamai.net - ipaddress: 23.55.51.207 + ipaddress: 23.49.60.45 - domain: a248.e.akamai.net - ipaddress: 23.47.49.169 + ipaddress: 23.44.5.189 - domain: a248.e.akamai.net - ipaddress: 23.204.139.139 + ipaddress: 23.53.42.36 - domain: a248.e.akamai.net - ipaddress: 23.67.75.196 + ipaddress: 23.53.42.12 - domain: a248.e.akamai.net - ipaddress: 23.47.48.103 + ipaddress: 23.47.50.215 - domain: a248.e.akamai.net - ipaddress: 96.17.72.60 + ipaddress: 23.202.35.192 - domain: a248.e.akamai.net - ipaddress: 23.49.104.22 + ipaddress: 23.193.184.19 - domain: a248.e.akamai.net - ipaddress: 184.150.154.73 + ipaddress: 23.208.31.80 - domain: a248.e.akamai.net - ipaddress: 23.38.189.250 + ipaddress: 2.16.103.32 - domain: a248.e.akamai.net - ipaddress: 23.47.52.218 + ipaddress: 23.220.162.149 - domain: a248.e.akamai.net - ipaddress: 104.117.247.31 + ipaddress: 23.62.212.8 - domain: a248.e.akamai.net - ipaddress: 23.215.55.217 + ipaddress: 23.56.3.79 - domain: a248.e.akamai.net - ipaddress: 2.19.126.10 + ipaddress: 23.47.50.200 - domain: a248.e.akamai.net - ipaddress: 23.216.77.53 + ipaddress: 23.52.128.199 - domain: a248.e.akamai.net - ipaddress: 23.47.48.5 + ipaddress: 23.220.162.215 - domain: a248.e.akamai.net - ipaddress: 96.17.72.155 + ipaddress: 23.56.3.173 - domain: a248.e.akamai.net - ipaddress: 184.24.77.156 + ipaddress: 104.84.150.169 - domain: a248.e.akamai.net - ipaddress: 23.202.34.64 + ipaddress: 23.48.23.191 - domain: a248.e.akamai.net - ipaddress: 23.48.23.167 + ipaddress: 23.202.35.239 - domain: a248.e.akamai.net - ipaddress: 2.16.238.158 + ipaddress: 23.202.35.196 - domain: a248.e.akamai.net - ipaddress: 23.38.189.39 + ipaddress: 184.25.50.164 - domain: a248.e.akamai.net - ipaddress: 23.67.75.226 + ipaddress: 184.24.77.135 - domain: a248.e.akamai.net - ipaddress: 23.202.34.115 + ipaddress: 23.2.16.180 - domain: a248.e.akamai.net - ipaddress: 23.202.34.218 + ipaddress: 23.202.34.142 - domain: a248.e.akamai.net - ipaddress: 23.49.104.185 + ipaddress: 23.35.105.187 - domain: a248.e.akamai.net - ipaddress: 23.216.77.180 + ipaddress: 23.44.5.173 - domain: a248.e.akamai.net - ipaddress: 23.48.149.133 + ipaddress: 104.97.85.11 - domain: a248.e.akamai.net - ipaddress: 2.16.238.204 + ipaddress: 23.53.126.53 - domain: a248.e.akamai.net - ipaddress: 23.220.162.140 + ipaddress: 23.38.125.28 - domain: a248.e.akamai.net - ipaddress: 23.38.189.112 + ipaddress: 23.202.34.67 - domain: a248.e.akamai.net - ipaddress: 23.48.149.184 + ipaddress: 23.49.104.150 - domain: a248.e.akamai.net - ipaddress: 23.220.70.117 + ipaddress: 23.49.60.43 - domain: a248.e.akamai.net - ipaddress: 23.47.50.178 + ipaddress: 23.208.31.135 - domain: a248.e.akamai.net - ipaddress: 104.117.247.111 + ipaddress: 23.53.126.38 - domain: a248.e.akamai.net - ipaddress: 23.67.75.89 + ipaddress: 23.35.105.128 - domain: a248.e.akamai.net - ipaddress: 23.202.34.52 + ipaddress: 23.49.104.60 - domain: a248.e.akamai.net - ipaddress: 23.202.35.32 + ipaddress: 23.193.96.41 - domain: a248.e.akamai.net - ipaddress: 23.36.163.26 + ipaddress: 184.25.51.114 - domain: a248.e.akamai.net - ipaddress: 23.36.163.32 + ipaddress: 23.38.189.114 - domain: a248.e.akamai.net - ipaddress: 23.192.228.138 + ipaddress: 23.56.3.174 - domain: a248.e.akamai.net - ipaddress: 23.222.28.115 + ipaddress: 23.47.50.210 - domain: a248.e.akamai.net - ipaddress: 23.195.90.69 + ipaddress: 2.16.103.13 - domain: a248.e.akamai.net - ipaddress: 2.19.126.84 + ipaddress: 23.208.31.31 - domain: a248.e.akamai.net - ipaddress: 23.47.51.78 + ipaddress: 23.35.104.86 - domain: a248.e.akamai.net - ipaddress: 2.19.204.218 + ipaddress: 23.202.35.157 - domain: a248.e.akamai.net - ipaddress: 23.48.149.180 + ipaddress: 23.56.3.28 - domain: a248.e.akamai.net - ipaddress: 23.216.77.207 + ipaddress: 23.52.128.78 - domain: a248.e.akamai.net - ipaddress: 23.35.105.168 + ipaddress: 184.150.49.151 - domain: a248.e.akamai.net - ipaddress: 125.56.219.60 + ipaddress: 23.48.23.171 - domain: a248.e.akamai.net - ipaddress: 23.2.16.206 + ipaddress: 23.47.50.247 - domain: a248.e.akamai.net - ipaddress: 23.55.110.55 + ipaddress: 23.60.96.197 - domain: a248.e.akamai.net - ipaddress: 2.19.126.163 + ipaddress: 23.53.126.171 - domain: a248.e.akamai.net - ipaddress: 23.49.104.120 + ipaddress: 88.221.132.29 - domain: a248.e.akamai.net - ipaddress: 23.222.28.76 + ipaddress: 184.24.77.151 - domain: a248.e.akamai.net - ipaddress: 2.16.154.44 + ipaddress: 23.49.60.51 - domain: a248.e.akamai.net - ipaddress: 23.205.214.50 + ipaddress: 23.55.161.184 - domain: a248.e.akamai.net - ipaddress: 23.55.178.21 + ipaddress: 23.53.126.141 - domain: a248.e.akamai.net - ipaddress: 23.47.51.20 + ipaddress: 23.192.223.237 - domain: a248.e.akamai.net - ipaddress: 23.55.178.119 + ipaddress: 23.35.104.145 - domain: a248.e.akamai.net - ipaddress: 23.47.50.44 + ipaddress: 23.56.3.26 - domain: a248.e.akamai.net - ipaddress: 23.49.104.4 + ipaddress: 23.35.104.24 - domain: a248.e.akamai.net - ipaddress: 23.47.51.89 + ipaddress: 23.208.31.15 - domain: a248.e.akamai.net - ipaddress: 184.150.49.88 + ipaddress: 23.56.3.152 - domain: a248.e.akamai.net - ipaddress: 23.2.13.28 + ipaddress: 23.53.42.27 - domain: a248.e.akamai.net - ipaddress: 2.19.204.92 + ipaddress: 23.222.28.90 - domain: a248.e.akamai.net - ipaddress: 184.150.49.19 + ipaddress: 23.49.60.95 - domain: a248.e.akamai.net - ipaddress: 23.47.51.106 + ipaddress: 23.52.128.85 - domain: a248.e.akamai.net - ipaddress: 23.49.104.144 + ipaddress: 184.24.77.194 - domain: a248.e.akamai.net - ipaddress: 88.221.132.52 + ipaddress: 23.53.126.193 - domain: a248.e.akamai.net - ipaddress: 23.2.16.208 + ipaddress: 23.212.62.5 - domain: a248.e.akamai.net - ipaddress: 23.47.48.167 + ipaddress: 23.192.223.6 - domain: a248.e.akamai.net - ipaddress: 23.202.34.138 + ipaddress: 23.192.223.88 - domain: a248.e.akamai.net - ipaddress: 23.48.149.34 + ipaddress: 23.197.49.168 - domain: a248.e.akamai.net - ipaddress: 23.47.48.154 + ipaddress: 23.220.162.81 - domain: a248.e.akamai.net - ipaddress: 23.55.110.4 + ipaddress: 23.202.34.88 - domain: a248.e.akamai.net - ipaddress: 2.19.204.148 + ipaddress: 23.193.96.208 - domain: a248.e.akamai.net - ipaddress: 23.38.189.76 + ipaddress: 23.38.189.115 - domain: a248.e.akamai.net - ipaddress: 23.48.149.58 + ipaddress: 23.48.23.180 - domain: a248.e.akamai.net - ipaddress: 184.24.77.53 + ipaddress: 23.49.60.178 - domain: a248.e.akamai.net - ipaddress: 184.150.49.143 + ipaddress: 23.52.128.53 - domain: a248.e.akamai.net - ipaddress: 184.150.49.106 + ipaddress: 23.193.184.133 - domain: a248.e.akamai.net - ipaddress: 23.67.75.70 + ipaddress: 23.202.35.226 - domain: a248.e.akamai.net - ipaddress: 2.19.204.170 + ipaddress: 23.0.174.217 - domain: a248.e.akamai.net - ipaddress: 23.202.35.176 + ipaddress: 23.53.126.58 - domain: a248.e.akamai.net - ipaddress: 2.16.103.74 + ipaddress: 104.97.85.30 - domain: a248.e.akamai.net - ipaddress: 125.56.219.76 + ipaddress: 23.62.212.6 - domain: a248.e.akamai.net - ipaddress: 23.205.214.21 + ipaddress: 23.202.35.214 - domain: a248.e.akamai.net - ipaddress: 23.47.50.207 + ipaddress: 23.212.62.78 - domain: a248.e.akamai.net - ipaddress: 23.48.23.181 + ipaddress: 23.192.223.77 - domain: a248.e.akamai.net - ipaddress: 88.221.132.15 + ipaddress: 23.192.223.105 - domain: a248.e.akamai.net - ipaddress: 23.47.50.94 + ipaddress: 23.62.212.7 - domain: a248.e.akamai.net - ipaddress: 23.47.51.44 + ipaddress: 2.16.103.201 - domain: a248.e.akamai.net - ipaddress: 104.91.68.198 + ipaddress: 23.202.35.36 - domain: a248.e.akamai.net - ipaddress: 23.208.31.161 + ipaddress: 23.52.128.41 - domain: a248.e.akamai.net - ipaddress: 23.216.77.43 + ipaddress: 23.193.184.141 - domain: a248.e.akamai.net - ipaddress: 23.202.35.163 + ipaddress: 92.122.244.4 - domain: a248.e.akamai.net - ipaddress: 23.55.178.232 + ipaddress: 23.35.104.16 - domain: a248.e.akamai.net - ipaddress: 104.91.68.185 + ipaddress: 23.193.184.8 - domain: a248.e.akamai.net - ipaddress: 23.49.104.172 + ipaddress: 23.47.51.104 - domain: a248.e.akamai.net - ipaddress: 23.62.46.214 + ipaddress: 23.35.105.120 - domain: a248.e.akamai.net - ipaddress: 23.222.28.136 + ipaddress: 23.62.212.88 - domain: a248.e.akamai.net - ipaddress: 23.38.189.157 + ipaddress: 23.47.50.240 - domain: a248.e.akamai.net - ipaddress: 2.19.126.162 + ipaddress: 23.208.31.153 - domain: a248.e.akamai.net - ipaddress: 2.19.204.212 + ipaddress: 23.193.184.9 - domain: a248.e.akamai.net - ipaddress: 2.19.126.220 + ipaddress: 184.150.49.113 - domain: a248.e.akamai.net - ipaddress: 23.47.49.133 + ipaddress: 23.197.49.149 - domain: a248.e.akamai.net - ipaddress: 104.91.68.136 + ipaddress: 96.16.55.74 - domain: a248.e.akamai.net - ipaddress: 184.24.77.191 + ipaddress: 184.150.49.137 - domain: a248.e.akamai.net - ipaddress: 23.38.189.45 + ipaddress: 23.202.35.235 - domain: a248.e.akamai.net - ipaddress: 23.55.110.144 + ipaddress: 23.193.184.37 - domain: a248.e.akamai.net - ipaddress: 2.16.10.150 + ipaddress: 23.193.96.30 - domain: a248.e.akamai.net - ipaddress: 104.117.247.91 + ipaddress: 23.44.5.218 - domain: a248.e.akamai.net - ipaddress: 184.150.42.176 + ipaddress: 23.35.104.82 - domain: a248.e.akamai.net - ipaddress: 184.150.42.192 + ipaddress: 184.25.50.51 - domain: a248.e.akamai.net - ipaddress: 184.150.42.42 + ipaddress: 23.53.126.56 - domain: a248.e.akamai.net - ipaddress: 23.2.16.27 + ipaddress: 23.44.5.193 - domain: a248.e.akamai.net - ipaddress: 104.91.68.192 + ipaddress: 23.193.96.179 - domain: a248.e.akamai.net - ipaddress: 23.220.70.136 + ipaddress: 184.25.50.46 - domain: a248.e.akamai.net - ipaddress: 23.220.70.25 + ipaddress: 104.84.150.146 - domain: a248.e.akamai.net - ipaddress: 23.195.90.23 + ipaddress: 23.38.189.32 - domain: a248.e.akamai.net - ipaddress: 104.91.68.96 + ipaddress: 184.24.77.148 - domain: a248.e.akamai.net - ipaddress: 23.47.51.117 + ipaddress: 23.72.249.155 - domain: a248.e.akamai.net - ipaddress: 23.55.110.31 + ipaddress: 23.56.3.232 - domain: a248.e.akamai.net - ipaddress: 23.204.139.6 + ipaddress: 104.123.71.90 - domain: a248.e.akamai.net - ipaddress: 23.205.214.26 + ipaddress: 23.47.51.59 - domain: a248.e.akamai.net - ipaddress: 104.117.247.47 + ipaddress: 23.197.49.166 - domain: a248.e.akamai.net - ipaddress: 23.55.51.203 + ipaddress: 23.222.28.51 - domain: a248.e.akamai.net - ipaddress: 23.47.50.125 + ipaddress: 184.25.50.25 - domain: a248.e.akamai.net - ipaddress: 23.202.35.125 + ipaddress: 23.202.35.130 - domain: a248.e.akamai.net - ipaddress: 23.47.50.198 + ipaddress: 23.202.34.56 - domain: a248.e.akamai.net - ipaddress: 23.47.50.21 + ipaddress: 23.0.174.26 - domain: a248.e.akamai.net - ipaddress: 23.33.126.171 + ipaddress: 2.16.103.126 - domain: a248.e.akamai.net - ipaddress: 2.16.238.132 + ipaddress: 23.55.161.26 - domain: a248.e.akamai.net - ipaddress: 23.48.149.11 + ipaddress: 23.49.104.132 - domain: a248.e.akamai.net - ipaddress: 23.217.136.208 + ipaddress: 23.49.104.154 - domain: a248.e.akamai.net - ipaddress: 2.16.238.144 + ipaddress: 23.72.249.156 - domain: a248.e.akamai.net - ipaddress: 23.202.34.75 + ipaddress: 96.16.55.197 - domain: a248.e.akamai.net - ipaddress: 23.47.51.110 + ipaddress: 23.47.50.72 - domain: a248.e.akamai.net - ipaddress: 184.24.77.81 + ipaddress: 23.56.3.194 - domain: a248.e.akamai.net - ipaddress: 23.55.178.37 + ipaddress: 23.49.104.185 - domain: a248.e.akamai.net - ipaddress: 23.202.34.141 + ipaddress: 2.16.103.14 - domain: a248.e.akamai.net - ipaddress: 23.55.110.180 + ipaddress: 23.193.96.34 - domain: a248.e.akamai.net - ipaddress: 23.222.28.66 + ipaddress: 23.56.3.199 - domain: a248.e.akamai.net - ipaddress: 23.47.52.144 + ipaddress: 23.44.4.234 - domain: a248.e.akamai.net - ipaddress: 23.35.105.43 + ipaddress: 23.38.189.193 - domain: a248.e.akamai.net - ipaddress: 23.47.49.249 + ipaddress: 23.47.51.75 - domain: a248.e.akamai.net - ipaddress: 23.47.48.230 + ipaddress: 23.220.162.20 - domain: a248.e.akamai.net - ipaddress: 23.202.34.79 + ipaddress: 23.52.128.12 - domain: a248.e.akamai.net - ipaddress: 23.215.55.224 + ipaddress: 23.197.49.58 - domain: a248.e.akamai.net - ipaddress: 2.16.103.87 + ipaddress: 96.16.55.218 - domain: a248.e.akamai.net - ipaddress: 23.35.105.147 + ipaddress: 184.25.51.4 - domain: a248.e.akamai.net - ipaddress: 184.150.49.12 + ipaddress: 23.197.49.45 - domain: a248.e.akamai.net - ipaddress: 23.2.16.110 + ipaddress: 23.208.31.189 - domain: a248.e.akamai.net - ipaddress: 88.221.132.145 + ipaddress: 23.0.174.236 - domain: a248.e.akamai.net - ipaddress: 23.2.13.214 + ipaddress: 96.16.55.105 - domain: a248.e.akamai.net - ipaddress: 23.55.178.169 + ipaddress: 184.25.50.43 - domain: a248.e.akamai.net - ipaddress: 23.47.50.241 + ipaddress: 23.60.96.164 - domain: a248.e.akamai.net - ipaddress: 2.19.126.81 + ipaddress: 23.2.16.57 - domain: a248.e.akamai.net - ipaddress: 2.16.10.171 + ipaddress: 104.97.85.22 - domain: a248.e.akamai.net - ipaddress: 184.150.42.136 + ipaddress: 23.208.31.188 - domain: a248.e.akamai.net - ipaddress: 104.91.68.127 + ipaddress: 184.25.51.5 - domain: a248.e.akamai.net - ipaddress: 184.24.77.61 + ipaddress: 23.0.174.19 - domain: a248.e.akamai.net - ipaddress: 184.150.42.60 + ipaddress: 23.197.49.155 - domain: a248.e.akamai.net - ipaddress: 23.47.50.88 + ipaddress: 23.60.96.80 - domain: a248.e.akamai.net - ipaddress: 23.55.110.158 + ipaddress: 104.97.85.167 - domain: a248.e.akamai.net - ipaddress: 23.192.228.154 + ipaddress: 23.53.126.188 - domain: a248.e.akamai.net - ipaddress: 23.50.131.205 + ipaddress: 23.47.50.105 - domain: a248.e.akamai.net - ipaddress: 23.220.70.155 + ipaddress: 23.38.125.24 - domain: a248.e.akamai.net - ipaddress: 23.2.13.89 + ipaddress: 23.35.104.20 - domain: a248.e.akamai.net - ipaddress: 23.220.162.153 + ipaddress: 96.16.55.92 - domain: a248.e.akamai.net - ipaddress: 23.222.28.78 + ipaddress: 23.35.104.136 - domain: a248.e.akamai.net - ipaddress: 23.47.48.51 + ipaddress: 23.193.186.50 - domain: a248.e.akamai.net - ipaddress: 23.38.189.159 + ipaddress: 23.47.51.35 - domain: a248.e.akamai.net - ipaddress: 23.47.48.61 + ipaddress: 23.202.34.159 - domain: a248.e.akamai.net - ipaddress: 23.2.13.83 + ipaddress: 23.38.189.144 - domain: a248.e.akamai.net - ipaddress: 23.55.178.116 + ipaddress: 23.222.28.27 - domain: a248.e.akamai.net - ipaddress: 23.67.75.81 + ipaddress: 23.44.5.221 - domain: a248.e.akamai.net - ipaddress: 23.202.34.150 + ipaddress: 23.44.4.236 - domain: a248.e.akamai.net - ipaddress: 23.48.149.6 + ipaddress: 23.48.23.137 - domain: a248.e.akamai.net - ipaddress: 23.55.110.152 + ipaddress: 23.35.105.22 - domain: a248.e.akamai.net - ipaddress: 92.122.244.40 + ipaddress: 23.202.34.133 - domain: a248.e.akamai.net - ipaddress: 2.19.204.184 + ipaddress: 23.222.28.142 - domain: a248.e.akamai.net - ipaddress: 92.122.244.8 + ipaddress: 104.97.85.24 - domain: a248.e.akamai.net - ipaddress: 184.24.77.168 + ipaddress: 23.56.3.40 - domain: a248.e.akamai.net - ipaddress: 23.202.35.70 + ipaddress: 23.47.50.58 - domain: a248.e.akamai.net - ipaddress: 23.47.51.57 + ipaddress: 23.193.96.128 - domain: a248.e.akamai.net - ipaddress: 104.117.247.173 + ipaddress: 23.193.186.47 - domain: a248.e.akamai.net - ipaddress: 184.50.87.9 + ipaddress: 184.150.49.131 - domain: a248.e.akamai.net - ipaddress: 23.220.162.133 + ipaddress: 23.72.249.16 - domain: a248.e.akamai.net - ipaddress: 23.55.51.20 + ipaddress: 23.49.104.54 - domain: a248.e.akamai.net - ipaddress: 104.117.247.21 + ipaddress: 104.97.85.160 - domain: a248.e.akamai.net - ipaddress: 23.55.110.179 + ipaddress: 23.53.42.48 - domain: a248.e.akamai.net - ipaddress: 2.16.103.203 + ipaddress: 23.35.104.159 - domain: a248.e.akamai.net - ipaddress: 23.202.35.214 + ipaddress: 96.16.55.214 - domain: a248.e.akamai.net - ipaddress: 23.47.52.28 + ipaddress: 104.123.71.91 - domain: a248.e.akamai.net - ipaddress: 2.16.238.154 + ipaddress: 23.35.104.178 - domain: a248.e.akamai.net - ipaddress: 104.117.247.181 + ipaddress: 23.60.96.218 - domain: a248.e.akamai.net - ipaddress: 2.16.103.120 + ipaddress: 23.202.35.21 - domain: a248.e.akamai.net - ipaddress: 104.117.247.169 + ipaddress: 23.193.96.96 - domain: a248.e.akamai.net - ipaddress: 2.16.238.17 + ipaddress: 23.2.16.212 - domain: a248.e.akamai.net - ipaddress: 23.202.35.205 + ipaddress: 23.202.35.80 - domain: a248.e.akamai.net - ipaddress: 23.47.52.85 + ipaddress: 23.2.16.18 - domain: a248.e.akamai.net - ipaddress: 23.202.35.144 + ipaddress: 23.56.3.91 - domain: a248.e.akamai.net - ipaddress: 23.47.48.110 + ipaddress: 2.16.103.40 - domain: a248.e.akamai.net - ipaddress: 23.55.51.13 + ipaddress: 23.38.189.78 - domain: a248.e.akamai.net - ipaddress: 23.202.34.240 + ipaddress: 184.25.50.93 - domain: a248.e.akamai.net - ipaddress: 23.55.110.211 + ipaddress: 23.220.162.6 - domain: a248.e.akamai.net - ipaddress: 184.150.49.22 + ipaddress: 23.202.34.244 - domain: a248.e.akamai.net - ipaddress: 104.91.68.138 + ipaddress: 184.25.50.60 - domain: a248.e.akamai.net - ipaddress: 125.56.219.16 + ipaddress: 23.56.3.126 - domain: a248.e.akamai.net - ipaddress: 23.202.34.68 + ipaddress: 23.202.35.64 - domain: a248.e.akamai.net - ipaddress: 23.222.28.114 + ipaddress: 23.35.104.61 - domain: a248.e.akamai.net - ipaddress: 23.38.189.69 + ipaddress: 23.49.104.49 - domain: a248.e.akamai.net - ipaddress: 23.216.77.152 + ipaddress: 23.192.223.104 - domain: a248.e.akamai.net - ipaddress: 23.48.149.60 + ipaddress: 23.60.96.167 - domain: a248.e.akamai.net - ipaddress: 23.204.139.132 + ipaddress: 23.56.3.32 - domain: a248.e.akamai.net - ipaddress: 23.2.13.184 + ipaddress: 2.16.103.111 - domain: a248.e.akamai.net - ipaddress: 125.56.219.24 + ipaddress: 23.2.16.68 - domain: a248.e.akamai.net - ipaddress: 23.35.105.59 + ipaddress: 184.150.58.157 - domain: a248.e.akamai.net - ipaddress: 184.24.77.137 + ipaddress: 23.192.223.100 - domain: a248.e.akamai.net - ipaddress: 23.2.16.198 + ipaddress: 23.55.161.172 - domain: a248.e.akamai.net - ipaddress: 23.50.131.199 + ipaddress: 23.35.104.151 - domain: a248.e.akamai.net - ipaddress: 184.150.154.6 + ipaddress: 23.0.174.221 - domain: a248.e.akamai.net - ipaddress: 23.2.13.74 + ipaddress: 104.97.85.38 - domain: a248.e.akamai.net - ipaddress: 23.47.50.31 + ipaddress: 104.84.150.164 - domain: a248.e.akamai.net - ipaddress: 23.202.35.106 + ipaddress: 23.220.162.15 - domain: a248.e.akamai.net - ipaddress: 23.47.50.23 + ipaddress: 23.49.60.42 - domain: a248.e.akamai.net - ipaddress: 23.205.214.24 + ipaddress: 23.44.5.239 - domain: a248.e.akamai.net - ipaddress: 23.47.52.124 + ipaddress: 23.222.28.164 - domain: a248.e.akamai.net - ipaddress: 104.117.247.186 + ipaddress: 23.49.104.153 - domain: a248.e.akamai.net - ipaddress: 23.48.149.152 + ipaddress: 2.16.103.120 - domain: a248.e.akamai.net - ipaddress: 23.215.55.141 + ipaddress: 23.212.62.73 - domain: a248.e.akamai.net - ipaddress: 184.150.42.33 + ipaddress: 23.220.161.7 - domain: a248.e.akamai.net - ipaddress: 104.117.247.113 + ipaddress: 23.0.174.16 - domain: a248.e.akamai.net - ipaddress: 23.55.178.140 + ipaddress: 23.53.126.75 - domain: a248.e.akamai.net - ipaddress: 23.38.189.155 + ipaddress: 184.150.49.39 - domain: a248.e.akamai.net - ipaddress: 23.55.178.205 + ipaddress: 23.53.126.65 - domain: a248.e.akamai.net - ipaddress: 23.204.139.219 + ipaddress: 23.222.28.77 - domain: a248.e.akamai.net - ipaddress: 23.220.70.51 + ipaddress: 23.56.3.84 - domain: a248.e.akamai.net - ipaddress: 23.48.149.154 + ipaddress: 184.25.51.72 - domain: a248.e.akamai.net - ipaddress: 23.220.70.35 + ipaddress: 23.35.105.184 - domain: a248.e.akamai.net - ipaddress: 23.47.49.161 + ipaddress: 23.44.5.216 - domain: a248.e.akamai.net - ipaddress: 23.2.13.92 + ipaddress: 23.53.126.59 - domain: a248.e.akamai.net - ipaddress: 23.67.75.126 + ipaddress: 23.47.50.81 - domain: a248.e.akamai.net - ipaddress: 2.16.10.165 + ipaddress: 104.123.71.87 - domain: a248.e.akamai.net - ipaddress: 23.47.48.171 + ipaddress: 23.35.105.115 - domain: a248.e.akamai.net - ipaddress: 23.47.52.89 + ipaddress: 23.52.128.93 - domain: a248.e.akamai.net - ipaddress: 23.38.189.215 + ipaddress: 23.53.126.196 - domain: a248.e.akamai.net - ipaddress: 184.150.42.145 + ipaddress: 23.53.126.27 - domain: a248.e.akamai.net - ipaddress: 23.55.110.139 + ipaddress: 23.35.105.167 - domain: a248.e.akamai.net - ipaddress: 23.47.48.217 + ipaddress: 23.222.28.141 - domain: a248.e.akamai.net - ipaddress: 23.202.35.248 + ipaddress: 23.47.51.72 - domain: a248.e.akamai.net - ipaddress: 184.150.49.100 + ipaddress: 23.38.189.215 - domain: a248.e.akamai.net - ipaddress: 23.38.189.232 + ipaddress: 23.49.104.148 - domain: a248.e.akamai.net - ipaddress: 23.47.50.19 + ipaddress: 23.35.104.113 - domain: a248.e.akamai.net - ipaddress: 23.220.70.71 + ipaddress: 23.192.223.90 - domain: a248.e.akamai.net - ipaddress: 184.150.49.39 + ipaddress: 184.25.51.51 - domain: a248.e.akamai.net - ipaddress: 104.117.247.82 + ipaddress: 23.53.126.200 - domain: a248.e.akamai.net - ipaddress: 2.19.204.17 + ipaddress: 184.150.49.92 - domain: a248.e.akamai.net - ipaddress: 2.16.154.181 + ipaddress: 23.220.161.8 - domain: a248.e.akamai.net - ipaddress: 23.202.35.210 + ipaddress: 23.214.95.202 - domain: a248.e.akamai.net - ipaddress: 23.47.52.49 + ipaddress: 23.47.51.117 - domain: a248.e.akamai.net - ipaddress: 184.24.77.39 + ipaddress: 23.49.60.193 - domain: a248.e.akamai.net - ipaddress: 23.67.75.241 + ipaddress: 23.49.104.179 - domain: a248.e.akamai.net - ipaddress: 23.55.178.133 + ipaddress: 23.62.212.15 - domain: a248.e.akamai.net - ipaddress: 104.91.68.97 + ipaddress: 23.220.162.132 - domain: a248.e.akamai.net - ipaddress: 23.47.52.81 + ipaddress: 23.193.96.202 - domain: a248.e.akamai.net - ipaddress: 184.24.77.141 + ipaddress: 23.2.16.123 - domain: a248.e.akamai.net - ipaddress: 23.220.162.141 + ipaddress: 104.123.71.73 - domain: a248.e.akamai.net - ipaddress: 23.202.34.12 + ipaddress: 184.150.58.138 - domain: a248.e.akamai.net - ipaddress: 104.91.68.55 + ipaddress: 23.197.49.32 - domain: a248.e.akamai.net - ipaddress: 23.192.228.25 + ipaddress: 23.52.128.232 - domain: a248.e.akamai.net - ipaddress: 23.2.16.226 + ipaddress: 23.222.28.52 - domain: a248.e.akamai.net - ipaddress: 23.2.16.114 + ipaddress: 23.53.42.7 - domain: a248.e.akamai.net - ipaddress: 23.222.28.118 + ipaddress: 23.193.96.70 - domain: a248.e.akamai.net - ipaddress: 184.150.58.155 + ipaddress: 23.56.3.8 - domain: a248.e.akamai.net - ipaddress: 23.55.51.73 + ipaddress: 23.55.161.52 - domain: a248.e.akamai.net - ipaddress: 23.192.228.20 + ipaddress: 23.197.49.39 - domain: a248.e.akamai.net - ipaddress: 23.220.84.37 + ipaddress: 23.202.35.224 - domain: a248.e.akamai.net - ipaddress: 23.55.110.27 + ipaddress: 23.222.28.42 - domain: a248.e.akamai.net - ipaddress: 23.47.52.122 + ipaddress: 23.193.186.14 - domain: a248.e.akamai.net - ipaddress: 184.150.154.64 + ipaddress: 23.38.189.226 - domain: a248.e.akamai.net - ipaddress: 2.16.238.147 + ipaddress: 23.222.28.117 - domain: a248.e.akamai.net - ipaddress: 23.55.178.182 + ipaddress: 23.202.34.20 - domain: a248.e.akamai.net - ipaddress: 2.16.238.137 + ipaddress: 23.49.60.54 - domain: a248.e.akamai.net - ipaddress: 23.195.90.65 + ipaddress: 23.52.128.240 - domain: a248.e.akamai.net - ipaddress: 2.19.204.175 + ipaddress: 23.52.128.241 - domain: a248.e.akamai.net - ipaddress: 23.49.104.23 + ipaddress: 23.52.128.234 - domain: a248.e.akamai.net - ipaddress: 23.38.189.165 + ipaddress: 23.72.249.152 - domain: a248.e.akamai.net - ipaddress: 23.47.51.74 + ipaddress: 96.16.55.139 - domain: a248.e.akamai.net - ipaddress: 2.19.204.152 + ipaddress: 23.2.16.197 - domain: a248.e.akamai.net - ipaddress: 23.47.51.120 + ipaddress: 23.53.126.9 - domain: a248.e.akamai.net - ipaddress: 96.17.72.167 + ipaddress: 23.53.42.55 - domain: a248.e.akamai.net - ipaddress: 23.49.104.173 + ipaddress: 23.35.104.149 - domain: a248.e.akamai.net - ipaddress: 23.47.48.163 + ipaddress: 23.2.16.109 - domain: a248.e.akamai.net - ipaddress: 23.47.50.124 + ipaddress: 23.193.96.186 - domain: a248.e.akamai.net - ipaddress: 96.17.72.39 + ipaddress: 104.97.85.185 - domain: a248.e.akamai.net - ipaddress: 23.195.90.56 + ipaddress: 23.38.189.133 - domain: a248.e.akamai.net - ipaddress: 184.150.154.105 + ipaddress: 23.202.35.127 - domain: a248.e.akamai.net - ipaddress: 104.91.68.214 + ipaddress: 23.192.223.21 - domain: a248.e.akamai.net - ipaddress: 184.150.42.139 + ipaddress: 23.53.126.138 - domain: a248.e.akamai.net - ipaddress: 23.195.90.40 + ipaddress: 23.193.182.139 - domain: a248.e.akamai.net - ipaddress: 2.19.126.88 + ipaddress: 88.221.132.104 - domain: a248.e.akamai.net - ipaddress: 23.55.51.84 + ipaddress: 184.150.49.85 - domain: a248.e.akamai.net - ipaddress: 2.16.238.134 + ipaddress: 23.35.105.60 - domain: a248.e.akamai.net - ipaddress: 184.150.49.151 + ipaddress: 23.38.189.14 - domain: a248.e.akamai.net - ipaddress: 23.35.105.150 + ipaddress: 23.38.125.203 - domain: a248.e.akamai.net - ipaddress: 23.220.70.135 + ipaddress: 23.47.50.154 - domain: a248.e.akamai.net - ipaddress: 2.16.103.24 + ipaddress: 23.202.35.182 - domain: a248.e.akamai.net - ipaddress: 23.35.105.113 + ipaddress: 2.16.103.76 - domain: a248.e.akamai.net - ipaddress: 184.150.42.177 + ipaddress: 23.10.249.146 - domain: a248.e.akamai.net - ipaddress: 23.47.48.114 + ipaddress: 23.49.104.48 - domain: a248.e.akamai.net - ipaddress: 23.2.16.87 + ipaddress: 184.25.50.102 - domain: a248.e.akamai.net - ipaddress: 23.67.75.188 + ipaddress: 184.24.77.42 - domain: a248.e.akamai.net - ipaddress: 23.47.50.250 + ipaddress: 23.38.189.251 - domain: a248.e.akamai.net - ipaddress: 184.150.42.32 + ipaddress: 23.197.49.19 - domain: a248.e.akamai.net - ipaddress: 104.117.247.73 + ipaddress: 184.25.50.134 - domain: a248.e.akamai.net - ipaddress: 23.215.55.144 + ipaddress: 184.150.58.132 - domain: a248.e.akamai.net - ipaddress: 184.150.49.44 + ipaddress: 23.47.50.168 - domain: a248.e.akamai.net - ipaddress: 184.150.154.114 + ipaddress: 23.47.50.243 - domain: a248.e.akamai.net - ipaddress: 184.150.49.68 + ipaddress: 184.25.50.172 - domain: a248.e.akamai.net - ipaddress: 2.19.204.173 + ipaddress: 184.24.77.65 - domain: a248.e.akamai.net - ipaddress: 23.2.16.63 + ipaddress: 23.52.128.39 - domain: a248.e.akamai.net - ipaddress: 96.17.72.161 + ipaddress: 23.208.31.43 - domain: a248.e.akamai.net - ipaddress: 23.48.149.192 + ipaddress: 23.48.23.158 - domain: a248.e.akamai.net - ipaddress: 23.220.70.44 + ipaddress: 23.47.50.186 - domain: a248.e.akamai.net - ipaddress: 23.192.228.71 + ipaddress: 184.150.49.154 - domain: a248.e.akamai.net - ipaddress: 2.16.103.82 + ipaddress: 23.49.60.145 - domain: a248.e.akamai.net - ipaddress: 23.33.126.141 + ipaddress: 23.47.50.181 - domain: a248.e.akamai.net - ipaddress: 23.192.228.76 + ipaddress: 184.150.49.62 - domain: a248.e.akamai.net - ipaddress: 23.47.48.172 + ipaddress: 104.97.85.59 - domain: a248.e.akamai.net - ipaddress: 23.47.48.145 + ipaddress: 23.60.96.206 - domain: a248.e.akamai.net - ipaddress: 2.16.103.89 + ipaddress: 23.222.28.98 - domain: a248.e.akamai.net - ipaddress: 23.55.178.121 + ipaddress: 23.44.4.230 - domain: a248.e.akamai.net - ipaddress: 23.47.49.225 + ipaddress: 23.193.182.140 - domain: a248.e.akamai.net - ipaddress: 23.38.189.241 + ipaddress: 23.35.105.175 - domain: a248.e.akamai.net - ipaddress: 104.117.247.161 + ipaddress: 23.220.70.143 - domain: a248.e.akamai.net - ipaddress: 23.48.149.23 + ipaddress: 23.2.16.10 - domain: a248.e.akamai.net - ipaddress: 23.55.178.66 + ipaddress: 23.214.95.200 - domain: a248.e.akamai.net - ipaddress: 2.16.154.66 + ipaddress: 23.56.3.83 - domain: a248.e.akamai.net - ipaddress: 23.47.48.242 + ipaddress: 184.24.77.175 - domain: a248.e.akamai.net - ipaddress: 184.24.77.158 + ipaddress: 23.53.126.166 - domain: a248.e.akamai.net - ipaddress: 23.217.136.187 + ipaddress: 23.38.189.10 - domain: a248.e.akamai.net - ipaddress: 23.2.16.68 + ipaddress: 23.47.50.160 - domain: a248.e.akamai.net - ipaddress: 184.150.49.98 + ipaddress: 23.35.105.170 - domain: a248.e.akamai.net - ipaddress: 23.48.149.172 + ipaddress: 184.24.77.60 - domain: a248.e.akamai.net - ipaddress: 23.50.131.214 + ipaddress: 23.62.212.104 - domain: a248.e.akamai.net - ipaddress: 23.205.214.40 + ipaddress: 184.25.50.159 - domain: a248.e.akamai.net - ipaddress: 23.222.28.5 + ipaddress: 104.97.85.179 - domain: a248.e.akamai.net - ipaddress: 104.117.247.120 + ipaddress: 23.202.35.124 - domain: a248.e.akamai.net - ipaddress: 23.202.35.47 + ipaddress: 104.97.85.146 - domain: a248.e.akamai.net - ipaddress: 23.35.105.114 + ipaddress: 23.202.35.97 - domain: a248.e.akamai.net - ipaddress: 23.55.110.133 + ipaddress: 96.16.55.168 - domain: a248.e.akamai.net - ipaddress: 23.49.104.214 + ipaddress: 23.202.35.164 - domain: a248.e.akamai.net - ipaddress: 23.47.49.212 + ipaddress: 23.197.49.18 - domain: a248.e.akamai.net - ipaddress: 184.150.49.138 + ipaddress: 23.193.186.48 - domain: a248.e.akamai.net - ipaddress: 23.202.35.118 + ipaddress: 23.49.104.167 - domain: a248.e.akamai.net - ipaddress: 23.47.49.15 + ipaddress: 96.16.55.175 - domain: a248.e.akamai.net - ipaddress: 104.117.247.144 + ipaddress: 23.55.161.176 - domain: a248.e.akamai.net - ipaddress: 2.16.154.146 + ipaddress: 23.47.50.164 - domain: a248.e.akamai.net - ipaddress: 23.202.34.55 + ipaddress: 23.38.125.15 - domain: a248.e.akamai.net - ipaddress: 23.2.16.115 + ipaddress: 23.49.60.113 - domain: a248.e.akamai.net - ipaddress: 23.202.35.249 + ipaddress: 23.55.161.133 - domain: a248.e.akamai.net - ipaddress: 23.47.52.15 + ipaddress: 23.49.60.100 - domain: a248.e.akamai.net - ipaddress: 23.47.48.15 + ipaddress: 23.72.249.6 - domain: a248.e.akamai.net - ipaddress: 23.47.50.34 + ipaddress: 23.220.162.148 - domain: a248.e.akamai.net - ipaddress: 23.202.35.215 + ipaddress: 23.60.96.203 - domain: a248.e.akamai.net - ipaddress: 23.50.131.30 + ipaddress: 23.44.5.222 - domain: a248.e.akamai.net - ipaddress: 23.47.51.56 + ipaddress: 23.10.249.13 - domain: a248.e.akamai.net - ipaddress: 23.222.28.61 + ipaddress: 23.222.28.4 - domain: a248.e.akamai.net - ipaddress: 23.192.228.86 + ipaddress: 23.44.4.238 - domain: a248.e.akamai.net - ipaddress: 23.47.51.51 + ipaddress: 23.193.182.14 - domain: a248.e.akamai.net - ipaddress: 23.49.104.102 + ipaddress: 104.97.85.178 - domain: a248.e.akamai.net - ipaddress: 104.117.247.166 + ipaddress: 23.208.31.182 - domain: a248.e.akamai.net - ipaddress: 23.47.48.142 + ipaddress: 23.38.189.150 - domain: a248.e.akamai.net - ipaddress: 2.16.103.209 + ipaddress: 23.202.35.33 - domain: a248.e.akamai.net - ipaddress: 96.17.72.159 + ipaddress: 23.2.16.87 - domain: a248.e.akamai.net - ipaddress: 23.47.48.241 + ipaddress: 23.56.3.235 - domain: a248.e.akamai.net - ipaddress: 23.47.51.121 + ipaddress: 23.193.96.123 - domain: a248.e.akamai.net - ipaddress: 23.67.75.202 + ipaddress: 23.49.60.37 - domain: a248.e.akamai.net - ipaddress: 104.117.247.158 + ipaddress: 96.16.55.220 - domain: a248.e.akamai.net - ipaddress: 23.49.104.179 + ipaddress: 23.212.62.90 - domain: a248.e.akamai.net - ipaddress: 23.47.51.26 + ipaddress: 23.56.3.99 - domain: a248.e.akamai.net - ipaddress: 23.47.51.53 + ipaddress: 23.222.28.168 - domain: a248.e.akamai.net - ipaddress: 23.55.51.93 + ipaddress: 96.16.55.80 - domain: a248.e.akamai.net - ipaddress: 88.221.132.19 + ipaddress: 23.222.28.177 - domain: a248.e.akamai.net - ipaddress: 23.220.84.25 + ipaddress: 23.220.161.16 - domain: a248.e.akamai.net - ipaddress: 184.150.49.41 + ipaddress: 23.53.126.177 - domain: a248.e.akamai.net - ipaddress: 23.47.48.205 + ipaddress: 23.202.35.249 - domain: a248.e.akamai.net - ipaddress: 23.38.189.179 + ipaddress: 23.220.162.71 - domain: a248.e.akamai.net - ipaddress: 92.122.244.32 + ipaddress: 96.16.55.143 - domain: a248.e.akamai.net - ipaddress: 23.49.104.99 + ipaddress: 184.150.49.42 - domain: a248.e.akamai.net - ipaddress: 184.24.77.46 + ipaddress: 23.47.50.30 - domain: a248.e.akamai.net - ipaddress: 23.202.35.82 + ipaddress: 23.197.49.173 - domain: a248.e.akamai.net - ipaddress: 23.202.35.29 + ipaddress: 23.38.189.35 - domain: a248.e.akamai.net - ipaddress: 125.56.219.226 + ipaddress: 23.202.34.153 - domain: a248.e.akamai.net - ipaddress: 23.222.28.174 + ipaddress: 104.123.71.4 - domain: a248.e.akamai.net - ipaddress: 2.16.238.91 + ipaddress: 184.24.77.19 - domain: a248.e.akamai.net - ipaddress: 23.50.131.95 + ipaddress: 23.193.96.121 - domain: a248.e.akamai.net - ipaddress: 184.150.49.77 + ipaddress: 23.48.23.173 - domain: a248.e.akamai.net - ipaddress: 2.19.126.222 + ipaddress: 23.47.50.118 - domain: a248.e.akamai.net - ipaddress: 96.17.72.14 + ipaddress: 23.192.223.202 - domain: a248.e.akamai.net - ipaddress: 184.24.77.48 + ipaddress: 23.35.104.132 - domain: a248.e.akamai.net - ipaddress: 23.55.178.106 + ipaddress: 23.60.96.106 - domain: a248.e.akamai.net - ipaddress: 23.47.51.18 + ipaddress: 23.202.35.118 - domain: a248.e.akamai.net - ipaddress: 2.16.238.78 + ipaddress: 184.24.77.67 - domain: a248.e.akamai.net - ipaddress: 23.202.35.237 + ipaddress: 23.48.23.189 - domain: a248.e.akamai.net - ipaddress: 23.217.136.150 + ipaddress: 2.16.103.208 - domain: a248.e.akamai.net - ipaddress: 23.220.70.50 + ipaddress: 23.35.104.81 - domain: a248.e.akamai.net - ipaddress: 23.55.178.40 + ipaddress: 23.192.223.107 - domain: a248.e.akamai.net - ipaddress: 23.49.104.143 + ipaddress: 23.192.223.121 - domain: a248.e.akamai.net - ipaddress: 23.35.105.120 + ipaddress: 23.47.50.244 - domain: a248.e.akamai.net - ipaddress: 23.217.136.137 + ipaddress: 92.122.244.10 - domain: a248.e.akamai.net - ipaddress: 23.204.139.17 + ipaddress: 23.60.96.209 - domain: a248.e.akamai.net - ipaddress: 23.192.228.85 + ipaddress: 23.56.3.225 - domain: a248.e.akamai.net - ipaddress: 23.217.136.205 + ipaddress: 23.193.182.30 - domain: a248.e.akamai.net - ipaddress: 96.17.72.58 + ipaddress: 23.44.5.194 - domain: a248.e.akamai.net - ipaddress: 96.17.72.24 + ipaddress: 23.49.104.104 - domain: a248.e.akamai.net - ipaddress: 2.19.204.174 + ipaddress: 23.56.3.44 - domain: a248.e.akamai.net - ipaddress: 184.150.49.101 + ipaddress: 23.197.49.57 - domain: a248.e.akamai.net - ipaddress: 23.47.48.121 + ipaddress: 184.25.50.47 - domain: a248.e.akamai.net - ipaddress: 23.38.189.92 + ipaddress: 184.25.51.122 - domain: a248.e.akamai.net - ipaddress: 184.150.49.49 + ipaddress: 23.35.104.166 - domain: a248.e.akamai.net - ipaddress: 23.202.34.30 + ipaddress: 23.2.16.4 - domain: a248.e.akamai.net - ipaddress: 96.17.72.22 + ipaddress: 96.16.55.166 - domain: a248.e.akamai.net - ipaddress: 23.47.52.137 + ipaddress: 23.222.28.53 - domain: a248.e.akamai.net - ipaddress: 184.150.154.107 + ipaddress: 23.2.16.83 - domain: a248.e.akamai.net - ipaddress: 23.220.84.31 + ipaddress: 92.122.244.28 - domain: a248.e.akamai.net - ipaddress: 23.62.46.120 + ipaddress: 184.25.51.92 - domain: a248.e.akamai.net - ipaddress: 23.202.35.226 + ipaddress: 23.44.4.209 - domain: a248.e.akamai.net - ipaddress: 23.38.189.145 + ipaddress: 184.24.77.47 - domain: a248.e.akamai.net - ipaddress: 23.55.178.16 + ipaddress: 23.55.161.200 - domain: a248.e.akamai.net - ipaddress: 23.35.105.177 + ipaddress: 23.60.96.198 - domain: a248.e.akamai.net - ipaddress: 96.17.72.71 + ipaddress: 23.55.161.29 - domain: a248.e.akamai.net - ipaddress: 23.2.16.55 + ipaddress: 23.49.60.87 - domain: a248.e.akamai.net - ipaddress: 23.67.75.215 + ipaddress: 23.55.161.69 - domain: a248.e.akamai.net - ipaddress: 184.50.87.26 + ipaddress: 23.193.96.201 - domain: a248.e.akamai.net - ipaddress: 23.220.70.18 + ipaddress: 23.193.96.80 - domain: a248.e.akamai.net - ipaddress: 23.48.23.147 + ipaddress: 23.222.28.150 - domain: a248.e.akamai.net - ipaddress: 23.55.178.84 + ipaddress: 23.47.50.250 - domain: a248.e.akamai.net - ipaddress: 23.204.139.15 + ipaddress: 23.197.49.141 - domain: a248.e.akamai.net - ipaddress: 23.202.35.235 + ipaddress: 23.56.3.200 - domain: a248.e.akamai.net - ipaddress: 2.16.10.219 + ipaddress: 23.56.3.95 - domain: a248.e.akamai.net - ipaddress: 92.122.244.35 + ipaddress: 23.49.104.2 - domain: a248.e.akamai.net - ipaddress: 23.47.49.9 + ipaddress: 23.193.96.106 - domain: a248.e.akamai.net - ipaddress: 23.55.110.28 + ipaddress: 96.16.55.72 - domain: a248.e.akamai.net - ipaddress: 104.91.68.69 + ipaddress: 23.202.34.89 - domain: a248.e.akamai.net - ipaddress: 23.47.50.168 + ipaddress: 23.49.60.75 - domain: a248.e.akamai.net - ipaddress: 23.220.162.13 + ipaddress: 23.62.212.11 - domain: a248.e.akamai.net - ipaddress: 23.222.28.240 + ipaddress: 23.222.28.176 - domain: a248.e.akamai.net - ipaddress: 104.91.68.222 + ipaddress: 23.38.189.205 - domain: a248.e.akamai.net - ipaddress: 23.50.131.221 + ipaddress: 23.53.42.63 - domain: a248.e.akamai.net - ipaddress: 23.195.90.79 + ipaddress: 23.44.5.210 - domain: a248.e.akamai.net - ipaddress: 96.17.72.69 + ipaddress: 184.24.77.145 - domain: a248.e.akamai.net - ipaddress: 104.91.68.58 + ipaddress: 23.52.128.235 - domain: a248.e.akamai.net - ipaddress: 2.16.154.52 + ipaddress: 23.62.212.109 - domain: a248.e.akamai.net - ipaddress: 104.91.68.105 + ipaddress: 23.53.126.183 - domain: a248.e.akamai.net - ipaddress: 184.150.42.164 + ipaddress: 96.16.55.30 - domain: a248.e.akamai.net - ipaddress: 23.195.90.12 + ipaddress: 23.35.104.89 - domain: a248.e.akamai.net - ipaddress: 23.38.189.156 + ipaddress: 184.25.51.107 - domain: a248.e.akamai.net - ipaddress: 23.2.16.228 + ipaddress: 23.38.189.147 - domain: a248.e.akamai.net - ipaddress: 23.55.110.61 + ipaddress: 23.2.16.86 - domain: a248.e.akamai.net - ipaddress: 23.220.70.40 + ipaddress: 23.197.49.31 - domain: a248.e.akamai.net - ipaddress: 184.24.77.80 + ipaddress: 23.220.162.12 - domain: a248.e.akamai.net - ipaddress: 104.117.247.70 + ipaddress: 104.123.71.32 - domain: a248.e.akamai.net - ipaddress: 23.220.162.12 + ipaddress: 23.35.104.25 - domain: a248.e.akamai.net - ipaddress: 23.222.28.238 + ipaddress: 23.44.5.200 - domain: a248.e.akamai.net - ipaddress: 184.150.49.26 + ipaddress: 23.47.50.167 - domain: a248.e.akamai.net - ipaddress: 96.17.72.27 + ipaddress: 23.48.23.146 - domain: a248.e.akamai.net - ipaddress: 104.117.247.164 + ipaddress: 23.72.249.41 - domain: a248.e.akamai.net - ipaddress: 23.55.110.138 + ipaddress: 23.0.174.248 - domain: a248.e.akamai.net - ipaddress: 23.49.104.18 + ipaddress: 96.16.55.31 - domain: a248.e.akamai.net - ipaddress: 2.19.126.11 + ipaddress: 23.55.161.83 - domain: a248.e.akamai.net - ipaddress: 23.47.48.108 + ipaddress: 23.53.126.143 - domain: a248.e.akamai.net - ipaddress: 2.16.238.203 + ipaddress: 184.24.77.165 - domain: a248.e.akamai.net - ipaddress: 23.49.104.6 + ipaddress: 23.193.186.7 - domain: a248.e.akamai.net - ipaddress: 23.47.49.136 + ipaddress: 23.220.161.26 - domain: a248.e.akamai.net - ipaddress: 23.48.149.16 + ipaddress: 23.192.223.15 - domain: a248.e.akamai.net - ipaddress: 96.17.72.20 + ipaddress: 23.202.35.93 - domain: a248.e.akamai.net - ipaddress: 23.47.49.252 + ipaddress: 184.25.50.180 - domain: a248.e.akamai.net - ipaddress: 104.117.247.121 + ipaddress: 184.25.50.254 - domain: a248.e.akamai.net - ipaddress: 23.2.13.40 + ipaddress: 23.53.126.180 - domain: a248.e.akamai.net - ipaddress: 23.220.162.18 + ipaddress: 23.220.161.23 - domain: a248.e.akamai.net - ipaddress: 23.202.35.18 + ipaddress: 23.47.51.36 - domain: a248.e.akamai.net - ipaddress: 23.47.49.213 + ipaddress: 23.193.182.138 - domain: a248.e.akamai.net - ipaddress: 23.55.178.124 + ipaddress: 23.47.51.14 - domain: a248.e.akamai.net - ipaddress: 23.47.50.209 + ipaddress: 104.97.85.9 - domain: a248.e.akamai.net - ipaddress: 23.220.70.150 + ipaddress: 23.208.31.136 - domain: a248.e.akamai.net - ipaddress: 104.117.247.8 + ipaddress: 23.55.161.67 - domain: a248.e.akamai.net - ipaddress: 184.24.77.145 + ipaddress: 23.47.50.246 - domain: a248.e.akamai.net - ipaddress: 2.19.204.135 + ipaddress: 23.10.249.30 - domain: a248.e.akamai.net - ipaddress: 23.202.34.140 + ipaddress: 184.24.77.69 - domain: a248.e.akamai.net - ipaddress: 23.220.70.111 + ipaddress: 23.193.96.43 - domain: a248.e.akamai.net - ipaddress: 23.47.51.109 + ipaddress: 23.47.50.42 - domain: a248.e.akamai.net - ipaddress: 23.55.51.136 + ipaddress: 23.208.31.187 - domain: a248.e.akamai.net - ipaddress: 23.222.28.183 + ipaddress: 184.25.51.57 - domain: a248.e.akamai.net - ipaddress: 23.38.189.237 + ipaddress: 23.222.28.76 - domain: a248.e.akamai.net - ipaddress: 23.220.70.82 + ipaddress: 23.49.60.58 - domain: a248.e.akamai.net - ipaddress: 184.50.87.32 + ipaddress: 23.49.104.172 - domain: a248.e.akamai.net - ipaddress: 23.222.28.28 + ipaddress: 23.48.23.139 - domain: a248.e.akamai.net - ipaddress: 23.47.52.23 + ipaddress: 23.44.5.241 - domain: a248.e.akamai.net - ipaddress: 23.49.104.131 + ipaddress: 23.202.34.71 - domain: a248.e.akamai.net - ipaddress: 23.47.48.70 + ipaddress: 104.123.71.97 - domain: a248.e.akamai.net - ipaddress: 23.216.77.136 + ipaddress: 184.150.49.25 - domain: a248.e.akamai.net - ipaddress: 23.202.35.108 + ipaddress: 23.53.126.185 - domain: a248.e.akamai.net - ipaddress: 2.16.238.138 + ipaddress: 104.97.85.49 - domain: a248.e.akamai.net - ipaddress: 23.47.52.24 + ipaddress: 23.44.5.224 - domain: a248.e.akamai.net - ipaddress: 23.47.50.69 + ipaddress: 23.53.126.148 - domain: a248.e.akamai.net - ipaddress: 23.55.110.18 + ipaddress: 23.202.34.132 - domain: a248.e.akamai.net - ipaddress: 23.202.35.24 + ipaddress: 184.25.51.45 - domain: a248.e.akamai.net - ipaddress: 23.49.104.17 + ipaddress: 23.212.62.93 - domain: a248.e.akamai.net - ipaddress: 2.19.204.140 + ipaddress: 23.197.49.157 - domain: a248.e.akamai.net - ipaddress: 23.38.189.212 + ipaddress: 104.97.85.37 - domain: a248.e.akamai.net - ipaddress: 23.47.50.120 + ipaddress: 96.16.55.4 - domain: a248.e.akamai.net - ipaddress: 23.47.50.223 + ipaddress: 23.10.249.16 - domain: a248.e.akamai.net - ipaddress: 23.216.77.183 + ipaddress: 23.56.3.71 - domain: a248.e.akamai.net - ipaddress: 23.48.23.153 + ipaddress: 23.47.50.166 - domain: a248.e.akamai.net - ipaddress: 23.47.52.47 + ipaddress: 23.49.60.170 - domain: a248.e.akamai.net - ipaddress: 184.24.77.174 + ipaddress: 23.0.174.27 - domain: a248.e.akamai.net - ipaddress: 23.49.104.201 + ipaddress: 23.53.126.24 - domain: a248.e.akamai.net - ipaddress: 184.24.77.34 + ipaddress: 184.150.49.105 - domain: a248.e.akamai.net - ipaddress: 23.192.228.142 + ipaddress: 23.72.249.134 - domain: a248.e.akamai.net - ipaddress: 23.50.131.20 + ipaddress: 23.47.50.115 - domain: a248.e.akamai.net - ipaddress: 23.55.51.205 + ipaddress: 23.202.35.50 - domain: a248.e.akamai.net - ipaddress: 2.19.204.208 + ipaddress: 23.10.249.150 - domain: a248.e.akamai.net - ipaddress: 23.55.178.50 + ipaddress: 23.53.126.50 - domain: a248.e.akamai.net - ipaddress: 2.19.204.37 + ipaddress: 23.47.51.113 - domain: a248.e.akamai.net - ipaddress: 23.55.51.80 + ipaddress: 23.49.60.57 - domain: a248.e.akamai.net - ipaddress: 23.55.178.104 + ipaddress: 23.55.161.6 - domain: a248.e.akamai.net - ipaddress: 88.221.132.203 + ipaddress: 23.193.184.144 - domain: a248.e.akamai.net - ipaddress: 23.195.90.13 + ipaddress: 23.2.16.9 - domain: a248.e.akamai.net - ipaddress: 23.67.75.227 + ipaddress: 23.220.161.22 - domain: a248.e.akamai.net - ipaddress: 23.49.104.98 + ipaddress: 23.53.126.156 - domain: a248.e.akamai.net - ipaddress: 23.55.110.160 + ipaddress: 23.47.50.91 - domain: a248.e.akamai.net - ipaddress: 23.220.70.106 + ipaddress: 23.35.104.182 - domain: a248.e.akamai.net - ipaddress: 2.19.204.129 + ipaddress: 23.56.3.165 - domain: a248.e.akamai.net - ipaddress: 23.67.75.63 + ipaddress: 23.49.104.99 - domain: a248.e.akamai.net - ipaddress: 23.62.46.217 + ipaddress: 23.38.189.155 - domain: a248.e.akamai.net - ipaddress: 23.55.110.201 + ipaddress: 23.197.49.175 - domain: a248.e.akamai.net - ipaddress: 23.47.48.19 + ipaddress: 23.35.104.133 - domain: a248.e.akamai.net - ipaddress: 23.47.48.226 + ipaddress: 23.10.249.33 - domain: a248.e.akamai.net - ipaddress: 23.48.149.5 + ipaddress: 23.38.125.4 - domain: a248.e.akamai.net - ipaddress: 2.16.238.159 + ipaddress: 92.122.244.22 - domain: a248.e.akamai.net - ipaddress: 2.16.103.86 + ipaddress: 23.222.28.88 - domain: a248.e.akamai.net - ipaddress: 23.33.126.180 + ipaddress: 2.16.154.122 - domain: a248.e.akamai.net - ipaddress: 184.150.42.153 + ipaddress: 184.25.51.24 - domain: a248.e.akamai.net - ipaddress: 23.47.48.40 + ipaddress: 23.44.5.211 - domain: a248.e.akamai.net - ipaddress: 96.17.72.11 + ipaddress: 23.35.104.137 - domain: a248.e.akamai.net - ipaddress: 23.67.75.62 + ipaddress: 23.38.189.83 - domain: a248.e.akamai.net - ipaddress: 104.91.68.77 + ipaddress: 23.2.16.102 - domain: a248.e.akamai.net - ipaddress: 23.47.48.168 + ipaddress: 23.2.16.98 - domain: a248.e.akamai.net - ipaddress: 23.48.149.169 + ipaddress: 23.60.96.213 - domain: a248.e.akamai.net - ipaddress: 184.24.77.13 + ipaddress: 23.60.96.71 - domain: a248.e.akamai.net - ipaddress: 23.47.49.34 + ipaddress: 23.60.96.162 - domain: a248.e.akamai.net - ipaddress: 23.48.149.50 + ipaddress: 23.0.174.230 - domain: a248.e.akamai.net - ipaddress: 23.216.77.51 + ipaddress: 23.202.34.6 - domain: a248.e.akamai.net - ipaddress: 23.220.70.115 + ipaddress: 184.25.51.16 - domain: a248.e.akamai.net - ipaddress: 23.202.34.9 + ipaddress: 23.47.51.88 - domain: a248.e.akamai.net - ipaddress: 23.38.189.189 + ipaddress: 23.193.182.19 - domain: a248.e.akamai.net - ipaddress: 23.48.23.178 + ipaddress: 23.202.34.77 - domain: a248.e.akamai.net - ipaddress: 23.222.28.37 + ipaddress: 23.49.104.136 - domain: a248.e.akamai.net - ipaddress: 23.33.184.231 + ipaddress: 23.53.126.68 - domain: a248.e.akamai.net - ipaddress: 184.24.77.25 + ipaddress: 23.33.184.252 - domain: a248.e.akamai.net - ipaddress: 96.17.72.15 + ipaddress: 23.55.161.198 - domain: a248.e.akamai.net - ipaddress: 23.222.28.146 + ipaddress: 23.2.16.119 - domain: a248.e.akamai.net - ipaddress: 23.48.149.185 + ipaddress: 23.193.96.46 - domain: a248.e.akamai.net - ipaddress: 104.91.68.5 + ipaddress: 23.52.128.4 - domain: a248.e.akamai.net - ipaddress: 23.2.13.35 + ipaddress: 184.24.77.149 - domain: a248.e.akamai.net - ipaddress: 23.47.52.133 + ipaddress: 23.56.3.10 - domain: a248.e.akamai.net - ipaddress: 88.221.132.42 + ipaddress: 23.62.212.9 - domain: a248.e.akamai.net - ipaddress: 23.55.178.75 + ipaddress: 23.60.96.236 - domain: a248.e.akamai.net - ipaddress: 23.216.77.159 + ipaddress: 23.193.96.15 - domain: a248.e.akamai.net - ipaddress: 23.222.28.35 + ipaddress: 23.193.184.143 - domain: a248.e.akamai.net - ipaddress: 23.202.34.112 + ipaddress: 23.49.104.139 - domain: a248.e.akamai.net - ipaddress: 2.16.154.96 + ipaddress: 23.60.96.232 - domain: a248.e.akamai.net - ipaddress: 23.67.75.176 + ipaddress: 23.38.125.18 - domain: a248.e.akamai.net - ipaddress: 23.38.189.23 + ipaddress: 184.150.49.95 - domain: a248.e.akamai.net - ipaddress: 184.150.49.35 + ipaddress: 23.47.50.120 - domain: a248.e.akamai.net - ipaddress: 23.67.75.46 + ipaddress: 23.202.34.110 - domain: a248.e.akamai.net - ipaddress: 23.220.70.33 + ipaddress: 184.25.50.32 - domain: a248.e.akamai.net - ipaddress: 2.19.204.50 + ipaddress: 23.202.35.29 - domain: a248.e.akamai.net - ipaddress: 23.49.104.198 + ipaddress: 23.49.60.159 - domain: a248.e.akamai.net - ipaddress: 23.202.35.145 + ipaddress: 23.56.3.19 - domain: a248.e.akamai.net - ipaddress: 23.47.50.180 + ipaddress: 23.193.96.189 - domain: a248.e.akamai.net - ipaddress: 2.16.10.198 + ipaddress: 23.44.5.174 - domain: a248.e.akamai.net - ipaddress: 184.150.49.119 + ipaddress: 23.56.3.167 - domain: a248.e.akamai.net - ipaddress: 23.38.189.6 + ipaddress: 184.25.50.142 - domain: a248.e.akamai.net - ipaddress: 23.47.50.132 + ipaddress: 184.25.51.30 - domain: a248.e.akamai.net - ipaddress: 23.33.126.179 + ipaddress: 23.192.223.18 - domain: a248.e.akamai.net - ipaddress: 23.47.52.150 + ipaddress: 23.202.35.129 - domain: a248.e.akamai.net - ipaddress: 23.47.52.196 + ipaddress: 23.202.35.22 - domain: a248.e.akamai.net - ipaddress: 23.35.105.26 + ipaddress: 23.35.105.158 - domain: a248.e.akamai.net - ipaddress: 23.55.178.225 + ipaddress: 184.25.50.8 - domain: a248.e.akamai.net - ipaddress: 23.55.51.217 + ipaddress: 184.25.51.70 - domain: a248.e.akamai.net - ipaddress: 23.202.35.25 + ipaddress: 23.35.105.179 - domain: a248.e.akamai.net - ipaddress: 23.47.50.167 + ipaddress: 23.35.104.37 - domain: a248.e.akamai.net - ipaddress: 104.91.68.108 + ipaddress: 23.60.96.144 - domain: a248.e.akamai.net - ipaddress: 23.36.163.14 + ipaddress: 23.53.126.175 - domain: a248.e.akamai.net - ipaddress: 23.47.49.150 + ipaddress: 23.2.16.196 - domain: a248.e.akamai.net - ipaddress: 184.150.49.114 + ipaddress: 23.49.60.201 - domain: a248.e.akamai.net - ipaddress: 23.2.13.78 + ipaddress: 23.202.35.128 - domain: a248.e.akamai.net - ipaddress: 125.56.219.51 + ipaddress: 23.202.35.150 - domain: a248.e.akamai.net - ipaddress: 23.67.75.180 + ipaddress: 92.122.244.42 - domain: a248.e.akamai.net - ipaddress: 2.19.126.199 + ipaddress: 184.24.77.83 - domain: a248.e.akamai.net - ipaddress: 23.55.178.231 + ipaddress: 184.25.50.151 - domain: a248.e.akamai.net - ipaddress: 23.195.90.87 + ipaddress: 23.202.35.177 - domain: a248.e.akamai.net - ipaddress: 23.33.126.135 + ipaddress: 2.16.154.92 - domain: a248.e.akamai.net - ipaddress: 23.195.90.76 + ipaddress: 23.47.51.101 - domain: a248.e.akamai.net - ipaddress: 23.55.110.174 + ipaddress: 184.25.51.101 - domain: a248.e.akamai.net - ipaddress: 23.47.52.104 + ipaddress: 23.222.28.44 - domain: a248.e.akamai.net - ipaddress: 184.50.87.7 + ipaddress: 23.56.3.102 - domain: a248.e.akamai.net - ipaddress: 23.220.70.42 + ipaddress: 23.2.16.103 - domain: a248.e.akamai.net - ipaddress: 96.17.72.16 + ipaddress: 23.56.3.94 - domain: a248.e.akamai.net - ipaddress: 23.204.139.51 + ipaddress: 23.197.49.200 - domain: a248.e.akamai.net - ipaddress: 23.55.51.201 + ipaddress: 23.49.60.134 - domain: a248.e.akamai.net - ipaddress: 23.38.189.188 + ipaddress: 96.16.55.174 - domain: a248.e.akamai.net - ipaddress: 2.19.204.179 + ipaddress: 23.38.189.42 - domain: a248.e.akamai.net - ipaddress: 23.47.50.51 + ipaddress: 23.72.249.36 - domain: a248.e.akamai.net - ipaddress: 23.47.51.10 + ipaddress: 23.208.31.44 - domain: a248.e.akamai.net - ipaddress: 23.47.49.198 + ipaddress: 2.16.103.86 - domain: a248.e.akamai.net - ipaddress: 92.122.244.18 + ipaddress: 104.84.150.191 - domain: a248.e.akamai.net - ipaddress: 2.19.204.193 + ipaddress: 23.52.128.17 - domain: a248.e.akamai.net - ipaddress: 23.205.214.4 + ipaddress: 23.202.35.56 - domain: a248.e.akamai.net - ipaddress: 23.47.49.186 + ipaddress: 23.53.126.22 - domain: a248.e.akamai.net - ipaddress: 2.19.204.164 + ipaddress: 184.24.77.12 - domain: a248.e.akamai.net - ipaddress: 23.220.162.156 + ipaddress: 23.53.126.16 - domain: a248.e.akamai.net - ipaddress: 23.55.178.59 + ipaddress: 23.44.5.220 - domain: a248.e.akamai.net - ipaddress: 104.91.68.161 + ipaddress: 23.220.162.76 - domain: a248.e.akamai.net - ipaddress: 23.220.162.79 + ipaddress: 23.56.3.7 - domain: a248.e.akamai.net - ipaddress: 23.47.50.8 + ipaddress: 23.197.49.14 - domain: a248.e.akamai.net - ipaddress: 23.47.48.170 + ipaddress: 23.38.125.22 - domain: a248.e.akamai.net - ipaddress: 23.47.52.26 + ipaddress: 23.222.28.57 - domain: a248.e.akamai.net - ipaddress: 23.202.35.124 + ipaddress: 23.62.212.93 - domain: a248.e.akamai.net - ipaddress: 23.47.48.215 + ipaddress: 96.16.55.109 - domain: a248.e.akamai.net - ipaddress: 23.202.35.65 + ipaddress: 23.35.104.73 - domain: a248.e.akamai.net - ipaddress: 2.19.126.215 + ipaddress: 23.52.128.43 - domain: a248.e.akamai.net - ipaddress: 23.67.75.145 + ipaddress: 23.208.31.75 - domain: a248.e.akamai.net - ipaddress: 23.2.13.201 + ipaddress: 23.35.104.188 - domain: a248.e.akamai.net - ipaddress: 23.195.90.51 + ipaddress: 23.35.104.245 - domain: a248.e.akamai.net - ipaddress: 2.16.103.79 + ipaddress: 184.150.49.115 - domain: a248.e.akamai.net - ipaddress: 2.19.204.240 + ipaddress: 23.193.182.33 - domain: a248.e.akamai.net - ipaddress: 23.47.49.112 + ipaddress: 23.47.50.76 - domain: a248.e.akamai.net - ipaddress: 23.2.16.83 + ipaddress: 23.214.95.216 - domain: a248.e.akamai.net - ipaddress: 23.38.189.24 + ipaddress: 23.193.96.115 - domain: a248.e.akamai.net - ipaddress: 23.205.214.58 + ipaddress: 23.52.128.154 - domain: a248.e.akamai.net - ipaddress: 23.55.51.5 + ipaddress: 23.47.50.212 - domain: a248.e.akamai.net - ipaddress: 2.19.126.161 + ipaddress: 23.202.34.137 - domain: a248.e.akamai.net - ipaddress: 184.150.154.91 + ipaddress: 23.48.23.144 - domain: a248.e.akamai.net - ipaddress: 184.150.49.57 + ipaddress: 23.55.161.28 - domain: a248.e.akamai.net - ipaddress: 2.16.238.9 + ipaddress: 23.38.189.216 - domain: a248.e.akamai.net - ipaddress: 23.38.189.235 + ipaddress: 23.53.126.15 - domain: a248.e.akamai.net - ipaddress: 23.2.16.90 + ipaddress: 88.221.132.113 - domain: a248.e.akamai.net - ipaddress: 23.55.110.162 + ipaddress: 23.47.50.177 - domain: a248.e.akamai.net - ipaddress: 2.19.126.74 + ipaddress: 23.202.35.86 - domain: a248.e.akamai.net - ipaddress: 23.33.126.164 + ipaddress: 23.222.28.175 - domain: a248.e.akamai.net - ipaddress: 23.38.189.31 + ipaddress: 2.16.103.216 - domain: a248.e.akamai.net - ipaddress: 2.19.126.73 + ipaddress: 23.62.212.3 - domain: a248.e.akamai.net - ipaddress: 2.19.204.155 + ipaddress: 104.123.71.23 - domain: a248.e.akamai.net - ipaddress: 23.38.189.201 + ipaddress: 23.47.51.15 - domain: a248.e.akamai.net - ipaddress: 184.150.154.8 + ipaddress: 23.208.31.79 - domain: a248.e.akamai.net - ipaddress: 104.91.68.218 + ipaddress: 184.24.77.20 - domain: a248.e.akamai.net - ipaddress: 2.16.10.203 + ipaddress: 23.53.126.195 - domain: a248.e.akamai.net - ipaddress: 88.221.132.59 + ipaddress: 23.202.35.154 - domain: a248.e.akamai.net - ipaddress: 23.222.28.156 + ipaddress: 23.52.128.77 - domain: a248.e.akamai.net - ipaddress: 23.55.110.163 + ipaddress: 23.47.50.156 - domain: a248.e.akamai.net - ipaddress: 23.222.28.69 + ipaddress: 23.52.128.149 - domain: a248.e.akamai.net - ipaddress: 23.67.75.132 + ipaddress: 23.47.51.20 - domain: a248.e.akamai.net - ipaddress: 184.150.49.61 + ipaddress: 23.55.161.47 - domain: a248.e.akamai.net - ipaddress: 23.47.51.29 + ipaddress: 23.55.161.73 - domain: a248.e.akamai.net - ipaddress: 23.47.49.156 + ipaddress: 23.49.60.36 - domain: a248.e.akamai.net - ipaddress: 23.202.34.107 + ipaddress: 23.52.128.145 - domain: a248.e.akamai.net - ipaddress: 23.216.77.142 + ipaddress: 23.193.96.205 - domain: a248.e.akamai.net - ipaddress: 23.2.16.111 + ipaddress: 23.2.16.105 - domain: a248.e.akamai.net - ipaddress: 96.17.72.75 + ipaddress: 23.60.96.109 - domain: a248.e.akamai.net - ipaddress: 23.48.23.174 + ipaddress: 23.202.34.63 - domain: a248.e.akamai.net - ipaddress: 23.202.35.174 + ipaddress: 23.49.60.76 - domain: a248.e.akamai.net - ipaddress: 23.202.34.222 + ipaddress: 23.38.189.175 - domain: a248.e.akamai.net - ipaddress: 23.47.52.27 + ipaddress: 23.197.49.6 - domain: a248.e.akamai.net - ipaddress: 23.222.28.19 + ipaddress: 23.220.162.7 - domain: a248.e.akamai.net - ipaddress: 104.117.247.153 + ipaddress: 23.192.223.87 - domain: a248.e.akamai.net - ipaddress: 23.220.162.15 + ipaddress: 23.202.35.180 - domain: a248.e.akamai.net - ipaddress: 23.202.34.133 + ipaddress: 23.53.126.178 - domain: a248.e.akamai.net - ipaddress: 23.202.35.114 + ipaddress: 23.35.104.60 - domain: a248.e.akamai.net - ipaddress: 23.202.35.60 + ipaddress: 184.25.50.66 - domain: a248.e.akamai.net - ipaddress: 23.202.35.30 + ipaddress: 23.202.35.229 - domain: a248.e.akamai.net - ipaddress: 23.202.35.167 + ipaddress: 23.35.104.194 - domain: a248.e.akamai.net - ipaddress: 23.55.178.244 + ipaddress: 23.202.35.51 - domain: a248.e.akamai.net - ipaddress: 2.19.204.38 + ipaddress: 23.192.223.51 - domain: a248.e.akamai.net - ipaddress: 2.19.204.163 + ipaddress: 184.25.50.202 - domain: a248.e.akamai.net - ipaddress: 23.47.49.210 + ipaddress: 23.202.34.103 - domain: a248.e.akamai.net - ipaddress: 184.150.49.91 + ipaddress: 23.38.189.74 - domain: a248.e.akamai.net - ipaddress: 23.220.162.71 + ipaddress: 184.150.49.35 - domain: a248.e.akamai.net - ipaddress: 96.17.72.37 + ipaddress: 23.208.31.62 - domain: a248.e.akamai.net - ipaddress: 23.202.34.29 + ipaddress: 23.60.96.132 - domain: a248.e.akamai.net - ipaddress: 96.17.72.170 + ipaddress: 184.25.50.10 - domain: a248.e.akamai.net - ipaddress: 96.17.72.153 + ipaddress: 23.38.189.227 - domain: a248.e.akamai.net - ipaddress: 23.222.28.117 + ipaddress: 23.202.35.104 - domain: a248.e.akamai.net - ipaddress: 23.47.48.106 + ipaddress: 23.35.104.48 - domain: a248.e.akamai.net - ipaddress: 184.150.42.40 + ipaddress: 23.38.189.245 - domain: a248.e.akamai.net - ipaddress: 23.47.51.13 + ipaddress: 96.16.55.88 - domain: a248.e.akamai.net - ipaddress: 23.36.163.16 + ipaddress: 23.53.126.40 - domain: a248.e.akamai.net - ipaddress: 23.49.104.205 + ipaddress: 23.208.31.49 - domain: a248.e.akamai.net - ipaddress: 23.48.149.4 + ipaddress: 23.47.50.179 - domain: a248.e.akamai.net - ipaddress: 23.2.13.15 + ipaddress: 23.193.96.223 cloudfront: hostaliases: api-staging.getiantem.org: d16igwq64x5e11.cloudfront.net @@ -2296,2006 +2296,2006 @@ client: rejectstatus: [403] frontingsnis: masquerades: &cfmasq + - domain: 833zb1.net + ipaddress: 3.164.129.224 + - domain: 833zb1.net + ipaddress: 204.246.169.183 - domain: Smentertainment.com - ipaddress: 18.172.2.16 + ipaddress: 205.251.251.32 + - domain: a.c.swarm.space + ipaddress: 18.172.1.87 + - domain: a.c.swarm.space + ipaddress: 3.164.128.85 + - domain: a02.c-cdsknn-test.net + ipaddress: 54.230.0.43 - domain: a02.c-cdsknn.net - ipaddress: 3.165.0.78 + ipaddress: 54.230.0.207 - domain: a02.c-cdsknn.net ipaddress: 3.168.1.77 - domain: aax-eu.amazon.com - ipaddress: 18.160.1.97 - - domain: aax-eu.amazon.com - ipaddress: 13.35.2.6 + ipaddress: 54.230.210.133 - domain: aax-fe.amazon.com ipaddress: 54.230.226.140 - - domain: ads-interfaces.sc-cdn.net - ipaddress: 3.164.129.54 - - domain: ads-interfaces.sc-cdn.net - ipaddress: 18.160.2.65 - - domain: ads.chtbl.com - ipaddress: 3.168.1.8 + - domain: abcmouse.com + ipaddress: 54.230.225.187 - domain: adsrvr.org - ipaddress: 54.192.2.95 - - domain: adsrvr.org - ipaddress: 205.251.207.150 + ipaddress: 18.160.2.121 + - domain: adventureacademy.com + ipaddress: 18.238.2.93 - domain: adventureacademy.com - ipaddress: 3.164.130.79 + ipaddress: 205.251.206.97 + - domain: adventureacademy.com + ipaddress: 54.230.0.104 - domain: aerospike.jp - ipaddress: 3.164.64.101 - - domain: agcocorp.com - ipaddress: 18.238.2.44 + ipaddress: 3.164.129.103 + - domain: aerospike.jp + ipaddress: 13.35.0.38 - domain: agcocorp.com - ipaddress: 108.138.0.44 + ipaddress: 13.32.2.47 - domain: agcocorp.com - ipaddress: 13.35.1.179 - - domain: al2023.dev.api.mysound.jp - ipaddress: 18.172.2.109 - - domain: al2023.qa.api.mysound.jp - ipaddress: 13.32.1.218 - - domain: alexa-comms-mobile-service.amazon.com - ipaddress: 3.164.66.116 + ipaddress: 204.246.175.46 + - domain: allmyapps.com + ipaddress: 18.160.2.85 - domain: alphapolis.co.jp - ipaddress: 18.244.1.220 - - domain: amanad.adtdp.com - ipaddress: 18.244.0.183 - - domain: amanad.adtdp.com - ipaddress: 13.32.2.10 - - domain: amazon.ca - ipaddress: 18.244.1.219 + ipaddress: 3.166.2.105 + - domain: alt1-3ps.amazon-adsystem.com + ipaddress: 18.172.1.218 + - domain: alt1-3ps.amazon-adsystem.com + ipaddress: 54.230.225.212 - domain: amazon.co.uk - ipaddress: 204.246.177.155 - - domain: amazon.com - ipaddress: 143.204.1.216 - - domain: amazon.com - ipaddress: 18.244.1.112 + ipaddress: 52.84.2.118 + - domain: amazon.co.uk + ipaddress: 54.192.1.193 - domain: amazon.com - ipaddress: 99.86.0.14 - - domain: amazon.com.au - ipaddress: 204.246.177.90 - - domain: amazon.es - ipaddress: 3.160.2.26 + ipaddress: 13.224.2.45 + - domain: amazon.de + ipaddress: 52.222.129.10 + - domain: amazon.de + ipaddress: 3.165.1.38 + - domain: amazon.work + ipaddress: 204.246.177.51 - domain: amazonlogistics.eu - ipaddress: 108.156.1.71 - - domain: amazonpay.amazon.in - ipaddress: 204.246.175.143 - - domain: amazonpay.amazon.in - ipaddress: 3.165.1.155 + ipaddress: 13.32.1.92 + - domain: amazonlogistics.eu + ipaddress: 3.164.128.227 - domain: amazonpay.amazon.in - ipaddress: 18.244.0.157 - - domain: amob.jp - ipaddress: 3.165.0.133 + ipaddress: 13.35.0.35 + - domain: ambia-onboarding.goaptive.com + ipaddress: 3.166.0.77 + - domain: ambia-onboarding.stg.goaptive.com + ipaddress: 18.244.1.4 - domain: amuseplus.jp - ipaddress: 205.251.249.204 - - domain: amuseplus.jp - ipaddress: 205.251.251.214 - - domain: amuseplus.jp - ipaddress: 204.246.178.25 - - domain: amuseplus.jp - ipaddress: 205.251.207.172 + ipaddress: 3.164.64.141 - domain: angular.mrowl.com ipaddress: 108.138.1.178 - - domain: angular.mrowl.com - ipaddress: 54.230.1.194 - domain: answers.chime.aws - ipaddress: 3.165.1.110 - - domain: api-static.mercadopago.com - ipaddress: 204.246.175.145 - - domain: api.bbc.co.uk - ipaddress: 3.164.65.11 + ipaddress: 18.154.2.123 + - domain: api.360.car + ipaddress: 13.35.1.59 + - domain: api.360.car + ipaddress: 3.165.2.74 + - domain: api.360.car + ipaddress: 54.239.130.109 + - domain: api.360.car + ipaddress: 108.138.0.92 - domain: api.cs-pindrop.io - ipaddress: 204.246.169.135 + ipaddress: 18.172.1.118 - domain: api.loyalty.com - ipaddress: 18.172.1.131 + ipaddress: 3.168.0.122 + - domain: api.loyalty.com + ipaddress: 18.244.2.131 - domain: api.mistore.jp - ipaddress: 143.204.0.71 - - domain: api.msg.ue1.a.app.chime.aws - ipaddress: 18.160.1.107 + ipaddress: 108.138.0.67 - domain: api.msg.ue1.b.app.chime.aws ipaddress: 18.172.2.126 + - domain: api.msg.ue1.g.app.chime.aws + ipaddress: 3.164.128.101 + - domain: api.msg.ue1.g.app.chime.aws + ipaddress: 204.246.178.55 + - domain: api.msg.ue1.g.app.chime.aws + ipaddress: 108.138.0.120 - domain: api.smartpass.auone.jp - ipaddress: 204.246.177.187 - - domain: apollox.cloud - ipaddress: 205.251.207.119 - - domain: apollox.cloud - ipaddress: 3.164.129.99 + ipaddress: 13.35.2.102 - domain: apollox.cloud - ipaddress: 143.204.0.223 - - domain: app.zeromoblt.com - ipaddress: 108.138.0.177 - - domain: app.zeromoblt.com - ipaddress: 204.246.178.45 - - domain: appsdownload2.hkjc.com - ipaddress: 18.154.2.90 - - domain: appsdownload2.hkjc.com - ipaddress: 108.138.0.32 - - domain: apxinternal.net - ipaddress: 54.192.0.30 - - domain: apxinternal.net - ipaddress: 18.154.2.97 - - domain: apxinternal.net - ipaddress: 54.182.0.175 - - domain: apxinternal.net - ipaddress: 143.204.0.64 + ipaddress: 3.166.1.93 + - domain: appstore.good.com + ipaddress: 54.230.0.117 + - domain: arya-enterprise-iad.iad.amazon.com.amazon.com + ipaddress: 205.251.206.142 + - domain: asset.carevisor.com + ipaddress: 3.166.0.24 + - domain: assets.newecx.com + ipaddress: 143.204.0.192 + - domain: assets.newecx.com + ipaddress: 99.86.0.135 - domain: assoc-fe.associates-amazon.com ipaddress: 108.156.1.82 + - domain: assoc-fe.associates-amazon.com + ipaddress: 108.138.0.19 - domain: assoc-fe.associates-amazon.com ipaddress: 204.246.175.229 - - domain: assoc-na.associates-amazon.com - ipaddress: 205.251.206.30 - - domain: atoz.amazon.work - ipaddress: 205.251.249.198 + - domain: ati-host.net + ipaddress: 3.166.0.145 + - domain: au-market.com + ipaddress: 108.156.1.42 + - domain: audible.es + ipaddress: 108.138.0.13 + - domain: audible.es + ipaddress: 18.160.1.223 + - domain: auth.airmiles.ca + ipaddress: 3.164.2.78 + - domain: auth.airmiles.ca + ipaddress: 13.32.1.95 + - domain: auth.airmiles.ca + ipaddress: 3.164.130.40 + - domain: auth.airmiles.ca + ipaddress: 18.172.1.81 - domain: auth.nightowlx.com ipaddress: 108.138.0.33 - domain: auth.nightowlx.com - ipaddress: 3.164.128.28 + ipaddress: 13.32.2.37 + - domain: auth.nightowlx.com + ipaddress: 99.86.0.89 + - domain: auth0.com + ipaddress: 205.251.206.49 - domain: autodata-group.com - ipaddress: 3.165.1.7 - - domain: av-fe.amazon.com - ipaddress: 18.244.1.75 + ipaddress: 3.166.2.7 - domain: av-fe.amazon.com ipaddress: 18.160.2.61 + - domain: av-fe.amazon.com + ipaddress: 18.244.1.75 - domain: av-na.amazon.com - ipaddress: 108.138.0.29 + ipaddress: 13.32.1.49 + - domain: avakin.com + ipaddress: 3.166.1.108 - domain: avakin.com ipaddress: 54.192.0.56 - - domain: awscloud.com - ipaddress: 205.251.251.53 - - domain: awssubscriptions.gqsit.com.au - ipaddress: 3.165.2.96 - - domain: awssubscriptions.gqsit.com.au - ipaddress: 13.224.0.233 - domain: ba1.awsstatic.com - ipaddress: 65.9.128.131 - - domain: bada.com - ipaddress: 205.251.249.57 - - domain: bada.com - ipaddress: 18.172.2.51 - - domain: bbedge2p-light.iotconnectup.com - ipaddress: 205.251.206.159 - - domain: bbedge2p-light.iotconnectup.com - ipaddress: 18.244.0.225 - - domain: bbedge2p-light.iotconnectup.com - ipaddress: 13.249.2.118 - - domain: beta-pki.amazon.com - ipaddress: 18.244.2.137 - - domain: beta.app.zeromoblt.com - ipaddress: 3.164.129.170 + ipaddress: 204.246.175.127 - domain: beta.awsapps.com ipaddress: 54.192.1.120 - - domain: beta.datacentral.a2z.com - ipaddress: 205.251.207.94 - - domain: binance.im - ipaddress: 205.251.251.129 - - domain: binance.us - ipaddress: 18.244.2.11 - - domain: binance.us - ipaddress: 3.165.0.140 - - domain: binance.us - ipaddress: 13.32.2.108 - - domain: biomerics.com - ipaddress: 54.192.2.79 - - domain: biswrahu.people.aws.dev - ipaddress: 52.222.129.29 - - domain: biswrahu.people.aws.dev - ipaddress: 3.164.128.30 - - domain: biswrahu.people.aws.dev - ipaddress: 13.35.1.136 - - domain: blessedpaths.com - ipaddress: 204.246.175.19 + - domain: binanceapi.com + ipaddress: 54.230.0.112 - domain: blessedpaths.com - ipaddress: 3.168.1.116 - - domain: bobo855.net - ipaddress: 54.230.226.42 + ipaddress: 143.204.1.188 + - domain: boleto.pagseguro.com.br + ipaddress: 13.35.0.96 - domain: boleto.sandbox.pagseguro.com.br ipaddress: 108.138.0.18 - - domain: ca.dev.bbc.co.uk - ipaddress: 65.9.128.26 - - domain: cdn.aws.stg.filtered.ai - ipaddress: 54.230.1.206 + - domain: booking.com + ipaddress: 65.9.128.177 + - domain: cabellmediaroom.hayu.com + ipaddress: 204.246.177.175 + - domain: cabpooler.com + ipaddress: 13.32.1.50 + - domain: callback.fwd.co.th + ipaddress: 205.251.206.78 + - domain: callback.fwd.co.th + ipaddress: 204.246.169.191 + - domain: callback.fwd.co.th + ipaddress: 18.244.2.65 + - domain: catalogue-qa.inflight-dev.nlz.bombardier.cloud + ipaddress: 205.251.251.86 + - domain: cdn.arbitersports.com + ipaddress: 99.86.2.59 + - domain: cdn.arbitersports.com + ipaddress: 143.204.1.208 - domain: cdn.fccc.info - ipaddress: 205.251.249.125 + ipaddress: 3.164.128.111 - domain: cdn.federate.amazon.com - ipaddress: 3.165.0.105 - - domain: cdn.smartpass.auone.jp - ipaddress: 18.238.2.75 - - domain: cdn.smartpass.auone.jp - ipaddress: 13.224.0.91 - - domain: cdn.smartpass.auone.jp - ipaddress: 3.164.129.62 - - domain: cdn01.blendlabs.com - ipaddress: 3.160.2.54 + ipaddress: 54.230.1.145 + - domain: cdn.globalhealingcenter.com + ipaddress: 3.164.64.87 + - domain: cdn.inkfrog.com + ipaddress: 3.164.2.127 + - domain: cdn.integ.euid.eu + ipaddress: 52.84.2.137 + - domain: cdn.prod.uidapi.com + ipaddress: 52.222.129.178 + - domain: cdn.supercell.com + ipaddress: 18.160.1.170 - domain: centforce.net ipaddress: 52.84.2.36 - domain: cequintvzwecid.com - ipaddress: 99.86.0.202 + ipaddress: 3.164.66.31 + - domain: cequintvzwecid.com + ipaddress: 13.35.1.187 - domain: chartbeat.com - ipaddress: 99.86.2.117 - - domain: chat.amazon.co.jp - ipaddress: 54.192.1.101 - - domain: chaturbate.com - ipaddress: 205.251.251.192 + ipaddress: 205.251.249.78 + - domain: chat.amazon.eu + ipaddress: 205.251.207.141 + - domain: chat.amazon.eu + ipaddress: 205.251.249.106 - domain: checkout.paysafe.com - ipaddress: 205.251.207.189 - - domain: chime.aws - ipaddress: 3.165.1.20 - - domain: chn.lps.lottedfs.cn - ipaddress: 52.222.129.28 + ipaddress: 3.165.1.164 + - domain: chronotrack.com + ipaddress: 143.204.0.90 + - domain: classic.dm.amplience.net + ipaddress: 52.222.129.219 - domain: client.wc.ue1.app.chime.aws - ipaddress: 13.35.1.147 + ipaddress: 3.168.1.61 - domain: clients.chime.aws - ipaddress: 3.164.129.69 + ipaddress: 204.246.175.191 - domain: clients.chime.aws - ipaddress: 13.35.0.29 + ipaddress: 3.164.129.69 - domain: clonetube.cab432.com - ipaddress: 3.168.0.190 - - domain: cloud.pix4d.com - ipaddress: 18.154.2.109 - - domain: cloudfront.net - ipaddress: 99.86.1.152 - - domain: cloudfront.net - ipaddress: 108.156.0.23 - - domain: cloudfront.net - ipaddress: 216.137.34.70 - - domain: cloudfront.net - ipaddress: 108.156.0.193 - - domain: cloudfront.net - ipaddress: 54.230.209.50 - - domain: cloudfront.net - ipaddress: 99.86.1.75 - - domain: cloudfront.net - ipaddress: 205.251.253.111 - - domain: cloudfront.net - ipaddress: 54.182.1.83 + ipaddress: 108.138.1.60 - domain: cloudfront.net - ipaddress: 18.238.1.105 - - domain: cloudfront.net - ipaddress: 54.239.192.21 - - domain: cloudfront.net - ipaddress: 52.222.128.227 - - domain: cloudfront.net - ipaddress: 54.182.1.45 - - domain: cloudfront.net - ipaddress: 18.64.2.39 - - domain: cloudfront.net - ipaddress: 99.86.1.48 - - domain: cloudfront.net - ipaddress: 54.182.1.225 - - domain: cloudfront.net - ipaddress: 18.172.0.24 - - domain: cloudfront.net - ipaddress: 18.64.1.28 - - domain: cloudfront.net - ipaddress: 54.182.1.2 - - domain: cloudfront.net - ipaddress: 108.156.0.50 - - domain: cloudfront.net - ipaddress: 216.137.34.21 - - domain: cloudfront.net - ipaddress: 54.230.2.17 - - domain: cloudfront.net - ipaddress: 54.230.209.81 - - domain: cloudfront.net - ipaddress: 108.156.0.121 - - domain: cloudfront.net - ipaddress: 54.230.209.76 - - domain: cloudfront.net - ipaddress: 52.222.128.224 - - domain: cloudfront.net - ipaddress: 18.160.0.75 - - domain: cloudfront.net - ipaddress: 216.137.34.24 - - domain: cloudfront.net - ipaddress: 54.182.1.4 + ipaddress: 108.156.0.46 - domain: cloudfront.net - ipaddress: 52.222.128.131 + ipaddress: 18.160.0.32 - domain: cloudfront.net - ipaddress: 52.222.128.29 + ipaddress: 18.172.0.13 - domain: cloudfront.net - ipaddress: 99.86.1.222 + ipaddress: 108.138.2.133 - domain: cloudfront.net - ipaddress: 52.222.128.150 + ipaddress: 54.239.192.192 - domain: cloudfront.net - ipaddress: 54.230.209.129 + ipaddress: 205.251.253.140 - domain: cloudfront.net - ipaddress: 54.239.192.30 + ipaddress: 99.86.1.178 - domain: cloudfront.net - ipaddress: 54.239.192.214 + ipaddress: 18.238.1.110 - domain: cloudfront.net - ipaddress: 108.156.0.169 + ipaddress: 216.137.34.15 - domain: cloudfront.net - ipaddress: 18.160.0.169 + ipaddress: 216.137.34.95 - domain: cloudfront.net - ipaddress: 18.172.0.120 + ipaddress: 52.222.128.77 - domain: cloudfront.net - ipaddress: 99.86.1.64 + ipaddress: 205.251.253.141 - domain: cloudfront.net - ipaddress: 18.154.1.13 + ipaddress: 108.138.2.57 - domain: cloudfront.net - ipaddress: 18.160.0.138 + ipaddress: 18.160.0.124 - domain: cloudfront.net - ipaddress: 18.64.2.129 + ipaddress: 18.64.2.116 - domain: cloudfront.net - ipaddress: 54.239.192.99 + ipaddress: 18.160.0.105 - domain: cloudfront.net - ipaddress: 108.156.0.16 + ipaddress: 18.64.2.60 - domain: cloudfront.net - ipaddress: 54.230.208.13 + ipaddress: 18.172.0.105 - domain: cloudfront.net - ipaddress: 54.230.208.124 + ipaddress: 18.172.0.140 - domain: cloudfront.net - ipaddress: 54.230.2.24 + ipaddress: 18.64.2.43 - domain: cloudfront.net - ipaddress: 52.222.128.126 + ipaddress: 108.156.0.13 - domain: cloudfront.net - ipaddress: 54.230.209.5 + ipaddress: 54.239.192.21 - domain: cloudfront.net - ipaddress: 216.137.34.78 + ipaddress: 108.156.0.152 - domain: cloudfront.net - ipaddress: 99.86.1.164 + ipaddress: 18.160.0.84 - domain: cloudfront.net - ipaddress: 54.230.201.106 + ipaddress: 205.251.253.83 - domain: cloudfront.net - ipaddress: 18.172.0.224 + ipaddress: 108.138.2.96 - domain: cloudfront.net - ipaddress: 54.182.1.97 + ipaddress: 54.230.208.118 - domain: cloudfront.net - ipaddress: 52.222.128.124 + ipaddress: 18.160.0.62 - domain: cloudfront.net - ipaddress: 99.86.1.82 + ipaddress: 54.230.201.16 - domain: cloudfront.net - ipaddress: 3.160.1.32 + ipaddress: 18.238.1.33 - domain: cloudfront.net - ipaddress: 18.64.2.126 + ipaddress: 18.160.0.21 - domain: cloudfront.net - ipaddress: 99.86.1.121 + ipaddress: 18.160.0.120 - domain: cloudfront.net - ipaddress: 18.64.2.118 + ipaddress: 54.230.209.20 - domain: cloudfront.net - ipaddress: 205.251.253.179 + ipaddress: 54.239.192.112 - domain: cloudfront.net - ipaddress: 18.238.1.119 + ipaddress: 54.230.209.56 - domain: cloudfront.net - ipaddress: 52.222.128.90 + ipaddress: 54.230.209.78 - domain: cloudfront.net - ipaddress: 108.156.0.53 + ipaddress: 54.230.224.127 - domain: cloudfront.net - ipaddress: 54.239.192.178 + ipaddress: 216.137.34.86 - domain: cloudfront.net - ipaddress: 18.64.2.35 + ipaddress: 54.239.192.96 - domain: cloudfront.net - ipaddress: 54.230.201.103 + ipaddress: 18.160.0.63 - domain: cloudfront.net - ipaddress: 205.251.253.214 + ipaddress: 52.222.128.130 - domain: cloudfront.net - ipaddress: 18.64.2.64 + ipaddress: 18.160.0.58 - domain: cloudfront.net - ipaddress: 54.182.1.114 + ipaddress: 18.238.1.112 - domain: cloudfront.net - ipaddress: 18.160.0.224 + ipaddress: 54.239.192.126 - domain: cloudfront.net - ipaddress: 18.164.1.29 + ipaddress: 108.156.0.175 - domain: cloudfront.net - ipaddress: 108.156.0.205 + ipaddress: 18.160.0.132 - domain: cloudfront.net - ipaddress: 18.172.0.138 + ipaddress: 99.86.1.150 - domain: cloudfront.net - ipaddress: 99.86.1.184 + ipaddress: 52.222.128.43 - domain: cloudfront.net - ipaddress: 18.238.1.104 + ipaddress: 18.64.2.99 - domain: cloudfront.net - ipaddress: 54.230.209.207 + ipaddress: 205.251.253.4 - domain: cloudfront.net - ipaddress: 18.172.0.5 + ipaddress: 18.172.0.113 - domain: cloudfront.net - ipaddress: 54.230.208.19 + ipaddress: 108.138.2.68 - domain: cloudfront.net - ipaddress: 216.137.34.87 + ipaddress: 18.64.2.92 - domain: cloudfront.net - ipaddress: 18.172.0.184 + ipaddress: 216.137.34.14 - domain: cloudfront.net - ipaddress: 18.160.0.98 + ipaddress: 54.239.192.25 - domain: cloudfront.net - ipaddress: 205.251.253.82 + ipaddress: 108.138.2.42 - domain: cloudfront.net - ipaddress: 54.239.192.6 + ipaddress: 18.160.0.75 - domain: cloudfront.net - ipaddress: 18.172.0.189 + ipaddress: 52.222.128.218 - domain: cloudfront.net - ipaddress: 18.172.0.23 + ipaddress: 54.239.192.86 - domain: cloudfront.net - ipaddress: 216.137.34.46 + ipaddress: 18.160.0.117 - domain: cloudfront.net - ipaddress: 54.230.224.128 + ipaddress: 52.222.128.55 - domain: cloudfront.net - ipaddress: 18.160.0.155 + ipaddress: 205.251.253.163 - domain: cloudfront.net - ipaddress: 18.172.0.127 + ipaddress: 108.156.0.165 - domain: cloudfront.net - ipaddress: 54.230.209.165 + ipaddress: 108.156.0.83 - domain: cloudfront.net - ipaddress: 52.222.128.102 + ipaddress: 54.230.209.187 - domain: cloudfront.net - ipaddress: 18.160.0.213 + ipaddress: 54.239.192.155 - domain: cloudfront.net - ipaddress: 54.230.224.110 + ipaddress: 18.172.0.83 - domain: cloudfront.net - ipaddress: 54.230.208.20 + ipaddress: 108.156.0.228 - domain: cloudfront.net - ipaddress: 54.230.208.128 + ipaddress: 18.64.2.101 - domain: cloudfront.net - ipaddress: 54.230.208.24 + ipaddress: 18.64.1.18 - domain: cloudfront.net - ipaddress: 54.230.209.101 + ipaddress: 54.230.201.22 - domain: cloudfront.net - ipaddress: 18.172.0.58 + ipaddress: 205.251.253.230 - domain: cloudfront.net - ipaddress: 54.230.209.166 + ipaddress: 108.138.2.37 - domain: cloudfront.net - ipaddress: 54.230.2.18 + ipaddress: 18.64.2.140 - domain: cloudfront.net - ipaddress: 216.137.34.20 + ipaddress: 18.160.0.136 - domain: cloudfront.net - ipaddress: 18.64.2.92 + ipaddress: 205.251.253.205 - domain: cloudfront.net - ipaddress: 205.251.253.220 + ipaddress: 205.251.253.10 - domain: cloudfront.net - ipaddress: 108.138.2.108 + ipaddress: 18.164.1.6 - domain: cloudfront.net - ipaddress: 54.239.192.187 + ipaddress: 18.64.2.29 - domain: cloudfront.net - ipaddress: 18.160.0.97 + ipaddress: 99.86.1.17 - domain: cloudfront.net - ipaddress: 18.64.2.66 + ipaddress: 18.64.2.25 - domain: cloudfront.net - ipaddress: 54.182.1.76 + ipaddress: 54.230.224.12 - domain: cloudfront.net - ipaddress: 205.251.253.114 + ipaddress: 54.239.192.78 - domain: cloudfront.net - ipaddress: 54.230.201.8 + ipaddress: 18.172.0.85 - domain: cloudfront.net - ipaddress: 54.230.209.54 + ipaddress: 54.230.209.205 - domain: cloudfront.net - ipaddress: 54.230.208.107 + ipaddress: 18.64.2.139 - domain: cloudfront.net - ipaddress: 18.238.1.18 + ipaddress: 18.160.0.176 - domain: cloudfront.net - ipaddress: 52.222.128.53 + ipaddress: 18.160.0.98 - domain: cloudfront.net - ipaddress: 3.160.1.21 + ipaddress: 205.251.253.51 - domain: cloudfront.net - ipaddress: 99.86.1.115 + ipaddress: 18.160.0.60 - domain: cloudfront.net - ipaddress: 52.222.128.10 + ipaddress: 54.239.192.48 - domain: cloudfront.net - ipaddress: 54.182.1.217 + ipaddress: 18.64.2.72 - domain: cloudfront.net - ipaddress: 54.230.201.19 + ipaddress: 18.160.0.200 - domain: cloudfront.net - ipaddress: 108.138.2.93 + ipaddress: 99.86.1.16 - domain: cloudfront.net - ipaddress: 18.160.0.28 + ipaddress: 18.64.2.56 - domain: cloudfront.net - ipaddress: 108.156.0.160 + ipaddress: 18.172.0.135 - domain: cloudfront.net - ipaddress: 54.230.224.12 + ipaddress: 54.230.209.220 - domain: cloudfront.net - ipaddress: 54.230.209.153 + ipaddress: 108.138.2.132 - domain: cloudfront.net - ipaddress: 54.239.192.228 + ipaddress: 54.230.209.11 - domain: cloudfront.net - ipaddress: 108.156.0.9 + ipaddress: 216.137.34.96 - domain: cloudfront.net - ipaddress: 99.86.1.214 + ipaddress: 52.222.128.229 - domain: cloudfront.net - ipaddress: 99.86.1.205 + ipaddress: 54.230.208.110 - domain: cloudfront.net - ipaddress: 52.222.128.88 + ipaddress: 18.172.0.127 - domain: cloudfront.net - ipaddress: 18.172.0.218 + ipaddress: 18.172.0.7 - domain: cloudfront.net - ipaddress: 18.64.2.26 + ipaddress: 52.222.128.5 - domain: cloudfront.net - ipaddress: 99.86.1.76 + ipaddress: 108.156.0.19 - domain: cloudfront.net - ipaddress: 18.172.0.90 + ipaddress: 18.238.1.129 - domain: cloudfront.net - ipaddress: 205.251.253.202 + ipaddress: 52.222.128.15 - domain: cloudfront.net - ipaddress: 18.64.1.9 + ipaddress: 54.230.209.83 - domain: cloudfront.net - ipaddress: 99.86.1.35 + ipaddress: 54.230.224.27 - domain: cloudfront.net - ipaddress: 216.137.34.137 + ipaddress: 216.137.34.22 - domain: cloudfront.net - ipaddress: 216.137.34.108 + ipaddress: 54.239.192.201 - domain: cloudfront.net - ipaddress: 54.230.209.108 + ipaddress: 52.222.128.20 - domain: cloudfront.net - ipaddress: 54.230.209.184 + ipaddress: 52.222.128.163 - domain: cloudfront.net - ipaddress: 54.182.1.156 + ipaddress: 108.138.2.38 - domain: cloudfront.net - ipaddress: 18.64.2.56 + ipaddress: 18.160.0.212 - domain: cloudfront.net - ipaddress: 99.86.1.201 + ipaddress: 54.230.209.54 - domain: cloudfront.net - ipaddress: 54.182.1.194 + ipaddress: 54.230.209.203 - domain: cloudfront.net - ipaddress: 108.156.0.189 + ipaddress: 54.230.224.19 - domain: cloudfront.net - ipaddress: 18.238.1.31 + ipaddress: 54.239.192.161 - domain: cloudfront.net - ipaddress: 216.137.34.26 + ipaddress: 99.86.1.187 - domain: cloudfront.net - ipaddress: 54.182.1.5 + ipaddress: 205.251.253.79 - domain: cloudfront.net - ipaddress: 54.182.1.132 + ipaddress: 54.230.208.137 - domain: cloudfront.net - ipaddress: 54.230.209.177 + ipaddress: 54.239.192.40 - domain: cloudfront.net - ipaddress: 205.251.253.13 + ipaddress: 18.238.1.17 - domain: cloudfront.net - ipaddress: 18.160.0.216 + ipaddress: 99.86.1.34 - domain: cloudfront.net - ipaddress: 99.86.1.130 + ipaddress: 54.239.192.44 - domain: cloudfront.net - ipaddress: 54.230.208.114 + ipaddress: 99.86.1.70 - domain: cloudfront.net - ipaddress: 18.160.0.165 + ipaddress: 52.222.128.113 - domain: cloudfront.net - ipaddress: 205.251.253.192 + ipaddress: 54.230.201.114 - domain: cloudfront.net - ipaddress: 54.182.1.87 + ipaddress: 54.230.201.110 - domain: cloudfront.net - ipaddress: 108.156.0.2 + ipaddress: 54.230.208.127 - domain: cloudfront.net - ipaddress: 54.182.1.37 + ipaddress: 54.230.209.226 - domain: cloudfront.net - ipaddress: 54.230.209.25 + ipaddress: 18.160.0.5 - domain: cloudfront.net - ipaddress: 54.239.192.128 + ipaddress: 108.138.2.93 - domain: cloudfront.net - ipaddress: 54.230.208.7 + ipaddress: 18.160.0.198 - domain: cloudfront.net - ipaddress: 54.182.1.148 + ipaddress: 108.156.0.25 - domain: cloudfront.net - ipaddress: 52.222.128.47 + ipaddress: 205.251.253.200 - domain: cloudfront.net - ipaddress: 54.230.209.75 + ipaddress: 108.156.0.117 - domain: cloudfront.net - ipaddress: 216.137.34.64 + ipaddress: 216.137.34.6 - domain: cloudfront.net - ipaddress: 18.238.1.124 + ipaddress: 205.251.253.216 - domain: cloudfront.net - ipaddress: 99.86.1.60 + ipaddress: 52.222.128.120 - domain: cloudfront.net - ipaddress: 205.251.253.162 + ipaddress: 54.239.192.117 - domain: cloudfront.net - ipaddress: 52.222.128.76 + ipaddress: 108.156.0.133 - domain: cloudfront.net - ipaddress: 54.230.209.148 + ipaddress: 54.230.209.91 - domain: cloudfront.net - ipaddress: 18.64.2.10 + ipaddress: 18.64.2.61 - domain: cloudfront.net - ipaddress: 99.86.1.44 + ipaddress: 216.137.34.138 - domain: cloudfront.net ipaddress: 54.239.192.66 - domain: cloudfront.net - ipaddress: 99.86.1.208 - - domain: cloudfront.net - ipaddress: 18.172.0.143 - - domain: cloudfront.net - ipaddress: 54.230.209.61 - - domain: cloudfront.net - ipaddress: 18.160.0.123 - - domain: cloudfront.net - ipaddress: 18.160.0.84 - - domain: cloudfront.net - ipaddress: 205.251.253.29 - - domain: cloudfront.net - ipaddress: 18.172.0.21 - - domain: cloudfront.net - ipaddress: 108.156.0.208 - - domain: cloudfront.net - ipaddress: 108.156.0.5 + ipaddress: 99.86.1.58 - domain: cloudfront.net - ipaddress: 54.182.1.36 + ipaddress: 54.230.209.147 - domain: cloudfront.net - ipaddress: 108.138.2.100 - - domain: cloudfront.net - ipaddress: 108.156.0.144 - - domain: cloudfront.net - ipaddress: 54.239.192.140 - - domain: cloudfront.net - ipaddress: 54.230.209.34 + ipaddress: 54.239.192.132 - domain: cloudfront.net - ipaddress: 205.251.253.65 + ipaddress: 54.239.192.151 - domain: cloudfront.net - ipaddress: 54.239.192.41 + ipaddress: 54.239.192.34 - domain: cloudfront.net - ipaddress: 18.64.2.74 + ipaddress: 52.222.128.188 - domain: cloudfront.net - ipaddress: 54.230.209.19 + ipaddress: 99.86.1.141 - domain: cloudfront.net - ipaddress: 18.64.2.84 + ipaddress: 18.172.0.30 - domain: cloudfront.net - ipaddress: 54.182.1.133 + ipaddress: 54.230.209.143 - domain: cloudfront.net - ipaddress: 205.251.253.9 - - domain: cloudfront.net - ipaddress: 108.156.0.145 - - domain: cloudfront.net - ipaddress: 3.164.1.12 + ipaddress: 54.230.208.33 - domain: cloudfront.net - ipaddress: 54.230.224.22 + ipaddress: 99.86.1.27 - domain: cloudfront.net - ipaddress: 99.86.1.32 + ipaddress: 52.222.128.28 - domain: cloudfront.net - ipaddress: 54.230.209.3 + ipaddress: 205.251.253.150 - domain: cloudfront.net - ipaddress: 18.160.0.133 + ipaddress: 18.160.0.154 - domain: cloudfront.net - ipaddress: 18.154.1.31 + ipaddress: 18.160.0.96 - domain: cloudfront.net ipaddress: 52.222.128.25 - domain: cloudfront.net - ipaddress: 54.182.1.56 - - domain: cloudfront.net - ipaddress: 18.172.0.163 - - domain: cloudfront.net - ipaddress: 108.138.2.90 + ipaddress: 54.230.209.72 - domain: cloudfront.net - ipaddress: 99.86.1.12 + ipaddress: 108.138.2.94 - domain: cloudfront.net - ipaddress: 54.239.192.165 + ipaddress: 99.86.1.142 - domain: cloudfront.net - ipaddress: 108.138.2.29 + ipaddress: 54.230.209.201 - domain: cloudfront.net - ipaddress: 18.172.0.75 + ipaddress: 205.251.253.96 - domain: cloudfront.net - ipaddress: 18.160.0.38 + ipaddress: 108.138.2.46 - domain: cloudfront.net - ipaddress: 54.239.192.82 + ipaddress: 54.239.192.12 - domain: cloudfront.net - ipaddress: 18.64.2.75 + ipaddress: 108.156.0.40 - domain: cloudfront.net - ipaddress: 18.172.0.110 + ipaddress: 54.239.192.69 - domain: cloudfront.net - ipaddress: 205.251.253.124 + ipaddress: 108.138.2.70 - domain: cloudfront.net - ipaddress: 18.238.1.13 + ipaddress: 108.156.0.7 - domain: cloudfront.net - ipaddress: 205.251.253.84 + ipaddress: 54.230.224.110 - domain: cloudfront.net - ipaddress: 205.251.253.230 + ipaddress: 52.222.128.173 - domain: cloudfront.net - ipaddress: 18.172.0.61 + ipaddress: 18.160.0.20 - domain: cloudfront.net - ipaddress: 54.230.209.53 + ipaddress: 99.86.1.206 - domain: cloudfront.net - ipaddress: 99.86.1.116 + ipaddress: 54.230.209.190 - domain: cloudfront.net - ipaddress: 205.251.253.35 + ipaddress: 54.239.192.51 - domain: cloudfront.net - ipaddress: 18.238.1.33 + ipaddress: 54.230.209.170 - domain: cloudfront.net - ipaddress: 54.230.209.156 + ipaddress: 205.251.253.165 - domain: cloudfront.net - ipaddress: 52.222.128.82 + ipaddress: 99.86.1.2 - domain: cloudfront.net - ipaddress: 54.230.209.162 + ipaddress: 18.160.0.147 - domain: cloudfront.net - ipaddress: 99.86.1.110 + ipaddress: 54.239.192.160 - domain: cloudfront.net - ipaddress: 108.138.2.61 + ipaddress: 99.86.1.213 - domain: cloudfront.net - ipaddress: 54.230.208.129 + ipaddress: 54.230.209.74 - domain: cloudfront.net - ipaddress: 99.86.1.5 + ipaddress: 52.222.128.57 - domain: cloudfront.net - ipaddress: 18.160.0.210 + ipaddress: 54.230.2.31 - domain: cloudfront.net - ipaddress: 108.156.0.172 + ipaddress: 99.86.1.62 - domain: cloudfront.net - ipaddress: 54.230.209.107 + ipaddress: 3.164.1.31 - domain: cloudfront.net - ipaddress: 54.239.192.231 + ipaddress: 52.222.128.70 - domain: cloudfront.net - ipaddress: 99.86.1.38 + ipaddress: 54.230.201.18 - domain: cloudfront.net - ipaddress: 205.251.253.150 + ipaddress: 54.230.208.4 - domain: cloudfront.net - ipaddress: 54.239.192.38 + ipaddress: 18.160.0.119 - domain: cloudfront.net - ipaddress: 54.182.1.8 + ipaddress: 205.251.253.133 - domain: cloudfront.net - ipaddress: 54.182.1.95 + ipaddress: 54.230.208.133 - domain: cloudfront.net - ipaddress: 18.64.2.59 + ipaddress: 18.154.1.7 - domain: cloudfront.net - ipaddress: 54.230.209.41 + ipaddress: 108.156.0.121 - domain: cloudfront.net - ipaddress: 54.239.192.216 + ipaddress: 54.230.209.160 - domain: cloudfront.net - ipaddress: 18.160.0.95 + ipaddress: 216.137.34.139 - domain: cloudfront.net - ipaddress: 205.251.253.160 + ipaddress: 54.239.192.224 - domain: cloudfront.net - ipaddress: 18.160.0.167 + ipaddress: 54.230.209.2 - domain: cloudfront.net - ipaddress: 18.160.0.134 + ipaddress: 216.137.34.71 - domain: cloudfront.net - ipaddress: 18.172.0.8 + ipaddress: 18.64.2.126 - domain: cloudfront.net - ipaddress: 108.156.0.223 + ipaddress: 99.86.1.131 - domain: cloudfront.net - ipaddress: 108.138.2.47 + ipaddress: 54.230.201.117 - domain: cloudfront.net - ipaddress: 99.86.1.37 + ipaddress: 18.160.0.223 - domain: cloudfront.net - ipaddress: 54.182.1.142 + ipaddress: 54.230.224.21 - domain: cloudfront.net - ipaddress: 54.230.209.21 + ipaddress: 108.156.0.95 - domain: cloudfront.net - ipaddress: 18.160.0.225 + ipaddress: 18.172.0.57 - domain: cloudfront.net - ipaddress: 18.238.1.123 + ipaddress: 99.86.1.128 - domain: cloudfront.net - ipaddress: 108.138.2.133 + ipaddress: 54.239.192.11 - domain: cloudfront.net - ipaddress: 108.138.2.98 + ipaddress: 54.239.192.175 - domain: cloudfront.net - ipaddress: 18.160.0.124 + ipaddress: 18.160.0.70 - domain: cloudfront.net - ipaddress: 54.239.192.190 + ipaddress: 18.238.1.106 - domain: cloudfront.net - ipaddress: 108.156.0.83 + ipaddress: 54.230.209.208 - domain: cloudfront.net - ipaddress: 108.138.2.45 + ipaddress: 54.230.201.19 - domain: cloudfront.net - ipaddress: 18.172.0.104 + ipaddress: 99.86.1.7 - domain: cloudfront.net - ipaddress: 216.137.34.114 + ipaddress: 18.172.0.180 - domain: cloudfront.net - ipaddress: 18.160.0.105 + ipaddress: 52.222.128.22 - domain: cloudfront.net - ipaddress: 108.138.2.81 + ipaddress: 99.86.1.132 - domain: cloudfront.net - ipaddress: 54.182.1.154 + ipaddress: 99.86.1.81 - domain: cloudfront.net - ipaddress: 108.156.0.162 + ipaddress: 54.239.192.158 - domain: cloudfront.net - ipaddress: 18.64.2.41 + ipaddress: 108.156.0.205 - domain: cloudfront.net - ipaddress: 18.154.1.28 + ipaddress: 18.160.0.14 - domain: cloudfront.net - ipaddress: 205.251.253.194 + ipaddress: 18.172.0.114 - domain: cloudfront.net - ipaddress: 108.138.2.39 + ipaddress: 205.251.253.88 - domain: cloudfront.net - ipaddress: 52.222.128.176 + ipaddress: 54.230.209.168 - domain: cloudfront.net - ipaddress: 54.182.1.189 + ipaddress: 3.164.1.12 - domain: cloudfront.net - ipaddress: 99.86.1.104 + ipaddress: 18.160.0.226 - domain: cloudfront.net - ipaddress: 18.164.1.31 + ipaddress: 54.230.209.106 - domain: cloudfront.net - ipaddress: 18.238.1.8 + ipaddress: 108.156.0.143 - domain: cloudfront.net - ipaddress: 18.160.0.117 + ipaddress: 99.86.1.180 - domain: cloudfront.net - ipaddress: 52.222.128.72 + ipaddress: 18.172.0.122 - domain: cloudfront.net - ipaddress: 18.172.0.102 + ipaddress: 52.222.128.171 - domain: cloudfront.net - ipaddress: 52.222.128.26 + ipaddress: 54.230.209.97 - domain: cloudfront.net - ipaddress: 18.172.0.103 + ipaddress: 54.239.192.106 - domain: cloudfront.net - ipaddress: 54.230.224.124 + ipaddress: 54.230.209.223 - domain: cloudfront.net - ipaddress: 54.230.224.99 + ipaddress: 54.239.192.104 - domain: cloudfront.net - ipaddress: 54.230.209.197 + ipaddress: 54.230.201.2 - domain: cloudfront.net - ipaddress: 108.156.0.161 + ipaddress: 205.251.253.35 - domain: cloudfront.net - ipaddress: 3.160.1.3 + ipaddress: 52.222.128.216 - domain: cloudfront.net - ipaddress: 18.64.2.14 + ipaddress: 18.64.2.52 - domain: cloudfront.net - ipaddress: 108.156.0.33 + ipaddress: 205.251.253.213 - domain: cloudfront.net - ipaddress: 54.239.192.174 + ipaddress: 54.230.224.113 - domain: cloudfront.net - ipaddress: 205.251.253.53 + ipaddress: 216.137.34.88 - domain: cloudfront.net - ipaddress: 52.222.128.171 + ipaddress: 216.137.34.135 - domain: cloudfront.net - ipaddress: 18.160.0.131 + ipaddress: 18.172.0.141 - domain: cloudfront.net - ipaddress: 52.222.128.24 + ipaddress: 108.156.0.60 - domain: cloudfront.net - ipaddress: 3.164.1.8 + ipaddress: 54.230.209.60 - domain: cloudfront.net - ipaddress: 99.86.1.97 + ipaddress: 54.230.209.161 - domain: cloudfront.net - ipaddress: 54.239.192.58 + ipaddress: 54.239.192.176 - domain: cloudfront.net - ipaddress: 54.239.192.95 + ipaddress: 18.160.0.181 - domain: cloudfront.net - ipaddress: 18.172.0.212 + ipaddress: 52.222.128.223 - domain: cloudfront.net - ipaddress: 54.182.1.50 + ipaddress: 108.138.2.24 - domain: cloudfront.net - ipaddress: 18.64.2.139 + ipaddress: 18.160.0.203 - domain: cloudfront.net - ipaddress: 99.86.1.2 + ipaddress: 54.230.209.127 - domain: cloudfront.net - ipaddress: 54.230.224.106 + ipaddress: 108.156.0.22 - domain: cloudfront.net - ipaddress: 3.160.1.17 + ipaddress: 18.172.0.12 - domain: cloudfront.net - ipaddress: 108.138.2.38 + ipaddress: 99.86.1.59 - domain: cloudfront.net - ipaddress: 18.64.2.68 + ipaddress: 18.160.0.18 - domain: cloudfront.net - ipaddress: 54.230.209.70 + ipaddress: 54.230.201.10 - domain: cloudfront.net - ipaddress: 108.156.0.59 + ipaddress: 18.160.0.227 - domain: cloudfront.net - ipaddress: 216.137.34.136 + ipaddress: 52.222.128.156 - domain: cloudfront.net - ipaddress: 108.156.0.46 + ipaddress: 54.230.224.111 - domain: cloudfront.net - ipaddress: 99.86.1.77 + ipaddress: 52.222.128.136 - domain: cloudfront.net - ipaddress: 108.156.0.126 + ipaddress: 54.230.209.196 - domain: cloudfront.net - ipaddress: 18.154.1.24 + ipaddress: 18.160.0.134 - domain: cloudfront.net - ipaddress: 205.251.253.157 + ipaddress: 18.238.1.25 - domain: cloudfront.net - ipaddress: 108.156.0.166 + ipaddress: 54.230.224.100 - domain: cloudfront.net - ipaddress: 54.239.192.166 + ipaddress: 3.164.1.5 - domain: cloudfront.net - ipaddress: 99.86.1.46 + ipaddress: 108.156.0.211 - domain: cloudfront.net - ipaddress: 54.230.209.33 + ipaddress: 216.137.34.87 - domain: cloudfront.net - ipaddress: 205.251.253.117 + ipaddress: 18.164.1.15 - domain: cloudfront.net - ipaddress: 54.182.1.64 + ipaddress: 52.222.128.139 - domain: cloudfront.net - ipaddress: 99.86.1.74 + ipaddress: 54.239.192.136 - domain: cloudfront.net - ipaddress: 18.172.0.223 + ipaddress: 54.239.192.105 - domain: cloudfront.net - ipaddress: 54.182.1.42 + ipaddress: 54.239.192.119 - domain: cloudfront.net - ipaddress: 54.230.224.115 + ipaddress: 54.239.192.17 - domain: cloudfront.net - ipaddress: 18.160.0.206 + ipaddress: 18.172.0.29 - domain: cloudfront.net - ipaddress: 54.230.209.183 + ipaddress: 108.156.0.149 - domain: cloudfront.net - ipaddress: 108.156.0.17 + ipaddress: 54.239.192.149 - domain: cloudfront.net - ipaddress: 18.172.0.170 + ipaddress: 54.230.209.79 - domain: cloudfront.net - ipaddress: 54.230.2.31 + ipaddress: 205.251.253.116 - domain: cloudfront.net - ipaddress: 205.251.253.123 + ipaddress: 205.251.253.218 - domain: cloudfront.net - ipaddress: 18.64.2.110 + ipaddress: 18.172.0.124 - domain: cloudfront.net - ipaddress: 52.222.128.140 + ipaddress: 108.156.0.91 - domain: cloudfront.net - ipaddress: 3.160.1.29 + ipaddress: 108.138.2.50 - domain: cloudfront.net ipaddress: 54.230.201.115 - domain: cloudfront.net - ipaddress: 18.172.0.116 + ipaddress: 54.239.192.114 - domain: cloudfront.net - ipaddress: 205.251.253.47 + ipaddress: 216.137.34.24 + - domain: cloudfront.net + ipaddress: 54.230.209.191 - domain: cloudfront.net - ipaddress: 18.164.1.12 + ipaddress: 18.160.0.148 - domain: cloudfront.net - ipaddress: 18.64.2.48 + ipaddress: 52.222.128.63 - domain: cloudfront.net - ipaddress: 205.251.253.98 + ipaddress: 18.160.0.182 - domain: cloudfront.net - ipaddress: 18.172.0.206 + ipaddress: 108.138.2.100 - domain: cloudfront.net - ipaddress: 54.182.1.11 + ipaddress: 54.230.209.183 - domain: cloudfront.net - ipaddress: 54.239.192.42 - - domain: cmcaptrace.com - ipaddress: 3.165.1.94 - - domain: codestrike.io - ipaddress: 54.230.210.31 + ipaddress: 54.230.209.96 - domain: cognibox.net ipaddress: 3.164.129.222 - domain: coincheck.com - ipaddress: 143.204.1.115 + ipaddress: 204.246.169.94 - domain: coincheck.com - ipaddress: 205.251.249.230 + ipaddress: 143.204.1.115 + - domain: commonservice.io + ipaddress: 3.166.1.54 + - domain: commosus.jp + ipaddress: 99.86.2.70 - domain: commosus.jp - ipaddress: 65.9.128.187 - - domain: comparaonline.com.co - ipaddress: 52.222.129.31 + ipaddress: 3.164.66.84 + - domain: contestimg.wish.com + ipaddress: 3.165.0.47 - domain: cookie.oup.com ipaddress: 3.168.1.57 + - domain: courrier.jp + ipaddress: 99.86.0.189 + - domain: courrier.jp + ipaddress: 205.251.249.220 + - domain: crl.aptivcscloud.com + ipaddress: 13.35.0.60 + - domain: crl.r2m01.amazontrust.com + ipaddress: 52.222.129.13 + - domain: crl.r2m01.amazontrust.com + ipaddress: 13.32.1.186 - domain: crownpeak.net - ipaddress: 3.164.66.127 + ipaddress: 99.86.2.102 + - domain: crownpeak.net + ipaddress: 3.164.2.126 + - domain: crownpeak.net + ipaddress: 13.35.1.98 + - domain: cuhealth.com.au + ipaddress: 3.164.66.18 - domain: dashboard.bandwidth.com - ipaddress: 205.251.251.213 - - domain: data-na.amazon.com - ipaddress: 52.222.129.147 - - domain: data.amazon.co.uk - ipaddress: 108.138.0.212 + ipaddress: 65.9.128.50 - domain: data.amazon.co.uk - ipaddress: 3.160.2.45 + ipaddress: 204.246.177.227 + - domain: data.amazon.com.au + ipaddress: 13.249.2.64 - domain: datacentral.a2z.com - ipaddress: 54.239.130.74 + ipaddress: 108.138.1.224 - domain: daviwmon.people.aws.dev - ipaddress: 65.9.128.16 - - domain: deploy.itginc.com - ipaddress: 204.246.178.50 + ipaddress: 52.222.129.21 - domain: dev-aws-dcsgtk.wni.co.jp - ipaddress: 13.224.0.49 - - domain: dev-aws-dcsgtk.wni.co.jp - ipaddress: 52.222.129.212 - - domain: dev-aws-dcsgtk.wni.co.jp - ipaddress: 18.172.1.170 - - domain: dev.twitch.tv - ipaddress: 18.172.1.49 + ipaddress: 3.164.65.194 - domain: devenues.com ipaddress: 204.246.177.205 - - domain: devenues.com - ipaddress: 3.160.2.12 - domain: devfdg.net - ipaddress: 205.251.207.209 - - domain: diceplatform.com - ipaddress: 18.154.2.40 - - domain: diceplatform.com - ipaddress: 204.246.177.56 - - domain: difender.jp - ipaddress: 205.251.206.108 - - domain: difender.jp - ipaddress: 143.204.1.28 + ipaddress: 3.164.64.132 + - domain: device.c-cdsknn-test.net + ipaddress: 205.251.249.235 + - domain: device.c-cdsknn.net + ipaddress: 54.192.1.31 + - domain: devicebackup-qa.fujifilm.com + ipaddress: 54.230.225.114 - domain: digitalapi.auspost.com.au - ipaddress: 54.192.0.235 - - domain: digitgaming.com - ipaddress: 18.164.2.99 + ipaddress: 52.84.2.78 - domain: dl.amazon.co.uk - ipaddress: 3.164.129.182 + ipaddress: 205.251.249.114 - domain: dl.amazon.com - ipaddress: 54.230.226.102 - - domain: dl.mtvxexbhio.com - ipaddress: 204.246.178.68 + ipaddress: 13.35.2.20 + - domain: dmm.co.jp + ipaddress: 52.222.129.227 + - domain: dmm.co.jp + ipaddress: 65.9.129.6 + - domain: dmm.com + ipaddress: 54.192.0.114 - domain: dmp.tconnect.jp - ipaddress: 54.192.1.36 - - domain: doctoryourself.live - ipaddress: 13.32.1.179 + ipaddress: 54.192.2.64 + - domain: dmp.tconnect.jp + ipaddress: 18.172.2.30 + - domain: dmp.tconnect.jp + ipaddress: 3.164.128.29 + - domain: dmp.tconnect.jp + ipaddress: 99.86.2.54 + - domain: dmp.tconnect.jp + ipaddress: 54.230.0.88 + - domain: dmp.tconnect.jp + ipaddress: 54.230.130.136 - domain: dolphin-fe-preprod.amazon.com ipaddress: 205.251.249.22 - - domain: dolphin-fe-preprod.amazon.com - ipaddress: 18.244.1.190 - domain: dolphin-fe.amazon.com - ipaddress: 54.192.0.66 + ipaddress: 204.246.177.237 + - domain: download.bpmsupreme.com + ipaddress: 18.164.2.93 - domain: download.bpmsupreme.com - ipaddress: 205.251.207.95 + ipaddress: 65.9.129.8 - domain: downloads.cdn.telerik.com - ipaddress: 205.251.251.163 + ipaddress: 3.168.1.132 - domain: downloads.cdn.telerik.com - ipaddress: 204.246.169.166 + ipaddress: 143.204.1.172 - domain: drop52.cloware.com - ipaddress: 54.230.226.136 + ipaddress: 54.230.0.8 - domain: drop52.cloware.com - ipaddress: 54.230.225.136 + ipaddress: 3.168.0.129 + - domain: ebookstore.sony.jp + ipaddress: 204.246.175.219 - domain: ecnavi.jp - ipaddress: 3.165.1.12 - - domain: edge.dis.commercecloud.salesforce.com - ipaddress: 13.35.1.116 - - domain: edge.dis.commercecloud.salesforce.com - ipaddress: 205.251.207.30 - - domain: ehs.com - ipaddress: 18.172.1.32 - - domain: ehs.com - ipaddress: 3.165.1.111 + ipaddress: 18.244.0.11 + - domain: ecnavi.jp + ipaddress: 143.204.0.17 + - domain: ecnavi.jp + ipaddress: 3.164.130.11 + - domain: email-dpub.jp + ipaddress: 3.166.0.82 + - domain: eprocurement.marketplace.us-east-1.amazonaws.com + ipaddress: 3.164.129.122 + - domain: explore.skillbuilder.training.aws.dev + ipaddress: 204.246.175.197 - domain: explore.skillbuilder.training.aws.dev ipaddress: 54.230.0.142 - domain: ext-test.app-cloud.jp - ipaddress: 18.244.0.29 + ipaddress: 3.168.1.27 - domain: ext.app-cloud.jp - ipaddress: 3.164.64.27 - - domain: files.payoneer.com - ipaddress: 13.32.1.27 - - domain: files.payoneer.com - ipaddress: 54.239.130.19 - - domain: flamingo.gomobile.jp - ipaddress: 205.251.251.21 + ipaddress: 13.35.2.107 + - domain: ezvizlife.com + ipaddress: 54.230.225.153 + - domain: ezvizlife.com + ipaddress: 205.251.249.37 + - domain: fate-go.com.tw + ipaddress: 143.204.1.43 + - domain: fbiwpro-s.fujifilm.com + ipaddress: 52.84.2.74 + - domain: fbiwpro.fujifilm.com + ipaddress: 18.244.0.229 + - domain: fe.dazn-stage.com + ipaddress: 204.246.178.132 + - domain: fe.dazn-stage.com + ipaddress: 18.172.2.108 + - domain: fifaconnect.org + ipaddress: 108.156.1.174 + - domain: fifaconnect.org + ipaddress: 54.192.1.152 + - domain: files.bbystatic.com + ipaddress: 65.9.129.67 + - domain: finance.dev.lmevlogistics.com + ipaddress: 3.166.2.96 - domain: flickr.com ipaddress: 3.164.66.102 - domain: flipagram.com - ipaddress: 3.164.2.66 - - domain: foodgiant.com - ipaddress: 13.224.0.158 + ipaddress: 18.244.0.68 + - domain: flipagram.com + ipaddress: 13.32.2.81 - domain: form.paygent.co.jp - ipaddress: 13.224.0.8 + ipaddress: 3.166.0.34 + - domain: freight.amazon.com + ipaddress: 3.164.129.206 - domain: freshdesk.com ipaddress: 13.224.2.90 - - domain: freshdesk.com - ipaddress: 3.160.2.129 - - domain: gaijinent.com - ipaddress: 205.251.206.149 - - domain: gaijinent.com - ipaddress: 108.138.1.137 - - domain: gamma.amcentral.amazon.dev - ipaddress: 18.154.2.59 + - domain: fs.com + ipaddress: 18.244.0.87 + - domain: fs.com + ipaddress: 205.251.207.104 + - domain: fujifilmimagine.com + ipaddress: 18.238.2.65 + - domain: fujifilmimagine.com + ipaddress: 3.165.2.55 + - domain: galaxy.wni.com + ipaddress: 3.164.66.132 + - domain: gamevil.com + ipaddress: 205.251.249.227 + - domain: geocomply.com + ipaddress: 3.165.2.11 - domain: geocomply.net - ipaddress: 13.224.0.215 - - domain: getcontentonline.com - ipaddress: 13.249.2.5 - - domain: getcontentonline.com - ipaddress: 18.244.0.129 + ipaddress: 54.192.1.119 - domain: ghtcsjgzu02fjqunxykwarpj.gempay.me - ipaddress: 3.164.64.188 - - domain: giv-dev.nmgcloud.io - ipaddress: 205.251.206.138 - - domain: globalcitizen.org - ipaddress: 13.35.1.30 + ipaddress: 18.238.2.121 - domain: globalcitizen.org - ipaddress: 205.251.206.88 - - domain: grappos.com - ipaddress: 108.156.1.25 - - domain: grappos.com - ipaddress: 3.164.2.18 - - domain: gs0.awsstatic.com - ipaddress: 3.164.128.73 - - domain: gtin-prod.nikecloud.com - ipaddress: 108.156.1.92 - - domain: gtin-test.nikecloud.com - ipaddress: 3.164.2.81 - - domain: gtin-test.nikecloud.com - ipaddress: 54.192.1.220 + ipaddress: 54.192.2.68 + - domain: globalindustrial.com + ipaddress: 3.164.129.6 + - domain: goshippo.com + ipaddress: 204.246.177.159 - domain: hankooktech.com - ipaddress: 52.222.129.179 + ipaddress: 13.35.0.221 + - domain: hbfiles.com + ipaddress: 13.35.0.136 + - domain: hbfiles.com + ipaddress: 3.164.65.124 + - domain: hbfiles.com + ipaddress: 204.246.177.153 + - domain: hcwin86.com + ipaddress: 143.204.1.187 - domain: hijuconn.com - ipaddress: 205.251.249.49 - - domain: hijuconn.com - ipaddress: 65.9.128.101 - - domain: hinatazaka46.com - ipaddress: 54.192.2.34 - - domain: hkdl.hk - ipaddress: 205.251.251.35 - - domain: hop-apl-stg.heiwado.jp - ipaddress: 3.165.0.31 - - domain: hop-apl-stg.heiwado.jp - ipaddress: 18.238.2.37 - - domain: hop-apl.heiwado.jp - ipaddress: 108.138.0.36 + ipaddress: 3.166.1.94 - domain: i.fyu.se ipaddress: 13.32.2.117 - - domain: iads.unity3d.com - ipaddress: 205.251.206.118 - domain: iads.unity3d.com ipaddress: 108.138.0.153 - - domain: image.ellotte.com - ipaddress: 3.165.0.50 - - domain: img.clarchive.net - ipaddress: 3.164.128.98 - - domain: img.clpong.net - ipaddress: 54.230.210.106 - - domain: img.litecam.net - ipaddress: 18.160.1.18 - - domain: influencher.shop - ipaddress: 18.160.1.61 - - domain: influencher.shop - ipaddress: 54.182.2.23 + - domain: iads.unity3d.com + ipaddress: 18.244.0.94 + - domain: idp.mimecast.com + ipaddress: 65.9.129.224 + - domain: images-cn.ssl-images-amazon.com + ipaddress: 18.244.2.37 + - domain: images-na.ssl-images-amazon.com + ipaddress: 3.168.0.195 + - domain: images-na.ssl-images-amazon.com + ipaddress: 54.230.0.197 + - domain: images-na.ssl-images-amazon.com + ipaddress: 54.192.1.183 + - domain: imdb-video-wab.media-imdb.com + ipaddress: 54.192.1.11 + - domain: imdb.com + ipaddress: 18.172.2.107 + - domain: imdbtv-backend-eu.amazon.com + ipaddress: 108.156.1.48 + - domain: img.chunjae-platform.com + ipaddress: 99.86.0.30 + - domain: img.chunjae-platform.com + ipaddress: 54.239.130.12 + - domain: img.fujoho.jp + ipaddress: 3.165.0.48 + - domain: infinpay.com + ipaddress: 3.164.65.207 + - domain: insead.edu + ipaddress: 3.166.1.149 + - domain: integ.sellercentral.amazon.dev + ipaddress: 54.192.0.90 - domain: ipv6.amazon.sa - ipaddress: 143.204.0.80 + ipaddress: 205.251.206.236 - domain: isappcloud.com - ipaddress: 13.249.2.36 + ipaddress: 204.246.177.226 - domain: izettle.com - ipaddress: 3.164.2.91 + ipaddress: 3.164.130.92 + - domain: jhjung.xyz + ipaddress: 54.230.225.26 + - domain: job.mynavi.jp + ipaddress: 205.251.207.39 - domain: job.mynavi.jp - ipaddress: 108.138.0.39 - - domain: johnnys-web.com - ipaddress: 54.192.1.194 + ipaddress: 3.164.129.33 + - domain: job.mynavi.jp + ipaddress: 52.222.129.47 + - domain: js.pusher.com + ipaddress: 54.192.2.55 - domain: jtexpress.sg ipaddress: 13.35.0.28 - - domain: jtexpress.sg - ipaddress: 108.138.0.160 - domain: jtjms-mx.com - ipaddress: 13.35.1.164 + ipaddress: 99.86.0.38 - domain: jtjms-sa.com - ipaddress: 3.164.64.138 + ipaddress: 108.156.1.218 - domain: jtjms-sa.com - ipaddress: 13.224.2.52 + ipaddress: 3.164.64.138 - domain: jtjms-sa.com ipaddress: 3.168.2.135 - - domain: jwo.amazon.com - ipaddress: 54.230.225.74 - - domain: kaizenplatform.net - ipaddress: 54.192.2.77 + - domain: jwplayer.com + ipaddress: 3.165.1.68 + - domain: kastle.com + ipaddress: 52.222.129.221 - domain: kddi-fs.com - ipaddress: 13.224.0.169 - - domain: kindle-digital-delivery-integ.amazon.com - ipaddress: 204.246.177.64 - - domain: kindle-digital-delivery.amazon.com - ipaddress: 204.246.175.183 - - domain: l0.awsstatic.com - ipaddress: 54.239.130.120 + ipaddress: 3.164.2.31 + - domain: kindle-digital-delivery-preprod.amazon.com + ipaddress: 3.166.2.18 + - domain: kindle-digital-delivery-preprod.amazon.com + ipaddress: 3.165.2.18 + - domain: komoejoy.com + ipaddress: 3.168.0.33 + - domain: komoejoy.com + ipaddress: 3.164.128.34 + - domain: kuvo.com + ipaddress: 143.204.0.63 + - domain: ladsp.com + ipaddress: 99.86.0.18 + - domain: ladsp.com + ipaddress: 18.160.1.99 + - domain: layla.amazon.com + ipaddress: 18.244.1.199 - domain: layla.amazon.com - ipaddress: 3.165.2.105 + ipaddress: 18.164.2.48 + - domain: leer.amazon.com.mx + ipaddress: 54.192.1.108 - domain: leer.amazon.com.mx ipaddress: 108.156.1.52 - - domain: legacy-kindle-digital-delivery-preprod.amazon.com - ipaddress: 3.164.64.72 + - domain: legacy-kindle-digital-delivery.amazon.com + ipaddress: 3.166.1.122 - domain: legacy.api.iot.carrier.com ipaddress: 205.251.249.35 - domain: lifeway.com ipaddress: 3.164.66.71 - domain: live.ota-pkg-dl.smart-access.io - ipaddress: 18.172.1.143 + ipaddress: 205.251.249.33 + - domain: live.ota-pkg-dl.smart-access.io + ipaddress: 204.246.169.98 - domain: load-test6.eu-west-2.cf-embed.net - ipaddress: 3.165.1.57 + ipaddress: 204.246.169.68 - domain: login.kataweb.it ipaddress: 108.138.0.55 - - domain: login.schibsted.com - ipaddress: 3.165.1.100 - - domain: login.schibsted.com - ipaddress: 54.192.2.102 - - domain: logistics.amazon.co.uk - ipaddress: 54.239.130.52 - - domain: lovingties.org - ipaddress: 3.164.65.73 + - domain: logview.lismovideounlimited.auone.jp + ipaddress: 99.86.2.34 - domain: lovingties.org - ipaddress: 18.172.2.11 - - domain: lucidhq.com - ipaddress: 18.160.1.41 + ipaddress: 99.86.2.5 - domain: macmillanenglishcampus-lms.com ipaddress: 108.138.0.116 - - domain: macmillanenglishcampus-lms.com - ipaddress: 204.246.177.120 - - domain: mapfan.com - ipaddress: 204.246.177.97 - - domain: meechum-dev.test.netflix.net - ipaddress: 65.9.128.103 + - domain: marketpulse.com + ipaddress: 204.246.169.161 + - domain: mediaportal-cdn.expo2025.or.jp + ipaddress: 65.9.129.115 - domain: meechum-dev.test.netflix.net ipaddress: 13.35.2.10 + - domain: meechum.test.netflix.net + ipaddress: 18.244.1.238 - domain: mercadolibre.com ipaddress: 3.164.128.109 + - domain: mercadolibre.com + ipaddress: 52.84.2.103 + - domain: meta-qa.inflight-dev.nlz.bombardier.cloud + ipaddress: 99.86.2.98 + - domain: mfdhelp.iotconnectup.com + ipaddress: 204.246.177.158 + - domain: mfdhelpsearch.fujifilm.com + ipaddress: 204.246.175.35 - domain: mfi-device.fnopf.jp - ipaddress: 18.160.2.63 + ipaddress: 143.204.0.44 - domain: mfi-device.fnopf.jp - ipaddress: 52.222.129.195 + ipaddress: 18.160.2.63 + - domain: mfi-device02.fnopf.jp + ipaddress: 13.224.0.213 - domain: mfi-tc02.fnopf.jp ipaddress: 3.164.66.100 - - domain: midori-ku.jp - ipaddress: 204.246.175.16 - - domain: mintegral.com - ipaddress: 18.244.0.90 + - domain: mi.mccarthylawyer.com + ipaddress: 18.244.1.69 + - domain: mix.tokyo + ipaddress: 54.192.1.113 + - domain: mobile.mercadopago.com + ipaddress: 3.165.1.47 + - domain: mobile.mercadopago.com + ipaddress: 52.222.129.174 - domain: mobyt.fr - ipaddress: 205.251.249.62 - - domain: modem-fwota.keyforbusiness.a2z.com - ipaddress: 54.182.2.57 - - domain: modem-fwota.keyforbusiness.a2z.com - ipaddress: 54.230.225.232 - - domain: multisandbox.connect.fluentretail.com - ipaddress: 204.246.177.110 - - domain: my1pick.com - ipaddress: 18.238.2.137 + ipaddress: 18.244.1.37 + - domain: mtgec.jp + ipaddress: 54.192.2.123 + - domain: music.amazon.com + ipaddress: 52.222.129.226 - domain: mymortgage-app.net - ipaddress: 204.246.169.6 + ipaddress: 3.168.0.123 - domain: mysound.jp - ipaddress: 13.35.2.94 - - domain: netmarble.net - ipaddress: 3.164.128.121 - - domain: netmarble.net - ipaddress: 18.160.1.148 + ipaddress: 108.138.0.190 + - domain: mysound.jp + ipaddress: 204.246.178.121 + - domain: n-ship.jp + ipaddress: 54.230.225.69 + - domain: n-ship.jp + ipaddress: 65.9.129.144 - domain: netmarble.net - ipaddress: 18.172.1.124 - - domain: news.nifty.com - ipaddress: 205.251.249.129 - - domain: nexon.com - ipaddress: 13.224.2.42 - - domain: nexon.com - ipaddress: 204.246.175.45 + ipaddress: 204.246.178.76 + - domain: neustar.biz + ipaddress: 54.192.0.21 + - domain: neustar.biz + ipaddress: 3.164.65.15 + - domain: neustar.biz + ipaddress: 18.172.1.16 - domain: nexon.com - ipaddress: 18.164.2.44 - - domain: nexon.com - ipaddress: 54.239.130.51 - - domain: nftmultisign.com - ipaddress: 3.164.2.68 - - domain: nftmultisign.com - ipaddress: 3.165.1.67 + ipaddress: 54.230.226.46 - domain: nftstatic.com - ipaddress: 18.244.2.79 + ipaddress: 13.35.1.178 - domain: ngstatic.com - ipaddress: 54.239.130.25 + ipaddress: 3.164.66.141 - domain: nissanwin.com ipaddress: 3.164.66.5 - domain: niziu.com - ipaddress: 205.251.206.63 - - domain: notice.purchasingpower.com - ipaddress: 99.86.2.28 - - domain: ocsp.e2m04.behedeb.iggsq.biz - ipaddress: 13.35.1.129 + ipaddress: 205.251.249.162 + - domain: niziu.com + ipaddress: 3.165.0.51 + - domain: niziu.com + ipaddress: 3.166.1.51 - domain: ocsp.rootca1.amazontrust.com - ipaddress: 204.246.177.83 + ipaddress: 3.164.65.205 - domain: ocsp.rootca1.amazontrust.com - ipaddress: 54.230.0.36 + ipaddress: 108.138.1.165 + - domain: ocsp.rootca1.amazontrust.com + ipaddress: 3.165.2.6 - domain: odin-athena.dev-us1.twilio.com - ipaddress: 18.160.2.43 + ipaddress: 99.86.2.115 - domain: odin-athena.dev-us1.twilio.com ipaddress: 13.32.2.123 + - domain: odin-athena.stage-us1.twilio.com + ipaddress: 13.249.2.66 - domain: odin-gold.dev-us1.twilio.com - ipaddress: 18.244.0.185 + ipaddress: 143.204.0.61 - domain: odin-gold.us1.twilio.com - ipaddress: 3.165.2.126 - - domain: offerupnow.com - ipaddress: 143.204.0.29 - - domain: olt-content.sans.org - ipaddress: 3.165.0.130 - - domain: olt-players.sans.org - ipaddress: 205.251.251.70 + ipaddress: 65.9.129.63 - domain: one.accedo.tv - ipaddress: 54.230.226.8 - - domain: origin-api.eu.amazonalexa.com - ipaddress: 54.230.225.73 - - domain: origin-api.eu.amazonalexa.com - ipaddress: 54.230.226.73 - - domain: origin-api.eu.amazonalexa.com - ipaddress: 3.164.66.47 + ipaddress: 54.230.225.8 + - domain: one.amazon.com + ipaddress: 65.9.129.194 + - domain: one.rveeradu.awsps.myinstance.com + ipaddress: 54.192.1.116 + - domain: origin-api.amazonalexa.com + ipaddress: 3.165.0.185 + - domain: origin-api.amazonalexa.com + ipaddress: 143.204.1.114 + - domain: origin-api.fe.amazonalexa.com + ipaddress: 54.230.225.19 - domain: origin-beta.client.legacy-app.games.a2z.com - ipaddress: 108.138.0.195 + ipaddress: 143.204.1.229 + - domain: origin-client.legacy-app.games.a2z.com + ipaddress: 3.166.1.28 + - domain: origin-client.legacy-app.games.a2z.com + ipaddress: 3.164.65.191 - domain: origin-help.imdb.com ipaddress: 3.164.128.204 - domain: origin-help.imdb.com - ipaddress: 13.35.1.194 - - domain: origin-m.imdb.com - ipaddress: 13.32.1.188 + ipaddress: 13.32.1.65 - domain: origin-m.imdb.com - ipaddress: 108.156.1.8 - - domain: origin-m.imdb.com - ipaddress: 54.230.0.202 + ipaddress: 18.244.0.204 - domain: osusume.auone.jp - ipaddress: 204.246.177.26 + ipaddress: 13.32.2.109 - domain: osusume.auone.jp - ipaddress: 143.204.0.171 + ipaddress: 18.244.0.21 - domain: osusume.auone.jp - ipaddress: 3.165.1.13 - - domain: osusume.auone.jp - ipaddress: 3.164.65.20 - - domain: osusume.auone.jp - ipaddress: 205.251.206.116 + ipaddress: 205.251.249.63 - domain: osusume.auone.jp - ipaddress: 18.244.0.83 + ipaddress: 108.156.1.155 - domain: osusume.auone.jp - ipaddress: 205.251.249.63 - - domain: pa-cd-dev.com - ipaddress: 108.138.1.124 + ipaddress: 143.204.0.171 + - domain: p-codegeass.jp + ipaddress: 18.164.2.9 + - domain: p.dmm.co.jp + ipaddress: 99.86.0.236 - domain: pa-cd.com - ipaddress: 18.172.1.25 + ipaddress: 54.192.0.79 + - domain: packageinserts.bms.com + ipaddress: 3.165.1.63 - domain: pagoda21.com - ipaddress: 65.9.128.121 + ipaddress: 54.192.0.142 - domain: paltalk.com - ipaddress: 205.251.206.81 - - domain: passport.amazon.work - ipaddress: 3.164.66.94 - - domain: passport.amazon.work - ipaddress: 13.224.0.143 - - domain: password.amazonworkspaces.com - ipaddress: 13.224.0.126 + ipaddress: 3.166.1.63 + - domain: parsely.com + ipaddress: 13.32.2.61 + - domain: pass.auone.jp + ipaddress: 54.192.0.171 + - domain: pass.auone.jp + ipaddress: 54.192.2.3 - domain: password.amazonworkspaces.com - ipaddress: 18.244.0.150 + ipaddress: 65.9.129.173 - domain: password.amazonworkspaces.com - ipaddress: 204.246.177.182 - - domain: pc.cupido-777.com - ipaddress: 13.35.1.37 - - domain: pc.cupido-777.com - ipaddress: 3.164.65.58 + ipaddress: 3.165.0.144 + - domain: payment.global.rakuten.com + ipaddress: 3.164.2.70 + - domain: pcmax.jp + ipaddress: 143.204.0.165 - domain: pepedev.com ipaddress: 108.138.1.228 + - domain: perfeggsgame.com + ipaddress: 13.32.2.116 + - domain: physicswallah.org + ipaddress: 143.204.1.32 + - domain: pitangui.amazon.com + ipaddress: 65.9.129.138 - domain: playbest.net - ipaddress: 13.35.2.13 + ipaddress: 3.166.1.84 - domain: pocket.moz.works - ipaddress: 205.251.249.188 - - domain: pocket.moz.works - ipaddress: 13.35.0.61 - - domain: point-h.mercadopago.com - ipaddress: 13.35.1.76 + ipaddress: 13.224.2.97 + - domain: pod-point.com + ipaddress: 13.249.2.24 - domain: point-h.mercadopago.com - ipaddress: 99.86.0.101 - - domain: point.mercadopago.com - ipaddress: 18.172.1.169 + ipaddress: 3.164.65.195 - domain: point.mercadopago.com - ipaddress: 54.230.129.168 - - domain: polaris.lhinside.com - ipaddress: 18.154.2.76 + ipaddress: 3.168.2.133 - domain: portal-dev.cxdnext-apl.net - ipaddress: 18.244.0.77 + ipaddress: 3.165.0.128 - domain: portal.prod.cxdnext.co.jp ipaddress: 65.9.128.47 + - domain: portal.prod.cxdnext.co.jp + ipaddress: 13.32.1.219 - domain: prcp.pass.auone.jp - ipaddress: 99.86.0.232 + ipaddress: 204.246.169.102 - domain: prd1.cdn.pengine.revtech.glulive.com ipaddress: 108.138.0.41 - - domain: prd1.cdn.pengine.revtech.glulive.com - ipaddress: 3.164.2.34 - domain: primexonevue.com - ipaddress: 13.32.1.234 - - domain: prod.drupal.journalslibrary.nihr.ac.uk - ipaddress: 3.168.1.157 - - domain: product-downloads.atlassian.com - ipaddress: 3.164.64.137 - - domain: product-downloads.atlassian.com - ipaddress: 65.9.128.164 - - domain: product-downloads.atlassian.com - ipaddress: 13.224.0.228 - - domain: providers.mercadopago.com - ipaddress: 13.224.0.165 + ipaddress: 3.165.2.42 + - domain: primexonevue.com + ipaddress: 204.246.175.52 + - domain: primexonevue.com + ipaddress: 204.246.178.38 + - domain: prod.ota-cloudfront.net + ipaddress: 13.32.1.158 + - domain: prod.ota-cloudfront.net + ipaddress: 3.165.0.60 - domain: pubcerts-stage.licenses.adobe.com ipaddress: 13.35.1.139 + - domain: pubcerts.licenses.adobe.com + ipaddress: 3.166.2.24 - domain: qa.ring.com - ipaddress: 18.160.1.200 - - domain: qafafdg.com - ipaddress: 18.160.1.150 + ipaddress: 13.35.2.113 + - domain: qa.ring.com + ipaddress: 3.168.1.24 + - domain: qa3.mysound.jp + ipaddress: 204.246.177.115 + - domain: qobuz.com + ipaddress: 13.35.0.92 + - domain: qobuz.com + ipaddress: 205.251.249.201 - domain: qpyou.cn - ipaddress: 205.251.206.145 + ipaddress: 13.32.1.82 - domain: qpyou.cn - ipaddress: 3.165.1.30 + ipaddress: 205.251.206.145 + - domain: qtest.abcmouse.com + ipaddress: 3.164.129.32 - domain: r0.awsstatic.com - ipaddress: 3.164.66.2 + ipaddress: 3.166.0.3 + - domain: read.amazon.co.jp + ipaddress: 54.192.0.119 - domain: read.amazon.com - ipaddress: 143.204.1.56 + ipaddress: 54.230.0.209 - domain: recordings-api.sans.org ipaddress: 54.192.0.53 - - domain: recordings.sans.org - ipaddress: 54.192.2.65 - - domain: recordings.sans.org - ipaddress: 18.244.2.70 - - domain: resources-stage.licenses.adobe.com - ipaddress: 3.164.128.90 - - domain: resources.amazonwebapps.com - ipaddress: 143.204.1.228 + - domain: relay.amazon.com + ipaddress: 18.244.2.27 + - domain: rest.immobilienscout24.de + ipaddress: 18.172.1.200 + - domain: rest.immobilienscout24.de + ipaddress: 205.251.207.159 - domain: riesling.reactor-beta.e.chainalysis.com - ipaddress: 3.165.2.23 + ipaddress: 65.9.128.133 - domain: rimac.com - ipaddress: 18.244.0.72 + ipaddress: 13.32.1.52 - domain: ring.com - ipaddress: 13.35.1.28 + ipaddress: 3.164.2.24 - domain: s.salecycle.com ipaddress: 54.230.210.8 - - domain: s3-accelerate.amazonaws.com - ipaddress: 99.86.0.188 - - domain: samsungcloudsolution.com - ipaddress: 18.160.1.136 - - domain: samsungcloudsolution.com - ipaddress: 3.164.65.229 + - domain: s0.awsstatic.com + ipaddress: 54.230.129.149 + - domain: saas-template-test-mcopper.devex.cloudfront.aws.dev + ipaddress: 18.244.0.194 - domain: samsungcms.com - ipaddress: 205.251.249.3 - - domain: samsungcms.com - ipaddress: 18.160.2.3 - - domain: samsungcms.com - ipaddress: 18.172.1.3 + ipaddress: 3.164.128.2 - domain: samsungcms.com ipaddress: 99.86.0.111 - domain: samsungcms.com - ipaddress: 204.246.178.136 - - domain: samsungcms.com - ipaddress: 54.192.1.203 - - domain: samsungqbe.com - ipaddress: 143.204.0.117 - - domain: samsungqbe.com - ipaddress: 108.156.1.169 + ipaddress: 18.172.1.3 + - domain: samsungosp.com + ipaddress: 3.166.2.91 + - domain: samsungosp.com + ipaddress: 99.86.2.127 - domain: samsungqbe.com - ipaddress: 205.251.251.211 + ipaddress: 108.138.1.215 - domain: samsungqbe.com - ipaddress: 204.246.169.149 + ipaddress: 3.164.65.226 - domain: samsungqbe.com - ipaddress: 204.246.177.224 + ipaddress: 3.168.1.86 - domain: sandbox.grail.com - ipaddress: 205.251.249.208 + ipaddress: 3.168.0.117 - domain: sandbox.grail.com - ipaddress: 108.138.1.151 + ipaddress: 99.86.0.170 + - domain: scandalmania.jp + ipaddress: 205.251.249.202 - domain: scandalmania.jp - ipaddress: 18.244.2.35 + ipaddress: 3.165.0.33 + - domain: schoox.com + ipaddress: 3.166.2.131 - domain: secure.amob.jp ipaddress: 52.84.2.102 - - domain: secure.cs-pindrop.io - ipaddress: 18.172.2.73 - - domain: secure.cs-pindrop.io - ipaddress: 108.156.1.95 - - domain: secure.cs-pindrop.io - ipaddress: 54.230.0.95 - - domain: segment.build - ipaddress: 13.32.2.75 - - domain: segment.com - ipaddress: 13.224.0.36 + - domain: secure.amob.jp + ipaddress: 143.204.1.213 - domain: segment.com - ipaddress: 13.249.2.116 + ipaddress: 3.164.129.144 - domain: segment.com ipaddress: 204.246.177.202 - domain: sensors.apollox.cloud ipaddress: 54.192.1.100 - - domain: sensors.apollox.cloud - ipaddress: 54.239.130.97 + - domain: sentinel-test-2.amazon.com + ipaddress: 3.164.128.176 + - domain: seongju.people.aws.dev + ipaddress: 204.246.175.102 - domain: servicepoint.fluentretail.com ipaddress: 3.165.0.82 - domain: sftelemetry.sophos.com - ipaddress: 3.165.1.120 + ipaddress: 52.222.129.237 + - domain: sftelemetry.sophos.com + ipaddress: 205.251.251.6 - domain: sgcproducts.com - ipaddress: 3.164.64.86 + ipaddress: 18.244.1.90 + - domain: shan789.org + ipaddress: 54.230.226.9 + - domain: shopenzacta.com + ipaddress: 143.204.1.121 + - domain: sigdb.sftp.juniperclouds.net + ipaddress: 205.251.207.175 - domain: signage.ricoh.com - ipaddress: 108.138.0.95 - - domain: signifyd.com - ipaddress: 3.168.0.25 - - domain: silveregg.net - ipaddress: 13.224.0.124 - - domain: simple-workflow-stage.licenses.adobe.com - ipaddress: 3.165.2.102 + ipaddress: 18.238.2.94 - domain: simple-workflow-stage.licenses.adobe.com - ipaddress: 18.160.2.131 - - domain: simple-workflow-stage.licenses.adobe.com - ipaddress: 54.230.0.140 - - domain: simple-workflow.licenses.adobe.com - ipaddress: 143.204.0.24 - - domain: simple-workflow.licenses.adobe.com - ipaddress: 18.244.1.16 + ipaddress: 54.230.210.141 + - domain: skyalbania.mbeglobal.com + ipaddress: 205.251.249.92 + - domain: skyluxembourgtest.mbeglobal.com + ipaddress: 204.246.178.31 + - domain: skyluxembourgtest.mbeglobal.com + ipaddress: 3.168.0.198 - domain: slot-imas.jp - ipaddress: 54.230.210.63 - - domain: slow.amazon.com - ipaddress: 205.251.207.133 + ipaddress: 3.165.2.97 - domain: slow.amazon.com - ipaddress: 13.224.0.102 - - domain: smtown.com - ipaddress: 13.35.0.105 + ipaddress: 13.224.2.102 + - domain: smartspot.no + ipaddress: 65.9.128.2 - domain: smtown.com - ipaddress: 18.244.0.82 - - domain: smugmug.com - ipaddress: 3.168.1.156 + ipaddress: 3.165.2.78 - domain: smx-prod.nikecloud.com - ipaddress: 3.164.66.33 - - domain: smx-prod.nikecloud.com - ipaddress: 3.165.2.33 + ipaddress: 18.164.2.40 + - domain: smxuat-test.nikecloud.com + ipaddress: 54.230.225.170 + - domain: smxuat-test.nikecloud.com + ipaddress: 54.192.2.127 + - domain: snapfinance.com + ipaddress: 3.166.0.126 + - domain: snehal.live + ipaddress: 13.35.0.118 - domain: sotappm.auone.jp - ipaddress: 205.251.251.49 - - domain: soundcloud.io - ipaddress: 3.160.2.135 - - domain: spcentral.amazon.com - ipaddress: 143.204.1.205 - - domain: spcentral.amazon.com - ipaddress: 99.86.2.17 + ipaddress: 13.35.1.181 + - domain: spatial.chat + ipaddress: 3.165.0.95 - domain: specialized.com - ipaddress: 54.230.226.138 - - domain: ss-api-stg-fb.fujifilm.com - ipaddress: 13.224.2.28 + ipaddress: 18.244.1.110 + - domain: st.pass.auone.jp + ipaddress: 205.251.249.139 + - domain: st.pass.auone.jp + ipaddress: 13.249.2.44 + - domain: st.pass.auone.jp + ipaddress: 18.244.2.40 - domain: stack02.ejawsdemo.com - ipaddress: 3.164.128.4 + ipaddress: 65.9.129.156 - domain: stage-spectrum.net - ipaddress: 3.165.2.37 + ipaddress: 99.86.0.167 - domain: stage.amob.jp - ipaddress: 3.160.2.120 - - domain: stage.cf.md.bbci.co.uk - ipaddress: 143.204.0.75 + ipaddress: 13.32.1.228 - domain: stage.cf.md.bbci.co.uk - ipaddress: 108.138.0.17 + ipaddress: 3.166.0.132 - domain: stage.cf.md.bbci.co.uk ipaddress: 3.164.129.232 - domain: stage2.ota.ing.carrier.com - ipaddress: 3.164.129.173 - - domain: static.ddog-gov.com - ipaddress: 54.230.210.115 - - domain: static.flickr.com - ipaddress: 205.251.251.79 - - domain: static.lendingclub.com - ipaddress: 3.165.2.98 + ipaddress: 65.9.129.215 + - domain: stage2.ota.ing.carrier.com + ipaddress: 18.160.1.9 + - domain: stage2.ota.ing.carrier.com + ipaddress: 143.204.0.55 + - domain: static.counsyl.com + ipaddress: 13.32.1.59 + - domain: static.counsyl.com + ipaddress: 18.244.1.49 + - domain: static.resta.co.kr + ipaddress: 18.244.0.217 + - domain: static.savemkt.com + ipaddress: 13.249.2.83 + - domain: stg.ota-pkg-dl.smart-access.io + ipaddress: 3.164.64.139 - domain: stg.pass.auone.jp ipaddress: 65.9.128.192 + - domain: stg.pass.auone.jp + ipaddress: 18.172.2.96 - domain: stg.sotappm.auone.jp - ipaddress: 54.239.130.117 - - domain: storeanalytics.amazon.com - ipaddress: 54.192.1.230 - - domain: storeanalytics.amazon.com - ipaddress: 3.165.2.36 + ipaddress: 18.244.2.85 + - domain: stg.sotappm.auone.jp + ipaddress: 204.246.178.104 + - domain: support.atlassian.com + ipaddress: 13.35.2.40 + - domain: support.atlassian.com + ipaddress: 143.204.0.54 + - domain: support.atlassian.com + ipaddress: 18.244.0.122 + - domain: support.atlassian.com + ipaddress: 205.251.206.173 - domain: svgstudio.com - ipaddress: 99.86.2.99 + ipaddress: 205.251.207.20 - domain: t13-idcms.dev.lendingmanager.docomo.ne.jp - ipaddress: 13.224.0.183 + ipaddress: 3.164.128.116 - domain: tbkcreative.com - ipaddress: 18.244.0.92 + ipaddress: 108.156.1.119 - domain: tbkcreative.com - ipaddress: 205.251.249.14 - - domain: test-login.kataweb.it - ipaddress: 205.251.249.183 - - domain: test-login.kataweb.it - ipaddress: 18.244.1.155 - - domain: test.dunya-analytics.com - ipaddress: 204.246.177.206 - - domain: test.dunya-analytics.com - ipaddress: 205.251.249.30 - - domain: test.wpcp.shiseido.co.jp - ipaddress: 65.9.128.84 - - domain: test.wpcp.shiseido.co.jp - ipaddress: 108.138.1.132 - - domain: thegrio-tv.com - ipaddress: 3.165.1.4 + ipaddress: 3.166.1.86 + - domain: termsmobile.com + ipaddress: 204.246.175.130 + - domain: test.dashboard.bandwidth.com + ipaddress: 205.251.207.16 + - domain: test.dashboard.bandwidth.com + ipaddress: 108.138.0.16 + - domain: thaiwin99.com + ipaddress: 13.224.0.27 + - domain: thaiwin99.com + ipaddress: 54.230.226.113 - domain: thestartmagazine.com - ipaddress: 18.172.1.38 - - domain: theta360.biz - ipaddress: 13.224.0.110 - - domain: theta360.biz - ipaddress: 3.164.2.86 + ipaddress: 18.244.0.37 - domain: thetvdb.com - ipaddress: 54.230.0.118 - - domain: tomuat.pfdfoods.com.au - ipaddress: 18.172.2.54 - - domain: tomuat.pfdfoods.com.au - ipaddress: 3.164.130.53 - - domain: topix.jlrext.com - ipaddress: 3.164.129.145 - - domain: topix.jlrext.com - ipaddress: 99.86.0.27 - - domain: twilio.com - ipaddress: 18.238.2.69 - - domain: twilio.com - ipaddress: 54.192.0.118 - - domain: twitchcdn-shadow.net - ipaddress: 52.222.129.33 - - domain: twitchcdn-shadow.net - ipaddress: 99.86.2.75 - - domain: twitchcdn.net - ipaddress: 204.246.175.173 - - domain: unrealengine.com - ipaddress: 3.165.1.146 - - domain: unrealengine.com - ipaddress: 108.138.1.186 + ipaddress: 18.172.1.72 + - domain: tolkien.bookdepository.com + ipaddress: 204.246.178.78 + - domain: tour.ultratour.com.br + ipaddress: 54.192.1.66 + - domain: undercovertourist.com + ipaddress: 3.168.1.196 + - domain: undercovertourist.com + ipaddress: 13.224.0.67 - domain: update.hicloud.com - ipaddress: 54.230.0.24 - - domain: updates.eatonsecureconnect.com - ipaddress: 143.204.1.231 + ipaddress: 18.160.1.171 - domain: updates.lacework.net - ipaddress: 3.164.128.23 - - domain: uploads.skyhighnetworks.com - ipaddress: 3.168.0.139 + ipaddress: 108.138.0.5 - domain: v.show - ipaddress: 65.9.128.35 - - domain: valorlatitude.com - ipaddress: 3.165.0.25 - - domain: valorlatitude.com - ipaddress: 143.204.1.90 + ipaddress: 13.224.0.231 + - domain: ventaDigital.tst.certicamara.com + ipaddress: 65.9.128.206 + - domain: video.counsyl.com + ipaddress: 205.251.249.133 - domain: video.counsyl.com - ipaddress: 13.32.1.140 + ipaddress: 18.172.2.121 - domain: video.strb.dev - ipaddress: 18.160.1.174 + ipaddress: 65.9.128.118 - domain: video.stro.be - ipaddress: 205.251.251.140 + ipaddress: 3.164.65.142 - domain: video.stro.be ipaddress: 54.192.2.140 + - domain: video.stro.be + ipaddress: 18.160.1.10 - domain: videos.sonybiotechnology.com - ipaddress: 3.164.64.239 + ipaddress: 18.154.2.45 - domain: views.putter.asapdev.mediba.jp ipaddress: 54.192.0.110 - - domain: vlive-simulcast.sans.org - ipaddress: 204.246.169.96 - - domain: vlive-simulcast.sans.org - ipaddress: 204.246.177.102 - - domain: vnggames.net - ipaddress: 3.164.128.231 - - domain: vnggames.net - ipaddress: 3.165.1.2 - - domain: webcast.sans.org - ipaddress: 18.172.1.44 + - domain: web.familyclub.jp + ipaddress: 3.166.1.39 - domain: webview-jp.bh3.com ipaddress: 54.230.1.190 - - domain: weixiumq.com - ipaddress: 205.251.206.77 - - domain: what3words.com - ipaddress: 18.160.1.133 - domain: what3words.com ipaddress: 65.9.128.63 - - domain: wish.com - ipaddress: 205.251.249.103 - - domain: workflow-stage.licenses.adobe.com - ipaddress: 3.164.64.37 - - domain: workflow.licenses.adobe.com - ipaddress: 18.244.1.93 - - domain: workflow.licenses.adobe.com - ipaddress: 108.138.1.107 - - domain: ws.sonos.com - ipaddress: 3.164.130.65 + - domain: wpcp.shiseido.co.jp + ipaddress: 3.165.0.43 - domain: ws.sonos.com - ipaddress: 205.251.249.69 + ipaddress: 3.166.1.62 + - domain: www.08.sbx.user-services.irobotapi.com + ipaddress: 3.166.2.98 + - domain: www.3ds-cc.hsbc.com.my + ipaddress: 13.32.2.40 + - domain: www.3ds-cc.hsbc.com.my + ipaddress: 205.251.206.14 - domain: www.3ds-dc.hsbc.com.bd ipaddress: 52.222.129.150 - - domain: www.abc-mart.biz - ipaddress: 54.182.0.214 + - domain: www.3ds-dc.hsbc.com.bd + ipaddress: 143.204.1.70 + - domain: www.3ds-dc.hsbc.com.sg + ipaddress: 54.230.225.106 + - domain: www.53.localytics.com + ipaddress: 18.244.1.23 - domain: www.abc-mart.net - ipaddress: 18.164.2.15 + ipaddress: 54.230.0.20 - domain: www.abc-mart.net - ipaddress: 18.244.0.13 - - domain: www.ably.io - ipaddress: 205.251.207.151 + ipaddress: 99.86.0.6 + - domain: www.accordiagolf.com + ipaddress: 52.84.2.48 + - domain: www.account.samsung.com + ipaddress: 13.35.0.211 + - domain: www.account.samsung.com + ipaddress: 54.230.0.96 - domain: www.acer.org - ipaddress: 13.35.1.50 - - domain: www.adbecrsl.com - ipaddress: 3.165.1.131 - - domain: www.adbecrsl.com - ipaddress: 13.224.0.187 - - domain: www.adbephotos.com - ipaddress: 65.9.128.130 - - domain: www.amagi.tv - ipaddress: 3.164.2.44 - - domain: www.amazon.co.in - ipaddress: 3.165.0.21 - - domain: www.amazon.com - ipaddress: 3.164.128.160 + ipaddress: 52.222.129.200 + - domain: www.addisonlee.com + ipaddress: 204.246.177.119 + - domain: www.amazon.ie + ipaddress: 3.166.1.68 - domain: www.amazon.it - ipaddress: 13.224.2.12 - - domain: www.ap-southeast-2.multichdev.a-sharedinfra.net - ipaddress: 54.192.2.93 + ipaddress: 13.224.0.12 + - domain: www.amcentral.amazon.dev + ipaddress: 3.166.0.139 + - domain: www.ap-southeast-2.multichnonprod.a-sharedinfra.net + ipaddress: 13.32.2.131 - domain: www.ap-southeast-2.multichprod.a-sharedinfra.net - ipaddress: 3.168.0.51 - - domain: www.app-box.jp - ipaddress: 13.35.0.125 - - domain: www.audible.ca - ipaddress: 205.251.206.195 - - domain: www.audible.com - ipaddress: 3.164.128.168 - - domain: www.audible.com.au - ipaddress: 18.244.1.78 + ipaddress: 18.244.1.53 + - domain: www.asets.io + ipaddress: 3.165.0.191 + - domain: www.audible.co.uk + ipaddress: 3.164.128.224 + - domain: www.audible.co.uk + ipaddress: 18.164.2.73 - domain: www.audible.com.au - ipaddress: 205.251.249.16 + ipaddress: 3.166.0.147 + - domain: www.audible.de + ipaddress: 18.244.1.46 + - domain: www.audible.de + ipaddress: 205.251.206.99 - domain: www.audible.fr - ipaddress: 13.35.0.164 + ipaddress: 3.168.1.164 - domain: www.audible.it ipaddress: 3.165.2.72 + - domain: www.autopartsbridge.com + ipaddress: 65.9.129.93 + - domain: www.awsapps.com + ipaddress: 108.156.1.199 - domain: www.awsapps.com - ipaddress: 18.238.2.132 + ipaddress: 18.244.0.10 - domain: www.awsapps.com - ipaddress: 54.192.1.178 + ipaddress: 13.249.2.128 - domain: www.awsapps.com - ipaddress: 18.160.2.108 + ipaddress: 18.160.1.228 - domain: www.awsapps.com - ipaddress: 205.251.206.179 + ipaddress: 3.166.2.51 - domain: www.awsapps.com - ipaddress: 54.230.210.42 + ipaddress: 3.164.64.102 - domain: www.awsapps.com - ipaddress: 18.172.2.43 + ipaddress: 3.165.0.8 - domain: www.awsapps.com - ipaddress: 18.244.1.118 + ipaddress: 3.166.2.44 - domain: www.awsapps.com - ipaddress: 54.230.210.24 + ipaddress: 3.164.65.53 - domain: www.awsapps.com - ipaddress: 3.165.1.76 + ipaddress: 13.35.0.227 - domain: www.awsapps.com - ipaddress: 3.160.2.139 + ipaddress: 205.251.206.228 - domain: www.awsapps.com - ipaddress: 13.35.2.125 + ipaddress: 3.168.1.84 - domain: www.awsapps.com - ipaddress: 3.160.2.47 + ipaddress: 13.35.2.23 - domain: www.awsapps.com - ipaddress: 13.35.0.227 - - domain: www.awstennessee.com - ipaddress: 54.230.0.25 + ipaddress: 3.166.0.107 + - domain: www.awsapps.com + ipaddress: 143.204.1.24 + - domain: www.awsapps.com + ipaddress: 54.230.225.168 + - domain: www.awsapps.com + ipaddress: 13.35.0.100 + - domain: www.awsapps.com + ipaddress: 13.35.1.132 - domain: www.bcovlive.io - ipaddress: 143.204.1.160 - - domain: www.beta.awsapps.com - ipaddress: 204.246.177.52 - - domain: www.beta.awsapps.com - ipaddress: 3.165.1.39 - - domain: www.binance.sg - ipaddress: 204.246.178.22 - - domain: www.binance.sg - ipaddress: 3.168.0.45 + ipaddress: 3.168.1.122 + - domain: www.bcovlive.io + ipaddress: 204.246.175.150 + - domain: www.bcovlive.io + ipaddress: 65.9.128.156 - domain: www.binance.sg ipaddress: 3.165.1.46 + - domain: www.bnet.run + ipaddress: 52.222.129.27 + - domain: www.bnet.run + ipaddress: 108.138.1.70 - domain: www.brightcloud.com - ipaddress: 18.164.2.102 - - domain: www.c-cdsknn-test.net - ipaddress: 204.246.175.184 - - domain: www.capitalfundinglab.com - ipaddress: 54.230.0.193 - - domain: www.ceffa0795.com - ipaddress: 13.224.0.153 - - domain: www.ceffa0795.com - ipaddress: 108.138.1.203 - - domain: www.cf-vps.cf-embed.net - ipaddress: 54.182.2.7 - - domain: www.chartboost.com - ipaddress: 18.164.2.124 - - domain: www.chatbar.me - ipaddress: 99.86.2.90 + ipaddress: 18.244.1.89 + - domain: www.c-cdsknn.net + ipaddress: 18.244.0.80 + - domain: www.c-cdsknn.net + ipaddress: 204.246.169.165 + - domain: www.cafewellstage.com + ipaddress: 13.32.1.162 - domain: www.clearlinkdata.com - ipaddress: 3.164.64.115 - - domain: www.clevercards.link - ipaddress: 3.168.2.131 - - domain: www.clevercards.link - ipaddress: 3.164.128.135 - - domain: www.cnnio.net - ipaddress: 54.192.2.4 - - domain: www.corp.build.rhinternal.net - ipaddress: 18.164.2.135 - - domain: www.corp.rde.rhinternal.net - ipaddress: 205.251.251.135 - - domain: www.corp.rde.rhinternal.net - ipaddress: 18.244.0.154 - - domain: www.corp.robinhood.com - ipaddress: 205.251.251.238 + ipaddress: 3.168.0.111 + - domain: www.clearlinkdata.com + ipaddress: 3.166.1.110 + - domain: www.clearlinkdata.com + ipaddress: 3.165.0.111 + - domain: www.corp.dev.rhinternal.net + ipaddress: 52.222.129.209 - domain: www.corp.test.rhinternal.net - ipaddress: 54.192.1.73 - - domain: www.dazn.com - ipaddress: 3.160.2.15 - - domain: www.dazn.com - ipaddress: 54.230.225.228 - - domain: www.dazndn.com - ipaddress: 3.168.0.66 + ipaddress: 18.164.2.70 + - domain: www.cquotient.com + ipaddress: 13.224.2.139 + - domain: www.culqi.com + ipaddress: 205.251.207.144 + - domain: www.d2c.ne.jp + ipaddress: 204.246.178.3 + - domain: www.dataeng.cbssports.cloud + ipaddress: 18.154.2.27 + - domain: www.dataeng.cbssports.cloud + ipaddress: 13.35.1.16 - domain: www.dazndn.com - ipaddress: 143.204.0.85 - - domain: www.dcm-icwweb-dev.com - ipaddress: 18.172.1.13 - - domain: www.dealer-fx.com - ipaddress: 3.165.0.89 + ipaddress: 3.164.129.68 - domain: www.denso-ten.com - ipaddress: 3.164.130.91 + ipaddress: 3.166.0.86 + - domain: www.denso-ten.com + ipaddress: 18.164.2.107 - domain: www.dev-business.amazon.com - ipaddress: 3.168.0.175 + ipaddress: 18.244.2.92 - domain: www.dev.awsapps.com - ipaddress: 18.244.1.156 - - domain: www.dev.coro.net - ipaddress: 99.86.0.187 - - domain: www.dev.rhinternal.net - ipaddress: 3.164.129.109 - - domain: www.dn.nexoncdn.co.kr - ipaddress: 143.204.1.210 - - domain: www.docebosaas.com - ipaddress: 3.168.1.4 + ipaddress: 3.166.1.146 - domain: www.docebosaas.com ipaddress: 205.251.207.50 - - domain: www.docomo-icc.com - ipaddress: 13.35.2.92 - - domain: www.dr.sompo-japan.co.jp - ipaddress: 204.246.177.137 - - domain: www.dta.netflix.com - ipaddress: 52.222.129.87 - - domain: www.duoledominooffical.com - ipaddress: 18.244.0.178 - - domain: www.ebookstore.sony.jp - ipaddress: 13.35.2.55 + - domain: www.docebosaas.com + ipaddress: 18.244.2.113 + - domain: www.docebosaas.com + ipaddress: 3.164.65.3 + - domain: www.docebosaas.com + ipaddress: 3.165.2.4 + - domain: www.docebosaas.com + ipaddress: 3.168.1.4 + - domain: www.dst.vpsvc.com + ipaddress: 3.166.0.109 - domain: www.ebookstore.sony.jp - ipaddress: 13.35.1.11 + ipaddress: 3.166.2.35 - domain: www.ebookstore.sony.jp - ipaddress: 108.138.1.230 - - domain: www.eikono.hjk.jp - ipaddress: 3.168.0.78 + ipaddress: 99.86.0.23 - domain: www.ejawsdemo.com - ipaddress: 3.168.1.89 + ipaddress: 13.32.2.113 + - domain: www.endpoint.ubiquity.aws.a2z.com + ipaddress: 54.230.210.90 + - domain: www.eng.bnet.run + ipaddress: 108.156.2.134 + - domain: www.enjoy.point.auone.jp + ipaddress: 18.172.1.70 - domain: www.enjoy.point.auone.jp - ipaddress: 54.230.225.87 - - domain: www.eu-west-2.cf-embed.net - ipaddress: 204.246.178.16 + ipaddress: 3.166.2.65 + - domain: www.execute-api.ap-south-2.amazonaws.com + ipaddress: 204.246.177.143 - domain: www.execute-api.eu-south-2.amazonaws.com - ipaddress: 54.230.226.48 - - domain: www.explore.skillbuilder.aws - ipaddress: 3.165.0.122 - - domain: www.fbiwpro-dev.fujifilm.com - ipaddress: 3.165.0.137 - - domain: www.freshdesk.com - ipaddress: 143.204.1.6 - - domain: www.freshdesk.com - ipaddress: 18.244.2.5 - - domain: www.gamecircus.com - ipaddress: 143.204.0.62 + ipaddress: 3.168.1.70 + - domain: www.execute-api.eu-south-2.amazonaws.com + ipaddress: 205.251.251.67 + - domain: www.face-pay-pf.com + ipaddress: 205.251.251.212 + - domain: www.fastretailing.com + ipaddress: 3.166.0.127 + - domain: www.findawayworld.com + ipaddress: 54.192.2.62 + - domain: www.frms.link + ipaddress: 3.165.0.28 - domain: www.gamma.awsapps.com - ipaddress: 54.192.0.154 + ipaddress: 205.251.206.114 - domain: www.gamma.awsapps.com ipaddress: 18.164.2.113 - - domain: www.godrejenterprises.com - ipaddress: 3.164.66.7 + - domain: www.gamma.awsapps.com + ipaddress: 54.192.0.154 + - domain: www.gamma.awsapps.com + ipaddress: 18.160.1.118 + - domain: www.gamma.awsapps.com + ipaddress: 205.251.251.154 + - domain: www.gangabox.com + ipaddress: 204.246.177.50 + - domain: www.gdl.imtxwy.com + ipaddress: 3.165.0.70 + - domain: www.gdl.imtxwy.com + ipaddress: 18.244.2.75 - domain: www.goldspotmedia.com ipaddress: 18.238.2.6 - - domain: www.goldspotmedia.com - ipaddress: 18.244.2.6 - - domain: www.gph.imtxwy.com - ipaddress: 205.251.249.48 - - domain: www.green-entrepreneurship.co - ipaddress: 108.138.0.203 + - domain: www.grandegamessettlement.com + ipaddress: 18.164.2.14 + - domain: www.hfblcj.com + ipaddress: 54.192.0.239 + - domain: www.homeden.kr + ipaddress: 108.138.0.127 + - domain: www.hosted-commerce.net + ipaddress: 18.154.2.32 + - domain: www.i-ready.com + ipaddress: 3.168.1.137 - domain: www.iconerisasettlement.com - ipaddress: 52.222.129.8 + ipaddress: 52.84.2.88 - domain: www.iconerisasettlement.com ipaddress: 54.192.2.122 - - domain: www.idexximagebank.com - ipaddress: 13.32.1.149 - domain: www.imaginationunwired.com - ipaddress: 54.192.0.126 - - domain: www.imtxwy.com - ipaddress: 205.251.251.23 - - domain: www.imtxwy.com - ipaddress: 3.165.1.17 - - domain: www.innov8.space - ipaddress: 54.192.1.221 - - domain: www.iot.irobot.cn - ipaddress: 143.204.1.31 + ipaddress: 205.251.206.47 + - domain: www.imaginationunwired.com + ipaddress: 18.238.2.46 + - domain: www.infomedia.com.au + ipaddress: 18.238.2.76 + - domain: www.infomedia.com.au + ipaddress: 54.239.130.88 - domain: www.iot.irobot.cn - ipaddress: 18.154.2.23 - - domain: www.kvszl1639.com - ipaddress: 3.165.0.183 + ipaddress: 13.224.0.146 + - domain: www.itbenvisavale.com + ipaddress: 52.222.129.155 + - domain: www.jerrygame.net + ipaddress: 3.165.1.82 + - domain: www.jerrygame.net + ipaddress: 3.168.0.83 + - domain: www.jerrygame.net + ipaddress: 65.9.128.237 + - domain: www.kaltura.com + ipaddress: 54.230.210.89 + - domain: www.kihnoframe.com + ipaddress: 18.238.2.85 + - domain: www.koa.or.kr + ipaddress: 3.164.128.147 + - domain: www.linebc.jp + ipaddress: 3.166.2.124 + - domain: www.listrakbi.com + ipaddress: 13.32.1.12 - domain: www.localsecurity.org ipaddress: 18.244.1.196 - - domain: www.localsecurity.org - ipaddress: 143.204.0.152 - - domain: www.logpostback.com - ipaddress: 3.164.65.90 + - domain: www.loggly.com + ipaddress: 13.32.1.165 - domain: www.lottedfs.com - ipaddress: 54.230.225.79 + ipaddress: 65.9.128.81 - domain: www.lottedfs.com - ipaddress: 13.32.1.74 + ipaddress: 54.192.2.16 - domain: www.lottedfs.com - ipaddress: 54.192.1.70 - - domain: www.ltw.org - ipaddress: 18.160.2.33 + ipaddress: 54.230.210.55 - domain: www.madinetmasr.com - ipaddress: 3.164.65.179 - - domain: www.maria-pieroni.com - ipaddress: 54.192.0.104 + ipaddress: 13.35.1.69 + - domain: www.madinetmasr.com + ipaddress: 13.224.0.7 + - domain: www.mc2.bizppf.net + ipaddress: 143.204.1.222 + - domain: www.media.fashion-store-test.zalan.do + ipaddress: 13.224.2.55 + - domain: www.media.fashion-store-test.zalan.do + ipaddress: 13.35.1.210 + - domain: www.midasplayer.com + ipaddress: 13.35.0.50 + - domain: www.midasplayer.com + ipaddress: 18.160.1.26 + - domain: www.mie-cdn.com + ipaddress: 3.164.65.66 - domain: www.molitics.in - ipaddress: 3.164.130.136 - - domain: www.mozorg.moz.works - ipaddress: 54.230.225.201 + ipaddress: 3.168.1.128 - domain: www.myharmony.com - ipaddress: 13.224.0.127 - - domain: www.nanocosmos.de - ipaddress: 18.160.1.139 + ipaddress: 13.224.2.127 - domain: www.nanocosmos.de ipaddress: 3.165.1.58 - - domain: www.navigacloud.com - ipaddress: 108.138.1.88 - domain: www.navitime.jp - ipaddress: 3.164.65.101 + ipaddress: 3.164.128.103 + - domain: www.navitime.jp + ipaddress: 54.230.210.10 - domain: www.navitime.jp ipaddress: 3.165.2.99 - - domain: www.netdespatch.com - ipaddress: 18.244.0.128 - - domain: www.neuweb.biz - ipaddress: 205.251.251.89 - - domain: www.nomadicpod.com - ipaddress: 99.86.0.144 - domain: www.nrd.netflix.com - ipaddress: 3.164.129.209 - - domain: www.offerup-int.com - ipaddress: 205.251.249.182 + ipaddress: 65.9.129.160 + - domain: www.nrd.netflix.com + ipaddress: 18.172.1.37 + - domain: www.offerup-stg.com + ipaddress: 108.138.1.127 + - domain: www.offerup-stg.com + ipaddress: 108.156.1.138 + - domain: www.onlineqrcode.com + ipaddress: 18.244.1.127 - domain: www.onlineqrcode.com ipaddress: 143.204.0.131 - - domain: www.paxstore.us - ipaddress: 3.165.2.119 - - domain: www.pearsondev.com - ipaddress: 54.192.0.98 + - domain: www.oplign.com + ipaddress: 54.230.210.58 + - domain: www.ota.ing.carrier.com + ipaddress: 205.251.251.126 + - domain: www.playfirst.com + ipaddress: 3.164.130.73 - domain: www.playfirst.com - ipaddress: 99.86.2.73 + ipaddress: 54.230.225.189 - domain: www.plaync.com ipaddress: 108.156.1.131 - - domain: www.playnccdn.com - ipaddress: 13.35.1.2 - - domain: www.playnccdn.com - ipaddress: 54.230.225.151 - - domain: www.playnccdn.com - ipaddress: 3.164.65.117 - - domain: www.playnccdn.com - ipaddress: 205.251.249.91 - - domain: www.primevideo.com - ipaddress: 54.230.225.107 - domain: www.production.scrabble.withbuddies.com - ipaddress: 18.172.2.119 - - domain: www.project-xeno.com - ipaddress: 54.182.2.139 + ipaddress: 143.204.1.142 - domain: www.ps.ccc.edu - ipaddress: 18.244.1.64 - - domain: www.pureprepaid.co.uk - ipaddress: 143.204.1.212 - - domain: www.qa.coro.net - ipaddress: 205.251.207.212 - - domain: www.rapidapi.cloud - ipaddress: 143.204.1.34 - - domain: www.rapidapi.cloud - ipaddress: 18.172.2.49 - - domain: www.razorpay.com - ipaddress: 3.164.66.14 + ipaddress: 3.165.2.61 + - domain: www.psoft.actransit.org + ipaddress: 205.251.251.5 + - domain: www.psoft.actransit.org + ipaddress: 205.251.207.45 + - domain: www.puect5133.com + ipaddress: 204.246.177.48 + - domain: www.qa.tmsimg.com + ipaddress: 3.165.2.68 - domain: www.rde.rhinternal.net ipaddress: 65.9.128.13 - domain: www.rde.rhinternal.net - ipaddress: 54.192.1.197 - - domain: www.readingiq.com - ipaddress: 13.224.2.131 - - domain: www.reconvelocity.com - ipaddress: 3.165.0.81 + ipaddress: 18.160.1.102 - domain: www.reconvelocity.com ipaddress: 3.168.0.81 - domain: www.rfksrv.com ipaddress: 3.164.64.110 - - domain: www.riiiver.com - ipaddress: 3.164.2.53 - - domain: www.riiiver.com - ipaddress: 54.239.130.113 - - domain: www.rindegastos.com - ipaddress: 54.230.210.50 - domain: www.rindegastos.com - ipaddress: 3.168.1.191 - - domain: www.rkastech.com - ipaddress: 18.244.0.187 - - domain: www.rockabox.co - ipaddress: 18.172.2.97 + ipaddress: 13.35.1.73 + - domain: www.saasian.com + ipaddress: 3.164.128.22 - domain: www.samsungsmartcam.com - ipaddress: 13.32.2.11 + ipaddress: 3.168.0.8 - domain: www.samsungsmartcam.com - ipaddress: 52.222.129.11 + ipaddress: 18.244.1.8 + - domain: www.santen-group.jp + ipaddress: 99.86.0.102 + - domain: www.santen-group.jp + ipaddress: 13.35.1.168 + - domain: www.secure.coro.net + ipaddress: 205.251.206.230 - domain: www.sellercentral.amazon.dev - ipaddress: 143.204.1.197 - - domain: www.shufu-job.jp - ipaddress: 3.164.2.136 - - domain: www.shufu-job.jp - ipaddress: 205.251.207.166 + ipaddress: 18.160.1.202 + - domain: www.sigalert.com + ipaddress: 204.246.169.7 + - domain: www.silverpeak.cloud + ipaddress: 3.166.2.27 + - domain: www.sodexomyway.com + ipaddress: 99.86.2.10 - domain: www.sodexomyway.com - ipaddress: 18.154.2.10 + ipaddress: 18.172.2.61 + - domain: www.sodexomyway.com + ipaddress: 18.172.1.10 + - domain: www.sq01.test.boreas.cloud + ipaddress: 54.230.0.103 + - domain: www.srv.ygles.com + ipaddress: 204.246.175.88 - domain: www.srv.ygles.com - ipaddress: 18.244.2.59 + ipaddress: 3.164.66.59 - domain: www.srv.ygles.com - ipaddress: 13.224.0.209 + ipaddress: 204.246.177.17 - domain: www.srv.ygles.com - ipaddress: 3.164.65.95 + ipaddress: 205.251.207.81 - domain: www.srv.ygles.com ipaddress: 204.246.177.94 - domain: www.srv.ygles.com - ipaddress: 13.35.0.48 + ipaddress: 54.192.0.40 + - domain: www.srv.ygles.com + ipaddress: 65.9.128.71 - domain: www.srv.ygles.com - ipaddress: 108.138.1.231 + ipaddress: 3.165.1.69 + - domain: www.ssacdn.com + ipaddress: 18.160.1.105 + - domain: www.stage-au1.twilio.com + ipaddress: 204.246.175.115 + - domain: www.stage-au1.twilio.com + ipaddress: 3.164.129.183 + - domain: www.stage.kinesso.ninja + ipaddress: 18.160.2.112 + - domain: www.stage.kinesso.ninja + ipaddress: 3.164.66.82 + - domain: www.stage.twilio.com + ipaddress: 54.192.0.190 - domain: www.staging.consumer.payscale.com - ipaddress: 143.204.1.185 - - domain: www.staging.thescore.com - ipaddress: 54.192.0.36 + ipaddress: 65.9.128.153 - domain: www.staging.thescore.com ipaddress: 54.230.226.60 - domain: www.startrek.digitgaming.com - ipaddress: 54.230.226.38 - - domain: www.swipesense.com - ipaddress: 3.168.1.63 + ipaddress: 18.164.2.36 + - domain: www.startrek.digitgaming.com + ipaddress: 54.230.225.38 + - domain: www.stg.smartpass.auone.jp + ipaddress: 54.230.225.94 + - domain: www.stg.smartpass.auone.jp + ipaddress: 54.192.2.70 + - domain: www.stiiizy.com + ipaddress: 18.172.1.50 + - domain: www.stiiizy.com + ipaddress: 204.246.177.197 + - domain: www.superservice.cn + ipaddress: 3.164.128.150 + - domain: www.td1.nso.nintendo.net + ipaddress: 18.238.2.70 - domain: www.test.iot.irobotapi.com - ipaddress: 205.251.251.20 + ipaddress: 3.168.0.115 - domain: www.test.iot.irobotapi.com ipaddress: 54.192.1.213 + - domain: www.test.iot.irobotapi.com + ipaddress: 205.251.251.162 + - domain: www.test.iot.irobotapi.com + ipaddress: 18.172.1.117 + - domain: www.test.iot.irobotapi.com + ipaddress: 3.165.1.132 + - domain: www.test.iot.irobotapi.com + ipaddress: 18.244.2.117 - domain: www.test.iot.irobotapi.com ipaddress: 3.165.0.46 - domain: www.test.iot.irobotapi.com - ipaddress: 143.204.1.68 + ipaddress: 3.164.129.75 + - domain: www.test.iot.irobotapi.com + ipaddress: 18.244.1.124 + - domain: www.test.iot.irobotapi.com + ipaddress: 13.32.1.136 + - domain: www.thescore.com + ipaddress: 3.165.2.115 + - domain: www.thinknearhub.com + ipaddress: 3.165.2.62 + - domain: www.tianmaoyihao5.com + ipaddress: 54.230.226.23 - domain: www.ticketsimply.co.in - ipaddress: 65.9.128.8 + ipaddress: 204.246.169.173 + - domain: www.tkpharos.com + ipaddress: 205.251.251.16 - domain: www.tl-dr.tv - ipaddress: 3.164.65.180 - - domain: www.travelhook.com - ipaddress: 52.84.2.38 - - domain: www.web3ex.net - ipaddress: 18.244.1.218 - - domain: www.webdamdb.com - ipaddress: 108.138.1.33 - - domain: www.welcomesoftware.com - ipaddress: 54.192.1.207 - - domain: www.welcomesoftware.com - ipaddress: 54.182.2.52 - - domain: x-aec9e69.com - ipaddress: 52.222.129.55 - - domain: x-aec9e69.com - ipaddress: 3.165.2.110 - - domain: xiti.com - ipaddress: 54.192.1.99 + ipaddress: 205.251.249.101 + - domain: www.tmsimg.com + ipaddress: 3.168.1.88 + - domain: www.tosconfig.com + ipaddress: 54.230.225.173 + - domain: www.uniqlo.com + ipaddress: 18.172.1.227 + - domain: www.unrulymedia.com + ipaddress: 13.249.2.46 + - domain: www.wello.tech + ipaddress: 3.164.65.174 - domain: yourprojects-pge.com ipaddress: 3.164.64.52 + - domain: yourprojects-pge.com + ipaddress: 108.156.1.133 - domain: zimbra.com - ipaddress: 13.224.0.130 + ipaddress: 65.9.129.78 + - domain: zuora.identity.fcl-01.fcagcv.com + ipaddress: 18.160.2.89 + - domain: zurple.com + ipaddress: 204.246.175.61 masqueradesets: cloudflare: [] cloudfront: *cfmasq diff --git a/flashlight.go b/flashlight.go index 1ad90b698..12bba63c7 100644 --- a/flashlight.go +++ b/flashlight.go @@ -11,12 +11,18 @@ import ( "github.com/getlantern/detour" "github.com/getlantern/dnsgrab" "github.com/getlantern/errors" - "github.com/getlantern/eventual" - "github.com/getlantern/flashlight/v7/bypass" + "github.com/getlantern/eventual/v2" + "github.com/getlantern/fronted" + "github.com/getlantern/golog" + "github.com/getlantern/netx" + "google.golang.org/protobuf/proto" + + "github.com/getlantern/flashlight/v7/apipb" "github.com/getlantern/flashlight/v7/chained" "github.com/getlantern/flashlight/v7/client" "github.com/getlantern/flashlight/v7/common" "github.com/getlantern/flashlight/v7/config" + userconfig "github.com/getlantern/flashlight/v7/config/user" "github.com/getlantern/flashlight/v7/dialer" "github.com/getlantern/flashlight/v7/domainrouting" "github.com/getlantern/flashlight/v7/email" @@ -25,12 +31,9 @@ import ( fops "github.com/getlantern/flashlight/v7/ops" "github.com/getlantern/flashlight/v7/otel" "github.com/getlantern/flashlight/v7/proxied" + "github.com/getlantern/flashlight/v7/services" "github.com/getlantern/flashlight/v7/shortcut" "github.com/getlantern/flashlight/v7/stats" - "github.com/getlantern/fronted" - "github.com/getlantern/golog" - "github.com/getlantern/netx" - "github.com/getlantern/ops" ) var ( @@ -245,11 +248,7 @@ func (f *Flashlight) notifyProxyListeners(proxies map[string]*commonconfig.Proxy } } -func (f *Flashlight) startConfigFetch() func() { - proxiesDispatch := func(conf interface{}, src config.Source) { - proxyMap := conf.(map[string]*commonconfig.ProxyConfig) - f.notifyProxyListeners(proxyMap, src) - } +func (f *Flashlight) startGlobalConfigFetch() func() { globalDispatch := func(conf interface{}, src config.Source) { cfg := conf.(*config.Global) log.Debugf("Applying global config") @@ -257,16 +256,12 @@ func (f *Flashlight) startConfigFetch() func() { } rt := proxied.ParallelPreferChained() - onProxiesSaveError := func(err error) { - f.errorHandler(ErrorTypeProxySaveFailure, err) - } onConfigSaveError := func(err error) { f.errorHandler(ErrorTypeConfigSaveFailure, err) } stopConfig := config.Init( f.configDir, f.flagsAsMap, f.userConfig, - proxiesDispatch, onProxiesSaveError, globalDispatch, onConfigSaveError, rt) return stopConfig } @@ -303,7 +298,10 @@ func New( common.CompileTimeApplicationVersion = appVersion deviceID := userConfig.GetDeviceID() log.Debugf("You can query for this device's activity under device id: %v", deviceID) - fops.InitGlobalContext(appName, appVersion, revisionDate, deviceID, isPro, func() string { return geolookup.GetCountry(0) }) + fops.InitGlobalContext( + appName, appVersion, revisionDate, deviceID, isPro, func() string { + return geolookup.GetCountry(0) + }) email.SetHTTPClient(proxied.DirectThenFrontedClient(1 * time.Minute)) f := &Flashlight{ @@ -337,13 +335,11 @@ func New( proxyListeners: make([]func(map[string]*commonconfig.ProxyConfig, config.Source), 0), } - f.addProxyListener(func(proxies map[string]*commonconfig.ProxyConfig, src config.Source) { - log.Debug("Applying proxy config with proxies") - dialers := f.client.Configure(chained.CopyConfigs(proxies)) - if dialers != nil { - f.callbacks.onProxiesUpdate(dialers, src) - } - }) + readable, _ := f.flagsAsMap["readableconfig"].(bool) + _, err := userconfig.Init(f.configDir, !readable) + if err != nil { + log.Errorf("user config: %v", err) + } var grabber dnsgrab.Server var grabberErr error @@ -420,13 +416,56 @@ func New( f.callbacks.onDialError, f.callbacks.onSucceedingProxy, ) + if err != nil { fatalErr := fmt.Errorf("unable to initialize client: %v", err) f.op.FailIf(fatalErr) f.op.End() return nil, fatalErr } + f.client = cl + + f.addProxyListener(func(proxies map[string]*commonconfig.ProxyConfig, src config.Source) { + log.Debug("Applying proxy config with proxies") + dialers := f.client.Configure(chained.CopyConfigs(proxies)) + log.Debugf("Got %v dialers", len(dialers)) + if dialers != nil { + f.callbacks.onProxiesUpdate(dialers, src) + } + }) + + fn := func(old, new *userconfig.UserConfig) { + var country string + if old != nil { + country = old.GetCountry() + } + + // update the country if it has changed + if nc := new.GetCountry(); nc != country && nc != "" { + log.Debugf("Setting detour country to %v", nc) + detour.SetCountry(nc) + } + + pconfig := new.GetProxy() + if pconfig == nil || len(pconfig.GetProxies()) == 0 { + return // return early since there are no new proxy configs + } + + log.Debug("Received new proxy configs") + proxyMap := f.convertNewProxyConfToOld(pconfig.GetProxies()) + f.notifyProxyListeners(proxyMap, config.Fetched) + } + + // there might have been an existing config that was loaded before we start listening so we need + // to check for that and call the listener if there was + conf, _ := userconfig.GetConfig(eventual.DontWait) + if conf != nil { + fn(nil, conf) + } + + userconfig.OnConfigChange(fn) + return f, nil } @@ -436,30 +475,109 @@ func (f *Flashlight) Run(httpProxyAddr, socksProxyAddr string, afterStart func(cl *client.Client), onError func(err error), ) { - stop := f.StartBackgroundServices() + if country := geolookup.GetCountry(0); country == "" { + // Until we know our country, default to IR which has all detection rules + log.Debug("Defaulting detour country to IR until real country is known") + detour.SetCountry("IR") + } + + stop, err := f.StartBackgroundServices() + if err != nil { + log.Error(err) + } defer stop() f.RunClientListeners(httpProxyAddr, socksProxyAddr, afterStart, onError) } -// Starts background services like config fetching -func (f *Flashlight) StartBackgroundServices() func() { - log.Debug("Starting client proxy background services") +// StartBackgroundServices starts the goroutine monitoring, bypass, and config fetching background +// services and returns a function that can be called to stop them. +func (f *Flashlight) StartBackgroundServices() (func(), error) { + log.Debug("Starting background services") // check # of goroutines every minute, print the top 5 stacks with most // goroutines if the # exceeds 800 and is increasing. stopMonitor := goroutines.Monitor(time.Minute, 800, 5) + stopGlobalConfigFetch := f.startGlobalConfigFetch() - stopBypass := bypass.Start(f.addProxyListener, f.configDir, f.userConfig) + stopBypass := services.StartBypassService(f.addProxyListener, f.configDir, f.userConfig) - stopConfigFetch := f.startConfigFetch() - geolookup.EnablePersistence(filepath.Join(f.configDir, "latestgeoinfo.json")) - geolookup.Refresh() + // we don't need to start the config service if sticky is set + if sticky, _ := f.flagsAsMap["stickyconfig"].(bool); sticky { + log.Debug("Sticky config set, not starting config service") + return func() { + stopMonitor() + stopBypass() + stopGlobalConfigFetch() + }, nil + } + stopConfigService, err := f.startConfigService() + if err != nil { + return func() { + stopMonitor() + stopBypass() + stopGlobalConfigFetch() + }, fmt.Errorf("Unable to start config service: %w", err) + } return func() { - stopConfigFetch() stopMonitor() stopBypass() + stopGlobalConfigFetch() + stopConfigService() + }, nil +} + +func (f *Flashlight) startConfigService() (services.StopFn, error) { + readable, _ := f.flagsAsMap["readableconfig"].(bool) + handler, err := userconfig.Init(f.configDir, !readable) + if err != nil { + return nil, err } + + var url string + if cloudURL, _ := f.flagsAsMap["cloudconfig"].(string); cloudURL != "" { + url = cloudURL + } else if staging, _ := f.flagsAsMap["staging"].(bool); staging { + url = common.UserConfigStagingURL + } else { + url = common.UserConfigURL + } + + configOpts := &services.ConfigOptions{ + OriginURL: url, + UserConfig: f.userConfig, + RoundTripper: proxied.ChainedThenFronted(), + } + return services.StartConfigService(handler, configOpts) +} + +// convertNewProxyConfToOld converts the new ProxyConnectConfig format to the old ProxyConfig. This +// is temporary until all code is updated to use the new config format. +// +// TODO: Update all code to use the new config format and remove this method. +func (f *Flashlight) convertNewProxyConfToOld(proxies []*apipb.ProxyConnectConfig) map[string]*commonconfig.ProxyConfig { + proxyMap := make(map[string]*commonconfig.ProxyConfig) + for _, p := range proxies { + // use lantern-cloud to map to legacy so we don't have to write it ourselves + lc, err := apipb.ProxyToLegacyConfig(p) + if err != nil { + log.Errorf("Unable to convert %s proxy config to legacy: %v", p.Name, err) + continue + } + + // since lantern-cloud defines legacy proxy Location as LegacyConnectConfig_ProxyLocation + // and commonconfig defines it as ProxyConfig_Location, we can't just cast it, but we can + // marshal/unmarshal it to get the same protobuf. This is a temporary workaround until all + // code is updated to use the new config format. And since we know that the protobuf is the + // same, we can ignore the errors from the marshal/unmarshal + cc := &commonconfig.ProxyConfig{} + lcb, _ := proto.Marshal(lc) + _ = proto.Unmarshal(lcb, cc) + + proxyMap[p.Name] = cc + } + + return proxyMap } // Runs client listeners, blocking as long as the proxy is running. @@ -467,15 +585,6 @@ func (f *Flashlight) RunClientListeners(httpProxyAddr, socksProxyAddr string, afterStart func(cl *client.Client), onError func(err error), ) { - // Until we know our country, default to IR which has all detection rules - log.Debug("Defaulting detour country to IR until real country is known") - detour.SetCountry("IR") - go func() { - country := geolookup.GetCountry(eventual.Forever) - log.Debugf("Setting detour country to %v", country) - detour.SetCountry(country) - }() - if socksProxyAddr != "" { go func() { log.Debug("Starting client SOCKS5 proxy") @@ -489,7 +598,6 @@ func (f *Flashlight) RunClientListeners(httpProxyAddr, socksProxyAddr string, if onError == nil { onError = func(_ error) {} } - onGeo := geolookup.OnRefresh() log.Debug("Starting client HTTP proxy") err := f.client.ListenAndServeHTTP(httpProxyAddr, func() { @@ -497,17 +605,6 @@ func (f *Flashlight) RunClientListeners(httpProxyAddr, socksProxyAddr string, proxied.SetProxyAddr(f.client.Addr) email.SetHTTPClient(proxied.DirectThenFrontedClient(1 * time.Minute)) - ops.Go(func() { - // wait for geo info before reporting so that we know the client ip and - // country - select { - case <-onGeo: - case <-time.After(5 * time.Minute): - log.Debug("failed to get geolocation info within 5 minutes, just record end of startup anyway") - } - f.op.End() - }) - if afterStart != nil { afterStart(f.client) } diff --git a/flashlight_test.go b/flashlight_test.go index 8af6d680d..699bd2351 100644 --- a/flashlight_test.go +++ b/flashlight_test.go @@ -3,7 +3,7 @@ package flashlight import ( "crypto/tls" "crypto/x509" - "io/ioutil" + "io" "net" "net/http" "net/url" @@ -37,11 +37,11 @@ const ( // was successful, it also tests to make sure that the outbound request didn't // leak any Lantern or CloudFlare headers. func testRequest(testCase string, t *testing.T, requests chan *http.Request, https bool, certPool *x509.CertPool, expectedStatus int, expectedErr error) { - dir, err := ioutil.TempDir("", "direct_test") + tempDir, err := os.MkdirTemp("", "direct_test") if !assert.NoError(t, err, "Unable to create temp dir") { return } - defer os.RemoveAll(dir) + defer os.RemoveAll(tempDir) fronted.ConfigureForTest(t) log.Debug("Making request") @@ -82,7 +82,7 @@ func testRequest(testCase string, t *testing.T, requests chan *http.Request, htt t.Errorf("%s: Wrong response status. Expected %d, got %d", testCase, expectedStatus, resp.StatusCode) } else { // Check body - body, err := ioutil.ReadAll(resp.Body) + body, err := io.ReadAll(resp.Body) if err != nil { t.Errorf("%s: Unable to read response body: %s", testCase, err) } else if string(body) != expectedBody { diff --git a/geolookup/geolookup.go b/geolookup/geolookup.go index ef329eb47..8c541f9a2 100644 --- a/geolookup/geolookup.go +++ b/geolookup/geolookup.go @@ -2,143 +2,82 @@ package geolookup import ( "context" - "encoding/json" - "fmt" - "math" - "net/http" - "os" "sync" + "sync/atomic" "time" - "github.com/getlantern/eventual/v2" - geo "github.com/getlantern/geolookup" "github.com/getlantern/golog" - "github.com/getlantern/flashlight/v7/ops" - "github.com/getlantern/flashlight/v7/proxied" + userconfig "github.com/getlantern/flashlight/v7/config/user" ) var ( log = golog.LoggerFor("flashlight.geolookup") - refreshRequest = make(chan interface{}, 1) - currentGeoInfo = eventual.NewValue() - watchers []chan bool - persistToFile string - mx sync.Mutex - roundTripper http.RoundTripper -) + watchers []chan bool + mx sync.Mutex -const ( - maxTimeout = 10 * time.Minute - retryWaitMillis = 100 - maxRetryWait = 30 * time.Second + setInitialValues = atomic.Bool{} ) -type GeoInfo struct { - IP string - City *geo.City - FromDisk bool -} - func init() { - SetDefaultRoundTripper() + userconfig.OnConfigChange(func(old, new *userconfig.UserConfig) { + setInitialValues.CompareAndSwap(false, true) + + // if the country or IP has changed, notify watchers + if old == nil || old.Country != new.Country || old.Ip != new.Ip { + log.Debugf("Country or IP changed, %v, %v. Notifying watchers", new.Country, new.Ip) + mx.Lock() + for _, ch := range watchers { + select { + case ch <- true: + default: + } + } + mx.Unlock() + } + }) } -// GetIP gets the IP. If the IP hasn't been determined yet, waits up to the -// given timeout for an IP to become available. +// GetIP gets the IP. If the IP hasn't been determined yet, waits up to the given timeout for the +// IP to become available. func GetIP(timeout time.Duration) string { - gi, err := GetGeoInfo(timeout) + conf, err := getConfig(timeout) if err != nil { - log.Debugf("Could not get IP: %v", err) + if !setInitialValues.Load() { + log.Debugf("IP not available yet") + } else { + log.Errorf("Failed to get IP: %v", err) + } return "" } - return gi.IP + + return conf.Ip } -// GetCountry gets the country. If the country hasn't been determined yet, waits -// up to the given timeout for a country to become available. +// GetCountry gets the country. If the country hasn't been determined yet, waits up to the given +// timeout for country to become available. func GetCountry(timeout time.Duration) string { - gi, err := GetGeoInfo(timeout) + conf, err := getConfig(timeout) if err != nil { - log.Debugf("Could not get country: %v", err) + if !setInitialValues.Load() { + log.Debugf("Country not available yet") + } else { + log.Errorf("Failed to get country: %v", err) + } return "" } - return gi.City.Country.IsoCode + + return conf.Country } -func GetGeoInfo(timeout time.Duration) (*GeoInfo, error) { - // We need to specially handle negative timeouts because some callers may use - // eventual.Forever (aka -1), expecting it to block forever. - if timeout < 0 { - timeout = maxTimeout - } +func getConfig(timeout time.Duration) (*userconfig.UserConfig, error) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - - gi, err := currentGeoInfo.Get(ctx) - if err != nil { - return nil, fmt.Errorf( - "could not get geoinfo with timeout %v: %w", - timeout, - err, - ) - } - if gi == nil { - return nil, fmt.Errorf("no geo info after %v", timeout) - } - return gi.(*GeoInfo), nil + return userconfig.GetConfig(ctx) } -// EnablePersistence enables persistence of the current geo info to disk at the named file and -// initializes current geo info from that file if necessary. -func EnablePersistence(geoFile string) { - mx.Lock() - defer mx.Unlock() - - // use this file going forward - persistToFile = geoFile - - log.Debugf("Will persist geolocation info to %v", persistToFile) - - // initialize from file if necessary - knownCountry := GetCountry(0) - if knownCountry == "" { - file, err := os.Open(persistToFile) - if err == nil { - log.Debugf("Initializing geolocation info from %v", persistToFile) - dec := json.NewDecoder(file) - gi := &GeoInfo{ - FromDisk: true, - } - decodeErr := dec.Decode(gi) - if decodeErr != nil { - log.Errorf( - "Error initializing geolocation info from %v: %v", - persistToFile, - decodeErr, - ) - return - } - setGeoInfo(gi, false) - } - } -} - -// Refresh refreshes the geolookup information by calling the remote geolookup -// service. It will keep calling the service until it's able to determine an IP -// and country. -func Refresh() { - select { - case refreshRequest <- true: - log.Debug("Requested refresh") - default: - log.Debug("Refresh already in progress") - } -} - -// OnRefresh creates a channel that caller can receive on when new geolocation -// information is got. +// OnRefresh returns a chan that will signal when the goelocation has changed. func OnRefresh() <-chan bool { ch := make(chan bool, 1) mx.Lock() @@ -146,117 +85,3 @@ func OnRefresh() <-chan bool { mx.Unlock() return ch } - -func init() { - go run() -} - -func run() { - for range refreshRequest { - geoInfo := lookup() - - // Check if the IP has changed and if the old IP is simply cached from - // disk. If it is cached, we should still notify anyone looking for - // a new IP because they won't have been notified of the IP on disk, - // as that is loaded very soon on startup. - if !isNew(geoInfo) { - log.Debug("public IP from network did not change - not notifying watchers") - continue - } - log.Debug("Setting new geolocation info") - mx.Lock() - setGeoInfo(geoInfo, true) - mx.Unlock() - } -} - -func isNew(newGeoInfo *GeoInfo) bool { - if newGeoInfo == nil { - return false - } - oldGeoInfo, err := GetGeoInfo(0) - if err != nil { - return true - } - if oldGeoInfo == nil { - return true - } - return oldGeoInfo.IP != newGeoInfo.IP || - oldGeoInfo.FromDisk != newGeoInfo.FromDisk -} - -func setGeoInfo(gi *GeoInfo, persist bool) { - currentGeoInfo.Set(gi) - w := watchers - for _, ch := range w { - select { - case ch <- true: - default: - } - } - if persist && persistToFile != "" { - b, err := json.Marshal(gi) - if err != nil { - log.Errorf( - "Unable to marshal geolocation info to JSON for persisting: %v", - err, - ) - return - } - writeErr := os.WriteFile(persistToFile, b, 0644) - if writeErr != nil { - log.Errorf( - "Error persisting geolocation info to %v: %v", - persistToFile, - err, - ) - } - } -} - -func lookup() *GeoInfo { - consecutiveFailures := 0 - - for { - gi, err := doLookup() - if err != nil { - log.Debugf("Unable to get current location: %s", err) - wait := time.Duration( - math.Pow( - 2, - float64(consecutiveFailures), - )*float64( - retryWaitMillis, - ), - ) * time.Millisecond - if wait > maxRetryWait { - wait = maxRetryWait - } - log.Debugf("Waiting %v before retrying", wait) - time.Sleep(wait) - consecutiveFailures++ - } else { - return gi - } - } -} - -func doLookup() (*GeoInfo, error) { - op := ops.Begin("geolookup") - defer op.End() - city, ip, err := geo.LookupIP("", roundTripper) - - if err != nil { - log.Errorf("Could not lookup IP %v", err) - return nil, op.FailIf(err) - } - return &GeoInfo{ - IP: ip, - City: city, - FromDisk: false}, - nil -} - -func SetDefaultRoundTripper() { - roundTripper = proxied.ParallelPreferChained() -} diff --git a/geolookup/geolookup_test.go b/geolookup/geolookup_test.go deleted file mode 100644 index c67d7015a..000000000 --- a/geolookup/geolookup_test.go +++ /dev/null @@ -1,223 +0,0 @@ -package geolookup - -import ( - "io/ioutil" - "net" - "net/http" - "os" - "testing" - "time" - - "github.com/getlantern/eventual/v2" - "github.com/getlantern/fronted" - "github.com/stretchr/testify/require" -) - -const initialInfo = ` -{ - "City": { - "City": { - "GeoNameID": 4671654, - "Names": { - "de": "Austin", - "en": "Austin", - "es": "Austin", - "fr": "Austin", - "ja": "\u30aa\u30fc\u30b9\u30c6\u30a3\u30f3", - "pt-BR": "Austin", - "ru": "\u041e\u0441\u0442\u0438\u043d" - } - }, - "Continent": { - "Code": "NA", - "GeoNameID": 6255149, - "Names": { - "de": "Nordamerika", - "en": "North America", - "es": "Norteam\u00e9rica", - "fr": "Am\u00e9rique du Nord", - "ja": "\u5317\u30a2\u30e1\u30ea\u30ab", - "pt-BR": "Am\u00e9rica do Norte", - "ru": "\u0421\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u0410\u043c\u0435\u0440\u0438\u043a\u0430", - "zh-CN": "\u5317\u7f8e\u6d32" - } - }, - "Country": { - "GeoNameID": 6252001, - "IsoCode": "FM", - "Names": { - "de": "USA", - "en": "United States", - "es": "Estados Unidos", - "fr": "\u00c9tats Unis", - "ja": "\u30a2\u30e1\u30ea\u30ab", - "pt-BR": "EUA", - "ru": "\u0421\u0428\u0410", - "zh-CN": "\u7f8e\u56fd" - } - }, - "Location": { - "Latitude": 30.2095, - "Longitude": -97.7972, - "MetroCode": 635, - "TimeZone": "America/Chicago" - }, - "Postal": { - "Code": "78745" - }, - "RegisteredCountry": { - "GeoNameID": 6252001, - "IsoCode": "US", - "Names": { - "de": "USA", - "en": "United States", - "es": "Estados Unidos", - "fr": "\u00c9tats Unis", - "ja": "\u30a2\u30e1\u30ea\u30ab", - "pt-BR": "EUA", - "ru": "\u0421\u0428\u0410", - "zh-CN": "\u7f8e\u56fd" - } - }, - "RepresentedCountry": { - "GeoNameID": 0, - "IsoCode": "", - "Names": null, - "Type": "" - }, - "Subdivisions": [ - { - "GeoNameID": 4736286, - "IsoCode": "TX", - "Names": { - "en": "Texas", - "es": "Texas", - "fr": "Texas", - "ja": "\u30c6\u30ad\u30b5\u30b9\u5dde", - "ru": "\u0422\u0435\u0445\u0430\u0441", - "zh-CN": "\u5fb7\u514b\u8428\u65af\u5dde" - } - } - ], - "Traits": { - "IsAnonymousProxy": false, - "IsSatelliteProvider": false - } - }, - "IP": "999.999.999.999" -} -` - -func TestGetIP(t *testing.T) { - currentGeoInfo = eventual.NewValue() - roundTripper = &http.Transport{ - Dial: (&net.Dialer{ - Timeout: 10 * time.Second, - }).Dial, - } - ip := GetIP(0) - require.Equal(t, "", ip) - go Refresh() - ip = GetIP(-1) - addr := net.ParseIP(ip) - require.NotNil(t, addr) -} - -func TestGetCountry(t *testing.T) { - currentGeoInfo = eventual.NewValue() - roundTripper = &http.Transport{ - Dial: (&net.Dialer{ - Timeout: 10 * time.Second, - }).Dial, - } - - country := GetCountry(0) - require.Equal(t, "", country) - go Refresh() - country = GetCountry(-1) - require.NotEmpty(t, country) -} - -func TestFronted(t *testing.T) { - currentGeoInfo = eventual.NewValue() - geoFile, err := ioutil.TempFile("", "") - require.NoError(t, err) - defer os.Remove(geoFile.Name()) - - ioutil.WriteFile(geoFile.Name(), []byte(initialInfo), 0644) - - fronted.ConfigureHostAlaisesForTest(t, map[string]string{ - "geo.getiantem.org": "d3u5fqukq7qrhd.cloudfront.net", - }) - - // test persistence - ch := OnRefresh() - EnablePersistence(geoFile.Name()) - country := GetCountry(0) - require.Equal(t, "FM", country, "Should immediately get persisted country") - select { - case <-ch: - // okay - case <-time.After(5 * time.Second): - t.Error("should update watcher after enabling persistence") - } - - // clear initial value to make sure we read value from network - currentGeoInfo.Reset() - Refresh() - country = GetCountry(60 * time.Second) - ip := GetIP(5 * time.Second) - require.Len(t, country, 2, "Bad country '%v' for ip %v", country, ip) - require.NotEqual( - t, - "FM", - country, - "Should have gotten a new country from network (note, this test will fail if run in Micronesia)", - ) - require.True(t, len(ip) >= 7, "Bad IP %s", ip) - - select { - case <-ch: - // okay - case <-time.After(5 * time.Second): - t.Error("should update watcher after network refresh") - } - - // Give persistence time to finish - time.Sleep(1 * time.Second) - b, err := ioutil.ReadFile(geoFile.Name()) - require.NoError(t, err) - require.NotEmpty(t, b) - require.NotEqual( - t, - initialInfo, - string(b), - "persisted geolocation information should have changed", - ) -} - -func TestIsNew(t *testing.T) { - type args struct { - newGeoInfo *GeoInfo - oldGeoInfo *GeoInfo - } - tests := []struct { - name string - args args - want bool - }{ - {"nil new should be not new", args{nil, &GeoInfo{FromDisk: true}}, false}, - {"nil existing should be new", args{&GeoInfo{}, nil}, true}, - {"old from disk should be new", args{&GeoInfo{IP: "1.1.1.1", FromDisk: false}, &GeoInfo{IP: "1.1.1.1", FromDisk: true}}, true}, - {"old not from disk should not be new", args{&GeoInfo{IP: "1.1.1.1", FromDisk: false}, &GeoInfo{IP: "1.1.1.1", FromDisk: false}}, false}, - {"new IP should be new", args{&GeoInfo{IP: "1.1.1.2", FromDisk: false}, &GeoInfo{IP: "1.1.1.1", FromDisk: false}}, true}, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - currentGeoInfo.Set(tt.args.oldGeoInfo) - if got := isNew(tt.args.newGeoInfo); got != tt.want { - t.Errorf("isNew() = %v, want %v", got, tt.want) - } - }) - } -} diff --git a/go.mod b/go.mod index ef2a4e2ac..c8fe6a20f 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/OperatorFoundation/Starbridge-go/Starbridge/v3 v3.0.17 github.com/blang/semver v3.5.1+incompatible github.com/dustin/go-humanize v1.0.1 - github.com/getlantern/broflake v0.0.0-20231117182649-7d46643a6f87 + github.com/getlantern/broflake v0.0.0-20241120131914-6817e280a926 github.com/getlantern/bufconn v0.0.0-20210901195825-fd7c0267b493 github.com/getlantern/cmux/v2 v2.0.0-20230301223233-dac79088a4c0 github.com/getlantern/cmuxprivate v0.0.0-20211216020409-d29d0d38be54 @@ -43,8 +43,7 @@ require ( github.com/getlantern/event v0.0.0-20210901195647-a7e3145142e6 github.com/getlantern/eventual v1.0.0 github.com/getlantern/eventual/v2 v2.0.2 - github.com/getlantern/fronted v0.0.0-20241119164829-e357a9279198 - github.com/getlantern/geolookup v0.0.0-20230327091034-aebe73c6eef4 + github.com/getlantern/fronted v0.0.0-20241120203013-eedcd71609d2 github.com/getlantern/go-socks5 v0.0.0-20171114193258-79d4dd3e2db5 github.com/getlantern/golog v0.0.0-20230503153817-8e72de7e0a65 github.com/getlantern/hellosplitter v0.1.1 @@ -116,14 +115,16 @@ require ( github.com/blang/vfs v1.0.0 // indirect github.com/coder/websocket v1.8.12 // indirect github.com/dchest/siphash v1.2.3 // indirect + github.com/gaukas/godicttls v0.0.4 // indirect github.com/gaukas/wazerofs v0.1.0 // indirect github.com/getlantern/algeneva v0.0.0-20240222191137-2b4e88234f59 // indirect github.com/getlantern/lampshade v0.0.0-20201109225444-b06082e15f3a // indirect github.com/getlantern/withtimeout v0.0.0-20160829163843-511f017cd913 // indirect + github.com/go-llsqlite/crawshaw v0.5.1 // indirect github.com/tetratelabs/wazero v1.7.1 // indirect + github.com/vishvananda/netns v0.0.1 // indirect gitlab.com/yawning/edwards25519-extra.git v0.0.0-20211229043746-2f91fcc9fbdb // indirect gitlab.com/yawning/obfs4.git v0.0.0-20220204003609-77af0cba934d // indirect - nhooyr.io/websocket v1.8.11 // indirect ) require ( @@ -154,7 +155,7 @@ require ( github.com/anacrolix/torrent v1.53.3 github.com/anacrolix/upnp v0.1.4 // indirect github.com/anacrolix/utp v0.1.0 // indirect - github.com/andybalholm/brotli v1.0.5 // indirect + github.com/andybalholm/brotli v1.0.6 // indirect github.com/armon/go-radix v1.0.0 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/benbjohnson/immutable v0.4.1-0.20221220213129-8932b999621d // indirect @@ -170,12 +171,11 @@ require ( github.com/dsoprea/go-logging v0.0.0-20200517223158-a10564966e9d // indirect github.com/dsoprea/go-png-image-structure v0.0.0-20200615034826-4cfc78940228 // indirect github.com/dsoprea/go-utility v0.0.0-20200512094054-1abbbc781176 // indirect - github.com/dvyukov/go-fuzz v0.0.0-20210429054444-fca39067bc72 // indirect + github.com/dvyukov/go-fuzz v0.0.0-20231019021653-5581da83c52f // indirect github.com/edsrzf/mmap-go v1.1.0 // indirect github.com/enobufs/go-nats v0.0.1 // indirect github.com/felixge/httpsnoop v1.0.3 // indirect github.com/frankban/quicktest v1.14.6 // indirect - github.com/gaukas/godicttls v0.0.4 // indirect github.com/getlantern/byteexec v0.0.0-20220903142956-e6ed20032cfd // indirect github.com/getlantern/cmux v0.0.0-20230301223233-dac79088a4c0 // indirect github.com/getlantern/context v0.0.0-20220418194847-3d5e7a086201 // indirect @@ -186,7 +186,7 @@ require ( github.com/getlantern/fdcount v0.0.0-20210503151800-5decd65b3731 // indirect github.com/getlantern/filepersist v0.0.0-20210901195658-ed29a1cb0b7c // indirect github.com/getlantern/framed v0.0.0-20190601192238-ceb6431eeede // indirect - github.com/getlantern/geo v0.0.0-20230612145351-d1374c8f8dec // indirect + github.com/getlantern/geo v0.0.0-20240108161311-50692a1b69a9 // indirect github.com/getlantern/gonat v0.0.0-20201001145726-634575ba87fb // indirect github.com/getlantern/grtrack v0.0.0-20231025115619-bfbfadb228f3 // indirect github.com/getlantern/hex v0.0.0-20220104173244-ad7e4b9194dc // indirect @@ -202,8 +202,7 @@ require ( github.com/getlantern/telemetry v0.0.0-20230523155019-be7c1d8cd8cb // indirect github.com/go-errors/errors v1.4.2 // indirect github.com/go-llsqlite/adapter v0.0.0-20230927005056-7f5ce7f0c916 // indirect - github.com/go-llsqlite/crawshaw v0.5.2-0.20240425034140-f30eb7704568 // indirect - github.com/go-logr/logr v1.2.4 // indirect + github.com/go-logr/logr v1.3.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-redis/redis/v8 v8.11.5 // indirect github.com/go-stack/stack v1.8.1 // indirect @@ -215,13 +214,13 @@ require ( github.com/google/btree v1.1.2 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/pprof v0.0.0-20230821062121-407c9e7a662f // indirect - github.com/google/uuid v1.3.1 + github.com/google/uuid v1.4.0 github.com/gorilla/mux v1.8.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 // indirect github.com/huandu/xstrings v1.3.2 // indirect github.com/kennygrant/sanitize v1.2.4 // indirect - github.com/klauspost/compress v1.16.7 // indirect + github.com/klauspost/compress v1.17.4 // indirect github.com/klauspost/cpuid v1.3.1 // indirect github.com/klauspost/pgzip v1.2.5 // indirect github.com/klauspost/reedsolomon v1.9.9 // indirect @@ -237,10 +236,10 @@ require ( github.com/nwaples/rardecode v1.1.2 // indirect github.com/onsi/ginkgo/v2 v2.12.0 // indirect github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 // indirect - github.com/oschwald/geoip2-golang v1.8.0 // indirect - github.com/oschwald/maxminddb-golang v1.10.0 // indirect + github.com/oschwald/geoip2-golang v1.9.0 // indirect + github.com/oschwald/maxminddb-golang v1.11.0 // indirect github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c // indirect - github.com/pierrec/lz4/v4 v4.1.12 // indirect + github.com/pierrec/lz4/v4 v4.1.16 // indirect github.com/pion/datachannel v1.5.5 // indirect github.com/pion/dtls/v2 v2.2.7 // indirect github.com/pion/ice/v2 v2.3.5 // indirect @@ -272,7 +271,7 @@ require ( github.com/rs/dnscache v0.0.0-20211102005908-e0241e321417 // indirect github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46 // indirect github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726 // indirect - github.com/sirupsen/logrus v1.9.0 // indirect + github.com/sirupsen/logrus v1.9.2 // indirect github.com/songgao/water v0.0.0-20200317203138-2b4b6d7c09d8 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/templexxx/cpu v0.0.8 // indirect @@ -285,8 +284,8 @@ require ( github.com/ulikunitz/xz v0.5.11 // indirect github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect github.com/xtaci/lossyconn v0.0.0-20200209145036-adba10fffc37 // indirect - go.etcd.io/bbolt v1.3.6 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 // indirect + go.etcd.io/bbolt v1.3.7 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0 // indirect go.opentelemetry.io/otel/metric v1.19.0 // indirect diff --git a/go.sum b/go.sum index 01975fd59..254be112a 100644 --- a/go.sum +++ b/go.sum @@ -109,8 +109,8 @@ github.com/anacrolix/upnp v0.1.4/go.mod h1:Qyhbqo69gwNWvEk1xNTXsS5j7hMHef9hdr984 github.com/anacrolix/utp v0.1.0 h1:FOpQOmIwYsnENnz7tAGohA+r6iXpRjrq8ssKSre2Cp4= github.com/anacrolix/utp v0.1.0/go.mod h1:MDwc+vsGEq7RMw6lr2GKOEqjWny5hO5OZXRVNaBJ2Dk= github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= -github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= -github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= +github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/aristanetworks/goarista v0.0.0-20190628000427-15fc8b0bfcde/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= @@ -182,8 +182,9 @@ github.com/dustin/go-humanize v0.0.0-20180421182945-02af3965c54e/go.mod h1:Htrtb github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/dvyukov/go-fuzz v0.0.0-20210429054444-fca39067bc72 h1:XiR1YwcWcRFzxjAhWK29HQL4nocj0QWJjpeRi/YASV0= github.com/dvyukov/go-fuzz v0.0.0-20210429054444-fca39067bc72/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= +github.com/dvyukov/go-fuzz v0.0.0-20231019021653-5581da83c52f h1:WDoxHudni5ZFV/s5ioYukovIRKYwYjXDy2GY2L3fhhA= +github.com/dvyukov/go-fuzz v0.0.0-20231019021653-5581da83c52f/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= @@ -208,8 +209,8 @@ github.com/gaukas/wazerofs v0.1.0 h1:wIkW1bAxSnpaaVkQ5LOb1tm1BXdVap3eKjJpVWIqt2E github.com/gaukas/wazerofs v0.1.0/go.mod h1:+JECB9Fwt0taPqSgHckG9lmT3tcoVK+9VJozTsq9UlI= github.com/getlantern/algeneva v0.0.0-20240222191137-2b4e88234f59 h1:uWNy0b1Wtpsd4n64Kat+fRjvPCBwM2Nykwt71LupJAQ= github.com/getlantern/algeneva v0.0.0-20240222191137-2b4e88234f59/go.mod h1:PrNR8tMXO26YNs8K9653XCUH7u2Kv4OdfFC3Ke1GsX0= -github.com/getlantern/broflake v0.0.0-20231117182649-7d46643a6f87 h1:9nUdYJp3TCKE/jTwI0mymz8FPT7jXHBRvRy2rXlKFDo= -github.com/getlantern/broflake v0.0.0-20231117182649-7d46643a6f87/go.mod h1:brzUHh6XfkSMv+K72nrfCbrPbumeHJFlZZLIUG/UMjI= +github.com/getlantern/broflake v0.0.0-20241120131914-6817e280a926 h1:vfBrgLj+CVtMqtERkm9zOoGU6yLv9Pl7iMRB6kgz4WQ= +github.com/getlantern/broflake v0.0.0-20241120131914-6817e280a926/go.mod h1:Or0pIamSYF9lpsr8CYMeyBzRVC1cIRNltdTMKbtm40U= github.com/getlantern/bufconn v0.0.0-20190625204133-a08544339f8d/go.mod h1:d6O4RY+V87kIt4o9wru4SaNo7C2NAkD3YnmJFXEpODo= github.com/getlantern/bufconn v0.0.0-20210901195825-fd7c0267b493 h1:8WjDNmpDLFVsAfcnHxqF4pfVKkdAQxyJ9iCHB4LxSfc= github.com/getlantern/bufconn v0.0.0-20210901195825-fd7c0267b493/go.mod h1:d6O4RY+V87kIt4o9wru4SaNo7C2NAkD3YnmJFXEpODo= @@ -267,12 +268,10 @@ github.com/getlantern/filepersist v0.0.0-20210901195658-ed29a1cb0b7c h1:mcz27xtA github.com/getlantern/filepersist v0.0.0-20210901195658-ed29a1cb0b7c/go.mod h1:8DGAx0LNUfXNnEH+fXI0s3OCBA/351kZCiz/8YSK3i8= github.com/getlantern/framed v0.0.0-20190601192238-ceb6431eeede h1:yrU6Px3ZkvCsDLPryPGi6FN+2iqFPq+JeCb7EFoDBhw= github.com/getlantern/framed v0.0.0-20190601192238-ceb6431eeede/go.mod h1:nhnoiS6DE6zfe+BaCMU4YI01UpsuiXnDqM5S8jxHuuI= -github.com/getlantern/fronted v0.0.0-20241119164829-e357a9279198 h1:HnYF4cbOsQwLWxykQZmOYSj2j2xeANdD1PlkeJTSFcc= -github.com/getlantern/fronted v0.0.0-20241119164829-e357a9279198/go.mod h1:scF5Zfdh9jZAokdxSg+WnBahMyWDKZIPdLtaAmMEuoc= -github.com/getlantern/geo v0.0.0-20230612145351-d1374c8f8dec h1:0cxqVKmEqcGuKXdaEBc03uearUTNvV4hH7Irfjz4evQ= -github.com/getlantern/geo v0.0.0-20230612145351-d1374c8f8dec/go.mod h1:Xw0BLEMmlFOQ1FCBqqWfYEhc2Ss6V4S/56U0oKH/QFU= -github.com/getlantern/geolookup v0.0.0-20230327091034-aebe73c6eef4 h1:Ju9l1RretVWJTNo2vpl/xAW8Dcuiyg5kJC6LRBpCigw= -github.com/getlantern/geolookup v0.0.0-20230327091034-aebe73c6eef4/go.mod h1:4UNvIsawdB8WclVxqYv46Oe1zzWJ8wMhUO+q6tUzATo= +github.com/getlantern/fronted v0.0.0-20241120203013-eedcd71609d2 h1:h3TZ7ye/1fqOLqfwTho4iRSEQqTMKVJIsOF+5XNyhus= +github.com/getlantern/fronted v0.0.0-20241120203013-eedcd71609d2/go.mod h1:NfZDG8pmTL3wvo/s/sflpJFsgIL7etelgwzDRtO4HIM= +github.com/getlantern/geo v0.0.0-20240108161311-50692a1b69a9 h1:mSg57/+t59Q08AqArlhW+3N1AVPn5ox0dTOYonRps6w= +github.com/getlantern/geo v0.0.0-20240108161311-50692a1b69a9/go.mod h1:RjQ0krF8NTCc5xo2Q1995/vZBnYg33h8svn15do7dLg= github.com/getlantern/go-socks5 v0.0.0-20171114193258-79d4dd3e2db5 h1:RBKofGGMt2k6eGBwX8mky9qunjL+KnAp9JdzXjiRkRw= github.com/getlantern/go-socks5 v0.0.0-20171114193258-79d4dd3e2db5/go.mod h1:kGHRXch95rnGLHjER/GhhFiHvfnqNz7KqWD9kGfATHY= github.com/getlantern/golog v0.0.0-20190809085441-26e09e6dd330/go.mod h1:zx/1xUUeYPy3Pcmet8OSXLbF47l+3y6hIPpyLWoR9oc= @@ -424,14 +423,14 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-llsqlite/adapter v0.0.0-20230927005056-7f5ce7f0c916 h1:OyQmpAN302wAopDgwVjgs2HkFawP9ahIEqkUYz7V7CA= github.com/go-llsqlite/adapter v0.0.0-20230927005056-7f5ce7f0c916/go.mod h1:DADrR88ONKPPeSGjFp5iEN55Arx3fi2qXZeKCYDpbmU= -github.com/go-llsqlite/crawshaw v0.5.2-0.20240425034140-f30eb7704568 h1:3EpZo8LxIzF4q3BT+vttQQlRfA6uTtTb/cxVisWa5HM= -github.com/go-llsqlite/crawshaw v0.5.2-0.20240425034140-f30eb7704568/go.mod h1:/YJdV7uBQaYDE0fwe4z3wwJIZBJxdYzd38ICggWqtaE= +github.com/go-llsqlite/crawshaw v0.5.1 h1:dIYQG2qHrGjWXVXvl00JxIHBuwD+h8VXgNubLiMoPNU= +github.com/go-llsqlite/crawshaw v0.5.1/go.mod h1:/YJdV7uBQaYDE0fwe4z3wwJIZBJxdYzd38ICggWqtaE= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= @@ -500,8 +499,8 @@ github.com/google/pprof v0.0.0-20230821062121-407c9e7a662f h1:pDhu5sgp8yJlEF/g6o github.com/google/pprof v0.0.0-20230821062121-407c9e7a662f/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190309154008-847fc94819f9/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -516,8 +515,8 @@ github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 h1:RtRsiaGvWxcwd8y3BiRZxsylPT8hLWZ5SPcfI+3IDNk= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0/go.mod h1:TzP6duP4Py2pHLVPPQp42aoYI92+PCrVotyR5e8Vqlk= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= @@ -556,8 +555,8 @@ github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvW github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= +github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.2.4/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.3.1 h1:5JNjFYYQrZeKRJ0734q51WCEEn2huer72Dc7K+R/b6s= @@ -635,10 +634,10 @@ github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3ev github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/oschwald/geoip2-golang v1.8.0 h1:KfjYB8ojCEn/QLqsDU0AzrJ3R5Qa9vFlx3z6SLNcKTs= -github.com/oschwald/geoip2-golang v1.8.0/go.mod h1:R7bRvYjOeaoenAp9sKRS8GX5bJWcZ0laWO5+DauEktw= -github.com/oschwald/maxminddb-golang v1.10.0 h1:Xp1u0ZhqkSuopaKmk1WwHtjF0H9Hd9181uj2MQ5Vndg= -github.com/oschwald/maxminddb-golang v1.10.0/go.mod h1:Y2ELenReaLAZ0b400URyGwvYxHV1dLIxBuyOsyYjHK0= +github.com/oschwald/geoip2-golang v1.9.0 h1:uvD3O6fXAXs+usU+UGExshpdP13GAqp4GBrzN7IgKZc= +github.com/oschwald/geoip2-golang v1.9.0/go.mod h1:BHK6TvDyATVQhKNbQBdrj9eAvuwOMi2zSFXizL3K81Y= +github.com/oschwald/maxminddb-golang v1.11.0 h1:aSXMqYR/EPNjGE8epgqwDay+P30hCBZIveY0WZbAWh0= +github.com/oschwald/maxminddb-golang v1.11.0/go.mod h1:YmVI+H0zh3ySFR3w+oz8PCfglAFj3PuCmui13+P9zDg= github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c h1:rp5dCmg/yLR3mgFuSOe4oEnDDmGLROTvMragMUXpTQw= github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c/go.mod h1:X07ZCGwUbLaax7L0S3Tw4hpejzu63ZrrQiUe6W0hcy0= github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= @@ -647,8 +646,8 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4/v4 v4.1.2/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.12 h1:44l88ehTZAUGW4VlO1QC4zkilL99M6Y9MXNwEs0uzP8= -github.com/pierrec/lz4/v4 v4.1.12/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.16 h1:kQPfno+wyx6C5572ABwV+Uo3pDFzQ7yhyGchSyRda0c= +github.com/pierrec/lz4/v4 v4.1.16/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pion/datachannel v1.5.5 h1:10ef4kwdjije+M9d7Xm9im2Y3O6A6ccQb0zcqZcJew8= @@ -775,8 +774,8 @@ github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726 h1:xT+JlYxNGqyT+XcU8 github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y= +github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v0.0.0-20190215210624-980c5ac6f3ac/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= @@ -838,8 +837,9 @@ github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oW github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc h1:R83G5ikgLMxrBvLh22JhdfI8K6YXEPHx5P03Uu3DRs4= github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= +github.com/vishvananda/netns v0.0.1 h1:JDkWS7Axy5ziNM3svylLhpSgqjPDb+BgVUbXoDo+iPw= +github.com/vishvananda/netns v0.0.1/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vulcand/oxy v1.4.2 h1:KibUVdKrwy7eXR3uHS2pYoZ9dCzKVcgDNHD2jkPZmxU= github.com/vulcand/oxy v1.4.2/go.mod h1:Yq8OBb0XWU/7nPSglwUH5LS2Pcp4yvad8SVayobZbSo= github.com/willf/bitset v1.1.9/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= @@ -864,13 +864,13 @@ gitlab.com/yawning/obfs4.git v0.0.0-20220204003609-77af0cba934d h1:tJ8F7ABaQ3p3w gitlab.com/yawning/obfs4.git v0.0.0-20220204003609-77af0cba934d/go.mod h1:9GcM8QNU9/wXtEEH2q8bVOnPI7FtIF6VVLzZ1l6Hgf8= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= +go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= +go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 h1:pginetY7+onl4qN1vl0xW/V/v6OBZ0vVdH+esuJgvmM= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0/go.mod h1:XiYsayHc36K3EByOO6nbAXnAWbrUxdjUROCEeeROOH8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0 h1:x8Z78aZx8cOF0+Kkazoc7lwUNMGy0LrzEMxTm4BbTxg= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0/go.mod h1:62CPTSry9QZtOaSsE3tOzhx6LzDhHnXJ6xHeMNNiM6Q= go.opentelemetry.io/otel v1.9.0/go.mod h1:np4EoPGzoPs3O67xUVNoPPcmSvsfOxNlNA4F4AC+0Eo= go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= @@ -1030,10 +1030,10 @@ golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1168,8 +1168,6 @@ modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= modernc.org/sqlite v1.21.1 h1:GyDFqNnESLOhwwDRaHGdp2jKLDzpyT/rNLglX3ZkMSU= modernc.org/sqlite v1.21.1/go.mod h1:XwQ0wZPIh1iKb5mkvCJ3szzbhk+tykC8ZWqTRTgYRwI= -nhooyr.io/websocket v1.8.11 h1:f/qXNc2/3DpoSZkHt1DQu6rj4zGC8JmkkLkWss0MgN0= -nhooyr.io/websocket v1.8.11/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= zombiezen.com/go/sqlite v0.13.1 h1:qDzxyWWmMtSSEH5qxamqBFmqA2BLSSbtODi3ojaE02o= zombiezen.com/go/sqlite v0.13.1/go.mod h1:Ht/5Rg3Ae2hoyh1I7gbWtWAl89CNocfqeb/aAMTkJr4= diff --git a/integrationtest/integrationtest.go b/integrationtest/integrationtest.go index 56cc15864..5e50ef690 100644 --- a/integrationtest/integrationtest.go +++ b/integrationtest/integrationtest.go @@ -5,7 +5,6 @@ package integrationtest import ( "compress/gzip" "context" - "crypto/sha256" "crypto/tls" _ "embed" "encoding/binary" @@ -13,24 +12,26 @@ import ( "encoding/json" "errors" "fmt" - "io/ioutil" + "io" "net" "net/http" "os" "path/filepath" + "strconv" "strings" "sync/atomic" "testing" "time" - "github.com/getlantern/common/config" "github.com/getlantern/golog" hproxy "github.com/getlantern/http-proxy-lantern/v2" "github.com/getlantern/tlsdefaults" "github.com/getlantern/waitforserver" - "github.com/getlantern/yaml" + "google.golang.org/protobuf/proto" + "github.com/getlantern/flashlight/v7/apipb" "github.com/getlantern/flashlight/v7/client" + userconfig "github.com/getlantern/flashlight/v7/config/user" ) const ( @@ -67,20 +68,22 @@ type Helper struct { protocol atomic.Value t *testing.T ConfigDir string - HTTPSProxyServerAddr string - LampshadeProxyServerAddr string - QUICIETFProxyServerAddr string - WSSProxyServerAddr string - ShadowsocksProxyServerAddr string - ShadowsocksmuxProxyServerAddr string - TLSMasqProxyServerAddr string - HTTPSSmuxProxyServerAddr string - HTTPSPsmuxProxyServerAddr string + BaseServerAddr string + HTTPSProxyServerPort int32 + LampshadeProxyServerPort int32 + QUICIETFProxyServerPort int32 + WSSProxyServerPort int32 + ShadowsocksProxyServerPort int32 + ShadowsocksmuxProxyServerPort int32 + TLSMasqProxyServerPort int32 + HTTPSSmuxProxyServerPort int32 + HTTPSPsmuxProxyServerPort int32 HTTPServerAddr string HTTPSServerAddr string - ConfigServerAddr string - tlsMasqOriginAddr string - listeners []net.Listener + + ConfigServerAddr string + tlsMasqOriginAddr string + listeners []net.Listener } // NewHelper prepares a new integration test helper including a web server for @@ -89,32 +92,33 @@ type Helper struct { // origins are served through the proxy. Make sure to close the Helper with // Close() when finished with the test. func NewHelper(t *testing.T, basePort int) (*Helper, error) { - ConfigDir, err := ioutil.TempDir("", "integrationtest_helper") + ConfigDir, err := os.MkdirTemp("", "integrationtest_helper") log.Debugf("ConfigDir is %v", ConfigDir) if err != nil { return nil, err } - nextPort := basePort - nextListenAddr := func() string { - addr := fmt.Sprintf("localhost:%d", nextPort) + nextPort := int32(basePort) + nextListenPort := func() int32 { nextPort++ - return addr + return nextPort } helper := &Helper{ t: t, ConfigDir: ConfigDir, - HTTPSProxyServerAddr: nextListenAddr(), - LampshadeProxyServerAddr: nextListenAddr(), - QUICIETFProxyServerAddr: nextListenAddr(), - WSSProxyServerAddr: nextListenAddr(), - ShadowsocksProxyServerAddr: nextListenAddr(), - ShadowsocksmuxProxyServerAddr: nextListenAddr(), - TLSMasqProxyServerAddr: nextListenAddr(), - HTTPSSmuxProxyServerAddr: nextListenAddr(), - HTTPSPsmuxProxyServerAddr: nextListenAddr(), + BaseServerAddr: "localhost", + HTTPSProxyServerPort: nextPort, + LampshadeProxyServerPort: nextListenPort(), + QUICIETFProxyServerPort: nextListenPort(), + WSSProxyServerPort: nextListenPort(), + ShadowsocksProxyServerPort: nextListenPort(), + ShadowsocksmuxProxyServerPort: nextListenPort(), + TLSMasqProxyServerPort: nextListenPort(), + HTTPSSmuxProxyServerPort: nextListenPort(), + HTTPSPsmuxProxyServerPort: nextListenPort(), } + helper.SetProtocol("https") client.ForceProxying() @@ -150,7 +154,7 @@ func NewHelper(t *testing.T, basePort int) (*Helper, error) { // We have to write out a config file so that Lantern doesn't try to use the // default config, which would go to some remote proxies that can't talk to // our fake config server. - err = helper.writeConfig() + err = helper.writeUserConfigFile() if err != nil { helper.Close() return nil, err @@ -200,7 +204,7 @@ func serveContent(resp http.ResponseWriter, req *http.Request) { } func (helper *Helper) startProxyServer() error { - kcpConfFile, err := ioutil.TempFile("", "") + kcpConfFile, err := os.CreateTemp("", "") if err != nil { return err } @@ -211,16 +215,18 @@ func (helper *Helper) startProxyServer() error { return err } + toListenAddr := func(port int32) string { + p := strconv.Itoa(int(port)) + return helper.BaseServerAddr + ":" + p + } + s1 := &hproxy.Proxy{ TestingLocal: true, - HTTPAddr: helper.HTTPSProxyServerAddr, - HTTPMultiplexAddr: helper.HTTPSSmuxProxyServerAddr, - LampshadeAddr: helper.LampshadeProxyServerAddr, - QUICIETFAddr: helper.QUICIETFProxyServerAddr, - WSSAddr: helper.WSSProxyServerAddr, - TLSMasqAddr: helper.TLSMasqProxyServerAddr, - ShadowsocksAddr: helper.ShadowsocksProxyServerAddr, - ShadowsocksMultiplexAddr: helper.ShadowsocksmuxProxyServerAddr, + HTTPAddr: toListenAddr(helper.HTTPSProxyServerPort), + HTTPMultiplexAddr: toListenAddr(helper.HTTPSSmuxProxyServerPort), + TLSMasqAddr: toListenAddr(helper.TLSMasqProxyServerPort), + ShadowsocksAddr: toListenAddr(helper.ShadowsocksProxyServerPort), + ShadowsocksMultiplexAddr: toListenAddr(helper.ShadowsocksmuxProxyServerPort), ShadowsocksSecret: shadowsocksSecret, TLSMasqSecret: tlsmasqServerSecret, @@ -245,23 +251,10 @@ func (helper *Helper) startProxyServer() error { HTTPS: false, } - // psmux multiplexed http - // smux multiplexed http - s3 := &hproxy.Proxy{ - TestingLocal: true, - HTTPS: true, - HTTPMultiplexAddr: helper.HTTPSPsmuxProxyServerAddr, - MultiplexProtocol: "psmux", - Token: Token, - KeyFile: KeyFile, - CertFile: CertFile, - IdleTimeout: 30 * time.Second, - } - go s1.ListenAndServe(context.Background()) go s2.ListenAndServe(context.Background()) - err = waitforserver.WaitForServer("tcp", helper.HTTPSProxyServerAddr, 10*time.Second) + err = waitforserver.WaitForServer("tcp", toListenAddr(helper.HTTPSProxyServerPort), 10*time.Second) if err != nil { return err } @@ -274,15 +267,7 @@ func (helper *Helper) startProxyServer() error { time.Sleep(25 * time.Millisecond) } } - if statErr != nil { - return statErr - } - - // only launch / wait for this one after the cert is in place (can race otherwise.) - go s3.ListenAndServe(context.Background()) - err = waitforserver.WaitForServer("tcp", helper.HTTPSPsmuxProxyServerAddr, 10*time.Second) - - return err + return statErr } func (helper *Helper) startConfigServer() error { @@ -305,7 +290,7 @@ func (helper *Helper) serveConfig() func(http.ResponseWriter, *http.Request) { if strings.Contains(req.URL.String(), "global") { helper.writeGlobalConfig(resp, req) } else if strings.Contains(req.URL.String(), "prox") { - helper.writeProxyConfig(resp, req) + helper.writeUserConfigResponse(resp, req) } else { log.Errorf("Not requesting global or proxies in %v", req.URL.String()) resp.WriteHeader(http.StatusBadRequest) @@ -333,134 +318,162 @@ func (helper *Helper) writeGlobalConfig(resp http.ResponseWriter, req *http.Requ w.Close() } -func (helper *Helper) writeProxyConfig(resp http.ResponseWriter, req *http.Request) { - log.Debug("Writing proxy config") - proto := helper.protocol.Load().(string) - cfg, err := helper.buildProxies(proto) +func (helper *Helper) writeUserConfigResponse(resp http.ResponseWriter, req *http.Request) { + log.Debug("Writing config to response") + + protocol := helper.protocol.Load().(string) + userCfg, err := helper.buildUserConfig([]string{protocol}) if err != nil { helper.t.Error(err) resp.WriteHeader(http.StatusInternalServerError) return } - out, err := yaml.Marshal(cfg) + + out, err := proto.Marshal(userCfg) if err != nil { helper.t.Error(err) resp.WriteHeader(http.StatusInternalServerError) return } - etag := fmt.Sprintf("%x", sha256.Sum256(out)) - if req.Header.Get(IfNoneMatch) == etag { - resp.WriteHeader(http.StatusNotModified) + cfg, err := readConfigRequest(req) + if err != nil { + helper.t.Error(err) + resp.WriteHeader(http.StatusInternalServerError) return } - resp.Header().Set(Etag, etag) - resp.WriteHeader(http.StatusOK) + // check if proxy config sent by the client is different than the one we want to send + newProxies := userCfg.GetProxy().GetProxies() + oldProxyNames := cfg.GetProxy().Names + if len(newProxies) != len(oldProxyNames) { + resp.WriteHeader(http.StatusOK) + if _, err = resp.Write(out); err != nil { + helper.t.Error(err) + } - w := gzip.NewWriter(resp) - _, err = w.Write(out) - if err != nil { + return + } + + for i, p := range newProxies { + if p.Name != oldProxyNames[i] { + resp.WriteHeader(http.StatusOK) + if _, err = resp.Write(out); err != nil { + helper.t.Error(err) + } + + return + } + } + + // if we got here, the proxies are the same + resp.WriteHeader(http.StatusNoContent) + if _, err = resp.Write(out); err != nil { helper.t.Error(err) } - w.Close() } -func (helper *Helper) writeConfig() error { - filename := filepath.Join(helper.ConfigDir, "proxies.yaml") - proto := helper.protocol.Load().(string) - cfg, err := helper.buildProxies(proto) +func readConfigRequest(req *http.Request) (*apipb.ConfigRequest, error) { + buf, err := io.ReadAll(req.Body) + if err != nil { + return nil, err + } + + var cfg apipb.ConfigRequest + if err = proto.Unmarshal(buf, &cfg); err != nil { + return nil, err + } + + return &cfg, nil +} + +func (helper *Helper) writeUserConfigFile() error { + log.Debug("Writing config to file") + protocol := helper.protocol.Load().(string) + cfg, err := helper.buildUserConfig([]string{protocol}) if err != nil { return err } - out, err := yaml.Marshal(cfg) + + out, err := proto.Marshal(cfg) if err != nil { return err } - return ioutil.WriteFile(filename, out, 0644) + + filename := filepath.Join(helper.ConfigDir, userconfig.DefaultConfigFilename) + return os.WriteFile(filename, out, 0644) } -func (helper *Helper) buildProxies(proto string) (map[string]*config.ProxyConfig, error) { - protos := strings.Split(proto, ",") - // multipath - if len(protos) > 1 { - proxies := make(map[string]*config.ProxyConfig) - for _, p := range protos { - cfgs, err := helper.buildProxies(p) - if err != nil { - return nil, err - } - for name, cfg := range cfgs { - cfg.MultipathEndpoint = "multipath-endpoint" - proxies[name] = cfg - } +func (helper *Helper) buildUserConfig(protos []string) (*apipb.ConfigResponse, error) { + protoCfg := make([]*apipb.ProxyConnectConfig, 0, len(protos)) + for _, proto := range protos { + p, err := helper.buildProxy(proto) + if err != nil { + return nil, err } - return proxies, nil + + protoCfg = append(protoCfg, p) } - var srv config.ProxyConfig - err := yaml.Unmarshal(proxiesTemplate, &srv) + + return &apipb.ConfigResponse{ + ProToken: Token, + Country: "CN", + Ip: "1.1.1.1", + Proxy: &apipb.ConfigResponse_Proxy{ + Proxies: protoCfg, + }, + }, nil +} + +func (helper *Helper) buildProxy(proto string) (*apipb.ProxyConnectConfig, error) { + cert, err := os.ReadFile(CertFile) if err != nil { - return nil, fmt.Errorf("could not unmarshal config %v", err) - } - - srv.AuthToken = Token - - cert, err2 := ioutil.ReadFile(CertFile) - if err2 != nil { - return nil, fmt.Errorf("could not read cert %v", err2) - } - srv.Cert = string(cert) - if proto == "lampshade" { - srv.Addr = helper.LampshadeProxyServerAddr - srv.PluggableTransport = "lampshade" - } else if proto == "quic_ietf" { - srv.Addr = helper.QUICIETFProxyServerAddr - srv.PluggableTransport = "quic_ietf" - } else if proto == "wss" { - srv.Addr = helper.WSSProxyServerAddr - srv.PluggableTransport = "wss" - srv.PluggableTransportSettings = map[string]string{ - "url": fmt.Sprintf("https://%s", helper.WSSProxyServerAddr), - "multiplexed": "true", - } - } else if proto == "tlsmasq" { - srv.Addr = helper.TLSMasqProxyServerAddr - srv.PluggableTransport = "tlsmasq" - srv.PluggableTransportSettings = map[string]string{ - "tlsmasq_sni": tlsmasqSNI, - "tlsmasq_suites": tlsmasqSuites, - "tlsmasq_tlsminversion": tlsmasqMinVersion, - "tlsmasq_secret": tlsmasqServerSecret, + return nil, fmt.Errorf("could not read cert %v", err) + } + + conf := &apipb.ProxyConnectConfig{ + Name: "AshKetchumAll", + AuthToken: Token, + CertPem: cert, + Addr: helper.BaseServerAddr, + } + + switch proto { + case "https": + // use multiplex server port since we multiplex all https connections + conf.Port = helper.HTTPSSmuxProxyServerPort + conf.ProtocolConfig = &apipb.ProxyConnectConfig_ConnectCfgTls{ + ConnectCfgTls: &apipb.ProxyConnectConfig_TLSConfig{ + SessionState: &apipb.ProxyConnectConfig_TLSConfig_SessionState{}, + }, } - } else if proto == "shadowsocks" { - srv.Addr = helper.ShadowsocksProxyServerAddr - srv.PluggableTransport = "shadowsocks" - srv.PluggableTransportSettings = map[string]string{ - "shadowsocks_secret": shadowsocksSecret, - "shadowsocks_upstream": shadowsocksUpstream, - "shadowsocks_cipher": shadowsocksCipher, + case "tlsmasq": + conf.Port = helper.TLSMasqProxyServerPort + conf.ProtocolConfig = &apipb.ProxyConnectConfig_ConnectCfgTlsmasq{ + ConnectCfgTlsmasq: &apipb.ProxyConnectConfig_TLSMasqConfig{ + OriginAddr: tlsmasqOriginAddr, + Secret: []byte(tlsmasqServerSecret), + TlsMinVersion: tlsmasqMinVersion, + TlsSupportedCipherSuites: strings.Split(tlsmasqSuites, ","), + }, } - } else if proto == "shadowsocks-mux" { - srv.Addr = "multiplexed" - srv.MultiplexedAddr = helper.ShadowsocksmuxProxyServerAddr - srv.PluggableTransport = "shadowsocks" - srv.PluggableTransportSettings = map[string]string{ - "shadowsocks_secret": shadowsocksSecret, - "shadowsocks_upstream": shadowsocksUpstream, - "shadowsocks_cipher": shadowsocksCipher, + // conf.PluggableTransportSettings = map[string]string{ + // "tlsmasq_sni": tlsmasqSNI, + // } + case "shadowsocks": + // use multiplex server port since we multiplex all shadowsocks connections + conf.Port = helper.ShadowsocksmuxProxyServerPort + conf.ProtocolConfig = &apipb.ProxyConnectConfig_ConnectCfgShadowsocks{ + ConnectCfgShadowsocks: &apipb.ProxyConnectConfig_ShadowsocksConfig{ + Secret: shadowsocksSecret, + Cipher: shadowsocksCipher, + }, } - } else if proto == "https+smux" { - srv.Addr = "multiplexed" - srv.MultiplexedAddr = helper.HTTPSSmuxProxyServerAddr - // the default is smux, so srv.MultiplexedProtocol is unset - } else if proto == "https+psmux" { - srv.Addr = "multiplexed" - srv.MultiplexedAddr = helper.HTTPSPsmuxProxyServerAddr - srv.MultiplexedProtocol = "psmux" - } else { - srv.Addr = helper.HTTPSProxyServerAddr - } - return map[string]*config.ProxyConfig{"proxy-" + proto: &srv}, nil + default: + return nil, fmt.Errorf("unsupported proxy protocol %v", proto) + } + + return conf, nil } func (helper *Helper) startTLSMasqOrigin() error { diff --git a/issue/issue_test.go b/issue/issue_test.go index 20da6d06b..fb5d7bbfd 100644 --- a/issue/issue_test.go +++ b/issue/issue_test.go @@ -1,7 +1,6 @@ package issue import ( - "io/ioutil" "os" "path/filepath" "testing" @@ -9,9 +8,10 @@ import ( "gopkg.in/yaml.v2" + "github.com/getlantern/fronted" + "github.com/getlantern/flashlight/v7/config" "github.com/getlantern/flashlight/v7/geolookup" - "github.com/getlantern/fronted" ) func TestMain(m *testing.M) { @@ -23,26 +23,27 @@ func TestMain(m *testing.M) { defer os.RemoveAll(tempConfigDir) // Init domain-fronting - global, err := ioutil.ReadFile("../embeddedconfig/global.yaml") + global, err := os.ReadFile("../embeddedconfig/global.yaml") if err != nil { log.Errorf("Unable to load embedded global config: %v", err) os.Exit(1) } + cfg := config.NewGlobal() err = yaml.Unmarshal(global, cfg) if err != nil { log.Errorf("Unable to unmarshal embedded global config: %v", err) os.Exit(1) } + certs, err := cfg.TrustedCACerts() if err != nil { log.Errorf("Unable to read trusted certs: %v", err) } + log.Debug(cfg.Client.FrontedProviders()) fronted.Configure(certs, cfg.Client.FrontedProviders(), config.DefaultFrontedProviderID, filepath.Join(tempConfigDir, "masquerade_cache")) - // Perform initial geolookup with a high timeout so that we don't later timeout when trying to - geolookup.Refresh() geolookup.GetCountry(1 * time.Minute) os.Exit(m.Run()) } diff --git a/proxied/proxied.go b/proxied/proxied.go index ab4b2bf49..dc247e613 100644 --- a/proxied/proxied.go +++ b/proxied/proxied.go @@ -6,6 +6,7 @@ package proxied import ( "bytes" + "context" "crypto/tls" "fmt" "io/ioutil" @@ -234,7 +235,7 @@ type chainedRoundTripper struct { // RoundTrip will attempt to execute the specified HTTP request using only a chained fetcher func (cf *chainedRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { - log.Debugf("Using chained fetcher") + log.Debugf("Using chained fronter for request to: %#v", req.URL) rt, err := ChainedNonPersistent(cf.rootCA) if err != nil { return nil, err @@ -327,7 +328,7 @@ func (df *dualFetcher) do(req *http.Request, chainedRT http.RoundTripper, ddfRT } doFronted := func() { op.ProxyType(ops.ProxyFronted) - log.Debugf("Sending DDF request. With body? %v", frontedReq.Body != nil) + log.Debugf("dualfetcher sending DDF request to %v. With body? %v", frontedReq.URL.String(), frontedReq.Body != nil) start := time.Now() if resp, err := request(!df.cf.parallel, ddfRT, frontedReq); err == nil { elapsed := time.Since(start) @@ -343,7 +344,7 @@ func (df *dualFetcher) do(req *http.Request, chainedRT http.RoundTripper, ddfRT doChained := func() { op.ProxyType(ops.ProxyChained) - log.Debugf("Sending chained request. With body? %v", req.Body != nil) + log.Debugf("dualfetcher sending chained request to %v. With body? %v", req.URL.String(), req.Body != nil) start := time.Now() if res, err := request(false, chainedRT, req); err == nil { elapsed := time.Since(start) @@ -539,13 +540,21 @@ func chained(rootCA string, persistent bool) (http.RoundTripper, error) { } tr.Proxy = func(req *http.Request) (*url.URL, error) { + log.Tracef("Using chained proxy for: %+v", req.URL) proxyAddr, ok := getProxyAddr() if !ok { + log.Errorf("Chained proxy unavailable") return nil, errors.New(ErrChainedProxyUnavailable) } return url.Parse("http://" + proxyAddr) } + tr.OnProxyConnectResponse = func(ctx context.Context, proxyURL *url.URL, connectReq *http.Request, connectRes *http.Response) error { + log.Tracef("Proxy connect request: %+v", connectReq) + log.Tracef("Proxy connect response: %+v", connectRes) + return nil + } + return AsRoundTripper(func(req *http.Request) (*http.Response, error) { changeUserAgent(req) op := ops.Begin("chained").ProxyType(ops.ProxyChained).Request(req) diff --git a/bypass/bypass.go b/services/bypass.go similarity index 54% rename from bypass/bypass.go rename to services/bypass.go index bf675ae3c..bc138a24d 100644 --- a/bypass/bypass.go +++ b/services/bypass.go @@ -1,24 +1,23 @@ -package bypass +package services -// bypass periodically sends traffic to the bypass blocking detection server. The server uses the ratio -// between domain fronted and proxied traffic to determine if proxies are blocked. The client randomizes -// the intervals between calls to the server and also randomizes the length of requests. import ( "bytes" "context" + "fmt" "io" "net" "net/http" - "strconv" "sync" "time" mrand "math/rand" "go.uber.org/atomic" + "google.golang.org/appengine/log" "google.golang.org/protobuf/proto" commonconfig "github.com/getlantern/common/config" + "github.com/getlantern/flashlight/v7/apipb" "github.com/getlantern/flashlight/v7/chained" "github.com/getlantern/flashlight/v7/common" @@ -26,50 +25,73 @@ import ( "github.com/getlantern/flashlight/v7/dialer" "github.com/getlantern/flashlight/v7/ops" "github.com/getlantern/flashlight/v7/proxied" - "github.com/getlantern/golog" ) -var ( - log = golog.LoggerFor("bypass") - - // some pluggable transports don't work with bypass - unsupportedTransports = map[string]bool{ - "broflake": true, - } -) +// bypass periodically sends traffic to the bypass blocking detection server. The server uses the ratio +// between domain fronted and proxied traffic to determine if proxies are blocked. The client randomizes +// the intervals between calls to the server and also randomizes the length of requests. // The way lantern-cloud is configured, we need separate URLs for domain fronted vs proxied traffic. const ( dfEndpoint = "https://iantem.io/api/v1/bypass" proxyEndpoint = "https://api.iantem.io/v1/bypass" + // bypassSendInterval is the interval between sending traffic to the bypass server. + bypassSendInterval = 4 * time.Minute + // version is the bypass client version. It is not necessary to update this value on every // change to bypass; this should only be updated when the backend needs to make decisions unique // to a new version of bypass. version int32 = 1 ) -type bypass struct { +var ( + // some pluggable transports don't work with bypass + unsupportedTransports = map[string]bool{ + "broflake": true, + } +) + +type bypassService struct { infos map[string]*commonconfig.ProxyConfig proxies []*proxy mxProxies sync.Mutex + // done is closed to notify the proxy bypass goroutines to stop. + done chan struct{} + // running is used to signal that the bypass service is running. + running *atomic.Bool } -// Start sends periodic traffic to the bypass server. The client periodically sends traffic to the server both via -// domain fronting and proxying to determine if proxies are blocked. -func Start(listen func(func(map[string]*commonconfig.ProxyConfig, config.Source)), configDir string, userConfig common.UserConfig) func() { - b := &bypass{ +// StartBypassService sends periodic traffic to the bypass server. The client periodically sends +// traffic to the server both via domain fronting and proxying to determine if proxies are blocked. +// StartBypassService returns a function to stop the service. +func StartBypassService( + listen func(func(map[string]*commonconfig.ProxyConfig, config.Source)), + configDir string, + userConfig common.UserConfig, +) StopFn { + b := &bypassService{ infos: make(map[string]*commonconfig.ProxyConfig), proxies: make([]*proxy, 0), + done: make(chan struct{}), + running: atomic.NewBool(true), } + + logger.Debug("Starting bypass service") listen(func(infos map[string]*commonconfig.ProxyConfig, src config.Source) { - b.OnProxies(infos, configDir, userConfig) + b.onProxies(infos, configDir, userConfig) }) - return b.reset + return b.Stop } -func (b *bypass) OnProxies(infos map[string]*commonconfig.ProxyConfig, configDir string, userConfig common.UserConfig) { - b.reset() +func (b *bypassService) onProxies( + infos map[string]*commonconfig.ProxyConfig, + configDir string, + userConfig common.UserConfig, +) { + if !b.Reset() { + return // bypassService was stopped + } // Some pluggable transports don't support bypass, filter these out here. supportedInfos := make(map[string]*commonconfig.ProxyConfig, len(infos)) @@ -97,7 +119,7 @@ func (b *bypass) OnProxies(infos map[string]*commonconfig.ProxyConfig, configDir } } -func (b *bypass) loadProxyAsync(proxyName string, config *commonconfig.ProxyConfig, configDir string, userConfig common.UserConfig, dialer dialer.ProxyDialer) { +func (b *bypassService) loadProxyAsync(proxyName string, config *commonconfig.ProxyConfig, configDir string, userConfig common.UserConfig, dialer dialer.ProxyDialer) { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute) defer cancel() readyChan := make(chan struct{}) @@ -125,7 +147,7 @@ func (b *bypass) loadProxyAsync(proxyName string, config *commonconfig.ProxyConf } } -func (b *bypass) startProxy(proxyName string, config *commonconfig.ProxyConfig, configDir string, userConfig common.UserConfig, dialer dialer.ProxyDialer) { +func (b *bypassService) startProxy(proxyName string, config *commonconfig.ProxyConfig, configDir string, userConfig common.UserConfig, dialer dialer.ProxyDialer) { b.mxProxies.Lock() defer b.mxProxies.Unlock() pc := chained.CopyConfig(config) @@ -135,124 +157,127 @@ func (b *bypass) startProxy(proxyName string, config *commonconfig.ProxyConfig, pc.Cert = "" p := b.newProxy(proxyName, pc, configDir, userConfig, dialer) b.proxies = append(b.proxies, p) - go p.start() + go p.start(b.done) } -func (b *bypass) newProxy(name string, pc *commonconfig.ProxyConfig, configDir string, userConfig common.UserConfig, dialer dialer.ProxyDialer) *proxy { +func (b *bypassService) newProxy(name string, pc *commonconfig.ProxyConfig, configDir string, userConfig common.UserConfig, dialer dialer.ProxyDialer) *proxy { return &proxy{ ProxyConfig: pc, name: name, - done: make(chan bool), - toggle: atomic.NewBool(mrand.Float32() < 0.5), + proxyRoundTripper: newProxyRoundTripper(name, pc, userConfig, dialer), dfRoundTripper: proxied.Fronted("bypass_fronted_roundtrip", 0), + sender: &sender{}, + toggle: atomic.NewBool(mrand.Float32() < 0.5), userConfig: userConfig, - proxyRoundTripper: proxyRoundTripper(name, pc, configDir, userConfig, dialer), } } -func (b *bypass) reset() { - b.mxProxies.Lock() - defer b.mxProxies.Unlock() - for _, v := range b.proxies { - v.stop() +// Reset resets the bypass service by stopping all existing bypass proxy goroutines if +// bypassService is still running. It returns true if bypassService was reset successfully. +func (b *bypassService) Reset() bool { + if !b.running.Load() { + return false } + + close(b.done) + + b.mxProxies.Lock() b.proxies = make([]*proxy, 0) + b.done = make(chan struct{}) + b.mxProxies.Unlock() + + return true +} + +func (b *bypassService) Stop() { + if b.running.CompareAndSwap(true, false) { + close(b.done) + } } type proxy struct { *commonconfig.ProxyConfig name string - done chan bool dfRoundTripper http.RoundTripper proxyRoundTripper http.RoundTripper + sender *sender toggle *atomic.Bool userConfig common.UserConfig } -func (p *proxy) start() { - log.Debugf("Starting bypass for proxy %v", p.name) - p.callRandomly(p.sendToBypass) +func newProxy( + name string, + pc *commonconfig.ProxyConfig, + configDir string, + userConfig common.UserConfig, + dialer dialer.ProxyDialer, +) *proxy { + return &proxy{ + ProxyConfig: pc, + name: name, + proxyRoundTripper: newProxyRoundTripper(name, pc, userConfig, dialer), + dfRoundTripper: proxied.Fronted("bypass_fronted_roundtrip", 0), + sender: &sender{}, + toggle: atomic.NewBool(mrand.Float32() < 0.5), + userConfig: userConfig, + } } -func (p *proxy) sendToBypass() int64 { +func (p *proxy) start(done <-chan struct{}) { + logger.Debugf("Starting bypass for proxy %v", p.name) + fn := func() int64 { + wait, _ := p.sendToBypass() + return wait + } + callRandomly("bypass", fn, bypassSendInterval, done) +} + +func (p *proxy) sendToBypass() (int64, error) { op := ops.Begin("bypass_dial") defer op.End() // We alternate between domain fronting and proxying to ensure that, in aggregate, we // send both equally. We avoid sending both a domain fronted and a proxied request // in rapid succession to avoid the blocking detection itself being a signal. - var rt http.RoundTripper - var endpoint string - var fronted bool - if p.toggle.Toggle() { - log.Debug("Using proxy directly") - rt = p.proxyRoundTripper - endpoint = proxyEndpoint - fronted = false - } else { + var ( + rt http.RoundTripper + endpoint string + fronted = p.toggle.Toggle() + ) + if fronted { + logger.Debug("bypass: Using domain fronting") rt = p.dfRoundTripper - log.Debug("Using domain fronting") endpoint = dfEndpoint - fronted = true + } else { + logger.Debug("bypass: Using proxy directly") + rt = p.proxyRoundTripper + endpoint = proxyEndpoint } + op.Set("fronted", fronted) - req, err := p.newRequest(p.userConfig, endpoint) + logger.Debugf("bypass: Sending traffic for bypass server: %v", p.name) + req, err := p.newRequest(endpoint) if err != nil { - op.FailIf(log.Errorf("Unable to create request: %v", err)) - return 0 + op.FailIf(err) + return 0, err } - log.Debugf("Sending traffic for bypass server: %v", p.name) - resp, err := rt.RoundTrip(req) + resp, sleep, err := p.sender.post(req, rt) if err != nil || resp == nil { - op.FailIf(log.Errorf("Unable to post chained server info: %v", err)) - return 0 + err = logger.Errorf("bypass: Unable to post chained server info: %v", err) + op.FailIf(err) + return 0, err } - defer func() { - if resp.Body != nil { - if _, err := io.Copy(io.Discard, resp.Body); err != nil { - log.Errorf("Error reading response body: %v", err) - } - if err := resp.Body.Close(); err != nil { - log.Errorf("Error closing response body: %v", err) - } - } - }() - var sleepTime int64 - sleepVal := resp.Header.Get(common.SleepHeader) - if sleepVal != "" { - sleepTime, err = strconv.ParseInt(sleepVal, 10, 64) - if err != nil { - log.Errorf("Could not parse sleep val: %v", err) - } - } - if resp.StatusCode != http.StatusOK { - log.Errorf("Unexpected response code %v: fronted: %v for response %#v", resp.Status, fronted, resp) - } else { - log.Debugf("Successfully got response from: %v", p.name) - } - return sleepTime -} - -func proxyRoundTripper(name string, info *commonconfig.ProxyConfig, configDir string, userConfig common.UserConfig, d dialer.ProxyDialer) http.RoundTripper { - transport := http.DefaultTransport.(*http.Transport).Clone() - transport.Proxy = nil - transport.DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) { - log.Debugf("Dialing chained server at: %s", addr) - pc, _, err := d.DialContext(ctx, dialer.NetworkConnect, addr) - if err != nil { - log.Errorf("Unable to dial chained server: %v", err) - } else { - log.Debug("Successfully dialed chained server") - } - return pc, err + if resp.Body != nil { + io.Copy(io.Discard, resp.Body) + resp.Body.Close() } - return transport + return sleep, nil } -func (p *proxy) newRequest(userConfig common.UserConfig, endpoint string) (*http.Request, error) { +func (p *proxy) newRequest(endpoint string) (*http.Request, error) { // Just posting all the info about the server allows us to control these fields fully on the server // side. bypassRequest := &apipb.BypassRequest{ @@ -275,71 +300,43 @@ func (p *proxy) newRequest(userConfig common.UserConfig, endpoint string) (*http Version: version, } - infopb, err := proto.Marshal(bypassRequest) - if err != nil { - log.Errorf("Unable to marshal chained server info: %v", err) - return nil, err - } - + bypassBuf, err := proto.Marshal(bypassRequest) if err != nil { - log.Errorf("Unable to write chained server info: %v", err) + logger.Errorf("bypass: Unable to marshal chained server info: %v", err) return nil, err } - log.Debugf("Creating request for endpoint: %v", endpoint) - req, err := http.NewRequest("POST", endpoint, bytes.NewBuffer(infopb)) + req, err := http.NewRequest(http.MethodPost, endpoint, bytes.NewReader(bypassBuf)) if err != nil { - log.Errorf("Unable to create request: %v", err) - return nil, err + return nil, fmt.Errorf("unable to create request for %s: %w", endpoint, err) } - common.AddCommonHeaders(userConfig, req) - // make sure to close the connection after reading the Body this prevents the occasional - // EOFs errors we're seeing with successive requests - req.Close = true + common.AddCommonHeaders(p.userConfig, req) req.Header.Set("Content-Type", "application/x-protobuf") - log.Debug("Sending request") - + // Prevents intermediate nodes (domain-fronters) from caching the content + req.Header.Set("Cache-Control", "no-cache") return req, nil } -func (p *proxy) stop() { - p.done <- true -} - -// callRandomly calls the given function at a random interval between 2 and 7 minutes, unless -// the provided function overrides the default sleep. -func (p *proxy) callRandomly(f func() int64) { - calls := atomic.NewInt64(0) - - var sleep = func(extraSleepTime int64, elapsed time.Duration) <-chan time.Time { - defer func() { - calls.Inc() - }() - base := 40 - // If we just started up, we want to send traffic a little quicker to make sure we factor in users - // that don't run for very long. - if calls.Load() == 0 { - log.Debug("Making first call sooner") - base = 3 +func newProxyRoundTripper( + name string, + info *commonconfig.ProxyConfig, + userConfig common.UserConfig, + d dialer.ProxyDialer, +) http.RoundTripper { + transport := http.DefaultTransport.(*http.Transport).Clone() + transport.Proxy = nil + transport.DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) { + logger.Debugf("bypass: Dialing chained server at: %s", addr) + pc, _, err := d.DialContext(ctx, dialer.NetworkConnect, addr) + if err != nil { + logger.Errorf("bypass: Unable to dial chained server: %v", err) + } else { + logger.Debug("bypass: Successfully dialed chained server") } - var delay = elapsed + (time.Duration(base*2+mrand.Intn(base*5)) * time.Second) - delay = delay + time.Duration(extraSleepTime)*time.Second - log.Debugf("Next call in %v", delay) - return time.After(delay) - } - // This is passed back from the server to add longer sleeps if desired. - var extraSleepTime int64 - var elapsed time.Duration - for { - select { - case <-p.done: - return - case <-sleep(extraSleepTime, elapsed): - start := time.Now() - extraSleepTime = f() - elapsed = time.Since(start) - } + return pc, err } + + return transport } diff --git a/services/config.go b/services/config.go new file mode 100644 index 000000000..0dae9bc93 --- /dev/null +++ b/services/config.go @@ -0,0 +1,269 @@ +package services + +import ( + "bytes" + "errors" + "fmt" + "io" + "net/http" + "net/url" + "strconv" + "sync" + "time" + + "github.com/getlantern/detour" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/timestamppb" + + "github.com/getlantern/flashlight/v7/apipb" + "github.com/getlantern/flashlight/v7/common" + "github.com/getlantern/flashlight/v7/ops" +) + +const defaultConfigPollInterval = 3 * time.Minute + +// ConfigOptions specifies the options to use for ConfigService. +type ConfigOptions struct { + // URL to use for fetching this config. + OriginURL string + + // UserConfig contains data for communicating the user details to upstream + // servers in HTTP headers, such as the pro token and other options. + UserConfig common.UserConfig + + // RoundTripper provides the http.RoundTripper the fetcher should use, which allows us to + // dictate whether the fetcher will use dual fetching (from fronted and chained URLs) or not. + RoundTripper http.RoundTripper + + // PollInterval specifies how frequently to poll for new config. + PollInterval time.Duration +} + +type configService struct { + opts *ConfigOptions + clientInfo *apipb.ConfigRequest_ClientInfo + configHandler ConfigHandler + lastFetched time.Time + + sender *sender + + done chan struct{} + running bool + // runningMu is used to protect the running field. + runningMu sync.Mutex +} + +// ConfigHandler handles updating and retrieving the client config. +type ConfigHandler interface { + // GetConfig returns the current client config. + GetConfig() *apipb.ConfigResponse + // SetConfig sets the client config to the given config. + SetConfig(new *apipb.ConfigResponse) +} + +var _configService = &configService{sender: &sender{}} + +// StartConfigService starts a new config service with the given options and returns a func to stop +// it. It will return an error if opts.OriginURL, opts.Rt, or opts.OnConfig are nil. +func StartConfigService(handler ConfigHandler, opts *ConfigOptions) (StopFn, error) { + _configService.runningMu.Lock() + defer _configService.runningMu.Unlock() + + if _configService.running { + return _configService.Stop, nil + } + + logger.Debug("Starting config service") + switch { + case handler == nil: + return nil, errors.New("ConfigHandler is required") + case opts == nil: + return nil, errors.New("ConfigOptions is required") + case opts.RoundTripper == nil: + return nil, errors.New("RoundTripper is required") + case opts.OriginURL == "": + return nil, errors.New("OriginURL is required") + } + + if opts.PollInterval <= 0 { + opts.PollInterval = defaultConfigPollInterval + } + + u, err := url.Parse(opts.OriginURL) + if err != nil { + logger.Errorf("configservice: Unable to parse chained cloud config URL: %v", err) + } + + detour.ForceWhitelist(u.Host) + + userId := strconv.Itoa(int(opts.UserConfig.GetUserID())) + _configService.opts = opts + _configService.clientInfo = &apipb.ConfigRequest_ClientInfo{ + FlashlightVersion: common.LibraryVersion, + ClientVersion: common.CompileTimeApplicationVersion, + UserId: userId, + ProToken: opts.UserConfig.GetToken(), + } + _configService.done = make(chan struct{}) + + _configService.configHandler = handler + config := handler.GetConfig() + _configService.clientInfo.Country = config.GetCountry() + + _configService.running = true + + fn := func() int64 { + sleep, _ := _configService.fetchConfig() + return sleep + } + go callRandomly("configservice", fn, opts.PollInterval, _configService.done) + + return _configService.Stop, nil +} + +func (cs *configService) Stop() { + cs.runningMu.Lock() + defer cs.runningMu.Unlock() + + if !cs.running { + return + } + + close(cs.done) + cs.running = false +} + +// fetchConfig fetches the current config from the server and updates the client's config if a change +// has occurred. It returns the extra sleep time received from the server response and any error that +// occurred. +func (cs *configService) fetchConfig() (int64, error) { + op := ops.Begin("Fetching_userconfig") + defer op.End() + + newConf, sleep, err := cs.fetch() + if err != nil { + logger.Errorf("configservice: Failed to fetch config: %v", err) + return 0, op.FailIf(err) + } + + cs.lastFetched = time.Now() + + logger.Debug("configservice: Received config") + logger.Tracef("configservice: new config:\n%v", newConf.String()) + if newConf == nil { + op.Set("config_changed", false) + logger.Debug("configservice: Config is unchanged") + return sleep, nil + } + + op.Set("config_changed", true) + + if newConf.ProToken != "" { + cs.clientInfo.ProToken = newConf.ProToken + } + if newConf.Country != "" { + cs.clientInfo.Country = newConf.Country + } + if newConf.Ip != "" { + cs.clientInfo.Ip = newConf.Ip + } + cs.configHandler.SetConfig(newConf) + return sleep, nil +} + +func (cs *configService) fetch() (*apipb.ConfigResponse, int64, error) { + var ( + resp *http.Response + sleep int64 + ) + for { + req, err := cs.newRequest() + if err != nil { + return nil, 0, err + } + + logger.Debugf("configservice: fetching config from %v", req.URL) + resp, sleep, err = cs.sender.post(req, cs.opts.RoundTripper) + if err == nil { + break + } + if resp != nil { + body, err := io.ReadAll(resp.Body) + if err != nil { + logger.Errorf("configservice: could not read failed response body: %v", err) + } else { + logger.Errorf("configservice: failed response body: %s", body) + } + } + logger.Errorf("configservice: Failed to fetch config: %v", err) + retryWait := time.Duration(sleep) * time.Second + logger.Debugf("configservice: Retrying in %v", retryWait) + select { + case <-time.After(retryWait): + case <-cs.done: + return nil, 0, errors.New("configservice: fetch cancelled") + } + } + + if resp.StatusCode == http.StatusNoContent { + return nil, 0, nil // no config changes + } + + configBytes, err := io.ReadAll(resp.Body) + resp.Body.Close() + if err != nil { + return nil, 0, fmt.Errorf("unable to read config response: %w", err) + } + + newConf := &apipb.ConfigResponse{} + if err = proto.Unmarshal(configBytes, newConf); err != nil { + return nil, 0, fmt.Errorf("unable to unmarshal config: %w", err) + } + + return newConf, sleep, nil +} + +// newRequest returns a new ConfigRequest with the current client info, proxy ids, and the last +// time the config was fetched. +func (cs *configService) newRequest() (*http.Request, error) { + conf := cs.configHandler.GetConfig() + proxies := []*apipb.ProxyConnectConfig{} + if conf != nil { // not the first request + proxies = conf.GetProxy().GetProxies() + } + + names := make([]string, len(proxies)) + for _, proxy := range proxies { + names = append(names, proxy.Name) + } + + confReq := &apipb.ConfigRequest{ + ClientInfo: cs.clientInfo, + Proxy: &apipb.ConfigRequest_Proxy{ + Names: names, + LastRequest: timestamppb.New(cs.lastFetched), + }, + } + + buf, err := proto.Marshal(confReq) + if err != nil { + return nil, fmt.Errorf("unable to marshal config request: %w", err) + } + + req, err := http.NewRequest(http.MethodPost, cs.opts.OriginURL, bytes.NewReader(buf)) + if err != nil { + return nil, fmt.Errorf("unable to create request") + } + + common.AddCommonHeaders(cs.opts.UserConfig, req) + req.Header.Set("Content-Type", "application/x-protobuf") + // Prevents intermediate nodes (domain-fronters) from caching the content + req.Header.Set("Cache-Control", "no-cache") + + var headers string + for k, v := range req.Header { + headers += fmt.Sprintf("%s: %s\n", k, v) + } + logger.Tracef("configservice: Request:\n%v%v", headers, confReq.String()) + return req, nil +} diff --git a/services/config_test.go b/services/config_test.go new file mode 100644 index 000000000..1cd01b7d0 --- /dev/null +++ b/services/config_test.go @@ -0,0 +1,79 @@ +package services + +import ( + "fmt" + "net/http" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/getlantern/flashlight/v7/apipb" + "github.com/getlantern/flashlight/v7/common" +) + +func TestFetchConfig(t *testing.T) { + t.Run("no change", func(t *testing.T) { + cs := newTestConfigService() + want := fmt.Sprintf("%v", cs.configHandler.GetConfig()) + cs.opts.RoundTripper.(*mockRoundTripper).status = http.StatusNoContent + + _, err := cs.fetchConfig() + require.NoError(t, err) + + got := fmt.Sprintf("%v", cs.configHandler.GetConfig()) + assert.Equal(t, want, got, "config should not have changed") + }) + + t.Run("new config", func(t *testing.T) { + cs := newTestConfigService() + _, err := cs.fetchConfig() + require.NoError(t, err) + + rt := cs.opts.RoundTripper.(*mockRoundTripper) + want := fmt.Sprintf("%v", rt.config) + got := fmt.Sprintf("%v", cs.configHandler.GetConfig()) + assert.Equal(t, want, got, "new config not set") + }) +} + +type mockConfigHandler struct { + config *apipb.ConfigResponse +} + +func (m *mockConfigHandler) GetConfig() *apipb.ConfigResponse { return m.config } +func (m *mockConfigHandler) SetConfig(new *apipb.ConfigResponse) { m.config = new } + +func newTestConfigService() *configService { + clientInfo := &apipb.ConfigRequest_ClientInfo{ + ProToken: "the gray", + Country: "shire", + } + return &configService{ + opts: &ConfigOptions{ + OriginURL: "http://middle.earth", + UserConfig: common.NullUserConfig{}, + RoundTripper: &mockRoundTripper{ + config: &apipb.ConfigResponse{ + ProToken: "the white", + Country: "shire", + Proxy: &apipb.ConfigResponse_Proxy{ + Proxies: []*apipb.ProxyConnectConfig{{Name: "mines of moria"}}, + }, + }, + }, + }, + clientInfo: clientInfo, + configHandler: &mockConfigHandler{ + config: &apipb.ConfigResponse{ + ProToken: clientInfo.ProToken, + Country: clientInfo.Country, + Proxy: &apipb.ConfigResponse_Proxy{ + Proxies: []*apipb.ProxyConnectConfig{{Name: "misty mountain"}}, + }, + }, + }, + sender: &sender{}, + done: make(chan struct{}), + } +} diff --git a/services/http.go b/services/http.go new file mode 100644 index 000000000..59339cdb2 --- /dev/null +++ b/services/http.go @@ -0,0 +1,77 @@ +package services + +import ( + "fmt" + "math" + "net/http" + "strconv" + "time" + + "github.com/getlantern/flashlight/v7/common" +) + +const ( + // retryWaitSeconds is the base wait time in seconds between retries + retryWaitSeconds = 5 * time.Second + maxRetryWait = 10 * time.Minute +) + +// sender is a helper for sending post requests. If the request fails, sender calulates an +// exponential backoff time using retryWaitSeconds and return it as the sleep time. +type sender struct { + failCount int +} + +// post posts data to the specified URL and returns the response, the sleep time in seconds, and any +// error that occurred. +// +// Note: if the request is successful, it is the responsibility of the caller to read the response +// body to completion and close it. +func (s *sender) post(req *http.Request, rt http.RoundTripper) (*http.Response, int64, error) { + resp, err := s.doPost(req, rt) + if err != nil { + return resp, s.backoff(), err + } + + if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusNoContent { + err = fmt.Errorf("bad response code: %v", resp.StatusCode) + return resp, s.backoff(), err + } + + s.failCount = 0 + + var sleepTime int64 + if sleepVal := resp.Header.Get(common.SleepHeader); sleepVal != "" { + if sleepTime, err = strconv.ParseInt(sleepVal, 10, 64); err != nil { + logger.Errorf("Could not parse sleep val: %v", err) + } + } + + return resp, sleepTime, nil +} + +func (s *sender) doPost(req *http.Request, rt http.RoundTripper) (*http.Response, error) { + // make sure to close the connection after reading the Body + // this prevents the occasional EOFs errors we're seeing with + // successive requests + req.Close = true + resp, err := rt.RoundTrip(req) + if err != nil { + return nil, fmt.Errorf("request to failed: %w", err) + } + + logger.Debugf("Response status: %v headers:\n%v", resp.Status, resp.Header) + return resp, nil +} + +// backoff calculates the backoff time in seconds for the next retry. +func (s *sender) backoff() int64 { + wait := time.Duration(math.Pow(2, float64(s.failCount))) * retryWaitSeconds + s.failCount++ + + if wait > maxRetryWait { + return int64(maxRetryWait.Seconds()) + } + + return int64(wait.Seconds()) +} diff --git a/services/http_test.go b/services/http_test.go new file mode 100644 index 000000000..1e1eb9b3a --- /dev/null +++ b/services/http_test.go @@ -0,0 +1,93 @@ +package services + +import ( + "bytes" + "io" + "math" + mrand "math/rand/v2" + "net/http" + "strconv" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/proto" + + "github.com/getlantern/flashlight/v7/apipb" + + "github.com/getlantern/flashlight/v7/common" +) + +func TestPost(t *testing.T) { + sdr := &sender{} + rt := &mockRoundTripper{ + status: http.StatusOK, + sleep: mrand.IntN(10), + } + req, _ := http.NewRequest(http.MethodPost, "http://example.com", nil) + _, sleep, err := sdr.post(req, rt) + require.NoError(t, err) + + assert.Equal(t, rt.sleep, int(sleep), "response sleep value does not match") + + testBackoff := func(t *testing.T, rt *mockRoundTripper) { + sdr := &sender{} + for i := 0; i < 5; i++ { + wait := time.Duration(math.Pow(2, float64(i))) * retryWaitSeconds + want := int64(wait.Seconds()) + req, _ := http.NewRequest(http.MethodPost, "http://example.com", nil) + _, sleep, err = sdr.post(req, rt) + assert.Equal(t, want, sleep, "returned sleep value does not follow an exponential backoff") + } + } + + t.Run("backoff on error", func(t *testing.T) { + rt = &mockRoundTripper{shouldErr: true} + testBackoff(t, rt) + }) + + t.Run("backoff on bad StatusCode", func(t *testing.T) { + rt = &mockRoundTripper{status: http.StatusBadRequest} + testBackoff(t, rt) + }) +} + +func TestDoPost(t *testing.T) { + sdr := &sender{} + rt := &mockRoundTripper{} + req, _ := http.NewRequest(http.MethodPost, "http://example.com", nil) + _, err := sdr.doPost(req, rt) + assert.NoError(t, err) + assert.True(t, rt.req.Close, "request.Close should be set to true before calling RoundTrip") +} + +type mockRoundTripper struct { + req *http.Request + status int + sleep int + config *apipb.ConfigResponse + shouldErr bool +} + +func (m *mockRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + m.req = req + if m.shouldErr { + return nil, assert.AnError + } + + buf, _ := proto.Marshal(m.config) + body := io.NopCloser(bytes.NewReader(buf)) + + header := http.Header{} + header.Add(common.SleepHeader, strconv.Itoa(m.sleep)) + if m.status == 0 { + m.status = http.StatusOK + } + + return &http.Response{ + StatusCode: m.status, + Header: header, + Body: body, + }, nil +} diff --git a/services/service.go b/services/service.go new file mode 100644 index 000000000..d04ee85ef --- /dev/null +++ b/services/service.go @@ -0,0 +1,65 @@ +// Package services provides the background services of the flashlight application. These services +// are responsible for fetching and updating the proxy configuration, and for reporting to the +// bypass server to detect if proxies are blocked. Requests to the servers are made at random +// intervals to prevent the thundering herd problem and help avoid detection. +package services + +import ( + "time" + + mrand "math/rand/v2" + + "github.com/getlantern/golog" +) + +const jitter = 2 * time.Minute + +var logger = golog.LoggerFor("flashlight.services") + +type StopFn func() + +// callRandomly continuously calls fn randomly between interval-jitter and interval+jitter, with +// the initial call being made immediately. fn can return a positive value to extend the wait time. +func callRandomly(name string, fn func() int64, interval time.Duration, done <-chan struct{}) { + callRandomlyWithJitter(name, fn, interval, jitter, done) +} + +func callRandomlyWithJitter( + name string, + fn func() int64, + interval time.Duration, + jitter time.Duration, + done <-chan struct{}, +) { + jitterInt := jitter.Milliseconds() + intervalInt := interval.Milliseconds() + + // calculate sleep time + sleep := func(extraDelay time.Duration) <-chan time.Time { + delay := intervalInt + if jitterInt > 0 { + delay += mrand.Int64N(2*jitterInt) - jitterInt + } + + delayDuration := time.Duration(delay)*time.Millisecond + extraDelay + logger.Debugf("%s - next run in %v", name, delayDuration) + return time.After(delayDuration) + } + + // make initial call to fn immediately before entering loop + extraSeconds := fn() + + extraDelay := time.Duration(extraSeconds) * time.Second + for { + select { + case <-done: + return + case <-sleep(extraDelay): + start := time.Now() + extraSeconds = fn() + elapsed := time.Since(start) + extraDelay = time.Duration(extraSeconds)*time.Second - elapsed + extraDelay = max(extraDelay, 0) + } + } +} diff --git a/services/service_test.go b/services/service_test.go new file mode 100644 index 000000000..aaa390876 --- /dev/null +++ b/services/service_test.go @@ -0,0 +1,122 @@ +package services + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestCallRandomlyInitialCall(t *testing.T) { + // we use a long interval to make sure that fn is called before it goes to sleep + interval := time.Hour + + call := make(chan struct{}) + fn := func() int64 { + call <- struct{}{} + return 0 + } + + started := make(chan struct{}, 1) + done := make(chan struct{}) + go func() { + started <- struct{}{} + callRandomlyWithJitter("test inital call", fn, interval, 0, done) + }() + + // wait for the goroutine to start + <-started + select { + case <-call: + case <-time.After(200 * time.Millisecond): + assert.Fail(t, "timed out waiting for initial call") + } + + close(done) + +} + +func TestCallRandomlyJitter(t *testing.T) { + interval := 700 * time.Millisecond + jitter := 500 * time.Millisecond // needs to be large enough to help account for scheduling + + call := make(chan time.Time) + fn := func() int64 { + call <- time.Now() + return 0 + } + + done := make(chan struct{}) + defer close(done) + + go callRandomlyWithJitter("test jitter", fn, interval, jitter, done) + + // add some extra time to account for scheduling + timeout := interval + jitter + 100*time.Millisecond + + var lastCall time.Time + select { + case lastCall = <-call: + case <-time.After(timeout): + assert.FailNow(t, "timed out waiting for first call") + } + + // we need to check a few calls to make sure that jitter is respected + minJitter := jitter * 2 + maxJitter := time.Duration(-minJitter) + for i := 0; i < 4; i++ { + select { + case nextCall := <-call: + nextJitter := nextCall.Sub(lastCall) - interval + maxJitter = max(maxJitter, nextJitter) + minJitter = min(minJitter, nextJitter) + + require.WithinDuration(t, lastCall.Add(interval), nextCall, jitter) + lastCall = nextCall + case <-time.After(timeout): + assert.FailNow(t, "timed out waiting for next call") + } + } + + // we need to check that the jitter is actually different and not just scheduling noise + assert.GreaterOrEqual(t, maxJitter-minJitter, 40*time.Millisecond) +} + +func TestCallRandomlyExtraDelay(t *testing.T) { + interval := 100 * time.Millisecond + delay := time.Second // extra delay is expected in seconds + + call := make(chan time.Time) + fn := func() int64 { + call <- time.Now() + return int64(delay.Seconds()) + } + + done := make(chan struct{}) + defer close(done) + + go func() { + callRandomlyWithJitter("test extra delay", fn, interval, 0, done) + }() + + var lastCall time.Time + select { + case lastCall = <-call: + case <-time.After(time.Second): + assert.FailNow(t, "timed out waiting for first call") + } + + select { + case nextCall := <-call: + nextDelay := nextCall.Sub(lastCall) - interval + // we can safely truncate to seconds because the delay is in seconds. This helps account for + // scheduling + assert.Equalf( + t, delay, nextDelay.Truncate(time.Second), + "expected next call to be %v later", delay, + ) + case <-time.After(interval + delay + 100*time.Millisecond): + assert.Fail(t, "timed out waiting for next call") + } +} diff --git a/shortcut/resources/ae_ipv4.txt b/shortcut/resources/ae_ipv4.txt index c9de345a1..06252d1ec 100644 --- a/shortcut/resources/ae_ipv4.txt +++ b/shortcut/resources/ae_ipv4.txt @@ -161,6 +161,7 @@ 13.105.120.0/23 13.105.162.64/26 13.105.168.0/26 +13.105.187.128/25 13.105.204.40/30 13.106.72.0/23 13.107.185.16/30 @@ -320,8 +321,7 @@ 31.56.52.0/22 31.56.56.0/24 31.56.57.0/24 -31.56.58.0/24 -31.56.59.0/24 +31.56.58.0/23 31.56.60.0/24 31.56.61.0/24 31.56.62.0/24 @@ -586,7 +586,8 @@ 31.59.18.0/24 31.59.19.0/24 31.59.20.0/23 -31.59.22.0/23 +31.59.22.0/24 +31.59.23.0/24 31.59.24.0/24 31.59.25.0/24 31.59.26.0/24 @@ -1036,6 +1037,7 @@ 45.95.66.0/24 45.95.67.0/24 45.95.201.0/24 +45.114.60.0/22 45.120.201.0/24 45.129.140.0/24 45.129.141.0/24 @@ -1145,7 +1147,15 @@ 45.135.133.0/24 45.135.134.0/23 45.135.164.0/24 -45.135.165.0/24 +45.135.165.0/25 +45.135.165.128/26 +45.135.165.192/28 +45.135.165.208/29 +45.135.165.216/30 +45.135.165.220/31 +45.135.165.222/32 +45.135.165.223/32 +45.135.165.224/27 45.135.166.0/24 45.135.167.0/24 45.135.176.0/24 @@ -1442,10 +1452,13 @@ 46.31.70.0/24 46.102.237.0/24 46.149.96.0/24 +46.151.24.0/21 46.183.90.0/23 46.183.92.0/24 46.253.140.0/24 47.91.96.0/19 +48.208.211.0/24 +48.208.212.0/24 50.3.154.0/23 51.0.80.0/20 51.5.19.0/24 @@ -1456,6 +1469,7 @@ 52.95.187.0/24 52.95.188.0/23 52.97.99.0/24 +52.97.123.0/24 52.98.32.0/27 52.98.32.48/28 52.98.32.192/28 @@ -1510,6 +1524,7 @@ 52.123.54.0/24 52.123.157.0/24 52.123.158.0/24 +52.123.226.112/28 52.123.243.160/27 52.143.202.0/24 52.143.221.0/24 @@ -1517,8 +1532,8 @@ 54.239.1.176/28 57.83.64.0/20 57.89.0.0/20 +57.150.230.0/23 57.188.6.0/24 -62.60.148.0/22 62.67.16.144/28 62.106.86.0/24 62.109.192.16/29 @@ -1609,7 +1624,9 @@ 79.110.227.0/24 79.171.117.0/24 79.171.118.0/23 -80.64.22.0/23 +80.64.20.0/23 +80.64.22.0/24 +80.64.23.0/24 80.64.24.0/23 80.64.26.0/24 80.64.27.0/24 @@ -1650,6 +1667,7 @@ 81.25.69.0/24 81.25.70.0/23 81.25.76.0/22 +81.30.107.0/24 82.178.32.0/23 82.178.158.0/27 82.178.158.32/29 @@ -1924,6 +1942,7 @@ 91.198.254.0/24 91.200.146.0/24 91.201.4.0/22 +91.201.112.0/22 91.202.211.0/24 91.206.69.0/24 91.206.92.0/23 @@ -2164,6 +2183,7 @@ 102.218.10.0/23 103.6.232.0/23 103.21.58.0/23 +103.54.16.0/22 103.57.251.0/24 103.74.92.0/22 103.81.142.0/24 @@ -2178,7 +2198,8 @@ 103.224.22.0/23 103.229.117.0/24 103.245.223.0/24 -103.245.228.0/23 +103.245.228.0/24 +103.245.229.0/24 103.245.230.0/23 104.28.8.4/31 104.28.8.6/32 @@ -2284,6 +2305,9 @@ 109.106.3.0/24 109.169.72.0/24 109.177.0.0/16 +109.196.97.0/24 +109.196.98.0/23 +109.196.100.0/22 109.196.104.0/24 109.196.105.0/24 109.196.106.0/24 @@ -2442,6 +2466,7 @@ 146.70.238.0/24 146.70.241.0/24 146.70.247.0/24 +146.70.255.0/24 146.75.64.0/22 146.75.162.0/30 146.75.162.4/31 @@ -2507,8 +2532,6 @@ 157.5.109.6/31 157.5.109.8/31 157.23.250.0/24 -157.56.234.232/29 -157.56.236.96/29 157.166.124.0/23 157.167.130.0/24 157.167.228.1/32 @@ -2692,6 +2715,7 @@ 168.149.175.0/24 168.225.24.0/24 169.224.0.0/17 +169.224.147.0/24 170.76.178.0/24 170.114.80.0/24 170.130.112.0/23 @@ -2887,7 +2911,8 @@ 179.61.245.0/24 179.61.246.0/24 179.61.247.0/24 -179.61.248.0/23 +179.61.248.0/24 +179.61.249.0/24 179.61.250.0/24 179.61.251.0/24 179.61.252.0/24 @@ -3450,6 +3475,7 @@ 185.87.32.0/22 185.88.11.0/24 185.92.128.0/22 +185.93.89.0/24 185.93.196.0/22 185.93.244.0/22 185.95.140.0/22 @@ -3636,6 +3662,7 @@ 185.174.61.0/24 185.174.62.0/24 185.174.63.0/24 +185.176.80.0/22 185.177.184.0/22 185.179.196.0/23 185.179.198.0/24 @@ -4247,16 +4274,7 @@ 191.101.192.0/23 191.101.194.0/24 191.101.195.0/24 -191.101.196.0/32 -191.101.196.1/32 -191.101.196.2/31 -191.101.196.4/30 -191.101.196.8/29 -191.101.196.16/28 -191.101.196.32/27 -191.101.196.64/26 -191.101.196.128/25 -191.101.197.0/24 +191.101.196.0/23 191.101.198.0/24 191.101.199.0/24 191.101.200.0/24 @@ -4264,7 +4282,8 @@ 191.101.202.0/23 191.101.204.0/24 191.101.205.0/24 -191.101.206.0/23 +191.101.206.0/24 +191.101.207.0/24 191.101.208.0/24 191.101.209.0/24 191.101.210.0/23 @@ -4297,6 +4316,7 @@ 191.101.253.0/24 191.101.254.0/23 192.23.187.0/24 +192.23.189.0/24 192.58.29.0/24 192.67.150.0/24 192.103.14.0/24 @@ -4449,8 +4469,7 @@ 194.34.245.0/24 194.34.246.0/24 194.34.247.0/24 -194.35.112.0/24 -194.35.113.0/24 +194.35.112.0/23 194.35.114.0/24 194.35.115.0/24 194.35.124.0/24 @@ -4550,7 +4569,8 @@ 194.169.162.0/24 194.169.163.0/24 194.170.0.0/16 -194.213.16.0/24 +194.213.16.0/25 +194.213.16.128/25 194.246.36.0/23 194.247.44.0/23 195.2.86.0/24 @@ -4624,6 +4644,7 @@ 212.107.20.0/22 212.118.36.0/22 212.118.40.0/22 +212.118.52.0/22 212.133.14.176/29 212.133.14.192/29 212.133.93.24/29 diff --git a/shortcut/resources/ae_ipv6.txt b/shortcut/resources/ae_ipv6.txt index 61d55d552..d1a80c0c0 100644 --- a/shortcut/resources/ae_ipv6.txt +++ b/shortcut/resources/ae_ipv6.txt @@ -137,6 +137,7 @@ 2001:470:6d:55a::/64 2001:470:6d:56a::/64 2001:470:6d:5ca::/64 +2001:470:6d:5d9::/64 2001:470:6d:7b8::/64 2001:470:6d:7d9::/64 2001:470:6d:7db::/64 @@ -276,7 +277,6 @@ 2001:470:1f09:f4::/64 2001:470:1f09:1ed::/64 2001:470:1f09:1f9::/64 -2001:470:1f09:20a::/64 2001:470:1f09:215::/64 2001:470:1f09:236::/64 2001:470:1f09:242::/64 @@ -413,6 +413,7 @@ 2001:470:1f0b:f88::/64 2001:470:1f0b:fd7::/64 2001:470:1f0b:fe1::/64 +2001:470:1f0b:ff2::/64 2001:470:1f0b:1021::/64 2001:470:1f0b:1066::/64 2001:470:1f0b:10cf::/64 @@ -929,6 +930,8 @@ 2600:9000:11e3::/48 2600:9000:1e3a::/48 2600:9000:520d::/48 +2600:f0f0:5530::/47 +2600:f0f0:5532::/48 2602:2a9:ae0::/44 2602:f96d:f2d::/48 2602:fdaa:50::/48 @@ -982,6 +985,7 @@ 2603:1062:0:9f::/64 2603:1062:0:a8::/64 2603:1062:0:304::/64 +2603:1062:0:352::/63 2603:1062:6:400::/63 2603:1062:c:a::/63 2603:1063:1a::/47 @@ -2257,6 +2261,8 @@ 2a0d:4ac0::/29 2a0d:4b40::/29 2a0d:4c40::/29 +2a0d:5600:126::/47 +2a0d:5600:128::/47 2a0d:5ac0::/29 2a0d:64c0::/29 2a0d:66c0::/29 diff --git a/shortcut/resources/cn_ipv4.txt b/shortcut/resources/cn_ipv4.txt index bf4f7b1cf..29561c8dd 100644 --- a/shortcut/resources/cn_ipv4.txt +++ b/shortcut/resources/cn_ipv4.txt @@ -880,6 +880,7 @@ 43.255.64.0/20 43.255.84.0/22 43.255.96.0/22 +43.255.144.0/22 43.255.176.0/22 43.255.184.0/22 43.255.192.0/22 @@ -901,6 +902,7 @@ 44.31.231.0/24 44.31.234.0/24 44.32.68.0/23 +44.32.143.0/24 44.56.67.64/29 44.61.0.21/32 44.61.0.45/32 @@ -913,6 +915,7 @@ 44.63.15.144/28 44.63.32.0/27 44.63.33.0/27 +45.12.29.71/32 45.40.192.0/20 45.40.208.0/21 45.40.216.0/21 @@ -2031,6 +2034,7 @@ 103.49.128.0/22 103.49.176.0/21 103.49.196.0/22 +103.50.0.112/31 103.50.36.0/22 103.50.44.0/22 103.50.48.0/20 @@ -2949,7 +2953,6 @@ 103.126.209.0/24 103.126.210.0/23 103.130.132.0/22 -103.130.152.0/24 103.130.160.0/22 103.130.228.0/22 103.131.20.0/22 @@ -3793,7 +3796,7 @@ 103.239.0.0/22 103.239.44.0/22 103.239.68.0/22 -103.239.152.0/22 +103.239.152.0/21 103.239.180.0/22 103.239.184.0/22 103.239.192.0/21 @@ -5268,7 +5271,8 @@ 122.8.21.128/25 122.8.22.0/23 122.8.24.0/21 -122.8.32.0/21 +122.8.32.0/22 +122.8.36.0/22 122.8.40.0/21 122.8.48.0/22 122.8.52.0/22 @@ -5785,7 +5789,6 @@ 153.99.0.0/16 153.101.0.0/16 153.118.0.0/15 -153.254.119.0/24 154.8.128.0/17 154.18.7.194/32 154.72.44.0/24 @@ -5949,6 +5952,8 @@ 160.202.212.0/22 160.202.216.0/21 160.202.224.0/19 +160.250.14.0/23 +160.250.16.0/22 161.120.0.0/16 161.123.70.0/23 161.123.94.0/23 @@ -6387,6 +6392,7 @@ 188.131.128.0/17 188.214.89.0/24 188.241.59.0/24 +188.241.80.0/24 192.51.188.0/24 192.55.46.0/23 192.55.68.0/22 @@ -6811,6 +6817,7 @@ 202.127.0.0/21 202.127.12.0/22 202.127.16.0/20 +202.127.40.0/21 202.127.48.0/20 202.127.112.0/20 202.127.128.0/19 diff --git a/shortcut/resources/cn_ipv6.txt b/shortcut/resources/cn_ipv6.txt index 194fa352e..7228787ee 100644 --- a/shortcut/resources/cn_ipv6.txt +++ b/shortcut/resources/cn_ipv6.txt @@ -116,6 +116,7 @@ 2001:470:8:1dd::/64 2001:470:8:1de::/64 2001:470:8:1e5::/64 +2001:470:8:1f5::/64 2001:470:8:1fc::/64 2001:470:8:1ff::/64 2001:470:8:206::/64 @@ -163,7 +164,6 @@ 2001:470:8:4a9::/64 2001:470:8:4b0::/64 2001:470:8:4ce::/64 -2001:470:8:4d0::/64 2001:470:8:4d7::/64 2001:470:8:4d9::/64 2001:470:8:4e0::/64 @@ -173,6 +173,8 @@ 2001:470:8:52c::/64 2001:470:8:547::/64 2001:470:8:550::/64 +2001:470:8:56a::/64 +2001:470:8:574::/63 2001:470:8:71d::/64 2001:470:8:7d7::/64 2001:470:8:7e6::/64 @@ -182,7 +184,6 @@ 2001:470:8:ddc::/64 2001:470:8:1171::/64 2001:470:b:c::/64 -2001:470:b:14::/64 2001:470:b:17::/64 2001:470:b:1a::/64 2001:470:b:1f::/64 @@ -331,7 +332,6 @@ 2001:470:b:42f::/64 2001:470:b:436::/64 2001:470:b:43c::/64 -2001:470:b:45e::/64 2001:470:b:460::/64 2001:470:b:468::/64 2001:470:b:46a::/63 @@ -340,7 +340,6 @@ 2001:470:b:491::/64 2001:470:b:493::/64 2001:470:b:4a8::/64 -2001:470:b:4ab::/64 2001:470:b:4ad::/64 2001:470:b:4b3::/64 2001:470:b:4b5::/64 @@ -710,6 +709,7 @@ 2001:470:d:401::/64 2001:470:d:408::/62 2001:470:d:40c::/63 +2001:470:d:40e::/64 2001:470:d:412::/63 2001:470:d:421::/64 2001:470:d:426::/64 @@ -723,7 +723,6 @@ 2001:470:d:43a::/63 2001:470:d:43c::/64 2001:470:d:444::/64 -2001:470:d:447::/64 2001:470:d:44a::/63 2001:470:d:44f::/64 2001:470:d:451::/64 @@ -742,7 +741,7 @@ 2001:470:d:485::/64 2001:470:d:489::/64 2001:470:d:48a::/63 -2001:470:d:493::/64 +2001:470:d:492::/63 2001:470:d:49b::/64 2001:470:d:4a0::/64 2001:470:d:4a4::/64 @@ -763,7 +762,6 @@ 2001:470:d:4d2::/64 2001:470:d:4d5::/64 2001:470:d:4d9::/64 -2001:470:d:4da::/64 2001:470:d:4dd::/64 2001:470:d:4e0::/64 2001:470:d:4e2::/64 @@ -781,7 +779,6 @@ 2001:470:d:50a::/64 2001:470:d:50c::/63 2001:470:d:50e::/64 -2001:470:d:513::/64 2001:470:d:51a::/63 2001:470:d:51c::/64 2001:470:d:520::/64 @@ -870,16 +867,24 @@ 2001:470:d:61a::/64 2001:470:d:61c::/63 2001:470:d:621::/64 -2001:470:d:622::/64 +2001:470:d:622::/63 +2001:470:d:624::/64 2001:470:d:626::/63 +2001:470:d:62a::/64 2001:470:d:62c::/64 2001:470:d:62f::/64 -2001:470:d:630::/64 +2001:470:d:630::/63 +2001:470:d:635::/64 2001:470:d:636::/64 -2001:470:d:638::/64 +2001:470:d:638::/63 +2001:470:d:63b::/64 +2001:470:d:63d::/64 2001:470:d:640::/64 2001:470:d:642::/63 +2001:470:d:644::/64 +2001:470:d:647::/64 2001:470:d:64a::/64 +2001:470:d:64d::/64 2001:470:d:650::/64 2001:470:d:658::/64 2001:470:d:65a::/63 @@ -911,7 +916,6 @@ 2001:470:d:6d0::/64 2001:470:d:6d4::/64 2001:470:d:6d9::/64 -2001:470:d:6da::/64 2001:470:d:6df::/64 2001:470:d:6e0::/64 2001:470:d:6e4::/64 @@ -1143,7 +1147,7 @@ 2001:470:d:adc::/64 2001:470:d:ae2::/64 2001:470:d:ae6::/64 -2001:470:d:aee::/63 +2001:470:d:aef::/64 2001:470:d:af1::/64 2001:470:d:af5::/64 2001:470:d:af7::/64 @@ -1484,7 +1488,7 @@ 2001:470:d:1049::/64 2001:470:d:104a::/64 2001:470:d:1051::/64 -2001:470:d:1052::/63 +2001:470:d:1052::/64 2001:470:d:1055::/64 2001:470:d:1059::/64 2001:470:d:105b::/64 @@ -1510,7 +1514,6 @@ 2001:470:d:10a2::/63 2001:470:d:10a4::/64 2001:470:d:10a6::/63 -2001:470:d:10a8::/64 2001:470:d:10ac::/63 2001:470:d:10b0::/64 2001:470:d:10b3::/64 @@ -2749,8 +2752,7 @@ 2001:470:19:adc::/63 2001:470:19:ae0::/61 2001:470:19:ae9::/64 -2001:470:19:aec::/63 -2001:470:19:aef::/64 +2001:470:19:aec::/62 2001:470:19:af0::/64 2001:470:19:af3::/64 2001:470:19:af4::/63 @@ -2847,7 +2849,7 @@ 2001:470:19:bea::/63 2001:470:19:bed::/64 2001:470:19:bee::/63 -2001:470:19:bf0::/64 +2001:470:19:bf0::/63 2001:470:19:bf5::/64 2001:470:19:bf7::/64 2001:470:19:bfc::/63 @@ -2892,7 +2894,6 @@ 2001:470:19:c5f::/64 2001:470:19:c60::/63 2001:470:19:c62::/64 -2001:470:19:c67::/64 2001:470:19:c69::/64 2001:470:19:c6a::/64 2001:470:19:c6e::/63 @@ -2988,7 +2989,8 @@ 2001:470:19:d60::/62 2001:470:19:d64::/64 2001:470:19:d66::/64 -2001:470:19:d68::/62 +2001:470:19:d68::/64 +2001:470:19:d6a::/63 2001:470:19:d6e::/63 2001:470:19:d70::/62 2001:470:19:d75::/64 @@ -3009,7 +3011,6 @@ 2001:470:19:d9a::/64 2001:470:19:d9e::/63 2001:470:19:da1::/64 -2001:470:19:da3::/64 2001:470:19:da4::/63 2001:470:19:da6::/64 2001:470:19:da8::/63 @@ -3043,7 +3044,6 @@ 2001:470:19:deb::/64 2001:470:19:dec::/63 2001:470:19:def::/64 -2001:470:19:df0::/64 2001:470:19:df2::/64 2001:470:19:df4::/64 2001:470:19:df7::/64 @@ -3086,7 +3086,7 @@ 2001:470:19:e64::/63 2001:470:19:e67::/64 2001:470:19:e68::/63 -2001:470:19:e6f::/64 +2001:470:19:e6e::/63 2001:470:19:e70::/64 2001:470:19:e73::/64 2001:470:19:e75::/64 @@ -3146,7 +3146,23 @@ 2001:470:19:f1d::/64 2001:470:19:f1f::/64 2001:470:19:f20::/63 +2001:470:19:f2a::/64 +2001:470:19:f2d::/64 +2001:470:19:f2e::/64 +2001:470:19:f30::/64 +2001:470:19:f33::/64 +2001:470:19:f34::/63 +2001:470:19:f36::/64 +2001:470:19:f38::/63 +2001:470:19:f3a::/64 +2001:470:19:f3f::/64 +2001:470:19:f40::/63 +2001:470:19:f44::/62 2001:470:19:f49::/64 +2001:470:19:f4a::/64 +2001:470:19:f4e::/64 +2001:470:19:f51::/64 +2001:470:19:f53::/64 2001:470:19:f78::/64 2001:470:19:f81::/64 2001:470:19:f87::/64 @@ -3365,8 +3381,7 @@ 2001:470:24:5f::/64 2001:470:24:60::/63 2001:470:24:62::/64 -2001:470:24:6a::/64 -2001:470:24:6c::/64 +2001:470:24:67::/64 2001:470:24:6e::/63 2001:470:24:72::/64 2001:470:24:76::/63 @@ -3578,7 +3593,7 @@ 2001:470:24:38d::/64 2001:470:24:38e::/64 2001:470:24:390::/64 -2001:470:24:397::/64 +2001:470:24:396::/63 2001:470:24:39c::/64 2001:470:24:3a3::/64 2001:470:24:3a4::/64 @@ -3673,6 +3688,8 @@ 2001:470:24:4fa::/63 2001:470:24:4ff::/64 2001:470:24:502::/64 +2001:470:24:506::/64 +2001:470:24:50a::/64 2001:470:24:50c::/64 2001:470:24:513::/64 2001:470:24:514::/63 @@ -3701,7 +3718,7 @@ 2001:470:24:581::/64 2001:470:24:586::/64 2001:470:24:589::/64 -2001:470:24:58a::/63 +2001:470:24:58a::/64 2001:470:24:58d::/64 2001:470:24:594::/64 2001:470:24:597::/64 @@ -3725,7 +3742,6 @@ 2001:470:24:5e1::/64 2001:470:24:5e3::/64 2001:470:24:5e9::/64 -2001:470:24:5ea::/64 2001:470:24:5ee::/63 2001:470:24:5f1::/64 2001:470:24:5f2::/64 @@ -3754,7 +3770,6 @@ 2001:470:24:64f::/64 2001:470:24:651::/64 2001:470:24:653::/64 -2001:470:24:65f::/64 2001:470:24:666::/63 2001:470:24:66c::/63 2001:470:24:675::/64 @@ -3776,7 +3791,6 @@ 2001:470:24:6b8::/64 2001:470:24:6c4::/64 2001:470:24:6d6::/63 -2001:470:24:6d8::/64 2001:470:24:6db::/64 2001:470:24:6e5::/64 2001:470:24:6e8::/64 @@ -3815,7 +3829,6 @@ 2001:470:24:838::/64 2001:470:24:84c::/64 2001:470:24:866::/64 -2001:470:24:8ce::/64 2001:470:24:8fe::/64 2001:470:24:901::/64 2001:470:24:90e::/64 @@ -3927,6 +3940,7 @@ 2001:470:36:118::/64 2001:470:36:11f::/64 2001:470:36:120::/63 +2001:470:36:131::/64 2001:470:36:136::/63 2001:470:36:13f::/64 2001:470:36:169::/64 @@ -3934,7 +3948,7 @@ 2001:470:36:171::/64 2001:470:36:183::/64 2001:470:36:185::/64 -2001:470:36:18e::/63 +2001:470:36:18f::/64 2001:470:36:195::/64 2001:470:36:196::/64 2001:470:36:19f::/64 @@ -4008,7 +4022,7 @@ 2001:470:36:38d::/64 2001:470:36:39b::/64 2001:470:36:3b4::/63 -2001:470:36:3ba::/64 +2001:470:36:3ba::/63 2001:470:36:3c4::/64 2001:470:36:3c6::/64 2001:470:36:3c8::/64 @@ -4059,7 +4073,6 @@ 2001:470:36:4b9::/64 2001:470:36:4bb::/64 2001:470:36:4bc::/63 -2001:470:36:4d4::/64 2001:470:36:4dc::/63 2001:470:36:4e0::/63 2001:470:36:4e5::/64 @@ -4079,7 +4092,6 @@ 2001:470:36:532::/64 2001:470:36:53c::/64 2001:470:36:53e::/64 -2001:470:36:542::/64 2001:470:36:545::/64 2001:470:36:547::/64 2001:470:36:54a::/64 @@ -4094,6 +4106,8 @@ 2001:470:36:573::/64 2001:470:36:57e::/64 2001:470:36:58b::/64 +2001:470:36:590::/64 +2001:470:36:598::/64 2001:470:36:59c::/64 2001:470:36:59e::/64 2001:470:36:5a7::/64 @@ -4111,10 +4125,14 @@ 2001:470:36:5de::/63 2001:470:36:5e6::/64 2001:470:36:5fa::/64 +2001:470:36:5fd::/64 2001:470:36:5fe::/64 -2001:470:36:600::/64 +2001:470:36:600::/63 +2001:470:36:609::/64 2001:470:36:60d::/64 2001:470:36:610::/63 +2001:470:36:614::/64 +2001:470:36:616::/63 2001:470:36:61d::/64 2001:470:36:626::/64 2001:470:36:631::/64 @@ -4352,7 +4370,6 @@ 2001:470:67:31::/64 2001:470:67:32::/63 2001:470:67:34::/63 -2001:470:67:36::/64 2001:470:67:39::/64 2001:470:67:3c::/64 2001:470:67:3e::/64 @@ -4560,6 +4577,8 @@ 2001:470:67:337::/64 2001:470:67:338::/63 2001:470:67:341::/64 +2001:470:67:343::/64 +2001:470:67:34c::/64 2001:470:67:358::/64 2001:470:67:35a::/63 2001:470:67:361::/64 @@ -4679,7 +4698,6 @@ 2001:470:6d:348::/64 2001:470:6d:40e::/64 2001:470:6d:57f::/64 -2001:470:6d:597::/64 2001:470:6d:5a1::/64 2001:470:6d:5b6::/64 2001:470:6d:65e::/64 @@ -4782,7 +4800,8 @@ 2001:470:7c:1dc::/64 2001:470:7c:1de::/63 2001:470:7c:1e3::/64 -2001:470:7c:1e4::/62 +2001:470:7c:1e4::/63 +2001:470:7c:1e7::/64 2001:470:7c:1e8::/64 2001:470:7c:1ea::/63 2001:470:7c:1ed::/64 @@ -4905,7 +4924,7 @@ 2001:470:1f05:12d::/64 2001:470:1f05:12e::/63 2001:470:1f05:130::/63 -2001:470:1f05:137::/64 +2001:470:1f05:136::/63 2001:470:1f05:139::/64 2001:470:1f05:13b::/64 2001:470:1f05:13f::/64 @@ -4923,6 +4942,10 @@ 2001:470:1f05:164::/64 2001:470:1f05:16d::/64 2001:470:1f05:16f::/64 +2001:470:1f05:17d::/64 +2001:470:1f05:17e::/64 +2001:470:1f05:181::/64 +2001:470:1f05:183::/64 2001:470:1f05:188::/63 2001:470:1f05:192::/63 2001:470:1f05:1a6::/64 @@ -5312,6 +5335,7 @@ 2001:470:1f07:163::/64 2001:470:1f07:16c::/64 2001:470:1f07:171::/64 +2001:470:1f07:1a1::/64 2001:470:1f07:1a4::/64 2001:470:1f07:1b0::/64 2001:470:1f07:1c7::/64 @@ -5404,7 +5428,6 @@ 2001:470:1f07:59a::/64 2001:470:1f07:5a5::/64 2001:470:1f07:5b9::/64 -2001:470:1f07:5c5::/64 2001:470:1f07:5c8::/64 2001:470:1f07:5cf::/64 2001:470:1f07:5ea::/64 @@ -5512,6 +5535,7 @@ 2001:470:1f09:2ee::/64 2001:470:1f09:316::/64 2001:470:1f09:332::/64 +2001:470:1f09:340::/64 2001:470:1f09:55b::/64 2001:470:1f09:5f0::/64 2001:470:1f09:678::/64 @@ -5584,6 +5608,8 @@ 2001:470:1f0b:fa8::/64 2001:470:1f0b:fcf::/64 2001:470:1f0b:1011::/64 +2001:470:1f0b:1013::/64 +2001:470:1f0b:1032::/64 2001:470:1f0b:10f7::/64 2001:470:1f0b:111a::/64 2001:470:1f0b:111d::/64 @@ -5737,6 +5763,7 @@ 2001:470:1f11:134::/64 2001:470:1f11:148::/64 2001:470:1f11:155::/64 +2001:470:1f11:157::/64 2001:470:1f11:15b::/64 2001:470:1f11:15c::/64 2001:470:1f11:15f::/64 @@ -5809,6 +5836,7 @@ 2001:470:1f11:492::/64 2001:470:1f11:494::/64 2001:470:1f11:4a2::/64 +2001:470:1f11:4ac::/64 2001:470:1f11:4b1::/64 2001:470:1f11:598::/64 2001:470:1f11:62f::/64 @@ -5843,6 +5871,7 @@ 2001:470:1f13:493::/64 2001:470:1f13:513::/64 2001:470:1f13:57f::/64 +2001:470:1f13:592::/64 2001:470:1f13:611::/64 2001:470:1f13:670::/64 2001:470:1f13:6ff::/64 @@ -5978,7 +6007,6 @@ 2001:470:1f19:87::/64 2001:470:1f19:89::/64 2001:470:1f19:8b::/64 -2001:470:1f19:90::/64 2001:470:1f19:93::/64 2001:470:1f19:96::/64 2001:470:1f19:98::/64 @@ -6027,7 +6055,6 @@ 2001:470:1f19:146::/64 2001:470:1f19:14a::/64 2001:470:1f19:14d::/64 -2001:470:1f19:158::/64 2001:470:1f19:15b::/64 2001:470:1f19:166::/64 2001:470:1f19:169::/64 @@ -6048,7 +6075,7 @@ 2001:470:1f19:1d0::/64 2001:470:1f19:1d3::/64 2001:470:1f19:1dd::/64 -2001:470:1f19:1e2::/63 +2001:470:1f19:1e2::/64 2001:470:1f19:1e8::/63 2001:470:1f19:1f0::/64 2001:470:1f19:209::/64 @@ -6103,12 +6130,12 @@ 2001:470:1f1b:232::/64 2001:470:1f1b:2a6::/64 2001:470:1f1b:2da::/64 +2001:470:1f1b:47e::/64 2001:470:1f1b:4f0::/64 2001:470:1f1b:864::/64 2001:470:1f1d:82::/64 2001:470:1f1d:86::/64 2001:470:1f1d:9c::/64 -2001:470:1f1d:cc::/64 2001:470:1f1d:f2::/64 2001:470:1f1d:116::/64 2001:470:1f1d:142::/64 @@ -6124,6 +6151,7 @@ 2001:470:1f1d:253::/64 2001:470:1f1d:25a::/64 2001:470:1f1d:277::/64 +2001:470:1f1d:279::/64 2001:470:1f1d:2f6::/64 2001:470:1f1d:304::/64 2001:470:1f1d:31b::/64 @@ -6146,7 +6174,6 @@ 2001:470:1f1d:86f::/64 2001:470:1f1d:875::/64 2001:470:1f1d:879::/64 -2001:470:1f1d:882::/64 2001:470:1f1d:8d2::/64 2001:470:1f1d:922::/64 2001:470:1f1f:4::/64 @@ -6369,7 +6396,7 @@ 2001:470:1f2f:d3::/64 2001:470:1f2f:de::/64 2001:470:1f2f:e2::/64 -2001:470:1f2f:f9::/64 +2001:470:1f2f:f8::/63 2001:470:1f2f:fb::/64 2001:470:1f2f:106::/64 2001:470:1f2f:135::/64 @@ -6422,7 +6449,6 @@ 2001:470:2807::/48 2001:470:2809::/48 2001:470:280c::/48 -2001:470:281e::/48 2001:470:2823::/48 2001:470:2824::/48 2001:470:2827::/48 @@ -6439,7 +6465,6 @@ 2001:470:2858::/48 2001:470:2889::/48 2001:470:2898::/48 -2001:470:289a::/48 2001:470:289e::/48 2001:470:28a5::/48 2001:470:28b4::/48 @@ -6482,6 +6507,7 @@ 2001:470:319b::/48 2001:470:319c::/46 2001:470:3850::/48 +2001:470:38a4::/48 2001:470:38aa::/47 2001:470:38ac::/46 2001:470:38b0::/46 @@ -6524,9 +6550,7 @@ 2001:470:3950::/47 2001:470:3955::/48 2001:470:3956::/48 -2001:470:3999::/48 2001:470:39cc::/48 -2001:470:39cf::/48 2001:470:3a3c::/48 2001:470:401e::/48 2001:470:402f::/48 @@ -6593,7 +6617,6 @@ 2001:470:4802::/48 2001:470:4808::/47 2001:470:480b::/48 -2001:470:480e::/48 2001:470:4818::/48 2001:470:482e::/48 2001:470:4836::/48 @@ -6762,6 +6785,7 @@ 2001:470:808b::/48 2001:470:808e::/48 2001:470:8090::/48 +2001:470:809c::/48 2001:470:80a0::/48 2001:470:80a4::/48 2001:470:80a6::/48 @@ -6847,7 +6871,6 @@ 2001:470:826f::/48 2001:470:8271::/48 2001:470:8272::/47 -2001:470:8277::/48 2001:470:827a::/48 2001:470:827e::/47 2001:470:8284::/48 @@ -6908,6 +6931,7 @@ 2001:470:8acb::/48 2001:470:8adf::/48 2001:470:8aec::/48 +2001:470:8af5::/48 2001:470:8aff::/48 2001:470:8b08::/48 2001:470:8b44::/48 @@ -7000,6 +7024,7 @@ 2001:470:bb28::/48 2001:470:bbd1::/48 2001:470:bc89::/48 +2001:470:c011::/48 2001:470:c029::/48 2001:470:c02a::/48 2001:470:c02d::/48 @@ -7016,7 +7041,6 @@ 2001:470:c14d::/48 2001:470:c173::/48 2001:470:c17a::/48 -2001:470:c187::/48 2001:470:c18a::/48 2001:470:c18c::/48 2001:470:c193::/48 @@ -7097,7 +7121,6 @@ 2001:470:e9a8::/48 2001:470:e9cf::/48 2001:470:e9d3::/48 -2001:470:e9d5::/48 2001:470:e9ee::/48 2001:470:e9f5::/48 2001:470:e9ff::/48 @@ -7106,7 +7129,6 @@ 2001:470:ea26::/48 2001:470:ea6a::/48 2001:470:ea78::/48 -2001:470:eba5::/48 2001:470:ec02::/48 2001:470:ec06::/48 2001:470:ec09::/48 @@ -7123,7 +7145,6 @@ 2001:470:ec82::/47 2001:470:ec89::/48 2001:470:ec9a::/47 -2001:470:ecaa::/48 2001:470:ecb1::/48 2001:470:ecbf::/48 2001:470:ecc6::/48 @@ -7152,7 +7173,6 @@ 2001:470:edb1::/48 2001:470:edb7::/48 2001:470:edc4::/48 -2001:470:edc6::/48 2001:470:edcc::/48 2001:470:eddb::/48 2001:470:eddd::/48 @@ -7167,6 +7187,7 @@ 2001:470:ee20::/48 2001:470:ee27::/48 2001:470:ee2d::/48 +2001:470:ee51::/48 2001:470:ee6b::/48 2001:470:ee7c::/48 2001:470:eea3::/48 @@ -7280,6 +7301,7 @@ 2001:470:f156::/48 2001:470:f158::/48 2001:470:f15d::/48 +2001:470:f15f::/48 2001:470:f162::/48 2001:470:f164::/48 2001:470:f166::/48 @@ -7310,7 +7332,6 @@ 2001:470:f1cf::/48 2001:470:f1d2::/48 2001:470:f1d4::/48 -2001:470:f1d6::/48 2001:470:f1d9::/48 2001:470:f1db::/48 2001:470:f1dc::/46 @@ -7340,9 +7361,12 @@ 2001:470:f22c::/48 2001:470:f22e::/48 2001:470:f237::/48 -2001:470:f239::/48 +2001:470:f23a::/48 +2001:470:f23c::/48 2001:470:f23f::/48 2001:470:f249::/48 +2001:470:f24a::/48 +2001:470:f24f::/48 2001:470:f253::/48 2001:470:f267::/48 2001:470:f26e::/48 @@ -7683,6 +7707,7 @@ 2001:470:fa81::/48 2001:470:fa82::/48 2001:470:fa87::/48 +2001:470:fa89::/48 2001:470:fa8a::/48 2001:470:fa8f::/48 2001:470:fa94::/47 @@ -7713,8 +7738,13 @@ 2001:470:faf2::/47 2001:470:faf7::/48 2001:470:faff::/48 +2001:470:fb01::/48 +2001:470:fb06::/48 +2001:470:fb08::/48 2001:470:fb0c::/48 2001:470:fb0e::/48 +2001:470:fb10::/47 +2001:470:fb12::/48 2001:470:fb15::/48 2001:470:fb18::/48 2001:470:fb1b::/48 @@ -7749,7 +7779,6 @@ 2001:470:fc35::/48 2001:470:fc37::/48 2001:470:fc3c::/48 -2001:470:fc3e::/48 2001:470:fc45::/48 2001:470:fc46::/48 2001:470:fc4e::/48 @@ -7816,7 +7845,6 @@ 2001:470:fd4f::/48 2001:470:fd5d::/48 2001:470:fd5e::/47 -2001:470:fd65::/48 2001:470:fd69::/48 2001:470:fd6e::/48 2001:470:fd72::/48 @@ -7831,7 +7859,6 @@ 2001:470:fd98::/48 2001:470:fd9d::/48 2001:470:fda6::/48 -2001:470:fdab::/48 2001:470:fdac::/48 2001:470:fdb4::/48 2001:470:fdbd::/48 @@ -7856,7 +7883,6 @@ 2001:470:fe4c::/48 2001:470:fe66::/48 2001:470:fe8c::/48 -2001:470:fe95::/48 2001:470:fedc::/48 2001:470:fef3::/48 2001:470:ff0a::/48 @@ -7951,7 +7977,6 @@ 2001:df6:3d00::/48 2001:df6:5d00::/48 2001:df6:6800::/48 -2001:df6:df00::/48 2001:df6:f400::/48 2001:df7:1480::/48 2001:df7:2b80::/48 @@ -8436,6 +8461,7 @@ 2401:4b00::/32 2401:4f80::/32 2401:5180::/32 +2401:5680::/32 2401:58a0::/32 2401:5960::/32 2401:59c0::/32 @@ -8595,6 +8621,7 @@ 2401:d340::/32 2401:d420::/32 2401:d780::/32 +2401:d7e0::/32 2401:da00::/32 2401:de00::/32 2401:e080::/32 @@ -10841,7 +10868,6 @@ 2600:70ff:a778::/48 2600:70ff:a810::/48 2600:70ff:a819::/48 -2600:70ff:a862::/48 2600:70ff:a87a::/48 2600:70ff:a881::/48 2600:70ff:a88b::/48 @@ -10857,6 +10883,7 @@ 2600:70ff:b831::/48 2600:70ff:b839::/48 2600:70ff:b83b::/48 +2600:70ff:b84a::/48 2600:70ff:b84e::/48 2600:70ff:b864::/48 2600:70ff:b89b::/48 @@ -10937,7 +10964,7 @@ 2600:70ff:ea0a::/47 2600:70ff:f141::/48 2600:70ff:f807::/48 -2600:70ff:f80c::/47 +2600:70ff:f80d::/48 2600:70ff:f815::/48 2600:70ff:f84b::/48 2600:70ff:f884::/48 @@ -12482,12 +12509,6 @@ 2a0c:9a40:95bf:7fdc::/63 2a0c:9a40:95bf:7fdf::/64 2a0c:9a40:95bf:7fe0::/59 -2a0c:9e06:62::/48 -2a0c:9e06:75::/48 -2a0c:9e06:76::/47 -2a0c:9e06:79::/48 -2a0c:9e06:133::/48 -2a0c:9e06:153::/48 2a0d:6c2:1000::/40 2a0d:6c2:1600::/40 2a0d:2406:1c2e::/48 @@ -12530,13 +12551,14 @@ 2a0e:aa07:e051::/48 2a0e:aa07:e052::/48 2a0e:aa07:e151::/63 +2a0e:aa07:e15e:5::/64 +2a0e:aa07:e15e:6::/63 2a0e:aa07:e192::/48 2a0e:aa07:f012::/48 2a0e:b107:1a32:1000::/52 2a0e:b107:1a34::/48 2a0e:b107:2440::/44 2a0e:b107:2715::/48 -2a0e:ec01:7000::/38 2a0e:ec05:4600::/39 2a0e:ec05:4800::/41 2a0e:ec05:79c0::/42 diff --git a/shortcut/resources/ir_ipv4.txt b/shortcut/resources/ir_ipv4.txt index 046e62a4c..7017d5326 100644 --- a/shortcut/resources/ir_ipv4.txt +++ b/shortcut/resources/ir_ipv4.txt @@ -324,8 +324,7 @@ 62.3.41.0/24 62.3.42.0/24 62.60.128.0/20 -62.60.144.0/22 -62.60.148.0/22 +62.60.144.0/21 62.60.152.0/23 62.60.154.0/24 62.60.155.0/24 @@ -351,18 +350,7 @@ 62.60.228.0/24 62.60.229.0/24 62.60.230.0/23 -62.60.232.0/30 -62.60.232.4/31 -62.60.232.6/32 -62.60.232.7/32 -62.60.232.8/32 -62.60.232.9/32 -62.60.232.10/31 -62.60.232.12/30 -62.60.232.16/28 -62.60.232.32/27 -62.60.232.64/26 -62.60.232.128/25 +62.60.232.0/24 62.60.233.0/24 62.60.234.0/24 62.60.235.0/24 @@ -370,8 +358,12 @@ 62.60.238.0/23 62.60.240.0/22 62.60.244.0/23 -62.60.246.0/23 -62.60.248.0/21 +62.60.246.0/24 +62.60.247.0/24 +62.60.248.0/24 +62.60.249.0/24 +62.60.250.0/23 +62.60.252.0/22 62.102.128.0/20 62.106.95.0/24 62.133.46.0/24 @@ -483,7 +475,10 @@ 83.147.236.0/22 83.147.240.0/22 83.147.244.0/22 -83.147.248.0/22 +83.147.248.0/24 +83.147.249.0/24 +83.147.250.0/24 +83.147.251.0/24 83.147.252.0/22 83.150.192.0/22 84.47.192.0/18 @@ -508,8 +503,7 @@ 85.133.212.0/23 85.133.214.0/24 85.133.215.0/24 -85.133.216.0/24 -85.133.217.0/24 +85.133.216.0/23 85.133.218.0/24 85.133.219.0/24 85.133.220.0/22 @@ -801,6 +795,7 @@ 91.213.167.0/24 91.213.172.0/24 91.216.4.0/24 +91.216.71.0/24 91.216.171.0/24 91.216.217.0/24 91.217.64.0/23 @@ -1274,10 +1269,6 @@ 185.40.240.0/22 185.41.0.0/22 185.41.220.0/22 -185.42.24.0/24 -185.42.25.0/24 -185.42.26.0/24 -185.42.27.0/24 185.42.212.0/22 185.42.224.0/22 185.44.36.0/22 @@ -2044,6 +2035,7 @@ 194.59.214.0/23 194.60.208.0/22 194.60.228.0/22 +194.61.3.0/24 194.62.17.0/24 194.62.43.0/24 194.110.24.0/24 diff --git a/shortcut/resources/ir_ipv6.txt b/shortcut/resources/ir_ipv6.txt index 49b2fb47c..d83b06c0d 100644 --- a/shortcut/resources/ir_ipv6.txt +++ b/shortcut/resources/ir_ipv6.txt @@ -512,6 +512,7 @@ 2a10:8880::/29 2a10:8b80::/29 2a10:9340::/29 +2a10:9800::/29 2a10:a440::/29 2a10:a780::/29 2a10:ab00::/29 @@ -606,6 +607,7 @@ 2a13:a5c3:d43c::/46 2a13:a5c3:d65c::/46 2a13:bd80::/29 +2a13:bf00::/29 2a13:c640::/29 2a13:c6c0::/29 2a13:c940::/29