diff --git a/Cargo.toml b/Cargo.toml index a94e5514b7bc..00a797d3c264 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ publish = false resolver = "2" members = [ "android/translations-converter", - "ios/MullvadTransport/shadowsocks-proxy", + "ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy", "ios/TunnelObfuscation/tunnel-obfuscator-proxy", "mullvad-daemon", "mullvad-cli", diff --git a/ios/MullvadREST/AddressCache.swift b/ios/MullvadREST/ApiHandlers/AddressCache.swift similarity index 100% rename from ios/MullvadREST/AddressCache.swift rename to ios/MullvadREST/ApiHandlers/AddressCache.swift diff --git a/ios/MullvadREST/HTTP.swift b/ios/MullvadREST/ApiHandlers/HTTP.swift similarity index 100% rename from ios/MullvadREST/HTTP.swift rename to ios/MullvadREST/ApiHandlers/HTTP.swift diff --git a/ios/MullvadREST/RESTAPIProxy.swift b/ios/MullvadREST/ApiHandlers/RESTAPIProxy.swift similarity index 100% rename from ios/MullvadREST/RESTAPIProxy.swift rename to ios/MullvadREST/ApiHandlers/RESTAPIProxy.swift diff --git a/ios/MullvadREST/RESTAccessTokenManager.swift b/ios/MullvadREST/ApiHandlers/RESTAccessTokenManager.swift similarity index 100% rename from ios/MullvadREST/RESTAccessTokenManager.swift rename to ios/MullvadREST/ApiHandlers/RESTAccessTokenManager.swift diff --git a/ios/MullvadREST/RESTAccountsProxy.swift b/ios/MullvadREST/ApiHandlers/RESTAccountsProxy.swift similarity index 100% rename from ios/MullvadREST/RESTAccountsProxy.swift rename to ios/MullvadREST/ApiHandlers/RESTAccountsProxy.swift diff --git a/ios/MullvadREST/RESTAuthenticationProxy.swift b/ios/MullvadREST/ApiHandlers/RESTAuthenticationProxy.swift similarity index 100% rename from ios/MullvadREST/RESTAuthenticationProxy.swift rename to ios/MullvadREST/ApiHandlers/RESTAuthenticationProxy.swift diff --git a/ios/MullvadREST/RESTAuthorization.swift b/ios/MullvadREST/ApiHandlers/RESTAuthorization.swift similarity index 100% rename from ios/MullvadREST/RESTAuthorization.swift rename to ios/MullvadREST/ApiHandlers/RESTAuthorization.swift diff --git a/ios/MullvadREST/RESTCoding.swift b/ios/MullvadREST/ApiHandlers/RESTCoding.swift similarity index 100% rename from ios/MullvadREST/RESTCoding.swift rename to ios/MullvadREST/ApiHandlers/RESTCoding.swift diff --git a/ios/MullvadREST/RESTDefaults.swift b/ios/MullvadREST/ApiHandlers/RESTDefaults.swift similarity index 100% rename from ios/MullvadREST/RESTDefaults.swift rename to ios/MullvadREST/ApiHandlers/RESTDefaults.swift diff --git a/ios/MullvadREST/RESTDevicesProxy.swift b/ios/MullvadREST/ApiHandlers/RESTDevicesProxy.swift similarity index 100% rename from ios/MullvadREST/RESTDevicesProxy.swift rename to ios/MullvadREST/ApiHandlers/RESTDevicesProxy.swift diff --git a/ios/MullvadREST/RESTError.swift b/ios/MullvadREST/ApiHandlers/RESTError.swift similarity index 100% rename from ios/MullvadREST/RESTError.swift rename to ios/MullvadREST/ApiHandlers/RESTError.swift diff --git a/ios/MullvadREST/RESTNetworkOperation.swift b/ios/MullvadREST/ApiHandlers/RESTNetworkOperation.swift similarity index 100% rename from ios/MullvadREST/RESTNetworkOperation.swift rename to ios/MullvadREST/ApiHandlers/RESTNetworkOperation.swift diff --git a/ios/MullvadREST/RESTProxy.swift b/ios/MullvadREST/ApiHandlers/RESTProxy.swift similarity index 100% rename from ios/MullvadREST/RESTProxy.swift rename to ios/MullvadREST/ApiHandlers/RESTProxy.swift diff --git a/ios/MullvadREST/RESTProxyFactory.swift b/ios/MullvadREST/ApiHandlers/RESTProxyFactory.swift similarity index 100% rename from ios/MullvadREST/RESTProxyFactory.swift rename to ios/MullvadREST/ApiHandlers/RESTProxyFactory.swift diff --git a/ios/MullvadREST/RESTRequestExecutor.swift b/ios/MullvadREST/ApiHandlers/RESTRequestExecutor.swift similarity index 100% rename from ios/MullvadREST/RESTRequestExecutor.swift rename to ios/MullvadREST/ApiHandlers/RESTRequestExecutor.swift diff --git a/ios/MullvadREST/RESTRequestFactory.swift b/ios/MullvadREST/ApiHandlers/RESTRequestFactory.swift similarity index 100% rename from ios/MullvadREST/RESTRequestFactory.swift rename to ios/MullvadREST/ApiHandlers/RESTRequestFactory.swift diff --git a/ios/MullvadREST/RESTRequestHandler.swift b/ios/MullvadREST/ApiHandlers/RESTRequestHandler.swift similarity index 100% rename from ios/MullvadREST/RESTRequestHandler.swift rename to ios/MullvadREST/ApiHandlers/RESTRequestHandler.swift diff --git a/ios/MullvadREST/RESTResponseHandler.swift b/ios/MullvadREST/ApiHandlers/RESTResponseHandler.swift similarity index 100% rename from ios/MullvadREST/RESTResponseHandler.swift rename to ios/MullvadREST/ApiHandlers/RESTResponseHandler.swift diff --git a/ios/MullvadREST/RESTTaskIdentifier.swift b/ios/MullvadREST/ApiHandlers/RESTTaskIdentifier.swift similarity index 100% rename from ios/MullvadREST/RESTTaskIdentifier.swift rename to ios/MullvadREST/ApiHandlers/RESTTaskIdentifier.swift diff --git a/ios/MullvadREST/RESTURLSession.swift b/ios/MullvadREST/ApiHandlers/RESTURLSession.swift similarity index 100% rename from ios/MullvadREST/RESTURLSession.swift rename to ios/MullvadREST/ApiHandlers/RESTURLSession.swift diff --git a/ios/MullvadREST/SSLPinningURLSessionDelegate.swift b/ios/MullvadREST/ApiHandlers/SSLPinningURLSessionDelegate.swift similarity index 100% rename from ios/MullvadREST/SSLPinningURLSessionDelegate.swift rename to ios/MullvadREST/ApiHandlers/SSLPinningURLSessionDelegate.swift diff --git a/ios/MullvadREST/ServerRelaysResponse.swift b/ios/MullvadREST/ApiHandlers/ServerRelaysResponse.swift similarity index 100% rename from ios/MullvadREST/ServerRelaysResponse.swift rename to ios/MullvadREST/ApiHandlers/ServerRelaysResponse.swift diff --git a/ios/MullvadREST/Assets/relays.json b/ios/MullvadREST/Assets/relays.json new file mode 100644 index 000000000000..92fef059b509 --- /dev/null +++ b/ios/MullvadREST/Assets/relays.json @@ -0,0 +1 @@ +{"locations":{"au-adl":{"country":"Australia","city":"Adelaide","latitude":-34.92123,"longitude":138.599503},"nl-ams":{"country":"Netherlands","city":"Amsterdam","latitude":52.35,"longitude":4.916667},"us-qas":{"country":"USA","city":"Ashburn, VA","latitude":39.043757,"longitude":-77.487442},"gr-ath":{"country":"Greece","city":"Athens","latitude":37.98381,"longitude":23.727539},"us-atl":{"country":"USA","city":"Atlanta, GA","latitude":33.753746,"longitude":-84.38633},"nz-akl":{"country":"New Zealand","city":"Auckland","latitude":-36.848461,"longitude":174.763336},"rs-beg":{"country":"Serbia","city":"Belgrade","latitude":44.787197,"longitude":20.457273},"de-ber":{"country":"Germany","city":"Berlin","latitude":52.520008,"longitude":13.404954},"co-bog":{"country":"Colombia","city":"Bogota","latitude":4.624335,"longitude":-74.063644},"us-bos":{"country":"USA","city":"Boston, MA","latitude":42.361145,"longitude":-71.057083},"sk-bts":{"country":"Slovakia","city":"Bratislava","latitude":48.148598,"longitude":17.107748},"au-bne":{"country":"Australia","city":"Brisbane","latitude":-27.471,"longitude":153.0234},"be-bru":{"country":"Belgium","city":"Brussels","latitude":50.833333,"longitude":4.333333},"ro-buh":{"country":"Romania","city":"Bucharest","latitude":44.433333,"longitude":26.1},"hu-bud":{"country":"Hungary","city":"Budapest","latitude":47.5,"longitude":19.083333},"ca-yyc":{"country":"Canada","city":"Calgary","latitude":51.037007,"longitude":-114.058315},"us-chi":{"country":"USA","city":"Chicago, IL","latitude":41.881832,"longitude":-87.623177},"dk-cph":{"country":"Denmark","city":"Copenhagen","latitude":55.666667,"longitude":12.583333},"us-dal":{"country":"USA","city":"Dallas, TX","latitude":32.89748,"longitude":-97.040443},"us-den":{"country":"USA","city":"Denver, CO","latitude":39.7392358,"longitude":-104.990251},"us-det":{"country":"USA","city":"Detroit, MI","latitude":42.331389,"longitude":-83.045833},"ie-dub":{"country":"Ireland","city":"Dublin","latitude":53.35014,"longitude":-6.266155},"de-dus":{"country":"Germany","city":"Dusseldorf","latitude":51.233334,"longitude":6.783333},"de-fra":{"country":"Germany","city":"Frankfurt","latitude":50.110924,"longitude":8.682127},"se-got":{"country":"Sweden","city":"Gothenburg","latitude":57.70887,"longitude":11.97456},"fi-hel":{"country":"Finland","city":"Helsinki","latitude":60.192059,"longitude":24.945831},"hk-hkg":{"country":"Hong Kong","city":"Hong Kong","latitude":22.2833333,"longitude":114.15},"us-hou":{"country":"USA","city":"Houston, TX","latitude":29.749907,"longitude":-95.358421},"za-jnb":{"country":"South Africa","city":"Johannesburg","latitude":-26.195246,"longitude":28.034088},"ua-iev":{"country":"Ukraine","city":"Kyiv","latitude":50.4501,"longitude":30.5234},"pt-lis":{"country":"Portugal","city":"Lisbon","latitude":38.736946,"longitude":-9.142685},"gb-lon":{"country":"UK","city":"London","latitude":51.514125,"longitude":-0.093689},"us-lax":{"country":"USA","city":"Los Angeles, CA","latitude":34.052235,"longitude":-118.243683},"es-mad":{"country":"Spain","city":"Madrid","latitude":40.408566,"longitude":-3.69222},"se-mma":{"country":"Sweden","city":"Malmö","latitude":55.607075,"longitude":13.002716},"gb-mnc":{"country":"UK","city":"Manchester","latitude":53.5,"longitude":-2.216667},"fr-mrs":{"country":"France","city":"Marseille","latitude":43.29648,"longitude":5.38107},"au-mel":{"country":"Australia","city":"Melbourne","latitude":-37.815018,"longitude":144.946014},"us-mia":{"country":"USA","city":"Miami, FL","latitude":25.761681,"longitude":-80.191788},"it-mil":{"country":"Italy","city":"Milan","latitude":45.466667,"longitude":9.2},"ca-mtr":{"country":"Canada","city":"Montreal","latitude":45.5053,"longitude":-73.5525},"us-nyc":{"country":"USA","city":"New York, NY","latitude":40.73061,"longitude":-73.935242},"jp-osa":{"country":"Japan","city":"Osaka","latitude":34.672314,"longitude":135.484802},"no-osl":{"country":"Norway","city":"Oslo","latitude":59.916667,"longitude":10.75},"fr-par":{"country":"France","city":"Paris","latitude":48.866667,"longitude":2.333333},"au-per":{"country":"Australia","city":"Perth","latitude":-31.953512,"longitude":115.857048},"us-phx":{"country":"USA","city":"Phoenix, AZ","latitude":33.448376,"longitude":-112.074036},"cz-prg":{"country":"Czech Republic","city":"Prague","latitude":50.083333,"longitude":14.466667},"mx-qro":{"country":"Mexico","city":"Queretaro","latitude":20.5927744,"longitude":-100.3902245},"us-rag":{"country":"USA","city":"Raleigh, NC","latitude":35.787743,"longitude":-78.644257},"lv-rix":{"country":"Latvia","city":"Riga","latitude":56.946285,"longitude":24.105078},"us-slc":{"country":"USA","city":"Salt Lake City, UT","latitude":40.758701,"longitude":-111.876183},"us-sjc":{"country":"USA","city":"San Jose, CA","latitude":37.3382082,"longitude":-121.8863286},"br-sao":{"country":"Brazil","city":"Sao Paulo","latitude":-23.533773,"longitude":-46.62529},"us-sea":{"country":"USA","city":"Seattle, WA","latitude":47.608013,"longitude":-122.335167},"us-uyk":{"country":"USA","city":"Secaucus, NJ","latitude":40.789543,"longitude":-74.0565},"sg-sin":{"country":"Singapore","city":"Singapore","latitude":1.2930556,"longitude":103.8558333},"bg-sof":{"country":"Bulgaria","city":"Sofia","latitude":42.6833333,"longitude":23.3166667},"no-svg":{"country":"Norway","city":"Stavanger","latitude":58.964432,"longitude":5.72625},"se-sto":{"country":"Sweden","city":"Stockholm","latitude":59.3289,"longitude":18.0649},"au-syd":{"country":"Australia","city":"Sydney","latitude":-33.861481,"longitude":151.205475},"ee-tll":{"country":"Estonia","city":"Tallinn","latitude":59.436961,"longitude":24.753575},"il-tlv":{"country":"Israel","city":"Tel Aviv","latitude":32.0852999,"longitude":34.7817676},"al-tia":{"country":"Albania","city":"Tirana","latitude":41.327953,"longitude":19.819025},"jp-tyo":{"country":"Japan","city":"Tokyo","latitude":35.685,"longitude":139.751389},"ca-tor":{"country":"Canada","city":"Toronto","latitude":43.666667,"longitude":-79.416667},"ca-van":{"country":"Canada","city":"Vancouver","latitude":49.25,"longitude":-123.133333},"at-vie":{"country":"Austria","city":"Vienna","latitude":48.210033,"longitude":16.363449},"pl-waw":{"country":"Poland","city":"Warsaw","latitude":52.25,"longitude":21.0},"hr-zag":{"country":"Croatia","city":"Zagreb","latitude":45.821,"longitude":15.973},"ch-zrh":{"country":"Switzerland","city":"Zurich","latitude":47.366667,"longitude":8.55}},"openvpn":{"relays":[{"hostname":"al-tia-ovpn-001","location":"al-tia","active":true,"owned":false,"provider":"iRegister","stboot":true,"ipv4_addr_in":"31.171.154.50","include_in_country":true,"weight":100},{"hostname":"at-vie-ovpn-001","location":"at-vie","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.116.194","include_in_country":true,"weight":100},{"hostname":"at-vie-ovpn-002","location":"at-vie","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.116.226","include_in_country":true,"weight":100},{"hostname":"au-adl-ovpn-301","location":"au-adl","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.214.20.146","include_in_country":true,"weight":100},{"hostname":"au-adl-ovpn-302","location":"au-adl","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.214.20.162","include_in_country":true,"weight":100},{"hostname":"au-bne-ovpn-301","location":"au-bne","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.216.220.50","include_in_country":true,"weight":100},{"hostname":"au-bne-ovpn-302","location":"au-bne","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.216.220.66","include_in_country":true,"weight":100},{"hostname":"au-mel-ovpn-301","location":"au-mel","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.108.229.82","include_in_country":true,"weight":100},{"hostname":"au-mel-ovpn-302","location":"au-mel","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.108.229.98","include_in_country":true,"weight":100},{"hostname":"au-per-ovpn-301","location":"au-per","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.108.231.82","include_in_country":true,"weight":100},{"hostname":"au-per-ovpn-302","location":"au-per","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.108.231.98","include_in_country":true,"weight":100},{"hostname":"au-syd-ovpn-001","location":"au-syd","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.200.130","include_in_country":true,"weight":100},{"hostname":"au-syd-ovpn-002","location":"au-syd","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.200.66","include_in_country":true,"weight":100},{"hostname":"be-bru-ovpn-101","location":"be-bru","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"82.102.19.66","include_in_country":true,"weight":100},{"hostname":"be-bru-ovpn-102","location":"be-bru","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"91.207.57.130","include_in_country":true,"weight":100},{"hostname":"bg-sof-ovpn-001","location":"bg-sof","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.188.66","include_in_country":true,"weight":100},{"hostname":"bg-sof-ovpn-002","location":"bg-sof","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.188.2","include_in_country":true,"weight":100},{"hostname":"br-sao-ovpn-001","location":"br-sao","active":true,"owned":false,"provider":"Qnax","stboot":true,"ipv4_addr_in":"149.78.184.210","include_in_country":true,"weight":100},{"hostname":"ca-mtr-ovpn-001","location":"ca-mtr","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"37.120.237.66","include_in_country":true,"weight":100},{"hostname":"ca-mtr-ovpn-002","location":"ca-mtr","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"45.133.182.194","include_in_country":true,"weight":100},{"hostname":"ca-tor-ovpn-001","location":"ca-tor","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"178.249.214.193","include_in_country":true,"weight":100},{"hostname":"ca-tor-ovpn-002","location":"ca-tor","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"178.249.214.206","include_in_country":true,"weight":100},{"hostname":"ca-tor-ovpn-101","location":"ca-tor","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.132.34","include_in_country":true,"weight":100},{"hostname":"ca-tor-ovpn-102","location":"ca-tor","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.132.66","include_in_country":true,"weight":100},{"hostname":"ca-van-ovpn-201","location":"ca-van","active":true,"owned":false,"provider":"techfutures","stboot":true,"ipv4_addr_in":"104.193.135.132","include_in_country":false,"weight":100},{"hostname":"ca-van-ovpn-202","location":"ca-van","active":true,"owned":false,"provider":"techfutures","stboot":true,"ipv4_addr_in":"104.193.135.164","include_in_country":false,"weight":100},{"hostname":"ch-zrh-ovpn-001","location":"ch-zrh","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.127.81","include_in_country":true,"weight":1},{"hostname":"ch-zrh-ovpn-002","location":"ch-zrh","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.127.82","include_in_country":true,"weight":1},{"hostname":"ch-zrh-ovpn-003","location":"ch-zrh","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.127.83","include_in_country":true,"weight":1},{"hostname":"ch-zrh-ovpn-004","location":"ch-zrh","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.127.84","include_in_country":true,"weight":1},{"hostname":"ch-zrh-ovpn-201","location":"ch-zrh","active":true,"owned":false,"provider":"PrivateLayer","stboot":true,"ipv4_addr_in":"46.19.140.194","include_in_country":true,"weight":100},{"hostname":"ch-zrh-ovpn-202","location":"ch-zrh","active":true,"owned":false,"provider":"PrivateLayer","stboot":true,"ipv4_addr_in":"81.17.16.66","include_in_country":true,"weight":100},{"hostname":"ch-zrh-ovpn-501","location":"ch-zrh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.134.130","include_in_country":true,"weight":100},{"hostname":"ch-zrh-ovpn-502","location":"ch-zrh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.134.162","include_in_country":true,"weight":100},{"hostname":"cz-prg-ovpn-101","location":"cz-prg","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.129.162","include_in_country":true,"weight":100},{"hostname":"cz-prg-ovpn-102","location":"cz-prg","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.129.194","include_in_country":true,"weight":100},{"hostname":"de-ber-ovpn-001","location":"de-ber","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.248.72","include_in_country":true,"weight":100},{"hostname":"de-ber-ovpn-002","location":"de-ber","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.248.73","include_in_country":true,"weight":100},{"hostname":"de-ber-ovpn-003","location":"de-ber","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.248.74","include_in_country":true,"weight":100},{"hostname":"de-ber-ovpn-004","location":"de-ber","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.248.75","include_in_country":true,"weight":100},{"hostname":"de-fra-ovpn-001","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.155.66","include_in_country":true,"weight":100},{"hostname":"de-fra-ovpn-002","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.155.67","include_in_country":true,"weight":100},{"hostname":"de-fra-ovpn-003","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.155.68","include_in_country":true,"weight":100},{"hostname":"de-fra-ovpn-004","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.155.69","include_in_country":true,"weight":100},{"hostname":"de-fra-ovpn-005","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.155.70","include_in_country":true,"weight":100},{"hostname":"de-fra-ovpn-006","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.155.71","include_in_country":true,"weight":100},{"hostname":"de-fra-ovpn-007","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.155.72","include_in_country":true,"weight":100},{"hostname":"de-fra-ovpn-101","location":"de-fra","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.117.66","include_in_country":true,"weight":100},{"hostname":"de-fra-ovpn-102","location":"de-fra","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.117.98","include_in_country":true,"weight":100},{"hostname":"dk-cph-ovpn-001","location":"dk-cph","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.254.71","include_in_country":true,"weight":100},{"hostname":"dk-cph-ovpn-002","location":"dk-cph","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"45.129.56.81","include_in_country":true,"weight":100},{"hostname":"dk-cph-ovpn-401","location":"dk-cph","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.197.66","include_in_country":true,"weight":100},{"hostname":"dk-cph-ovpn-402","location":"dk-cph","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.197.2","include_in_country":true,"weight":100},{"hostname":"es-mad-ovpn-201","location":"es-mad","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.128.162","include_in_country":true,"weight":100},{"hostname":"es-mad-ovpn-202","location":"es-mad","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.74.98","include_in_country":true,"weight":100},{"hostname":"fi-hel-ovpn-001","location":"fi-hel","active":true,"owned":true,"provider":"Creanova","stboot":true,"ipv4_addr_in":"185.204.1.171","include_in_country":true,"weight":100},{"hostname":"fi-hel-ovpn-002","location":"fi-hel","active":true,"owned":true,"provider":"Creanova","stboot":true,"ipv4_addr_in":"185.204.1.172","include_in_country":true,"weight":100},{"hostname":"fi-hel-ovpn-003","location":"fi-hel","active":true,"owned":true,"provider":"Creanova","stboot":true,"ipv4_addr_in":"185.204.1.173","include_in_country":true,"weight":100},{"hostname":"fi-hel-ovpn-004","location":"fi-hel","active":true,"owned":true,"provider":"Creanova","stboot":true,"ipv4_addr_in":"185.204.1.174","include_in_country":true,"weight":100},{"hostname":"fi-hel-ovpn-005","location":"fi-hel","active":true,"owned":true,"provider":"Creanova","stboot":true,"ipv4_addr_in":"185.204.1.175","include_in_country":true,"weight":100},{"hostname":"fi-hel-ovpn-006","location":"fi-hel","active":true,"owned":true,"provider":"Creanova","stboot":true,"ipv4_addr_in":"185.204.1.176","include_in_country":true,"weight":100},{"hostname":"fi-hel-ovpn-007","location":"fi-hel","active":true,"owned":true,"provider":"Creanova","stboot":true,"ipv4_addr_in":"185.212.149.201","include_in_country":true,"weight":100},{"hostname":"fi-hel-ovpn-101","location":"fi-hel","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"193.138.7.217","include_in_country":true,"weight":101},{"hostname":"fi-hel-ovpn-102","location":"fi-hel","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"193.138.7.237","include_in_country":true,"weight":100},{"hostname":"fr-par-ovpn-001","location":"fr-par","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.126.81","include_in_country":true,"weight":100},{"hostname":"fr-par-ovpn-002","location":"fr-par","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.126.82","include_in_country":true,"weight":100},{"hostname":"fr-par-ovpn-003","location":"fr-par","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.126.83","include_in_country":true,"weight":100},{"hostname":"fr-par-ovpn-004","location":"fr-par","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.126.84","include_in_country":false,"weight":100},{"hostname":"fr-par-ovpn-101","location":"fr-par","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.184.130","include_in_country":true,"weight":100},{"hostname":"fr-par-ovpn-102","location":"fr-par","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.184.194","include_in_country":true,"weight":100},{"hostname":"gb-lon-ovpn-001","location":"gb-lon","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.252.131","include_in_country":true,"weight":100},{"hostname":"gb-lon-ovpn-002","location":"gb-lon","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.252.132","include_in_country":true,"weight":100},{"hostname":"gb-lon-ovpn-003","location":"gb-lon","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.252.133","include_in_country":true,"weight":100},{"hostname":"gb-lon-ovpn-005","location":"gb-lon","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.195.232.85","include_in_country":true,"weight":100},{"hostname":"gb-lon-ovpn-006","location":"gb-lon","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.195.232.86","include_in_country":true,"weight":100},{"hostname":"gb-lon-ovpn-008","location":"gb-lon","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.252.138","include_in_country":true,"weight":100},{"hostname":"gb-lon-ovpn-301","location":"gb-lon","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.119.98","include_in_country":true,"weight":10},{"hostname":"gb-lon-ovpn-302","location":"gb-lon","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.119.130","include_in_country":true,"weight":10},{"hostname":"gb-lon-ovpn-303","location":"gb-lon","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.119.162","include_in_country":true,"weight":10},{"hostname":"gb-mnc-ovpn-001","location":"gb-mnc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.132.2","include_in_country":true,"weight":100},{"hostname":"gb-mnc-ovpn-002","location":"gb-mnc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.132.34","include_in_country":true,"weight":100},{"hostname":"gb-mnc-ovpn-003","location":"gb-mnc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.132.66","include_in_country":true,"weight":100},{"hostname":"gb-mnc-ovpn-004","location":"gb-mnc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.132.98","include_in_country":true,"weight":100},{"hostname":"gr-ath-ovpn-101","location":"gr-ath","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.102.246.28","include_in_country":true,"weight":100},{"hostname":"gr-ath-ovpn-102","location":"gr-ath","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.102.246.41","include_in_country":true,"weight":100},{"hostname":"hk-hkg-ovpn-201","location":"hk-hkg","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"103.125.233.33","include_in_country":true,"weight":100},{"hostname":"hk-hkg-ovpn-202","location":"hk-hkg","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"103.125.233.48","include_in_country":true,"weight":100},{"hostname":"hk-hkg-ovpn-301","location":"hk-hkg","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.224.130","include_in_country":true,"weight":100},{"hostname":"hk-hkg-ovpn-302","location":"hk-hkg","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.224.196","include_in_country":true,"weight":100},{"hostname":"hu-bud-ovpn-101","location":"hu-bud","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.196.66","include_in_country":true,"weight":100},{"hostname":"hu-bud-ovpn-102","location":"hu-bud","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.196.2","include_in_country":true,"weight":100},{"hostname":"ie-dub-ovpn-101","location":"ie-dub","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.189.130","include_in_country":true,"weight":100},{"hostname":"ie-dub-ovpn-102","location":"ie-dub","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.189.194","include_in_country":true,"weight":100},{"hostname":"it-mil-ovpn-201","location":"it-mil","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.225.130","include_in_country":true,"weight":100},{"hostname":"it-mil-ovpn-202","location":"it-mil","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.225.194","include_in_country":true,"weight":100},{"hostname":"jp-tyo-ovpn-201","location":"jp-tyo","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.201.130","include_in_country":true,"weight":100},{"hostname":"jp-tyo-ovpn-202","location":"jp-tyo","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.201.194","include_in_country":true,"weight":100},{"hostname":"lv-rix-ovpn-001","location":"lv-rix","active":true,"owned":false,"provider":"Makonix","stboot":true,"ipv4_addr_in":"31.170.22.2","include_in_country":true,"weight":100},{"hostname":"nl-ams-ovpn-001","location":"nl-ams","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.134.71","include_in_country":true,"weight":100},{"hostname":"nl-ams-ovpn-002","location":"nl-ams","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.134.72","include_in_country":true,"weight":100},{"hostname":"nl-ams-ovpn-003","location":"nl-ams","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.134.73","include_in_country":true,"weight":100},{"hostname":"nl-ams-ovpn-004","location":"nl-ams","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.134.74","include_in_country":true,"weight":100},{"hostname":"nl-ams-ovpn-005","location":"nl-ams","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.134.75","include_in_country":true,"weight":100},{"hostname":"nl-ams-ovpn-006","location":"nl-ams","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.134.76","include_in_country":true,"weight":100},{"hostname":"no-osl-ovpn-001","location":"no-osl","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"91.90.44.11","include_in_country":false,"weight":100},{"hostname":"no-osl-ovpn-002","location":"no-osl","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"91.90.44.12","include_in_country":false,"weight":100},{"hostname":"no-osl-ovpn-003","location":"no-osl","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"91.90.44.13","include_in_country":false,"weight":100},{"hostname":"no-osl-ovpn-004","location":"no-osl","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"91.90.44.14","include_in_country":false,"weight":100},{"hostname":"no-osl-ovpn-005","location":"no-osl","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"91.90.44.15","include_in_country":false,"weight":100},{"hostname":"no-osl-ovpn-008","location":"no-osl","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"91.90.44.18","include_in_country":true,"weight":100},{"hostname":"no-svg-ovpn-001","location":"no-svg","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"194.127.199.114","include_in_country":true,"weight":100},{"hostname":"no-svg-ovpn-002","location":"no-svg","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"194.127.199.145","include_in_country":true,"weight":100},{"hostname":"nz-akl-ovpn-301","location":"nz-akl","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.75.11.82","include_in_country":true,"weight":100},{"hostname":"nz-akl-ovpn-302","location":"nz-akl","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.75.11.98","include_in_country":true,"weight":100},{"hostname":"pl-waw-ovpn-201","location":"pl-waw","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.144.66","include_in_country":true,"weight":100},{"hostname":"pl-waw-ovpn-202","location":"pl-waw","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.144.98","include_in_country":true,"weight":100},{"hostname":"ro-buh-ovpn-001","location":"ro-buh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.124.162","include_in_country":true,"weight":100},{"hostname":"ro-buh-ovpn-002","location":"ro-buh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"37.120.246.130","include_in_country":true,"weight":100},{"hostname":"rs-beg-ovpn-101","location":"rs-beg","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.193.194","include_in_country":true,"weight":100},{"hostname":"rs-beg-ovpn-102","location":"rs-beg","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.193.130","include_in_country":true,"weight":100},{"hostname":"se-got-ovpn-001","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.131","include_in_country":false,"weight":100},{"hostname":"se-got-ovpn-002","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.132","include_in_country":false,"weight":100},{"hostname":"se-got-ovpn-003","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.133","include_in_country":false,"weight":100},{"hostname":"se-got-ovpn-004","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.134","include_in_country":false,"weight":100},{"hostname":"se-got-ovpn-005","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.135","include_in_country":false,"weight":100},{"hostname":"se-got-ovpn-006","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.136","include_in_country":false,"weight":100},{"hostname":"se-got-ovpn-007","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.137","include_in_country":false,"weight":100},{"hostname":"se-got-ovpn-008","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.138","include_in_country":false,"weight":100},{"hostname":"se-got-ovpn-009","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.139","include_in_country":false,"weight":100},{"hostname":"se-got-ovpn-010","location":"se-got","active":false,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.140","include_in_country":false,"weight":100},{"hostname":"se-got-ovpn-011","location":"se-got","active":false,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.141","include_in_country":false,"weight":100},{"hostname":"se-mma-ovpn-001","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.138.218.131","include_in_country":true,"weight":100},{"hostname":"se-mma-ovpn-002","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.138.218.132","include_in_country":true,"weight":100},{"hostname":"se-mma-ovpn-013","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.255.83","include_in_country":true,"weight":100},{"hostname":"se-mma-ovpn-014","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.255.84","include_in_country":true,"weight":100},{"hostname":"se-mma-ovpn-015","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.255.85","include_in_country":true,"weight":100},{"hostname":"se-mma-ovpn-016","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.255.86","include_in_country":true,"weight":100},{"hostname":"se-mma-ovpn-017","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.255.87","include_in_country":true,"weight":100},{"hostname":"se-mma-ovpn-018","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.255.88","include_in_country":true,"weight":100},{"hostname":"se-mma-ovpn-019","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.255.89","include_in_country":true,"weight":100},{"hostname":"se-mma-ovpn-020","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.255.90","include_in_country":true,"weight":100},{"hostname":"se-mma-ovpn-021","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.255.91","include_in_country":true,"weight":100},{"hostname":"se-mma-ovpn-022","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.255.92","include_in_country":true,"weight":100},{"hostname":"se-mma-ovpn-023","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.255.93","include_in_country":true,"weight":100},{"hostname":"se-mma-ovpn-102","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"45.83.220.92","include_in_country":true,"weight":100},{"hostname":"se-sto-ovpn-001","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.135.80","include_in_country":true,"weight":100},{"hostname":"se-sto-ovpn-002","location":"se-sto","active":false,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.135.81","include_in_country":true,"weight":100},{"hostname":"se-sto-ovpn-003","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.135.82","include_in_country":true,"weight":100},{"hostname":"se-sto-ovpn-004","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.135.83","include_in_country":true,"weight":100},{"hostname":"sg-sin-ovpn-101","location":"sg-sin","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.199.66","include_in_country":true,"weight":100},{"hostname":"sg-sin-ovpn-102","location":"sg-sin","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.199.2","include_in_country":true,"weight":100},{"hostname":"us-atl-ovpn-001","location":"us-atl","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"45.134.140.156","include_in_country":true,"weight":100},{"hostname":"us-atl-ovpn-002","location":"us-atl","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"45.134.140.169","include_in_country":true,"weight":100},{"hostname":"us-atl-ovpn-101","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.226","include_in_country":false,"weight":1},{"hostname":"us-atl-ovpn-102","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.227","include_in_country":false,"weight":1},{"hostname":"us-atl-ovpn-103","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.228","include_in_country":false,"weight":1},{"hostname":"us-atl-ovpn-104","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.229","include_in_country":false,"weight":1},{"hostname":"us-atl-ovpn-105","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.230","include_in_country":false,"weight":1},{"hostname":"us-chi-ovpn-001","location":"us-chi","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"68.235.43.34","include_in_country":false,"weight":100},{"hostname":"us-chi-ovpn-002","location":"us-chi","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"68.235.43.66","include_in_country":false,"weight":100},{"hostname":"us-chi-ovpn-003","location":"us-chi","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"68.235.43.98","include_in_country":false,"weight":100},{"hostname":"us-dal-ovpn-001","location":"us-dal","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.211.194","include_in_country":true,"weight":100},{"hostname":"us-dal-ovpn-002","location":"us-dal","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.177.66","include_in_country":true,"weight":100},{"hostname":"us-dal-ovpn-101","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.3","include_in_country":false,"weight":1},{"hostname":"us-dal-ovpn-102","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.4","include_in_country":false,"weight":1},{"hostname":"us-dal-ovpn-103","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.5","include_in_country":false,"weight":1},{"hostname":"us-dal-ovpn-104","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.6","include_in_country":false,"weight":1},{"hostname":"us-dal-ovpn-105","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.7","include_in_country":false,"weight":1},{"hostname":"us-den-ovpn-001","location":"us-den","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.128.98","include_in_country":true,"weight":100},{"hostname":"us-den-ovpn-002","location":"us-den","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.128.226","include_in_country":true,"weight":100},{"hostname":"us-lax-ovpn-101","location":"us-lax","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.129.162","include_in_country":true,"weight":100},{"hostname":"us-lax-ovpn-102","location":"us-lax","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.129.130","include_in_country":true,"weight":100},{"hostname":"us-lax-ovpn-201","location":"us-lax","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.203.41","include_in_country":true,"weight":100},{"hostname":"us-lax-ovpn-202","location":"us-lax","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.203.54","include_in_country":true,"weight":100},{"hostname":"us-lax-ovpn-401","location":"us-lax","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.172.66","include_in_country":true,"weight":100},{"hostname":"us-lax-ovpn-402","location":"us-lax","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.172.130","include_in_country":true,"weight":100},{"hostname":"us-lax-ovpn-403","location":"us-lax","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.172.194","include_in_country":true,"weight":100},{"hostname":"us-lax-ovpn-404","location":"us-lax","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.174.2","include_in_country":true,"weight":100},{"hostname":"us-mia-ovpn-101","location":"us-mia","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.187.194","include_in_country":true,"weight":100},{"hostname":"us-mia-ovpn-102","location":"us-mia","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.183.66","include_in_country":true,"weight":100},{"hostname":"us-nyc-ovpn-401","location":"us-nyc","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.136.130","include_in_country":true,"weight":25},{"hostname":"us-nyc-ovpn-402","location":"us-nyc","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.136.162","include_in_country":true,"weight":25},{"hostname":"us-nyc-ovpn-501","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.168.2","include_in_country":true,"weight":100},{"hostname":"us-nyc-ovpn-502","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.166.2","include_in_country":true,"weight":100},{"hostname":"us-nyc-ovpn-503","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.166.66","include_in_country":true,"weight":100},{"hostname":"us-nyc-ovpn-504","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.165.66","include_in_country":true,"weight":100},{"hostname":"us-nyc-ovpn-601","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.171.194","include_in_country":true,"weight":100},{"hostname":"us-nyc-ovpn-602","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.185.130","include_in_country":true,"weight":100},{"hostname":"us-nyc-ovpn-603","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.185.66","include_in_country":true,"weight":100},{"hostname":"us-nyc-ovpn-604","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.168.194","include_in_country":true,"weight":100},{"hostname":"us-phx-ovpn-101","location":"us-phx","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.133.34","include_in_country":true,"weight":5},{"hostname":"us-phx-ovpn-102","location":"us-phx","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.133.66","include_in_country":true,"weight":5},{"hostname":"us-qas-ovpn-001","location":"us-qas","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.135.162","include_in_country":true,"weight":100},{"hostname":"us-qas-ovpn-002","location":"us-qas","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.135.194","include_in_country":true,"weight":100},{"hostname":"us-qas-ovpn-101","location":"us-qas","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"185.156.46.169","include_in_country":true,"weight":100},{"hostname":"us-qas-ovpn-102","location":"us-qas","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"185.156.46.182","include_in_country":true,"weight":100},{"hostname":"us-rag-ovpn-101","location":"us-rag","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.130.34","include_in_country":true,"weight":4},{"hostname":"us-rag-ovpn-102","location":"us-rag","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.130.50","include_in_country":true,"weight":4},{"hostname":"us-rag-ovpn-103","location":"us-rag","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.130.66","include_in_country":true,"weight":5},{"hostname":"us-sea-ovpn-101","location":"us-sea","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.131.34","include_in_country":true,"weight":4},{"hostname":"us-sea-ovpn-102","location":"us-sea","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.131.66","include_in_country":true,"weight":4},{"hostname":"us-sjc-ovpn-001","location":"us-sjc","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.134.34","include_in_country":false,"weight":50},{"hostname":"us-sjc-ovpn-002","location":"us-sjc","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.134.66","include_in_country":false,"weight":50},{"hostname":"us-slc-ovpn-101","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.132","include_in_country":false,"weight":1},{"hostname":"us-slc-ovpn-102","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.133","include_in_country":false,"weight":1},{"hostname":"us-slc-ovpn-103","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.134","include_in_country":false,"weight":1},{"hostname":"us-slc-ovpn-104","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.135","include_in_country":false,"weight":1},{"hostname":"us-slc-ovpn-105","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.136","include_in_country":false,"weight":1},{"hostname":"us-slc-ovpn-106","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.137","include_in_country":false,"weight":1}],"ports":[{"port":1194,"protocol":"udp"},{"port":1195,"protocol":"udp"},{"port":1196,"protocol":"udp"},{"port":1197,"protocol":"udp"},{"port":1300,"protocol":"udp"},{"port":1301,"protocol":"udp"},{"port":1302,"protocol":"udp"},{"port":443,"protocol":"tcp"},{"port":80,"protocol":"tcp"}]},"wireguard":{"relays":[{"hostname":"al-tia-wg-001","location":"al-tia","active":true,"owned":false,"provider":"iRegister","stboot":true,"ipv4_addr_in":"31.171.153.66","include_in_country":true,"weight":100,"public_key":"bPfJDdgBXlY4w3ACs68zOMMhLUbbzktCKnLOFHqbxl4=","ipv6_addr_in":"2a04:27c0:0:3::f001","same_ip":true},{"hostname":"at-vie-wg-001","location":"at-vie","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.116.98","include_in_country":true,"weight":100,"public_key":"TNrdH73p6h2EfeXxUiLOCOWHcjmjoslLxZptZpIPQXU=","ipv6_addr_in":"2001:ac8:29:84::a01f","same_ip":true},{"hostname":"at-vie-wg-002","location":"at-vie","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.116.130","include_in_country":true,"weight":100,"public_key":"ehXBc726YX1N6Dm7fDAVMG5cIaYAFqCA4Lbpl4VWcWE=","ipv6_addr_in":"2001:ac8:29:85::a02f","same_ip":true},{"hostname":"at-vie-wg-003","location":"at-vie","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.116.162","include_in_country":true,"weight":100,"public_key":"ddllelPu2ndjSX4lHhd/kdCStaSJOQixs9z551qN6B8=","ipv6_addr_in":"2001:ac8:29:86::a03f","same_ip":true},{"hostname":"au-adl-wg-301","location":"au-adl","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.214.20.50","include_in_country":true,"weight":100,"public_key":"rm2hpBiN91c7reV+cYKlw7QNkYtME/+js7IMyYBB2Aw=","ipv6_addr_in":"2404:f780:0:deb::c1f","same_ip":true},{"hostname":"au-adl-wg-302","location":"au-adl","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.214.20.130","include_in_country":true,"weight":100,"public_key":"e4jouH8n4e8oyi/Z7d6lJLd6975hlPZmnynJeoU+nWM=","ipv6_addr_in":"2404:f780:0:dec::c2f","same_ip":true},{"hostname":"au-bne-wg-301","location":"au-bne","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.216.220.18","include_in_country":true,"weight":100,"public_key":"1H/gj8SVNebAIEGlvMeUVC5Rnf274dfVKbyE+v5G8HA=","ipv6_addr_in":"2404:f780:4:deb::f001","same_ip":true},{"hostname":"au-bne-wg-302","location":"au-bne","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.216.220.34","include_in_country":true,"weight":100,"public_key":"z+JG0QA4uNd/wRTpjCqn9rDpQsHKhf493omqQ5rqYAc=","ipv6_addr_in":"2404:f780:4:dec::a02f","same_ip":true},{"hostname":"au-mel-wg-301","location":"au-mel","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.108.229.50","include_in_country":true,"weight":100,"public_key":"jUMZWFOgoFGhZjBAavE6jW8VgnnNpL4KUiYFYjc1fl8=","ipv6_addr_in":"2406:d501:f:deb::a01f","same_ip":true},{"hostname":"au-mel-wg-302","location":"au-mel","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.108.229.66","include_in_country":true,"weight":100,"public_key":"npTb63jWEaJToBfn0B1iVNbnLXEwwlus5SsolsvUhgU=","ipv6_addr_in":"2406:d501:f:dec::a02f","same_ip":true},{"hostname":"au-per-wg-301","location":"au-per","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.108.231.50","include_in_country":true,"weight":100,"public_key":"hQXsNk/9R2We0pzP1S9J3oNErEu2CyENlwTdmDUYFhg=","ipv6_addr_in":"2404:f780:8:deb::a01f","same_ip":true},{"hostname":"au-per-wg-302","location":"au-per","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.108.231.66","include_in_country":true,"weight":100,"public_key":"t3Ly8bBdF2gMHzT3d529bVLDw8Jd2/FFG9GXoBEx01g=","ipv6_addr_in":"2404:f780:8:dec::f001","same_ip":true},{"hostname":"au-syd-wg-001","location":"au-syd","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.200.2","include_in_country":true,"weight":100,"public_key":"4JpfHBvthTFOhCK0f5HAbzLXAVcB97uAkuLx7E8kqW0=","ipv6_addr_in":"2001:ac8:84:5::f001","same_ip":true},{"hostname":"au-syd-wg-002","location":"au-syd","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.141.194","include_in_country":true,"weight":100,"public_key":"lUeDAOy+iAhZDuz5+6zh0Co8wZcs3ahdu2jfqQoDW3E=","ipv6_addr_in":"2001:ac8:84:6::2f","same_ip":true},{"hostname":"au-syd-wg-003","location":"au-syd","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.200.194","include_in_country":true,"weight":100,"public_key":"LXuRwa9JRTt2/UtldklKGlj/IVLORITqgET4II4DRkU=","ipv6_addr_in":"2001:ac8:84:4::3f","same_ip":true},{"hostname":"be-bru-wg-101","location":"be-bru","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"91.90.123.2","include_in_country":true,"weight":100,"public_key":"GE2WP6hmwVggSvGVWLgq2L10T3WM2VspnUptK5F4B0U=","ipv6_addr_in":"2001:ac8:27:88::a01f","same_ip":true},{"hostname":"be-bru-wg-102","location":"be-bru","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"194.110.115.34","include_in_country":true,"weight":100,"public_key":"IY+FKw487MEWqMGNyyrT4PnTrJxce8oiGNHT0zifam8=","ipv6_addr_in":"2001:ac8:27:89::a02f","same_ip":true},{"hostname":"be-bru-wg-103","location":"be-bru","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"194.110.115.2","include_in_country":true,"weight":100,"public_key":"b5A1ela+BVI+AbNXz7SWekZHvdWWpt3rqUKTJj0SqCU=","ipv6_addr_in":"2001:ac8:27:92::a03f","same_ip":true},{"hostname":"bg-sof-wg-001","location":"bg-sof","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.188.130","include_in_country":true,"weight":100,"public_key":"J8KysHmHZWqtrVKKOppneDXSks/PDsB1XTlRHpwiABA=","ipv6_addr_in":"2001:ac8:30:56::f001","same_ip":true},{"hostname":"bg-sof-wg-002","location":"bg-sof","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.188.194","include_in_country":true,"weight":100,"public_key":"dg+Fw7GnKvDPBxFpnj1KPoNIu1GakuVoDJjKRni+pRU=","ipv6_addr_in":"2001:ac8:30:57::f001","same_ip":true},{"hostname":"br-sao-wg-001","location":"br-sao","active":true,"owned":false,"provider":"Qnax","stboot":true,"ipv4_addr_in":"149.78.184.194","include_in_country":true,"weight":30,"public_key":"xUDPh13sY127m+7d05SOQAzzNCyufTjaGwCXkWsIjkw=","ipv6_addr_in":"2804:5364:7000:40::f001","same_ip":true},{"hostname":"br-sao-wg-201","location":"br-sao","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.198.66","include_in_country":true,"weight":100,"public_key":"8c9M6w1BQbgMVr/Zgrj4GwSdU6q3qfQfWs17kMLC9y4=","ipv6_addr_in":"2a02:6ea0:d00e:1::a01f","same_ip":true},{"hostname":"br-sao-wg-202","location":"br-sao","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.198.79","include_in_country":true,"weight":100,"public_key":"jWURoz8SLBUlRTQnAFTA/LDZUTpvlO0ghiVWH7MgaHQ=","ipv6_addr_in":"2a02:6ea0:d00e:2::a02f","same_ip":true},{"hostname":"ca-mtr-wg-001","location":"ca-mtr","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.198.66","include_in_country":true,"weight":100,"public_key":"TUCaQc26/R6AGpkDUr8A8ytUs/e5+UVlIVujbuBwlzI=","ipv6_addr_in":"2a0d:5600:9:c::f001","same_ip":true},{"hostname":"ca-mtr-wg-002","location":"ca-mtr","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.198.130","include_in_country":true,"weight":100,"public_key":"7X6zOgtJfJAK8w8C3z+hekcS9Yf3qK3Bp4yx56lqxBQ=","ipv6_addr_in":"2a0d:5600:9:d::f001","same_ip":true},{"hostname":"ca-mtr-wg-003","location":"ca-mtr","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.198.194","include_in_country":true,"weight":100,"public_key":"57Zu2qPzRScZWsoC2NhXgz0FiC0HiKkbEa559sbxB3k=","ipv6_addr_in":"2a0d:5600:9:e::a02f","same_ip":true},{"hostname":"ca-mtr-wg-004","location":"ca-mtr","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"188.241.176.194","include_in_country":true,"weight":100,"public_key":"Cc5swfQ9f2tAgLduuIqC3bLbwDVoOFkkETghsE6/twA=","ipv6_addr_in":"2a0d:5600:9:16::f001","same_ip":true},{"hostname":"ca-tor-wg-001","location":"ca-tor","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"178.249.214.2","include_in_country":true,"weight":100,"public_key":"HjcUGVDXWdrRkaKNpc/8494RM5eICO6DPyrhCtTv9Ws=","ipv6_addr_in":"2a02:6ea0:de08:1::f001","same_ip":true},{"hostname":"ca-tor-wg-002","location":"ca-tor","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"178.249.214.15","include_in_country":true,"weight":100,"public_key":"iqZSgVlU9H67x/uYE5xsnzLCDXf7FL9iMfyKfl6WsV8=","ipv6_addr_in":"2a02:6ea0:de08:2::a29f","same_ip":true},{"hostname":"ca-tor-wg-101","location":"ca-tor","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.140.130","include_in_country":true,"weight":100,"public_key":"hfvZctxTQukC6lMJ4liGTg1JECT4XqEKpTNPk84k2As=","ipv6_addr_in":"2607:9000:6000:18::a01f","same_ip":true},{"hostname":"ca-tor-wg-102","location":"ca-tor","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.132.98","include_in_country":true,"weight":100,"public_key":"iGwKJTbm/aL4kJXwcJkO0JYPEEGGDcYBrRTG7CHIQx0=","ipv6_addr_in":"2607:9000:6000:14::a02f","same_ip":true},{"hostname":"ca-tor-wg-103","location":"ca-tor","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.132.226","include_in_country":true,"weight":100,"public_key":"MbusadbeACMR5bv+PPjhldb5CgwjlCbthnTJNrOJnhI=","ipv6_addr_in":"2607:9000:6000:17::a03f","same_ip":true},{"hostname":"ca-tor-wg-104","location":"ca-tor","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.132.130","include_in_country":true,"weight":100,"public_key":"y9JT2B69QiWkbEAiXGq5yhtAvg8YNXNkjhHcUiBCiko=","ipv6_addr_in":"2607:9000:6000:15::a04f","same_ip":true},{"hostname":"ca-tor-wg-105","location":"ca-tor","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.140.162","include_in_country":true,"weight":100,"public_key":"XE+hufytSkX14TjskwmYL4HL4mbPf+Vd5Jfgwf/5JHc=","ipv6_addr_in":"2607:9000:6000:19::a05f","same_ip":true},{"hostname":"ca-tor-wg-106","location":"ca-tor","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.132.162","include_in_country":true,"weight":100,"public_key":"ptnLZbreIzTZrSyPD0XhOAAmN194hcPSG5TI5TTiL08=","ipv6_addr_in":"2607:9000:6000:16::a26f","same_ip":true},{"hostname":"ca-tor-wg-107","location":"ca-tor","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.140.194","include_in_country":true,"weight":100,"public_key":"jVgDxCstCo0NRZ/dB9fpQiu+dfYK2v3HOa4B6MkLaQA=","ipv6_addr_in":"2607:9000:6000:20::a07f","same_ip":true},{"hostname":"ca-van-wg-201","location":"ca-van","active":true,"owned":false,"provider":"techfutures","stboot":true,"ipv4_addr_in":"104.193.135.196","include_in_country":true,"weight":100,"public_key":"hYbb2NQKB0g2RefngdHl3bfaLImUuzeVIv2i1VCVIlQ=","ipv6_addr_in":"2606:9580:103:e::f001","same_ip":true},{"hostname":"ca-van-wg-202","location":"ca-van","active":true,"owned":false,"provider":"techfutures","stboot":true,"ipv4_addr_in":"104.193.135.100","include_in_country":true,"weight":100,"public_key":"wGqcNxXH7A3bSptHZo7Dfmymy/Y30Ea/Zd47UkyEbzo=","ipv6_addr_in":"2606:9580:103:f::f001","same_ip":true},{"hostname":"ca-yyc-wg-201","location":"ca-yyc","active":true,"owned":false,"provider":"techfutures","stboot":true,"ipv4_addr_in":"38.240.225.36","include_in_country":true,"weight":100,"public_key":"L4RcVwk0cJJp2u8O9+86sdyUpxfYnr+ME57Ex0RY1Wo=","ipv6_addr_in":"2606:9580:438:32::b01f","same_ip":true},{"hostname":"ca-yyc-wg-202","location":"ca-yyc","active":true,"owned":false,"provider":"techfutures","stboot":true,"ipv4_addr_in":"38.240.225.68","include_in_country":true,"weight":100,"public_key":"u9J/fzrSqM2aEFjTs91KEKgBsaQ/I/4XkIP1Z/zYkXA=","ipv6_addr_in":"2606:9580:438:64::b02f","same_ip":true},{"hostname":"ch-zrh-wg-001","location":"ch-zrh","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.127.66","include_in_country":true,"weight":1,"public_key":"/iivwlyqWqxQ0BVWmJRhcXIFdJeo0WbHQ/hZwuXaN3g=","ipv6_addr_in":"2a03:1b20:a:f011::f001","same_ip":true},{"hostname":"ch-zrh-wg-002","location":"ch-zrh","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.127.67","include_in_country":true,"weight":1,"public_key":"qcvI02LwBnTb7aFrOyZSWvg4kb7zNW9/+rS6alnWyFE=","ipv6_addr_in":"2a03:1b20:a:f011::f101","same_ip":true},{"hostname":"ch-zrh-wg-003","location":"ch-zrh","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.127.68","include_in_country":true,"weight":1,"public_key":"5Ms10UxGjCSzwImTrvEjcygsWY8AfMIdYyRvgFuTqH8=","ipv6_addr_in":"2a03:1b20:a:f011::f201","same_ip":true},{"hostname":"ch-zrh-wg-004","location":"ch-zrh","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.127.69","include_in_country":true,"weight":1,"public_key":"C3jAgPirUZG6sNYe4VuAgDEYunENUyG34X42y+SBngQ=","ipv6_addr_in":"2a03:1b20:a:f011::f301","same_ip":true},{"hostname":"ch-zrh-wg-005","location":"ch-zrh","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.127.70","include_in_country":true,"weight":1,"public_key":"dV/aHhwG0fmp0XuvSvrdWjCtdyhPDDFiE/nuv/1xnRM=","ipv6_addr_in":"2a03:1b20:a:f011::f401","same_ip":true},{"hostname":"ch-zrh-wg-201","location":"ch-zrh","active":true,"owned":false,"provider":"PrivateLayer","stboot":true,"ipv4_addr_in":"179.43.189.66","include_in_country":true,"weight":100,"public_key":"66NPINP4+1AlojLP0J6O9GxdloiegNnGMV4Yit9Kzg0=","ipv6_addr_in":"2a02:29b8:dc01:1832::a1f","same_ip":true},{"hostname":"ch-zrh-wg-202","location":"ch-zrh","active":true,"owned":false,"provider":"PrivateLayer","stboot":true,"ipv4_addr_in":"46.19.136.226","include_in_country":true,"weight":100,"public_key":"gSLSfY2zNFRczxHndeda258z+ayMvd7DqTlKYlKWJUo=","ipv6_addr_in":"2a02:29b8:dc01:1831::f002","same_ip":true},{"hostname":"ch-zrh-wg-401","location":"ch-zrh","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.6.194","include_in_country":true,"weight":80,"public_key":"45ud3I5O6GmPXTrMJiqkiPMI/ubucDqzGaiq3CHJXk8=","ipv6_addr_in":"2a02:6ea0:d406:1::a18f","same_ip":true},{"hostname":"ch-zrh-wg-402","location":"ch-zrh","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.6.207","include_in_country":true,"weight":80,"public_key":"7VCMEE+Oljm/qKfQJSUCOYPtRSwdOnuPyqo5Vob+GRY=","ipv6_addr_in":"2a02:6ea0:d406:2::a19f","same_ip":true},{"hostname":"ch-zrh-wg-403","location":"ch-zrh","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.6.220","include_in_country":true,"weight":80,"public_key":"Jmhds6oPu6/j94hjllJCIaKLDyWu6V+ZNRrVVFhWJkI=","ipv6_addr_in":"2a02:6ea0:d406:3::a20f","same_ip":true},{"hostname":"ch-zrh-wg-404","location":"ch-zrh","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.6.233","include_in_country":true,"weight":80,"public_key":"zfNQqDyPmSUY8+20wxACe/wpk4Q5jpZm5iBqjXj2hk8=","ipv6_addr_in":"2a02:6ea0:d406:4::a21f","same_ip":true},{"hostname":"ch-zrh-wg-501","location":"ch-zrh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.134.98","include_in_country":true,"weight":100,"public_key":"HQzvIK88XSsRujBlwoYvvZ7CMKwiYuOqLXyuckkTPHg=","ipv6_addr_in":"2001:ac8:28:a7::a36f","same_ip":true},{"hostname":"ch-zrh-wg-502","location":"ch-zrh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.126.162","include_in_country":true,"weight":100,"public_key":"TOA/MQWS6TzJVEa//GPyaET5d52VpHO2isS4786GGwU=","ipv6_addr_in":"2001:ac8:28:a1::f001","same_ip":true},{"hostname":"ch-zrh-wg-503","location":"ch-zrh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.126.194","include_in_country":true,"weight":100,"public_key":"ApOUMLFcpTpj/sDAMub0SvASFdsSWtsy+vvw/nWvEmY=","ipv6_addr_in":"2001:ac8:28:a2::f001","same_ip":true},{"hostname":"ch-zrh-wg-504","location":"ch-zrh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.126.226","include_in_country":true,"weight":100,"public_key":"I5XiRYHPmxnmGtPJ90Yio6QXL441C/+kYV6UH6wU+jk=","ipv6_addr_in":"2001:ac8:28:a3::f001","same_ip":true},{"hostname":"ch-zrh-wg-505","location":"ch-zrh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.134.2","include_in_country":true,"weight":100,"public_key":"dc16Gcid7jLcHRD7uHma1myX3vWhEy/bZIBtqZw0B2I=","ipv6_addr_in":"2001:ac8:28:a4::a33f","same_ip":true},{"hostname":"ch-zrh-wg-506","location":"ch-zrh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.134.34","include_in_country":true,"weight":100,"public_key":"7xVJLzW0nfmACr1VMc+/SiSMFh0j0EI3DrU/8Fnj1zM=","ipv6_addr_in":"2001:ac8:28:a5::a34f","same_ip":true},{"hostname":"ch-zrh-wg-507","location":"ch-zrh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.134.66","include_in_country":true,"weight":100,"public_key":"RNTpvmWTyjNf8w9qdP+5XlFnyAk5TrVvT+CRa8a0zys=","ipv6_addr_in":"2001:ac8:28:a6::a35f","same_ip":true},{"hostname":"co-bog-wg-001","location":"co-bog","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"154.47.16.34","include_in_country":true,"weight":100,"public_key":"iaMa84nCHK+v4TnQH4h2rxkqwwxemORXM12VbJDRZSU=","ipv6_addr_in":"2a02:6ea0:f101:1::f001","same_ip":true},{"hostname":"co-bog-wg-002","location":"co-bog","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"154.47.16.47","include_in_country":true,"weight":100,"public_key":"IZDwbG9C/NrOOGVUrn+fDaPr8ZwD/yhvST7XWGk1ln8=","ipv6_addr_in":"2a02:6ea0:f101:2::f001","same_ip":true},{"hostname":"cz-prg-wg-101","location":"cz-prg","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.129.98","include_in_country":true,"weight":100,"public_key":"wLBxTaISMJ++vUht4hlAOUog9fhZxDql16TaYWaboDc=","ipv6_addr_in":"2001:ac8:33:c::a01f","same_ip":true},{"hostname":"cz-prg-wg-102","location":"cz-prg","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.129.130","include_in_country":true,"weight":100,"public_key":"cRCJ0vULwKRbTfzuo9W+fIt0fJGQE7DLvojIiURIpiI=","ipv6_addr_in":"2001:ac8:33:d::a02f","same_ip":true},{"hostname":"cz-prg-wg-201","location":"cz-prg","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"178.249.209.162","include_in_country":true,"weight":100,"public_key":"5FZW+fNA2iVBSY99HFl+KjGc9AFVNE+UFAedLNhu8lc=","ipv6_addr_in":"2a02:6ea0:c201:1::f001","same_ip":true},{"hostname":"cz-prg-wg-202","location":"cz-prg","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"178.249.209.175","include_in_country":true,"weight":100,"public_key":"ReGrGPKDHri64D7qeXmgcLzjsTJ0B/yM7eekFz1P/34=","ipv6_addr_in":"2a02:6ea0:c201:1::f101","same_ip":true},{"hostname":"de-ber-wg-001","location":"de-ber","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.248.66","include_in_country":true,"weight":100,"public_key":"0qSP0VxoIhEhRK+fAHVvmfRdjPs2DmmpOCNLFP/7cGw=","ipv6_addr_in":"2a03:1b20:b:f011::a01f","same_ip":true},{"hostname":"de-ber-wg-002","location":"de-ber","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.248.67","include_in_country":true,"weight":100,"public_key":"8ov1Ws0ut3ixWDh9Chp7/WLVn9qC6/WVHtcBcuWBlgo=","ipv6_addr_in":"2a03:1b20:b:f011::a02f","same_ip":true},{"hostname":"de-ber-wg-003","location":"de-ber","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.248.68","include_in_country":true,"weight":100,"public_key":"USrMatdHiCL5AKdVMpHuYgWuMiK/GHPwRB3Xx00FhU0=","ipv6_addr_in":"2a03:1b20:b:f011::a03f","same_ip":true},{"hostname":"de-ber-wg-004","location":"de-ber","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.248.69","include_in_country":true,"weight":100,"public_key":"6PchzRRxzeeHdNLyn3Nz0gmN7pUyjoZMpKmKzJRL4GM=","ipv6_addr_in":"2a03:1b20:b:f011::a04f","same_ip":true},{"hostname":"de-ber-wg-005","location":"de-ber","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.248.70","include_in_country":true,"weight":100,"public_key":"I4Y7e8LrtBC/7DLpUgRd5k+IZk+whOFVAZgbSivoiBI=","ipv6_addr_in":"2a03:1b20:b:f011::a05f","same_ip":true},{"hostname":"de-ber-wg-006","location":"de-ber","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.248.71","include_in_country":true,"weight":100,"public_key":"eprzkkkSbXCANngQDo305DIAvkKAnZaN71IpTNaOoTk=","ipv6_addr_in":"2a03:1b20:b:f011::a06f","same_ip":true},{"hostname":"de-dus-wg-001","location":"de-dus","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"185.254.75.3","include_in_country":true,"weight":300,"public_key":"ku1NYeOAGbY65YL/JKZhrqVzDJKXQiVj9USXbfkOBA0=","ipv6_addr_in":"2a03:d9c0:3000::a20f","same_ip":true},{"hostname":"de-dus-wg-002","location":"de-dus","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"185.254.75.4","include_in_country":true,"weight":300,"public_key":"TPAIPTgu9jIitgX1Bz5xMCZJ9pRRZTdtZEOIxArO0Hc=","ipv6_addr_in":"2a03:d9c0:3000::a21f","same_ip":true},{"hostname":"de-dus-wg-003","location":"de-dus","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"185.254.75.5","include_in_country":true,"weight":300,"public_key":"XgSe9UwEV4JJNPPzFFOVYS6scMTL4DeNlwqBl32lDw0=","ipv6_addr_in":"2a03:d9c0:3000::a22f","same_ip":true},{"hostname":"de-fra-wg-001","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.155.73","include_in_country":true,"weight":100,"public_key":"HQHCrq4J6bSpdW1fI5hR/bvcrYa6HgGgwaa5ZY749ik=","ipv6_addr_in":"2a03:1b20:6:f011::f001","same_ip":true},{"hostname":"de-fra-wg-002","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.155.74","include_in_country":true,"weight":100,"public_key":"s1c/NsfnqnwQSxao70DY4Co69AFT9e0h88IFuMD5mjs=","ipv6_addr_in":"2a03:1b20:6:f011::f101","same_ip":true},{"hostname":"de-fra-wg-003","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.209.196.73","include_in_country":true,"weight":100,"public_key":"vVQKs2TeTbdAvl3sH16UWLSESncXAj0oBaNuFIUkLVk=","ipv6_addr_in":"2a03:1b20:6:f011::f201","same_ip":true},{"hostname":"de-fra-wg-004","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.209.196.74","include_in_country":true,"weight":100,"public_key":"tzYLWgBdwrbbBCXYHRSoYIho4dHtrm+8bdONU1I8xzc=","ipv6_addr_in":"2a03:1b20:6:f011::f301","same_ip":true},{"hostname":"de-fra-wg-005","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.209.196.75","include_in_country":true,"weight":100,"public_key":"tpobOO6t18CzHjOg0S3RlZJMxd2tz4+BnRYS7NrjTnM=","ipv6_addr_in":"2a03:1b20:6:f011::f401","same_ip":true},{"hostname":"de-fra-wg-006","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.209.196.76","include_in_country":true,"weight":100,"public_key":"nAF0wrLG2+avwQfqxnXhBGPUBCvc3QCqWKH4nK5PfEU=","ipv6_addr_in":"2a03:1b20:6:f011::f501","same_ip":true},{"hostname":"de-fra-wg-007","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.209.196.77","include_in_country":true,"weight":100,"public_key":"mTmrSuXmTnIC9l2Ur3/QgodGrVEhhIE3pRwOHZpiYys=","ipv6_addr_in":"2a03:1b20:6:f011::f601","same_ip":true},{"hostname":"de-fra-wg-008","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.209.196.78","include_in_country":true,"weight":100,"public_key":"TOS3U/dJPzPnk/qsAx6gHxRVIC2wI5l+tAWaJY2mXzY=","ipv6_addr_in":"2a03:1b20:6:f011::f701","same_ip":true},{"hostname":"de-fra-wg-101","location":"de-fra","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.117.162","include_in_country":true,"weight":100,"public_key":"Voioje9Gfb7aTiK2/H6VyHFK1AFap1glIX0Z1EX2mRQ=","ipv6_addr_in":"2001:ac8:20:274::a99f","same_ip":true},{"hostname":"de-fra-wg-102","location":"de-fra","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.117.194","include_in_country":true,"weight":100,"public_key":"ydXFN45/kROELJrF6id+uIrnS5DvTKSCkZDjfL9De2Q=","ipv6_addr_in":"2001:ac8:20:275::f001","same_ip":true},{"hostname":"de-fra-wg-103","location":"de-fra","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.117.226","include_in_country":true,"weight":100,"public_key":"KkShcqgwbkX2A9n1hhST6qu+m3ldxdJ2Lx8Eiw6mdXw=","ipv6_addr_in":"2001:ac8:20:276::f001","same_ip":true},{"hostname":"de-fra-wg-104","location":"de-fra","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.107.194","include_in_country":true,"weight":100,"public_key":"uKTC5oP/zfn6SSjayiXDDR9L82X0tGYJd5LVn5kzyCc=","ipv6_addr_in":"2001:ac8:20:277::f001","same_ip":true},{"hostname":"de-fra-wg-105","location":"de-fra","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.117.2","include_in_country":true,"weight":100,"public_key":"Sttn2cr14dvIcCrE8qdlRGHXriqvTyvQWC7dzujH/iM=","ipv6_addr_in":"2001:ac8:20:269::f001","same_ip":true},{"hostname":"de-fra-wg-106","location":"de-fra","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.117.34","include_in_country":true,"weight":100,"public_key":"9ldhvN7r4xGZkGehbsNfYb5tpyTJ5KBb5B3TbxCwklw=","ipv6_addr_in":"2001:ac8:20:270::f001","same_ip":true},{"hostname":"de-fra-wg-301","location":"de-fra","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"194.36.25.3","include_in_country":true,"weight":300,"public_key":"dNKRyh2MkJGZdg9jyUJtf9w5GHjX3+/fYatg+xi9TUM=","ipv6_addr_in":"2a07:fe00:1::a23f","same_ip":true},{"hostname":"de-fra-wg-302","location":"de-fra","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"194.36.25.18","include_in_country":true,"weight":300,"public_key":"A3DbIgPycEJhJ1fQ4zzcajLOKTZsJMeawjdPQiWav20=","ipv6_addr_in":"2a07:fe00:1::a24f","same_ip":true},{"hostname":"de-fra-wg-303","location":"de-fra","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"194.36.25.33","include_in_country":true,"weight":300,"public_key":"2P+9SjwVCEnMDnBiYfZtQLq9p2S2TFhCM0xJBoevYk4=","ipv6_addr_in":"2a07:fe00:1::a25f","same_ip":true},{"hostname":"de-fra-wg-304","location":"de-fra","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"194.36.25.48","include_in_country":true,"weight":300,"public_key":"VgNcwWy8MRhfEZY+XSisDM1ykX+uXlHQScOLqqGMLkc=","ipv6_addr_in":"2a07:fe00:1::a26f","same_ip":true},{"hostname":"de-fra-wg-401","location":"de-fra","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.201.2","include_in_country":true,"weight":300,"public_key":"AbM8fnQWmmX6Nv0Tz68LigPbGkamJgNjxgzPfENOdXU=","ipv6_addr_in":"2a02:6ea0:c762:1::a35f","same_ip":true},{"hostname":"de-fra-wg-402","location":"de-fra","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.201.15","include_in_country":true,"weight":300,"public_key":"6/PBbPtoeWpJA+HZc9Iqg/PPQWD7mGVvZdwQlr1vtRk=","ipv6_addr_in":"2a02:6ea0:c762:2::a36f","same_ip":true},{"hostname":"de-fra-wg-403","location":"de-fra","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.201.28","include_in_country":true,"weight":300,"public_key":"HWzSNMbQOQafkVp68B7aLRirhNJ6x5Wjw8/y7oUuHW0=","ipv6_addr_in":"2a02:6ea0:c762:3::a37f","same_ip":true},{"hostname":"dk-cph-wg-001","location":"dk-cph","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"45.129.56.67","include_in_country":true,"weight":100,"public_key":"egl+0TkpFU39F5O6r6+hIBMPQLOa8/t5CymOZV6CC3Y=","ipv6_addr_in":"2a03:1b20:8:f011::f001","same_ip":true},{"hostname":"dk-cph-wg-002","location":"dk-cph","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"45.129.56.68","include_in_country":true,"weight":100,"public_key":"R5LUBgM/1UjeAR4lt+L/yA30Gee6/VqVZ9eAB3ZTajs=","ipv6_addr_in":"2a03:1b20:8:f011::f101","same_ip":true},{"hostname":"dk-cph-wg-401","location":"dk-cph","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.197.194","include_in_country":true,"weight":100,"public_key":"Jjml2TSqKlgzW6UzPiJszaun743QYpyl5jQk8UOQYg0=","ipv6_addr_in":"2001:ac8:37:97::f001","same_ip":true},{"hostname":"dk-cph-wg-402","location":"dk-cph","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.197.130","include_in_country":true,"weight":100,"public_key":"ML0NcFPqy+x+ZJg7y9vfh77hXAOtgueIqp1j+CJVrXM=","ipv6_addr_in":"2001:ac8:37:96::f001","same_ip":true},{"hostname":"ee-tll-wg-001","location":"ee-tll","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"194.127.167.67","include_in_country":true,"weight":100,"public_key":"bdq37KtfoG1Tm7yQcfitdRyGeZOn/c7PwLN+LgG/6nA=","ipv6_addr_in":"2a07:d880:2::a01f","same_ip":true},{"hostname":"ee-tll-wg-002","location":"ee-tll","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"194.127.167.87","include_in_country":true,"weight":100,"public_key":"vqGmmcERr/PAKDzy6Dxax8g4150rC93kmKYabZuAzws=","ipv6_addr_in":"2a07:d880:2::a02f","same_ip":true},{"hostname":"ee-tll-wg-003","location":"ee-tll","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"194.127.167.107","include_in_country":true,"weight":100,"public_key":"+8dUgpD7YA4wMPnRQkO7EI7AeYd30QPMKh/hOaaGIXY=","ipv6_addr_in":"2a07:d880:2::a03f","same_ip":true},{"hostname":"es-mad-wg-101","location":"es-mad","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"45.134.213.194","include_in_country":true,"weight":50,"public_key":"oPpPeyiQhUYqtOxwR387dmFfII8OK5LX2RPyns1rx2U=","ipv6_addr_in":"2a02:6ea0:c318:1::a06f","same_ip":true},{"hostname":"es-mad-wg-102","location":"es-mad","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"45.134.213.207","include_in_country":true,"weight":50,"public_key":"1Wo/cQeVHX2q9k95nxN+48lgkGLsPQ+uesRb/9XdY1Y=","ipv6_addr_in":"2a02:6ea0:c318:2::a07f","same_ip":true},{"hostname":"es-mad-wg-201","location":"es-mad","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.128.194","include_in_country":true,"weight":100,"public_key":"LyO4Xs1eV8JwFr63a1FRnKboQn2Tu/oeMzHhbr7Y6GU=","ipv6_addr_in":"2001:ac8:23:85::a01f","same_ip":true},{"hostname":"es-mad-wg-202","location":"es-mad","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.128.226","include_in_country":true,"weight":100,"public_key":"iehXacO91FbBqni2IFxedEYPlW2Wvvt9GtRPPPMo9zc=","ipv6_addr_in":"2001:ac8:23:86::a02f","same_ip":true},{"hostname":"fi-hel-wg-001","location":"fi-hel","active":true,"owned":true,"provider":"Creanova","stboot":true,"ipv4_addr_in":"185.204.1.203","include_in_country":true,"weight":100,"public_key":"veLqpZazR9j/Ol2G8TfrO32yEhc1i543MCN8rpy1FBA=","ipv6_addr_in":"2a0c:f040:0:2790::a01f","same_ip":true},{"hostname":"fi-hel-wg-002","location":"fi-hel","active":true,"owned":true,"provider":"Creanova","stboot":true,"ipv4_addr_in":"185.204.1.211","include_in_country":true,"weight":100,"public_key":"8BbP3GS01dGkN5ENk1Rgedxfd80friyVOABrdMgD3EY=","ipv6_addr_in":"2a0c:f040:0:2790::a02f","same_ip":true},{"hostname":"fi-hel-wg-003","location":"fi-hel","active":true,"owned":true,"provider":"Creanova","stboot":true,"ipv4_addr_in":"185.204.1.219","include_in_country":true,"weight":100,"public_key":"FKodo9V6BehkNphL+neI0g4/G/cjbZyYhoptSWf3Si4=","ipv6_addr_in":"2a0c:f040:0:2790::a03f","same_ip":true},{"hostname":"fi-hel-wg-101","location":"fi-hel","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"193.138.7.137","include_in_country":true,"weight":100,"public_key":"2S3G7Sm9DVG6+uJtlDu4N6ed5V97sTbA5dCSkUelWyk=","ipv6_addr_in":"2a02:ed04:3581:1::f001","same_ip":true},{"hostname":"fi-hel-wg-102","location":"fi-hel","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"193.138.7.157","include_in_country":true,"weight":100,"public_key":"xeHVhXxyyFqUEE+nsu5Tzd/t9en+++4fVFcSFngpcAU=","ipv6_addr_in":"2a02:ed04:3581:2::f001","same_ip":true},{"hostname":"fi-hel-wg-103","location":"fi-hel","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"193.138.7.177","include_in_country":true,"weight":100,"public_key":"Mlvu14bSD6jb7ajH/CiJ/IO8W+spB8H6VmdGkFGOcUQ=","ipv6_addr_in":"2a02:ed04:3581:3::f001","same_ip":true},{"hostname":"fi-hel-wg-104","location":"fi-hel","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"193.138.7.197","include_in_country":true,"weight":100,"public_key":"keRQGHUbYP2qgDTbYqOsI9byfNb0LOpTZ/KdC67cJiA=","ipv6_addr_in":"2a02:ed04:3581:4::f001","same_ip":true},{"hostname":"fr-mrs-wg-001","location":"fr-mrs","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.15.162","include_in_country":true,"weight":300,"public_key":"MOk2OTDEaFFN4vsCAgf+qQi6IlY99nCeDEzpXyo65wg=","ipv6_addr_in":"2a02:6ea0:dc05::a15f","same_ip":true},{"hostname":"fr-mrs-wg-002","location":"fr-mrs","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.15.146","include_in_country":true,"weight":300,"public_key":"Z0LEgZIPhNj0+/VWknU3roHlVI3qqAfoV6th9NSC0F0=","ipv6_addr_in":"2a02:6ea0:dc06::a16f","same_ip":true},{"hostname":"fr-par-wg-001","location":"fr-par","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.126.66","include_in_country":true,"weight":100,"public_key":"ov323GyDOEHLT0sNRUUPYiE3BkvFDjpmi1a4fzv49hE=","ipv6_addr_in":"2a03:1b20:9:f011::a01f","same_ip":true},{"hostname":"fr-par-wg-002","location":"fr-par","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.126.67","include_in_country":true,"weight":100,"public_key":"R5Ve+PJD24QjNXi2Dim7szwCiOLnv+6hg+WyTudAYmE=","ipv6_addr_in":"2a03:1b20:9:f011::f101","same_ip":true},{"hostname":"fr-par-wg-003","location":"fr-par","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.126.68","include_in_country":true,"weight":100,"public_key":"w4r/o6VImF7l0/De3JpOGnpzjAFv9wcCu8Rop5eZkWc=","ipv6_addr_in":"2a03:1b20:9:f011::f201","same_ip":true},{"hostname":"fr-par-wg-004","location":"fr-par","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.126.69","include_in_country":true,"weight":100,"public_key":"E/KjR7nlFouuRXh1pwGDr7iK2TAZ6c4K0LjjmA1A2Tc=","ipv6_addr_in":"2a03:1b20:9:f011::f301","same_ip":true},{"hostname":"fr-par-wg-005","location":"fr-par","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.126.70","include_in_country":true,"weight":100,"public_key":"cmqtSjWUa4/0bENQDKxdr0vQqf4nFVDodarHm0Pc0hY=","ipv6_addr_in":"2a03:1b20:9:f011::f401","same_ip":true},{"hostname":"fr-par-wg-101","location":"fr-par","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.184.2","include_in_country":true,"weight":100,"public_key":"e2uj1eu/ZuTPqfY+9ULa6KFPRGLkSWCaooXBg9u9igA=","ipv6_addr_in":"2001:ac8:25:3a::f001","same_ip":true},{"hostname":"fr-par-wg-102","location":"fr-par","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.184.66","include_in_country":true,"weight":100,"public_key":"TR0Gedkbp2mRRXKZ7VB7qaAvJHuQlwaaLFc4fxb4q2M=","ipv6_addr_in":"2001:ac8:25:3b::f001","same_ip":true},{"hostname":"gb-lon-wg-001","location":"gb-lon","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.252.130","include_in_country":true,"weight":100,"public_key":"IJJe0TQtuQOyemL4IZn6oHEsMKSPqOuLfD5HoAWEPTY=","ipv6_addr_in":"2a03:1b20:7:f011::a01f","same_ip":true},{"hostname":"gb-lon-wg-002","location":"gb-lon","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.252.222","include_in_country":true,"weight":100,"public_key":"J57ba81Q8bigy9RXBXvl0DgABTrbl81nb37GuX50gnY=","ipv6_addr_in":"2a03:1b20:7:f011::a02f","same_ip":true},{"hostname":"gb-lon-wg-003","location":"gb-lon","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.195.232.66","include_in_country":true,"weight":100,"public_key":"VZwE8hrpNzg6SMwn9LtEqonXzSWd5dkFk62PrNWFW3Y=","ipv6_addr_in":"2a03:1b20:7:f011::a11f","same_ip":true},{"hostname":"gb-lon-wg-004","location":"gb-lon","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.195.232.67","include_in_country":true,"weight":100,"public_key":"PLpO9ikFX1garSFaeUpo7XVSMrILrTB8D9ZwQt6Zgwk=","ipv6_addr_in":"2a03:1b20:7:f011::a12f","same_ip":true},{"hostname":"gb-lon-wg-005","location":"gb-lon","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.195.232.68","include_in_country":true,"weight":100,"public_key":"bG6WulLmMK408n719B8nQJNuTRyRA3Qjm7bsm9d6v2M=","ipv6_addr_in":"2a03:1b20:7:f011::a13f","same_ip":true},{"hostname":"gb-lon-wg-006","location":"gb-lon","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.195.232.69","include_in_country":true,"weight":100,"public_key":"INRhM0h4T1hi9j28pcC+vRv47bp7DIsNKtagaFZFSBI=","ipv6_addr_in":"2a03:1b20:7:f011::a14f","same_ip":true},{"hostname":"gb-lon-wg-007","location":"gb-lon","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.195.232.70","include_in_country":true,"weight":100,"public_key":"MVqe9e9aDwfFuvEhEn4Wd/zWV3cmiCX9fZMWetz+23A=","ipv6_addr_in":"2a03:1b20:7:f011::a15f","same_ip":true},{"hostname":"gb-lon-wg-201","location":"gb-lon","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"185.248.85.3","include_in_country":true,"weight":50,"public_key":"b71Y8V/vVwNRGkL4d1zvApDVL18u7m31dN+x+i5OJVs=","ipv6_addr_in":"2a0b:89c1:3::a33f","same_ip":true},{"hostname":"gb-lon-wg-202","location":"gb-lon","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"185.248.85.18","include_in_country":true,"weight":50,"public_key":"+iQWuT3wb2DCy1u2eUKovhJTCB4aUdJUnpxGtONDIVE=","ipv6_addr_in":"2a0b:89c1:3::a34f","same_ip":true},{"hostname":"gb-lon-wg-203","location":"gb-lon","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"185.248.85.33","include_in_country":true,"weight":50,"public_key":"G7XDQqevQOw1SVL7Iarn9PM+RvmI6H/CfkmahBYEG0g=","ipv6_addr_in":"2a0b:89c1:3::a35f","same_ip":true},{"hostname":"gb-lon-wg-204","location":"gb-lon","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"185.248.85.48","include_in_country":true,"weight":50,"public_key":"tJVHqpfkV2Xgmd4YK60aoErSt6PmJKJjkggHNDfWwiU=","ipv6_addr_in":"2a0b:89c1:3::a36f","same_ip":true},{"hostname":"gb-lon-wg-301","location":"gb-lon","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.119.66","include_in_country":false,"weight":1,"public_key":"Gn9WbiHw83r8BI+v/Usx3mSR+TpMAWLFFz0r9Lfy7XQ=","ipv6_addr_in":"2001:ac8:31:f007::a39f","same_ip":true},{"hostname":"gb-lon-wg-302","location":"gb-lon","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.119.2","include_in_country":false,"weight":1,"public_key":"s0i/bDeQ3xfMsLSrg6bILWunyytJNHVgIJlfflA8jFI=","ipv6_addr_in":"2001:ac8:31:f005::a37f","same_ip":true},{"hostname":"gb-lon-wg-303","location":"gb-lon","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.119.34","include_in_country":false,"weight":1,"public_key":"ZcDVPTugbxo0rTvDKNnexzJ2qNrh3c/wFRtM2Pfl6jM=","ipv6_addr_in":"2001:ac8:31:f006::a38f","same_ip":true},{"hostname":"gb-mnc-wg-001","location":"gb-mnc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.133.98","include_in_country":true,"weight":100,"public_key":"Q2khJLbTSFxmppPGHgq2HdxMQx7CczPZCgVpYZMoNnM=","ipv6_addr_in":"2001:ac8:8b:2d::a47f","same_ip":true},{"hostname":"gb-mnc-wg-002","location":"gb-mnc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.132.130","include_in_country":true,"weight":100,"public_key":"SkERuKByX8fynFxSFAJVjUFJAeu9b/dfW2FynTM7XAk=","ipv6_addr_in":"2001:ac8:8b:26::f001","same_ip":true},{"hostname":"gb-mnc-wg-003","location":"gb-mnc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.132.162","include_in_country":true,"weight":100,"public_key":"c+RjxBk+wZCv0s4jffQesHdInakRVR3oV0IhpVo0WRY=","ipv6_addr_in":"2001:ac8:8b:27::f001","same_ip":true},{"hostname":"gb-mnc-wg-004","location":"gb-mnc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.132.194","include_in_country":true,"weight":100,"public_key":"DiMqK85O8U1T65HdVgOGh9uI63I3by9Dt6Shik2xbyM=","ipv6_addr_in":"2001:ac8:8b:28::f001","same_ip":true},{"hostname":"gb-mnc-wg-005","location":"gb-mnc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.132.226","include_in_country":true,"weight":100,"public_key":"kbVlSaqHQSpnewQn1X0j5R+WKiSW2e2Gq+I4XZj3Bjk=","ipv6_addr_in":"2001:ac8:8b:29::f001","same_ip":true},{"hostname":"gb-mnc-wg-006","location":"gb-mnc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.133.2","include_in_country":true,"weight":100,"public_key":"zKOZzAitVBxfdxtXgGIyk7zmTtoHrVts7RQGrtsRIxo=","ipv6_addr_in":"2001:ac8:8b:2a::f001","same_ip":true},{"hostname":"gb-mnc-wg-007","location":"gb-mnc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.133.34","include_in_country":true,"weight":100,"public_key":"ANaRAtjxqpPgp7r9VjTDfnBMis+MzSgCXc7TZMa0Vno=","ipv6_addr_in":"2001:ac8:8b:2b::f001","same_ip":true},{"hostname":"gb-mnc-wg-008","location":"gb-mnc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.133.66","include_in_country":true,"weight":100,"public_key":"2bciRobW0TPtjrZ2teilr+7PjyiBMUGfixvAKOE52Xo=","ipv6_addr_in":"2001:ac8:8b:2c::f001","same_ip":true},{"hostname":"gr-ath-wg-101","location":"gr-ath","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.102.246.2","include_in_country":true,"weight":100,"public_key":"li+thkAD7s6IZDgUoiKw4YSjM/U1q203PuthMzIJIU0=","ipv6_addr_in":"2a02:6ea0:f501:2::f001","same_ip":true},{"hostname":"gr-ath-wg-102","location":"gr-ath","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.102.246.15","include_in_country":true,"weight":100,"public_key":"OL0gbjlNt1s26CDQjRP9wgMZbgYff7/xyUI8ypOn01s=","ipv6_addr_in":"2a02:6ea0:f501:3::f001","same_ip":true},{"hostname":"hk-hkg-wg-201","location":"hk-hkg","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"103.125.233.18","include_in_country":true,"weight":100,"public_key":"Oxh13dmwY6nNUa5rVHr7sLiFOj0fjzsaAUAUV87/nGs=","ipv6_addr_in":"2403:2c81:1000::a06f","same_ip":true},{"hostname":"hk-hkg-wg-202","location":"hk-hkg","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"103.125.233.3","include_in_country":true,"weight":100,"public_key":"zmhMPHfkgo+uQxP+l919Gw7cj5NTatg9nMU37eEUWis=","ipv6_addr_in":"2403:2c81:1000::a05f","same_ip":true},{"hostname":"hk-hkg-wg-301","location":"hk-hkg","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.224.2","include_in_country":true,"weight":100,"public_key":"qbvU06SBHXnqMnpb49rnE0yC4AOWQcWl2bEScu18dh8=","ipv6_addr_in":"2001:ac8:a:f::f001","same_ip":true},{"hostname":"hk-hkg-wg-302","location":"hk-hkg","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.224.66","include_in_country":true,"weight":100,"public_key":"7FADgmd9KyAVs3eFJE/ob9tV3E6m/klONEEIOfCoPTU=","ipv6_addr_in":"2001:ac8:a:19::f001","same_ip":true},{"hostname":"hr-zag-wg-001","location":"hr-zag","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"154.47.29.2","include_in_country":true,"weight":100,"public_key":"PJvsgLogdAgZiVSxwTDyk9ri02mLZGuElklHShIjDGM=","ipv6_addr_in":"2a02:6ea0:f401:1::a01f","same_ip":true},{"hostname":"hr-zag-wg-002","location":"hr-zag","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"154.47.29.15","include_in_country":true,"weight":100,"public_key":"V0iDOyLSj870sjGGenDvAWqJudlPKDc212cQN85snEo=","ipv6_addr_in":"2a02:6ea0:f401:2::a01f","same_ip":true},{"hostname":"hu-bud-wg-101","location":"hu-bud","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.196.194","include_in_country":true,"weight":100,"public_key":"u+h0GmQJ8UBaMTi2BP9Ls6UUszcGC51y6vTmNr/y+AU=","ipv6_addr_in":"2001:ac8:26:55::f001","same_ip":true},{"hostname":"hu-bud-wg-102","location":"hu-bud","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.196.130","include_in_country":true,"weight":100,"public_key":"iEWLm2F4xV013ZETeZcT1dyUd5O+JnyndHso8RP8txw=","ipv6_addr_in":"2001:ac8:26:54::f001","same_ip":true},{"hostname":"ie-dub-wg-101","location":"ie-dub","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.189.2","include_in_country":true,"weight":100,"public_key":"lHrukA9+vn7Jjzx2Nb/1NQ0WiaiKppEqVxrGT5X1RFQ=","ipv6_addr_in":"2001:ac8:88:84::a01f","same_ip":true},{"hostname":"ie-dub-wg-102","location":"ie-dub","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.189.66","include_in_country":true,"weight":100,"public_key":"8YhrVbViPmYFZ2KJF2pR7d10EaBz8PJbPtoEiAs1IXA=","ipv6_addr_in":"2001:ac8:88:85::f001","same_ip":true},{"hostname":"il-tlv-wg-101","location":"il-tlv","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.227.197","include_in_country":true,"weight":100,"public_key":"XOedjVJaT2IrEDJbzvtZeL4hP5uPRHzFxvD1cwVwUFo=","ipv6_addr_in":"2a02:6ea0:3b00:1::a01f","same_ip":true},{"hostname":"il-tlv-wg-102","location":"il-tlv","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.227.210","include_in_country":true,"weight":100,"public_key":"UNeML4rXjvOerAstTNf4gG5B+OfjVzjSQrWE6mrswD0=","ipv6_addr_in":"2a02:6ea0:3b00:2::a02f","same_ip":true},{"hostname":"il-tlv-wg-103","location":"il-tlv","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.227.222","include_in_country":true,"weight":100,"public_key":"11FJ/NY3jaAw1PSYG9w7bxsMxAzlI+1p8/juh1LJPT0=","ipv6_addr_in":"2a02:6ea0:3b00:3::a03f","same_ip":true},{"hostname":"it-mil-wg-001","location":"it-mil","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"178.249.211.66","include_in_country":true,"weight":200,"public_key":"Sa9fFFthvihGMO4cPExJ7ZaWSHNYoXmOqZMvJsaxOVk=","ipv6_addr_in":"2a02:6ea0:d509:1::a09f","same_ip":true},{"hostname":"it-mil-wg-002","location":"it-mil","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"178.249.211.79","include_in_country":true,"weight":200,"public_key":"RJ7e37UEP6hfyLQM/lJ2K5wcZOJQFhm2VhFaBniH1kg=","ipv6_addr_in":"2a02:6ea0:d509:2::a10f","same_ip":true},{"hostname":"it-mil-wg-003","location":"it-mil","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"178.249.211.92","include_in_country":true,"weight":200,"public_key":"WOyki5Gzoez07X7D3jAhG68hpoiYIWAx1yypVbkQaVY=","ipv6_addr_in":"2a02:6ea0:d509:3::a11f","same_ip":true},{"hostname":"it-mil-wg-201","location":"it-mil","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.225.2","include_in_country":true,"weight":100,"public_key":"XHwDoIVZGoVfUYbfcPiRp1LhaOCDc0A3QrS72i3ztBw=","ipv6_addr_in":"2001:ac8:24:17::f001","same_ip":true},{"hostname":"it-mil-wg-202","location":"it-mil","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.225.66","include_in_country":true,"weight":100,"public_key":"y5raL0QZx2CpOozrL+Knmjj7nnly3JKatFnxynjXpE0=","ipv6_addr_in":"2001:ac8:24:18::f001","same_ip":true},{"hostname":"jp-osa-wg-001","location":"jp-osa","active":false,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"45.8.223.195","include_in_country":true,"weight":100,"public_key":"uhbuY1A7g0yNu0lRhLTi020kYeAx34ED30BA5DQRHFo=","ipv6_addr_in":"2400:ddc0:c000::f001","same_ip":true},{"hostname":"jp-osa-wg-002","location":"jp-osa","active":false,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"45.8.223.210","include_in_country":true,"weight":100,"public_key":"wzGXxsYOraTCPZuRxfXVTNmoWsRkMFLqMqDxI4PutBg=","ipv6_addr_in":"2400:ddc0:c000::a02f","same_ip":true},{"hostname":"jp-osa-wg-003","location":"jp-osa","active":false,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"45.8.223.225","include_in_country":true,"weight":100,"public_key":"Pt18GnBffElW0sqnd6IDRr5r0B/NDezy6NicoPI+fG8=","ipv6_addr_in":"2400:ddc0:c000::f201","same_ip":true},{"hostname":"jp-osa-wg-004","location":"jp-osa","active":false,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"45.8.223.240","include_in_country":true,"weight":100,"public_key":"JpDAtRuR39GLFKoQNiKvpzuJ65jOOLD7h85ekZ3reVc=","ipv6_addr_in":"2400:ddc0:c000::f301","same_ip":true},{"hostname":"jp-tyo-wg-001","location":"jp-tyo","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.21.239","include_in_country":true,"weight":200,"public_key":"AUo2zhQ0wCDy3/jmZgOe4QMncWWqrdME7BbY2UlkgyI=","ipv6_addr_in":"2a02:6ea0:d31c::a15f","same_ip":true},{"hostname":"jp-tyo-wg-002","location":"jp-tyo","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.21.226","include_in_country":true,"weight":200,"public_key":"zdlqydCbeR7sG1y5L8sS65X1oOtRKvfVbAuFgqEGhi4=","ipv6_addr_in":"2a02:6ea0:d31b::a14f","same_ip":true},{"hostname":"jp-tyo-wg-201","location":"jp-tyo","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.138.194","include_in_country":true,"weight":100,"public_key":"0j7u9Vd+EsqFs8XeV/T/ZM7gE+TWgEsYCsqcZUShvzc=","ipv6_addr_in":"2001:ac8:40:11::b01f","same_ip":true},{"hostname":"jp-tyo-wg-202","location":"jp-tyo","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.201.2","include_in_country":true,"weight":100,"public_key":"yLKGIH/eaNUnrOEPRtgvC3PSMTkyAFK/0t8lNjam02k=","ipv6_addr_in":"2001:ac8:40:13::b02f","same_ip":true},{"hostname":"jp-tyo-wg-203","location":"jp-tyo","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.201.66","include_in_country":true,"weight":100,"public_key":"tgTYDEfbDgr35h6hYW01MH76CJrwuBvbQFhyVsazEic=","ipv6_addr_in":"2001:ac8:40:14::b03f","same_ip":true},{"hostname":"lv-rix-wg-001","location":"lv-rix","active":true,"owned":false,"provider":"Makonix","stboot":true,"ipv4_addr_in":"31.170.22.15","include_in_country":true,"weight":100,"public_key":"z0gUPGRwzmOcFLU6b2Z3dCJUJr2/9OvxujUbjFSTB0Q=","ipv6_addr_in":"2a00:c68:0:cbd0::f001","same_ip":true},{"hostname":"mx-qro-wg-001","location":"mx-qro","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.88.22.129","include_in_country":true,"weight":100,"public_key":"yxyntWsANEwxeR0pOPNAcfWY7zEVICZe9G+GxortzEY=","ipv6_addr_in":"2a02:6ea0:f803::f001","same_ip":true},{"hostname":"mx-qro-wg-002","location":"mx-qro","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.88.22.142","include_in_country":true,"weight":100,"public_key":"kGkalo3qvm8MynKdzwW7CGBYXkqRwGhHfYVssgKOWnU=","ipv6_addr_in":"2a02:6ea0:f803:1::f001","same_ip":true},{"hostname":"mx-qro-wg-003","location":"mx-qro","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.88.22.155","include_in_country":true,"weight":100,"public_key":"hRamkTwXw0usPFDorPl2vf1qP8chczEBcqeV5bA1QDA=","ipv6_addr_in":"2a02:6ea0:f803:2::f001","same_ip":true},{"hostname":"mx-qro-wg-004","location":"mx-qro","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.88.22.168","include_in_country":true,"weight":100,"public_key":"Q3yqhnYHK/bFjrd6yqti8gSV1gzOwvnl5N5tXuUxMyk=","ipv6_addr_in":"2a02:6ea0:f803:3::f001","same_ip":true},{"hostname":"nl-ams-wg-001","location":"nl-ams","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.249.66","include_in_country":true,"weight":100,"public_key":"UrQiI9ISdPPzd4ARw1NHOPKKvKvxUhjwRjaI0JpJFgM=","ipv6_addr_in":"2a03:1b20:3:f011::f001","same_ip":true},{"hostname":"nl-ams-wg-002","location":"nl-ams","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.134.82","include_in_country":true,"weight":100,"public_key":"DVui+5aifNFRIVDjH3v2y+dQ+uwI+HFZOd21ajbEpBo=","ipv6_addr_in":"2a03:1b20:3:f011::a02f","same_ip":true},{"hostname":"nl-ams-wg-003","location":"nl-ams","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.134.83","include_in_country":true,"weight":100,"public_key":"if4HpJZbN7jft5E9R9wAoTcggIu6eZhgYDvqxnwrXic=","ipv6_addr_in":"2a03:1b20:3:f011::f201","same_ip":true},{"hostname":"nl-ams-wg-004","location":"nl-ams","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.249.69","include_in_country":true,"weight":100,"public_key":"hnRyse6QxPPcZOoSwRsHUtK1W+APWXnIoaDTmH6JsHQ=","ipv6_addr_in":"2a03:1b20:3:f011::f301","same_ip":true},{"hostname":"nl-ams-wg-005","location":"nl-ams","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.249.70","include_in_country":true,"weight":100,"public_key":"33BoONMGCm2vknq2eq72eozRsHmHQY6ZHEEZ4851TkY=","ipv6_addr_in":"2a03:1b20:3:f011::f401","same_ip":true},{"hostname":"nl-ams-wg-006","location":"nl-ams","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.134.86","include_in_country":true,"weight":100,"public_key":"xpZ3ZDEukbqKQvdHwaqKMUhsYhcYD3uLPUh1ACsVr1s=","ipv6_addr_in":"2a03:1b20:3:f011::f501","same_ip":true},{"hostname":"nl-ams-wg-101","location":"nl-ams","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"92.60.40.194","include_in_country":true,"weight":400,"public_key":"m9w2Fr0rcN6R1a9HYrGnUTU176rTZIq2pcsovPd9sms=","ipv6_addr_in":"2a0c:59c0:18::a20f","same_ip":true},{"hostname":"nl-ams-wg-102","location":"nl-ams","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"92.60.40.209","include_in_country":true,"weight":400,"public_key":"uUYbYGKoA6UBh1hfkAz5tAWFv4SmteYC9kWh7/K6Ah0=","ipv6_addr_in":"2a0c:59c0:18::a21f","same_ip":true},{"hostname":"nl-ams-wg-201","location":"nl-ams","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.196.2","include_in_country":true,"weight":400,"public_key":"vt+yTcpxWvH8qiSncd1wSPV/78vt2aE2BBU8ZbG7x1Q=","ipv6_addr_in":"2a02:6ea0:c034:1::a30f","same_ip":true},{"hostname":"nl-ams-wg-202","location":"nl-ams","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.196.15","include_in_country":true,"weight":400,"public_key":"BChJDLOwZu9Q1oH0UcrxcHP6xxHhyRbjrBUsE0e07Vk=","ipv6_addr_in":"2a02:6ea0:c034:2::a31f","same_ip":true},{"hostname":"nl-ams-wg-203","location":"nl-ams","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.196.28","include_in_country":true,"weight":400,"public_key":"M5z8TKjJYpIJ3FXoXy7k58IUaoVro2tWMKSgC5WIqR8=","ipv6_addr_in":"2a02:6ea0:c034:3::a32f","same_ip":true},{"hostname":"no-osl-wg-001","location":"no-osl","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"176.125.235.71","include_in_country":false,"weight":100,"public_key":"jOUZjMq2PWHDzQxu3jPXktYB7EKeFwBzGZx56cTXXQg=","ipv6_addr_in":"2a02:20c8:4124::a01f","same_ip":true},{"hostname":"no-osl-wg-002","location":"no-osl","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"176.125.235.72","include_in_country":false,"weight":100,"public_key":"IhhpKphSFWpwja1P4HBctZ367G3Q53EgdeFGZro29Tc=","ipv6_addr_in":"2a02:20c8:4124::a02f","same_ip":true},{"hostname":"no-osl-wg-003","location":"no-osl","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"176.125.235.73","include_in_country":false,"weight":100,"public_key":"zOBWmQ3BEOZKsYKbj4dC2hQjxCbr3eKa6wGWyEDYbC4=","ipv6_addr_in":"2a02:20c8:4124::a03f","same_ip":true},{"hostname":"no-osl-wg-004","location":"no-osl","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"176.125.235.74","include_in_country":false,"weight":100,"public_key":"veeEoYS9a2T6K8WMs/MvRCdNJG580XbhnLfbFjp3B0M=","ipv6_addr_in":"2a02:20c8:4124::a04f","same_ip":true},{"hostname":"no-osl-wg-005","location":"no-osl","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"178.255.149.140","include_in_country":true,"weight":100,"public_key":"ScQu/AqslSPwpXMIEyimrYZWTIdJJXLLeXrijWOF0SE=","ipv6_addr_in":"2a02:20c8:4124::f401","same_ip":true},{"hostname":"no-osl-wg-006","location":"no-osl","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"178.255.149.165","include_in_country":true,"weight":100,"public_key":"LBlNBTuT7gNEZoAuxO0PTVPpaDuYA7nAeCyMpg9Agyo=","ipv6_addr_in":"2a02:20c8:4124::f501","same_ip":true},{"hostname":"no-svg-wg-001","location":"no-svg","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"194.127.199.2","include_in_country":true,"weight":300,"public_key":"kduYoE/b1mA2Pjszx1CzE4Lktsdc2zsUU8Relul2m2U=","ipv6_addr_in":"2a02:20c8:4120::a01f","same_ip":true},{"hostname":"no-svg-wg-002","location":"no-svg","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"194.127.199.31","include_in_country":true,"weight":300,"public_key":"U9fbFesIIr2HotWdkfMpKyOEPk+RYtE2oYn3KoLmkj4=","ipv6_addr_in":"2a02:20c8:4120::a02f","same_ip":true},{"hostname":"no-svg-wg-003","location":"no-svg","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"194.127.199.62","include_in_country":true,"weight":300,"public_key":"btc4mh3n9jVCW6yikw3cOPct0x3B5cDK+kKnvgCV0S0=","ipv6_addr_in":"2a02:20c8:4120::a03f","same_ip":true},{"hostname":"no-svg-wg-004","location":"no-svg","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"194.127.199.93","include_in_country":true,"weight":300,"public_key":"Fu98PLCZw/FTcQqyTy0vzaepkfxuSLAah7wnafGVO1g=","ipv6_addr_in":"2a02:20c8:4120::a04f","same_ip":true},{"hostname":"nz-akl-wg-301","location":"nz-akl","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.75.11.50","include_in_country":true,"weight":100,"public_key":"BOEOP01bcND1a0zvmOxRHPB/ObgjgPIzBJE5wbm7B0M=","ipv6_addr_in":"2404:f780:5:deb::f001","same_ip":true},{"hostname":"nz-akl-wg-302","location":"nz-akl","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.75.11.66","include_in_country":true,"weight":100,"public_key":"80WGWgFP9q3eU16MuLJISB1fzAu2LM2heschmokVSVU=","ipv6_addr_in":"2404:f780:5:dec::c02f","same_ip":true},{"hostname":"pl-waw-wg-101","location":"pl-waw","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"45.134.212.66","include_in_country":true,"weight":100,"public_key":"fO4beJGkKZxosCZz1qunktieuPyzPnEVKVQNhzanjnA=","ipv6_addr_in":"2a02:6ea0:ce08:1::f001","same_ip":true},{"hostname":"pl-waw-wg-102","location":"pl-waw","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"45.134.212.79","include_in_country":true,"weight":100,"public_key":"nJEWae9GebEY7yJONXQ1j4gbURV4QULjx388woAlbDs=","ipv6_addr_in":"2a02:6ea0:ce08:2::a06f","same_ip":true},{"hostname":"pl-waw-wg-103","location":"pl-waw","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"45.134.212.92","include_in_country":true,"weight":100,"public_key":"07eUtSNhiJ9dQXBmUqFODj0OqhmbKQGbRikIq9f90jM=","ipv6_addr_in":"2a02:6ea0:ce08:3::a07f","same_ip":true},{"hostname":"pl-waw-wg-201","location":"pl-waw","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"45.128.38.226","include_in_country":true,"weight":100,"public_key":"XwFAczY5LdogFwE9soDecXWqywSCDGuRyJhr/0psI00=","ipv6_addr_in":"2a0d:5600:13:67::a01f","same_ip":true},{"hostname":"pl-waw-wg-202","location":"pl-waw","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.144.34","include_in_country":true,"weight":100,"public_key":"nyfOkamv1ryTS62lsmyU96cqI0dtqek84DhyxWgAQGY=","ipv6_addr_in":"2a0d:5600:13:c47::a02f","same_ip":true},{"hostname":"pt-lis-wg-101","location":"pt-lis","active":true,"owned":false,"provider":"ptisp","stboot":true,"ipv4_addr_in":"94.46.24.33","include_in_country":true,"weight":100,"public_key":"xL7uaEPI7KV3aNPELKpGjVxBCq0yiAc376iS/MRDo3Y=","ipv6_addr_in":"2a00:1651:0:4000::a01f","same_ip":true},{"hostname":"pt-lis-wg-102","location":"pt-lis","active":true,"owned":false,"provider":"ptisp","stboot":true,"ipv4_addr_in":"94.46.24.49","include_in_country":true,"weight":100,"public_key":"ZOa0Yjuak3i8PEfYTwB4UoZtVGnN6+U55vaIw7W7hwA=","ipv6_addr_in":"2a00:1651:0:4001::a02f","same_ip":true},{"hostname":"pt-lis-wg-201","location":"pt-lis","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.88.20.206","include_in_country":true,"weight":100,"public_key":"JCAe7D/owe11Ii2rhpIKhGZvP/V1P1cVZwZAjpSRqmc=","ipv6_addr_in":"2a02:6ea0:fb01:1::f001","same_ip":true},{"hostname":"pt-lis-wg-202","location":"pt-lis","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.88.20.193","include_in_country":true,"weight":100,"public_key":"5P4CQYQeSozk/3KQZh/kl7tUMFGgRB60Ttx6x2nh+F8=","ipv6_addr_in":"2a02:6ea0:fb01:2::f002","same_ip":true},{"hostname":"ro-buh-wg-001","location":"ro-buh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.124.130","include_in_country":true,"weight":100,"public_key":"xpKhRTf9JI269S2PujLbrJm1TwIe67HD5CLe+sP4tUU=","ipv6_addr_in":"2a04:9dc0:0:133::a01f","same_ip":true},{"hostname":"ro-buh-wg-002","location":"ro-buh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.124.194","include_in_country":true,"weight":100,"public_key":"Ekc3+qU88FuMfkEMyLlgRqDYv+WHJvUsfOMI/C0ydE4=","ipv6_addr_in":"2a04:9dc0:0:135::f001","same_ip":true},{"hostname":"rs-beg-wg-101","location":"rs-beg","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.193.2","include_in_country":true,"weight":100,"public_key":"Orrce1127WpljZa+xKbF21zJkJ9wM1M3VJ5GJ/UsIDU=","ipv6_addr_in":"2001:ac8:7d:37::a01f","same_ip":true},{"hostname":"rs-beg-wg-102","location":"rs-beg","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.193.66","include_in_country":true,"weight":100,"public_key":"35lawt+YUx10ELTFhZhg4/xzXRmjxCl/j1O4RK5d60M=","ipv6_addr_in":"2001:ac8:7d:38::a02f","same_ip":true},{"hostname":"se-got-wg-001","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.66","include_in_country":true,"weight":100,"public_key":"5JMPeO7gXIbR5CnUa/NPNK4L5GqUnreF0/Bozai4pl4=","ipv6_addr_in":"2a03:1b20:5:f011:31::a03f","same_ip":true},{"hostname":"se-got-wg-002","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.67","include_in_country":true,"weight":100,"public_key":"AtvE5KdPeQtOcE2QyXaPt9eQoBV3GBxzimQ2FIuGQ2U=","ipv6_addr_in":"2a03:1b20:5:f011::a05f","same_ip":true},{"hostname":"se-got-wg-003","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.68","include_in_country":true,"weight":100,"public_key":"BLNHNoGO88LjV/wDBa7CUUwUzPq/fO2UwcGLy56hKy4=","ipv6_addr_in":"2a03:1b20:5:f011::a09f","same_ip":true},{"hostname":"se-got-wg-004","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.69","include_in_country":true,"weight":100,"public_key":"veGD6/aEY6sMfN3Ls7YWPmNgu3AheO7nQqsFT47YSws=","ipv6_addr_in":"2a03:1b20:5:f011::a10f","same_ip":true},{"hostname":"se-got-wg-101","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.70","include_in_country":true,"weight":100,"public_key":"B8UVAeNkAW4NiGHd1lpl933Drh4y7pMqpXJpH0SrGjQ=","ipv6_addr_in":"2a03:1b20:5:f011::aaaf","same_ip":true},{"hostname":"se-mma-wg-001","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.138.218.220","include_in_country":true,"weight":100,"public_key":"Qn1QaXYTJJSmJSMw18CGdnFiVM0/Gj/15OdkxbXCSG0=","ipv6_addr_in":"2a03:1b20:1:f410::a01f","same_ip":true},{"hostname":"se-mma-wg-002","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.138.218.80","include_in_country":true,"weight":100,"public_key":"5y66WShsFXqM5K7/4CPEGCWfk7PQyNhVBT2ILjbGm2I=","ipv6_addr_in":"2a03:1b20:1:f410::a15f","same_ip":true},{"hostname":"se-mma-wg-003","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.138.218.83","include_in_country":true,"weight":100,"public_key":"fZFAcd8vqWOBpRqlXifsjzGf16gMTg2GuwKyZtkG6UU=","ipv6_addr_in":"2a03:1b20:1:f410::a18f","same_ip":true},{"hostname":"se-mma-wg-004","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.138.218.130","include_in_country":true,"weight":100,"public_key":"m4jnogFbACz7LByjo++8z5+1WV0BuR1T7E1OWA+n8h0=","ipv6_addr_in":"2a03:1b20:1:f410:40::a04f","same_ip":true},{"hostname":"se-mma-wg-005","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.138.218.82","include_in_country":true,"weight":100,"public_key":"qnJrQEf2JiDHMnMWFFxWz8I9NREockylVgYVE95s72s=","ipv6_addr_in":"2a03:1b20:1:f410::a17f","same_ip":true},{"hostname":"se-mma-wg-101","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"45.83.220.68","include_in_country":true,"weight":100,"public_key":"7ncbaCb+9za3jnXlR95I6dJBkwL1ABB5i4ndFUesYxE=","ipv6_addr_in":"2a03:1b20:1:e011::a21f","same_ip":true},{"hostname":"se-mma-wg-102","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"45.83.220.69","include_in_country":true,"weight":100,"public_key":"cwglRdgLQ4gMG36TIYlc5OIemLNrYs4UM1KTc8mnzxk=","ipv6_addr_in":"2a03:1b20:1:e011::a22f","same_ip":true},{"hostname":"se-mma-wg-103","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"45.83.220.70","include_in_country":true,"weight":100,"public_key":"XscA5gebj51nmhAr6o+aUCnMHWGjbS1Gvvd0tuLRiFE=","ipv6_addr_in":"2a03:1b20:1:e011::a23f","same_ip":true},{"hostname":"se-sto-wg-001","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.195.233.76","include_in_country":true,"weight":100,"public_key":"MkP/Jytkg51/Y/EostONjIN6YaFRpsAYiNKMX27/CAY=","ipv6_addr_in":"2a03:1b20:4:f011::999f","same_ip":true},{"hostname":"se-sto-wg-002","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.135.67","include_in_country":true,"weight":100,"public_key":"q2ZZPfumPaRVl4DJfzNdQF/GHfe6BYAzQ2GZZHb6rmI=","ipv6_addr_in":"2a03:1b20:4:f011::a02f","same_ip":true},{"hostname":"se-sto-wg-003","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.135.68","include_in_country":true,"weight":100,"public_key":"qZbwfoY4LHhDPzUROFbG+LqOjB0+Odwjg/Nv3kGolWc=","ipv6_addr_in":"2a03:1b20:4:f011::f201","same_ip":true},{"hostname":"se-sto-wg-004","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.135.69","include_in_country":true,"weight":100,"public_key":"94qIvXgF0OXZ4IcquoS7AO57OV6JswUFgdONgGiq+jo=","ipv6_addr_in":"2a03:1b20:4:f011::f301","same_ip":true},{"hostname":"se-sto-wg-005","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.135.72","include_in_country":true,"weight":100,"public_key":"5rVa0M13oMNobMY7ToAMU1L/Mox7AYACvV+nfsE7zF0=","ipv6_addr_in":"2a03:1b20:4:f011::f401","same_ip":true},{"hostname":"se-sto-wg-006","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.135.73","include_in_country":true,"weight":100,"public_key":"5WNG/KKCtgF4+49e/4iqvHVY/i+6dzUmVKXcJj7zi3I=","ipv6_addr_in":"2a03:1b20:4:f011::f501","same_ip":true},{"hostname":"se-sto-wg-008","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.135.71","include_in_country":true,"weight":100,"public_key":"4nOXEaCDYBV//nsVXk7MrnHpxLV9MbGjt+IGQY//p3k=","ipv6_addr_in":"2a03:1b20:4:f011::f701","same_ip":true},{"hostname":"se-sto-wg-009","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.195.233.69","include_in_country":true,"weight":100,"public_key":"t1XlQD7rER0JUPrmh3R5IpxjUP9YOqodJAwfRorNxl4=","ipv6_addr_in":"2a03:1b20:4:f011::a09f","same_ip":true},{"hostname":"se-sto-wg-010","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.195.233.70","include_in_country":true,"weight":100,"public_key":"zWh5JzqxNhaJ7tMFDRkj9etq6rqRZrUhv156lG6H+Vc=","ipv6_addr_in":"2a03:1b20:4:f011::a10f","same_ip":true},{"hostname":"se-sto-wg-011","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.195.233.71","include_in_country":true,"weight":100,"public_key":"GqKpm8VwKJQLQEQ0PXbkRueY9hDqiMibr+EpW3n9syk=","ipv6_addr_in":"2a03:1b20:4:f011::a11f","same_ip":true},{"hostname":"se-sto-wg-012","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.195.233.66","include_in_country":true,"weight":100,"public_key":"1493vtFUbIfSpQKRBki/1d0YgWIQwMV4AQAvGxjCNVM=","ipv6_addr_in":"2a03:1b20:4:f011::fb01","same_ip":true},{"hostname":"se-sto-wg-014","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.195.233.68","include_in_country":true,"weight":100,"public_key":"DYlwUsH63DLjEfKC9yq7P+FoQx99WdKvZGGhXoUZVgk=","ipv6_addr_in":"2a03:1b20:4:f011::fd01","same_ip":true},{"hostname":"sg-sin-wg-001","location":"sg-sin","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.60.2","include_in_country":true,"weight":100,"public_key":"sFHv/qzG7b6ds5pow+oAR3G5Wqp9eFbBD3BmEGBuUWU=","ipv6_addr_in":"2a02:6ea0:d13e:1::a09f","same_ip":true},{"hostname":"sg-sin-wg-002","location":"sg-sin","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.60.15","include_in_country":true,"weight":100,"public_key":"WM5I4IFwQcVysM4fF4NXZtQXNrSkqVWkQxNPPygOiF0=","ipv6_addr_in":"2a02:6ea0:d13e:2::a10f","same_ip":true},{"hostname":"sg-sin-wg-003","location":"sg-sin","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.60.28","include_in_country":true,"weight":100,"public_key":"3HtGdhEXUPKQIDRW49wCUoTK2ZXfq+QfzjfYoldNchg=","ipv6_addr_in":"2a02:6ea0:d13e:3::a11f","same_ip":true},{"hostname":"sg-sin-wg-101","location":"sg-sin","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.199.194","include_in_country":true,"weight":100,"public_key":"KB6ZA1PAixd74c+mO0VBY4j7LaitK8B4L1APbFIQyQ0=","ipv6_addr_in":"2a0d:5600:d:44::a01f","same_ip":true},{"hostname":"sg-sin-wg-102","location":"sg-sin","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.199.130","include_in_country":true,"weight":100,"public_key":"qrhHOwk0ree+LFxW6htvGEfVFuhM2efQ/M+4p0sx/gA=","ipv6_addr_in":"2a0d:5600:d:43::a02f","same_ip":true},{"hostname":"sk-bts-wg-001","location":"sk-bts","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.34.129","include_in_country":true,"weight":100,"public_key":"QEVIaIycN8p5twXCuZeQTEj9utozakw/MU8H6+/whls=","ipv6_addr_in":"2a02:6ea0:2901:1::f001","same_ip":true},{"hostname":"sk-bts-wg-002","location":"sk-bts","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.34.143","include_in_country":true,"weight":100,"public_key":"JeEuObwimNmoVtPn4kpMI1y1UM+IChGVBLtmP3CNNVQ=","ipv6_addr_in":"2a02:6ea0:2901::a02f","same_ip":true},{"hostname":"ua-iev-wg-001","location":"ua-iev","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.102.240.79","include_in_country":true,"weight":100,"public_key":"PO2o3ewguPP24wLy8bbDqx1xuAnTOIVzdzVGVT0d8kU=","ipv6_addr_in":"2a02:6ea0:e109:2::a01f","same_ip":true},{"hostname":"ua-iev-wg-002","location":"ua-iev","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.102.240.66","include_in_country":true,"weight":100,"public_key":"HUj/J8Rxx7QVGh3kJsFgPZoqtm2BQIX03vKJSIyTOSo=","ipv6_addr_in":"2a02:6ea0:e109:1::a02f","same_ip":true},{"hostname":"us-atl-wg-001","location":"us-atl","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"45.134.140.130","include_in_country":true,"weight":100,"public_key":"nvyBkaEXHwyPBAm8spGB0TFzf2W5wPAl8EEuJ0t+bzs=","ipv6_addr_in":"2a02:6ea0:c122:1::b79f","same_ip":true},{"hostname":"us-atl-wg-002","location":"us-atl","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"45.134.140.143","include_in_country":true,"weight":100,"public_key":"ECeGYeh8CfPJO3v56ucCDdl+PlKcj2bBszUGkT+hVWQ=","ipv6_addr_in":"2a02:6ea0:c122:2::b80f","same_ip":true},{"hostname":"us-atl-wg-101","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.231","include_in_country":false,"weight":1,"public_key":"MNUf9CYsmf72git8MGzui3kplclyPP6xAS6sz3JT2F8=","ipv6_addr_in":"2607:f7a0:1:d::f001","same_ip":true},{"hostname":"us-atl-wg-102","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.232","include_in_country":false,"weight":1,"public_key":"RFHvvrw6/3qnwsH89GMYm7xdJA72MPSpXI+WPk7sNwk=","ipv6_addr_in":"2607:f7a0:1:d::f101","same_ip":true},{"hostname":"us-atl-wg-103","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.233","include_in_country":false,"weight":1,"public_key":"u3X1bahP8G2MNUJ57ImYx5pvADVhI9YmCsWlTULAQnw=","ipv6_addr_in":"2607:f7a0:1:d::f201","same_ip":true},{"hostname":"us-atl-wg-104","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.234","include_in_country":false,"weight":1,"public_key":"bY+7UNjd1zhZ4GSV9YlarYxB7fl5dhKEyJHaJ3iZg3g=","ipv6_addr_in":"2607:f7a0:1:d::b70f","same_ip":true},{"hostname":"us-atl-wg-105","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.235","include_in_country":false,"weight":1,"public_key":"QEz7T4HN99SCFuWRJA3MJL8B7WnmbdVcM2t5CDe0BQw=","ipv6_addr_in":"2607:f7a0:1:d::b71f","same_ip":true},{"hostname":"us-atl-wg-106","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.236","include_in_country":false,"weight":1,"public_key":"s60zDaHwztfLhcrcQXIMhXgTAI1KAUT2osA7k3LSHDE=","ipv6_addr_in":"2607:f7a0:1:d::b72f","same_ip":true},{"hostname":"us-atl-wg-107","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.237","include_in_country":false,"weight":1,"public_key":"IbkH8hULcFgUEt/OBXamWI2IotlbYJMyAcAhSTbtD1o=","ipv6_addr_in":"2607:f7a0:1:d::f601","same_ip":true},{"hostname":"us-atl-wg-108","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.238","include_in_country":false,"weight":1,"public_key":"/38SXpa6r80z/CHrPHDW5uTaXa3Xj0U8hIztCEV4q3I=","ipv6_addr_in":"2607:f7a0:1:d::f701","same_ip":true},{"hostname":"us-atl-wg-109","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.239","include_in_country":false,"weight":1,"public_key":"n2FGxqt/MhTrHKQyoguto+2s6lTPskTwOsCX9jGHzW0=","ipv6_addr_in":"2607:f7a0:1:d::b75f","same_ip":true},{"hostname":"us-atl-wg-110","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.240","include_in_country":false,"weight":1,"public_key":"bjy5pU9WbGfAfnwjI+IajrgYwbbGlTk4xHimTpDQ/HY=","ipv6_addr_in":"2607:f7a0:1:d::f901","same_ip":true},{"hostname":"us-atl-wg-201","location":"us-atl","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"107.150.22.2","include_in_country":false,"weight":100,"public_key":"BbW2Gm4IZEW8CrEIg71jZC9pztA/J4h1PK9lwq57ewE=","ipv6_addr_in":"2607:fcd0:aa80:1304::f001","same_ip":true},{"hostname":"us-atl-wg-202","location":"us-atl","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"104.129.24.98","include_in_country":false,"weight":100,"public_key":"Qnb6TdDA7IkTIISJ40W+6rZA81pb0v4D0jRZRTYNQnQ=","ipv6_addr_in":"2607:fcd0:aa80:1302::f001","same_ip":true},{"hostname":"us-atl-wg-203","location":"us-atl","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"104.129.24.114","include_in_country":false,"weight":100,"public_key":"nZQvI+2ZzDC2titokjWcojbjvn4bxHrhUzg1UK/K0nc=","ipv6_addr_in":"2607:fcd0:aa80:1303::b34f","same_ip":true},{"hostname":"us-atl-wg-204","location":"us-atl","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"104.223.91.18","include_in_country":false,"weight":100,"public_key":"rlZyrKRSLfvjUBpYD2jUkWhdWkB1RnRr+Q4bv9+nvD8=","ipv6_addr_in":"2607:fcd0:aa80:1305::b43f","same_ip":true},{"hostname":"us-bos-wg-001","location":"us-bos","active":true,"owned":false,"provider":"HostRoyale","stboot":true,"ipv4_addr_in":"43.225.189.131","include_in_country":true,"weight":100,"public_key":"CsysTnZ0HvyYRjsKMPx60JIgy777JhD0h9WpbHbV83o=","ipv6_addr_in":"2a06:3040:12:610::a01f","same_ip":true},{"hostname":"us-bos-wg-002","location":"us-bos","active":true,"owned":false,"provider":"HostRoyale","stboot":true,"ipv4_addr_in":"43.225.189.162","include_in_country":true,"weight":100,"public_key":"LLkA2XSBvfUeXgLdMKP+OTQeKhtGB03kKskJEwlzAE8=","ipv6_addr_in":"2a06:3040:12:610::a02f","same_ip":true},{"hostname":"us-bos-wg-101","location":"us-bos","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.40.50.98","include_in_country":true,"weight":100,"public_key":"oxJ2PIqrQOmS0uiyXvnxT64E1uZnjZDWPbP/+APToAE=","ipv6_addr_in":"2a02:6ea0:f901::a01f","same_ip":true},{"hostname":"us-bos-wg-102","location":"us-bos","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.40.50.112","include_in_country":true,"weight":100,"public_key":"wcmmadJObux2/62ES+QbIO21BkU7p2I0s6n4WNZZgW0=","ipv6_addr_in":"2a02:6ea0:f901:1::a02f","same_ip":true},{"hostname":"us-chi-wg-001","location":"us-chi","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"68.235.44.2","include_in_country":false,"weight":100,"public_key":"T5aabskeYCd5dn81c3jOKVxGWQSLwpqHSHf6wButSgw=","ipv6_addr_in":"2607:9000:0:56::a01f","same_ip":true},{"hostname":"us-chi-wg-002","location":"us-chi","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"68.235.43.130","include_in_country":false,"weight":100,"public_key":"dr0ORuPoV9TYY6G5cM00cOoO72wfUC7Lmni7+Az9m0Y=","ipv6_addr_in":"2607:9000:0:54::a02f","same_ip":true},{"hostname":"us-chi-wg-003","location":"us-chi","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"68.235.44.34","include_in_country":false,"weight":100,"public_key":"VY5Dos3WeCyI1Jb8Z+KhB4YlEKZmrQeSNcP0WCrzk2I=","ipv6_addr_in":"2607:9000:0:57::a03f","same_ip":true},{"hostname":"us-chi-wg-004","location":"us-chi","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"68.235.43.162","include_in_country":false,"weight":100,"public_key":"Na8m5Z3O6kwtLFPsign+JPlLoFm/Q3eBdIMI08psSzg=","ipv6_addr_in":"2607:9000:0:55::a04f","same_ip":true},{"hostname":"us-chi-wg-005","location":"us-chi","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"68.235.44.66","include_in_country":false,"weight":100,"public_key":"X50kEMmdPc50SYWFaDFNOAMzUYnCZv3rxzw2Y6BqOyk=","ipv6_addr_in":"2607:9000:0:58::a05f","same_ip":true},{"hostname":"us-chi-wg-006","location":"us-chi","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"68.235.44.98","include_in_country":false,"weight":100,"public_key":"01KgzQY+pT7Q+GPUa1ijj0YgdN5owMaK9ViRZO4dIWo=","ipv6_addr_in":"2607:9000:0:59::a06f","same_ip":true},{"hostname":"us-chi-wg-101","location":"us-chi","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"66.63.167.114","include_in_country":false,"weight":50,"public_key":"P1Y04kVMViwZrMhjcX8fDmuVWoKl3xm2Hv/aQOmPWH0=","ipv6_addr_in":"2607:fcd0:bb80:403::b32f","same_ip":true},{"hostname":"us-chi-wg-102","location":"us-chi","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"66.63.167.194","include_in_country":false,"weight":50,"public_key":"6CwMg2aoKNSFFcIsW3R3SY5T6fBYwoRFifl8ZVlw+Vg=","ipv6_addr_in":"2607:fcd0:bb80:402::f001","same_ip":true},{"hostname":"us-chi-wg-104","location":"us-chi","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"66.63.167.146","include_in_country":true,"weight":50,"public_key":"/WirOQ8FNF9tD1+/MYgIAWpjFKiJYhJJ7/w2QmKBrVo=","ipv6_addr_in":"2607:fcd0:bb80:405::f001","same_ip":true},{"hostname":"us-chi-wg-201","location":"us-chi","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"87.249.134.1","include_in_country":true,"weight":100,"public_key":"+Xx2mJnoJ+JS11Z6g8mp6aUZV7p6DAN9ZTAzPaHakhM=","ipv6_addr_in":"2a02:6ea0:c61f::b63f","same_ip":true},{"hostname":"us-chi-wg-202","location":"us-chi","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"87.249.134.14","include_in_country":true,"weight":100,"public_key":"rmN4IM0I0gF7V9503/xnQMOLsu9txl8GTqci9dgUO18=","ipv6_addr_in":"2a02:6ea0:c61f:1::b64f","same_ip":true},{"hostname":"us-chi-wg-203","location":"us-chi","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"87.249.134.27","include_in_country":true,"weight":100,"public_key":"V0ilKm3bVqt0rmJ80sP0zSVK4m6O3nADi88IQAL5kjw=","ipv6_addr_in":"2a02:6ea0:c61f:2::f001","same_ip":true},{"hostname":"us-dal-wg-001","location":"us-dal","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.211.66","include_in_country":true,"weight":100,"public_key":"EAzbWMQXxJGsd8j2brhYerGB3t5cPOXqdIDFspDGSng=","ipv6_addr_in":"2001:ac8:9a:76::1f","same_ip":true},{"hostname":"us-dal-wg-002","location":"us-dal","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.211.2","include_in_country":true,"weight":100,"public_key":"OYG1hxzz3kUGpVeGjx9DcCYreMO3S6tZN17iHUK+zDE=","ipv6_addr_in":"2001:ac8:9a:75::2f","same_ip":true},{"hostname":"us-dal-wg-003","location":"us-dal","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.211.130","include_in_country":true,"weight":100,"public_key":"jn/i/ekJOkkRUdMj2I4ViUKd3d/LAdTQ+ICKmBy1tkM=","ipv6_addr_in":"2001:ac8:9a:78::3f","same_ip":true},{"hostname":"us-dal-wg-101","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.8","include_in_country":true,"weight":1,"public_key":"fZXw+9I+tAxRaiYB1tbPYa9EFulu3TJ10SAZoHrS/0U=","ipv6_addr_in":"2606:2e00:8007:1::a30f","same_ip":true},{"hostname":"us-dal-wg-102","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.9","include_in_country":true,"weight":1,"public_key":"C6fRMWc8NehE1Nsn4VTI5RQ1vkAf+nG+IN+jbC1MgSo=","ipv6_addr_in":"2606:2e00:8007:1::a31f","same_ip":true},{"hostname":"us-dal-wg-103","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.10","include_in_country":true,"weight":1,"public_key":"WqCOcFoOHUS5w/7W+psWusNWNLQAQItMHwgBn+zU3V0=","ipv6_addr_in":"2606:2e00:8007:1::a32f","same_ip":true},{"hostname":"us-dal-wg-104","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.11","include_in_country":true,"weight":1,"public_key":"c3OgLZw8kh5k3lqACXIiShPGr8xcIfdrUs+qRW9zmk4=","ipv6_addr_in":"2606:2e00:8007:1::a33f","same_ip":true},{"hostname":"us-dal-wg-105","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.12","include_in_country":true,"weight":1,"public_key":"REvzY8yCTggZmODs3FOjUc4uqwh4w4PCnNr7BV/7ZFw=","ipv6_addr_in":"2606:2e00:8007:1::a34f","same_ip":true},{"hostname":"us-dal-wg-106","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.13","include_in_country":true,"weight":1,"public_key":"k+h3AKF7Lkw5Z2RaCQ7PJzW1zhHZ127XY2YZgKg4mAQ=","ipv6_addr_in":"2606:2e00:8007:1::a35f","same_ip":true},{"hostname":"us-dal-wg-107","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.14","include_in_country":true,"weight":1,"public_key":"Zmv3KbVF3ZSGvkWrFsNx2qGXpaNg0AC2duEwoAVZrRI=","ipv6_addr_in":"2606:2e00:8007:1::a36f","same_ip":true},{"hostname":"us-dal-wg-108","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.15","include_in_country":true,"weight":1,"public_key":"fYuciekV90AUxyJPw2SLOy0Vo73XFS30jBBGIfhvtn4=","ipv6_addr_in":"2606:2e00:8007:1::a37f","same_ip":true},{"hostname":"us-dal-wg-109","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.16","include_in_country":true,"weight":1,"public_key":"ICC/pGgEuhgJ8SZykkKBeXyqNtjHPwSTOo6xXGgMq20=","ipv6_addr_in":"2606:2e00:8007:1::a38f","same_ip":true},{"hostname":"us-dal-wg-110","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.17","include_in_country":true,"weight":1,"public_key":"USDvnCyWR5ka523xnxy9KG4rnw/3i9mBprjjp0FQ1QE=","ipv6_addr_in":"2606:2e00:8007:1::a39f","same_ip":true},{"hostname":"us-dal-wg-301","location":"us-dal","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"96.44.191.130","include_in_country":false,"weight":1,"public_key":"qWBfuOXxbsSk8Pgi9lqAzpebZtCSKHvwL7ifF5iw3lc=","ipv6_addr_in":"2607:fcd0:da80:1803::b35f","same_ip":true},{"hostname":"us-dal-wg-302","location":"us-dal","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"96.44.191.146","include_in_country":false,"weight":1,"public_key":"8M6a88xIRG1d7pRD1qTJKKJVAYjkX6/ls8D8M1A2Zxo=","ipv6_addr_in":"2607:fcd0:da80:1804::f001","same_ip":true},{"hostname":"us-dal-wg-303","location":"us-dal","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"96.44.189.98","include_in_country":false,"weight":1,"public_key":"9sg8LrGRk5XzHfMeAhgp9IbbqD1NKepHQ5FpBDZWOn0=","ipv6_addr_in":"2607:fcd0:da80:1801::c40f","same_ip":true},{"hostname":"us-dal-wg-401","location":"us-dal","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"37.19.200.156","include_in_country":true,"weight":5,"public_key":"xZsnCxFN7pOvx6YlTbi92copdsY5xgekTCp//VUMyhE=","ipv6_addr_in":"2a02:6ea0:d20c:3::b72f","same_ip":true},{"hostname":"us-dal-wg-402","location":"us-dal","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"37.19.200.143","include_in_country":true,"weight":100,"public_key":"sPQEji8BhxuM/Za0Q0/9aWYxyACtQF0qRpzaBLumEzo=","ipv6_addr_in":"2a02:6ea0:d20c:2::b71f","same_ip":true},{"hostname":"us-dal-wg-403","location":"us-dal","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"37.19.200.130","include_in_country":true,"weight":100,"public_key":"4s9JIhxC/D02tosXYYcgrD+pHI+C7oTAFsXzVisKjRs=","ipv6_addr_in":"2a02:6ea0:d20c:1::f001","same_ip":true},{"hostname":"us-den-wg-001","location":"us-den","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.128.194","include_in_country":true,"weight":100,"public_key":"3clcc9092sgEsFGrUfcCBUzT9tN6uy12t77uTmSLqwc=","ipv6_addr_in":"2607:9000:2000:16::f001","same_ip":true},{"hostname":"us-den-wg-002","location":"us-den","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.128.162","include_in_country":true,"weight":100,"public_key":"jh3kAesaULbfC0h7VHwNPiTrz04vPC0Aa4kwRjy2+2Q=","ipv6_addr_in":"2607:9000:2000:15::f001","same_ip":true},{"hostname":"us-den-wg-003","location":"us-den","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.128.130","include_in_country":true,"weight":100,"public_key":"v7CG+wctmTw9LxuWBp3tGARithgbDU7nZZduSefkqzg=","ipv6_addr_in":"2607:9000:2000:14::a46f","same_ip":true},{"hostname":"us-den-wg-101","location":"us-den","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"37.19.210.1","include_in_country":true,"weight":200,"public_key":"74U+9EQrMwVOafgXuSp8eaKG0+p4zjSsDe3J7+ojhx0=","ipv6_addr_in":"2a02:6ea0:d70a::b57f","same_ip":true},{"hostname":"us-den-wg-102","location":"us-den","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"37.19.210.14","include_in_country":true,"weight":200,"public_key":"T44stCRbQXFCBCcpdDbZPlNHp2eZEi91ooyk0JDC21E=","ipv6_addr_in":"2a02:6ea0:d70a:1::b58f","same_ip":true},{"hostname":"us-den-wg-103","location":"us-den","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"37.19.210.27","include_in_country":true,"weight":200,"public_key":"Az+PGHQ0xFElmRBv+PKZuRnEzKPrPtUpRD3vpxb4si4=","ipv6_addr_in":"2a02:6ea0:d70a:2::b59f","same_ip":true},{"hostname":"us-det-wg-001","location":"us-det","active":true,"owned":false,"provider":"HostRoyale","stboot":true,"ipv4_addr_in":"185.141.119.131","include_in_country":true,"weight":100,"public_key":"+USmlxhnLmlNkDnBbu+rXwjUwa383e0ilYEqPkEkNHA=","ipv6_addr_in":"2a06:3040:11:610::f001","same_ip":true},{"hostname":"us-det-wg-002","location":"us-det","active":true,"owned":false,"provider":"HostRoyale","stboot":true,"ipv4_addr_in":"185.141.119.161","include_in_country":true,"weight":100,"public_key":"cYqP1UqhOYuaj47e4jAbgL55h52L+ALjtML26OtBvFU=","ipv6_addr_in":"2a06:3040:11:610::f101","same_ip":true},{"hostname":"us-hou-wg-001","location":"us-hou","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"37.19.221.130","include_in_country":true,"weight":200,"public_key":"NKscQ4mm24nsYWfpL85Cve+BKIExR0JaysldUtVSlzg=","ipv6_addr_in":"2a02:6ea0:e001::f001","same_ip":true},{"hostname":"us-hou-wg-002","location":"us-hou","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"37.19.221.143","include_in_country":true,"weight":200,"public_key":"tzSfoiq9ZbCcE5I0Xz9kCrsWksDn0wgvaz9TiHYTmnU=","ipv6_addr_in":"2a02:6ea0:e001:1::f001","same_ip":true},{"hostname":"us-hou-wg-003","location":"us-hou","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"37.19.221.156","include_in_country":true,"weight":200,"public_key":"fNSu30TCgbADxNKACx+5qWY6XGJOga4COmTZZE0k0R4=","ipv6_addr_in":"2a02:6ea0:e001:2::b55f","same_ip":true},{"hostname":"us-hou-wg-004","location":"us-hou","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"37.19.221.169","include_in_country":true,"weight":200,"public_key":"NkZMYUEcHykPkAFdm3dE8l2U9P2mt58Dw6j6BWhzaCc=","ipv6_addr_in":"2a02:6ea0:e001:3::b56f","same_ip":true},{"hostname":"us-lax-wg-101","location":"us-lax","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.129.98","include_in_country":true,"weight":6,"public_key":"IDXrg8s0qYFAWcMcXFb6P/EHOESkTyotZCSlerQfyCQ=","ipv6_addr_in":"2607:9000:3000:15::a49f","same_ip":true},{"hostname":"us-lax-wg-102","location":"us-lax","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.129.66","include_in_country":true,"weight":6,"public_key":"Ldwvbs6mOxEbpXLRA3Z/qmEyJo2wVTdQ94+v3UFsbBw=","ipv6_addr_in":"2607:9000:3000:14::a50f","same_ip":true},{"hostname":"us-lax-wg-103","location":"us-lax","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.129.34","include_in_country":true,"weight":6,"public_key":"gabX4D/Yhut0IMl/9jRK+kMoHbkL38qaUm7r/dH5rWg=","ipv6_addr_in":"2607:9000:3000:13::a51f","same_ip":true},{"hostname":"us-lax-wg-201","location":"us-lax","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.203.2","include_in_country":false,"weight":1,"public_key":"xWobY7DWTL+vL1yD4NWwbQ3V4e8qz10Yz+EFdkIjq0Y=","ipv6_addr_in":"2a02:6ea0:c859:1::a01f","same_ip":true},{"hostname":"us-lax-wg-202","location":"us-lax","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.203.15","include_in_country":false,"weight":1,"public_key":"SDnciTlujuy2APFTkhzfq5X+LDi+lhfU38wI2HBCxxs=","ipv6_addr_in":"2a02:6ea0:c859:2::a02f","same_ip":true},{"hostname":"us-lax-wg-203","location":"us-lax","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.203.28","include_in_country":false,"weight":1,"public_key":"W6/Yamxmfx3geWTwwtBbJe/J8UdEzOfa6M+cEpNPIwg=","ipv6_addr_in":"2a02:6ea0:c859:3::a03f","same_ip":true},{"hostname":"us-lax-wg-301","location":"us-lax","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"198.96.89.194","include_in_country":false,"weight":1,"public_key":"U4uhpKZm/G1i/qU6s0puSuI+UL4bNCWTuiZBJ8Hdi1Y=","ipv6_addr_in":"2607:fcd0:100:7c03::f001","same_ip":true},{"hostname":"us-lax-wg-302","location":"us-lax","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"204.152.216.98","include_in_country":false,"weight":1,"public_key":"Ey0LihLvJ0YnkMLXK+Kcb4SniJiqoavQuASdRRFASXw=","ipv6_addr_in":"2607:fcd0:100:7c01::b29f","same_ip":true},{"hostname":"us-lax-wg-303","location":"us-lax","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"204.152.216.114","include_in_country":false,"weight":1,"public_key":"AcExK2CiCHYWU6Sft49uYnLUhIZiId1M+ISzupOJznI=","ipv6_addr_in":"2607:fcd0:100:7c02::b30f","same_ip":true},{"hostname":"us-lax-wg-401","location":"us-lax","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.173.2","include_in_country":true,"weight":100,"public_key":"KX+59wAvZwSKv/MVHsFVQS1j9Loaol0c8oOI/BGf3Bk=","ipv6_addr_in":"2a0d:5600:8:4::d1f","same_ip":true},{"hostname":"us-lax-wg-402","location":"us-lax","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.173.66","include_in_country":true,"weight":100,"public_key":"EKZXvHlSDeqAjfC/m9aQR0oXfQ6Idgffa9L0DH5yaCo=","ipv6_addr_in":"2a0d:5600:8:6::d2f","same_ip":true},{"hostname":"us-lax-wg-403","location":"us-lax","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.173.130","include_in_country":true,"weight":100,"public_key":"mBqaWs6pti93U+1feyj6LRzzveNmeklancn3XuKoPWI=","ipv6_addr_in":"2a0d:5600:8:d::d3f","same_ip":true},{"hostname":"us-lax-wg-404","location":"us-lax","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.173.194","include_in_country":true,"weight":100,"public_key":"YGl+lj1tk08U9x9Z73zowUW3rk8i0nPmYkxGzNdE4VM=","ipv6_addr_in":"2a0d:5600:8:2f::f001","same_ip":true},{"hostname":"us-lax-wg-405","location":"us-lax","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.172.2","include_in_country":true,"weight":100,"public_key":"Pe86fNGUd+AIeaabsn7Hk4clQf1kJvxOXPykfVGjeho=","ipv6_addr_in":"2a0d:5600:8:37::f001","same_ip":true},{"hostname":"us-lax-wg-501","location":"us-lax","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"23.162.40.4","include_in_country":true,"weight":100,"public_key":"IHFvbxyz7qK6x811dNNf0rs1MFLaZwW9C3FNwOLz6hY=","ipv6_addr_in":"2602:fa19:4::f001","same_ip":true},{"hostname":"us-lax-wg-502","location":"us-lax","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"23.162.40.45","include_in_country":true,"weight":100,"public_key":"L3P0XU2RveHw0l845ME8X24xy3oOTMr9pTHkNo8Aw10=","ipv6_addr_in":"2602:fa19:4::f101","same_ip":true},{"hostname":"us-lax-wg-503","location":"us-lax","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"23.162.40.86","include_in_country":true,"weight":100,"public_key":"tzDBizpxIHNLPvVdW3pop65cwWNkL73Gam3DUxHDfns=","ipv6_addr_in":"2602:fa19:4::f201","same_ip":true},{"hostname":"us-mia-wg-001","location":"us-mia","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"45.134.142.219","include_in_country":true,"weight":5,"public_key":"FVEKAMJqaJU2AwWn5Mg9TK9IAfJc4XDUmSzEeC/VXGs=","ipv6_addr_in":"2a02:6ea0:cc1f:2::b62f","same_ip":true},{"hostname":"us-mia-wg-002","location":"us-mia","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"45.134.142.206","include_in_country":true,"weight":200,"public_key":"H5t7PsMDnUAHrR8D2Jt3Mh6N6w43WmCzrOHShlEU+zw=","ipv6_addr_in":"2a02:6ea0:cc1f:1::b61f","same_ip":true},{"hostname":"us-mia-wg-003","location":"us-mia","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"45.134.142.193","include_in_country":true,"weight":200,"public_key":"N/3F0QvCuiWWzCwaJmnPZO53LZrKn6sr7rItecrQSQY=","ipv6_addr_in":"2a02:6ea0:cc1f::f001","same_ip":true},{"hostname":"us-mia-wg-101","location":"us-mia","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.187.2","include_in_country":true,"weight":100,"public_key":"50/sEK7t3on/H2sunx+gzIjJI6E9/Y6gHOHQrvzsij4=","ipv6_addr_in":"2a0d:5600:6:104::a01f","same_ip":true},{"hostname":"us-mia-wg-102","location":"us-mia","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.187.66","include_in_country":true,"weight":100,"public_key":"sJw9LzH2sunqRes2FNi8l6+bd8jqFAiYFfUGTbCXlA4=","ipv6_addr_in":"2a0d:5600:6:105::f001","same_ip":true},{"hostname":"us-mia-wg-103","location":"us-mia","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.187.130","include_in_country":true,"weight":100,"public_key":"TpPDIhObMTeoMVx0MvSstQaIH1EfRYqW2vzGTB+ETVk=","ipv6_addr_in":"2a0d:5600:6:106::f001","same_ip":true},{"hostname":"us-mia-wg-301","location":"us-mia","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"173.44.63.66","include_in_country":false,"weight":10,"public_key":"nCr87vBNEwrERnkcDhWENNVIMaLF+C0p3h9nqwguO2g=","ipv6_addr_in":"2607:ff48:aa81:2602::b25f","same_ip":true},{"hostname":"us-mia-wg-302","location":"us-mia","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"104.129.41.194","include_in_country":true,"weight":10,"public_key":"voRd3Wi8W4kaEMIJMy7IBkpkAVxQkYF0VubbK1+zgR8=","ipv6_addr_in":"2607:ff48:aa81:2603::b26f","same_ip":true},{"hostname":"us-nyc-wg-301","location":"us-nyc","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"143.244.47.65","include_in_country":true,"weight":100,"public_key":"IzqkjVCdJYC1AShILfzebchTlKCqVCt/SMEXolaS3Uc=","ipv6_addr_in":"2a02:6ea0:c43f::f001","same_ip":true},{"hostname":"us-nyc-wg-302","location":"us-nyc","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"143.244.47.78","include_in_country":true,"weight":100,"public_key":"gH/fZJwc9iLv9fazk09J/DUWT2X7/LFXijRS15e2n34=","ipv6_addr_in":"2a02:6ea0:c43f:1::f001","same_ip":true},{"hostname":"us-nyc-wg-303","location":"us-nyc","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"143.244.47.91","include_in_country":true,"weight":100,"public_key":"KRO+RzrFV92Ah+qpHgAMKZH2jtjRlmJ4ayl0gletY3c=","ipv6_addr_in":"2a02:6ea0:c43f:2::b52f","same_ip":true},{"hostname":"us-nyc-wg-401","location":"us-nyc","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.136.34","include_in_country":true,"weight":1,"public_key":"4oR0oc3cyktCoQ1eygZ/EZeCNeI6eQnQJNRuBmRne2Q=","ipv6_addr_in":"2607:9000:a000:12::f001","same_ip":true},{"hostname":"us-nyc-wg-402","location":"us-nyc","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.136.66","include_in_country":true,"weight":1,"public_key":"/o79urfCcNSCTD4OCPNxn6qoWMchQ5Za6p6hf5cxmwE=","ipv6_addr_in":"2607:9000:a000:13::f001","same_ip":true},{"hostname":"us-nyc-wg-403","location":"us-nyc","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.136.98","include_in_country":true,"weight":1,"public_key":"pFM95uwAFj62uYDkJXcAPYaPmy+nl+dd92ZLV9bWbHQ=","ipv6_addr_in":"2607:9000:a000:14::f001","same_ip":true},{"hostname":"us-nyc-wg-404","location":"us-nyc","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.136.194","include_in_country":true,"weight":100,"public_key":"pCZ9NnIgAEwrDy4H/eGz8NvNcbAg7UGFTGYruyCfVwU=","ipv6_addr_in":"2607:9000:a000:17::f001","same_ip":true},{"hostname":"us-nyc-wg-501","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.165.2","include_in_country":true,"weight":100,"public_key":"FMNXnFgDHNTrT9o49U8bb3Z8J90LZzVJPpRzKtJM9W8=","ipv6_addr_in":"2a0d:5600:24:2b6::f001","same_ip":true},{"hostname":"us-nyc-wg-502","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.165.130","include_in_country":true,"weight":100,"public_key":"cmUR4g9aIFDa5Xnp4B6Zjyp20jwgTTMgBdhcdvDV0FM=","ipv6_addr_in":"2a0d:5600:24:2b8::f001","same_ip":true},{"hostname":"us-nyc-wg-503","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.165.194","include_in_country":true,"weight":100,"public_key":"czE6NJ8CccA5jnJkKoZGDpMXFqSudeVTzxU5scLP/H8=","ipv6_addr_in":"2a0d:5600:24:2b9::f001","same_ip":true},{"hostname":"us-nyc-wg-504","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.166.130","include_in_country":true,"weight":100,"public_key":"MVa5yuoYnjXJtSCeBsyvaemuaK4KFN1p78+37Nvm2m0=","ipv6_addr_in":"2a0d:5600:24:2c2::f001","same_ip":true},{"hostname":"us-nyc-wg-505","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.166.194","include_in_country":true,"weight":100,"public_key":"jrjogHbVDuPxyloBldvtB51TmebNJo+4rW2JFrN33iM=","ipv6_addr_in":"2a0d:5600:24:2c3::f001","same_ip":true},{"hostname":"us-nyc-wg-601","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.185.2","include_in_country":true,"weight":100,"public_key":"OKyEPafS1lnUTWqtVeWElkTzcmkvLi9dncBHbSyFrH8=","ipv6_addr_in":"2a0d:5600:24:136a::f001","same_ip":true},{"hostname":"us-nyc-wg-602","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.168.130","include_in_country":true,"weight":100,"public_key":"4Lg7yQlukAMp6EX+2Ap+q4O+QIV/OEZyybtFJmN9umw=","ipv6_addr_in":"2a0d:5600:24:1378::f001","same_ip":true},{"hostname":"us-nyc-wg-603","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.168.66","include_in_country":true,"weight":100,"public_key":"s3N8Xeh6khECbgRYPk9pp5slw2uE0deOxa9rSJ6bzwE=","ipv6_addr_in":"2a0d:5600:24:1377::f001","same_ip":true},{"hostname":"us-nyc-wg-604","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.171.66","include_in_country":true,"weight":100,"public_key":"FIcFPDjxfF24xBrv+W7Bcqb2wADSWd+HAWPKYo6xZEk=","ipv6_addr_in":"2a0d:5600:24:1372::f001","same_ip":true},{"hostname":"us-nyc-wg-605","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.171.130","include_in_country":true,"weight":100,"public_key":"78nFhfPEjrfOxBkUf2ylM7w6upYBEcHXm93sr8CMTE4=","ipv6_addr_in":"2a0d:5600:24:1374::f001","same_ip":true},{"hostname":"us-phx-wg-101","location":"us-phx","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.133.98","include_in_country":true,"weight":5,"public_key":"Tg5LXnudnxEjf6pp7+T0QKCU9K3jzwdA1/l0negOHBk=","ipv6_addr_in":"2607:9000:7000:14::103f","same_ip":true},{"hostname":"us-phx-wg-102","location":"us-phx","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.133.130","include_in_country":true,"weight":1,"public_key":"1BbuYcr+WcmgcUhZTJ48GxOjQW0k4iEYBnn1Axhm1yA=","ipv6_addr_in":"2607:9000:7000:15::b89f","same_ip":true},{"hostname":"us-phx-wg-103","location":"us-phx","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.133.162","include_in_country":true,"weight":5,"public_key":"aEJhNzQJYMH9VzB7bxhimyUFz3uo4mp1RD9VY3KAEWs=","ipv6_addr_in":"2607:9000:7000:16::f001","same_ip":true},{"hostname":"us-qas-wg-001","location":"us-qas","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.135.34","include_in_country":true,"weight":100,"public_key":"UKNLCimke54RqRdj6UFyIuBO6nv2VVpDT3vM9N25VyI=","ipv6_addr_in":"2607:9000:9000:12::b46f","same_ip":true},{"hostname":"us-qas-wg-002","location":"us-qas","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.135.66","include_in_country":true,"weight":100,"public_key":"UUCBSYnGq+zEDqA6Wyse3JXv8fZuqKEgavRZTnCXlBg=","ipv6_addr_in":"2607:9000:9000:13::b47f","same_ip":true},{"hostname":"us-qas-wg-003","location":"us-qas","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.135.98","include_in_country":true,"weight":100,"public_key":"0s0NdIzo+pq0OiHstZHqapYsdevGQGopQ5NM54g/9jo=","ipv6_addr_in":"2607:9000:9000:14::b48f","same_ip":true},{"hostname":"us-qas-wg-004","location":"us-qas","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.135.130","include_in_country":true,"weight":100,"public_key":"TvqnL6VkJbz0KrjtHnUYWvA7zRt9ysI64LjTOx2vmm4=","ipv6_addr_in":"2607:9000:9000:15::b49f","same_ip":true},{"hostname":"us-qas-wg-102","location":"us-qas","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"185.156.46.143","include_in_country":true,"weight":100,"public_key":"5hlEb3AjTzVIJyYWCYvJvbgA4p25Ltfp2cYnys90LQ0=","ipv6_addr_in":"2a02:6ea0:e206:2::a02f","same_ip":true},{"hostname":"us-qas-wg-103","location":"us-qas","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"185.156.46.156","include_in_country":true,"weight":100,"public_key":"oD9IFZsA5sync37K/sekVXaww76MwA3IvDRpR/irZWQ=","ipv6_addr_in":"2a02:6ea0:e206:3::a03f","same_ip":true},{"hostname":"us-rag-wg-101","location":"us-rag","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.130.82","include_in_country":true,"weight":5,"public_key":"tKUaUnY6dJhRx3zCMAFMa1I7baVt5QrpnmdRsW99MWk=","ipv6_addr_in":"2607:9000:4000:15::b83f","same_ip":true},{"hostname":"us-rag-wg-102","location":"us-rag","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.130.98","include_in_country":true,"weight":5,"public_key":"XT06PnP77El1DOWfg5Kq6GiPzzfvQbTFfWlHPws/TQ0=","ipv6_addr_in":"2607:9000:4000:16::b84f","same_ip":true},{"hostname":"us-rag-wg-103","location":"us-rag","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.130.114","include_in_country":true,"weight":5,"public_key":"4xCeK68I0TXZoy1e8VeQDCea/6Qeu57IAtCi8Lnllik=","ipv6_addr_in":"2607:9000:4000:17::b85f","same_ip":true},{"hostname":"us-rag-wg-104","location":"us-rag","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.130.130","include_in_country":true,"weight":5,"public_key":"zSuNvGa8Zk+jc2niP1s75CLTFD/1U1Fqc6ypfzO9mB0=","ipv6_addr_in":"2607:9000:4000:18::f001","same_ip":true},{"hostname":"us-rag-wg-105","location":"us-rag","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.130.146","include_in_country":true,"weight":5,"public_key":"XJDcYZ6peY1cfErhLQ0AqzGTxKuKXz5M//sFvEX8dAI=","ipv6_addr_in":"2607:9000:4000:19::f001","same_ip":true},{"hostname":"us-sea-wg-001","location":"us-sea","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.43.91","include_in_country":true,"weight":20,"public_key":"bZQF7VRDRK/JUJ8L6EFzF/zRw2tsqMRk6FesGtTgsC0=","ipv6_addr_in":"2a02:6ea0:d80b:3::b75f","same_ip":true},{"hostname":"us-sea-wg-002","location":"us-sea","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.43.78","include_in_country":true,"weight":20,"public_key":"Xt80FGN9eLy1vX3F29huj6oW2MnQt7ne3DMBpo525Qw=","ipv6_addr_in":"2a02:6ea0:d80b:2::f001","same_ip":true},{"hostname":"us-sea-wg-003","location":"us-sea","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.43.65","include_in_country":true,"weight":20,"public_key":"4ke8ZSsroiI6Sp23OBbMAU6yQmdF3xU2N8CyzQXE/Qw=","ipv6_addr_in":"2a02:6ea0:d80b:1::b73f","same_ip":true},{"hostname":"us-sea-wg-101","location":"us-sea","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.131.130","include_in_country":true,"weight":20,"public_key":"200em73iD9942d9hlHonAfNXGWwFQcicBVGHeHbdxVM=","ipv6_addr_in":"2607:9000:5000:15::b77f","same_ip":true},{"hostname":"us-sea-wg-102","location":"us-sea","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.131.162","include_in_country":true,"weight":5,"public_key":"YwwaW1/1vFJKp22Je7btEhVXTzTckxMF1qesHN4T3QA=","ipv6_addr_in":"2607:9000:5000:16::b78f","same_ip":true},{"hostname":"us-sea-wg-103","location":"us-sea","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.131.98","include_in_country":true,"weight":20,"public_key":"fU4oTJhFtwvmk0odRe9Jatc+DMh9gKz49WSzO0psCmU=","ipv6_addr_in":"2607:9000:5000:14::b03f","same_ip":true},{"hostname":"us-sea-wg-201","location":"us-sea","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"199.229.250.52","include_in_country":true,"weight":1,"public_key":"K+Xt/lYTSTavIW8RoQjzWI7tExy6sp1FqBi3n5pH5SI=","ipv6_addr_in":"2607:f7a0:c:4::c09f","same_ip":true},{"hostname":"us-sea-wg-202","location":"us-sea","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"199.229.250.53","include_in_country":true,"weight":1,"public_key":"t2x4A+F04hKfxIHMcY2RswaVyj3XHelTT8Q1FAwBIj4=","ipv6_addr_in":"2607:f7a0:c:4::c10f","same_ip":true},{"hostname":"us-sea-wg-203","location":"us-sea","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"199.229.250.54","include_in_country":true,"weight":1,"public_key":"eS44Rs1j3BotLKH8AV78KGZQtsMQKpjdYS9chXdxPnw=","ipv6_addr_in":"2607:f7a0:c:4::c11f","same_ip":true},{"hostname":"us-sea-wg-204","location":"us-sea","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"199.229.250.55","include_in_country":true,"weight":1,"public_key":"WyzaVvsFivIx7iC+bYbEV5OhtjSw3aqjU5sB3DltQxI=","ipv6_addr_in":"2607:f7a0:c:4::f301","same_ip":true},{"hostname":"us-sea-wg-205","location":"us-sea","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"199.229.250.56","include_in_country":true,"weight":1,"public_key":"vnD/2bCGqH4b6zZSRuLGSw9oN4NhQdTW9jlMaa2N1AU=","ipv6_addr_in":"2607:f7a0:c:4::f401","same_ip":true},{"hostname":"us-sea-wg-206","location":"us-sea","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"199.229.250.57","include_in_country":true,"weight":1,"public_key":"1TYUyuvJi+RQETmW3aKJDS5p9K7kutK+Qp4ooy92CBQ=","ipv6_addr_in":"2607:f7a0:c:4::f501","same_ip":true},{"hostname":"us-sea-wg-207","location":"us-sea","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"199.229.250.58","include_in_country":true,"weight":1,"public_key":"mdYjW/giLeamWPUuHxLAIcornNrH/2HQrixhBpQZmHA=","ipv6_addr_in":"2607:f7a0:c:4::f601","same_ip":true},{"hostname":"us-sea-wg-208","location":"us-sea","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"199.229.250.59","include_in_country":true,"weight":1,"public_key":"k4ah0qvHgn5IsalvehE7GPiDC4BOE9botvd+KITdtyg=","ipv6_addr_in":"2607:f7a0:c:4::f701","same_ip":true},{"hostname":"us-sea-wg-301","location":"us-sea","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"104.129.57.66","include_in_country":false,"weight":1,"public_key":"ekaodfDtCmMmHBPWT04FObtHi9uxCn9mI2NB6WAsS0U=","ipv6_addr_in":"2607:fcd0:cd00:a00::b27f","same_ip":true},{"hostname":"us-sea-wg-302","location":"us-sea","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"173.205.93.2","include_in_country":false,"weight":1,"public_key":"Plbre6XhYWgXzdAUD94/gqSy6C9z/nD40U2gIt+MAGQ=","ipv6_addr_in":"2607:fcd0:cd00:a01::b28f","same_ip":true},{"hostname":"us-sjc-wg-001","location":"us-sjc","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.134.98","include_in_country":false,"weight":50,"public_key":"Ow25Pdtyqbv/Y0I0myNixjJ2iljsKcH04PWvtJqbmCk=","ipv6_addr_in":"2607:9000:8000:14::f001","same_ip":true},{"hostname":"us-sjc-wg-002","location":"us-sjc","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.134.130","include_in_country":true,"weight":50,"public_key":"aOt3gFGc0a0UMAdcxhBWX9TCnEabe2s66MHzjXU50Tc=","ipv6_addr_in":"2607:9000:8000:15::b95f","same_ip":true},{"hostname":"us-sjc-wg-003","location":"us-sjc","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.134.162","include_in_country":true,"weight":50,"public_key":"Vim/OUBT3Bogv+FF623pAHXc/vmRwur2JKcNsLHQH1o=","ipv6_addr_in":"2607:9000:8000:16::b96f","same_ip":true},{"hostname":"us-sjc-wg-101","location":"us-sjc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.165.211","include_in_country":true,"weight":1,"public_key":"yohC6MIq62U+BmTdBjTFBQbj5jTaxRHtVdCp5AdDgAs=","ipv6_addr_in":"2607:f7a0:16:5::c01f","same_ip":true},{"hostname":"us-sjc-wg-102","location":"us-sjc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.165.212","include_in_country":true,"weight":1,"public_key":"wfFi5sBBThR9EK1US0dbwaOiuNMIBpBBhEif9EnUeCM=","ipv6_addr_in":"2607:f7a0:16:5::c02f","same_ip":true},{"hostname":"us-sjc-wg-103","location":"us-sjc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.165.213","include_in_country":true,"weight":1,"public_key":"5AsmDtBqLureV4JcG+dwFq35hUaAff4NzLCkJDkoWQQ=","ipv6_addr_in":"2607:f7a0:16:5::c03f","same_ip":true},{"hostname":"us-sjc-wg-104","location":"us-sjc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.165.214","include_in_country":true,"weight":1,"public_key":"fUjjvrtnbokobdzudzXPzCM6Fli28Tsg5kArztU0YnU=","ipv6_addr_in":"2607:f7a0:16:5::c04f","same_ip":true},{"hostname":"us-sjc-wg-105","location":"us-sjc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.165.215","include_in_country":true,"weight":1,"public_key":"m0PSpvahFXuYOtGZ9hFAMErzKW7vhwqyd82rw+yBHz0=","ipv6_addr_in":"2607:f7a0:16:5::f401","same_ip":true},{"hostname":"us-sjc-wg-106","location":"us-sjc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.165.216","include_in_country":true,"weight":1,"public_key":"9xV2ZXE1dVChbxu/ca4jfXoCnYFv8fbP/OCFySD6RjA=","ipv6_addr_in":"2607:f7a0:16:5::f501","same_ip":true},{"hostname":"us-sjc-wg-107","location":"us-sjc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.165.217","include_in_country":true,"weight":1,"public_key":"2p37fAPhw+2uPJ5pP5Iy8hgs7506k+8ITqPIzbaa4zQ=","ipv6_addr_in":"2607:f7a0:16:5::f601","same_ip":true},{"hostname":"us-sjc-wg-108","location":"us-sjc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.165.218","include_in_country":true,"weight":1,"public_key":"x9/CJ28JOHah+HPRKQpVuCLL3v3eMWj7Xa7dotpPX2c=","ipv6_addr_in":"2607:f7a0:16:5::f701","same_ip":true},{"hostname":"us-sjc-wg-301","location":"us-sjc","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"142.147.89.195","include_in_country":true,"weight":100,"public_key":"f3bMFNG3xcXRN/i0jHxo68CXFcNNlennuf1jdkPMEVM=","ipv6_addr_in":"2604:e8c0:7::b66f","same_ip":true},{"hostname":"us-sjc-wg-302","location":"us-sjc","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"142.147.89.210","include_in_country":true,"weight":100,"public_key":"8wVb4HUgmpQEa5a1Q8Ff1hTDTJVaHts487bksJVugEo=","ipv6_addr_in":"2604:e8c0:7::f001","same_ip":true},{"hostname":"us-sjc-wg-303","location":"us-sjc","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"142.147.89.225","include_in_country":true,"weight":100,"public_key":"2ZQTRk/3jT+ccfG3G/QoJV3NFC4CFHQwGBCSokOvBnA=","ipv6_addr_in":"2604:e8c0:7::b68f","same_ip":true},{"hostname":"us-slc-wg-101","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.147","include_in_country":true,"weight":1,"public_key":"dbsApGxL4oNd6CyjPrtiV6ep+C1HaFuYGd0DPCHMF2o=","ipv6_addr_in":"2606:2e00:0:b9::b34f","same_ip":true},{"hostname":"us-slc-wg-102","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.138","include_in_country":true,"weight":1,"public_key":"g6yfZKBIS6BtXdTb5yXXVmOkkQ1OBxxJS3H67mebclw=","ipv6_addr_in":"2606:2e00:0:b9::b35f","same_ip":true},{"hostname":"us-slc-wg-103","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.139","include_in_country":true,"weight":1,"public_key":"ioipHdOYhc4nVsQKghmJy/vvnMI38VLLFNZXWgxxOx8=","ipv6_addr_in":"2606:2e00:0:b9::b36f","same_ip":true},{"hostname":"us-slc-wg-104","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.140","include_in_country":true,"weight":1,"public_key":"8gcGDG4XVifgKgjpkiRSxI4QA0lhU1LGX7v7ZL4AXxE=","ipv6_addr_in":"2606:2e00:0:b9::b37f","same_ip":true},{"hostname":"us-slc-wg-105","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.141","include_in_country":true,"weight":1,"public_key":"vkbSMnaddVm4YWkuuf8rOSc45XTfpVLJEom0FaJWq2g=","ipv6_addr_in":"2606:2e00:0:b9::f401","same_ip":true},{"hostname":"us-slc-wg-106","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.142","include_in_country":true,"weight":1,"public_key":"abx3jjkKD+7abroGzeELm4Esa4bESJV72Fm9Tp+YqAE=","ipv6_addr_in":"2606:2e00:0:b9::f501","same_ip":true},{"hostname":"us-slc-wg-107","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.143","include_in_country":true,"weight":1,"public_key":"dJX3V47dAZWGc7BeJCvDfwSqdKRsfPUT9Lm7LzPs2CU=","ipv6_addr_in":"2606:2e00:0:b9::f601","same_ip":true},{"hostname":"us-slc-wg-108","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.144","include_in_country":true,"weight":1,"public_key":"/fbfBjrhWKRTgOPy+esHuoeFCJWGX+nCYgTo8uKTMCE=","ipv6_addr_in":"2606:2e00:0:b9::f701","same_ip":true},{"hostname":"us-slc-wg-109","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.145","include_in_country":true,"weight":1,"public_key":"dClWdBHZT7dwqXzIRzit6CIaJYAFtTL/yYZ8Knj8Cjk=","ipv6_addr_in":"2606:2e00:0:b9::f801","same_ip":true},{"hostname":"us-uyk-wg-101","location":"us-uyk","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"209.54.101.130","include_in_country":false,"weight":1,"public_key":"25c8tyAhFiHXwp71beltk/KmAn0fsXGEl6nnNQQjmHI=","ipv6_addr_in":"2607:fcd0:ccc0:1d02::b37f","same_ip":true},{"hostname":"us-uyk-wg-102","location":"us-uyk","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"104.223.118.34","include_in_country":false,"weight":1,"public_key":"fD/JDsMLFxEZ7awcJJB9h0mjfRlcEvwF8e7arB2fHhU=","ipv6_addr_in":"2607:fcd0:ccc0:1d03::b38f","same_ip":true},{"hostname":"us-uyk-wg-103","location":"us-uyk","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"173.205.85.34","include_in_country":false,"weight":1,"public_key":"Tysz0Ii2m+DsyhcWoQWxsXUdJxu1lKln4F7ML+nWPXA=","ipv6_addr_in":"2607:fcd0:ccc0:1d05::c41f","same_ip":true},{"hostname":"za-jnb-wg-001","location":"za-jnb","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"154.47.30.130","include_in_country":true,"weight":100,"public_key":"5dOGXJ9JK/Bul0q57jsuvjNnc15gRpSO1rMbxkf4J2M=","ipv6_addr_in":"2a02:6ea0:f206::f001","same_ip":true},{"hostname":"za-jnb-wg-002","location":"za-jnb","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"154.47.30.143","include_in_country":true,"weight":100,"public_key":"lTq6+yUYfYsXwBpj/u3LnYqpLhW8ZJXQQ19N/ybP2B8=","ipv6_addr_in":"2a02:6ea0:f207::f001","same_ip":true}],"port_ranges":[[53,53],[123,123],[4000,33433],[33565,51820],[52000,60000]],"ipv4_gateway":"10.64.0.1","ipv6_gateway":"fc00:bbbb:bbbb:bb01::1"},"bridge":{"relays":[{"hostname":"au-syd-br-001","location":"au-syd","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.141.154","include_in_country":true,"weight":100},{"hostname":"be-bru-br-001","location":"be-bru","active":false,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"37.120.218.170","include_in_country":true,"weight":100},{"hostname":"ca-mtr-br-001","location":"ca-mtr","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"217.138.213.18","include_in_country":true,"weight":100},{"hostname":"ca-tor-br-101","location":"ca-tor","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.140.226","include_in_country":true,"weight":100},{"hostname":"ch-zrh-br-001","location":"ch-zrh","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.127.117","include_in_country":true,"weight":100},{"hostname":"ch-zrh-br-301","location":"ch-zrh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"91.193.4.210","include_in_country":true,"weight":100},{"hostname":"cz-prg-br-101","location":"cz-prg","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"217.138.199.106","include_in_country":true,"weight":100},{"hostname":"de-fra-br-001","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.155.117","include_in_country":true,"weight":100},{"hostname":"fi-hel-br-101","location":"fi-hel","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"193.138.7.132","include_in_country":true,"weight":100},{"hostname":"fr-par-br-001","location":"fr-par","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.126.117","include_in_country":false,"weight":100},{"hostname":"gb-lon-br-001","location":"gb-lon","active":false,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.252.66","include_in_country":true,"weight":100},{"hostname":"gb-mnc-br-001","location":"gb-mnc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"89.238.134.58","include_in_country":true,"weight":100},{"hostname":"hk-hkg-br-201","location":"hk-hkg","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"103.125.233.210","include_in_country":true,"weight":100},{"hostname":"jp-tyo-br-201","location":"jp-tyo","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"185.242.4.34","include_in_country":true,"weight":100},{"hostname":"nl-ams-br-001","location":"nl-ams","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.134.116","include_in_country":true,"weight":100},{"hostname":"no-osl-br-001","location":"no-osl","active":false,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"91.90.44.10","include_in_country":false,"weight":100},{"hostname":"no-svg-br-001","location":"no-svg","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"194.127.199.245","include_in_country":true,"weight":100},{"hostname":"pl-waw-br-001","location":"pl-waw","active":false,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"5.253.206.194","include_in_country":true,"weight":100},{"hostname":"se-got-br-001","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.117","include_in_country":true,"weight":100},{"hostname":"se-mma-br-001","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.138.218.71","include_in_country":true,"weight":100},{"hostname":"se-sto-br-001","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.135.115","include_in_country":true,"weight":100},{"hostname":"sg-sin-br-101","location":"sg-sin","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.192.34","include_in_country":true,"weight":100},{"hostname":"us-atl-br-101","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.241","include_in_country":true,"weight":100},{"hostname":"us-chi-br-001","location":"us-chi","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"68.235.44.130","include_in_country":true,"weight":100},{"hostname":"us-dal-br-101","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.18","include_in_country":true,"weight":100},{"hostname":"us-lax-br-401","location":"us-lax","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"62.133.44.202","include_in_country":true,"weight":100},{"hostname":"us-mia-br-101","location":"us-mia","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.183.34","include_in_country":true,"weight":100},{"hostname":"us-nyc-br-501","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"212.103.48.226","include_in_country":true,"weight":100},{"hostname":"us-nyc-br-601","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"38.132.121.146","include_in_country":true,"weight":100},{"hostname":"us-rag-br-101","location":"us-rag","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.130.178","include_in_country":true,"weight":100},{"hostname":"us-slc-br-101","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.146","include_in_country":false,"weight":100}],"shadowsocks":[{"protocol":"tcp","port":443,"cipher":"aes-256-gcm","password":"mullvad"},{"protocol":"udp","port":1234,"cipher":"aes-256-cfb","password":"mullvad"},{"protocol":"udp","port":1236,"cipher":"aes-256-gcm","password":"mullvad"}]}} \ No newline at end of file diff --git a/ios/RelayCache/CachedRelays.swift b/ios/MullvadREST/Relay/CachedRelays.swift similarity index 97% rename from ios/RelayCache/CachedRelays.swift rename to ios/MullvadREST/Relay/CachedRelays.swift index 499eb9cde366..f22b236e87b4 100644 --- a/ios/RelayCache/CachedRelays.swift +++ b/ios/MullvadREST/Relay/CachedRelays.swift @@ -7,7 +7,6 @@ // import Foundation -import MullvadREST /// A struct that represents the relay cache on disk public struct CachedRelays: Codable, Equatable { diff --git a/ios/RelaySelector/Haversine.swift b/ios/MullvadREST/Relay/Haversine.swift similarity index 100% rename from ios/RelaySelector/Haversine.swift rename to ios/MullvadREST/Relay/Haversine.swift diff --git a/ios/RelaySelector/Midpoint.swift b/ios/MullvadREST/Relay/Midpoint.swift similarity index 100% rename from ios/RelaySelector/Midpoint.swift rename to ios/MullvadREST/Relay/Midpoint.swift diff --git a/ios/RelayCache/RelayCache.swift b/ios/MullvadREST/Relay/RelayCache.swift similarity index 99% rename from ios/RelayCache/RelayCache.swift rename to ios/MullvadREST/Relay/RelayCache.swift index ba7ed31cf1cd..6cc9ddc61680 100644 --- a/ios/RelayCache/RelayCache.swift +++ b/ios/MullvadREST/Relay/RelayCache.swift @@ -7,7 +7,6 @@ // import Foundation -import MullvadREST import MullvadTypes public protocol RelayCacheProtocol { diff --git a/ios/RelaySelector/RelaySelector.swift b/ios/MullvadREST/Relay/RelaySelector.swift similarity index 99% rename from ios/RelaySelector/RelaySelector.swift rename to ios/MullvadREST/Relay/RelaySelector.swift index 20a8496d0dbc..bc0378c21789 100644 --- a/ios/RelaySelector/RelaySelector.swift +++ b/ios/MullvadREST/Relay/RelaySelector.swift @@ -7,7 +7,6 @@ // import Foundation -import MullvadREST import MullvadTypes private let defaultPort: UInt16 = 53 diff --git a/ios/MullvadREST/ExponentialBackoff.swift b/ios/MullvadREST/RetryStrategy/ExponentialBackoff.swift similarity index 56% rename from ios/MullvadREST/ExponentialBackoff.swift rename to ios/MullvadREST/RetryStrategy/ExponentialBackoff.swift index 5c94735eaa56..57a54e07a905 100644 --- a/ios/MullvadREST/ExponentialBackoff.swift +++ b/ios/MullvadREST/RetryStrategy/ExponentialBackoff.swift @@ -32,22 +32,3 @@ struct ExponentialBackoff: IteratorProtocol { return next } } - -struct Jittered: IteratorProtocol - where InnerIterator.Element == Duration { - private var inner: InnerIterator - - init(_ inner: InnerIterator) { - self.inner = inner - } - - mutating func next() -> Duration? { - guard let interval = inner.next() else { return nil } - - let jitter = Double.random(in: 0.0 ... 1.0) - let millis = interval.milliseconds - let millisWithJitter = millis.saturatingAddition(Int(Double(millis) * jitter)) - - return .milliseconds(millisWithJitter) - } -} diff --git a/ios/MullvadREST/RetryStrategy/Jittered.swift b/ios/MullvadREST/RetryStrategy/Jittered.swift new file mode 100644 index 000000000000..271e088bbedf --- /dev/null +++ b/ios/MullvadREST/RetryStrategy/Jittered.swift @@ -0,0 +1,29 @@ +// +// Jittered.swift +// MullvadREST +// +// Created by Mojgan on 2023-12-08. +// Copyright © 2023 Mullvad VPN AB. All rights reserved. +// + +import Foundation +import MullvadTypes + +struct Jittered: IteratorProtocol + where InnerIterator.Element == Duration { + private var inner: InnerIterator + + init(_ inner: InnerIterator) { + self.inner = inner + } + + mutating func next() -> Duration? { + guard let interval = inner.next() else { return nil } + + let jitter = Double.random(in: 0.0 ... 1.0) + let millis = interval.milliseconds + let millisWithJitter = millis.saturatingAddition(Int(Double(millis) * jitter)) + + return .milliseconds(millisWithJitter) + } +} diff --git a/ios/MullvadREST/RESTRetryStrategy.swift b/ios/MullvadREST/RetryStrategy/RetryStrategy.swift similarity index 98% rename from ios/MullvadREST/RESTRetryStrategy.swift rename to ios/MullvadREST/RetryStrategy/RetryStrategy.swift index 2cd72ea53bb4..d7cd047b26eb 100644 --- a/ios/MullvadREST/RESTRetryStrategy.swift +++ b/ios/MullvadREST/RetryStrategy/RetryStrategy.swift @@ -1,5 +1,5 @@ // -// RESTRetryStrategy.swift +// RetryStrategy.swift // MullvadREST // // Created by pronebird on 09/12/2021. diff --git a/ios/MullvadTransport/URLSessionTransport.swift b/ios/MullvadREST/Transport/Direct/URLSessionTransport.swift similarity index 84% rename from ios/MullvadTransport/URLSessionTransport.swift rename to ios/MullvadREST/Transport/Direct/URLSessionTransport.swift index 00618230855f..fc5aee683b18 100644 --- a/ios/MullvadTransport/URLSessionTransport.swift +++ b/ios/MullvadREST/Transport/Direct/URLSessionTransport.swift @@ -2,12 +2,11 @@ // URLSessionTransport.swift // MullvadREST // -// Created by Sajad Vishkai on 2022-10-03. -// Copyright © 2022 Mullvad VPN AB. All rights reserved. +// Created by Mojgan on 2023-12-08. +// Copyright © 2023 Mullvad VPN AB. All rights reserved. // import Foundation -import MullvadREST import MullvadTypes extension URLSessionTask: Cancellable {} @@ -18,6 +17,7 @@ public final class URLSessionTransport: RESTTransport { } public let urlSession: URLSession + public init(urlSession: URLSession) { self.urlSession = urlSession } diff --git a/ios/MullvadREST/RESTTransport.swift b/ios/MullvadREST/Transport/RESTTransport.swift similarity index 100% rename from ios/MullvadREST/RESTTransport.swift rename to ios/MullvadREST/Transport/RESTTransport.swift diff --git a/ios/MullvadREST/RESTTransportProvider.swift b/ios/MullvadREST/Transport/RESTTransportProvider.swift similarity index 100% rename from ios/MullvadREST/RESTTransportProvider.swift rename to ios/MullvadREST/Transport/RESTTransportProvider.swift diff --git a/ios/MullvadTransport/ShadowSocksProxy.swift b/ios/MullvadREST/Transport/Shadowsocks/ShadowSocksProxy.swift similarity index 100% rename from ios/MullvadTransport/ShadowSocksProxy.swift rename to ios/MullvadREST/Transport/Shadowsocks/ShadowSocksProxy.swift diff --git a/ios/MullvadTransport/ShadowsocksConfiguration.swift b/ios/MullvadREST/Transport/Shadowsocks/ShadowsocksConfiguration.swift similarity index 100% rename from ios/MullvadTransport/ShadowsocksConfiguration.swift rename to ios/MullvadREST/Transport/Shadowsocks/ShadowsocksConfiguration.swift diff --git a/ios/MullvadTransport/ShadowsocksConfigurationCache.swift b/ios/MullvadREST/Transport/Shadowsocks/ShadowsocksConfigurationCache.swift similarity index 92% rename from ios/MullvadTransport/ShadowsocksConfigurationCache.swift rename to ios/MullvadREST/Transport/Shadowsocks/ShadowsocksConfigurationCache.swift index 111215138e63..b09f4afdf66e 100644 --- a/ios/MullvadTransport/ShadowsocksConfigurationCache.swift +++ b/ios/MullvadREST/Transport/Shadowsocks/ShadowsocksConfigurationCache.swift @@ -21,7 +21,7 @@ public final class ShadowsocksConfigurationCache { ) } - /// Returns configration from memory cache if available, otherwise attempts to load it from disk cache before + /// Returns configuration from memory cache if available, otherwise attempts to load it from disk cache before /// returning. public func read() throws -> ShadowsocksConfiguration { configurationLock.lock() diff --git a/ios/MullvadTransport/URLSessionShadowsocksTransport.swift b/ios/MullvadREST/Transport/Shadowsocks/ShadowsocksTransport.swift similarity index 82% rename from ios/MullvadTransport/URLSessionShadowsocksTransport.swift rename to ios/MullvadREST/Transport/Shadowsocks/ShadowsocksTransport.swift index ad587ba27c3b..c800a937badc 100644 --- a/ios/MullvadTransport/URLSessionShadowsocksTransport.swift +++ b/ios/MullvadREST/Transport/Shadowsocks/ShadowsocksTransport.swift @@ -7,10 +7,9 @@ // import Foundation -import MullvadREST import MullvadTypes -public final class URLSessionShadowsocksTransport: RESTTransport { +public final class ShadowsocksTransport: RESTTransport { /// The Shadowsocks proxy instance that proxies all the traffic it receives private let shadowsocksProxy: ShadowsocksProxy @@ -26,7 +25,7 @@ public final class URLSessionShadowsocksTransport: RESTTransport { public init( urlSession: URLSession, - shadowsocksConfiguration: ShadowsocksConfiguration, + configuration: ShadowsocksConfiguration, addressCache: REST.AddressCache ) { self.urlSession = urlSession @@ -35,10 +34,10 @@ public final class URLSessionShadowsocksTransport: RESTTransport { shadowsocksProxy = ShadowsocksProxy( forwardAddress: apiAddress.ip, forwardPort: apiAddress.port, - bridgeAddress: shadowsocksConfiguration.bridgeAddress, - bridgePort: shadowsocksConfiguration.bridgePort, - password: shadowsocksConfiguration.password, - cipher: shadowsocksConfiguration.cipher + bridgeAddress: configuration.bridgeAddress, + bridgePort: configuration.bridgePort, + password: configuration.password, + cipher: configuration.cipher ) } diff --git a/ios/MullvadTransport/module.private.modulemap b/ios/MullvadREST/Transport/Shadowsocks/module.private.modulemap similarity index 100% rename from ios/MullvadTransport/module.private.modulemap rename to ios/MullvadREST/Transport/Shadowsocks/module.private.modulemap diff --git a/ios/MullvadTransport/shadowsocks-proxy/.gitignore b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/.gitignore similarity index 100% rename from ios/MullvadTransport/shadowsocks-proxy/.gitignore rename to ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/.gitignore diff --git a/ios/MullvadTransport/shadowsocks-proxy/Cargo.toml b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/Cargo.toml similarity index 100% rename from ios/MullvadTransport/shadowsocks-proxy/Cargo.toml rename to ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/Cargo.toml diff --git a/ios/MullvadTransport/shadowsocks-proxy/build.rs b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/build.rs similarity index 100% rename from ios/MullvadTransport/shadowsocks-proxy/build.rs rename to ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/build.rs diff --git a/ios/MullvadTransport/shadowsocks-proxy/include/shadowsocks.h b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/include/shadowsocks.h similarity index 100% rename from ios/MullvadTransport/shadowsocks-proxy/include/shadowsocks.h rename to ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/include/shadowsocks.h diff --git a/ios/MullvadTransport/shadowsocks-proxy/src/bin/run.rs b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/src/bin/run.rs similarity index 100% rename from ios/MullvadTransport/shadowsocks-proxy/src/bin/run.rs rename to ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/src/bin/run.rs diff --git a/ios/MullvadTransport/shadowsocks-proxy/src/bin/run_unsafe.rs b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/src/bin/run_unsafe.rs similarity index 100% rename from ios/MullvadTransport/shadowsocks-proxy/src/bin/run_unsafe.rs rename to ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/src/bin/run_unsafe.rs diff --git a/ios/MullvadTransport/shadowsocks-proxy/src/ffi.rs b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/src/ffi.rs similarity index 100% rename from ios/MullvadTransport/shadowsocks-proxy/src/ffi.rs rename to ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/src/ffi.rs diff --git a/ios/MullvadTransport/shadowsocks-proxy/src/lib.rs b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/src/lib.rs similarity index 100% rename from ios/MullvadTransport/shadowsocks-proxy/src/lib.rs rename to ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/src/lib.rs diff --git a/ios/MullvadREST/Transport/Shadowsocks/shadowsocks.h b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks.h new file mode 100644 index 000000000000..1a0a856d8dc7 --- /dev/null +++ b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks.h @@ -0,0 +1,36 @@ +#include +#include +#include +#include + +typedef struct ProxyHandle { + void *context; + uint16_t port; +} ProxyHandle; + +/** + * # Safety + * `addr`, `password`, `cipher` must be valid for the lifetime of this function call and they must + * be backed by the amount of bytes as stored in the respective `*_len` parameters. + * + * `proxy_config` must be pointing to a valid memory region for the size of a `ProxyHandle` + * instance. + */ +int32_t start_shadowsocks_proxy(const uint8_t *forward_address, + uintptr_t forward_address_len, + uint16_t forward_port, + const uint8_t *addr, + uintptr_t addr_len, + uint16_t port, + const uint8_t *password, + uintptr_t password_len, + const uint8_t *cipher, + uintptr_t cipher_len, + struct ProxyHandle *proxy_config); + +/** + * # Safety + * `proxy_config` must be pointing to a valid instance of a `ProxyInstance`, as instantiated by + * `start_shadowsocks_proxy`. + */ +int32_t stop_shadowsocks_proxy(struct ProxyHandle *proxy_config); diff --git a/ios/MullvadTransport/TransportProvider.swift b/ios/MullvadREST/Transport/TransportProvider.swift similarity index 97% rename from ios/MullvadTransport/TransportProvider.swift rename to ios/MullvadREST/Transport/TransportProvider.swift index 88c3e1fc8a23..65ff2b32096b 100644 --- a/ios/MullvadTransport/TransportProvider.swift +++ b/ios/MullvadREST/Transport/TransportProvider.swift @@ -8,10 +8,7 @@ import Foundation import Logging -import MullvadREST import MullvadTypes -import RelayCache -import RelaySelector public final class TransportProvider: RESTTransportProvider { private let urlSessionTransport: URLSessionTransport @@ -69,12 +66,11 @@ public final class TransportProvider: RESTTransportProvider { let shadowsocksConfiguration = try shadowsocksConfiguration() let shadowsocksURLSession = urlSessionTransport.urlSession - let shadowsocksTransport = URLSessionShadowsocksTransport( + let shadowsocksTransport = ShadowsocksTransport( urlSession: shadowsocksURLSession, - shadowsocksConfiguration: shadowsocksConfiguration, + configuration: shadowsocksConfiguration, addressCache: addressCache ) - return shadowsocksTransport } catch { logger.error(error: error, message: "Failed to produce shadowsocks configuration.") diff --git a/ios/MullvadREST/RESTTransportStrategy.swift b/ios/MullvadREST/Transport/TransportStrategy.swift similarity index 98% rename from ios/MullvadREST/RESTTransportStrategy.swift rename to ios/MullvadREST/Transport/TransportStrategy.swift index d63b8c8833a6..d857a3406bde 100644 --- a/ios/MullvadREST/RESTTransportStrategy.swift +++ b/ios/MullvadREST/Transport/TransportStrategy.swift @@ -1,5 +1,5 @@ // -// RESTTransportStrategy.swift +// TransportStrategy.swift // MullvadREST // // Created by Marco Nikic on 2023-04-27. diff --git a/ios/MullvadREST/URLSessionTransport.swift b/ios/MullvadREST/URLSessionTransport.swift deleted file mode 100644 index c5b4cf6a6779..000000000000 --- a/ios/MullvadREST/URLSessionTransport.swift +++ /dev/null @@ -1,89 +0,0 @@ -// -// URLSessionTransport.swift -// MullvadREST -// -// Created by Sajad Vishkai on 2022-10-03. -// Copyright © 2022 Mullvad VPN AB. All rights reserved. -// - -import Foundation -import MullvadTypes - -extension URLSessionTask: Cancellable {} - -extension REST { - public final class URLSessionTransport: RESTTransport { - public var name: String { - "url-session" - } - - public let urlSession: URLSession - - public init(urlSession: URLSession) { - self.urlSession = urlSession - } - - public func sendRequest( - _ request: URLRequest, - completion: @escaping (Data?, URLResponse?, Swift.Error?) -> Void - ) -> Cancellable { - let dataTask = urlSession.dataTask(with: request, completionHandler: completion) - dataTask.resume() - return dataTask - } - } - - public final class URLSessionShadowSocksTransport: RESTTransport { - /// The Shadowsocks proxy instance that proxies all the traffic it receives - private let shadowSocksProxy: ShadowsocksProxy - /// The IPv4 representation of the loopback address used by `shadowSocksProxy` - private let localhost = "127.0.0.1" - - /// The `URLSession` used to send requests via `shadowSocksProxy` - public let urlSession: URLSession - - public var name: String { - "shadow-socks-url-session" - } - - public init( - urlSession: URLSession, - shadowSocksConfiguration: ServerShadowsocks, - shadowSocksBridgeRelay: BridgeRelay, - addressCache: REST.AddressCache - ) { - self.urlSession = urlSession - let apiAddress = addressCache.getCurrentEndpoint() - - shadowSocksProxy = ShadowsocksProxy( - forwardAddress: apiAddress.ip, - forwardPort: apiAddress.port, - bridgeAddress: shadowSocksBridgeRelay.ipv4AddrIn, - bridgePort: shadowSocksConfiguration.port, - password: shadowSocksConfiguration.password, - cipher: shadowSocksConfiguration.cipher - ) - } - - public func sendRequest( - _ request: URLRequest, - completion: @escaping (Data?, URLResponse?, Swift.Error?) -> Void - ) -> Cancellable { - // Start the Shadowsocks proxy in order to get a local port - shadowSocksProxy.start() - - // Copy the URL request and rewrite the host and port to point to the Shadowsocks proxy instance - var urlRequestCopy = request - urlRequestCopy.url = request.url.flatMap { url in - var components = URLComponents(url: url, resolvingAgainstBaseURL: false) - components?.host = localhost - components?.port = Int(shadowSocksProxy.localPort()) - return components?.url - } - - let dataTask = urlSession.dataTask(with: urlRequestCopy, completionHandler: completion) - dataTask.resume() - return dataTask - } - } -} diff --git a/ios/MullvadTransport/Info.plist b/ios/MullvadTransport/Info.plist deleted file mode 100644 index 0c67376ebacb..000000000000 --- a/ios/MullvadTransport/Info.plist +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/ios/MullvadTransport/MullvadTransport.h b/ios/MullvadTransport/MullvadTransport.h deleted file mode 100644 index cd1e9b50a04f..000000000000 --- a/ios/MullvadTransport/MullvadTransport.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// MullvadTransport.h -// MullvadTransport -// -// Created by Marco Nikic on 2023-05-25. -// Copyright © 2023 Mullvad VPN AB. All rights reserved. -// - -#import - -//! Project version number for MullvadTransport. -FOUNDATION_EXPORT double MullvadTransportVersionNumber; - -//! Project version string for MullvadTransport. -FOUNDATION_EXPORT const unsigned char MullvadTransportVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - - diff --git a/ios/MullvadVPN.xcodeproj/project.pbxproj b/ios/MullvadVPN.xcodeproj/project.pbxproj index d009ee6201e8..6eed2f7b9306 100644 --- a/ios/MullvadVPN.xcodeproj/project.pbxproj +++ b/ios/MullvadVPN.xcodeproj/project.pbxproj @@ -7,17 +7,10 @@ objects = { /* Begin PBXBuildFile section */ - 01F1FF1E29F0627D007083C3 /* libshadowsocks_proxy.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 01F1FF1D29F0627D007083C3 /* libshadowsocks_proxy.a */; }; 062B45A328FD4CA700746E77 /* le_root_cert.cer in Resources */ = {isa = PBXBuildFile; fileRef = 06799AB428F98CE700ACD94E /* le_root_cert.cer */; }; 062B45BC28FD8C3B00746E77 /* RESTDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 062B45BB28FD8C3B00746E77 /* RESTDefaults.swift */; }; 063687BA28EB234F00BE7161 /* PacketTunnelTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 063687B928EB234F00BE7161 /* PacketTunnelTransport.swift */; }; 063F026628FFE11C001FA09F /* RESTCreateApplePaymentResponse+Localization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67828F83CA50033DD93 /* RESTCreateApplePaymentResponse+Localization.swift */; }; - 063F02762902B63F001FA09F /* RelayCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 063F02752902B63F001FA09F /* RelayCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 063F02792902B63F001FA09F /* RelayCache.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 063F02732902B63F001FA09F /* RelayCache.framework */; }; - 063F027A2902B63F001FA09F /* RelayCache.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 063F02732902B63F001FA09F /* RelayCache.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 063F027E2902B6EB001FA09F /* RelayCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5820675A26E6576800655B05 /* RelayCache.swift */; }; - 063F027F2902B6EB001FA09F /* CachedRelays.swift in Sources */ = {isa = PBXBuildFile; fileRef = 585DA87626B024A600B8C587 /* CachedRelays.swift */; }; - 063F028F2902BD8C001FA09F /* relays.json in Resources */ = {isa = PBXBuildFile; fileRef = 58F3C0A524A50155003E76BE /* relays.json */; }; 06799ACE28F98E1D00ACD94E /* MullvadREST.h in Headers */ = {isa = PBXBuildFile; fileRef = 06799ABE28F98E1D00ACD94E /* MullvadREST.h */; settings = {ATTRIBUTES = (Public, ); }; }; 06799AD128F98E1D00ACD94E /* MullvadREST.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06799ABC28F98E1D00ACD94E /* MullvadREST.framework */; }; 06799AD228F98E1D00ACD94E /* MullvadREST.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 06799ABC28F98E1D00ACD94E /* MullvadREST.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; @@ -36,7 +29,7 @@ 06799AE728F98E4800ACD94E /* RESTURLSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE66528F83CA30033DD93 /* RESTURLSession.swift */; }; 06799AEA28F98E4800ACD94E /* RESTProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE66E28F83CA40033DD93 /* RESTProxy.swift */; }; 06799AEC28F98E4800ACD94E /* RESTTaskIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67528F83CA40033DD93 /* RESTTaskIdentifier.swift */; }; - 06799AEF28F98E4800ACD94E /* RESTRetryStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67628F83CA40033DD93 /* RESTRetryStrategy.swift */; }; + 06799AEF28F98E4800ACD94E /* RetryStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67628F83CA40033DD93 /* RetryStrategy.swift */; }; 06799AF028F98E4800ACD94E /* REST.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67B28F83CA50033DD93 /* REST.swift */; }; 06799AF128F98E4800ACD94E /* RESTAPIProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67328F83CA40033DD93 /* RESTAPIProxy.swift */; }; 06799AF228F98E4800ACD94E /* RESTAccessTokenManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67228F83CA40033DD93 /* RESTAccessTokenManager.swift */; }; @@ -68,8 +61,6 @@ 5820676426E771DB00655B05 /* TunnelManagerErrors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5820676326E771DB00655B05 /* TunnelManagerErrors.swift */; }; 5820EDA9288FE064006BF4E4 /* DeviceManagementInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5820EDA8288FE064006BF4E4 /* DeviceManagementInteractor.swift */; }; 5820EDAB288FF0D2006BF4E4 /* DeviceRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5820EDAA288FF0D2006BF4E4 /* DeviceRowView.swift */; }; - 5822C0042A3724A800A3A5FB /* ShadowsocksConfigurationCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9467E8A2A2E0317000DC21F /* ShadowsocksConfigurationCache.swift */; }; - 5822C0052A3724A800A3A5FB /* ShadowsocksConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9467E872A2DCD57000DC21F /* ShadowsocksConfiguration.swift */; }; 58238CB92AD57EC700768310 /* MullvadREST.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06799ABC28F98E1D00ACD94E /* MullvadREST.framework */; }; 5823FA5426CE49F700283BF8 /* TunnelObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5823FA5326CE49F600283BF8 /* TunnelObserver.swift */; }; 582403822A827E1500163DE8 /* RelaySelectorWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 582403812A827E1500163DE8 /* RelaySelectorWrapper.swift */; }; @@ -107,7 +98,6 @@ 584D26C4270C855B004EA533 /* PreferencesDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 584D26C3270C855A004EA533 /* PreferencesDataSource.swift */; }; 584D26C6270C8741004EA533 /* SettingsDNSTextCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 584D26C5270C8741004EA533 /* SettingsDNSTextCell.swift */; }; 584EBDBD2747C98F00A0C9FD /* NSAttributedString+Markdown.swift in Sources */ = {isa = PBXBuildFile; fileRef = 584EBDBC2747C98F00A0C9FD /* NSAttributedString+Markdown.swift */; }; - 584F99202902CBDD001F858D /* libRelaySelector.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5898D29829017DAC00EB5EBA /* libRelaySelector.a */; }; 5859A55529CD9DD900F66591 /* changes.txt in Resources */ = {isa = PBXBuildFile; fileRef = 5859A55429CD9DD800F66591 /* changes.txt */; }; 585A02E92A4B283000C6CAFF /* TCPUnsafeListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 585A02E82A4B283000C6CAFF /* TCPUnsafeListener.swift */; }; 585A02EB2A4B285800C6CAFF /* UDPConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 585A02EA2A4B285800C6CAFF /* UDPConnection.swift */; }; @@ -135,7 +125,6 @@ 58695AA72A4B109F00328DB3 /* TunnelObfuscation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5840231F2A406BF5007B27AC /* TunnelObfuscation.framework */; }; 586A0DCB2A20E359006C731C /* MullvadTypes.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58D223D5294C8E5E0029F5F8 /* MullvadTypes.framework */; }; 586A0DD12A20E371006C731C /* WireGuardKitTypes in Frameworks */ = {isa = PBXBuildFile; productRef = 586A0DD02A20E371006C731C /* WireGuardKitTypes */; }; - 586A0DD42A20E4A9006C731C /* MullvadREST.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06799ABC28F98E1D00ACD94E /* MullvadREST.framework */; }; 586A950C290125EE007BAF2B /* AlertPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58B9EB122488ED2100095626 /* AlertPresenter.swift */; }; 586A950E290125F3007BAF2B /* ProductsRequestOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5846226426E0D9630035F7C2 /* ProductsRequestOperation.swift */; }; 586A950F29012BEE007BAF2B /* AddressCacheTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06AC114028F841390037AF9A /* AddressCacheTracker.swift */; }; @@ -193,10 +182,6 @@ 5896AE84246D5889005B36CB /* CustomDateComponentsFormatting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5896AE83246D5889005B36CB /* CustomDateComponentsFormatting.swift */; }; 5896CEF226972DEB00B0FAE8 /* AccountContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5896CEF126972DEB00B0FAE8 /* AccountContentView.swift */; }; 5897F1742913EAF800AF5695 /* ExponentialBackoff.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5897F1732913EAF800AF5695 /* ExponentialBackoff.swift */; }; - 5898D29F29017DD000EB5EBA /* RelaySelector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58781CD422AFBA39009B9D8E /* RelaySelector.swift */; }; - 5898D2A22901801000EB5EBA /* MullvadREST.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06799ABC28F98E1D00ACD94E /* MullvadREST.framework */; platformFilter = ios; }; - 5898D2A92901844E00EB5EBA /* libRelaySelector.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5898D29829017DAC00EB5EBA /* libRelaySelector.a */; }; - 5898D2AB2901845400EB5EBA /* libRelaySelector.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5898D29829017DAC00EB5EBA /* libRelaySelector.a */; }; 589A455C28E094BF00565204 /* OperationSmokeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58DF5B7E2852778600E92647 /* OperationSmokeTests.swift */; }; 589A455D28E094BF00565204 /* OperationObserverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 583E1E292848DF67004838B3 /* OperationObserverTests.swift */; }; 589A455F28E094BF00565204 /* OperationConditionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 580CBFB72848D503007878F0 /* OperationConditionTests.swift */; }; @@ -356,7 +341,6 @@ 58DF28A52417CB4B00E836B0 /* StorePaymentManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58DF28A42417CB4B00E836B0 /* StorePaymentManager.swift */; }; 58E0729F28814ACC008902F8 /* WireGuardLogLevel+Logging.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58E0729E28814ACC008902F8 /* WireGuardLogLevel+Logging.swift */; }; 58E0A98827C8F46300FE6BDD /* Tunnel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58E0A98727C8F46300FE6BDD /* Tunnel.swift */; }; - 58E0E2842A3718CE002E3420 /* URLSessionShadowsocksTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58E0E2832A3718CE002E3420 /* URLSessionShadowsocksTransport.swift */; }; 58E11188292FA11F009FCA84 /* SettingsMigrationUIHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58E11187292FA11F009FCA84 /* SettingsMigrationUIHandler.swift */; }; 58E20771274672CA00DE5D77 /* LaunchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58E20770274672CA00DE5D77 /* LaunchViewController.swift */; }; 58E25F812837BBBB002CFB2C /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58E25F802837BBBB002CFB2C /* SceneDelegate.swift */; }; @@ -511,26 +495,18 @@ A917352129FAAA5200D5DCFD /* TransportStrategyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A917352029FAAA5200D5DCFD /* TransportStrategyTests.swift */; }; A91D78E32B03BDF200FCD5D3 /* TunnelObfuscation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5840231F2A406BF5007B27AC /* TunnelObfuscation.framework */; }; A91D78E42B03C01600FCD5D3 /* MullvadSettings.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58B2FDD32AA71D2A003EB5C6 /* MullvadSettings.framework */; }; - A93D13782A1F60A6001EB0B1 /* shadowsocks.h in Headers */ = {isa = PBXBuildFile; fileRef = 586F2BE129F6916F009E6924 /* shadowsocks.h */; settings = {ATTRIBUTES = (Private, ); }; }; A94D691A2ABAD66700413DD4 /* WireGuardKitTypes in Frameworks */ = {isa = PBXBuildFile; productRef = 58FE25E22AA72AE9003D1918 /* WireGuardKitTypes */; }; A94D691B2ABAD66700413DD4 /* WireGuardKitTypes in Frameworks */ = {isa = PBXBuildFile; productRef = 58FE25E72AA7399D003D1918 /* WireGuardKitTypes */; }; - A95F86B72A1F53BA00245DAC /* URLSessionTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67C28F83CA50033DD93 /* URLSessionTransport.swift */; }; - A95F86B82A1F547000245DAC /* ShadowsocksProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F1FF1B29F06124007083C3 /* ShadowsocksProxy.swift */; }; A97D25AE2B0BB18100946B2D /* ProtocolObfuscator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A97D25AD2B0BB18100946B2D /* ProtocolObfuscator.swift */; }; A97D25B02B0BB5C400946B2D /* ProtocolObfuscationStub.swift in Sources */ = {isa = PBXBuildFile; fileRef = A97D25AF2B0BB5C400946B2D /* ProtocolObfuscationStub.swift */; }; A97D25B22B0CB02D00946B2D /* ProtocolObfuscatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A97D25B12B0CB02D00946B2D /* ProtocolObfuscatorTests.swift */; }; A97D25B42B0CB59300946B2D /* TunnelObfuscationStub.swift in Sources */ = {isa = PBXBuildFile; fileRef = A97D25B32B0CB59300946B2D /* TunnelObfuscationStub.swift */; }; A97D30172AE6B5E90045C0E4 /* StoredWgKeyData.swift in Sources */ = {isa = PBXBuildFile; fileRef = A97D30162AE6B5E90045C0E4 /* StoredWgKeyData.swift */; }; - A97F1F442A1F4E1A00ECEFDE /* MullvadTransport.h in Headers */ = {isa = PBXBuildFile; fileRef = A97F1F432A1F4E1A00ECEFDE /* MullvadTransport.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A97F1F472A1F4E1A00ECEFDE /* MullvadTransport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A97F1F412A1F4E1A00ECEFDE /* MullvadTransport.framework */; }; - A97F1F482A1F4E1A00ECEFDE /* MullvadTransport.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A97F1F412A1F4E1A00ECEFDE /* MullvadTransport.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; A97FF5502A0D2FFC00900996 /* NSFileCoordinator+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A97FF54F2A0D2FFC00900996 /* NSFileCoordinator+Extensions.swift */; }; A988A3E22AFE54AC0008D2C7 /* AccountExpiry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6F2FA62AFBB9AE006D0856 /* AccountExpiry.swift */; }; - A988DF212ADD293D00D807EF /* RESTTransportStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9A1DE782AD5708E0073F689 /* RESTTransportStrategy.swift */; }; - A988DF242ADD307200D807EF /* libRelaySelector.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5898D29829017DAC00EB5EBA /* libRelaySelector.a */; }; A988DF272ADE86ED00D807EF /* WireGuardObfuscationSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = A988DF252ADE86ED00D807EF /* WireGuardObfuscationSettings.swift */; }; A988DF2A2ADE880300D807EF /* TunnelSettingsV3.swift in Sources */ = {isa = PBXBuildFile; fileRef = A988DF282ADE880300D807EF /* TunnelSettingsV3.swift */; }; - A9A1DE792AD5708E0073F689 /* RESTTransportStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9A1DE782AD5708E0073F689 /* RESTTransportStrategy.swift */; }; + A9A1DE792AD5708E0073F689 /* TransportStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9A1DE782AD5708E0073F689 /* TransportStrategy.swift */; }; A9A5F9E12ACB05160083449F /* AddressCacheTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06AC114028F841390037AF9A /* AddressCacheTracker.swift */; }; A9A5F9E22ACB05160083449F /* BackgroundTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58C76A0A2A338E4300100D75 /* BackgroundTask.swift */; }; A9A5F9E32ACB05160083449F /* AccountDataThrottling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587988C628A2A01F00E3DF54 /* AccountDataThrottling.swift */; }; @@ -629,7 +605,6 @@ A9A5FA422ACB05D90083449F /* DeviceStateAccessorProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 580810E42A30E13A00B74552 /* DeviceStateAccessorProtocol.swift */; }; A9A5FA432ACB05F20083449F /* UIColor+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587CBFE222807F530028DED3 /* UIColor+Helpers.swift */; }; A9A8A8EB2A262AB30086D569 /* FileCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9A8A8EA2A262AB30086D569 /* FileCache.swift */; }; - A9B2CF722A1F64CD0013CC6C /* MullvadREST.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06799ABC28F98E1D00ACD94E /* MullvadREST.framework */; }; A9B6AC182ADE8F4300F7802A /* MigrationManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9B6AC172ADE8F4300F7802A /* MigrationManagerTests.swift */; }; A9B6AC1A2ADE8FBB00F7802A /* InMemorySettingsStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9B6AC192ADE8FBB00F7802A /* InMemorySettingsStore.swift */; }; A9B6AC1B2ADEA3AD00F7802A /* MemoryCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58BDEB9C2A98F69E00F578F2 /* MemoryCache.swift */; }; @@ -637,18 +612,12 @@ A9C342C32ACC3EE90045F00E /* RelayCacheTracker+Stubs.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9C342C22ACC3EE90045F00E /* RelayCacheTracker+Stubs.swift */; }; A9C342C52ACC42130045F00E /* ServerRelaysResponse+Stubs.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9C342C42ACC42130045F00E /* ServerRelaysResponse+Stubs.swift */; }; A9D99B9A2A1F7C3200DE27D3 /* RESTTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67D28F83CA50033DD93 /* RESTTransport.swift */; }; - A9D99BA02A1F7F3A00DE27D3 /* TransportProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9D99B9F2A1F7F3A00DE27D3 /* TransportProvider.swift */; }; - A9D99BA52A1F808900DE27D3 /* RelayCache.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 063F02732902B63F001FA09F /* RelayCache.framework */; }; - A9D99BA62A1F809C00DE27D3 /* libRelaySelector.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5898D29829017DAC00EB5EBA /* libRelaySelector.a */; }; - A9D99BA92A1F81B700DE27D3 /* MullvadTransport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A97F1F412A1F4E1A00ECEFDE /* MullvadTransport.framework */; }; A9E031782ACB09930095D843 /* UIApplication+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9E031762ACB08950095D843 /* UIApplication+Extensions.swift */; }; A9E0317A2ACB0AE70095D843 /* UIApplication+Stubs.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9E031792ACB0AE70095D843 /* UIApplication+Stubs.swift */; }; A9E0317C2ACBFC7E0095D843 /* TunnelStore+Stubs.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9E0317B2ACBFC7E0095D843 /* TunnelStore+Stubs.swift */; }; A9E0317F2ACC331C0095D843 /* TunnelStatusBlockObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9E0317D2ACC32920095D843 /* TunnelStatusBlockObserver.swift */; }; A9E034642ABB302000E59A5A /* UIEdgeInsets+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9E034632ABB302000E59A5A /* UIEdgeInsets+Extensions.swift */; }; - A9EC20E62A5C488D0040D56E /* Haversine.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9EC20E52A5C488D0040D56E /* Haversine.swift */; }; A9EC20F02A5D79ED0040D56E /* TunnelObfuscation.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 5840231F2A406BF5007B27AC /* TunnelObfuscation.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - A9EC20F42A5D96030040D56E /* Midpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9EC20F32A5D96030040D56E /* Midpoint.swift */; }; E1187ABC289BBB850024E748 /* OutOfTimeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1187ABA289BBB850024E748 /* OutOfTimeViewController.swift */; }; E1187ABD289BBB850024E748 /* OutOfTimeContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1187ABB289BBB850024E748 /* OutOfTimeContentView.swift */; }; E158B360285381C60002F069 /* String+AccountFormatting.swift in Sources */ = {isa = PBXBuildFile; fileRef = E158B35F285381C60002F069 /* String+AccountFormatting.swift */; }; @@ -656,8 +625,16 @@ F028A56A2A34D4E700C0CAA3 /* RedeemVoucherViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F028A5692A34D4E700C0CAA3 /* RedeemVoucherViewController.swift */; }; F028A56C2A34D8E600C0CAA3 /* AddCreditSucceededViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F028A56B2A34D8E600C0CAA3 /* AddCreditSucceededViewController.swift */; }; F03580252A13842C00E5DAFD /* IncreasedHitButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F03580242A13842C00E5DAFD /* IncreasedHitButton.swift */; }; + F04F95A12B21D24400431E08 /* shadowsocks.h in Headers */ = {isa = PBXBuildFile; fileRef = F04F95A02B21D24400431E08 /* shadowsocks.h */; settings = {ATTRIBUTES = (Private, ); }; }; F04FBE612A8379EE009278D7 /* AppPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = F04FBE602A8379EE009278D7 /* AppPreferences.swift */; }; + F05F39942B21C6C6006E60A7 /* relays.json in Resources */ = {isa = PBXBuildFile; fileRef = 58F3C0A524A50155003E76BE /* relays.json */; }; + F05F39972B21C735006E60A7 /* RelayCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5820675A26E6576800655B05 /* RelayCache.swift */; }; + F05F39982B21C73C006E60A7 /* CachedRelays.swift in Sources */ = {isa = PBXBuildFile; fileRef = 585DA87626B024A600B8C587 /* CachedRelays.swift */; }; + F06045E62B231EB700B2D37A /* URLSessionTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = F06045E52B231EB700B2D37A /* URLSessionTransport.swift */; }; + F06045EA2B23217E00B2D37A /* ShadowsocksTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = F06045E92B23217E00B2D37A /* ShadowsocksTransport.swift */; }; + F06045EC2B2322A500B2D37A /* Jittered.swift in Sources */ = {isa = PBXBuildFile; fileRef = F06045EB2B2322A500B2D37A /* Jittered.swift */; }; F07BF2622A26279100042943 /* RedeemVoucherOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = F07BF2612A26279100042943 /* RedeemVoucherOperation.swift */; }; + F07C9D952B220C77006F1C5E /* libshadowsocks_proxy.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 01F1FF1D29F0627D007083C3 /* libshadowsocks_proxy.a */; }; F07CFF2029F2720E008C0343 /* RegisteredDeviceInAppNotificationProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = F07CFF1F29F2720E008C0343 /* RegisteredDeviceInAppNotificationProvider.swift */; }; F09A297B2A9F8A9B00EA3B6F /* LogoutDialogueView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F09A29782A9F8A9B00EA3B6F /* LogoutDialogueView.swift */; }; F09A297C2A9F8A9B00EA3B6F /* VoucherTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = F09A29792A9F8A9B00EA3B6F /* VoucherTextField.swift */; }; @@ -680,6 +657,13 @@ F0DA87472A9CB9A2006044F1 /* AccountExpiryRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0DA87462A9CB9A2006044F1 /* AccountExpiryRow.swift */; }; F0DA87492A9CBA9F006044F1 /* AccountDeviceRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0DA87482A9CBA9F006044F1 /* AccountDeviceRow.swift */; }; F0DA874B2A9CBACB006044F1 /* AccountNumberRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0DA874A2A9CBACB006044F1 /* AccountNumberRow.swift */; }; + F0DDE4142B220458006B57A7 /* ShadowSocksProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0DDE40F2B220458006B57A7 /* ShadowSocksProxy.swift */; }; + F0DDE4152B220458006B57A7 /* ShadowsocksConfigurationCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0DDE4102B220458006B57A7 /* ShadowsocksConfigurationCache.swift */; }; + F0DDE4162B220458006B57A7 /* TransportProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0DDE4112B220458006B57A7 /* TransportProvider.swift */; }; + F0DDE4182B220458006B57A7 /* ShadowsocksConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0DDE4132B220458006B57A7 /* ShadowsocksConfiguration.swift */; }; + F0DDE42A2B220A15006B57A7 /* Haversine.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0DDE4272B220A15006B57A7 /* Haversine.swift */; }; + F0DDE42B2B220A15006B57A7 /* RelaySelector.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0DDE4282B220A15006B57A7 /* RelaySelector.swift */; }; + F0DDE42C2B220A15006B57A7 /* Midpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0DDE4292B220A15006B57A7 /* Midpoint.swift */; }; F0E3618B2A4ADD2F00AEEF2B /* WelcomeContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0E3618A2A4ADD2F00AEEF2B /* WelcomeContentView.swift */; }; F0E8CC032A4C753B007ED3B4 /* WelcomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0E8CC022A4C753B007ED3B4 /* WelcomeViewController.swift */; }; F0E8CC0A2A4EE127007ED3B4 /* SetupAccountCompletedContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0E8CC092A4EE127007ED3B4 /* SetupAccountCompletedContentView.swift */; }; @@ -694,27 +678,6 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 063F02772902B63F001FA09F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 58CE5E58224146200008646E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 063F02722902B63F001FA09F; - remoteInfo = RelayCache; - }; - 063F02812902B6F8001FA09F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 58CE5E58224146200008646E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 06799ABB28F98E1D00ACD94E; - remoteInfo = MullvadREST; - }; - 063F028B2902B83C001FA09F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 58CE5E58224146200008646E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 063F02722902B63F001FA09F; - remoteInfo = RelayCache; - }; 06410DF9292C4ABC00AFC18C /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 58CE5E58224146200008646E /* Project object */; @@ -750,13 +713,6 @@ remoteGlobalIDString = 5840231E2A406BF5007B27AC; remoteInfo = TunnelObfuscation; }; - 586A0DD62A20E4A9006C731C /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 58CE5E58224146200008646E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 06799ABB28F98E1D00ACD94E; - remoteInfo = MullvadREST; - }; 58B2FDD72AA71D2A003EB5C6 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 58CE5E58224146200008646E /* Project object */; @@ -890,20 +846,6 @@ remoteGlobalIDString = 58D223D4294C8E5E0029F5F8; remoteInfo = MullvadTypes; }; - 58D2242D294C94830029F5F8 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 58CE5E58224146200008646E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5898D29729017DAC00EB5EBA; - remoteInfo = RelaySelector; - }; - 58D22431294C94890029F5F8 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 58CE5E58224146200008646E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5898D29729017DAC00EB5EBA; - remoteInfo = RelaySelector; - }; 58EED36D29FBEF040000CBAF /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 58CE5E58224146200008646E /* Project object */; @@ -1002,55 +944,20 @@ remoteGlobalIDString = 5840231E2A406BF5007B27AC; remoteInfo = TunnelObfuscation; }; - A97F1F452A1F4E1A00ECEFDE /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 58CE5E58224146200008646E /* Project object */; - proxyType = 1; - remoteGlobalIDString = A97F1F402A1F4E1A00ECEFDE; - remoteInfo = MullvadTransport; - }; - A988DF222ADD305300D807EF /* PBXContainerItemProxy */ = { + A9EC20F12A5D79ED0040D56E /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 58CE5E58224146200008646E /* Project object */; proxyType = 1; - remoteGlobalIDString = 5898D29729017DAC00EB5EBA; - remoteInfo = RelaySelector; + remoteGlobalIDString = 5840231E2A406BF5007B27AC; + remoteInfo = TunnelObfuscation; }; - A9B2CF702A1F64B20013CC6C /* PBXContainerItemProxy */ = { + F04F959E2B21D02700431E08 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 58CE5E58224146200008646E /* Project object */; proxyType = 1; remoteGlobalIDString = 06799ABB28F98E1D00ACD94E; remoteInfo = MullvadREST; }; - A9D99BA12A1F807700DE27D3 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 58CE5E58224146200008646E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 063F02722902B63F001FA09F; - remoteInfo = RelayCache; - }; - A9D99BA32A1F807A00DE27D3 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 58CE5E58224146200008646E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5898D29729017DAC00EB5EBA; - remoteInfo = RelaySelector; - }; - A9D99BA72A1F81B100DE27D3 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 58CE5E58224146200008646E /* Project object */; - proxyType = 1; - remoteGlobalIDString = A97F1F402A1F4E1A00ECEFDE; - remoteInfo = MullvadTransport; - }; - A9EC20F12A5D79ED0040D56E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 58CE5E58224146200008646E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5840231E2A406BF5007B27AC; - remoteInfo = TunnelObfuscation; - }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -1067,10 +974,8 @@ 7ABCA5B42A9349F20044A708 /* Routing.framework in Embed Frameworks */, 06799AD228F98E1D00ACD94E /* MullvadREST.framework in Embed Frameworks */, 58D223CD294C8BCB0029F5F8 /* Operations.framework in Embed Frameworks */, - A97F1F482A1F4E1A00ECEFDE /* MullvadTransport.framework in Embed Frameworks */, 58C7A44A2A863F490060C66F /* PacketTunnelCore.framework in Embed Frameworks */, 58F0974F2A20C31100DA2DAD /* WireGuardKitTypes in Embed Frameworks */, - 063F027A2902B63F001FA09F /* RelayCache.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -1104,15 +1009,6 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; - 5898D29629017DAC00EB5EBA /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = "include/$(PRODUCT_NAME)"; - dstSubfolderSpec = 16; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; 58CE5E85224146470008646E /* Embed Foundation Extensions */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -1157,13 +1053,10 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 01F1FF1B29F06124007083C3 /* ShadowsocksProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShadowsocksProxy.swift; sourceTree = ""; }; 01F1FF1D29F0627D007083C3 /* libshadowsocks_proxy.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libshadowsocks_proxy.a; path = ../target/debug/libshadowsocks_proxy.a; sourceTree = ""; }; 062B45BB28FD8C3B00746E77 /* RESTDefaults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RESTDefaults.swift; sourceTree = ""; }; 063687AF28EB083800BE7161 /* ProxyURLRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProxyURLRequest.swift; sourceTree = ""; }; 063687B928EB234F00BE7161 /* PacketTunnelTransport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PacketTunnelTransport.swift; sourceTree = ""; }; - 063F02732902B63F001FA09F /* RelayCache.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RelayCache.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 063F02752902B63F001FA09F /* RelayCache.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RelayCache.h; sourceTree = ""; }; 06410DFD292CE18F00AFC18C /* KeychainSettingsStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainSettingsStore.swift; sourceTree = ""; }; 06410E03292D0F7100AFC18C /* SettingsParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsParser.swift; sourceTree = ""; }; 06410E06292D108E00AFC18C /* SettingsStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsStore.swift; sourceTree = ""; }; @@ -1192,13 +1085,12 @@ 06FAE67328F83CA40033DD93 /* RESTAPIProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RESTAPIProxy.swift; sourceTree = ""; }; 06FAE67428F83CA40033DD93 /* RESTRequestHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RESTRequestHandler.swift; sourceTree = ""; }; 06FAE67528F83CA40033DD93 /* RESTTaskIdentifier.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RESTTaskIdentifier.swift; sourceTree = ""; }; - 06FAE67628F83CA40033DD93 /* RESTRetryStrategy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RESTRetryStrategy.swift; sourceTree = ""; }; + 06FAE67628F83CA40033DD93 /* RetryStrategy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RetryStrategy.swift; sourceTree = ""; }; 06FAE67728F83CA40033DD93 /* ServerRelaysResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServerRelaysResponse.swift; sourceTree = ""; }; 06FAE67828F83CA50033DD93 /* RESTCreateApplePaymentResponse+Localization.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "RESTCreateApplePaymentResponse+Localization.swift"; sourceTree = ""; }; 06FAE67928F83CA50033DD93 /* RESTAuthorization.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RESTAuthorization.swift; sourceTree = ""; }; 06FAE67A28F83CA50033DD93 /* RESTDevicesProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RESTDevicesProxy.swift; sourceTree = ""; }; 06FAE67B28F83CA50033DD93 /* REST.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = REST.swift; sourceTree = ""; }; - 06FAE67C28F83CA50033DD93 /* URLSessionTransport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URLSessionTransport.swift; sourceTree = ""; }; 06FAE67D28F83CA50033DD93 /* RESTTransport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RESTTransport.swift; sourceTree = ""; }; 5802EBC42A8E44AC00E5CE4C /* AppRoutes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppRoutes.swift; sourceTree = ""; }; 5802EBC62A8E457A00E5CE4C /* AppRouteProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppRouteProtocol.swift; sourceTree = ""; }; @@ -1340,7 +1232,6 @@ 586E54FA27A2DF6D0029B88B /* SendTunnelProviderMessageOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendTunnelProviderMessageOperation.swift; sourceTree = ""; }; 586E7A2C2A987689006DAB1B /* SettingsReaderProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsReaderProtocol.swift; sourceTree = ""; }; 586E8DB72AAF4AC4007BF3DA /* Task+Duration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Task+Duration.swift"; sourceTree = ""; }; - 586F2BE129F6916F009E6924 /* shadowsocks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = shadowsocks.h; path = "shadowsocks-proxy/include/shadowsocks.h"; sourceTree = ""; }; 5871167E2910035700D41AAC /* PreferencesInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesInteractor.swift; sourceTree = ""; }; 5871FB95254ADE4E0051A0A4 /* ConsolidatedApplicationLog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConsolidatedApplicationLog.swift; sourceTree = ""; }; 5871FB9F254C26BF0051A0A4 /* NSRegularExpression+IPAddress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSRegularExpression+IPAddress.swift"; sourceTree = ""; }; @@ -1349,7 +1240,6 @@ 5875960926F371FC00BF6711 /* Tunnel+Messaging.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Tunnel+Messaging.swift"; sourceTree = ""; }; 5877F94D2A0A59AA0052D9E9 /* NotificationResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationResponse.swift; sourceTree = ""; }; 58781CC822AE7CA8009B9D8E /* RelayConstraints.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayConstraints.swift; sourceTree = ""; }; - 58781CD422AFBA39009B9D8E /* RelaySelector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelaySelector.swift; sourceTree = ""; }; 5878A26E2907E7E00096FC88 /* ProblemReportInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProblemReportInteractor.swift; sourceTree = ""; }; 5878A27029091CF20096FC88 /* AccountInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountInteractor.swift; sourceTree = ""; }; 5878A27229091D6D0096FC88 /* TunnelBlockObserver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelBlockObserver.swift; sourceTree = ""; }; @@ -1398,7 +1288,6 @@ 5896AE85246D6AD8005B36CB /* CustomDateComponentsFormattingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomDateComponentsFormattingTests.swift; sourceTree = ""; }; 5896CEF126972DEB00B0FAE8 /* AccountContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountContentView.swift; sourceTree = ""; }; 5897F1732913EAF800AF5695 /* ExponentialBackoff.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExponentialBackoff.swift; sourceTree = ""; }; - 5898D29829017DAC00EB5EBA /* libRelaySelector.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRelaySelector.a; sourceTree = BUILT_PRODUCTS_DIR; }; 5898D2A7290182B000EB5EBA /* TunnelProviderReply.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelProviderReply.swift; sourceTree = ""; }; 5898D2AD290185D200EB5EBA /* ProxyURLResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProxyURLResponse.swift; sourceTree = ""; }; 5898D2AF2902A67C00EB5EBA /* RelayLocation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayLocation.swift; sourceTree = ""; }; @@ -1497,7 +1386,6 @@ 58E07298288031D5008902F8 /* WireGuardAdapterError+Localization.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WireGuardAdapterError+Localization.swift"; sourceTree = ""; }; 58E0729E28814ACC008902F8 /* WireGuardLogLevel+Logging.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WireGuardLogLevel+Logging.swift"; sourceTree = ""; }; 58E0A98727C8F46300FE6BDD /* Tunnel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tunnel.swift; sourceTree = ""; }; - 58E0E2832A3718CE002E3420 /* URLSessionShadowsocksTransport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLSessionShadowsocksTransport.swift; sourceTree = ""; }; 58E11187292FA11F009FCA84 /* SettingsMigrationUIHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsMigrationUIHandler.swift; sourceTree = ""; }; 58E20770274672CA00DE5D77 /* LaunchViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchViewController.swift; sourceTree = ""; }; 58E25F802837BBBB002CFB2C /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; @@ -1639,19 +1527,15 @@ A92ECC272A7802AB0052F1B1 /* StoredDeviceData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoredDeviceData.swift; sourceTree = ""; }; A92ECC2B2A7803A50052F1B1 /* DeviceState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceState.swift; sourceTree = ""; }; A9467E7E2A29DEFE000DC21F /* RelayCacheTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayCacheTests.swift; sourceTree = ""; }; - A9467E872A2DCD57000DC21F /* ShadowsocksConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShadowsocksConfiguration.swift; sourceTree = ""; }; - A9467E8A2A2E0317000DC21F /* ShadowsocksConfigurationCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShadowsocksConfigurationCache.swift; sourceTree = ""; }; A97D25AD2B0BB18100946B2D /* ProtocolObfuscator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProtocolObfuscator.swift; sourceTree = ""; }; A97D25AF2B0BB5C400946B2D /* ProtocolObfuscationStub.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProtocolObfuscationStub.swift; sourceTree = ""; }; A97D25B12B0CB02D00946B2D /* ProtocolObfuscatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProtocolObfuscatorTests.swift; sourceTree = ""; }; A97D25B32B0CB59300946B2D /* TunnelObfuscationStub.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelObfuscationStub.swift; sourceTree = ""; }; A97D30162AE6B5E90045C0E4 /* StoredWgKeyData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoredWgKeyData.swift; sourceTree = ""; }; - A97F1F412A1F4E1A00ECEFDE /* MullvadTransport.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MullvadTransport.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - A97F1F432A1F4E1A00ECEFDE /* MullvadTransport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MullvadTransport.h; sourceTree = ""; }; A97FF54F2A0D2FFC00900996 /* NSFileCoordinator+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSFileCoordinator+Extensions.swift"; sourceTree = ""; }; A988DF252ADE86ED00D807EF /* WireGuardObfuscationSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WireGuardObfuscationSettings.swift; sourceTree = ""; }; A988DF282ADE880300D807EF /* TunnelSettingsV3.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelSettingsV3.swift; sourceTree = ""; }; - A9A1DE782AD5708E0073F689 /* RESTTransportStrategy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RESTTransportStrategy.swift; sourceTree = ""; }; + A9A1DE782AD5708E0073F689 /* TransportStrategy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransportStrategy.swift; sourceTree = ""; }; A9A5F9A12ACB003D0083449F /* TunnelManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelManagerTests.swift; sourceTree = ""; }; A9A8A8EA2A262AB30086D569 /* FileCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileCache.swift; sourceTree = ""; }; A9B6AC172ADE8F4300F7802A /* MigrationManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MigrationManagerTests.swift; sourceTree = ""; }; @@ -1660,15 +1544,12 @@ A9C342C42ACC42130045F00E /* ServerRelaysResponse+Stubs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ServerRelaysResponse+Stubs.swift"; sourceTree = ""; }; A9CF11FC2A0518E7001D9565 /* AddressCacheTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddressCacheTests.swift; sourceTree = ""; }; A9D96B192A8247C100A5C673 /* MigrationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MigrationManager.swift; sourceTree = ""; }; - A9D99B9F2A1F7F3A00DE27D3 /* TransportProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransportProvider.swift; sourceTree = ""; }; A9E031762ACB08950095D843 /* UIApplication+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIApplication+Extensions.swift"; sourceTree = ""; }; A9E031792ACB0AE70095D843 /* UIApplication+Stubs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIApplication+Stubs.swift"; sourceTree = ""; }; A9E0317B2ACBFC7E0095D843 /* TunnelStore+Stubs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TunnelStore+Stubs.swift"; sourceTree = ""; }; A9E0317D2ACC32920095D843 /* TunnelStatusBlockObserver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelStatusBlockObserver.swift; sourceTree = ""; }; A9E034632ABB302000E59A5A /* UIEdgeInsets+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIEdgeInsets+Extensions.swift"; sourceTree = ""; }; - A9EC20E52A5C488D0040D56E /* Haversine.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Haversine.swift; sourceTree = ""; }; A9EC20E72A5D3A8C0040D56E /* CoordinatesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoordinatesTests.swift; sourceTree = ""; }; - A9EC20F32A5D96030040D56E /* Midpoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Midpoint.swift; sourceTree = ""; }; A9F360332AAB626300F53531 /* VPNConnectionProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPNConnectionProtocol.swift; sourceTree = ""; }; E1187ABA289BBB850024E748 /* OutOfTimeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OutOfTimeViewController.swift; sourceTree = ""; }; E1187ABB289BBB850024E748 /* OutOfTimeContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OutOfTimeContentView.swift; sourceTree = ""; }; @@ -1677,7 +1558,11 @@ F028A5692A34D4E700C0CAA3 /* RedeemVoucherViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RedeemVoucherViewController.swift; sourceTree = ""; }; F028A56B2A34D8E600C0CAA3 /* AddCreditSucceededViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddCreditSucceededViewController.swift; sourceTree = ""; }; F03580242A13842C00E5DAFD /* IncreasedHitButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IncreasedHitButton.swift; sourceTree = ""; }; + F04F95A02B21D24400431E08 /* shadowsocks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shadowsocks.h; sourceTree = ""; }; F04FBE602A8379EE009278D7 /* AppPreferences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppPreferences.swift; sourceTree = ""; }; + F06045E52B231EB700B2D37A /* URLSessionTransport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLSessionTransport.swift; sourceTree = ""; }; + F06045E92B23217E00B2D37A /* ShadowsocksTransport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShadowsocksTransport.swift; sourceTree = ""; }; + F06045EB2B2322A500B2D37A /* Jittered.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Jittered.swift; sourceTree = ""; }; F07BF2572A26112D00042943 /* InputTextFormatterTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InputTextFormatterTests.swift; sourceTree = ""; }; F07BF2612A26279100042943 /* RedeemVoucherOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RedeemVoucherOperation.swift; sourceTree = ""; }; F07CFF1F29F2720E008C0343 /* RegisteredDeviceInAppNotificationProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegisteredDeviceInAppNotificationProvider.swift; sourceTree = ""; }; @@ -1699,6 +1584,13 @@ F0DA87462A9CB9A2006044F1 /* AccountExpiryRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountExpiryRow.swift; sourceTree = ""; }; F0DA87482A9CBA9F006044F1 /* AccountDeviceRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountDeviceRow.swift; sourceTree = ""; }; F0DA874A2A9CBACB006044F1 /* AccountNumberRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountNumberRow.swift; sourceTree = ""; }; + F0DDE40F2B220458006B57A7 /* ShadowSocksProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShadowSocksProxy.swift; sourceTree = ""; }; + F0DDE4102B220458006B57A7 /* ShadowsocksConfigurationCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShadowsocksConfigurationCache.swift; sourceTree = ""; }; + F0DDE4112B220458006B57A7 /* TransportProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransportProvider.swift; sourceTree = ""; }; + F0DDE4132B220458006B57A7 /* ShadowsocksConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShadowsocksConfiguration.swift; sourceTree = ""; }; + F0DDE4272B220A15006B57A7 /* Haversine.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Haversine.swift; sourceTree = ""; }; + F0DDE4282B220A15006B57A7 /* RelaySelector.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RelaySelector.swift; sourceTree = ""; }; + F0DDE4292B220A15006B57A7 /* Midpoint.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Midpoint.swift; sourceTree = ""; }; F0E3618A2A4ADD2F00AEEF2B /* WelcomeContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeContentView.swift; sourceTree = ""; }; F0E8CC022A4C753B007ED3B4 /* WelcomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeViewController.swift; sourceTree = ""; }; F0E8CC092A4EE127007ED3B4 /* SetupAccountCompletedContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SetupAccountCompletedContentView.swift; sourceTree = ""; }; @@ -1713,14 +1605,6 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 063F02702902B63F001FA09F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 586A0DD42A20E4A9006C731C /* MullvadREST.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 06799AB928F98E1D00ACD94E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -1729,6 +1613,7 @@ 586A0DD12A20E371006C731C /* WireGuardKitTypes in Frameworks */, 58D2241D294C91D20029F5F8 /* MullvadLogging.framework in Frameworks */, 58D223DC294C8EB90029F5F8 /* MullvadTypes.framework in Frameworks */, + F07C9D952B220C77006F1C5E /* libshadowsocks_proxy.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1749,14 +1634,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 5898D29529017DAC00EB5EBA /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5898D2A22901801000EB5EBA /* MullvadREST.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 589A454F28E094B300565204 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -1769,7 +1646,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 584F99202902CBDD001F858D /* libRelaySelector.a in Frameworks */, 58915D6E2A26037A0066445B /* WireGuardKitTypes in Frameworks */, 588E4EAE28FEEDD8008046E3 /* MullvadREST.framework in Frameworks */, ); @@ -1802,7 +1678,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - A988DF242ADD307200D807EF /* libRelaySelector.a in Frameworks */, A94D691B2ABAD66700413DD4 /* WireGuardKitTypes in Frameworks */, 58C7A43E2A863F470060C66F /* PacketTunnelCore.framework in Frameworks */, ); @@ -1814,14 +1689,11 @@ files = ( 58F0974E2A20C31100DA2DAD /* WireGuardKitTypes in Frameworks */, 58C7A4492A863F490060C66F /* PacketTunnelCore.framework in Frameworks */, - 5898D2A92901844E00EB5EBA /* libRelaySelector.a in Frameworks */, 58D223F9294C8FF00029F5F8 /* MullvadLogging.framework in Frameworks */, 58D223E6294C8F120029F5F8 /* MullvadTypes.framework in Frameworks */, 7ABCA5B32A9349F20044A708 /* Routing.framework in Frameworks */, 58D223CC294C8BCB0029F5F8 /* Operations.framework in Frameworks */, 06799AD128F98E1D00ACD94E /* MullvadREST.framework in Frameworks */, - 063F02792902B63F001FA09F /* RelayCache.framework in Frameworks */, - A97F1F472A1F4E1A00ECEFDE /* MullvadTransport.framework in Frameworks */, 58B2FDD92AA71D2A003EB5C6 /* MullvadSettings.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1833,8 +1705,6 @@ 589C6A7D2A45B06800DAD3EF /* TunnelObfuscation.framework in Frameworks */, 58FE25C62AA72779003D1918 /* PacketTunnelCore.framework in Frameworks */, 58FE25CE2AA72802003D1918 /* MullvadSettings.framework in Frameworks */, - A9D99BA92A1F81B700DE27D3 /* MullvadTransport.framework in Frameworks */, - 5898D2AB2901845400EB5EBA /* libRelaySelector.a in Frameworks */, 58D223EA294C8F3C0029F5F8 /* MullvadTypes.framework in Frameworks */, 58D223C6294C8B970029F5F8 /* Operations.framework in Frameworks */, 58153071294CBE8B00D1702E /* MullvadREST.framework in Frameworks */, @@ -1899,17 +1769,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - A97F1F3E2A1F4E1A00ECEFDE /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - A9D99BA62A1F809C00DE27D3 /* libRelaySelector.a in Frameworks */, - A9D99BA52A1F808900DE27D3 /* RelayCache.framework in Frameworks */, - A9B2CF722A1F64CD0013CC6C /* MullvadREST.framework in Frameworks */, - 01F1FF1E29F0627D007083C3 /* libshadowsocks_proxy.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -1917,24 +1776,6 @@ isa = PBXGroup; children = ( 06799AB428F98CE700ACD94E /* le_root_cert.cer */, - ); - path = Assets; - sourceTree = ""; - }; - 063F02742902B63F001FA09F /* RelayCache */ = { - isa = PBXGroup; - children = ( - 063F028E2902BD0F001FA09F /* Assets */, - 063F02752902B63F001FA09F /* RelayCache.h */, - 585DA87626B024A600B8C587 /* CachedRelays.swift */, - 5820675A26E6576800655B05 /* RelayCache.swift */, - ); - path = RelayCache; - sourceTree = ""; - }; - 063F028E2902BD0F001FA09F /* Assets */ = { - isa = PBXGroup; - children = ( 58F3C0A524A50155003E76BE /* relays.json */, ); path = Assets; @@ -1943,37 +1784,14 @@ 06799ABD28F98E1D00ACD94E /* MullvadREST */ = { isa = PBXGroup; children = ( - 06AC114128F8413A0037AF9A /* AddressCache.swift */, + F06045F02B2324DA00B2D37A /* ApiHandlers */, 062B45A228FD4C0F00746E77 /* Assets */, - 5897F1732913EAF800AF5695 /* ExponentialBackoff.swift */, - 06FAE67128F83CA40033DD93 /* HTTP.swift */, 582FFA82290A84E700895745 /* Info.plist */, 06799ABE28F98E1D00ACD94E /* MullvadREST.h */, + F0DC779F2B2222D20087F09D /* Relay */, 06FAE67B28F83CA50033DD93 /* REST.swift */, - 06FAE67228F83CA40033DD93 /* RESTAccessTokenManager.swift */, - 06FAE66828F83CA30033DD93 /* RESTAccountsProxy.swift */, - 06FAE67328F83CA40033DD93 /* RESTAPIProxy.swift */, - 06FAE67028F83CA40033DD93 /* RESTAuthenticationProxy.swift */, - 06FAE67928F83CA50033DD93 /* RESTAuthorization.swift */, - 06FAE66C28F83CA40033DD93 /* RESTCoding.swift */, - 062B45BB28FD8C3B00746E77 /* RESTDefaults.swift */, - 06FAE67A28F83CA50033DD93 /* RESTDevicesProxy.swift */, - 06FAE66928F83CA30033DD93 /* RESTError.swift */, - 06FAE66F28F83CA40033DD93 /* RESTNetworkOperation.swift */, - 06FAE66E28F83CA40033DD93 /* RESTProxy.swift */, - 06FAE66728F83CA30033DD93 /* RESTProxyFactory.swift */, - 589E76BF2A9378F100E502F3 /* RESTRequestExecutor.swift */, - 06FAE66A28F83CA30033DD93 /* RESTRequestFactory.swift */, - 06FAE67428F83CA40033DD93 /* RESTRequestHandler.swift */, - 06FAE66628F83CA30033DD93 /* RESTResponseHandler.swift */, - 06FAE67628F83CA40033DD93 /* RESTRetryStrategy.swift */, - 06FAE67528F83CA40033DD93 /* RESTTaskIdentifier.swift */, - 06FAE67D28F83CA50033DD93 /* RESTTransport.swift */, - 58E7BA182A975DF70068EC3A /* RESTTransportProvider.swift */, - A9A1DE782AD5708E0073F689 /* RESTTransportStrategy.swift */, - 06FAE66528F83CA30033DD93 /* RESTURLSession.swift */, - 06FAE67728F83CA40033DD93 /* ServerRelaysResponse.swift */, - 06FAE66B28F83CA30033DD93 /* SSLPinningURLSessionDelegate.swift */, + F0DC77A12B2313330087F09D /* RetryStrategy */, + F0DC77A02B2223290087F09D /* Transport */, ); path = MullvadREST; sourceTree = ""; @@ -2501,16 +2319,6 @@ path = DeviceCheck; sourceTree = ""; }; - 5898D29929017DAC00EB5EBA /* RelaySelector */ = { - isa = PBXGroup; - children = ( - A9EC20E52A5C488D0040D56E /* Haversine.swift */, - A9EC20F32A5D96030040D56E /* Midpoint.swift */, - 58781CD422AFBA39009B9D8E /* RelaySelector.swift */, - ); - path = RelaySelector; - sourceTree = ""; - }; 589A454A28DDF59B00565204 /* Shared */ = { isa = PBXGroup; children = ( @@ -2755,12 +2563,9 @@ 06799ABD28F98E1D00ACD94E /* MullvadREST */, 58FBFBE7291622580020E046 /* MullvadRESTTests */, 58B2FDD42AA71D2A003EB5C6 /* MullvadSettings */, - 063F02742902B63F001FA09F /* RelayCache */, - 5898D29929017DAC00EB5EBA /* RelaySelector */, 58D223A6294C8A490029F5F8 /* Operations */, 589A455328E094B300565204 /* OperationsTests */, 58CE5E7A224146470008646E /* PacketTunnel */, - A97F1F422A1F4E1A00ECEFDE /* MullvadTransport */, 584023202A406BF5007B27AC /* TunnelObfuscation */, 58695A9E2A4ADA9200328DB3 /* TunnelObfuscationTests */, 7A83C3FC2A55B39500DFB83A /* TestPlans */, @@ -2783,13 +2588,10 @@ 58D0C79323F1CE7000FE9BA7 /* MullvadVPNScreenshots.xctest */, 589A455228E094B300565204 /* OperationsTests.xctest */, 06799ABC28F98E1D00ACD94E /* MullvadREST.framework */, - 063F02732902B63F001FA09F /* RelayCache.framework */, - 5898D29829017DAC00EB5EBA /* libRelaySelector.a */, 58FBFBE6291622580020E046 /* MullvadRESTTests.xctest */, 58D223A5294C8A480029F5F8 /* Operations.framework */, 58D223D5294C8E5E0029F5F8 /* MullvadTypes.framework */, 58D223F3294C8FF00029F5F8 /* MullvadLogging.framework */, - A97F1F412A1F4E1A00ECEFDE /* MullvadTransport.framework */, 5840231F2A406BF5007B27AC /* TunnelObfuscation.framework */, 58695A9D2A4ADA9100328DB3 /* TunnelObfuscationTests.xctest */, 58C7A4362A863F440060C66F /* PacketTunnelCore.framework */, @@ -3066,21 +2868,6 @@ path = RelayFilter; sourceTree = ""; }; - A97F1F422A1F4E1A00ECEFDE /* MullvadTransport */ = { - isa = PBXGroup; - children = ( - A97F1F432A1F4E1A00ECEFDE /* MullvadTransport.h */, - 586F2BE129F6916F009E6924 /* shadowsocks.h */, - 06FAE67C28F83CA50033DD93 /* URLSessionTransport.swift */, - 58E0E2832A3718CE002E3420 /* URLSessionShadowsocksTransport.swift */, - 01F1FF1B29F06124007083C3 /* ShadowsocksProxy.swift */, - A9D99B9F2A1F7F3A00DE27D3 /* TransportProvider.swift */, - A9467E872A2DCD57000DC21F /* ShadowsocksConfiguration.swift */, - A9467E8A2A2E0317000DC21F /* ShadowsocksConfigurationCache.swift */, - ); - path = MullvadTransport; - sourceTree = ""; - }; F028A5472A336E1900C0CAA3 /* RedeemVoucher */ = { isa = PBXGroup; children = ( @@ -3095,6 +2882,35 @@ path = RedeemVoucher; sourceTree = ""; }; + F06045F02B2324DA00B2D37A /* ApiHandlers */ = { + isa = PBXGroup; + children = ( + 06AC114128F8413A0037AF9A /* AddressCache.swift */, + 06FAE67128F83CA40033DD93 /* HTTP.swift */, + 06FAE67228F83CA40033DD93 /* RESTAccessTokenManager.swift */, + 06FAE66828F83CA30033DD93 /* RESTAccountsProxy.swift */, + 06FAE67328F83CA40033DD93 /* RESTAPIProxy.swift */, + 06FAE67028F83CA40033DD93 /* RESTAuthenticationProxy.swift */, + 06FAE67928F83CA50033DD93 /* RESTAuthorization.swift */, + 06FAE66C28F83CA40033DD93 /* RESTCoding.swift */, + 062B45BB28FD8C3B00746E77 /* RESTDefaults.swift */, + 06FAE67A28F83CA50033DD93 /* RESTDevicesProxy.swift */, + 06FAE66928F83CA30033DD93 /* RESTError.swift */, + 06FAE66F28F83CA40033DD93 /* RESTNetworkOperation.swift */, + 06FAE66E28F83CA40033DD93 /* RESTProxy.swift */, + 06FAE66728F83CA30033DD93 /* RESTProxyFactory.swift */, + 589E76BF2A9378F100E502F3 /* RESTRequestExecutor.swift */, + 06FAE66A28F83CA30033DD93 /* RESTRequestFactory.swift */, + 06FAE67428F83CA40033DD93 /* RESTRequestHandler.swift */, + 06FAE66628F83CA30033DD93 /* RESTResponseHandler.swift */, + 06FAE67528F83CA40033DD93 /* RESTTaskIdentifier.swift */, + 06FAE66528F83CA30033DD93 /* RESTURLSession.swift */, + 06FAE67728F83CA40033DD93 /* ServerRelaysResponse.swift */, + 06FAE66B28F83CA30033DD93 /* SSLPinningURLSessionDelegate.swift */, + ); + path = ApiHandlers; + sourceTree = ""; + }; F09D04B82AE94F27003D4F89 /* GeneralAPIs */ = { isa = PBXGroup; children = ( @@ -3104,6 +2920,61 @@ path = GeneralAPIs; sourceTree = ""; }; + F0DC779F2B2222D20087F09D /* Relay */ = { + isa = PBXGroup; + children = ( + 585DA87626B024A600B8C587 /* CachedRelays.swift */, + F0DDE4272B220A15006B57A7 /* Haversine.swift */, + F0DDE4292B220A15006B57A7 /* Midpoint.swift */, + 5820675A26E6576800655B05 /* RelayCache.swift */, + F0DDE4282B220A15006B57A7 /* RelaySelector.swift */, + ); + path = Relay; + sourceTree = ""; + }; + F0DC77A02B2223290087F09D /* Transport */ = { + isa = PBXGroup; + children = ( + F0DC77A32B2315800087F09D /* Direct */, + 06FAE67D28F83CA50033DD93 /* RESTTransport.swift */, + 58E7BA182A975DF70068EC3A /* RESTTransportProvider.swift */, + F0DC77A22B2314EF0087F09D /* Shadowsocks */, + F0DDE4112B220458006B57A7 /* TransportProvider.swift */, + A9A1DE782AD5708E0073F689 /* TransportStrategy.swift */, + ); + path = Transport; + sourceTree = ""; + }; + F0DC77A12B2313330087F09D /* RetryStrategy */ = { + isa = PBXGroup; + children = ( + 5897F1732913EAF800AF5695 /* ExponentialBackoff.swift */, + F06045EB2B2322A500B2D37A /* Jittered.swift */, + 06FAE67628F83CA40033DD93 /* RetryStrategy.swift */, + ); + path = RetryStrategy; + sourceTree = ""; + }; + F0DC77A22B2314EF0087F09D /* Shadowsocks */ = { + isa = PBXGroup; + children = ( + F04F95A02B21D24400431E08 /* shadowsocks.h */, + F0DDE4132B220458006B57A7 /* ShadowsocksConfiguration.swift */, + F0DDE4102B220458006B57A7 /* ShadowsocksConfigurationCache.swift */, + F0DDE40F2B220458006B57A7 /* ShadowSocksProxy.swift */, + F06045E92B23217E00B2D37A /* ShadowsocksTransport.swift */, + ); + path = Shadowsocks; + sourceTree = ""; + }; + F0DC77A32B2315800087F09D /* Direct */ = { + isa = PBXGroup; + children = ( + F06045E52B231EB700B2D37A /* URLSessionTransport.swift */, + ); + path = Direct; + sourceTree = ""; + }; F0E361892A4ADCF500AEEF2B /* Welcome */ = { isa = PBXGroup; children = ( @@ -3156,18 +3027,11 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 063F026E2902B63F001FA09F /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 063F02762902B63F001FA09F /* RelayCache.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 06799AB728F98E1D00ACD94E /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + F04F95A12B21D24400431E08 /* shadowsocks.h in Headers */, 06799ACE28F98E1D00ACD94E /* MullvadREST.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -3231,15 +3095,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - A97F1F3C2A1F4E1A00ECEFDE /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - A97F1F442A1F4E1A00ECEFDE /* MullvadTransport.h in Headers */, - A93D13782A1F60A6001EB0B1 /* shadowsocks.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXHeadersBuildPhase section */ /* Begin PBXLegacyTarget section */ @@ -3260,33 +3115,12 @@ /* End PBXLegacyTarget section */ /* Begin PBXNativeTarget section */ - 063F02722902B63F001FA09F /* RelayCache */ = { - isa = PBXNativeTarget; - buildConfigurationList = 063F027D2902B63F001FA09F /* Build configuration list for PBXNativeTarget "RelayCache" */; - buildPhases = ( - 063F028D2902BC8E001FA09F /* Run prebuild script */, - 063F026E2902B63F001FA09F /* Headers */, - 063F026F2902B63F001FA09F /* Sources */, - 063F02702902B63F001FA09F /* Frameworks */, - 063F02712902B63F001FA09F /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 063F02822902B6F8001FA09F /* PBXTargetDependency */, - 586A0DD72A20E4A9006C731C /* PBXTargetDependency */, - ); - name = RelayCache; - packageProductDependencies = ( - ); - productName = RelayCache; - productReference = 063F02732902B63F001FA09F /* RelayCache.framework */; - productType = "com.apple.product-type.framework"; - }; 06799ABB28F98E1D00ACD94E /* MullvadREST */ = { isa = PBXNativeTarget; buildConfigurationList = 06799AD328F98E1D00ACD94E /* Build configuration list for PBXNativeTarget "MullvadREST" */; buildPhases = ( + F05F39962B21C704006E60A7 /* Prebuild relays */, + F0ACE1F32B21CB9A0045C1B8 /* Build Shadowsocks */, 06799AB728F98E1D00ACD94E /* Headers */, 06799AB828F98E1D00ACD94E /* Sources */, 06799AB928F98E1D00ACD94E /* Frameworks */, @@ -3322,6 +3156,7 @@ buildRules = ( ); dependencies = ( + F04F959F2B21D02700431E08 /* PBXTargetDependency */, A91614D32B108F4D00F416EB /* PBXTargetDependency */, ); name = TunnelObfuscation; @@ -3347,23 +3182,6 @@ productReference = 58695A9D2A4ADA9100328DB3 /* TunnelObfuscationTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; - 5898D29729017DAC00EB5EBA /* RelaySelector */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5898D29C29017DAC00EB5EBA /* Build configuration list for PBXNativeTarget "RelaySelector" */; - buildPhases = ( - 5898D29429017DAC00EB5EBA /* Sources */, - 5898D29529017DAC00EB5EBA /* Frameworks */, - 5898D29629017DAC00EB5EBA /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = RelaySelector; - productName = MullvadRelaySelector; - productReference = 5898D29829017DAC00EB5EBA /* libRelaySelector.a */; - productType = "com.apple.product-type.library.static"; - }; 589A455128E094B300565204 /* OperationsTests */ = { isa = PBXNativeTarget; buildConfigurationList = 589A455928E094B300565204 /* Build configuration list for PBXNativeTarget "OperationsTests" */; @@ -3462,7 +3280,6 @@ buildRules = ( ); dependencies = ( - A988DF232ADD305300D807EF /* PBXTargetDependency */, 58C7A4402A863F470060C66F /* PBXTargetDependency */, 58C7A4722A864B860060C66F /* PBXTargetDependency */, ); @@ -3488,14 +3305,11 @@ buildRules = ( ); dependencies = ( - 58D2242E294C94830029F5F8 /* PBXTargetDependency */, 58D223E9294C8F120029F5F8 /* PBXTargetDependency */, 58D223F8294C8FF00029F5F8 /* PBXTargetDependency */, 06799AD028F98E1D00ACD94E /* PBXTargetDependency */, 58D223CF294C8BCB0029F5F8 /* PBXTargetDependency */, - 063F02782902B63F001FA09F /* PBXTargetDependency */, 58CE5E80224146470008646E /* PBXTargetDependency */, - A97F1F462A1F4E1A00ECEFDE /* PBXTargetDependency */, A9EC20F22A5D79ED0040D56E /* PBXTargetDependency */, 58C7A4482A863F490060C66F /* PBXTargetDependency */, 7ABCA5B62A9349F20044A708 /* PBXTargetDependency */, @@ -3521,13 +3335,10 @@ buildRules = ( ); dependencies = ( - A9D99BA82A1F81B100DE27D3 /* PBXTargetDependency */, - 58D22432294C94890029F5F8 /* PBXTargetDependency */, 58D223ED294C8F3D0029F5F8 /* PBXTargetDependency */, 58D22425294C921B0029F5F8 /* PBXTargetDependency */, 062B45A628FD4FD500746E77 /* PBXTargetDependency */, 58D223C9294C8B970029F5F8 /* PBXTargetDependency */, - 063F028C2902B83C001FA09F /* PBXTargetDependency */, 58FBDAA222A52A6800EB69A3 /* PBXTargetDependency */, 58153074294CBE8B00D1702E /* PBXTargetDependency */, 58FE25C92AA72779003D1918 /* PBXTargetDependency */, @@ -3680,28 +3491,6 @@ productReference = 7A88DCD72A8FABBE00D2FF0E /* RoutingTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; - A97F1F402A1F4E1A00ECEFDE /* MullvadTransport */ = { - isa = PBXNativeTarget; - buildConfigurationList = A97F1F4B2A1F4E1A00ECEFDE /* Build configuration list for PBXNativeTarget "MullvadTransport" */; - buildPhases = ( - A95F86B92A1F54F800245DAC /* ShellScript */, - A97F1F3C2A1F4E1A00ECEFDE /* Headers */, - A97F1F3D2A1F4E1A00ECEFDE /* Sources */, - A97F1F3E2A1F4E1A00ECEFDE /* Frameworks */, - A97F1F3F2A1F4E1A00ECEFDE /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - A9D99BA42A1F807A00DE27D3 /* PBXTargetDependency */, - A9D99BA22A1F807700DE27D3 /* PBXTargetDependency */, - A9B2CF712A1F64B20013CC6C /* PBXTargetDependency */, - ); - name = MullvadTransport; - productName = MullvadTransport; - productReference = A97F1F412A1F4E1A00ECEFDE /* MullvadTransport.framework */; - productType = "com.apple.product-type.framework"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -3713,9 +3502,6 @@ LastUpgradeCheck = 1430; ORGANIZATIONNAME = "Mullvad VPN AB"; TargetAttributes = { - 063F02722902B63F001FA09F = { - CreatedOnToolsVersion = 14.0.1; - }; 06799ABB28F98E1D00ACD94E = { CreatedOnToolsVersion = 14.0.1; }; @@ -3726,9 +3512,6 @@ 58695A9C2A4ADA9100328DB3 = { CreatedOnToolsVersion = 14.3.1; }; - 5898D29729017DAC00EB5EBA = { - CreatedOnToolsVersion = 14.1; - }; 589A455128E094B300565204 = { CreatedOnToolsVersion = 14.0.1; }; @@ -3790,9 +3573,6 @@ 7A88DCD62A8FABBE00D2FF0E = { CreatedOnToolsVersion = 14.3.1; }; - A97F1F402A1F4E1A00ECEFDE = { - CreatedOnToolsVersion = 14.3; - }; }; }; buildConfigurationList = 58CE5E5B224146200008646E /* Build configuration list for PBXProject "MullvadVPN" */; @@ -3821,11 +3601,8 @@ 589A455128E094B300565204 /* OperationsTests */, 06799ABB28F98E1D00ACD94E /* MullvadREST */, 58FBFBE5291622580020E046 /* MullvadRESTTests */, - 063F02722902B63F001FA09F /* RelayCache */, - 5898D29729017DAC00EB5EBA /* RelaySelector */, 58D223D4294C8E5E0029F5F8 /* MullvadTypes */, 58D223F2294C8FF00029F5F8 /* MullvadLogging */, - A97F1F402A1F4E1A00ECEFDE /* MullvadTransport */, 5840231E2A406BF5007B27AC /* TunnelObfuscation */, 58695A9C2A4ADA9100328DB3 /* TunnelObfuscationTests */, 58C7A4352A863F440060C66F /* PacketTunnelCore */, @@ -3838,19 +3615,12 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 063F02712902B63F001FA09F /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 063F028F2902BD8C001FA09F /* relays.json in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 06799ABA28F98E1D00ACD94E /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 062B45A328FD4CA700746E77 /* le_root_cert.cer in Resources */, + F05F39942B21C6C6006E60A7 /* relays.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3959,17 +3729,10 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - A97F1F3F2A1F4E1A00ECEFDE /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 063F028D2902BC8E001FA09F /* Run prebuild script */ = { + 580E3F212A9860F20061809D /* Run SwiftLint */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; buildActionMask = 2147483647; @@ -3979,16 +3742,16 @@ ); inputPaths = ( ); - name = "Run prebuild script"; + name = "Run SwiftLint"; outputFileListPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "exec > $PROJECT_DIR/relays-prebuild.log 2>&1\n\n$PROJECT_DIR/relays-prebuild.sh\n"; + shellScript = "if [[ \"$(uname -m)\" == arm64 ]]; then\n export PATH=\"/opt/homebrew/bin:$PATH\"\nfi\n\nif which swiftlint > /dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; }; - 580E3F212A9860F20061809D /* Run SwiftLint */ = { + 580E3F222A9861990061809D /* Run SwiftLint */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; buildActionMask = 2147483647; @@ -4005,46 +3768,46 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "if [[ \"$(uname -m)\" == arm64 ]]; then\n export PATH=\"/opt/homebrew/bin:$PATH\"\nfi\n\nif which swiftlint > /dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; + shellScript = "if [[ \"$(uname -m)\" == arm64 ]]; then\n export PATH=\"/opt/homebrew/bin:$PATH\"\nfi\n\nif which swiftlint > /dev/null; then\n swiftlint PacketTunnel/**/*.swift\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; }; - 580E3F222A9861990061809D /* Run SwiftLint */ = { + 584023262A406C01007B27AC /* ShellScript */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; - buildActionMask = 2147483647; + buildActionMask = 12; files = ( ); inputFileListPaths = ( ); inputPaths = ( ); - name = "Run SwiftLint"; outputFileListPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "if [[ \"$(uname -m)\" == arm64 ]]; then\n export PATH=\"/opt/homebrew/bin:$PATH\"\nfi\n\nif which swiftlint > /dev/null; then\n swiftlint PacketTunnel/**/*.swift\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; + shellScript = "CARGO_TARGET_DIR=${PROJECT_DIR}/../target bash ${PROJECT_DIR}/build-rust-library.sh tunnel-obfuscator-proxy\n"; }; - 584023262A406C01007B27AC /* ShellScript */ = { + F05F39962B21C704006E60A7 /* Prebuild relays */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; - buildActionMask = 12; + buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( ); + name = "Prebuild relays"; outputFileListPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "CARGO_TARGET_DIR=${PROJECT_DIR}/../target bash ${PROJECT_DIR}/build-rust-library.sh tunnel-obfuscator-proxy\n"; + shellScript = "exec > $PROJECT_DIR/relays-prebuild.log 2>&1\n\n$PROJECT_DIR/relays-prebuild.sh\n"; }; - A95F86B92A1F54F800245DAC /* ShellScript */ = { + F0ACE1F32B21CB9A0045C1B8 /* Build Shadowsocks */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; buildActionMask = 2147483647; @@ -4054,6 +3817,7 @@ ); inputPaths = ( ); + name = "Build Shadowsocks"; outputFileListPaths = ( ); outputPaths = ( @@ -4065,39 +3829,42 @@ /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 063F026F2902B63F001FA09F /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 063F027E2902B6EB001FA09F /* RelayCache.swift in Sources */, - 063F027F2902B6EB001FA09F /* CachedRelays.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 06799AB828F98E1D00ACD94E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + F05F39982B21C73C006E60A7 /* CachedRelays.swift in Sources */, + F05F39972B21C735006E60A7 /* RelayCache.swift in Sources */, 06799AE728F98E4800ACD94E /* RESTURLSession.swift in Sources */, 06799AF428F98E4800ACD94E /* RESTAuthorization.swift in Sources */, 06799AE228F98E4800ACD94E /* RESTRequestFactory.swift in Sources */, 06799AEC28F98E4800ACD94E /* RESTTaskIdentifier.swift in Sources */, 58E7BA192A975DF70068EC3A /* RESTTransportProvider.swift in Sources */, 06799ADE28F98E4800ACD94E /* RESTRequestHandler.swift in Sources */, - 06799AEF28F98E4800ACD94E /* RESTRetryStrategy.swift in Sources */, + F0DDE4162B220458006B57A7 /* TransportProvider.swift in Sources */, + 06799AEF28F98E4800ACD94E /* RetryStrategy.swift in Sources */, 06799AE128F98E4800ACD94E /* SSLPinningURLSessionDelegate.swift in Sources */, - A9A1DE792AD5708E0073F689 /* RESTTransportStrategy.swift in Sources */, + A9A1DE792AD5708E0073F689 /* TransportStrategy.swift in Sources */, + F06045EC2B2322A500B2D37A /* Jittered.swift in Sources */, + F0DDE4152B220458006B57A7 /* ShadowsocksConfigurationCache.swift in Sources */, 06799AEA28F98E4800ACD94E /* RESTProxy.swift in Sources */, 06799ADD28F98E4800ACD94E /* RESTError.swift in Sources */, 06799ADB28F98E4800ACD94E /* RESTProxyFactory.swift in Sources */, + F0DDE4182B220458006B57A7 /* ShadowsocksConfiguration.swift in Sources */, 06799AF228F98E4800ACD94E /* RESTAccessTokenManager.swift in Sources */, 06799AF328F98E4800ACD94E /* RESTAuthenticationProxy.swift in Sources */, + F0DDE4142B220458006B57A7 /* ShadowSocksProxy.swift in Sources */, + F06045E62B231EB700B2D37A /* URLSessionTransport.swift in Sources */, 06799AE628F98E4800ACD94E /* ServerRelaysResponse.swift in Sources */, + F0DDE42B2B220A15006B57A7 /* RelaySelector.swift in Sources */, + F0DDE42C2B220A15006B57A7 /* Midpoint.swift in Sources */, 06799AF128F98E4800ACD94E /* RESTAPIProxy.swift in Sources */, + F0DDE42A2B220A15006B57A7 /* Haversine.swift in Sources */, 589E76C02A9378F100E502F3 /* RESTRequestExecutor.swift in Sources */, 06799AE528F98E4800ACD94E /* HTTP.swift in Sources */, A9D99B9A2A1F7C3200DE27D3 /* RESTTransport.swift in Sources */, 06799AE028F98E4800ACD94E /* RESTCoding.swift in Sources */, + F06045EA2B23217E00B2D37A /* ShadowsocksTransport.swift in Sources */, 06799AFC28F98EE300ACD94E /* AddressCache.swift in Sources */, 06799AF028F98E4800ACD94E /* REST.swift in Sources */, 06799ADF28F98E4800ACD94E /* RESTDevicesProxy.swift in Sources */, @@ -4128,16 +3895,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 5898D29429017DAC00EB5EBA /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5898D29F29017DD000EB5EBA /* RelaySelector.swift in Sources */, - A9EC20E62A5C488D0040D56E /* Haversine.swift in Sources */, - A9EC20F42A5D96030040D56E /* Midpoint.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 589A454E28E094B300565204 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -4752,7 +4509,6 @@ buildActionMask = 2147483647; files = ( 58B465702A98C53300467203 /* RequestExecutorTests.swift in Sources */, - A988DF212ADD293D00D807EF /* RESTTransportStrategy.swift in Sources */, A917352129FAAA5200D5DCFD /* TransportStrategyTests.swift in Sources */, 58FBFBE9291622580020E046 /* ExponentialBackoffTests.swift in Sources */, 58BDEB9D2A98F69E00F578F2 /* MemoryCache.swift in Sources */, @@ -4784,19 +4540,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - A97F1F3D2A1F4E1A00ECEFDE /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5822C0052A3724A800A3A5FB /* ShadowsocksConfiguration.swift in Sources */, - A95F86B82A1F547000245DAC /* ShadowsocksProxy.swift in Sources */, - A95F86B72A1F53BA00245DAC /* URLSessionTransport.swift in Sources */, - 5822C0042A3724A800A3A5FB /* ShadowsocksConfigurationCache.swift in Sources */, - A9D99BA02A1F7F3A00DE27D3 /* TransportProvider.swift in Sources */, - 58E0E2842A3718CE002E3420 /* URLSessionShadowsocksTransport.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -4805,21 +4548,6 @@ target = 06799ABB28F98E1D00ACD94E /* MullvadREST */; targetProxy = 58D2239E294C89B50029F5F8 /* PBXContainerItemProxy */; }; - 063F02782902B63F001FA09F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 063F02722902B63F001FA09F /* RelayCache */; - targetProxy = 063F02772902B63F001FA09F /* PBXContainerItemProxy */; - }; - 063F02822902B6F8001FA09F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 06799ABB28F98E1D00ACD94E /* MullvadREST */; - targetProxy = 063F02812902B6F8001FA09F /* PBXContainerItemProxy */; - }; - 063F028C2902B83C001FA09F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 063F02722902B63F001FA09F /* RelayCache */; - targetProxy = 063F028B2902B83C001FA09F /* PBXContainerItemProxy */; - }; 06410DFA292C4ABC00AFC18C /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 58CE5E5F224146200008646E /* MullvadVPN */; @@ -4850,11 +4578,6 @@ target = 5840231E2A406BF5007B27AC /* TunnelObfuscation */; targetProxy = 58695AA22A4ADA9200328DB3 /* PBXContainerItemProxy */; }; - 586A0DD72A20E4A9006C731C /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 06799ABB28F98E1D00ACD94E /* MullvadREST */; - targetProxy = 586A0DD62A20E4A9006C731C /* PBXContainerItemProxy */; - }; 58B2FDD82AA71D2A003EB5C6 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 58B2FDD22AA71D2A003EB5C6 /* MullvadSettings */; @@ -4947,16 +4670,6 @@ target = 58D223D4294C8E5E0029F5F8 /* MullvadTypes */; targetProxy = 58D22428294C92750029F5F8 /* PBXContainerItemProxy */; }; - 58D2242E294C94830029F5F8 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5898D29729017DAC00EB5EBA /* RelaySelector */; - targetProxy = 58D2242D294C94830029F5F8 /* PBXContainerItemProxy */; - }; - 58D22432294C94890029F5F8 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5898D29729017DAC00EB5EBA /* RelaySelector */; - targetProxy = 58D22431294C94890029F5F8 /* PBXContainerItemProxy */; - }; 58EED36E29FBEF040000CBAF /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 58D223D4294C8E5E0029F5F8 /* MullvadTypes */; @@ -5027,41 +4740,16 @@ target = 5840231E2A406BF5007B27AC /* TunnelObfuscation */; targetProxy = A91D78E12B03BDE500FCD5D3 /* PBXContainerItemProxy */; }; - A97F1F462A1F4E1A00ECEFDE /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = A97F1F402A1F4E1A00ECEFDE /* MullvadTransport */; - targetProxy = A97F1F452A1F4E1A00ECEFDE /* PBXContainerItemProxy */; - }; - A988DF232ADD305300D807EF /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5898D29729017DAC00EB5EBA /* RelaySelector */; - targetProxy = A988DF222ADD305300D807EF /* PBXContainerItemProxy */; - }; - A9B2CF712A1F64B20013CC6C /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 06799ABB28F98E1D00ACD94E /* MullvadREST */; - targetProxy = A9B2CF702A1F64B20013CC6C /* PBXContainerItemProxy */; - }; - A9D99BA22A1F807700DE27D3 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 063F02722902B63F001FA09F /* RelayCache */; - targetProxy = A9D99BA12A1F807700DE27D3 /* PBXContainerItemProxy */; - }; - A9D99BA42A1F807A00DE27D3 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5898D29729017DAC00EB5EBA /* RelaySelector */; - targetProxy = A9D99BA32A1F807A00DE27D3 /* PBXContainerItemProxy */; - }; - A9D99BA82A1F81B100DE27D3 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = A97F1F402A1F4E1A00ECEFDE /* MullvadTransport */; - targetProxy = A9D99BA72A1F81B100DE27D3 /* PBXContainerItemProxy */; - }; A9EC20F22A5D79ED0040D56E /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 5840231E2A406BF5007B27AC /* TunnelObfuscation */; targetProxy = A9EC20F12A5D79ED0040D56E /* PBXContainerItemProxy */; }; + F04F959F2B21D02700431E08 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 06799ABB28F98E1D00ACD94E /* MullvadREST */; + targetProxy = F04F959E2B21D02700431E08 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -5076,78 +4764,6 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ - 063F027B2902B63F001FA09F /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 5808273928487E3E006B77A4 /* Base.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_IDENTITY = ""; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 4; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 Mullvad VPN AB. All rights reserved."; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; - MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++20"; - PRODUCT_BUNDLE_IDENTIFIER = "$(APPLICATION_IDENTIFIER).RelayCache"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 063F027C2902B63F001FA09F /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 5808273928487E3E006B77A4 /* Base.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_IDENTITY = ""; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 4; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 Mullvad VPN AB. All rights reserved."; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; - MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++20"; - PRODUCT_BUNDLE_IDENTIFIER = "$(APPLICATION_IDENTIFIER).RelayCache"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; 06799AD428F98E1D00ACD94E /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 5808273928487E3E006B77A4 /* Base.xcconfig */; @@ -5160,7 +4776,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 4; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = YES; + ENABLE_MODULE_VERIFIER = NO; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = MullvadREST/Info.plist; INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 Mullvad VPN AB. All rights reserved."; @@ -5170,6 +4786,10 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + "LIBRARY_SEARCH_PATHS[sdk=iphoneos*][arch=arm64]" = "$(PROJECT_DIR)/../target/aarch64-apple-ios/debug"; + "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=arm64]" = "$(PROJECT_DIR)/../target/aarch64-apple-ios-sim/debug"; + "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=x86_64]" = "$(PROJECT_DIR)/../target/x86_64-apple-ios/debug"; + MODULEMAP_PRIVATE_FILE = $PROJECT_DIR/MullvadREST/Transport/Shadowsocks/module.private.modulemap; MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++20"; PRODUCT_BUNDLE_IDENTIFIER = "$(APPLICATION_IDENTIFIER).MullvadREST"; @@ -5196,7 +4816,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 4; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = YES; + ENABLE_MODULE_VERIFIER = NO; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = MullvadREST/Info.plist; INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 Mullvad VPN AB. All rights reserved."; @@ -5206,6 +4826,10 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + "LIBRARY_SEARCH_PATHS[sdk=iphoneos*][arch=arm64]" = "$(PROJECT_DIR)/../target/aarch64-apple-ios/release"; + "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=arm64]" = "$(PROJECT_DIR)/../target/aarch64-apple-ios-sim/release"; + "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=x86_64]" = "$(PROJECT_DIR)/../target/x86_64-apple-ios/release"; + MODULEMAP_PRIVATE_FILE = $PROJECT_DIR/MullvadREST/Transport/Shadowsocks/module.private.modulemap; MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++20"; PRODUCT_BUNDLE_IDENTIFIER = "$(APPLICATION_IDENTIFIER).MullvadREST"; @@ -5343,34 +4967,6 @@ }; name = Release; }; - 5898D29D29017DAC00EB5EBA /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 5898D29E29017DAC00EB5EBA /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; 589A455A28E094B300565204 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 5808273928487E3E006B77A4 /* Base.xcconfig */; @@ -5596,7 +5192,6 @@ 58C7A44F2A863F4A0060C66F /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; @@ -5618,7 +5213,6 @@ 58C7A4502A863F4A0060C66F /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; @@ -6279,112 +5873,9 @@ }; name = Release; }; - A97F1F492A1F4E1A00ECEFDE /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 5808273928487E3E006B77A4 /* Base.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_IDENTITY = ""; - CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = NO; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2023 Mullvad VPN AB. All rights reserved."; - INFOPLIST_OTHER_PREPROCESSOR_FLAGS = MullvadTransport/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - "LIBRARY_SEARCH_PATHS[sdk=iphoneos*][arch=arm64]" = "$(PROJECT_DIR)/../target/aarch64-apple-ios/debug"; - "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=arm64]" = "$(PROJECT_DIR)/../target/aarch64-apple-ios-sim/debug"; - "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=x86_64]" = "$(PROJECT_DIR)/../target/x86_64-apple-ios/debug"; - MARKETING_VERSION = 2023.2; - MODULEMAP_PRIVATE_FILE = $PROJECT_DIR/MullvadTransport/module.private.modulemap; - MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; - MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++20"; - PRODUCT_BUNDLE_IDENTIFIER = "$(APPLICATION_IDENTIFIER).MullvadTransport"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - A97F1F4A2A1F4E1A00ECEFDE /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 5808273928487E3E006B77A4 /* Base.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_IDENTITY = ""; - CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = NO; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2023 Mullvad VPN AB. All rights reserved."; - INFOPLIST_OTHER_PREPROCESSOR_FLAGS = MullvadTransport/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - "LIBRARY_SEARCH_PATHS[sdk=iphoneos*][arch=arm64]" = "$(PROJECT_DIR)/../target/aarch64-apple-ios/release"; - "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=arm64]" = "$(PROJECT_DIR)/../target/aarch64-apple-ios-sim/release"; - "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=x86_64]" = "$(PROJECT_DIR)/../target/x86_64-apple-ios/release"; - MARKETING_VERSION = 2023.2; - MODULEMAP_PRIVATE_FILE = $PROJECT_DIR/MullvadTransport/module.private.modulemap; - MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; - MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++20"; - PRODUCT_BUNDLE_IDENTIFIER = "$(APPLICATION_IDENTIFIER).MullvadTransport"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 063F027D2902B63F001FA09F /* Build configuration list for PBXNativeTarget "RelayCache" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 063F027B2902B63F001FA09F /* Debug */, - 063F027C2902B63F001FA09F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 06799AD328F98E1D00ACD94E /* Build configuration list for PBXNativeTarget "MullvadREST" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -6412,15 +5903,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 5898D29C29017DAC00EB5EBA /* Build configuration list for PBXNativeTarget "RelaySelector" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5898D29D29017DAC00EB5EBA /* Debug */, - 5898D29E29017DAC00EB5EBA /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 589A455928E094B300565204 /* Build configuration list for PBXNativeTarget "OperationsTests" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -6565,15 +6047,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - A97F1F4B2A1F4E1A00ECEFDE /* Build configuration list for PBXNativeTarget "MullvadTransport" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - A97F1F492A1F4E1A00ECEFDE /* Debug */, - A97F1F4A2A1F4E1A00ECEFDE /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ diff --git a/ios/MullvadVPN.xcodeproj/xcshareddata/xcschemes/MullvadTransport.xcscheme b/ios/MullvadVPN.xcodeproj/xcshareddata/xcschemes/MullvadTransport.xcscheme deleted file mode 100644 index ede26eb6d490..000000000000 --- a/ios/MullvadVPN.xcodeproj/xcshareddata/xcschemes/MullvadTransport.xcscheme +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/MullvadVPN/AppDelegate.swift b/ios/MullvadVPN/AppDelegate.swift index ec1ae459002e..2a7e869888bf 100644 --- a/ios/MullvadVPN/AppDelegate.swift +++ b/ios/MullvadVPN/AppDelegate.swift @@ -10,10 +10,8 @@ import BackgroundTasks import MullvadLogging import MullvadREST import MullvadSettings -import MullvadTransport import MullvadTypes import Operations -import RelayCache import StoreKit import UIKit import UserNotifications diff --git a/ios/MullvadVPN/Coordinators/ApplicationCoordinator.swift b/ios/MullvadVPN/Coordinators/ApplicationCoordinator.swift index eb2e8be7b79c..077214fc391f 100644 --- a/ios/MullvadVPN/Coordinators/ApplicationCoordinator.swift +++ b/ios/MullvadVPN/Coordinators/ApplicationCoordinator.swift @@ -10,7 +10,6 @@ import Combine import MullvadREST import MullvadSettings import MullvadTypes -import RelayCache import Routing import UIKit diff --git a/ios/MullvadVPN/Coordinators/RelayFilterCoordinator.swift b/ios/MullvadVPN/Coordinators/RelayFilterCoordinator.swift index 742e82bc050a..deb57141e4b5 100644 --- a/ios/MullvadVPN/Coordinators/RelayFilterCoordinator.swift +++ b/ios/MullvadVPN/Coordinators/RelayFilterCoordinator.swift @@ -6,8 +6,8 @@ // Copyright © 2023 Mullvad VPN AB. All rights reserved. // +import MullvadREST import MullvadTypes -import RelayCache import Routing import UIKit diff --git a/ios/MullvadVPN/Coordinators/SelectLocationCoordinator.swift b/ios/MullvadVPN/Coordinators/SelectLocationCoordinator.swift index 92a4dbb15053..59cb2a644a07 100644 --- a/ios/MullvadVPN/Coordinators/SelectLocationCoordinator.swift +++ b/ios/MullvadVPN/Coordinators/SelectLocationCoordinator.swift @@ -6,8 +6,8 @@ // Copyright © 2023 Mullvad VPN AB. All rights reserved. // +import MullvadREST import MullvadTypes -import RelayCache import Routing import UIKit diff --git a/ios/MullvadVPN/RelayCacheTracker/RelayCacheTracker.swift b/ios/MullvadVPN/RelayCacheTracker/RelayCacheTracker.swift index 7f17a5b8da9d..eb9050318f25 100644 --- a/ios/MullvadVPN/RelayCacheTracker/RelayCacheTracker.swift +++ b/ios/MullvadVPN/RelayCacheTracker/RelayCacheTracker.swift @@ -11,7 +11,6 @@ import MullvadLogging import MullvadREST import MullvadTypes import Operations -import RelayCache import UIKit protocol RelayCacheTrackerProtocol { diff --git a/ios/MullvadVPN/RelayCacheTracker/RelayCacheTrackerObserver.swift b/ios/MullvadVPN/RelayCacheTracker/RelayCacheTrackerObserver.swift index fcb38b55d69d..802e293f1a7f 100644 --- a/ios/MullvadVPN/RelayCacheTracker/RelayCacheTrackerObserver.swift +++ b/ios/MullvadVPN/RelayCacheTracker/RelayCacheTrackerObserver.swift @@ -7,7 +7,7 @@ // import Foundation -import RelayCache +import MullvadREST protocol RelayCacheTrackerObserver: AnyObject { func relayCacheTracker( diff --git a/ios/MullvadVPN/SceneDelegate.swift b/ios/MullvadVPN/SceneDelegate.swift index d09d147a92f6..0719559d7025 100644 --- a/ios/MullvadVPN/SceneDelegate.swift +++ b/ios/MullvadVPN/SceneDelegate.swift @@ -11,7 +11,6 @@ import MullvadREST import MullvadSettings import MullvadTypes import Operations -import RelayCache import UIKit class SceneDelegate: UIResponder, UIWindowSceneDelegate, SettingsMigrationUIHandler { diff --git a/ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelProviderHost.swift b/ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelProviderHost.swift index 86e4d83030b8..93e17e7af998 100644 --- a/ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelProviderHost.swift +++ b/ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelProviderHost.swift @@ -12,12 +12,9 @@ import Foundation import MullvadLogging import MullvadREST import MullvadSettings -import MullvadTransport import MullvadTypes import NetworkExtension import PacketTunnelCore -import RelayCache -import RelaySelector final class SimulatorTunnelProviderHost: SimulatorTunnelProviderDelegate { private var observedState: ObservedState = .disconnected diff --git a/ios/MullvadVPN/TransportMonitor/PacketTunnelTransport.swift b/ios/MullvadVPN/TransportMonitor/PacketTunnelTransport.swift index 15af753a6a3d..713fc4f54ddd 100644 --- a/ios/MullvadVPN/TransportMonitor/PacketTunnelTransport.swift +++ b/ios/MullvadVPN/TransportMonitor/PacketTunnelTransport.swift @@ -8,7 +8,6 @@ import Foundation import MullvadREST -import MullvadTransport import MullvadTypes import Operations import PacketTunnelCore diff --git a/ios/MullvadVPN/TransportMonitor/TransportMonitor.swift b/ios/MullvadVPN/TransportMonitor/TransportMonitor.swift index a89a02977ca7..c2bbcfb73526 100644 --- a/ios/MullvadVPN/TransportMonitor/TransportMonitor.swift +++ b/ios/MullvadVPN/TransportMonitor/TransportMonitor.swift @@ -9,10 +9,7 @@ import Foundation import MullvadLogging import MullvadREST -import MullvadTransport import MullvadTypes -import RelayCache -import RelaySelector final class TransportMonitor: RESTTransportProvider { private let tunnelManager: TunnelManager diff --git a/ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift b/ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift index 5f4aa8ec5104..9474a0a4813f 100644 --- a/ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift +++ b/ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift @@ -8,11 +8,10 @@ import Foundation import MullvadLogging +import MullvadREST import NetworkExtension import Operations import PacketTunnelCore -import RelayCache -import RelaySelector class StartTunnelOperation: ResultOperation { typealias EncodeErrorHandler = (Error) -> Void diff --git a/ios/MullvadVPN/TunnelManager/Tunnel+Messaging.swift b/ios/MullvadVPN/TunnelManager/Tunnel+Messaging.swift index a553b0d0af93..5299a281cc8d 100644 --- a/ios/MullvadVPN/TunnelManager/Tunnel+Messaging.swift +++ b/ios/MullvadVPN/TunnelManager/Tunnel+Messaging.swift @@ -11,7 +11,6 @@ import MullvadREST import MullvadTypes import Operations import PacketTunnelCore -import RelaySelector /// Shared operation queue used for IPC requests. private let operationQueue = AsyncOperationQueue() diff --git a/ios/MullvadVPN/TunnelManager/TunnelManager.swift b/ios/MullvadVPN/TunnelManager/TunnelManager.swift index c6c4b7323452..960cfd2a8af5 100644 --- a/ios/MullvadVPN/TunnelManager/TunnelManager.swift +++ b/ios/MullvadVPN/TunnelManager/TunnelManager.swift @@ -14,8 +14,6 @@ import MullvadTypes import NetworkExtension import Operations import PacketTunnelCore -import RelayCache -import RelaySelector import StoreKit import UIKit import WireGuardKitTypes diff --git a/ios/MullvadVPN/View controllers/Preferences/PreferencesInteractor.swift b/ios/MullvadVPN/View controllers/Preferences/PreferencesInteractor.swift index 7b52ba795d24..96958f26740d 100644 --- a/ios/MullvadVPN/View controllers/Preferences/PreferencesInteractor.swift +++ b/ios/MullvadVPN/View controllers/Preferences/PreferencesInteractor.swift @@ -7,8 +7,8 @@ // import Foundation +import MullvadREST import MullvadSettings -import RelayCache final class PreferencesInteractor { private let tunnelManager: TunnelManager diff --git a/ios/MullvadVPN/View controllers/RelayFilter/RelayFilterDataSource.swift b/ios/MullvadVPN/View controllers/RelayFilter/RelayFilterDataSource.swift index 8c74b0559c6c..3d0653f569f3 100644 --- a/ios/MullvadVPN/View controllers/RelayFilter/RelayFilterDataSource.swift +++ b/ios/MullvadVPN/View controllers/RelayFilter/RelayFilterDataSource.swift @@ -9,7 +9,6 @@ import Combine import MullvadREST import MullvadTypes -import RelayCache import UIKit final class RelayFilterDataSource: UITableViewDiffableDataSource< diff --git a/ios/MullvadVPN/View controllers/RelayFilter/RelayFilterViewController.swift b/ios/MullvadVPN/View controllers/RelayFilter/RelayFilterViewController.swift index f9c19c96a7bd..8728a4761b1b 100644 --- a/ios/MullvadVPN/View controllers/RelayFilter/RelayFilterViewController.swift +++ b/ios/MullvadVPN/View controllers/RelayFilter/RelayFilterViewController.swift @@ -7,8 +7,8 @@ // import Combine +import MullvadREST import MullvadTypes -import RelayCache import UIKit class RelayFilterViewController: UIViewController { diff --git a/ios/MullvadVPN/View controllers/SelectLocation/LocationDataSource.swift b/ios/MullvadVPN/View controllers/SelectLocation/LocationDataSource.swift index a5032402f2b5..e3891d214df0 100644 --- a/ios/MullvadVPN/View controllers/SelectLocation/LocationDataSource.swift +++ b/ios/MullvadVPN/View controllers/SelectLocation/LocationDataSource.swift @@ -8,7 +8,6 @@ import MullvadREST import MullvadTypes -import RelaySelector import UIKit protocol LocationDataSourceItemProtocol { diff --git a/ios/MullvadVPN/View controllers/SelectLocation/SelectLocationViewController.swift b/ios/MullvadVPN/View controllers/SelectLocation/SelectLocationViewController.swift index f1bb9dce4e1a..b19fef0df605 100644 --- a/ios/MullvadVPN/View controllers/SelectLocation/SelectLocationViewController.swift +++ b/ios/MullvadVPN/View controllers/SelectLocation/SelectLocationViewController.swift @@ -7,8 +7,8 @@ // import MullvadLogging +import MullvadREST import MullvadTypes -import RelayCache import UIKit final class SelectLocationViewController: UIViewController { diff --git a/ios/MullvadVPN/View controllers/Settings/SettingsInteractorFactory.swift b/ios/MullvadVPN/View controllers/Settings/SettingsInteractorFactory.swift index 3454516808fc..af9faeb52e12 100644 --- a/ios/MullvadVPN/View controllers/Settings/SettingsInteractorFactory.swift +++ b/ios/MullvadVPN/View controllers/Settings/SettingsInteractorFactory.swift @@ -8,7 +8,6 @@ import Foundation import MullvadREST -import RelayCache final class SettingsInteractorFactory { private let storePaymentManager: StorePaymentManager diff --git a/ios/MullvadVPNTests/CoordinatesTests.swift b/ios/MullvadVPNTests/CoordinatesTests.swift index 6466537ca24e..816b511794e5 100644 --- a/ios/MullvadVPNTests/CoordinatesTests.swift +++ b/ios/MullvadVPNTests/CoordinatesTests.swift @@ -7,7 +7,7 @@ // import CoreLocation -@testable import RelaySelector +@testable import MullvadREST import XCTest final class CoordinatesTests: XCTestCase { diff --git a/ios/MullvadVPNTests/RelayCacheTests.swift b/ios/MullvadVPNTests/RelayCacheTests.swift index 03899e543b23..153f4738ee37 100644 --- a/ios/MullvadVPNTests/RelayCacheTests.swift +++ b/ios/MullvadVPNTests/RelayCacheTests.swift @@ -7,8 +7,6 @@ // @testable import MullvadREST -import MullvadTransport -@testable import RelayCache import XCTest final class RelayCacheTests: XCTestCase { diff --git a/ios/MullvadVPNTests/RelayCacheTracker+Stubs.swift b/ios/MullvadVPNTests/RelayCacheTracker+Stubs.swift index ef6fcd9ab6b2..4adcccececbf 100644 --- a/ios/MullvadVPNTests/RelayCacheTracker+Stubs.swift +++ b/ios/MullvadVPNTests/RelayCacheTracker+Stubs.swift @@ -7,8 +7,8 @@ // import Foundation +@testable import MullvadREST @testable import MullvadTypes -@testable import RelayCache struct RelayCacheTrackerStub: RelayCacheTrackerProtocol { func startPeriodicUpdates() {} diff --git a/ios/MullvadVPNTests/RelaySelectorTests.swift b/ios/MullvadVPNTests/RelaySelectorTests.swift index e3ec34e1f4ff..68bfadfd4c32 100644 --- a/ios/MullvadVPNTests/RelaySelectorTests.swift +++ b/ios/MullvadVPNTests/RelaySelectorTests.swift @@ -9,7 +9,6 @@ @testable import MullvadREST import MullvadTypes import Network -import RelaySelector import XCTest private let portRanges: [[UInt16]] = [[4000, 4001], [5000, 5001]] diff --git a/ios/PacketTunnel/PacketTunnelProvider/BlockedStateErrorMapper.swift b/ios/PacketTunnel/PacketTunnelProvider/BlockedStateErrorMapper.swift index decf72b1bc98..5038839fa53f 100644 --- a/ios/PacketTunnel/PacketTunnelProvider/BlockedStateErrorMapper.swift +++ b/ios/PacketTunnel/PacketTunnelProvider/BlockedStateErrorMapper.swift @@ -11,7 +11,6 @@ import MullvadREST import MullvadSettings import MullvadTypes import PacketTunnelCore -import RelaySelector import WireGuardKit /** diff --git a/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift b/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift index 25f37358e224..cd3ccc8bd1f7 100644 --- a/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift +++ b/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift @@ -9,11 +9,9 @@ import Foundation import MullvadLogging import MullvadREST -import MullvadTransport import MullvadTypes import NetworkExtension import PacketTunnelCore -import RelayCache import TunnelObfuscation class PacketTunnelProvider: NEPacketTunnelProvider { diff --git a/ios/PacketTunnel/PacketTunnelProvider/RelaySelectorWrapper.swift b/ios/PacketTunnel/PacketTunnelProvider/RelaySelectorWrapper.swift index cedeb1ea7b3f..5127e0a55b32 100644 --- a/ios/PacketTunnel/PacketTunnelProvider/RelaySelectorWrapper.swift +++ b/ios/PacketTunnel/PacketTunnelProvider/RelaySelectorWrapper.swift @@ -7,10 +7,9 @@ // import Foundation +import MullvadREST import MullvadTypes import PacketTunnelCore -import RelayCache -import RelaySelector struct RelaySelectorWrapper: RelaySelectorProtocol { let relayCache: RelayCache diff --git a/ios/PacketTunnelCoreTests/AppMessageHandlerTests.swift b/ios/PacketTunnelCoreTests/AppMessageHandlerTests.swift index 79562eec280f..21291f6334a7 100644 --- a/ios/PacketTunnelCoreTests/AppMessageHandlerTests.swift +++ b/ios/PacketTunnelCoreTests/AppMessageHandlerTests.swift @@ -10,7 +10,6 @@ import Combine @testable import MullvadREST import MullvadTypes import PacketTunnelCore -import RelaySelector import XCTest final class AppMessageHandlerTests: XCTestCase { diff --git a/ios/PacketTunnelCoreTests/PacketTunnelActorTests.swift b/ios/PacketTunnelCoreTests/PacketTunnelActorTests.swift index dccadc344285..b80d92df95b7 100644 --- a/ios/PacketTunnelCoreTests/PacketTunnelActorTests.swift +++ b/ios/PacketTunnelCoreTests/PacketTunnelActorTests.swift @@ -7,11 +7,11 @@ // import Combine +@testable import MullvadREST @testable import MullvadSettings import MullvadTypes import Network @testable import PacketTunnelCore -@testable import RelaySelector import WireGuardKitTypes import XCTest diff --git a/ios/RelayCache/Assets/.gitkeep b/ios/RelayCache/Assets/.gitkeep deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/ios/RelayCache/RelayCache.h b/ios/RelayCache/RelayCache.h deleted file mode 100644 index abe3d1b9830a..000000000000 --- a/ios/RelayCache/RelayCache.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// RelayCache.h -// RelayCache -// -// Created by Sajad Vishkai on 2022-10-21. -// Copyright © 2022 Mullvad VPN AB. All rights reserved. -// - -#import - -//! Project version number for RelayCache. -FOUNDATION_EXPORT double RelayCacheVersionNumber; - -//! Project version string for RelayCache. -FOUNDATION_EXPORT const unsigned char RelayCacheVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - - diff --git a/ios/relays-prebuild.sh b/ios/relays-prebuild.sh index caef0efe4a79..1ed8b9cf401b 100755 --- a/ios/relays-prebuild.sh +++ b/ios/relays-prebuild.sh @@ -5,7 +5,7 @@ if [ -z "$PROJECT_DIR" ]; then exit 1 fi -RELAYS_FILE="$PROJECT_DIR/RelayCache/Assets/relays.json" +RELAYS_FILE="$PROJECT_DIR/MullvadREST/Assets/relays.json" if [ $CONFIGURATION == "Release" ]; then echo "Remove relays file"