diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9d2d90a22..c055943fa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,9 +2,7 @@ name: CI on: push: - branches: - - "main" - - "develop" + branches: [ "main", "develop" ] pull_request: jobs: @@ -16,23 +14,15 @@ jobs: with: go-version: 1.16 - uses: actions/checkout@v2 - - uses: actions/cache@v1 - with: - path: Pods - key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }} - restore-keys: | - ${{ runner.os }}-pods- - - name: Install dependencies - run: pod install - name: Set up config files run: | cp IVPNClient/Config/staging.template.xcconfig IVPNClient/Config/staging.xcconfig cp IVPNClient/Config/release.template.xcconfig IVPNClient/Config/release.xcconfig cp wireguard-tunnel-provider/Config/wg-staging.template.xcconfig wireguard-tunnel-provider/Config/wg-staging.xcconfig cp wireguard-tunnel-provider/Config/wg-release.template.xcconfig wireguard-tunnel-provider/Config/wg-release.xcconfig - cp today-extension/Config/today-extension-staging.template.xcconfig today-extension/Config/today-extension-staging.xcconfig - cp today-extension/Config/today-extension-release.template.xcconfig today-extension/Config/today-extension-release.xcconfig + cp IVPNWidget/Config/widget-staging.template.xcconfig IVPNWidget/Config/widget-staging.xcconfig + cp IVPNWidget/Config/widget-release.template.xcconfig IVPNWidget/Config/widget-release.xcconfig cp IVPNClient/Config/OpenVPNConf.template.swift IVPNClient/Config/OpenVPNConf.swift cp fastlane/Appfile.template fastlane/Appfile - name: Build and test - run: xcodebuild test -workspace IVPNClient.xcworkspace -scheme IVPNClient -destination 'platform=iOS Simulator,name=iPhone 11' + run: xcodebuild test -scheme IVPNClient -destination 'platform=iOS Simulator,name=iPhone 14' diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index e7c70e8a2..1db78a5d8 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -2,9 +2,7 @@ name: Lint Code Base on: push: - branches: - - "main" - - "develop" + branches: [ "main", "develop" ] pull_request: jobs: diff --git a/.github/workflows/mobsfscan.yml b/.github/workflows/mobsfscan.yml new file mode 100644 index 000000000..978b06890 --- /dev/null +++ b/.github/workflows/mobsfscan.yml @@ -0,0 +1,17 @@ +name: mobsfscan + +on: + push: + branches: [ "main", "develop" ] + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + name: mobsfscan + steps: + - uses: actions/checkout@v2 + - name: mobsfscan + uses: MobSF/mobsfscan@main + with: + args: '. --json' diff --git a/.github/workflows/swiftlint.yml b/.github/workflows/swiftlint.yml index 70ae2844e..67489858d 100644 --- a/.github/workflows/swiftlint.yml +++ b/.github/workflows/swiftlint.yml @@ -2,9 +2,7 @@ name: SwiftLint on: push: - branches: - - "main" - - "develop" + branches: [ "main", "develop" ] pull_request: paths: - '.github/workflows/swiftlint.yml' diff --git a/.gitignore b/.gitignore index 713af9b87..636bce78f 100644 --- a/.gitignore +++ b/.gitignore @@ -60,8 +60,8 @@ staging.xcconfig release.xcconfig wg-staging.xcconfig wg-release.xcconfig -today-extension-staging.xcconfig -today-extension-release.xcconfig +widget-staging.xcconfig +widget-release.xcconfig # Rules for .swift files OpenVPNConf.swift diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c80a4198..10f34a5e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,20 @@ All notable changes to this project will be documented in this file. +## 2.9.0 - 2023-05-24 + +[NEW] New Widget implemented with WidgetKit +[NEW] Option to prevent a Multi-Hop chain with the same provider +[NEW] MTU configuration for WireGuard +[IMPROVED] Upgraded OpenVPN and OpenSSL libraries +[IMPROVED] Alternative method to obtain diagnostic logs +[FIXED] Servers mismatch when selecting individual servers +[FIXED] Unable to change the port when switching from WireGuard to OpenVPN +[FIXED] Fastest server settings list automatically toggling servers off +[FIXED] App remains in "disconnecting" state when using Network Protection +[FIXED] Server latency not displayed after logging in +[NOTE] Removed support for iOS 12 and 13 + ## 2.8.0 - 2023-01-30 [NEW] Favorite servers diff --git a/Gemfile b/Gemfile deleted file mode 100644 index 82d1e3049..000000000 --- a/Gemfile +++ /dev/null @@ -1,4 +0,0 @@ -source "https://rubygems.org" - -gem "fastlane" -gem "cocoapods" diff --git a/Gemfile.lock b/Gemfile.lock deleted file mode 100644 index a9ed3cfb8..000000000 --- a/Gemfile.lock +++ /dev/null @@ -1,217 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - CFPropertyList (3.0.2) - activesupport (4.2.11.1) - i18n (~> 0.7) - minitest (~> 5.1) - thread_safe (~> 0.3, >= 0.3.4) - tzinfo (~> 1.1) - addressable (2.8.0) - public_suffix (>= 2.0.2, < 5.0) - algoliasearch (1.27.1) - httpclient (~> 2.8, >= 2.8.3) - json (>= 1.5.1) - atomos (0.1.3) - babosa (1.0.3) - claide (1.0.3) - cocoapods (1.8.4) - activesupport (>= 4.0.2, < 5) - claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.8.4) - cocoapods-deintegrate (>= 1.0.3, < 2.0) - cocoapods-downloader (>= 1.2.2, < 2.0) - cocoapods-plugins (>= 1.0.0, < 2.0) - cocoapods-search (>= 1.0.0, < 2.0) - cocoapods-stats (>= 1.0.0, < 2.0) - cocoapods-trunk (>= 1.4.0, < 2.0) - cocoapods-try (>= 1.1.0, < 2.0) - colored2 (~> 3.1) - escape (~> 0.0.4) - fourflusher (>= 2.3.0, < 3.0) - gh_inspector (~> 1.0) - molinillo (~> 0.6.6) - nap (~> 1.0) - ruby-macho (~> 1.4) - xcodeproj (>= 1.11.1, < 2.0) - cocoapods-core (1.8.4) - activesupport (>= 4.0.2, < 6) - algoliasearch (~> 1.0) - concurrent-ruby (~> 1.1) - fuzzy_match (~> 2.0.4) - nap (~> 1.0) - cocoapods-deintegrate (1.0.4) - cocoapods-downloader (1.6.3) - cocoapods-plugins (1.0.0) - nap - cocoapods-search (1.0.0) - cocoapods-stats (1.1.0) - cocoapods-trunk (1.4.1) - nap (>= 0.8, < 2.0) - netrc (~> 0.11) - cocoapods-try (1.1.0) - colored (1.2) - colored2 (3.1.2) - commander-fastlane (4.4.6) - highline (~> 1.7.2) - concurrent-ruby (1.1.5) - declarative (0.0.10) - declarative-option (0.1.0) - digest-crc (0.4.1) - domain_name (0.5.20190701) - unf (>= 0.0.5, < 1.0.0) - dotenv (2.7.5) - emoji_regex (1.0.1) - escape (0.0.4) - excon (0.71.1) - faraday (0.17.1) - multipart-post (>= 1.2, < 3) - faraday-cookie_jar (0.0.6) - faraday (>= 0.7.4) - http-cookie (~> 1.0.0) - faraday_middleware (0.13.1) - faraday (>= 0.7.4, < 1.0) - fastimage (2.1.7) - fastlane (2.139.0) - CFPropertyList (>= 2.3, < 4.0.0) - addressable (>= 2.3, < 3.0.0) - babosa (>= 1.0.2, < 2.0.0) - bundler (>= 1.12.0, < 3.0.0) - colored - commander-fastlane (>= 4.4.6, < 5.0.0) - dotenv (>= 2.1.1, < 3.0.0) - emoji_regex (>= 0.1, < 2.0) - excon (>= 0.71.0, < 1.0.0) - faraday (~> 0.17) - faraday-cookie_jar (~> 0.0.6) - faraday_middleware (~> 0.13.1) - fastimage (>= 2.1.0, < 3.0.0) - gh_inspector (>= 1.1.2, < 2.0.0) - google-api-client (>= 0.29.2, < 0.37.0) - google-cloud-storage (>= 1.15.0, < 2.0.0) - highline (>= 1.7.2, < 2.0.0) - json (< 3.0.0) - jwt (~> 2.1.0) - mini_magick (>= 4.9.4, < 5.0.0) - multi_xml (~> 0.5) - multipart-post (~> 2.0.0) - plist (>= 3.1.0, < 4.0.0) - public_suffix (~> 2.0.0) - rubyzip (>= 1.3.0, < 2.0.0) - security (= 0.1.3) - simctl (~> 1.6.3) - slack-notifier (>= 2.0.0, < 3.0.0) - terminal-notifier (>= 2.0.0, < 3.0.0) - terminal-table (>= 1.4.5, < 2.0.0) - tty-screen (>= 0.6.3, < 1.0.0) - tty-spinner (>= 0.8.0, < 1.0.0) - word_wrap (~> 1.0.0) - xcodeproj (>= 1.13.0, < 2.0.0) - xcpretty (~> 0.3.0) - xcpretty-travis-formatter (>= 0.0.3) - fourflusher (2.3.1) - fuzzy_match (2.0.4) - gh_inspector (1.1.3) - google-api-client (0.36.3) - addressable (~> 2.5, >= 2.5.1) - googleauth (~> 0.9) - httpclient (>= 2.8.1, < 3.0) - mini_mime (~> 1.0) - representable (~> 3.0) - retriable (>= 2.0, < 4.0) - signet (~> 0.12) - google-cloud-core (1.4.1) - google-cloud-env (~> 1.0) - google-cloud-env (1.3.0) - faraday (~> 0.11) - google-cloud-storage (1.25.0) - addressable (~> 2.5) - digest-crc (~> 0.4) - google-api-client (~> 0.33) - google-cloud-core (~> 1.2) - googleauth (~> 0.9) - mini_mime (~> 1.0) - googleauth (0.10.0) - faraday (~> 0.12) - jwt (>= 1.4, < 3.0) - memoist (~> 0.16) - multi_json (~> 1.11) - os (>= 0.9, < 2.0) - signet (~> 0.12) - highline (1.7.10) - http-cookie (1.0.3) - domain_name (~> 0.5) - httpclient (2.8.3) - i18n (0.9.5) - concurrent-ruby (~> 1.0) - json (2.3.0) - jwt (2.1.0) - memoist (0.16.2) - mini_magick (4.9.5) - mini_mime (1.0.2) - minitest (5.13.0) - molinillo (0.6.6) - multi_json (1.14.1) - multi_xml (0.6.0) - multipart-post (2.0.0) - nanaimo (0.2.6) - nap (1.1.0) - naturally (2.2.0) - netrc (0.11.0) - os (1.0.1) - plist (3.5.0) - public_suffix (2.0.5) - representable (3.0.4) - declarative (< 0.1.0) - declarative-option (< 0.2.0) - uber (< 0.2.0) - retriable (3.1.2) - rouge (2.0.7) - ruby-macho (1.4.0) - rubyzip (1.3.0) - security (0.1.3) - signet (0.12.0) - addressable (~> 2.3) - faraday (~> 0.9) - jwt (>= 1.5, < 3.0) - multi_json (~> 1.10) - simctl (1.6.7) - CFPropertyList - naturally - slack-notifier (2.3.2) - terminal-notifier (2.0.0) - terminal-table (1.8.0) - unicode-display_width (~> 1.1, >= 1.1.1) - thread_safe (0.3.6) - tty-cursor (0.7.0) - tty-screen (0.7.0) - tty-spinner (0.9.2) - tty-cursor (~> 0.7) - tzinfo (1.2.10) - thread_safe (~> 0.1) - uber (0.1.0) - unf (0.1.4) - unf_ext - unf_ext (0.0.7.6) - unicode-display_width (1.6.0) - word_wrap (1.0.0) - xcodeproj (1.14.0) - CFPropertyList (>= 2.3.3, < 4.0) - atomos (~> 0.1.3) - claide (>= 1.0.2, < 2.0) - colored2 (~> 3.1) - nanaimo (~> 0.2.6) - xcpretty (0.3.0) - rouge (~> 2.0.7) - xcpretty-travis-formatter (1.0.0) - xcpretty (~> 0.2, >= 0.0.7) - -PLATFORMS - ruby - -DEPENDENCIES - cocoapods - fastlane - -BUNDLED WITH - 2.1.2 diff --git a/IVPNClient.xcodeproj/project.pbxproj b/IVPNClient.xcodeproj/project.pbxproj index b6b7276b8..0d77b1adc 100644 --- a/IVPNClient.xcodeproj/project.pbxproj +++ b/IVPNClient.xcodeproj/project.pbxproj @@ -3,16 +3,15 @@ archiveVersion = 1; classes = { }; - objectVersion = 52; + objectVersion = 53; objects = { /* Begin PBXBuildFile section */ - 08DDD46C7843193A0C8A9F4D /* Pods_openvpn_tunnel_provider.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 042B1F5A4F38CCA3591AD441 /* Pods_openvpn_tunnel_provider.framework */; }; - 62FD760D711D4A4507FAFE24 /* Pods_wireguard_tunnel_provider.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58126B967EB9B059871FD7AB /* Pods_wireguard_tunnel_provider.framework */; }; 820079F42407D96D00EC2062 /* ConnectionInfoBoxView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 820079F32407D96D00EC2062 /* ConnectionInfoBoxView.swift */; }; 8201A5022354A32F008C83DB /* ErrorResultSessionNew.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8201A5012354A32F008C83DB /* ErrorResultSessionNew.swift */; }; 8201A5042356536B008C83DB /* UpgradePlanViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8201A5032356536B008C83DB /* UpgradePlanViewController.swift */; }; 820203932186EE0E00D756AA /* WireGuardSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 820203922186EE0E00D756AA /* WireGuardSettingsViewController.swift */; }; + 82052E5629C1D83700227CF9 /* MTUViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82052E5529C1D83700227CF9 /* MTUViewController.swift */; }; 820535282302B9D7007BDD58 /* APIAccessManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 820535272302B9D7007BDD58 /* APIAccessManager.swift */; }; 820535292302BE8F007BDD58 /* APIAccessManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 820535272302B9D7007BDD58 /* APIAccessManager.swift */; }; 8205352A2302BEA3007BDD58 /* Array+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823DA732215E3CCB00DAFE37 /* Array+Ext.swift */; }; @@ -21,6 +20,11 @@ 82061F65238D2730009DDF4D /* Ping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82061F61238D2730009DDF4D /* Ping.swift */; }; 82061F66238D2730009DDF4D /* ICMPHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82061F62238D2730009DDF4D /* ICMPHeader.swift */; }; 82061F67238D2730009DDF4D /* PingManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82061F63238D2730009DDF4D /* PingManager.swift */; }; + 8206BAFA29ED69D300F916B7 /* DataService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8206BAF929ED69D300F916B7 /* DataService.swift */; }; + 8206BAFC29ED6C9600F916B7 /* Notification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8206BAFB29ED6C9600F916B7 /* Notification.swift */; }; + 8206BAFF29ED6FFF00F916B7 /* ConnectionInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8206BAFE29ED6FFF00F916B7 /* ConnectionInfoView.swift */; }; + 8206BB0129ED7BEE00F916B7 /* ConnectionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8206BB0029ED7BEE00F916B7 /* ConnectionInfo.swift */; }; + 8206BB0329ED7C3700F916B7 /* ConnectionInfoViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8206BB0229ED7C3700F916B7 /* ConnectionInfoViewModel.swift */; }; 8206E5D022967E37003119AF /* UserActivityType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8206E5CF22967E37003119AF /* UserActivityType.swift */; }; 8206E5D222967EAF003119AF /* UserActivityTitle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8206E5D122967EAF003119AF /* UserActivityTitle.swift */; }; 8206F32124347A8F0056B465 /* MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8206F32024347A8F0056B465 /* MainView.swift */; }; @@ -37,6 +41,8 @@ 821429B722FC2BE90056B8FF /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821429B622FC2BE90056B8FF /* Result.swift */; }; 821429B922FC2EA40056B8FF /* ApiService+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821429B822FC2EA40056B8FF /* ApiService+Ext.swift */; }; 821429BB22FC36100056B8FF /* ApiRequestDI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821429BA22FC36100056B8FF /* ApiRequestDI.swift */; }; + 82152C9929F14B4C007FCECC /* KeyChain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82152C9829F14B4C007FCECC /* KeyChain.swift */; }; + 82152C9B29F17568007FCECC /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = 82152C9A29F17568007FCECC /* KeychainAccess */; }; 821AFA1323602B71001EF617 /* SettingsScreenTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821AFA1223602B71001EF617 /* SettingsScreenTests.swift */; }; 821BDE02224A6EC700F592BF /* AppKeyManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821BDE01224A6EC700F592BF /* AppKeyManagerTests.swift */; }; 821CA2D7287C5AB20067F70D /* PortViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821CA2D6287C5AB20067F70D /* PortViewController.swift */; }; @@ -46,9 +52,7 @@ 821F604A240D21E3008072D7 /* ControlPanelViewController+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821F6049240D21E3008072D7 /* ControlPanelViewController+Ext.swift */; }; 8221377B2227E75E001E1BF5 /* CustomDNSViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8221377A2227E75E001E1BF5 /* CustomDNSViewController.swift */; }; 82234B6721BA7F3500B082DE /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82234B6621BA7F3500B082DE /* Logger.swift */; }; - 82234B6E21BA90E400B082DE /* KeyChain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C69422D1DD20FC200F9A801 /* KeyChain.swift */; }; 8223C53F22326375006C4F14 /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82234B6621BA7F3500B082DE /* Logger.swift */; }; - 8223C5402232694E006C4F14 /* KeyChain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C69422D1DD20FC200F9A801 /* KeyChain.swift */; }; 8223C54C22E9E93A00CD283D /* Session.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8223C54B22E9E93A00CD283D /* Session.swift */; }; 8223C54E22EAE93F00CD283D /* SessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8223C54D22EAE93F00CD283D /* SessionManager.swift */; }; 8223C54F22EAEC7000CD283D /* Session.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8223C54B22E9E93A00CD283D /* Session.swift */; }; @@ -68,6 +72,7 @@ 823ACC292626E69F006F69AB /* GeoLookupTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823ACC282626E69F006F69AB /* GeoLookupTests.swift */; }; 823ACC312626FF3E006F69AB /* IpProtocolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823ACC302626FF3E006F69AB /* IpProtocolView.swift */; }; 823ACC3926270330006F69AB /* ConnectionInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823ACC3826270330006F69AB /* ConnectionInfoView.swift */; }; + 823BA40329EC5A01004B07B4 /* GeoLookup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8277F1CE2211A602007C6F15 /* GeoLookup.swift */; }; 823BD9E3231D4C8E002E631D /* ErrorResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8232FBF32240DE19006B81D2 /* ErrorResult.swift */; }; 823BD9E4231D4C8F002E631D /* ErrorResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8232FBF32240DE19006B81D2 /* ErrorResult.swift */; }; 823DA733215E3CCB00DAFE37 /* Array+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823DA732215E3CCB00DAFE37 /* Array+Ext.swift */; }; @@ -90,7 +95,6 @@ 824B86C726D3D7B600D0101A /* ApiManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 824B86C426D3D7B600D0101A /* ApiManager.swift */; }; 824B86C826D3D7DE00D0101A /* Interface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8292E1A82174C11600123538 /* Interface.swift */; }; 824B86C926D3D7FB00D0101A /* CIDRAddress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82F638CB217DC25600410318 /* CIDRAddress.swift */; }; - 824B86CA26D3E8B100D0101A /* TimerManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 824B86C326D3D7B600D0101A /* TimerManager.swift */; }; 824B86CB26D3E8D100D0101A /* ExtensionKeyManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 824B86C226D3D7B500D0101A /* ExtensionKeyManager.swift */; }; 824B86CC26D3E8F600D0101A /* ApiManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 824B86C426D3D7B600D0101A /* ApiManager.swift */; }; 824B86D226D40E7800D0101A /* FileManager+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 824B86AD26D3D16100D0101A /* FileManager+Extension.swift */; }; @@ -105,7 +109,6 @@ 825E834F25A327EB00938240 /* CaptchaViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 825E834E25A327EB00938240 /* CaptchaViewController.swift */; }; 825E836325A4834200938240 /* APIPublicKeyPin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 825E836225A4834200938240 /* APIPublicKeyPin.swift */; }; 825E836425A4834200938240 /* APIPublicKeyPin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 825E836225A4834200938240 /* APIPublicKeyPin.swift */; }; - 825E836525A4834200938240 /* APIPublicKeyPin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 825E836225A4834200938240 /* APIPublicKeyPin.swift */; }; 826470C42446F67100403A14 /* Signup.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 826470C32446F67100403A14 /* Signup.storyboard */; }; 8264CFFC22422F6700E1721E /* Date+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82D90470216C7DAF0032F3BE /* Date+Ext.swift */; }; 8269CAC32264962F00CF488A /* AntiTrackerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8269CAC22264962F00CF488A /* AntiTrackerViewController.swift */; }; @@ -119,44 +122,14 @@ 826E61482428F8E60064F195 /* AccountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 826E61472428F8E60064F195 /* AccountViewController.swift */; }; 826E614A242A1CA80064F195 /* AccountViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 826E6149242A1CA80064F195 /* AccountViewModel.swift */; }; 826E614C242A61380064F195 /* AccountViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 826E614B242A61380064F195 /* AccountViewModelTests.swift */; }; - 826F7F0C23A79F1500777DB9 /* UserDefaultsTodayExtension+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 826F7F0B23A79F1500777DB9 /* UserDefaultsTodayExtension+Ext.swift */; }; - 826F7F1323A7A05F00777DB9 /* NotificationCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 826F7F1223A7A05F00777DB9 /* NotificationCenter.framework */; }; - 826F7F1623A7A05F00777DB9 /* TodayViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 826F7F1523A7A05F00777DB9 /* TodayViewController.swift */; }; - 826F7F1923A7A05F00777DB9 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 826F7F1723A7A05F00777DB9 /* MainInterface.storyboard */; }; - 826F7F1D23A7A05F00777DB9 /* IVPN.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 826F7F1123A7A05F00777DB9 /* IVPN.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 826F7F2323A7A0AB00777DB9 /* ApiManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 826F7F2223A7A0AB00777DB9 /* ApiManager.swift */; }; - 826F7F2523A7A1F400777DB9 /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 826F7F2423A7A1F400777DB9 /* Colors.xcassets */; }; - 826F7F2A23A7A43A00777DB9 /* ViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 826F7F2923A7A43A00777DB9 /* ViewModel.swift */; }; - 826F7F2D23A7A86D00777DB9 /* ApiRequestDI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821429BA22FC36100056B8FF /* ApiRequestDI.swift */; }; - 826F7F2E23A7A88700777DB9 /* APIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82DC75BB22B277D200D3C73C /* APIClient.swift */; }; - 826F7F2F23A7A88E00777DB9 /* GeoLookup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8277F1CE2211A602007C6F15 /* GeoLookup.swift */; }; - 826F7F3023A7A89B00777DB9 /* UserDefaults+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 825A43FC215CCFE70076131F /* UserDefaults+Ext.swift */; }; - 826F7F3123A7A8CE00777DB9 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821429B622FC2BE90056B8FF /* Result.swift */; }; - 826F7F3323A7A90200777DB9 /* UserDefaultsTodayExtension+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 826F7F0B23A79F1500777DB9 /* UserDefaultsTodayExtension+Ext.swift */; }; - 826F7F3423A7A91700777DB9 /* KeyChain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C69422D1DD20FC200F9A801 /* KeyChain.swift */; }; - 826F7F3523A7A93200777DB9 /* Session.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8223C54B22E9E93A00CD283D /* Session.swift */; }; - 826F7F3623A7A94000777DB9 /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C2833781D9D3F060024C553 /* Config.swift */; }; - 826F7F3723A7A95000777DB9 /* APIAccessManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 820535272302B9D7007BDD58 /* APIAccessManager.swift */; }; - 826F7F3823A7A97100777DB9 /* ServiceStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 826C56D122FD4F2600D2B76A /* ServiceStatus.swift */; }; - 826F7F3923A7A99300777DB9 /* CIDRAddress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82F638CB217DC25600410318 /* CIDRAddress.swift */; }; - 826F7F3A23A7A99D00777DB9 /* ConnectionSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82E7168F2181E90500D6B7C2 /* ConnectionSettings.swift */; }; - 826F7F3B23A7AA3D00777DB9 /* OpenVPNProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82E716952181E96F00D6B7C2 /* OpenVPNProtocol.swift */; }; - 826F7F3C23A7AA4200777DB9 /* WireGuardProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82E716892181E8E900D6B7C2 /* WireGuardProtocol.swift */; }; - 826F7F3D23A7AA4700777DB9 /* TunnelType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82E7167D2181E8AF00D6B7C2 /* TunnelType.swift */; }; - 826F7F3E23A7AA6300777DB9 /* AddressType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82F638C1217DA89000410318 /* AddressType.swift */; }; - 826F7F3F23A7AA6A00777DB9 /* ErrorResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8232FBF32240DE19006B81D2 /* ErrorResult.swift */; }; - 826F7F4023A7AA8200777DB9 /* Capability.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823FFB062338DF1800F91A5D /* Capability.swift */; }; - 826F7F4223A7AAB800777DB9 /* Array+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823DA732215E3CCB00DAFE37 /* Array+Ext.swift */; }; 826F7F4323A7AAD200777DB9 /* Array+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823DA732215E3CCB00DAFE37 /* Array+Ext.swift */; }; - 826F7F4623A7AF2F00777DB9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9CDDD5B51D9D2F9F00D39924 /* Assets.xcassets */; }; - 826F7F4E23A7B4CD00777DB9 /* today-extension-release.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 826F7F4A23A7B4CD00777DB9 /* today-extension-release.xcconfig */; }; - 826F7F4F23A7B4CD00777DB9 /* today-extension-staging.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 826F7F4B23A7B4CD00777DB9 /* today-extension-staging.xcconfig */; }; 826FBDA32461847D00B9E464 /* ServiceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 826FBDA22461847D00B9E464 /* ServiceType.swift */; }; 826FBDA52461848A00B9E464 /* ServiceDuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 826FBDA42461848A00B9E464 /* ServiceDuration.swift */; }; 8270753622AFC5B90067C323 /* StringProtocol+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8270753522AFC5B90067C323 /* StringProtocol+Ext.swift */; }; 8270753722AFC7E70067C323 /* StringProtocol+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8270753522AFC5B90067C323 /* StringProtocol+Ext.swift */; }; 8270D266241A477900B17B65 /* InfoAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8270D265241A477900B17B65 /* InfoAlertView.swift */; }; 8270D268241BB3D100B17B65 /* InfoAlertViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8270D267241BB3D000B17B65 /* InfoAlertViewModel.swift */; }; + 8271D2E32A092F7B0052AF61 /* UIDevice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8271D2E22A092F7B0052AF61 /* UIDevice.swift */; }; 827694F3263C04C40058B4DC /* LoginConfirmation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 827694F2263C04C40058B4DC /* LoginConfirmation.swift */; }; 82774855237596DF0061BD46 /* OpenVPNConf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82774854237596DF0061BD46 /* OpenVPNConf.swift */; }; 8277F1CD22118D08007C6F15 /* ProofsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8277F1CC22118D08007C6F15 /* ProofsViewModel.swift */; }; @@ -176,14 +149,20 @@ 8292E1A72174C10700123538 /* Peer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8292E1A62174C10700123538 /* Peer.swift */; }; 8292E1A92174C11600123538 /* Interface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8292E1A82174C11600123538 /* Interface.swift */; }; 8292E1AB2174C12200123538 /* Tunnel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8292E1AA2174C12200123538 /* Tunnel.swift */; }; - 8294BC8C22A10F4100328932 /* TunnelKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8294BC8B22A10F4100328932 /* TunnelKit.framework */; }; - 8294BC8E22A126C900328932 /* TunnelKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8294BC8D22A126C900328932 /* TunnelKit.framework */; }; + 82968A32298A970500077E0A /* TunnelKitOpenVPN in Frameworks */ = {isa = PBXBuildFile; productRef = 82968A31298A970500077E0A /* TunnelKitOpenVPN */; }; + 82968A34298A970500077E0A /* TunnelKitOpenVPNAppExtension in Frameworks */ = {isa = PBXBuildFile; productRef = 82968A33298A970500077E0A /* TunnelKitOpenVPNAppExtension */; }; + 82968A35298A98C300077E0A /* KeyChain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C69422D1DD20FC200F9A801 /* KeyChain.swift */; }; + 82968A36298A98C600077E0A /* KeyChain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C69422D1DD20FC200F9A801 /* KeyChain.swift */; }; + 82968A37298A98C900077E0A /* KeyChain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C69422D1DD20FC200F9A801 /* KeyChain.swift */; }; 82989FDE2188981900F7EBE0 /* AppKeyManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82989FDD2188981900F7EBE0 /* AppKeyManager.swift */; }; 829AA4732267372A00037198 /* Designable+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 829AA4722267372A00037198 /* Designable+Ext.swift */; }; 829D2C8221664D5E004FA2B3 /* NSMutableAttributedString+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 829D2C8121664D5E004FA2B3 /* NSMutableAttributedString+Ext.swift */; }; 829DF27D2497949A000DC2DB /* PlanLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 829DF27B2497949A000DC2DB /* PlanLabel.swift */; }; 829DF27E2497949A000DC2DB /* SelectPlanView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 829DF27C2497949A000DC2DB /* SelectPlanView.swift */; }; 829DF2822497953C000DC2DB /* UIButton+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 829DF2812497953C000DC2DB /* UIButton+Ext.swift */; }; + 829F5FC729A13CAE009E1AD3 /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = 829F5FC629A13CAE009E1AD3 /* KeychainAccess */; }; + 829F5FC929A13CEA009E1AD3 /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = 829F5FC829A13CEA009E1AD3 /* KeychainAccess */; }; + 829F5FCB29A13CF2009E1AD3 /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = 829F5FCA29A13CF2009E1AD3 /* KeychainAccess */; }; 82A160BA221C4E2000730577 /* Server+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A160B8221C4E2000730577 /* Server+CoreDataClass.swift */; }; 82A160BB221C4E2000730577 /* Server+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A160B9221C4E2000730577 /* Server+CoreDataProperties.swift */; }; 82A208C121BAAC6C00C9AD44 /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C2833781D9D3F060024C553 /* Config.swift */; }; @@ -193,21 +172,21 @@ 82A3422724AB6CA500761AB0 /* DoubleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A3422624AB6CA500761AB0 /* DoubleTests.swift */; }; 82A3422924AB799600761AB0 /* ProofsViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A3422824AB799600761AB0 /* ProofsViewModelTests.swift */; }; 82A3422B24AB7F8600761AB0 /* VPNServerViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A3422A24AB7F8600761AB0 /* VPNServerViewModelTests.swift */; }; + 82A38A0C29E2D17700C88372 /* StatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A38A0A29E2D12B00C88372 /* StatusView.swift */; }; + 82A38A0E29E2D2D800C88372 /* Status.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A38A0D29E2D2D800C88372 /* Status.swift */; }; + 82A38A1029E2D46000C88372 /* StatusViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A38A0F29E2D46000C88372 /* StatusViewModel.swift */; }; + 82A38A1B29E3201F00C88372 /* UserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A38A1A29E3201F00C88372 /* UserDefaults.swift */; }; 82A6D74A24A3780B00D6C0E1 /* ConnectToServerPopupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A6D74924A3780B00D6C0E1 /* ConnectToServerPopupView.swift */; }; 82A7F10523C8661B0015A357 /* ServiceStatusTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A7F10423C8661B0015A357 /* ServiceStatusTests.swift */; }; - 82A9E8C523471EBE007BCA7E /* release.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 82A9E8C323471EBE007BCA7E /* release.xcconfig */; }; - 82A9E8C623471EBE007BCA7E /* staging.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 82A9E8C423471EBE007BCA7E /* staging.xcconfig */; }; - 82A9E8C923471FB2007BCA7E /* wg-release.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 82A9E8C723471FB2007BCA7E /* wg-release.xcconfig */; }; - 82A9E8CA23471FB2007BCA7E /* wg-staging.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 82A9E8C823471FB2007BCA7E /* wg-staging.xcconfig */; }; - 82AA85782514DEB40027DAB8 /* Date+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82D90470216C7DAF0032F3BE /* Date+Ext.swift */; }; 82AA8818231E330A00E18ECB /* SessionStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82AA8817231E330A00E18ECB /* SessionStatus.swift */; }; 82AAF0E92253A4A8005E792F /* StaticWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82AAF0E82253A4A8005E792F /* StaticWebViewController.swift */; }; 82AB0875291A6B5F0084625A /* AddCustomPortViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82AB0874291A6B5F0084625A /* AddCustomPortViewController.swift */; }; 82AB0877291A6B9C0084625A /* CustomPort+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82AB0876291A6B9C0084625A /* CustomPort+CoreDataClass.swift */; }; 82AB0879291A6BB90084625A /* CustomPort+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82AB0878291A6BB90084625A /* CustomPort+CoreDataProperties.swift */; }; + 82B329CB29F7C9F400F3ED9B /* UIWindow+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82B329CA29F7C9F400F3ED9B /* UIWindow+Ext.swift */; }; 82B51CDF21DE3E31005CC9C9 /* UITableView+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82B51CDE21DE3E31005CC9C9 /* UITableView+Ext.swift */; }; 82B605262170840C004B40E6 /* PacketTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82B605252170840C004B40E6 /* PacketTunnelProvider.swift */; }; - 82B6052B2170840C004B40E6 /* wireguard-tunnel-provider.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 82B605232170840C004B40E6 /* wireguard-tunnel-provider.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 82B6052B2170840C004B40E6 /* wireguard-tunnel-provider.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 82B605232170840C004B40E6 /* wireguard-tunnel-provider.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 82B6052F21708575004B40E6 /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C6942241DD0CBF800F9A801 /* NetworkExtension.framework */; }; 82B81E3A235ED845005986E8 /* SessionManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82B81E38235ED845005986E8 /* SessionManagerTests.swift */; }; 82B81E3B235ED845005986E8 /* KeyChainTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82B81E39235ED845005986E8 /* KeyChainTests.swift */; }; @@ -228,6 +207,26 @@ 82C2E5DF21620FF100C5A09F /* UIDevice+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C2E5DE21620FF100C5A09F /* UIDevice+Ext.swift */; }; 82C34D6E26FB02F900F06016 /* WireGuardEndpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C34D6D26FB02F900F06016 /* WireGuardEndpoint.swift */; }; 82C34D6F26FB02F900F06016 /* WireGuardEndpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C34D6D26FB02F900F06016 /* WireGuardEndpoint.swift */; }; + 82C61D9629E6ADEF00AF972A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9CDDD5B51D9D2F9F00D39924 /* Assets.xcassets */; }; + 82C61D9929E6B4C600AF972A /* LocationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C61D9829E6B4C600AF972A /* LocationView.swift */; }; + 82C61D9D29E6C2D200AF972A /* APIService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C61D9C29E6C2D200AF972A /* APIService.swift */; }; + 82C61D9E29E6C32400AF972A /* ApiRequestDI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821429BA22FC36100056B8FF /* ApiRequestDI.swift */; }; + 82C61D9F29E6C33700AF972A /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821429B622FC2BE90056B8FF /* Result.swift */; }; + 82C61DA029E6C37300AF972A /* APIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82DC75BB22B277D200D3C73C /* APIClient.swift */; }; + 82C61DA229E6C3F100AF972A /* UserDefaults+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 825A43FC215CCFE70076131F /* UserDefaults+Ext.swift */; }; + 82C61DA329E6C45100AF972A /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C2833781D9D3F060024C553 /* Config.swift */; }; + 82C61DA429E6C46900AF972A /* ConnectionSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82E7168F2181E90500D6B7C2 /* ConnectionSettings.swift */; }; + 82C61DA529E6C48100AF972A /* OpenVPNProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82E716952181E96F00D6B7C2 /* OpenVPNProtocol.swift */; }; + 82C61DA629E6C48700AF972A /* WireGuardProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82E716892181E8E900D6B7C2 /* WireGuardProtocol.swift */; }; + 82C61DA729E6C49100AF972A /* TunnelType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82E7167D2181E8AF00D6B7C2 /* TunnelType.swift */; }; + 82C61DA929E6C53C00AF972A /* Array+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823DA732215E3CCB00DAFE37 /* Array+Ext.swift */; }; + 82C61DAA29E6C55100AF972A /* APIAccessManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 820535272302B9D7007BDD58 /* APIAccessManager.swift */; }; + 82C61DAB29E6C56400AF972A /* APIPublicKeyPin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 825E836225A4834200938240 /* APIPublicKeyPin.swift */; }; + 82C61DB029E6C5E700AF972A /* Date+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82D90470216C7DAF0032F3BE /* Date+Ext.swift */; }; + 82C61DB229E6C6F600AF972A /* AddressType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82F638C1217DA89000410318 /* AddressType.swift */; }; + 82C61DB429E6C72700AF972A /* LocationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C61DB329E6C72700AF972A /* LocationViewModel.swift */; }; + 82C61DBA29E6CA7600AF972A /* widget-staging.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 82C61DB629E6CA7600AF972A /* widget-staging.xcconfig */; }; + 82C61DBC29E6CA7600AF972A /* widget-release.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 82C61DB829E6CA7600AF972A /* widget-release.xcconfig */; }; 82C973A0217DFA9C00CE06D4 /* Host.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C9739F217DFA9C00CE06D4 /* Host.swift */; }; 82CA214329379CCD008BADE8 /* FileSystemManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CB2CE371DB0F860007A4D2D /* FileSystemManager.swift */; }; 82CA214429379CEC008BADE8 /* UIDevice+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C2E5DE21620FF100C5A09F /* UIDevice+Ext.swift */; }; @@ -259,6 +258,13 @@ 82DEF02A2447288100CCB5CD /* PaymentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82DEF0292447288100CCB5CD /* PaymentViewController.swift */; }; 82DEFFA62452DE5100ECB482 /* MapConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82DEFFA52452DE5100ECB482 /* MapConstants.swift */; }; 82E01649230BE683008B0AC0 /* APIAccessManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82E01648230BE683008B0AC0 /* APIAccessManagerTests.swift */; }; + 82E3B20B29DDCC6300998F67 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82E3B1EF29DDC91C00998F67 /* WidgetKit.framework */; }; + 82E3B20C29DDCC6300998F67 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82E3B1F129DDC91C00998F67 /* SwiftUI.framework */; }; + 82E3B20F29DDCC6400998F67 /* IVPNWidgetBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82E3B20E29DDCC6400998F67 /* IVPNWidgetBundle.swift */; }; + 82E3B21129DDCC6400998F67 /* IVPNWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82E3B21029DDCC6400998F67 /* IVPNWidget.swift */; }; + 82E3B21329DDCC6500998F67 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 82E3B21229DDCC6500998F67 /* Assets.xcassets */; }; + 82E3B21729DDCC6500998F67 /* IVPNWidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 82E3B20A29DDCC6300998F67 /* IVPNWidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 82E3B21E29DDD32B00998F67 /* MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82E3B21D29DDD32B00998F67 /* MainView.swift */; }; 82E4FCB023D71FDF00BEBA1A /* UIApplication+ExtTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82E4FCAF23D71FDF00BEBA1A /* UIApplication+ExtTests.swift */; }; 82E5449224EE584E006DEF8D /* UIImageView+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82E5449124EE584E006DEF8D /* UIImageView+Ext.swift */; }; 82E7167E2181E8AF00D6B7C2 /* TunnelType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82E7167D2181E8AF00D6B7C2 /* TunnelType.swift */; }; @@ -279,6 +285,12 @@ 82E81AE72449C44F00D81FB7 /* PaymentComponentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82E81AE62449C44F00D81FB7 /* PaymentComponentView.swift */; }; 82E96A4B224BA1B3004FC1D6 /* ExtensionKeyManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82E96A4A224BA1B3004FC1D6 /* ExtensionKeyManagerTests.swift */; }; 82EA857A21DCF0C300EB0EC9 /* StorageManager+OnDemandRuleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82EA857921DCF0C300EB0EC9 /* StorageManager+OnDemandRuleTests.swift */; }; + 82EC883529A12BD30024CC40 /* JGProgressHUD in Frameworks */ = {isa = PBXBuildFile; productRef = 82EC883429A12BD30024CC40 /* JGProgressHUD */; }; + 82EC883829A12C1F0024CC40 /* Reachability in Frameworks */ = {isa = PBXBuildFile; productRef = 82EC883729A12C1F0024CC40 /* Reachability */; }; + 82EC883B29A12C7D0024CC40 /* SwiftyStoreKit in Frameworks */ = {isa = PBXBuildFile; productRef = 82EC883A29A12C7D0024CC40 /* SwiftyStoreKit */; }; + 82EC884129A12D170024CC40 /* ActiveLabel in Frameworks */ = {isa = PBXBuildFile; productRef = 82EC884029A12D170024CC40 /* ActiveLabel */; }; + 82EC884429A12D370024CC40 /* FloatingPanel in Frameworks */ = {isa = PBXBuildFile; productRef = 82EC884329A12D370024CC40 /* FloatingPanel */; }; + 82EC884729A12D510024CC40 /* SnapKit in Frameworks */ = {isa = PBXBuildFile; productRef = 82EC884629A12D510024CC40 /* SnapKit */; }; 82EEB6C625F9398600915837 /* DNSProtocolType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82EEB6C525F9398600915837 /* DNSProtocolType.swift */; }; 82EEB6CD25F9422900915837 /* DNSProtocolType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82EEB6C525F9398600915837 /* DNSProtocolType.swift */; }; 82EEB6DB25F961BC00915837 /* URL+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82CE598F25ED3C7A0078099D /* URL+Ext.swift */; }; @@ -303,7 +315,6 @@ 82F81A5B224CFC0C00CB778B /* ApiServiceServersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82F81A53224CFC0B00CB778B /* ApiServiceServersTests.swift */; }; 82F81A61224CFFD700CB778B /* AuthenticationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82F81A60224CFFD700CB778B /* AuthenticationTests.swift */; }; 82F917392344861A0025ED3A /* TermsOfServiceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82F917382344861A0025ED3A /* TermsOfServiceViewController.swift */; }; - 82FDA69B2518EA40007F881E /* DispatchQueue+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82BBF26821AE802400589766 /* DispatchQueue+Ext.swift */; }; 82FF0D4223153D1000440E5D /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 82FF0D4123153D1000440E5D /* Colors.xcassets */; }; 82FF0D442315587000440E5D /* UITextFieldPadding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82FF0D432315587000440E5D /* UITextFieldPadding.swift */; }; 9C2833741D9D3EB60024C553 /* Initial.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9C2833731D9D3EB60024C553 /* Initial.storyboard */; }; @@ -319,9 +330,8 @@ 9C50959A20FCF6850048DBF2 /* ProtocolTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C50959920FCF6850048DBF2 /* ProtocolTableViewCell.swift */; }; 9C51340A1DE8398400423551 /* Pinger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C5134091DE8398400423551 /* Pinger.swift */; }; 9C6942251DD0CBF800F9A801 /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C6942241DD0CBF800F9A801 /* NetworkExtension.framework */; }; - 9C69422E1DD20FC200F9A801 /* KeyChain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C69422D1DD20FC200F9A801 /* KeyChain.swift */; }; 9C6942371DD218A900F9A801 /* AccessDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C6942361DD218A900F9A801 /* AccessDetails.swift */; }; - 9C7840B020CD8A8A00335736 /* openvpn-tunnel-provider.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 9C7840A820CD8A8A00335736 /* openvpn-tunnel-provider.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 9C7840B020CD8A8A00335736 /* openvpn-tunnel-provider.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 9C7840A820CD8A8A00335736 /* openvpn-tunnel-provider.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 9CAE14C020FE453E00D4DAC0 /* VPNManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CAE14BF20FE453E00D4DAC0 /* VPNManager.swift */; }; 9CB2CE1F1DAA5258007A4D2D /* Authentication.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CB2CE1E1DAA5258007A4D2D /* Authentication.swift */; }; 9CB2CE2B1DABD120007A4D2D /* NavigationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CB2CE2A1DABD120007A4D2D /* NavigationManager.swift */; }; @@ -340,8 +350,6 @@ 9CDDD5B91D9D2F9F00D39924 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9CDDD5B71D9D2F9F00D39924 /* LaunchScreen.storyboard */; }; 9CF7E35A20F7A86E008E0EC5 /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C6942241DD0CBF800F9A801 /* NetworkExtension.framework */; }; 9CF7E37820F7ABE3008E0EC5 /* PacketTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C7840AA20CD8A8A00335736 /* PacketTunnelProvider.swift */; }; - D661274AA295C4153E1286AB /* Pods_IVPNClient.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95BC1917294DF1E93B308C82 /* Pods_IVPNClient.framework */; }; - F85098932EABDDE39B105066 /* Pods_today_extension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 751AB84B8432BC3E6BEDD483 /* Pods_today_extension.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -359,13 +367,6 @@ remoteGlobalIDString = 9CDDD5AA1D9D2F9E00D39924; remoteInfo = IVPNClient; }; - 826F7F1B23A7A05F00777DB9 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 9CDDD5A31D9D2F9E00D39924 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 826F7F1023A7A05F00777DB9; - remoteInfo = "today-extension"; - }; 82B605292170840C004B40E6 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 9CDDD5A31D9D2F9E00D39924 /* Project object */; @@ -380,6 +381,13 @@ remoteGlobalIDString = 9CDDD5AA1D9D2F9E00D39924; remoteInfo = IVPNClient; }; + 82E3B21529DDCC6500998F67 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9CDDD5A31D9D2F9E00D39924 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 82E3B20929DDCC6300998F67; + remoteInfo = IVPNWidgetExtension; + }; 9C7840AE20CD8A8A00335736 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 9CDDD5A31D9D2F9E00D39924 /* Project object */; @@ -390,39 +398,41 @@ /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ - 9C7840B420CD8A8A00335736 /* Embed App Extensions */ = { + 9C7840B420CD8A8A00335736 /* Embed Foundation Extensions */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 13; files = ( - 82B6052B2170840C004B40E6 /* wireguard-tunnel-provider.appex in Embed App Extensions */, - 826F7F1D23A7A05F00777DB9 /* IVPN.appex in Embed App Extensions */, - 9C7840B020CD8A8A00335736 /* openvpn-tunnel-provider.appex in Embed App Extensions */, + 82B6052B2170840C004B40E6 /* wireguard-tunnel-provider.appex in Embed Foundation Extensions */, + 82E3B21729DDCC6500998F67 /* IVPNWidgetExtension.appex in Embed Foundation Extensions */, + 9C7840B020CD8A8A00335736 /* openvpn-tunnel-provider.appex in Embed Foundation Extensions */, ); - name = "Embed App Extensions"; + name = "Embed Foundation Extensions"; runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 042B1F5A4F38CCA3591AD441 /* Pods_openvpn_tunnel_provider.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_openvpn_tunnel_provider.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 27E4E56AE774F4A2C5B24728 /* Pods-openvpn-tunnel-provider.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-openvpn-tunnel-provider.release.xcconfig"; path = "../ios-app/Pods/Target Support Files/Pods-openvpn-tunnel-provider/Pods-openvpn-tunnel-provider.release.xcconfig"; sourceTree = ""; }; 58126B967EB9B059871FD7AB /* Pods_wireguard_tunnel_provider.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_wireguard_tunnel_provider.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 5F8FBDE5436D2ADCA6F3A4FE /* Pods-openvpn-tunnel-provider.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-openvpn-tunnel-provider.debug.xcconfig"; path = "../ios-app/Pods/Target Support Files/Pods-openvpn-tunnel-provider/Pods-openvpn-tunnel-provider.debug.xcconfig"; sourceTree = ""; }; - 6F076EC404F769A3D7C17CF4 /* Pods-IVPNClient.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-IVPNClient.release.xcconfig"; path = "../ios-app/Pods/Target Support Files/Pods-IVPNClient/Pods-IVPNClient.release.xcconfig"; sourceTree = ""; }; - 70DFEFF11AFF9C4E3D88A443 /* Pods-IVPNClient.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-IVPNClient.debug.xcconfig"; path = "../ios-app/Pods/Target Support Files/Pods-IVPNClient/Pods-IVPNClient.debug.xcconfig"; sourceTree = ""; }; 751AB84B8432BC3E6BEDD483 /* Pods_today_extension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_today_extension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 820079F32407D96D00EC2062 /* ConnectionInfoBoxView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectionInfoBoxView.swift; sourceTree = ""; }; 8201A5012354A32F008C83DB /* ErrorResultSessionNew.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorResultSessionNew.swift; sourceTree = ""; }; 8201A5032356536B008C83DB /* UpgradePlanViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpgradePlanViewController.swift; sourceTree = ""; }; 820203922186EE0E00D756AA /* WireGuardSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WireGuardSettingsViewController.swift; sourceTree = ""; }; + 82052E5529C1D83700227CF9 /* MTUViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MTUViewController.swift; sourceTree = ""; }; 820535272302B9D7007BDD58 /* APIAccessManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIAccessManager.swift; sourceTree = ""; }; 8205963C2245264300011091 /* UITableViewController+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITableViewController+Ext.swift"; sourceTree = ""; }; 82061F60238D2730009DDF4D /* PingResult.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PingResult.swift; sourceTree = ""; }; 82061F61238D2730009DDF4D /* Ping.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Ping.swift; sourceTree = ""; }; 82061F62238D2730009DDF4D /* ICMPHeader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ICMPHeader.swift; sourceTree = ""; }; 82061F63238D2730009DDF4D /* PingManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PingManager.swift; sourceTree = ""; }; + 8206BAF929ED69D300F916B7 /* DataService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataService.swift; sourceTree = ""; }; + 8206BAFB29ED6C9600F916B7 /* Notification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Notification.swift; sourceTree = ""; }; + 8206BAFE29ED6FFF00F916B7 /* ConnectionInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectionInfoView.swift; sourceTree = ""; }; + 8206BB0029ED7BEE00F916B7 /* ConnectionInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectionInfo.swift; sourceTree = ""; }; + 8206BB0229ED7C3700F916B7 /* ConnectionInfoViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectionInfoViewModel.swift; sourceTree = ""; }; 8206E5CF22967E37003119AF /* UserActivityType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserActivityType.swift; sourceTree = ""; }; 8206E5D122967EAF003119AF /* UserActivityTitle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserActivityTitle.swift; sourceTree = ""; }; 8206F32024347A8F0056B465 /* MainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainView.swift; sourceTree = ""; }; @@ -436,6 +446,7 @@ 821429B622FC2BE90056B8FF /* Result.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = ""; }; 821429B822FC2EA40056B8FF /* ApiService+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ApiService+Ext.swift"; sourceTree = ""; }; 821429BA22FC36100056B8FF /* ApiRequestDI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApiRequestDI.swift; sourceTree = ""; }; + 82152C9829F14B4C007FCECC /* KeyChain.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyChain.swift; sourceTree = ""; }; 821AFA1223602B71001EF617 /* SettingsScreenTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsScreenTests.swift; sourceTree = ""; }; 821BDE01224A6EC700F592BF /* AppKeyManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppKeyManagerTests.swift; sourceTree = ""; }; 821CA2D6287C5AB20067F70D /* PortViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PortViewController.swift; sourceTree = ""; }; @@ -502,24 +513,13 @@ 826E61472428F8E60064F195 /* AccountViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountViewController.swift; sourceTree = ""; }; 826E6149242A1CA80064F195 /* AccountViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountViewModel.swift; sourceTree = ""; }; 826E614B242A61380064F195 /* AccountViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountViewModelTests.swift; sourceTree = ""; }; - 826F7F0B23A79F1500777DB9 /* UserDefaultsTodayExtension+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserDefaultsTodayExtension+Ext.swift"; sourceTree = ""; }; - 826F7F1123A7A05F00777DB9 /* IVPN.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = IVPN.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 826F7F1223A7A05F00777DB9 /* NotificationCenter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NotificationCenter.framework; path = System/Library/Frameworks/NotificationCenter.framework; sourceTree = SDKROOT; }; - 826F7F1523A7A05F00777DB9 /* TodayViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TodayViewController.swift; sourceTree = ""; }; - 826F7F1823A7A05F00777DB9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; }; - 826F7F1A23A7A05F00777DB9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 826F7F2223A7A0AB00777DB9 /* ApiManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApiManager.swift; sourceTree = ""; }; - 826F7F2423A7A1F400777DB9 /* Colors.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Colors.xcassets; sourceTree = ""; }; - 826F7F2923A7A43A00777DB9 /* ViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewModel.swift; sourceTree = ""; }; - 826F7F2B23A7A46100777DB9 /* today-extension-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "today-extension-Bridging-Header.h"; sourceTree = ""; }; - 826F7F2C23A7A49500777DB9 /* today-extension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "today-extension.entitlements"; sourceTree = ""; }; - 826F7F4A23A7B4CD00777DB9 /* today-extension-release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "today-extension-release.xcconfig"; sourceTree = ""; }; - 826F7F4B23A7B4CD00777DB9 /* today-extension-staging.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "today-extension-staging.xcconfig"; sourceTree = ""; }; 826FBDA22461847D00B9E464 /* ServiceType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceType.swift; sourceTree = ""; }; 826FBDA42461848A00B9E464 /* ServiceDuration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceDuration.swift; sourceTree = ""; }; 8270753522AFC5B90067C323 /* StringProtocol+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "StringProtocol+Ext.swift"; sourceTree = ""; }; 8270D265241A477900B17B65 /* InfoAlertView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InfoAlertView.swift; sourceTree = ""; }; 8270D267241BB3D000B17B65 /* InfoAlertViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InfoAlertViewModel.swift; sourceTree = ""; }; + 8271D2E22A092F7B0052AF61 /* UIDevice.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIDevice.swift; sourceTree = ""; }; 827694F2263C04C40058B4DC /* LoginConfirmation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginConfirmation.swift; sourceTree = ""; }; 82774854237596DF0061BD46 /* OpenVPNConf.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenVPNConf.swift; sourceTree = ""; }; 8277F1CC22118D08007C6F15 /* ProofsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProofsViewModel.swift; sourceTree = ""; }; @@ -553,6 +553,11 @@ 82A3422624AB6CA500761AB0 /* DoubleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DoubleTests.swift; sourceTree = ""; }; 82A3422824AB799600761AB0 /* ProofsViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProofsViewModelTests.swift; sourceTree = ""; }; 82A3422A24AB7F8600761AB0 /* VPNServerViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPNServerViewModelTests.swift; sourceTree = ""; }; + 82A38A0A29E2D12B00C88372 /* StatusView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusView.swift; sourceTree = ""; }; + 82A38A0D29E2D2D800C88372 /* Status.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Status.swift; sourceTree = ""; }; + 82A38A0F29E2D46000C88372 /* StatusViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusViewModel.swift; sourceTree = ""; }; + 82A38A1229E2D89400C88372 /* IVPNWidgetExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = IVPNWidgetExtension.entitlements; sourceTree = ""; }; + 82A38A1A29E3201F00C88372 /* UserDefaults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaults.swift; sourceTree = ""; }; 82A6D74924A3780B00D6C0E1 /* ConnectToServerPopupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectToServerPopupView.swift; sourceTree = ""; }; 82A7F10423C8661B0015A357 /* ServiceStatusTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceStatusTests.swift; sourceTree = ""; }; 82A9E8C323471EBE007BCA7E /* release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = release.xcconfig; sourceTree = ""; }; @@ -564,6 +569,7 @@ 82AB0874291A6B5F0084625A /* AddCustomPortViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddCustomPortViewController.swift; sourceTree = ""; }; 82AB0876291A6B9C0084625A /* CustomPort+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CustomPort+CoreDataClass.swift"; sourceTree = ""; }; 82AB0878291A6BB90084625A /* CustomPort+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CustomPort+CoreDataProperties.swift"; sourceTree = ""; }; + 82B329CA29F7C9F400F3ED9B /* UIWindow+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIWindow+Ext.swift"; sourceTree = ""; }; 82B51CDE21DE3E31005CC9C9 /* UITableView+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITableView+Ext.swift"; sourceTree = ""; }; 82B605232170840C004B40E6 /* wireguard-tunnel-provider.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "wireguard-tunnel-provider.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; 82B605252170840C004B40E6 /* PacketTunnelProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PacketTunnelProvider.swift; sourceTree = ""; }; @@ -589,6 +595,12 @@ 82C293C221CCDA42000B74EC /* UIColor+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+Ext.swift"; sourceTree = ""; }; 82C2E5DE21620FF100C5A09F /* UIDevice+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIDevice+Ext.swift"; sourceTree = ""; }; 82C34D6D26FB02F900F06016 /* WireGuardEndpoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WireGuardEndpoint.swift; sourceTree = ""; }; + 82C61D9829E6B4C600AF972A /* LocationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationView.swift; sourceTree = ""; }; + 82C61D9C29E6C2D200AF972A /* APIService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIService.swift; sourceTree = ""; }; + 82C61DA829E6C4CF00AF972A /* Widget-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Widget-Bridging-Header.h"; sourceTree = ""; }; + 82C61DB329E6C72700AF972A /* LocationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationViewModel.swift; sourceTree = ""; }; + 82C61DB629E6CA7600AF972A /* widget-staging.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "widget-staging.xcconfig"; sourceTree = ""; }; + 82C61DB829E6CA7600AF972A /* widget-release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "widget-release.xcconfig"; sourceTree = ""; }; 82C9739F217DFA9C00CE06D4 /* Host.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Host.swift; sourceTree = ""; }; 82CE598F25ED3C7A0078099D /* URL+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URL+Ext.swift"; sourceTree = ""; }; 82CE599825ED48D60078099D /* InternetAddress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InternetAddress.swift; sourceTree = ""; }; @@ -616,6 +628,14 @@ 82DEF0292447288100CCB5CD /* PaymentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaymentViewController.swift; sourceTree = ""; }; 82DEFFA52452DE5100ECB482 /* MapConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapConstants.swift; sourceTree = ""; }; 82E01648230BE683008B0AC0 /* APIAccessManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIAccessManagerTests.swift; sourceTree = ""; }; + 82E3B1EF29DDC91C00998F67 /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; }; + 82E3B1F129DDC91C00998F67 /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; }; + 82E3B20A29DDCC6300998F67 /* IVPNWidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = IVPNWidgetExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + 82E3B20E29DDCC6400998F67 /* IVPNWidgetBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IVPNWidgetBundle.swift; sourceTree = ""; }; + 82E3B21029DDCC6400998F67 /* IVPNWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IVPNWidget.swift; sourceTree = ""; }; + 82E3B21229DDCC6500998F67 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 82E3B21429DDCC6500998F67 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 82E3B21D29DDD32B00998F67 /* MainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainView.swift; sourceTree = ""; }; 82E4FCAF23D71FDF00BEBA1A /* UIApplication+ExtTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIApplication+ExtTests.swift"; sourceTree = ""; }; 82E5449124EE584E006DEF8D /* UIImageView+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImageView+Ext.swift"; sourceTree = ""; }; 82E7167D2181E8AF00D6B7C2 /* TunnelType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TunnelType.swift; sourceTree = ""; }; @@ -650,9 +670,7 @@ 82F917382344861A0025ED3A /* TermsOfServiceViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TermsOfServiceViewController.swift; sourceTree = ""; }; 82FF0D4123153D1000440E5D /* Colors.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Colors.xcassets; sourceTree = ""; }; 82FF0D432315587000440E5D /* UITextFieldPadding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITextFieldPadding.swift; sourceTree = ""; }; - 881BCA7FAAA43B4573D9E56C /* Pods-openvpn-tunnel-provider.staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-openvpn-tunnel-provider.staging.xcconfig"; path = "../ios-app/Pods/Target Support Files/Pods-openvpn-tunnel-provider/Pods-openvpn-tunnel-provider.staging.xcconfig"; sourceTree = ""; }; 95BC1917294DF1E93B308C82 /* Pods_IVPNClient.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_IVPNClient.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 9A198837B44229CF470C077A /* Pods-IVPNClient.staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-IVPNClient.staging.xcconfig"; path = "../ios-app/Pods/Target Support Files/Pods-IVPNClient/Pods-IVPNClient.staging.xcconfig"; sourceTree = ""; }; 9C2833731D9D3EB60024C553 /* Initial.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Initial.storyboard; sourceTree = ""; }; 9C2833751D9D3F060024C553 /* LoginViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoginViewController.swift; sourceTree = ""; }; 9C2833781D9D3F060024C553 /* Config.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Config.swift; sourceTree = ""; }; @@ -667,7 +685,6 @@ 9C50959920FCF6850048DBF2 /* ProtocolTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProtocolTableViewCell.swift; sourceTree = ""; }; 9C5134041DE8380F00423551 /* IVPNClient-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "IVPNClient-Bridging-Header.h"; sourceTree = ""; }; 9C5134091DE8398400423551 /* Pinger.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Pinger.swift; sourceTree = ""; }; - 9C54520B5B9FA78FA98FB0EC /* Pods-today-extension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-today-extension.release.xcconfig"; path = "../ios-app/Pods/Target Support Files/Pods-today-extension/Pods-today-extension.release.xcconfig"; sourceTree = ""; }; 9C6942241DD0CBF800F9A801 /* NetworkExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NetworkExtension.framework; path = System/Library/Frameworks/NetworkExtension.framework; sourceTree = SDKROOT; }; 9C69422D1DD20FC200F9A801 /* KeyChain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyChain.swift; sourceTree = ""; }; 9C6942361DD218A900F9A801 /* AccessDetails.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccessDetails.swift; sourceTree = ""; }; @@ -694,11 +711,6 @@ 9CDDD5B51D9D2F9F00D39924 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 9CDDD5B81D9D2F9F00D39924 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 9CDDD5BA1D9D2F9F00D39924 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - A2CECA58BD6417A99E1EF558 /* Pods-wireguard-tunnel-provider.staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-wireguard-tunnel-provider.staging.xcconfig"; path = "../ios-app/Pods/Target Support Files/Pods-wireguard-tunnel-provider/Pods-wireguard-tunnel-provider.staging.xcconfig"; sourceTree = ""; }; - C197220705CD8E3844CC5AC4 /* Pods-today-extension.staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-today-extension.staging.xcconfig"; path = "../ios-app/Pods/Target Support Files/Pods-today-extension/Pods-today-extension.staging.xcconfig"; sourceTree = ""; }; - E92B9AAA19691D5A89CA88F3 /* Pods-today-extension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-today-extension.debug.xcconfig"; path = "../ios-app/Pods/Target Support Files/Pods-today-extension/Pods-today-extension.debug.xcconfig"; sourceTree = ""; }; - FB0E616DCFD2233EFC808339 /* Pods-wireguard-tunnel-provider.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-wireguard-tunnel-provider.debug.xcconfig"; path = "../ios-app/Pods/Target Support Files/Pods-wireguard-tunnel-provider/Pods-wireguard-tunnel-provider.debug.xcconfig"; sourceTree = ""; }; - FB6AFF9326EEB2AFD57E9426 /* Pods-wireguard-tunnel-provider.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-wireguard-tunnel-provider.release.xcconfig"; path = "../ios-app/Pods/Target Support Files/Pods-wireguard-tunnel-provider/Pods-wireguard-tunnel-provider.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -709,29 +721,30 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 826F7F0E23A7A05F00777DB9 /* Frameworks */ = { + 82B605202170840C004B40E6 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 826F7F1323A7A05F00777DB9 /* NotificationCenter.framework in Frameworks */, - F85098932EABDDE39B105066 /* Pods_today_extension.framework in Frameworks */, + 82B6052F21708575004B40E6 /* NetworkExtension.framework in Frameworks */, + 824B86E126D42A5700D0101A /* WireGuardKit in Frameworks */, + 829F5FCB29A13CF2009E1AD3 /* KeychainAccess in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 82B605202170840C004B40E6 /* Frameworks */ = { + 82B81E3D235EE93D005986E8 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 62FD760D711D4A4507FAFE24 /* Pods_wireguard_tunnel_provider.framework in Frameworks */, - 82B6052F21708575004B40E6 /* NetworkExtension.framework in Frameworks */, - 824B86E126D42A5700D0101A /* WireGuardKit in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 82B81E3D235EE93D005986E8 /* Frameworks */ = { + 82E3B20729DDCC6300998F67 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 82E3B20C29DDCC6300998F67 /* SwiftUI.framework in Frameworks */, + 82E3B20B29DDCC6300998F67 /* WidgetKit.framework in Frameworks */, + 82152C9B29F17568007FCECC /* KeychainAccess in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -739,9 +752,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 8294BC8C22A10F4100328932 /* TunnelKit.framework in Frameworks */, 9CF7E35A20F7A86E008E0EC5 /* NetworkExtension.framework in Frameworks */, - 08DDD46C7843193A0C8A9F4D /* Pods_openvpn_tunnel_provider.framework in Frameworks */, + 82968A34298A970500077E0A /* TunnelKitOpenVPNAppExtension in Frameworks */, + 829F5FC929A13CEA009E1AD3 /* KeychainAccess in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -749,13 +762,19 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 8294BC8E22A126C900328932 /* TunnelKit.framework in Frameworks */, 82D598C621A6A5C7000FABDE /* SystemConfiguration.framework in Frameworks */, 9CB2CE311DAF9227007A4D2D /* CoreData.framework in Frameworks */, 9C6942251DD0CBF800F9A801 /* NetworkExtension.framework in Frameworks */, + 82EC884729A12D510024CC40 /* SnapKit in Frameworks */, + 82EC883B29A12C7D0024CC40 /* SwiftyStoreKit in Frameworks */, + 829F5FC729A13CAE009E1AD3 /* KeychainAccess in Frameworks */, + 82968A32298A970500077E0A /* TunnelKitOpenVPN in Frameworks */, + 82EC884429A12D370024CC40 /* FloatingPanel in Frameworks */, + 82EC883829A12C1F0024CC40 /* Reachability in Frameworks */, + 82EC884129A12D170024CC40 /* ActiveLabel in Frameworks */, + 82EC883529A12BD30024CC40 /* JGProgressHUD in Frameworks */, 9CC29DF01E1560990080F799 /* StoreKit.framework in Frameworks */, 824B86DF26D42A4600D0101A /* WireGuardKit in Frameworks */, - D661274AA295C4153E1286AB /* Pods_IVPNClient.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -783,30 +802,12 @@ 58126B967EB9B059871FD7AB /* Pods_wireguard_tunnel_provider.framework */, 826F7F1223A7A05F00777DB9 /* NotificationCenter.framework */, 751AB84B8432BC3E6BEDD483 /* Pods_today_extension.framework */, + 82E3B1EF29DDC91C00998F67 /* WidgetKit.framework */, + 82E3B1F129DDC91C00998F67 /* SwiftUI.framework */, ); name = Frameworks; sourceTree = ""; }; - 5E6278A33058E1B59C6A1B7F /* Pods */ = { - isa = PBXGroup; - children = ( - 70DFEFF11AFF9C4E3D88A443 /* Pods-IVPNClient.debug.xcconfig */, - 6F076EC404F769A3D7C17CF4 /* Pods-IVPNClient.release.xcconfig */, - 5F8FBDE5436D2ADCA6F3A4FE /* Pods-openvpn-tunnel-provider.debug.xcconfig */, - 27E4E56AE774F4A2C5B24728 /* Pods-openvpn-tunnel-provider.release.xcconfig */, - FB0E616DCFD2233EFC808339 /* Pods-wireguard-tunnel-provider.debug.xcconfig */, - FB6AFF9326EEB2AFD57E9426 /* Pods-wireguard-tunnel-provider.release.xcconfig */, - 9A198837B44229CF470C077A /* Pods-IVPNClient.staging.xcconfig */, - 881BCA7FAAA43B4573D9E56C /* Pods-openvpn-tunnel-provider.staging.xcconfig */, - A2CECA58BD6417A99E1EF558 /* Pods-wireguard-tunnel-provider.staging.xcconfig */, - E92B9AAA19691D5A89CA88F3 /* Pods-today-extension.debug.xcconfig */, - C197220705CD8E3844CC5AC4 /* Pods-today-extension.staging.xcconfig */, - 9C54520B5B9FA78FA98FB0EC /* Pods-today-extension.release.xcconfig */, - ); - name = Pods; - path = ../Pods; - sourceTree = ""; - }; 820079F22407D8E700EC2062 /* View */ = { isa = PBXGroup; children = ( @@ -828,6 +829,27 @@ path = PingManager; sourceTree = ""; }; + 8206BAF829ED65C600F916B7 /* Extension */ = { + isa = PBXGroup; + children = ( + 82A38A1A29E3201F00C88372 /* UserDefaults.swift */, + 8206BAFB29ED6C9600F916B7 /* Notification.swift */, + 82152C9829F14B4C007FCECC /* KeyChain.swift */, + 8271D2E22A092F7B0052AF61 /* UIDevice.swift */, + ); + path = Extension; + sourceTree = ""; + }; + 8206BAFD29ED6FDC00F916B7 /* ConnectionInfo */ = { + isa = PBXGroup; + children = ( + 8206BAFE29ED6FFF00F916B7 /* ConnectionInfoView.swift */, + 8206BB0229ED7C3700F916B7 /* ConnectionInfoViewModel.swift */, + 8206BB0029ED7BEE00F916B7 /* ConnectionInfo.swift */, + ); + path = ConnectionInfo; + sourceTree = ""; + }; 8206F31F24347A360056B465 /* View */ = { isa = PBXGroup; children = ( @@ -1032,11 +1054,11 @@ 82E7880B22B0DA0D00A98D76 /* NETunnelProviderProtocol+Ext.swift */, 828E9C94231E5780001E1FCF /* Data+Ext.swift */, 82DB75EB239E75EB0073E846 /* NEVPNStatus+Ext.swift */, - 826F7F0B23A79F1500777DB9 /* UserDefaultsTodayExtension+Ext.swift */, 829DF2812497953C000DC2DB /* UIButton+Ext.swift */, 82A3422424AB6AF700761AB0 /* Double+Ext.swift */, 82E5449124EE584E006DEF8D /* UIImageView+Ext.swift */, 82CE598F25ED3C7A0078099D /* URL+Ext.swift */, + 82B329CA29F7C9F400F3ED9B /* UIWindow+Ext.swift */, ); path = Extensions; sourceTree = ""; @@ -1057,31 +1079,6 @@ path = UnitTests; sourceTree = ""; }; - 826F7F1423A7A05F00777DB9 /* today-extension */ = { - isa = PBXGroup; - children = ( - 826F7F4823A7B4CD00777DB9 /* Config */, - 826F7F1523A7A05F00777DB9 /* TodayViewController.swift */, - 826F7F2223A7A0AB00777DB9 /* ApiManager.swift */, - 826F7F2923A7A43A00777DB9 /* ViewModel.swift */, - 826F7F2B23A7A46100777DB9 /* today-extension-Bridging-Header.h */, - 826F7F1723A7A05F00777DB9 /* MainInterface.storyboard */, - 826F7F1A23A7A05F00777DB9 /* Info.plist */, - 826F7F2C23A7A49500777DB9 /* today-extension.entitlements */, - 826F7F2423A7A1F400777DB9 /* Colors.xcassets */, - ); - path = "today-extension"; - sourceTree = ""; - }; - 826F7F4823A7B4CD00777DB9 /* Config */ = { - isa = PBXGroup; - children = ( - 826F7F4A23A7B4CD00777DB9 /* today-extension-release.xcconfig */, - 826F7F4B23A7B4CD00777DB9 /* today-extension-staging.xcconfig */, - ); - path = Config; - sourceTree = ""; - }; 8286638C21524D9F00C4D068 /* Enums */ = { isa = PBXGroup; children = ( @@ -1180,6 +1177,7 @@ 8201A5032356536B008C83DB /* UpgradePlanViewController.swift */, 821CA2D6287C5AB20067F70D /* PortViewController.swift */, 82AB0874291A6B5F0084625A /* AddCustomPortViewController.swift */, + 82052E5529C1D83700227CF9 /* MTUViewController.swift */, ); path = ViewControllers; sourceTree = ""; @@ -1231,6 +1229,25 @@ path = Pinger; sourceTree = ""; }; + 82A38A0929E2D11A00C88372 /* Status */ = { + isa = PBXGroup; + children = ( + 82A38A0A29E2D12B00C88372 /* StatusView.swift */, + 82A38A0F29E2D46000C88372 /* StatusViewModel.swift */, + 82A38A0D29E2D2D800C88372 /* Status.swift */, + ); + path = Status; + sourceTree = ""; + }; + 82A38A1929E3200000C88372 /* Service */ = { + isa = PBXGroup; + children = ( + 8206BAF929ED69D300F916B7 /* DataService.swift */, + 82C61D9C29E6C2D200AF972A /* APIService.swift */, + ); + path = Service; + sourceTree = ""; + }; 82A7F10323C865F90015A357 /* Models */ = { isa = PBXGroup; children = ( @@ -1314,6 +1331,24 @@ path = ControlPanel; sourceTree = ""; }; + 82C61D9729E6B4AC00AF972A /* Location */ = { + isa = PBXGroup; + children = ( + 82C61D9829E6B4C600AF972A /* LocationView.swift */, + 82C61DB329E6C72700AF972A /* LocationViewModel.swift */, + ); + path = Location; + sourceTree = ""; + }; + 82C61DB529E6CA7600AF972A /* Config */ = { + isa = PBXGroup; + children = ( + 82C61DB629E6CA7600AF972A /* widget-staging.xcconfig */, + 82C61DB829E6CA7600AF972A /* widget-release.xcconfig */, + ); + path = Config; + sourceTree = ""; + }; 82CE599725ED48AB0078099D /* DNSResolver */ = { isa = PBXGroup; children = ( @@ -1394,6 +1429,33 @@ path = Managers; sourceTree = ""; }; + 82E3B20D29DDCC6400998F67 /* IVPNWidget */ = { + isa = PBXGroup; + children = ( + 82C61DB529E6CA7600AF972A /* Config */, + 82E3B21C29DDD2E800998F67 /* Scene */, + 82A38A1929E3200000C88372 /* Service */, + 8206BAF829ED65C600F916B7 /* Extension */, + 82E3B20E29DDCC6400998F67 /* IVPNWidgetBundle.swift */, + 82E3B21029DDCC6400998F67 /* IVPNWidget.swift */, + 82E3B21229DDCC6500998F67 /* Assets.xcassets */, + 82E3B21429DDCC6500998F67 /* Info.plist */, + 82C61DA829E6C4CF00AF972A /* Widget-Bridging-Header.h */, + ); + path = IVPNWidget; + sourceTree = ""; + }; + 82E3B21C29DDD2E800998F67 /* Scene */ = { + isa = PBXGroup; + children = ( + 82A38A0929E2D11A00C88372 /* Status */, + 82C61D9729E6B4AC00AF972A /* Location */, + 8206BAFD29ED6FDC00F916B7 /* ConnectionInfo */, + 82E3B21D29DDD32B00998F67 /* MainView.swift */, + ); + path = Scene; + sourceTree = ""; + }; 82E81AE52449C42C00D81FB7 /* View */ = { isa = PBXGroup; children = ( @@ -1456,15 +1518,15 @@ 9CDDD5A21D9D2F9E00D39924 = { isa = PBXGroup; children = ( + 82A38A1229E2D89400C88372 /* IVPNWidgetExtension.entitlements */, 9CDDD5AD1D9D2F9F00D39924 /* IVPNClient */, 9C7840A920CD8A8A00335736 /* openvpn-tunnel-provider */, 82B605242170840C004B40E6 /* wireguard-tunnel-provider */, + 82E3B20D29DDCC6400998F67 /* IVPNWidget */, 826D182721D3DAFF0045A570 /* UnitTests */, 82B81E41235EE93D005986E8 /* UITests */, - 826F7F1423A7A05F00777DB9 /* today-extension */, 9CDDD5AC1D9D2F9F00D39924 /* Products */, 584496306C3B9383149618CE /* Frameworks */, - 5E6278A33058E1B59C6A1B7F /* Pods */, ); sourceTree = ""; }; @@ -1476,7 +1538,7 @@ 82B605232170840C004B40E6 /* wireguard-tunnel-provider.appex */, 826D182621D3DAFF0045A570 /* UnitTests.xctest */, 82B81E40235EE93D005986E8 /* UITests.xctest */, - 826F7F1123A7A05F00777DB9 /* IVPN.appex */, + 82E3B20A29DDCC6300998F67 /* IVPNWidgetExtension.appex */, ); name = Products; sourceTree = ""; @@ -1540,29 +1602,10 @@ productReference = 826D182621D3DAFF0045A570 /* UnitTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; - 826F7F1023A7A05F00777DB9 /* today-extension */ = { - isa = PBXNativeTarget; - buildConfigurationList = 826F7F1E23A7A05F00777DB9 /* Build configuration list for PBXNativeTarget "today-extension" */; - buildPhases = ( - 3149487870CE2113B6C06E41 /* [CP] Check Pods Manifest.lock */, - 826F7F0D23A7A05F00777DB9 /* Sources */, - 826F7F0E23A7A05F00777DB9 /* Frameworks */, - 826F7F0F23A7A05F00777DB9 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "today-extension"; - productName = "today-extension"; - productReference = 826F7F1123A7A05F00777DB9 /* IVPN.appex */; - productType = "com.apple.product-type.app-extension"; - }; 82B605222170840C004B40E6 /* wireguard-tunnel-provider */ = { isa = PBXNativeTarget; buildConfigurationList = 82B6052C2170840C004B40E6 /* Build configuration list for PBXNativeTarget "wireguard-tunnel-provider" */; buildPhases = ( - ACE9F7A7CF4721F6BB5EE7B2 /* [CP] Check Pods Manifest.lock */, 82B6051F2170840C004B40E6 /* Sources */, 82B605202170840C004B40E6 /* Frameworks */, 82B605212170840C004B40E6 /* Resources */, @@ -1575,6 +1618,7 @@ name = "wireguard-tunnel-provider"; packageProductDependencies = ( 824B86E026D42A5700D0101A /* WireGuardKit */, + 829F5FCA29A13CF2009E1AD3 /* KeychainAccess */, ); productName = "wireguard-tunnel-provider"; productReference = 82B605232170840C004B40E6 /* wireguard-tunnel-provider.appex */; @@ -1598,11 +1642,30 @@ productReference = 82B81E40235EE93D005986E8 /* UITests.xctest */; productType = "com.apple.product-type.bundle.ui-testing"; }; + 82E3B20929DDCC6300998F67 /* IVPNWidgetExtension */ = { + isa = PBXNativeTarget; + buildConfigurationList = 82E3B21829DDCC6500998F67 /* Build configuration list for PBXNativeTarget "IVPNWidgetExtension" */; + buildPhases = ( + 82E3B20629DDCC6300998F67 /* Sources */, + 82E3B20729DDCC6300998F67 /* Frameworks */, + 82E3B20829DDCC6300998F67 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = IVPNWidgetExtension; + packageProductDependencies = ( + 82152C9A29F17568007FCECC /* KeychainAccess */, + ); + productName = IVPNWidgetExtension; + productReference = 82E3B20A29DDCC6300998F67 /* IVPNWidgetExtension.appex */; + productType = "com.apple.product-type.app-extension"; + }; 9C7840A720CD8A8A00335736 /* openvpn-tunnel-provider */ = { isa = PBXNativeTarget; buildConfigurationList = 9C7840B120CD8A8A00335736 /* Build configuration list for PBXNativeTarget "openvpn-tunnel-provider" */; buildPhases = ( - A41DECD8426C6E493395BE8D /* [CP] Check Pods Manifest.lock */, 9C7840A420CD8A8A00335736 /* Sources */, 9C7840A520CD8A8A00335736 /* Frameworks */, 9C7840A620CD8A8A00335736 /* Resources */, @@ -1612,6 +1675,10 @@ dependencies = ( ); name = "openvpn-tunnel-provider"; + packageProductDependencies = ( + 82968A33298A970500077E0A /* TunnelKitOpenVPNAppExtension */, + 829F5FC829A13CEA009E1AD3 /* KeychainAccess */, + ); productName = "openvpn-tunnel-provider"; productReference = 9C7840A820CD8A8A00335736 /* openvpn-tunnel-provider.appex */; productType = "com.apple.product-type.app-extension"; @@ -1620,24 +1687,30 @@ isa = PBXNativeTarget; buildConfigurationList = 9CDDD5D31D9D2F9F00D39924 /* Build configuration list for PBXNativeTarget "IVPNClient" */; buildPhases = ( - 243D5D4C0BB6130F397907DE /* [CP] Check Pods Manifest.lock */, 9CDDD5A71D9D2F9E00D39924 /* Sources */, 9CDDD5A81D9D2F9E00D39924 /* Frameworks */, 9CDDD5A91D9D2F9E00D39924 /* Resources */, - 9C7840B420CD8A8A00335736 /* Embed App Extensions */, + 9C7840B420CD8A8A00335736 /* Embed Foundation Extensions */, 9CB2CE481DB28B8B007A4D2D /* Fetch servers.json */, - FBD553175C923EBDEAB6E8B5 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); dependencies = ( 9C7840AF20CD8A8A00335736 /* PBXTargetDependency */, 82B6052A2170840C004B40E6 /* PBXTargetDependency */, - 826F7F1C23A7A05F00777DB9 /* PBXTargetDependency */, + 82E3B21629DDCC6500998F67 /* PBXTargetDependency */, ); name = IVPNClient; packageProductDependencies = ( 824B86DE26D42A4600D0101A /* WireGuardKit */, + 82968A31298A970500077E0A /* TunnelKitOpenVPN */, + 82EC883429A12BD30024CC40 /* JGProgressHUD */, + 82EC883729A12C1F0024CC40 /* Reachability */, + 82EC883A29A12C7D0024CC40 /* SwiftyStoreKit */, + 82EC884029A12D170024CC40 /* ActiveLabel */, + 82EC884329A12D370024CC40 /* FloatingPanel */, + 82EC884629A12D510024CC40 /* SnapKit */, + 829F5FC629A13CAE009E1AD3 /* KeychainAccess */, ); productName = IVPNClient; productReference = 9CDDD5AB1D9D2F9F00D39924 /* IVPNClient.app */; @@ -1649,8 +1722,9 @@ 9CDDD5A31D9D2F9E00D39924 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 1130; - LastUpgradeCheck = 1020; + BuildIndependentTargetsInParallel = YES; + LastSwiftUpdateCheck = 1430; + LastUpgradeCheck = 1430; ORGANIZATIONNAME = IVPN; TargetAttributes = { 8206DEA226CFDE5E0027CBFA = { @@ -1663,11 +1737,6 @@ ProvisioningStyle = Automatic; TestTargetID = 9CDDD5AA1D9D2F9E00D39924; }; - 826F7F1023A7A05F00777DB9 = { - CreatedOnToolsVersion = 11.3; - DevelopmentTeam = WQXXM75BYN; - ProvisioningStyle = Automatic; - }; 82B605222170840C004B40E6 = { CreatedOnToolsVersion = 10.0; DevelopmentTeam = WQXXM75BYN; @@ -1691,6 +1760,9 @@ ProvisioningStyle = Automatic; TestTargetID = 9CDDD5AA1D9D2F9E00D39924; }; + 82E3B20929DDCC6300998F67 = { + CreatedOnToolsVersion = 14.3; + }; 9C7840A720CD8A8A00335736 = { CreatedOnToolsVersion = 9.4; DevelopmentTeam = WQXXM75BYN; @@ -1753,6 +1825,14 @@ mainGroup = 9CDDD5A21D9D2F9E00D39924; packageReferences = ( 824B86DD26D42A4600D0101A /* XCRemoteSwiftPackageReference "wireguard-apple" */, + 82968A30298A970500077E0A /* XCRemoteSwiftPackageReference "tunnelkit" */, + 82EC883329A12BD30024CC40 /* XCRemoteSwiftPackageReference "JGProgressHUD" */, + 82EC883629A12C1F0024CC40 /* XCRemoteSwiftPackageReference "Reachability" */, + 82EC883929A12C7D0024CC40 /* XCRemoteSwiftPackageReference "SwiftyStoreKit" */, + 82EC883F29A12D170024CC40 /* XCRemoteSwiftPackageReference "ActiveLabel" */, + 82EC884229A12D370024CC40 /* XCRemoteSwiftPackageReference "FloatingPanel" */, + 82EC884529A12D510024CC40 /* XCRemoteSwiftPackageReference "SnapKit" */, + 829F5FC529A13CAE009E1AD3 /* XCRemoteSwiftPackageReference "KeychainAccess" */, ); productRefGroup = 9CDDD5AC1D9D2F9F00D39924 /* Products */; projectDirPath = ""; @@ -1763,7 +1843,7 @@ 82B81E3F235EE93D005986E8 /* UITests */, 9C7840A720CD8A8A00335736 /* openvpn-tunnel-provider */, 82B605222170840C004B40E6 /* wireguard-tunnel-provider */, - 826F7F1023A7A05F00777DB9 /* today-extension */, + 82E3B20929DDCC6300998F67 /* IVPNWidgetExtension */, 8206DEA226CFDE5E0027CBFA /* WireGuardGoBridgeiOS */, ); }; @@ -1777,31 +1857,28 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 826F7F0F23A7A05F00777DB9 /* Resources */ = { + 82B605212170840C004B40E6 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 826F7F4F23A7B4CD00777DB9 /* today-extension-staging.xcconfig in Resources */, - 826F7F1923A7A05F00777DB9 /* MainInterface.storyboard in Resources */, - 826F7F4623A7AF2F00777DB9 /* Assets.xcassets in Resources */, - 826F7F4E23A7B4CD00777DB9 /* today-extension-release.xcconfig in Resources */, - 826F7F2523A7A1F400777DB9 /* Colors.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 82B605212170840C004B40E6 /* Resources */ = { + 82B81E3E235EE93D005986E8 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 82A9E8CA23471FB2007BCA7E /* wg-staging.xcconfig in Resources */, - 82A9E8C923471FB2007BCA7E /* wg-release.xcconfig in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 82B81E3E235EE93D005986E8 /* Resources */ = { + 82E3B20829DDCC6300998F67 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 82C61D9629E6ADEF00AF972A /* Assets.xcassets in Resources */, + 82C61DBA29E6CA7600AF972A /* widget-staging.xcconfig in Resources */, + 82C61DBC29E6CA7600AF972A /* widget-release.xcconfig in Resources */, + 82E3B21329DDCC6500998F67 /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1816,8 +1893,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 82A9E8C623471EBE007BCA7E /* staging.xcconfig in Resources */, - 82A9E8C523471EBE007BCA7E /* release.xcconfig in Resources */, 9CDDD5B91D9D2F9F00D39924 /* LaunchScreen.storyboard in Resources */, 9CDDD5B61D9D2F9F00D39924 /* Assets.xcassets in Resources */, 9CB2CE541DB2A999007A4D2D /* servers.json in Resources */, @@ -1832,50 +1907,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 243D5D4C0BB6130F397907DE /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-IVPNClient-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 3149487870CE2113B6C06E41 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-today-extension-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; 9CB2CE481DB28B8B007A4D2D /* Fetch servers.json */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 12; @@ -1891,86 +1922,6 @@ shellScript = "curl -sf \"https://api.ivpn.net/v5/servers.json?pretty=true\" > IVPNClient/Config/servers.json\n"; showEnvVarsInLog = 0; }; - A41DECD8426C6E493395BE8D /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-openvpn-tunnel-provider-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - ACE9F7A7CF4721F6BB5EE7B2 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-wireguard-tunnel-provider-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - FBD553175C923EBDEAB6E8B5 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-IVPNClient/Pods-IVPNClient-frameworks.sh", - "${BUILT_PRODUCTS_DIR}/ActiveLabel/ActiveLabel.framework", - "${BUILT_PRODUCTS_DIR}/FloatingPanel/FloatingPanel.framework", - "${BUILT_PRODUCTS_DIR}/JGProgressHUD/JGProgressHUD.framework", - "${BUILT_PRODUCTS_DIR}/KeychainAccess/KeychainAccess.framework", - "${BUILT_PRODUCTS_DIR}/ReachabilitySwift/Reachability.framework", - "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework", - "${BUILT_PRODUCTS_DIR}/SwiftyBeaver/SwiftyBeaver.framework", - "${BUILT_PRODUCTS_DIR}/SwiftyStoreKit/SwiftyStoreKit.framework", - "${BUILT_PRODUCTS_DIR}/TunnelKit/TunnelKit.framework", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL-Apple/openssl.framework/openssl", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ActiveLabel.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FloatingPanel.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JGProgressHUD.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/KeychainAccess.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftyBeaver.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftyStoreKit.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/TunnelKit.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/openssl.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-IVPNClient/Pods-IVPNClient-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -2020,40 +1971,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 826F7F0D23A7A05F00777DB9 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 826F7F3423A7A91700777DB9 /* KeyChain.swift in Sources */, - 826F7F2323A7A0AB00777DB9 /* ApiManager.swift in Sources */, - 826F7F3E23A7AA6300777DB9 /* AddressType.swift in Sources */, - 826F7F2D23A7A86D00777DB9 /* ApiRequestDI.swift in Sources */, - 826F7F2A23A7A43A00777DB9 /* ViewModel.swift in Sources */, - 824B86CA26D3E8B100D0101A /* TimerManager.swift in Sources */, - 826F7F3923A7A99300777DB9 /* CIDRAddress.swift in Sources */, - 826F7F2F23A7A88E00777DB9 /* GeoLookup.swift in Sources */, - 826F7F2E23A7A88700777DB9 /* APIClient.swift in Sources */, - 826F7F3D23A7AA4700777DB9 /* TunnelType.swift in Sources */, - 826F7F3723A7A95000777DB9 /* APIAccessManager.swift in Sources */, - 826F7F3623A7A94000777DB9 /* Config.swift in Sources */, - 826F7F1623A7A05F00777DB9 /* TodayViewController.swift in Sources */, - 826F7F4023A7AA8200777DB9 /* Capability.swift in Sources */, - 826F7F3B23A7AA3D00777DB9 /* OpenVPNProtocol.swift in Sources */, - 82FDA69B2518EA40007F881E /* DispatchQueue+Ext.swift in Sources */, - 82AA85782514DEB40027DAB8 /* Date+Ext.swift in Sources */, - 826F7F3123A7A8CE00777DB9 /* Result.swift in Sources */, - 826F7F3C23A7AA4200777DB9 /* WireGuardProtocol.swift in Sources */, - 826F7F3F23A7AA6A00777DB9 /* ErrorResult.swift in Sources */, - 826F7F3523A7A93200777DB9 /* Session.swift in Sources */, - 826F7F3823A7A97100777DB9 /* ServiceStatus.swift in Sources */, - 826F7F3A23A7A99D00777DB9 /* ConnectionSettings.swift in Sources */, - 826F7F4223A7AAB800777DB9 /* Array+Ext.swift in Sources */, - 826F7F3323A7A90200777DB9 /* UserDefaultsTodayExtension+Ext.swift in Sources */, - 826F7F3023A7A89B00777DB9 /* UserDefaults+Ext.swift in Sources */, - 825E836525A4834200938240 /* APIPublicKeyPin.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 82B6051F2170840C004B40E6 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -2061,7 +1978,6 @@ 82E7169A2181E96F00D6B7C2 /* OpenVPNProtocol.swift in Sources */, 8205352A2302BEA3007BDD58 /* Array+Ext.swift in Sources */, 82E716882181E8E100D6B7C2 /* ProviderConfigurationKeys.swift in Sources */, - 8223C5402232694E006C4F14 /* KeyChain.swift in Sources */, 82F638C5217DA89000410318 /* AddressType.swift in Sources */, 82EEB6DB25F961BC00915837 /* URL+Ext.swift in Sources */, 822919712182EB1C00978BBA /* String+Ext.swift in Sources */, @@ -2088,6 +2004,7 @@ 82CA214429379CEC008BADE8 /* UIDevice+Ext.swift in Sources */, 824B86C926D3D7FB00D0101A /* CIDRAddress.swift in Sources */, 826C56D422FD551900D2B76A /* ServiceStatus.swift in Sources */, + 82968A37298A98C900077E0A /* KeyChain.swift in Sources */, 824B86C726D3D7B600D0101A /* ApiManager.swift in Sources */, 82EEB6CD25F9422900915837 /* DNSProtocolType.swift in Sources */, 820EA86C2322430700E16B2D /* Result.swift in Sources */, @@ -2110,12 +2027,50 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 82E3B20629DDCC6300998F67 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 82E3B21129DDCC6400998F67 /* IVPNWidget.swift in Sources */, + 82C61DA029E6C37300AF972A /* APIClient.swift in Sources */, + 82C61DB229E6C6F600AF972A /* AddressType.swift in Sources */, + 82C61DAA29E6C55100AF972A /* APIAccessManager.swift in Sources */, + 8206BB0129ED7BEE00F916B7 /* ConnectionInfo.swift in Sources */, + 82C61D9F29E6C33700AF972A /* Result.swift in Sources */, + 82A38A0E29E2D2D800C88372 /* Status.swift in Sources */, + 82C61DA329E6C45100AF972A /* Config.swift in Sources */, + 82C61DA229E6C3F100AF972A /* UserDefaults+Ext.swift in Sources */, + 8206BAFF29ED6FFF00F916B7 /* ConnectionInfoView.swift in Sources */, + 82E3B20F29DDCC6400998F67 /* IVPNWidgetBundle.swift in Sources */, + 82C61DAB29E6C56400AF972A /* APIPublicKeyPin.swift in Sources */, + 82C61DA529E6C48100AF972A /* OpenVPNProtocol.swift in Sources */, + 82C61DA429E6C46900AF972A /* ConnectionSettings.swift in Sources */, + 82C61D9D29E6C2D200AF972A /* APIService.swift in Sources */, + 82152C9929F14B4C007FCECC /* KeyChain.swift in Sources */, + 82C61D9E29E6C32400AF972A /* ApiRequestDI.swift in Sources */, + 8206BAFA29ED69D300F916B7 /* DataService.swift in Sources */, + 82C61DB429E6C72700AF972A /* LocationViewModel.swift in Sources */, + 82C61DA629E6C48700AF972A /* WireGuardProtocol.swift in Sources */, + 82A38A0C29E2D17700C88372 /* StatusView.swift in Sources */, + 8206BB0329ED7C3700F916B7 /* ConnectionInfoViewModel.swift in Sources */, + 823BA40329EC5A01004B07B4 /* GeoLookup.swift in Sources */, + 8271D2E32A092F7B0052AF61 /* UIDevice.swift in Sources */, + 82C61DA729E6C49100AF972A /* TunnelType.swift in Sources */, + 82C61DB029E6C5E700AF972A /* Date+Ext.swift in Sources */, + 82C61DA929E6C53C00AF972A /* Array+Ext.swift in Sources */, + 82A38A1029E2D46000C88372 /* StatusViewModel.swift in Sources */, + 8206BAFC29ED6C9600F916B7 /* Notification.swift in Sources */, + 82A38A1B29E3201F00C88372 /* UserDefaults.swift in Sources */, + 82C61D9929E6B4C600AF972A /* LocationView.swift in Sources */, + 82E3B21E29DDD32B00998F67 /* MainView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 9C7840A420CD8A8A00335736 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 823BD9E3231D4C8E002E631D /* ErrorResult.swift in Sources */, - 82234B6E21BA90E400B082DE /* KeyChain.swift in Sources */, 82E7168D2181E8E900D6B7C2 /* WireGuardProtocol.swift in Sources */, 9CF7E37820F7ABE3008E0EC5 /* PacketTunnelProvider.swift in Sources */, 82D90474216C7DAF0032F3BE /* Date+Ext.swift in Sources */, @@ -2126,6 +2081,7 @@ 82E716932181E90500D6B7C2 /* ConnectionSettings.swift in Sources */, 823FFB082338E09900F91A5D /* Capability.swift in Sources */, 826F7F4323A7AAD200777DB9 /* Array+Ext.swift in Sources */, + 82968A36298A98C600077E0A /* KeyChain.swift in Sources */, 82E716812181E8AF00D6B7C2 /* TunnelType.swift in Sources */, 82A208C121BAAC6C00C9AD44 /* Config.swift in Sources */, ); @@ -2200,6 +2156,7 @@ 82FF0D442315587000440E5D /* UITextFieldPadding.swift in Sources */, 8243584425DAA7BD005FDEBB /* SecureDNSViewController.swift in Sources */, 82BBF26D21AE95C000589766 /* UIApplication+Ext.swift in Sources */, + 82B329CB29F7C9F400F3ED9B /* UIWindow+Ext.swift in Sources */, 8247E1DA22686217006C0C08 /* IAPManager.swift in Sources */, 82C973A0217DFA9C00CE06D4 /* Host.swift in Sources */, 82A160BA221C4E2000730577 /* Server+CoreDataClass.swift in Sources */, @@ -2252,6 +2209,7 @@ 824777EA21A6BC3A001EEFAF /* Network+CoreDataProperties.swift in Sources */, 82C34D6E26FB02F900F06016 /* WireGuardEndpoint.swift in Sources */, 8232FBF42240DE19006B81D2 /* ErrorResult.swift in Sources */, + 82052E5629C1D83700227CF9 /* MTUViewController.swift in Sources */, 82351FCE2420CE6800E6E0FD /* MapMarkerView.swift in Sources */, 9C6942371DD218A900F9A801 /* AccessDetails.swift in Sources */, 82D598B421A5A7A3000FABDE /* NetworkTrust.swift in Sources */, @@ -2284,11 +2242,11 @@ 82A6D74A24A3780B00D6C0E1 /* ConnectToServerPopupView.swift in Sources */, 828772FB221C28E000D5E330 /* FlagImageView.swift in Sources */, 82E7880C22B0DA0D00A98D76 /* NETunnelProviderProtocol+Ext.swift in Sources */, + 82968A35298A98C300077E0A /* KeyChain.swift in Sources */, 82F638C2217DA89000410318 /* AddressType.swift in Sources */, 822920A02480FA3600476FC1 /* ServersSort.swift in Sources */, 826E61482428F8E60064F195 /* AccountViewController.swift in Sources */, 820079F42407D96D00EC2062 /* ConnectionInfoBoxView.swift in Sources */, - 9C69422E1DD20FC200F9A801 /* KeyChain.swift in Sources */, 821429BB22FC36100056B8FF /* ApiRequestDI.swift in Sources */, 82AB0877291A6B9C0084625A /* CustomPort+CoreDataClass.swift in Sources */, 82C1D5BC23FE78570059A915 /* MapScrollView.swift in Sources */, @@ -2298,7 +2256,6 @@ 821CA2DF288143470067F70D /* PortRange.swift in Sources */, 821CA2D7287C5AB20067F70D /* PortViewController.swift in Sources */, 82061F66238D2730009DDF4D /* ICMPHeader.swift in Sources */, - 826F7F0C23A79F1500777DB9 /* UserDefaultsTodayExtension+Ext.swift in Sources */, 824BC466240906ED00A61B29 /* VPNStatusViewModel.swift in Sources */, 8247E1DE22687C28006C0C08 /* ProductIdentifier.swift in Sources */, 829DF2822497953C000DC2DB /* UIButton+Ext.swift in Sources */, @@ -2329,11 +2286,6 @@ target = 9CDDD5AA1D9D2F9E00D39924 /* IVPNClient */; targetProxy = 826D182B21D3DAFF0045A570 /* PBXContainerItemProxy */; }; - 826F7F1C23A7A05F00777DB9 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 826F7F1023A7A05F00777DB9 /* today-extension */; - targetProxy = 826F7F1B23A7A05F00777DB9 /* PBXContainerItemProxy */; - }; 82B6052A2170840C004B40E6 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 82B605222170840C004B40E6 /* wireguard-tunnel-provider */; @@ -2344,6 +2296,11 @@ target = 9CDDD5AA1D9D2F9E00D39924 /* IVPNClient */; targetProxy = 82B81E45235EE93D005986E8 /* PBXContainerItemProxy */; }; + 82E3B21629DDCC6500998F67 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 82E3B20929DDCC6300998F67 /* IVPNWidgetExtension */; + targetProxy = 82E3B21529DDCC6500998F67 /* PBXContainerItemProxy */; + }; 9C7840AF20CD8A8A00335736 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 9C7840A720CD8A8A00335736 /* openvpn-tunnel-provider */; @@ -2352,14 +2309,6 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ - 826F7F1723A7A05F00777DB9 /* MainInterface.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 826F7F1823A7A05F00777DB9 /* Base */, - ); - name = MainInterface.storyboard; - sourceTree = ""; - }; 9CDDD5B21D9D2F9F00D39924 /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( @@ -2456,12 +2405,8 @@ DEVELOPMENT_TEAM = WQXXM75BYN; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = UnitTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.1; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = net.ivpn.clients.ios.UnitTests; @@ -2485,12 +2430,8 @@ DEVELOPMENT_TEAM = WQXXM75BYN; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = UnitTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.1; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = net.ivpn.clients.ios.UnitTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2500,103 +2441,6 @@ }; name = Release; }; - 826F7F1F23A7A05F00777DB9 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 826F7F4A23A7B4CD00777DB9 /* today-extension-release.xcconfig */; - buildSettings = { - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = "today-extension/today-extension.entitlements"; - CODE_SIGN_IDENTITY = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; - DEVELOPMENT_TEAM = WQXXM75BYN; - GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = "today-extension/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - MARKETING_VERSION = 2.7.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = "net.ivpn.clients.ios.today-extension"; - PRODUCT_NAME = IVPN; - SKIP_INSTALL = YES; - SWIFT_OBJC_BRIDGING_HEADER = "today-extension/today-extension-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 826F7F2023A7A05F00777DB9 /* Staging */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 826F7F4B23A7B4CD00777DB9 /* today-extension-staging.xcconfig */; - buildSettings = { - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = "today-extension/today-extension.entitlements"; - CODE_SIGN_IDENTITY = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; - DEVELOPMENT_TEAM = WQXXM75BYN; - GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = "today-extension/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - MARKETING_VERSION = 2.7.0; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = "net.ivpn.clients.ios.today-extension"; - PRODUCT_NAME = IVPN; - SKIP_INSTALL = YES; - SWIFT_OBJC_BRIDGING_HEADER = "today-extension/today-extension-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Staging; - }; - 826F7F2123A7A05F00777DB9 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 826F7F4A23A7B4CD00777DB9 /* today-extension-release.xcconfig */; - buildSettings = { - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = "today-extension/today-extension.entitlements"; - CODE_SIGN_IDENTITY = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; - DEVELOPMENT_TEAM = WQXXM75BYN; - GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = "today-extension/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - MARKETING_VERSION = 2.7.0; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = "net.ivpn.clients.ios.today-extension"; - PRODUCT_NAME = IVPN; - SKIP_INSTALL = YES; - SWIFT_OBJC_BRIDGING_HEADER = "today-extension/today-extension-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; 82B6052D2170840C004B40E6 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 82A9E8C723471FB2007BCA7E /* wg-release.xcconfig */; @@ -2617,16 +2461,13 @@ ); GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "wireguard-tunnel-provider/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; LIBRARY_SEARCH_PATHS = "$(inherited)"; MARKETING_VERSION = 2.7.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = "net.ivpn.clients.ios.wireguard-tunnel-provider"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -2656,15 +2497,12 @@ ); GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "wireguard-tunnel-provider/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; LIBRARY_SEARCH_PATHS = "$(inherited)"; MARKETING_VERSION = 2.7.0; MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = "net.ivpn.clients.ios.wireguard-tunnel-provider"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -2686,12 +2524,8 @@ DEVELOPMENT_TEAM = WQXXM75BYN; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = UITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = net.ivpn.clients.ios.UITests; @@ -2713,12 +2547,8 @@ DEVELOPMENT_TEAM = WQXXM75BYN; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = UITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = net.ivpn.clients.ios.UITests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2739,12 +2569,8 @@ DEVELOPMENT_TEAM = WQXXM75BYN; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = UITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = net.ivpn.clients.ios.UITests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2779,6 +2605,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -2790,7 +2617,6 @@ DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -2806,7 +2632,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = ""; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = ""; @@ -2834,20 +2660,14 @@ "$(PROJECT_DIR)/**", ); INFOPLIST_FILE = "$(SRCROOT)/IVPNClient/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); MARKETING_VERSION = 2.7.0; - OTHER_LDFLAGS = ( - "$(inherited)", - "-framework", - "\"KeychainAccess\"", - "-framework", - "\"SwiftyStoreKit\"", - "-Wl,-sectcreate,__RESTRICT,__restrict,/dev/null", - ); + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = "$(inherited)"; OTHER_SWIFT_FLAGS = "-D DEBUG"; PRODUCT_BUNDLE_IDENTIFIER = net.ivpn.clients.ios; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2870,12 +2690,8 @@ DEVELOPMENT_TEAM = WQXXM75BYN; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = UnitTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.1; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = net.ivpn.clients.ios.UnitTests; @@ -2888,7 +2704,6 @@ }; 82D2D80022CA404C004BCC52 /* Staging */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 881BCA7FAAA43B4573D9E56C /* Pods-openvpn-tunnel-provider.staging.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; APPLICATION_EXTENSION_API_ONLY = YES; @@ -2915,13 +2730,14 @@ ); GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "openvpn-tunnel-provider/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); MARKETING_VERSION = 2.7.0; + ONLY_ACTIVE_ARCH = YES; OTHER_SWIFT_FLAGS = "-D DEBUG"; PRODUCT_BUNDLE_IDENTIFIER = "net.ivpn.clients.ios.openvpn-tunnel-provider"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2951,16 +2767,13 @@ ); GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "wireguard-tunnel-provider/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; LIBRARY_SEARCH_PATHS = "$(inherited)"; MARKETING_VERSION = 2.7.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = "net.ivpn.clients.ios.wireguard-tunnel-provider"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -2970,9 +2783,111 @@ }; name = Staging; }; + 82E3B21929DDCC6500998F67 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 82C61DB829E6CA7600AF972A /* widget-release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = IVPNWidgetExtension.entitlements; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = WQXXM75BYN; + GCC_C_LANGUAGE_STANDARD = gnu11; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = IVPNWidget/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = IVPNWidget; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2023 IVPN. All rights reserved."; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = net.ivpn.clients.ios.IVPNWidget; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "$(PROJECT_DIR)/IVPNWidget/Widget-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 82E3B21A29DDCC6500998F67 /* Staging */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 82C61DB629E6CA7600AF972A /* widget-staging.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = IVPNWidgetExtension.entitlements; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = WQXXM75BYN; + GCC_C_LANGUAGE_STANDARD = gnu11; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = IVPNWidget/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = IVPNWidget; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2023 IVPN. All rights reserved."; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; + MARKETING_VERSION = 1.0; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = net.ivpn.clients.ios.IVPNWidget; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "$(PROJECT_DIR)/IVPNWidget/Widget-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Staging; + }; + 82E3B21B29DDCC6500998F67 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 82C61DB829E6CA7600AF972A /* widget-release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = IVPNWidgetExtension.entitlements; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = WQXXM75BYN; + GCC_C_LANGUAGE_STANDARD = gnu11; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = IVPNWidget/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = IVPNWidget; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2023 IVPN. All rights reserved."; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; + MARKETING_VERSION = 1.0; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = net.ivpn.clients.ios.IVPNWidget; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "$(PROJECT_DIR)/IVPNWidget/Widget-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; 9C7840B220CD8A8A00335736 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5F8FBDE5436D2ADCA6F3A4FE /* Pods-openvpn-tunnel-provider.debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; APPLICATION_EXTENSION_API_ONLY = YES; @@ -2999,13 +2914,14 @@ ); GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "openvpn-tunnel-provider/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); MARKETING_VERSION = 2.7.0; + ONLY_ACTIVE_ARCH = YES; OTHER_SWIFT_FLAGS = "-D DEBUG"; PRODUCT_BUNDLE_IDENTIFIER = "net.ivpn.clients.ios.openvpn-tunnel-provider"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -3017,7 +2933,6 @@ }; 9C7840B320CD8A8A00335736 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 27E4E56AE774F4A2C5B24728 /* Pods-openvpn-tunnel-provider.release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; APPLICATION_EXTENSION_API_ONLY = YES; @@ -3044,13 +2959,14 @@ ); GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "openvpn-tunnel-provider/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); MARKETING_VERSION = 2.7.0; + ONLY_ACTIVE_ARCH = YES; OTHER_SWIFT_FLAGS = "-D RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = "net.ivpn.clients.ios.openvpn-tunnel-provider"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -3085,6 +3001,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -3096,7 +3013,6 @@ DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -3112,7 +3028,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = ""; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = ""; @@ -3148,6 +3064,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -3159,7 +3076,6 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -3169,7 +3085,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = ""; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_NAME = ""; SDKROOT = iphoneos; @@ -3197,19 +3113,14 @@ "$(PROJECT_DIR)/**", ); INFOPLIST_FILE = "$(SRCROOT)/IVPNClient/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); MARKETING_VERSION = 2.7.0; - OTHER_LDFLAGS = ( - "$(inherited)", - "-framework", - "\"KeychainAccess\"", - "-framework", - "\"SwiftyStoreKit\"", - ); + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = "$(inherited)"; OTHER_SWIFT_FLAGS = "-D DEBUG"; PRODUCT_BUNDLE_IDENTIFIER = net.ivpn.clients.ios; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -3236,21 +3147,14 @@ "$(PROJECT_DIR)/**", ); INFOPLIST_FILE = "$(SRCROOT)/IVPNClient/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", - "$(SRCROOT)/Carthage/Build/iOS", ); MARKETING_VERSION = 2.7.0; - OTHER_LDFLAGS = ( - "$(inherited)", - "-framework", - "\"KeychainAccess\"", - "-framework", - "\"SwiftyStoreKit\"", - "-Wl,-sectcreate,__RESTRICT,__restrict,/dev/null", - ); + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = "$(inherited)"; OTHER_SWIFT_FLAGS = "-D RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = net.ivpn.clients.ios; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -3282,16 +3186,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 826F7F1E23A7A05F00777DB9 /* Build configuration list for PBXNativeTarget "today-extension" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 826F7F1F23A7A05F00777DB9 /* Debug */, - 826F7F2023A7A05F00777DB9 /* Staging */, - 826F7F2123A7A05F00777DB9 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 82B6052C2170840C004B40E6 /* Build configuration list for PBXNativeTarget "wireguard-tunnel-provider" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -3312,6 +3206,16 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 82E3B21829DDCC6500998F67 /* Build configuration list for PBXNativeTarget "IVPNWidgetExtension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 82E3B21929DDCC6500998F67 /* Debug */, + 82E3B21A29DDCC6500998F67 /* Staging */, + 82E3B21B29DDCC6500998F67 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 9C7840B120CD8A8A00335736 /* Build configuration list for PBXNativeTarget "openvpn-tunnel-provider" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -3353,9 +3257,78 @@ revision = 23618f994f17d8ad8f2f65d79b4a1e8a0830b334; }; }; + 82968A30298A970500077E0A /* XCRemoteSwiftPackageReference "tunnelkit" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/passepartoutvpn/tunnelkit"; + requirement = { + kind = exactVersion; + version = 4.1.0; + }; + }; + 829F5FC529A13CAE009E1AD3 /* XCRemoteSwiftPackageReference "KeychainAccess" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/kishikawakatsumi/KeychainAccess"; + requirement = { + kind = exactVersion; + version = 3.2.0; + }; + }; + 82EC883329A12BD30024CC40 /* XCRemoteSwiftPackageReference "JGProgressHUD" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/JonasGessner/JGProgressHUD"; + requirement = { + kind = exactVersion; + version = 2.2.0; + }; + }; + 82EC883629A12C1F0024CC40 /* XCRemoteSwiftPackageReference "Reachability" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/ashleymills/Reachability.swift"; + requirement = { + kind = exactVersion; + version = 5.1.0; + }; + }; + 82EC883929A12C7D0024CC40 /* XCRemoteSwiftPackageReference "SwiftyStoreKit" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/bizz84/SwiftyStoreKit"; + requirement = { + kind = exactVersion; + version = 0.16.1; + }; + }; + 82EC883F29A12D170024CC40 /* XCRemoteSwiftPackageReference "ActiveLabel" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/optonaut/ActiveLabel.swift"; + requirement = { + kind = exactVersion; + version = 1.1.0; + }; + }; + 82EC884229A12D370024CC40 /* XCRemoteSwiftPackageReference "FloatingPanel" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/scenee/FloatingPanel"; + requirement = { + kind = exactVersion; + version = 1.7.2; + }; + }; + 82EC884529A12D510024CC40 /* XCRemoteSwiftPackageReference "SnapKit" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/SnapKit/SnapKit"; + requirement = { + kind = exactVersion; + version = 5.0.1; + }; + }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ + 82152C9A29F17568007FCECC /* KeychainAccess */ = { + isa = XCSwiftPackageProductDependency; + package = 829F5FC529A13CAE009E1AD3 /* XCRemoteSwiftPackageReference "KeychainAccess" */; + productName = KeychainAccess; + }; 824B86DE26D42A4600D0101A /* WireGuardKit */ = { isa = XCSwiftPackageProductDependency; package = 824B86DD26D42A4600D0101A /* XCRemoteSwiftPackageReference "wireguard-apple" */; @@ -3366,6 +3339,61 @@ package = 824B86DD26D42A4600D0101A /* XCRemoteSwiftPackageReference "wireguard-apple" */; productName = WireGuardKit; }; + 82968A31298A970500077E0A /* TunnelKitOpenVPN */ = { + isa = XCSwiftPackageProductDependency; + package = 82968A30298A970500077E0A /* XCRemoteSwiftPackageReference "tunnelkit" */; + productName = TunnelKitOpenVPN; + }; + 82968A33298A970500077E0A /* TunnelKitOpenVPNAppExtension */ = { + isa = XCSwiftPackageProductDependency; + package = 82968A30298A970500077E0A /* XCRemoteSwiftPackageReference "tunnelkit" */; + productName = TunnelKitOpenVPNAppExtension; + }; + 829F5FC629A13CAE009E1AD3 /* KeychainAccess */ = { + isa = XCSwiftPackageProductDependency; + package = 829F5FC529A13CAE009E1AD3 /* XCRemoteSwiftPackageReference "KeychainAccess" */; + productName = KeychainAccess; + }; + 829F5FC829A13CEA009E1AD3 /* KeychainAccess */ = { + isa = XCSwiftPackageProductDependency; + package = 829F5FC529A13CAE009E1AD3 /* XCRemoteSwiftPackageReference "KeychainAccess" */; + productName = KeychainAccess; + }; + 829F5FCA29A13CF2009E1AD3 /* KeychainAccess */ = { + isa = XCSwiftPackageProductDependency; + package = 829F5FC529A13CAE009E1AD3 /* XCRemoteSwiftPackageReference "KeychainAccess" */; + productName = KeychainAccess; + }; + 82EC883429A12BD30024CC40 /* JGProgressHUD */ = { + isa = XCSwiftPackageProductDependency; + package = 82EC883329A12BD30024CC40 /* XCRemoteSwiftPackageReference "JGProgressHUD" */; + productName = JGProgressHUD; + }; + 82EC883729A12C1F0024CC40 /* Reachability */ = { + isa = XCSwiftPackageProductDependency; + package = 82EC883629A12C1F0024CC40 /* XCRemoteSwiftPackageReference "Reachability" */; + productName = Reachability; + }; + 82EC883A29A12C7D0024CC40 /* SwiftyStoreKit */ = { + isa = XCSwiftPackageProductDependency; + package = 82EC883929A12C7D0024CC40 /* XCRemoteSwiftPackageReference "SwiftyStoreKit" */; + productName = SwiftyStoreKit; + }; + 82EC884029A12D170024CC40 /* ActiveLabel */ = { + isa = XCSwiftPackageProductDependency; + package = 82EC883F29A12D170024CC40 /* XCRemoteSwiftPackageReference "ActiveLabel" */; + productName = ActiveLabel; + }; + 82EC884329A12D370024CC40 /* FloatingPanel */ = { + isa = XCSwiftPackageProductDependency; + package = 82EC884229A12D370024CC40 /* XCRemoteSwiftPackageReference "FloatingPanel" */; + productName = FloatingPanel; + }; + 82EC884629A12D510024CC40 /* SnapKit */ = { + isa = XCSwiftPackageProductDependency; + package = 82EC884529A12D510024CC40 /* XCRemoteSwiftPackageReference "SnapKit" */; + productName = SnapKit; + }; /* End XCSwiftPackageProductDependency section */ /* Begin XCVersionGroup section */ diff --git a/IVPNClient.xcodeproj/xcshareddata/xcschemes/IVPNClient.xcscheme b/IVPNClient.xcodeproj/xcshareddata/xcschemes/IVPNClient.xcscheme index aef26f792..7744f91d0 100644 --- a/IVPNClient.xcodeproj/xcshareddata/xcschemes/IVPNClient.xcscheme +++ b/IVPNClient.xcodeproj/xcshareddata/xcschemes/IVPNClient.xcscheme @@ -1,6 +1,6 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/IVPNClient.xcodeproj/xcshareddata/xcschemes/openvpn-tunnel-provider.xcscheme b/IVPNClient.xcodeproj/xcshareddata/xcschemes/openvpn-tunnel-provider.xcscheme index 00e97b714..40faded3f 100644 --- a/IVPNClient.xcodeproj/xcshareddata/xcschemes/openvpn-tunnel-provider.xcscheme +++ b/IVPNClient.xcodeproj/xcshareddata/xcschemes/openvpn-tunnel-provider.xcscheme @@ -1,6 +1,6 @@ diff --git a/IVPNClient.xcodeproj/xcshareddata/xcschemes/wireguard-tunnel-provider.xcscheme b/IVPNClient.xcodeproj/xcshareddata/xcschemes/wireguard-tunnel-provider.xcscheme index b7c9b1c6b..45de4ce1f 100644 --- a/IVPNClient.xcodeproj/xcshareddata/xcschemes/wireguard-tunnel-provider.xcscheme +++ b/IVPNClient.xcodeproj/xcshareddata/xcschemes/wireguard-tunnel-provider.xcscheme @@ -1,6 +1,6 @@ diff --git a/IVPNClient/AppDelegate.swift b/IVPNClient/AppDelegate.swift index 8e80f6f55..4997496c0 100644 --- a/IVPNClient/AppDelegate.swift +++ b/IVPNClient/AppDelegate.swift @@ -147,23 +147,19 @@ class AppDelegate: UIResponder { switch endpoint { case Config.urlTypeConnect: viewController.showActionAlert(title: "Please confirm", message: "Do you want to connect to VPN?", action: "Connect", actionHandler: { _ in - DispatchQueue.delay(0.75) { - if UserDefaults.shared.networkProtectionEnabled { - Application.shared.connectionManager.resetRulesAndConnectShortcut(closeApp: true, actionType: .connect) - return - } - Application.shared.connectionManager.connectShortcut(closeApp: true, actionType: .connect) + if UserDefaults.shared.networkProtectionEnabled { + Application.shared.connectionManager.resetRulesAndConnectShortcut(closeApp: true, actionType: .connect) + return } + Application.shared.connectionManager.connectShortcut(closeApp: true, actionType: .connect) }) case Config.urlTypeDisconnect: viewController.showActionAlert(title: "Please confirm", message: "Do you want to disconnect from VPN?", action: "Disconnect", actionHandler: { _ in - DispatchQueue.delay(0.75) { - if UserDefaults.shared.networkProtectionEnabled { - Application.shared.connectionManager.resetRulesAndDisconnectShortcut(closeApp: true, actionType: .disconnect) - return - } - Application.shared.connectionManager.disconnectShortcut(closeApp: true, actionType: .disconnect) + if UserDefaults.shared.networkProtectionEnabled { + Application.shared.connectionManager.resetRulesAndDisconnectShortcut(closeApp: true, actionType: .disconnect) + return } + Application.shared.connectionManager.disconnectShortcut(closeApp: true, actionType: .disconnect) }) case Config.urlTypeLogin: if UIApplication.topViewController() as? LoginViewController != nil { @@ -284,10 +280,7 @@ extension AppDelegate: UIApplicationDelegate { createLogFiles() resetLastPingTimestamp() clearURLCache() - - if #available(iOS 14.0, *) { - DNSManager.shared.loadProfile { _ in } - } + DNSManager.shared.loadProfile { _ in } return true } @@ -353,6 +346,12 @@ extension AppDelegate: UIApplicationDelegate { } } + func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { + let endpoint = url.lastPathComponent + handleURLEndpoint(endpoint) + return true + } + func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { if let url = userActivity.webpageURL { let endpoint = url.lastPathComponent diff --git a/IVPNClient/Assets.xcassets/ivpn-logo.imageset/Contents.json b/IVPNClient/Assets.xcassets/ivpn-logo.imageset/Contents.json index 73fa9f77c..b5be77365 100644 --- a/IVPNClient/Assets.xcassets/ivpn-logo.imageset/Contents.json +++ b/IVPNClient/Assets.xcassets/ivpn-logo.imageset/Contents.json @@ -8,5 +8,8 @@ "info" : { "author" : "xcode", "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true } } diff --git a/IVPNClient/Colors.xcassets/ivpnBlue.colorset/Contents.json b/IVPNClient/Colors.xcassets/ivpnBlue.colorset/Contents.json index fc6779baa..f7105f24e 100644 --- a/IVPNClient/Colors.xcassets/ivpnBlue.colorset/Contents.json +++ b/IVPNClient/Colors.xcassets/ivpnBlue.colorset/Contents.json @@ -1,20 +1,20 @@ { - "info" : { - "version" : 1, - "author" : "xcode" - }, "colors" : [ { - "idiom" : "universal", "color" : { "color-space" : "srgb", "components" : { - "red" : "57", "alpha" : "1.000", "blue" : "230", - "green" : "143" + "green" : "143", + "red" : "57" } - } + }, + "idiom" : "universal" } - ] -} \ No newline at end of file + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/IVPNClient/Config/release.template.xcconfig b/IVPNClient/Config/release.template.xcconfig index 87bf2478a..70eac0bdb 100644 --- a/IVPNClient/Config/release.template.xcconfig +++ b/IVPNClient/Config/release.template.xcconfig @@ -1,5 +1,3 @@ -#include "Pods/Target Support Files/Pods-IVPNClient/Pods-IVPNClient.release.xcconfig" - Environment = production ApiHostName = api.ivpn.net TlsHostName = ivpn.net diff --git a/IVPNClient/Config/servers.json b/IVPNClient/Config/servers.json index f8db048be..7f0abcf6b 100644 --- a/IVPNClient/Config/servers.json +++ b/IVPNClient/Config/servers.json @@ -1 +1 @@ -{"wireguard":[{"gateway":"ca-qc.wg.ivpn.net","country_code":"CA","country":"Canada","city":"Montreal","latitude":45.5,"longitude":-73.5833,"isp":"M247","hosts":[{"hostname":"ca1.wg.ivpn.net","host":"37.120.130.58","public_key":"rg+GGDmjM4Vxo1hURvKmgm9yonb6qcoKbPCP/DNDBnI=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":14.41,"multihop_port":23810},{"hostname":"ca-qc1.wg.ivpn.net","host":"87.101.92.29","public_key":"98JU1mdCR8vD1aNZg017/NjBeTjuuCKUaLw0zfz/CUE=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":19.88,"multihop_port":27001}]},{"gateway":"ch.wg.ivpn.net","country_code":"CH","country":"Switzerland","city":"Zurich","latitude":47.38,"longitude":8.55,"isp":"Privatelayer","hosts":[{"hostname":"ch1.wg.ivpn.net","host":"141.255.164.66","public_key":"jVZJ61i1xxkAfriDHpwvF/GDuTvZUqhwoWSjkOJvaUA=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":23.37,"multihop_port":23610},{"hostname":"ch01.wg.ivpn.net","host":"185.212.170.141","public_key":"dU7gLfcupYd37LW0q6cxC6PHMba+eUFAUOoU/ryXZkY=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":17.56,"multihop_port":23601},{"hostname":"ch3.wg.ivpn.net","host":"141.255.166.198","public_key":"JBpgBKtqIneRuEga7mbP2PAk/e4HPRaC11H0A0+R3lA=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":26.89,"multihop_port":22901}]},{"gateway":"de.wg.ivpn.net","country_code":"DE","country":"Germany","city":"Frankfurt","latitude":50.1,"longitude":8.675,"isp":"Datapacket","hosts":[{"hostname":"de1.wg.ivpn.net","host":"185.102.219.26","public_key":"mS3/WpXjnMAMmXjSpd4nFzx9HSE3ubv2WyjpyH2REgs=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":15.93,"multihop_port":23010},{"hostname":"de01.wg.ivpn.net","host":"178.162.212.24","public_key":"Sc5AUZieg0qX8kyCy9p0OHRES4n0CHtHHM+ZPyERFTc=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":31.78,"multihop_port":23001},{"hostname":"de2.wg.ivpn.net","host":"37.58.60.151","public_key":"QhY3OtBf4FFafKtLO33e6k8JnAl8e6ktFcRUyLjCDVY=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":22.81,"multihop_port":22001}]},{"gateway":"gb.wg.ivpn.net","country_code":"GB","country":"United Kingdom","city":"London","latitude":51.5,"longitude":-0.1167,"isp":"M247","hosts":[{"hostname":"gb1.wg.ivpn.net","host":"81.92.202.114","public_key":"7+jos+Eg+hMEOQE4Std6OJ+WVnCcmbqS1/EbPwn9w3s=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":13.88,"multihop_port":20810},{"hostname":"gb01.wg.ivpn.net","host":"185.59.221.140","public_key":"yKK5x+D17Jr3Q12T/UBaDjNVmNdZBsqpvTqH6YfsGHg=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":27.36,"multihop_port":20801},{"hostname":"gb2.wg.ivpn.net","host":"185.59.221.225","public_key":"x0BTRaxsdxAd58ZyU2YMX4bmuj+Eg+8/urT2F3Vs1n8=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":8.94,"multihop_port":24201}]},{"gateway":"it.wg.ivpn.net","country_code":"IT","country":"Italy","city":"Milan","latitude":45.47,"longitude":9.205,"isp":"M247","hosts":[{"hostname":"it1.wg.ivpn.net","host":"82.102.21.90","public_key":"Aj6b81yrDk7I913R+fuSW/NAmIl87N73vHgY5/WQY0Q=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":7.46,"multihop_port":24310},{"hostname":"it01.wg.ivpn.net","host":"158.58.172.89","public_key":"QTzR5R6jeDI/cQ0CXPIqOby9GR5nn+4Bcf4bK536Vy0=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":7.57,"multihop_port":24301}]},{"gateway":"nl.wg.ivpn.net","country_code":"NL","country":"Netherlands","city":"Amsterdam","latitude":52.35,"longitude":4.9166,"isp":"Datapacket","hosts":[{"hostname":"nl1.wg.ivpn.net","host":"185.102.218.104","public_key":"AsMT2FqpkZbjzWeDch6GwufF5odl259W/hIkGytVfWo=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":11.94,"multihop_port":20301},{"hostname":"nl3.wg.ivpn.net","host":"95.211.95.9","public_key":"XDU6Syq1DY82IMatsHV0x/TAtbLiRwh/SdFCXlEn40c=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":5.45,"multihop_port":23101},{"hostname":"nl4.wg.ivpn.net","host":"95.211.95.19","public_key":"cVB66gPq5cZ9dfXY+e2pbsCyih5o1zk04l5c5VCsV1g=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.73,"multihop_port":23201},{"hostname":"nl5.wg.ivpn.net","host":"95.211.243.162","public_key":"NCagAawwRixI6Iw/NWiGD8lbjDNCl0aTICZKJtO/1HA=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":35.96,"multihop_port":23901},{"hostname":"nl6.wg.ivpn.net","host":"95.211.243.182","public_key":"hMWpqb3FEATHIbImPVWB/5z2nWIXghwpnJjevPY+1H0=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":24.22,"multihop_port":24101},{"hostname":"nl7.wg.ivpn.net","host":"95.211.172.105","public_key":"hQNYqtfOOAEz0IGshLx/TI9hUrfR9gIIkjVm4VsCbBM=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":46.91,"multihop_port":22501},{"hostname":"nl8.wg.ivpn.net","host":"95.211.198.167","public_key":"/nY1/OhVhdHtbnU/s31zYUuPBH0pizv4DemW5KDOUkg=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":12.83,"multihop_port":22801}]},{"gateway":"se.wg.ivpn.net","country_code":"SE","country":"Sweden","city":"Stockholm","latitude":59.3508,"longitude":18.0973,"isp":"M247","hosts":[{"hostname":"se1.wg.ivpn.net","host":"37.120.153.226","public_key":"2n0nFE1g/+vQr2AOQPm9Igyiy0zh9uTTultvOOSkMRo=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":15.22,"multihop_port":24010},{"hostname":"se01.wg.ivpn.net","host":"80.67.10.141","public_key":"u8VHnYEpoEjJWDAF9NAUkU6s810RnkMuhEfFD9U0cGo=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":5.66,"multihop_port":24001}]},{"gateway":"sg.wg.ivpn.net","country_code":"SG","country":"Singapore","city":"Singapore","latitude":1.293,"longitude":103.8558,"isp":"M247","hosts":[{"hostname":"sg1.wg.ivpn.net","host":"37.120.151.122","public_key":"hSg0At4uwuIhmTy5UT4fRbi5AN6JO2ZWTuIvqd4nHCE=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.76,"multihop_port":26110},{"hostname":"sg01.wg.ivpn.net","host":"185.128.24.189","public_key":"pWk0u1Xq8FHC+xpkN+C6yEKOTEanorR5zMCSfHlLzFw=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":23.44,"multihop_port":26101}]},{"gateway":"us-ca.wg.ivpn.net","country_code":"US","country":"United States","city":"Los Angeles, CA","latitude":34.1139,"longitude":-118.4068,"isp":"Datapacket","hosts":[{"hostname":"us-ca1.wg.ivpn.net","host":"185.180.13.41","public_key":"FGl78s9Ct6xNamQ2/CtAyXwGePrrU0kiZxfM27pm8XA=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":15.76,"multihop_port":22210},{"hostname":"us-ca01.wg.ivpn.net","host":"216.144.236.44","public_key":"B+qXdkIuETpzI0bfhGUAHN4SU91Tjs6ItdFlu93S42I=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":9.34,"multihop_port":22201},{"hostname":"us-ca2.wg.ivpn.net","host":"216.144.236.68","public_key":"qv4Tupfon5NUSwzDpM8zPizSwJZn2h+9CqrufcyDOko=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.26,"multihop_port":22401},{"hostname":"us-ca3.wg.ivpn.net","host":"198.54.129.100","public_key":"J5+Bx84LxNPdWEhewOvBV/fGWiDluIBlAcr1QlJZil8=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":12.79,"multihop_port":21301},{"hostname":"us-ca4.wg.ivpn.net","host":"216.144.237.83","public_key":"dYPXYr6HSRJPe3MhALwGWNtdEy1+EPE9Kqv7cTrUXk8=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":8.2,"multihop_port":21901}]},{"gateway":"us-ga.wg.ivpn.net","country_code":"US","country":"United States","city":"Atlanta, GA","latitude":33.7627,"longitude":-84.4225,"isp":"Datapacket","hosts":[{"hostname":"us-ga1.wg.ivpn.net","host":"185.93.0.212","public_key":"jD8h+pL5/d6fmYcTzl0lR8AWzQVN5XkwRFSmM/3NcDM=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":10.79,"multihop_port":24510},{"hostname":"us-ga01.wg.ivpn.net","host":"104.129.24.149","public_key":"EJFl28aYpZKfmJqb1jxxTEnGx6kaH2USVrigpHKKXhs=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":5.4,"multihop_port":24501},{"hostname":"us-ga2.wg.ivpn.net","host":"107.150.22.77","public_key":"hr2uQOEGCvGeDkoCQJ2dCI8dM8Iu5aKhb1PIvJ9q72E=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":9,"multihop_port":24810}]},{"gateway":"us-il.wg.ivpn.net","country_code":"US","country":"United States","city":"Chicago, IL","latitude":41.8373,"longitude":-87.6862,"isp":"Datapacket","hosts":[{"hostname":"us-il1.wg.ivpn.net","host":"89.187.181.116","public_key":"hku9gjamhoii8OvxZgx+TdUDIkOAQYFu39qbav2AyUQ=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":20.19,"multihop_port":21410},{"hostname":"us-il01.wg.ivpn.net","host":"72.11.137.158","public_key":"Uy5a8JOqneAUY1dC5s9jubLnotbyIfBsLP2nZuzRbHs=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":13.31,"multihop_port":21401},{"hostname":"us-il2.wg.ivpn.net","host":"72.11.137.148","public_key":"ANhVUMAQgStPVNRHW8mg0ZtN1YI1QHyXfNCO8+USNQQ=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":7.21,"multihop_port":24901}]},{"gateway":"us-ny.wg.ivpn.net","country_code":"US","country":"United States","city":"New York, NY","latitude":40.6943,"longitude":-73.9249,"isp":"M247","hosts":[{"hostname":"us-ny1.wg.ivpn.net","host":"91.132.137.170","public_key":"6/tjvgb7HFl7UuvBSegolxa1zKr3iSlDrlCexCmhAGE=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":36.4,"multihop_port":21210},{"hostname":"us-ny2.wg.ivpn.net","host":"212.103.48.195","public_key":"c7DwY2uT+6ulWAJ5u8qJNWHroA0qyJLcdNzf/f2kkhs=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":8.1,"multihop_port":21801},{"hostname":"us-ny3.wg.ivpn.net","host":"89.187.178.145","public_key":"m5/Ssw9SN3WuE+yD/fAsH5G8iuI8TcDGEiZZnPgiMCc=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":5.14,"multihop_port":27601}]},{"gateway":"us-tx.wg.ivpn.net","country_code":"US","country":"United States","city":"Dallas, TX","latitude":32.7936,"longitude":-96.7662,"isp":"Quadranet","hosts":[{"hostname":"us-tx1.wg.ivpn.net","host":"198.55.124.114","public_key":"JPT1veXLmasj2uQDstX24mpR7VWD+GmV8JDkidkz91Q=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":5.41,"multihop_port":21010},{"hostname":"us-tx01.wg.ivpn.net","host":"96.44.189.197","public_key":"LvWf548mFddi8PTrIGL6uD1/l85LU8z0Rc8tpvw2Vls=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":13.06,"multihop_port":21001},{"hostname":"us-tx2.wg.ivpn.net","host":"96.44.142.77","public_key":"om8hOGUcEvoOhHvJZoBHxNF4jxY/+Ml9Iy1WOSC/pFo=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":10.52,"multihop_port":25001}]},{"gateway":"at.wg.ivpn.net","country_code":"AT","country":"Austria","city":"Vienna","latitude":48.2,"longitude":16.3666,"isp":"M247","hosts":[{"hostname":"at1.wg.ivpn.net","host":"185.244.212.69","public_key":"83LUBnP97SFpnS0y1MpEAFcg8MIiQJgW1FRv/8Mc40g=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":28.58,"multihop_port":25601}]},{"gateway":"au-nsw.wg.ivpn.net","country_code":"AU","country":"Australia","city":"Sydney","latitude":-33.92,"longitude":151.1852,"isp":"M247","hosts":[{"hostname":"au-nsw1.wg.ivpn.net","host":"46.102.153.246","public_key":"KmSrG48t5xw9CJCPlYLBG3JnmiY0CnUgyRM5TUEwZhM=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":98.95,"multihop_port":26601},{"hostname":"au-nsw2.wg.ivpn.net","host":"146.70.78.75","public_key":"q+wbp7GjiTszp5G16rNpGCqxkL0qSY3CH4pcgD6UsVQ=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":71.28,"multihop_port":27901}]},{"gateway":"be.wg.ivpn.net","country_code":"BE","country":"Belgium","city":"Brussels","latitude":50.8333,"longitude":4.3333,"isp":"M247","hosts":[{"hostname":"be1.wg.ivpn.net","host":"194.187.251.13","public_key":"awriP5lpdxEMWKuG+A1DOg+vb1M5jd3WhynIMB61BhU=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":64.31,"multihop_port":25701}]},{"gateway":"bg.wg.ivpn.net","country_code":"BG","country":"Bulgaria","city":"Sofia","latitude":42.6833,"longitude":23.3167,"isp":"M247","hosts":[{"hostname":"bg1.wg.ivpn.net","host":"82.102.23.21","public_key":"WDSsdJE6wvATIWfzQwayPtE/0DaXBQgW/hPm7sQSJmU=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":78.13,"multihop_port":25901}]},{"gateway":"br.wg.ivpn.net","country_code":"BR","country":"Brazil","city":"Franca","latitude":-20.53,"longitude":-47.39,"isp":"Qnax","hosts":[{"hostname":"br1.wg.ivpn.net","host":"45.162.229.133","public_key":"eN1f15S3YzRyYCALiPGRQcjkQO9xntcdqPhJJ6TOymc=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":11.54,"multihop_port":26701}]},{"gateway":"ca.wg.ivpn.net","country_code":"CA","country":"Canada","city":"Toronto","latitude":43.7,"longitude":-79.42,"isp":"Amanah","hosts":[{"hostname":"ca01.wg.ivpn.net","host":"104.254.90.181","public_key":"mdGnCZwinuOVGg46zsWnFhhenfFId6jht9GBTKB+xUA=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":41.78,"multihop_port":23801},{"hostname":"ca2.wg.ivpn.net","host":"172.86.186.173","public_key":"5qHV10ZbFgEGnF6wg9QpKeh1l6Di2JUG/5PdNaaoNW8=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":55.09,"multihop_port":22101}]},{"gateway":"cz.wg.ivpn.net","country_code":"CZ","country":"Czech Republic","city":"Prague","latitude":50.0833,"longitude":14.466,"isp":"Datapacket","hosts":[{"hostname":"cz1.wg.ivpn.net","host":"185.180.14.41","public_key":"gVbEq2cGRzwCSGPqT2oRSYYN+P6IK3uvvRffErASDSk=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":13.04,"multihop_port":25201}]},{"gateway":"dk.wg.ivpn.net","country_code":"DK","country":"Denmark","city":"Copenhagen","latitude":55.6786,"longitude":12.5635,"isp":"M247","hosts":[{"hostname":"dk1.wg.ivpn.net","host":"185.245.84.229","public_key":"jTsV5gOD7lT4egDj9rhKwO2OO2X7bKs2EQPcZEnUWDE=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":61.97,"multihop_port":25501}]},{"gateway":"es.wg.ivpn.net","country_code":"ES","country":"Spain","city":"Madrid","latitude":40.4,"longitude":-3.6834,"isp":"Datapacket","hosts":[{"hostname":"es1.wg.ivpn.net","host":"84.17.62.98","public_key":"w7umiArTtlJ4Pk6Ii9WX5VXK5vw/Qu+Z37/icKlIYWo=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":9.51,"multihop_port":21501}]},{"gateway":"fi.wg.ivpn.net","country_code":"FI","country":"Finland","city":"Helsinki","latitude":60.1756,"longitude":24.9341,"isp":"Creanova","hosts":[{"hostname":"fi1.wg.ivpn.net","host":"194.34.134.63","public_key":"mIxEzfjZ2wV6jJVj30w38ECd2LSH4bw/HLMnM2ICHiI=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":99.96,"multihop_port":26001}]},{"gateway":"fr.wg.ivpn.net","country_code":"FR","country":"France","city":"Paris","latitude":48.8667,"longitude":2.3333,"isp":"Datapacket","hosts":[{"hostname":"fr1.wg.ivpn.net","host":"185.246.211.185","public_key":"g7BuMzj3r/noLiLR4qhQMcvU6GSIY8RGEnaYtdYsFX4=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":16.85,"multihop_port":23401}]},{"gateway":"gb-man.wg.ivpn.net","country_code":"GB","country":"United Kingdom","city":"Manchester","latitude":53.5004,"longitude":-2.248,"isp":"M247","hosts":[{"hostname":"gb-man1.wg.ivpn.net","host":"89.238.141.231","public_key":"+hf4DYilNEIjTdSOuCNcWdqVyaRoxGzXw7wvNl7f7Rg=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":11.95,"multihop_port":26901}]},{"gateway":"hk.wg.ivpn.net","country_code":"HK","country":"Hong Kong","city":"Hong Kong","latitude":22.305,"longitude":114.185,"isp":"Leaseweb","hosts":[{"hostname":"hk2.wg.ivpn.net","host":"64.120.120.239","public_key":"kyolyq4cJydI3vQB2ESTIUAy2Fq0bpOf+Qe7GIq6XEA=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":9.47,"multihop_port":27501},{"hostname":"hk3.wg.ivpn.net","host":"118.107.244.206","public_key":"qq1simsFNm2FpZM0J8u8Aa0rkk5HEasvLksPyLv+0Sk=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":9.07,"multihop_port":20800}]},{"gateway":"hu.wg.ivpn.net","country_code":"HU","country":"Hungary","city":"Budapest","latitude":47.5,"longitude":19.0833,"isp":"M247","hosts":[{"hostname":"hu1.wg.ivpn.net","host":"185.189.114.189","public_key":"G30fNdXrnlqtqqOLF23QXWzFdLIKDxLW60HoYPvqml8=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":100,"multihop_port":25401}]},{"gateway":"il.wg.ivpn.net","country_code":"IL","country":"Israel","city":"Holon, Tel Aviv","latitude":32.08,"longitude":34.77,"isp":"HQServ","hosts":[{"hostname":"il01.wg.ivpn.net","host":"185.191.207.197","public_key":"HR9gAjpxXU3YVt6kehBw5n8yVYVE0iIgJdc4HTqOzEE=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":49.46,"multihop_port":27301}]},{"gateway":"is.wg.ivpn.net","country_code":"IS","country":"Iceland","city":"Reykjavik","latitude":64.15,"longitude":-21.95,"isp":"Advania","hosts":[{"hostname":"is1.wg.ivpn.net","host":"82.221.107.185","public_key":"nZZT6TlQ2dXlVe3P3B5ozEScHYMWH4JY4y3to8w5dz0=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":88.98,"multihop_port":23501}]},{"gateway":"jp.wg.ivpn.net","country_code":"JP","country":"Japan","city":"Tokyo","latitude":35.685,"longitude":139.7514,"isp":"M247","hosts":[{"hostname":"jp1.wg.ivpn.net","host":"91.207.174.237","public_key":"tb9WdC3LSho3d1rI5N7kfG9e42/d+u4LPVdEYERPsSQ=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":30.88,"multihop_port":26201},{"hostname":"jp2.wg.ivpn.net","host":"185.135.77.81","public_key":"YuhEd9+a90/+uucZC+qzsyMHkfe/GiwG1dq7g2HegXQ=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":5.66,"multihop_port":20830}]},{"gateway":"lu.wg.ivpn.net","country_code":"LU","country":"Luxembourg","city":"Luxembourg","latitude":49.6117,"longitude":6.13,"isp":"Evoluso","hosts":[{"hostname":"lu1.wg.ivpn.net","host":"92.223.89.57","public_key":"hUS1OAFLGwpba8+oc5mifYtohZt/RTro5dMyYBLYHjI=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":13.08,"multihop_port":27201}]},{"gateway":"my.wg.ivpn.net","country_code":"MY","country":"Malaysia","city":"Kuala Lumpur","latitude":3.1494,"longitude":101.706,"isp":"TheGigabit","hosts":[{"hostname":"my1.wg.ivpn.net","host":"61.4.97.153","public_key":"M9SsMCpUw7ad6YbqQr8r2saBK2zAf3tBj82DzsQjgkY=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.48,"multihop_port":20810}]},{"gateway":"no.wg.ivpn.net","country_code":"NO","country":"Norway","city":"Oslo","latitude":59.9167,"longitude":10.75,"isp":"Servetheworld","hosts":[{"hostname":"no1.wg.ivpn.net","host":"91.189.177.156","public_key":"xFO6ksbO3Gr05rRgAW0O5Veoi4bpTgz2G9RvtBzK7Cg=","local_ip":"172.16.0.1/12","ipv6":{},"load":0,"multihop_port":25301}]},{"gateway":"pl.wg.ivpn.net","country_code":"PL","country":"Poland","city":"Warsaw","latitude":52.25,"longitude":21,"isp":"Datapacket","hosts":[{"hostname":"pl1.wg.ivpn.net","host":"185.246.208.109","public_key":"1JDmF79rWj5C+kHp71AbdHne/yGaizWCd2bLfSFvYjo=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":36.56,"multihop_port":25101}]},{"gateway":"pt.wg.ivpn.net","country_code":"PT","country":"Portugal","city":"Lisbon","latitude":38.7227,"longitude":-9.1449,"isp":"Hostwebis","hosts":[{"hostname":"pt1.wg.ivpn.net","host":"94.46.175.113","public_key":"nMnA82YVrvEK80GVoY/0Z9McWeqjcLzuMYSL+86j5nU=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":5.94,"multihop_port":27101}]},{"gateway":"ro.wg.ivpn.net","country_code":"RO","country":"Romania","city":"Bucharest","latitude":44.4334,"longitude":26.0999,"isp":"M247","hosts":[{"hostname":"ro1.wg.ivpn.net","host":"37.120.206.53","public_key":"F2uQ57hysZTlw8WYELnyCw9Lga80wNYoYwkrrxyXKmw=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":43.52,"multihop_port":22301}]},{"gateway":"rs.wg.ivpn.net","country_code":"RS","country":"Serbia","city":"Belgrade","latitude":44.8186,"longitude":20.468,"isp":"M247","hosts":[{"hostname":"rs1.wg.ivpn.net","host":"141.98.103.253","public_key":"xLN/lpQThQ3z3tvYf7VqdAsRL/nton1Vhv2kCZlQtWE=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":65.32,"multihop_port":26801}]},{"gateway":"sk.wg.ivpn.net","country_code":"SK","country":"Slovakia","city":"Bratislava","latitude":48.15,"longitude":17.117,"isp":"M247","hosts":[{"hostname":"sk1.wg.ivpn.net","host":"185.245.85.253","public_key":"MOBWWpEgNsKbFj4BEyWSDFLlkBs5iUFiqdSdTFTDBko=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":100,"multihop_port":25801}]},{"gateway":"tw.wg.ivpn.net","country_code":"TW","country":"Taiwan","city":"Taipei","latitude":25.073,"longitude":121.578,"isp":"TheGigabit","hosts":[{"hostname":"tw1.wg.ivpn.net","host":"185.189.160.59","public_key":"fMTCCbbKqPp60fkqnaQvJ9mX2r6zBlt7xhUp8sGfJQY=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":8.89,"multihop_port":20820}]},{"gateway":"ua.wg.ivpn.net","country_code":"UA","country":"Ukraine","city":"Kharkiv","latitude":50,"longitude":36.25,"isp":"Xservers","hosts":[{"hostname":"ua1.wg.ivpn.net","host":"176.103.57.129","public_key":"mIxEzfjZ2wV6jJVj30w38ECd2LSH4bw/HLMnM2ICHiI=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.43,"multihop_port":26301}]},{"gateway":"us-az.wg.ivpn.net","country_code":"US","country":"United States","city":"Phoenix, AZ","latitude":33.5722,"longitude":-112.0891,"isp":"M247","hosts":[{"hostname":"us-az1.wg.ivpn.net","host":"193.37.254.133","public_key":"Ts4MGazxpxL9rrYbERjgxa+kCEX85ou9gHoaJvDsRiI=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":11.52,"multihop_port":26401}]},{"gateway":"us-fl.wg.ivpn.net","country_code":"US","country":"United States","city":"Miami, FL","latitude":25.7839,"longitude":-80.2102,"isp":"Quadranet","hosts":[{"hostname":"us-fl1.wg.ivpn.net","host":"173.44.49.93","public_key":"Rkzo9WgxJBiKyEbkZvqGWtOVh9Gk9Vd7wL49SHXdHig=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":8.5,"multihop_port":24601}]},{"gateway":"us-nj.wg.ivpn.net","country_code":"US","country":"United States","city":"New Jersey, NJ","latitude":40.737764,"longitude":-74.151747,"isp":"Quadranet","hosts":[{"hostname":"us-nj3.wg.ivpn.net","host":"23.226.128.21","public_key":"AX7C1LO0ECUcHRYgX4/tIDYdR8npvfB/+pf4AfI3OHU=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":17.66,"multihop_port":21610},{"hostname":"us-nj4.wg.ivpn.net","host":"194.36.111.54","public_key":"1Te4AfL1yKo2k4jzPALnRPfKE3YSzXKo4XIRHPz5FxI=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":14.38,"multihop_port":27401}]},{"gateway":"us-nv.wg.ivpn.net","country_code":"US","country":"United States","city":"Las Vegas, NV","latitude":36.2333,"longitude":-115.2654,"isp":"M247","hosts":[{"hostname":"us-nv1.wg.ivpn.net","host":"185.242.5.37","public_key":"PRpvAZyoNWNm/KHlqafjtYoZtn1PkIPylUE4WbuYmgM=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":8.82,"multihop_port":26501}]},{"gateway":"us-ut.wg.ivpn.net","country_code":"US","country":"United States","city":"Salt Lake City, UT","latitude":40.7774,"longitude":-111.93,"isp":"100TB","hosts":[{"hostname":"us-ut1.wg.ivpn.net","host":"206.190.145.92","public_key":"KirI7bpxD186CuYiOqNHF+QUe6YmRYf6CN3pXWOJT2k=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":15.91,"multihop_port":24401}]},{"gateway":"us-va.wg.ivpn.net","country_code":"US","country":"United States","city":"Ashburn, VA","latitude":39.0437,"longitude":-77.4875,"isp":"Datapacket","hosts":[{"hostname":"us-va1.wg.ivpn.net","host":"37.19.206.106","public_key":"ZCnZK6U+cRuP/WgzIDb/P6UG2rX/KyCRd5vJ1hAbr2E=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":22.97,"multihop_port":27701}]},{"gateway":"us-wa.wg.ivpn.net","country_code":"US","country":"United States","city":"Seattle, WA","latitude":47.6211,"longitude":-122.3244,"isp":"Tzulo","hosts":[{"hostname":"us-wa2.wg.ivpn.net","host":"198.44.131.4","public_key":"VcrOOozBUCIURU0AnqMAE7AkMmC7Qrp+j/PzPbgbalU=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":14.58,"multihop_port":27801}]},{"gateway":"za.wg.ivpn.net","country_code":"ZA","country":"South Africa","city":"Johannesburg","latitude":-26.195,"longitude":28.034,"isp":"Datapacket","hosts":[{"hostname":"za1.wg.ivpn.net","host":"169.150.238.108","public_key":"tgrAA+uJZppS9esgOi0pe3rHajQQ7c/KF8WPOua6qy4=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":8.1,"multihop_port":20840}]}],"openvpn":[{"gateway":"at.gw.ivpn.net","country_code":"AT","country":"Austria","city":"Vienna","latitude":48.2,"longitude":16.3666,"isp":"M247","hosts":[{"hostname":"at1.gw.ivpn.net","host":"185.244.212.66","load":28.58,"multihop_port":25601,"obfs":{"obfs3_multihop_port":25602,"obfs4_multihop_port":25603,"obfs4_key":"75HhQC6n6ctp9Fa9wCvEnc6ip5FnEfuIGc+dVNLH4M15FjB/Ve6bI1b8lYFhk6T+4/HkDQ"}}]},{"gateway":"au-nsw.gw.ivpn.net","country_code":"AU","country":"Australia","city":"Sydney","latitude":-33.92,"longitude":151.1852,"isp":"M247","hosts":[{"hostname":"au-nsw1.gw.ivpn.net","host":"46.102.153.242","load":98.95,"multihop_port":26601,"obfs":{"obfs3_multihop_port":26602,"obfs4_multihop_port":26603,"obfs4_key":"/rjoeDjduOFq1UvT332vhS398h1RP5hC3m7sDJKNSyJ6TO8mkcxWAYILw0i+bgS/3JD5YA"}},{"hostname":"au-nsw2.gw.ivpn.net","host":"146.70.78.74","load":71.28,"multihop_port":27901,"obfs":{"obfs3_multihop_port":27902,"obfs4_multihop_port":27903,"obfs4_key":"qtdQ5krD9EQFR98xNo/v5cmGb10wqt0Om9pYMIHWQh4oz5xcAXj32rViEyN0bnkkhaZnBA"}}]},{"gateway":"be.gw.ivpn.net","country_code":"BE","country":"Belgium","city":"Brussels","latitude":50.8333,"longitude":4.3333,"isp":"M247","hosts":[{"hostname":"be1.gw.ivpn.net","host":"194.187.251.10","load":64.31,"multihop_port":25701,"obfs":{"obfs3_multihop_port":25702,"obfs4_multihop_port":25703,"obfs4_key":"cN8i60FUVy2mmGpy+tkQAz8hu/N0EGPq8cZwIotEDwdhAYdLV+ATes/AEjzdub2K68TlYg"}}]},{"gateway":"bg.gw.ivpn.net","country_code":"BG","country":"Bulgaria","city":"Sofia","latitude":42.6833,"longitude":23.3167,"isp":"M247","hosts":[{"hostname":"bg1.gw.ivpn.net","host":"82.102.23.18","load":78.13,"multihop_port":25901,"obfs":{"obfs3_multihop_port":25902,"obfs4_multihop_port":25903,"obfs4_key":"K+mCw9+zy/8pBQt6IUKRlg2eJ3DCnJ1BvIccLq/6A2D6HoZddyDnZQYb2Sb2e464dVgBWw"}}]},{"gateway":"br.gw.ivpn.net","country_code":"BR","country":"Brazil","city":"Franca","latitude":-20.53,"longitude":-47.39,"isp":"Qnax","hosts":[{"hostname":"br1.gw.ivpn.net","host":"45.162.229.130","load":11.54,"multihop_port":26701,"obfs":{"obfs3_multihop_port":26702,"obfs4_multihop_port":26703,"obfs4_key":"h4bBkocahWveuv/nWPRMYXBTw95ExTiXwmoydkNlV6hgfy8/ZjaKc34rqTuOyOH+CK7OZw"}}]},{"gateway":"ca-qc.gw.ivpn.net","country_code":"CA","country":"Canada","city":"Montreal","latitude":45.5,"longitude":-73.5833,"isp":"M247","hosts":[{"hostname":"ca-qc1.gw.ivpn.net","host":"87.101.92.26","load":19.88,"multihop_port":27001,"obfs":{"obfs3_multihop_port":27002,"obfs4_multihop_port":27003,"obfs4_key":"E97qdaar8flBavysmvdIui7WQEFKkbmNi/ITTo8bPLvv39vnaBRzFj4vjMwpzXV2jXEGRQ"}}]},{"gateway":"ca.gw.ivpn.net","country_code":"CA","country":"Canada","city":"Toronto","latitude":43.7,"longitude":-79.42,"isp":"Amanah","hosts":[{"hostname":"ca1.gw.ivpn.net","host":"104.254.90.178","load":41.78,"multihop_port":23801,"obfs":{"obfs3_multihop_port":23802,"obfs4_multihop_port":23803,"obfs4_key":"49WDCCK1QGpOTSEVflRzIIaOdCT1BLB3jr/yNUJsbaUFrq7NuoB1E3wAdArNxQq9p5otTw"}},{"hostname":"ca2.gw.ivpn.net","host":"172.86.186.170","load":55.09,"multihop_port":22101,"obfs":{"obfs3_multihop_port":22102,"obfs4_multihop_port":22103,"obfs4_key":"xNkQbCkA0VCe2i4WvS2CPq2eBSMydIjsHH36E+Yg0C+gOPo3SwZyN51kpB+kwsYVS32fOQ"}}]},{"gateway":"ch.gw.ivpn.net","country_code":"CH","country":"Switzerland","city":"Zurich","latitude":47.38,"longitude":8.55,"isp":"M247","hosts":[{"hostname":"ch1.gw.ivpn.net","host":"185.212.170.138","load":17.56,"multihop_port":23601,"obfs":{"obfs3_multihop_port":23602,"obfs4_multihop_port":23603,"obfs4_key":"ELnV4JNKu0vUNd3J+QDn64yfZtqM0hNN6O5n6RkDLHbeSDBZmxP1N4dlwwChV/uySX+DEQ"}},{"hostname":"ch3.gw.ivpn.net","host":"141.255.166.194","load":26.89,"multihop_port":22901,"obfs":{"obfs3_multihop_port":22902,"obfs4_multihop_port":22903,"obfs4_key":"oNaH5sHCPGGk5m3/VMOrTDL+m1qsJrze+bqDs78vhOYBpjx5Jjq5TXu1dXNfDJCKNmKnUA"}}]},{"gateway":"cz.gw.ivpn.net","country_code":"CZ","country":"Czech Republic","city":"Prague","latitude":50.0833,"longitude":14.466,"isp":"Datapacket","hosts":[{"hostname":"cz1.gw.ivpn.net","host":"195.181.160.167","load":13.04,"multihop_port":25201,"obfs":{"obfs3_multihop_port":25202,"obfs4_multihop_port":25203,"obfs4_key":"JZ3PtIyflM3VwVow2vqi08OxddOWSx9j6B6yZSGoZLs9QE0hzSAj3ZBWEsCKFeQ2RcAoCQ"}}]},{"gateway":"de.gw.ivpn.net","country_code":"DE","country":"Germany","city":"Frankfurt","latitude":50.1,"longitude":8.675,"isp":"Leaseweb","hosts":[{"hostname":"de1.gw.ivpn.net","host":"178.162.222.40","load":31.78,"multihop_port":23001,"obfs":{"obfs3_multihop_port":23002,"obfs4_multihop_port":23003,"obfs4_key":"PBhcWVcRNOCTMSWXbA2J+8eJBVzNd9H5HOr0YCF8QWwmKeSlEmqLSJQE8oDpKH5IbFH4Mw"}},{"hostname":"de2.gw.ivpn.net","host":"178.162.211.114","load":22.81,"multihop_port":22001,"obfs":{"obfs3_multihop_port":22002,"obfs4_multihop_port":22003,"obfs4_key":"dEhLA4ZsvVP8+PRvlSHKwmW8JyzR1Bwy7+BFKF7Ux4L2B5YvdqqOrv/8eHliEj2mm2Z8Iw"}}]},{"gateway":"dk.gw.ivpn.net","country_code":"DK","country":"Denmark","city":"Copenhagen","latitude":55.6786,"longitude":12.5635,"isp":"M247","hosts":[{"hostname":"dk1.gw.ivpn.net","host":"185.245.84.226","load":61.97,"multihop_port":25501,"obfs":{"obfs3_multihop_port":25502,"obfs4_multihop_port":25503,"obfs4_key":"ngjtv9UISX4tB5AkBnrEN2TrAnUqVwNZ688VqDlS4BDxQXJeJF3ynZtngRqeowhEahsccQ"}}]},{"gateway":"es.gw.ivpn.net","country_code":"ES","country":"Spain","city":"Madrid","latitude":40.4,"longitude":-3.6834,"isp":"Datapacket","hosts":[{"hostname":"es1.gw.ivpn.net","host":"185.93.3.193","load":9.51,"multihop_port":21501,"obfs":{"obfs3_multihop_port":21502,"obfs4_multihop_port":21503,"obfs4_key":"x4A9SBY5yzPKH1QOkEsGYcIR2JA/Pu393jv/ZSg4YO2DsVhr3TQFxcMO3QhD9iSF48smJA"}}]},{"gateway":"fi.gw.ivpn.net","country_code":"FI","country":"Finland","city":"Helsinki","latitude":60.1756,"longitude":24.9341,"isp":"Creanova","hosts":[{"hostname":"fi1.gw.ivpn.net","host":"185.112.82.12","load":99.96,"multihop_port":26001,"obfs":{"obfs3_multihop_port":26002,"obfs4_multihop_port":26003,"obfs4_key":"SvvSpGiFctjs4n2wZGnZUf9fAL8wag70SrA3FX+9f3Sq+KgBn+/8P6fE3239ezemg9svLA"}}]},{"gateway":"fr.gw.ivpn.net","country_code":"FR","country":"France","city":"Paris","latitude":48.8667,"longitude":2.3333,"isp":"Datapacket","hosts":[{"hostname":"fr1.gw.ivpn.net","host":"185.246.211.179","load":16.85,"multihop_port":23401,"obfs":{"obfs3_multihop_port":23402,"obfs4_multihop_port":23403,"obfs4_key":"CMf0pNZ46nFdG0Tpa3hE0cK9wtUAReJL7HN66G9Jq3tlrTSWrU0DLf7sCQgXV+WFoc8iaw"}}]},{"gateway":"gb-man.gw.ivpn.net","country_code":"GB","country":"United Kingdom","city":"Manchester","latitude":53.5004,"longitude":-2.248,"isp":"M247","hosts":[{"hostname":"gb-man1.gw.ivpn.net","host":"89.238.141.228","load":11.95,"multihop_port":26901,"obfs":{"obfs3_multihop_port":26902,"obfs4_multihop_port":26903,"obfs4_key":"WuP3pMrsQA+uAC72sV+Y62E1uvOWcnbTNJCmRHXqtWbbYzECF5swu62dzD/JOKoa5t0tGQ"}}]},{"gateway":"gb.gw.ivpn.net","country_code":"GB","country":"United Kingdom","city":"London","latitude":51.5,"longitude":-0.1167,"isp":"Datapacket","hosts":[{"hostname":"gb1.gw.ivpn.net","host":"185.59.221.133","load":27.36,"multihop_port":20801,"obfs":{"obfs3_multihop_port":20802,"obfs4_multihop_port":20803,"obfs4_key":"5whTESvZxQE28wKqJWZ9fQFy09d8//GNaPDeYHVR+FJZTyI+DMS6qX4Mt2FKSf/zBToaDg"}},{"hostname":"gb2.gw.ivpn.net","host":"185.59.221.88","load":8.94,"multihop_port":24201,"obfs":{"obfs3_multihop_port":24202,"obfs4_multihop_port":24203,"obfs4_key":"4hrCOgPsRfmnQ6cLvV5mtM2XZCRS/DXG/izYSg2qZC+WJ0GsnhTlKByPM2iJ555MaM8vJA"}}]},{"gateway":"hk.gw.ivpn.net","country_code":"HK","country":"Hong Kong","city":"Hong Kong","latitude":22.305,"longitude":114.185,"isp":"Leaseweb","hosts":[{"hostname":"hk2.gw.ivpn.net","host":"209.58.188.13","load":9.47,"multihop_port":27501,"obfs":{"obfs3_multihop_port":27502,"obfs4_multihop_port":27503,"obfs4_key":"GIunWjiq00Piv3Xf4VeMkmUQ8NzD8sxRkSIbA3bxrU4LhPVth+3qM2zQwI4GesQDCDY5RA"}},{"hostname":"hk3.gw.ivpn.net","host":"118.107.244.184","load":9.07,"multihop_port":20800,"obfs":{"obfs3_multihop_port":20801,"obfs4_multihop_port":20802,"obfs4_key":"wnI0gz3hLM9VhkABSncBIsGERgn16UzTxkj7dEeYYo/y2Wu0/w24rfriA5KL7ugpTyvEFg"}}]},{"gateway":"hu.gw.ivpn.net","country_code":"HU","country":"Hungary","city":"Budapest","latitude":47.5,"longitude":19.0833,"isp":"M247","hosts":[{"hostname":"hu1.gw.ivpn.net","host":"185.189.114.186","load":100,"multihop_port":25401,"obfs":{"obfs3_multihop_port":25402,"obfs4_multihop_port":25403,"obfs4_key":"2TwZqxAakni0S4S3ulOIqMZimqqug0KCr6pNREN6KytrtIh486nkJyiFRqaYZlx+FlxEcg"}}]},{"gateway":"il.gw.ivpn.net","country_code":"IL","country":"Israel","city":"Holon, Tel Aviv","latitude":32.08,"longitude":34.77,"isp":"HQServ","hosts":[{"hostname":"il1.gw.ivpn.net","host":"185.191.207.194","load":49.46,"multihop_port":27301,"obfs":{"obfs3_multihop_port":27302,"obfs4_multihop_port":27303,"obfs4_key":"DysuSM7UWjquj4BAVYf6mOUnRKfY1QXs17MXiV5aYapFfOkQPpx5nQPVQ2M+rLDxN9TSRg"}}]},{"gateway":"is.gw.ivpn.net","country_code":"IS","country":"Iceland","city":"Reykjavik","latitude":64.15,"longitude":-21.95,"isp":"Advania","hosts":[{"hostname":"is1.gw.ivpn.net","host":"82.221.107.178","load":88.98,"multihop_port":23501,"obfs":{"obfs3_multihop_port":23502,"obfs4_multihop_port":23503,"obfs4_key":"xx/Lor3q60/pVh4PKWi0GZaw64pPXFTkALnGlvRaBMiPRkFilr7KhYmPInDnZxzr4c4AIw"}}]},{"gateway":"it.gw.ivpn.net","country_code":"IT","country":"Italy","city":"Milan","latitude":45.47,"longitude":9.205,"isp":"SEFlow","hosts":[{"hostname":"it1.gw.ivpn.net","host":"158.58.172.73","load":7.57,"multihop_port":24301,"obfs":{"obfs3_multihop_port":24302,"obfs4_multihop_port":24303,"obfs4_key":"yJXSlTJloo6tlAxf0MI9Bu4schtcL2NlVqMPgbrhnrT/1pTZUaOUH7F7nLbVe4JSCSyeZg"}}]},{"gateway":"jp.gw.ivpn.net","country_code":"JP","country":"Japan","city":"Tokyo","latitude":35.685,"longitude":139.7514,"isp":"M247","hosts":[{"hostname":"jp1.gw.ivpn.net","host":"91.207.174.234","load":30.88,"multihop_port":26201,"obfs":{"obfs3_multihop_port":26202,"obfs4_multihop_port":26203,"obfs4_key":"CBqi0EpfoUzP/ijwYn9A9yEpItrhtX+BAKF0rvcUGv///UNzzXKNz+0RhBLdQayZx6y6TA"}},{"hostname":"jp2.gw.ivpn.net","host":"185.135.77.35","load":5.66,"multihop_port":20830,"obfs":{"obfs3_multihop_port":20831,"obfs4_multihop_port":20832,"obfs4_key":"giZJF4edg7wcjxbdgD2RjFcF9QAzExLHIJYjm2cLLtx7MrxP0p96mIFj9T8LSQotKB63fA"}}]},{"gateway":"lu.gw.ivpn.net","country_code":"LU","country":"Luxembourg","city":"Luxembourg","latitude":49.6117,"longitude":6.13,"isp":"Evoluso","hosts":[{"hostname":"lu1.gw.ivpn.net","host":"92.223.89.53","load":13.08,"multihop_port":27201,"obfs":{"obfs3_multihop_port":27202,"obfs4_multihop_port":27203,"obfs4_key":"auDmK8lVBI7fxq6UjXg7V0qoZJ3icACKm/9vruMGSr0lT6ViNsl28qMqYbjJRveHnx5eQw"}}]},{"gateway":"my.gw.ivpn.net","country_code":"MY","country":"Malaysia","city":"Kuala Lumpur","latitude":3.1494,"longitude":101.706,"isp":"TheGigabit","hosts":[{"hostname":"my1.gw.ivpn.net","host":"61.4.97.148","load":6.48,"multihop_port":20810,"obfs":{"obfs3_multihop_port":20811,"obfs4_multihop_port":20812,"obfs4_key":"k2hwCe8gDb24K5n2jNXYO5YCl5XCIEhuRwpYSsEhKWorah8OUM1C1crawbfstj+W2IQdOA"}}]},{"gateway":"nl.gw.ivpn.net","country_code":"NL","country":"Netherlands","city":"Amsterdam","latitude":52.35,"longitude":4.9166,"isp":"Leaseweb","hosts":[{"hostname":"nl3.gw.ivpn.net","host":"95.211.172.68","load":5.45,"multihop_port":23101,"obfs":{"obfs3_multihop_port":23102,"obfs4_multihop_port":23103,"obfs4_key":"eUXsScIg0K0LKVgA8yq2Mc++pfnTQ9nr3gnV8n1NIw7wRqinhO6uuXiSS5J19agQaPK1ew"}},{"hostname":"nl4.gw.ivpn.net","host":"95.211.172.95","load":6.73,"multihop_port":23201,"obfs":{"obfs3_multihop_port":23202,"obfs4_multihop_port":23203,"obfs4_key":"KEw6WJF+NDOQv7yMvq+dAAAkPbcYJ8PX6pffRd8EM3uaOy2QcpMcdHI7s700Kq/ZvV3HBQ"}},{"hostname":"nl5.gw.ivpn.net","host":"95.211.187.222","load":35.96,"multihop_port":23901,"obfs":{"obfs3_multihop_port":23902,"obfs4_multihop_port":23903,"obfs4_key":"fcWCrzzatLbk1LNKsuQZKpQrC3ZXwQ85GO5xRS467KJBRDrmvnyMb6ARbLGu+gYkTnNELQ"}},{"hostname":"nl6.gw.ivpn.net","host":"95.211.187.228","load":24.22,"multihop_port":24101,"obfs":{"obfs3_multihop_port":24102,"obfs4_multihop_port":24103,"obfs4_key":"lT3OGPQS1CwwqtalMExN7qxEoDDBLLlcoh5a6YW3DPj8esEBEG6wY5OfYonxltBzoVu4PA"}},{"hostname":"nl7.gw.ivpn.net","host":"95.211.95.22","load":46.91,"multihop_port":22501,"obfs":{"obfs3_multihop_port":22502,"obfs4_multihop_port":22503,"obfs4_key":"ffMnq7Gc/D7KWoLckJ4t8nf3zZqVdlffe2lVfUCceOyOTdRApkeJGgEai0TI1z76Yey9Lw"}},{"hostname":"nl8.gw.ivpn.net","host":"95.211.172.18","load":12.83,"multihop_port":22801,"obfs":{"obfs3_multihop_port":22802,"obfs4_multihop_port":22803,"obfs4_key":"h+u/6VkPDJXySoJ6QEM1hOjWPD58OS4AZPP9ofP/yCWGBQpPoMc78l7C74eFvqKKkFAXDw"}}]},{"gateway":"no.gw.ivpn.net","country_code":"NO","country":"Norway","city":"Oslo","latitude":59.9167,"longitude":10.75,"isp":"Servetheworld","hosts":[{"hostname":"no1.gw.ivpn.net","host":"194.242.10.150","load":15.17,"multihop_port":25301,"obfs":{"obfs3_multihop_port":25302,"obfs4_multihop_port":25303,"obfs4_key":"uhLy//KRu6DrYfgDJmwjC6Fxk5h+MRDNOwFe7qzGTjfOiHLWRSoRx6OdNvzjPPXq0ZJnZg"}}]},{"gateway":"pl.gw.ivpn.net","country_code":"PL","country":"Poland","city":"Warsaw","latitude":52.25,"longitude":21,"isp":"Datapacket","hosts":[{"hostname":"pl1.gw.ivpn.net","host":"185.246.208.86","load":36.56,"multihop_port":25101,"obfs":{"obfs3_multihop_port":25102,"obfs4_multihop_port":25103,"obfs4_key":"S9XZyigxYjF5jWcwYpMmV9HJq4Vni1yQvLKI03n0TJ7csrgsX7lPpFfECAGQruHh1wkMXg"}}]},{"gateway":"pt.gw.ivpn.net","country_code":"PT","country":"Portugal","city":"Lisbon","latitude":38.7227,"longitude":-9.1449,"isp":"Hostwebis","hosts":[{"hostname":"pt1.gw.ivpn.net","host":"94.46.175.112","load":5.94,"multihop_port":27101,"obfs":{"obfs3_multihop_port":27102,"obfs4_multihop_port":27103,"obfs4_key":"NqXqKMt8UF25hYDIwfh2K4Rr4a7F41HzZDGjX7SYwRaoOtrTL665yV6Z3h9wF+/R1YE8KQ"}}]},{"gateway":"ro.gw.ivpn.net","country_code":"RO","country":"Romania","city":"Bucharest","latitude":44.4334,"longitude":26.0999,"isp":"M247","hosts":[{"hostname":"ro1.gw.ivpn.net","host":"37.120.206.50","load":43.52,"multihop_port":22301,"obfs":{"obfs3_multihop_port":22302,"obfs4_multihop_port":22303,"obfs4_key":"lqfg/sP9uLakoQiA6YI5/kHQ4/FvQTp6jRgxSswjHwC8POOM23FijEWKyykngn1Eb3xfLA"}}]},{"gateway":"rs.gw.ivpn.net","country_code":"RS","country":"Serbia","city":"Belgrade","latitude":44.8186,"longitude":20.468,"isp":"M247","hosts":[{"hostname":"rs1.gw.ivpn.net","host":"141.98.103.250","load":65.32,"multihop_port":26801,"obfs":{"obfs3_multihop_port":26802,"obfs4_multihop_port":26803,"obfs4_key":"0MqgxLrLFQTlQWGAjY9es+Nv45d37/5lulWw0iEFoiUvtzOcbut8hK9AhCis17EXi+lUXw"}}]},{"gateway":"se.gw.ivpn.net","country_code":"SE","country":"Sweden","city":"Stockholm","latitude":59.3508,"longitude":18.0973,"isp":"GleSyS","hosts":[{"hostname":"se1.gw.ivpn.net","host":"80.67.10.138","load":5.66,"multihop_port":24001,"obfs":{"obfs3_multihop_port":24002,"obfs4_multihop_port":24003,"obfs4_key":"/yhTV2SsTXlwsG2mCS90ZAYIZivsSyloaFw6VDj0pnpJOuUxXcZBOgdyQ/lfWxJtvHZmPg"}}]},{"gateway":"sg.gw.ivpn.net","country_code":"SG","country":"Singapore","city":"Singapore","latitude":1.293,"longitude":103.8558,"isp":"M247","hosts":[{"hostname":"sg1.gw.ivpn.net","host":"185.128.24.186","load":23.44,"multihop_port":26101,"obfs":{"obfs3_multihop_port":26102,"obfs4_multihop_port":26103,"obfs4_key":"0N1ZmZlnyhS/3Y1OhvB0Bk3BGU2LFy0zyuWPYwM/P+mfX57w8zI7/YcBfIXZVgDiStt4MQ"}}]},{"gateway":"sk.gw.ivpn.net","country_code":"SK","country":"Slovakia","city":"Bratislava","latitude":48.15,"longitude":17.117,"isp":"M247","hosts":[{"hostname":"sk1.gw.ivpn.net","host":"185.245.85.250","load":100,"multihop_port":25801,"obfs":{"obfs3_multihop_port":25802,"obfs4_multihop_port":25803,"obfs4_key":"8sl7oPfNHdCd2xYi98xWC6mBXyPvzio34UbfUbCPEU+8wo7DVbrR9mf8goR0Ievqzax4Hw"}}]},{"gateway":"tw.gw.ivpn.net","country_code":"TW","country":"Taiwan","city":"Taipei","latitude":25.073,"longitude":121.578,"isp":"TheGigabit","hosts":[{"hostname":"tw1.gw.ivpn.net","host":"185.189.160.6","load":8.89,"multihop_port":20820,"obfs":{"obfs3_multihop_port":20821,"obfs4_multihop_port":20822,"obfs4_key":"/ilRlB3BkUzUG2yd+++6KeYEF9PEB+3T3XcQhVjfoF8wJH1kgjGXvikjS1j/1SknFpGPaA"}}]},{"gateway":"ua.gw.ivpn.net","country_code":"UA","country":"Ukraine","city":"Kharkiv","latitude":50,"longitude":36.25,"isp":"Xservers","hosts":[{"hostname":"ua1.gw.ivpn.net","host":"176.103.58.123","load":6.43,"multihop_port":26301,"obfs":{"obfs3_multihop_port":26302,"obfs4_multihop_port":26303,"obfs4_key":"RsW3q+FmLATkKnKHOheUntwvslkrXEiCBx3ajDjhyHiZMtQI+Uy7TmhFK0YaHg/qKoljYw"}}]},{"gateway":"us-az.gw.ivpn.net","country_code":"US","country":"United States","city":"Phoenix, AZ","latitude":33.5722,"longitude":-112.0891,"isp":"M247","hosts":[{"hostname":"us-az1.gw.ivpn.net","host":"193.37.254.130","load":11.52,"multihop_port":26401,"obfs":{"obfs3_multihop_port":26402,"obfs4_multihop_port":26403,"obfs4_key":"Y2klMvUi3NBIReXSALaKnNm8qI9IdWhFwgQrwl9ofUuVNuT6D93ohTTqbW//iKS5/lqndw"}}]},{"gateway":"us-ca.gw.ivpn.net","country_code":"US","country":"United States","city":"Los Angeles, CA","latitude":34.1139,"longitude":-118.4068,"isp":"Quadranet","hosts":[{"hostname":"us-ca1.gw.ivpn.net","host":"173.254.196.58","load":9.34,"multihop_port":22201,"obfs":{"obfs3_multihop_port":22202,"obfs4_multihop_port":22203,"obfs4_key":"C/Ct5AG8tkV0Yi7MnXv+bNvExY8Dgii4OeJ7DA7lIq3HptUa+WbG+IAR/UIDaMn8VeXDIg"}},{"hostname":"us-ca2.gw.ivpn.net","host":"69.12.80.146","load":6.26,"multihop_port":22401,"obfs":{"obfs3_multihop_port":22402,"obfs4_multihop_port":22403,"obfs4_key":"nvizO9jj1D3xMqCMTnP6XDIzTLy6KcYNsDSxvJjm5QwZ9Y+5gommAk9LIcCeX9o4FjlkVA"}},{"hostname":"us-ca3.gw.ivpn.net","host":"198.54.129.99","load":12.79,"multihop_port":21301,"obfs":{"obfs3_multihop_port":21302,"obfs4_multihop_port":21303,"obfs4_key":"rharPyhkUzYwmCP8ZzeaCwnJAmwOqwDTLOlJqzi/kAxMn4OVXtbzCk9Ww8XR31D2rmk3MA"}},{"hostname":"us-ca4.gw.ivpn.net","host":"173.254.204.202","load":8.2,"multihop_port":21901,"obfs":{"obfs3_multihop_port":21902,"obfs4_multihop_port":21903,"obfs4_key":"2Sdam2VI658TdQRvj5bxwKPFljrsKgwBDv/mqhXNYgDQGs+WVhAz508b2oWVgHed3Ki8dQ"}}]},{"gateway":"us-fl.gw.ivpn.net","country_code":"US","country":"United States","city":"Miami, FL","latitude":25.7839,"longitude":-80.2102,"isp":"Quadranet","hosts":[{"hostname":"us-fl1.gw.ivpn.net","host":"173.44.49.90","load":8.5,"multihop_port":24601,"obfs":{"obfs3_multihop_port":24602,"obfs4_multihop_port":24603,"obfs4_key":"vS7u4rijvWECRS/Mo2KOpl8kx0NOozp3kF/FMxGmCZILE46etitrheYI2hCpNsYUg3YTBQ"}}]},{"gateway":"us-ga.gw.ivpn.net","country_code":"US","country":"United States","city":"Atlanta, GA","latitude":33.7627,"longitude":-84.4225,"isp":"Quadranet","hosts":[{"hostname":"us-ga1.gw.ivpn.net","host":"104.129.24.146","load":5.4,"multihop_port":24501,"obfs":{"obfs3_multihop_port":24502,"obfs4_multihop_port":24503,"obfs4_key":"+No53UtdyPN4uT89vMlvRTjFnxtMKol+oOld9I9WMnlK7BU+y10oXWofzcI4eRgkm195FQ"}},{"hostname":"us-ga2.gw.ivpn.net","host":"107.150.22.74","load":9,"multihop_port":24810,"obfs":{"obfs3_multihop_port":24811,"obfs4_multihop_port":24812,"obfs4_key":"3viWXkxZx1KZF9uzd5tRxb5lNMMnRZ90PqwLUaZdkZuaouj+Vb20t5uk3BVz/YyZkrSoGw"}}]},{"gateway":"us-il.gw.ivpn.net","country_code":"US","country":"United States","city":"Chicago, IL","latitude":41.8373,"longitude":-87.6862,"isp":"Quadranet","hosts":[{"hostname":"us-il1.gw.ivpn.net","host":"107.150.28.82","load":13.31,"multihop_port":21401,"obfs":{"obfs3_multihop_port":21402,"obfs4_multihop_port":21403,"obfs4_key":"6PpxOt8CwINAjun8o/wsf/cAidNbJZM/Pg4im1Cx9kCBV/lau3XFq3bMwBW0SzptZ/5WdA"}},{"hostname":"us-il2.gw.ivpn.net","host":"72.11.137.146","load":7.21,"multihop_port":24901,"obfs":{"obfs3_multihop_port":24902,"obfs4_multihop_port":24903,"obfs4_key":"cfvJR/gplqAbFx8myJSW/cPC3hN1782PPma2v5YKJR5LyekWX+AHTJjzdz8xSr2mM6IGQw"}}]},{"gateway":"us-nj.gw.ivpn.net","country_code":"US","country":"United States","city":"New Jersey, NJ","latitude":40.737764,"longitude":-74.151747,"isp":"Quadranet","hosts":[{"hostname":"us-nj3.gw.ivpn.net","host":"23.226.128.18","load":17.66,"multihop_port":21610,"obfs":{"obfs3_multihop_port":21611,"obfs4_multihop_port":21612,"obfs4_key":"JtB/8Lv8MOq9+bpYC751voS2CwoEwf9ku2CziwJScn3Gc1F/BTul6ehnrGiedmpkQXAtJw"}},{"hostname":"us-nj4.gw.ivpn.net","host":"194.36.111.50","load":14.38,"multihop_port":27401,"obfs":{"obfs3_multihop_port":27402,"obfs4_multihop_port":27403,"obfs4_key":"lHDLT6cTgt0bh3ysogDdiXL4eWGRtJZ0cZGJmvpeK0YLUAsBfsOzKv46V0iv5ykwRPm6Mg"}}]},{"gateway":"us-nv.gw.ivpn.net","country_code":"US","country":"United States","city":"Las Vegas, NV","latitude":36.2333,"longitude":-115.2654,"isp":"M247","hosts":[{"hostname":"us-nv1.gw.ivpn.net","host":"185.242.5.34","load":8.82,"multihop_port":26501,"obfs":{"obfs3_multihop_port":26502,"obfs4_multihop_port":26503,"obfs4_key":"Kux7OTSrUOkklATpG67hJPz7xCWpW6eD9Qdw2GNKAmaaPA5zvPC3SXQRvyrYdyAAqMXMfg"}}]},{"gateway":"us-ny.gw.ivpn.net","country_code":"US","country":"United States","city":"New York, NY","latitude":40.6943,"longitude":-73.9249,"isp":"M247","hosts":[{"hostname":"us-ny2.gw.ivpn.net","host":"212.103.48.194","load":8.1,"multihop_port":21801,"obfs":{"obfs3_multihop_port":21802,"obfs4_multihop_port":21803,"obfs4_key":"GtK9yCXTtrLOrf0MTWdWqjzQ1vd1eKsVjiOuR5CiVaDf4dCSalyJ+kmik4nfU9Gj6UwcCg"}},{"hostname":"us-ny3.gw.ivpn.net","host":"89.187.178.144","load":5.14,"multihop_port":27601,"obfs":{"obfs3_multihop_port":27602,"obfs4_multihop_port":27603,"obfs4_key":"eL/9iKx6f5bHowNJBsT2E/Aag5w8Cvtb3DduySudJmuK2GtIOUwNzS33lFZwSUEnJIYwLg"}}]},{"gateway":"us-tx.gw.ivpn.net","country_code":"US","country":"United States","city":"Dallas, TX","latitude":32.7936,"longitude":-96.7662,"isp":"Quadranet","hosts":[{"hostname":"us-tx1.gw.ivpn.net","host":"96.44.189.194","load":13.06,"multihop_port":21001,"obfs":{"obfs3_multihop_port":21002,"obfs4_multihop_port":21003,"obfs4_key":"GBDWrGN71fGa7a7S8b2tHzjYQMhnA2vJW5yq3iID+VoSzA1xIAgHiOxISEU93v+CBTCXWg"}},{"hostname":"us-tx2.gw.ivpn.net","host":"96.44.142.74","load":10.52,"multihop_port":25001,"obfs":{"obfs3_multihop_port":25002,"obfs4_multihop_port":25003,"obfs4_key":"VYfEVELWNqOm7kyO19usXm3GSK9wawRObopQLOLDbLodKnmX/jPah+IlGkL2xYiNxEzUKw"}}]},{"gateway":"us-ut.gw.ivpn.net","country_code":"US","country":"United States","city":"Salt Lake City, UT","latitude":40.7774,"longitude":-111.93,"isp":"100TB","hosts":[{"hostname":"us-ut1.gw.ivpn.net","host":"198.105.216.28","load":15.91,"multihop_port":24401,"obfs":{"obfs3_multihop_port":24402,"obfs4_multihop_port":24403,"obfs4_key":"gb5dp9i4QnFKT0GQPMEsDlqN+JORU3lyU65s9R1064aZ1jKfWfkc+SxbOlNEh23CvIAOeg"}}]},{"gateway":"us-va.gw.ivpn.net","country_code":"US","country":"United States","city":"Ashburn, VA","latitude":39.0437,"longitude":-77.4875,"isp":"Datapacket","hosts":[{"hostname":"us-va1.gw.ivpn.net","host":"37.19.206.105","load":22.97,"multihop_port":27701,"obfs":{"obfs3_multihop_port":27702,"obfs4_multihop_port":27703,"obfs4_key":"5Lk8BSID+M9QAGSglQTrYkom+V0mkIv0HgR80+9vKCcnZOu0f+aJhfOXqKnpHarJbIEHCw"}}]},{"gateway":"us-wa.gw.ivpn.net","country_code":"US","country":"United States","city":"Seattle, WA","latitude":47.6211,"longitude":-122.3244,"isp":"Tzulo","hosts":[{"hostname":"us-wa2.gw.ivpn.net","host":"198.44.131.3","load":14.58,"multihop_port":27801,"obfs":{"obfs3_multihop_port":27802,"obfs4_multihop_port":27803,"obfs4_key":"9h0W5BTzGSDpY2tGjdvViSJfEkT/BuwHS0cnFX07cEj3RRDtmxsC0f+kapO8+Kh+fz1XMQ"}}]},{"gateway":"za.gw.ivpn.net","country_code":"ZA","country":"South Africa","city":"Johannesburg","latitude":-26.195,"longitude":28.034,"isp":"Datapacket","hosts":[{"hostname":"za1.gw.ivpn.net","host":"169.150.238.103","load":8.1,"multihop_port":20840,"obfs":{"obfs3_multihop_port":20841,"obfs4_multihop_port":20842,"obfs4_key":"vM1zdiOMhoqMKZCOi/lMj7TfWJb5/UsM25p8FE/AUezwbYWhUkhpD5RbXBOBDNhZuYzPGA"}}]}],"config":{"antitracker":{"default":{"ip":"10.0.254.2","multihop-ip":"10.0.254.102"},"hardcore":{"ip":"10.0.254.3","multihop-ip":"10.0.254.103"}},"api":{"ips":["198.50.177.220","149.56.162.156","198.50.177.222","149.56.162.159","198.50.177.223"],"ipv6s":["2607:5300:203:1735::8888","2607:5300:203:1735::8","2607:5300:203:1735:6580:7300:0:aaaa"]},"ports":{"openvpn":[{"type":"UDP","port":53},{"type":"UDP","port":80},{"type":"UDP","range":{"min":5500,"max":19999}},{"type":"UDP","range":{"min":60000,"max":65000}},{"type":"UDP","port":123},{"type":"UDP","port":2049},{"type":"UDP","range":{"min":50000,"max":59999}},{"type":"UDP","port":2050},{"type":"UDP","range":{"min":40000,"max":49999}},{"type":"UDP","port":443},{"type":"UDP","port":1194},{"type":"UDP","range":{"min":30000,"max":39999}},{"type":"TCP","port":80},{"type":"TCP","port":443},{"type":"TCP","port":1194},{"type":"TCP","port":2049},{"type":"TCP","port":2050},{"type":"TCP","port":30587},{"type":"TCP","port":41893},{"type":"TCP","port":48574},{"type":"TCP","port":58237},{"type":"TCP","range":{"min":5500,"max":19999}},{"type":"TCP","range":{"min":30000,"max":65000}}],"wireguard":[{"type":"UDP","port":53},{"type":"UDP","port":80},{"type":"UDP","port":123},{"type":"UDP","port":443},{"type":"UDP","port":500},{"type":"UDP","port":1194},{"type":"UDP","port":2049},{"type":"UDP","port":2050},{"type":"UDP","port":4500},{"type":"UDP","port":30587},{"type":"UDP","port":41893},{"type":"UDP","port":48574},{"type":"UDP","port":58237},{"type":"UDP","range":{"min":5500,"max":19999}},{"type":"UDP","range":{"min":30000,"max":65000}}],"obfs3":{"port":5145},"obfs4":{"port":5146}}}} +{"wireguard":[{"gateway":"ca-qc.wg.ivpn.net","country_code":"CA","country":"Canada","city":"Montreal","latitude":45.5,"longitude":-73.5833,"isp":"M247","hosts":[{"hostname":"ca1.wg.ivpn.net","dns_name":"ca1.wg.ivpn.net","host":"37.120.130.58","public_key":"rg+GGDmjM4Vxo1hURvKmgm9yonb6qcoKbPCP/DNDBnI=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":17.13,"multihop_port":23810},{"hostname":"ca-qc1.wg.ivpn.net","dns_name":"ca-qc1.gw.ivpn.net","host":"87.101.92.29","public_key":"98JU1mdCR8vD1aNZg017/NjBeTjuuCKUaLw0zfz/CUE=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":21.5,"multihop_port":27001}]},{"gateway":"ch.wg.ivpn.net","country_code":"CH","country":"Switzerland","city":"Zurich","latitude":47.38,"longitude":8.55,"isp":"Privatelayer","hosts":[{"hostname":"ch1.wg.ivpn.net","dns_name":"ch1.wg.ivpn.net","host":"141.255.164.66","public_key":"jVZJ61i1xxkAfriDHpwvF/GDuTvZUqhwoWSjkOJvaUA=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":10.06,"multihop_port":23610},{"hostname":"ch01.wg.ivpn.net","dns_name":"ch1.gw.ivpn.net","host":"185.212.170.141","public_key":"dU7gLfcupYd37LW0q6cxC6PHMba+eUFAUOoU/ryXZkY=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":16.07,"multihop_port":23601},{"hostname":"ch3.wg.ivpn.net","dns_name":"ch3.gw.ivpn.net","host":"141.255.166.198","public_key":"JBpgBKtqIneRuEga7mbP2PAk/e4HPRaC11H0A0+R3lA=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":17.45,"multihop_port":22901}]},{"gateway":"de.wg.ivpn.net","country_code":"DE","country":"Germany","city":"Frankfurt","latitude":50.1,"longitude":8.675,"isp":"Datapacket","hosts":[{"hostname":"de1.wg.ivpn.net","dns_name":"de1.wg.ivpn.net","host":"185.102.219.26","public_key":"mS3/WpXjnMAMmXjSpd4nFzx9HSE3ubv2WyjpyH2REgs=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":26.28,"multihop_port":23010},{"hostname":"de01.wg.ivpn.net","dns_name":"de1.gw.ivpn.net","host":"178.162.212.24","public_key":"Sc5AUZieg0qX8kyCy9p0OHRES4n0CHtHHM+ZPyERFTc=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":7.37,"multihop_port":23001},{"hostname":"de2.wg.ivpn.net","dns_name":"de2.gw.ivpn.net","host":"37.58.60.151","public_key":"QhY3OtBf4FFafKtLO33e6k8JnAl8e6ktFcRUyLjCDVY=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":26.37,"multihop_port":22001},{"hostname":"de3.wg.ivpn.net","dns_name":"de3.gw.ivpn.net","host":"146.70.160.170","public_key":"CugQQtD8YJKRwS5IukNWkMcyqOzlOxfGRPhGeQRAb2Y=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":7.72,"multihop_port":21050}]},{"gateway":"gb.wg.ivpn.net","country_code":"GB","country":"United Kingdom","city":"London","latitude":51.5,"longitude":-0.1167,"isp":"M247","hosts":[{"hostname":"gb1.wg.ivpn.net","dns_name":"gb1.wg.ivpn.net","host":"81.92.202.114","public_key":"7+jos+Eg+hMEOQE4Std6OJ+WVnCcmbqS1/EbPwn9w3s=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":8.28,"multihop_port":20810},{"hostname":"gb01.wg.ivpn.net","dns_name":"gb1.gw.ivpn.net","host":"185.59.221.140","public_key":"yKK5x+D17Jr3Q12T/UBaDjNVmNdZBsqpvTqH6YfsGHg=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":9.52,"multihop_port":20801},{"hostname":"gb2.wg.ivpn.net","dns_name":"gb2.gw.ivpn.net","host":"185.59.221.225","public_key":"x0BTRaxsdxAd58ZyU2YMX4bmuj+Eg+8/urT2F3Vs1n8=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":5.07,"multihop_port":24201}]},{"gateway":"it.wg.ivpn.net","country_code":"IT","country":"Italy","city":"Milan","latitude":45.47,"longitude":9.205,"isp":"M247","hosts":[{"hostname":"it1.wg.ivpn.net","dns_name":"it1.wg.ivpn.net","host":"82.102.21.90","public_key":"Aj6b81yrDk7I913R+fuSW/NAmIl87N73vHgY5/WQY0Q=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.36,"multihop_port":24310},{"hostname":"it2.wg.ivpn.net","dns_name":"it2.gw.ivpn.net","host":"84.17.59.149","public_key":"IYi+s9DZusPErv0k2Ls/jgdubmeCrUcEJ1cNgmxPx0k=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":8.57,"multihop_port":21100}]},{"gateway":"nl.wg.ivpn.net","country_code":"NL","country":"Netherlands","city":"Amsterdam","latitude":52.35,"longitude":4.9166,"isp":"Datapacket","hosts":[{"hostname":"nl1.wg.ivpn.net","dns_name":"nl1.wg.ivpn.net","host":"185.102.218.104","public_key":"AsMT2FqpkZbjzWeDch6GwufF5odl259W/hIkGytVfWo=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":11.66,"multihop_port":20301},{"hostname":"nl3.wg.ivpn.net","dns_name":"nl3.gw.ivpn.net","host":"95.211.95.9","public_key":"XDU6Syq1DY82IMatsHV0x/TAtbLiRwh/SdFCXlEn40c=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":14.57,"multihop_port":23101},{"hostname":"nl4.wg.ivpn.net","dns_name":"nl4.gw.ivpn.net","host":"95.211.95.19","public_key":"cVB66gPq5cZ9dfXY+e2pbsCyih5o1zk04l5c5VCsV1g=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":11.6,"multihop_port":23201},{"hostname":"nl5.wg.ivpn.net","dns_name":"nl5.gw.ivpn.net","host":"95.211.243.162","public_key":"NCagAawwRixI6Iw/NWiGD8lbjDNCl0aTICZKJtO/1HA=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":20.44,"multihop_port":23901},{"hostname":"nl6.wg.ivpn.net","dns_name":"nl6.gw.ivpn.net","host":"95.211.243.182","public_key":"hMWpqb3FEATHIbImPVWB/5z2nWIXghwpnJjevPY+1H0=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":18.75,"multihop_port":24101},{"hostname":"nl7.wg.ivpn.net","dns_name":"nl7.gw.ivpn.net","host":"95.211.172.105","public_key":"hQNYqtfOOAEz0IGshLx/TI9hUrfR9gIIkjVm4VsCbBM=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":17.23,"multihop_port":22501},{"hostname":"nl8.wg.ivpn.net","dns_name":"nl8.gw.ivpn.net","host":"95.211.198.167","public_key":"/nY1/OhVhdHtbnU/s31zYUuPBH0pizv4DemW5KDOUkg=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":15.17,"multihop_port":22801}]},{"gateway":"se.wg.ivpn.net","country_code":"SE","country":"Sweden","city":"Stockholm","latitude":59.3508,"longitude":18.0973,"isp":"M247","hosts":[{"hostname":"se1.wg.ivpn.net","dns_name":"se1.wg.ivpn.net","host":"37.120.153.226","public_key":"2n0nFE1g/+vQr2AOQPm9Igyiy0zh9uTTultvOOSkMRo=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":48.23,"multihop_port":24010},{"hostname":"se01.wg.ivpn.net","dns_name":"se1.gw.ivpn.net","host":"80.67.10.141","public_key":"u8VHnYEpoEjJWDAF9NAUkU6s810RnkMuhEfFD9U0cGo=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":22.68,"multihop_port":24001}]},{"gateway":"sg.wg.ivpn.net","country_code":"SG","country":"Singapore","city":"Singapore","latitude":1.293,"longitude":103.8558,"isp":"M247","hosts":[{"hostname":"sg1.wg.ivpn.net","dns_name":"sg1.wg.ivpn.net","host":"37.120.151.122","public_key":"hSg0At4uwuIhmTy5UT4fRbi5AN6JO2ZWTuIvqd4nHCE=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":7.51,"multihop_port":26110},{"hostname":"sg01.wg.ivpn.net","dns_name":"sg1.gw.ivpn.net","host":"185.128.24.189","public_key":"pWk0u1Xq8FHC+xpkN+C6yEKOTEanorR5zMCSfHlLzFw=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":24.53,"multihop_port":26101}]},{"gateway":"us-ca.wg.ivpn.net","country_code":"US","country":"United States","city":"Los Angeles, CA","latitude":34.1139,"longitude":-118.4068,"isp":"Datapacket","hosts":[{"hostname":"us-ca1.wg.ivpn.net","dns_name":"us-ca1.wg.ivpn.net","host":"185.180.13.41","public_key":"FGl78s9Ct6xNamQ2/CtAyXwGePrrU0kiZxfM27pm8XA=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.41,"multihop_port":22210},{"hostname":"us-ca01.wg.ivpn.net","dns_name":"us-ca1.gw.ivpn.net","host":"216.144.236.44","public_key":"B+qXdkIuETpzI0bfhGUAHN4SU91Tjs6ItdFlu93S42I=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":20.7,"multihop_port":22201},{"hostname":"us-ca2.wg.ivpn.net","dns_name":"us-ca2.gw.ivpn.net","host":"216.144.236.68","public_key":"qv4Tupfon5NUSwzDpM8zPizSwJZn2h+9CqrufcyDOko=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":5.68,"multihop_port":22401},{"hostname":"us-ca3.wg.ivpn.net","dns_name":"us-ca3.gw.ivpn.net","host":"198.54.129.100","public_key":"J5+Bx84LxNPdWEhewOvBV/fGWiDluIBlAcr1QlJZil8=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":15.4,"multihop_port":21301},{"hostname":"us-ca4.wg.ivpn.net","dns_name":"us-ca4.gw.ivpn.net","host":"216.144.237.83","public_key":"dYPXYr6HSRJPe3MhALwGWNtdEy1+EPE9Kqv7cTrUXk8=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.62,"multihop_port":21901}]},{"gateway":"us-ga.wg.ivpn.net","country_code":"US","country":"United States","city":"Atlanta, GA","latitude":33.7627,"longitude":-84.4225,"isp":"Datapacket","hosts":[{"hostname":"us-ga1.wg.ivpn.net","dns_name":"us-ga1.wg.ivpn.net","host":"185.93.0.212","public_key":"jD8h+pL5/d6fmYcTzl0lR8AWzQVN5XkwRFSmM/3NcDM=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":11.4,"multihop_port":24510},{"hostname":"us-ga01.wg.ivpn.net","dns_name":"us-ga1.gw.ivpn.net","host":"104.129.24.149","public_key":"EJFl28aYpZKfmJqb1jxxTEnGx6kaH2USVrigpHKKXhs=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":15.23,"multihop_port":24501},{"hostname":"us-ga2.wg.ivpn.net","dns_name":"us-ga2.gw.ivpn.net","host":"107.150.22.77","public_key":"hr2uQOEGCvGeDkoCQJ2dCI8dM8Iu5aKhb1PIvJ9q72E=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":20.36,"multihop_port":24810}]},{"gateway":"us-il.wg.ivpn.net","country_code":"US","country":"United States","city":"Chicago, IL","latitude":41.8373,"longitude":-87.6862,"isp":"Datapacket","hosts":[{"hostname":"us-il1.wg.ivpn.net","dns_name":"us-il1.wg.ivpn.net","host":"89.187.181.116","public_key":"hku9gjamhoii8OvxZgx+TdUDIkOAQYFu39qbav2AyUQ=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":13.05,"multihop_port":21410},{"hostname":"us-il01.wg.ivpn.net","dns_name":"us-il1.gw.ivpn.net","host":"72.11.137.158","public_key":"Uy5a8JOqneAUY1dC5s9jubLnotbyIfBsLP2nZuzRbHs=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":10.25,"multihop_port":21401},{"hostname":"us-il2.wg.ivpn.net","dns_name":"us-il2.gw.ivpn.net","host":"72.11.137.148","public_key":"ANhVUMAQgStPVNRHW8mg0ZtN1YI1QHyXfNCO8+USNQQ=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.19,"multihop_port":24901}]},{"gateway":"us-ny.wg.ivpn.net","country_code":"US","country":"United States","city":"New York, NY","latitude":40.6943,"longitude":-73.9249,"isp":"M247","hosts":[{"hostname":"us-ny1.wg.ivpn.net","dns_name":"us-ny1.wg.ivpn.net","host":"91.132.137.170","public_key":"6/tjvgb7HFl7UuvBSegolxa1zKr3iSlDrlCexCmhAGE=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.46,"multihop_port":21210},{"hostname":"us-ny2.wg.ivpn.net","dns_name":"us-ny2.gw.ivpn.net","host":"212.103.48.195","public_key":"c7DwY2uT+6ulWAJ5u8qJNWHroA0qyJLcdNzf/f2kkhs=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":14.77,"multihop_port":21801},{"hostname":"us-ny3.wg.ivpn.net","dns_name":"us-ny3.gw.ivpn.net","host":"89.187.178.145","public_key":"m5/Ssw9SN3WuE+yD/fAsH5G8iuI8TcDGEiZZnPgiMCc=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":5.41,"multihop_port":27601}]},{"gateway":"us-tx.wg.ivpn.net","country_code":"US","country":"United States","city":"Dallas, TX","latitude":32.7936,"longitude":-96.7662,"isp":"Quadranet","hosts":[{"hostname":"us-tx1.wg.ivpn.net","dns_name":"us-tx1.wg.ivpn.net","host":"198.55.124.114","public_key":"JPT1veXLmasj2uQDstX24mpR7VWD+GmV8JDkidkz91Q=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":7.62,"multihop_port":21010},{"hostname":"us-tx01.wg.ivpn.net","dns_name":"us-tx1.gw.ivpn.net","host":"96.44.189.197","public_key":"LvWf548mFddi8PTrIGL6uD1/l85LU8z0Rc8tpvw2Vls=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.72,"multihop_port":21001},{"hostname":"us-tx2.wg.ivpn.net","dns_name":"us-tx2.gw.ivpn.net","host":"96.44.142.77","public_key":"om8hOGUcEvoOhHvJZoBHxNF4jxY/+Ml9Iy1WOSC/pFo=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":14.72,"multihop_port":25001}]},{"gateway":"at.wg.ivpn.net","country_code":"AT","country":"Austria","city":"Vienna","latitude":48.2,"longitude":16.3666,"isp":"M247","hosts":[{"hostname":"at1.wg.ivpn.net","dns_name":"at1.gw.ivpn.net","host":"185.244.212.69","public_key":"83LUBnP97SFpnS0y1MpEAFcg8MIiQJgW1FRv/8Mc40g=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":99.08,"multihop_port":25601}]},{"gateway":"au-nsw.wg.ivpn.net","country_code":"AU","country":"Australia","city":"Sydney","latitude":-33.92,"longitude":151.1852,"isp":"M247","hosts":[{"hostname":"au-nsw1.wg.ivpn.net","dns_name":"au-nsw1.gw.ivpn.net","host":"46.102.153.246","public_key":"KmSrG48t5xw9CJCPlYLBG3JnmiY0CnUgyRM5TUEwZhM=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":94.93,"multihop_port":26601},{"hostname":"au-nsw2.wg.ivpn.net","dns_name":"au-nsw2.gw.ivpn.net","host":"146.70.78.75","public_key":"q+wbp7GjiTszp5G16rNpGCqxkL0qSY3CH4pcgD6UsVQ=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":100,"multihop_port":27901}]},{"gateway":"be.wg.ivpn.net","country_code":"BE","country":"Belgium","city":"Brussels","latitude":50.8333,"longitude":4.3333,"isp":"M247","hosts":[{"hostname":"be1.wg.ivpn.net","dns_name":"be1.gw.ivpn.net","host":"194.187.251.13","public_key":"awriP5lpdxEMWKuG+A1DOg+vb1M5jd3WhynIMB61BhU=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":74.96,"multihop_port":25701}]},{"gateway":"bg.wg.ivpn.net","country_code":"BG","country":"Bulgaria","city":"Sofia","latitude":42.6833,"longitude":23.3167,"isp":"M247","hosts":[{"hostname":"bg1.wg.ivpn.net","dns_name":"bg1.gw.ivpn.net","host":"82.102.23.21","public_key":"WDSsdJE6wvATIWfzQwayPtE/0DaXBQgW/hPm7sQSJmU=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":28.54,"multihop_port":25901}]},{"gateway":"br.wg.ivpn.net","country_code":"BR","country":"Brazil","city":"Franca","latitude":-20.53,"longitude":-47.39,"isp":"Qnax","hosts":[{"hostname":"br1.wg.ivpn.net","dns_name":"br1.gw.ivpn.net","host":"45.162.229.133","public_key":"eN1f15S3YzRyYCALiPGRQcjkQO9xntcdqPhJJ6TOymc=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":22.54,"multihop_port":26701}]},{"gateway":"ca.wg.ivpn.net","country_code":"CA","country":"Canada","city":"Toronto","latitude":43.7,"longitude":-79.42,"isp":"Amanah","hosts":[{"hostname":"ca01.wg.ivpn.net","dns_name":"ca1.gw.ivpn.net","host":"104.254.90.181","public_key":"mdGnCZwinuOVGg46zsWnFhhenfFId6jht9GBTKB+xUA=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":64.37,"multihop_port":23801},{"hostname":"ca2.wg.ivpn.net","dns_name":"ca2.gw.ivpn.net","host":"172.86.186.173","public_key":"5qHV10ZbFgEGnF6wg9QpKeh1l6Di2JUG/5PdNaaoNW8=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":71.95,"multihop_port":22101}]},{"gateway":"cz.wg.ivpn.net","country_code":"CZ","country":"Czech Republic","city":"Prague","latitude":50.0833,"longitude":14.466,"isp":"Datapacket","hosts":[{"hostname":"cz1.wg.ivpn.net","dns_name":"cz1.gw.ivpn.net","host":"185.180.14.41","public_key":"gVbEq2cGRzwCSGPqT2oRSYYN+P6IK3uvvRffErASDSk=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":7.15,"multihop_port":25201}]},{"gateway":"dk.wg.ivpn.net","country_code":"DK","country":"Denmark","city":"Copenhagen","latitude":55.6786,"longitude":12.5635,"isp":"M247","hosts":[{"hostname":"dk1.wg.ivpn.net","dns_name":"dk1.gw.ivpn.net","host":"185.245.84.229","public_key":"jTsV5gOD7lT4egDj9rhKwO2OO2X7bKs2EQPcZEnUWDE=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":40.91,"multihop_port":25501}]},{"gateway":"es.wg.ivpn.net","country_code":"ES","country":"Spain","city":"Madrid","latitude":40.4,"longitude":-3.6834,"isp":"Datapacket","hosts":[{"hostname":"es1.wg.ivpn.net","dns_name":"es1.gw.ivpn.net","host":"84.17.62.98","public_key":"w7umiArTtlJ4Pk6Ii9WX5VXK5vw/Qu+Z37/icKlIYWo=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":11.89,"multihop_port":21501}]},{"gateway":"fi.wg.ivpn.net","country_code":"FI","country":"Finland","city":"Helsinki","latitude":60.1756,"longitude":24.9341,"isp":"Creanova","hosts":[{"hostname":"fi1.wg.ivpn.net","dns_name":"fi1.gw.ivpn.net","host":"194.34.134.63","public_key":"mIxEzfjZ2wV6jJVj30w38ECd2LSH4bw/HLMnM2ICHiI=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":100,"multihop_port":26001}]},{"gateway":"fr.wg.ivpn.net","country_code":"FR","country":"France","city":"Paris","latitude":48.8667,"longitude":2.3333,"isp":"Datapacket","hosts":[{"hostname":"fr1.wg.ivpn.net","dns_name":"fr1.gw.ivpn.net","host":"185.246.211.185","public_key":"g7BuMzj3r/noLiLR4qhQMcvU6GSIY8RGEnaYtdYsFX4=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":34.61,"multihop_port":23401}]},{"gateway":"gb-man.wg.ivpn.net","country_code":"GB","country":"United Kingdom","city":"Manchester","latitude":53.5004,"longitude":-2.248,"isp":"M247","hosts":[{"hostname":"gb-man1.wg.ivpn.net","dns_name":"gb-man1.gw.ivpn.net","host":"89.238.141.231","public_key":"+hf4DYilNEIjTdSOuCNcWdqVyaRoxGzXw7wvNl7f7Rg=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":8.64,"multihop_port":26901}]},{"gateway":"hk.wg.ivpn.net","country_code":"HK","country":"Hong Kong","city":"Hong Kong","latitude":22.305,"longitude":114.185,"isp":"Leaseweb","hosts":[{"hostname":"hk2.wg.ivpn.net","dns_name":"hk2.gw.ivpn.net","host":"64.120.120.239","public_key":"kyolyq4cJydI3vQB2ESTIUAy2Fq0bpOf+Qe7GIq6XEA=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":12.91,"multihop_port":27501},{"hostname":"hk3.wg.ivpn.net","dns_name":"hk3.gw.ivpn.net","host":"118.107.244.206","public_key":"qq1simsFNm2FpZM0J8u8Aa0rkk5HEasvLksPyLv+0Sk=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":8.27,"multihop_port":20800}]},{"gateway":"hu.wg.ivpn.net","country_code":"HU","country":"Hungary","city":"Budapest","latitude":47.5,"longitude":19.0833,"isp":"M247","hosts":[{"hostname":"hu1.wg.ivpn.net","dns_name":"hu1.gw.ivpn.net","host":"185.189.114.189","public_key":"G30fNdXrnlqtqqOLF23QXWzFdLIKDxLW60HoYPvqml8=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":20.57,"multihop_port":25401}]},{"gateway":"il.wg.ivpn.net","country_code":"IL","country":"Israel","city":"Holon, Tel Aviv","latitude":32.08,"longitude":34.77,"isp":"HQServ","hosts":[{"hostname":"il01.wg.ivpn.net","dns_name":"il1.gw.ivpn.net","host":"185.191.207.197","public_key":"HR9gAjpxXU3YVt6kehBw5n8yVYVE0iIgJdc4HTqOzEE=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":9.23,"multihop_port":27301}]},{"gateway":"is.wg.ivpn.net","country_code":"IS","country":"Iceland","city":"Reykjavik","latitude":64.15,"longitude":-21.95,"isp":"Advania","hosts":[{"hostname":"is1.wg.ivpn.net","dns_name":"is1.gw.ivpn.net","host":"82.221.107.185","public_key":"nZZT6TlQ2dXlVe3P3B5ozEScHYMWH4JY4y3to8w5dz0=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":100,"multihop_port":23501}]},{"gateway":"jp.wg.ivpn.net","country_code":"JP","country":"Japan","city":"Tokyo","latitude":35.62,"longitude":139.74,"isp":"TheGigabit","hosts":[{"hostname":"jp2.wg.ivpn.net","dns_name":"jp2.gw.ivpn.net","host":"185.135.77.81","public_key":"YuhEd9+a90/+uucZC+qzsyMHkfe/GiwG1dq7g2HegXQ=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":27.6,"multihop_port":20830}]},{"gateway":"lu.wg.ivpn.net","country_code":"LU","country":"Luxembourg","city":"Luxembourg","latitude":49.6117,"longitude":6.13,"isp":"Evoluso","hosts":[{"hostname":"lu1.wg.ivpn.net","dns_name":"lu1.gw.ivpn.net","host":"92.223.89.57","public_key":"hUS1OAFLGwpba8+oc5mifYtohZt/RTro5dMyYBLYHjI=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":57.2,"multihop_port":27201}]},{"gateway":"my.wg.ivpn.net","country_code":"MY","country":"Malaysia","city":"Kuala Lumpur","latitude":3.1494,"longitude":101.706,"isp":"TheGigabit","hosts":[{"hostname":"my1.wg.ivpn.net","dns_name":"my1.gw.ivpn.net","host":"61.4.97.153","public_key":"M9SsMCpUw7ad6YbqQr8r2saBK2zAf3tBj82DzsQjgkY=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":7.55,"multihop_port":20810}]},{"gateway":"no.wg.ivpn.net","country_code":"NO","country":"Norway","city":"Oslo","latitude":59.9167,"longitude":10.75,"isp":"Servetheworld","hosts":[{"hostname":"no1.wg.ivpn.net","dns_name":"no1.gw.ivpn.net","host":"91.189.177.156","public_key":"xFO6ksbO3Gr05rRgAW0O5Veoi4bpTgz2G9RvtBzK7Cg=","local_ip":"172.16.0.1/12","ipv6":{},"load":28.72,"multihop_port":25301}]},{"gateway":"pl.wg.ivpn.net","country_code":"PL","country":"Poland","city":"Warsaw","latitude":52.25,"longitude":21,"isp":"Datapacket","hosts":[{"hostname":"pl1.wg.ivpn.net","dns_name":"pl1.gw.ivpn.net","host":"185.246.208.109","public_key":"1JDmF79rWj5C+kHp71AbdHne/yGaizWCd2bLfSFvYjo=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":11.53,"multihop_port":25101}]},{"gateway":"pt.wg.ivpn.net","country_code":"PT","country":"Portugal","city":"Lisbon","latitude":38.7227,"longitude":-9.1449,"isp":"Hostwebis","hosts":[{"hostname":"pt1.wg.ivpn.net","dns_name":"pt1.gw.ivpn.net","host":"94.46.175.113","public_key":"nMnA82YVrvEK80GVoY/0Z9McWeqjcLzuMYSL+86j5nU=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":16.23,"multihop_port":27101}]},{"gateway":"ro.wg.ivpn.net","country_code":"RO","country":"Romania","city":"Bucharest","latitude":44.4334,"longitude":26.0999,"isp":"M247","hosts":[{"hostname":"ro1.wg.ivpn.net","dns_name":"ro1.gw.ivpn.net","host":"37.120.206.53","public_key":"F2uQ57hysZTlw8WYELnyCw9Lga80wNYoYwkrrxyXKmw=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":71.12,"multihop_port":22301}]},{"gateway":"rs.wg.ivpn.net","country_code":"RS","country":"Serbia","city":"Belgrade","latitude":44.8186,"longitude":20.468,"isp":"M247","hosts":[{"hostname":"rs1.wg.ivpn.net","dns_name":"rs1.gw.ivpn.net","host":"141.98.103.253","public_key":"xLN/lpQThQ3z3tvYf7VqdAsRL/nton1Vhv2kCZlQtWE=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":57.33,"multihop_port":26801}]},{"gateway":"sk.wg.ivpn.net","country_code":"SK","country":"Slovakia","city":"Bratislava","latitude":48.15,"longitude":17.117,"isp":"Datapacket","hosts":[{"hostname":"sk2.wg.ivpn.net","dns_name":"sk2.gw.ivpn.net","host":"156.146.40.205","public_key":"xxEl8CIjNLpig6fp7z4USHZLK35Nu5HENFNwTdeAbzU=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.35,"multihop_port":20400}]},{"gateway":"tw.wg.ivpn.net","country_code":"TW","country":"Taiwan","city":"Taipei","latitude":25.073,"longitude":121.578,"isp":"TheGigabit","hosts":[{"hostname":"tw1.wg.ivpn.net","dns_name":"tw1.gw.ivpn.net","host":"185.189.160.59","public_key":"fMTCCbbKqPp60fkqnaQvJ9mX2r6zBlt7xhUp8sGfJQY=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":9.27,"multihop_port":20820}]},{"gateway":"ua.wg.ivpn.net","country_code":"UA","country":"Ukraine","city":"Kharkiv","latitude":50,"longitude":36.25,"isp":"Xservers","hosts":[{"hostname":"ua1.wg.ivpn.net","dns_name":"ua1.gw.ivpn.net","host":"176.103.57.129","public_key":"mIxEzfjZ2wV6jJVj30w38ECd2LSH4bw/HLMnM2ICHiI=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":19.07,"multihop_port":26301}]},{"gateway":"us-az.wg.ivpn.net","country_code":"US","country":"United States","city":"Phoenix, AZ","latitude":33.5722,"longitude":-112.0891,"isp":"M247","hosts":[{"hostname":"us-az1.wg.ivpn.net","dns_name":"us-az1.gw.ivpn.net","host":"193.37.254.133","public_key":"Ts4MGazxpxL9rrYbERjgxa+kCEX85ou9gHoaJvDsRiI=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":17.69,"multihop_port":26401}]},{"gateway":"us-fl.wg.ivpn.net","country_code":"US","country":"United States","city":"Miami, FL","latitude":25.7839,"longitude":-80.2102,"isp":"Quadranet","hosts":[{"hostname":"us-fl1.wg.ivpn.net","dns_name":"us-fl1.gw.ivpn.net","host":"173.44.49.93","public_key":"Rkzo9WgxJBiKyEbkZvqGWtOVh9Gk9Vd7wL49SHXdHig=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":5.89,"multihop_port":24601}]},{"gateway":"us-nj.wg.ivpn.net","country_code":"US","country":"United States","city":"New Jersey, NJ","latitude":40.737764,"longitude":-74.151747,"isp":"Quadranet","hosts":[{"hostname":"us-nj3.wg.ivpn.net","dns_name":"us-nj3.gw.ivpn.net","host":"23.226.128.21","public_key":"AX7C1LO0ECUcHRYgX4/tIDYdR8npvfB/+pf4AfI3OHU=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":7.98,"multihop_port":21610},{"hostname":"us-nj4.wg.ivpn.net","dns_name":"us-nj4.gw.ivpn.net","host":"194.36.111.54","public_key":"1Te4AfL1yKo2k4jzPALnRPfKE3YSzXKo4XIRHPz5FxI=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":10.62,"multihop_port":27401}]},{"gateway":"us-nv.wg.ivpn.net","country_code":"US","country":"United States","city":"Las Vegas, NV","latitude":36.2333,"longitude":-115.2654,"isp":"M247","hosts":[{"hostname":"us-nv1.wg.ivpn.net","dns_name":"us-nv1.gw.ivpn.net","host":"185.242.5.37","public_key":"PRpvAZyoNWNm/KHlqafjtYoZtn1PkIPylUE4WbuYmgM=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":26.09,"multihop_port":26501}]},{"gateway":"us-ut.wg.ivpn.net","country_code":"US","country":"United States","city":"Salt Lake City, UT","latitude":40.7774,"longitude":-111.93,"isp":"100TB","hosts":[{"hostname":"us-ut1.wg.ivpn.net","dns_name":"us-ut1.gw.ivpn.net","host":"206.190.145.92","public_key":"KirI7bpxD186CuYiOqNHF+QUe6YmRYf6CN3pXWOJT2k=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":17.23,"multihop_port":24401}]},{"gateway":"us-va.wg.ivpn.net","country_code":"US","country":"United States","city":"Ashburn, VA","latitude":39.0437,"longitude":-77.4875,"isp":"Datapacket","hosts":[{"hostname":"us-va1.wg.ivpn.net","dns_name":"us-va1.gw.ivpn.net","host":"37.19.206.106","public_key":"ZCnZK6U+cRuP/WgzIDb/P6UG2rX/KyCRd5vJ1hAbr2E=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":35.87,"multihop_port":27701}]},{"gateway":"us-wa.wg.ivpn.net","country_code":"US","country":"United States","city":"Seattle, WA","latitude":47.6211,"longitude":-122.3244,"isp":"Tzulo","hosts":[{"hostname":"us-wa2.wg.ivpn.net","dns_name":"us-wa2.gw.ivpn.net","host":"198.44.131.4","public_key":"VcrOOozBUCIURU0AnqMAE7AkMmC7Qrp+j/PzPbgbalU=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":11.71,"multihop_port":27801}]},{"gateway":"za.wg.ivpn.net","country_code":"ZA","country":"South Africa","city":"Johannesburg","latitude":-26.195,"longitude":28.034,"isp":"Datapacket","hosts":[{"hostname":"za1.wg.ivpn.net","dns_name":"za1.gw.ivpn.net","host":"169.150.238.108","public_key":"tgrAA+uJZppS9esgOi0pe3rHajQQ7c/KF8WPOua6qy4=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.26,"multihop_port":20840}]}],"openvpn":[{"gateway":"at.gw.ivpn.net","country_code":"AT","country":"Austria","city":"Vienna","latitude":48.2,"longitude":16.3666,"isp":"M247","hosts":[{"hostname":"at1.gw.ivpn.net","dns_name":"at1.gw.ivpn.net","host":"185.244.212.66","load":99.08,"multihop_port":25601,"obfs":{"obfs3_multihop_port":25602,"obfs4_multihop_port":25603,"obfs4_key":"75HhQC6n6ctp9Fa9wCvEnc6ip5FnEfuIGc+dVNLH4M15FjB/Ve6bI1b8lYFhk6T+4/HkDQ"}}]},{"gateway":"au-nsw.gw.ivpn.net","country_code":"AU","country":"Australia","city":"Sydney","latitude":-33.92,"longitude":151.1852,"isp":"M247","hosts":[{"hostname":"au-nsw1.gw.ivpn.net","dns_name":"au-nsw1.gw.ivpn.net","host":"46.102.153.242","load":94.93,"multihop_port":26601,"obfs":{"obfs3_multihop_port":26602,"obfs4_multihop_port":26603,"obfs4_key":"/rjoeDjduOFq1UvT332vhS398h1RP5hC3m7sDJKNSyJ6TO8mkcxWAYILw0i+bgS/3JD5YA"}},{"hostname":"au-nsw2.gw.ivpn.net","dns_name":"au-nsw2.gw.ivpn.net","host":"146.70.78.74","load":100,"multihop_port":27901,"obfs":{"obfs3_multihop_port":27902,"obfs4_multihop_port":27903,"obfs4_key":"qtdQ5krD9EQFR98xNo/v5cmGb10wqt0Om9pYMIHWQh4oz5xcAXj32rViEyN0bnkkhaZnBA"}}]},{"gateway":"be.gw.ivpn.net","country_code":"BE","country":"Belgium","city":"Brussels","latitude":50.8333,"longitude":4.3333,"isp":"M247","hosts":[{"hostname":"be1.gw.ivpn.net","dns_name":"be1.gw.ivpn.net","host":"194.187.251.10","load":74.96,"multihop_port":25701,"obfs":{"obfs3_multihop_port":25702,"obfs4_multihop_port":25703,"obfs4_key":"cN8i60FUVy2mmGpy+tkQAz8hu/N0EGPq8cZwIotEDwdhAYdLV+ATes/AEjzdub2K68TlYg"}}]},{"gateway":"bg.gw.ivpn.net","country_code":"BG","country":"Bulgaria","city":"Sofia","latitude":42.6833,"longitude":23.3167,"isp":"M247","hosts":[{"hostname":"bg1.gw.ivpn.net","dns_name":"bg1.gw.ivpn.net","host":"82.102.23.18","load":28.54,"multihop_port":25901,"obfs":{"obfs3_multihop_port":25902,"obfs4_multihop_port":25903,"obfs4_key":"K+mCw9+zy/8pBQt6IUKRlg2eJ3DCnJ1BvIccLq/6A2D6HoZddyDnZQYb2Sb2e464dVgBWw"}}]},{"gateway":"br.gw.ivpn.net","country_code":"BR","country":"Brazil","city":"Franca","latitude":-20.53,"longitude":-47.39,"isp":"Qnax","hosts":[{"hostname":"br1.gw.ivpn.net","dns_name":"br1.gw.ivpn.net","host":"45.162.229.130","load":22.54,"multihop_port":26701,"obfs":{"obfs3_multihop_port":26702,"obfs4_multihop_port":26703,"obfs4_key":"h4bBkocahWveuv/nWPRMYXBTw95ExTiXwmoydkNlV6hgfy8/ZjaKc34rqTuOyOH+CK7OZw"}}]},{"gateway":"ca-qc.gw.ivpn.net","country_code":"CA","country":"Canada","city":"Montreal","latitude":45.5,"longitude":-73.5833,"isp":"M247","hosts":[{"hostname":"ca-qc1.gw.ivpn.net","dns_name":"ca-qc1.gw.ivpn.net","host":"87.101.92.26","load":21.5,"multihop_port":27001,"obfs":{"obfs3_multihop_port":27002,"obfs4_multihop_port":27003,"obfs4_key":"E97qdaar8flBavysmvdIui7WQEFKkbmNi/ITTo8bPLvv39vnaBRzFj4vjMwpzXV2jXEGRQ"}}]},{"gateway":"ca.gw.ivpn.net","country_code":"CA","country":"Canada","city":"Toronto","latitude":43.7,"longitude":-79.42,"isp":"Amanah","hosts":[{"hostname":"ca1.gw.ivpn.net","dns_name":"ca1.gw.ivpn.net","host":"104.254.90.178","load":64.37,"multihop_port":23801,"obfs":{"obfs3_multihop_port":23802,"obfs4_multihop_port":23803,"obfs4_key":"49WDCCK1QGpOTSEVflRzIIaOdCT1BLB3jr/yNUJsbaUFrq7NuoB1E3wAdArNxQq9p5otTw"}},{"hostname":"ca2.gw.ivpn.net","dns_name":"ca2.gw.ivpn.net","host":"172.86.186.170","load":71.95,"multihop_port":22101,"obfs":{"obfs3_multihop_port":22102,"obfs4_multihop_port":22103,"obfs4_key":"xNkQbCkA0VCe2i4WvS2CPq2eBSMydIjsHH36E+Yg0C+gOPo3SwZyN51kpB+kwsYVS32fOQ"}}]},{"gateway":"ch.gw.ivpn.net","country_code":"CH","country":"Switzerland","city":"Zurich","latitude":47.38,"longitude":8.55,"isp":"M247","hosts":[{"hostname":"ch1.gw.ivpn.net","dns_name":"ch1.gw.ivpn.net","host":"185.212.170.138","load":16.07,"multihop_port":23601,"obfs":{"obfs3_multihop_port":23602,"obfs4_multihop_port":23603,"obfs4_key":"ELnV4JNKu0vUNd3J+QDn64yfZtqM0hNN6O5n6RkDLHbeSDBZmxP1N4dlwwChV/uySX+DEQ"}},{"hostname":"ch3.gw.ivpn.net","dns_name":"ch3.gw.ivpn.net","host":"141.255.166.194","load":17.45,"multihop_port":22901,"obfs":{"obfs3_multihop_port":22902,"obfs4_multihop_port":22903,"obfs4_key":"oNaH5sHCPGGk5m3/VMOrTDL+m1qsJrze+bqDs78vhOYBpjx5Jjq5TXu1dXNfDJCKNmKnUA"}}]},{"gateway":"cz.gw.ivpn.net","country_code":"CZ","country":"Czech Republic","city":"Prague","latitude":50.0833,"longitude":14.466,"isp":"Datapacket","hosts":[{"hostname":"cz1.gw.ivpn.net","dns_name":"cz1.gw.ivpn.net","host":"195.181.160.167","load":7.15,"multihop_port":25201,"obfs":{"obfs3_multihop_port":25202,"obfs4_multihop_port":25203,"obfs4_key":"JZ3PtIyflM3VwVow2vqi08OxddOWSx9j6B6yZSGoZLs9QE0hzSAj3ZBWEsCKFeQ2RcAoCQ"}}]},{"gateway":"de.gw.ivpn.net","country_code":"DE","country":"Germany","city":"Frankfurt","latitude":50.1,"longitude":8.675,"isp":"Leaseweb","hosts":[{"hostname":"de1.gw.ivpn.net","dns_name":"de1.gw.ivpn.net","host":"178.162.222.40","load":7.37,"multihop_port":23001,"obfs":{"obfs3_multihop_port":23002,"obfs4_multihop_port":23003,"obfs4_key":"PBhcWVcRNOCTMSWXbA2J+8eJBVzNd9H5HOr0YCF8QWwmKeSlEmqLSJQE8oDpKH5IbFH4Mw"}},{"hostname":"de2.gw.ivpn.net","dns_name":"de2.gw.ivpn.net","host":"178.162.211.114","load":26.37,"multihop_port":22001,"obfs":{"obfs3_multihop_port":22002,"obfs4_multihop_port":22003,"obfs4_key":"dEhLA4ZsvVP8+PRvlSHKwmW8JyzR1Bwy7+BFKF7Ux4L2B5YvdqqOrv/8eHliEj2mm2Z8Iw"}},{"hostname":"de3.gw.ivpn.net","dns_name":"de3.gw.ivpn.net","host":"146.70.160.162","load":7.72,"multihop_port":21050,"obfs":{"obfs3_multihop_port":21051,"obfs4_multihop_port":21052,"obfs4_key":"IFf+iLf7lgc0K81tQkZL5zndlWflvnLZyYSGGNLtSXLLivlIeBuXCPFDJ7fkL3TOd5uhOA"}}]},{"gateway":"dk.gw.ivpn.net","country_code":"DK","country":"Denmark","city":"Copenhagen","latitude":55.6786,"longitude":12.5635,"isp":"M247","hosts":[{"hostname":"dk1.gw.ivpn.net","dns_name":"dk1.gw.ivpn.net","host":"185.245.84.226","load":40.91,"multihop_port":25501,"obfs":{"obfs3_multihop_port":25502,"obfs4_multihop_port":25503,"obfs4_key":"ngjtv9UISX4tB5AkBnrEN2TrAnUqVwNZ688VqDlS4BDxQXJeJF3ynZtngRqeowhEahsccQ"}}]},{"gateway":"es.gw.ivpn.net","country_code":"ES","country":"Spain","city":"Madrid","latitude":40.4,"longitude":-3.6834,"isp":"Datapacket","hosts":[{"hostname":"es1.gw.ivpn.net","dns_name":"es1.gw.ivpn.net","host":"185.93.3.193","load":11.89,"multihop_port":21501,"obfs":{"obfs3_multihop_port":21502,"obfs4_multihop_port":21503,"obfs4_key":"x4A9SBY5yzPKH1QOkEsGYcIR2JA/Pu393jv/ZSg4YO2DsVhr3TQFxcMO3QhD9iSF48smJA"}}]},{"gateway":"fi.gw.ivpn.net","country_code":"FI","country":"Finland","city":"Helsinki","latitude":60.1756,"longitude":24.9341,"isp":"Creanova","hosts":[{"hostname":"fi1.gw.ivpn.net","dns_name":"fi1.gw.ivpn.net","host":"185.112.82.12","load":100,"multihop_port":26001,"obfs":{"obfs3_multihop_port":26002,"obfs4_multihop_port":26003,"obfs4_key":"SvvSpGiFctjs4n2wZGnZUf9fAL8wag70SrA3FX+9f3Sq+KgBn+/8P6fE3239ezemg9svLA"}}]},{"gateway":"fr.gw.ivpn.net","country_code":"FR","country":"France","city":"Paris","latitude":48.8667,"longitude":2.3333,"isp":"Datapacket","hosts":[{"hostname":"fr1.gw.ivpn.net","dns_name":"fr1.gw.ivpn.net","host":"185.246.211.179","load":34.61,"multihop_port":23401,"obfs":{"obfs3_multihop_port":23402,"obfs4_multihop_port":23403,"obfs4_key":"CMf0pNZ46nFdG0Tpa3hE0cK9wtUAReJL7HN66G9Jq3tlrTSWrU0DLf7sCQgXV+WFoc8iaw"}}]},{"gateway":"gb-man.gw.ivpn.net","country_code":"GB","country":"United Kingdom","city":"Manchester","latitude":53.5004,"longitude":-2.248,"isp":"M247","hosts":[{"hostname":"gb-man1.gw.ivpn.net","dns_name":"gb-man1.gw.ivpn.net","host":"89.238.141.228","load":8.64,"multihop_port":26901,"obfs":{"obfs3_multihop_port":26902,"obfs4_multihop_port":26903,"obfs4_key":"WuP3pMrsQA+uAC72sV+Y62E1uvOWcnbTNJCmRHXqtWbbYzECF5swu62dzD/JOKoa5t0tGQ"}}]},{"gateway":"gb.gw.ivpn.net","country_code":"GB","country":"United Kingdom","city":"London","latitude":51.5,"longitude":-0.1167,"isp":"Datapacket","hosts":[{"hostname":"gb1.gw.ivpn.net","dns_name":"gb1.gw.ivpn.net","host":"185.59.221.133","load":9.52,"multihop_port":20801,"obfs":{"obfs3_multihop_port":20802,"obfs4_multihop_port":20803,"obfs4_key":"5whTESvZxQE28wKqJWZ9fQFy09d8//GNaPDeYHVR+FJZTyI+DMS6qX4Mt2FKSf/zBToaDg"}},{"hostname":"gb2.gw.ivpn.net","dns_name":"gb2.gw.ivpn.net","host":"185.59.221.88","load":5.07,"multihop_port":24201,"obfs":{"obfs3_multihop_port":24202,"obfs4_multihop_port":24203,"obfs4_key":"4hrCOgPsRfmnQ6cLvV5mtM2XZCRS/DXG/izYSg2qZC+WJ0GsnhTlKByPM2iJ555MaM8vJA"}}]},{"gateway":"hk.gw.ivpn.net","country_code":"HK","country":"Hong Kong","city":"Hong Kong","latitude":22.305,"longitude":114.185,"isp":"Leaseweb","hosts":[{"hostname":"hk2.gw.ivpn.net","dns_name":"hk2.gw.ivpn.net","host":"209.58.188.13","load":12.91,"multihop_port":27501,"obfs":{"obfs3_multihop_port":27502,"obfs4_multihop_port":27503,"obfs4_key":"GIunWjiq00Piv3Xf4VeMkmUQ8NzD8sxRkSIbA3bxrU4LhPVth+3qM2zQwI4GesQDCDY5RA"}},{"hostname":"hk3.gw.ivpn.net","dns_name":"hk3.gw.ivpn.net","host":"118.107.244.184","load":8.27,"multihop_port":20800,"obfs":{"obfs3_multihop_port":20801,"obfs4_multihop_port":20802,"obfs4_key":"wnI0gz3hLM9VhkABSncBIsGERgn16UzTxkj7dEeYYo/y2Wu0/w24rfriA5KL7ugpTyvEFg"}}]},{"gateway":"hu.gw.ivpn.net","country_code":"HU","country":"Hungary","city":"Budapest","latitude":47.5,"longitude":19.0833,"isp":"M247","hosts":[{"hostname":"hu1.gw.ivpn.net","dns_name":"hu1.gw.ivpn.net","host":"185.189.114.186","load":20.57,"multihop_port":25401,"obfs":{"obfs3_multihop_port":25402,"obfs4_multihop_port":25403,"obfs4_key":"2TwZqxAakni0S4S3ulOIqMZimqqug0KCr6pNREN6KytrtIh486nkJyiFRqaYZlx+FlxEcg"}}]},{"gateway":"il.gw.ivpn.net","country_code":"IL","country":"Israel","city":"Holon, Tel Aviv","latitude":32.08,"longitude":34.77,"isp":"HQServ","hosts":[{"hostname":"il1.gw.ivpn.net","dns_name":"il1.gw.ivpn.net","host":"185.191.207.194","load":9.23,"multihop_port":27301,"obfs":{"obfs3_multihop_port":27302,"obfs4_multihop_port":27303,"obfs4_key":"DysuSM7UWjquj4BAVYf6mOUnRKfY1QXs17MXiV5aYapFfOkQPpx5nQPVQ2M+rLDxN9TSRg"}}]},{"gateway":"is.gw.ivpn.net","country_code":"IS","country":"Iceland","city":"Reykjavik","latitude":64.15,"longitude":-21.95,"isp":"Advania","hosts":[{"hostname":"is1.gw.ivpn.net","dns_name":"is1.gw.ivpn.net","host":"82.221.107.178","load":100,"multihop_port":23501,"obfs":{"obfs3_multihop_port":23502,"obfs4_multihop_port":23503,"obfs4_key":"xx/Lor3q60/pVh4PKWi0GZaw64pPXFTkALnGlvRaBMiPRkFilr7KhYmPInDnZxzr4c4AIw"}}]},{"gateway":"it.gw.ivpn.net","country_code":"IT","country":"Italy","city":"Milan","latitude":45.47,"longitude":9.205,"isp":"Datapacket","hosts":[{"hostname":"it2.gw.ivpn.net","dns_name":"it2.gw.ivpn.net","host":"84.17.59.137","load":8.57,"multihop_port":21100,"obfs":{"obfs3_multihop_port":21101,"obfs4_multihop_port":21102,"obfs4_key":"8msjDzd52ALBZF9Ej8i6BYXc4qSTiG8P739Px77EHp0uOVd5/VvDhrBfGcBQxDIgBlUeLw"}}]},{"gateway":"jp.gw.ivpn.net","country_code":"JP","country":"Japan","city":"Tokyo","latitude":35.62,"longitude":139.74,"isp":"TheGigabit","hosts":[{"hostname":"jp2.gw.ivpn.net","dns_name":"jp2.gw.ivpn.net","host":"185.135.77.35","load":27.6,"multihop_port":20830,"obfs":{"obfs3_multihop_port":20831,"obfs4_multihop_port":20832,"obfs4_key":"giZJF4edg7wcjxbdgD2RjFcF9QAzExLHIJYjm2cLLtx7MrxP0p96mIFj9T8LSQotKB63fA"}}]},{"gateway":"lu.gw.ivpn.net","country_code":"LU","country":"Luxembourg","city":"Luxembourg","latitude":49.6117,"longitude":6.13,"isp":"Evoluso","hosts":[{"hostname":"lu1.gw.ivpn.net","dns_name":"lu1.gw.ivpn.net","host":"92.223.89.53","load":57.2,"multihop_port":27201,"obfs":{"obfs3_multihop_port":27202,"obfs4_multihop_port":27203,"obfs4_key":"auDmK8lVBI7fxq6UjXg7V0qoZJ3icACKm/9vruMGSr0lT6ViNsl28qMqYbjJRveHnx5eQw"}}]},{"gateway":"my.gw.ivpn.net","country_code":"MY","country":"Malaysia","city":"Kuala Lumpur","latitude":3.1494,"longitude":101.706,"isp":"TheGigabit","hosts":[{"hostname":"my1.gw.ivpn.net","dns_name":"my1.gw.ivpn.net","host":"61.4.97.148","load":7.55,"multihop_port":20810,"obfs":{"obfs3_multihop_port":20811,"obfs4_multihop_port":20812,"obfs4_key":"k2hwCe8gDb24K5n2jNXYO5YCl5XCIEhuRwpYSsEhKWorah8OUM1C1crawbfstj+W2IQdOA"}}]},{"gateway":"nl.gw.ivpn.net","country_code":"NL","country":"Netherlands","city":"Amsterdam","latitude":52.35,"longitude":4.9166,"isp":"Leaseweb","hosts":[{"hostname":"nl3.gw.ivpn.net","dns_name":"nl3.gw.ivpn.net","host":"95.211.172.68","load":14.57,"multihop_port":23101,"obfs":{"obfs3_multihop_port":23102,"obfs4_multihop_port":23103,"obfs4_key":"eUXsScIg0K0LKVgA8yq2Mc++pfnTQ9nr3gnV8n1NIw7wRqinhO6uuXiSS5J19agQaPK1ew"}},{"hostname":"nl4.gw.ivpn.net","dns_name":"nl4.gw.ivpn.net","host":"95.211.172.95","load":11.6,"multihop_port":23201,"obfs":{"obfs3_multihop_port":23202,"obfs4_multihop_port":23203,"obfs4_key":"KEw6WJF+NDOQv7yMvq+dAAAkPbcYJ8PX6pffRd8EM3uaOy2QcpMcdHI7s700Kq/ZvV3HBQ"}},{"hostname":"nl5.gw.ivpn.net","dns_name":"nl5.gw.ivpn.net","host":"95.211.187.222","load":20.44,"multihop_port":23901,"obfs":{"obfs3_multihop_port":23902,"obfs4_multihop_port":23903,"obfs4_key":"fcWCrzzatLbk1LNKsuQZKpQrC3ZXwQ85GO5xRS467KJBRDrmvnyMb6ARbLGu+gYkTnNELQ"}},{"hostname":"nl6.gw.ivpn.net","dns_name":"nl6.gw.ivpn.net","host":"95.211.187.228","load":18.75,"multihop_port":24101,"obfs":{"obfs3_multihop_port":24102,"obfs4_multihop_port":24103,"obfs4_key":"lT3OGPQS1CwwqtalMExN7qxEoDDBLLlcoh5a6YW3DPj8esEBEG6wY5OfYonxltBzoVu4PA"}},{"hostname":"nl7.gw.ivpn.net","dns_name":"nl7.gw.ivpn.net","host":"95.211.95.22","load":17.23,"multihop_port":22501,"obfs":{"obfs3_multihop_port":22502,"obfs4_multihop_port":22503,"obfs4_key":"ffMnq7Gc/D7KWoLckJ4t8nf3zZqVdlffe2lVfUCceOyOTdRApkeJGgEai0TI1z76Yey9Lw"}},{"hostname":"nl8.gw.ivpn.net","dns_name":"nl8.gw.ivpn.net","host":"95.211.172.18","load":15.17,"multihop_port":22801,"obfs":{"obfs3_multihop_port":22802,"obfs4_multihop_port":22803,"obfs4_key":"h+u/6VkPDJXySoJ6QEM1hOjWPD58OS4AZPP9ofP/yCWGBQpPoMc78l7C74eFvqKKkFAXDw"}}]},{"gateway":"no.gw.ivpn.net","country_code":"NO","country":"Norway","city":"Oslo","latitude":59.9167,"longitude":10.75,"isp":"Servetheworld","hosts":[{"hostname":"no1.gw.ivpn.net","dns_name":"no1.gw.ivpn.net","host":"194.242.10.150","load":28.72,"multihop_port":25301,"obfs":{"obfs3_multihop_port":25302,"obfs4_multihop_port":25303,"obfs4_key":"uhLy//KRu6DrYfgDJmwjC6Fxk5h+MRDNOwFe7qzGTjfOiHLWRSoRx6OdNvzjPPXq0ZJnZg"}}]},{"gateway":"pl.gw.ivpn.net","country_code":"PL","country":"Poland","city":"Warsaw","latitude":52.25,"longitude":21,"isp":"Datapacket","hosts":[{"hostname":"pl1.gw.ivpn.net","dns_name":"pl1.gw.ivpn.net","host":"185.246.208.86","load":11.53,"multihop_port":25101,"obfs":{"obfs3_multihop_port":25102,"obfs4_multihop_port":25103,"obfs4_key":"S9XZyigxYjF5jWcwYpMmV9HJq4Vni1yQvLKI03n0TJ7csrgsX7lPpFfECAGQruHh1wkMXg"}}]},{"gateway":"pt.gw.ivpn.net","country_code":"PT","country":"Portugal","city":"Lisbon","latitude":38.7227,"longitude":-9.1449,"isp":"Hostwebis","hosts":[{"hostname":"pt1.gw.ivpn.net","dns_name":"pt1.gw.ivpn.net","host":"94.46.175.112","load":16.23,"multihop_port":27101,"obfs":{"obfs3_multihop_port":27102,"obfs4_multihop_port":27103,"obfs4_key":"NqXqKMt8UF25hYDIwfh2K4Rr4a7F41HzZDGjX7SYwRaoOtrTL665yV6Z3h9wF+/R1YE8KQ"}}]},{"gateway":"ro.gw.ivpn.net","country_code":"RO","country":"Romania","city":"Bucharest","latitude":44.4334,"longitude":26.0999,"isp":"M247","hosts":[{"hostname":"ro1.gw.ivpn.net","dns_name":"ro1.gw.ivpn.net","host":"37.120.206.50","load":71.12,"multihop_port":22301,"obfs":{"obfs3_multihop_port":22302,"obfs4_multihop_port":22303,"obfs4_key":"lqfg/sP9uLakoQiA6YI5/kHQ4/FvQTp6jRgxSswjHwC8POOM23FijEWKyykngn1Eb3xfLA"}}]},{"gateway":"rs.gw.ivpn.net","country_code":"RS","country":"Serbia","city":"Belgrade","latitude":44.8186,"longitude":20.468,"isp":"M247","hosts":[{"hostname":"rs1.gw.ivpn.net","dns_name":"rs1.gw.ivpn.net","host":"141.98.103.250","load":57.33,"multihop_port":26801,"obfs":{"obfs3_multihop_port":26802,"obfs4_multihop_port":26803,"obfs4_key":"0MqgxLrLFQTlQWGAjY9es+Nv45d37/5lulWw0iEFoiUvtzOcbut8hK9AhCis17EXi+lUXw"}}]},{"gateway":"se.gw.ivpn.net","country_code":"SE","country":"Sweden","city":"Stockholm","latitude":59.3508,"longitude":18.0973,"isp":"GleSyS","hosts":[{"hostname":"se1.gw.ivpn.net","dns_name":"se1.gw.ivpn.net","host":"80.67.10.138","load":22.68,"multihop_port":24001,"obfs":{"obfs3_multihop_port":24002,"obfs4_multihop_port":24003,"obfs4_key":"/yhTV2SsTXlwsG2mCS90ZAYIZivsSyloaFw6VDj0pnpJOuUxXcZBOgdyQ/lfWxJtvHZmPg"}}]},{"gateway":"sg.gw.ivpn.net","country_code":"SG","country":"Singapore","city":"Singapore","latitude":1.293,"longitude":103.8558,"isp":"M247","hosts":[{"hostname":"sg1.gw.ivpn.net","dns_name":"sg1.gw.ivpn.net","host":"185.128.24.186","load":24.53,"multihop_port":26101,"obfs":{"obfs3_multihop_port":26102,"obfs4_multihop_port":26103,"obfs4_key":"0N1ZmZlnyhS/3Y1OhvB0Bk3BGU2LFy0zyuWPYwM/P+mfX57w8zI7/YcBfIXZVgDiStt4MQ"}}]},{"gateway":"sk.gw.ivpn.net","country_code":"SK","country":"Slovakia","city":"Bratislava","latitude":48.15,"longitude":17.117,"isp":"Datapacket","hosts":[{"hostname":"sk2.gw.ivpn.net","dns_name":"sk2.gw.ivpn.net","host":"156.146.40.202","load":6.35,"multihop_port":20400,"obfs":{"obfs3_multihop_port":20401,"obfs4_multihop_port":20402,"obfs4_key":"ALsqb8RNZcvMzBsxnf4WQQYklUL0P6TUhyoXiwK1XPOEcCtW278YediLvTvOMeD5WLkPKg"}}]},{"gateway":"tw.gw.ivpn.net","country_code":"TW","country":"Taiwan","city":"Taipei","latitude":25.073,"longitude":121.578,"isp":"TheGigabit","hosts":[{"hostname":"tw1.gw.ivpn.net","dns_name":"tw1.gw.ivpn.net","host":"185.189.160.6","load":9.27,"multihop_port":20820,"obfs":{"obfs3_multihop_port":20821,"obfs4_multihop_port":20822,"obfs4_key":"/ilRlB3BkUzUG2yd+++6KeYEF9PEB+3T3XcQhVjfoF8wJH1kgjGXvikjS1j/1SknFpGPaA"}}]},{"gateway":"ua.gw.ivpn.net","country_code":"UA","country":"Ukraine","city":"Kharkiv","latitude":50,"longitude":36.25,"isp":"Xservers","hosts":[{"hostname":"ua1.gw.ivpn.net","dns_name":"ua1.gw.ivpn.net","host":"176.103.58.123","load":19.07,"multihop_port":26301,"obfs":{"obfs3_multihop_port":26302,"obfs4_multihop_port":26303,"obfs4_key":"RsW3q+FmLATkKnKHOheUntwvslkrXEiCBx3ajDjhyHiZMtQI+Uy7TmhFK0YaHg/qKoljYw"}}]},{"gateway":"us-az.gw.ivpn.net","country_code":"US","country":"United States","city":"Phoenix, AZ","latitude":33.5722,"longitude":-112.0891,"isp":"M247","hosts":[{"hostname":"us-az1.gw.ivpn.net","dns_name":"us-az1.gw.ivpn.net","host":"193.37.254.130","load":17.69,"multihop_port":26401,"obfs":{"obfs3_multihop_port":26402,"obfs4_multihop_port":26403,"obfs4_key":"Y2klMvUi3NBIReXSALaKnNm8qI9IdWhFwgQrwl9ofUuVNuT6D93ohTTqbW//iKS5/lqndw"}}]},{"gateway":"us-ca.gw.ivpn.net","country_code":"US","country":"United States","city":"Los Angeles, CA","latitude":34.1139,"longitude":-118.4068,"isp":"Quadranet","hosts":[{"hostname":"us-ca1.gw.ivpn.net","dns_name":"us-ca1.gw.ivpn.net","host":"173.254.196.58","load":20.7,"multihop_port":22201,"obfs":{"obfs3_multihop_port":22202,"obfs4_multihop_port":22203,"obfs4_key":"C/Ct5AG8tkV0Yi7MnXv+bNvExY8Dgii4OeJ7DA7lIq3HptUa+WbG+IAR/UIDaMn8VeXDIg"}},{"hostname":"us-ca2.gw.ivpn.net","dns_name":"us-ca2.gw.ivpn.net","host":"69.12.80.146","load":5.68,"multihop_port":22401,"obfs":{"obfs3_multihop_port":22402,"obfs4_multihop_port":22403,"obfs4_key":"nvizO9jj1D3xMqCMTnP6XDIzTLy6KcYNsDSxvJjm5QwZ9Y+5gommAk9LIcCeX9o4FjlkVA"}},{"hostname":"us-ca3.gw.ivpn.net","dns_name":"us-ca3.gw.ivpn.net","host":"198.54.129.99","load":15.4,"multihop_port":21301,"obfs":{"obfs3_multihop_port":21302,"obfs4_multihop_port":21303,"obfs4_key":"rharPyhkUzYwmCP8ZzeaCwnJAmwOqwDTLOlJqzi/kAxMn4OVXtbzCk9Ww8XR31D2rmk3MA"}},{"hostname":"us-ca4.gw.ivpn.net","dns_name":"us-ca4.gw.ivpn.net","host":"173.254.204.202","load":6.62,"multihop_port":21901,"obfs":{"obfs3_multihop_port":21902,"obfs4_multihop_port":21903,"obfs4_key":"2Sdam2VI658TdQRvj5bxwKPFljrsKgwBDv/mqhXNYgDQGs+WVhAz508b2oWVgHed3Ki8dQ"}}]},{"gateway":"us-fl.gw.ivpn.net","country_code":"US","country":"United States","city":"Miami, FL","latitude":25.7839,"longitude":-80.2102,"isp":"Quadranet","hosts":[{"hostname":"us-fl1.gw.ivpn.net","dns_name":"us-fl1.gw.ivpn.net","host":"173.44.49.90","load":5.89,"multihop_port":24601,"obfs":{"obfs3_multihop_port":24602,"obfs4_multihop_port":24603,"obfs4_key":"vS7u4rijvWECRS/Mo2KOpl8kx0NOozp3kF/FMxGmCZILE46etitrheYI2hCpNsYUg3YTBQ"}}]},{"gateway":"us-ga.gw.ivpn.net","country_code":"US","country":"United States","city":"Atlanta, GA","latitude":33.7627,"longitude":-84.4225,"isp":"Quadranet","hosts":[{"hostname":"us-ga1.gw.ivpn.net","dns_name":"us-ga1.gw.ivpn.net","host":"104.129.24.146","load":15.23,"multihop_port":24501,"obfs":{"obfs3_multihop_port":24502,"obfs4_multihop_port":24503,"obfs4_key":"+No53UtdyPN4uT89vMlvRTjFnxtMKol+oOld9I9WMnlK7BU+y10oXWofzcI4eRgkm195FQ"}},{"hostname":"us-ga2.gw.ivpn.net","dns_name":"us-ga2.gw.ivpn.net","host":"107.150.22.74","load":20.36,"multihop_port":24810,"obfs":{"obfs3_multihop_port":24811,"obfs4_multihop_port":24812,"obfs4_key":"3viWXkxZx1KZF9uzd5tRxb5lNMMnRZ90PqwLUaZdkZuaouj+Vb20t5uk3BVz/YyZkrSoGw"}}]},{"gateway":"us-il.gw.ivpn.net","country_code":"US","country":"United States","city":"Chicago, IL","latitude":41.8373,"longitude":-87.6862,"isp":"Quadranet","hosts":[{"hostname":"us-il1.gw.ivpn.net","dns_name":"us-il1.gw.ivpn.net","host":"107.150.28.82","load":10.25,"multihop_port":21401,"obfs":{"obfs3_multihop_port":21402,"obfs4_multihop_port":21403,"obfs4_key":"6PpxOt8CwINAjun8o/wsf/cAidNbJZM/Pg4im1Cx9kCBV/lau3XFq3bMwBW0SzptZ/5WdA"}},{"hostname":"us-il2.gw.ivpn.net","dns_name":"us-il2.gw.ivpn.net","host":"72.11.137.146","load":6.19,"multihop_port":24901,"obfs":{"obfs3_multihop_port":24902,"obfs4_multihop_port":24903,"obfs4_key":"cfvJR/gplqAbFx8myJSW/cPC3hN1782PPma2v5YKJR5LyekWX+AHTJjzdz8xSr2mM6IGQw"}}]},{"gateway":"us-nj.gw.ivpn.net","country_code":"US","country":"United States","city":"New Jersey, NJ","latitude":40.737764,"longitude":-74.151747,"isp":"Quadranet","hosts":[{"hostname":"us-nj3.gw.ivpn.net","dns_name":"us-nj3.gw.ivpn.net","host":"23.226.128.18","load":7.98,"multihop_port":21610,"obfs":{"obfs3_multihop_port":21611,"obfs4_multihop_port":21612,"obfs4_key":"JtB/8Lv8MOq9+bpYC751voS2CwoEwf9ku2CziwJScn3Gc1F/BTul6ehnrGiedmpkQXAtJw"}},{"hostname":"us-nj4.gw.ivpn.net","dns_name":"us-nj4.gw.ivpn.net","host":"194.36.111.50","load":10.62,"multihop_port":27401,"obfs":{"obfs3_multihop_port":27402,"obfs4_multihop_port":27403,"obfs4_key":"lHDLT6cTgt0bh3ysogDdiXL4eWGRtJZ0cZGJmvpeK0YLUAsBfsOzKv46V0iv5ykwRPm6Mg"}}]},{"gateway":"us-nv.gw.ivpn.net","country_code":"US","country":"United States","city":"Las Vegas, NV","latitude":36.2333,"longitude":-115.2654,"isp":"M247","hosts":[{"hostname":"us-nv1.gw.ivpn.net","dns_name":"us-nv1.gw.ivpn.net","host":"185.242.5.34","load":26.09,"multihop_port":26501,"obfs":{"obfs3_multihop_port":26502,"obfs4_multihop_port":26503,"obfs4_key":"Kux7OTSrUOkklATpG67hJPz7xCWpW6eD9Qdw2GNKAmaaPA5zvPC3SXQRvyrYdyAAqMXMfg"}}]},{"gateway":"us-ny.gw.ivpn.net","country_code":"US","country":"United States","city":"New York, NY","latitude":40.6943,"longitude":-73.9249,"isp":"M247","hosts":[{"hostname":"us-ny2.gw.ivpn.net","dns_name":"us-ny2.gw.ivpn.net","host":"212.103.48.194","load":14.77,"multihop_port":21801,"obfs":{"obfs3_multihop_port":21802,"obfs4_multihop_port":21803,"obfs4_key":"GtK9yCXTtrLOrf0MTWdWqjzQ1vd1eKsVjiOuR5CiVaDf4dCSalyJ+kmik4nfU9Gj6UwcCg"}},{"hostname":"us-ny3.gw.ivpn.net","dns_name":"us-ny3.gw.ivpn.net","host":"89.187.178.144","load":5.41,"multihop_port":27601,"obfs":{"obfs3_multihop_port":27602,"obfs4_multihop_port":27603,"obfs4_key":"eL/9iKx6f5bHowNJBsT2E/Aag5w8Cvtb3DduySudJmuK2GtIOUwNzS33lFZwSUEnJIYwLg"}}]},{"gateway":"us-tx.gw.ivpn.net","country_code":"US","country":"United States","city":"Dallas, TX","latitude":32.7936,"longitude":-96.7662,"isp":"Quadranet","hosts":[{"hostname":"us-tx1.gw.ivpn.net","dns_name":"us-tx1.gw.ivpn.net","host":"96.44.189.194","load":6.72,"multihop_port":21001,"obfs":{"obfs3_multihop_port":21002,"obfs4_multihop_port":21003,"obfs4_key":"GBDWrGN71fGa7a7S8b2tHzjYQMhnA2vJW5yq3iID+VoSzA1xIAgHiOxISEU93v+CBTCXWg"}},{"hostname":"us-tx2.gw.ivpn.net","dns_name":"us-tx2.gw.ivpn.net","host":"96.44.142.74","load":14.72,"multihop_port":25001,"obfs":{"obfs3_multihop_port":25002,"obfs4_multihop_port":25003,"obfs4_key":"VYfEVELWNqOm7kyO19usXm3GSK9wawRObopQLOLDbLodKnmX/jPah+IlGkL2xYiNxEzUKw"}}]},{"gateway":"us-ut.gw.ivpn.net","country_code":"US","country":"United States","city":"Salt Lake City, UT","latitude":40.7774,"longitude":-111.93,"isp":"100TB","hosts":[{"hostname":"us-ut1.gw.ivpn.net","dns_name":"us-ut1.gw.ivpn.net","host":"198.105.216.28","load":17.23,"multihop_port":24401,"obfs":{"obfs3_multihop_port":24402,"obfs4_multihop_port":24403,"obfs4_key":"gb5dp9i4QnFKT0GQPMEsDlqN+JORU3lyU65s9R1064aZ1jKfWfkc+SxbOlNEh23CvIAOeg"}}]},{"gateway":"us-va.gw.ivpn.net","country_code":"US","country":"United States","city":"Ashburn, VA","latitude":39.0437,"longitude":-77.4875,"isp":"Datapacket","hosts":[{"hostname":"us-va1.gw.ivpn.net","dns_name":"us-va1.gw.ivpn.net","host":"37.19.206.105","load":35.87,"multihop_port":27701,"obfs":{"obfs3_multihop_port":27702,"obfs4_multihop_port":27703,"obfs4_key":"5Lk8BSID+M9QAGSglQTrYkom+V0mkIv0HgR80+9vKCcnZOu0f+aJhfOXqKnpHarJbIEHCw"}}]},{"gateway":"us-wa.gw.ivpn.net","country_code":"US","country":"United States","city":"Seattle, WA","latitude":47.6211,"longitude":-122.3244,"isp":"Tzulo","hosts":[{"hostname":"us-wa2.gw.ivpn.net","dns_name":"us-wa2.gw.ivpn.net","host":"198.44.131.3","load":11.71,"multihop_port":27801,"obfs":{"obfs3_multihop_port":27802,"obfs4_multihop_port":27803,"obfs4_key":"9h0W5BTzGSDpY2tGjdvViSJfEkT/BuwHS0cnFX07cEj3RRDtmxsC0f+kapO8+Kh+fz1XMQ"}}]},{"gateway":"za.gw.ivpn.net","country_code":"ZA","country":"South Africa","city":"Johannesburg","latitude":-26.195,"longitude":28.034,"isp":"Datapacket","hosts":[{"hostname":"za1.gw.ivpn.net","dns_name":"za1.gw.ivpn.net","host":"169.150.238.103","load":6.26,"multihop_port":20840,"obfs":{"obfs3_multihop_port":20841,"obfs4_multihop_port":20842,"obfs4_key":"vM1zdiOMhoqMKZCOi/lMj7TfWJb5/UsM25p8FE/AUezwbYWhUkhpD5RbXBOBDNhZuYzPGA"}}]}],"config":{"antitracker":{"default":{"ip":"10.0.254.2","multihop-ip":"10.0.254.102"},"hardcore":{"ip":"10.0.254.3","multihop-ip":"10.0.254.103"}},"api":{"ips":["198.50.177.220","149.56.162.156","198.50.177.222","149.56.162.159","198.50.177.223"],"ipv6s":["2607:5300:203:1735::8888","2607:5300:203:1735::8","2607:5300:203:1735:6580:7300:0:aaaa"]},"ports":{"openvpn":[{"type":"UDP","port":53},{"type":"UDP","port":80},{"type":"UDP","range":{"min":5500,"max":19999}},{"type":"UDP","range":{"min":60000,"max":65000}},{"type":"UDP","port":123},{"type":"UDP","port":2049},{"type":"UDP","range":{"min":50000,"max":59999}},{"type":"UDP","port":2050},{"type":"UDP","range":{"min":40000,"max":49999}},{"type":"UDP","port":443},{"type":"UDP","port":1194},{"type":"UDP","range":{"min":30000,"max":39999}},{"type":"TCP","port":80},{"type":"TCP","port":443},{"type":"TCP","port":1194},{"type":"TCP","port":2049},{"type":"TCP","port":2050},{"type":"TCP","port":30587},{"type":"TCP","port":41893},{"type":"TCP","port":48574},{"type":"TCP","port":58237},{"type":"TCP","range":{"min":5500,"max":19999}},{"type":"TCP","range":{"min":30000,"max":65000}}],"wireguard":[{"type":"UDP","port":53},{"type":"UDP","port":80},{"type":"UDP","port":123},{"type":"UDP","port":443},{"type":"UDP","port":500},{"type":"UDP","port":1194},{"type":"UDP","port":2049},{"type":"UDP","port":2050},{"type":"UDP","port":4500},{"type":"UDP","port":30587},{"type":"UDP","port":41893},{"type":"UDP","port":48574},{"type":"UDP","port":58237},{"type":"UDP","range":{"min":5500,"max":19999}},{"type":"UDP","range":{"min":30000,"max":65000}}],"obfs3":{"port":5145},"obfs4":{"port":5146}}}} diff --git a/IVPNClient/Config/staging.template.xcconfig b/IVPNClient/Config/staging.template.xcconfig index 62ddcc9b0..5d3881260 100644 --- a/IVPNClient/Config/staging.template.xcconfig +++ b/IVPNClient/Config/staging.template.xcconfig @@ -1,5 +1,3 @@ -#include "Pods/Target Support Files/Pods-IVPNClient/Pods-IVPNClient.release.xcconfig" - Environment = staging ApiHostName = TlsHostName = diff --git a/IVPNClient/Enums/ApiResults/GeoLookup.swift b/IVPNClient/Enums/ApiResults/GeoLookup.swift index 4d464cbbc..71a27f1b2 100644 --- a/IVPNClient/Enums/ApiResults/GeoLookup.swift +++ b/IVPNClient/Enums/ApiResults/GeoLookup.swift @@ -23,7 +23,7 @@ import Foundation -struct GeoLookup: Decodable { +struct GeoLookup: Codable { let ipAddress: String let countryCode: String @@ -38,4 +38,10 @@ struct GeoLookup: Decodable { return city == comparingModel.city && country == comparingModel.country } + func save() { + if let encoded = try? JSONEncoder().encode(self) { + UserDefaults.shared.set(encoded, forKey: UserDefaults.Key.geoLookup) + } + } + } diff --git a/IVPNClient/Managers/APIClient.swift b/IVPNClient/Managers/APIClient.swift index ab2a89c03..5b2a3bd31 100644 --- a/IVPNClient/Managers/APIClient.swift +++ b/IVPNClient/Managers/APIClient.swift @@ -194,7 +194,7 @@ class APIClient: NSObject { do { urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted) } catch let error { - print(error.localizedDescription) + } urlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type") diff --git a/IVPNClient/Managers/APIPublicKeyPin.swift b/IVPNClient/Managers/APIPublicKeyPin.swift index 345284ae2..5a4930836 100644 --- a/IVPNClient/Managers/APIPublicKeyPin.swift +++ b/IVPNClient/Managers/APIPublicKeyPin.swift @@ -77,21 +77,7 @@ class APIPublicKeyPin { var keyWithHeader = Data(rsa4096Asn1Header) keyWithHeader.append(data) - if #available(iOS 13, *) { - return Data(SHA256.hash(data: keyWithHeader)).base64EncodedString() - } else { - return sha256(keyWithHeader)?.base64EncodedString() ?? "" - } - } - - private func sha256(_ data: Data) -> Data? { - guard let res = NSMutableData(length: Int(CC_SHA256_DIGEST_LENGTH)) else { - return nil - } - - CC_SHA256((data as NSData).bytes, CC_LONG(data.count), res.mutableBytes.assumingMemoryBound(to: UInt8.self)) - - return res as Data + return Data(SHA256.hash(data: keyWithHeader)).base64EncodedString() } } diff --git a/IVPNClient/Managers/ApiService+Ext.swift b/IVPNClient/Managers/ApiService+Ext.swift index 29ebe0897..df48f346c 100644 --- a/IVPNClient/Managers/ApiService+Ext.swift +++ b/IVPNClient/Managers/ApiService+Ext.swift @@ -30,17 +30,11 @@ extension ApiService { func getServersList(storeInCache: Bool, completion: @escaping (ServersUpdateResult) -> Void) { let request = APIRequest(method: .get, path: Config.apiServersFile) - UIApplication.shared.isNetworkActivityIndicatorVisible = true - log(.info, message: "Load servers") APIClient().perform(request) { result in switch result { case .success(let response): - DispatchQueue.main.async { - UIApplication.shared.isNetworkActivityIndicatorVisible = false - } - guard Config.useDebugServers == false else { return } if let data = response.body { diff --git a/IVPNClient/Managers/ApiService.swift b/IVPNClient/Managers/ApiService.swift index c38d3fdd6..40e10eb76 100644 --- a/IVPNClient/Managers/ApiService.swift +++ b/IVPNClient/Managers/ApiService.swift @@ -47,14 +47,10 @@ class ApiService { request.queryItems = params } - UIApplication.shared.isNetworkActivityIndicatorVisible = true - log(.info, message: "\(requestName) started") APIClient().perform(request) { result in DispatchQueue.main.async { - UIApplication.shared.isNetworkActivityIndicatorVisible = false - switch result { case .success(let response): if let data = response.body { @@ -95,14 +91,10 @@ class ApiService { request.queryItems = params } - UIApplication.shared.isNetworkActivityIndicatorVisible = true - log(.info, message: "\(requestName) started") APIClient().perform(request) { result in DispatchQueue.main.async { - UIApplication.shared.isNetworkActivityIndicatorVisible = false - switch result { case .success(let response): if let data = response.body { diff --git a/IVPNClient/Managers/FileSystemManager.swift b/IVPNClient/Managers/FileSystemManager.swift index bbc42c779..2a3060175 100644 --- a/IVPNClient/Managers/FileSystemManager.swift +++ b/IVPNClient/Managers/FileSystemManager.swift @@ -158,4 +158,13 @@ class FileSystemManager { return directory.appendingPathComponent(name) } + static func tempFile(text: String, fileName: String) -> URL { + let url = FileManager.default.temporaryDirectory + .appendingPathComponent(fileName) + .appendingPathExtension("txt") + try? text.write(to: url, atomically: false, encoding: .utf8) + + return url + } + } diff --git a/IVPNClient/Managers/KeyChain.swift b/IVPNClient/Managers/KeyChain.swift index 5b591fd1f..b15934e09 100644 --- a/IVPNClient/Managers/KeyChain.swift +++ b/IVPNClient/Managers/KeyChain.swift @@ -21,6 +21,7 @@ // along with the IVPN iOS app. If not, see . // +import Foundation import KeychainAccess class KeyChain { diff --git a/IVPNClient/Managers/NavigationManager.swift b/IVPNClient/Managers/NavigationManager.swift index d51d6b16b..6986e66b9 100644 --- a/IVPNClient/Managers/NavigationManager.swift +++ b/IVPNClient/Managers/NavigationManager.swift @@ -193,4 +193,16 @@ class NavigationManager { return navController! } + static func getMTUViewController(delegate: MTUViewControllerDelegate? = nil) -> UIViewController { + let storyBoard = UIStoryboard(name: "Main", bundle: nil) + let navController = storyBoard.instantiateViewController(withIdentifier: "configureMtu") as? UINavigationController + navController?.modalPresentationStyle = .formSheet + + if let viewController = navController?.topViewController as? MTUViewController { + viewController.delegate = delegate + } + + return navController! + } + } diff --git a/IVPNClient/Managers/SessionManager.swift b/IVPNClient/Managers/SessionManager.swift index 2fa0786d8..a7c0ec0ff 100644 --- a/IVPNClient/Managers/SessionManager.swift +++ b/IVPNClient/Managers/SessionManager.swift @@ -137,6 +137,7 @@ class SessionManager { if model.serviceActive { log(.info, message: "Session status success, status: active") + UserDefaults.shared.set(true, forKey: UserDefaults.Key.isLoggedIn) self.delegate?.sessionStatusSuccess() return } diff --git a/IVPNClient/Managers/StorageManager.swift b/IVPNClient/Managers/StorageManager.swift index f2eb448fd..f7bc3742c 100644 --- a/IVPNClient/Managers/StorageManager.swift +++ b/IVPNClient/Managers/StorageManager.swift @@ -327,14 +327,17 @@ extension StorageManager { extension StorageManager { static func save(server: VPNServer, isFastestEnabled: Bool) { - if let server = fetchServer(server: server) { - server.isFastestEnabled = isFastestEnabled - } else { - let newServer = Server(context: context) - newServer.gateway = server.gateway.replacingOccurrences(of: ".wg.", with: ".gw.") - newServer.isFastestEnabled = isFastestEnabled + if let servers = fetchServers(gateway: server.gateway, isHost: false) { + if let server = servers.first { + server.isFastestEnabled = isFastestEnabled + saveContext() + return + } } + let newServer = Server(context: context) + newServer.gateway = server.gateway.replacingOccurrences(of: ".wg.", with: ".gw.") + newServer.isFastestEnabled = isFastestEnabled saveContext() } @@ -376,8 +379,10 @@ extension StorageManager { } static func isFastestEnabled(server vpnServer: VPNServer) -> Bool { - if let server = fetchServer(server: vpnServer) { - return server.isFastestEnabled + if let servers = fetchServers(gateway: vpnServer.gateway, isHost: false) { + if let server = servers.first { + return server.isFastestEnabled + } } return false diff --git a/IVPNClient/Managers/VPNManager.swift b/IVPNClient/Managers/VPNManager.swift index 27d490f54..5b2086284 100644 --- a/IVPNClient/Managers/VPNManager.swift +++ b/IVPNClient/Managers/VPNManager.swift @@ -24,7 +24,8 @@ import Foundation import NetworkExtension import UIKit -import TunnelKit +import TunnelKitCore +import TunnelKitOpenVPN class VPNManager { @@ -239,13 +240,17 @@ class VPNManager { case .openvpn: self.disable(tunnelType: .ipsec) { _ in self.disable(tunnelType: .wireguard) { _ in - self.setup(settings: settings, accessDetails: accessDetails, status: .disconnected) { _ in } + self.setup(settings: settings, accessDetails: accessDetails, status: .disconnected) { _ in + self.disconnect(tunnelType: .openvpn) + } } } case .wireguard: self.disable(tunnelType: .ipsec) { _ in self.disable(tunnelType: .openvpn) { _ in - self.setup(settings: settings, accessDetails: accessDetails, status: .disconnected) { _ in } + self.setup(settings: settings, accessDetails: accessDetails, status: .disconnected) { _ in + self.disconnect(tunnelType: .wireguard) + } } } } @@ -264,7 +269,9 @@ class VPNManager { func disconnect(tunnelType: TunnelType, reconnectAutomatically: Bool = false) { getManagerFor(tunnelType: tunnelType) { manager in - manager.connection.stopVPNTunnel() + DispatchQueue.async { + manager.connection.stopVPNTunnel() + } if !UserDefaults.shared.networkProtectionEnabled || reconnectAutomatically { self.removeOnDemandRule(manager: manager) @@ -384,7 +391,7 @@ class VPNManager { } do { - try session.sendProviderMessage(OpenVPNTunnelProvider.Message.requestLog.data) { data in + try session.sendProviderMessage(OpenVPNProvider.Message.requestLog.data) { data in guard let data = data, !data.isEmpty else { completion(nil) return diff --git a/IVPNClient/Models/Authentication.swift b/IVPNClient/Models/Authentication.swift index a0b815263..f0d33b010 100644 --- a/IVPNClient/Models/Authentication.swift +++ b/IVPNClient/Models/Authentication.swift @@ -47,8 +47,11 @@ class Authentication { // MARK: - Methods - func logIn(session: Session) { - guard session.token != nil, session.vpnUsername != nil, session.vpnPassword != nil else { return } + guard session.token != nil, session.vpnUsername != nil, session.vpnPassword != nil else { + return + } + UserDefaults.shared.set(true, forKey: UserDefaults.Key.isLoggedIn) KeyChain.save(session: session) } @@ -57,6 +60,7 @@ class Authentication { FileSystemManager.clearSession() Application.shared.clearSession() UserDefaults.shared.set(false, forKey: UserDefaults.Key.networkProtectionEnabled) + UserDefaults.shared.set(false, forKey: UserDefaults.Key.isLoggedIn) if deleteSettings { StorageManager.clearSession() diff --git a/IVPNClient/Models/SecureDNS.swift b/IVPNClient/Models/SecureDNS.swift index 1fb60bb8c..b2d9af2b6 100644 --- a/IVPNClient/Models/SecureDNS.swift +++ b/IVPNClient/Models/SecureDNS.swift @@ -30,9 +30,7 @@ struct SecureDNS: Codable { if let address = address { serverURL = DNSProtocolType.getServerURL(address: address) serverName = DNSProtocolType.getServerName(address: address) - if #available(iOS 14.0, *) { - DNSManager.saveResolvedDNS(server: DNSProtocolType.getServerToResolve(address: address), key: UserDefaults.Key.resolvedDNSOutsideVPN) - } + DNSManager.saveResolvedDNS(server: DNSProtocolType.getServerToResolve(address: address), key: UserDefaults.Key.resolvedDNSOutsideVPN) } else { serverURL = nil serverName = nil diff --git a/IVPNClient/Models/ServiceStatus.swift b/IVPNClient/Models/ServiceStatus.swift index cc3ad9af8..d27157b2e 100644 --- a/IVPNClient/Models/ServiceStatus.swift +++ b/IVPNClient/Models/ServiceStatus.swift @@ -28,8 +28,7 @@ struct ServiceStatus: Codable { // MARK: - Properties - var isActive: Bool - #warning("currentPlan should not be optional, change this after API is fixed") - var currentPlan: String? + var currentPlan: String var activeUntil: Int? var isOnFreeTrial: Bool? var username: String? @@ -42,7 +41,7 @@ struct ServiceStatus: Codable { init() { let service = ServiceStatus.load() isActive = service?.isActive ?? true - currentPlan = service?.currentPlan ?? nil + currentPlan = service?.currentPlan ?? "" activeUntil = service?.activeUntil ?? nil isOnFreeTrial = service?.isOnFreeTrial ?? false username = service?.username ?? nil @@ -116,9 +115,6 @@ struct ServiceStatus: Codable { func isLegacyAccount() -> Bool { let accountId = KeyChain.username ?? "" - guard let currentPlan = currentPlan else { - return false - } if accountId.hasPrefix("ivpn") && currentPlan.hasPrefix("IVPN Pro") && currentPlan != "IVPN Pro" { return true diff --git a/IVPNClient/Models/Settings.swift b/IVPNClient/Models/Settings.swift index ffee1f377..778ed4637 100644 --- a/IVPNClient/Models/Settings.swift +++ b/IVPNClient/Models/Settings.swift @@ -122,11 +122,13 @@ class Settings { // MARK: - Methods - func updateSelectedServerForMultiHop(isEnabled: Bool) { - if isEnabled && Application.shared.settings.selectedServer.fastest { + let selectedServer = Application.shared.settings.selectedServer + if isEnabled, selectedServer.fastest, selectedServer == Application.shared.settings.selectedExitServer { if let server = Application.shared.serverList.getServers().first { server.fastest = false Application.shared.settings.selectedServer = server Application.shared.settings.selectedExitServer = Application.shared.serverList.getExitServer(entryServer: server) + Application.shared.settings.selectedExitHost = nil } } @@ -147,6 +149,7 @@ class Settings { func saveConnectionProtocol() { UserDefaults.standard.set(connectionProtocol.formatSave(), forKey: UserDefaults.Key.selectedProtocol) + UserDefaults.shared.set(connectionProtocol.formatSave(), forKey: UserDefaults.Key.selectedProtocol) } } diff --git a/IVPNClient/Models/VPNServer.swift b/IVPNClient/Models/VPNServer.swift index 72ad2f4b2..217c87294 100644 --- a/IVPNClient/Models/VPNServer.swift +++ b/IVPNClient/Models/VPNServer.swift @@ -27,6 +27,11 @@ import CoreLocation class VPNServer { + static let validMultiHopCountryTitle = "Entry and exit servers located in the same country" + static let validMultiHopCountryMessage = "Using Multi-Hop servers from the same country may decrease your privacy." + static let validMultiHopISPTitle = "Entry and exit servers are operated by the same ISP" + static let validMultiHopISPMessage = "Using Multi-Hop servers operated by the same ISP may decrease your privacy." + // MARK: - Properties - var pingMs: Int? @@ -92,6 +97,7 @@ class VPNServer { private (set) var city: String private (set) var latitude: Double private (set) var longitude: Double + private (set) var isp: String private (set) var ipAddresses: [String] private (set) var hosts: [Host] private (set) var load: Double? @@ -100,7 +106,7 @@ class VPNServer { // MARK: - Initialize - - init(gateway: String, dnsName: String? = nil, countryCode: String, country: String, city: String, latitude: Double = 0, longitude: Double = 0, ipAddresses: [String] = [], hosts: [Host] = [], fastest: Bool = false, load: Double = 0, ipv6: IPv6? = nil) { + init(gateway: String, dnsName: String? = nil, countryCode: String, country: String, city: String, latitude: Double = 0, longitude: Double = 0, isp: String = "", ipAddresses: [String] = [], hosts: [Host] = [], fastest: Bool = false, load: Double = 0, ipv6: IPv6? = nil) { self.gateway = gateway self.dnsName = dnsName self.countryCode = countryCode @@ -108,6 +114,7 @@ class VPNServer { self.city = city self.latitude = latitude self.longitude = longitude + self.isp = isp self.ipAddresses = ipAddresses self.hosts = hosts self.fastest = fastest @@ -138,5 +145,44 @@ class VPNServer { static func == (lhs: VPNServer, rhs: VPNServer) -> Bool { return lhs.city == rhs.city && lhs.countryCode == rhs.countryCode } + + static func validMultiHop(_ first: VPNServer, _ second: VPNServer) -> Bool { + guard UserDefaults.shared.isMultiHop else { + return true + } + guard !(first == second) else { + return false + } + + return true + } + + static func validMultiHopCountry(_ first: VPNServer, _ second: VPNServer, ignoreSettings: Bool = false) -> Bool { + guard UserDefaults.shared.isMultiHop else { + return true + } + guard UserDefaults.standard.preventSameCountryMultiHop || ignoreSettings else { + return true + } + guard first.country != second.country else { + return false + } + + return true + } + + static func validMultiHopISP(_ first: VPNServer, _ second: VPNServer, ignoreSettings: Bool = false) -> Bool { + guard UserDefaults.shared.isMultiHop else { + return true + } + guard UserDefaults.standard.preventSameISPMultiHop || ignoreSettings else { + return true + } + guard first.isp != second.isp else { + return false + } + + return true + } } diff --git a/IVPNClient/Models/VPNServerList.swift b/IVPNClient/Models/VPNServerList.swift index 67ccd9581..9a349b98e 100644 --- a/IVPNClient/Models/VPNServerList.swift +++ b/IVPNClient/Models/VPNServerList.swift @@ -236,7 +236,7 @@ class VPNServerList { } for host in server.hosts { - allHosts.append(VPNServer(gateway: host.hostName, dnsName: host.dnsName, countryCode: server.countryCode, country: "", city: server.city, load: host.load, ipv6: host.ipv6)) + allHosts.append(VPNServer(gateway: host.hostName, dnsName: host.dnsName, countryCode: server.countryCode, country: "", city: server.city, isp: server.isp, load: host.load, ipv6: host.ipv6)) } } @@ -281,19 +281,17 @@ class VPNServerList { return Application.shared.settings.selectedServer } - return servers.min { + let server = servers.min { let leftPingMs = $0.pingMs ?? -1 let rightPingMs = $1.pingMs ?? -1 if rightPingMs < 0 && leftPingMs >= 0 { return true } return leftPingMs < rightPingMs && leftPingMs > -1 } - } - - func validateServer(firstServer: VPNServer, secondServer: VPNServer) -> Bool { - guard UserDefaults.shared.isMultiHop else { return true } - guard firstServer.countryCode != secondServer.countryCode else { return false } - return true + server?.fastest = true + server?.random = false + + return server } func getExitServer(entryServer: VPNServer) -> VPNServer { @@ -308,7 +306,11 @@ class VPNServerList { var list = [VPNServer]() let serverToValidate = isExitServer ? Application.shared.settings.selectedServer : Application.shared.settings.selectedExitServer - list = servers.filter { Application.shared.serverList.validateServer(firstServer: $0, secondServer: serverToValidate) } + list = servers.filter { + VPNServer.validMultiHop($0, serverToValidate) && + VPNServer.validMultiHopCountry($0, serverToValidate, ignoreSettings: true) && + VPNServer.validMultiHopISP($0, serverToValidate, ignoreSettings: true) + } if let randomServer = list.randomElement() { randomServer.fastest = false @@ -400,6 +402,7 @@ class VPNServerList { city: server["city"] as? String ?? "", latitude: server["latitude"] as? Double ?? 0, longitude: server["longitude"] as? Double ?? 0, + isp: server["isp"] as? String ?? "", ipAddresses: serverIpList, hosts: serverHostsList ) diff --git a/IVPNClient/Models/WireGuard/Interface.swift b/IVPNClient/Models/WireGuard/Interface.swift index c65d7d625..8310f3802 100644 --- a/IVPNClient/Models/WireGuard/Interface.swift +++ b/IVPNClient/Models/WireGuard/Interface.swift @@ -30,6 +30,7 @@ struct Interface { var addresses: String? var listenPort: Int + var mtu: Int? var privateKey: String? var dns: String? @@ -49,9 +50,10 @@ struct Interface { // MARK: - Initialize - - init(addresses: String? = nil, listenPort: Int = 0, privateKey: String? = nil, dns: String? = nil) { + init(addresses: String? = nil, listenPort: Int = 0, mtu: Int = 0, privateKey: String? = nil, dns: String? = nil) { self.addresses = addresses self.listenPort = listenPort + self.mtu = mtu self.privateKey = privateKey self.dns = dns } diff --git a/IVPNClient/Models/WireGuard/Tunnel.swift b/IVPNClient/Models/WireGuard/Tunnel.swift index 67ebf5542..29f82b9d0 100644 --- a/IVPNClient/Models/WireGuard/Tunnel.swift +++ b/IVPNClient/Models/WireGuard/Tunnel.swift @@ -51,6 +51,7 @@ struct Tunnel { providerConfiguration[PCKeys.endpoints.rawValue] = peers?.array.compactMap {($0 as? Peer)?.endpoint}.joined(separator: ", ") providerConfiguration[PCKeys.dns.rawValue] = interface?.dns providerConfiguration[PCKeys.addresses.rawValue] = interface?.addresses + providerConfiguration[PCKeys.mtu.rawValue] = interface?.mtu var settingsString = "replace_peers=true\n" diff --git a/IVPNClient/Scenes/Base.lproj/Main.storyboard b/IVPNClient/Scenes/Base.lproj/Main.storyboard index 0fbb5b94a..f58026eb4 100644 --- a/IVPNClient/Scenes/Base.lproj/Main.storyboard +++ b/IVPNClient/Scenes/Base.lproj/Main.storyboard @@ -1,9 +1,9 @@ - + - + @@ -21,7 +21,7 @@ - +