From 1abf1a0a56e1946270d4bccb5a2346bb3f521b95 Mon Sep 17 00:00:00 2001 From: harvey186 Date: Thu, 24 Oct 2024 12:58:52 +0200 Subject: [PATCH] new icons --- .editorconfig | 12 + .gitignore | 34 + .gitlab-ci.yml | 93 +++ .gitmodules | 3 + .sign/debug.keystore | Bin 0 -> 2473 bytes .sign/platform.jks | Bin 0 -> 2899 bytes DEVELOPMENT.md | 90 +++ LICENSE | 674 ++++++++++++++++++ README.md | 161 +++++ app/.gitignore | 1 + app/build.gradle | 184 +++++ app/eos/release/output-metadata.json | 20 + app/libs/lineage-sdk.jar | Bin 0 -> 430252 bytes app/proguard-rules.pro | 21 + app/src/main/AndroidManifest.xml | 106 +++ app/src/main/assets/e_trackers.json | 1 + app/src/main/ic_launcher-playstore.png | Bin 0 -> 90574 bytes .../AdvancedPrivacyApplication.kt | 77 ++ .../e/advancedprivacy/KoinModule.kt | 204 ++++++ .../e/advancedprivacy/Notifications.kt | 190 +++++ .../common/BigNumberFormatter.kt | 26 + .../advancedprivacy/common/BindingAdapter.kt | 33 + .../common/BootCompletedReceiver.kt | 45 ++ .../e/advancedprivacy/common/BuildFlavor.kt | 22 + .../common/NavToolbarFragment.kt | 58 ++ .../common/RightRadioButton.kt | 43 ++ .../advancedprivacy/common/TextViewHelpers.kt | 55 ++ .../e/advancedprivacy/common/ThrottleFlow.kt | 36 + .../e/advancedprivacy/common/WarningDialog.kt | 166 +++++ .../common/extensions/IntExtensions.kt | 25 + .../common/extensions/ViewPager2Extensions.kt | 43 ++ .../data/repositories/CityDataSource.kt | 46 ++ .../repositories/LocalStateRepositoryImpl.kt | 188 +++++ .../data/repositories/ResourcesRepository.kt | 47 ++ .../domain/entities/FeatureMode.kt | 24 + .../domain/entities/TrackersAndAppsLists.kt | 36 + .../entities/TrackersPeriodicStatistics.kt | 27 + .../domain/usecases/AppTrackersUseCase.kt | 74 ++ .../usecases/FakeLocationForAppUseCase.kt | 65 ++ .../usecases/FakeLocationStateUseCase.kt | 115 +++ .../usecases/GetQuickPrivacyStateUseCase.kt | 70 ++ .../usecases/IpScramblingStateUseCase.kt | 102 +++ .../domain/usecases/ListenLocationUseCase.kt | 129 ++++ .../usecases/ShowFeaturesWarningUseCase.kt | 55 ++ .../domain/usecases/TrackerDetailsUseCase.kt | 66 ++ .../usecases/TrackersAndAppsListsUseCase.kt | 134 ++++ .../domain/usecases/TrackersScreenUseCase.kt | 50 ++ .../domain/usecases/TrackersStateUseCase.kt | 67 ++ .../usecases/TrackersStatisticsUseCase.kt | 184 +++++ .../FakeLocationContentProvider.kt | 78 ++ .../features/dashboard/DashboardFragment.kt | 252 +++++++ .../features/dashboard/DashboardState.kt | 34 + .../features/dashboard/DashboardViewModel.kt | 163 +++++ .../dashboard/ShameListsTabPagerAdapter.kt | 185 +++++ .../InternetPrivacyFragment.kt | 174 +++++ .../internetprivacy/InternetPrivacyState.kt | 31 + .../InternetPrivacyViewModel.kt | 147 ++++ .../internetprivacy/ToggleAppsAdapter.kt | 77 ++ .../features/location/FakeLocationFragment.kt | 446 ++++++++++++ .../features/location/FakeLocationMapView.kt | 55 ++ .../features/location/FakeLocationState.kt | 32 + .../location/FakeLocationViewModel.kt | 131 ++++ .../features/trackers/ListsTabPagerAdapter.kt | 191 +++++ .../trackers/TrackerControlDisclaimer.kt | 83 +++ .../features/trackers/TrackersFragment.kt | 171 +++++ .../trackers/TrackersPeriodAdapter.kt | 37 + .../trackers/TrackersPeriodFragment.kt | 199 ++++++ .../trackers/TrackersPeriodViewModel.kt | 121 ++++ .../features/trackers/TrackersState.kt | 72 ++ .../features/trackers/TrackersViewModel.kt | 83 +++ .../apptrackers/AppTrackersFragment.kt | 180 +++++ .../trackers/apptrackers/AppTrackersState.kt | 36 + .../apptrackers/AppTrackersViewModel.kt | 154 ++++ .../apptrackers/ToggleTrackersAdapter.kt | 87 +++ .../features/trackers/graph/GraphHolder.kt | 299 ++++++++ .../trackers/graph/PeriodMarkerView.kt | 124 ++++ .../trackerdetails/TrackerAppsAdapter.kt | 66 ++ .../trackerdetails/TrackerDetailsFragment.kt | 151 ++++ .../trackerdetails/TrackerDetailsState.kt | 32 + .../trackerdetails/TrackerDetailsViewModel.kt | 134 ++++ .../e/advancedprivacy/main/MainActivity.kt | 39 + .../e/advancedprivacy/widget/Widget.kt | 147 ++++ .../widget/WidgetCommandReceiver.kt | 57 ++ .../e/advancedprivacy/widget/WidgetUI.kt | 273 +++++++ app/src/main/res/color/chip_background.xml | 22 + app/src/main/res/color/chip_text.xml | 22 + app/src/main/res/drawable/bg_outlined.xml | 22 + app/src/main/res/drawable/bg_rounded_19.xml | 23 + .../res/drawable/bg_stroke_rounded_12.xml | 21 + .../main/res/drawable/bg_stroke_rounded_8.xml | 21 + app/src/main/res/drawable/bg_tag.xml | 22 + app/src/main/res/drawable/bg_widget.xml | 28 + app/src/main/res/drawable/ic_apps_24.xml | 26 + .../ic_apps_compatibility_components.xml | 18 + app/src/main/res/drawable/ic_block_24.xml | 26 + .../res/drawable/ic_chevron_right_24dp.xml | 27 + app/src/main/res/drawable/ic_close.xml | 9 + app/src/main/res/drawable/ic_e_app_logo.xml | 5 + app/src/main/res/drawable/ic_fmd_bad.xml | 15 + app/src/main/res/drawable/ic_info_16dp.xml | 20 + app/src/main/res/drawable/ic_language.xml | 9 + app/src/main/res/drawable/ic_launcher.xml | 5 + .../res/drawable/ic_launcher_background.xml | 78 ++ .../res/drawable/ic_launcher_foreground.xml | 5 + .../main/res/drawable/ic_legend_blocked.xml | 22 + .../main/res/drawable/ic_legend_leaked.xml | 21 + .../res/drawable/ic_notification_logo.xml | 33 + app/src/main/res/drawable/ic_settings.xml | 10 + app/src/main/res/drawable/ic_shield_alert.xml | 15 + .../drawable/ic_switch_disabled_raster.png | Bin 0 -> 4651 bytes .../res/drawable/ic_switch_enabled_raster.png | Bin 0 -> 4601 bytes app/src/main/res/drawable/ic_valid.xml | 10 + app/src/main/res/drawable/part_square.xml | 34 + app/src/main/res/drawable/part_triangle.xml | 41 ++ .../main/res/drawable/pill_shape_tab_bg.xml | 22 + .../res/drawable/pill_shape_tab_indicator.xml | 21 + .../res/drawable/pill_shape_tab_selected.xml | 22 + .../res/drawable/widget_large_preview.xml | 124 ++++ app/src/main/res/layout/activity_main.xml | 27 + .../layout/alertdialog_do_not_show_again.xml | 32 + .../main/res/layout/apptrackers_fragment.xml | 170 +++++ .../apptrackers_item_tracker_toggle.xml | 45 ++ app/src/main/res/layout/chart_tooltip.xml | 66 ++ .../layout/dashboard_item_submenu_button.xml | 107 +++ .../main/res/layout/dashboard_shame_list.xml | 46 ++ .../res/layout/disclaimer_block_trackers.xml | 33 + .../main/res/layout/fragment_dashboard.xml | 183 +++++ .../res/layout/fragment_fake_location.xml | 190 +++++ .../fragment_internet_activity_policy.xml | 119 ++++ app/src/main/res/layout/fragment_trackers.xml | 74 ++ .../main/res/layout/highlight_data_number.xml | 61 ++ .../layout/ipscrambling_item_selectmode.xml | 57 ++ app/src/main/res/layout/item_app_toggle.xml | 37 + app/src/main/res/layout/topbar.xml | 37 + .../res/layout/trackerdetails_fragment.xml | 135 ++++ .../main/res/layout/trackers_apps_list.xml | 47 ++ app/src/main/res/layout/trackers_item_app.xml | 84 +++ .../main/res/layout/trackers_item_graph.xml | 169 +++++ app/src/main/res/layout/trackers_list.xml | 24 + .../res/layout/trackers_period_fragment.xml | 61 ++ app/src/main/res/layout/widget_large.xml | 267 +++++++ app/src/main/res/layout/widget_narrow.xml | 254 +++++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../main/res/mipmap-hdpi/ic_e_app_logo.webp | Bin 0 -> 11726 bytes app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 4538 bytes .../mipmap-hdpi/ic_launcher_foreground.webp | Bin 0 -> 5080 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 6652 bytes .../main/res/mipmap-mdpi/ic_e_app_logo.webp | Bin 0 -> 6342 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 2572 bytes .../mipmap-mdpi/ic_launcher_foreground.webp | Bin 0 -> 3202 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 3774 bytes .../main/res/mipmap-xhdpi/ic_e_app_logo.webp | Bin 0 -> 19000 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 6308 bytes .../mipmap-xhdpi/ic_launcher_foreground.webp | Bin 0 -> 7140 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 9274 bytes .../main/res/mipmap-xxhdpi/ic_e_app_logo.webp | Bin 0 -> 36808 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 9550 bytes .../mipmap-xxhdpi/ic_launcher_foreground.webp | Bin 0 -> 11798 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 13092 bytes .../res/mipmap-xxxhdpi/ic_e_app_logo.webp | Bin 0 -> 60572 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 12636 bytes .../ic_launcher_foreground.webp | Bin 0 -> 17314 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 18240 bytes app/src/main/res/navigation/nav_graph.xml | 100 +++ app/src/main/res/values-de/strings.xml | 155 ++++ app/src/main/res/values-en-rUS/strings.xml | 25 + app/src/main/res/values-es/strings.xml | 155 ++++ app/src/main/res/values-fi/strings.xml | 153 ++++ app/src/main/res/values-fr/strings.xml | 153 ++++ app/src/main/res/values-in/strings.xml | 2 + app/src/main/res/values-is/strings.xml | 155 ++++ app/src/main/res/values-it/strings.xml | 153 ++++ app/src/main/res/values-ja/strings.xml | 119 ++++ app/src/main/res/values-nb-rNO/strings.xml | 153 ++++ app/src/main/res/values-night/bools.xml | 20 + app/src/main/res/values-nl/strings.xml | 69 ++ app/src/main/res/values-ru/strings.xml | 153 ++++ app/src/main/res/values-sv/strings.xml | 155 ++++ app/src/main/res/values-uk/strings.xml | 148 ++++ app/src/main/res/values/bools.xml | 20 + app/src/main/res/values/colors.xml | 59 ++ app/src/main/res/values/dimens.xml | 5 + app/src/main/res/values/strings.xml | 221 ++++++ app/src/main/res/values/themes.xml | 34 + app/src/main/res/xml/widget_info.xml | 34 + .../standalone/res/values-night/colors.xml | 28 + app/src/standalone/res/values/colors.xml | 27 + app/src/standalone/res/values/strings.xml | 3 + .../e/advancedprivacy/ExampleUnitTest.kt | 33 + build.gradle | 117 +++ core/.gitignore | 1 + core/build.gradle | 60 ++ core/consumer-rules.pro | 0 core/proguard-rules.pro | 21 + core/src/main/AndroidManifest.xml | 20 + .../e/advancedprivacy/core/KoinModule.kt | 38 + .../core/utils/BroadcastReceiverUtils.kt | 39 + .../core/utils/CoroutinesUtils.kt | 43 ++ .../core/utils/NotificationsHelper.kt | 32 + .../core/utils/PreferenceDataStoreUtils.kt | 56 ++ .../data/repositories/AppListRepository.kt | 345 +++++++++ .../domain/entities/AppOpModes.kt | 47 ++ .../domain/entities/ApplicationDescription.kt | 52 ++ .../domain/entities/DisplayableApp.kt | 30 + .../domain/entities/FeatureState.kt | 28 + .../domain/entities/LocationMode.kt | 24 + .../domain/entities/MainFeatures.kt | 33 + .../domain/entities/NotificationChannels.kt | 27 + .../domain/entities/NotificationContent.kt | 27 + .../domain/entities/PermissionDescription.kt | 26 + .../domain/entities/ToggleableApp.kt | 23 + .../repositories/LocalStateRepository.kt | 73 ++ .../domain/usecases/VpnSupervisorUseCase.kt | 27 + .../permissions/IPermissionsPrivacyModule.kt | 134 ++++ .../PermissionsPrivacyModuleBase.kt | 153 ++++ .../servicesupervisors/FeatureSupervisor.kt | 27 + detekt.yml | 22 + gradle.properties | 23 + gradle/libs.versions.toml | 61 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 172 +++++ gradlew.bat | 84 +++ hooks/pre-commit | 46 ++ hooks/setup-hooks | 4 + ipscrambling/.gitignore | 1 + ipscrambling/Orbot_LICENSE | 206 ++++++ ipscrambling/README.md | 42 ++ ipscrambling/build.gradle | 59 ++ ipscrambling/commons.gradle | 12 + ipscrambling/consumer-rules.pro | 0 ipscrambling/dependencies.gradle | 60 ++ ipscrambling/exportdependencies/pom.xml | 24 + .../exportdependencies/publish.gradle | 52 ++ .../exportdependencies/update_dependencies.md | 43 ++ ipscrambling/proguard-rules.pro | 21 + ipscrambling/src/main/AndroidManifest.xml | 25 + .../advancedprivacy/ipscrambler/KoinModule.kt | 25 + .../ipscrambler/OrbotSupervisor.kt | 323 +++++++++ load-properties.gradle | 33 + permissionseos/.gitignore | 1 + permissionseos/build.gradle | 33 + permissionseos/consumer-rules.pro | 0 .../libs/hidden-apis-stub/.gitignore | 1 + .../libs/hidden-apis-stub/build.gradle | 36 + .../src/main/AndroidManifest.xml | 23 + .../main/java/android/app/AppOpsManager.java | 48 ++ .../java/android/app/NotificationChannel.java | 37 + .../android/content/pm/PackageManager.java | 111 +++ .../java/android/content/pm/UserInfo.java | 37 + .../android/net/IConnectivityManager.java | 65 ++ .../src/main/java/android/net/VpnManager.java | 64 ++ .../main/java/android/os/ServiceManager.java | 35 + .../src/main/java/android/os/UserHandle.java | 36 + .../src/main/java/android/os/UserManager.java | 55 ++ permissionseos/proguard-rules.pro | 21 + permissionseos/src/main/AndroidManifest.xml | 58 ++ .../PermissionsPrivacyModuleImpl.kt | 239 +++++++ permissionsstandalone/.gitignore | 1 + permissionsstandalone/build.gradle | 55 ++ permissionsstandalone/consumer-rules.pro | 0 permissionsstandalone/proguard-rules.pro | 21 + .../src/main/AndroidManifest.xml | 22 + .../PermissionsPrivacyModuleImpl.kt | 60 ++ ...rmissions-foundation.e.advancedprivacy.xml | 10 + settings.gradle | 32 + trackers/build.gradle | 59 ++ trackers/src/main/AndroidManifest.xml | 20 + .../e/advancedprivacy/trackers/KoinModule.kt | 59 ++ .../trackers/data/ETrackersResponse.kt | 27 + .../data/RemoteTrackersListRepository.kt | 61 ++ .../trackers/data/StatsDatabase.kt | 574 +++++++++++++++ .../trackers/data/TrackersRepository.kt | 109 +++ .../trackers/data/WhitelistRepository.kt | 347 +++++++++ .../trackers/domain/entities/Tracker.kt | 28 + .../externalinterfaces/TrackersSupervisor.kt | 27 + .../domain/usecases/FilterHostnameUseCase.kt | 116 +++ .../usecases/UpdateTrackerListUseCase.kt | 46 ++ .../trackers/services/ForegroundStarter.kt | 45 ++ .../trackers/services/UpdateTrackersWorker.kt | 61 ++ trackersserviceeos/.gitignore | 1 + trackersserviceeos/build.gradle | 41 ++ trackersserviceeos/consumer-rules.pro | 0 trackersserviceeos/proguard-rules.pro | 21 + .../src/main/AndroidManifest.xml | 34 + .../trackers/service/DNSBlocker.kt | 104 +++ .../trackers/service/TrackersService.kt | 58 ++ .../trackers/service/TrackersSupervisorEos.kt | 70 ++ .../service/VpnSupervisorUseCaseEos.kt | 109 +++ trackersservicestandalone/.gitignore | 1 + trackersservicestandalone/build.gradle | 42 ++ trackersservicestandalone/consumer-rules.pro | 0 trackersservicestandalone/proguard-rules.pro | 21 + .../src/main/AndroidManifest.xml | 38 + .../trackers/service/Config.kt | 47 ++ .../trackers/service/TrackersService.kt | 120 ++++ .../service/TrackersSupervisorStandalone.kt | 81 +++ .../trackers/service/TunLooper.kt | 167 +++++ .../data/NetworkDNSAddressRepository.kt | 59 ++ .../service/data/RequestDNSRepository.kt | 48 ++ .../service/usecases/ResolveDNSUseCase.kt | 77 ++ .../VpnSupervisorUseCaseStandalone.kt | 155 ++++ 303 files changed, 20730 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .gitlab-ci.yml create mode 100644 .gitmodules create mode 100644 .sign/debug.keystore create mode 100644 .sign/platform.jks create mode 100644 DEVELOPMENT.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/eos/release/output-metadata.json create mode 100644 app/libs/lineage-sdk.jar create mode 100644 app/proguard-rules.pro create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/assets/e_trackers.json create mode 100644 app/src/main/ic_launcher-playstore.png create mode 100644 app/src/main/java/foundation/e/advancedprivacy/AdvancedPrivacyApplication.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/KoinModule.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/Notifications.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/common/BigNumberFormatter.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/common/BindingAdapter.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/common/BootCompletedReceiver.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/common/BuildFlavor.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/common/NavToolbarFragment.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/common/RightRadioButton.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/common/TextViewHelpers.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/common/ThrottleFlow.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/common/WarningDialog.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/common/extensions/IntExtensions.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/common/extensions/ViewPager2Extensions.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/data/repositories/CityDataSource.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/data/repositories/LocalStateRepositoryImpl.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/data/repositories/ResourcesRepository.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/domain/entities/FeatureMode.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/domain/entities/TrackersAndAppsLists.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/domain/entities/TrackersPeriodicStatistics.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/domain/usecases/AppTrackersUseCase.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/domain/usecases/FakeLocationForAppUseCase.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/domain/usecases/FakeLocationStateUseCase.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/domain/usecases/GetQuickPrivacyStateUseCase.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/domain/usecases/IpScramblingStateUseCase.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/domain/usecases/ListenLocationUseCase.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/domain/usecases/ShowFeaturesWarningUseCase.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackerDetailsUseCase.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackersAndAppsListsUseCase.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackersScreenUseCase.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackersStateUseCase.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackersStatisticsUseCase.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/externalinterfaces/contentproviders/FakeLocationContentProvider.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/dashboard/DashboardFragment.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/dashboard/DashboardState.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/dashboard/DashboardViewModel.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/dashboard/ShameListsTabPagerAdapter.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/internetprivacy/InternetPrivacyFragment.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/internetprivacy/InternetPrivacyState.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/internetprivacy/InternetPrivacyViewModel.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/internetprivacy/ToggleAppsAdapter.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationFragment.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationMapView.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationState.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationViewModel.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/trackers/ListsTabPagerAdapter.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackerControlDisclaimer.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersFragment.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersPeriodAdapter.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersPeriodFragment.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersPeriodViewModel.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersState.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersViewModel.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/trackers/apptrackers/AppTrackersFragment.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/trackers/apptrackers/AppTrackersState.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/trackers/apptrackers/AppTrackersViewModel.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/trackers/apptrackers/ToggleTrackersAdapter.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/trackers/graph/GraphHolder.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/trackers/graph/PeriodMarkerView.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/trackers/trackerdetails/TrackerAppsAdapter.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/trackers/trackerdetails/TrackerDetailsFragment.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/trackers/trackerdetails/TrackerDetailsState.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/features/trackers/trackerdetails/TrackerDetailsViewModel.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/main/MainActivity.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/widget/Widget.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/widget/WidgetCommandReceiver.kt create mode 100644 app/src/main/java/foundation/e/advancedprivacy/widget/WidgetUI.kt create mode 100644 app/src/main/res/color/chip_background.xml create mode 100644 app/src/main/res/color/chip_text.xml create mode 100644 app/src/main/res/drawable/bg_outlined.xml create mode 100644 app/src/main/res/drawable/bg_rounded_19.xml create mode 100644 app/src/main/res/drawable/bg_stroke_rounded_12.xml create mode 100644 app/src/main/res/drawable/bg_stroke_rounded_8.xml create mode 100644 app/src/main/res/drawable/bg_tag.xml create mode 100644 app/src/main/res/drawable/bg_widget.xml create mode 100644 app/src/main/res/drawable/ic_apps_24.xml create mode 100644 app/src/main/res/drawable/ic_apps_compatibility_components.xml create mode 100644 app/src/main/res/drawable/ic_block_24.xml create mode 100644 app/src/main/res/drawable/ic_chevron_right_24dp.xml create mode 100644 app/src/main/res/drawable/ic_close.xml create mode 100644 app/src/main/res/drawable/ic_e_app_logo.xml create mode 100644 app/src/main/res/drawable/ic_fmd_bad.xml create mode 100644 app/src/main/res/drawable/ic_info_16dp.xml create mode 100644 app/src/main/res/drawable/ic_language.xml create mode 100644 app/src/main/res/drawable/ic_launcher.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/ic_legend_blocked.xml create mode 100644 app/src/main/res/drawable/ic_legend_leaked.xml create mode 100644 app/src/main/res/drawable/ic_notification_logo.xml create mode 100644 app/src/main/res/drawable/ic_settings.xml create mode 100644 app/src/main/res/drawable/ic_shield_alert.xml create mode 100644 app/src/main/res/drawable/ic_switch_disabled_raster.png create mode 100644 app/src/main/res/drawable/ic_switch_enabled_raster.png create mode 100644 app/src/main/res/drawable/ic_valid.xml create mode 100644 app/src/main/res/drawable/part_square.xml create mode 100644 app/src/main/res/drawable/part_triangle.xml create mode 100644 app/src/main/res/drawable/pill_shape_tab_bg.xml create mode 100644 app/src/main/res/drawable/pill_shape_tab_indicator.xml create mode 100644 app/src/main/res/drawable/pill_shape_tab_selected.xml create mode 100644 app/src/main/res/drawable/widget_large_preview.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/alertdialog_do_not_show_again.xml create mode 100644 app/src/main/res/layout/apptrackers_fragment.xml create mode 100644 app/src/main/res/layout/apptrackers_item_tracker_toggle.xml create mode 100644 app/src/main/res/layout/chart_tooltip.xml create mode 100644 app/src/main/res/layout/dashboard_item_submenu_button.xml create mode 100644 app/src/main/res/layout/dashboard_shame_list.xml create mode 100644 app/src/main/res/layout/disclaimer_block_trackers.xml create mode 100644 app/src/main/res/layout/fragment_dashboard.xml create mode 100644 app/src/main/res/layout/fragment_fake_location.xml create mode 100644 app/src/main/res/layout/fragment_internet_activity_policy.xml create mode 100644 app/src/main/res/layout/fragment_trackers.xml create mode 100644 app/src/main/res/layout/highlight_data_number.xml create mode 100644 app/src/main/res/layout/ipscrambling_item_selectmode.xml create mode 100644 app/src/main/res/layout/item_app_toggle.xml create mode 100644 app/src/main/res/layout/topbar.xml create mode 100644 app/src/main/res/layout/trackerdetails_fragment.xml create mode 100644 app/src/main/res/layout/trackers_apps_list.xml create mode 100644 app/src/main/res/layout/trackers_item_app.xml create mode 100644 app/src/main/res/layout/trackers_item_graph.xml create mode 100644 app/src/main/res/layout/trackers_list.xml create mode 100644 app/src/main/res/layout/trackers_period_fragment.xml create mode 100644 app/src/main/res/layout/widget_large.xml create mode 100644 app/src/main/res/layout/widget_narrow.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_e_app_logo.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_e_app_logo.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_e_app_logo.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_e_app_logo.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_e_app_logo.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/navigation/nav_graph.xml create mode 100644 app/src/main/res/values-de/strings.xml create mode 100644 app/src/main/res/values-en-rUS/strings.xml create mode 100644 app/src/main/res/values-es/strings.xml create mode 100644 app/src/main/res/values-fi/strings.xml create mode 100644 app/src/main/res/values-fr/strings.xml create mode 100644 app/src/main/res/values-in/strings.xml create mode 100644 app/src/main/res/values-is/strings.xml create mode 100644 app/src/main/res/values-it/strings.xml create mode 100644 app/src/main/res/values-ja/strings.xml create mode 100644 app/src/main/res/values-nb-rNO/strings.xml create mode 100644 app/src/main/res/values-night/bools.xml create mode 100644 app/src/main/res/values-nl/strings.xml create mode 100644 app/src/main/res/values-ru/strings.xml create mode 100644 app/src/main/res/values-sv/strings.xml create mode 100644 app/src/main/res/values-uk/strings.xml create mode 100644 app/src/main/res/values/bools.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/main/res/xml/widget_info.xml create mode 100644 app/src/standalone/res/values-night/colors.xml create mode 100644 app/src/standalone/res/values/colors.xml create mode 100644 app/src/standalone/res/values/strings.xml create mode 100644 app/src/test/java/foundation/e/advancedprivacy/ExampleUnitTest.kt create mode 100644 build.gradle create mode 100644 core/.gitignore create mode 100644 core/build.gradle create mode 100644 core/consumer-rules.pro create mode 100644 core/proguard-rules.pro create mode 100644 core/src/main/AndroidManifest.xml create mode 100644 core/src/main/java/foundation/e/advancedprivacy/core/KoinModule.kt create mode 100644 core/src/main/java/foundation/e/advancedprivacy/core/utils/BroadcastReceiverUtils.kt create mode 100644 core/src/main/java/foundation/e/advancedprivacy/core/utils/CoroutinesUtils.kt create mode 100644 core/src/main/java/foundation/e/advancedprivacy/core/utils/NotificationsHelper.kt create mode 100644 core/src/main/java/foundation/e/advancedprivacy/core/utils/PreferenceDataStoreUtils.kt create mode 100644 core/src/main/java/foundation/e/advancedprivacy/data/repositories/AppListRepository.kt create mode 100644 core/src/main/java/foundation/e/advancedprivacy/domain/entities/AppOpModes.kt create mode 100644 core/src/main/java/foundation/e/advancedprivacy/domain/entities/ApplicationDescription.kt create mode 100644 core/src/main/java/foundation/e/advancedprivacy/domain/entities/DisplayableApp.kt create mode 100644 core/src/main/java/foundation/e/advancedprivacy/domain/entities/FeatureState.kt create mode 100644 core/src/main/java/foundation/e/advancedprivacy/domain/entities/LocationMode.kt create mode 100644 core/src/main/java/foundation/e/advancedprivacy/domain/entities/MainFeatures.kt create mode 100644 core/src/main/java/foundation/e/advancedprivacy/domain/entities/NotificationChannels.kt create mode 100644 core/src/main/java/foundation/e/advancedprivacy/domain/entities/NotificationContent.kt create mode 100644 core/src/main/java/foundation/e/advancedprivacy/domain/entities/PermissionDescription.kt create mode 100644 core/src/main/java/foundation/e/advancedprivacy/domain/entities/ToggleableApp.kt create mode 100644 core/src/main/java/foundation/e/advancedprivacy/domain/repositories/LocalStateRepository.kt create mode 100644 core/src/main/java/foundation/e/advancedprivacy/domain/usecases/VpnSupervisorUseCase.kt create mode 100644 core/src/main/java/foundation/e/advancedprivacy/externalinterfaces/permissions/IPermissionsPrivacyModule.kt create mode 100644 core/src/main/java/foundation/e/advancedprivacy/externalinterfaces/permissions/PermissionsPrivacyModuleBase.kt create mode 100644 core/src/main/java/foundation/e/advancedprivacy/externalinterfaces/servicesupervisors/FeatureSupervisor.kt create mode 100644 detekt.yml create mode 100644 gradle.properties create mode 100644 gradle/libs.versions.toml create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100755 hooks/pre-commit create mode 100755 hooks/setup-hooks create mode 100644 ipscrambling/.gitignore create mode 100644 ipscrambling/Orbot_LICENSE create mode 100644 ipscrambling/README.md create mode 100644 ipscrambling/build.gradle create mode 100644 ipscrambling/commons.gradle create mode 100644 ipscrambling/consumer-rules.pro create mode 100644 ipscrambling/dependencies.gradle create mode 100644 ipscrambling/exportdependencies/pom.xml create mode 100644 ipscrambling/exportdependencies/publish.gradle create mode 100644 ipscrambling/exportdependencies/update_dependencies.md create mode 100644 ipscrambling/proguard-rules.pro create mode 100644 ipscrambling/src/main/AndroidManifest.xml create mode 100644 ipscrambling/src/main/java/foundation/e/advancedprivacy/ipscrambler/KoinModule.kt create mode 100644 ipscrambling/src/main/java/foundation/e/advancedprivacy/ipscrambler/OrbotSupervisor.kt create mode 100644 load-properties.gradle create mode 100644 permissionseos/.gitignore create mode 100644 permissionseos/build.gradle create mode 100644 permissionseos/consumer-rules.pro create mode 100644 permissionseos/libs/hidden-apis-stub/.gitignore create mode 100644 permissionseos/libs/hidden-apis-stub/build.gradle create mode 100644 permissionseos/libs/hidden-apis-stub/src/main/AndroidManifest.xml create mode 100644 permissionseos/libs/hidden-apis-stub/src/main/java/android/app/AppOpsManager.java create mode 100644 permissionseos/libs/hidden-apis-stub/src/main/java/android/app/NotificationChannel.java create mode 100644 permissionseos/libs/hidden-apis-stub/src/main/java/android/content/pm/PackageManager.java create mode 100644 permissionseos/libs/hidden-apis-stub/src/main/java/android/content/pm/UserInfo.java create mode 100644 permissionseos/libs/hidden-apis-stub/src/main/java/android/net/IConnectivityManager.java create mode 100644 permissionseos/libs/hidden-apis-stub/src/main/java/android/net/VpnManager.java create mode 100644 permissionseos/libs/hidden-apis-stub/src/main/java/android/os/ServiceManager.java create mode 100644 permissionseos/libs/hidden-apis-stub/src/main/java/android/os/UserHandle.java create mode 100644 permissionseos/libs/hidden-apis-stub/src/main/java/android/os/UserManager.java create mode 100644 permissionseos/proguard-rules.pro create mode 100644 permissionseos/src/main/AndroidManifest.xml create mode 100644 permissionseos/src/main/java/foundation/e/advancedprivacy/externalinterfaces/permissions/PermissionsPrivacyModuleImpl.kt create mode 100644 permissionsstandalone/.gitignore create mode 100644 permissionsstandalone/build.gradle create mode 100644 permissionsstandalone/consumer-rules.pro create mode 100644 permissionsstandalone/proguard-rules.pro create mode 100644 permissionsstandalone/src/main/AndroidManifest.xml create mode 100644 permissionsstandalone/src/main/java/foundation/e/advancedprivacy/permissions/externalinterfaces/PermissionsPrivacyModuleImpl.kt create mode 100644 privapp-permissions-foundation.e.advancedprivacy.xml create mode 100644 settings.gradle create mode 100644 trackers/build.gradle create mode 100644 trackers/src/main/AndroidManifest.xml create mode 100644 trackers/src/main/java/foundation/e/advancedprivacy/trackers/KoinModule.kt create mode 100644 trackers/src/main/java/foundation/e/advancedprivacy/trackers/data/ETrackersResponse.kt create mode 100644 trackers/src/main/java/foundation/e/advancedprivacy/trackers/data/RemoteTrackersListRepository.kt create mode 100644 trackers/src/main/java/foundation/e/advancedprivacy/trackers/data/StatsDatabase.kt create mode 100644 trackers/src/main/java/foundation/e/advancedprivacy/trackers/data/TrackersRepository.kt create mode 100644 trackers/src/main/java/foundation/e/advancedprivacy/trackers/data/WhitelistRepository.kt create mode 100644 trackers/src/main/java/foundation/e/advancedprivacy/trackers/domain/entities/Tracker.kt create mode 100644 trackers/src/main/java/foundation/e/advancedprivacy/trackers/domain/externalinterfaces/TrackersSupervisor.kt create mode 100644 trackers/src/main/java/foundation/e/advancedprivacy/trackers/domain/usecases/FilterHostnameUseCase.kt create mode 100644 trackers/src/main/java/foundation/e/advancedprivacy/trackers/domain/usecases/UpdateTrackerListUseCase.kt create mode 100644 trackers/src/main/java/foundation/e/advancedprivacy/trackers/services/ForegroundStarter.kt create mode 100644 trackers/src/main/java/foundation/e/advancedprivacy/trackers/services/UpdateTrackersWorker.kt create mode 100644 trackersserviceeos/.gitignore create mode 100644 trackersserviceeos/build.gradle create mode 100644 trackersserviceeos/consumer-rules.pro create mode 100644 trackersserviceeos/proguard-rules.pro create mode 100644 trackersserviceeos/src/main/AndroidManifest.xml create mode 100644 trackersserviceeos/src/main/java/foundation/e/advancedprivacy/trackers/service/DNSBlocker.kt create mode 100644 trackersserviceeos/src/main/java/foundation/e/advancedprivacy/trackers/service/TrackersService.kt create mode 100644 trackersserviceeos/src/main/java/foundation/e/advancedprivacy/trackers/service/TrackersSupervisorEos.kt create mode 100644 trackersserviceeos/src/main/java/foundation/e/advancedprivacy/trackers/service/VpnSupervisorUseCaseEos.kt create mode 100644 trackersservicestandalone/.gitignore create mode 100644 trackersservicestandalone/build.gradle create mode 100644 trackersservicestandalone/consumer-rules.pro create mode 100644 trackersservicestandalone/proguard-rules.pro create mode 100644 trackersservicestandalone/src/main/AndroidManifest.xml create mode 100644 trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/Config.kt create mode 100644 trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/TrackersService.kt create mode 100644 trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/TrackersSupervisorStandalone.kt create mode 100644 trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/TunLooper.kt create mode 100644 trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/data/NetworkDNSAddressRepository.kt create mode 100644 trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/data/RequestDNSRepository.kt create mode 100644 trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/usecases/ResolveDNSUseCase.kt create mode 100644 trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/usecases/VpnSupervisorUseCaseStandalone.kt diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..ec953c0 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*.{kt,kts}] + +ktlint_code_style = android_studio +max_line_length = 140 + +# Disable rules ktlint can't fix itself with spotlessApply +ktlint_standard_no-wildcard-imports = disabled +ktlint_standard_comment-wrapping = disabled +ktlint_standard_property-naming = disabled +ktlint_standard_discouraged-comment-location = disabled \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7d06206 --- /dev/null +++ b/.gitignore @@ -0,0 +1,34 @@ +# Gradle build files +build/ +.gradle + +# Local gradle properties +local.properties + +# IntelliJ .idea folder +.idea/ + +gradle.xml +markdown-*.xml +*.iml + +# General +.DS_Store +.externalNativeBuild +.cxx + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# Built application files +*.apk +*.aar + +# Lineage test build keys +lineage_keys/ \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..5264174 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,93 @@ +stages: + - lint + - test + - build + +# By default load dev keys. +variables: + MAPBOX_KEY: $MAPBOX_KEY_DEV + SENTRY_DSN: $SENTRY_DSN + +default: + image: "registry.gitlab.e.foundation/e/os/docker-android-apps-cicd:latest" + before_script: + - export GRADLE_USER_HOME=$(pwd)/.gradle + - chmod +x ./gradlew + #tags: + # - android + cache: + key: ${CI_PROJECT_ID} + paths: + - .gradle/ + +lint: + stage: lint + script: + - ./gradlew spotlessCheck + - ./gradlew detekt + rules: + - if: $CI_PIPELINE_SOURCE == "merge_request_event" + when: on_success + - if: $CI_COMMIT_BRANCH == "main" + when: on_success + artifacts: + paths: + - build/reports/detekt/ + + +# No unit tests yet. +#unit-test: +# stage: test +# script: +# - ./gradlew :testDebugUnitTest +# rules: +# - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' +# when: on_success +# - if: $CI_COMMIT_BRANCH == "main" +# when: on_success +# artifacts: +# paths: +# - ./**/build/reports/tests/testDebugUnitTest + +build-debug: + stage: build + script: + - ./gradlew :app:assembleEosDebug + rules: + - if: $CI_PIPELINE_SOURCE == "merge_request_event" + when: on_success + artifacts: + paths: + - app/build/outputs/apk + +# Check that the release build works, but don't keep the artifacts. +build-release-test: + stage: test + script: + - ./gradlew :app:assembleEosRelease + rules: + - if: $CI_COMMIT_BRANCH == "main" + variables: + MAPBOX_KEY: $MAPBOX_KEY_PROD + when: on_success + +build-e-release: + stage: build + script: + - ./gradlew :app:assembleEosRelease + rules: + - if: $CI_PIPELINE_SOURCE == "merge_request_event" + when: never + - if: $CI_COMMIT_REF_PROTECTED == "true" && $CI_COMMIT_TAG =~ /^eOS-v\d+\.\d+(\.\d+)$/ + variables: + MAPBOX_KEY: $MAPBOX_KEY_PROD + when: on_success + - if: $CI_COMMIT_REF_PROTECTED == "true" + variables: + MAPBOX_KEY: $MAPBOX_KEY_PROD + when: manual + + artifacts: + paths: + - app/build/outputs/apk + - app/build/reports diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..077dd62 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "ipscrambling/orbotservice"] + path = ipscrambling/orbotservice + url = git@gitlab.e.foundation:e/os/orbotservice.git diff --git a/.sign/debug.keystore b/.sign/debug.keystore new file mode 100644 index 0000000000000000000000000000000000000000..8391b1eb389e9bac656985a67037a39db9ebf9d7 GIT binary patch literal 2473 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 literal 0 HcmV?d00001 diff --git a/.sign/platform.jks b/.sign/platform.jks new file mode 100644 index 0000000000000000000000000000000000000000..3c32281dd13979a033c25bbcd9c64666a7f8ca96 GIT binary patch literal 2899 zcmY+EcRUmhAIERn$|m8CD=XuinT$xbi!%-(vSlYp=Gj~0$UaJD31?C0Q^P(B|9KnvgfX7)B4$)$v_d3%xnGkmjLki{+yb^CzeAK_-%)ek{EekMgd}cHc-sxSgx_sB zBZh*9YtO`H3%P(f7oDuCt)iB$)|1SKnUeMQk2uuSi$)rCm&MJrsW|XH{R#56U)2nT zVrU!Awy9;Mr-;pJEg~NzxUnN>m*^|hm0ir;T=UB1oRa!tIT>x?%iV?C@J}3fqny46 zZRNUHH~4Eu{`LC$!u_2gfz;eOZmzC^d(6oics_)h`SEfNna7%J)Zj9%0Zh%r-C=mi ze8W(w5N7y8ZNE}Dq4nut=2I0~y66}4@u5-q$52&c-FjgFmdD&K)vb^Yt`f5H?kY;g zB;o;2&B+#?EGLo1F^||;` zK0XIJyG0B)w%j+QH~JbgpIJ@y=qz77l659 ztlwysE{;5$FePN3*MRrjZo9IO0-*E*6t|f5b|-TOaUd0QGp7Moo-@f zIR(va2))54MW^wHpbBbUu*IX6nQEW(HvOU*@wU8O*?vM%TU}PxF*jN5MFg?riFkPR z#9=9+GH}8&pxGv3?BqASaXv#QGk!9)(S?OXOl)NKL}{b?;;H4Qrv;clbvJZywCGr? zFBx%x%Cy=Iekz5ov-|33wGDK-d;iK~YrTuKflg_J_c$)ZrQGUrwe z`nyC;ML75GIdTO70q5)fKMC;vEKBuo%l7CUONz@+?MUPbRdQ;t6o^$|J^y3bFdS64 z`q^h2RBty^gIM^mFBchX`OILZA86o78k-?JWIePP@3&!aVw9D7jqnqEY-^jKAQOt( zs+~Z93*(G08WHa*y-H~(9RW8@NBxU@Jai{IWS6)_c;Np~FUiM$aA7(E3^QU*zlygH@T(qU+_}DNv<-L^&R+e8EH(zXobQ#H zUZ&(R4ofLHQB6w*Eu`w%EbFiTdU*o!#<;=rEtvlxAxh^-H6?E>!3*r(dNjOi^$H`{FLJ9Z=sz zQ&O_0Tw}NGu`XBMNMe}`|7r4lWrj?7- zB5WZstJw56<1AA$wRioBU(opLlUwmcCVZm#@l$AZ55oF8BQxmdkD>)D~Qg(6|b zbU*oO4w)~uw8idEXHn-Fw)YYFDLXtCztghCWllZUGFjOB#(b3Sj*RWEFSAyNncs&t z(4XXrv=-AXMaAc>6iI^0B3gk<c^wDS#ruU-BAS8>0JcL<<%c&6+Cff=)^ zY9a=QYn5w*5MJJ@7GAs=n3Yi%8xYxgLeSwCF|ZVU8id$@_rq$?oP6-s^vklIm}=KeRYu3p+~F{5m%08npyg`W(3=RUFaEUp z@tv?cj(azGKYxd}_UZ>wukI(;J*r<=N-qeHvDP$XS}vk7(hPK+)O0r=I+Z&fS7?CS zJtS?fe=NT*^o=EvS3v9Q*HIS9-48IG4|dyuQX(G~^1zD%>bI+yh$T6g5etpu6Khx5 zrX5SS`d^FF&)Orn@|7oYI+=@7)RX$?yWl%-K;v^^vRVPp7c_5Rxt+J_2d<8xDPQPd zg=UH=jtP+81_;ksCXe^yA$+Kf)9rM@;0!A&kZ{4KcOZ9nHK<-H5-q=l+o3Wd#LJ2-CKWE4x=Y-} z#R+LViv}`h3)iq+gYC$7({p(Y_9Z)U?CzL?ejXH1J4;sE!roKEFlRF!W`b4oU*3>o z-D5)PBE)W3mrV7I!H|k7=mB*85^p4U?lQKOC@enI>|euc<#;w7L>yi)p#TWmUV;_7^xdz#Ra%*8`i#q;n`y^0 e&Rtuz for each screen to simplify coherence. Our android app is having single activity multiple fragments, using Android Navigation component. + +The project has 2 flavors : + - eOS: for /e/OS devices, with OS specific signatures, system priviledges and persistent flag + - standalone: for app's stores, without any priviledges. + +Most of the differences between the 2 flavors are separated in distinct modules like : +- permissioneos / permissionstandalone +- trackersserviceseos / trackersservicesstandalone + +### Clean Architecture + +Clean architecture is the building block of AdvancedPrivacy. It is now a common way of organizing project, +so it helps newcomers. It gives a framework to apply Single Responsibility Principle, having a testable project +and keep files with a decent length. + + +The detailed file tree: + +**Domain** + +- entities : data classes, with no logic +- usecases : most of the logic, with no external dependencies + +**LocalRepositories** + +Repositories of data, that use local datasources, like sqlite database, sharedpreferences or in memory objects. + +**NetworkRepositories** + +Repositories of data, which fetch and push data to some remote servers. + +**InterfaceAdapters** + +All the glue to abstract Android framework (and also all it's supported versions) from the domain layer. + +- services: Android Services +- broadcastreceivers: Android Broadcast Receivers +- Android Interfaces : abstraction of framework interfaces, like private and priviledges specific API. + +**UI** +All the UI related code, with MVVM pattern. + +## Good practices + +### Use hidden-apis-stubs + +Reflexion is avoided. We use an [hidden-apis-stub](./permissionseos/libs/hidden-apis-stub) project to make Android hidden APIs available for development and compilations. +Each stubed API should be documented with link to the source code they stub, for each targeted Android version. + +### Use Coroutines and Flow + +We use Coroutines and Flow for asynchronous tasks. The previous technologies (RxJava, LiveData) to do that are not welcome :) + +### Use Koin for dependency injection + +The project use Koin for "DI". It's flexibility is helpful to cleanly separate the flavored modules. + + +## OrbotService development and maintenance + +The IpScrambling relies on a fork of OrbotService, which is a module of Orbot, the Tor proxy for Android. It lays as a submodule to help fork upgrade and patching. More here: [orbotservice/README.md](orbotservice/README.md) + +## Code Quality and Style + +It use ktlint through spotless. The specific rules are defined in [.editorconfig](./.editorconfig). + +To run code style check and formatting tool: +``` +./gradlew spotlessCheck +./gradlew spotlessApply +``` + +If spotlessApply fails, let's discuss to relax the ktllint rules. + +## State-of-The-Art + +This document present the objectives for the project, some area may still have legacy code organizations. + +### Todo/Improvements +- [ ] Add unit tests and code coverage. + +# References +1. [Kotlin Flow](https://kotlinlang.org/docs/flow.html) +4. [Clean Architecture](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html) diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4177ab7 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) 2021 Amit Kumar + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) 2021 E Foundation + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..521f91a --- /dev/null +++ b/README.md @@ -0,0 +1,161 @@ +# AdvancedPrivacy +An app to let you control and protect your privacy. + +Forked to https://github.com/LedgerProject/e_privacycentralapp, embending all /e/ submodules. + +# Features +The following features are currently part of AdvancedPrivacy app. +1. Centralized overview dashboard. +2. Fake location. +3. Hiding IP address. +4. Control trackers across apps. + +# Technologies +- Kotlin as main language +- Kotlin coroutines and flow for asynchronous code +- AndroidX (core-ktx, fragment-ktx, and lifecycle etc.) +- Google Material Design component for UI elements +- Timber for logging +- MapLibre for map support +- LeakCanary for keeping an eye on memory leaks. + +# Flavours +This app comes in two flavours, one for /e/OS and second one for other android (where app doesn't have system access) + +# Testing +Need to write test and add code coverage. + +# Development + +## Setup +You can use any latest stable version of android studio to be able to build this app. + +## Supported Versions +- Minimum SDK: 26 (Android O) +- Compile SDK: 34 (Android U) +- Target SDK: 33 (Android T) + +## API Keys +This project uses [Sentry](https://sentry.io) for telemetry and crash reports, [Mapbox](https://docs.mapbox.com/android/maps/guides/install/) sdk as maps tiles provider. To compile the project, you need to set keys for them: + +### For local build +You can set them in local.properties +``` +MAPBOX_KEY= +SENTRY_DSN= +``` +**IMP: Never add this file to version control.** + +### For CI build +When building in CI environment, we don't have local.properties file. So the following environment variables must be set: +``` +export MAPBOX_KEY= +export SENTRY_DSN= +``` + +## Code Style and Quality +This project uses [ktlint](https://github.com/pinterest/ktlint), provided via the [spotless](https://github.com/diffplug/spotless) gradle plugin. To maintain the same code style, all the codestyle configuration has been bundled into the project. + +To check for any codestyle related error, `./gradlew spotlessCheck`. Use `./gradlew spotlessApply` to autoformat in order to fix any code quality related issues. + +### Setting up pre-commit hooks +To strictly enforce the code quality, this project has a pre-commit hook which is triggered everytime before you commit any changes (only applies to *.kt, *.gradle, *.md and *.gitignore). You must setup the pre-commit hook before doing any changes to the project. For that, this project has a script which can executed as follows: +```bash +./hooks/pre-commit +``` + +## Build dependencies + +Trackers filter and Fake location won't work unless your ROM was built with this specific netd project, android framework base and microG. + +Custom netd project communicates to AdvancedPrivacy through a Unix socket, to log and block name resolution. + +Custom android framework base and microG will consult the foundation.e.advancedprivacy.fakelocations ContentProvider for fake location instruction. + +## Build +If you'd like to build AdvancedPrivacy locally, you should be able to just clone and build with no issues. + +For building from CLI, you can execute use `./gradlew assemble` command: + +Example for eOs debug version +```bash +./gradlew assembleEosDebug +``` + +## How to use AdvancedPrivacy apk +You can build the apk locally by using above instructions or you can download the latest stable apk from `master` branch pipeline. + +### To run apk on /e/OS devices + +If you are running your tests on a `/test` build, the debug buildtype already sign it with the appropriate key, and without the persistant flag, to allow further updates. +But the first time, to replace the AdvancedPrivacy app, embeded in the test build, you have to use the following commands: + + ```shell + adb root && adb remount + adb push your_advanced_privacy_debug_build.apk /system/priv-app/AdvancedPrivacy/AdvancedPrivacy.apk + adb shell kill -9 $(adb shell pidof -s foundation.e.advancedprivacy) + ``` + +#### AdvancedPrivacy requirement against the system + +AdvancedPrivacy needs to be installed as system app and whitelisting in order to grant some system specific permissions. Follow these steps to make it work properly on /e/OS + +1. From `Developer options`, enable `Android debugging` and `Rooted debugging` +1. Sign the apk with platform certificate. You can use this command to do that + + ```shell + apksigner sign --key platform.pk8 --cert platform.x509.pem AdvancedPrivacy.apk app-e-release-unsigned.apk + ``` + + If you are running your tests on an `/test` build, you can find keys at https://gitlab.e.foundation/e/os/android_build/-/tree/v1-q/target/product/security +1. Install apk as system app and push permissions whitelist with following commands: + ```shell + adb root && adb remount + adb shell mkdir system/priv-app/AdvancedPrivacy + adb push AdvancedPrivacy.apk system/priv-app/AdvancedPrivacy + ``` + +1. Push permissions whitelist. + - it requires the whitelisting [privapp-permissions-foundation.e.advancedprivacy.xml](privapp-permissions-foundation.e.advancedprivacy.xml) file that can be found in the project repository. + - then use the following command + ```bash + adb push privapp-permissions-foundation.e.advancedprivacy.xml /system/etc/permissions/ + ``` + +1. Allow the fake location service to run in background. Add in the file /system/etc/permissions/platform.xml . + +1. Reboot the device + ```shell + adb reboot + ``` + +### To run apk on stock android devices +You can simply install the apk. Keep in that mind all features won't be available on stock android devices. + +> Voila !!!, AdvancedPrivacy is installed successfully in your device. + +# Distribution +This project can be distributed as prebuilt apk with /e/OS or it can be published on other app stores for non /e/OS devices. + +# For developers and contributers +Please refer to [Development Guide](DEVELOPMENT.md) for detailed instructions about project structure, architecture, design patterns and testing guide. + +# License +``` +Copyright (C) 2024 E FOUNDATION +Copyright (C) 2023 MURENA SAS +Copyright (C) 2021 ECORP + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see https://www.gnu.org/licenses/. +``` diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..fb26118 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,184 @@ +/* + * Copyright (C) 2023 MURENA SAS + * Copyright (C) 2022 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +plugins { + id 'com.android.application' + id 'kotlin-android' + id 'kotlin-kapt' + id 'androidx.navigation.safeargs.kotlin' +} + +def getSentryDsn = { -> + + def sentryDsnEnv = System.getenv("SENTRY_DSN") + if (sentryDsnEnv != null) { + return sentryDsnEnv + } + + Properties properties = new Properties() + def propertiesFile = project.rootProject.file('local.properties') + if (propertiesFile.exists()) { + properties.load(propertiesFile.newDataInputStream()) + } + return properties.getProperty('SENTRY_DSN') +} + +android { + compileSdkVersion buildConfig.compileSdk + + defaultConfig { + applicationId "foundation.e.advancedprivacy" + minSdkVersion buildConfig.minSdk + targetSdkVersion buildConfig.targetSdk + versionCode buildConfig.version.code + versionName buildConfig.version.name + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + + manifestPlaceholders = [ + persistent: "false", + mainActivityIntentFilterCategory: "android.intent.category.LAUNCHER" + ] + + resValue("string", "mapbox_key", MAPBOX_KEY) + buildConfigField("String", "SENTRY_DSN", "\"${getSentryDsn()}\"") + } + + signingConfigs { + debug { + storeFile rootProject.file(".sign/debug.keystore") + storePassword "android" + keyAlias "androiddebugkey" + keyPassword "android" + } + + // We use test platform keys to sign /e/OS specific debug flavour. + eDebug { + storeFile rootProject.file(".sign/platform.jks") + storePassword "android" + keyAlias "platform" + keyPassword "android" + } + } + + // We define here the OS flavor e, specific for the /e/ OS version, and google, for any + // android device. The e or google prefix is then used in resources, dependencies, ... as + // expected by the android gradle plugin. + flavorDimensions 'os' + productFlavors { + eos { + dimension 'os' + signingConfig signingConfigs.eDebug + } + standalone { + dimension 'os' + applicationIdSuffix '.standalone' + manifestPlaceholders = [ + persistent: "false", + mainActivityIntentFilterCategory: "android.intent.category.LAUNCHER" + ] + + signingConfig signingConfigs.debug + } + } + + buildTypes { + debug { + signingConfig null // Set signing config to null as we use signingConfig per variant. + } + release { + manifestPlaceholders = [ + persistent: "true", + mainActivityIntentFilterCategory: "android.intent.category.INFO" + ] + + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + /** + * Sets the output name of the variant outputs and also it setup signingConfig based on the product flavor. + */ + applicationVariants.all { variant -> + variant.outputs.all { output -> + outputFileName = "Advanced_Privacy-${variant.versionName}-${variant.getFlavorName()}-${variant.buildType.name}.apk" + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + + buildFeatures { + dataBinding true + viewBinding true + } + + lintOptions { + disable 'MissingTranslation' + } + namespace 'foundation.e.advancedprivacy' +} + +dependencies { + implementation project(':core') + standaloneImplementation project(':permissionsstandalone') + eosImplementation project(':permissionseos') + + eosImplementation files('libs/lineage-sdk.jar') + + implementation project(':trackers') + + implementation project(':ipscrambling') + eosImplementation project(':trackersserviceeos') + standaloneImplementation project(':trackersservicestandalone') + + implementation ( + libs.androidx.core.ktx, + libs.androidx.appcompat, + libs.androidx.datastore.preferences, + libs.androidx.fragment.ktx, + libs.androidx.lifecycle.runtime, + libs.androidx.lifecycle.viewmodel, + libs.androidx.navigation.fragment, + libs.androidx.navigation.ui, + libs.androidx.viewpager2, + + libs.bundles.koin, + + libs.eos.elib, + libs.eos.telemetry, + + libs.google.material, + + libs.maplibre, + libs.mpandroidcharts, + + libs.timber + ) + + debugImplementation libs.leakcanary + + testImplementation libs.junit +} + +static def log(Object val) { + println("[GradleRepository]: " + val) +} diff --git a/app/eos/release/output-metadata.json b/app/eos/release/output-metadata.json new file mode 100644 index 0000000..a2ccf24 --- /dev/null +++ b/app/eos/release/output-metadata.json @@ -0,0 +1,20 @@ +{ + "version": 3, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "foundation.e.advancedprivacy", + "variantName": "eosRelease", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 2005000, + "versionName": "2.5.0", + "outputFile": "Advanced_Privacy-2.5.0-eos-release.apk" + } + ], + "elementType": "File" +} \ No newline at end of file diff --git a/app/libs/lineage-sdk.jar b/app/libs/lineage-sdk.jar new file mode 100644 index 0000000000000000000000000000000000000000..c2f04a770d1f84bdeea592885f589b422aaecf36 GIT binary patch literal 430252 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%0D1bWj~F+@`WLrZ~7z`C@?3n?+X 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�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 z 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∈=Z-Ld765xVYUm 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�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

Y}*ZFmJ@Q>pc1cvY2c|LW&P6Fm27s?7bocVPoAC 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/assets/e_trackers.json b/app/src/main/assets/e_trackers.json new file mode 100644 index 0000000..a1d7adb --- /dev/null +++ b/app/src/main/assets/e_trackers.json @@ -0,0 +1 @@ +{"trackers":[{"id":"wtm_zwaar","hostnames":["zwaar.org","clicks.zwaar.org"],"name":"Zwaar","link":"https://www.ghostery.com/whotracksme/trackers/zwaar"},{"id":"wtm_zmags","hostnames":["stats.zmags.com"],"name":"Zmags","link":"https://www.ghostery.com/whotracksme/trackers/zmags"},{"id":"wtm_zeusclicks","hostnames":["zeusclicks.com","ads.zeusclicks.com","cdn.zeusclicks.com","ads2.zeusclicks.com"],"name":"ZeusClicks","link":"https://www.ghostery.com/whotracksme/trackers/zeusclicks"},{"id":"wtm_zedo","hostnames":["zedo.com","e1.zedo.com","e2.zedo.com","z1.zedo.com","c14.zedo.com","saxp.zedo.com","2664.tm.zedo.com","3211.tm.zedo.com","z2.zedo.com","3165.tm.zedo.com","axp.zedo.com","l7.zedo.com","3650.tm.zedo.com","ads.zedo.com","c1.zedo.com","c2.zedo.com","c3.zedo.com","c4.zedo.com","c5.zedo.com","c6.zedo.com","c7.zedo.com","c8.zedo.com","d2.zedo.com","d3.zedo.com","d7.zedo.com","d8.zedo.com","g.zedo.com","gw.zedo.com","h.zedo.com","l1.zedo.com","l2.zedo.com","l3.zedo.com","l4.zedo.com","l5.zedo.com","l6.zedo.com","l8.zedo.com","r1.zedo.com","simg.zedo.com","ss1.zedo.com","ss2.zedo.com","ss7.zedo.com","xads.zedo.com","yads.zedo.com","www.zedo.com","d1.zedo.com","d10.zedo.com","d11.zedo.com","d12.zedo.com","d14.zedo.com","d4.zedo.com","d5.zedo.com","d6.zedo.com","d9.zedo.com","zads.zedo.com"],"name":"Zedo","link":"https://www.ghostery.com/whotracksme/trackers/zedo"},{"id":"wtm_zebestof.com","hostnames":["ea.zebestof.com"],"name":"Zebestof","link":"https://www.ghostery.com/whotracksme/trackers/zebestof.com"},{"id":"wtm_zappos","hostnames":["track.zappos.com"],"name":"Zappos","link":"https://www.ghostery.com/whotracksme/trackers/zappos"},{"id":"wtm_zanox","hostnames":["zanox-affiliate.de","zanox.com","ad.zanox.com","static.zanox.com","api.zanox.com"],"name":"Zanox","link":"https://www.ghostery.com/whotracksme/trackers/zanox"},{"id":"wtm_yume,_inc.","hostnames":["yumenetworks.com","pl.yumenetworks.com","pc2.yumenetworks.com","pl1.yumenetworks.com","cdn-01.yumenetworks.com","ads.yumenetworks.com"],"name":"YuMe, Inc.","link":"https://www.ghostery.com/whotracksme/trackers/yume,_inc."},{"id":"wtm_ysance","hostnames":["prod-js.aws.y-track.com"],"name":"YSance","link":"https://www.ghostery.com/whotracksme/trackers/ysance"},{"id":"wtm_yp","hostnames":["c.ypcdn.com","i1.ypcdn.com","metrics.yellowpages.com","metric.yellowpages.com","oascentral.yellowpages.com"],"name":"YellowPages","link":"https://www.ghostery.com/whotracksme/trackers/yp"},{"id":"wtm_yodle","hostnames":["labs.natpal.com","cdn.natpal.com","offers.cdn.natpal.com"],"name":"Yodle","link":"https://www.ghostery.com/whotracksme/trackers/yodle"},{"id":"wtm_yllixmedia","hostnames":["yllix.com","banners.yllix.com","click2.yllix.com"],"name":"YllixMedia","link":"https://www.ghostery.com/whotracksme/trackers/yllixmedia"},{"id":"wtm_yieldmo","hostnames":["yieldmo.com","ads.yieldmo.com","sync.ads.yieldmo.com","sync-criteo.ads.yieldmo.com","sync-eb.ads.yieldmo.com","ap-southeast-1-ads.yieldmo.com","matchadsrvr.yieldmo.com","rw.yieldmo.com","gdpr.rw.yieldmo.com","world.rw.yieldmo.com","us-east-1.world.rw.yieldmo.com","us-west-2.world.rw.yieldmo.com","s.yieldmo.com","static.yieldmo.com","tas.yieldmo.com","update.tas.yieldmo.com","s.update.tas.yieldmo.com","tkr.yieldmo.com","w.yieldmo.com"],"name":"Yieldmo","link":"https://www.ghostery.com/whotracksme/trackers/yieldmo"},{"id":"wtm_yieldlove","hostnames":["api.yieldlove-ad-serving.net","tracking.yieldlove-ad-serving.net","v2.yieldlove-ad-serving.net","tracking.v2.yieldlove-ad-serving.net","prod-ingestion.tracking.v2.yieldlove-ad-serving.net"],"name":"Yieldlove","link":"https://www.ghostery.com/whotracksme/trackers/yieldlove"},{"id":"wtm_yieldlab","hostnames":["yieldlab.net","ad.yieldlab.net","probe.yieldlab.net"],"name":"Yieldlab","link":"https://www.ghostery.com/whotracksme/trackers/yieldlab"},{"id":"wtm_yieldify","hostnames":["assets.yieldify.com","app.yieldify.com","assets-v2.yieldify.com","custom.yieldify.com","dc.yieldify.com","v2.dc.yieldify.com","edge.yieldify.com","td.yieldify.com"],"name":"Yieldify","link":"https://www.ghostery.com/whotracksme/trackers/yieldify"},{"id":"wtm_yieldbot","hostnames":["yldbt.com","cdn.yldbt.com","i.yldbt.com"],"name":"Yieldbot","link":"https://www.ghostery.com/whotracksme/trackers/yieldbot"},{"id":"wtm_yesup_advertising","hostnames":["adsrevenue.net","infinityads.com","multipops.com","paypopup.com","popunder.adsrevenue.net","www.infinityads.com","www1.multipops.com","www2.multipops.com","www.multipops.com","popunder.paypopup.com","www.paypopup.com","www10.paypopup.com","www210.paypopup.com","www211.paypopup.com","www212.paypopup.com","www213.paypopup.com","www9.paypopup.com","ads.xtargeting.com","serving.xxxwebtraffic.com","www.xxxwebtraffic.com"],"name":"YesUp Advertising","link":"https://www.ghostery.com/whotracksme/trackers/yesup_advertising"},{"id":"wtm_yesmail","hostnames":["link.p0.com"],"name":"Yesmail","link":"https://www.ghostery.com/whotracksme/trackers/yesmail"},{"id":"wtm_yektanet","hostnames":["cdn.yektanet.com","fetch.yektanet.com"],"name":"Yektanet","link":"https://www.ghostery.com/whotracksme/trackers/yektanet"},{"id":"wtm_ybrant_media","hostnames":["ad.adserverplus.com"],"name":"Ybrant Media","link":"https://www.ghostery.com/whotracksme/trackers/ybrant_media"},{"id":"wtm_yandex_direct","hostnames":["an.webvisor.org","an.yandex.ru","bs.yandex.ru"],"name":"Yandex.Direct","link":"https://www.ghostery.com/whotracksme/trackers/yandex_direct"},{"id":"wtm_yandex","hostnames":["awaps.yandex.ru","d31j93rd8oukbv.cloudfront.net","mc.webvisor.org","an.yandex.ru","advertising.yandex.ru","bs.yandex.ru","bs-meta.yandex.ru","informer.yandex.ru","ms.yandex.ru","kiks.yandex.ru","adsdk.yandex.ru","appmetrica.yandex.ru","report.appmetrica.yandex.net","startup.mobile.yandex.net","analytics.mobile.yandex.net","mc.yandex.ru","appmetrica.yandex.com","banners-slb.mobile.yandex.net","banners.mobile.yandex.net"],"name":"Yandex","link":"https://www.ghostery.com/whotracksme/trackers/yandex","exodusId":124},{"id":"wtm_yahoo_small_business","hostnames":["www.pixazza.com"],"name":"Yahoo! Small Business","link":"https://www.ghostery.com/whotracksme/trackers/yahoo_small_business"},{"id":"wtm_yahoo_overture","hostnames":["ov.yahoo.co.jp","overture.com","data2.perf.overture.com","im.ov.yahoo.co.jp"],"name":"Yahoo! Overture","link":"https://www.ghostery.com/whotracksme/trackers/yahoo_overture"},{"id":"wtm_yahoo_japan_retargeting","hostnames":["yahoo.co.jp","ard.yahoo.co.jp","b92.yahoo.co.jp","b97.yahoo.co.jp","im.ov.yahoo.co.jp","ov.yahoo.co.jp","promotionalads.yahoo.co.jp","yads.yahoo.co.jp","yeas.yahoo.co.jp","aag.yahooapis.jp","s.yjtag.jp","yads.c.yimg.jp"],"name":"Yahoo! Japan Retargeting","link":"https://www.ghostery.com/whotracksme/trackers/yahoo_japan_retargeting"},{"id":"wtm_yahoo_commerce_central","hostnames":["np.lexity.com"],"name":"Yahoo! Commerce Central","link":"https://www.ghostery.com/whotracksme/trackers/yahoo_commerce_central"},{"id":"wtm_yahoo_analytics","hostnames":["analytics.yahoo.com","cms.analytics.yahoo.com","opus.analytics.yahoo.com","sp.analytics.yahoo.com","ups.analytics.yahoo.com"],"name":"Yahoo! Analytics","link":"https://www.ghostery.com/whotracksme/trackers/yahoo_analytics"},{"id":"wtm_yahoo_ad_manager","hostnames":["pr-bh.ybp.yahoo.com"],"name":"Yahoo! Ad Manager Plus","link":"https://www.ghostery.com/whotracksme/trackers/yahoo_ad_manager"},{"id":"wtm_yahoo","hostnames":["vodfilmy.tumblr.com","www.vodfilmy.tumblr.com","c2shb.ssp.yahoo.com","c2shb.pubgw.yahoo.com","nol.yahoo.com","ts.richmedia.yahoo.com","beap.adx.yahoo.com","ads-wc.v.ssp.yahoo.com","ads.auctions.yahoo.com","news-server17-yahoo.com","richmedia.yimg.com","ads.yimg.com","ac.ybinst0.ec.yimg.com","ac.ybinst1.ec.yimg.com","ac.ybinst2.ec.yimg.com","ac.ybinst3.ec.yimg.com","ac.ybinst4.ec.yimg.com","ac.ybinst5.ec.yimg.com","ac.ybinst6.ec.yimg.com","ac.ybinst7.ec.yimg.com","ac.ybinst8.ec.yimg.com","ac.ybinst9.ec.yimg.com","ybinst0.ec.yimg.com","ybinst1.ec.yimg.com","ybinst2.ec.yimg.com","ybinst3.ec.yimg.com","ybinst4.ec.yimg.com","ybinst5.ec.yimg.com","ybinst6.ec.yimg.com","ybinst7.ec.yimg.com","ybinst8.ec.yimg.com","ybinst9.ec.yimg.com","edgecast-vod.yimg.com","in.yimg.com","us.a1.yimg.com","ls.srvcs.tumblr.com","beap-bc.yahoo.com","fc.yahoo.com","3p-geo.yahoo.com","3p-udc.yahoo.com","ads.yahoo.com","api.ads.yahoo.com","adserver.yahoo.com","global.adserver.yahoo.com","us.adserver.yahoo.com","adspecs.yahoo.com","latam.adspecs.yahoo.com","ush.adspecs.yahoo.com","advertising.yahoo.com","sea.advertising.yahoo.com","comet.yahoo.com","ganon.yahoo.com","gemini.yahoo.com","beap.gemini.yahoo.com","geo.yahoo.com","marketingsolutions.yahoo.com","pclick.yahoo.com","analytics.query.yahoo.com","geo.query.yahoo.com","onepush.query.yahoo.com","app.ssp.yahoo.com","bats.video.yahoo.com","visit.webhosting.yahoo.com","ads.yap.yahoo.com","m.yap.yahoo.com","partnerads.ysm.yahoo.com","nz.adserver.yahoo.com","sg.adserver.yahoo.com","br.adserver.yahoo.com","cn.adserver.yahoo.com","tw.adserver.yahoo.com","be.adserver.yahoo.com","dk.adserver.yahoo.com","eu-pn4.adserver.yahoo.com","fr.adserver.yahoo.com","nl.adserver.yahoo.com","se.adserver.yahoo.com","uk.adserver.yahoo.com","de.adserver.yahoo.com","es.adserver.yahoo.com","gr.adserver.yahoo.com","it.adserver.yahoo.com","no.adserver.yahoo.com","ae.adserver.yahoo.com","ar.adserver.yahoo.com","au.adserver.yahoo.com","ca.adserver.yahoo.com","cn2.adserver.yahoo.com","eu-pn2.adserver.yahoo.com","hk.adserver.yahoo.com","in.adserver.yahoo.com","pn1.adserver.yahoo.com","pn2.adserver.yahoo.com","tw2.adserver.yahoo.com","launch.adserver.yahoo.com","mx.adserver.yahoo.com","europe.adserver.yahoo.com","ir2.beap.gemini.yahoo.com","na.ads.yahoo.com","notify.beap.gemini.yahoo.com","rtb.pclick.yahoo.com","sg3.beap.gemini.yahoo.com","tp2.beap.gemini.yahoo.com","yads.yahoo.com","ad.yieldmanager.com"],"name":"Yahoo! Ad Exchange","link":"https://www.ghostery.com/whotracksme/trackers/yahoo"},{"id":"wtm_yabbi","hostnames":["adx.com.ru"],"name":"Yabbi","link":"https://www.ghostery.com/whotracksme/trackers/yabbi"},{"id":"wtm_xtend","hostnames":["xtendmedia.com"],"name":"XTEND","link":"https://www.ghostery.com/whotracksme/trackers/xtend"},{"id":"wtm_xhamster","hostnames":["m2.xhamster.com","partners.xhamster.com","ads.xhamster.com","cnt1.xhamster.com","collector.xhamster.com"],"name":"xHamster","link":"https://www.ghostery.com/whotracksme/trackers/xhamster"},{"id":"wtm_xapads","hostnames":["xapads.com","dsp.xapads.com","track.xapads.com","tracking.xapads.com"],"name":"Xapads","link":"https://www.ghostery.com/whotracksme/trackers/xapads"},{"id":"wtm_x-lift","hostnames":["cdn.x-lift.jp"],"name":"X-lift","link":"https://www.ghostery.com/whotracksme/trackers/x-lift"},{"id":"wtm_wysistat.com","hostnames":["www.wysistat.com"],"name":"WysiStat","link":"https://www.ghostery.com/whotracksme/trackers/wysistat.com"},{"id":"wtm_wwwpromoter","hostnames":["wwwpromoter.com","cdn.wwwpromoter.com"],"name":"WWWPromoter","link":"https://www.ghostery.com/whotracksme/trackers/wwwpromoter"},{"id":"wtm_wp.pl","hostnames":["cabinet-wp.pl","omit-wp.pl","wpadki-gwiazdwp.pl","www.cabinet-wp.pl","www.omit-wp.pl","www.wpadki-gwiazdwp.pl","adb.wp.pl","adsearch.wp.pl","adv.wp.pl","dot.wp.pl","koszykrd.wp.pl","ma.wp.pl","owabgxis.wp.pl"],"name":"Wirtualna Polska","link":"https://www.ghostery.com/whotracksme/trackers/wp.pl"},{"id":"wtm_wordstream","hostnames":["tracker.wordstream.com"],"name":"WordStream","link":"https://www.ghostery.com/whotracksme/trackers/wordstream"},{"id":"wtm_wordpress_stats","hostnames":["cdn.cookielaw.org","aeroview.org","folksyoushouldknow.org","umssw.org","www.aeroview.org","www.folksyoushouldknow.org","www.umssw.org","stats.0www.org","whats-new.org","postmediamontrealgazette2.files.wordpress.com","www.postmediamontrealgazette2.files.wordpress.com","cookielawblog.wordpress.com","odbierzdarmowedoladowanie.wordpress.com","www.odbierzdarmowedoladowanie.wordpress.com","pierwszaligablog.wordpress.com","polskieinfo365.wordpress.com","www.pierwszaligablog.wordpress.com","www.polskieinfo365.wordpress.com","adastra2019onlinezalukajfilm.wordpress.com","apprendrewordpress.com","f50.hkwordpress.com","fastandfurious7pl.wordpress.com","fbpodgladacz.wordpress.com","filmycdaonline.wordpress.com","filmydownload.wordpress.com","ktopodgladamnienafacebooku.wordpress.com","nanoze2019ogladajbezlimituonlinezalukaj.wordpress.com","plikownik2015.wordpress.com","szybcyiwscielki7.wordpress.com","wolyncalyfilm.wordpress.com","www.adastra2019onlinezalukajfilm.wordpress.com","www.apprendrewordpress.com","www.f50.hkwordpress.com","www.fastandfurious7pl.wordpress.com","www.fbpodgladacz.wordpress.com","www.filmycdaonline.wordpress.com","www.filmydownload.wordpress.com","www.ktopodgladamnienafacebooku.wordpress.com","www.nanoze2019ogladajbezlimituonlinezalukaj.wordpress.com","www.plikownik2015.wordpress.com","www.szybcyiwscielki7.wordpress.com","www.wolyncalyfilm.wordpress.com","botd2.wordpress.com","botd.wordpress.com","stats.wordpress.com","derangedadage91wis.files.wordpress.com","titkoshirek.wordpress.com","gazeta-wirtualnawp.com","gfxf9ppj.dreamwp.com","info-extranewsy24wp.com","informacje-newsy-wp.com","ja2a5kvr.dreamwp.com","knowthywp.com","mdejq4mh.dreamwp.com","mmc-wp.com","multivandwp.com","navicswwp.com","navisimwp.com","tozipxc6.dreamwp.com","www.gazeta-wirtualnawp.com","www.gfxf9ppj.dreamwp.com","www.info-extranewsy24wp.com","www.informacje-newsy-wp.com","www.ja2a5kvr.dreamwp.com","www.knowthywp.com","www.mdejq4mh.dreamwp.com","www.mmc-wp.com","www.multivandwp.com","www.navicswwp.com","www.navisimwp.com","www.tozipxc6.dreamwp.com","track.msadcenter.lzwp.com","pixel.wp.com","stats.wp.com","www.zksnwp.com","zksnwp.com"],"name":"WordPress Stats","link":"https://www.ghostery.com/whotracksme/trackers/wordpress_stats"},{"id":"wtm_wordpress_ads","hostnames":["pubmine.com","s.pubmine.com"],"name":"Wordpress Ads","link":"https://www.ghostery.com/whotracksme/trackers/wordpress_ads"},{"id":"wtm_woopra","hostnames":["woopra.com","static.woopra.com"],"name":"Woopra","link":"https://www.ghostery.com/whotracksme/trackers/woopra"},{"id":"wtm_wistia","hostnames":["distillery.wistia.com","pipedream.wistia.com"],"name":"Wistia","link":"https://www.ghostery.com/whotracksme/trackers/wistia"},{"id":"wtm_wisepops","hostnames":["wisepops.com","tracking.wisepops.com"],"name":"WisePops","link":"https://www.ghostery.com/whotracksme/trackers/wisepops"},{"id":"wtm_wirtualna_polska","hostnames":["adtotal.pl"],"name":"Wirtualna Polska","link":"https://www.ghostery.com/whotracksme/trackers/wirtualna_polska"},{"id":"wtm_wipmania","hostnames":["api.wipmania.com"],"name":"WIPmania","link":"https://www.ghostery.com/whotracksme/trackers/wipmania"},{"id":"wtm_wikia_beacon","hostnames":["a.wikia-beacon.com"],"name":"Wikia Beacon","link":"https://www.ghostery.com/whotracksme/trackers/wikia_beacon"},{"id":"wtm_wigzo","hostnames":["tracker.wigzopush.com"],"name":"Wigzo","link":"https://www.ghostery.com/whotracksme/trackers/wigzo"},{"id":"wtm_wibiya_toolbar","hostnames":["cdn.wibiya.com"],"name":"Wibiya Toolbar","link":"https://www.ghostery.com/whotracksme/trackers/wibiya_toolbar"},{"id":"wtm_weibo_widget","hostnames":["widget.weibo.com"],"name":"Weibo Widget","link":"https://www.ghostery.com/whotracksme/trackers/weibo_widget"},{"id":"wtm_weebly_ads","hostnames":["backuperwebcam.weebly.com","spizarnianatury.weebly.com","swiezaki.weebly.com","www.spizarnianatury.weebly.com","www.swiezaki.weebly.com","0000000000000000poczta.weebly.com","048stroninternetowych.weebly.com","a-krakow-pl.weebly.com","acccessservice.weebly.com","adkonto.weebly.com","agh-edu5.weebly.com","aktualizacjakontaoenet.weebly.com","brembrem.weebly.com","chodorowskisc.weebly.com","ddhd.weebly.com","elektronikonlinepl.weebly.com","exuwedu.weebly.com","facebookcheckup.weebly.com","facebookpageloading.weebly.com","freelan28.weebly.com","fryinlaten.weebly.com","gogetouch.weebly.com","hjjjh.weebly.com","homho.weebly.com","igjhiojiyhtjyiojhiotygiythjtoypijtyutyi.weebly.com","imw-lublin-pl.weebly.com","interiamailonlineservice.weebly.com","jhtfghjhthrjthjthjtihrhjtiogjkjhgygyugyu.weebly.com","kjgbgnhbjgbnjkgbnjkbnyjkh.weebly.com","kjgfgbnfgjntrjhithktlmtkl.weebly.com","kjgfhjitojfgjhfjggktr89898.weebly.com","kjhgthuithutjbnogntrklbmrtektigi.weebly.com","loginpageoo.weebly.com","mailway.weebly.com","maserwe.weebly.com","metalogin.weebly.com","onetaktualizacjakonta645.weebly.com","onetaktuallizacjakonta.weebly.com","onettaktualizacjaikonta127.weebly.com","onlinestuffspage.weebly.com","opplonet.weebly.com","opserver.weebly.com","orggonet.weebly.com","oujfghhunijtrnbjinuibnjenjnk.weebly.com","pageredirecting.weebly.com","pcz-technology.weebly.com","plpageredirecting.weebly.com","pocztasite.weebly.com","pokyjiyjiyotjyiohjitjhyhyht.weebly.com","polskae-maillogin.weebly.com","serverupgrade2024.weebly.com","stapoczt.weebly.com","stronanafacebooku.weebly.com","up-poznan-pl.weebly.com","urururwoe.weebly.com","validatezimbra3.weebly.com","validatezimbra4.weebly.com","vdvdhxhjcjvhgchjchc.weebly.com","wbsrv-pl-upd.weebly.com","westernuniongiaodich24h.weebly.com","www.0000000000000000poczta.weebly.com","www.048stroninternetowych.weebly.com","www.a-krakow-pl.weebly.com","www.acccessservice.weebly.com","www.adkonto.weebly.com","www.agh-edu5.weebly.com","www.aktualizacjakontaoenet.weebly.com","www.brembrem.weebly.com","www.chodorowskisc.weebly.com","www.ddhd.weebly.com","www.elektronikonlinepl.weebly.com","www.exuwedu.weebly.com","www.facebookcheckup.weebly.com","www.facebookpageloading.weebly.com","www.freelan28.weebly.com","www.fryinlaten.weebly.com","www.gogetouch.weebly.com","www.hjjjh.weebly.com","www.homho.weebly.com","www.igjhiojiyhtjyiojhiotygiythjtoypijtyutyi.weebly.com","www.imw-lublin-pl.weebly.com","www.interiamailonlineservice.weebly.com","www.jhtfghjhthrjthjthjtihrhjtiogjkjhgygyugyu.weebly.com","www.kjgbgnhbjgbnjkgbnjkbnyjkh.weebly.com","www.kjgfgbnfgjntrjhithktlmtkl.weebly.com","www.kjgfhjitojfgjhfjggktr89898.weebly.com","www.kjhgthuithutjbnogntrklbmrtektigi.weebly.com","www.loginpageoo.weebly.com","www.mailway.weebly.com","www.maserwe.weebly.com","www.metalogin.weebly.com","www.onetaktualizacjakonta645.weebly.com","www.onetaktuallizacjakonta.weebly.com","www.onettaktualizacjaikonta127.weebly.com","www.onlinestuffspage.weebly.com","www.opplonet.weebly.com","www.opserver.weebly.com","www.orggonet.weebly.com","www.oujfghhunijtrnbjinuibnjenjnk.weebly.com","www.pageredirecting.weebly.com","www.pcz-technology.weebly.com","www.plpageredirecting.weebly.com","www.pocztasite.weebly.com","www.pokyjiyjiyotjyiohjitjhyhyht.weebly.com","www.polskae-maillogin.weebly.com","www.serverupgrade2024.weebly.com","www.stapoczt.weebly.com","www.stronanafacebooku.weebly.com","www.up-poznan-pl.weebly.com","www.urururwoe.weebly.com","www.validatezimbra3.weebly.com","www.validatezimbra4.weebly.com","www.vdvdhxhjcjvhgchjchc.weebly.com","www.wbsrv-pl-upd.weebly.com","www.westernuniongiaodich24h.weebly.com","www.xn--7565584zweryfikowanyzesp-pl-ywc50u.weebly.com","www.xn--bezpieczestwofacebooka-cyd.weebly.com","www.xn--polskaprzegldarka-07b.weebly.com","www.yftfyuhuohiohioioupioyuhjiouioihjpuihoih.weebly.com","www.ygyuhbuigoyugyuhifhituhti.weebly.com","www.yjukkuykukukukukutyjjyjyytjyjyj.weebly.com","www.yulde.weebly.com","www.zimbra-admiin.weebly.com","www.zimbra-admin4.weebly.com","xn--7565584zweryfikowanyzesp-pl-ywc50u.weebly.com","xn--bezpieczestwofacebooka-cyd.weebly.com","xn--polskaprzegldarka-07b.weebly.com","yftfyuhuohiohioioupioyuhjiouioihjpuihoih.weebly.com","ygyuhbuigoyugyuhifhituhti.weebly.com","yjukkuykukukukukutyjjyjyytjyjyj.weebly.com","yulde.weebly.com","zimbra-admiin.weebly.com","zimbra-admin4.weebly.com","anian1.weebly.com","lasopabowl158.weebly.com","mshelp247.weebly.com","www.mshelp247.weebly.com","103445.weebly.com","1067442.weebly.com","apppracksspace.weebly.com","attmailservice231.weebly.com","attmasterflagremovalinfo.weebly.com","attsignni.weebly.com","cfonet.weebly.com","currentltyattupgradenet.weebly.com","currentmntly5663.weebly.com","dlaskwefnfhgh.weebly.com","eddmsnwioekdjf.weebly.com","fpolsmebdhfjgss.weebly.com","gvgfiukj.weebly.com","hgggonet.weebly.com","mail-pcz.weebly.com","mailcheserndetrqdgawa.weebly.com","mailreturningserver.weebly.com","mmrufnfhh.weebly.com","ncybedfg.weebly.com","nn123455.weebly.com","oorgonet1.weebly.com","pocztalogin.weebly.com","pocztasdfghjk.weebly.com","proximus-be-login.weebly.com","qmpzndhhdjf.weebly.com","ruonet.weebly.com","sbcglobalkeer.weebly.com","servicemsnofficepasge.weebly.com","www.103445.weebly.com","www.1067442.weebly.com","www.apppracksspace.weebly.com","www.attmailservice231.weebly.com","www.attmasterflagremovalinfo.weebly.com","www.attsignni.weebly.com","www.cfonet.weebly.com","www.currentltyattupgradenet.weebly.com","www.currentmntly5663.weebly.com","www.dlaskwefnfhgh.weebly.com","www.eddmsnwioekdjf.weebly.com","www.fpolsmebdhfjgss.weebly.com","www.gvgfiukj.weebly.com","www.hgggonet.weebly.com","www.mail-pcz.weebly.com","www.mailcheserndetrqdgawa.weebly.com","www.mailreturningserver.weebly.com","www.mmrufnfhh.weebly.com","www.ncybedfg.weebly.com","www.nn123455.weebly.com","www.oorgonet1.weebly.com","www.pocztalogin.weebly.com","www.pocztasdfghjk.weebly.com","www.proximus-be-login.weebly.com","www.qmpzndhhdjf.weebly.com","www.ruonet.weebly.com","www.sbcglobalkeer.weebly.com","www.servicemsnofficepasge.weebly.com","www.yahiimaiilnnnann.weebly.com","www.yahooofficialpageinc.weebly.com","www.yfonet.weebly.com","www.yinkadeleol.weebly.com","yahiimaiilnnnann.weebly.com","yahooofficialpageinc.weebly.com","yfonet.weebly.com","yinkadeleol.weebly.com"],"name":"Weebly Ads","link":"https://www.ghostery.com/whotracksme/trackers/weebly_ads"},{"id":"wtm_webtrends_ads","hostnames":["rd.clickshift.com"],"name":"Webtrends Ads","link":"https://www.ghostery.com/whotracksme/trackers/webtrends_ads"},{"id":"wtm_webtrekk","hostnames":["d1r27qvpjiaqj3.cloudfront.net","webtrekk.net","wt-eu02.net","douglas01.webtrekk.net","handelsblatt01.webtrekk.net","jade01.webtrekk.net","lastampa01.webtrekk.net","prosieben01.webtrekk.net","sapato01.webtrekk.net","sofa01.webtrekk.net","tiscaliadv01.webtrekk.net","trendmicroeuropa01.webtrekk.net","triboo01.webtrekk.net","vnumedia01.webtrekk.net","weltonline01.webtrekk.net","zeit01.webtrekk.net","verivox01.webtrekk.net","dkb01.webtrekk.net","vnumedia02.webtrekk.net","vnumedia03.webtrekk.net","vnumedia04.webtrekk.net","www.webtrekk.net","responder.wt-safetag.com"],"name":"Webtrekk","link":"https://www.ghostery.com/whotracksme/trackers/webtrekk"},{"id":"wtm_webtraffic","hostnames":["webtraffic.se"],"name":"Webtraffic","link":"https://www.ghostery.com/whotracksme/trackers/webtraffic"},{"id":"wtm_webstat","hostnames":["webstat.com","hv3.webstat.com","hits.webstat.com","www.webstat.com","logo.onlinewebstat.com","sayac.onlinewebstat.com"],"name":"WebSTAT","link":"https://www.ghostery.com/whotracksme/trackers/webstat"},{"id":"wtm_webleads_tracker","hostnames":["stats.webleads-tracker.com"],"name":"Webleads Tracker","link":"https://www.ghostery.com/whotracksme/trackers/webleads_tracker"},{"id":"wtm_webgozar","hostnames":["webgozar.com"],"name":"WebGozar","link":"https://www.ghostery.com/whotracksme/trackers/webgozar"},{"id":"wtm_webedia","hostnames":["mediaathay.org.uk"],"name":"Webedia","link":"https://www.ghostery.com/whotracksme/trackers/webedia"},{"id":"wtm_webantenna","hostnames":["tr.webantenna.info"],"name":"WebAntenna","link":"https://www.ghostery.com/whotracksme/trackers/webantenna"},{"id":"wtm_webads","hostnames":["webads.nl","images.webads.nl","adserver.webads.nl","rc.wl.webads.nl","smartinit.webads.nl","tr.wl.webads.nl"],"name":"WebAds","link":"https://www.ghostery.com/whotracksme/trackers/webads"},{"id":"wtm_web.stat","hostnames":["webstat.net"],"name":"Web.STAT","link":"https://www.ghostery.com/whotracksme/trackers/web.stat"},{"id":"wtm_web-stat","hostnames":["web-stat.com","lb.web-stat.com","server2.web-stat.com","server3.web-stat.com","server4.web-stat.com","www.web-stat.com"],"name":"Web-Stat","link":"https://www.ghostery.com/whotracksme/trackers/web-stat"},{"id":"wtm_web_traxs","hostnames":["alt.webtraxs.com","www.webtraxs.com"],"name":"Web Traxs","link":"https://www.ghostery.com/whotracksme/trackers/web_traxs"},{"id":"wtm_w3counter","hostnames":["www.w3counter.com"],"name":"W3Counter","link":"https://www.ghostery.com/whotracksme/trackers/w3counter"},{"id":"wtm_vpscash","hostnames":["tools.vpscash.nl","promotools.vpscash.nl"],"name":"VPSCash","link":"https://www.ghostery.com/whotracksme/trackers/vpscash"},{"id":"wtm_vpon","hostnames":["c-dsp.vpadn.com"],"name":"VPON","link":"https://www.ghostery.com/whotracksme/trackers/vpon"},{"id":"wtm_voxus","hostnames":["embed.voxus.tv","voxus-targeting-voxusmidia.netdna-ssl.com"],"name":"Voxus","link":"https://www.ghostery.com/whotracksme/trackers/voxus"},{"id":"wtm_voluum","hostnames":["voluumtrk3.com"],"name":"Voluum","link":"https://www.ghostery.com/whotracksme/trackers/voluum"},{"id":"wtm_voicefive","hostnames":["voicefive.com","www.voicefive.com","ar.voicefive.com","survey2.voicefive.com","sb.voicefive.com"],"name":"VoiceFive","link":"https://www.ghostery.com/whotracksme/trackers/voicefive"},{"id":"wtm_vizury","hostnames":["vizury.com","www.vizury.com"],"name":"Vizury","link":"https://www.ghostery.com/whotracksme/trackers/vizury"},{"id":"wtm_visualdna","hostnames":["a1.vdna-assets.com","w.visualdna.com"],"name":"VisualDNA","link":"https://www.ghostery.com/whotracksme/trackers/visualdna"},{"id":"wtm_visual_website_optimizer","hostnames":["d5phz18u4wuww.cloudfront.net","www.visualwebsiteoptimizer.com","dacdn.visualwebsiteoptimizer.com","rec5.visualwebsiteoptimizer.com","dev.visualwebsiteoptimizer.com","r1.visualwebsiteoptimizer.com","r2.visualwebsiteoptimizer.com","r3.visualwebsiteoptimizer.com"],"name":"VWO","link":"https://www.ghostery.com/whotracksme/trackers/visual_website_optimizer"},{"id":"wtm_visscore","hostnames":["d2hkbi3gan6yg6.cloudfront.net"],"name":"VisScore","link":"https://www.ghostery.com/whotracksme/trackers/visscore"},{"id":"wtm_visitortrack","hostnames":["www.visitortracklog.com"],"name":"VisitorTrack","link":"https://www.ghostery.com/whotracksme/trackers/visitortrack"},{"id":"wtm_visible_measures","hostnames":["visiblemeasures.com","cdn.visiblemeasures.com"],"name":"Visible Measures","link":"https://www.ghostery.com/whotracksme/trackers/visible_measures"},{"id":"wtm_virool_player","hostnames":["ssp.virool.com"],"name":"Virool Player","link":"https://www.ghostery.com/whotracksme/trackers/virool_player"},{"id":"wtm_virgul","hostnames":["logger.virgul.com","ng.virgul.com","static.virgul.com"],"name":"Virgul","link":"https://www.ghostery.com/whotracksme/trackers/virgul"},{"id":"wtm_vigo","hostnames":["api.vigo.ru"],"name":"Vigo","link":"https://www.ghostery.com/whotracksme/trackers/vigo"},{"id":"wtm_viglink","hostnames":["viglink.com","api.viglink.com","cdn.viglink.com","images.viglink.com"],"name":"VigLink","link":"https://www.ghostery.com/whotracksme/trackers/viglink"},{"id":"wtm_vidible","hostnames":["vidible.tv","cdn.vidible.tv","ads.use1.prod.vidible.tv","trk.vidible.tv","ads-trk.vidible.tv"],"name":"Vidible","link":"https://www.ghostery.com/whotracksme/trackers/vidible"},{"id":"wtm_videostep","hostnames":["kweb.videostep.com"],"name":"VideoStep","link":"https://www.ghostery.com/whotracksme/trackers/videostep"},{"id":"wtm_videoplaza","hostnames":["in-star.videoplaza.tv","www.in-star.videoplaza.tv","in-starlive.videoplaza.tv","in-starlive-preroll.videoplaza.tv","in-viacom18.videoplaza.tv","www.in-viacom18.videoplaza.tv","service.videoplaza.tv","www.service.videoplaza.tv","konnect.videoplaza.tv"],"name":"Videoplaza","link":"https://www.ghostery.com/whotracksme/trackers/videoplaza"},{"id":"wtm_videoadex.com","hostnames":["videoadex.com","ads.videoadex.com"],"name":"VideoAdX","link":"https://www.ghostery.com/whotracksme/trackers/videoadex.com"},{"id":"wtm_vidazoo.com","hostnames":["vroku-bis-1.vidazoo.com","bis.vidazoo.com","bisdr.vidazoo.com","inventory.vidazoo.com","pl.vidazoo.com","static.vidazoo.com","wserver.vidazoo.com"],"name":"Vidazoo","link":"https://www.ghostery.com/whotracksme/trackers/vidazoo.com"},{"id":"wtm_vibrant_ads","hostnames":["intellitxt.com","k.intellitxt.com","images.intellitxt.com","www.intellitxt.com","mamamia.au.intellitxt.com","zdnet.be.intellitxt.com","ad-hoc-news.de.intellitxt.com","atspace.de.intellitxt.com","audio.de.intellitxt.com","awardspace.de.intellitxt.com","bild.de.intellitxt.com","chip.de.intellitxt.com","castingshow-news.de.intellitxt.com","computerbase.de.intellitxt.com","computerbild.de.intellitxt.com","computerhilfen.de.intellitxt.com","computerwoche.de.intellitxt.com","digital-world.de.intellitxt.com","ghacks.de.intellitxt.com","golem.de.intellitxt.com","gulli.de.intellitxt.com","inquake.de.intellitxt.com","loady.de.intellitxt.com","macwelt.de.intellitxt.com","msmobiles.de.intellitxt.com","news.de.intellitxt.com","pcwelt.de.intellitxt.com","php-mag.de.intellitxt.com","php-magnet.de.intellitxt.com","softonic.de.intellitxt.com","supernature-forum.de.intellitxt.com","supportnet.de.intellitxt.com","tecchannel.de.intellitxt.com","winfuture.de.intellitxt.com","wg-gesucht.de.intellitxt.com","womenshealth.de.intellitxt.com","actualite-de-stars.fr.intellitxt.com","telefonica.es.intellitxt.com","cowcotland.fr.intellitxt.com","froggytest.fr.intellitxt.com","generation-nt.fr.intellitxt.com","hiphopgalaxy.fr.intellitxt.com","infos-du-net.fr.intellitxt.com","memoclic.fr.intellitxt.com","neteco.fr.intellitxt.com","pcinpact.fr.intellitxt.com","pc-infopratique.fr.intellitxt.com","presence-pc.fr.intellitxt.com","programme-tv.fr.intellitxt.com","reseaux-telecoms.fr.intellitxt.com","tomshardware.fr.intellitxt.com","zataz.fr.intellitxt.com","techgadgets.in.intellitxt.com","telefonino.it.intellitxt.com","computeridee.nl.intellitxt.com","computertotaal.nl.intellitxt.com","techworld.nl.intellitxt.com","techzine.nl.intellitxt.com","topdownloads.nl.intellitxt.com","webwereld.nl.intellitxt.com","compulenta.ru.intellitxt.com","rbmods.se.intellitxt.com","tomshardware.se.intellitxt.com","4thegame.uk.intellitxt.com","amygrindhouse.uk.intellitxt.com","anorak.uk.intellitxt.com","bink.uk.intellitxt.com","bit-tech.uk.intellitxt.com","biosmagazine.uk.intellitxt.com","cbronline.uk.intellitxt.com","computeractive.uk.intellitxt.com","computing.uk.intellitxt.com","contactmusic.uk.intellitxt.com","digit-life.uk.intellitxt.com","efluxmedia.uk.intellitxt.com","express.uk.intellitxt.com","femalefirst.uk.intellitxt.com","ferrago.uk.intellitxt.com","fhm.uk.intellitxt.com","footymad.uk.intellitxt.com","freedownloadcenter.uk.intellitxt.com","freedownloadmanager.uk.intellitxt.com","freewarepalm.uk.intellitxt.com","futurepublications.uk.intellitxt.com","gamesindustry.uk.intellitxt.com","handbag.uk.intellitxt.com","hellomagazine.uk.intellitxt.com","hexus.uk.intellitxt.com","itpro.uk.intellitxt.com","itreviews.uk.intellitxt.com","knowyourmobile.uk.intellitxt.com","legitreviews-uk.intellitxt.com","letsgodigital.uk.intellitxt.com","lse.uk.intellitxt.com","mad.uk.intellitxt.com","mobilecomputermag.uk.intellitxt.com","monstersandcritics.uk.intellitxt.com","newlaunches.uk.intellitxt.com","nodevice.uk.intellitxt.com","ok.uk.intellitxt.com","pcadvisor-uk.intellitxt.com","pcgamer.uk.intellitxt.com","pcpro.uk.intellitxt.com","pcw.uk.intellitxt.com","physorg.uk.intellitxt.com","playfuls.uk.intellitxt.com","pocketlint.uk.intellitxt.com","product-reviews.uk.intellitxt.com","sharecast.uk.intellitxt.com","sofeminine.uk.intellitxt.com","softpedia.uk.intellitxt.com","squarefootball.uk.intellitxt.com","tcmagazine.uk.intellitxt.com","teamtalk.uk.intellitxt.com","techradar.uk.intellitxt.com","thehollywoodnews.uk.intellitxt.com","theinquirer.uk.intellitxt.com","theregister.uk.intellitxt.com","thetechherald.uk.intellitxt.com","videojug.uk.intellitxt.com","vitalfootball.uk.intellitxt.com","vnunet.uk.intellitxt.com","webuser.uk.intellitxt.com","westbriton.uk.intellitxt.com","wi-fitechnology.uk.intellitxt.com","windows7news.uk.intellitxt.com","worldtravelguide.uk.intellitxt.com","1up.us.intellitxt.com","247wallstreet.us.intellitxt.com","2snaps.us.intellitxt.com","2spyware.us.intellitxt.com","24wrestling.us.intellitxt.com","411mania.us.intellitxt.com","4w-wrestling.us.intellitxt.com","5starsupport.us.intellitxt.com","9down.us.intellitxt.com","10best.us.intellitxt.com","able2know.us.intellitxt.com","accuweather.us.intellitxt.com","aceshowbiz.us.intellitxt.com","aclasscelebs.us.intellitxt.com","activewin.us.intellitxt.com","actionscript.us.intellitxt.com","advancedmn.us.intellitxt.com","adwarereport.us.intellitxt.com","afterdawn.us.intellitxt.com","afraidtoask.us.intellitxt.com","ajc.us.intellitxt.com","akihabaranews.us.intellitxt.com","alive.us.intellitxt.com","allcarselectric.us.intellitxt.com","allgetaways.us.intellitxt.com","allhiphop.us.intellitxt.com","allrefer.us.intellitxt.com","allwomenstalk.us.intellitxt.com","amdzone.us.intellitxt.com","americanmedia.us.intellitxt.com","andpop.us.intellitxt.com","androidandme.us.intellitxt.com","androidcentral.us.intellitxt.com","androidcommunity.us.intellitxt.com","answerbag.us.intellitxt.com","answers.us.intellitxt.com","antimusic.us.intellitxt.com","anythinghollywood.us.intellitxt.com","appscout.us.intellitxt.com","artistdirect.us.intellitxt.com","askmen.us.intellitxt.com","askmen2.us.intellitxt.com","aquasoft.us.intellitxt.com","architecturaldesigns.us.intellitxt.com","autoforums.us.intellitxt.com","automobilemag.us.intellitxt.com","automotive.us.intellitxt.com","autospies.us.intellitxt.com","autoworldnews.us.intellitxt.com","away.us.intellitxt.com","aximsite.us.intellitxt.com","b5media.us.intellitxt.com","backseatcuddler.us.intellitxt.com","balleralert.us.intellitxt.com","baselinemag.us.intellitxt.com","bastardly.us.intellitxt.com","beautyden.us.intellitxt.com","becomegorgeous.us.intellitxt.com","beliefnet.us.intellitxt.com","betanews.us.intellitxt.com","beyondhollywood.us.intellitxt.com","bigbigforums.us.intellitxt.com","bittenandbound.us.intellitxt.com","blacksportsonline.us.intellitxt.com","blastro.us.intellitxt.com","bleepingcomputer.us.intellitxt.com","blisstree.us.intellitxt.com","boldride.us.intellitxt.com","bootdaily.us.intellitxt.com","boxingscene.us.intellitxt.com","bradpittnow.us.intellitxt.com","bricksandstonesgossip.us.intellitxt.com","brighthub.us.intellitxt.com","brothersoft.us.intellitxt.com","bukisa.us.intellitxt.com","bullz-eye.us.intellitxt.com","bumpshack.us.intellitxt.com","businessinsider.us.intellitxt.com","businessknowhow.us.intellitxt.com","bustedcoverage.us.intellitxt.com","buzzfoto.us.intellitxt.com","buzzhumor.us.intellitxt.com","bolt.us.intellitxt.com","cadillacforums.us.intellitxt.com","cafemom.us.intellitxt.com","canmag.us.intellitxt.com","car-stuff.us.intellitxt.com","cavemancircus.us.intellitxt.com","cbstv.us.intellitxt.com","newyork.cbslocal.us.intellitxt.com","cdreviews.us.intellitxt.com","cdrinfo.us.intellitxt.com","cdrom-guide.us.intellitxt.com","celebitchy.us.intellitxt.com","celebridoodle.us.intellitxt.com","celebrity-babies.us.intellitxt.com","celebritytoob.us.intellitxt.com","celebridiot.us.intellitxt.com","celebrifi.us.intellitxt.com","celebritymound.us.intellitxt.com","celebritynation.us.intellitxt.com","celebrityodor.us.intellitxt.com","celebrity-rightpundits.us.intellitxt.com","celebritysmackblog.us.intellitxt.com","celebrityviplounge.us.intellitxt.com","celebslam.us.intellitxt.com","celebrity-gossip.us.intellitxt.com","celebritypwn.us.intellitxt.com","celebritywonder.us.intellitxt.com","celebuzz.us.intellitxt.com","channelinsider.us.intellitxt.com","cheatcc.us.intellitxt.com","cheatingdome.us.intellitxt.com","chevelles.us.intellitxt.com","cmp.us.intellitxt.com","cnet.us.intellitxt.com","coedmagazine.us.intellitxt.com","collegefootballnews.us.intellitxt.com","comicbookmovie.us.intellitxt.com","comicbookresources.us.intellitxt.com","comingsoon.us.intellitxt.com","complex.us.intellitxt.com","compnet.us.intellitxt.com","consumerreview.us.intellitxt.com","contactmusic.us.intellitxt.com","cooksrecipes.us.intellitxt.com","cooltechzone.us.intellitxt.com","counselheal.us.intellitxt.com","countryweekly.us.intellitxt.com","courierpostonline.us.intellitxt.com","coxtv.us.intellitxt.com","crmbuyer.us.intellitxt.com","csharpcorner.us.intellitxt.com","csnation.us.intellitxt.com","ctv.us.intellitxt.com","dabcc.us.intellitxt.com","dailycaller.us.intellitxt.com","dailygab.us.intellitxt.com","dailystab.us.intellitxt.com","dailytech.us.intellitxt.com","damnimcute.us.intellitxt.com","danasdirt.us.intellitxt.com","daniweb.us.intellitxt.com","darkhorizons.us.intellitxt.com","darlamack.us.intellitxt.com","dbtechno.us.intellitxt.com","delawareonline.us.intellitxt.com","delconewsnetwork.us.intellitxt.com","destructoid.us.intellitxt.com","demonews.us.intellitxt.com","denguru.us.intellitxt.com","derekhail.us.intellitxt.com","dietsinreview.us.intellitxt.com","digitalhome.us.intellitxt.com","digitalmediaonline.us.intellitxt.com","digitalmediawire.us.intellitxt.com","digitaltrends.us.intellitxt.com","diyfood.us.intellitxt.com","dlmag.us.intellitxt.com","dnps.us.intellitxt.com","doubleviking.us.intellitxt.com","download32.us.intellitxt.com","drdobbs.us.intellitxt.com","driverguide.us.intellitxt.com","drugscom.us.intellitxt.com","eastsideboxing.us.intellitxt.com","eatingwell.us.intellitxt.com","ebaumsworld.us.intellitxt.com","ecanadanow.us.intellitxt.com","ecommercetimes.us.intellitxt.com","eepn.us.intellitxt.com","efanguide.us.intellitxt.com","egotastic.us.intellitxt.com","eharmony.us.intellitxt.com","ehomeupgrade.us.intellitxt.com","ehow.us.intellitxt.com","electronista.us.intellitxt.com","emaxhealth.us.intellitxt.com","encyclocentral.us.intellitxt.com","entrepreneur.us.intellitxt.com","entertainmentwise.us.intellitxt.com","eontarionow.us.intellitxt.com","estelle.us.intellitxt.com","eten-users.us.intellitxt.com","everyjoe.us.intellitxt.com","evilbeetgossip.us.intellitxt.com","eweek.us.intellitxt.com","examnotes.us.intellitxt.com","excite.us.intellitxt.com","experts.us.intellitxt.com","extntechnologies.us.intellitxt.com","extremeoverclocking.us.intellitxt.com","extremetech.us.intellitxt.com","eztracks.us.intellitxt.com","fangoria.us.intellitxt.com","faqts.us.intellitxt.com","fatbackandcollards.us.intellitxt.com","fatbackmedia.us.intellitxt.com","fatfreekitchen.us.intellitxt.com","feedsweep.us.intellitxt.com","fhmonline.us.intellitxt.com","fightline.us.intellitxt.com","filmdrunk.us.intellitxt.com","filedudes.us.intellitxt.com","filmstew.us.intellitxt.com","filmthreat.us.intellitxt.com","firingsquad.us.intellitxt.com","fixya.us.intellitxt.com","flashmagazine.us.intellitxt.com","flyingmag.us.intellitxt.com","forbes.us.intellitxt.com","fortunecity.us.intellitxt.com","forumediainc.us.intellitxt.com","foxnews.us.intellitxt.com","foxsports.us.intellitxt.com","foxtv.us.intellitxt.com","freecodecs.us.intellitxt.com","freewarehome.us.intellitxt.com","friendtest.us.intellitxt.com","gamedev.us.intellitxt.com","gamerstemple.us.intellitxt.com","gannettbroadcast.us.intellitxt.com","gannettwisconsin.us.intellitxt.com","gardenweb.us.intellitxt.com","gather.us.intellitxt.com","geek.us.intellitxt.com","geekstogo.us.intellitxt.com","genmay.us.intellitxt.com","gigwise.us.intellitxt.com","girlsaskguys.us.intellitxt.com","givememyremote.us.intellitxt.com","goal.us.intellitxt.com","gonintendo.us.intellitxt.com","gossipcenter.us.intellitxt.com","gossiponthis.us.intellitxt.com","gossipteen.us.intellitxt.com","gottabemobile.us.intellitxt.com","govpro.us.intellitxt.com","graytv.us.intellitxt.com","gsmarena.us.intellitxt.com","gtmedia.us.intellitxt.com","guardianlv.us.intellitxt.com","guru3d.us.intellitxt.com","hackedgadgets.us.intellitxt.com","hairboutique.us.intellitxt.com","hardcoreware.us.intellitxt.com","hardforum.us.intellitxt.com","hardocp.us.intellitxt.com","hardwaregeeks.us.intellitxt.com","hardwarezone.us.intellitxt.com","harmony-central.us.intellitxt.com","haveuheard.us.intellitxt.com","helium.us.intellitxt.com","hiphoprx.us.intellitxt.com","hiphopdx.us.intellitxt.com","hiphoplead.us.intellitxt.com","hngn.com.us.intellitxt.com","hollyrude.us.intellitxt.com","hollywood.us.intellitxt.com","hollywooddame.us.intellitxt.com","hollywoodbackwash.us.intellitxt.com","hollywoodchicago.us.intellitxt.com","hollywoodstreetking.us.intellitxt.com","hollywoodtuna.us.intellitxt.com","hometheaterhifi.us.intellitxt.com","hongkiat.us.intellitxt.com","hoopsworld.us.intellitxt.com","hoovers.us.intellitxt.com","horoscope.us.intellitxt.com","hostboard.us.intellitxt.com","hothardware.us.intellitxt.com","hotmommagossip.us.intellitxt.com","howardchui.us.intellitxt.com","hq-celebrity.us.intellitxt.com","huliq.us.intellitxt.com","i4u.us.intellitxt.com","iamnotageek.us.intellitxt.com","icentric.us.intellitxt.com","ichef.us.intellitxt.com","icydk.us.intellitxt.com","idontlikeyouinthatway.us.intellitxt.com","iesb.us.intellitxt.com","ign.us.intellitxt.com","india-forums.us.intellitxt.com","babes.ign.us.intellitxt.com","cars.ign.us.intellitxt.com","comics.ign.us.intellitxt.com","cube.ign.us.intellitxt.com","ds.ign.us.intellitxt.com","filmforcedvd.ign.us.intellitxt.com","gameboy.ign.us.intellitxt.com","music.ign.us.intellitxt.com","psp.ign.us.intellitxt.com","ps2.ign.us.intellitxt.com","psx.ign.us.intellitxt.com","revolution.ign.us.intellitxt.com","sports.ign.us.intellitxt.com","wireless.ign.us.intellitxt.com","xbox.ign.us.intellitxt.com","xbox360.ign.us.intellitxt.com","idm.us.intellitxt.com","i-hacked.us.intellitxt.com","imnotobsessed.us.intellitxt.com","impactwrestling.us.intellitxt.com","imreportcard.us.intellitxt.com","infopackets.us.intellitxt.com","insidemacgames.us.intellitxt.com","intermix.us.intellitxt.com","internetautoguide.us.intellitxt.com","intogossip.us.intellitxt.com","intomobile.us.intellitxt.com","investingchannel.us.intellitxt.com","investopedia.us.intellitxt.com","ittoolbox.us.intellitxt.com","itxt2.us.intellitxt.com","itxt3.us.intellitxt.com","itworld.us.intellitxt.com","ivillage.us.intellitxt.com","s.ivillage.us.intellitxt.com","iwon.us.intellitxt.com","jacksonsun.us.intellitxt.com","jakeludington.us.intellitxt.com","jkontherun.us.intellitxt.com","joblo.us.intellitxt.com","juicyceleb.us.intellitxt.com","juicy-news.blogspot.us.intellitxt.com","jupiter.us.intellitxt.com","justjared.us.intellitxt.com","justmovietrailers.us.intellitxt.com","jutiagroup.us.intellitxt.com","kaboose.us.intellitxt.com","kasterborous.us.intellitxt.com","killerstartups.us.intellitxt.com","kissingsuzykolber.us.intellitxt.com","knac.us.intellitxt.com","kpopstarz.us.intellitxt.com","laboroflove.us.intellitxt.com","laineygossip.us.intellitxt.com","laptoplogic.us.intellitxt.com","laptopmag.us.intellitxt.com","lat34.us.intellitxt.com","latinpost.us.intellitxt.com","letsrun.us.intellitxt.com","latinoreview.us.intellitxt.com","lifescript.us.intellitxt.com","linuxdevcenter.us.intellitxt.com","linuxjournal.us.intellitxt.com","livescience.us.intellitxt.com","livestrong.us.intellitxt.com","lmcd.us.intellitxt.com","lockergnome.us.intellitxt.com","lohud.us.intellitxt.com","longhornblogs.us.intellitxt.com","lxer.us.intellitxt.com","lyrics.us.intellitxt.com","macdailynews.us.intellitxt.com","macnewsworld.us.intellitxt.com","macnn.us.intellitxt.com","macgamefiles.us.intellitxt.com","macmegasite.us.intellitxt.com","macobserver.us.intellitxt.com","madamenoire.us.intellitxt.com","madpenguin.us.intellitxt.com","mainstreet.us.intellitxt.com","majorgeeks.us.intellitxt.com","makeherup.us.intellitxt.com","makemeheal.us.intellitxt.com","makeushot.us.intellitxt.com","masalatalk.us.intellitxt.com","mazdaworld.us.intellitxt.com","medicinenet.us.intellitxt.com","medindia.us.intellitxt.com","memphisrap.us.intellitxt.com","meredithtv.us.intellitxt.com","methodshop.us.intellitxt.com","military.us.intellitxt.com","missjia.us.intellitxt.com","mobile9.us.intellitxt.com","mobileburn.us.intellitxt.com","mobiletechreview.us.intellitxt.com","mobilewhack.us.intellitxt.com","mobilityguru.us.intellitxt.com","modifiedlife.us.intellitxt.com","mommyish.us.intellitxt.com","morningstar.us.intellitxt.com","motortrend.us.intellitxt.com","moviehole.us.intellitxt.com","movie-list.us.intellitxt.com","movies.us.intellitxt.com","movieweb.us.intellitxt.com","msfn.us.intellitxt.com","msnbc.us.intellitxt.com","autos.msnbc.us.intellitxt.com","business.msnbc.us.intellitxt.com","health.msnbc.us.intellitxt.com","nbcsports.us.intellitxt.com","news.msnbc.us.intellitxt.com","sports.msnbc.us.intellitxt.com","technology.msnbc.us.intellitxt.com","travel-and-weather.msnbc.us.intellitxt.com","mmafighting.us.intellitxt.com","entertainment.msn.us.intellitxt.com","muscleandfitnesshers.us.intellitxt.com","mydigitallife.us.intellitxt.com","myfavoritegames.us.intellitxt.com","mydailymoment.us.intellitxt.com","nasioc.us.intellitxt.com","nationalledger.us.intellitxt.com","nationalenquirer.us.intellitxt.com","naturalhealth.us.intellitxt.com","natureworldnews.us.intellitxt.com","nbcnewyork.us.intellitxt.com","nbcuniversaltv.us.intellitxt.com","neoseeker.us.intellitxt.com","neowin.us.intellitxt.com","nextround.us.intellitxt.com","newsoxy.us.intellitxt.com","newstoob.us.intellitxt.com","nihoncar.us.intellitxt.com","ninjadude.us.intellitxt.com","ntcompatible.us.intellitxt.com","oceanup.us.intellitxt.com","octools.us.intellitxt.com","ocworkbench.us.intellitxt.com","officer.us.intellitxt.com","okmagazine.us.intellitxt.com","onlamp.us.intellitxt.com","ontheflix.us.intellitxt.com","oocenter.us.intellitxt.com","osdir.us.intellitxt.com","ostg.us.intellitxt.com","outofsightmedia.us.intellitxt.com","overclockersonline.us.intellitxt.com","overthelimit.us.intellitxt.com","pal-item.us.intellitxt.com","pcmag.us.intellitxt.com","pcper.us.intellitxt.com","penton.us.intellitxt.com","perezhilton.us.intellitxt.com","philadelphia_cbslocal.us.intellitxt.com","phonearena.us.intellitxt.com","pickmeupnews.us.intellitxt.com","pinkisthenewblog.us.intellitxt.com","popdirt.us.intellitxt.com","popfill.us.intellitxt.com","popoholic.us.intellitxt.com","poponthepop.us.intellitxt.com","popularmechanics.us.intellitxt.com","prettyboring.us.intellitxt.com","priusonline.us.intellitxt.com","profootballweekly.us.intellitxt.com","programmerworld.us.intellitxt.com","pro-networks.us.intellitxt.com","ps3news.us.intellitxt.com","punchjump.us.intellitxt.com","puppytoob.us.intellitxt.com","pwinsider.us.intellitxt.com","quickpwn.us.intellitxt.com","quinstreet.us.intellitxt.com","rankmytattoos.us.intellitxt.com","rantsports.us.intellitxt.com","realitytea.us.intellitxt.com","realitytvmagazine.us.intellitxt.com","rickey.us.intellitxt.com","ringsurf.us.intellitxt.com","rnbdirt.us.intellitxt.com","rumorfix.us.intellitxt.com","sports.rightpundits.us.intellitxt.com","rojakpot.us.intellitxt.com","rpg.us.intellitxt.com","rx8club.us.intellitxt.com","rydium.us.intellitxt.com","scanwith.us.intellitxt.com","scienceworldreport.us.intellitxt.com","screensavers.us.intellitxt.com","sdcexecs.us.intellitxt.com","shallownation.us.intellitxt.com","shebudgets.us.intellitxt.com","sheknows.us.intellitxt.com","shoutwire.us.intellitxt.com","siliconera.us.intellitxt.com","slashfilm.us.intellitxt.com","smartabouthealth.us.intellitxt.com","smartcarfinder.us.intellitxt.com","smartdevicecentral.us.intellitxt.com","sportingnews.us.intellitxt.com","soccergaming.us.intellitxt.com","socialanxietysupport.us.intellitxt.com","socialitelife.us.intellitxt.com","soft32.us.intellitxt.com","softpedia.us.intellitxt.com","sohh.us.intellitxt.com","space.us.intellitxt.com","speedguide.us.intellitxt.com","speedtv.us.intellitxt.com","sportscarillustrated.us.intellitxt.com","sprintusers.us.intellitxt.com","sqlservercentral.us.intellitxt.com","starcasm.us.intellitxt.com","steadyhealth.us.intellitxt.com","stockgroup.us.intellitxt.com","storknet.us.intellitxt.com","stupidcelebrities.us.intellitxt.com","styleblazer.us.intellitxt.com","supercars.us.intellitxt.com","superherohype.us.intellitxt.com","surebaby.us.intellitxt.com","symbianone.us.intellitxt.com","symbian-freak.us.intellitxt.com","taletela.us.intellitxt.com","tbohiphop.us.intellitxt.com","techeblog.us.intellitxt.com","tech-faq.us.intellitxt.com","techgage.us.intellitxt.com","techguy.us.intellitxt.com","techimo.us.intellitxt.com","technobuffalo.us.intellitxt.com","technologyguide.us.intellitxt.com","techpowerup.us.intellitxt.com","techspot.us.intellitxt.com","techsupportforum.us.intellitxt.com","tenmagazines.us.intellitxt.com","tgdaily.us.intellitxt.com","thathappened.us.intellitxt.com","theadvertiser.us.intellitxt.com","theblemish.us.intellitxt.com","thebosh.us.intellitxt.com","thecarconnection.us.intellitxt.com","thecelebritycafe.us.intellitxt.com","theeldergeek.us.intellitxt.com","thefinalfantasy.us.intellitxt.com","theforce.us.intellitxt.com","thefrisky.us.intellitxt.com","thefutoncritic.us.intellitxt.com","thegauntlet.us.intellitxt.com","theglobeandmail.us.intellitxt.com","thegloss.us.intellitxt.com","thehdroom.us.intellitxt.com","thehollywoodgossip.us.intellitxt.com","themanroom.us.intellitxt.com","theonenetwork.us.intellitxt.com","thepaparazzis.us.intellitxt.com","thestreet.us.intellitxt.com","thesuperficial.us.intellitxt.com","thetechlounge.us.intellitxt.com","thetechzone.us.intellitxt.com","theunwired.us.intellitxt.com","theybf.us.intellitxt.com","thinkcomputers.us.intellitxt.com","thoughtsmedia.us.intellitxt.com","threadwatch.us.intellitxt.com","tmz.us.intellitxt.com","todayshow.us.intellitxt.com","toofab.us.intellitxt.com","toms.us.intellitxt.com","tomsforumz.us.intellitxt.com","tomshardware.us.intellitxt.com","tomsnetworking.us.intellitxt.com","topsocialite.us.intellitxt.com","topnews.us.intellitxt.com","toptechreviews.us.intellitxt.com","toptenreviews.us.intellitxt.com","topspeed.us.intellitxt.com","torquenews.us.intellitxt.com","tothecenter.us.intellitxt.com","traileraddict.us.intellitxt.com","trekweb.us.intellitxt.com","tribal.us.intellitxt.com","triumphrat.us.intellitxt.com","tsxclub.us.intellitxt.com","tutorialoutpost.us.intellitxt.com","tvfanatic.us.intellitxt.com","tv-now.us.intellitxt.com","tv-rightcelebrity.us.intellitxt.com","tvseriesfinale.us.intellitxt.com","tweaks.us.intellitxt.com","tweaktown.us.intellitxt.com","tweakvista.us.intellitxt.com","tweetsoup.us.intellitxt.com","twitchguru.us.intellitxt.com","ubergizmo.us.intellitxt.com","unathleticmag.us.intellitxt.com","universityherald.us.intellitxt.com","upi.us.intellitxt.com","vault9.us.intellitxt.com","viaarena.us.intellitxt.com","vibe.us.intellitxt.com","videocodezone.us.intellitxt.com","vidnet.us.intellitxt.com","voodoofiles.us.intellitxt.com","warcry.us.intellitxt.com","washingtontimes.us.intellitxt.com","weightlossforall.us.intellitxt.com","whatthetech.us.intellitxt.com","whoateallthepies.uk.intellitxt.com","wincert.us.intellitxt.com","windowsbbs.us.intellitxt.com","windowsitpro.us.intellitxt.com","winmatrix.us.intellitxt.com","winterrowd.us.intellitxt.com","wiregirl.us.intellitxt.com","withleather.us.intellitxt.com","wm5fixsite.us.intellitxt.com","womensforum.us.intellitxt.com","worldnetdaily.us.intellitxt.com","wowinterface.us.intellitxt.com","wrestling-edge.us.intellitxt.com","wwtdd.us.intellitxt.com","x17online.us.intellitxt.com","xmlpitstop.us.intellitxt.com","yeeeah.us.intellitxt.com","yourtango.us.intellitxt.com","zatznotfunny.us.intellitxt.com","zeldalily.us.intellitxt.com","zug.us.intellitxt.com","environmentalgraffiti.uk.intellitxt.com","gadgets.fosfor.se.intellitxt.com","maccity.it.intellitxt.com","macuser.uk.intellitxt.com","macworld.uk.intellitxt.com","metro.uk.intellitxt.com","moviesonline.ca.intellitxt.com","newcarnet.uk.intellitxt.com","pcadvisor.uk.intellitxt.com","pcgameshardware.de.intellitxt.com","pspcave.uk.intellitxt.com","splashnews.uk.intellitxt.com"],"name":"Vibrant Ads","link":"https://www.ghostery.com/whotracksme/trackers/vibrant_ads"},{"id":"wtm_viacom_tag_container","hostnames":["btg.mtvnservices.com"],"name":"Viacom Tag Container","link":"https://www.ghostery.com/whotracksme/trackers/viacom_tag_container"},{"id":"wtm_vg_wort","hostnames":["ssl-vg03.met.vgwort.de"],"name":"VG Wort","link":"https://www.ghostery.com/whotracksme/trackers/vg_wort"},{"id":"wtm_verve_mobile","hostnames":["adcel.vrvm.com","ad.vrvm.com","ads.vrvm.com","adsdk.vrvm.com","cls.vrvm.com","creative-platform.vrvm.com","go.vrvm.com","images-static.vrvm.com","sdkconfig.vrvm.com","tags-prod.vrvm.com"],"name":"Verve Mobile","link":"https://www.ghostery.com/whotracksme/trackers/verve_mobile"},{"id":"wtm_veruta","hostnames":["adserver.veruta.com","ads.p.veruta.com"],"name":"Veruta","link":"https://www.ghostery.com/whotracksme/trackers/veruta"},{"id":"wtm_vertoz","hostnames":["ads.vertoz.com","banner.vrtzads.com"],"name":"Vertoz","link":"https://www.ghostery.com/whotracksme/trackers/vertoz"},{"id":"wtm_verticalscope","hostnames":["h.verticalscope.com","ads.verticalscope.com","api.verticalscope.com","static.verticalscope.com"],"name":"VerticalScope","link":"https://www.ghostery.com/whotracksme/trackers/verticalscope"},{"id":"wtm_verticalresponse","hostnames":["cts.vresp.com"],"name":"VerticalResponse","link":"https://www.ghostery.com/whotracksme/trackers/verticalresponse"},{"id":"wtm_vertical_leap","hostnames":["roi.vertical-leap.co.uk"],"name":"Vertical Leap","link":"https://www.ghostery.com/whotracksme/trackers/vertical_leap"},{"id":"wtm_vertical_acuity","hostnames":["cdn.syn.verticalacuity.com","scripts.verticalacuity.com","syn.verticalacuity.com"],"name":"Vertical Acuity","link":"https://www.ghostery.com/whotracksme/trackers/vertical_acuity"},{"id":"wtm_vero","hostnames":["d3qxef4rp70elm.cloudfront.net"],"name":"Vero","link":"https://www.ghostery.com/whotracksme/trackers/vero"},{"id":"wtm_veoxa","hostnames":["profiling.veoxa.com","vu.veoxa.com","tracking.veoxa.com"],"name":"Veoxa","link":"https://www.ghostery.com/whotracksme/trackers/veoxa"},{"id":"wtm_ve_interactive","hostnames":["cookiea1.veinteractive.com","cookiee1.veinteractive.com","dtrc.veinteractive.com","dtrchk.veinteractive.com","sessionapi.veinteractive.com","sessionapihk.veinteractive.com","veads.veinteractive.com","cdsusa.veinteractive.com","config1.veinteractive.com","drs2.veinteractive.com","configusa.veinteractive.com"],"name":"Ve Interactive","link":"https://www.ghostery.com/whotracksme/trackers/ve_interactive"},{"id":"wtm_varick_media_management","hostnames":["vmmpxl.com"],"name":"Varick Media Management","link":"https://www.ghostery.com/whotracksme/trackers/varick_media_management"},{"id":"wtm_valued_opinions","hostnames":["valuedopinions.co.uk"],"name":"Valued Opinions","link":"https://www.ghostery.com/whotracksme/trackers/valued_opinions"},{"id":"wtm_valuecommerce","hostnames":["valuecommerce.com","ad.jp.ap.valuecommerce.com","adpresso.valuecommerce.com","aml.valuecommerce.com","ck.jp.ap.valuecommerce.com","trj.valuecommerce.com"],"name":"ValueCommerce","link":"https://www.ghostery.com/whotracksme/trackers/valuecommerce"},{"id":"wtm_valueclick_media","hostnames":["valueclick.net","ads.he.valueclick.net"],"name":"ValueClick Media","link":"https://www.ghostery.com/whotracksme/trackers/valueclick_media"},{"id":"wtm_validclick","hostnames":["api.searchlinks.com","js.searchlinks.com"],"name":"ValidClick","link":"https://www.ghostery.com/whotracksme/trackers/validclick"},{"id":"wtm_valassis","hostnames":["ads.brand.net","vdrn.redplum.com"],"name":"Valassis","link":"https://www.ghostery.com/whotracksme/trackers/valassis"},{"id":"wtm_userreplay","hostnames":["userreplay.net"],"name":"UserReplay","link":"https://www.ghostery.com/whotracksme/trackers/userreplay"},{"id":"wtm_userdive","hostnames":["userdive.com"],"name":"USERDIVE","link":"https://www.ghostery.com/whotracksme/trackers/userdive"},{"id":"wtm_usemax","hostnames":["usemax.de","www.usemax.de"],"name":"Usemax","link":"https://www.ghostery.com/whotracksme/trackers/usemax"},{"id":"wtm_upland_clickability_beacon","hostnames":["s.clickability.com","cas.clickability.com","stats.clickability.com","cnn.entertainment.printthis.clickability.com","ads.clickability.com"],"name":"Upland Clickability Beacon","link":"https://www.ghostery.com/whotracksme/trackers/upland_clickability_beacon"},{"id":"wtm_untriel_finger_printing","hostnames":["src.kitcode.net"],"name":"Untriel Finger Printing","link":"https://www.ghostery.com/whotracksme/trackers/untriel_finger_printing"},{"id":"wtm_unruly_media","hostnames":["unrulymedia.com","r53.unrulymedia.com","stats3.r53.unrulymedia.com","rx-stats3.unrulymedia.com","stats3.unrulymedia.com","targeting.unrulymedia.com","pre-usermatch.targeting.unrulymedia.com","rx.targeting.unrulymedia.com","tag.targeting.unrulymedia.com","usermatch.targeting.unrulymedia.com","video.unrulymedia.com"],"name":"Unruly Media","link":"https://www.ghostery.com/whotracksme/trackers/unruly_media"},{"id":"wtm_unite","hostnames":["uadx.com","s.uadx.com"],"name":"Unite","link":"https://www.ghostery.com/whotracksme/trackers/unite"},{"id":"wtm_undertone","hostnames":["undertone.com","cdn.undertone.com","ads.undertone.com","creative-p.undertone.com","evt.undertone.com","hb.undertone.com","ops-cdn.undertone.com","origin-evt.undertone.com","usr.undertone.com"],"name":"Undertone","link":"https://www.ghostery.com/whotracksme/trackers/undertone"},{"id":"wtm_underdog_media","hostnames":["udmserve.net","cdn.udmserve.net","rt.udmserve.net"],"name":"Underdog Media","link":"https://www.ghostery.com/whotracksme/trackers/underdog_media"},{"id":"wtm_unanimis","hostnames":["unanimis.co.uk"],"name":"Unanimis","link":"https://www.ghostery.com/whotracksme/trackers/unanimis"},{"id":"wtm_uliza","hostnames":["ad-api-v01.uliza.jp"],"name":"Uliza","link":"https://www.ghostery.com/whotracksme/trackers/uliza"},{"id":"wtm_ucoz","hostnames":["binance-exchange.do.am","www.binance-exchange.do.am","a.ucoz.net","s212.ucoz.net","ucounter.ucoz.net"],"name":"uCoz","link":"https://www.ghostery.com/whotracksme/trackers/ucoz"},{"id":"wtm_ucfunnel","hostnames":["ucfunnel.com","cdn.aralego.net"],"name":"ucfunnel","link":"https://www.ghostery.com/whotracksme/trackers/ucfunnel"},{"id":"wtm_tynt","hostnames":["tynt.com","p1.tcr21.tynt.com","cdn.tynt.com","tcr.tynt.com","asd.tynt.com","ic.tynt.com","w1.tcr112.tynt.com","wau.tynt.com","www.tynt.com","www1.tynt.com","ac.tynt.com","asa.tynt.com","asb.tynt.com","p.ic.tynt.com","pb.tynt.com","w.ic.tynt.com","de.tynt.com"],"name":"33Across","link":"https://www.ghostery.com/whotracksme/trackers/tynt"},{"id":"wtm_twyn","hostnames":["twyn.com","et.twyn.com","tracknet.twyn.com"],"name":"Twyn","link":"https://www.ghostery.com/whotracksme/trackers/twyn"},{"id":"wtm_twittercounter","hostnames":["twittercounter.com"],"name":"TwitterCounter","link":"https://www.ghostery.com/whotracksme/trackers/twittercounter"},{"id":"wtm_twitter_syndication","hostnames":["syndication.twitter.com"],"name":"X Syndication","link":"https://www.ghostery.com/whotracksme/trackers/twitter_syndication"},{"id":"wtm_twitter","hostnames":["cworth.smartconvert.co","growth.smartconvert.co","plo.smartconvert.co","promo.smartconvert.co","promo-stage.smartconvert.co","promo-staging.smartconvert.co","promo-v2.smartconvert.co","recsite.smartconvert.co","site-dev.smartconvert.co","smartconvert.co","st.smartconvert.co","worth.smartconvert.co","wsite.smartconvert.co","www.smartconvert.co","shopecoheat.co","www.shopecoheat.co","flixsport.co","www.flixsport.co","apple-isupport.co","bitconnect.co","cbsmarket.co","go.tribefit.co","immediateconnect.co","immediategpt.co","smartbitboost.co","tetra-invest.co","www.apple-isupport.co","www.bitconnect.co","www.cbsmarket.co","www.go.tribefit.co","www.immediateconnect.co","www.immediategpt.co","www.smartbitboost.co","www.tetra-invest.co","olx.pl.oferta-payment.co","trade.eastscotinvest.co","www.olx.pl.oferta-payment.co","www.trade.eastscotinvest.co","iost.co","tenxwallet.co","augurproject.co","myetherwallet.co","myethterwallet.co","myehterwallet.co","my.ether-wallet.co","p.vibrant.co","t.omkt.co","365redirect.co","appleleaveit.co","hmizat.co","pageredirect.co","acces.streaming-direct.co","adbit.co","pleasewait.co","stream-direct.co","t.podcast.co","ttwitter.com","www.ttwitter.com","dumb-twitter.com","www.dumb-twitter.com","scribe.twitter.com","p.ttwitter.com","scribe.ttwitter.com","alidnx.com","beeglivesex.com","gainblox.com","log.getdropbox.com","mediadirectx.com","pf4y2a54hx.com","vitlescaux.com","b.zabbixx.com","alibaba.zzux.com","browserservice.zzux.com","s.clcktrax.com","update-information.zzux.com","www.update-information.zzux.com","information-security.zzux.com","www.information-security.zzux.com","amynx.com","hiperdex.com","prebids.adnsx.com","ad.caprofitx.com","stat.duokanbox.com","api.sdkbox.com","analytics.discountpowertx.com","sanalytics.box.com","analytics.box.com","smetrics.trellix.com","smetrics.webex.com","smetrics.carfax.com","adwcleaner.programmesetjeux.com","artcomix.com","banners.direction-x.com","brainfox.com","click.adimmix.com","directxex.com","doctor-alex.com","hidebux.com","images.brainfox.com","intera-x.com","modules.wcax.com","registryfix.com","sacredphoenix.com","search.brainfox.com","symantex.com","tnctrx.com","top.artcomix.com","wmmax.com","www.artcomix.com","www.brainfox.com","www.decografix.com","www.directxex.com","www.doctor-alex.com","www.hidebux.com","www.pc-detox.com","www.registryfix.com","www.sacredphoenix.com","www.symantex.com","www.wmmax.com","otherinbox.com","www.otherinbox.com","0dax.com","189zx.com","18hdxxx.com","1-pregnant-sex.com","2p9fyvx.com","4pornxxx.com","69boysex.com","a2sex.com","aaannuairex.com","abbeyxxx.com","aisiansex.com","alblux.com","apepix.com","avixxx.com","cinepornox.com","free-groupsex.com","godrix.com","grabbersex.com","idolax.com","ssl.eroscomix.com","www.0dax.com","www.189zx.com","www.18hdxxx.com","www.1-pregnant-sex.com","www.2p9fyvx.com","www.4pornxxx.com","www.a2sex.com","www.aaannuairex.com","www.aisiansex.com","www.alblux.com","www.apepix.com","www.free-groupsex.com","www.godrix.com","www.grabbersex.com","www.idolax.com","api-ldp.novaonx.com","chatbot-staging.novaonx.com","chatbot-tracking.novaonx.com","chatbot.novaonx.com","chatbotthoitrang.novaonx.com","chatbottudong.novaonx.com","landingpage.novaonx.com","novaonx.com","pub-dev.novaonx.com","staging.novaonx.com","www.novaonx.com","ccx.cococx.com","cd.cococx.com","cdp.cococx.com","gs.cococx.com","bgadx.com","ariix.com","bewoix.com","freevbuckx.com","galaxyprimefx.com","karnia-polska.checkout-x.com","randki-sex.com","rower-bix.com","shoppingbox.com","valinmix.com","waylandermix.com","www.ariix.com","www.bewoix.com","www.freevbuckx.com","www.galaxyprimefx.com","www.karnia-polska.checkout-x.com","www.randki-sex.com","www.rower-bix.com","www.shoppingbox.com","www.valinmix.com","www.waylandermix.com","apply-for-sex.com","www.apply-for-sex.com","fun-clix.com","www.fun-clix.com","24-news.shjfx.com","24trshhxx.com","24xforex.com","123goflix.com","282max.com","2020bmx.com","acesso-opinapix.com","agtech-x.com","ai.spiralingglobalnewsvortex.com","aipro-iplex.com","airalissflix.com","algaux.com","algotradingforex.com","anniesefx.com","anrimpex.com","antispam.cutmytax.com","api-apsx.com","appatex.com","applicationuiux.com","appnovix.com","areaflix.com","areanetflix.com","avpcfix.com","bbc-news.shjfx.com","bbs.cutmytax.com","beepfox.com","beriberikix.com","bestcustombox.com","betwithlex.com","bewarethegringotax.com","bibijoux.com","bigtrx.com","biobrainx.com","bmarindex.com","bobytex.com","bodananayalex.com","bossrex.com","brandonrx.com","brokerage-insider.shjfx.com","bucketlistbox.com","caropix.com","centogx.com","cesbox.com","chainlinkx.com","citrojugo-mx.com","coinvenditex.com","computingfox.com","cp-home-pl-0a70ab92eb9.platamix.com","cp-home-pl-00c7d71a5bb.platamix.com","cp-home-pl-0e5c66714e8.platamix.com","cp-home-pl-1f8755db207.platamix.com","cp-home-pl-2c4ab4638f7.platamix.com","cp-home-pl-2ca48aac74b.platamix.com","cp-home-pl-02fa9a4ad7c.platamix.com","cp-home-pl-4c253e3ddb9.platamix.com","cp-home-pl-4d3f85066ce.platamix.com","cp-home-pl-5efb49cc816.platamix.com","cp-home-pl-7e2f8237238.platamix.com","cp-home-pl-8c0d7846dd8.platamix.com","cp-home-pl-8fcd5038274.platamix.com","cp-home-pl-9a5e0af5e47.platamix.com","cp-home-pl-9ad28fcfa67.platamix.com","cp-home-pl-9eb6960f226.platamix.com","cp-home-pl-29a2b6bc2d0.platamix.com","cp-home-pl-36ac97110db.platamix.com","cp-home-pl-38ef7f1cff2.platamix.com","cp-home-pl-63fbd0987f9.platamix.com","cp-home-pl-73de1bd96de.platamix.com","cp-home-pl-82f359696e9.platamix.com","cp-home-pl-83c5041f93d.platamix.com","cp-home-pl-286eccd0e71.platamix.com","cp-home-pl-303a6f77b1a.platamix.com","cp-home-pl-418b357f146.platamix.com","cp-home-pl-460a4720b75.platamix.com","cp-home-pl-519c012ae4b.platamix.com","cp-home-pl-592c8c60792.platamix.com","cp-home-pl-595d1af36df.platamix.com","cp-home-pl-735be3ec01d.platamix.com","cp-home-pl-817d72f4e06.platamix.com","cp-home-pl-921e1b5ed5a.platamix.com","cp-home-pl-294804d6029.platamix.com","cp-home-pl-900126649f5.platamix.com","cp-home-pl-3435417376c.platamix.com","cp-home-pl-a5f4696e980.platamix.com","cp-home-pl-a84d2ffde32.platamix.com","cp-home-pl-a07551847c2.platamix.com","cp-home-pl-ad7d0c4741c.platamix.com","cp-home-pl-aee9519f2ef.platamix.com","cp-home-pl-b4d1fb83b73.platamix.com","cp-home-pl-b4e196a61ef.platamix.com","cp-home-pl-b72ad15b53c.platamix.com","cp-home-pl-bd9cd0de9ba.platamix.com","cp-home-pl-bd718badcd0.platamix.com","cp-home-pl-be83a4768d1.platamix.com","cp-home-pl-c2b3327446f.platamix.com","cp-home-pl-c12e14d75d8.platamix.com","cp-home-pl-cc6fa90165b.platamix.com","cp-home-pl-ce19b22f5de.platamix.com","cp-home-pl-d9be1c1b8a7.platamix.com","cp-home-pl-d61494ee82a.platamix.com","cp-home-pl-e2aef914129.platamix.com","cp-home-pl-e5fa7cf9ecf.platamix.com","cp-home-pl-e8c0cc684c0.platamix.com","cp-home-pl-e94af04db11.platamix.com","cp-home-pl-e84772fe19f.platamix.com","cp-home-pl-ea598dc8ed4.platamix.com","cp-home-pl-eab651468fe.platamix.com","cp-home-pl-f6cb819da41.platamix.com","cp-home-pl-f657f000e2e.platamix.com","cp-home-pl-f19646b1aec.platamix.com","crescentmoonmux.com","crewmaxx.com","cryptofundfx.com","cryptoxix.com","cumsexx.com","cutmytax.com","cvlinx.com","danielhix.com","deepemailbox.com","deicx.com","digitalmarketradex.com","dmxbdkccvaqnx.com","dnhmgpqkvufx.com","dolfinex.com","doutbox.com","dragonnex.com","droqpbox.com","easifixx.com","echangessubversifsglobaux.com","eclipsephasemux.com","embeddedblackbox.com","emv1.chainlinkx.com","emv1.citrojugo-mx.com","emv1.cvlinx.com","emv1.deicx.com","emv1.gksgearbox.com","emv1.imnovalux.com","emv1.iptv-vortex.com","emv1.mangadexx.com","emv1.nda-x.com","emv1.plantvx.com","emv1.reolx.com","emv1.soultraitfix.com","emv1.ssccglapex.com","emv1.vidaflix.com","erebux.com","erizopdx.com","esportsrtx.com","ethereum-eprex.com","event-prizex.com","falcomax.com","fantmx.com","fastlinkafricax.com","fcwrxx.com","fecutex.com","fermen-tonix.com","fezorex.com","fgxhgautodiscover.cvlinx.com","financial-news.shjfx.com","finmaxfx.com","focalpointrx.com","foody-box.com","foresight-development-pdx.com","freelolx.com","gabemaddex.com","gamerchampionx.com","ganhecompix.com","gazeta-pl.shjfx.com","getlootbox.com","getvoltbox.com","gksgearbox.com","gladiatorinvestmentstx.com","gloverparadox.com","godamorx.com","gospodarka.europaclicx.com","gotrpix.com","gourmatrix.com","gpthomex.com","grafaux.com","greenmx.com","guarderex.com","hacresmax.com","harmanimpex.com","hdmi-matrix.com","helpofix.com","herbalpharmarx.com","herbifex.com","hidetox.com","hiviju.surveyprizebox.com","home-pl-5fa6daf1a4c.platamix.com","home-pl-98b6f5e2a73.platamix.com","home-pl-841cdff30ef.platamix.com","home-pl-770698dc0f3.platamix.com","home-pl-ce53e242d25.platamix.com","horizenex.com","hostmaster.coinvenditex.com","hyraxx.com","iaprcapex.com","icefenix.com","iddux.com","igmatrix.com","ijsforex.com","ilolx.com","imarcapex.com","immediate-apex.com","immediate-bitnex.com","immediate-capex.com","immediate-coraldex.com","immediate-pro-capex.com","immediate-procapex.com","immediate-promatrix.com","immediate-serax.com","immediate-vortex.com","immediateanredex.com","immediateapex.com","immediateedge-vertex.com","immediateiplex.com","immediatematrix.com","immediateprocapex.com","immediateserax.com","immprocapex.com","imnovalux.com","insight-tauron.shjfx.com","instant-max.com","intcommex.com","intelbondfx.com","invotrax.com","ioflix.com","iptv-vortex.com","irotradex.com","isglobalmx.com","jobsnex.com","joinourplanetx.com","jyq.reolx.com","k5b2d4.deicx.com","kanbix.com","kingmoviesfox.com","klienci-indywidualne-santander-sa.bit-fax.com","korrectfx.com","laujardeandarax.com","lmaox.com","loadrix.com","lojatechbox.com","looks-max.com","luxuryloox.com","lyricarx.com","madeintex.com","magicsmilemx.com","mail.deicx.com","makemefamex.com","mangadexx.com","mardur-pontux.com","matthewlemieux.com","mechatrox.com","media-brokerage.shjfx.com","mewapolytex.com","milematrix.com","minkafox.com","mnvex.com","modiarox.com","monfex.com","mopieflix.com","mopiex.com","mtvlex.com","multiglobaldivefinx.com","myprotradingfx.com","myspacedex.com","nda-x.com","new.europaclicx.com","newmedia.europaclicx.com","news-insight.europaclicx.com","ninthstreetbmx.com","oilfolex.com","onlinovax.com","opencx.com","oxoxx.com","painterflex.com","panterix.com","patronfx.com","pierrox.com","pixelvex.com","pl-podx.com","plantvx.com","platamix.com","pluspointgrafix.com","po.fyybox.com","poland.europaclicx.com","poncox.com","pro-pawbiotix.com","pro-protetox.com","prosystemmax.com","q4wx.com","quantum-evortex.com","quotex.com","radio-fm24maxx.com","rainhex.com","rasaviimpex.com","reachinbox.com","rendinnzax.com","renewfiix.com","renewflix.com","reolx.com","reshupoojabox.com","retailmebox.com","rogunix.com","sanjeevimpex.com","santanacomex.com","schoolcocinerosmx.com","sdzejx.com","sev6.boostpro-x.com","showmeflix.com","silvuax.com","simatx.com","sistema-ux.com","smartline-x.com","snapfilmsmx.com","soporteishop-mx.com","soultraitfix.com","spiritubox.com","ssccglapex.com","stegosaurusrex.com","streamboox.com","subemax.com","suscita-tx.com","suscriptn-nflix.com","symerax.com","symerex.com","t9l0p2.cvlinx.com","takfix.com","talentflixx.com","tenninefix.com","terratranzex.com","testimonialx.com","theimmediatecoraldex.com","theprezziebox.com","toplearnlinux.com","tradeserax.com","tryvix.com","unififorex.com","us-blackox.com","valofox.com","valormix.com","valorux.com","vidaflix.com","vipcases-box.com","w79m331fb3t3v4mvilvpsfa0.tripmatrixx.com","wc48fn9qt89tq3mv2epi8jfs.tripmatrixx.com","wdw-roblox.com","wetnwildsex.com","whitewortex.com","wolbix.com","wow-roblox.com","wrestletix.com","wvvw-robox.com","wvw-robox.com","www.24-news.shjfx.com","www.24trshhxx.com","www.24xforex.com","www.123goflix.com","www.282max.com","www.2020bmx.com","www.acesso-opinapix.com","www.agtech-x.com","www.ai.spiralingglobalnewsvortex.com","www.aipro-iplex.com","www.airalissflix.com","www.algaux.com","www.algotradingforex.com","www.anniesefx.com","www.anrimpex.com","www.antispam.cutmytax.com","www.api-apsx.com","www.appatex.com","www.applicationuiux.com","www.appnovix.com","www.areaflix.com","www.areanetflix.com","www.avpcfix.com","www.bbc-news.shjfx.com","www.bbs.cutmytax.com","www.beepfox.com","www.beriberikix.com","www.bestcustombox.com","www.betwithlex.com","www.bewarethegringotax.com","www.bibijoux.com","www.bigtrx.com","www.biobrainx.com","www.bmarindex.com","www.bobytex.com","www.bodananayalex.com","www.bossrex.com","www.brandonrx.com","www.brokerage-insider.shjfx.com","www.bucketlistbox.com","www.caropix.com","www.centogx.com","www.cesbox.com","www.chainlinkx.com","www.citrojugo-mx.com","www.coinvenditex.com","www.computingfox.com","www.cp-home-pl-0a70ab92eb9.platamix.com","www.cp-home-pl-00c7d71a5bb.platamix.com","www.cp-home-pl-0e5c66714e8.platamix.com","www.cp-home-pl-1f8755db207.platamix.com","www.cp-home-pl-2c4ab4638f7.platamix.com","www.cp-home-pl-2ca48aac74b.platamix.com","www.cp-home-pl-02fa9a4ad7c.platamix.com","www.cp-home-pl-4c253e3ddb9.platamix.com","www.cp-home-pl-4d3f85066ce.platamix.com","www.cp-home-pl-5efb49cc816.platamix.com","www.cp-home-pl-7e2f8237238.platamix.com","www.cp-home-pl-8c0d7846dd8.platamix.com","www.cp-home-pl-8fcd5038274.platamix.com","www.cp-home-pl-9a5e0af5e47.platamix.com","www.cp-home-pl-9ad28fcfa67.platamix.com","www.cp-home-pl-9eb6960f226.platamix.com","www.cp-home-pl-29a2b6bc2d0.platamix.com","www.cp-home-pl-36ac97110db.platamix.com","www.cp-home-pl-38ef7f1cff2.platamix.com","www.cp-home-pl-63fbd0987f9.platamix.com","www.cp-home-pl-73de1bd96de.platamix.com","www.cp-home-pl-82f359696e9.platamix.com","www.cp-home-pl-83c5041f93d.platamix.com","www.cp-home-pl-286eccd0e71.platamix.com","www.cp-home-pl-303a6f77b1a.platamix.com","www.cp-home-pl-418b357f146.platamix.com","www.cp-home-pl-460a4720b75.platamix.com","www.cp-home-pl-519c012ae4b.platamix.com","www.cp-home-pl-592c8c60792.platamix.com","www.cp-home-pl-595d1af36df.platamix.com","www.cp-home-pl-735be3ec01d.platamix.com","www.cp-home-pl-817d72f4e06.platamix.com","www.cp-home-pl-921e1b5ed5a.platamix.com","www.cp-home-pl-294804d6029.platamix.com","www.cp-home-pl-900126649f5.platamix.com","www.cp-home-pl-3435417376c.platamix.com","www.cp-home-pl-a5f4696e980.platamix.com","www.cp-home-pl-a84d2ffde32.platamix.com","www.cp-home-pl-a07551847c2.platamix.com","www.cp-home-pl-ad7d0c4741c.platamix.com","www.cp-home-pl-aee9519f2ef.platamix.com","www.cp-home-pl-b4d1fb83b73.platamix.com","www.cp-home-pl-b4e196a61ef.platamix.com","www.cp-home-pl-b72ad15b53c.platamix.com","www.cp-home-pl-bd9cd0de9ba.platamix.com","www.cp-home-pl-bd718badcd0.platamix.com","www.cp-home-pl-be83a4768d1.platamix.com","www.cp-home-pl-c2b3327446f.platamix.com","www.cp-home-pl-c12e14d75d8.platamix.com","www.cp-home-pl-cc6fa90165b.platamix.com","www.cp-home-pl-ce19b22f5de.platamix.com","www.cp-home-pl-d9be1c1b8a7.platamix.com","www.cp-home-pl-d61494ee82a.platamix.com","www.cp-home-pl-e2aef914129.platamix.com","www.cp-home-pl-e5fa7cf9ecf.platamix.com","www.cp-home-pl-e8c0cc684c0.platamix.com","www.cp-home-pl-e94af04db11.platamix.com","www.cp-home-pl-e84772fe19f.platamix.com","www.cp-home-pl-ea598dc8ed4.platamix.com","www.cp-home-pl-eab651468fe.platamix.com","www.cp-home-pl-f6cb819da41.platamix.com","www.cp-home-pl-f657f000e2e.platamix.com","www.cp-home-pl-f19646b1aec.platamix.com","www.crescentmoonmux.com","www.crewmaxx.com","www.cryptofundfx.com","www.cryptoxix.com","www.cumsexx.com","www.cutmytax.com","www.cvlinx.com","www.danielhix.com","www.deepemailbox.com","www.deicx.com","www.digitalmarketradex.com","www.dmxbdkccvaqnx.com","www.dnhmgpqkvufx.com","www.dolfinex.com","www.doutbox.com","www.dragonnex.com","www.droqpbox.com","www.easifixx.com","www.echangessubversifsglobaux.com","www.eclipsephasemux.com","www.embeddedblackbox.com","www.emv1.chainlinkx.com","www.emv1.citrojugo-mx.com","www.emv1.cvlinx.com","www.emv1.deicx.com","www.emv1.gksgearbox.com","www.emv1.imnovalux.com","www.emv1.iptv-vortex.com","www.emv1.mangadexx.com","www.emv1.nda-x.com","www.emv1.plantvx.com","www.emv1.reolx.com","www.emv1.soultraitfix.com","www.emv1.ssccglapex.com","www.emv1.vidaflix.com","www.erebux.com","www.erizopdx.com","www.esportsrtx.com","www.ethereum-eprex.com","www.event-prizex.com","www.falcomax.com","www.fantmx.com","www.fastlinkafricax.com","www.fcwrxx.com","www.fecutex.com","www.fermen-tonix.com","www.fezorex.com","www.fgxhgautodiscover.cvlinx.com","www.financial-news.shjfx.com","www.finmaxfx.com","www.focalpointrx.com","www.foody-box.com","www.foresight-development-pdx.com","www.freelolx.com","www.gabemaddex.com","www.gamerchampionx.com","www.ganhecompix.com","www.gazeta-pl.shjfx.com","www.getlootbox.com","www.getvoltbox.com","www.gksgearbox.com","www.gladiatorinvestmentstx.com","www.gloverparadox.com","www.godamorx.com","www.gospodarka.europaclicx.com","www.gotrpix.com","www.gourmatrix.com","www.gpthomex.com","www.grafaux.com","www.greenmx.com","www.guarderex.com","www.hacresmax.com","www.harmanimpex.com","www.hdmi-matrix.com","www.helpofix.com","www.herbalpharmarx.com","www.herbifex.com","www.hidetox.com","www.hiviju.surveyprizebox.com","www.home-pl-5fa6daf1a4c.platamix.com","www.home-pl-98b6f5e2a73.platamix.com","www.home-pl-841cdff30ef.platamix.com","www.home-pl-770698dc0f3.platamix.com","www.home-pl-ce53e242d25.platamix.com","www.horizenex.com","www.hostmaster.coinvenditex.com","www.hyraxx.com","www.iaprcapex.com","www.icefenix.com","www.iddux.com","www.igmatrix.com","www.ijsforex.com","www.ilolx.com","www.imarcapex.com","www.immediate-apex.com","www.immediate-bitnex.com","www.immediate-capex.com","www.immediate-coraldex.com","www.immediate-pro-capex.com","www.immediate-procapex.com","www.immediate-promatrix.com","www.immediate-serax.com","www.immediate-vortex.com","www.immediateanredex.com","www.immediateapex.com","www.immediateedge-vertex.com","www.immediateiplex.com","www.immediatematrix.com","www.immediateprocapex.com","www.immediateserax.com","www.immprocapex.com","www.imnovalux.com","www.insight-tauron.shjfx.com","www.instant-max.com","www.intcommex.com","www.intelbondfx.com","www.invotrax.com","www.ioflix.com","www.iptv-vortex.com","www.irotradex.com","www.isglobalmx.com","www.jobsnex.com","www.joinourplanetx.com","www.jyq.reolx.com","www.k5b2d4.deicx.com","www.kanbix.com","www.kingmoviesfox.com","www.klienci-indywidualne-santander-sa.bit-fax.com","www.korrectfx.com","www.laujardeandarax.com","www.lmaox.com","www.loadrix.com","www.lojatechbox.com","www.looks-max.com","www.luxuryloox.com","www.lyricarx.com","www.madeintex.com","www.magicsmilemx.com","www.mail.deicx.com","www.makemefamex.com","www.mangadexx.com","www.mardur-pontux.com","www.matthewlemieux.com","www.mechatrox.com","www.media-brokerage.shjfx.com","www.mewapolytex.com","www.milematrix.com","www.minkafox.com","www.mnvex.com","www.modiarox.com","www.monfex.com","www.mopieflix.com","www.mopiex.com","www.mtvlex.com","www.multiglobaldivefinx.com","www.myprotradingfx.com","www.myspacedex.com","www.nda-x.com","www.new.europaclicx.com","www.newmedia.europaclicx.com","www.news-insight.europaclicx.com","www.ninthstreetbmx.com","www.oilfolex.com","www.onlinovax.com","www.opencx.com","www.oxoxx.com","www.painterflex.com","www.panterix.com","www.patronfx.com","www.pierrox.com","www.pixelvex.com","www.pl-podx.com","www.plantvx.com","www.platamix.com","www.pluspointgrafix.com","www.po.fyybox.com","www.poland.europaclicx.com","www.poncox.com","www.pro-pawbiotix.com","www.pro-protetox.com","www.prosystemmax.com","www.q4wx.com","www.quantum-evortex.com","www.quotex.com","www.radio-fm24maxx.com","www.rainhex.com","www.rasaviimpex.com","www.reachinbox.com","www.rendinnzax.com","www.renewfiix.com","www.renewflix.com","www.reolx.com","www.reshupoojabox.com","www.retailmebox.com","www.rogunix.com","www.sanjeevimpex.com","www.santanacomex.com","www.schoolcocinerosmx.com","www.sdzejx.com","www.sev6.boostpro-x.com","www.showmeflix.com","www.silvuax.com","www.simatx.com","www.sistema-ux.com","www.smartline-x.com","www.snapfilmsmx.com","www.soporteishop-mx.com","www.soultraitfix.com","www.spiritubox.com","www.ssccglapex.com","www.stegosaurusrex.com","www.streamboox.com","www.subemax.com","www.suscita-tx.com","www.suscriptn-nflix.com","www.symerax.com","www.symerex.com","www.t9l0p2.cvlinx.com","www.takfix.com","www.talentflixx.com","www.tenninefix.com","www.terratranzex.com","www.testimonialx.com","www.theimmediatecoraldex.com","www.theprezziebox.com","www.toplearnlinux.com","www.tradeserax.com","www.tryvix.com","www.unififorex.com","www.us-blackox.com","www.valofox.com","www.valormix.com","www.valorux.com","www.vidaflix.com","www.vipcases-box.com","www.w79m331fb3t3v4mvilvpsfa0.tripmatrixx.com","www.wc48fn9qt89tq3mv2epi8jfs.tripmatrixx.com","www.wdw-roblox.com","www.wetnwildsex.com","www.whitewortex.com","www.wolbix.com","www.wow-roblox.com","www.wrestletix.com","www.wvvw-robox.com","www.wvw-robox.com","www.x.hemonx.com","www.xiunux.com","www.yournetflix.com","www.yurtravaux.com","x.hemonx.com","xiunux.com","yournetflix.com","yurtravaux.com","tvmovie.mtvlex.com","www.tvmovie.mtvlex.com","ibittreix.com","bitfienex.com","bittirrex.com","bllttriex.com","bllttrex.com","bilttrex.com","reservations-lodgix.com","software-lodgix.com","blocknux.com","advertising.dclux.com","ad03.doubleadx.com","track.dvdbox.com","ads.eccentrix.com","a.farlex.com","vlog.leadformix.com","www.mmaaxx.com","www.netmaxx.com","ads.olx.com","trackaffpix.com","ybex.com","yllix.com","ad.zanox.com","static.zanox.com","webmaster.worldsex.com","tracking.olx.com","ad.flux.com","t.flux.com","statdb.pressflex.com","adsys.adk2x.com","trax.prostrax.com","s.uadx.com","www.dntx.com","uadx.com","cdn.adquantix.com","felix.data.tm-awx.com","protect-x.com","bbtv.blinkx.com","textad.socialsex.com","api.zanox.com","www.loggerx.com","ads.sxx.com","spads.yamx.com","3animalsex.com","www.3animalsex.com","ads.ad4max.com","stat.ganbox.com","banners.yllix.com","click2.yllix.com","collector.deepmetrix.com","www.deepmetrix.com","ocxxx.com","affiliates.thrixxx.com","content.thrixxx.com","inm.affinitymatrix.com","metrics.centex.com","a.fox.com","mapstats.blogflux.com","topsites.blogflux.com","geo.deepmetrix.com","www.acmexxx.com","count.9yx.com","fishclix.com","www.fishclix.com","pulsix.com","www.pulsix.com","ads.bidclix.com","www.bidclix.com","ads.pressflex.com","adserver.pressflex.com","mi.adinterax.com","adinterax.com","www.adinterax.com","request.czilladx.com","kids-in-sandbox.com","www.kids-in-sandbox.com","counter.nowlinux.com","post.update.fbsbx.com","s.update.fbsbx.com","t.signauxdeux.com","t.update.fbsbx.com","tr.adinterax.com","track.msadcenter.sax.com","track.msadcenter.tux.com","track.msadcenter.usx.com","track.msadcenter.xxx.com","track.msadcenter.zlx.com","tracker.netklix.com","tracking.nesox.com","www.stattrax.com","nactx.com","novemberrainx.com","oix.com","profilenetflix.com","russian-sex.com","watch-netfiix.com","www.novemberrainx.com","www.oix.com","www.russian-sex.com","6kup12tgxx.com","ads.addynamix.com","ads.collegemix.com","ads.fox.com","ads.mail3x.com","ads.mircx.com","adserver.humanux.com","adstract.adk2x.com","amrytt.adk2x.com","auxin-box.com","babanetwork.adk2x.com","banstex.com","c.anytrx.com","canadaalltax.com","cdn.freejax.com","cdn.wg.uproxx.com","clicks.adultplex.com","czilladx.com","games.superappbox.com","gaming-box.com","gcirm.muskogeephoenix.com","img.xnxx.com","intensedigital.adk2x.com","jac.yahoosandbox.com","load.focalex.com","movsflix.com","msonebox.com","multi.xnxx.com","netshelter.adtrix.com","profile.uproxx.com","ps4ux.com","ptirgaux.com","s.optnx.com","script.banstex.com","serve.freegaypix.com","sexpartnerx.com","speednetwork14.adk2x.com","speednetwork6.adk2x.com","spinbox.com","stephanie.tnctrx.com","tradelax.com","videobox.com","wmedia.adk2x.com","www.adlogix.com","www.admex.com","www.adtrix.com","www.banstex.com","www.bjhdrx.com","www.e-bannerx.com","www.focalex.com","www.inflationbreedinghoax.com","www.sexpartnerx.com","www.spinbox.com","www.tradelax.com","yepdigital.adk2x.com","zu1.november-lax.com","images.revtrax.com","oascentral.gigex.com","oascentral.newsmax.com","oascentral.thephoenix.com","ad-nex.com","ad-vanx.com","adk2x.com","ashot.txxx.com","caprofitx.com","dot-metrix.com","hermesmax.com","mmaaxx.com","www.sexpixbox.com","www.store-mix.com","adfeed.marchex.com","adjix.com","adloox.com","admex.com","ads.clasificadox.com","ads.easy-forex.com","ads.kinxxx.com","adtriplex.com","advertisingbox.com","anstrex.com","banners.babylon-x.com","bidclix.com","call-ad-network-api.marchex.com","click.infoblox.com","cootlogix.com","dk4ywix.com","gstaticx.com","innocentwax.com","intelligenceadx.com","optnx.com","ppc.adhere.marchex.com","proof-x.com","qrlsx.com","reactx.com","realclix.com","remox.com","reyden-x.com","t.bawafx.com","telemetry.dropbox.com","telemetry.v.dropbox.com","ultimateclixx.com","videoadex.com","waardex.com","www.kaplanindex.com","zanox.com","apicosdk.onemt.co","apicssdk.onemt.co","prod.sift.co","sgbid.prod.sift.co","vabid.prod.sift.co","sift-campaign-creatives.sift.co","pixel-geo.prfct.co","ads-api.twitter.com","ads-twitter.com","static.ads-twitter.com","ads.twitter.com","ads-bidder-api.twitter.com","analytics.twitter.com","media.complex.com","tracking.lenzmx.com","campaign.ad-brix.com","config.ad-brix.com","cvr.ad-brix.com","tracking.ad-brix.com","cdn1.adcdnx.com","adgrx.com","cdn.adgrx.com","cdn-stv.adgrx.com","cm.adgrx.com","rtb.adgrx.com","tvx.adgrx.com","async01.admantx.com","euasync01.admantx.com","usasync01.admantx.com","api.appodealx.com","api-us.appodealx.com","atlassbx.com","geo.atlassbx.com","axonix.com","biddingx.com","masky.biddingx.com","ana.masky.biddingx.com","cm.masky.biddingx.com","tags.bkrtx.com","cdn.caprofitx.com","assets.connatix.com","capi.connatix.com","cd.connatix.com","cdm.connatix.com","cdn.connatix.com","cds.connatix.com","ck.connatix.com","cks.connatix.com","core.connatix.com","i.connatix.com","img.connatix.com","vid.connatix.com","openrtb.cootlogix.com","prebid.cootlogix.com","smetrics.cox.com","t.domdex.com","magnetic.t.domdex.com","controller.duokanbox.com","mobile.controller.duokanbox.com","fm.duokanbox.com","metrics.fedex.com","b.fox.com","everlywell.cname.getrockerbox.com","live.hyprmx.com","marketplace-android-b235.hyprmx.com","static.hyprmx.com","imwx.com","as.jivox.com","as-ttd.jivox.com","assetscdn.jivox.com","cdn.jivox.com","cdn-as.jivox.com","evs.jivox.com","pxl.jivox.com","sync.jivox.com","traffick.jivox.com","ping-meta-prd.jwpltx.com","prd.jwpltx.com","knorex.com","partner.knorex.com","next.lenzmx.com","mobclix.com","data.mobclix.com","mobfox.com","push.mobilefonex.com","ichnaea-web.netflix.com","nmtracking.netflix.com","presentationtracking.netflix.com","update.openx.com","s.update.openx.com","stats.playrix.com","polarcdn-terrax.com","ads.roblox.com","metrics.roblox.com","metrics.sdkbox.com","update.sdkbox.com","smadex.com","cm.smadex.com","creatives.smadex.com","geo-tracker.smadex.com","static-content-1.smadex.com","c.socialannex.com","cdn.socialannex.com","u.superadbox.com","tappx.com","api.tappx.com","ssp.api.tappx.com","track.tappx.com","imp.track.tappx.com","api.theadex.com","tracking-3-9f58.trnox.com","truex.com","ctv.truex.com","static.vilynx.com","stats.zotabox.com","smetrics.fedex.com","getrockerbox.com","www.getrockerbox.com","herbcomplex.com","socialmediaplex.com","www.herbcomplex.com","www.socialmediaplex.com","t.bmmetrix.com","www.bmmetrix.com","email-reflex.com","expo-max.com","x.imwx.com","dmp.theadex.com","www.bkrtx.com","ads.mobclix.com","s.mobclix.com","connatix.com","a.adtpix.com","jwpltx.com","i.n.jwpltx.com","ad.himediadx.com","keywordmax.com","www.keywordmax.com","cdn.atlassbx.com","xpl.theadex.com","my.mobfox.com","www.ftjcfx.com","bes.mobfox.com","bkrtx.com","jivox.com","ns-vip2.hitbox.com","ns-vip3.hitbox.com","ns2.hitbox.com","tracking.keywordmax.com","www.jivox.com","adminec1.hitbox.com","ads.hitbox.com","ai.hitbox.com","counter.hitbox.com","counter2.hitbox.com","dev101.hitbox.com","download.hitbox.com","ec1.hitbox.com","ehg-247internet.hitbox.com","ehg-accuweather.hitbox.com","ehg-acdsystems.hitbox.com","ehg-adeptscience.hitbox.com","ehg-affinitynet.hitbox.com","ehg-aha.hitbox.com","ehg-amerix.hitbox.com","ehg-apcc.hitbox.com","ehg-ati.hitbox.com","ehg-attenza.hitbox.com","ehg-autodesk.hitbox.com","ehg-baa.hitbox.com","ehg-backweb.hitbox.com","ehg-bestbuy.hitbox.com","ehg-bizjournals.hitbox.com","ehg-boschsiemens.hitbox.com","ehg-bskyb.hitbox.com","ehg-cafepress.hitbox.com","ehg-careerbuilder.hitbox.com","ehg-cbc.hitbox.com","ehg-cbs.hitbox.com","ehg-cbsradio.hitbox.com","ehg-cedarpoint.hitbox.com","ehg-clearchannel.hitbox.com","ehg-closetmaid.hitbox.com","ehg-commjun.hitbox.com","ehg-communityconnect.hitbox.com","ehg-comscore.hitbox.com","ehg-corusentertainment.hitbox.com","ehg-coverityinc.hitbox.com","ehg-crain.hitbox.com","ehg-ctv.hitbox.com","ehg-cygnusbm.hitbox.com","ehg-datamonitor.hitbox.com","ehg-dig.hitbox.com","ehg-digg.hitbox.com","ehg-eckounlimited.hitbox.com","ehg-esa.hitbox.com","ehg-espn.hitbox.com","ehg-fifa.hitbox.com","ehg-findlaw.hitbox.com","ehg-foundation.hitbox.com","ehg-foxsports.hitbox.com","ehg-futurepub.hitbox.com","ehg-gamedaily.hitbox.com","ehg-gamespot.hitbox.com","ehg-gatehousemedia.hitbox.com","ehg-glam.hitbox.com","ehg-groceryworks.hitbox.com","ehg-groupernetworks.hitbox.com","ehg-guardian.hitbox.com","ehg-hasbro.hitbox.com","ehg-hellodirect.hitbox.com","ehg-himedia.hitbox.com","ehg-hitent.hitbox.com","ehg-hollywood.hitbox.com","ehg-idg.hitbox.com","ehg-idgentertainment.hitbox.com","ehg-ifilm.hitbox.com","ehg-ignitemedia.hitbox.com","ehg-intel.hitbox.com","ehg-ittoolbox.hitbox.com","ehg-itworldcanada.hitbox.com","ehg-kingstontechnology.hitbox.com","ehg-knightridder.hitbox.com","ehg-learningco.hitbox.com","ehg-legonewyorkinc.hitbox.com","ehg-liveperson.hitbox.com","ehg-macpublishingllc.hitbox.com","ehg-macromedia.hitbox.com","ehg-magicalia.hitbox.com","ehg-maplesoft.hitbox.com","ehg-mgnlimited.hitbox.com","ehg-mindshare.hitbox.com","ehg-mtv.hitbox.com","ehg-mybc.hitbox.com","ehg-newegg.hitbox.com","ehg-newscientist.hitbox.com","ehg-nokiafin.hitbox.com","ehg-novell.hitbox.com","ehg-nvidia.hitbox.com","ehg-oreilly.hitbox.com","ehg-pacifictheatres.hitbox.com","ehg-pennwell.hitbox.com","ehg-peoplesoft.hitbox.com","ehg-philipsvheusen.hitbox.com","ehg-pizzahut.hitbox.com","ehg-playboy.hitbox.com","ehg-qualcomm.hitbox.com","ehg-quantumcorp.hitbox.com","ehg-randomhouse.hitbox.com","ehg-redherring.hitbox.com","ehg-register.hitbox.com","ehg-researchinmotion.hitbox.com","ehg-rfa.hitbox.com","ehg-rodale.hitbox.com","ehg-salesforce.hitbox.com","ehg-salonmedia.hitbox.com","ehg-samsungusa.hitbox.com","ehg-seca.hitbox.com","ehg-shoppersdrugmart.hitbox.com","ehg-sonybssc.hitbox.com","ehg-sonycomputer.hitbox.com","ehg-sonyelec.hitbox.com","ehg-sonymusic.hitbox.com","ehg-sonyny.hitbox.com","ehg-space.hitbox.com","ehg-streamload.hitbox.com","ehg-superpages.hitbox.com","ehg-techtarget.hitbox.com","ehg-tfl.hitbox.com","ehg-thefirstchurchchrist.hitbox.com","ehg-tigerdirect.hitbox.com","ehg-tigerdirect2.hitbox.com","ehg-topps.hitbox.com","ehg-tribute.hitbox.com","ehg-tumbleweed.hitbox.com","ehg-ubisoft.hitbox.com","ehg-uniontrib.hitbox.com","ehg-usnewsworldreport.hitbox.com","ehg-verizoncommunications.hitbox.com","ehg-viacom.hitbox.com","ehg-vmware.hitbox.com","ehg-vonage.hitbox.com","ehg-wachovia.hitbox.com","ehg-wacomtechnology.hitbox.com","ehg-womanswallstreet.hitbox.com","ehg-wss.hitbox.com","ehg-xxolympicwintergames.hitbox.com","ehg-yellowpages.hitbox.com","ehg-youtube.hitbox.com","ehg.hitbox.com","ejs.hitbox.com","enterprise.hitbox.com","esg.hitbox.com","evwr.hitbox.com","get.hitbox.com","hg1.hitbox.com","hg10.hitbox.com","hg11.hitbox.com","hg12.hitbox.com","hg13.hitbox.com","hg14.hitbox.com","hg15.hitbox.com","hg16.hitbox.com","hg17.hitbox.com","hg2.hitbox.com","hg6a.hitbox.com","hitbox.com","host6.hitbox.com","ias.hitbox.com","ias2.hitbox.com","ibg.hitbox.com","ics.hitbox.com","idb.hitbox.com","js1.hitbox.com","lookup.hitbox.com","mrtg.hitbox.com","myhitbox.com","nei.hitbox.com","noc.hitbox.com","ns1.hitbox.com","oas.hitbox.com","phg.hitbox.com","rd1.hitbox.com","reseller.hitbox.com","resources.hitbox.com","sitesearch.hitbox.com","ss.hitbox.com","stage.hitbox.com","stage101.hitbox.com","stage102.hitbox.com","stage103.hitbox.com","stats.hitbox.com","stats2.hitbox.com","stats3.hitbox.com","tetra.hitbox.com","tools.hitbox.com","tools2.hitbox.com","toolsa.hitbox.com","ts1.hitbox.com","ts2.hitbox.com","vwr1.hitbox.com","w1.hitbox.com","w10.hitbox.com","w100.hitbox.com","w101.hitbox.com","w102.hitbox.com","w103.hitbox.com","w104.hitbox.com","w105.hitbox.com","w106.hitbox.com","w107.hitbox.com","w108.hitbox.com","w109.hitbox.com","w11.hitbox.com","w110.hitbox.com","w111.hitbox.com","w112.hitbox.com","w113.hitbox.com","w114.hitbox.com","w115.hitbox.com","w116.hitbox.com","w117.hitbox.com","w118.hitbox.com","w119.hitbox.com","w12.hitbox.com","w120.hitbox.com","w121.hitbox.com","w122.hitbox.com","w123.hitbox.com","w124.hitbox.com","w126.hitbox.com","w128.hitbox.com","w129.hitbox.com","w13.hitbox.com","w130.hitbox.com","w131.hitbox.com","w132.hitbox.com","w133.hitbox.com","w135.hitbox.com","w136.hitbox.com","w137.hitbox.com","w138.hitbox.com","w139.hitbox.com","w14.hitbox.com","w140.hitbox.com","w141.hitbox.com","w144.hitbox.com","w147.hitbox.com","w15.hitbox.com","w153.hitbox.com","w154.hitbox.com","w155.hitbox.com","w157.hitbox.com","w159.hitbox.com","w16.hitbox.com","w161.hitbox.com","w162.hitbox.com","w167.hitbox.com","w168.hitbox.com","w17.hitbox.com","w170.hitbox.com","w175.hitbox.com","w18.hitbox.com","w19.hitbox.com","w2.hitbox.com","w20.hitbox.com","w21.hitbox.com","w22.hitbox.com","w23.hitbox.com","w24.hitbox.com","w25.hitbox.com","w26.hitbox.com","w27.hitbox.com","w28.hitbox.com","w29.hitbox.com","w3.hitbox.com","w30.hitbox.com","w31.hitbox.com","w32.hitbox.com","w33.hitbox.com","w36.hitbox.com","w4.hitbox.com","w5.hitbox.com","w6.hitbox.com","w7.hitbox.com","w8.hitbox.com","w9.hitbox.com","webload101.hitbox.com","wvwr1.hitbox.com","ww1.hitbox.com","ww2.hitbox.com","ww3.hitbox.com","wwa.hitbox.com","wwb.hitbox.com","wwc.hitbox.com","wwd.hitbox.com","www.hitbox.com","yang.hitbox.com","ying.hitbox.com","ad-brix.com","ref.ad-brix.com","admantx.com","domdex.com","hyprmx.com","mediaplex.com","metrics.getrockerbox.com","servedbyopenx.com","theadex.com","g.jwpsrv.com","p.jwpcdn.com","logs.netflix.com","actuality-poland.europaclicx.com","connexion-bnpparibas-securex.com","ekdamfix.com","envisiontechx.com","galataforex.com","hectorxx.com","mejorjuegmex.com","nexotradex.com","tesla-x2x.com","threadstoneimpex.com","www.actuality-poland.europaclicx.com","www.connexion-bnpparibas-securex.com","www.ekdamfix.com","www.envisiontechx.com","www.galataforex.com","www.hectorxx.com","www.mejorjuegmex.com","www.nexotradex.com","www.tesla-x2x.com","www.threadstoneimpex.com"],"name":"X Corp.","link":"https://www.ghostery.com/whotracksme/trackers/twitter","exodusId":8},{"id":"wtm_twiago","hostnames":["a.twiago.com"],"name":"Twiago","link":"https://www.ghostery.com/whotracksme/trackers/twiago"},{"id":"wtm_turner","hostnames":["s.cdn.turner.com","turnip.cdn.turner.com","brand-turner.com","www.brand-turner.com","metrics.turner.com","atom.warnermedia.com","www.ugdturner.com"],"name":"Warner Media","link":"https://www.ghostery.com/whotracksme/trackers/turner"},{"id":"wtm_turbo","hostnames":["adagio.turboadv.com"],"name":"Turbo","link":"https://www.ghostery.com/whotracksme/trackers/turbo"},{"id":"wtm_tumblr_buttons","hostnames":["platform.tumblr.com"],"name":"Tumblr Buttons","link":"https://www.ghostery.com/whotracksme/trackers/tumblr_buttons"},{"id":"wtm_tubemogul","hostnames":["tubemogul.com","rtb.tubemogul.com","ad-audit.tubemogul.com","rtb-lb-event-sjc.tubemogul.com","stats.tubemogul.com","vast.tubemogul.com","cmp-lb-ap-southeast.tubemogul.com","conv.tubemogul.com","displayf.tubemogul.com","geodns.tubemogul.com","cdn.geodns.tubemogul.com","cmp.geodns.tubemogul.com","lasteventf.tubemogul.com","playtime.tubemogul.com","psi.tubemogul.com","rtd.tubemogul.com","statsf.tubemogul.com","sync.tubemogul.com","syncf.tubemogul.com","ud.tubemogul.com"],"name":"TubeMogul","link":"https://www.ghostery.com/whotracksme/trackers/tubemogul"},{"id":"wtm_tubecorporate","hostnames":["out.tubecorporate.com"],"name":"Tube Corporate","link":"https://www.ghostery.com/whotracksme/trackers/tubecorporate"},{"id":"wtm_truehits.net","hostnames":["truehits.in.th","truehits.net","hits3.truehits.net","tracker.truehits.net"],"name":"Truehits.net","link":"https://www.ghostery.com/whotracksme/trackers/truehits.net"},{"id":"wtm_trueffect","hostnames":["adlegend.com"],"name":"TruEffect","link":"https://www.ghostery.com/whotracksme/trackers/trueffect"},{"id":"wtm_trovus_revelations","hostnames":["revelations.trovus.co.uk"],"name":"Trovus Revelations","link":"https://www.ghostery.com/whotracksme/trackers/trovus_revelations"},{"id":"wtm_triplelift","hostnames":["3lift.com","d3iwjrnl4m67rd.cloudfront.net","triplelift.com","as-eb2.3lift.com","as-tlx.3lift.com","cdn.3lift.com","dmpsync.3lift.com","eb2.3lift.com","eu-tlx.3lift.com","ib.3lift.com","images.3lift.com","img.3lift.com","staging-tlx.3lift.com","tlx.3lift.com","update.3lift.com","s.update.3lift.com","us-east-tlx.3lift.com","us-west-tlx.3lift.com"],"name":"TripleLift","link":"https://www.ghostery.com/whotracksme/trackers/triplelift"},{"id":"wtm_trigger_mail_marketing","hostnames":["api.temails.com"],"name":"Trigger Mail Marketing","link":"https://www.ghostery.com/whotracksme/trackers/trigger_mail_marketing"},{"id":"wtm_tribal_fusion","hostnames":["exponential.com","tribalfusion.com","tags.expo9.exponential.com","cdn1.tribalfusion.com","cdn5.tribalfusion.com","cdnx.tribalfusion.com","ctxt.tribalfusion.com","m.tribalfusion.com","s.tribalfusion.com","www.tribalfusion.com","ctxtad.tribalfusion.com","a.tribalfusion.com"],"name":"Tribal Fusion","link":"https://www.ghostery.com/whotracksme/trackers/tribal_fusion"},{"id":"wtm_trendcounter","hostnames":["s.tcimg.com","tcimg.com","widgets.tcimg.com"],"name":"trendcounter","link":"https://www.ghostery.com/whotracksme/trackers/trendcounter"},{"id":"wtm_treasuredata","hostnames":["treasuredata.com","www.treasuredata.com","api.treasuredata.com","cdn.treasuredata.com","in.treasuredata.com","cdp.in.treasuredata.com"],"name":"Treasure Data","link":"https://www.ghostery.com/whotracksme/trackers/treasuredata"},{"id":"wtm_travel_audience","hostnames":["ads.travelaudience.com"],"name":"Travel Audience","link":"https://www.ghostery.com/whotracksme/trackers/travel_audience"},{"id":"wtm_trafmag.com","hostnames":["trafmag.com","t.trafmag.com"],"name":"TrafMag","link":"https://www.ghostery.com/whotracksme/trackers/trafmag.com"},{"id":"wtm_trafic","hostnames":["storage.trafic.ro"],"name":"Trafic","link":"https://www.ghostery.com/whotracksme/trackers/trafic"},{"id":"wtm_traffiliate","hostnames":["stage.traffiliate.com"],"name":"Traffiliate","link":"https://www.ghostery.com/whotracksme/trackers/traffiliate"},{"id":"wtm_trafficjunky","hostnames":["trafficjunky.net","ctrack.trafficjunky.net","static.trafficjunky.net","delivery.trafficjunky.net","tracking.trafficjunky.net","pt.trafficjunky.net","ads.trafficjunky.net","hw-cdn.trafficjunky.net","hw-cdn-ap.trafficjunky.net","hw-cdn2.trafficjunky.net","media.trafficjunky.net","vz-cdn.trafficjunky.net","vz-cdn2.trafficjunky.net","viamichelin.media.trafficjunky.net"],"name":"TrafficJunky","link":"https://www.ghostery.com/whotracksme/trackers/trafficjunky"},{"id":"wtm_traffichaus","hostnames":["traffichaus.com","cdn1ht.traffichaus.com","cdn1.traffichaus.com","ads.traffichaus.com","syndication.traffichaus.com","www.traffichaus.com"],"name":"TrafficHaus","link":"https://www.ghostery.com/whotracksme/trackers/traffichaus"},{"id":"wtm_trafficforce","hostnames":["trafficforce.com","dev.trafficforce.com","delivery.trafficforce.com"],"name":"TrafficForce","link":"https://www.ghostery.com/whotracksme/trackers/trafficforce"},{"id":"wtm_trafficfactory","hostnames":["trafficfactory.biz","cdnegc.trafficfactory.biz","rpc-php.trafficfactory.biz","media.trafficfactory.biz","rpc.trafficfactory.biz"],"name":"Traffic Factory","link":"https://www.ghostery.com/whotracksme/trackers/trafficfactory"},{"id":"wtm_trafficbroker","hostnames":["delivery.trafficbroker.com"],"name":"TrafficBroker","link":"https://www.ghostery.com/whotracksme/trackers/trafficbroker"},{"id":"wtm_traffic_stars","hostnames":["trafficstars.com","tsyndicate.com","cdn.trafficstars.com","cnt.trafficstars.com","static.trafficstars.com","pxl.tsyndicate.com","cdn.tsyndicate.com","lcdn.tsyndicate.com"],"name":"Traffic Stars","link":"https://www.ghostery.com/whotracksme/trackers/traffic_stars"},{"id":"wtm_traffic_revenue","hostnames":["trafficrevenue.net","www.trafficrevenue.net"],"name":"Traffic Revenue","link":"https://www.ghostery.com/whotracksme/trackers/traffic_revenue"},{"id":"wtm_traffic_fuel","hostnames":["my.trafficfuel.com"],"name":"Traffic Fuel","link":"https://www.ghostery.com/whotracksme/trackers/traffic_fuel"},{"id":"wtm_tradetracker","hostnames":["tradetracker.net","tm.tradetracker.net","rotator.tradetracker.net","ti.tradetracker.net","tc.tradetracker.net"],"name":"TradeTracker","link":"https://www.ghostery.com/whotracksme/trackers/tradetracker"},{"id":"wtm_tradedoubler","hostnames":["tradedoubler.com","tar.tradedoubler.com","swrap.tradedoubler.com","vht.tradedoubler.com","anet.tradedoubler.com","anetch.tradedoubler.com","anetfi.tradedoubler.com","anetlt.tradedoubler.com","anetse.tradedoubler.com","clk.tradedoubler.com","clkde.tradedoubler.com","clkuk.tradedoubler.com","hst.tradedoubler.com","hstde.tradedoubler.com","hstes.tradedoubler.com","hstfr.tradedoubler.com","hstgb.tradedoubler.com","hstit.tradedoubler.com","hstno.tradedoubler.com","hstpl.tradedoubler.com","hstus.tradedoubler.com","img.tradedoubler.com","imp.tradedoubler.com","impat.tradedoubler.com","impbe.tradedoubler.com","impch.tradedoubler.com","impcz.tradedoubler.com","impde.tradedoubler.com","impdk.tradedoubler.com","impes.tradedoubler.com","impfi.tradedoubler.com","impfr.tradedoubler.com","impgb.tradedoubler.com","impie.tradedoubler.com","impit.tradedoubler.com","implt.tradedoubler.com","impnl.tradedoubler.com","impno.tradedoubler.com","imppl.tradedoubler.com","impru.tradedoubler.com","impse.tradedoubler.com","pf.tradedoubler.com","tbl.tradedoubler.com","tbs.tradedoubler.com","tracker.tradedoubler.com","wrap.tradedoubler.com","anetno.tradedoubler.com","stardk.tradedoubler.com","tarno.tradedoubler.com","citrix.tradedoubler.com","www.tradedoubler.com","anetit.tradedoubler.com"],"name":"TradeDoubler","link":"https://www.ghostery.com/whotracksme/trackers/tradedoubler"},{"id":"wtm_tradedesk","hostnames":["adsrvr.org","akamai.smartadserver.com","cdn1.smartadserver.com","diff2.smartadserver.com","diff3.smartadserver.com","diff.smartadserver.com","eqx.smartadserver.com","gallery.smartadserver.com","im2.smartadserver.com","insight.adsrvr.org","itx5-publicidad.smartadserver.com","itx5.smartadserver.com","js.adsrvr.org","match.adsrvr.org","preview.smartadserver.com","rtb-csync.smartadserver.com","smartadserver.com","tmk.smartadserver.com","usw-lax.adsrvr.org","a.adsrvr.org","ad.adsrvr.org","ca4-bid.adsrvr.org","data.adsrvr.org","de1-bid.adsrvr.org","direct.adsrvr.org","html5.adsrvr.org","jp1-bid.adsrvr.org","jp1-bid-ga.adsrvr.org","ny1-bid.adsrvr.org","sg2-bid.adsrvr.org","update.adsrvr.org","s.update.adsrvr.org","use-tor.adsrvr.org","usedirect.adsrvr.org","usw-ca2.adsrvr.org","uswdirect.adsrvr.org","v.adsrvr.org","va6-bid.adsrvr.org","vae-bid.adsrvr.org","www.adsrvr.org","rtb-csync-eqx.smartadserver.com","rtb-csync-itx5.smartadserver.com","eqx-secure.smartadserver.com","geoced.smartadserver.com","itx4.smartadserver.com","itx4-secure.smartadserver.com","itx5-secure.smartadserver.com","na.smartadserver.com","prg.smartadserver.com","prg3429.smartadserver.com","prg8.smartadserver.com","prga.smartadserver.com","qc.smartadserver.com","rtb-csync-itx4.smartadserver.com","rtb-csync-tmk.smartadserver.com","sgp.smartadserver.com","ssb-sgp.smartadserver.com","ssb-us.smartadserver.com","ssbsync.smartadserver.com","ssbsync-geo.smartadserver.com","ssbsync-global.smartadserver.com","ssbsync-sgp.smartadserver.com","ssbsync-us.smartadserver.com","ssp-csync.smartadserver.com","sync.smartadserver.com","tagmanager.smartadserver.com","usw1.smartadserver.com","ww1772.smartadserver.com","ww2060.smartadserver.com","ww2060-sgp.smartadserver.com","ww2951.smartadserver.com","ww3050.smartadserver.com","ww3232.smartadserver.com","www9.smartadserver.com","ww651.smartadserver.com","diff4.smartadserver.com","mobile.smartadserver.com","www2.smartadserver.com","www3.smartadserver.com","www4.smartadserver.com","www5.smartadserver.com","www6.smartadserver.com","ww14.smartadserver.com","ww38.smartadserver.com","ww57.smartadserver.com","ww62.smartadserver.com","ww84.smartadserver.com","ww129.smartadserver.com","ww135.smartadserver.com","ww147.smartadserver.com","ww150.smartadserver.com","ww206.smartadserver.com","ww251.smartadserver.com","ww302.smartadserver.com","ww370.smartadserver.com","ww381.smartadserver.com","ww392.smartadserver.com","ww400.smartadserver.com","ww690.smartadserver.com","ww691.smartadserver.com","ww797.smartadserver.com","ww965.smartadserver.com","ww1003.smartadserver.com","ww1097.smartadserver.com","ww1270.smartadserver.com","ww2026.smartadserver.com","ww2468.smartadserver.com","www.smartadserver.com","ww881.smartadserver.com","www8.smartadserver.com","csync.smartadserver.com","diff1.smartadserver.com","ww1510.smartadserver.com","www14.smartadserver.com"],"name":"TradeDesk","link":"https://www.ghostery.com/whotracksme/trackers/tradedesk","exodusId":7},{"id":"wtm_trackset_conversionlab","hostnames":["conversionlab.trackset.com"],"name":"Trackset ConversionLab","link":"https://www.ghostery.com/whotracksme/trackers/trackset_conversionlab"},{"id":"wtm_trackjs","hostnames":["d2zah9y47r7bi2.cloudfront.net","dl1d2m8ri9v3j.cloudfront.net","trackjs.com","usage.trackjs.com","cdn.trackjs.com","my.trackjs.com"],"name":"TrackJS","link":"https://www.ghostery.com/whotracksme/trackers/trackjs"},{"id":"wtm_tracemyip","hostnames":["s2.tracemyip.org","www.tracemyip.org"],"name":"TraceMyIP","link":"https://www.ghostery.com/whotracksme/trackers/tracemyip"},{"id":"wtm_tpmn","hostnames":["ad.tpmn.co.kr","ad.tpmn.io"],"name":"TPMN","link":"https://www.ghostery.com/whotracksme/trackers/tpmn"},{"id":"wtm_tp-cdn.com","hostnames":["trialpay.com"],"name":"TrialPay","link":"https://www.ghostery.com/whotracksme/trackers/tp-cdn.com"},{"id":"wtm_total_media","hostnames":["i.total-media.net"],"name":"Total Media","link":"https://www.ghostery.com/whotracksme/trackers/total_media"},{"id":"wtm_toro","hostnames":["toro-tags.com","toroadvertisingmedia.com","www.toroadvertisingmedia.com"],"name":"TORO","link":"https://www.ghostery.com/whotracksme/trackers/toro"},{"id":"wtm_tonefuse","hostnames":["srv.clickfuse.com"],"name":"ToneFuse","link":"https://www.ghostery.com/whotracksme/trackers/tonefuse"},{"id":"wtm_tomorrow_focus","hostnames":["tfag.de"],"name":"Tomorrow Focus","link":"https://www.ghostery.com/whotracksme/trackers/tomorrow_focus"},{"id":"wtm_tns","hostnames":["statistik-gallup.net","trafficgateway.research-int.se","msn.tns-cs.net","ssl-nrk.tns-cs.net"],"name":"TNS","link":"https://www.ghostery.com/whotracksme/trackers/tns"},{"id":"wtm_tlv_media","hostnames":["ad.tlvmedia.com","ads.tlvmedia.com","tag.tlvmedia.com"],"name":"TLV Media","link":"https://www.ghostery.com/whotracksme/trackers/tlv_media"},{"id":"wtm_timezondb","hostnames":["vip.timezonedb.com"],"name":"TimezonDB","link":"https://www.ghostery.com/whotracksme/trackers/timezondb"},{"id":"wtm_tiller","hostnames":["optimized.by.tiller.co"],"name":"Tiller","link":"https://www.ghostery.com/whotracksme/trackers/tiller"},{"id":"wtm_the_weather_company","hostnames":["metrics.accuweather.com","in-weather.com","adstest.weather.com","fuzzyweather.com","airlytics.airlock.twcmobile.weather.com","triggers.wfxtriggers.com"],"name":"The Weather Company","link":"https://www.ghostery.com/whotracksme/trackers/the_weather_company"},{"id":"wtm_the_search_agency","hostnames":["thesearchagency.net","www.thesearchagency.net"],"name":"The Search Agency","link":"https://www.ghostery.com/whotracksme/trackers/the_search_agency"},{"id":"wtm_the_deck","hostnames":["connect.decknetwork.net"],"name":"The DECK","link":"https://www.ghostery.com/whotracksme/trackers/the_deck"},{"id":"wtm_the_adex","hostnames":["theadex.com","dmp.theadex.com","xpl.theadex.com"],"name":"The ADEX","link":"https://www.ghostery.com/whotracksme/trackers/the_adex"},{"id":"wtm_teroti","hostnames":["watch.teroti.com"],"name":"Teroti","link":"https://www.ghostery.com/whotracksme/trackers/teroti"},{"id":"wtm_teletech","hostnames":["tracking.dsmmadvantage.com"],"name":"TeleTech","link":"https://www.ghostery.com/whotracksme/trackers/teletech"},{"id":"wtm_tedemis","hostnames":["emailretargeting.com"],"name":"Tedemis","link":"https://www.ghostery.com/whotracksme/trackers/tedemis"},{"id":"wtm_target_fuel","hostnames":["cdn.targetfuel.com"],"name":"Target Fuel","link":"https://www.ghostery.com/whotracksme/trackers/target_fuel"},{"id":"wtm_tailsweep","hostnames":["tailsweep.com","files.tailsweep.com","script.tailsweep.com"],"name":"Tailsweep","link":"https://www.ghostery.com/whotracksme/trackers/tailsweep"},{"id":"wtm_tail_target","hostnames":["d.tailtarget.com","t.tailtarget.com","cm.t.tailtarget.com","tags.t.tailtarget.com","b.t.tailtarget.com","d.t.tailtarget.com"],"name":"Tail","link":"https://www.ghostery.com/whotracksme/trackers/tail_target"},{"id":"wtm_taggy","hostnames":["e01.taggyad.jp"],"name":"TAGGY","link":"https://www.ghostery.com/whotracksme/trackers/taggy"},{"id":"wtm_tagcade","hostnames":["tags.tagcade.com"],"name":"Tagcade","link":"https://www.ghostery.com/whotracksme/trackers/tagcade"},{"id":"wtm_synergy-e","hostnames":["smart.synergy-e.com","stat.synergy-e.com","unitus.synergy-e.com","banner.synergy-e.com"],"name":"Synergy-E","link":"https://www.ghostery.com/whotracksme/trackers/synergy-e"},{"id":"wtm_syncapse","hostnames":["cn.clickable.net"],"name":"Syncapse","link":"https://www.ghostery.com/whotracksme/trackers/syncapse"},{"id":"wtm_synacor","hostnames":["ads.technoratimedia.com","tmx.technoratimedia.com","ad.technoratimedia.com","ad-cdn.technoratimedia.com","prebid.technoratimedia.com","sync.technoratimedia.com"],"name":"Synacor","link":"https://www.ghostery.com/whotracksme/trackers/synacor"},{"id":"wtm_swoop","hostnames":["ardrone.swoop.com"],"name":"Swoop","link":"https://www.ghostery.com/whotracksme/trackers/swoop"},{"id":"wtm_switch_concepts","hostnames":["delivery.myswitchads.com","delivery.us.myswitchads.com","delivery.swid.switchads.com"],"name":"Switch Concepts","link":"https://www.ghostery.com/whotracksme/trackers/switch_concepts"},{"id":"wtm_survata","hostnames":["px.surveywall-api.survata.com"],"name":"Survata","link":"https://www.ghostery.com/whotracksme/trackers/survata"},{"id":"wtm_supplyframe","hostnames":["analytics.supplyframe.com","ads.supplyframe.com","search.supplyframe.com","images.ads.supplyframe.com"],"name":"SupplyFrame","link":"https://www.ghostery.com/whotracksme/trackers/supplyframe"},{"id":"wtm_supercounters","hostnames":["widget.supercounters.com"],"name":"SuperCounters","link":"https://www.ghostery.com/whotracksme/trackers/supercounters"},{"id":"wtm_sublime_skinz","hostnames":["ads.ayads.co","antenna.ayads.co","antenna-apse.ayads.co","antenna-us.ayads.co","cdn.ayads.co","geoworker.ayads.co","optchk.ayads.co","sac.ayads.co"],"name":"Sublime","link":"https://www.ghostery.com/whotracksme/trackers/sublime_skinz"},{"id":"wtm_sub2","hostnames":["webservices.sub2tech.com"],"name":"Sub2","link":"https://www.ghostery.com/whotracksme/trackers/sub2"},{"id":"wtm_stroer_digital_media","hostnames":["cdn.interactivemedia.net"],"name":"Stroer Digital Media","link":"https://www.ghostery.com/whotracksme/trackers/stroer_digital_media"},{"id":"wtm_stripchat.com","hostnames":["stripchat.com","go.stripchat.com"],"name":"stripchat.com","link":"https://www.ghostery.com/whotracksme/trackers/stripchat.com"},{"id":"wtm_streamrail.com","hostnames":["k.streamrail.com","sdk.streamrail.com","events.streamrail.net","ssp.streamrail.net"],"name":"StreamRail","link":"https://www.ghostery.com/whotracksme/trackers/streamrail.com"},{"id":"wtm_strava","hostnames":["analytics.strava.com","tracing-collector.strava.com"],"name":"Strava","link":"https://www.ghostery.com/whotracksme/trackers/strava"},{"id":"wtm_strands_recommender","hostnames":["bizsolutions.strands.com"],"name":"Strands Recommender","link":"https://www.ghostery.com/whotracksme/trackers/strands_recommender"},{"id":"wtm_storygize","hostnames":["storygize.net","www.storygize.net"],"name":"Storygize","link":"https://www.ghostery.com/whotracksme/trackers/storygize"},{"id":"wtm_steepto.com","hostnames":["cdn.steepto.com","cm.steepto.com","s-img.steepto.com","imgg-cdn.steepto.com"],"name":"Steepto","link":"https://www.ghostery.com/whotracksme/trackers/steepto.com"},{"id":"wtm_stathat","hostnames":["api.stathat.com"],"name":"StatHat","link":"https://www.ghostery.com/whotracksme/trackers/stathat"},{"id":"wtm_statcounter","hostnames":["statcounter.com","c.statcounter.com","c1.statcounter.com","c2.statcounter.com","c3.statcounter.com","c4.statcounter.com","c5.statcounter.com","c6.statcounter.com","c7.statcounter.com","c8.statcounter.com","c10.statcounter.com","c11.statcounter.com","c12.statcounter.com","c13.statcounter.com","c14.statcounter.com","c15.statcounter.com","c16.statcounter.com","c17.statcounter.com","c18.statcounter.com","c19.statcounter.com","c20.statcounter.com","c21.statcounter.com","c22.statcounter.com","c23.statcounter.com","c24.statcounter.com","c25.statcounter.com","c26.statcounter.com","c27.statcounter.com","c28.statcounter.com","c29.statcounter.com","c30.statcounter.com","c31.statcounter.com","c32.statcounter.com","c33.statcounter.com","c34.statcounter.com","c35.statcounter.com","c36.statcounter.com","c37.statcounter.com","c38.statcounter.com","c39.statcounter.com","c40.statcounter.com","c41.statcounter.com","c42.statcounter.com","c43.statcounter.com","c45.statcounter.com","c46.statcounter.com","my.statcounter.com","my8.statcounter.com","secure.statcounter.com","www.statcounter.com","c9.statcounter.com","s2.statcounter.com"],"name":"Statcounter","link":"https://www.ghostery.com/whotracksme/trackers/statcounter"},{"id":"wtm_stat4u","hostnames":["adstat.4u.pl","stat.4u.pl"],"name":"stat4u","link":"https://www.ghostery.com/whotracksme/trackers/stat4u"},{"id":"wtm_stailamedia_com","hostnames":["anchor.stailamedia.com"],"name":"stailamedia.com","link":"https://www.ghostery.com/whotracksme/trackers/stailamedia_com"},{"id":"wtm_stackadapt","hostnames":["stackadapt.com","cdn.stackadapt.com","evm1.stackadapt.com","uw.evm1.stackadapt.com","evm2.stackadapt.com","srv.stackadapt.com","east.srv.stackadapt.com","sync.srv.stackadapt.com","tags.srv.stackadapt.com","uw.srv.stackadapt.com"],"name":"StackAdapt","link":"https://www.ghostery.com/whotracksme/trackers/stackadapt"},{"id":"wtm_st-hatena","hostnames":["hatena.ne.jp","ad.hatena.ne.jp","red.hatena.ne.jp","red3.hatena.ne.jp","red.st-hatena.com"],"name":"Hatena","link":"https://www.ghostery.com/whotracksme/trackers/st-hatena"},{"id":"wtm_sprinklr","hostnames":["pixel.sprinklr.com"],"name":"Sprinklr","link":"https://www.ghostery.com/whotracksme/trackers/sprinklr"},{"id":"wtm_springboard","hostnames":["cdn.springboardplatform.com"],"name":"SpringBoard","link":"https://www.ghostery.com/whotracksme/trackers/springboard"},{"id":"wtm_spoutable","hostnames":["cdn.spoutable.com","engine.spoutable.com","s.spoutable.com"],"name":"Spoutable","link":"https://www.ghostery.com/whotracksme/trackers/spoutable"},{"id":"wtm_spot.im","hostnames":["traffic.spot.im","api-2-0.spot.im","direct-events-collector.spot.im","events-collector.spot.im","metrics-logger.spot.im","pix.spot.im"],"name":"Spot.IM","link":"https://www.ghostery.com/whotracksme/trackers/spot.im"},{"id":"wtm_sportsbet_affiliates","hostnames":["sportsbetaffiliates.com.au"],"name":"Sportsbet Affiliates","link":"https://www.ghostery.com/whotracksme/trackers/sportsbet_affiliates"},{"id":"wtm_sponsorads.de","hostnames":["sponsorads.de","www.sponsorads.de"],"name":"SponsorAds.de","link":"https://www.ghostery.com/whotracksme/trackers/sponsorads.de"},{"id":"wtm_spider_ads","hostnames":["metrics.spiderads.eu"],"name":"Spider Ads","link":"https://www.ghostery.com/whotracksme/trackers/spider_ads"},{"id":"wtm_spicy","hostnames":["static.sspicy.ru"],"name":"Spicy","link":"https://www.ghostery.com/whotracksme/trackers/spicy"},{"id":"wtm_sphere","hostnames":["invitesphere.com","www.invitesphere.com"],"name":"Sphere","link":"https://www.ghostery.com/whotracksme/trackers/sphere"},{"id":"wtm_speedyads","hostnames":["admarket.entireweb.com","affiliate.entireweb.com","sa.entireweb.com"],"name":"SpeedyAds","link":"https://www.ghostery.com/whotracksme/trackers/speedyads"},{"id":"wtm_speedcurve","hostnames":["speedcurve.com","cdn.speedcurve.com"],"name":"SpeedCurve","link":"https://www.ghostery.com/whotracksme/trackers/speedcurve"},{"id":"wtm_speed_shift_media","hostnames":["speedshiftmedia.com","aan.speedshiftmedia.com","adserving.aan.speedshiftmedia.com","adserving.speedshiftmedia.com","api.speedshiftmedia.com","cdn.speedshiftmedia.com","aan.cdn.speedshiftmedia.com","magnum.cdn.speedshiftmedia.com","services.cdn.speedshiftmedia.com","scripts.speedshiftmedia.com"],"name":"Speed Shift Media","link":"https://www.ghostery.com/whotracksme/trackers/speed_shift_media"},{"id":"wtm_spectate","hostnames":["cdn.spectate.com"],"name":"Spectate","link":"https://www.ghostery.com/whotracksme/trackers/spectate"},{"id":"wtm_specific_media","hostnames":["adviva.net","specificmedia.com","smp.adviva.net","ads.adviva.net","de.ads.adviva.net","cache.adviva.net","dp2.specificclick.net","afe2.specificclick.net","rome.specificclick.net","mpp.specificclick.net","dp.specificclick.net","images.specificclick.net","adopt.specificclick.net","afe.specificclick.net","bp.specificclick.net","dg.specificclick.net","smp.specificmedia.com","www.specificmedia.com","cache.specificmedia.com","ads.specificmedia.com"],"name":"Specific Media","link":"https://www.ghostery.com/whotracksme/trackers/specific_media"},{"id":"wtm_sovrn_viewability_solutions","hostnames":["onscroll.com","impl.onscroll.com","onetag-geo.onscroll.com","cdn.onscroll.com","ms.onscroll.com","ping.onscroll.com","tag.onscroll.com","tags.onscroll.com","tags.us.onscroll.com"],"name":"Sovrn Signal","link":"https://www.ghostery.com/whotracksme/trackers/sovrn_viewability_solutions"},{"id":"wtm_sovrn","hostnames":["d3pkae9owd2lcf.cloudfront.net","lijit.com","beacon.lijit.com","www.lijit.com","ap.lijit.com","pba.aws.lijit.com","ce.lijit.com","gslbeacon.lijit.com","vap.lijit.com","vap1ams1.lijit.com","vap1ewr1.lijit.com","vap1ord1.lijit.com","vap1sfo1.lijit.com","vap2ams1.lijit.com","vap2ewr1.lijit.com","vap2ord1.lijit.com","vap2sfo1.lijit.com","vap3ams1.lijit.com","vap3ewr1.lijit.com","vap3ord1.lijit.com","vap3sfo1.lijit.com","vap4ewr1.lijit.com","vap4ord1.lijit.com","vap4sfo1.lijit.com","vap5ewr1.lijit.com","vap6ewr1.lijit.com"],"name":"sovrn","link":"https://www.ghostery.com/whotracksme/trackers/sovrn"},{"id":"wtm_sourcepoint","hostnames":["summerhamster.com","www.summerhamster.com"],"name":"Sourcepoint","link":"https://www.ghostery.com/whotracksme/trackers/sourcepoint"},{"id":"wtm_sourceknowledge_pixel","hostnames":["provenpixel.com","display.provenpixel.com"],"name":"SourceKnowledge Pixel","link":"https://www.ghostery.com/whotracksme/trackers/sourceknowledge_pixel"},{"id":"wtm_sortable","hostnames":["deployads.com","assets.deployads.com","tags.deployads.com","c.deployads.com","e.deployads.com","tags-cdn.deployads.com"],"name":"Sortable","link":"https://www.ghostery.com/whotracksme/trackers/sortable"},{"id":"wtm_sophus3","hostnames":["scripts.sophus3.com"],"name":"Sophus3","link":"https://www.ghostery.com/whotracksme/trackers/sophus3"},{"id":"wtm_sonobi","hostnames":["sonobi.com","ads.sonobi.com","creative.sonobi.com","go.sonobi.com","ams-1.go.sonobi.com","ams-1-apex.go.sonobi.com","ams-1-sync.go.sonobi.com","apex.go.sonobi.com","iad-2.go.sonobi.com","iad-2-apex.go.sonobi.com","iad-2-sync.go.sonobi.com","keymaker.go.sonobi.com","lax-1.go.sonobi.com","lax-1-apex.go.sonobi.com","lax-1-sync.go.sonobi.com","lax-1-xcp.go.sonobi.com","lax-2.go.sonobi.com","lax-2-apex.go.sonobi.com","mtrx.go.sonobi.com","purch-sync.go.sonobi.com","sync.go.sonobi.com","xcp.go.sonobi.com","neo.go.sonobi.com"],"name":"Sonobi","link":"https://www.ghostery.com/whotracksme/trackers/sonobi"},{"id":"wtm_somoaudience","hostnames":["publisher-east.mobileadtrading.com","track-east.mobileadtrading.com"],"name":"SoMo Audience","link":"https://www.ghostery.com/whotracksme/trackers/somoaudience"},{"id":"wtm_solve_media","hostnames":["pixel.solvemedia.com"],"name":"Solve Media","link":"https://www.ghostery.com/whotracksme/trackers/solve_media"},{"id":"wtm_sokrati","hostnames":["chuknu.sokrati.com","tracking.sokrati.com"],"name":"Sokrati","link":"https://www.ghostery.com/whotracksme/trackers/sokrati"},{"id":"wtm_sojern","hostnames":["beacon.sojern.com","pixel.sojern.com","pixelglobal.sojern.com","static.sojern.com"],"name":"Sojern","link":"https://www.ghostery.com/whotracksme/trackers/sojern"},{"id":"wtm_sohu","hostnames":["images.sohu.com"],"name":"Sohu","link":"https://www.ghostery.com/whotracksme/trackers/sohu"},{"id":"wtm_socialhead_socialwidget","hostnames":["widget-api.socialhead.io"],"name":"Socialhead Socialwidget","link":"https://www.ghostery.com/whotracksme/trackers/socialhead_socialwidget"},{"id":"wtm_socialbeat","hostnames":["duu8lzqdm8tsz.cloudfront.net"],"name":"socialbeat","link":"https://www.ghostery.com/whotracksme/trackers/socialbeat"},{"id":"wtm_social_miner","hostnames":["soclminer.com.br","api.soclminer.com.br"],"name":"Social Miner","link":"https://www.ghostery.com/whotracksme/trackers/social_miner"},{"id":"wtm_soasta_mpulse","hostnames":["go-mpulse.net","mpstat.us","c.go-mpulse.net","s.go-mpulse.net"],"name":"SOASTA mPulse","link":"https://www.ghostery.com/whotracksme/trackers/soasta_mpulse"},{"id":"wtm_snowplow","hostnames":["d346whrrklhco7.cloudfront.net","d78fikflryjgj.cloudfront.net","dc8xl0ndzn2cb.cloudfront.net","cdn.playwire.com","collector.snplow.net","ca-lapresse-main.collector.snplow.net","com-thebigwillow-prod1.collector.snplow.net","com-upday-main.collector.snplow.net"],"name":"Snowplow","link":"https://www.ghostery.com/whotracksme/trackers/snowplow"},{"id":"wtm_snoobi_analytics","hostnames":["snoobi.com","eu1.snoobi.com"],"name":"Snoobi Analytics","link":"https://www.ghostery.com/whotracksme/trackers/snoobi_analytics"},{"id":"wtm_snigelweb","hostnames":["h-bid.com"],"name":"SnigelWeb, Inc.","link":"https://www.ghostery.com/whotracksme/trackers/snigelweb"},{"id":"wtm_smowtion","hostnames":["ads.smowtion.com"],"name":"Smowtion","link":"https://www.ghostery.com/whotracksme/trackers/smowtion"},{"id":"wtm_smi2.ru","hostnames":["target.smi2.net","js.smi2.ru"],"name":"smi2.ru","link":"https://www.ghostery.com/whotracksme/trackers/smi2.ru"},{"id":"wtm_smartstream.tv","hostnames":["smartstream.tv","ads.smartstream.tv"],"name":"SmartStream.TV","link":"https://www.ghostery.com/whotracksme/trackers/smartstream.tv"},{"id":"wtm_smarter_remarketer","hostnames":["d1n00d49gkbray.cloudfront.net","dhxtx5wtu812h.cloudfront.net"],"name":"SmarterHQ","link":"https://www.ghostery.com/whotracksme/trackers/smarter_remarketer"},{"id":"wtm_smartcontext","hostnames":["smartcontext.pl"],"name":"SmartContext","link":"https://www.ghostery.com/whotracksme/trackers/smartcontext"},{"id":"wtm_smartclick.net","hostnames":["c.smartclick.net","c1.smartclick.net"],"name":"SmartClick","link":"https://www.ghostery.com/whotracksme/trackers/smartclick.net"},{"id":"wtm_smart4ads","hostnames":["smart4ads.com"],"name":"smart4ads","link":"https://www.ghostery.com/whotracksme/trackers/smart4ads"},{"id":"wtm_smart_leads","hostnames":["x.cnt.my"],"name":"Smart Leads","link":"https://www.ghostery.com/whotracksme/trackers/smart_leads"},{"id":"wtm_smart_content","hostnames":["cdn.getsmartcontent.com"],"name":"Smart Content","link":"https://www.ghostery.com/whotracksme/trackers/smart_content"},{"id":"wtm_slimcutmedia","hostnames":["freeskreen.com","static.freeskreen.com","ads.freeskreen.com","sb.freeskreen.com"],"name":"SlimCutMedia","link":"https://www.ghostery.com/whotracksme/trackers/slimcutmedia"},{"id":"wtm_skimlinks","hostnames":["redirectingat.com","skimresources.com","3amcouk.skimlinks.com","bikeforumsnet.skimlinks.com","complexcom.skimlinks.com","dirtytalk101com.skimlinks.com","freeforumsorg.skimlinks.com","handbagcom.skimlinks.com","hothardwarecom.skimlinks.com","mirrorcoukcelebs.skimlinks.com","reviewcentrecom.skimlinks.com","skimlinkscom.skimlinks.com","static.skimlinks.com","techradarcom.skimlinks.com","techspotcom.skimlinks.com","telegraphcouk.skimlinks.com","tidbitscom.skimlinks.com","toplessrobotcom.skimlinks.com","wirelessforumsorg.skimlinks.com","wordpresscom.skimlinks.com","wwwchipchickcom.skimlinks.com","wwwcultofmaccom.skimlinks.com","xmarkscom.skimlinks.com","d.skimresources.com","go.redirectingat.com","assistjs.skimresources.com","go.skimresources.com","i.skimresources.com","ls.skimresources.com","m.skimresources.com","p.skimresources.com","p-kube.skimresources.com","r.skimresources.com","s.skimresources.com","t.skimresources.com","x.skimresources.com"],"name":"SkimLinks","link":"https://www.ghostery.com/whotracksme/trackers/skimlinks"},{"id":"wtm_six_apart_advertising","hostnames":["ads.sixapart.com"],"name":"Six Apart Advertising","link":"https://www.ghostery.com/whotracksme/trackers/six_apart_advertising"},{"id":"wtm_sitewit","hostnames":["analytics.sitewit.com"],"name":"SiteWit","link":"https://www.ghostery.com/whotracksme/trackers/sitewit"},{"id":"wtm_sitescout","hostnames":["centro.pixel.ad","node-p2e-zii3oh.sitescout.com","pixel-a.sitescout.com","clickserv.sitescout.com","pixel.sitescout.com","pixel-sync.sitescout.com"],"name":"SiteScout by Centro","link":"https://www.ghostery.com/whotracksme/trackers/sitescout"},{"id":"wtm_sitemeter","hostnames":["sitemeter.com"],"name":"SiteMeter","link":"https://www.ghostery.com/whotracksme/trackers/sitemeter"},{"id":"wtm_siteimprove_analytics","hostnames":["siteimproveanalytics.com"],"name":"SiteImprove Analytics","link":"https://www.ghostery.com/whotracksme/trackers/siteimprove_analytics"},{"id":"wtm_siteimprove","hostnames":["us1.siteimprove.com","us2.siteimprove.com","dk1.siteimprove.com","ssl.siteimprove.com"],"name":"Siteimprove","link":"https://www.ghostery.com/whotracksme/trackers/siteimprove"},{"id":"wtm_site24x7","hostnames":["static.site24x7rum.com"],"name":"Site24x7","link":"https://www.ghostery.com/whotracksme/trackers/site24x7"},{"id":"wtm_site_stratos","hostnames":["a5.ogt.jp"],"name":"Site Stratos","link":"https://www.ghostery.com/whotracksme/trackers/site_stratos"},{"id":"wtm_site_booster","hostnames":["sitebooster-fjfmworld-production.azureedge.net"],"name":"Site Booster","link":"https://www.ghostery.com/whotracksme/trackers/site_booster"},{"id":"wtm_singlefeed","hostnames":["reporting.singlefeed.com"],"name":"SingleFeed","link":"https://www.ghostery.com/whotracksme/trackers/singlefeed"},{"id":"wtm_simpli.fi","hostnames":["simpli.fi","cdnpixel.simpli.fi","i.simpli.fi","www.simpli.fi","ads.simpli.fi","east.ads.simpli.fi","west.ads.simpli.fi","cdn.simpli.fi","centralads.simpli.fi","eastads.simpli.fi","eastevents.simpli.fi","events.simpli.fi","feedimages.simpli.fi","tag.simpli.fi","um.simpli.fi","westads.simpli.fi"],"name":"Simpli.fi","link":"https://www.ghostery.com/whotracksme/trackers/simpli.fi"},{"id":"wtm_simplereach","hostnames":["d8rk54i4mohrb.cloudfront.net","simplereach.com","edge.simplereach.com"],"name":"SimpleReach","link":"https://www.ghostery.com/whotracksme/trackers/simplereach"},{"id":"wtm_sift_science","hostnames":["dtlilztwypawv.cloudfront.net","cdn-gcp.siftscience.com","b.siftscience.com","api3.siftscience.com","cdn.siftscience.com"],"name":"Sift Science","link":"https://www.ghostery.com/whotracksme/trackers/sift_science"},{"id":"wtm_shopzilla","hostnames":["adserve.shopzilla.com"],"name":"Shopzilla","link":"https://www.ghostery.com/whotracksme/trackers/shopzilla"},{"id":"wtm_shopify_stats","hostnames":["artusor.myshopify.com","nanimaly-shop.myshopify.com","ogrod-moje-zycie.myshopify.com","palmieroutlet.myshopify.com","phillshop.myshopify.com","pl-huda.myshopify.com","sunerlypl.myshopify.com","vewvwm.myshopify.com","www.artusor.myshopify.com","www.nanimaly-shop.myshopify.com","www.ogrod-moje-zycie.myshopify.com","www.palmieroutlet.myshopify.com","www.phillshop.myshopify.com","www.pl-huda.myshopify.com","www.sunerlypl.myshopify.com","www.vewvwm.myshopify.com","s.shopify.com","stats.shopify.com"],"name":"Shopify Stats","link":"https://www.ghostery.com/whotracksme/trackers/shopify_stats"},{"id":"wtm_shop_target","hostnames":["app.shoptarget.com.br","retargeter.com.br"],"name":"Shop Target","link":"https://www.ghostery.com/whotracksme/trackers/shop_target"},{"id":"wtm_shinystat","hostnames":["shinystat.com","shinystat.it","codice.shinystat.com","codicebusiness.shinystat.com","codicefl.shinystat.com","codiceisp.shinystat.com","s1.shinystat.com","s2.shinystat.com","s3.shinystat.com","s4.shinystat.com","s9.shinystat.com","www.shinystat.com","s1.shinystat.it"],"name":"ShinyStat","link":"https://www.ghostery.com/whotracksme/trackers/shinystat"},{"id":"wtm_sheerid","hostnames":["services.sheerid.com"],"name":"SheerID","link":"https://www.ghostery.com/whotracksme/trackers/sheerid"},{"id":"wtm_sharethrough","hostnames":["sharethrough.com","static.sharethrough.com","b.sharethrough.com","btlr.sharethrough.com","btlr-ecs-ap-southeast-1.sharethrough.com","btlr-ecs-us-west-1.sharethrough.com","integration-assets.sharethrough.com","match.sharethrough.com","match-ap-southeast-1-ecs.sharethrough.com","match-us-west-1-ecs.sharethrough.com","native.sharethrough.com","sdk.sharethrough.com","sfp-adserver-cdn.sharethrough.com","stx-assets.sharethrough.com"],"name":"ShareThrough","link":"https://www.ghostery.com/whotracksme/trackers/sharethrough"},{"id":"wtm_sharethis","hostnames":["buttons-config.sharethis.com","count-server.sharethis.com","edge.sharethis.com","l.sharethis.com","pd.sharethis.com","platform-api.sharethis.com","platform-cdn.sharethis.com","s.sharethis.com","sd.sharethis.com","seg.sharethis.com","sync.sharethis.com","t.sharethis.com","w.sharethis.com","wd-edge.sharethis.com","ws.sharethis.com"],"name":"ShareThis","link":"https://www.ghostery.com/whotracksme/trackers/sharethis"},{"id":"wtm_shareasale","hostnames":["shareasale.com","www.shareasale.com","static.shareasale.com"],"name":"ShareASale","link":"https://www.ghostery.com/whotracksme/trackers/shareasale"},{"id":"wtm_shareaholic","hostnames":["dtym7iokkjlif.cloudfront.net","shareaholic.com","d.shareaholic.com","howler.shareaholic.com","cm.shareaholic.com","clickcdn.shareaholic.com","traffic.shareaholic.com","analytics.shareaholic.com","apps.shareaholic.com","go.shareaholic.com","grace.shareaholic.com","partner.shareaholic.com","pixel.shareaholic.com","recs.shareaholic.com"],"name":"Shareaholic","link":"https://www.ghostery.com/whotracksme/trackers/shareaholic"},{"id":"wtm_seznam","hostnames":["10.im.cz","c.imedia.cz","i.imedia.cz","ssp.imedia.cz"],"name":"Seznam","link":"https://www.ghostery.com/whotracksme/trackers/seznam"},{"id":"wtm_sextracker","hostnames":["sextracker.com","the.sextracker.com","adserver.sextracker.com","banners.sextracker.com","counter1.sextracker.com","clit.sextracker.com","clit1.sextracker.com","clit2.sextracker.com","clit3.sextracker.com","clit4.sextracker.com","clit5.sextracker.com","clit6.sextracker.com","clit7.sextracker.com","clit8.sextracker.com","clit9.sextracker.com","clit10.sextracker.com","clit11.sextracker.com","clit12.sextracker.com","clit13.sextracker.com","clit14.sextracker.com","clit15.sextracker.com","clit16.sextracker.com","elite.sextracker.com","graphics1.sextracker.com","graphics2.sextracker.com","hosting.sextracker.com","links.sextracker.com","mau.sextracker.com","moneytree.sextracker.com","ranks.sextracker.com","search.sextracker.com","start.sextracker.com","stats.sextracker.com","stx.sextracker.com","stx0.sextracker.com","stx1.sextracker.com","stx2.sextracker.com","stx3.sextracker.com","stx4.sextracker.com","stx5.sextracker.com","stx6.sextracker.com","stx7.sextracker.com","stx8.sextracker.com","stx9.sextracker.com","stx10.sextracker.com","stx11.sextracker.com","stx12.sextracker.com","stx13.sextracker.com","stx14.sextracker.com","stx15.sextracker.com","stxbans.sextracker.com","webmasters.sextracker.com","stx.banners.sextracker.com","wm.banners.sextracker.com","www.sextracker.com","counter2.sextracker.com","counter3.sextracker.com","counter4.sextracker.com","counter5.sextracker.com","counter6.sextracker.com","counter7.sextracker.com","counter8.sextracker.com","counter9.sextracker.com","counter10.sextracker.com","counter11.sextracker.com","counter12.sextracker.com","counter13.sextracker.com","counter14.sextracker.com","counter15.sextracker.com","counter16.sextracker.com"],"name":"SexTracker","link":"https://www.ghostery.com/whotracksme/trackers/sextracker"},{"id":"wtm_sexinyourcity","hostnames":["ads.sexinyourcity.com"],"name":"SexInYourCity","link":"https://www.ghostery.com/whotracksme/trackers/sexinyourcity"},{"id":"wtm_sexadnetwork","hostnames":["as.sexad.net","e.sexad.net"],"name":"SexAdNetwork","link":"https://www.ghostery.com/whotracksme/trackers/sexadnetwork"},{"id":"wtm_sevenone_media","hostnames":["ad.71i.de","adserver.71i.de"],"name":"SevenOne Media","link":"https://www.ghostery.com/whotracksme/trackers/sevenone_media"},{"id":"wtm_sessioncam","hostnames":["d2oh4tlt9mrke9.cloudfront.net","sessioncam.com","ws.sessioncam.com"],"name":"SessionCam","link":"https://www.ghostery.com/whotracksme/trackers/sessioncam"},{"id":"wtm_sentry","hostnames":["d3nslu0hdya83q.cloudfront.net","o861134.ingest.sentry.io"],"name":"Sentry","link":"https://www.ghostery.com/whotracksme/trackers/sentry"},{"id":"wtm_semilo","hostnames":["stir.semilo.com"],"name":"Semilo","link":"https://www.ghostery.com/whotracksme/trackers/semilo"},{"id":"wtm_semasio","hostnames":["semasio.net","uip.semasio.net"],"name":"Semasio","link":"https://www.ghostery.com/whotracksme/trackers/semasio"},{"id":"wtm_sellpoints","hostnames":["t.sellpoints.com"],"name":"Sellpoints","link":"https://www.ghostery.com/whotracksme/trackers/sellpoints"},{"id":"wtm_segmento","hostnames":["tag.rutarget.ru"],"name":"Segmento","link":"https://www.ghostery.com/whotracksme/trackers/segmento"},{"id":"wtm_seedtag.com","hostnames":["config.seedtag.com","s.seedtag.com","t.seedtag.com"],"name":"Seedtag","link":"https://www.ghostery.com/whotracksme/trackers/seedtag.com"},{"id":"wtm_securedvisit","hostnames":["track.securedvisit.com"],"name":"SecuredVisit","link":"https://www.ghostery.com/whotracksme/trackers/securedvisit"},{"id":"wtm_securedtouch","hostnames":["agoda.securedtouch.com","hub.securedtouch.com","static.securedtouch.com","wish.securedtouch.com"],"name":"SecuredTouch","link":"https://www.ghostery.com/whotracksme/trackers/securedtouch"},{"id":"wtm_searchignite","hostnames":["track.searchignite.com"],"name":"SearchIgnite","link":"https://www.ghostery.com/whotracksme/trackers/searchignite"},{"id":"wtm_searchforce","hostnames":["sftrack.searchforce.net"],"name":"SearchForce","link":"https://www.ghostery.com/whotracksme/trackers/searchforce"},{"id":"wtm_search123","hostnames":["search123.uk.com"],"name":"Search123","link":"https://www.ghostery.com/whotracksme/trackers/search123"},{"id":"wtm_scupio","hostnames":["prebid.scupio.com"],"name":"Scupio","link":"https://www.ghostery.com/whotracksme/trackers/scupio"},{"id":"wtm_scout_analytics","hostnames":["scout.scoutanalytics.net"],"name":"Scout Analytics","link":"https://www.ghostery.com/whotracksme/trackers/scout_analytics"},{"id":"wtm_scoota","hostnames":["rockabox.co"],"name":"Scoota","link":"https://www.ghostery.com/whotracksme/trackers/scoota"},{"id":"wtm_scarabresearch","hostnames":["cdn.scarabresearch.com","recommender.scarabresearch.com"],"name":"Scarab Research","link":"https://www.ghostery.com/whotracksme/trackers/scarabresearch","exodusId":264},{"id":"wtm_sayyac","hostnames":["srv.sayyac.net"],"name":"Sayyac","link":"https://www.ghostery.com/whotracksme/trackers/sayyac"},{"id":"wtm_say_media","hostnames":["ads.saymedia.com"],"name":"Say Media","link":"https://www.ghostery.com/whotracksme/trackers/say_media"},{"id":"wtm_sapo_ads","hostnames":["js.sl.pt"],"name":"SAPO Ads","link":"https://www.ghostery.com/whotracksme/trackers/sapo_ads"},{"id":"wtm_sanoma.fi","hostnames":["stats.ilsemedia.nl","rc.bt.ilsemedia.nl"],"name":"Sanoma","link":"https://www.ghostery.com/whotracksme/trackers/sanoma.fi"},{"id":"wtm_salesforce.com","hostnames":["butyairforce.com","www.butyairforce.com","immediate-lforce.com","quantum-gforce.com","www.immediate-lforce.com","www.quantum-gforce.com","dev.trafficforce.com","delivery.trafficforce.com","adserver.directforce.com","adforce.com","click.mail.salesforce.com","trafficforce.com","beacon.my.salesforce.com"],"name":"Salesforce","link":"https://www.ghostery.com/whotracksme/trackers/salesforce.com"},{"id":"wtm_sales_manago","hostnames":["orange.salesmanago.pl","app2.salesmanago.pl"],"name":"SALESmanago","link":"https://www.ghostery.com/whotracksme/trackers/sales_manago"},{"id":"wtm_sales_feed","hostnames":["api.salesfeed.com"],"name":"Sales Feed","link":"https://www.ghostery.com/whotracksme/trackers/sales_feed"},{"id":"wtm_salecycle","hostnames":["d16fk4ms6rqz1v.cloudfront.net"],"name":"SaleCycle","link":"https://www.ghostery.com/whotracksme/trackers/salecycle"},{"id":"wtm_sailthru_horizon","hostnames":["sail-horizon.com","cdn.sail-horizon.com","ak.sail-horizon.com","api.sail-personalize.com","aws-api.sail-personalize.com","api.sailthru.com","cb.sailthru.com","horizon.sailthru.com"],"name":"Sailthru Horizon","link":"https://www.ghostery.com/whotracksme/trackers/sailthru_horizon"},{"id":"wtm_sagemetrics","hostnames":["st.sageanalyst.net"],"name":"SageMetrics","link":"https://www.ghostery.com/whotracksme/trackers/sagemetrics"},{"id":"wtm_sabavision","hostnames":["camp.sabavision.com"],"name":"SabaVision","link":"https://www.ghostery.com/whotracksme/trackers/sabavision"},{"id":"wtm_s24_com","hostnames":["pl.miss24.com","befamous24.com","drives24.com","droos24.com","emv1.onlynews24.com","nations24.com","onlynews24.com","www.befamous24.com","www.drives24.com","www.droos24.com","www.emv1.onlynews24.com","www.nations24.com","www.onlynews24.com","www.postads24.com","telangana-news24.com","cdddfia.hornylocals24.com","getmyads24.com","trafficnetworkads24.com","www.getmyads24.com","www.trafficnetworkads24.com","efesbetgiris24.com","www.efesbetgiris24.com"],"name":"Shopping24 internet group","link":"https://www.ghostery.com/whotracksme/trackers/s24_com"},{"id":"wtm_runative","hostnames":["run-syndicate.com","cdn.run-syndicate.com"],"name":"Runative","link":"https://www.ghostery.com/whotracksme/trackers/runative"},{"id":"wtm_rummycircle","hostnames":["click.rummycircle.com"],"name":"RummyCircle","link":"https://www.ghostery.com/whotracksme/trackers/rummycircle"},{"id":"wtm_ruhrgebiet","hostnames":["tracker.ruhrgebiet-onlineservices.de"],"name":"Ruhrgebiet","link":"https://www.ghostery.com/whotracksme/trackers/ruhrgebiet"},{"id":"wtm_rubicon","hostnames":["nearbyad.com","rubiconproject.com","adserver.mobsmith.com","cdn.nearbyad.com","www.nearbyad.com","beacon-us-west.rubiconproject.com","beacon-us-iad2.rubiconproject.com","token.rubiconproject.com","ads.rubiconproject.com","aws.rubiconproject.com","stats.aws.rubiconproject.com","beacon-eu-ams3.rubiconproject.com","beacon-iad2.rubiconproject.com","beacon-iad3.rubiconproject.com","beacon-nf.rubiconproject.com","cca-iad2.rubiconproject.com","cca-iad3.rubiconproject.com","cca-sjc2.rubiconproject.com","eus.rubiconproject.com","exapi-eu.rubiconproject.com","exapi-us-west.rubiconproject.com","fastlane.rubiconproject.com","fastlane-adv.rubiconproject.com","flapi1.rubiconproject.com","flapi2.rubiconproject.com","optimized-by.rubiconproject.com","optimized-by-1.rubiconproject.com","optimized-by-2.rubiconproject.com","pg-prebid-server.rubiconproject.com","pg-prebid-server-aws-ane1.rubiconproject.com","pg-prebid-server-aws-usw2.rubiconproject.com","pixel.rubiconproject.com","pixel-apac.rubiconproject.com","pixel-eu.rubiconproject.com","pixel-us-east.rubiconproject.com","pixel-us-west.rubiconproject.com","prebid-a.rubiconproject.com","prebid-server.rubiconproject.com","secure-assets.rubiconproject.com","smarttag.rubiconproject.com","tap.rubiconproject.com","tap-cdn.rubiconproject.com","update.rubiconproject.com","s.update.rubiconproject.com","video-ads.rubiconproject.com","video-ads-apex.rubiconproject.com","tap2-cdn.rubiconproject.com"],"name":"Rubicon","link":"https://www.ghostery.com/whotracksme/trackers/rubicon","exodusId":145},{"id":"wtm_rtmark.net","hostnames":["rtmark.net","mt.rtmark.net","my.rtmark.net"],"name":"Advertising Technologies Ltd","link":"https://www.ghostery.com/whotracksme/trackers/rtmark.net"},{"id":"wtm_rovion","hostnames":["rovion.com"],"name":"Rovion","link":"https://www.ghostery.com/whotracksme/trackers/rovion"},{"id":"wtm_roq.ad","hostnames":["rqtrk.eu"],"name":"Roq.ad","link":"https://www.ghostery.com/whotracksme/trackers/roq.ad"},{"id":"wtm_roi_trax","hostnames":["trk.sodoit.com"],"name":"ROI trax","link":"https://www.ghostery.com/whotracksme/trackers/roi_trax"},{"id":"wtm_ro2.biz","hostnames":["ro2.biz"],"name":"Ro2.biz","link":"https://www.ghostery.com/whotracksme/trackers/ro2.biz"},{"id":"wtm_rich_media_banner_network","hostnames":["rmbn.ru","post.rmbn.ru"],"name":"Rich Media Banner Network","link":"https://www.ghostery.com/whotracksme/trackers/rich_media_banner_network"},{"id":"wtm_rhythmone_beacon","hostnames":["1rx.io","a-nj.1rx.io","sync.1rx.io","tag.1rx.io"],"name":"Rhythmone Beacon","link":"https://www.ghostery.com/whotracksme/trackers/rhythmone_beacon"},{"id":"wtm_rhythmone","hostnames":["ads.addesktop.com"],"name":"RhythmOne","link":"https://www.ghostery.com/whotracksme/trackers/rhythmone"},{"id":"wtm_rewords","hostnames":["pl-engine.intextad.net"],"name":"ReWords","link":"https://www.ghostery.com/whotracksme/trackers/rewords"},{"id":"wtm_revresponse","hostnames":["cts.tradepub.com"],"name":"RevResponse","link":"https://www.ghostery.com/whotracksme/trackers/revresponse"},{"id":"wtm_revolver_maps","hostnames":["ja.revolvermaps.com","jb.revolvermaps.com","jc.revolvermaps.com","jd.revolvermaps.com","je.revolvermaps.com","jf.revolvermaps.com","jg.revolvermaps.com","jh.revolvermaps.com","ji.revolvermaps.com","jk.revolvermaps.com","rb.revolvermaps.com","rc.revolvermaps.com","rd.revolvermaps.com","re.revolvermaps.com","rg.revolvermaps.com","rh.revolvermaps.com","ri.revolvermaps.com","rk.revolvermaps.com"],"name":"Revolver Maps","link":"https://www.ghostery.com/whotracksme/trackers/revolver_maps"},{"id":"wtm_revenuehits","hostnames":["clkads.com","clkrev.com","clksite.com","eclkspbn.com","cdn1.clkrev.com","www.clksite.com","p128902.clksite.com","p30839.clksite.com","p69523.clksite.com"],"name":"RevenueHits","link":"https://www.ghostery.com/whotracksme/trackers/revenuehits"},{"id":"wtm_revenue","hostnames":["revenue.com","batorevenue.com","blogrevenue.com","leaprevenue.com","www.batorevenue.com","www.blogrevenue.com","www.leaprevenue.com","geoads.eurorevenue.com","performancerevenue.com","teenrevenue.com","visualrevenue.com","js4.ringrevenue.com","json4.ringrevenue.com","a.visualrevenue.com"],"name":"Revenue","link":"https://www.ghostery.com/whotracksme/trackers/revenue"},{"id":"wtm_revcontent","hostnames":["revcontent.com","www.revcontent.com","assets.revcontent.com","cdn.revcontent.com","html-img.revcontent.com","images.revcontent.com","img.revcontent.com","labs-cdn.revcontent.com","media.revcontent.com","publishers.revcontent.com","trends.revcontent.com"],"name":"RevContent","link":"https://www.ghostery.com/whotracksme/trackers/revcontent"},{"id":"wtm_retargeter_beacon","hostnames":["retargeter.com","lt.retargeter.com","ad.retargeter.com","tag.retargeter.com"],"name":"ReTargeter Beacon","link":"https://www.ghostery.com/whotracksme/trackers/retargeter_beacon"},{"id":"wtm_retarget_app","hostnames":["shopify.retargetapp.com"],"name":"Retarget App","link":"https://www.ghostery.com/whotracksme/trackers/retarget_app"},{"id":"wtm_result_links","hostnames":["data.resultlinks.com"],"name":"Result Links","link":"https://www.ghostery.com/whotracksme/trackers/result_links"},{"id":"wtm_resonate_networks","hostnames":["ds.reson8.com","idsync.reson8.com"],"name":"Resonate Networks","link":"https://www.ghostery.com/whotracksme/trackers/resonate_networks"},{"id":"wtm_republer.com","hostnames":["republer.com","sync.republer.com"],"name":"Republer","link":"https://www.ghostery.com/whotracksme/trackers/republer.com"},{"id":"wtm_relestar","hostnames":["relestar.com","clk.relestar.com"],"name":"Relestar","link":"https://www.ghostery.com/whotracksme/trackers/relestar"},{"id":"wtm_reklamz","hostnames":["delivery.reklamz.com","bbcdn.delivery.reklamz.com"],"name":"ReklamZ","link":"https://www.ghostery.com/whotracksme/trackers/reklamz"},{"id":"wtm_reklamport","hostnames":["ad.reklamport.com"],"name":"Reklamport","link":"https://www.ghostery.com/whotracksme/trackers/reklamport"},{"id":"wtm_reklam_store","hostnames":["adstest.reklamstore.com","adserver.reklamstore.com"],"name":"Reklam Store","link":"https://www.ghostery.com/whotracksme/trackers/reklam_store"},{"id":"wtm_rekko","hostnames":["convertglobal.s3.amazonaws.com","dnhgz729v27ca.cloudfront.net","use.convertglobal.com"],"name":"Rekko","link":"https://www.ghostery.com/whotracksme/trackers/rekko"},{"id":"wtm_reflektion","hostnames":["product.reflektion.com"],"name":"Reflektion","link":"https://www.ghostery.com/whotracksme/trackers/reflektion"},{"id":"wtm_refined_labs","hostnames":["r.refinedads.com"],"name":"Refined Labs","link":"https://www.ghostery.com/whotracksme/trackers/refined_labs"},{"id":"wtm_referlocal","hostnames":["ads.referlocal.com"],"name":"ReferLocal","link":"https://www.ghostery.com/whotracksme/trackers/referlocal"},{"id":"wtm_redux_media","hostnames":["reduxmedia.com","ads.reduxmediagroup.com"],"name":"Redux Media","link":"https://www.ghostery.com/whotracksme/trackers/redux_media"},{"id":"wtm_redtram","hostnames":["g4p.grt02.com","js.ua.redtram.com","n4p.ua.redtram.com","advert.ru.redtram.com","img2.ru.redtram.com","js.redtram.com","js.ru.redtram.com","n4p.ru.redtram.com","js.goods.redtram.com","nc.ru.redtram.com","ru.redtram.com"],"name":"RedTram","link":"https://www.ghostery.com/whotracksme/trackers/redtram"},{"id":"wtm_redlotus","hostnames":["a.triggit.com"],"name":"RedLotus","link":"https://www.ghostery.com/whotracksme/trackers/redlotus"},{"id":"wtm_reddit","hostnames":["reddit-image.s3.amazonaws.com","rereddit.com","www.rereddit.com","ads.reddit.com","events.redditmedia.com"],"name":"Reddit","link":"https://www.ghostery.com/whotracksme/trackers/reddit"},{"id":"wtm_red_ventures","hostnames":["analytics.cohesionapps.com","cdn.cohesionapps.com"],"name":"Red Ventures","link":"https://www.ghostery.com/whotracksme/trackers/red_ventures"},{"id":"wtm_recopick","hostnames":["static.recopick.com"],"name":"RecoPick","link":"https://www.ghostery.com/whotracksme/trackers/recopick"},{"id":"wtm_realclick","hostnames":["realclick.co.kr"],"name":"RealClick","link":"https://www.ghostery.com/whotracksme/trackers/realclick"},{"id":"wtm_readme","hostnames":["metrics.readme.io"],"name":"ReadMe","link":"https://www.ghostery.com/whotracksme/trackers/readme"},{"id":"wtm_reactx","hostnames":["ads.skinected.com","cdn1.skinected.com"],"name":"ReactX","link":"https://www.ghostery.com/whotracksme/trackers/reactx"},{"id":"wtm_reactful","hostnames":["plugin.reactful.com"],"name":"Reactful","link":"https://www.ghostery.com/whotracksme/trackers/reactful"},{"id":"wtm_reachlocal","hostnames":["cdn.rlets.com","ad.reachlocal.com"],"name":"ReachLocal","link":"https://www.ghostery.com/whotracksme/trackers/reachlocal"},{"id":"wtm_reachjunction","hostnames":["reachjunction.com","ib.reachjunction.com"],"name":"ReachJunction","link":"https://www.ghostery.com/whotracksme/trackers/reachjunction"},{"id":"wtm_rambler","hostnames":["counter.rambler.ru","top100-images.rambler.ru"],"name":"Rambler","link":"https://www.ghostery.com/whotracksme/trackers/rambler"},{"id":"wtm_rakuten_widget","hostnames":["mtwidget04.affiliate.rakuten.co.jp","xml.affilliate.rakuten.co.jp"],"name":"Rakuten Widget","link":"https://www.ghostery.com/whotracksme/trackers/rakuten_widget"},{"id":"wtm_rakuten_globalmarket","hostnames":["rakuten.co.jp","trafficgate.net","affiliate.rakuten.co.jp","anz.rd.rakuten.co.jp","api.ranking.rakuten.co.jp","ba.afl.rakuten.co.jp","dynamic.rakuten.co.jp","hbb.afl.rakuten.co.jp","rd.rakuten.co.jp","shopapi.ranking.rakuten.co.jp","static.affiliate.rakuten.co.jp","xml.affiliate.rakuten.co.jp","hb.afl.rakuten.co.jp"],"name":"Rakuten","link":"https://www.ghostery.com/whotracksme/trackers/rakuten_globalmarket"},{"id":"wtm_radial","hostnames":["dsa.csdata1.com"],"name":"Radial","link":"https://www.ghostery.com/whotracksme/trackers/radial"},{"id":"wtm_radarurl","hostnames":["radarurl.com"],"name":"RadarURL","link":"https://www.ghostery.com/whotracksme/trackers/radarurl"},{"id":"wtm_quora.com","hostnames":["log.quora.com"],"name":"Quora","link":"https://www.ghostery.com/whotracksme/trackers/quora.com"},{"id":"wtm_quisma","hostnames":["quisma.com","tracking.quisma.com"],"name":"Quisma","link":"https://www.ghostery.com/whotracksme/trackers/quisma"},{"id":"wtm_quinstreet","hostnames":["qnsr.com","e1.cdn.qnsr.com","l1.cdn.qnsr.com","e2.cdn.qnsr.com","o1.qnsr.com"],"name":"QuinStreet","link":"https://www.ghostery.com/whotracksme/trackers/quinstreet"},{"id":"wtm_quigo_adsonar","hostnames":["adsonar.com","ads.adsonar.com","ads.espn.adsonar.com","ads.tw.adsonar.com","js.adsonar.com","static.adsonar.com"],"name":"Quigo AdSonar","link":"https://www.ghostery.com/whotracksme/trackers/quigo_adsonar"},{"id":"wtm_qubit","hostnames":["d3c3cq33003psk.cloudfront.net","opentag-stats.qubit.com","gong-eb.qubit.com","lookup.qubit.com","sse.qubit.com"],"name":"Qubit Opentag","link":"https://www.ghostery.com/whotracksme/trackers/qubit"},{"id":"wtm_quantum_metric","hostnames":["quantummetric.com","cdn.quantummetric.com"],"name":"Quantum Metric","link":"https://www.ghostery.com/whotracksme/trackers/quantum_metric"},{"id":"wtm_qualaroo","hostnames":["geo.qualaroo.com"],"name":"Qualaroo","link":"https://www.ghostery.com/whotracksme/trackers/qualaroo"},{"id":"wtm_qbaka","hostnames":["cdn.qbaka.net"],"name":"Qbaka","link":"https://www.ghostery.com/whotracksme/trackers/qbaka"},{"id":"wtm_q1media","hostnames":["ads.q1media.com","q1mediahydraplatform.com"],"name":"Q1Media","link":"https://www.ghostery.com/whotracksme/trackers/q1media"},{"id":"wtm_pushnews","hostnames":["cdn.pushnews.eu"],"name":"Pushnews","link":"https://www.ghostery.com/whotracksme/trackers/pushnews"},{"id":"wtm_pusher.com","hostnames":["stats.pusher.com"],"name":"Pusher","link":"https://www.ghostery.com/whotracksme/trackers/pusher.com"},{"id":"wtm_purlive","hostnames":["oopt.fr"],"name":"PurLive","link":"https://www.ghostery.com/whotracksme/trackers/purlive"},{"id":"wtm_pulsepoint","hostnames":["contextweb.com","ads.contextweb.com","ds.contextweb.com","cdslog.contextweb.com","media.contextweb.com","tag.contextweb.com","www.contextweb.com","bh.contextweb.com","bid.contextweb.com","lga-bh.contextweb.com","lga-bh-bgp.contextweb.com","lga-tr.contextweb.com","media-active.contextweb.com","sjc-bh.contextweb.com","sjc-bid.contextweb.com","sjc-tr.contextweb.com","sjc-tr-bgp.contextweb.com","tag-st.contextweb.com"],"name":"PulsePoint","link":"https://www.ghostery.com/whotracksme/trackers/pulsepoint"},{"id":"wtm_pulse_insights","hostnames":["js.pulseinsights.com"],"name":"Pulse Insights","link":"https://www.ghostery.com/whotracksme/trackers/pulse_insights"},{"id":"wtm_pulpo_media","hostnames":["c2.tentaculos.net"],"name":"Pulpo Media","link":"https://www.ghostery.com/whotracksme/trackers/pulpo_media"},{"id":"wtm_pubmatic","hostnames":["st.pubmatic.com","hbopenbid-sg.pubmatic.com","hbopenbid-sgc.pubmatic.com","showads-sg.pubmatic.com","showads-sgc.pubmatic.com","haso.pubmatic.com","bid.pubmatic.com","track.pubmatic.com","t.pubmatic.com","showads1000.pubmatic.com","showadsak.pubmatic.com","strack.pubmatic.com","vid.pubmatic.com","ads.pubmatic.com","aktrack.pubmatic.com","apps.pubmatic.com","aud.pubmatic.com","clicktrack.pubmatic.com","gads.pubmatic.com","hbopenbid.pubmatic.com","image2.pubmatic.com","image3.pubmatic.com","image4.pubmatic.com","image5.pubmatic.com","image6.pubmatic.com","image8.pubmatic.com","openbid.pubmatic.com","ow.pubmatic.com","showads.pubmatic.com","simage2.pubmatic.com","simage4.pubmatic.com","sshowads.pubmatic.com"],"name":"PubMatic","link":"https://www.ghostery.com/whotracksme/trackers/pubmatic","exodusId":236},{"id":"wtm_publicidad.net","hostnames":["ads.publicidad.net"],"name":"Publicidad.net","link":"https://www.ghostery.com/whotracksme/trackers/publicidad.net"},{"id":"wtm_public_ideas","hostnames":["publicidees.com","tracking.publicidees.com"],"name":"Public Ideas","link":"https://www.ghostery.com/whotracksme/trackers/public_ideas"},{"id":"wtm_pubdirecte","hostnames":["pubdirecte.com","static.pubdirecte.com","www.pubdirecte.com","www2.pubdirecte.com"],"name":"Pubdirecte","link":"https://www.ghostery.com/whotracksme/trackers/pubdirecte"},{"id":"wtm_pt_engine","hostnames":["ptengine.jp"],"name":"Pt engine","link":"https://www.ghostery.com/whotracksme/trackers/pt_engine"},{"id":"wtm_psyma","hostnames":["scripts.psyma.com"],"name":"Psyma","link":"https://www.ghostery.com/whotracksme/trackers/psyma"},{"id":"wtm_proxistore.com","hostnames":["abs.proxistore.com"],"name":"Proxistore","link":"https://www.ghostery.com/whotracksme/trackers/proxistore.com"},{"id":"wtm_proximic","hostnames":["static.proximic.com","t01.proximic.com"],"name":"Proximic","link":"https://www.ghostery.com/whotracksme/trackers/proximic"},{"id":"wtm_prospecteye","hostnames":["tr.prospecteye.com"],"name":"ProspectEye","link":"https://www.ghostery.com/whotracksme/trackers/prospecteye"},{"id":"wtm_props","hostnames":["st-a.props.id"],"name":"Props","link":"https://www.ghostery.com/whotracksme/trackers/props"},{"id":"wtm_propermedia","hostnames":["proper.io","global.proper.io"],"name":"Proper Media","link":"https://www.ghostery.com/whotracksme/trackers/propermedia"},{"id":"wtm_project_wonderful","hostnames":["projectwonderful.com","www.projectwonderful.com"],"name":"Project Wonderful","link":"https://www.ghostery.com/whotracksme/trackers/project_wonderful"},{"id":"wtm_programattik","hostnames":["programattik.com","ads.programattik.com"],"name":"Programattik","link":"https://www.ghostery.com/whotracksme/trackers/programattik"},{"id":"wtm_productsup","hostnames":["lib.productsup.io"],"name":"ProductsUp","link":"https://www.ghostery.com/whotracksme/trackers/productsup"},{"id":"wtm_proclivity","hostnames":["t.pswec.com"],"name":"Proclivity","link":"https://www.ghostery.com/whotracksme/trackers/proclivity"},{"id":"wtm_prismamediadigital.com","hostnames":["abo.prismamediadigital.com","ad.prismamediadigital.com"],"name":"Prisma Media Digital","link":"https://www.ghostery.com/whotracksme/trackers/prismamediadigital.com"},{"id":"wtm_pricespider","hostnames":["cdn.pricespider.com"],"name":"Pricespider","link":"https://www.ghostery.com/whotracksme/trackers/pricespider"},{"id":"wtm_pressly","hostnames":["api.pressly.com"],"name":"Pressly","link":"https://www.ghostery.com/whotracksme/trackers/pressly"},{"id":"wtm_press","hostnames":["h.ppjol.com","ui.ppjol.com","s.ppjol.net"],"name":"Press+","link":"https://www.ghostery.com/whotracksme/trackers/press"},{"id":"wtm_predicta","hostnames":["adserver.com.br"],"name":"Predicta","link":"https://www.ghostery.com/whotracksme/trackers/predicta"},{"id":"wtm_prebid","hostnames":["prebid.org","currency.prebid.org"],"name":"Prebid","link":"https://www.ghostery.com/whotracksme/trackers/prebid"},{"id":"wtm_pozvonim","hostnames":["api.pozvonim.com"],"name":"Pozvonim","link":"https://www.ghostery.com/whotracksme/trackers/pozvonim"},{"id":"wtm_powerlinks","hostnames":["www.powerlinks.com"],"name":"PowerLinks","link":"https://www.ghostery.com/whotracksme/trackers/powerlinks"},{"id":"wtm_post_affiliate_pro","hostnames":["netech.postaffiliatepro.com"],"name":"Post Affiliate Pro","link":"https://www.ghostery.com/whotracksme/trackers/post_affiliate_pro"},{"id":"wtm_porta_brazil","hostnames":["barra.brasil.gov.br"],"name":"Porta Brazil","link":"https://www.ghostery.com/whotracksme/trackers/porta_brazil"},{"id":"wtm_pornwave","hostnames":["prscripts.com"],"name":"Pornwave","link":"https://www.ghostery.com/whotracksme/trackers/pornwave"},{"id":"wtm_pornhub","hostnames":["hotwifepornhub.com","www.hotwifepornhub.com","ht.pornhub.com"],"name":"PornHub","link":"https://www.ghostery.com/whotracksme/trackers/pornhub"},{"id":"wtm_poponclick","hostnames":["poponclick.com","www.poponclick.com"],"name":"PopOnClick","link":"https://www.ghostery.com/whotracksme/trackers/poponclick"},{"id":"wtm_popmyads","hostnames":["cdn.popmyads.com"],"name":"PopMyAds","link":"https://www.ghostery.com/whotracksme/trackers/popmyads"},{"id":"wtm_popin.cc","hostnames":["a.popin.cc","api.popin.cc","discoveryplus.popin.cc","r.popin.cc","rlog.popin.cc"],"name":"popIn","link":"https://www.ghostery.com/whotracksme/trackers/popin.cc"},{"id":"wtm_popcorn_metrics","hostnames":["desv383oqqc0.cloudfront.net"],"name":"Popcorn Metrics","link":"https://www.ghostery.com/whotracksme/trackers/popcorn_metrics"},{"id":"wtm_popcash","hostnames":["popcash.net","ps.popcash.net","cdn.popcash.net"],"name":"Popcash","link":"https://www.ghostery.com/whotracksme/trackers/popcash"},{"id":"wtm_popads","hostnames":["popads.net","popadscdn.net","c2.popads.net","static.popads.net","out.popads.net","banners.popads.net","world.popadscdn.net","c1.popads.net","serve.popads.net"],"name":"PopAds","link":"https://www.ghostery.com/whotracksme/trackers/popads"},{"id":"wtm_polar.me","hostnames":["mediavoice.com","plugin.mediavoice.com","cdn.mediavoice.com","meraxes-cdn.polarmobile.com"],"name":"Polar","link":"https://www.ghostery.com/whotracksme/trackers/polar.me"},{"id":"wtm_pointroll","hostnames":["pointroll.com","container.pointroll.com","clients.pointroll.com","ads.pointroll.com","mirror.pointroll.com","speed.pointroll.com"],"name":"PointRoll","link":"https://www.ghostery.com/whotracksme/trackers/pointroll"},{"id":"wtm_po.st","hostnames":["i.po.st","p.po.st","s.po.st"],"name":"Po.st","link":"https://www.ghostery.com/whotracksme/trackers/po.st"},{"id":"wtm_plugrush","hostnames":["plugrush.com","pu.plugrush.com","static.plugrush.com"],"name":"PlugRush","link":"https://www.ghostery.com/whotracksme/trackers/plugrush"},{"id":"wtm_plista","hostnames":["plista.com","click.plista.com","farm.plista.com","static.plista.com"],"name":"Plista","link":"https://www.ghostery.com/whotracksme/trackers/plista"},{"id":"wtm_plenty_of_fish","hostnames":["ads.pof.com","d6y5.ads.pof.com","t.ads.pof.com"],"name":"Plenty Of Fish","link":"https://www.ghostery.com/whotracksme/trackers/plenty_of_fish"},{"id":"wtm_platformone","hostnames":["a.one.impact-ad.jp","as.ad.impact-ad.jp","as.ao.impact-ad.jp","as.bi.impact-ad.jp","as.cd.impact-ad.jp","as.ch.impact-ad.jp","as.cw.impact-ad.jp","as.dc.impact-ad.jp","as.hc.impact-ad.jp","as.ik.impact-ad.jp","as.in.impact-ad.jp","as.it.impact-ad.jp","as.iy.impact-ad.jp","as.kd.impact-ad.jp","as.ko.impact-ad.jp","as.mc.impact-ad.jp","as.mv.impact-ad.jp","as.oe.impact-ad.jp","as.se.impact-ad.jp","as.sp.impact-ad.jp","as.ve.impact-ad.jp","as.yl.impact-ad.jp","aw.dw.impact-ad.jp","img.ak.impact-ad.jp","img.ll.impact-ad.jp","m.one.impact-ad.jp","penta.a.one.impact-ad.jp","s.f1.impact-ad.jp","y.one.impact-ad.jp"],"name":"Platform One","link":"https://www.ghostery.com/whotracksme/trackers/platformone"},{"id":"wtm_placester","hostnames":["ads.placester.net","d3uemyw1e5n0jw.cloudfront.net"],"name":"Placester","link":"https://www.ghostery.com/whotracksme/trackers/placester"},{"id":"wtm_piximedia","hostnames":["ad.piximedia.com"],"name":"Piximedia","link":"https://www.ghostery.com/whotracksme/trackers/piximedia"},{"id":"wtm_pixfuture","hostnames":["vast1.pixfuture.com"],"name":"PixFuture","link":"https://www.ghostery.com/whotracksme/trackers/pixfuture"},{"id":"wtm_pixel_union","hostnames":["app.pixelpop.co"],"name":"Pixel Union","link":"https://www.ghostery.com/whotracksme/trackers/pixel_union"},{"id":"wtm_pipz","hostnames":["app.pipz.io"],"name":"Pipz","link":"https://www.ghostery.com/whotracksme/trackers/pipz"},{"id":"wtm_pinterest","hostnames":["ads-dev.pinterest.com","ads.pinterest.com","analytics.pinterest.com","ct.pinterest.com","log.pinterest.com","trk.pinterest.com"],"name":"Pinterest","link":"https://www.ghostery.com/whotracksme/trackers/pinterest"},{"id":"wtm_pingdom","hostnames":["rum-collector.pingdom.net","rum-collector-2.pingdom.net","rum-static.pingdom.net"],"name":"Pingdom","link":"https://www.ghostery.com/whotracksme/trackers/pingdom"},{"id":"wtm_piano","hostnames":["piano.io"],"name":"Piano Analytics","link":"https://www.ghostery.com/whotracksme/trackers/piano"},{"id":"wtm_phunware","hostnames":["d2bgg7rjywcwsy.cloudfront.net"],"name":"Phunware","link":"https://www.ghostery.com/whotracksme/trackers/phunware"},{"id":"wtm_pheedo","hostnames":["ads.pheedo.com"],"name":"Pheedo","link":"https://www.ghostery.com/whotracksme/trackers/pheedo"},{"id":"wtm_persio","hostnames":["code.pers.io"],"name":"Persio","link":"https://www.ghostery.com/whotracksme/trackers/persio"},{"id":"wtm_persianstat","hostnames":["www.persianstat.com","service.persianstat.com"],"name":"PersianStat","link":"https://www.ghostery.com/whotracksme/trackers/persianstat"},{"id":"wtm_persgroep","hostnames":["ads.persgroep.net"],"name":"De Persgroep","link":"https://www.ghostery.com/whotracksme/trackers/persgroep"},{"id":"wtm_perimeterx.net","hostnames":["collector-pxel3l4xih.perimeterx.net"],"name":"Perimeterx","link":"https://www.ghostery.com/whotracksme/trackers/perimeterx.net"},{"id":"wtm_performax","hostnames":["dale.performax.cz"],"name":"Performax","link":"https://www.ghostery.com/whotracksme/trackers/performax"},{"id":"wtm_performancing_metrics","hostnames":["performancing.com","pmetrics.performancing.com"],"name":"Performancing Metrics","link":"https://www.ghostery.com/whotracksme/trackers/performancing_metrics"},{"id":"wtm_perfect_market","hostnames":["widget.perfectmarket.com"],"name":"Perfect Market","link":"https://www.ghostery.com/whotracksme/trackers/perfect_market"},{"id":"wtm_perfect_audience","hostnames":["perfectaudience.com","pixel-geo.prfct.co","ads.perfectaudience.com","tag.perfectaudience.com"],"name":"Perfect Audience","link":"https://www.ghostery.com/whotracksme/trackers/perfect_audience"},{"id":"wtm_pendo.io","hostnames":["app.pendo.io"],"name":"pendo","link":"https://www.ghostery.com/whotracksme/trackers/pendo.io"},{"id":"wtm_peer39","hostnames":["peer39.com","catrg.peer39.net","stags.peer39.net"],"name":"Peer39","link":"https://www.ghostery.com/whotracksme/trackers/peer39"},{"id":"wtm_partner-ads","hostnames":["partner-ads.com","www.partner-ads.com"],"name":"Partner-Ads","link":"https://www.ghostery.com/whotracksme/trackers/partner-ads"},{"id":"wtm_parsely","hostnames":["d1z2jf7jlzjs58.cloudfront.net","parsely.com","config.parsely.com","srv.pixel.parsely.com","www.srv.pixel.parsely.com","api.parsely.com","cdn.parsely.com","p1.parsely.com","pixel.parsely.com","static.parsely.com"],"name":"Parse.ly","link":"https://www.ghostery.com/whotracksme/trackers/parsely"},{"id":"wtm_pardot","hostnames":["cdn.pardot.com","pi.pardot.com"],"name":"Pardot","link":"https://www.ghostery.com/whotracksme/trackers/pardot"},{"id":"wtm_paperg","hostnames":["paperg.com","www.paperg.com"],"name":"PaperG","link":"https://www.ghostery.com/whotracksme/trackers/paperg"},{"id":"wtm_pangleglobal","hostnames":["analytics.pangle-ads.com"],"name":"Pangle","link":"https://www.ghostery.com/whotracksme/trackers/pangleglobal"},{"id":"wtm_owneriq","hostnames":["owneriq.net","bidder.owneriq.net","lbnyj2.bidder.owneriq.net","lbsjc.bidder.owneriq.net","px.owneriq.net","spx.owneriq.net"],"name":"OwnerIQ","link":"https://www.ghostery.com/whotracksme/trackers/owneriq"},{"id":"wtm_owa","hostnames":["1000ps.oewabox.at","afinder.oewabox.at","alphalux.oewabox.at","apodir.oewabox.at","arboe.oewabox.at","aschreib.oewabox.at","ascout24.oewabox.at","atvplus.oewabox.at","audi4e.oewabox.at","austria.oewabox.at","automobi.oewabox.at","automoto.oewabox.at","babyf.oewabox.at","bazar.oewabox.at","bdb.oewabox.at","bliga.oewabox.at","buschen.oewabox.at","car4you.oewabox.at","cinplex.oewabox.at","derstand.oewabox.at","dispatcher.oewabox.at","docfind.oewabox.at","doodle.oewabox.at","drei.oewabox.at","dropkick.oewabox.at","enerweb.oewabox.at","falstaff.oewabox.at","fanrep.oewabox.at","fflotte.oewabox.at","fitges.oewabox.at","fondprof.oewabox.at","fratz.oewabox.at","fscout24.oewabox.at","gamesw.oewabox.at","geizhals.oewabox.at","gillout.oewabox.at","gkueche.oewabox.at","gmx.oewabox.at","gofem.oewabox.at","heute.oewabox.at","immobili.oewabox.at","immosuch.oewabox.at","indumag.oewabox.at","induweb.oewabox.at","issges.oewabox.at","jobwohn.oewabox.at","karriere.oewabox.at","kinder.oewabox.at","kinowelt.oewabox.at","krone.oewabox.at","kronehit.oewabox.at","landwirt.oewabox.at","liportal.oewabox.at","mamilade.oewabox.at","manntv.oewabox.at","medpop.oewabox.at","megaplex.oewabox.at","metropol.oewabox.at","mmarkt.oewabox.at","monitor.oewabox.at","motorl.oewabox.at","msn.oewabox.at","newsnetw.oewabox.at","nickde.oewabox.at","noen.oewabox.at","notori.oewabox.at","oe24.oewabox.at","oeamtc.oewabox.at","oewa.oewabox.at","ooen.oewabox.at","orf.oewabox.at","parent.oewabox.at","radioat.oewabox.at","rtl.oewabox.at","salzburg.oewabox.at","schlager.oewabox.at","sdo.oewabox.at","seibli.oewabox.at","servustv.oewabox.at","skip.oewabox.at","skysport.oewabox.at","smedizin.oewabox.at","sms.oewabox.at","solidbau.oewabox.at","speising.oewabox.at","sportat.oewabox.at","ssl-compass.oewabox.at","ssl-geizhals.oewabox.at","ssl-helpgvat.oewabox.at","ssl-karriere.oewabox.at","ssl-msn.oewabox.at","ssl-top.oewabox.at","ssl-uspgvat.oewabox.at","ssl-willhab.oewabox.at","ssl-wko.oewabox.at","starchat.oewabox.at","sunny.oewabox.at","super.oewabox.at","supermed.oewabox.at","svpro7.oewabox.at","szene1.oewabox.at","tagpress.oewabox.at","tele.oewabox.at","tennis.oewabox.at","tips.oewabox.at","tirolcom.oewabox.at","top.oewabox.at","tramarkt.oewabox.at","tripwolf.oewabox.at","uncut.oewabox.at","unimed.oewabox.at","uwz.oewabox.at","vcm.oewabox.at","via.oewabox.at","viacom.oewabox.at","warda.oewabox.at","webprog.oewabox.at","wfussb.oewabox.at","wienerz.oewabox.at","wiengvat.oewabox.at","willhab.oewabox.at","wirtvlg.oewabox.at","woche.oewabox.at","wohnnet.oewabox.at","zfm.oewabox.at"],"name":"OWA","link":"https://www.ghostery.com/whotracksme/trackers/owa"},{"id":"wtm_otm-r.com","hostnames":["ssp.otm-r.com"],"name":"OTM","link":"https://www.ghostery.com/whotracksme/trackers/otm-r.com"},{"id":"wtm_order_groove","hostnames":["static.ordergroove.com"],"name":"Order Groove","link":"https://www.ghostery.com/whotracksme/trackers/order_groove"},{"id":"wtm_orangesoda","hostnames":["otracking.com"],"name":"OrangeSoda","link":"https://www.ghostery.com/whotracksme/trackers/orangesoda"},{"id":"wtm_orange142","hostnames":["ads.orange142.com"],"name":"Orange142","link":"https://www.ghostery.com/whotracksme/trackers/orange142"},{"id":"wtm_orange","hostnames":["gorange.fr","pages-perso-orange.fr","all.orfr.adgtw.orangeads.fr","ap.read.mediation.pns.ap.orangeads.fr","reverso.refr.adgtw.orangeads.fr"],"name":"Orange","link":"https://www.ghostery.com/whotracksme/trackers/orange"},{"id":"wtm_ora.tv","hostnames":["ad.pandora.tv","prism.pandora.tv"],"name":"Ora.TV","link":"https://www.ghostery.com/whotracksme/trackers/ora.tv"},{"id":"wtm_optimax_media_delivery","hostnames":["optmd.com","cdn.optmd.com"],"name":"Optimax Media Delivery","link":"https://www.ghostery.com/whotracksme/trackers/optimax_media_delivery"},{"id":"wtm_optify","hostnames":["service.optify.net"],"name":"Optify","link":"https://www.ghostery.com/whotracksme/trackers/optify"},{"id":"wtm_operative_media","hostnames":["c03.adsummos.net","c04.adsummos.net"],"name":"Operative Media","link":"https://www.ghostery.com/whotracksme/trackers/operative_media"},{"id":"wtm_opentracker","hostnames":["script.opentracker.net","server1.opentracker.net","server10.opentracker.net","server11.opentracker.net","log.opentracker.net"],"name":"Opentracker","link":"https://www.ghostery.com/whotracksme/trackers/opentracker"},{"id":"wtm_onlinewebstat","hostnames":["logo.onlinewebstat.com","sayac.onlinewebstat.com","sayac.onlinewebstats.com"],"name":"Onlinewebstat","link":"https://www.ghostery.com/whotracksme/trackers/onlinewebstat"},{"id":"wtm_onetag","hostnames":["geo-location.s-onetag.com","onetag-geo-grouping.s-onetag.com","beacon.s-onetag.com","connect-metrics-collector.s-onetag.com","data-beacons.s-onetag.com","dfp-gateway.s-onetag.com","get.s-onetag.com","market-dev.s-onetag.com","onetag-geo.s-onetag.com","prebid.s-onetag.com","signal-beacon.s-onetag.com","signal-metrics-collector-beta.s-onetag.com"],"name":"OneTag","link":"https://www.ghostery.com/whotracksme/trackers/onetag"},{"id":"wtm_onestat","hostnames":["stat.onestat.com"],"name":"OneStat","link":"https://www.ghostery.com/whotracksme/trackers/onestat"},{"id":"wtm_onefeed","hostnames":["tracking.onefeed.co.uk"],"name":"Onefeed","link":"https://www.ghostery.com/whotracksme/trackers/onefeed"},{"id":"wtm_oneall","hostnames":["btc-echode.api.oneall.com"],"name":"Oneall","link":"https://www.ghostery.com/whotracksme/trackers/oneall"},{"id":"wtm_onaudience","hostnames":["onaudience.com","pixel.onaudience.com"],"name":"OnAudience","link":"https://www.ghostery.com/whotracksme/trackers/onaudience"},{"id":"wtm_octavius","hostnames":["service.octavius.rocks"],"name":"Octavius","link":"https://www.ghostery.com/whotracksme/trackers/octavius"},{"id":"wtm_ocioso","hostnames":["ocioso.com.br"],"name":"Ocioso","link":"https://www.ghostery.com/whotracksme/trackers/ocioso"},{"id":"wtm_nui_media","hostnames":["rotator.adjuggler.com"],"name":"NUI Media","link":"https://www.ghostery.com/whotracksme/trackers/nui_media"},{"id":"wtm_nugg.ad","hostnames":["24m.nuggad.net","abcno.nuggad.net","asqcondenast.nuggad.net","asqrtl.nuggad.net","axdget-sync.nuggad.net","ebayit-dp.nuggad.net","lokalavisendk.nuggad.net","lpm-francetv.nuggad.net","lpm-lagardere.nuggad.net","lpm-tf1.nuggad.net","mediamond.nuggad.net","n24se.nuggad.net","naftemporiki.nuggad.net","om.nuggad.net","tuno.nuggad.net","ri.nuggad.net","tv2dk.nuggad.net","websystem24.nuggad.net","3w.nuggad.net","4wmp.nuggad.net","71i.nuggad.net","adcloud-dp.nuggad.net","adselect.nuggad.net","asqlesechos.nuggad.net","asqnext.nuggad.net","bei.nuggad.net","berldk.nuggad.net","derstandard.nuggad.net","dbadk.nuggad.net","gwp.nuggad.net","ip.nuggad.net","jpdk.nuggad.net","jobzdk.nuggad.net","krone.nuggad.net","msnad.nuggad.net","mtv.nuggad.net","nettno.nuggad.net","nuggad.nuggad.net","oms.nuggad.net","poldk.nuggad.net","rmsi.nuggad.net","si.nuggad.net","survey.nuggad.net","yahoo.nuggad.net","asv.nuggad.net"],"name":"Nugg.Ad","link":"https://www.ghostery.com/whotracksme/trackers/nugg.ad"},{"id":"wtm_nttcom_online_marketing_solutions","hostnames":["tracer.jp"],"name":"NTTCom Online Marketing Solutions","link":"https://www.ghostery.com/whotracksme/trackers/nttcom_online_marketing_solutions"},{"id":"wtm_ntent","hostnames":["as.featurelink.com"],"name":"NTENT","link":"https://www.ghostery.com/whotracksme/trackers/ntent"},{"id":"wtm_ns8","hostnames":["www.analytics.icons8.com","analytics.icons8.com"],"name":"NS8","link":"https://www.ghostery.com/whotracksme/trackers/ns8"},{"id":"wtm_notify","hostnames":["adtrack.adleadevent.com"],"name":"Notify","link":"https://www.ghostery.com/whotracksme/trackers/notify"},{"id":"wtm_nonstop_consulting","hostnames":["a.trkme.net"],"name":"Resolution Media","link":"https://www.ghostery.com/whotracksme/trackers/nonstop_consulting"},{"id":"wtm_noddus","hostnames":["track.noddus.com"],"name":"Noddus","link":"https://www.ghostery.com/whotracksme/trackers/noddus"},{"id":"wtm_nk.pl_widgets","hostnames":["firenzepunk.pl","myhank.pl","toonk.pl","www.firenzepunk.pl","www.myhank.pl","www.toonk.pl","noebank.pl","www.noebank.pl","robertolender.olgarank.pl","www.robertolender.olgarank.pl","get.x-link.pl","playlink.pl"],"name":"NK.pl Widgets","link":"https://www.ghostery.com/whotracksme/trackers/nk.pl_widgets"},{"id":"wtm_ninja_access_analysis","hostnames":["adm.shinobi.jp","adf.shinobi.jp","asumi.shinobi.jp","bfile.shinobi.jp","chikayo-dsp.shinobi.jp","gad.shinobi.jp","omt.shinobi.jp","rcm.shinobi.jp","sync.shinobi.jp","v2st.shinobi.jp","x3.shinobi.jp","x9.shinobi.jp","xa.shinobi.jp"],"name":"Ninja Access Analysis","link":"https://www.ghostery.com/whotracksme/trackers/ninja_access_analysis"},{"id":"wtm_nextag_roi_optimizer","hostnames":["imgsrv.nextag.com"],"name":"Nextag ROI Optimizer","link":"https://www.ghostery.com/whotracksme/trackers/nextag_roi_optimizer"},{"id":"wtm_next_user","hostnames":["track.nextuser.com"],"name":"Next User","link":"https://www.ghostery.com/whotracksme/trackers/next_user"},{"id":"wtm_next_performance","hostnames":["nxtck.com","p.nxtck.com"],"name":"Next Performance","link":"https://www.ghostery.com/whotracksme/trackers/next_performance"},{"id":"wtm_newtention","hostnames":["ads.newtention.net","ads.newtentionassets.net"],"name":"Newtention","link":"https://www.ghostery.com/whotracksme/trackers/newtention"},{"id":"wtm_newstogram","hostnames":["da.newstogram.com"],"name":"Newstogram","link":"https://www.ghostery.com/whotracksme/trackers/newstogram"},{"id":"wtm_newscgp.com","hostnames":["us.pixel.newscgp.com","v2.pixel.newscgp.com","us.tags.newscgp.com"],"name":"News Connect","link":"https://www.ghostery.com/whotracksme/trackers/newscgp.com"},{"id":"wtm_neustar_adadvisor","hostnames":["adadvisor.net","cdn1.adadvisor.net","pixel.adadvisor.net","www.adadvisor.net"],"name":"Neustar AdAdvisor","link":"https://www.ghostery.com/whotracksme/trackers/neustar_adadvisor"},{"id":"wtm_networkedblogs","hostnames":["nwidget.networkedblogs.com"],"name":"NetworkedBlogs","link":"https://www.ghostery.com/whotracksme/trackers/networkedblogs"},{"id":"wtm_netshelter","hostnames":["netshelter.net","zdbb.netshelter.net"],"name":"NetShelter","link":"https://www.ghostery.com/whotracksme/trackers/netshelter"},{"id":"wtm_netseer","hostnames":["netseer.com","cm.netseer.com","cmi.netseer.com","cl.netseer.com","cl-c.netseer.com","contextlinks.netseer.com","search.netseer.com"],"name":"NetSeer","link":"https://www.ghostery.com/whotracksme/trackers/netseer"},{"id":"wtm_netmonitor","hostnames":["stat.netmonitor.fi"],"name":"NetMonitor","link":"https://www.ghostery.com/whotracksme/trackers/netmonitor"},{"id":"wtm_netbooster_group","hostnames":["t.bbtrack.net"],"name":"NetBooster Group","link":"https://www.ghostery.com/whotracksme/trackers/netbooster_group"},{"id":"wtm_netbiscuits","hostnames":["dcs.netbiscuits.net"],"name":"Netbiscuits","link":"https://www.ghostery.com/whotracksme/trackers/netbiscuits"},{"id":"wtm_net-metrix","hostnames":["microsof.wemfbox.ch"],"name":"NET-Metrix","link":"https://www.ghostery.com/whotracksme/trackers/net-metrix"},{"id":"wtm_net_communities","hostnames":["netcommunities.com","ad.netcommunities.com","ads.netcommunities.com"],"name":"Net Communities","link":"https://www.ghostery.com/whotracksme/trackers/net_communities"},{"id":"wtm_net_avenir","hostnames":["engine.espace.netavenir.com"],"name":"Net Avenir","link":"https://www.ghostery.com/whotracksme/trackers/net_avenir"},{"id":"wtm_neory","hostnames":["ad-srv.net","ad.ad-srv.net","cdn.contentspread.net"],"name":"NEORY","link":"https://www.ghostery.com/whotracksme/trackers/neory"},{"id":"wtm_neodata","hostnames":["adlev.neodatagroup.com","t.neodatagroup.com"],"name":"Neodata","link":"https://www.ghostery.com/whotracksme/trackers/neodata"},{"id":"wtm_naver.com","hostnames":["ad.naver.com","adcreative.naver.com"],"name":"Naver","link":"https://www.ghostery.com/whotracksme/trackers/naver.com"},{"id":"wtm_navegg_dmp","hostnames":["navdmp.com","tag.navdmp.com"],"name":"Navegg","link":"https://www.ghostery.com/whotracksme/trackers/navegg_dmp"},{"id":"wtm_nativo","hostnames":["ntv.io","postrelease.com","prstats.postrelease.com","a.postrelease.com","adserve.postrelease.com","s.ntv.io","jadserve.postrelease.com"],"name":"Nativo","link":"https://www.ghostery.com/whotracksme/trackers/nativo"},{"id":"wtm_nativeads.com","hostnames":["papi.mynativeads.com","cpanel.nativeads.com","exchange.nativeads.com","rtb.nativeads.com","api.c.avazunativeads.com","avazunativeads.com"],"name":"native ads","link":"https://www.ghostery.com/whotracksme/trackers/nativeads.com"},{"id":"wtm_natimatica","hostnames":["p1.ntvk1.ru"],"name":"Natimatica","link":"https://www.ghostery.com/whotracksme/trackers/natimatica"},{"id":"wtm_narrative_io","hostnames":["io.narrative.io"],"name":"Narrative","link":"https://www.ghostery.com/whotracksme/trackers/narrative_io"},{"id":"wtm_narrativ","hostnames":["static.bam-x.com"],"name":"Narrativ","link":"https://www.ghostery.com/whotracksme/trackers/narrativ"},{"id":"wtm_nano_interactive","hostnames":["ad.audiencemanager.de"],"name":"Nano Interactive","link":"https://www.ghostery.com/whotracksme/trackers/nano_interactive"},{"id":"wtm_nakanohito.jp","hostnames":["nakanohito.jp","awasete.nakanohito.jp"],"name":"Nakanohito","link":"https://www.ghostery.com/whotracksme/trackers/nakanohito.jp"},{"id":"wtm_mytop_counter","hostnames":["mystat-in.net","c.mystat-in.net","011707160008.c.mystat-in.net","121807150325.c.mystat-in.net","122907224924.c.mystat-in.net","061606084448.c.mystat-in.net","070806142521.c.mystat-in.net","090906042103.c.mystat-in.net","092706152958.c.mystat-in.net","102106151057.c.mystat-in.net","112006133326.c.mystat-in.net"],"name":"Mytop Counter","link":"https://www.ghostery.com/whotracksme/trackers/mytop_counter"},{"id":"wtm_mythings","hostnames":["mythings.com","bidi-geo.mythings.com"],"name":"myThings","link":"https://www.ghostery.com/whotracksme/trackers/mythings"},{"id":"wtm_mystat","hostnames":["stat.mystat.hu"],"name":"MyStat","link":"https://www.ghostery.com/whotracksme/trackers/mystat"},{"id":"wtm_mypagerank","hostnames":["mypagerank.net","www.mypagerank.net"],"name":"MyPagerank","link":"https://www.ghostery.com/whotracksme/trackers/mypagerank"},{"id":"wtm_mycounter.ua","hostnames":["mycounter.com.ua","mycounter.ua","get.mycounter.com.ua","scripts.mycounter.com.ua","get.mycounter.ua","scripts.mycounter.ua"],"name":"MyCounter.ua","link":"https://www.ghostery.com/whotracksme/trackers/mycounter.ua"},{"id":"wtm_mybuys","hostnames":["t.p.mybuys.com"],"name":"MyBuys","link":"https://www.ghostery.com/whotracksme/trackers/mybuys"},{"id":"wtm_mybloglog","hostnames":["mybloglog.com"],"name":"MyBlogLog","link":"https://www.ghostery.com/whotracksme/trackers/mybloglog"},{"id":"wtm_mrskincash","hostnames":["mrskincash.com"],"name":"MrSkinCash","link":"https://www.ghostery.com/whotracksme/trackers/mrskincash"},{"id":"wtm_mrp","hostnames":["tracker.mrpfd.com"],"name":"MRP","link":"https://www.ghostery.com/whotracksme/trackers/mrp"},{"id":"wtm_mozoo","hostnames":["storage.mozoo.com"],"name":"MoZoo","link":"https://www.ghostery.com/whotracksme/trackers/mozoo"},{"id":"wtm_mousestats","hostnames":["mousestats.com","www2.mousestats.com"],"name":"MouseStats","link":"https://www.ghostery.com/whotracksme/trackers/mousestats"},{"id":"wtm_mouseflow","hostnames":["mouseflow.com","a.mouseflow.com","cdn.mouseflow.com","n2.mouseflow.com","o2.mouseflow.com"],"name":"Mouseflow","link":"https://www.ghostery.com/whotracksme/trackers/mouseflow"},{"id":"wtm_motigo_webstats","hostnames":["nedstatbasic.net","webstats.motigo.com","m1.nedstatbasic.net","nl.nedstatbasic.net","v1.nedstatbasic.net","at.m1.nedstatbasic.net","m1.webstats.motigo.com"],"name":"Motigo Webstats","link":"https://www.ghostery.com/whotracksme/trackers/motigo_webstats"},{"id":"wtm_more_communication","hostnames":["ad.ad-arata.com"],"name":"More Communication","link":"https://www.ghostery.com/whotracksme/trackers/more_communication"},{"id":"wtm_monster_advertising","hostnames":["cookie.monster.com","members.commissionmonster.com","commissionmonster.com","impressionmonster.com","a.optinmonster.com","api.optinmonster.com","app.optinmonster.com"],"name":"Monster Advertising","link":"https://www.ghostery.com/whotracksme/trackers/monster_advertising"},{"id":"wtm_monitus","hostnames":["live.monitus.net"],"name":"Monitus","link":"https://www.ghostery.com/whotracksme/trackers/monitus"},{"id":"wtm_mongoose_metrics","hostnames":["www.mongoosemetrics.com"],"name":"Mongoose Metrics","link":"https://www.ghostery.com/whotracksme/trackers/mongoose_metrics"},{"id":"wtm_monetize_me","hostnames":["ads.monetize-me.com"],"name":"Monetize Me","link":"https://www.ghostery.com/whotracksme/trackers/monetize_me"},{"id":"wtm_monetate","hostnames":["monetate.net","b.monetate.net","f.monetate.net","a.monetate.net","ad.monetate.net","af.monetate.net","api.monetate.net","d.monetate.net","engine.monetate.net","sb.monetate.net","se.monetate.net"],"name":"Monetate","link":"https://www.ghostery.com/whotracksme/trackers/monetate"},{"id":"wtm_modern_impact","hostnames":["intelligentpixel.modernimpact.com"],"name":"Modern Impact","link":"https://www.ghostery.com/whotracksme/trackers/modern_impact"},{"id":"wtm_mocean_mobile","hostnames":["ads.mocean.mobi","ads.moceanads.com"],"name":"mOcean Mobile","link":"https://www.ghostery.com/whotracksme/trackers/mocean_mobile"},{"id":"wtm_mobicow","hostnames":["cdn.mobicow.com"],"name":"Mobicow","link":"https://www.ghostery.com/whotracksme/trackers/mobicow"},{"id":"wtm_mixpo","hostnames":["swf.mixpo.com"],"name":"Mixpo","link":"https://www.ghostery.com/whotracksme/trackers/mixpo"},{"id":"wtm_mirando","hostnames":["get.mirando.de"],"name":"Mirando","link":"https://www.ghostery.com/whotracksme/trackers/mirando"},{"id":"wtm_minewhat","hostnames":["minewhat.com"],"name":"MineWhat","link":"https://www.ghostery.com/whotracksme/trackers/minewhat"},{"id":"wtm_mindviz_tracker","hostnames":["mvtracker.com"],"name":"MindViz Tracker","link":"https://www.ghostery.com/whotracksme/trackers/mindviz_tracker"},{"id":"wtm_mindspark","hostnames":["ak.imgfarm.com"],"name":"Mindspark","link":"https://www.ghostery.com/whotracksme/trackers/mindspark"},{"id":"wtm_mindset_media","hostnames":["mmismm.com"],"name":"Mindset Media","link":"https://www.ghostery.com/whotracksme/trackers/mindset_media"},{"id":"wtm_microsoft_clarity","hostnames":["k.clarity.ms","www.clarity.ms"],"name":"Microsoft Clarity","link":"https://www.ghostery.com/whotracksme/trackers/microsoft_clarity"},{"id":"wtm_microsoft_analytics","hostnames":["analytics.live.com","digg.analytics.live.com"],"name":"Microsoft Analytics","link":"https://www.ghostery.com/whotracksme/trackers/microsoft_analytics"},{"id":"wtm_metriweb","hostnames":["lin31.metriweb.be","msnbe-hp.metriweb.be"],"name":"MetriWeb","link":"https://www.ghostery.com/whotracksme/trackers/metriweb"},{"id":"wtm_metrigo","hostnames":["rtb.metrigo.com"],"name":"Metrigo","link":"https://www.ghostery.com/whotracksme/trackers/metrigo"},{"id":"wtm_metapeople","hostnames":["creative.metalyzer.com"],"name":"Metapeople","link":"https://www.ghostery.com/whotracksme/trackers/metapeople"},{"id":"wtm_metaffiliation.com","hostnames":["metaffiliation.com","netaffiliation.com","action.metaffiliation.com","img.metaffiliation.com"],"name":"Netaffiliation","link":"https://www.ghostery.com/whotracksme/trackers/metaffiliation.com"},{"id":"wtm_meta_network","hostnames":["ad.metanetwork.com"],"name":"Meta Network","link":"https://www.ghostery.com/whotracksme/trackers/meta_network"},{"id":"wtm_messenger.com","hostnames":["anytime-messenger.com","www.anytime-messenger.com","media.yesmessenger.com","outils.yes-messenger.com","download.yesmessenger.com","outils.yesmessenger.com","track.spe.schoolmessenger.com"],"name":"Facebook Messenger","link":"https://www.ghostery.com/whotracksme/trackers/messenger.com"},{"id":"wtm_merkle_rkg","hostnames":["mct.rkdms.com","www.rkdms.com","mid.rkdms.com","id.sv.rkdms.com"],"name":"Merkle RKG","link":"https://www.ghostery.com/whotracksme/trackers/merkle_rkg"},{"id":"wtm_mercury_media","hostnames":["roia.biz"],"name":"Mercury Media","link":"https://www.ghostery.com/whotracksme/trackers/mercury_media"},{"id":"wtm_merchantadvantage","hostnames":["chanalytics.merchantadvantage.com","secure.merchantadvantage.com"],"name":"MerchantAdvantage","link":"https://www.ghostery.com/whotracksme/trackers/merchantadvantage"},{"id":"wtm_mercado","hostnames":["mercadolivre.com.br","pmstrk.mercadolivre.com.br"],"name":"Mercado","link":"https://www.ghostery.com/whotracksme/trackers/mercado"},{"id":"wtm_megaindex","hostnames":["counter.megaindex.ru"],"name":"MegaIndex","link":"https://www.ghostery.com/whotracksme/trackers/megaindex"},{"id":"wtm_meetrics","hostnames":["meetrics.net","research.de.com","b174.s240.meetrics.net","lb7.s400.meetrics.net","lb70.s400.meetrics.net","lb73.s400.meetrics.net","lb74.s400.meetrics.net","lb79.s400.meetrics.net","lb5.s400.meetrics.net","lb9.s400.meetrics.net","lb13.s400.meetrics.net","lb30.s400.meetrics.net","lb49.s400.meetrics.net","lb50.s400.meetrics.net","lb62.s400.meetrics.net","lb76.s400.meetrics.net","lb78.s400.meetrics.net","lb86.s400.meetrics.net","lb90.s400.meetrics.net","lb96.s400.meetrics.net","s248.meetrics.net","s282.meetrics.net","s300.meetrics.net","dc61.s290.meetrics.net","dc56.s290.meetrics.net","dc43.s290.meetrics.net","s240.mxcdn.net","s385.mxcdn.net","s79.mxcdn.net","s400.mxcdn.net","s290.mxcdn.net","s62.research.de.com","b95.s79.research.de.com","s79.research.de.com"],"name":"Meetrics","link":"https://www.ghostery.com/whotracksme/trackers/meetrics"},{"id":"wtm_meebo_bar","hostnames":["cim.meebo.com"],"name":"Meebo Bar","link":"https://www.ghostery.com/whotracksme/trackers/meebo_bar"},{"id":"wtm_medyanet","hostnames":["adnet.com.tr","medyanetads.com","ad.e-kolay.net","adonline.e-kolay.net","geoweb.e-kolay.net","medya.e-kolay.net","app.medyanetads.com"],"name":"MedyaNet","link":"https://www.ghostery.com/whotracksme/trackers/medyanet"},{"id":"wtm_medley","hostnames":["medleyads.com","graphics.medleyads.com","www.medleyads.com","secure.medleyads.com"],"name":"Medley","link":"https://www.ghostery.com/whotracksme/trackers/medley"},{"id":"wtm_mediavine_exchange","hostnames":["mediavine.com","scripts.mediavine.com"],"name":"Mediavine Exchange","link":"https://www.ghostery.com/whotracksme/trackers/mediavine_exchange"},{"id":"wtm_mediashakers","hostnames":["ad.media-servers.net"],"name":"MediaShakers","link":"https://www.ghostery.com/whotracksme/trackers/mediashakers"},{"id":"wtm_mediascope","hostnames":["tns-counter.ru","ar.tns-counter.ru","kz.tns-counter.ru","www.tns-counter.ru"],"name":"Mediascope","link":"https://www.ghostery.com/whotracksme/trackers/mediascope"},{"id":"wtm_median","hostnames":["audit.median.hu"],"name":"Median","link":"https://www.ghostery.com/whotracksme/trackers/median"},{"id":"wtm_medialand","hostnames":["adnet.ru","medialand.ru","rbc.medialand.ru","engine.rbc.medialand.ru"],"name":"Medialand","link":"https://www.ghostery.com/whotracksme/trackers/medialand"},{"id":"wtm_mediahub","hostnames":["www.fhserve.com","secure.fhserve.com"],"name":"MediaHub","link":"https://www.ghostery.com/whotracksme/trackers/mediahub"},{"id":"wtm_mediaad","hostnames":["s1.mediaad.org"],"name":"MediaAd","link":"https://www.ghostery.com/whotracksme/trackers/mediaad"},{"id":"wtm_media.net","hostnames":["media.net","adtech.de","contextual.media.net","be.durationmedia.net","tag.durationmedia.net","gplayer.kmpmedia.net","update.kmpmedia.net","abd.media.net","adservetx.media.net","adservex.media.net","amprtc.media.net","cdnaimg-ra.media.net","cs.media.net","forbes.media.net","hblg.media.net","hbx.media.net","lg3.media.net","mycdn.media.net","prebid.media.net","qsearch.media.net","recommends.media.net","res.media.net","search.media.net","static.media.net","warp.media.net","whitelabel.media.net","filter.adsparkmedia.net","ias.avidmedia.net","xml.adsparkmedia.net","best4kmedia.net","traversemedia.net","www.best4kmedia.net","www.traversemedia.net","openx.camelmedia.net","stats.infomedia.net","cdn.total-media.net","w00tpublishers.wootmedia.net","cdn.adsrvmedia.net","tag.adtrendmedia.net","a.cdn.intentmedia.net","ads.empoweringmedia.net","adtrack.cimedia.net","realaudio.cimedia.net","pb-logs.media.net","pixel.bilinmedia.net","rightmedia.net","www.rightmedia.net","a.total-media.net","ads.adsrvmedia.net","ads.networldmedia.net","edog2017.karyamedia.net","trekmedia.net","bannieres.wdmedia.net","adserver.adtech.de","aka-cdn.adtech.de","aka-cdn-ns.adtech.de","ad.dc2.adtech.de","im.adtech.de","secserv.adtech.de"],"name":"Media.net","link":"https://www.ghostery.com/whotracksme/trackers/media.net","exodusId":107},{"id":"wtm_media_innovation_group","hostnames":["mookie1.com","tagr-gcp-lb1-ase1.mookie1.com","b3-uk.mookie1.com","in-gmtdmp.mookie1.com","ar-gmtdmp.mookie1.com","au-gmtdmp.mookie1.com","b3.mookie1.com","be-gmtdmp.mookie1.com","ca-gmtdmp.mookie1.com","cdn.mookie1.com","cdn-akamai.mookie1.com","ch-gmtdmp.mookie1.com","cl-gmtdmp.mookie1.com","co-gmtdmp.mookie1.com","cz-gmtdmp.mookie1.com","de-gmtdmp.mookie1.com","dk-gmtdmp.mookie1.com","es-gmtdmp.mookie1.com","fr-gmtdmp.mookie1.com","gb-gmtdmp.mookie1.com","gd1.mookie1.com","eu-gmtdmp.gd1.mookie1.com","static-tagr.gd1.mookie1.com","gd2.mookie1.com","sg-gmtdmp.gd2.mookie1.com","gmtdmp.mookie1.com","hk-gmtdmp.mookie1.com","ib.mookie1.com","id-gmtdmp.mookie1.com","it-gmtdmp.mookie1.com","jp-gmtdmp.mookie1.com","mena-gmtdmp.mookie1.com","my-gmtdmp.mookie1.com","odr.mookie1.com","ph-gmtdmp.mookie1.com","pl-gmtdmp.mookie1.com","pr-gmtdmp.mookie1.com","pt-gmtdmp.mookie1.com","ro-gmtdmp.mookie1.com","se-gmtdmp.mookie1.com","sg-gmtdmp.mookie1.com","t.mookie1.com","tagr-gcp-lb1-use1.mookie1.com","tagr-gcp-odr-use1.mookie1.com","tagr-gcp-xs2-use1.mookie1.com","th-gmtdmp.mookie1.com","tr-gmtdmp.mookie1.com","tw-gmtdmp.mookie1.com","us-gmtdmp.mookie1.com","vn-gmtdmp.mookie1.com","x2.mookie1.com","za-gmtdmp.mookie1.com"],"name":"Xaxis","link":"https://www.ghostery.com/whotracksme/trackers/media_innovation_group"},{"id":"wtm_mcabi","hostnames":["mcabi.mcloudglobal.com"],"name":"mCabi","link":"https://www.ghostery.com/whotracksme/trackers/mcabi"},{"id":"wtm_mbuy","hostnames":["pixel.adbuyer.com"],"name":"MBuy","link":"https://www.ghostery.com/whotracksme/trackers/mbuy"},{"id":"wtm_mbr_targeting","hostnames":["m6r.eu","tracking.m6r.eu"],"name":"mbr targeting","link":"https://www.ghostery.com/whotracksme/trackers/mbr_targeting"},{"id":"wtm_maxymiser","hostnames":["maxymiser.hs.llnwd.net","service.maxymiser.net"],"name":"Oracle Maxymiser","link":"https://www.ghostery.com/whotracksme/trackers/maxymiser"},{"id":"wtm_maxpoint_interactive","hostnames":["mxptint.net","oxp.mxptint.net"],"name":"MaxPoint Interactive","link":"https://www.ghostery.com/whotracksme/trackers/maxpoint_interactive"},{"id":"wtm_maxmind","hostnames":["device.maxmind.com"],"name":"MaxMind","link":"https://www.ghostery.com/whotracksme/trackers/maxmind"},{"id":"wtm_matiro","hostnames":["nzaza.com"],"name":"Matiro","link":"https://www.ghostery.com/whotracksme/trackers/matiro"},{"id":"wtm_master_banner_network","hostnames":["mbn.com.ua"],"name":"Master Banner Network","link":"https://www.ghostery.com/whotracksme/trackers/master_banner_network"},{"id":"wtm_marktest","hostnames":["netscope.data.marktest.pt"],"name":"Marktest","link":"https://www.ghostery.com/whotracksme/trackers/marktest"},{"id":"wtm_markmonitor","hostnames":["mmstat.com","gdsns1.mmstat.com","hz.mmstat.com","p3p.mmstat.com","perf.mmstat.com","sg.mmstat.com","ac.mmstat.com","cnzz.mmstat.com","dz.mmstat.com","gcd.mmstat.com","gds.mmstat.com","gj.gds.mmstat.com","gm.gds.mmstat.com","log.gds.mmstat.com","gj.mmstat.com","gm.mmstat.com","go.mmstat.com","gxb.mmstat.com","hd.mmstat.com","log.mmstat.com","oneid.mmstat.com","res.mmstat.com","wgo.mmstat.com","ws.mmstat.com","yt.mmstat.com","yt1.mmstat.com"],"name":"MarkMonitor","link":"https://www.ghostery.com/whotracksme/trackers/markmonitor"},{"id":"wtm_market_thunder","hostnames":["ak-cdn.placelocal.com"],"name":"Market Thunder","link":"https://www.ghostery.com/whotracksme/trackers/market_thunder"},{"id":"wtm_mark_+_mini","hostnames":["mm.markandmini.com"],"name":"Mark & Mini","link":"https://www.ghostery.com/whotracksme/trackers/mark_+_mini"},{"id":"wtm_marchex","hostnames":["px.marchex.io","adtrack.voicestar.com"],"name":"Marchex","link":"https://www.ghostery.com/whotracksme/trackers/marchex"},{"id":"wtm_maploco","hostnames":["www.maploco.com"],"name":"MapLoco","link":"https://www.ghostery.com/whotracksme/trackers/maploco"},{"id":"wtm_mango","hostnames":["widgets.mango-office.ru"],"name":"Mango","link":"https://www.ghostery.com/whotracksme/trackers/mango"},{"id":"wtm_mail.ru_group","hostnames":["mail.radar.imgsmail.ru","top.mail.ru","1l-view.mail.ru","core0.node12.top.mail.ru","d6.c5.b0.a2.top.mail.ru","top5.mail.ru","akusherok.ru","www.akusherok.ru","ad.mail.ru","top-fwz1.mail.ru","r0.mradx.net"],"name":"Mail.Ru Group","link":"https://www.ghostery.com/whotracksme/trackers/mail.ru_group"},{"id":"wtm_magnetic","hostnames":["d3ezl4ajpp2zy8.cloudfront.net","domdex.com"],"name":"Magnetic","link":"https://www.ghostery.com/whotracksme/trackers/magnetic"},{"id":"wtm_magna_advertise","hostnames":["partner.magna.ru","qip.magna.ru"],"name":"Magna Advertise","link":"https://www.ghostery.com/whotracksme/trackers/magna_advertise"},{"id":"wtm_mads","hostnames":["eu2.madsone.com"],"name":"MADS","link":"https://www.ghostery.com/whotracksme/trackers/mads"},{"id":"wtm_mad_ads_media","hostnames":["madadsmedia.com","ads-by.madadsmedia.com"],"name":"Mad Ads Media","link":"https://www.ghostery.com/whotracksme/trackers/mad_ads_media"},{"id":"wtm_m4n","hostnames":["m4n.nl","clicks.m4n.nl","views.m4n.nl"],"name":"M4N","link":"https://www.ghostery.com/whotracksme/trackers/m4n"},{"id":"wtm_lytics","hostnames":["lytics.io","api.simpleanalytics.io","funnelytics.io","simpleanalytics.io","siteimproveanalytics.io","api.lytics.io","c.lytics.io","cdn.simpleanalytics.io","trackers.voodoo-analytics.io"],"name":"Lytics","link":"https://www.ghostery.com/whotracksme/trackers/lytics"},{"id":"wtm_lxr100","hostnames":["www.adelixir.com"],"name":"LXR100","link":"https://www.ghostery.com/whotracksme/trackers/lxr100"},{"id":"wtm_lucky_orange","hostnames":["luckyorange.com","cs.luckyorange.net","settings.luckyorange.net","upload.luckyorange.net"],"name":"Lucky Orange","link":"https://www.ghostery.com/whotracksme/trackers/lucky_orange"},{"id":"wtm_lucini","hostnames":["lead.adsender.us"],"name":"Lucini","link":"https://www.ghostery.com/whotracksme/trackers/lucini"},{"id":"wtm_lucid_media","hostnames":["lucidmedia.com","user.lucidmedia.com","ads.lucidmedia.com"],"name":"Lucid Media","link":"https://www.ghostery.com/whotracksme/trackers/lucid_media"},{"id":"wtm_lotame","hostnames":["crwdcntrl.net","bb.crwdcntrl.net","bebo.crwdcntrl.net","blogtalkradio.crwdcntrl.net","cdn.crwdcntrl.net","coop.crwdcntrl.net","deviantart.crwdcntrl.net","fotolog.crwdcntrl.net","huffingtonpost.crwdcntrl.net","justjared.crwdcntrl.net","multiply.crwdcntrl.net","perfspot.crwdcntrl.net","superficial.crwdcntrl.net","vidilife.crwdcntrl.net","id.crwdcntrl.net","somethingawful.crwdcntrl.net","ad.crwdcntrl.net","bcp.crwdcntrl.net","sync.crwdcntrl.net","tags.crwdcntrl.net","ag.tags.crwdcntrl.net","celebslam.tags.crwdcntrl.net","cnnmoney.tags.crwdcntrl.net","livejournal.tags.crwdcntrl.net","nbcu.tags.crwdcntrl.net","sociallitelife.tags.crwdcntrl.net","sportsillustrated.tags.crwdcntrl.net","videogum.tags.crwdcntrl.net","wwtdd.tags.crwdcntrl.net","yardbarker.tags.crwdcntrl.net"],"name":"Lotame","link":"https://www.ghostery.com/whotracksme/trackers/lotame","exodusId":265},{"id":"wtm_loomia","hostnames":["assets.loomia.com"],"name":"Loomia","link":"https://www.ghostery.com/whotracksme/trackers/loomia"},{"id":"wtm_lomadee","hostnames":["c.lomadee.com","secure.lomadee.com","validator.lomadee.com"],"name":"Lomadee","link":"https://www.ghostery.com/whotracksme/trackers/lomadee"},{"id":"wtm_logly","hostnames":["logly.co.jp","b.logly.co.jp","cdn.logly.co.jp","dsp.logly.co.jp","l.logly.co.jp","sync.logly.co.jp"],"name":"logly","link":"https://www.ghostery.com/whotracksme/trackers/logly"},{"id":"wtm_logdna","hostnames":["ping.answerbook.com"],"name":"LogDNA","link":"https://www.ghostery.com/whotracksme/trackers/logdna"},{"id":"wtm_lockerz_share","hostnames":["www.addtoany.com","static.addtoany.com","stats.addtoany.com"],"name":"AddToAny","link":"https://www.ghostery.com/whotracksme/trackers/lockerz_share"},{"id":"wtm_lockerdome","hostnames":["cdn2.lockerdome.com"],"name":"LockerDome","link":"https://www.ghostery.com/whotracksme/trackers/lockerdome"},{"id":"wtm_lkqd","hostnames":["ad.lkqd.net","creative.lkqd.net","cs.lkqd.net","ssp.lkqd.net","t.lkqd.net","v.lkqd.net"],"name":"LKQD","link":"https://www.ghostery.com/whotracksme/trackers/lkqd"},{"id":"wtm_livere","hostnames":["livere.co.kr","livere.co.kr.cizion.ixcloud.net","ad.livere.co.kr"],"name":"LiveRe","link":"https://www.ghostery.com/whotracksme/trackers/livere"},{"id":"wtm_live_intent","hostnames":["liadm.com","d.liadm.com","b-code.liadm.com","i.liadm.com","p.liadm.com","rp.liadm.com","rp4.liadm.com"],"name":"Live Intent","link":"https://www.ghostery.com/whotracksme/trackers/live_intent"},{"id":"wtm_list.ru","hostnames":["top.list.ru","hitlist.ru"],"name":"Rating@Mail.Ru","link":"https://www.ghostery.com/whotracksme/trackers/list.ru"},{"id":"wtm_liqwid","hostnames":["liqwid.net","www.liqwid.net"],"name":"Liqwid","link":"https://www.ghostery.com/whotracksme/trackers/liqwid"},{"id":"wtm_linkwithin","hostnames":["images.linkwithin.com","images3.linkwithin.com","widget3.linkwithin.com","widget5.linkwithin.com","www.linkwithin.com"],"name":"LinkWithin","link":"https://www.ghostery.com/whotracksme/trackers/linkwithin"},{"id":"wtm_linksynergy.com","hostnames":["linksynergy.com","ad.linksynergy.com","banner.linksynergy.com","mproxy.banner.linksynergy.com","cli.linksynergy.com","ads.rd.linksynergy.com","amp.rd.linksynergy.com","track.linksynergy.com"],"name":"Rakuten LinkShare","link":"https://www.ghostery.com/whotracksme/trackers/linksynergy.com"},{"id":"wtm_linksmart","hostnames":["cdn.linksmart.com"],"name":"LinkSmart","link":"https://www.ghostery.com/whotracksme/trackers/linksmart"},{"id":"wtm_linksalpha","hostnames":["www.linksalpha.com"],"name":"LinksAlpha","link":"https://www.ghostery.com/whotracksme/trackers/linksalpha"},{"id":"wtm_linkprice","hostnames":["linkprice.com","ad.linkprice.com"],"name":"LinkPrice","link":"https://www.ghostery.com/whotracksme/trackers/linkprice"},{"id":"wtm_linkedin_widgets","hostnames":["platform.linkedin.com"],"name":"LinkedIn Widgets","link":"https://www.ghostery.com/whotracksme/trackers/linkedin_widgets"},{"id":"wtm_linkedin_marketing_solutions","hostnames":["bizographics.com","sjs.bizographics.com","www.bizographics.com","js.bizographics.com","api.bizographics.com"],"name":"LinkedIn Marketing Solutions","link":"https://www.ghostery.com/whotracksme/trackers/linkedin_marketing_solutions"},{"id":"wtm_linkconnector","hostnames":["www.linkconnector.com"],"name":"LinkConnector","link":"https://www.ghostery.com/whotracksme/trackers/linkconnector"},{"id":"wtm_linkbucks","hostnames":["linkbucks.com","ad3.linkbucks.com","www.linkbucks.com"],"name":"Linkbucks","link":"https://www.ghostery.com/whotracksme/trackers/linkbucks"},{"id":"wtm_linezing","hostnames":["tongji.linezing.com","js.tongji.linezing.com"],"name":"LineZing","link":"https://www.ghostery.com/whotracksme/trackers/linezing"},{"id":"wtm_line_apps","hostnames":["health-line.me","www.health-line.me","pl.health-line.me","lap-click.tr.line.me"],"name":"Line","link":"https://www.ghostery.com/whotracksme/trackers/line_apps"},{"id":"wtm_lifestreet_media","hostnames":["lfstmedia.com","grtb-de.lfstmedia.com","grtb-nj.lfstmedia.com","grtb-sc.lfstmedia.com","mopubrtb23.lfstmedia.com","mrtb-nj.lfstmedia.com","mrtbmopub-nj.lfstmedia.com","njinmobirtb.lfstmedia.com","pix.lfstmedia.com","track.lfstmedia.com","go.lfstmedia.com","mobile-android.lfstmedia.com","ads.lfstmedia.com","cdn.lfstmedia.com","md-nj.lfstmedia.com","scadxrtb.lfstmedia.com"],"name":"LifeStreet Media","link":"https://www.ghostery.com/whotracksme/trackers/lifestreet_media"},{"id":"wtm_lengow","hostnames":["tracking.lengow.com"],"name":"Lengow","link":"https://www.ghostery.com/whotracksme/trackers/lengow"},{"id":"wtm_leady","hostnames":["t.leady.com"],"name":"Leady","link":"https://www.ghostery.com/whotracksme/trackers/leady"},{"id":"wtm_leadsius","hostnames":["tracker.leadsius.com"],"name":"Leadsius","link":"https://www.ghostery.com/whotracksme/trackers/leadsius"},{"id":"wtm_leads_by_web.com","hostnames":["scorecard.wspisp.net"],"name":"Leads by Web.com","link":"https://www.ghostery.com/whotracksme/trackers/leads_by_web.com"},{"id":"wtm_leadplace","hostnames":["leadplace.fr","tag.leadplace.fr"],"name":"LeadPlace","link":"https://www.ghostery.com/whotracksme/trackers/leadplace"},{"id":"wtm_leadlander","hostnames":["formalyzer.com","trackalyzer.com","www.formalyzer.com","t4.trackalyzer.com","t6.trackalyzer.com","t5.trackalyzer.com","t1.trackalyzer.com","t2.trackalyzer.com","t3.trackalyzer.com"],"name":"LeadLander","link":"https://www.ghostery.com/whotracksme/trackers/leadlander"},{"id":"wtm_leading_reports","hostnames":["io.leadingreports.de"],"name":"Leading Reports","link":"https://www.ghostery.com/whotracksme/trackers/leading_reports"},{"id":"wtm_leadgenic","hostnames":["gate.leadgenic.com"],"name":"LeadGENIC","link":"https://www.ghostery.com/whotracksme/trackers/leadgenic"},{"id":"wtm_leadforensics","hostnames":["123-tracker.com","lead-123.com","trackdiscovery.net","webforensics.co.uk","secure.leadforensics.com","ldynamicspublicapi.leadforensics.com"],"name":"LeadForensics","link":"https://www.ghostery.com/whotracksme/trackers/leadforensics"},{"id":"wtm_leaddyno","hostnames":["collector.leaddyno.com","static.leaddyno.com"],"name":"LeadDyno","link":"https://www.ghostery.com/whotracksme/trackers/leaddyno"},{"id":"wtm_lazada","hostnames":["ph-live.slatic.net"],"name":"Lazada","link":"https://www.ghostery.com/whotracksme/trackers/lazada"},{"id":"wtm_layer-ad.org","hostnames":["layer-ad.org","ads.layer-ad.org"],"name":"Layer-ADS.net","link":"https://www.ghostery.com/whotracksme/trackers/layer-ad.org"},{"id":"wtm_launchbit","hostnames":["launchbit.com"],"name":"LaunchBit","link":"https://www.ghostery.com/whotracksme/trackers/launchbit"},{"id":"wtm_lanista_concepts","hostnames":["api.lanistaads.com","ads.lanistaads.com"],"name":"Lanista Concepts","link":"https://www.ghostery.com/whotracksme/trackers/lanista_concepts"},{"id":"wtm_ladsp.com","hostnames":["cd-ladsp-com.s3.amazonaws.com","ladsp.com","pb.ladsp.com","cd.ladsp.com"],"name":"Logicad","link":"https://www.ghostery.com/whotracksme/trackers/ladsp.com"},{"id":"wtm_kupona","hostnames":["d31bfnnwekbny6.cloudfront.net"],"name":"Kupona","link":"https://www.ghostery.com/whotracksme/trackers/kupona"},{"id":"wtm_korrelate","hostnames":["a01.korrelate.net","a02.korrelate.net"],"name":"Korrelate","link":"https://www.ghostery.com/whotracksme/trackers/korrelate"},{"id":"wtm_kontextua","hostnames":["adserver.kontextua.com","cf.ads.kontextua.com"],"name":"Kontextua","link":"https://www.ghostery.com/whotracksme/trackers/kontextua"},{"id":"wtm_kontera_contentlink","hostnames":["kona.kontera.com"],"name":"Kontera ContentLink","link":"https://www.ghostery.com/whotracksme/trackers/kontera_contentlink"},{"id":"wtm_komoona","hostnames":["komoona.com","cdn.komoona.com","a.komoona.com","stat.komoona.com"],"name":"Komoona","link":"https://www.ghostery.com/whotracksme/trackers/komoona"},{"id":"wtm_kliksaya","hostnames":["scr.kliksaya.com"],"name":"KlikSaya","link":"https://www.ghostery.com/whotracksme/trackers/kliksaya"},{"id":"wtm_klikki","hostnames":["adsby.klikki.com"],"name":"Klikki","link":"https://www.ghostery.com/whotracksme/trackers/klikki"},{"id":"wtm_kixer","hostnames":["kixer.com","www.kixer.com"],"name":"Kixer","link":"https://www.ghostery.com/whotracksme/trackers/kixer"},{"id":"wtm_kitara_media","hostnames":["ad.103092804.com"],"name":"Kitara Media","link":"https://www.ghostery.com/whotracksme/trackers/kitara_media"},{"id":"wtm_kissmetrics.com","hostnames":["doug1izaerwt3.cloudfront.net","kissmetrics.com","et.kissmetrics.com","i.kissmetrics.com","scripts.kissmetrics.com","trc.kissmetrics.com","trk.kissmetrics.com"],"name":"Kissmetrics","link":"https://www.ghostery.com/whotracksme/trackers/kissmetrics.com"},{"id":"wtm_king.com","hostnames":["lp.cooktracking.com","adtrack.king.com","cdn.ndparking.com","click.khingtracking.com","facebookunblocking.com","mmtracking.com","print.khingtracking.com","srv2trking.com","www.facebookunblocking.com","www.srv2trking.com","ethnicking.com","event-tracking.com","www.event-tracking.com","admin-login-booking.com","anjanicouriertracking.com","bbctrucking.com","bestconsumerranking.com","bosquebaking.com","btkzblszq.toulousian-route-booking.com","cherryhiltrucking.com","chinabeking.com","cowairking.com","cpcontacts.tenkoking.com","cs2matchmaking.com","doublesnetworking.com","drappointmentbooking.com","emv1.cowairking.com","emv1.tenkoking.com","equityhacking.com","farihanking.com","favebooking.com","gehernaking.com","gjzxc.toulousian-route-booking.com","gyipve.toulousian-route-booking.com","headworking.com","help-parceltracking.com","idcardking.com","insolesforhiking.com","jhangoraking.com","kqjot.toulousian-route-booking.com","linksbooking.com","liveflightbooking.com","login-booking.com","lrsaoqx.toulousian-route-booking.com","misterfoodieking.com","mkgml.toulousian-route-booking.com","multigenerationalbanking.com","mypocztatracking.com","nakedgirlstwerking.com","nextflightbooking.com","nirking.com","onthegomatchmaking.com","pawnacampbooking.com","pjqrvdh.toulousian-route-booking.com","platinumtracking.com","postspeedtracking.com","rapidoo-managebooking.com","sawdustwoodworking.com","suntrustlonlinebanking.com","tenkoking.com","toulousian-route-booking.com","trillionaireking.com","uidahvb.toulousian-route-booking.com","updbooking.com","viiqicpanel.tenkoking.com","vinaroking.com","widfjza.toulousian-route-booking.com","www.admin-login-booking.com","www.anjanicouriertracking.com","www.bbctrucking.com","www.bestconsumerranking.com","www.bosquebaking.com","www.btkzblszq.toulousian-route-booking.com","www.cherryhiltrucking.com","www.chinabeking.com","www.cowairking.com","www.cpcontacts.tenkoking.com","www.cs2matchmaking.com","www.doublesnetworking.com","www.drappointmentbooking.com","www.emv1.cowairking.com","www.emv1.tenkoking.com","www.equityhacking.com","www.farihanking.com","www.favebooking.com","www.gehernaking.com","www.gjzxc.toulousian-route-booking.com","www.gyipve.toulousian-route-booking.com","www.headworking.com","www.help-parceltracking.com","www.idcardking.com","www.insolesforhiking.com","www.jhangoraking.com","www.kqjot.toulousian-route-booking.com","www.linksbooking.com","www.liveflightbooking.com","www.login-booking.com","www.lrsaoqx.toulousian-route-booking.com","www.misterfoodieking.com","www.mkgml.toulousian-route-booking.com","www.multigenerationalbanking.com","www.mypocztatracking.com","www.nakedgirlstwerking.com","www.nextflightbooking.com","www.nirking.com","www.onthegomatchmaking.com","www.pawnacampbooking.com","www.pjqrvdh.toulousian-route-booking.com","www.platinumtracking.com","www.postspeedtracking.com","www.rapidoo-managebooking.com","www.sawdustwoodworking.com","www.suntrustlonlinebanking.com","www.tenkoking.com","www.toulousian-route-booking.com","www.trillionaireking.com","www.uidahvb.toulousian-route-booking.com","www.updbooking.com","www.viiqicpanel.tenkoking.com","www.vinaroking.com","www.widfjza.toulousian-route-booking.com","www.x.tenkoking.com","x.tenkoking.com","ndparking.com","www.ndparking.com","otracking.com","lionstracking.com","www.mftracking.com","bluehparking.com","ads.ibtracking.com","extremetracking.com","dsparking.com","www.mmtracking.com","lfscpttracking.com","img.sedoparking.com","sedoparking.com","www.sedoparking.com","www1.sedoparking.com","www.affiliatetracking.com","gwmtracking.com","propeller-tracking.com","trk.cachemetracking.com","permalinking.com","dctracking.com","drm-server-booking.com","nctracking.com","track.cam4tracking.com","www.nctracking.com","adetracking.com","affiliatetracking.com","nondescriptstocking.com","prmtracking.com","screechingstocking.com","vivtracking.com","am.adlooxtracking.com","as.adlooxtracking.com","datam16.adlooxtracking.com","js02.adlooxtracking.com","js05.adlooxtracking.com","js07.adlooxtracking.com","js11.adlooxtracking.com","js12.adlooxtracking.com","js13.adlooxtracking.com","js14.adlooxtracking.com","js15.adlooxtracking.com","flashtalking.com","ad-events.flashtalking.com","d9.flashtalking.com","fdz.flashtalking.com","i.flashtalking.com","img.flashtalking.com","imgcf.flashtalking.com","prod-customfeeds.flashtalking.com","s3cf.flashtalking.com","servedby.flashtalking.com","stat8.flashtalking.com","leanmobi.fusetracking.com","servicelayer.king.com","deeplink.mobileapptracking.com","7336.deeplink.mobileapptracking.com","engine.mobileapptracking.com","10148.engine.mobileapptracking.com","167126.engine.mobileapptracking.com","167154.engine.mobileapptracking.com","17058.engine.mobileapptracking.com","17908.engine.mobileapptracking.com","189358.engine.mobileapptracking.com","189904.engine.mobileapptracking.com","190107.engine.mobileapptracking.com","190829.engine.mobileapptracking.com","194192.engine.mobileapptracking.com","194985.engine.mobileapptracking.com","195724.engine.mobileapptracking.com","199107.engine.mobileapptracking.com","20298.engine.mobileapptracking.com","22006.engine.mobileapptracking.com","7336.engine.mobileapptracking.com","8604.engine.mobileapptracking.com","943.engine.mobileapptracking.com","9864.engine.mobileapptracking.com","prdwebcollector.ruetracking.com","ymtracking.com","global.ymtracking.com","impr.ymtracking.com","www.77tracking.com","cdn.flashtalking.com","stat.flashtalking.com","j.adlooxtracking.com","serw.myroitracking.com","tr1.myroitracking.com","www.myroitracking.com","secure.flashtalking.com","77tracking.com","adlooxtracking.com"],"name":"King.com","link":"https://www.ghostery.com/whotracksme/trackers/king.com"},{"id":"wtm_kickfire","hostnames":["sniff.visistat.com","stats.visistat.com","stats.sa-as.com"],"name":"Kickfire","link":"https://www.ghostery.com/whotracksme/trackers/kickfire"},{"id":"wtm_kickfactory","hostnames":["ping.kickfactory.com"],"name":"Kickfactory","link":"https://www.ghostery.com/whotracksme/trackers/kickfactory"},{"id":"wtm_keywordmax","hostnames":["keywordmax.com","www.keywordmax.com","tracking.keywordmax.com"],"name":"KeywordMax","link":"https://www.ghostery.com/whotracksme/trackers/keywordmax"},{"id":"wtm_keywee","hostnames":["cdn.keywee.co","pixel.keywee.co"],"name":"Keywee","link":"https://www.ghostery.com/whotracksme/trackers/keywee"},{"id":"wtm_kenshoo","hostnames":["xg4ken.com","148.xg4ken.com","506.xg4ken.com","531.xg4ken.com","match.xg4ken.com","www.xg4ken.com","events.xg4ken.com","resources.xg4ken.com","services.xg4ken.com"],"name":"Kenshoo","link":"https://www.ghostery.com/whotracksme/trackers/kenshoo"},{"id":"wtm_kelkoo","hostnames":["widget.kelkoo.com"],"name":"Kelkoo","link":"https://www.ghostery.com/whotracksme/trackers/kelkoo"},{"id":"wtm_keen_io","hostnames":["dc8na2hxrj29i.cloudfront.net","api.keen.io"],"name":"Keen","link":"https://www.ghostery.com/whotracksme/trackers/keen_io","exodusId":262},{"id":"wtm_kauli","hostnames":["kau.li","ad.kau.li","js.kau.li"],"name":"Kauli","link":"https://www.ghostery.com/whotracksme/trackers/kauli"},{"id":"wtm_katchup","hostnames":["cen.katchup.fr"],"name":"Katchup","link":"https://www.ghostery.com/whotracksme/trackers/katchup"},{"id":"wtm_kataweb.it","hostnames":["ad.kataweb.it"],"name":"KataWeb","link":"https://www.ghostery.com/whotracksme/trackers/kataweb.it"},{"id":"wtm_kargo","hostnames":["kargo.com","prg.kargo.com","ad-monitor.kargo.com","storage.cloud.kargo.com","cma.kargo.com","crb.kargo.com","kds-pixel.kargo.com","klkstrm.kargo.com","krk.kargo.com","socialcanvas-cdn.kargo.com"],"name":"Kargo","link":"https://www.ghostery.com/whotracksme/trackers/kargo"},{"id":"wtm_kanoodle","hostnames":["kanoodle.com"],"name":"Kanoodle","link":"https://www.ghostery.com/whotracksme/trackers/kanoodle"},{"id":"wtm_kameleoon","hostnames":["kameleoon.eu","customers-lidl.kameleoon.com","static.kameleoon.com","static-bp.kameleoon.com","api.kameleoon.com","customers.kameleoon.com","eu-tlp01.kameleoon.eu","eu-tlp02.kameleoon.eu","eu-tlp05.kameleoon.eu","z9q9kj37oy.kameleoon.eu","storage.kameleoon.eu","lmyd3iz3qn.kameleoon.eu","eu-tlp04.kameleoon.eu","eu-tlp06.kameleoon.eu","eu-tlp07.kameleoon.eu"],"name":"Kameleoon","link":"https://www.ghostery.com/whotracksme/trackers/kameleoon"},{"id":"wtm_just_relevant","hostnames":["justrelevant.com","ads.justrelevant.com"],"name":"Just Relevant","link":"https://www.ghostery.com/whotracksme/trackers/just_relevant"},{"id":"wtm_just_premium","hostnames":["justpremium.com","ads.justpremium.com","de.ads.justpremium.com","es.ads.justpremium.com","pre.ads.justpremium.com","uk.ads.justpremium.com","cdn.justpremium.com","match.justpremium.com","prod.justpremium.com","bidder-ap-northeast-1.prod.justpremium.com","bidder-us-west-2.prod.justpremium.com","cookiematch-ap-northeast-1.prod.justpremium.com","cookiematch-us-east-1.prod.justpremium.com","cookiematch-us-west-2.prod.justpremium.com","tracking.justpremium.com","emea-v3.tracking.justpremium.com","nl.ads.justpremium.com","us.ads.justpremium.com","us.tracking.justpremium.com","be.ads.justpremium.com","pl.ads.justpremium.com"],"name":"Just Premium","link":"https://www.ghostery.com/whotracksme/trackers/just_premium"},{"id":"wtm_jumptap","hostnames":["jumptap.com"],"name":"Jumptap","link":"https://www.ghostery.com/whotracksme/trackers/jumptap"},{"id":"wtm_juicyads","hostnames":["juicyads.com","ck.juicyads.com","js.juicyads.com","redir.juicyads.com","xapi.juicyads.com","www.juicyads.com","ads-a.juicyads.com","ads.juicyads.com","adserver.juicyads.com","mobile.juicyads.com"],"name":"JuicyAds","link":"https://www.ghostery.com/whotracksme/trackers/juicyads"},{"id":"wtm_jsuol.com.br","hostnames":["jsuol.com.br"],"name":"jsuol.com.br","link":"https://www.ghostery.com/whotracksme/trackers/jsuol.com.br"},{"id":"wtm_jse_coin","hostnames":["jsecoin.com"],"name":"JSE Coin","link":"https://www.ghostery.com/whotracksme/trackers/jse_coin"},{"id":"wtm_js_communications","hostnames":["cjmooter.xcache.kinxcdn.com"],"name":"JS Communications","link":"https://www.ghostery.com/whotracksme/trackers/js_communications"},{"id":"wtm_jornaya","hostnames":["create.leadid.com","d1tprjo2w7krrh.cloudfront.net"],"name":"Jornaya","link":"https://www.ghostery.com/whotracksme/trackers/jornaya"},{"id":"wtm_jivox","hostnames":["jivox.com","www.jivox.com"],"name":"Jivox","link":"https://www.ghostery.com/whotracksme/trackers/jivox"},{"id":"wtm_jink","hostnames":["ads.jinkads.com"],"name":"Jink","link":"https://www.ghostery.com/whotracksme/trackers/jink"},{"id":"wtm_jetpack_digital","hostnames":["geo.jetpackdigital.com","www.jetpackdigital.com","ads.jetpackdigital.com","tracking.jetpackdigital.com"],"name":"Jetpack Digital","link":"https://www.ghostery.com/whotracksme/trackers/jetpack_digital"},{"id":"wtm_jeeng","hostnames":["api.jeeng.com","users.api.jeeng.com","sdk.jeeng.com","telemetries.jeeng.com"],"name":"Jeeng","link":"https://www.ghostery.com/whotracksme/trackers/jeeng"},{"id":"wtm_janrain","hostnames":["widget-cdn.rpxnow.com"],"name":"Janrain","link":"https://www.ghostery.com/whotracksme/trackers/janrain"},{"id":"wtm_ividence","hostnames":["itm.ivitrack.com","matching.ivitrack.com"],"name":"Ividence","link":"https://www.ghostery.com/whotracksme/trackers/ividence"},{"id":"wtm_itunes_link_maker","hostnames":["autolinkmaker.itunes.apple.com","securemetrics.apple.com","01apple.com","www.01apple.com","dangquangapple.com","www.dangquangapple.com","apiapple.com","obuse-apple.com","iadsdk.apple.com","ca.iadsdk.apple.com","cf.iadsdk.apple.com","news.iadsdk.apple.com","tr.iadsdk.apple.com","ut.iadsdk.apple.com","notes-analytics-events.apple.com","stocks-analytics-events.apple.com","weather-analytics-events.apple.com"],"name":"iTunes Link Maker","link":"https://www.ghostery.com/whotracksme/trackers/itunes_link_maker"},{"id":"wtm_iprospect","hostnames":["www.clickmanage.com"],"name":"iProspect","link":"https://www.ghostery.com/whotracksme/trackers/iprospect"},{"id":"wtm_ipromote","hostnames":["iad7.ipromote.com","iad8.ipromote.com","search.ipromote.com","i.ipromote.com","iad1.ipromote.com","iad2.ipromote.com","iad3.ipromote.com","iad4.ipromote.com","iad5.ipromote.com","iad6.ipromote.com","sfo1.ipromote.com","sfo2.ipromote.com","sfo3.ipromote.com","sfo4.ipromote.com","sin1.ipromote.com","sin2.ipromote.com"],"name":"iPromote","link":"https://www.ghostery.com/whotracksme/trackers/ipromote"},{"id":"wtm_iprom","hostnames":["ads.centraliprom.com","central.iprom.net","ipromsi.iprom.net","krater.iprom.net","tie.iprom.net","adserver.iprom.net"],"name":"iprom","link":"https://www.ghostery.com/whotracksme/trackers/iprom"},{"id":"wtm_iplogger","hostnames":["iplogger.ru","www.iplogger.ru"],"name":"IPLogger","link":"https://www.ghostery.com/whotracksme/trackers/iplogger"},{"id":"wtm_ip-label","hostnames":["cloud-observer.ip-label.net"],"name":"ip-label","link":"https://www.ghostery.com/whotracksme/trackers/ip-label"},{"id":"wtm_iotec","hostnames":["dsp.io"],"name":"iotec","link":"https://www.ghostery.com/whotracksme/trackers/iotec"},{"id":"wtm_invodo","hostnames":["e.invodo.com"],"name":"Invodo","link":"https://www.ghostery.com/whotracksme/trackers/invodo"},{"id":"wtm_invoca","hostnames":["js12.invoca.net","js4.ringrevenue.com","json4.ringrevenue.com"],"name":"Invoca","link":"https://www.ghostery.com/whotracksme/trackers/invoca"},{"id":"wtm_inviziads","hostnames":["ads.inviziads.com","s1.inviziads.com","static.inviziads.com","o1.inviziads.com","of.inviziads.com"],"name":"InviziAds","link":"https://www.ghostery.com/whotracksme/trackers/inviziads"},{"id":"wtm_intimate_merger","hostnames":["im-apps.net"],"name":"Intimate Merger","link":"https://www.ghostery.com/whotracksme/trackers/intimate_merger"},{"id":"wtm_interyield","hostnames":["ps7894.com","www.ps7894.com"],"name":"Interyield","link":"https://www.ghostery.com/whotracksme/trackers/interyield"},{"id":"wtm_interpolls","hostnames":["hs.interpolls.com","nbc.interpolls.com","pollserver.interpolls.com","ps2.interpolls.com","ps.interpolls.com","sw.interpolls.com","wb.interpolls.com"],"name":"Interpolls","link":"https://www.ghostery.com/whotracksme/trackers/interpolls"},{"id":"wtm_internetbrands","hostnames":["pxl.ibpxl.com"],"name":"InternetBrands","link":"https://www.ghostery.com/whotracksme/trackers/internetbrands"},{"id":"wtm_intergi","hostnames":["ads.intergi.com"],"name":"Intergi","link":"https://www.ghostery.com/whotracksme/trackers/intergi"},{"id":"wtm_intent_iq","hostnames":["adserver.intentiq.com","ads.intentiq.com","api.intentiq.com","pe.intentiq.com","pe1.intentiq.com","sync.intentiq.com","sync1.intentiq.com"],"name":"Intent IQ","link":"https://www.ghostery.com/whotracksme/trackers/intent_iq"},{"id":"wtm_intelligent_reach","hostnames":["www.ist-track.com"],"name":"Intelligent Reach","link":"https://www.ghostery.com/whotracksme/trackers/intelligent_reach"},{"id":"wtm_integral_marketing","hostnames":["content.integral-marketing.com","imads.integral-marketing.com"],"name":"Integral Marketing","link":"https://www.ghostery.com/whotracksme/trackers/integral_marketing"},{"id":"wtm_instinctive","hostnames":["load.instinctiveads.com"],"name":"Instinctive","link":"https://www.ghostery.com/whotracksme/trackers/instinctive"},{"id":"wtm_insticator","hostnames":["insticator.com"],"name":"Insticator","link":"https://www.ghostery.com/whotracksme/trackers/insticator"},{"id":"wtm_inspectlet","hostnames":["inspectlet.com","cdn.inspectlet.com","hn.inspectlet.com","ws.inspectlet.com"],"name":"Inspectlet","link":"https://www.ghostery.com/whotracksme/trackers/inspectlet"},{"id":"wtm_inskin_media","hostnames":["inskinad.com","video.inskinad.com","www.inskinad.com","cdn.inskinad.com","mfad.inskinad.com"],"name":"InSkin Media","link":"https://www.ghostery.com/whotracksme/trackers/inskin_media"},{"id":"wtm_insider","hostnames":["mobileanalytics.useinsider.com","segment.api.useinsider.com"],"name":"Insider","link":"https://www.ghostery.com/whotracksme/trackers/insider"},{"id":"wtm_inside","hostnames":["eu-track.inside-graph.com"],"name":"inside","link":"https://www.ghostery.com/whotracksme/trackers/inside"},{"id":"wtm_informer_technologies","hostnames":["pcbutts1.software.informer.com","hits.informer.com","web.informer.com"],"name":"Informer Technologies","link":"https://www.ghostery.com/whotracksme/trackers/informer_technologies"},{"id":"wtm_infonline","hostnames":["ioam.de","ivwbox.de"],"name":"INFOnline","link":"https://www.ghostery.com/whotracksme/trackers/infonline"},{"id":"wtm_infolinks","hostnames":["infolinks.com","rt3.infolinks.com","resources.infolinks.com"],"name":"InfoLinks","link":"https://www.ghostery.com/whotracksme/trackers/infolinks"},{"id":"wtm_influads","hostnames":["engine.influads.com"],"name":"InfluAds","link":"https://www.ghostery.com/whotracksme/trackers/influads"},{"id":"wtm_infectious_media","hostnames":["pix.impdesk.com","secure-id.impressiondesk.com"],"name":"Impression Desk","link":"https://www.ghostery.com/whotracksme/trackers/infectious_media"},{"id":"wtm_industry_brains","hostnames":["industrybrains.com","pixel.industrybrains.com","web.industrybrains.com","staticd.cdn.industrybrains.com","gflinks.industrybrains.com","ilinks.industrybrains.com","imglinks.industrybrains.com","jlinks.industrybrains.com","links.industrybrains.com","shlinks.industrybrains.com"],"name":"Industry Brains","link":"https://www.ghostery.com/whotracksme/trackers/industry_brains"},{"id":"wtm_index_exchange","hostnames":["casalemedia.com","indexww.com","ip.casalemedia.com","a1589.casalemedia.com","a1653.casalemedia.com","a1664.casalemedia.com","a1681.casalemedia.com","a407.casalemedia.com","b.casalemedia.com","c.casalemedia.com","i.casalemedia.com","img.casalemedia.com","js.casalemedia.com","www.casalemedia.com","isg01.casalemedia.com","cdn.indexww.com","js.indexww.com","a1000.casalemedia.com","a1015.casalemedia.com","a1020.casalemedia.com","a1222.casalemedia.com","a1223.casalemedia.com","a1232.casalemedia.com","a1233.casalemedia.com","a1234.casalemedia.com","a1235.casalemedia.com","a1238.casalemedia.com","a1243.casalemedia.com","a1246.casalemedia.com","a1247.casalemedia.com","a1249.casalemedia.com","a1261.casalemedia.com","a1263.casalemedia.com","a1264.casalemedia.com","a1269.casalemedia.com","a1273.casalemedia.com","a1276.casalemedia.com","a1277.casalemedia.com","a1278.casalemedia.com","a1279.casalemedia.com","a1287.casalemedia.com","a1289.casalemedia.com","a1297.casalemedia.com","a1312.casalemedia.com","a1313.casalemedia.com","a1317.casalemedia.com","a1319.casalemedia.com","a1327.casalemedia.com","a1329.casalemedia.com","a1333.casalemedia.com","a1341.casalemedia.com","a1344.casalemedia.com","a1351.casalemedia.com","a1352.casalemedia.com","a1359.casalemedia.com","a1365.casalemedia.com","a1366.casalemedia.com","a1369.casalemedia.com","a1370.casalemedia.com","a1372.casalemedia.com","a1382.casalemedia.com","a1394.casalemedia.com","a1396.casalemedia.com","a1408.casalemedia.com","a1410.casalemedia.com","a1411.casalemedia.com","a1413.casalemedia.com","a1416.casalemedia.com","a1420.casalemedia.com","a1423.casalemedia.com","a1424.casalemedia.com","a1430.casalemedia.com","a1440.casalemedia.com","a1441.casalemedia.com","a1442.casalemedia.com","a1444.casalemedia.com","a1447.casalemedia.com","a1451.casalemedia.com","a1453.casalemedia.com","a1457.casalemedia.com","a1726.casalemedia.com","a3409.casalemedia.com","a3426.casalemedia.com","a3427.casalemedia.com","a3428.casalemedia.com","a3435.casalemedia.com","a3448.casalemedia.com","a3449.casalemedia.com","a3453.casalemedia.com","a3457.casalemedia.com","a3468.casalemedia.com","a3473.casalemedia.com","a3485.casalemedia.com","a3489.casalemedia.com","a3493.casalemedia.com","a3495.casalemedia.com","a3514.casalemedia.com","a3518.casalemedia.com","a3536.casalemedia.com","a3543.casalemedia.com","a3559.casalemedia.com","a3560.casalemedia.com","a3561.casalemedia.com","a3571.casalemedia.com","a3585.casalemedia.com","a3586.casalemedia.com","a3587.casalemedia.com","a3595.casalemedia.com","a3610.casalemedia.com","a3614.casalemedia.com","a3618.casalemedia.com","a3623.casalemedia.com","a3630.casalemedia.com","a3653.casalemedia.com","a3670.casalemedia.com","a3680.casalemedia.com","a3686.casalemedia.com","a3689.casalemedia.com","a3700.casalemedia.com","a3718.casalemedia.com","a3719.casalemedia.com","a3727.casalemedia.com","a3729.casalemedia.com","a3791.casalemedia.com","a3793.casalemedia.com","a3795.casalemedia.com","a3796.casalemedia.com","a3800.casalemedia.com","a3806.casalemedia.com","a3811.casalemedia.com","a3828.casalemedia.com","a3835.casalemedia.com","a3859.casalemedia.com","a3862.casalemedia.com","a3863.casalemedia.com","a3865.casalemedia.com","a3868.casalemedia.com","a3871.casalemedia.com","a3880.casalemedia.com","a527.casalemedia.com","a531.casalemedia.com","a545.casalemedia.com","a546.casalemedia.com","a547.casalemedia.com","a556.casalemedia.com","a985.casalemedia.com","a987.casalemedia.com","a998.casalemedia.com","amp.casalemedia.com","as.casalemedia.com","as-sec.casalemedia.com","dsum.casalemedia.com","dsum-sec.casalemedia.com","htlb.casalemedia.com","r.casalemedia.com","ssum.casalemedia.com","ssum-sec.casalemedia.com","js-sec.indexww.com","update.indexww.com","s.update.indexww.com"],"name":"Index Exchange","link":"https://www.ghostery.com/whotracksme/trackers/index_exchange"},{"id":"wtm_indeed","hostnames":["taxiindeed.com","www.taxiindeed.com","ads.indeed.com","t.indeed.com"],"name":"Indeed","link":"https://www.ghostery.com/whotracksme/trackers/indeed"},{"id":"wtm_improve_digital","hostnames":["360yield.com","ice.360yield.com","ad.360yield.com"],"name":"Improve Digital","link":"https://www.ghostery.com/whotracksme/trackers/improve_digital"},{"id":"wtm_impresiones_web","hostnames":["gad.impresionesweb.com","alt.impresionesweb.com","gb.impresionesweb.com","paneles.impresionesweb.com","www.impresionesweb.com"],"name":"Impresiones Web","link":"https://www.ghostery.com/whotracksme/trackers/impresiones_web"},{"id":"wtm_imonomy","hostnames":["imonomy.com","a.imonomy.com","b.imonomy.com","srv.imonomy.com","tag.imonomy.com"],"name":"imonomy","link":"https://www.ghostery.com/whotracksme/trackers/imonomy"},{"id":"wtm_imad","hostnames":["adv.imadrep.co.kr"],"name":"imad","link":"https://www.ghostery.com/whotracksme/trackers/imad"},{"id":"wtm_ijento","hostnames":["uktc.ijento.com"],"name":"iJento","link":"https://www.ghostery.com/whotracksme/trackers/ijento"},{"id":"wtm_ihs_markit","hostnames":["ad.wsod.com"],"name":"IHS Markit","link":"https://www.ghostery.com/whotracksme/trackers/ihs_markit"},{"id":"wtm_ideoclick","hostnames":["ideoclick.com"],"name":"IdeoClick","link":"https://www.ghostery.com/whotracksme/trackers/ideoclick"},{"id":"wtm_ideal_media","hostnames":["js.e-generator.com","target.e-generator.com"],"name":"Ideal Media","link":"https://www.ghostery.com/whotracksme/trackers/ideal_media"},{"id":"wtm_icerocket_tracker","hostnames":["tracker.icerocket.com"],"name":"IceRocket Tracker","link":"https://www.ghostery.com/whotracksme/trackers/icerocket_tracker"},{"id":"wtm_i.ua","hostnames":["r.i.ua"],"name":"i.ua","link":"https://www.ghostery.com/whotracksme/trackers/i.ua"},{"id":"wtm_i-behavior","hostnames":["ev.ib-ibi.com"],"name":"i-Behavior","link":"https://www.ghostery.com/whotracksme/trackers/i-behavior"},{"id":"wtm_hype_exchange","hostnames":["tags.hypeads.org","ox-d.hypeads.org"],"name":"Hype Exchange","link":"https://www.ghostery.com/whotracksme/trackers/hype_exchange"},{"id":"wtm_hybrid.ai","hostnames":["hbe198.hybrid.ai"],"name":"Hybrid.ai","link":"https://www.ghostery.com/whotracksme/trackers/hybrid.ai"},{"id":"wtm_hucksterbot","hostnames":["files.hucksterbot.com"],"name":"HucksterBot","link":"https://www.ghostery.com/whotracksme/trackers/hucksterbot"},{"id":"wtm_httpool","hostnames":["httpool.com","relay-ba.ads.httpool.com","relay-bg.ads.httpool.com","relay-cz.ads.httpool.com","relay-ks.ads.httpool.com","relay-mk.ads.httpool.com","relay-rs.ads.httpool.com","a.mobile.toboads.com","relay.mobile.toboads.com","adtier.toboads.com","relay-ba.toboads.com","relay-bg.toboads.com","relay-si.toboads.com","tas-ba.toboads.com","tas-bg.toboads.com","tas-cz.toboads.com","tas-hr.toboads.com","tas-ks.toboads.com","tas-mk.toboads.com","tas-rs.toboads.com","tas-si.toboads.com"],"name":"HTTPool","link":"https://www.ghostery.com/whotracksme/trackers/httpool"},{"id":"wtm_hsoub","hostnames":["ads.hsoub.com","ads2.hsoub.com"],"name":"Hsoub","link":"https://www.ghostery.com/whotracksme/trackers/hsoub"},{"id":"wtm_hqentertainmentnetwork.com","hostnames":["bmedia.justservingfiles.net"],"name":"HQ Entertainment Network","link":"https://www.ghostery.com/whotracksme/trackers/hqentertainmentnetwork.com"},{"id":"wtm_hotlog.ru","hostnames":["hotlog.ru","hit10.hotlog.ru","hit2.hotlog.ru","hit5.hotlog.ru","hit8.hotlog.ru","hit4.hotlog.ru"],"name":"HotLog","link":"https://www.ghostery.com/whotracksme/trackers/hotlog.ru"},{"id":"wtm_hotjar","hostnames":["hotjar.com","script.hotjar.com","static.hotjar.com","vars.hotjar.com","vc.hotjar.io"],"name":"Hotjar","link":"https://www.ghostery.com/whotracksme/trackers/hotjar"},{"id":"wtm_hop-cube","hostnames":["apiae.hopscore.com"],"name":"Hop-Cube","link":"https://www.ghostery.com/whotracksme/trackers/hop-cube"},{"id":"wtm_hooklogic","hostnames":["www.hlserve.com","beam.hlserve.com"],"name":"HookLogic","link":"https://www.ghostery.com/whotracksme/trackers/hooklogic"},{"id":"wtm_hiveworks","hostnames":["ads.thehiveworks.com"],"name":"Hive Networks","link":"https://www.ghostery.com/whotracksme/trackers/hiveworks"},{"id":"wtm_hittail","hostnames":["hittail.com","314.hittail.com","815.hittail.com","922.hittail.com","1262.hittail.com","30811.hittail.com","3241.hittail.com","3415.hittail.com","3463.hittail.com","3918.hittail.com","3933.hittail.com","3957.hittail.com","4134.hittail.com","4560.hittail.com","4612.hittail.com","8260.hittail.com","8959.hittail.com","9394.hittail.com","9446.hittail.com","9547.hittail.com","9563.hittail.com","9571.hittail.com","10006.hittail.com","10168.hittail.com","12877.hittail.com","13223.hittail.com","14228.hittail.com","15141.hittail.com","15628.hittail.com","15694.hittail.com","16565.hittail.com","19097.hittail.com","19500.hittail.com","19533.hittail.com","20909.hittail.com","21807.hittail.com","22537.hittail.com","23315.hittail.com","23837.hittail.com","24725.hittail.com","24809.hittail.com","25057.hittail.com","26288.hittail.com","27460.hittail.com","27891.hittail.com","28305.hittail.com","30001.hittail.com","31335.hittail.com","31870.hittail.com","34673.hittail.com","35385.hittail.com","71158.hittail.com","73091.hittail.com","77266.hittail.com","78843.hittail.com","93367.hittail.com","99400.hittail.com","100065.hittail.com","103532.hittail.com","106242.hittail.com","108411.hittail.com","tracking.hittail.com","tracking2.hittail.com","25184.hittail.com","85103.hittail.com"],"name":"HitTail","link":"https://www.ghostery.com/whotracksme/trackers/hittail"},{"id":"wtm_hitslink","hostnames":["hitslink.com","counter.hitslink.com","counter2.hitslink.com","profiles.hitslink.com","www2.hitslink.com","www.hitslink.com","loc1.hitsprocessor.com"],"name":"HitsLink","link":"https://www.ghostery.com/whotracksme/trackers/hitslink"},{"id":"wtm_hit.ua","hostnames":["hit.ua","c.hit.ua"],"name":"HIT.UA","link":"https://www.ghostery.com/whotracksme/trackers/hit.ua"},{"id":"wtm_hit-parade","hostnames":["hit-parade.com","loga.hit-parade.com","logp.hit-parade.com"],"name":"Hit-Parade","link":"https://www.ghostery.com/whotracksme/trackers/hit-parade"},{"id":"wtm_histats","hostnames":["histats.com","s4is.histats.com","s4.histats.com","s11.histats.com","s128.histats.com","s129js.histats.com","sstatic1.histats.com","www.histats.com","s10.histats.com","s4i.histats.com"],"name":"Histats","link":"https://www.ghostery.com/whotracksme/trackers/histats"},{"id":"wtm_hiconversion","hostnames":["update.hiconversion.com","h30-deploy.hiconversion.com"],"name":"HiConversion","link":"https://www.ghostery.com/whotracksme/trackers/hiconversion"},{"id":"wtm_hi-media_performance","hostnames":["himediads.com","js.adlink.net","tc.adlink.net","br.comclick.com","bdx.comclick.com","ct2.comclick.com","fl01.ct2.comclick.com","ihm01.ct2.comclick.com","www.comclick.com","js.himediads.com","ad.himediadx.com"],"name":"Hi-Media Performance","link":"https://www.ghostery.com/whotracksme/trackers/hi-media_performance"},{"id":"wtm_heyos","hostnames":["heyos.com"],"name":"Heyos","link":"https://www.ghostery.com/whotracksme/trackers/heyos"},{"id":"wtm_hello_bar","hostnames":["hellobar.com","ping.hellobar.com"],"name":"Hello Bar","link":"https://www.ghostery.com/whotracksme/trackers/hello_bar"},{"id":"wtm_harren_media","hostnames":["ad.harrenmedianetwork.com","ads.networkhm.com"],"name":"Harren Media","link":"https://www.ghostery.com/whotracksme/trackers/harren_media"},{"id":"wtm_hacker_news_button","hostnames":["hnbutton.appspot.com"],"name":"Hacker News Button","link":"https://www.ghostery.com/whotracksme/trackers/hacker_news_button"},{"id":"wtm_gunggo","hostnames":["gunggo.com"],"name":"Gunggo","link":"https://www.ghostery.com/whotracksme/trackers/gunggo"},{"id":"wtm_gujems","hostnames":["traffic.emsservice.de","static.emsservice.de"],"name":"G+J e|MS","link":"https://www.ghostery.com/whotracksme/trackers/gujems"},{"id":"wtm_guj.de","hostnames":["bigads.guj.de"],"name":"Gruner + Jahr","link":"https://www.ghostery.com/whotracksme/trackers/guj.de"},{"id":"wtm_gtop","hostnames":["fx.gtop.ro","fx.gtopstats.com"],"name":"GTop","link":"https://www.ghostery.com/whotracksme/trackers/gtop"},{"id":"wtm_gsi_media","hostnames":["media.gsimedia.net"],"name":"GSI Media","link":"https://www.ghostery.com/whotracksme/trackers/gsi_media"},{"id":"wtm_groupm_server","hostnames":["gmads.net","grmtech.net","www.gmads.net","de.grmtech.net","www.grmtech.net"],"name":"GroupM Server","link":"https://www.ghostery.com/whotracksme/trackers/groupm_server"},{"id":"wtm_greystripe","hostnames":["greystripe.com","c.greystripe.com","adsx.greystripe.com"],"name":"Greystripe","link":"https://www.ghostery.com/whotracksme/trackers/greystripe"},{"id":"wtm_gravity_insights","hostnames":["gravity.com","hotstar.worldgravity.com","bitcast-a.v1.iad1.bitgravity.com","bitcast-d.bitgravity.com","crowdgravity.com","input.insights.gravity.com","www.crowdgravity.com"],"name":"Gravity Insights","link":"https://www.ghostery.com/whotracksme/trackers/gravity_insights"},{"id":"wtm_grapeshot","hostnames":["grapeshot.co.uk","gscontxt.net","reed-cw.grapeshot.co.uk","johnston.grapeshot.co.uk","mediaforce.grapeshot.co.uk","newscorp.grapeshot.co.uk","telegraph.grapeshot.co.uk","trinitymirror.grapeshot.co.uk","hearst.gscontxt.net"],"name":"Grapeshot","link":"https://www.ghostery.com/whotracksme/trackers/grapeshot"},{"id":"wtm_grandslammedia","hostnames":["trw12.com"],"name":"GrandSlamMedia","link":"https://www.ghostery.com/whotracksme/trackers/grandslammedia"},{"id":"wtm_grabo_affiliate","hostnames":["b.grabo.bg"],"name":"Grabo Affiliate","link":"https://www.ghostery.com/whotracksme/trackers/grabo_affiliate"},{"id":"wtm_gostats","hostnames":["gostats.com","c1.gostats.com","c2.gostats.com","c3.gostats.com","c4.gostats.com","monster.gostats.com","as.gostats.com","ded.gostats.com"],"name":"GoStats","link":"https://www.ghostery.com/whotracksme/trackers/gostats"},{"id":"wtm_gosquared","hostnames":["d1l6p2sc9645hc.cloudfront.net","data.gosquared.com","data2.gosquared.com"],"name":"GoSquared","link":"https://www.ghostery.com/whotracksme/trackers/gosquared"},{"id":"wtm_gorilla_nation","hostnames":["cdn.triggertag.gorillanation.com"],"name":"Gorilla Nation","link":"https://www.ghostery.com/whotracksme/trackers/gorilla_nation"},{"id":"wtm_google_syndication","hostnames":["googlesyndication.com","2mdn.net","doubleclick.com","doubleclick.net","mng-ads.com","mobileads.google.com","ads.google.com","googleadservices.com","googleads.g.doubleclick.net","adservice.google..*","adservice.g.cn","8a97175fd63e1d3a69f36979b9b34470.safeframe.googlesyndication.com","b2b6d102cb7a4898bc54a3b73e31b759.safeframe.googlesyndication.com","80d4b6e40cc712bf92fcdbabdd4345fd.safeframe.googlesyndication.com","facf31c1c8559131d653f3c5ad4ecc78.safeframe.googlesyndication.com","c23811bc8d067cdb4f00f6af2c918f3d.safeframe.googlesyndication.com","ade.googlesyndication.com","pagead.googlesyndication.com","pagead2.googlesyndication.com","tpc.googlesyndication.com","video-ad-stats.googlesyndication.com","buttons.googlesyndication.com","s0.2mdn.net","m1.2mdn.net","affiliate.2mdn.net","m.2mdn.net","gcdn.2mdn.net","rmcdn.2mdn.net","rmcdn.f.2mdn.net","s1.2mdn.net","static.2mdn.net","www2.doubleclick.com","www3.doubleclick.com","www.doubleclick.com","4436230.fls.doubleclick.net","www.4436230.fls.doubleclick.net","4448269.fls.doubleclick.net","www.4448269.fls.doubleclick.net","accounts.doubleclick.net","ad.doubleclick.net","ad-emea.doubleclick.net","ff.doubleclick.net","fls.doubleclick.net","3243857.fls.doubleclick.net","4394967.fls.doubleclick.net","5290727.fls.doubleclick.net","8168974.fls.doubleclick.net","8272590.fls.doubleclick.net","8397396.fls.doubleclick.net","g.doubleclick.net","adx.g.doubleclick.net","bid.g.doubleclick.net","cm.g.doubleclick.net","googleads4.g.doubleclick.net","pubads.g.doubleclick.net","securepubads.g.doubleclick.net","stats.g.doubleclick.net","survey.g.doubleclick.net","g1.doubleclick.net","ads-bid.l.doubleclick.net","dart.l.doubleclick.net","partnerad.l.doubleclick.net","stats.l.doubleclick.net","m.doubleclick.net","s0.doubleclick.net","static.doubleclick.net","3642305.fls.doubleclick.net","3765329.fls.doubleclick.net","4514783.fls.doubleclick.net","4923503.fls.doubleclick.net","4942839.fls.doubleclick.net","5582200.fls.doubleclick.net","8210643.fls.doubleclick.net","8482194.fls.doubleclick.net","8563004.fls.doubleclick.net","pagead.l.doubleclick.net","pagead46.l.doubleclick.net","undefined.fls.doubleclick.net","5362399.fls.doubleclick.net","dp.g.doubleclick.net","1435575.fls.doubleclick.net","2542116.fls.doubleclick.net","4053494.fls.doubleclick.net","4236808.fls.doubleclick.net","ad-g.doubleclick.net","ad2.doubleclick.net","ad.ae.doubleclick.net","ad.ar.doubleclick.net","ad.at.doubleclick.net","ad.au.doubleclick.net","ad.be.doubleclick.net","ad.br.doubleclick.net","ad.ca.doubleclick.net","ad.ch.doubleclick.net","ad.cl.doubleclick.net","ad.cn.doubleclick.net","ad.de.doubleclick.net","ad.dk.doubleclick.net","ad.es.doubleclick.net","ad.fi.doubleclick.net","ad.fr.doubleclick.net","ad.gr.doubleclick.net","ad.hk.doubleclick.net","ad.hr.doubleclick.net","ad.hu.doubleclick.net","ad.ie.doubleclick.net","ad.in.doubleclick.net","ad.jp.doubleclick.net","ad.kr.doubleclick.net","ad.it.doubleclick.net","ad.nl.doubleclick.net","ad.no.doubleclick.net","ad.nz.doubleclick.net","ad.pl.doubleclick.net","ad.pt.doubleclick.net","ad.ro.doubleclick.net","ad.ru.doubleclick.net","ad.se.doubleclick.net","ad.sg.doubleclick.net","ad.si.doubleclick.net","ad.terra.doubleclick.net","ad.th.doubleclick.net","ad.tw.doubleclick.net","ad.uk.doubleclick.net","ad.us.doubleclick.net","ad.za.doubleclick.net","ad.n2434.doubleclick.net","creatives.doubleclick.net","dfp.doubleclick.net","feedads.g.doubleclick.net","fls.uk.doubleclick.net","ir.doubleclick.net","iv.doubleclick.net","n4052ad.doubleclick.net","n4403ad.doubleclick.net","n479ad.doubleclick.net","paypalssl.doubleclick.net","s2.video.doubleclick.net","www3.doubleclick.net","www.doubleclick.net","ad.rs.doubleclick.net","ad-apac.doubleclick.net","ad.mo.doubleclick.net","adclick.g.doubleclick.net","gan.doubleclick.net","googleads2.g.doubleclick.net","n4061ad.hk.doubleclick.net","ad-ace.doubleclick.net","ad.bg.doubleclick.net","fls.au.doubleclick.net","ad.ve.doubleclick.net","ad.my.doubleclick.net","n4061ad.jp.doubleclick.net","creative.mng-ads.com","dispatcher.mng-ads.com","lb-adsdis.mng-ads.com","lb-adsmob.mng-ads.com","mobile.mng-ads.com","mail-ads.google.com","pagead2.googleadservices.com","www.googleadservices.com","4.afs.googleadservices.com","partner.googleadservices.com"],"name":"Google Syndication","link":"https://www.ghostery.com/whotracksme/trackers/google_syndication","exodusId":312},{"id":"wtm_google_signals","hostnames":["analytics.google.com"],"name":"Google Analytics with signals","link":"https://www.ghostery.com/whotracksme/trackers/google_signals"},{"id":"wtm_google_custom_search","hostnames":["adsensecustomsearchads.com","www.adsensecustomsearchads.com"],"name":"Google Custom Search Ads","link":"https://www.ghostery.com/whotracksme/trackers/google_custom_search"},{"id":"wtm_google","hostnames":["google.co.id","google.co.in","google.co.jp","google.co.ma","google.co.th","google.co.uk","google.com.ar","google.com.au","google.com.br","google.com.mx","google.com.tr","google.com.tw","google.com.ua","adservice.google.be","adservice.google.ca","adservice.google.co.in","adservice.google.co.jp","fgoogle.com","www.fgoogle.com","www.doubleclickbygoogle.com","adservice.google.com.au","adservice.google.cz","www-google.nl","www.www-google.nl","adservice.google.nl","marketingplatform.google.com","smartlock.google.com","fundingchoicesmessages.google.com","adservice.google.com","s0-2mdn-net.l.google.com","pagead-googlehosted.l.google.com","video-stats.video.google.com","ssl-google-analytics.l.google.com","pagead.l.google.com","partnerad.l.google.com","www-google-analytics.l.google.com"],"name":"Google","link":"https://www.ghostery.com/whotracksme/trackers/google"},{"id":"wtm_gomez","hostnames":["akamai.t.axf8.net","0532a9.r.axf8.net","064bdf.r.axf8.net","0d7292.r.axf8.net","0f36f3.r.axf8.net","1bb261.r.axf8.net","247590.r.axf8.net","276bf6.r.axf8.net","332645.r.axf8.net","3bb4f0.r.axf8.net","51af72.r.axf8.net","5b008e.r.axf8.net","5ebec5.r.axf8.net","72d329.r.axf8.net","8b3439.r.axf8.net","8cb8a3.r.axf8.net","8d6274.r.axf8.net","8d6274.t.axf8.net","9dacbd.r.axf8.net","9d060c.r.axf8.net","994119.r.axf8.net","1018d7.r.axf8.net","ab44aa.r.axf8.net","ac9d98.r.axf8.net","b3a70b.t.axf8.net","b5057c.r.axf8.net","c2c738.r.axf8.net","caea4e.r.axf8.net","caea4e.t.axf8.net","c6530e.r.axf8.net","d077aa.r.axf8.net","d3fd89.r.axf8.net","d9d0e0.r.axf8.net","e3f364.r.axf8.net","fdff44.r.axf8.net","fdff44.t.axf8.net","0d79ed.r.axf8.net","4c28d6.r.axf8.net"],"name":"Gomez","link":"https://www.ghostery.com/whotracksme/trackers/gomez"},{"id":"wtm_godatafeed","hostnames":["tracking.godatafeed.com"],"name":"GoDataFeed","link":"https://www.ghostery.com/whotracksme/trackers/godatafeed"},{"id":"wtm_godaddy_affiliate_program","hostnames":["affiliate.godaddy.com"],"name":"GoDaddy Affiliate Program","link":"https://www.ghostery.com/whotracksme/trackers/godaddy_affiliate_program"},{"id":"wtm_gmo","hostnames":["ad.atown.jp"],"name":"GMO","link":"https://www.ghostery.com/whotracksme/trackers/gmo"},{"id":"wtm_gmarket","hostnames":["gmarket.co.kr","mobile.gmarket.co.kr","global.gmarket.co.kr","dadispapi.gmarket.co.kr","montelena-rcv.gmarket.co.kr","uts.gmarket.co.kr"],"name":"Gmarket","link":"https://www.ghostery.com/whotracksme/trackers/gmarket"},{"id":"wtm_gm_delivery","hostnames":["a.gmdelivery.com"],"name":"GM Delivery","link":"https://www.ghostery.com/whotracksme/trackers/gm_delivery"},{"id":"wtm_globaltakeoff","hostnames":["ad.globaltakeoff.net"],"name":"GlobalTakeoff","link":"https://www.ghostery.com/whotracksme/trackers/globaltakeoff"},{"id":"wtm_global_web_index","hostnames":["gwiq-v3.globalwebindex.net","gwiqcdn.globalwebindex.net"],"name":"GlobalWebIndex","link":"https://www.ghostery.com/whotracksme/trackers/global_web_index"},{"id":"wtm_gittigidiyor_affiliate_program","hostnames":["aff3.gittigidiyor.com"],"name":"GittiGidiyor Affiliate Program","link":"https://www.ghostery.com/whotracksme/trackers/gittigidiyor_affiliate_program"},{"id":"wtm_gigya","hostnames":["analytics.gigyahosting1.com","gscounters.eu1.gigya.com","gscounters.gigya.com","gscounters.us1.gigya.com","cdn.gigya.com","cdn1.gigya.com","cdn2.gigya.com","cdn3.gigya.com","cdns.us1.gigya.com","david.gigya-cs.com"],"name":"SAP CDC (Gigya)","link":"https://www.ghostery.com/whotracksme/trackers/gigya","exodusId":148},{"id":"wtm_giga","hostnames":["gigaonclick.com"],"name":"Giga","link":"https://www.ghostery.com/whotracksme/trackers/giga"},{"id":"wtm_giant_realm","hostnames":["a.giantrealm.com"],"name":"Giant Realm","link":"https://www.ghostery.com/whotracksme/trackers/giant_realm"},{"id":"wtm_gfycat.com","hostnames":["metrics.gfycat.com","px.gfycat.com"],"name":"gfycat","link":"https://www.ghostery.com/whotracksme/trackers/gfycat.com"},{"id":"wtm_gfk","hostnames":["sensic.net","de-config.sensic.net","config.sensic.net"],"name":"GfK","link":"https://www.ghostery.com/whotracksme/trackers/gfk"},{"id":"wtm_getmyad","hostnames":["rg.yottos.com","cdn.yottos.com"],"name":"GetMyAd","link":"https://www.ghostery.com/whotracksme/trackers/getmyad"},{"id":"wtm_getintent","hostnames":["adhigh.net","px-eu.adhigh.net","px.adhigh.net"],"name":"GetIntent","link":"https://www.ghostery.com/whotracksme/trackers/getintent"},{"id":"wtm_geovisite","hostnames":["geovisite.com","geoloc4.geovisite.com","geoloc16.geovisite.com","geoloc2.geovisite.com","geoloc12.geovisite.com","geoloc13.geovisite.com","geoloc14.geovisite.com","geoloc17.geovisite.com","geoloc11.geovisite.com"],"name":"Geovisite","link":"https://www.ghostery.com/whotracksme/trackers/geovisite"},{"id":"wtm_geoads","hostnames":["js.geoads.com"],"name":"GeoAds","link":"https://www.ghostery.com/whotracksme/trackers/geoads"},{"id":"wtm_genius","hostnames":["gbjfc.rsvpgenius.com"],"name":"Genius","link":"https://www.ghostery.com/whotracksme/trackers/genius"},{"id":"wtm_geniee","hostnames":["gssprt.jp"],"name":"GENIEE","link":"https://www.ghostery.com/whotracksme/trackers/geniee"},{"id":"wtm_gb-world","hostnames":["js.gb-world.net"],"name":"GB-World","link":"https://www.ghostery.com/whotracksme/trackers/gb-world"},{"id":"wtm_gaug.es","hostnames":["gaug.es","track.gaug.es"],"name":"Gaug.es","link":"https://www.ghostery.com/whotracksme/trackers/gaug.es"},{"id":"wtm_game_advertising_online","hostnames":["game-advertising-online.com","www2.game-advertising-online.com","www3.game-advertising-online.com","www.game-advertising-online.com"],"name":"Game Advertising Online","link":"https://www.ghostery.com/whotracksme/trackers/game_advertising_online"},{"id":"wtm_fyber","hostnames":["postimp-ofw.fyber.com","update.postimp-ofw.fyber.com","s.update.postimp-ofw.fyber.com","api.fyber.com","api-rewarded-video.fyber.com","dau.fyber.com","engine.fyber.com","fev.fyber.com","interstitial.fyber.com","mbe-cdn.fyber.com","mediation.fyber.com","offer.fyber.com","rewarded-video.fyber.com","sdk-config.fyber.com","service.fyber.com","tracker.fyber.com","video.fyber.com","adproxy.fyber.com","appengage-video.fyber.com","banner.fyber.com","video-interstitial-assets-cdn.fyber.com"],"name":"Fyber","link":"https://www.ghostery.com/whotracksme/trackers/fyber","exodusId":104},{"id":"wtm_fullstory","hostnames":["fullstory.com"],"name":"FullStory","link":"https://www.ghostery.com/whotracksme/trackers/fullstory"},{"id":"wtm_fuelx","hostnames":["cookie.fuel451.com"],"name":"FuelX","link":"https://www.ghostery.com/whotracksme/trackers/fuelx"},{"id":"wtm_fruitflan","hostnames":["lb.fruitflan.com"],"name":"FruitFlan","link":"https://www.ghostery.com/whotracksme/trackers/fruitflan"},{"id":"wtm_frosmo_optimizer","hostnames":["inpref.s3-external-3.amazonaws.com","inpref.s3.amazonaws.com"],"name":"Frosmo Optimizer","link":"https://www.ghostery.com/whotracksme/trackers/frosmo_optimizer"},{"id":"wtm_friendfinder_network","hostnames":["adultfriendfinder.com","getiton.com","ads.adultfriendfinder.com","adserver.adultfriendfinder.com","banners.adultfriendfinder.com","cover9.adultfriendfinder.com","geobanner.adultfriendfinder.com","guest.adultfriendfinder.com","iframe.adultfriendfinder.com","option9.adultfriendfinder.com","pop6.adultfriendfinder.com","tgp.adultfriendfinder.com","www.adultfriendfinder.com","graphics.adultfriendfinder.com","ads.amigos.com","banners.amigos.com","banners.webcams.com","promo.cams.com","promo.passioncams.com","00webcams.com","www.00webcams.com","feelstarcams.com","www.feelstarcams.com","ifa.xhamstercams.com","ifa.yobtcams.com","static.ifa.yobtcams.com","adserver.cams.com","banners.cams.com","banners.icams.com","ads.vipcams.com","liivecams.com","online1.webcams.com","banners.getiton.com","geobanner.getiton.com","www.getiton.com","graphics.pop6.com","content.pop6.com","glean.pop6.com","affimg.pop6.com","photos.pop6.com","photos0.pop6.com","photos1.pop6.com","photos2.pop6.com","photos3.pop6.com","photos4.pop6.com","photos5.pop6.com","photos6.pop6.com","photos7.pop6.com","photos8.pop6.com","affiliates.streamray.com","free.content.streamray.com","graphics.streamray.com","livecamgirls.streamray.com","bongacams.com"],"name":"FriendFinder Network","link":"https://www.ghostery.com/whotracksme/trackers/friendfinder_network"},{"id":"wtm_freenet_de","hostnames":["rc.asci.freenet.de","static.freenet.de"],"name":"freenet.de","link":"https://www.ghostery.com/whotracksme/trackers/freenet_de"},{"id":"wtm_freegeoip_net","hostnames":["freegeoip.net"],"name":"freegeoip.net","link":"https://www.ghostery.com/whotracksme/trackers/freegeoip_net"},{"id":"wtm_freedom_mortgage","hostnames":["spinbox.freedom.com","oascentral.freedom.com"],"name":"Freedom Mortgage","link":"https://www.ghostery.com/whotracksme/trackers/freedom_mortgage"},{"id":"wtm_free_online_users","hostnames":["fastonlineusers.com","fastwebcounter.com","freeonlineusers.com"],"name":"Free Online Users","link":"https://www.ghostery.com/whotracksme/trackers/free_online_users"},{"id":"wtm_free_counter","hostnames":["freecounterstat.com"],"name":"Free Counter","link":"https://www.ghostery.com/whotracksme/trackers/free_counter"},{"id":"wtm_fraudlogix","hostnames":["pixel.yabidos.com"],"name":"FraudLogix","link":"https://www.ghostery.com/whotracksme/trackers/fraudlogix"},{"id":"wtm_foxpush","hostnames":["cdn.foxpush.net","pushaction.foxpush.com"],"name":"FoxPush","link":"https://www.ghostery.com/whotracksme/trackers/foxpush"},{"id":"wtm_fox_audience_network","hostnames":["fimserve.com","demr.opt.fimserve.com","desk.opt.fimserve.com"],"name":"Fox Audience Network","link":"https://www.ghostery.com/whotracksme/trackers/fox_audience_network"},{"id":"wtm_foursquare_widget","hostnames":["platform.foursquare.com"],"name":"Foursquare Widget","link":"https://www.ghostery.com/whotracksme/trackers/foursquare_widget"},{"id":"wtm_fouanalytics","hostnames":["api.fouanalytics.com"],"name":"FouAnalytics","link":"https://www.ghostery.com/whotracksme/trackers/fouanalytics"},{"id":"wtm_forensiq","hostnames":["fqtag.com","s.fqtag.com","c.securepaths.com","www.securepaths.com","aux.fqtag.com","c.fqtag.com","cdn.fqtag.com","new.fqtag.com","query.fqtag.com"],"name":"Forensiq","link":"https://www.ghostery.com/whotracksme/trackers/forensiq"},{"id":"wtm_fmadserving","hostnames":["dinsalgsvagt.adservinginternational.com"],"name":"FMAdserving","link":"https://www.ghostery.com/whotracksme/trackers/fmadserving"},{"id":"wtm_flxone","hostnames":["c.flx1.com","j.flxpxl.com"],"name":"FLXONE","link":"https://www.ghostery.com/whotracksme/trackers/flxone"},{"id":"wtm_flite","hostnames":["s.flite.com"],"name":"Flite","link":"https://www.ghostery.com/whotracksme/trackers/flite"},{"id":"wtm_flexoffers","hostnames":["track.flexlinks.com","content.linkoffers.net","track.linkoffers.net"],"name":"FlexOffers","link":"https://www.ghostery.com/whotracksme/trackers/flexoffers"},{"id":"wtm_flag_counter","hostnames":["flagcounter.com","s01.flagcounter.com","s02.flagcounter.com","s03.flagcounter.com","s04.flagcounter.com","s06.flagcounter.com","s07.flagcounter.com","s08.flagcounter.com","s09.flagcounter.com","s11.flagcounter.com","2.s09.flagcounter.com","s10.flagcounter.com","s05.flagcounter.com","www.flagcounter.com"],"name":"Flag Counter","link":"https://www.ghostery.com/whotracksme/trackers/flag_counter"},{"id":"wtm_fit_analytics","hostnames":["widget.fitanalytics.com"],"name":"Fit Analytics","link":"https://www.ghostery.com/whotracksme/trackers/fit_analytics"},{"id":"wtm_financial_content","hostnames":["tracker.financialcontent.com"],"name":"Financial Content","link":"https://www.ghostery.com/whotracksme/trackers/financial_content"},{"id":"wtm_financeads","hostnames":["tools.financeads.net"],"name":"FinanceADs","link":"https://www.ghostery.com/whotracksme/trackers/financeads"},{"id":"wtm_filament.io","hostnames":["filamentapp.s3.amazonaws.com"],"name":"Filament.io","link":"https://www.ghostery.com/whotracksme/trackers/filament.io"},{"id":"wtm_feedperfect","hostnames":["tracking.feedperfect.com"],"name":"FeedPerfect","link":"https://www.ghostery.com/whotracksme/trackers/feedperfect"},{"id":"wtm_feedjit","hostnames":["feedjit.com","log.feedjit.com"],"name":"Feedjit","link":"https://www.ghostery.com/whotracksme/trackers/feedjit"},{"id":"wtm_fathom","hostnames":["quick-esteemed.usefathom.com","collect.usefathom.com","img3.usefathom.com","cdn.usefathom.com"],"name":"Fathom Analytics","link":"https://www.ghostery.com/whotracksme/trackers/fathom"},{"id":"wtm_fastly_insights","hostnames":["fastly-insights.com","www.fastly-insights.com"],"name":"Fastly Insights","link":"https://www.ghostery.com/whotracksme/trackers/fastly_insights"},{"id":"wtm_fanplayr","hostnames":["d1q7pknmpq2wkm.cloudfront.net"],"name":"Fanplayr","link":"https://www.ghostery.com/whotracksme/trackers/fanplayr"},{"id":"wtm_facilitate_digital","hostnames":["adsfac.eu","adsfac.net","adsfac.us"],"name":"Facilitate Digital","link":"https://www.ghostery.com/whotracksme/trackers/facilitate_digital"},{"id":"wtm_facebook_graph","hostnames":["graph.facebook.com"],"name":"Facebook Social Graph","link":"https://www.ghostery.com/whotracksme/trackers/facebook_graph"},{"id":"wtm_facebook","hostnames":["an.facebook.com","pixel.facebook.com"],"name":"Facebook","link":"https://www.ghostery.com/whotracksme/trackers/facebook"},{"id":"wtm_eyeview","hostnames":["eyeviewads.com","track.eyeviewads.com"],"name":"Eyeview","link":"https://www.ghostery.com/whotracksme/trackers/eyeview"},{"id":"wtm_eyereturnmarketing","hostnames":["resources.eyereturn.com","cm.eyereturn.com","bb.o2.eyereturn.com","eyereact.eyereturn.com","o2.eyereturn.com","voken.eyereturn.com"],"name":"Eyereturn Marketing","link":"https://www.ghostery.com/whotracksme/trackers/eyereturnmarketing"},{"id":"wtm_eyeota","hostnames":["eyeota.net","ps.eyeota.net"],"name":"Eyeota","link":"https://www.ghostery.com/whotracksme/trackers/eyeota"},{"id":"wtm_extreme_tracker","hostnames":["extreme-dm.com","e0.extreme-dm.com","e1.extreme-dm.com","e2.extreme-dm.com","nht-2.extreme-dm.com","nht-3.extreme-dm.com","reports.extreme-dm.com","t.extreme-dm.com","t0.extreme-dm.com","t1.extreme-dm.com","u.extreme-dm.com","u0.extreme-dm.com","u1.extreme-dm.com","v0.extreme-dm.com","v1.extreme-dm.com","w.extreme-dm.com","w1.extreme-dm.com","x3.extreme-dm.com","y.extreme-dm.com","y0.extreme-dm.com","y1.extreme-dm.com","z.extreme-dm.com","z0.extreme-dm.com","z1.extreme-dm.com","v.extreme-dm.com","w0.extreme-dm.com","www.extreme-dm.com"],"name":"eXTReMe Tracker","link":"https://www.ghostery.com/whotracksme/trackers/extreme_tracker"},{"id":"wtm_expose_box","hostnames":["server.exposebox.com"],"name":"Expose Box","link":"https://www.ghostery.com/whotracksme/trackers/expose_box"},{"id":"wtm_expo-max","hostnames":["expo-max.com"],"name":"expo-MAX","link":"https://www.ghostery.com/whotracksme/trackers/expo-max"},{"id":"wtm_experian_marketing_services","hostnames":["d.audienceiq.com"],"name":"Experian Marketing Services","link":"https://www.ghostery.com/whotracksme/trackers/experian_marketing_services"},{"id":"wtm_exoticads.com","hostnames":["adserver.exoticads.com"],"name":"exoticads","link":"https://www.ghostery.com/whotracksme/trackers/exoticads.com"},{"id":"wtm_exoclick","hostnames":["exoclick.com","exosrv.com","syndication.exdynsrv.com","www.syndication.exdynsrv.com","ads.exdynsrv.com","secure.exoclick.com","syndication-evo.exoclick.com","www.exoclick.com","main.exoclick.com","syndication.exoclick.com","ads.exoclick.com","ads.exosrv.com","static.exosrv.com","main.exosrv.com","syndication.exosrv.com","a.exdynsrv.com"],"name":"ExoClick","link":"https://www.ghostery.com/whotracksme/trackers/exoclick"},{"id":"wtm_exelate","hostnames":["exelator.com","mydmp.exelator.com","loadeu.exelator.com","cdn.exelator.com","load.exelator.com","ap-central.load.exelator.com","ap-northeast.load.exelator.com","eu-west.load.exelator.com","us-central.load.exelator.com","us-east.load.exelator.com","us-west.load.exelator.com","load-apne1.exelator.com","load77.exelator.com","loada.exelator.com","loadm.exelator.com","loadr.exelator.com","loadus.exelator.com","ssl.exelator.com","tm.ssl.exelator.com","loadus.tm.ssl.exelator.com","vdna.exelator.com"],"name":"eXelate","link":"https://www.ghostery.com/whotracksme/trackers/exelate"},{"id":"wtm_exactag","hostnames":["m.exactag.com","cdn.exactag.com","tp-emea.exactag.com"],"name":"Exactag","link":"https://www.ghostery.com/whotracksme/trackers/exactag"},{"id":"wtm_exact_drive","hostnames":["ads.exactdrive.com"],"name":"Exact Drive","link":"https://www.ghostery.com/whotracksme/trackers/exact_drive"},{"id":"wtm_euroweb_counter","hostnames":["tracker.euroweb.net"],"name":"Euroweb Counter","link":"https://www.ghostery.com/whotracksme/trackers/euroweb_counter"},{"id":"wtm_europecash","hostnames":["newpromo.europacash.com"],"name":"Europecash","link":"https://www.ghostery.com/whotracksme/trackers/europecash"},{"id":"wtm_eulerian","hostnames":["eulerian.net","eultech.fnac.com"],"name":"Eulerian","link":"https://www.ghostery.com/whotracksme/trackers/eulerian"},{"id":"wtm_etrigue","hostnames":["trk.etrigue.com"],"name":"eTrigue","link":"https://www.ghostery.com/whotracksme/trackers/etrigue"},{"id":"wtm_etracker","hostnames":["etracker.com","etracker.de","sedotracker.com","golfpracticetracker.com","www.golfpracticetracker.com","code.etracker.com","static.etracker.com","sitetracker.com","www.sitetracker.com","adexchangetracker.com","www.sedotracker.com"],"name":"etracker","link":"https://www.ghostery.com/whotracksme/trackers/etracker"},{"id":"wtm_etology","hostnames":["pages.etology.com"],"name":"Etology","link":"https://www.ghostery.com/whotracksme/trackers/etology"},{"id":"wtm_etarget","hostnames":["etargetnet.com","search.etargetnet.com","bg.search.etargetnet.com","cz.search.etargetnet.com","hr.search.etargetnet.com","hu.search.etargetnet.com","pl.search.etargetnet.com","ro.search.etargetnet.com","rs.search.etargetnet.com","sk.search.etargetnet.com","bg.static.etargetnet.com","cz.static.etargetnet.com","hr.static.etargetnet.com","hu.static.etargetnet.com","rs.static.etargetnet.com","at.search.etargetnet.com","co.search.etargetnet.com"],"name":"Etarget","link":"https://www.ghostery.com/whotracksme/trackers/etarget"},{"id":"wtm_etag","hostnames":["teste-s3-maycon.s3.amazonaws.com"],"name":"etag","link":"https://www.ghostery.com/whotracksme/trackers/etag"},{"id":"wtm_estat","hostnames":["estat.com","js.cybermonitor.com","stat3.cybermonitor.com","ad.bubblestat.com","stat.onestat.com","www.onestat.com","jmm.livestat.com","www.livestat.com","prof.estat.com","onestat.com","be.sitestat.com","de.sitestat.com","fi.sitestat.com","int.sitestat.com","se.sitestat.com","sitestat.com","uk.sitestat.com"],"name":"eStat","link":"https://www.ghostery.com/whotracksme/trackers/estat"},{"id":"wtm_errorception","hostnames":["d15qhc0lu1ghnk.cloudfront.net","errorception.com","beacon.errorception.com"],"name":"Errorception","link":"https://www.ghostery.com/whotracksme/trackers/errorception"},{"id":"wtm_eroadvertising","hostnames":["ero-advertising.com","data-ero-advertising.com","www.data-ero-advertising.com","0latfee.ero-advertising.com","www.0latfee.ero-advertising.com","2baners.ero-advertising.com","www.2baners.ero-advertising.com","2ds.ero-advertising.com","www.2ds.ero-advertising.com","2fbanners.ero-advertising.com","www.2fbanners.ero-advertising.com","2fflatfee.ero-advertising.com","www.2fflatfee.ero-advertising.com","2fspeedclicks.ero-advertising.com","www.2fspeedclicks.ero-advertising.com","3ds.ero-advertising.com","www.3ds.ero-advertising.com","4anners.ero-advertising.com","www.4anners.ero-advertising.com","9ata.ero-advertising.com","www.9ata.ero-advertising.com","www.a.ero-advertising.com","aata.ero-advertising.com","www.aata.ero-advertising.com","acspaces.ero-advertising.com","www.acspaces.ero-advertising.com","ad1.ero-advertising.com","www.ad1.ero-advertising.com","ad2.ero-advertising.com","www.ad2.ero-advertising.com","s7.adaces.ero-advertising.com","www.s7.adaces.ero-advertising.com","adf.ero-advertising.com","www.adf.ero-advertising.com","adfpaces.ero-advertising.com","www.adfpaces.ero-advertising.com","ads1.ero-advertising.com","www.ads1.ero-advertising.com","adsances.ero-advertising.com","www.adsances.ero-advertising.com","adspacds.ero-advertising.com","www.adspacds.ero-advertising.com","adspaces2.ero-advertising.com","www.adspaces2.ero-advertising.com","adspaes.ero-advertising.com","www.adspaes.ero-advertising.com","adspages.ero-advertising.com","www.adspages.ero-advertising.com","adspcces.ero-advertising.com","www.adspcces.ero-advertising.com","adsspaces.ero-advertising.com","www.adsspaces.ero-advertising.com","adstaces.ero-advertising.com","www.adstaces.ero-advertising.com","adw.ero-advertising.com","www.adw.ero-advertising.com","adwpaces.ero-advertising.com","www.adwpaces.ero-advertising.com","afs.ero-advertising.com","www.afs.ero-advertising.com","analytics.ero-advertising.com","www.analytics.ero-advertising.com","anners.ero-advertising.com","www.anners.ero-advertising.com","ad0.api.ero-advertising.com","www.ad0.api.ero-advertising.com","ad1.api.ero-advertising.com","www.ad1.api.ero-advertising.com","ad2.api.ero-advertising.com","www.ad2.api.ero-advertising.com","ad3.api.ero-advertising.com","www.ad3.api.ero-advertising.com","ad4.api.ero-advertising.com","www.ad4.api.ero-advertising.com","ad7.api.ero-advertising.com","www.ad7.api.ero-advertising.com","ad8.api.ero-advertising.com","www.ad8.api.ero-advertising.com","ata.ero-advertising.com","www.ata.ero-advertising.com","ban3ers.ero-advertising.com","www.ban3ers.ero-advertising.com","ban4ers.ero-advertising.com","www.ban4ers.ero-advertising.com","banjers.ero-advertising.com","www.banjers.ero-advertising.com","bann12s.ero-advertising.com","www.bann12s.ero-advertising.com","bann13s.ero-advertising.com","www.bann13s.ero-advertising.com","bann14s.ero-advertising.com","www.bann14s.ero-advertising.com","bann1rs.ero-advertising.com","www.bann1rs.ero-advertising.com","banne2s.ero-advertising.com","www.banne2s.ero-advertising.com","banne3s.ero-advertising.com","www.banne3s.ero-advertising.com","banne4s.ero-advertising.com","www.banne4s.ero-advertising.com","banner.ero-advertising.com","www.banner.ero-advertising.com","ad0.banners.ero-advertising.com","www.ad0.banners.ero-advertising.com","ad1.banners.ero-advertising.com","www.ad1.banners.ero-advertising.com","ad2.banners.ero-advertising.com","www.ad2.banners.ero-advertising.com","ad3.banners.ero-advertising.com","www.ad3.banners.ero-advertising.com","ad4.banners.ero-advertising.com","www.ad4.banners.ero-advertising.com","ad5.banners.ero-advertising.com","www.ad5.banners.ero-advertising.com","ad6.banners.ero-advertising.com","www.ad6.banners.ero-advertising.com","ad7.banners.ero-advertising.com","www.ad7.banners.ero-advertising.com","ad8.banners.ero-advertising.com","www.ad8.banners.ero-advertising.com","www.banners.ero-advertising.com","banners1.ero-advertising.com","www.banners1.ero-advertising.com","www.banners2.ero-advertising.com","bannevs.ero-advertising.com","www.bannevs.ero-advertising.com","bavners2.ero-advertising.com","www.bavners2.ero-advertising.com","blatfee.ero-advertising.com","www.blatfee.ero-advertising.com","blog.ero-advertising.com","btw.ero-advertising.com","www.btw.ero-advertising.com","cata.ero-advertising.com","www.cata.ero-advertising.com","chat.ero-advertising.com","www.chat.ero-advertising.com","www.ero-adverising.com.ero-advertising.com","s10.histats.com.ero-advertising.com","www.s10.histats.com.ero-advertising.com","cyhners.ero-advertising.com","www.cyhners.ero-advertising.com","daaa.ero-advertising.com","www.daaa.ero-advertising.com","daea.ero-advertising.com","www.daea.ero-advertising.com","daia.ero-advertising.com","www.daia.ero-advertising.com","dat2.ero-advertising.com","www.dat2.ero-advertising.com","data2.ero-advertising.com","ad0.data2.ero-advertising.com","www.ad0.data2.ero-advertising.com","forums.data2.ero-advertising.com","www.forums.data2.ero-advertising.com","stats.data2.ero-advertising.com","www.stats.data2.ero-advertising.com","www.data2.ero-advertising.com","date.ero-advertising.com","www.date.ero-advertising.com","dats.ero-advertising.com","www.dats.ero-advertising.com","datt.ero-advertising.com","www.datt.ero-advertising.com","daua.ero-advertising.com","www.daua.ero-advertising.com","dava.ero-advertising.com","www.dava.ero-advertising.com","dawa.ero-advertising.com","www.dawa.ero-advertising.com","dbta.ero-advertising.com","www.dbta.ero-advertising.com","deta.ero-advertising.com","www.deta.ero-advertising.com","dtta.ero-advertising.com","www.dtta.ero-advertising.com","e-hpaces.ero-advertising.com","www.e-hpaces.ero-advertising.com","eedclicks.ero-advertising.com","www.eedclicks.ero-advertising.com","adspaces.ero-ades.ero-advertising.com","www.adspaces.ero-ades.ero-advertising.com","adspaces.ero-apaces.ero-advertising.com","www.adspaces.ero-apaces.ero-advertising.com","ers.ero-advertising.com","www.ers.ero-advertising.com","es.ero-advertising.com","www.es.ero-advertising.com","fanners.ero-advertising.com","www.fanners.ero-advertising.com","fata.ero-advertising.com","www.fata.ero-advertising.com","fhatfee.ero-advertising.com","www.fhatfee.ero-advertising.com","flashtest.ero-advertising.com","www.flashtest.ero-advertising.com","flatdee.ero-advertising.com","www.flatdee.ero-advertising.com","flatfae.ero-advertising.com","www.flatfae.ero-advertising.com","flatfea.ero-advertising.com","www.flatfea.ero-advertising.com","flatfee.ero-advertising.com","www.flatfee.ero-advertising.com","flw.ero-advertising.com","www.flw.ero-advertising.com","fnatfee.ero-advertising.com","www.fnatfee.ero-advertising.com","forum.ero-advertising.com","www.forum.ero-advertising.com","forums.ero-advertising.com","www.forums.ero-advertising.com","fpa.ero-advertising.com","ad3.fpa.ero-advertising.com","www.ad3.fpa.ero-advertising.com","ad5.fpa.ero-advertising.com","www.ad5.fpa.ero-advertising.com","www.fpa.ero-advertising.com","gata.ero-advertising.com","www.gata.ero-advertising.com","hata.ero-advertising.com","www.hata.ero-advertising.com","s10.hiadspaces.ero-advertising.com","www.s10.hiadspaces.ero-advertising.com","s10.hipaces.ero-advertising.com","www.s10.hipaces.ero-advertising.com","s10.his.ero-advertising.com","www.s10.his.ero-advertising.com","s10.hispaces.ero-advertising.com","www.s10.hispaces.ero-advertising.com","s10.histas.ero-advertising.com","www.s10.histas.ero-advertising.com","idspaces.ero-advertising.com","www.idspaces.ero-advertising.com","www.imads.ero-advertising.com","imeds.ero-advertising.com","www.imeds.ero-advertising.com","intext.ero-advertising.com","blog.intext.ero-advertising.com","www.blog.intext.ero-advertising.com","www.intext.ero-advertising.com","ioads.ero-advertising.com","www.ioads.ero-advertising.com","phpmyadmin.js.ero-advertising.com","www.phpmyadmin.js.ero-advertising.com","kds.ero-advertising.com","www.kds.ero-advertising.com","ad4.layerads.ero-advertising.com","www.ad4.layerads.ero-advertising.com","layers.ero-advertising.com","www.layers.ero-advertising.com","mata.ero-advertising.com","www.mata.ero-advertising.com","miami.ero-advertising.com","www.miami.ero-advertising.com","mobileads.ero-advertising.com","www.mobileads.ero-advertising.com","movieads.ero-advertising.com","www.movieads.ero-advertising.com","mx.ero-advertising.com","www.mx.ero-advertising.com","mybb.ero-advertising.com","www.mybb.ero-advertising.com","nata.ero-advertising.com","www.nata.ero-advertising.com","nl1.ero-advertising.com","www.nl1.ero-advertising.com","nl2.ero-advertising.com","www.nl2.ero-advertising.com","nners.ero-advertising.com","www.nners.ero-advertising.com","oata.ero-advertising.com","www.oata.ero-advertising.com","opads.ero-advertising.com","www.opads.ero-advertising.com","tcm.optica.ero-advertising.com","www.tcm.optica.ero-advertising.com","pagepeel.ero-advertising.com","www.pagepeel.ero-advertising.com","pata.ero-advertising.com","www.pata.ero-advertising.com","phpmyadmin.ero-advertising.com","www.phpmyadmin.ero-advertising.com","piwik.ero-advertising.com","www.piwik.ero-advertising.com","popacs.ero-advertising.com","www.popacs.ero-advertising.com","www.popads.ero-advertising.com","rata.ero-advertising.com","www.rata.ero-advertising.com","redirect.ero-advertising.com","www.redirect.ero-advertising.com","rs.ero-advertising.com","www.rs.ero-advertising.com","rs2.ero-advertising.com","www.rs2.ero-advertising.com","s.ero-advertising.com","www.s.ero-advertising.com","s10paces.ero-advertising.com","www.s10paces.ero-advertising.com","sin.ero-advertising.com","www.sin.ero-advertising.com","smtp.ero-advertising.com","www.smtp.ero-advertising.com","spaces.ero-advertising.com","www.spaces.ero-advertising.com","speed4cksa.ero-advertising.com","www.speed4cksa.ero-advertising.com","speedclecks.ero-advertising.com","www.speedclecks.ero-advertising.com","stats.speedclicks.ero-advertising.com","www.stats.speedclicks.ero-advertising.com","www.speedclicks.ero-advertising.com","speedclics.ero-advertising.com","www.speedclics.ero-advertising.com","speedlicks.ero-advertising.com","www.speedlicks.ero-advertising.com","speeuclicks.ero-advertising.com","www.speeuclicks.ero-advertising.com","stats.ero-advertising.com","www.stats.ero-advertising.com","tex.ero-advertising.com","www.tex.ero-advertising.com","thumb.ero-advertising.com","www.thumb.ero-advertising.com","thumbads.ero-advertising.com","www.thumbads.ero-advertising.com","ad2.thumbs.ero-advertising.com","www.ad2.thumbs.ero-advertising.com","ad4.thumbs.ero-advertising.com","www.ad4.thumbs.ero-advertising.com","ad7.thumbs.ero-advertising.com","www.ad7.thumbs.ero-advertising.com","thumbs2.ero-advertising.com","www.thumbs2.ero-advertising.com","tiumbs.ero-advertising.com","www.tiumbs.ero-advertising.com","topads.ero-advertising.com","www.topads.ero-advertising.com","tracking.ero-advertising.com","www.tracking.ero-advertising.com","typo3.ero-advertising.com","www.typo3.ero-advertising.com","umbs.ero-advertising.com","www.umbs.ero-advertising.com","users.ero-advertising.com","www.users.ero-advertising.com","wdata.ero-advertising.com","www.wdata.ero-advertising.com","steenbergen.web.ero-advertising.com","www.steenbergen.web.ero-advertising.com","wiki.ero-advertising.com","www.wiki.ero-advertising.com","wks.ero-advertising.com","www.wks.ero-advertising.com","wow.ero-advertising.com","www.wow.ero-advertising.com","wsw.ero-advertising.com","www.wsw.ero-advertising.com","wta.ero-advertising.com","www.wta.ero-advertising.com","ww2.ero-advertising.com","www.ww2.ero-advertising.com","wwa.ero-advertising.com","www.wwa.ero-advertising.com","wwbanners2.ero-advertising.com","www.wwbanners2.ero-advertising.com","wws.ero-advertising.com","www.wws.ero-advertising.com","www.ero-advertising.com","thumbs.xlaces.ero-advertising.com","www.thumbs.xlaces.ero-advertising.com","xn--adspace-kvg.ero-advertising.com","www.xn--adspace-kvg.ero-advertising.com","zww.ero-advertising.com","www.zww.ero-advertising.com","ads.ero-advertising.com","adspaces.ero-advertising.com","api.ero-advertising.com","apo.ero-advertising.com","banners.ero-advertising.com","data.ero-advertising.com","invideo.ero-advertising.com","layerads.ero-advertising.com","redirects.ero-advertising.com","speedclicks.ero-advertising.com","thumbs.ero-advertising.com","ads2.ero-advertising.com","askjolene.ero-advertising.com","banners2.ero-advertising.com","imads.ero-advertising.com","js.ero-advertising.com","popads.ero-advertising.com","tracker.ero-advertising.com","pops.ero-advertising.com","data-failover.eroadvertising.com","data.eroadvertising.com"],"name":"EroAdvertising","link":"https://www.ghostery.com/whotracksme/trackers/eroadvertising"},{"id":"wtm_eqworks","hostnames":["eqads.com","ads.eqads.com","e-ads.eqads.com","ads2.eqads.com","ads3.eqads.com","um2.eqads.com","um3.eqads.com"],"name":"EQWorks","link":"https://www.ghostery.com/whotracksme/trackers/eqworks"},{"id":"wtm_eproof","hostnames":["keisu02.eproof.com"],"name":"eProof","link":"https://www.ghostery.com/whotracksme/trackers/eproof"},{"id":"wtm_epic_marketplace","hostnames":["ad.trafficmp.com","images.trafficmp.com"],"name":"Epic Marketplace","link":"https://www.ghostery.com/whotracksme/trackers/epic_marketplace"},{"id":"wtm_epic_game_ads","hostnames":["www.epicgameads.com"],"name":"Epic Game Ads","link":"https://www.ghostery.com/whotracksme/trackers/epic_game_ads"},{"id":"wtm_eperflex","hostnames":["email-reflex.com"],"name":"Eperflex","link":"https://www.ghostery.com/whotracksme/trackers/eperflex"},{"id":"wtm_ensemble","hostnames":["ats.tumri.net"],"name":"Ensemble","link":"https://www.ghostery.com/whotracksme/trackers/ensemble"},{"id":"wtm_enreach","hostnames":["adtlgc.com","code2.adtlgc.com","code.adtlgc.com","abseckw.adtlgc.com","core2.adtlgc.com","keywords.adtlgc.com","stampen.adtlgc.com","svd.adtlgc.com","svd2.adtlgc.com","admp-tc-sati.adtlgc.com","code3.adtlgc.com"],"name":"Enreach","link":"https://www.ghostery.com/whotracksme/trackers/enreach"},{"id":"wtm_enquisite","hostnames":["enquisite.com"],"name":"Enquisite","link":"https://www.ghostery.com/whotracksme/trackers/enquisite"},{"id":"wtm_enecto_analytics","hostnames":["trk.enecto.com"],"name":"Enecto Analytics","link":"https://www.ghostery.com/whotracksme/trackers/enecto_analytics"},{"id":"wtm_emnet","hostnames":["adinsight.co.kr"],"name":"eMnet","link":"https://www.ghostery.com/whotracksme/trackers/emnet"},{"id":"wtm_emetriq","hostnames":["emetriq.de","dyn.emetriq.de"],"name":"emetriq","link":"https://www.ghostery.com/whotracksme/trackers/emetriq"},{"id":"wtm_emediate","hostnames":["ad1.emediate.dk","cdn2.emediate.eu","cdn6.emediate.eu","eas4.emediate.eu"],"name":"Emediate","link":"https://www.ghostery.com/whotracksme/trackers/emediate"},{"id":"wtm_emarketeer","hostnames":["app.emarketeer.com"],"name":"emarketeer","link":"https://www.ghostery.com/whotracksme/trackers/emarketeer"},{"id":"wtm_email_attitude","hostnames":["tag.email-attitude.com"],"name":"Email Attitude","link":"https://www.ghostery.com/whotracksme/trackers/email_attitude"},{"id":"wtm_email_aptitude","hostnames":["tracker.emailaptitude.com"],"name":"Email Aptitude","link":"https://www.ghostery.com/whotracksme/trackers/email_aptitude"},{"id":"wtm_eloqua","hostnames":["s1415903351.t.eloqua.com","now.eloqua.com","s323.t.eloqua.com","s1184.t.eloqua.com","s1325.t.eloqua.com","s1471.t.eloqua.com","s1481.t.eloqua.com","s2150.t.eloqua.com","s3015.t.eloqua.com","t.eloqua.com","overwritten25.com","www.overwritten25.com","t.en25.com","img.en25.com"],"name":"Eloqua","link":"https://www.ghostery.com/whotracksme/trackers/eloqua"},{"id":"wtm_elastic_beanstalk","hostnames":["ad-logging2.ap-northeast-2.elasticbeanstalk.com","bugsee-api-prod.elasticbeanstalk.com","kerio-push-gateway-prod.elasticbeanstalk.com","cbola-psa.us-east-1.elasticbeanstalk.com","ts-tracker-env.us-east-1.elasticbeanstalk.com","ts-tracker-env-2.us-east-1.elasticbeanstalk.com","production-adkviewtrackingtagserver.ap-northeast-1.elasticbeanstalk.com","tp-rtb-adserver-eu.eu-west-1.elasticbeanstalk.com","fusion-iad-dev-clogs-eqbrmmvphc.elasticbeanstalk.com","mgd-adengine.elasticbeanstalk.com","poole-collector-prod.bnsqc3zmvt.us-east-1.elasticbeanstalk.com","cbola-ads-1-t3.us-east-1.elasticbeanstalk.com","cbola-analytics-c5-6.us-east-1.elasticbeanstalk.com","cbola-content-1-t3.us-east-1.elasticbeanstalk.com","cbola-logging-1-t3.us-east-1.elasticbeanstalk.com","dhg-logging.us-east-1.elasticbeanstalk.com","ei-event-collector.us-east-1.elasticbeanstalk.com","adlic.us-west-2.elasticbeanstalk.com","api-gateway.us-west-2.elasticbeanstalk.com","wpsconfig4svr.elasticbeanstalk.com"],"name":"Elastic Beanstalk","link":"https://www.ghostery.com/whotracksme/trackers/elastic_beanstalk"},{"id":"wtm_elastic_ad","hostnames":["cdn.elasticad.net"],"name":"Elastic Ad","link":"https://www.ghostery.com/whotracksme/trackers/elastic_ad"},{"id":"wtm_ekmpinpoint","hostnames":["global.ekmpinpoint.com"],"name":"ekmPinPoint","link":"https://www.ghostery.com/whotracksme/trackers/ekmpinpoint"},{"id":"wtm_effiliation","hostnames":["mastertag.effiliation.com","track.effiliation.com"],"name":"Effiliation","link":"https://www.ghostery.com/whotracksme/trackers/effiliation"},{"id":"wtm_effective_measure","hostnames":["effectivemeasure.net","detect-survey.effectivemeasure.net","pk-cdn.effectivemeasure.net","th-cdn.effectivemeasure.net","my-cdn.effectivemeasure.net","za-ssl.effectivemeasure.net","me-ssl.effectivemeasure.net","nz-ssl.effectivemeasure.net","cf.effectivemeasure.net","us-cdn.effectivemeasure.net","in-cdn.effectivemeasure.net","me-cdn.effectivemeasure.net","za-cdn.effectivemeasure.net","www8.effectivemeasure.net","au.effectivemeasure.net","id-cdn.effectivemeasure.net","me.effectivemeasure.net","my.effectivemeasure.net","sea.effectivemeasure.net","yahoo.effectivemeasure.net","www6.effectivemeasure.net","www8-ssl.effectivemeasure.net","www9.effectivemeasure.net","www.effectivemeasure.net","au-cdn.effectivemeasure.net","c.effectivemeasure.net","nz-cdn.effectivemeasure.net","ph-cdn.effectivemeasure.net","sg-cdn.effectivemeasure.net","msn-cdn.effectivemeasure.net","collector.effectivemeasure.net","my-ssl.effectivemeasure.net","s.effectivemeasure.net","sg-ssl.effectivemeasure.net","t.effectivemeasure.net"],"name":"Effective Measure","link":"https://www.ghostery.com/whotracksme/trackers/effective_measure"},{"id":"wtm_ecotag","hostnames":["eco-tag.jp"],"name":"ecotag","link":"https://www.ghostery.com/whotracksme/trackers/ecotag"},{"id":"wtm_eclick","hostnames":["eclick.vn","admin.iad.eclick.vn","analytics.eclick.vn","c.d.eclick.vn","c.eclick.vn","cpm.d.eclick.vn","cpm.eclick.vn","cpm.j.eclick.vn","d.eclick.vn","dmp.eclick.vn","e.eclick.vn","emarketing.eclick.vn","g.eclick.vn","iad.eclick.vn","img.eclick.vn","imgportal.eclick.vn","j.eclick.vn","l.a.eclick.vn","l.d.eclick.vn","la.eclick.vn","la2.eclick.vn","log.d.eclick.vn","log.eclick.vn","log.pv.eclick.vn","log.pv1.eclick.vn","r.eclick.vn","rtb.eclick.vn","s.eclick.vn","scdn.eclick.vn","st.a.eclick.vn","st.admin.iad.eclick.vn","st.eclick.vn","st.l.a.eclick.vn","staging.j.eclick.vn","static.eclick.vn","stiad.eclick.vn","stla.eclick.vn","stportal.eclick.vn","t.d.eclick.vn","t.eclick.vn","tracking.eclick.vn","www.eclick.vn","csmads.gameclick.vn"],"name":"eClick","link":"https://www.ghostery.com/whotracksme/trackers/eclick"},{"id":"wtm_ebay_partner_network","hostnames":["adn.ebay.com"],"name":"eBay Partner Network","link":"https://www.ghostery.com/whotracksme/trackers/ebay_partner_network"},{"id":"wtm_ebay_korea","hostnames":["ad.about.co.kr","adcheck.about.co.kr"],"name":"eBay Korea","link":"https://www.ghostery.com/whotracksme/trackers/ebay_korea"},{"id":"wtm_ebay","hostnames":["smetrics.thebay.com","agebay.com","www.agebay.com","adn.ebay.com","secureir.ebaystatic.com"],"name":"eBay Stats","link":"https://www.ghostery.com/whotracksme/trackers/ebay"},{"id":"wtm_easyads","hostnames":["media.easyads.bg"],"name":"EasyAds","link":"https://www.ghostery.com/whotracksme/trackers/easyads"},{"id":"wtm_earnify_tracker","hostnames":["www.earnify.com","cdn.earnify.com"],"name":"Earnify","link":"https://www.ghostery.com/whotracksme/trackers/earnify_tracker"},{"id":"wtm_e-planning","hostnames":["e-planning.net","ads.e-planning.net","ads.eu.e-planning.net","i.e-planning.net","ads.us.e-planning.net"],"name":"e-planning","link":"https://www.ghostery.com/whotracksme/trackers/e-planning"},{"id":"wtm_dynatrace.com","hostnames":["bf20578xco.bf.dynatrace.com","js-cdn.dynatrace.com"],"name":"Dynatrace","link":"https://www.ghostery.com/whotracksme/trackers/dynatrace.com"},{"id":"wtm_dynata","hostnames":["beacons.hottraffic.nl"],"name":"Dynata","link":"https://www.ghostery.com/whotracksme/trackers/dynata"},{"id":"wtm_dynamic_logic","hostnames":["content.dl-rms.com","questionmarket.com","amch.questionmarket.com"],"name":"Dynamic Logic","link":"https://www.ghostery.com/whotracksme/trackers/dynamic_logic"},{"id":"wtm_dynad","hostnames":["dft.cl.dynad.net","static.dynad.net","a.dynad.net","c.dynad.net","s.dynad.net","t.dynad.net","z.dynad.net"],"name":"DynAd","link":"https://www.ghostery.com/whotracksme/trackers/dynad"},{"id":"wtm_dudamobile","hostnames":["dd-cdn.multiscreensite.com","px.multiscreensite.com"],"name":"DudaMobile","link":"https://www.ghostery.com/whotracksme/trackers/dudamobile"},{"id":"wtm_dtscout.com","hostnames":["dtscout.com","e.dtscout.com","t.dtscout.com"],"name":"DTScout","link":"https://www.ghostery.com/whotracksme/trackers/dtscout.com"},{"id":"wtm_dstillery","hostnames":["media6degrees.com","action.media6degrees.com","cspix.media6degrees.com","secure.media6degrees.com","cdn.media6degrees.com","map.media6degrees.com","idpix.media6degrees.com"],"name":"Dstillery","link":"https://www.ghostery.com/whotracksme/trackers/dstillery"},{"id":"wtm_dsnr_media_group","hostnames":["an.z5x.net"],"name":"DSNR Media Group","link":"https://www.ghostery.com/whotracksme/trackers/dsnr_media_group"},{"id":"wtm_doublepimp","hostnames":["doublepimp.com","engine.phn.doublepimp.com","cdn.engine.phn.doublepimp.com","rts.phn.doublepimp.com","ad1.doublepimp.com","ad2.doublepimp.com","dev.doublepimp.com","rts.doublepimp.com","streamate.doublepimp.com","cdn.doublepimpssl.com"],"name":"DoublePimp","link":"https://www.ghostery.com/whotracksme/trackers/doublepimp"},{"id":"wtm_dotomi","hostnames":["dotomi.com","login.dotomi.com","web.hb.ad.cpe.dotomi.com","ads.dotomi.com","iad-login.dotomi.com","cache.dtmpub.com","prebid-match.dotomi.com"],"name":"Dotomi","link":"https://www.ghostery.com/whotracksme/trackers/dotomi"},{"id":"wtm_dotmetrics.net","hostnames":["dotmetrics.net","script.dotmetrics.net","test-script.dotmetrics.net","uk-script.dotmetrics.net"],"name":"Dotmetrics","link":"https://www.ghostery.com/whotracksme/trackers/dotmetrics.net"},{"id":"wtm_dotandmedia","hostnames":["ad2.bal.dotandad.com","cdn5.js.ad.dotandad.com","filecdn2.dotandad.com"],"name":"DotAndMedia","link":"https://www.ghostery.com/whotracksme/trackers/dotandmedia"},{"id":"wtm_dogannet","hostnames":["s.dogannet.tv"],"name":"Dogannet","link":"https://www.ghostery.com/whotracksme/trackers/dogannet"},{"id":"wtm_dmm","hostnames":["dmm.co.jp","aqua.dmm.co.jp"],"name":"DMM","link":"https://www.ghostery.com/whotracksme/trackers/dmm"},{"id":"wtm_dm2","hostnames":["ads.d-msquared.com"],"name":"DM2","link":"https://www.ghostery.com/whotracksme/trackers/dm2"},{"id":"wtm_divvit","hostnames":["tag.divvit.com"],"name":"Divvit","link":"https://www.ghostery.com/whotracksme/trackers/divvit"},{"id":"wtm_distroscale","hostnames":["jsrdn.com","a.jsrdn.com","i.jsrdn.com","c.jsrdn.com","s.jsrdn.com"],"name":"Distroscale","link":"https://www.ghostery.com/whotracksme/trackers/distroscale"},{"id":"wtm_districtm.io","hostnames":["districtm.ca","districtm.io","st.districtm.ca","cdn.districtm.ca","prebid.districtm.ca","cdn.districtm.io","dmx.districtm.io"],"name":"district m","link":"https://www.ghostery.com/whotracksme/trackers/districtm.io"},{"id":"wtm_disqus_ads","hostnames":["disqusads.com"],"name":"Disqus Ads","link":"https://www.ghostery.com/whotracksme/trackers/disqus_ads"},{"id":"wtm_display_block","hostnames":["d81mfvml8p5ml.cloudfront.net"],"name":"display block","link":"https://www.ghostery.com/whotracksme/trackers/display_block"},{"id":"wtm_directrev","hostnames":["directrev.com","ad.directrev.com","cdn.directrev.com","re.directrev.com"],"name":"DirectREV","link":"https://www.ghostery.com/whotracksme/trackers/directrev"},{"id":"wtm_dihitt_badge","hostnames":["widget.dihitt.com.br"],"name":"diHITT Badge","link":"https://www.ghostery.com/whotracksme/trackers/dihitt_badge"},{"id":"wtm_digiteka","hostnames":["galoremultimedia.com","productoresmultimedia.com","www.galoremultimedia.com","www.productoresmultimedia.com","adssrv.nationmultimedia.com"],"name":"Digiteka","link":"https://www.ghostery.com/whotracksme/trackers/digiteka"},{"id":"wtm_digital.gov","hostnames":["dap.digitalgov.gov"],"name":"Digital.gov","link":"https://www.ghostery.com/whotracksme/trackers/digital.gov"},{"id":"wtm_digital_window","hostnames":["www.dwin1.com"],"name":"Digital Window","link":"https://www.ghostery.com/whotracksme/trackers/digital_window"},{"id":"wtm_digital_river","hostnames":["directtrack.com","track.digitalriver.com","sideshow.directtrack.com","gozing.directtrack.com","images.directtrack.com","img.directtrack.com","show.onenetworkdirect.net"],"name":"Digital River","link":"https://www.ghostery.com/whotracksme/trackers/digital_river"},{"id":"wtm_digital_remedy","hostnames":["adreadytractions.com","cpxinteractive.com","a.adready.com","www.adreadytractions.com","cdn.cpxinteractive.com","ads.cpxinteractive.com"],"name":"Digital Remedy","link":"https://www.ghostery.com/whotracksme/trackers/digital_remedy"},{"id":"wtm_digital_nomads","hostnames":["adtag.cc"],"name":"Digital Nomads","link":"https://www.ghostery.com/whotracksme/trackers/digital_nomads"},{"id":"wtm_digioh","hostnames":["s3.lightboxcdn.com","www.lightboxcdn.com"],"name":"Digioh","link":"https://www.ghostery.com/whotracksme/trackers/digioh"},{"id":"wtm_digilant","hostnames":["wtp101.com","www.wtp101.com"],"name":"Digilant","link":"https://www.ghostery.com/whotracksme/trackers/digilant"},{"id":"wtm_digidip","hostnames":["dealabs.digidip.net"],"name":"Digidip","link":"https://www.ghostery.com/whotracksme/trackers/digidip"},{"id":"wtm_didit_maestro","hostnames":["track.did-it.com"],"name":"Didit Maestro","link":"https://www.ghostery.com/whotracksme/trackers/didit_maestro"},{"id":"wtm_didit_blizzard","hostnames":["tag.didit.com"],"name":"Didit Blizzard","link":"https://www.ghostery.com/whotracksme/trackers/didit_blizzard"},{"id":"wtm_dianomi","hostnames":["d3von6il1wr7wo.cloudfront.net","dianomi.com","dianomioffers.co.uk","www.dianomi.com","www.smartlinks.dianomi.com","www.dianomioffers.co.uk"],"name":"Dianomi","link":"https://www.ghostery.com/whotracksme/trackers/dianomi"},{"id":"wtm_dgm","hostnames":["s2d6.com","www.s2d6.com"],"name":"dgm","link":"https://www.ghostery.com/whotracksme/trackers/dgm"},{"id":"wtm_dex_platform","hostnames":["my.blueadvertise.com"],"name":"DEX Platform","link":"https://www.ghostery.com/whotracksme/trackers/dex_platform"},{"id":"wtm_deqwas","hostnames":["deqwas.net"],"name":"Deqwas","link":"https://www.ghostery.com/whotracksme/trackers/deqwas"},{"id":"wtm_delta_projects","hostnames":["de17a.com","d5p.de17a.com","tb.de17a.com"],"name":"Delta Projects","link":"https://www.ghostery.com/whotracksme/trackers/delta_projects"},{"id":"wtm_delivr","hostnames":["tracking.percentmobile.com"],"name":"Delivr","link":"https://www.ghostery.com/whotracksme/trackers/delivr"},{"id":"wtm_deepintent.com","hostnames":["deepintent.com","apsoutheast-match.deepintent.com","beacon.deepintent.com","cdn.deepintent.com","match.deepintent.com","prebid.deepintent.com","useast-beacon.deepintent.com"],"name":"DeepIntent","link":"https://www.ghostery.com/whotracksme/trackers/deepintent.com"},{"id":"wtm_dedicated_media","hostnames":["ads.dedicatedmedia.com"],"name":"Dedicated Media","link":"https://www.ghostery.com/whotracksme/trackers/dedicated_media"},{"id":"wtm_decibel_insight","hostnames":["api.decibelinsight.net","d806-us.api.decibelinsight.net","cdn.decibelinsight.net","collection.decibelinsight.net"],"name":"Decibel Insight","link":"https://www.ghostery.com/whotracksme/trackers/decibel_insight"},{"id":"wtm_de_persgroep","hostnames":["statslogger.rocket.persgroep.cloud"],"name":"De Persgroep","link":"https://www.ghostery.com/whotracksme/trackers/de_persgroep"},{"id":"wtm_dc_stormiq","hostnames":["dc-storm.com","tracking.dc-storm.com"],"name":"DC StormIQ","link":"https://www.ghostery.com/whotracksme/trackers/dc_stormiq"},{"id":"wtm_datonics","hostnames":["pro-market.net","ado.pro-market.net","pbid.pro-market.net","fei.pro-market.net","ads.pro-market.net"],"name":"Datonics","link":"https://www.ghostery.com/whotracksme/trackers/datonics"},{"id":"wtm_dataxu","hostnames":["w55c.net","cts.w55c.net","ads.w55c.net","i.w55c.net","pm.w55c.net","tags.w55c.net","cti.w55c.net"],"name":"DataXu","link":"https://www.ghostery.com/whotracksme/trackers/dataxu"},{"id":"wtm_dataxpand","hostnames":["dataxpand.script.ag","tc.dataxpand.com"],"name":"Dataxpand","link":"https://www.ghostery.com/whotracksme/trackers/dataxpand"},{"id":"wtm_datawrkz","hostnames":["adunits.datawrkz.com"],"name":"Datawrkz","link":"https://www.ghostery.com/whotracksme/trackers/datawrkz"},{"id":"wtm_datadome","hostnames":["api-sdk.datadome.co"],"name":"DataDome","link":"https://www.ghostery.com/whotracksme/trackers/datadome"},{"id":"wtm_dashboard_ad","hostnames":["tags.dashboardad.net"],"name":"Dashboard Ad","link":"https://www.ghostery.com/whotracksme/trackers/dashboard_ad"},{"id":"wtm_danawa","hostnames":["ad.danawa.com","las.danawa.com"],"name":"Danawa","link":"https://www.ghostery.com/whotracksme/trackers/danawa"},{"id":"wtm_da-ads.com","hostnames":["www.da-ads.com"],"name":"da-ads.com","link":"https://www.ghostery.com/whotracksme/trackers/da-ads.com"},{"id":"wtm_cyber_wing","hostnames":["cyberwing.co.jp"],"name":"Cyber Wing","link":"https://www.ghostery.com/whotracksme/trackers/cyber_wing"},{"id":"wtm_cxense","hostnames":["cxense.com","comcluster.cxense.com","api.cxense.com","cdn.cxense.com","csyn.cxense.com","csyn-r.cxense.com","cxad.cxense.com","id.cxense.com","p1cluster.cxense.com","scdn.cxense.com","scomcluster.cxense.com","sp1cluster.cxense.com","tsrid.cxense.com","rscdn.cxense.com","s-adserver.cxad.cxense.com","adserver.sandbox.cxad.cxense.com","s-adserver.sandbox.cxad.cxense.com","adserver.cxad.cxense.com"],"name":"cXense","link":"https://www.ghostery.com/whotracksme/trackers/cxense"},{"id":"wtm_cup_interactive","hostnames":["cdn.cupinteractive.com"],"name":"Cup Interactive","link":"https://www.ghostery.com/whotracksme/trackers/cup_interactive"},{"id":"wtm_crowdynews","hostnames":["our.glossip.nl","widget.breakingburner.com","widget.crowdynews.com"],"name":"Crowdynews","link":"https://www.ghostery.com/whotracksme/trackers/crowdynews"},{"id":"wtm_crowd_science","hostnames":["static.crowdscience.com"],"name":"Crowd Science","link":"https://www.ghostery.com/whotracksme/trackers/crowd_science"},{"id":"wtm_crowd_ignite","hostnames":["widget.crowdignite.com"],"name":"Crowd Ignite","link":"https://www.ghostery.com/whotracksme/trackers/crowd_ignite"},{"id":"wtm_crosspixel","hostnames":["crsspxl.com","pixel.crosspixel.net","script.crsspxl.com","tag.crsspxl.com"],"name":"Cross Pixel","link":"https://www.ghostery.com/whotracksme/trackers/crosspixel"},{"id":"wtm_crimtan","hostnames":["ctnsnet.com","i.ctnsnet.com"],"name":"Crimtan","link":"https://www.ghostery.com/whotracksme/trackers/crimtan"},{"id":"wtm_crazy_egg","hostnames":["cetrk.com","crazyegg.com","dnn506yrbagrg.cloudfront.net","new.cetrk.com","trk.cetrk.com","sample-api-v2.crazyegg.com","script.crazyegg.com","tracking.crazyegg.com"],"name":"Crazy Egg","link":"https://www.ghostery.com/whotracksme/trackers/crazy_egg"},{"id":"wtm_crakmedia_network","hostnames":["ads.crakmedia.com","craktraffic.com","static.ads.crakmedia.com","tracking.craktraffic.com"],"name":"Crakmedia Network","link":"https://www.ghostery.com/whotracksme/trackers/crakmedia_network"},{"id":"wtm_cquotient.com","hostnames":["cdn.cquotient.com"],"name":"CQuotient","link":"https://www.ghostery.com/whotracksme/trackers/cquotient.com"},{"id":"wtm_cq_counter","hostnames":["cqcounter.com","1xxx.cqcounter.com","img.cqcounter.com","nl.cqcounter.com","no.2.cqcounter.com","se.cqcounter.com","xxx.cqcounter.com","zz.cqcounter.com","ar.2.cqcounter.com","au.2.cqcounter.com","bg.2.cqcounter.com","ca.2.cqcounter.com","de.2.cqcounter.com","fr.2.cqcounter.com","nz.2.cqcounter.com","si.2.cqcounter.com","th.2.cqcounter.com","tr.2.cqcounter.com","uk.2.cqcounter.com","us.2.cqcounter.com","us.cqcounter.com","1au.cqcounter.com","1bm.cqcounter.com","1ca.cqcounter.com","1de.cqcounter.com","1es.cqcounter.com","1fr.cqcounter.com","1in.cqcounter.com","1it.cqcounter.com","1jo.cqcounter.com","1nl.cqcounter.com","1pt.cqcounter.com","1se.cqcounter.com","1si.cqcounter.com","1th.cqcounter.com","1tr.cqcounter.com","1ua.cqcounter.com","1uk.cqcounter.com","1us.cqcounter.com","www2.cqcounter.com","www.cqcounter.com","hu.2.cqcounter.com","ca.cqcounter.com","uk.cqcounter.com"],"name":"CQ Counter","link":"https://www.ghostery.com/whotracksme/trackers/cq_counter"},{"id":"wtm_coreaudience","hostnames":["p0.raasnet.com","p.raasnet.com"],"name":"CoreAudience","link":"https://www.ghostery.com/whotracksme/trackers/coreaudience"},{"id":"wtm_convertro","hostnames":["convertro.com","d1ivexoxmp59q7.cloudfront.net"],"name":"Convertro","link":"https://www.ghostery.com/whotracksme/trackers/convertro"},{"id":"wtm_convert","hostnames":["cdn-1.convertexperiments.com","cdn-3.convertexperiments.com"],"name":"Convert","link":"https://www.ghostery.com/whotracksme/trackers/convert"},{"id":"wtm_conversive","hostnames":["ant.conversive.nl"],"name":"Conversive","link":"https://www.ghostery.com/whotracksme/trackers/conversive"},{"id":"wtm_conversionruler","hostnames":["conversionruler.com","www.conversionruler.com"],"name":"ConversionRuler","link":"https://www.ghostery.com/whotracksme/trackers/conversionruler"},{"id":"wtm_conversant","hostnames":["fastclick.net","mediaplex.com","cdn.fastclick.net","csp.fastclick.net","media.fastclick.net","socialmediaplex.com","www.socialmediaplex.com","cdn.mplxtms.com","n.mplxtms.com","t.mplxtms.com","cj.mplxtms.com","secure-cdn.mplxtms.com"],"name":"Conversant","link":"https://www.ghostery.com/whotracksme/trackers/conversant"},{"id":"wtm_convergetrack","hostnames":["hits.convergetrack.com"],"name":"ConvergeTrack","link":"https://www.ghostery.com/whotracksme/trackers/convergetrack"},{"id":"wtm_contribusource","hostnames":["s2.contribusourcesyndication.com"],"name":"Contribusource","link":"https://www.ghostery.com/whotracksme/trackers/contribusource"},{"id":"wtm_context.ad","hostnames":["intext.contextad.pl"],"name":"Context.ad","link":"https://www.ghostery.com/whotracksme/trackers/context.ad"},{"id":"wtm_contactme","hostnames":["d1uwd25yvxu96k.cloudfront.net","static.contactme.com"],"name":"ContactMe","link":"https://www.ghostery.com/whotracksme/trackers/contactme"},{"id":"wtm_contact_impact","hostnames":["adrolays.de"],"name":"Contact Impact","link":"https://www.ghostery.com/whotracksme/trackers/contact_impact"},{"id":"wtm_consumable","hostnames":["e.serverbid.com","sync.serverbid.com"],"name":"Consumable","link":"https://www.ghostery.com/whotracksme/trackers/consumable"},{"id":"wtm_constant_contact","hostnames":["rs6.net"],"name":"Constant Contact","link":"https://www.ghostery.com/whotracksme/trackers/constant_contact"},{"id":"wtm_connextra","hostnames":["connextra.com","aa.connextra.com","bb.connextra.com","cc.connextra.com","dd.connextra.com","ee.connextra.com","ff.connextra.com"],"name":"Connextra","link":"https://www.ghostery.com/whotracksme/trackers/connextra"},{"id":"wtm_connexity","hostnames":["connexity.net","pxl.connexity.net"],"name":"Connexity","link":"https://www.ghostery.com/whotracksme/trackers/connexity"},{"id":"wtm_connectad","hostnames":["connected-by.connectad.io"],"name":"ConnectAd","link":"https://www.ghostery.com/whotracksme/trackers/connectad"},{"id":"wtm_connatix.com","hostnames":["connatix.com","cdm.connatix.com"],"name":"Connatix","link":"https://www.ghostery.com/whotracksme/trackers/connatix.com"},{"id":"wtm_congstar.de","hostnames":["banner.congstar.de"],"name":"congstar.de","link":"https://www.ghostery.com/whotracksme/trackers/congstar.de"},{"id":"wtm_conduit","hostnames":["conduit.com","apps.conduit-banners.com","www.conduit-banners.com","images.conduit-banners.com","api.conduit.com","hosting.conduit.com","ticker.conduit.com","tracking.conduit.com","translation.conduit.com","www.conduit.com","search.conduit.com"],"name":"Conduit","link":"https://www.ghostery.com/whotracksme/trackers/conduit"},{"id":"wtm_complex_media_network","hostnames":["media.complex.com","herbcomplex.com","www.herbcomplex.com"],"name":"Complex Media","link":"https://www.ghostery.com/whotracksme/trackers/complex_media_network"},{"id":"wtm_communicator_corp","hostnames":["platform.communicatorcorp.com"],"name":"Communicator Corp","link":"https://www.ghostery.com/whotracksme/trackers/communicator_corp"},{"id":"wtm_commission_junction","hostnames":["anrdoezrs.net","emjcd.com","www.afcyhf.com","www.anrdoezrs.net","mp.apmebf.com","www.apmebf.com","www.awltovhc.com","www.emjcd.com","www.ftjcfx.com","www.lduhtrp.net","www.qksz.net","www.tkqlhce.com","www.tqlkg.com","www.yceml.net"],"name":"CJ Affiliate","link":"https://www.ghostery.com/whotracksme/trackers/commission_junction"},{"id":"wtm_commercehub","hostnames":["cdn.mercent.com","link.mercent.com"],"name":"CommerceHub","link":"https://www.ghostery.com/whotracksme/trackers/commercehub"},{"id":"wtm_collarity","hostnames":["service.collarity.com"],"name":"Collarity","link":"https://www.ghostery.com/whotracksme/trackers/collarity"},{"id":"wtm_coinurl","hostnames":["coinurl.com"],"name":"CoinURL","link":"https://www.ghostery.com/whotracksme/trackers/coinurl"},{"id":"wtm_coin_have","hostnames":["coin-have.com"],"name":"Coin Have","link":"https://www.ghostery.com/whotracksme/trackers/coin_have"},{"id":"wtm_cogocast","hostnames":["tag.cogocast.net"],"name":"CogoCast","link":"https://www.ghostery.com/whotracksme/trackers/cogocast"},{"id":"wtm_coadvertise","hostnames":["content.acc-hd.de"],"name":"COADVERTISE","link":"https://www.ghostery.com/whotracksme/trackers/coadvertise"},{"id":"wtm_clustrmaps","hostnames":["clustrmaps.com","www2.clustrmaps.com","www3.clustrmaps.com","www4.clustrmaps.com","www.clustrmaps.com"],"name":"ClustrMaps","link":"https://www.ghostery.com/whotracksme/trackers/clustrmaps"},{"id":"wtm_clove_network","hostnames":["ads.clovenetwork.com"],"name":"Clove Network","link":"https://www.ghostery.com/whotracksme/trackers/clove_network"},{"id":"wtm_cloudflare_insights","hostnames":["cloudflareinsights.com","static.cloudflareinsights.com"],"name":"Cloudflare Insights","link":"https://www.ghostery.com/whotracksme/trackers/cloudflare_insights"},{"id":"wtm_clixgalore","hostnames":["www.is1.clixgalore.com"],"name":"clixGalore","link":"https://www.ghostery.com/whotracksme/trackers/clixgalore"},{"id":"wtm_clip_syndicate","hostnames":["eplayer.clipsyndicate.com"],"name":"Clip Syndicate","link":"https://www.ghostery.com/whotracksme/trackers/clip_syndicate"},{"id":"wtm_clickyab","hostnames":["clickyab.com"],"name":"Clickyab","link":"https://www.ghostery.com/whotracksme/trackers/clickyab"},{"id":"wtm_clicky","hostnames":["getclicky.com","pmetrics.getclicky.com","in.getclicky.com","static.getclicky.com"],"name":"Clicky","link":"https://www.ghostery.com/whotracksme/trackers/clicky"},{"id":"wtm_clicktripz","hostnames":["clicktripz.com","www.clicktripz.com","static.clicktripz.com"],"name":"ClickTripz","link":"https://www.ghostery.com/whotracksme/trackers/clicktripz"},{"id":"wtm_clicktale","hostnames":["clicktale.pantherssl.com","clicktalecdn.sslcs.cdngc.net","www.clicktale.com","r.clicktale.net","ing-district.clicktale.net","cdn.clicktale.net","s.clicktale.net","www.clicktale.net","c.clicktale.net","cdna.clicktale.net","cdnssl.clicktale.net","conductor.clicktale.net","ir-ing-district.clicktale.net","sptc.clicktale.net"],"name":"ClickTale","link":"https://www.ghostery.com/whotracksme/trackers/clicktale"},{"id":"wtm_clicksor","hostnames":["clicksor.com","lzjl.com","www.clicksor.com","static.hatid.com","ads.lzjl.com","www.lzjl.com","serw.myroitracking.com","tr1.myroitracking.com","www.myroitracking.com"],"name":"Clicksor","link":"https://www.ghostery.com/whotracksme/trackers/clicksor"},{"id":"wtm_clicks_thru_networks","hostnames":["ctn.go2cloud.org"],"name":"Clicks Thru Networks","link":"https://www.ghostery.com/whotracksme/trackers/clicks_thru_networks"},{"id":"wtm_clickonometrics","hostnames":["clickonometrics.pl","sync.clickonometrics.pl","delivery.clickonometrics.pl","static.clickonometrics.pl"],"name":"Clickonometrics","link":"https://www.ghostery.com/whotracksme/trackers/clickonometrics"},{"id":"wtm_clickmeter","hostnames":["clickmeter.com","tracking.clickmeter.com","www.clickmeter.com","cnvrsns.clickmeter.com","conversions.clickmeter.com","newre-conversions.clickmeter.com"],"name":"ClickMeter","link":"https://www.ghostery.com/whotracksme/trackers/clickmeter"},{"id":"wtm_clickintext","hostnames":["fr.classic.clickintext.net","fr.64.clickintext.net","fr.cim.clickintext.net","fr.slidein.clickintext.net","fr.85.clickintext.net","tags.clickintext.net"],"name":"ClickInText","link":"https://www.ghostery.com/whotracksme/trackers/clickintext"},{"id":"wtm_clickforce","hostnames":["ad.doublemax.net"],"name":"ClickForce","link":"https://www.ghostery.com/whotracksme/trackers/clickforce"},{"id":"wtm_clickequations","hostnames":["beacon.clickequations.net","js.clickequations.net"],"name":"ClickEquations","link":"https://www.ghostery.com/whotracksme/trackers/clickequations"},{"id":"wtm_clickcertain","hostnames":["x.clickcertain.com","a.remarketstats.com"],"name":"ClickCertain","link":"https://www.ghostery.com/whotracksme/trackers/clickcertain"},{"id":"wtm_clickbooth","hostnames":["clickbooth.com","clickboothlnk.com","adserve.adtoll.com","track.clickbooth.com","publishers.clickbooth.com","iluv.clickbooth.com","www.clickboothlnk.com"],"name":"Clickbooth","link":"https://www.ghostery.com/whotracksme/trackers/clickbooth"},{"id":"wtm_clickbank_proads","hostnames":["www.cbproads.com"],"name":"ClickBank ProAds","link":"https://www.ghostery.com/whotracksme/trackers/clickbank_proads"},{"id":"wtm_clickbank","hostnames":["ssl.clickbank.net","8574dnj3yzjace8c8io6zr9u3n.hop.clickbank.net","tvshowsnow.tvmax.hop.clickbank.net"],"name":"ClickBank","link":"https://www.ghostery.com/whotracksme/trackers/clickbank"},{"id":"wtm_clickaider","hostnames":["hit.clickaider.com"],"name":"ClickAider","link":"https://www.ghostery.com/whotracksme/trackers/clickaider"},{"id":"wtm_click_back","hostnames":["software.clickback.com"],"name":"Click Back","link":"https://www.ghostery.com/whotracksme/trackers/click_back"},{"id":"wtm_clever_push","hostnames":["api.cleverpush.com","static.cleverpush.com"],"name":"Clever Push","link":"https://www.ghostery.com/whotracksme/trackers/clever_push"},{"id":"wtm_clerk.io","hostnames":["api.clerk.io"],"name":"Clerk.io","link":"https://www.ghostery.com/whotracksme/trackers/clerk.io"},{"id":"wtm_clearstream.tv","hostnames":["tag.clrstm.com"],"name":"Clearstream.TV","link":"https://www.ghostery.com/whotracksme/trackers/clearstream.tv"},{"id":"wtm_clearsale","hostnames":["clearsale.com.br"],"name":"clearsale","link":"https://www.ghostery.com/whotracksme/trackers/clearsale"},{"id":"wtm_clearbit.com","hostnames":["ga.clearbit.com","reveal.clearbit.com","track.privacyatclearbit.com","marketo.clearbit.com"],"name":"Clearbit","link":"https://www.ghostery.com/whotracksme/trackers/clearbit.com"},{"id":"wtm_clear_pier","hostnames":["sync.pulseradius.com"],"name":"ClearPier","link":"https://www.ghostery.com/whotracksme/trackers/clear_pier"},{"id":"wtm_clcknads.pro","hostnames":["ca.clcknads.pro"],"name":"clcknads.pro","link":"https://www.ghostery.com/whotracksme/trackers/clcknads.pro"},{"id":"wtm_ciwebgroup","hostnames":["ciweb.ciwebgroup.com"],"name":"CIWebGroup","link":"https://www.ghostery.com/whotracksme/trackers/ciwebgroup"},{"id":"wtm_civicscience.com","hostnames":["cdn.civicscience.com","get.civicscience.com","www.civicscience.com"],"name":"CivicScience","link":"https://www.ghostery.com/whotracksme/trackers/civicscience.com"},{"id":"wtm_city_spark","hostnames":["p.cityspark.com"],"name":"City Spark","link":"https://www.ghostery.com/whotracksme/trackers/city_spark"},{"id":"wtm_chitika","hostnames":["chitika.net","mm.chitika.net","r.chitika.net"],"name":"Chitika","link":"https://www.ghostery.com/whotracksme/trackers/chitika"},{"id":"wtm_chin_media","hostnames":["tracker.chinmedia.vn"],"name":"Chin Media","link":"https://www.ghostery.com/whotracksme/trackers/chin_media"},{"id":"wtm_checkmystats","hostnames":["checkmystats.com.au"],"name":"CheckMyStats","link":"https://www.ghostery.com/whotracksme/trackers/checkmystats"},{"id":"wtm_chaturbate.com","hostnames":["serve.ads.chaturbate.com"],"name":"chaturbate.com","link":"https://www.ghostery.com/whotracksme/trackers/chaturbate.com"},{"id":"wtm_chartbeat","hostnames":["chartbeat.com","chartbeat.net","api.chartbeat.com","dashapi.chartbeat.com","mab.chartbeat.com","static.chartbeat.com","static2.chartbeat.com","adsapi.chartbeat.com","www.chartbeat.com","mabping.chartbeat.net","pdev.chartbeat.net","pespn.chartbeat.net","ping.chartbeat.net","pnytimes.chartbeat.net","ptimeinc.chartbeat.net"],"name":"ChartBeat","link":"https://www.ghostery.com/whotracksme/trackers/chartbeat"},{"id":"wtm_channeladvisor","hostnames":["searchmarketing.com","count.channeladvisor.com","t.channeladvisor.com","tracking2.channeladvisor.com","mtcount.channeladvisor.com","tracking.searchmarketing.com"],"name":"ChannelAdvisor","link":"https://www.ghostery.com/whotracksme/trackers/channeladvisor"},{"id":"wtm_channel_intelligence","hostnames":["channelintelligence.com"],"name":"Channel Intelligence","link":"https://www.ghostery.com/whotracksme/trackers/channel_intelligence"},{"id":"wtm_chameleon","hostnames":["gsn.chameleon.ad"],"name":"Chameleon","link":"https://www.ghostery.com/whotracksme/trackers/chameleon"},{"id":"wtm_certifica_metric","hostnames":["hits.e.cl"],"name":"Certifica Metric","link":"https://www.ghostery.com/whotracksme/trackers/certifica_metric"},{"id":"wtm_certainsource","hostnames":["link.ixs1.net"],"name":"CertainSource","link":"https://www.ghostery.com/whotracksme/trackers/certainsource"},{"id":"wtm_cendyn","hostnames":["cendyn.adtrack.calls.net"],"name":"Cendyn","link":"https://www.ghostery.com/whotracksme/trackers/cendyn"},{"id":"wtm_ccm_benchmark","hostnames":["tmgr.ccmbg.com"],"name":"CCM Benchmark","link":"https://www.ghostery.com/whotracksme/trackers/ccm_benchmark"},{"id":"wtm_cardlytics","hostnames":["beacontest.cardlytics.com","epiv.cardlytics.com","images.cardlytics.com"],"name":"Cardlytics","link":"https://www.ghostery.com/whotracksme/trackers/cardlytics"},{"id":"wtm_carbonads","hostnames":["carbonads.com","carbonads.net","fusionads.net","cdn.carbonads.com","engine.carbonads.com","srv.carbonads.net","adn.fusionads.net"],"name":"Carbon Ads","link":"https://www.ghostery.com/whotracksme/trackers/carbonads"},{"id":"wtm_capture_media","hostnames":["edge.capturemedia.network"],"name":"Capture Media","link":"https://www.ghostery.com/whotracksme/trackers/capture_media"},{"id":"wtm_captora","hostnames":["pixel.captora.com"],"name":"Captora","link":"https://www.ghostery.com/whotracksme/trackers/captora"},{"id":"wtm_cam-content.com","hostnames":["counter.cam-content.com","piwik.cam-content.com"],"name":"Cam-Content.com","link":"https://www.ghostery.com/whotracksme/trackers/cam-content.com"},{"id":"wtm_calltrackingmetrics","hostnames":["21750.tctm.co"],"name":"CallTrackingMetrics","link":"https://www.ghostery.com/whotracksme/trackers/calltrackingmetrics"},{"id":"wtm_cadreon","hostnames":["d1cerpgff739r9.cloudfront.net","d1qpxk1wfeh8v1.cloudfront.net"],"name":"Cadreon","link":"https://www.ghostery.com/whotracksme/trackers/cadreon"},{"id":"wtm_c3_metrics","hostnames":["145-ct.c3tag.com","298-ct.c3tag.com","687-ct.c3tag.com","755-ct.c3tag.com"],"name":"C3 Metrics","link":"https://www.ghostery.com/whotracksme/trackers/c3_metrics"},{"id":"wtm_bypass","hostnames":["bypass.jp","as.a.bypass.jp","image.bypass.jp","img.bypass.jp"],"name":"Bypass","link":"https://www.ghostery.com/whotracksme/trackers/bypass"},{"id":"wtm_buysellads","hostnames":["buysellads.com","servedby-buysellads.com","assets.buysellads.com","cdn.buysellads.com","s3.buysellads.com","rss.buysellads.com","www.servedby-buysellads.com","srv.buysellads.com","stats.buysellads.com","m.servedby-buysellads.com"],"name":"BuySellAds","link":"https://www.ghostery.com/whotracksme/trackers/buysellads"},{"id":"wtm_burt","hostnames":["d3q6px0y2suh5n.cloudfront.net","rich-agent.s3.amazonaws.com"],"name":"Burt","link":"https://www.ghostery.com/whotracksme/trackers/burt"},{"id":"wtm_burda","hostnames":["a.bf-ad.net"],"name":"BurdaForward","link":"https://www.ghostery.com/whotracksme/trackers/burda"},{"id":"wtm_bugsnag","hostnames":["d2wy8f7a9ursnm.cloudfront.net","notify.bugsnag.com","sessions.bugsnag.com"],"name":"Bugsnag","link":"https://www.ghostery.com/whotracksme/trackers/bugsnag"},{"id":"wtm_bubblestat","hostnames":["in.bubblestat.com"],"name":"Bubblestat","link":"https://www.ghostery.com/whotracksme/trackers/bubblestat"},{"id":"wtm_bronto","hostnames":["em.bm23.com","watershed.bm23.com","p.bm23.com","hosting-source.bm23.com","incoming.bm23.com"],"name":"Bronto","link":"https://www.ghostery.com/whotracksme/trackers/bronto"},{"id":"wtm_broadstreet","hostnames":["broadstreetads.com","ad.broadstreetads.com","cdn.broadstreetads.com"],"name":"Broadstreet","link":"https://www.ghostery.com/whotracksme/trackers/broadstreet"},{"id":"wtm_brilig","hostnames":["p.brilig.com"],"name":"Brilig","link":"https://www.ghostery.com/whotracksme/trackers/brilig"},{"id":"wtm_brightonclick.com","hostnames":["brightonclick.com","www.brightonclick.com"],"name":"brightonclick.com","link":"https://www.ghostery.com/whotracksme/trackers/brightonclick.com"},{"id":"wtm_brightedge","hostnames":["analytics.brightedge.com","edge.analytics.brightedge.com"],"name":"BrightEdge","link":"https://www.ghostery.com/whotracksme/trackers/brightedge"},{"id":"wtm_brightcove","hostnames":["goku.brightcove.com","metrics.brightcove.com"],"name":"Brightcove","link":"https://www.ghostery.com/whotracksme/trackers/brightcove","exodusId":178},{"id":"wtm_bridgetrack","hostnames":["bridgetrack.com","ads.bridgetrack.com","cc.bridgetrack.com","citi.bridgetrack.com","sec-citi.bridgetrack.com"],"name":"BridgeTrack","link":"https://www.ghostery.com/whotracksme/trackers/bridgetrack"},{"id":"wtm_braze","hostnames":["appboycdn.com","assets.appboycdn.com","js.appboycdn.com"],"name":"Braze","link":"https://www.ghostery.com/whotracksme/trackers/braze"},{"id":"wtm_brandreach","hostnames":["brandreachsys.com","adbucks.brandreachsys.com","adc.brandreachsys.com","fe.brandreachsys.com","lg1.brandreachsys.com","mad2.brandreachsys.com","media.brandreachsys.com","adbcache.brandreachsys.com","lg.brandreachsys.com","nkcache.brandreachsys.com"],"name":"BrandReach","link":"https://www.ghostery.com/whotracksme/trackers/brandreach"},{"id":"wtm_brandmetrics.com","hostnames":["cdn.brandmetrics.com"],"name":"Brandmetrics.com","link":"https://www.ghostery.com/whotracksme/trackers/brandmetrics.com"},{"id":"wtm_brand_networks","hostnames":["go.cpmadvisors.com"],"name":"Brand Networks","link":"https://www.ghostery.com/whotracksme/trackers/brand_networks"},{"id":"wtm_brainsins","hostnames":["d2xkqxdy6ewr93.cloudfront.net","tracker.brainsins.com"],"name":"BrainSINS","link":"https://www.ghostery.com/whotracksme/trackers/brainsins"},{"id":"wtm_boxever","hostnames":["api.boxever.com"],"name":"Boxever","link":"https://www.ghostery.com/whotracksme/trackers/boxever"},{"id":"wtm_box_uk","hostnames":["j.clickdensity.com"],"name":"Box UK","link":"https://www.ghostery.com/whotracksme/trackers/box_uk"},{"id":"wtm_bouncex","hostnames":["dfp.bouncex.net","events.bouncex.net"],"name":"BounceX","link":"https://www.ghostery.com/whotracksme/trackers/bouncex"},{"id":"wtm_bounce_exchange","hostnames":["bounceexchange.com","api.bounceexchange.com","assets.bounceexchange.com","cnn.bounceexchange.com","pixel.bounceexchange.com","tag.bounceexchange.com"],"name":"Bounce Exchange","link":"https://www.ghostery.com/whotracksme/trackers/bounce_exchange"},{"id":"wtm_boost_box","hostnames":["boostbox.com.br","banner.boostbox.com.br"],"name":"Boost Box","link":"https://www.ghostery.com/whotracksme/trackers/boost_box"},{"id":"wtm_bold","hostnames":["qb.boldapps.net","secure.apps.shappify.com"],"name":"Bold","link":"https://www.ghostery.com/whotracksme/trackers/bold"},{"id":"wtm_bol_affiliate_program","hostnames":["tracking.bol.com"],"name":"BOL Affiliate Program","link":"https://www.ghostery.com/whotracksme/trackers/bol_affiliate_program"},{"id":"wtm_bodelen.com","hostnames":["bodelen.com"],"name":"bodelen.com","link":"https://www.ghostery.com/whotracksme/trackers/bodelen.com"},{"id":"wtm_bluetriangle","hostnames":["lululemonspna.btttag.com"],"name":"Blue Triangle","link":"https://www.ghostery.com/whotracksme/trackers/bluetriangle"},{"id":"wtm_bluestreak","hostnames":["bluestreak.com","www.bluestreak.com","s0b.bluestreak.com"],"name":"BlueStreak","link":"https://www.ghostery.com/whotracksme/trackers/bluestreak"},{"id":"wtm_bluemetrix","hostnames":["t.bmmetrix.com","www.bmmetrix.com"],"name":"Bluemetrix","link":"https://www.ghostery.com/whotracksme/trackers/bluemetrix"},{"id":"wtm_bluecore","hostnames":["triggeredmail.appspot.com","api.bluecore.com","cdn.bluecore.com","onsitestats.bluecore.com"],"name":"Bluecore","link":"https://www.ghostery.com/whotracksme/trackers/bluecore"},{"id":"wtm_blue_seed","hostnames":["blueserving.com"],"name":"Blue Seed","link":"https://www.ghostery.com/whotracksme/trackers/blue_seed"},{"id":"wtm_bloomreach","hostnames":["cdn.brcdn.com","cdn.brsrvr.com"],"name":"BloomReach","link":"https://www.ghostery.com/whotracksme/trackers/bloomreach"},{"id":"wtm_blogher","hostnames":["blogherads.com","ads.blogherads.com"],"name":"BlogHer Ads","link":"https://www.ghostery.com/whotracksme/trackers/blogher"},{"id":"wtm_bloggerads","hostnames":["js1.bloggerads.net"],"name":"BloggerAds","link":"https://www.ghostery.com/whotracksme/trackers/bloggerads"},{"id":"wtm_blogad","hostnames":["blogad.com.tw"],"name":"BlogAD","link":"https://www.ghostery.com/whotracksme/trackers/blogad"},{"id":"wtm_blis","hostnames":["tr.blismedia.com"],"name":"Blis","link":"https://www.ghostery.com/whotracksme/trackers/blis"},{"id":"wtm_blackdragon","hostnames":["jssr.jd.com"],"name":"BlackDragon","link":"https://www.ghostery.com/whotracksme/trackers/blackdragon"},{"id":"wtm_bizcn","hostnames":["traffic.adxprts.com"],"name":"Bizcn","link":"https://www.ghostery.com/whotracksme/trackers/bizcn"},{"id":"wtm_bitrix","hostnames":["bitrix24.com.br","analytics.bitrix.info"],"name":"Bitrix24","link":"https://www.ghostery.com/whotracksme/trackers/bitrix"},{"id":"wtm_binotel","hostnames":["widgets.binotel.com"],"name":"Binotel","link":"https://www.ghostery.com/whotracksme/trackers/binotel"},{"id":"wtm_binlayer","hostnames":["view.binlayer.com"],"name":"BinLayer","link":"https://www.ghostery.com/whotracksme/trackers/binlayer"},{"id":"wtm_bing_ads","hostnames":["ads.microsoft.com","bat.r.msn.com","shopsplumbing.com","911chicagoplumbing.com","citsinfobing.com","www.911chicagoplumbing.com","www.citsinfobing.com","ads.ukclimbing.com","ads.bing.com","adserver.bing.com","bingads.microsoft.com","advertise.bingads.microsoft.com","bat.bing.com","c.bing.com"],"name":"Microsoft Advertising","link":"https://www.ghostery.com/whotracksme/trackers/bing_ads"},{"id":"wtm_bilin","hostnames":["pixel.bilinmedia.net"],"name":"Bilin","link":"https://www.ghostery.com/whotracksme/trackers/bilin"},{"id":"wtm_bilgin_pro","hostnames":["ad-cdn.bilgin.pro"],"name":"Bilgin Pro","link":"https://www.ghostery.com/whotracksme/trackers/bilgin_pro"},{"id":"wtm_bigmir.net","hostnames":["ad0.bigmir.net","ad1.bigmir.net","ad4.bigmir.net","ad5.bigmir.net","ad6.bigmir.net","ad7.bigmir.net","adi.bigmir.net","c.bigmir.net","i.bigmir.net"],"name":"bigmir","link":"https://www.ghostery.com/whotracksme/trackers/bigmir.net"},{"id":"wtm_bigcommerce.com","hostnames":["analytics.bigcommerce.com"],"name":"BigCommerce","link":"https://www.ghostery.com/whotracksme/trackers/bigcommerce.com"},{"id":"wtm_big_mobile","hostnames":["api.bigmobileads.com"],"name":"Big Mobile","link":"https://www.ghostery.com/whotracksme/trackers/big_mobile"},{"id":"wtm_bidvertiser","hostnames":["bidvertiser.com","cdn.bidvertiser.com","bdv.bidvertiser.com","secure.bidvertiser.com","www.bidvertiser.com"],"name":"BidVertiser","link":"https://www.ghostery.com/whotracksme/trackers/bidvertiser"},{"id":"wtm_bidtheatre","hostnames":["adsby.bidtheatre.com"],"name":"BidTheatre","link":"https://www.ghostery.com/whotracksme/trackers/bidtheatre"},{"id":"wtm_bidswitch","hostnames":["bidswitch.net","exe.bid","gce-or.bidswitch.net","sync-eu.exe.bid","gce-sc.bidswitch.net","ghent-gce-sc.bidswitch.net","grid.bidswitch.net","us-east-sync.bidswitch.net","x.bidswitch.net"],"name":"Bidswitch","link":"https://www.ghostery.com/whotracksme/trackers/bidswitch"},{"id":"wtm_betweendigital.com","hostnames":["cache.betweendigital.com","ads.betweendigital.com","ssp.ads.betweendigital.com","match.ads.betweendigital.com"],"name":"Between Digital","link":"https://www.ghostery.com/whotracksme/trackers/betweendigital.com"},{"id":"wtm_bench_platform","hostnames":["tag.benchplatform.com"],"name":"Bench Platform","link":"https://www.ghostery.com/whotracksme/trackers/bench_platform"},{"id":"wtm_belstat","hostnames":["belstat.com","belstat.nl","www.belstat.com","www.belstat.nl"],"name":"BelStat","link":"https://www.ghostery.com/whotracksme/trackers/belstat"},{"id":"wtm_behavioralengine","hostnames":["behavioralengine.com","api.behavioralengine.com"],"name":"BehavioralEngine","link":"https://www.ghostery.com/whotracksme/trackers/behavioralengine"},{"id":"wtm_begun","hostnames":["begun.ru","autocontext.begun.ru"],"name":"Begun","link":"https://www.ghostery.com/whotracksme/trackers/begun"},{"id":"wtm_beezup","hostnames":["tracker.beezup.com"],"name":"BeezUP","link":"https://www.ghostery.com/whotracksme/trackers/beezup"},{"id":"wtm_bebi","hostnames":["bebi.com","srv.bebi.com","c.bebi.com","redir.bebi.com","go.bebi.com","st.bebi.com"],"name":"Bebi Media","link":"https://www.ghostery.com/whotracksme/trackers/bebi"},{"id":"wtm_beanstalk_data","hostnames":["t2.beanstalkdata.com","app.beanstalkdata.com","t.beanstalkdata.com"],"name":"Beanstalk Data","link":"https://www.ghostery.com/whotracksme/trackers/beanstalk_data"},{"id":"wtm_beacon_ad_network","hostnames":["cdn.beaconads.com"],"name":"Beacon Ad Network","link":"https://www.ghostery.com/whotracksme/trackers/beacon_ad_network"},{"id":"wtm_beachfront","hostnames":["bfmio.com","crid.bfmio.com","display.bfmio.com","evt.bfmio.com","evtvpaid.bfmio.com","ioms.bfmio.com","moat.bfmio.com","reachms.bfmio.com","sync.bfmio.com","useast.bfmio.com","uswest.bfmio.com"],"name":"Beachfront Media","link":"https://www.ghostery.com/whotracksme/trackers/beachfront"},{"id":"wtm_bd4travel","hostnames":["tracking.bd4travel.com"],"name":"bd4travel","link":"https://www.ghostery.com/whotracksme/trackers/bd4travel"},{"id":"wtm_batanga_network","hostnames":["ad.batanga.com","tracking.batanga.com"],"name":"Batanga Network","link":"https://www.ghostery.com/whotracksme/trackers/batanga_network"},{"id":"wtm_barilliance","hostnames":["dn3y71tq7jf07.cloudfront.net"],"name":"Barilliance","link":"https://www.ghostery.com/whotracksme/trackers/barilliance"},{"id":"wtm_bannerflow.com","hostnames":["images.host.bannerflow.com","scripts.host.bannerflow.com","tracker.bannerflow.com","tracking.bannerflow.com","vistabet-affiliate.host.bannerflow.com","cdn.bannerflow.com"],"name":"Bannerflow","link":"https://www.ghostery.com/whotracksme/trackers/bannerflow.com"},{"id":"wtm_banner_connect","hostnames":["bannerconnect.net","content.bannerconnect.net","www.bannerconnect.net"],"name":"Banner Connect","link":"https://www.ghostery.com/whotracksme/trackers/banner_connect"},{"id":"wtm_bankrate","hostnames":["widgets.bankrate.com"],"name":"Bankrate","link":"https://www.ghostery.com/whotracksme/trackers/bankrate"},{"id":"wtm_baidu_ads","hostnames":["a.baidu.com","adm.baidu.com","bar.baidu.com","cb.baidu.com","cjhq.baidu.com","cpro.baidu.com","e.baidu.com","eiv.baidu.com","gimg.baidu.com","hm.baidu.com","nsclick.baidu.com","pos.baidu.com","s.baidu.com","sobar.baidu.com","tongji.baidu.com","toolbar.baidu.com","tracker.baidu.com","ucstat.baidu.com","union.baidu.com","unstat.baidu.com","utility.baidu.com","wangmeng.baidu.com","wm.baidu.com","ubmcmm.baidustatic.com"],"name":"Baidu Ads","link":"https://www.ghostery.com/whotracksme/trackers/baidu_ads"},{"id":"wtm_backtype_widgets","hostnames":["widgets.backtype.com"],"name":"BackType Widgets","link":"https://www.ghostery.com/whotracksme/trackers/backtype_widgets"},{"id":"wtm_back_beat_media","hostnames":["backbeatmedia.com","adserver1.backbeatmedia.com","adserver1-images.backbeatmedia.com","bullseye.backbeatmedia.com"],"name":"Back Beat Media","link":"https://www.ghostery.com/whotracksme/trackers/back_beat_media"},{"id":"wtm_axill","hostnames":["ad.globe7.com"],"name":"Axill","link":"https://www.ghostery.com/whotracksme/trackers/axill"},{"id":"wtm_awin","hostnames":["awin.com","awin1.com","www.awin.com","hugawin.com","www.hugawin.com","b1.perfb.com"],"name":"AWIN","link":"https://www.ghostery.com/whotracksme/trackers/awin"},{"id":"wtm_aweber","hostnames":["analytics.aweber.com"],"name":"AWeber","link":"https://www.ghostery.com/whotracksme/trackers/aweber"},{"id":"wtm_avazu_network","hostnames":["ads.avazu.net","rtb-ads.avazu.net"],"name":"Avazu Network","link":"https://www.ghostery.com/whotracksme/trackers/avazu_network"},{"id":"wtm_avantlink","hostnames":["avantlink.com","www.avantlink.com"],"name":"AvantLink","link":"https://www.ghostery.com/whotracksme/trackers/avantlink"},{"id":"wtm_avant_metrics","hostnames":["cdn.avmws.com"],"name":"Avant Metrics","link":"https://www.ghostery.com/whotracksme/trackers/avant_metrics"},{"id":"wtm_autopilothq","hostnames":["api.autopilothq.com"],"name":"Auto Pilot","link":"https://www.ghostery.com/whotracksme/trackers/autopilothq"},{"id":"wtm_autonomy_campaign","hostnames":["oc-track.autonomycloud.com","track.yieldsoftware.com"],"name":"Autonomy Campaign","link":"https://www.ghostery.com/whotracksme/trackers/autonomy_campaign"},{"id":"wtm_autonomy","hostnames":["optimost.com","by.optimost.com","es.optimost.com","by.essl.optimost.com"],"name":"Autonomy","link":"https://www.ghostery.com/whotracksme/trackers/autonomy"},{"id":"wtm_australia.gov","hostnames":["advertising.gov.au"],"name":"Australia.gov","link":"https://www.ghostery.com/whotracksme/trackers/australia.gov"},{"id":"wtm_aurea_clicktracks","hostnames":["clicktracks.com","stats1.clicktracks.com","stats2.clicktracks.com","stats3.clicktracks.com","stats4.clicktracks.com","www.clicktracks.com","stats.clicktracks.com"],"name":"Aurea ClickTracks","link":"https://www.ghostery.com/whotracksme/trackers/aurea_clicktracks"},{"id":"wtm_augur","hostnames":["cdn.augur.io"],"name":"Augur","link":"https://www.ghostery.com/whotracksme/trackers/augur"},{"id":"wtm_audtd.com","hostnames":["sync.audtd.com"],"name":"Auditorius","link":"https://www.ghostery.com/whotracksme/trackers/audtd.com"},{"id":"wtm_audigent","hostnames":["ad.gt","halo.ad.gt","id.halo.ad.gt","seg.halo.ad.gt","a.ad.gt","ids.ad.gt","p.ad.gt","pixels.ad.gt","seg.ad.gt"],"name":"Audience Square","link":"https://www.ghostery.com/whotracksme/trackers/audigent"},{"id":"wtm_audience2media","hostnames":["ads.audience2media.com"],"name":"Audience2Media","link":"https://www.ghostery.com/whotracksme/trackers/audience2media"},{"id":"wtm_audience_science","hostnames":["revsci.net","pq-direct.revsci.net","js.revsci.net","pix02.revsci.net","pix03.revsci.net","pix04.revsci.net","adnxs.revsci.net","ads.revsci.net","pix.revsci.net","pix01.revsci.net"],"name":"Audience Science","link":"https://www.ghostery.com/whotracksme/trackers/audience_science"},{"id":"wtm_auction","hostnames":["auction.co.kr","ats.auction.co.kr","utsgw.auction.co.kr","montelena.auction.co.kr","pds.auction.co.kr"],"name":"Auction","link":"https://www.ghostery.com/whotracksme/trackers/auction"},{"id":"wtm_attracta","hostnames":["cdn.attracta.com"],"name":"Attracta","link":"https://www.ghostery.com/whotracksme/trackers/attracta"},{"id":"wtm_atlas_profitbuilder","hostnames":["track.roiservice.com"],"name":"Atlas ProfitBuilder","link":"https://www.ghostery.com/whotracksme/trackers/atlas_profitbuilder"},{"id":"wtm_atlas","hostnames":["atdmt.com","atlassbx.com","ad101com.adbureau.net","alliance.adbureau.net","cent.adbureau.net","creview.adbureau.net","devart.adbureau.net","divx.adbureau.net","eb.adbureau.net","etype.adbureau.net","fin.adbureau.net","haynet.adbureau.net","iacas.adbureau.net","ieee.adbureau.net","inl.adbureau.net","katu.adbureau.net","mediapst-images.adbureau.net","mediapst.adbureau.net","nbc.adbureau.net","nxtscrn.adbureau.net","ordie.adbureau.net","ozonemedia.adbureau.net","pntm-images.adbureau.net","pntm.adbureau.net","sh4sure-images.adbureau.net","sixapart.adbureau.net","sol-images.adbureau.net","sol.adbureau.net","techreview-images.adbureau.net","techreview.adbureau.net","trvlnet-images.adbureau.net","trvlnet.adbureau.net","ttarget.adbureau.net","videoegg.adbureau.net","vmix.adbureau.net","cs.atdmt.com","ll.atdmt.com","iact.atdmt.com","image.atdmt.com","img.atdmt.com","www.atdmt.com","api.atdmt.com","analytics.atdmt.com","c1.atdmt.com","h.atdmt.com","click.atdmt.com","sact.atdmt.com","adecn-w.atdmt.com","srch.atdmt.com","clk.atdmt.com","cdn.atdmt.com","geo.atlassbx.com","cdn.atlassbx.com","ad.atdmt.com","static.ad.atdmt.com","aidps.atdmt.com","c.atdmt.com","cx.atdmt.com","db3aqu.atdmt.com","ec.atdmt.com","jact.atdmt.com","switch.atdmt.com","view.atdmt.com"],"name":"Atlas","link":"https://www.ghostery.com/whotracksme/trackers/atlas"},{"id":"wtm_atg_recommendations","hostnames":["static.atgsvcs.com"],"name":"ATG Recommendations","link":"https://www.ghostery.com/whotracksme/trackers/atg_recommendations"},{"id":"wtm_ask.com","hostnames":["modablask.com","www.modablask.com","aliexpressotask.com","bifask.com","codedmask.com","www.aliexpressotask.com","www.bifask.com","www.codedmask.com","myetherwalletmetamask.com","metamask.com","askads.ask.com"],"name":"Ask.com","link":"https://www.ghostery.com/whotracksme/trackers/ask.com"},{"id":"wtm_arvato_canvas_fp","hostnames":["cya2.net"],"name":"Arvato Canvas FP","link":"https://www.ghostery.com/whotracksme/trackers/arvato_canvas_fp"},{"id":"wtm_artimedia","hostnames":["banners.advsnx.net"],"name":"Artimedia","link":"https://www.ghostery.com/whotracksme/trackers/artimedia"},{"id":"wtm_are_you_a_human","hostnames":["dptr.areyouahuman.com","n-cdn.areyouahuman.com"],"name":"Are You a Human","link":"https://www.ghostery.com/whotracksme/trackers/are_you_a_human"},{"id":"wtm_arcpublishing","hostnames":["targeting.nzme.arcpublishing.com"],"name":"Arc Publishing","link":"https://www.ghostery.com/whotracksme/trackers/arcpublishing"},{"id":"wtm_apptv","hostnames":["readserver.net","dlvr.readserver.net"],"name":"appTV","link":"https://www.ghostery.com/whotracksme/trackers/apptv"},{"id":"wtm_applifier","hostnames":["level3.applifier.com","impact.applifier.com"],"name":"Applifier","link":"https://www.ghostery.com/whotracksme/trackers/applifier"},{"id":"wtm_apicit.net","hostnames":["apicit.net"],"name":"apicit.net","link":"https://www.ghostery.com/whotracksme/trackers/apicit.net"},{"id":"wtm_apester","hostnames":["display.apester.com","events.apester.com","images.apester.com","img.apester.com","interaction.apester.com","renderer.apester.com","static.apester.com"],"name":"Apester","link":"https://www.ghostery.com/whotracksme/trackers/apester"},{"id":"wtm_anonymousads","hostnames":["a-ads.com","acceptable.a-ads.com","www.da-ads.com","ad.a-ads.com","click.a-ads.com","static.a-ads.com"],"name":"AnonymousAds","link":"https://www.ghostery.com/whotracksme/trackers/anonymousads"},{"id":"wtm_aniview.com","hostnames":["aniview.com","go1.aniview.com","gov.aniview.com","observe.aniview.com","play.aniview.com","player.aniview.com","premiumsrv.aniview.com","s2s.aniview.com","sync.aniview.com","tg1.aniview.com","track.aniview.com","track1.aniview.com","vast.aniview.com","wlplay.aniview.com","wltrack.aniview.com"],"name":"AniView","link":"https://www.ghostery.com/whotracksme/trackers/aniview.com"},{"id":"wtm_amazon_mobile_ads","hostnames":["axx-eu.amazon-adsystem.com"],"name":"Amazon Mobile Ads","link":"https://www.ghostery.com/whotracksme/trackers/amazon_mobile_ads"},{"id":"wtm_amazon_associates","hostnames":["assoc-amazon.co.uk","assoc-amazon.com","www.assoc-amazon.com","wms.assoc-amazon.jp","ws.assoc-amazon.jp","www.assoc-amazon.jp"],"name":"Amazon Associates","link":"https://www.ghostery.com/whotracksme/trackers/amazon_associates"},{"id":"wtm_altitude_digital","hostnames":["arena.altitude-arena.com"],"name":"Altitude Digital","link":"https://www.ghostery.com/whotracksme/trackers/altitude_digital"},{"id":"wtm_allyes","hostnames":["bokee.allyes.com","eastmoney.allyes.com","sroomafp.allyes.com","tom.allyes.com","yeskyafp.allyes.com"],"name":"Allyes","link":"https://www.ghostery.com/whotracksme/trackers/allyes"},{"id":"wtm_allure_media","hostnames":["edge.alluremedia.com.au"],"name":"Allure Media","link":"https://www.ghostery.com/whotracksme/trackers/allure_media"},{"id":"wtm_alexa_traffic_rank","hostnames":["data.alexa.com"],"name":"Alexa Traffic Rank","link":"https://www.ghostery.com/whotracksme/trackers/alexa_traffic_rank"},{"id":"wtm_albacross","hostnames":["serve.albacross.com"],"name":"Albacross","link":"https://www.ghostery.com/whotracksme/trackers/albacross"},{"id":"wtm_al_bawaba_advertising","hostnames":["ads.albawaba.com"],"name":"Al Bawaba Advertising","link":"https://www.ghostery.com/whotracksme/trackers/al_bawaba_advertising"},{"id":"wtm_akavita","hostnames":["adlik2.akavita.com","adlik.akavita.com"],"name":"Akavita","link":"https://www.ghostery.com/whotracksme/trackers/akavita"},{"id":"wtm_airpush","hostnames":["ab.airpush.com"],"name":"Airpush","link":"https://www.ghostery.com/whotracksme/trackers/airpush"},{"id":"wtm_airbrake","hostnames":["api.airbrake.io"],"name":"Airbrake","link":"https://www.ghostery.com/whotracksme/trackers/airbrake"},{"id":"wtm_aim4media","hostnames":["aim4media.com","artwork.aim4media.com","www.aim4media.com"],"name":"Aim4Media","link":"https://www.ghostery.com/whotracksme/trackers/aim4media"},{"id":"wtm_ai_media_group","hostnames":["tracking.aimediagroup.com"],"name":"Ai Media Group","link":"https://www.ghostery.com/whotracksme/trackers/ai_media_group"},{"id":"wtm_agilone","hostnames":["tr-1.agilone.com","api6.agilone.com","api8.agilone.com","ca-as-1.agilone.com","scripts.agilone.com"],"name":"AgilOne","link":"https://www.ghostery.com/whotracksme/trackers/agilone"},{"id":"wtm_aftonbladet_ads","hostnames":["ads.aftonbladet.se"],"name":"Aftonbladet Ads","link":"https://www.ghostery.com/whotracksme/trackers/aftonbladet_ads"},{"id":"wtm_afs_analystics","hostnames":["www5.afsanalytics.com","www8.afsanalytics.com"],"name":"AFS Analystics","link":"https://www.ghostery.com/whotracksme/trackers/afs_analystics"},{"id":"wtm_affinity","hostnames":["adnet.affinity.com","backfill.ph.affinity.com","backfills.ph.affinity.com"],"name":"Affinity","link":"https://www.ghostery.com/whotracksme/trackers/affinity"},{"id":"wtm_affilinet","hostnames":["www.banner-rotation.com","banners.webmasterplan.com","partners.webmasterplan.com"],"name":"affilinet","link":"https://www.ghostery.com/whotracksme/trackers/affilinet"},{"id":"wtm_affiliation_france","hostnames":["affiliation-france.com","www.affiliation-france.com"],"name":"Affiliation France","link":"https://www.ghostery.com/whotracksme/trackers/affiliation_france"},{"id":"wtm_affiliatelounge","hostnames":["js.affiliatelounge.com","record.affiliatelounge.com","web1.affiliatelounge.com"],"name":"AffiliateLounge","link":"https://www.ghostery.com/whotracksme/trackers/affiliatelounge"},{"id":"wtm_affiliatefuture","hostnames":["affiliatefuture.com","banners.affiliatefuture.com","scripts.affiliatefuture.com","tags.affiliatefuture.com"],"name":"AffiliateFuture","link":"https://www.ghostery.com/whotracksme/trackers/affiliatefuture"},{"id":"wtm_affiliatebuzz","hostnames":["ads.affbuzzads.com"],"name":"AffiliateBuzz","link":"https://www.ghostery.com/whotracksme/trackers/affiliatebuzz"},{"id":"wtm_affiliate4you","hostnames":["kliks.affiliate4you.nl"],"name":"Affiliate4You","link":"https://www.ghostery.com/whotracksme/trackers/affiliate4you"},{"id":"wtm_affiliate-b","hostnames":["track.affiliate-b.com"],"name":"Affiliate-B","link":"https://www.ghostery.com/whotracksme/trackers/affiliate-b"},{"id":"wtm_affectv","hostnames":["go.affec.tv","map.go.affec.tv"],"name":"Hybrid Theory","link":"https://www.ghostery.com/whotracksme/trackers/affectv"},{"id":"wtm_adyoulike","hostnames":["adyoulike.com","adyoulike.omnitagjs.com","fo-api.omnitagjs.com","hb-api.omnitagjs.com","hb-api-fra01.omnitagjs.com","visitor.omnitagjs.com","tag-dyn.omnitagjs.com"],"name":"Adyoulike","link":"https://www.ghostery.com/whotracksme/trackers/adyoulike"},{"id":"wtm_adxprtz.com","hostnames":["traffic.adxprtz.com"],"name":"adxprtz.com","link":"https://www.ghostery.com/whotracksme/trackers/adxprtz.com"},{"id":"wtm_adxpose","hostnames":["ads.adxpose.com","event.adxpose.com","servedby.adxpose.com"],"name":"AdXpose","link":"https://www.ghostery.com/whotracksme/trackers/adxpose"},{"id":"wtm_adxpansion","hostnames":["adxpansion.com","ads.adxpansion.com","cs.adxpansion.com","www.adxpansion.com"],"name":"AdXpansion","link":"https://www.ghostery.com/whotracksme/trackers/adxpansion"},{"id":"wtm_adworx.at","hostnames":["adworx.at"],"name":"ADworx","link":"https://www.ghostery.com/whotracksme/trackers/adworx.at"},{"id":"wtm_adwit","hostnames":["ads.adwitserver.com"],"name":"Adwit","link":"https://www.ghostery.com/whotracksme/trackers/adwit"},{"id":"wtm_adwebster","hostnames":["secure.adwebster.com"],"name":"adwebster","link":"https://www.ghostery.com/whotracksme/trackers/adwebster"},{"id":"wtm_advidi","hostnames":["banners.advidi.com"],"name":"Advidi","link":"https://www.ghostery.com/whotracksme/trackers/advidi"},{"id":"wtm_advertserve","hostnames":["advertserve.com","aalbc.advertserve.com","circuit.advertserve.com","divavillage.advertserve.com","imagevenue.advertserve.com","pridesource.advertserve.com","projectorreviews.advertserve.com","tradearabia.advertserve.com","www.advertserve.com","adbetnet.advertserve.com","bidstream.advertserve.com","cdn.advertserve.com","imagazine.advertserve.com","roimedia.advertserve.com"],"name":"AdvertServe","link":"https://www.ghostery.com/whotracksme/trackers/advertserve"},{"id":"wtm_advertlets","hostnames":["www.advertlets.com"],"name":"Advertlets","link":"https://www.ghostery.com/whotracksme/trackers/advertlets"},{"id":"wtm_advertisespace","hostnames":["ads.advertisespace.com"],"name":"AdvertiseSpace","link":"https://www.ghostery.com/whotracksme/trackers/advertisespace"},{"id":"wtm_advertise.com","hostnames":["advertise.com","network.advertise.com","www.advertise.com","blueadvertise.com","adserver2.blueadvertise.com","cbpublishing.blueadvertise.com","cdxninteractive.blueadvertise.com","creditburner.blueadvertise.com","my.blueadvertise.com","ad01.advertise.com"],"name":"Advertise.com","link":"https://www.ghostery.com/whotracksme/trackers/advertise.com"},{"id":"wtm_adverticum","hostnames":["adverticum.net","ad.adverticum.net","img.adverticum.net","imgs.adverticum.net"],"name":"Adverticum","link":"https://www.ghostery.com/whotracksme/trackers/adverticum"},{"id":"wtm_adverteerdirect","hostnames":["ad.adverteerdirect.nl"],"name":"Adverteerdirect","link":"https://www.ghostery.com/whotracksme/trackers/adverteerdirect"},{"id":"wtm_adversal","hostnames":["go.adversal.com","www.adversalservers.com"],"name":"Adversal","link":"https://www.ghostery.com/whotracksme/trackers/adversal"},{"id":"wtm_adverline","hostnames":["ads.adverline.com"],"name":"Adverline","link":"https://www.ghostery.com/whotracksme/trackers/adverline"},{"id":"wtm_advark","hostnames":["s3.advarkads.com"],"name":"Advark","link":"https://www.ghostery.com/whotracksme/trackers/advark"},{"id":"wtm_advalo","hostnames":["dqfw2hlp4tfww.cloudfront.net"],"name":"Advalo","link":"https://www.ghostery.com/whotracksme/trackers/advalo"},{"id":"wtm_adup-tech.com","hostnames":["d.adup-tech.com","rtb.d.adup-tech.com","s.d.adup-tech.com","t.d.adup-tech.com"],"name":"AdUp Technology","link":"https://www.ghostery.com/whotracksme/trackers/adup-tech.com"},{"id":"wtm_adultadworld","hostnames":["adultadworld.com","cluster.adultadworld.com","cluster3.adultadworld.com","hippo.adultadworld.com","newt1.adultadworld.com","textads.adultadworld.com","tigershark.adultadworld.com","serve.adworldmedia.com","cluster.adworldmedia.com","www.adworldmedia.com"],"name":"AdultAdWorld","link":"https://www.ghostery.com/whotracksme/trackers/adultadworld"},{"id":"wtm_adult_webmaster_empire","hostnames":["awempire.com","livejasmin.com","adson.awempire.com","iframes.awempire.com","promo.awempire.com","static.awempire.com","counter.awempire.com","cradver.livejasmin.com","crt.livejasmin.com","2.livejasmin.com","apps.livejasmin.com","auth.livejasmin.com","autodiscover.livejasmin.com","ccs.livejasmin.com","crcom.livejasmin.com","crpop.livejasmin.com","crpt.livejasmin.com","crtbb.livejasmin.com","crtinf.livejasmin.com","free.livejasmin.com","gallery0.livejasmin.com","gallery1.livejasmin.com","link.info.livejasmin.com","live-cams-2.livejasmin.com","live-cams-3.livejasmin.com","live-cams-4.livejasmin.com","live-cams-5.livejasmin.com","lubet.api.new.livejasmin.com","lubet.modelcenter.livejasmin.com","lubet.www.livejasmin.com","m.livejasmin.com","mailer.livejasmin.com","mastercenter.livejasmin.com","modelcenter.livejasmin.com","mxd.livejasmin.com","mxu.livejasmin.com","new.livejasmin.com","news.livejasmin.com","newsletter.livejasmin.com","newsletter2.livejasmin.com","old.livejasmin.com","performercenter.livejasmin.com","relay.livejasmin.com","sandbox.livejasmin.com","secure.livejasmin.com","static.livejasmin.com","streamdiag.livejasmin.com","sync.livejasmin.com","tv.livejasmin.com","updatehd.livejasmin.com","www.new.livejasmin.com","crmt.livejasmin.com","crprt.livejasmin.com","crmpt.livejasmin.com","crpdt.livejasmin.com","creatives.livejasmin.com","live-cams-0.livejasmin.com","live-cams-1.livejasmin.com","www.2.livejasmin.com","www.livejasmin.com"],"name":"Adult Webmaster Empire","link":"https://www.ghostery.com/whotracksme/trackers/adult_webmaster_empire"},{"id":"wtm_adtube","hostnames":["ad.adtube.ir"],"name":"AdTube","link":"https://www.ghostery.com/whotracksme/trackers/adtube"},{"id":"wtm_adtrustmedia","hostnames":["ads.adtrustmedia.com"],"name":"AdTrustMedia","link":"https://www.ghostery.com/whotracksme/trackers/adtrustmedia"},{"id":"wtm_adtoma","hostnames":["adtoma.com","fusion.adtoma.com","ad.adtoma.com"],"name":"Adtoma","link":"https://www.ghostery.com/whotracksme/trackers/adtoma"},{"id":"wtm_adtiger","hostnames":["adtiger.de","www.adtiger.de","ads.adtiger.de"],"name":"AdTiger","link":"https://www.ghostery.com/whotracksme/trackers/adtiger"},{"id":"wtm_adthink","hostnames":["advertstream.com","ad.advertstream.com","secure.audienceinsights.net","static.audienceinsights.net"],"name":"Adthink","link":"https://www.ghostery.com/whotracksme/trackers/adthink"},{"id":"wtm_adtheorent","hostnames":["bm.adentifi.com","rtb.adentifi.com"],"name":"Adtheorent","link":"https://www.ghostery.com/whotracksme/trackers/adtheorent"},{"id":"wtm_adtegrity","hostnames":["adtegrity.net","content.adtegrity.net","ad.adtegrity.net","ads.adtegrity.net","a.adtpix.com"],"name":"Adtegrity","link":"https://www.ghostery.com/whotracksme/trackers/adtegrity"},{"id":"wtm_adtarget.me","hostnames":["static-trackers.adtarget.me"],"name":"Adtarget.me","link":"https://www.ghostery.com/whotracksme/trackers/adtarget.me"},{"id":"wtm_adtaily","hostnames":["adtaily.com","adtaily.pl","static.adtaily.com","www.adtaily.com"],"name":"AdTaily","link":"https://www.ghostery.com/whotracksme/trackers/adtaily"},{"id":"wtm_adstars","hostnames":["adstars.co.id"],"name":"Adstars","link":"https://www.ghostery.com/whotracksme/trackers/adstars"},{"id":"wtm_adstanding","hostnames":["code.adstanding.com"],"name":"AdStanding","link":"https://www.ghostery.com/whotracksme/trackers/adstanding"},{"id":"wtm_adstage","hostnames":["adstage-analytics.herokuapp.com"],"name":"AdStage","link":"https://www.ghostery.com/whotracksme/trackers/adstage"},{"id":"wtm_adspyglass","hostnames":["o333o.com","a.o333o.com","cdn.o333o.com"],"name":"AdSpyglass","link":"https://www.ghostery.com/whotracksme/trackers/adspyglass"},{"id":"wtm_adspeed","hostnames":["adspeed.net","serv.adspeed.com","www.adspeed.com","g.adspeed.net"],"name":"AdSpeed","link":"https://www.ghostery.com/whotracksme/trackers/adspeed"},{"id":"wtm_adsninja","hostnames":["1x1.a-mo.net"],"name":"Adsninja","link":"https://www.ghostery.com/whotracksme/trackers/adsninja"},{"id":"wtm_adsnative","hostnames":["adsnative.com","rudy.adsnative.com","api.adsnative.com"],"name":"adsnative","link":"https://www.ghostery.com/whotracksme/trackers/adsnative"},{"id":"wtm_adskom","hostnames":["ssp.adskom.com"],"name":"ADSKOM","link":"https://www.ghostery.com/whotracksme/trackers/adskom"},{"id":"wtm_adskeeper","hostnames":["adskeeper.co.uk","c.adskeeper.co.uk","mg.adskeeper.co.uk","imgg.adskeeper.co.uk","servicer.adskeeper.co.uk","cdn.adskeeper.co.uk","imgg-cdn.adskeeper.co.uk","www.adskeeper.co.uk","a.adskeeper.co.uk","cm.adskeeper.co.uk","jsc.adskeeper.co.uk","s-img.adskeeper.co.uk"],"name":"AdsKeeper","link":"https://www.ghostery.com/whotracksme/trackers/adskeeper"},{"id":"wtm_adside","hostnames":["ads.doclix.com"],"name":"AdSide","link":"https://www.ghostery.com/whotracksme/trackers/adside"},{"id":"wtm_adsfactor","hostnames":["adsfactor.net"],"name":"Adsfactor","link":"https://www.ghostery.com/whotracksme/trackers/adsfactor"},{"id":"wtm_adservice_media","hostnames":["online.adservicemedia.dk"],"name":"Adservice Media","link":"https://www.ghostery.com/whotracksme/trackers/adservice_media"},{"id":"wtm_adserverpub","hostnames":["adserverpub.com","banner.adserverpub.com","js.adserverpub.com","www2.adserverpub.com"],"name":"AdServerPub","link":"https://www.ghostery.com/whotracksme/trackers/adserverpub"},{"id":"wtm_adsco.re","hostnames":["adsco.re"],"name":"Adscore","link":"https://www.ghostery.com/whotracksme/trackers/adsco.re"},{"id":"wtm_adscience","hostnames":["adscience.nl","rtb1.adscience.nl","rtb10.adscience.nl","rtb11.adscience.nl","rtb12.adscience.nl","rtb13.adscience.nl","rtb14.adscience.nl","rtb15.adscience.nl","rtb16.adscience.nl","rtb17.adscience.nl","rtb18.adscience.nl","rtb19.adscience.nl","rtb2.adscience.nl","rtb20.adscience.nl","rtb21.adscience.nl","rtb22.adscience.nl","rtb23.adscience.nl","rtb24.adscience.nl","rtb25.adscience.nl","rtb26.adscience.nl","rtb27.adscience.nl","rtb28.adscience.nl","rtb29.adscience.nl","rtb3.adscience.nl","rtb30.adscience.nl","rtb4.adscience.nl","rtb5.adscience.nl","rtb6.adscience.nl","rtb7.adscience.nl","rtb8.adscience.nl","rtb9.adscience.nl","www.adscience.nl"],"name":"Adscience","link":"https://www.ghostery.com/whotracksme/trackers/adscience"},{"id":"wtm_adscale","hostnames":["adscale.de","cotads.adscale.de","hb.adscale.de","ih.adscale.de","js.adscale.de"],"name":"AdScale","link":"https://www.ghostery.com/whotracksme/trackers/adscale"},{"id":"wtm_adsbookie","hostnames":["v2.adsbookie.com","ads.adsbookie.com"],"name":"AdsBookie","link":"https://www.ghostery.com/whotracksme/trackers/adsbookie"},{"id":"wtm_adrunnr","hostnames":["adrunnr.com","www.adrunnr.com"],"name":"AdRunnr","link":"https://www.ghostery.com/whotracksme/trackers/adrunnr"},{"id":"wtm_adriver","hostnames":["adriver.ru","ad.adriver.ru"],"name":"AdRiver","link":"https://www.ghostery.com/whotracksme/trackers/adriver"},{"id":"wtm_adresult","hostnames":["ad.vcm.jp","adresult.jp","ad.adresult.jp"],"name":"ADResult","link":"https://www.ghostery.com/whotracksme/trackers/adresult"},{"id":"wtm_adrecover","hostnames":["adrecover.com","feedback.adrecover.com","delivery.adrecover.com"],"name":"AdRecover","link":"https://www.ghostery.com/whotracksme/trackers/adrecover"},{"id":"wtm_adreactor","hostnames":["adreactor.com","adserver.adreactor.com"],"name":"AdReactor","link":"https://www.ghostery.com/whotracksme/trackers/adreactor"},{"id":"wtm_adpv","hostnames":["ads.adpv.com"],"name":"Adpv","link":"https://www.ghostery.com/whotracksme/trackers/adpv"},{"id":"wtm_adpulse","hostnames":["adserve.adpulse.ir"],"name":"AdPulse","link":"https://www.ghostery.com/whotracksme/trackers/adpulse"},{"id":"wtm_adprofy","hostnames":["s.adframesrc.com"],"name":"AdProfy","link":"https://www.ghostery.com/whotracksme/trackers/adprofy"},{"id":"wtm_adplus","hostnames":["adplus.co.id","adsrv.adplus.co.id","adr.adplus.co.id","ssp.adplus.co.id"],"name":"ADPLUS","link":"https://www.ghostery.com/whotracksme/trackers/adplus"},{"id":"wtm_adplan","hostnames":["adplan-ds.com","c.p-advg.com","img.adplan-ds.com","ds.advg.jp"],"name":"AdPlan","link":"https://www.ghostery.com/whotracksme/trackers/adplan"},{"id":"wtm_adpilot","hostnames":["erne.co","green.erne.co"],"name":"AdPilot","link":"https://www.ghostery.com/whotracksme/trackers/adpilot"},{"id":"wtm_adperium","hostnames":["adperium.com"],"name":"AdPerium","link":"https://www.ghostery.com/whotracksme/trackers/adperium"},{"id":"wtm_adperfect","hostnames":["nationalpost.adperfect.com","casmp.adperfect.com"],"name":"AdPerfect","link":"https://www.ghostery.com/whotracksme/trackers/adperfect"},{"id":"wtm_adpeeps","hostnames":["www.adpeepshosted.com"],"name":"Ad Peeps","link":"https://www.ghostery.com/whotracksme/trackers/adpeeps"},{"id":"wtm_adpartner","hostnames":["a4p.adpartner.pro"],"name":"adpartner","link":"https://www.ghostery.com/whotracksme/trackers/adpartner"},{"id":"wtm_adotmob.com","hostnames":["adotmob.com","adserver.adotmob.com","dmp.adotmob.com","dsp.adotmob.com","sdk.adotmob.com","sync.adotmob.com","tracker.adotmob.com"],"name":"Adotmob","link":"https://www.ghostery.com/whotracksme/trackers/adotmob.com","exodusId":161},{"id":"wtm_adorika","hostnames":["ad.adorika.com","a.adorika.net"],"name":"Adorika","link":"https://www.ghostery.com/whotracksme/trackers/adorika"},{"id":"wtm_adonly","hostnames":["t.adonly.com"],"name":"AdOnly","link":"https://www.ghostery.com/whotracksme/trackers/adonly"},{"id":"wtm_adon_network","hostnames":["dummygeek.com","www.dummygeek.com"],"name":"AdOn Network","link":"https://www.ghostery.com/whotracksme/trackers/adon_network"},{"id":"wtm_adocean","hostnames":["adocean.pl","indexhu.adocean.pl","myao.adocean.pl","tvn.adocean.pl","www.adocean.pl"],"name":"AdOcean","link":"https://www.ghostery.com/whotracksme/trackers/adocean"},{"id":"wtm_adobe_tagmanager","hostnames":["www.adobetag.com"],"name":"Adobe TagManager","link":"https://www.ghostery.com/whotracksme/trackers/adobe_tagmanager"},{"id":"wtm_adnexio","hostnames":["adserver.adnexio.com"],"name":"AdNexio","link":"https://www.ghostery.com/whotracksme/trackers/adnexio"},{"id":"wtm_adnetwork.net","hostnames":["ad.adnetwork.net"],"name":"AdNetwork.net","link":"https://www.ghostery.com/whotracksme/trackers/adnetwork.net"},{"id":"wtm_adnet.de","hostnames":["adnet.biz","adnet.de","ad.adnet.biz","www.adnet.biz","ad.adnet.de","www.adnet.de"],"name":"adNET.de","link":"https://www.ghostery.com/whotracksme/trackers/adnet.de"},{"id":"wtm_admotion","hostnames":["nspmotion.com"],"name":"Admotion","link":"https://www.ghostery.com/whotracksme/trackers/admotion"},{"id":"wtm_admost","hostnames":["run.admost.com"],"name":"adMOST","link":"https://www.ghostery.com/whotracksme/trackers/admost"},{"id":"wtm_admob","hostnames":["a.admob.com","mm.admob.com","mmv.admob.com","p.admob.com","jp.admob.com","media.admob.com"],"name":"AdMob","link":"https://www.ghostery.com/whotracksme/trackers/admob"},{"id":"wtm_admicro","hostnames":["admicro.vn","beta.admicro.vn","boxpr.admicro.vn","brand.admicro.vn","cmsanalytics.admicro.vn","content-ml.admicro.vn","corenlp.admicro.vn","defaultdsp.admicro.vn","demo.corenlp.admicro.vn","dio.admicro.vn","enterpriseapi.admicro.vn","file.admicro.vn","fingerprint.admicro.vn","marketingai.admicro.vn","notify-service.admicro.vn","pio.admicro.vn","rec.admicro.vn","static-cmsads.admicro.vn","systracking.admicro.vn","wcc.admicro.vn","www.admicro.vn","adi.vcmedia.vn","admicro4.vcmedia.vn","admicro5.vcmedia.vn","admicro6.vcmedia.vn","adi.admicro.vn","admatic.admicro.vn","adnetwork.admicro.vn","adx.admicro.vn","goodsp.admicro.vn","logging.admicro.vn","lg1.logging.admicro.vn","pson.logging.admicro.vn","media1.admicro.vn","min.admicro.vn","sspapi.admicro.vn","b.logging.admicro.vn","dl.logging.admicro.vn","hd.logging.admicro.vn","k.logging.admicro.vn","lg.logging.admicro.vn","mb.logging.admicro.vn","admicro1.vcmedia.vn"],"name":"AdMicro","link":"https://www.ghostery.com/whotracksme/trackers/admicro"},{"id":"wtm_admeld","hostnames":["admeld.com"],"name":"AdMeld","link":"https://www.ghostery.com/whotracksme/trackers/admeld"},{"id":"wtm_admedia","hostnames":["admedia.com","w.admedia.com","footerroll.admedia.com","g.admedia.com","inline.admedia.com","m.admedia.com","v.admedia.com","vslider.admedia.com","prebid.admedia.com","track.publeadmedia.com","b.admedia.com","click.admedia.com","pixel.admedia.com"],"name":"AdMedia","link":"https://www.ghostery.com/whotracksme/trackers/admedia"},{"id":"wtm_admatrix","hostnames":["lib-3pas.admatrix.jp"],"name":"Admatrix","link":"https://www.ghostery.com/whotracksme/trackers/admatrix"},{"id":"wtm_admantx.com","hostnames":["admantx.com"],"name":"ADmantX","link":"https://www.ghostery.com/whotracksme/trackers/admantx.com"},{"id":"wtm_adman_media","hostnames":["admanmedia.com","pub.admanmedia.com","cs.admanmedia.com"],"name":"ADman Media","link":"https://www.ghostery.com/whotracksme/trackers/adman_media"},{"id":"wtm_adman","hostnames":["adman.gr","adman.in.gr"],"name":"ADMAN","link":"https://www.ghostery.com/whotracksme/trackers/adman"},{"id":"wtm_admachine","hostnames":["piohbdisp.hb.adx1.com","cdn.adx1.com","rtb.adx1.com","xml.adx1.com"],"name":"AdMachine","link":"https://www.ghostery.com/whotracksme/trackers/admachine"},{"id":"wtm_adloox","hostnames":["adlooxtracking.com","js02.adlooxtracking.com","js05.adlooxtracking.com","js07.adlooxtracking.com","js11.adlooxtracking.com","js12.adlooxtracking.com","js13.adlooxtracking.com","js14.adlooxtracking.com","js15.adlooxtracking.com","j.adlooxtracking.com"],"name":"Adloox","link":"https://www.ghostery.com/whotracksme/trackers/adloox"},{"id":"wtm_adlive_header_bidding","hostnames":["api.publishers.adlive.io"],"name":"Adlive Header Bidding","link":"https://www.ghostery.com/whotracksme/trackers/adlive_header_bidding"},{"id":"wtm_adless","hostnames":["cdn.adless.io"],"name":"Adless","link":"https://www.ghostery.com/whotracksme/trackers/adless"},{"id":"wtm_adlantis","hostnames":["adimg.net","adlantis.jp","g.adimg.net"],"name":"AdLantis","link":"https://www.ghostery.com/whotracksme/trackers/adlantis"},{"id":"wtm_adlantic","hostnames":["ad-serverparc.nl"],"name":"AdLantic","link":"https://www.ghostery.com/whotracksme/trackers/adlantic"},{"id":"wtm_adlabs","hostnames":["luxup.ru","mixmarket.biz","s.clickiocdn.com","id11938.luxup.ru","id5576.al21.luxup.ru"],"name":"AdLabs","link":"https://www.ghostery.com/whotracksme/trackers/adlabs"},{"id":"wtm_adkontekst","hostnames":["adsearch.adkontekst.pl","interia.adsearch.adkontekst.pl"],"name":"Adkontekst","link":"https://www.ghostery.com/whotracksme/trackers/adkontekst"},{"id":"wtm_adknowledge","hostnames":["bidsystem.com","blogads.com","social.bidsystem.com","i.blogads.com","f.blogads.com","g.blogads.com","st.blogads.com","weblog.blogads.com","stat.blogads.com","www.blogads.com","z.blogads.com","banners.blogads.com","img.blogads.com"],"name":"Adknowledge","link":"https://www.ghostery.com/whotracksme/trackers/adknowledge"},{"id":"wtm_adklip","hostnames":["adklip.com"],"name":"adklip","link":"https://www.ghostery.com/whotracksme/trackers/adklip"},{"id":"wtm_adk2","hostnames":["adk2.com","cdn.adsrvmedia.com","cdn.cdnrl.com","cdn.adk2.com","static.adk2.com","t.adk2.com","ads.adk2.com"],"name":"adk2","link":"https://www.ghostery.com/whotracksme/trackers/adk2"},{"id":"wtm_adjug","hostnames":["adjug.com","de.hosting.adjug.com","tracking.adjug.com","hosting.adjug.com","www.adjug.com"],"name":"AdJug","link":"https://www.ghostery.com/whotracksme/trackers/adjug"},{"id":"wtm_adjs","hostnames":["cdn.adjs.net"],"name":"ADJS","link":"https://www.ghostery.com/whotracksme/trackers/adjs"},{"id":"wtm_adition","hostnames":["adition.com","ad1.adfarm1.adition.com","ad2.adfarm1.adition.com","ad3.adfarm1.adition.com","ad4.adfarm1.adition.com","static.adfarm1.adition.com","ad11.adfarm1.adition.com","dsp.adfarm1.adition.com","ad8.adfarm1.adition.com","adfarm1.adition.com","ad11p.adfarm1.adition.com","ad13.adfarm1.adition.com","adsdk.adfarm1.adition.com","dspcluster.adfarm1.adition.com","cd.adition.com","imagesrv.adition.com","track.adition.com","vt.adition.com"],"name":"Adition","link":"https://www.ghostery.com/whotracksme/trackers/adition"},{"id":"wtm_adimpact","hostnames":["www.adimpact.com"],"name":"Adimpact","link":"https://www.ghostery.com/whotracksme/trackers/adimpact"},{"id":"wtm_adikteev","hostnames":["cdn.adikteev.com"],"name":"Adikteev","link":"https://www.ghostery.com/whotracksme/trackers/adikteev"},{"id":"wtm_adify","hostnames":["ad.afy11.net"],"name":"Adify","link":"https://www.ghostery.com/whotracksme/trackers/adify"},{"id":"wtm_adhese","hostnames":["adhese.be","adhese.com","ads-colruytgroup.adhese.com","ads-nrc.adhese.com","pool-nrc.adhese.com","ads.pebblemedia.adhese.com","pool.pebblemedia.adhese.com","ads.persgroep.adhese.com","pool-colruytgroup.adhese.com","pool.persgroep.adhese.com","ads.roularta.adhese.com","pool.roularta.adhese.com","pool-roularta.adhese.com","ads-pebblemedia.adhese.com","user-sync.adhese.com","ads.adhsm.adhese.com","ads.nrc.adhese.com","pool.adhsm.adhese.com","pool.nrc.adhese.com","pool.sanoma.adhese.com","ads.dichtbij.adhese.com","pool.dichtbij.adhese.com","ads-roularta.adhese.com","clicks.roularta.adhese.com","track.roularta.adhese.com","ads-mediafin.adhese.com","pool-mediafin.adhese.com","pool-pebblemedia.adhese.com"],"name":"Adhese","link":"https://www.ghostery.com/whotracksme/trackers/adhese"},{"id":"wtm_adgoto","hostnames":["ads.adgoto.com","banners.adgoto.com","v2.adgoto.com"],"name":"ADGoto","link":"https://www.ghostery.com/whotracksme/trackers/adgoto"},{"id":"wtm_adgorithms","hostnames":["advs.adgorithms.com"],"name":"Adgorithms","link":"https://www.ghostery.com/whotracksme/trackers/adgorithms"},{"id":"wtm_adgoal","hostnames":["abp.smartadcheck.de","js.smartredirect.de","www.smartredirect.de","st.smartredirect.de"],"name":"adgoal","link":"https://www.ghostery.com/whotracksme/trackers/adgoal"},{"id":"wtm_adglue","hostnames":["cm.adsafety.net","tags.adsafety.net"],"name":"Adglue","link":"https://www.ghostery.com/whotracksme/trackers/adglue"},{"id":"wtm_adglare.net","hostnames":["adglare.net","reactads.engine.adglare.net","try.engine.adglare.net","lmadvertising.engine.adglare.net","reactads.cdn.adglare.net"],"name":"Adglare","link":"https://www.ghostery.com/whotracksme/trackers/adglare.net"},{"id":"wtm_adgile","hostnames":["ad.adgile.com","ad.antventure.com"],"name":"Adgile","link":"https://www.ghostery.com/whotracksme/trackers/adgile"},{"id":"wtm_adgenie","hostnames":["adgenie.co.uk"],"name":"adGENIE","link":"https://www.ghostery.com/whotracksme/trackers/adgenie"},{"id":"wtm_adgebra","hostnames":["adgebra.co.in"],"name":"Adgebra","link":"https://www.ghostery.com/whotracksme/trackers/adgebra"},{"id":"wtm_adfrontiers","hostnames":["media.adfrontiers.com"],"name":"AdFrontiers","link":"https://www.ghostery.com/whotracksme/trackers/adfrontiers"},{"id":"wtm_adfox","hostnames":["ads.adfox.ru","banners.adfox.ru"],"name":"AdFox","link":"https://www.ghostery.com/whotracksme/trackers/adfox"},{"id":"wtm_adforgames","hostnames":["js.adforgames.com"],"name":"AdForGames","link":"https://www.ghostery.com/whotracksme/trackers/adforgames"},{"id":"wtm_adfocus","hostnames":["adfoc.us"],"name":"AdFocus","link":"https://www.ghostery.com/whotracksme/trackers/adfocus"},{"id":"wtm_adfit","hostnames":["adfit.kakao.com"],"name":"Adfit","link":"https://www.ghostery.com/whotracksme/trackers/adfit"},{"id":"wtm_adf.ly","hostnames":["adf.ly"],"name":"AdF.ly","link":"https://www.ghostery.com/whotracksme/trackers/adf.ly"},{"id":"wtm_adextent","hostnames":["adextent.com"],"name":"AdExtent","link":"https://www.ghostery.com/whotracksme/trackers/adextent"},{"id":"wtm_adengage","hostnames":["adengage.com","cdn.adengage.com","code.adengage.com","srv.adengage.com","www.adengage.com","adcode.adengage.com","ads.adengage.com","conv.adengage.com"],"name":"AdEngage","link":"https://www.ghostery.com/whotracksme/trackers/adengage"},{"id":"wtm_adelphic","hostnames":["ipredictive.com","ad.ipredictive.com","ad-us-west.ipredictive.com","events-us-east-1.ipredictive.com","events-us-west-2.ipredictive.com","events2-us-east-1.ipredictive.com","media-cdn.ipredictive.com","sync.ipredictive.com"],"name":"Adelphic","link":"https://www.ghostery.com/whotracksme/trackers/adelphic"},{"id":"wtm_addthis","hostnames":["addthis.com","addthiscdn.com","ct1.addthis.com","s9.addthis.com","p.addthis.com","cf.addthis.com","o.addthis.com","appdev.addthis.com","blog.addthis.com","cache-dev.addthis.com","cache.addthis.com","e1.addthis.com","s5.addthis.com","search.addthis.com","secure.addthis.com","www.addthis.com","www3.addthis.com","sharebar.addthiscdn.com","api.addthis.com","api-public.addthis.com","cw.addthis.com","dlx.addthis.com","e.dlx.addthis.com","m.dlx.addthis.com","p.dlx.addthis.com","x.dlx.addthis.com","edge.addthis.com","m.addthis.com","q.addthis.com","s7.addthis.com","s8.addthis.com","su.addthis.com","v1.addthis.com","cache.addthiscdn.com","m.addthisedge.com"],"name":"AddThis","link":"https://www.ghostery.com/whotracksme/trackers/addthis"},{"id":"wtm_addshoppers","hostnames":["addshoppers.com","www.addshoppers.com"],"name":"AddShoppers","link":"https://www.ghostery.com/whotracksme/trackers/addshoppers"},{"id":"wtm_addfreestats","hostnames":["addfreestats.com","top.addfreestats.com","www.addfreestats.com","www1.addfreestats.com","www2.addfreestats.com","www3.addfreestats.com","www4.addfreestats.com","www5.addfreestats.com","www6.addfreestats.com","www7.addfreestats.com","www8.addfreestats.com","www9.addfreestats.com"],"name":"AddFreeStats","link":"https://www.ghostery.com/whotracksme/trackers/addfreestats"},{"id":"wtm_adcurve","hostnames":["track.shop2market.com"],"name":"AdCurve","link":"https://www.ghostery.com/whotracksme/trackers/adcurve"},{"id":"wtm_adcrowd","hostnames":["pixel.adcrowd.com"],"name":"Adcrowd","link":"https://www.ghostery.com/whotracksme/trackers/adcrowd"},{"id":"wtm_adconion","hostnames":["cdn.amgdgt.com","ae.amgdgt.com","at.amgdgt.com","cdns.amgdgt.com","ad.amgdgt.com","ads.amgdgt.com"],"name":"Adconion","link":"https://www.ghostery.com/whotracksme/trackers/adconion"},{"id":"wtm_adcloud","hostnames":["ad-cloud.jp"],"name":"adcloud","link":"https://www.ghostery.com/whotracksme/trackers/adcloud"},{"id":"wtm_adclickzone","hostnames":["adclickzone.go2cloud.org"],"name":"AdClickZone","link":"https://www.ghostery.com/whotracksme/trackers/adclickzone"},{"id":"wtm_adclerks","hostnames":["swift.adclerks.com"],"name":"Adclerks","link":"https://www.ghostery.com/whotracksme/trackers/adclerks"},{"id":"wtm_adcash","hostnames":["adcash.com","www.adcash.com"],"name":"Adcash","link":"https://www.ghostery.com/whotracksme/trackers/adcash"},{"id":"wtm_adcalls","hostnames":["dashboard.adcalls.nl","dashboardnew.adcalls.nl","api.adcalls.nl"],"name":"AdCalls","link":"https://www.ghostery.com/whotracksme/trackers/adcalls"},{"id":"wtm_adc_media","hostnames":["adc-serv.net","ad.adc-serv.net","r.adc-serv.net"],"name":"ad:C media","link":"https://www.ghostery.com/whotracksme/trackers/adc_media"},{"id":"wtm_adbutler","hostnames":["adbutler.com","imgserv.adbutler.com","servedbyadbutler.com"],"name":"AdButler","link":"https://www.ghostery.com/whotracksme/trackers/adbutler"},{"id":"wtm_adbrite","hostnames":["adbrite.com","www.adbrite.com"],"name":"AdBrite","link":"https://www.ghostery.com/whotracksme/trackers/adbrite"},{"id":"wtm_adbrain","hostnames":["sp.adbrn.com"],"name":"Adbrain","link":"https://www.ghostery.com/whotracksme/trackers/adbrain"},{"id":"wtm_adbooth","hostnames":["adbooth.net","www.adbooth.com","engine.adbooth.com","cdn.adbooth.net","track.adbooth.net"],"name":"Adbooth","link":"https://www.ghostery.com/whotracksme/trackers/adbooth"},{"id":"wtm_adara_analytics","hostnames":["yieldoptimizer.com","ag.yieldoptimizer.com","cdnp1.yieldoptimizer.com","cs.yieldoptimizer.com","tag.yieldoptimizer.com"],"name":"Adara","link":"https://www.ghostery.com/whotracksme/trackers/adara_analytics"},{"id":"wtm_adaos","hostnames":["adaos-ads.net","rv.adcpx.v1.de.eusem.adaos-ads.net"],"name":"ADAOS","link":"https://www.ghostery.com/whotracksme/trackers/adaos"},{"id":"wtm_adalyser.com","hostnames":["c0.adalyser.com","c3.adalyser.com","www.adalyser.com","tracking.adalyser.com","aus-mec-tracking.adalyser.com","aus-smv-tracking.adalyser.com","gbr-7stars-tracking.adalyser.com","gbr-carat-tracking.adalyser.com","gbr-mbww-tracking.adalyser.com","gbr-smv-tracking.adalyser.com","gbr-tbh-tracking.adalyser.com","photobox-tracking.adalyser.com","s1-tracking.adalyser.com"],"name":"Adalyser","link":"https://www.ghostery.com/whotracksme/trackers/adalyser.com"},{"id":"wtm_adalliance.io","hostnames":["adalliance.io","zipservice.adalliance.io","bls.adalliance.io","tracking.adalliance.io","aqt.adalliance.io","mafo.adalliance.io"],"name":"Ad Alliance","link":"https://www.ghostery.com/whotracksme/trackers/adalliance.io"},{"id":"wtm_adality_gmbh","hostnames":["adstax-cdn.adrtx.net","adstax-match.adrtx.net","adstax-match-proxy.adrtx.net","api.adrtx.net","cdn.adrtx.net"],"name":"adality GmbH","link":"https://www.ghostery.com/whotracksme/trackers/adality_gmbh"},{"id":"wtm_adacado","hostnames":["ad.adacado.com","content.adacado.com","info.adacado.com","pixel.adacado.com","strtrk.adacado.com"],"name":"Adacado","link":"https://www.ghostery.com/whotracksme/trackers/adacado"},{"id":"wtm_ad4mat","hostnames":["ad4mat.co.uk","ad4mat.de","ad4mat.net"],"name":"ad4mat","link":"https://www.ghostery.com/whotracksme/trackers/ad4mat"},{"id":"wtm_ad2games","hostnames":["ad2games.com"],"name":"ad2games","link":"https://www.ghostery.com/whotracksme/trackers/ad2games"},{"id":"wtm_ad2click","hostnames":["ad2click.go2cloud.org"],"name":"Ad2Click","link":"https://www.ghostery.com/whotracksme/trackers/ad2click"},{"id":"wtm_ad-center","hostnames":["ads.ad-center.com"],"name":"Ad-Center","link":"https://www.ghostery.com/whotracksme/trackers/ad-center"},{"id":"wtm_ad_spirit","hostnames":["adspirit.de","adspirit.net","evania.adspirit.de","urban.adspirit.de","ruemedia.adspirit.net","sgmedia.adspirit.net","adtigerpl.adspirit.net","cdn.adspirit.de"],"name":"Ad Spirit","link":"https://www.ghostery.com/whotracksme/trackers/ad_spirit"},{"id":"wtm_ad_magnet","hostnames":["admagnet.net","n.admagnet.net"],"name":"Ad Magnet","link":"https://www.ghostery.com/whotracksme/trackers/ad_magnet"},{"id":"wtm_ad_lightning","hostnames":["adlightning.com","tagan.adlightning.com"],"name":"Ad Lightning","link":"https://www.ghostery.com/whotracksme/trackers/ad_lightning"},{"id":"wtm_ad_ebis","hostnames":["ebis.ne.jp","as.ebis.ne.jp"],"name":"AD EBiS","link":"https://www.ghostery.com/whotracksme/trackers/ad_ebis"},{"id":"wtm_ad_dynamo","hostnames":["s01-delivery.addynamo.net","static.addynamo.net","static-uk.addynamo.net"],"name":"Ad Dynamo","link":"https://www.ghostery.com/whotracksme/trackers/ad_dynamo"},{"id":"wtm_ad_decisive","hostnames":["a2dfp.net","fr.a2dfp.net","mfr.a2dfp.net"],"name":"Ad Decisive","link":"https://www.ghostery.com/whotracksme/trackers/ad_decisive"},{"id":"wtm_acxiom","hostnames":["t.acxiom-online.com"],"name":"Acxiom","link":"https://www.ghostery.com/whotracksme/trackers/acxiom"},{"id":"wtm_acuity_ads","hostnames":["acuityplatform.com","ums.acuityplatform.com"],"name":"Acuity Ads","link":"https://www.ghostery.com/whotracksme/trackers/acuity_ads"},{"id":"wtm_acton","hostnames":["actonsoftware.com","mktg.actonsoftware.com"],"name":"Act-On Beacon","link":"https://www.ghostery.com/whotracksme/trackers/acton"},{"id":"wtm_activecore","hostnames":["a-cast.jp","tracer.a-cast.jp"],"name":"activecore","link":"https://www.ghostery.com/whotracksme/trackers/activecore"},{"id":"wtm_active_campaign","hostnames":["trackcmp.net"],"name":"Active Campaign","link":"https://www.ghostery.com/whotracksme/trackers/active_campaign"},{"id":"wtm_actionpay","hostnames":["st.pc.adonweb.ru"],"name":"actionpay","link":"https://www.ghostery.com/whotracksme/trackers/actionpay"},{"id":"wtm_acrweb","hostnames":["ziyu.net","bbns.ziyu.net","clicktrack.ziyu.net","clicktrack2.ziyu.net","clicktrack3.ziyu.net","clicktrack4.ziyu.net","clicktrack5.ziyu.net","ctfile.ziyu.net","file.ziyu.net","js1.ziyu.net","pranking.ziyu.net","pranking10.ziyu.net","pranking11.ziyu.net","pranking12.ziyu.net","pranking2.ziyu.net","pranking3.ziyu.net","pranking4.ziyu.net","pranking5.ziyu.net","pranking6.ziyu.net","pranking7.ziyu.net","pranking8.ziyu.net","pranking9.ziyu.net","report2.ziyu.net","rranking.ziyu.net","rranking10.ziyu.net","rranking11.ziyu.net","rranking12.ziyu.net","rranking13.ziyu.net","rranking14.ziyu.net","rranking15.ziyu.net","rranking2.ziyu.net","rranking3.ziyu.net","rranking4.ziyu.net","rranking5.ziyu.net","rranking6.ziyu.net","rranking7.ziyu.net","rranking8.ziyu.net","rranking9.ziyu.net"],"name":"ACRWEB","link":"https://www.ghostery.com/whotracksme/trackers/acrweb"},{"id":"wtm_acint.net","hostnames":["www2.acint.net"],"name":"Artificial Computation Intelligence","link":"https://www.ghostery.com/whotracksme/trackers/acint.net"},{"id":"wtm_acecounter","hostnames":["cr.acecounter.com","www.home.acecounter.com","gtb5.acecounter.com","gtb19.acecounter.com","gtcc1.acecounter.com","gtp1.acecounter.com","gtp16.acecounter.com","wgc1.acecounter.com"],"name":"Acecounter","link":"https://www.ghostery.com/whotracksme/trackers/acecounter"},{"id":"wtm_accordant_media","hostnames":["go.accmgr.com"],"name":"Accordant Media","link":"https://www.ghostery.com/whotracksme/trackers/accordant_media"},{"id":"wtm_accord_group","hostnames":["dni.agcdn.com","afx.tagcdn.com","pix.tagcdn.com","aff.tagcdn.com"],"name":"Accord Group","link":"https://www.ghostery.com/whotracksme/trackers/accord_group"},{"id":"wtm_accesstrade","hostnames":["h.accesstrade.net"],"name":"AccessTrade","link":"https://www.ghostery.com/whotracksme/trackers/accesstrade"},{"id":"wtm_accessanalyzer","hostnames":["ax.xrea.com"],"name":"AccessAnalyzer","link":"https://www.ghostery.com/whotracksme/trackers/accessanalyzer"},{"id":"wtm_accengage","hostnames":["api.accengage.net","daraz-by.accengage.net"],"name":"Accengage","link":"https://www.ghostery.com/whotracksme/trackers/accengage"},{"id":"wtm_accelia","hostnames":["ala.durasite.net","netdreamersad.durasite.net","sankei2ad.durasite.net"],"name":"Accelia","link":"https://www.ghostery.com/whotracksme/trackers/accelia"},{"id":"wtm_ablida","hostnames":["bidder.ablida.net"],"name":"ablida","link":"https://www.ghostery.com/whotracksme/trackers/ablida"},{"id":"wtm_aaxads.com","hostnames":["aaxads.com","c.aaxads.com"],"name":"Acceptable Ads Exchange","link":"https://www.ghostery.com/whotracksme/trackers/aaxads.com"},{"id":"wtm_8digits","hostnames":["hit.8digits.com"],"name":"8digits","link":"https://www.ghostery.com/whotracksme/trackers/8digits"},{"id":"wtm_51.la","hostnames":["51.la","www.51.la","js.users.51.la"],"name":"51.La","link":"https://www.ghostery.com/whotracksme/trackers/51.la"},{"id":"wtm_4w_marketplace","hostnames":["feed.4wnet.com"],"name":"4w Marketplace","link":"https://www.ghostery.com/whotracksme/trackers/4w_marketplace"},{"id":"wtm_3dstats","hostnames":["www.3dstats.com"],"name":"3DStats","link":"https://www.ghostery.com/whotracksme/trackers/3dstats"},{"id":"wtm_33across","hostnames":["33across.com","pixel.33across.com","dp1.33across.com","cms-xch-chicago.33across.com","ssc.33across.com","ssc-cms.33across.com"],"name":"33Across","link":"https://www.ghostery.com/whotracksme/trackers/33across"},{"id":"wtm_2leep","hostnames":["2leep.com"],"name":"2leep","link":"https://www.ghostery.com/whotracksme/trackers/2leep"},{"id":"wtm_1plusx","hostnames":["tagger.opecloud.com"],"name":"1plusX","link":"https://www.ghostery.com/whotracksme/trackers/1plusx"},{"id":"wtm_161media","hostnames":["ads.creative-serving.com"],"name":"Platform161","link":"https://www.ghostery.com/whotracksme/trackers/161media"},{"id":"wtm_1000mercis","hostnames":["mmtro.com","cdn.mmtro.com","seg.mmtro.com"],"name":"1000mercis","link":"https://www.ghostery.com/whotracksme/trackers/1000mercis"},{"id":"exodus_95","hostnames":["mobileanalytics.us-east-1.amazonaws.com"],"name":"Amazon Analytics (Amazon insights)","exodusId":95,"link":"https://reports.exodus-privacy.eu.org/trackers/95"},{"id":"exodus_94","hostnames":["proximitykit.radiusnetworks.com"],"name":"Radius Networks","exodusId":94,"link":"https://reports.exodus-privacy.eu.org/trackers/94"},{"id":"exodus_91","hostnames":["graph.accountkit.com","www.graph.accountkit.com"],"name":"AccountKit","exodusId":91,"link":"https://reports.exodus-privacy.eu.org/trackers/91"},{"id":"exodus_90","hostnames":["adc3-launch.adcolony.com","adcolony.com","ads30.adcolony.com","androidads20.adcolony.com","androidads21.adcolony.com","androidads23.adcolony.com","events3alt.adcolony.com","wd.adcolony.com","adc3-assets.adcolony.com","androidads4-3.adcolony.com","androidads4-5.adcolony.com","androidads4-7.adcolony.com","androidads4-8.adcolony.com","c4d-cdn.adcolony.com","c4dm.adcolony.com","cpa.adcolony.com","events3.adcolony.com","iosads24.adcolony.com","rtb.adcolony.com","ads20.adcolony.com"],"name":"AdColony","exodusId":90,"link":"https://reports.exodus-privacy.eu.org/trackers/90"},{"id":"exodus_9","hostnames":["logs-01.loggly.com","logs.loggly.com"],"name":"Loggly","exodusId":9,"link":"https://reports.exodus-privacy.eu.org/trackers/9"},{"id":"exodus_89","hostnames":["dispatcher.mng-ads.com","mobile.mng-ads.com"],"name":"MAdvertise","exodusId":89,"link":"https://reports.exodus-privacy.eu.org/trackers/89"},{"id":"exodus_87","hostnames":["mars.telequid.com"],"name":"TeleQuid","exodusId":87,"link":"https://reports.exodus-privacy.eu.org/trackers/87"},{"id":"exodus_83","hostnames":["smaato.net","soma.smaato.net","ad.smaato.net","adtag.ad.smaato.net","api.ad.smaato.net","prebid.ad.smaato.net","s.ad.smaato.net","sdk-android.ad.smaato.net","sdk-ios.ad.smaato.net","unifiedbidding.ad.smaato.net","log.smaato.net","hbsdk-config.log.smaato.net","hbsdk-event.log.smaato.net","sdk-hb-cfg.smaato.net","soma-assets.smaato.net","track.smaato.net","ets-ap-southeast-1.track.smaato.net","ets-eu-west-1.track.smaato.net","ets-us-east-1.track.smaato.net","vet-us-east-1.track.smaato.net","geoclue.smaato.net","sdk.ad.smaato.net"],"name":"Smaato","exodusId":83,"link":"https://reports.exodus-privacy.eu.org/trackers/83"},{"id":"exodus_82","hostnames":["api.alphonso.tv","prov.alphonso.tv"],"name":"Alphonso","exodusId":82,"link":"https://reports.exodus-privacy.eu.org/trackers/82"},{"id":"exodus_81","hostnames":["sdk.shopkick.com"],"name":"Shopkick","exodusId":81,"link":"https://reports.exodus-privacy.eu.org/trackers/81"},{"id":"exodus_80","hostnames":["54.243.73.253:8080/SilverPush/","pix.silverpush.co"],"name":"SilverPush","exodusId":80,"link":"https://reports.exodus-privacy.eu.org/trackers/80"},{"id":"exodus_78","hostnames":["events.uber.com"],"name":"Uber Analytics","exodusId":78,"link":"https://reports.exodus-privacy.eu.org/trackers/78"},{"id":"exodus_77","hostnames":["api.hypertrack.com","hypertrack.amazonaws.com"],"name":"HyperTrack","exodusId":77,"link":"https://reports.exodus-privacy.eu.org/trackers/77"},{"id":"exodus_76","hostnames":["map.qq.com","analytics.map.qq.com"],"name":"WeChat Location","exodusId":76,"link":"https://reports.exodus-privacy.eu.org/trackers/76"},{"id":"exodus_75","hostnames":["map.baidu.com"],"name":"Baidu Maps","exodusId":75,"link":"https://reports.exodus-privacy.eu.org/trackers/75"},{"id":"exodus_73","hostnames":[".avocarrot.com","ads.glispa.com","exp.glispa.com","rtb.platform.glispa.com","templates.glispaconnect.com","trk.glispa.com","ads.avocarrot.com","sdklogs.avocarrot.com"],"name":"Glispa Connect (Formerly Avocarrot)","exodusId":73,"link":"https://reports.exodus-privacy.eu.org/trackers/73"},{"id":"exodus_72","hostnames":["applovin.com","applvn.com","a.applovin.com","a4.applovin.com","assets.applovin.com","d.applovin.com","dash.applovin.com","img.applovin.com","ms.applovin.com","ms4.applovin.com","pdn.applovin.com","prod-a.applovin.com","prod-bid.applovin.com","prod-ms.applovin.com","res1.applovin.com","rt.applovin.com","stage-a.applovin.com","stage-assets.applovin.com","stage-bid.applovin.com","stage-img.applovin.com","stage-ms.applovin.com","stage-pdn.applovin.com","ue.applovin.com","a.applvn.com","d.applvn.com","ms.applvn.com","rt.applvn.com","ms4.applvn.com"],"name":"AppLovin","exodusId":72,"link":"https://reports.exodus-privacy.eu.org/trackers/72"},{"id":"exodus_71","hostnames":[".google.com","ads.google.com","adservice.google.com","2mdn.net","doubleclick.net","marketingplatform.google.com","smartlock.google.com","fundingchoicesmessages.google.com","s0-2mdn-net.l.google.com","pagead-googlehosted.l.google.com","video-stats.video.google.com","ssl-google-analytics.l.google.com","analytics.google.com","mail-ads.google.com","pagead.l.google.com","partnerad.l.google.com","www-google-analytics.l.google.com","s0.2mdn.net","m1.2mdn.net","affiliate.2mdn.net","m.2mdn.net","gcdn.2mdn.net","rmcdn.2mdn.net","rmcdn.f.2mdn.net","s1.2mdn.net","static.2mdn.net","4436230.fls.doubleclick.net","www.4436230.fls.doubleclick.net","4448269.fls.doubleclick.net","www.4448269.fls.doubleclick.net","accounts.doubleclick.net","ad.doubleclick.net","ad-emea.doubleclick.net","ff.doubleclick.net","fls.doubleclick.net","3243857.fls.doubleclick.net","4394967.fls.doubleclick.net","5290727.fls.doubleclick.net","8168974.fls.doubleclick.net","8272590.fls.doubleclick.net","8397396.fls.doubleclick.net","g.doubleclick.net","adx.g.doubleclick.net","bid.g.doubleclick.net","cm.g.doubleclick.net","googleads.g.doubleclick.net","googleads4.g.doubleclick.net","pubads.g.doubleclick.net","securepubads.g.doubleclick.net","stats.g.doubleclick.net","survey.g.doubleclick.net","g1.doubleclick.net","ads-bid.l.doubleclick.net","dart.l.doubleclick.net","partnerad.l.doubleclick.net","stats.l.doubleclick.net","m.doubleclick.net","s0.doubleclick.net","static.doubleclick.net","3642305.fls.doubleclick.net","3765329.fls.doubleclick.net","4514783.fls.doubleclick.net","4923503.fls.doubleclick.net","4942839.fls.doubleclick.net","5582200.fls.doubleclick.net","8210643.fls.doubleclick.net","8482194.fls.doubleclick.net","8563004.fls.doubleclick.net","pagead.l.doubleclick.net","pagead46.l.doubleclick.net","undefined.fls.doubleclick.net","5362399.fls.doubleclick.net","dp.g.doubleclick.net","1435575.fls.doubleclick.net","2542116.fls.doubleclick.net","4053494.fls.doubleclick.net","4236808.fls.doubleclick.net","ad-g.doubleclick.net","ad2.doubleclick.net","ad.ae.doubleclick.net","ad.ar.doubleclick.net","ad.at.doubleclick.net","ad.au.doubleclick.net","ad.be.doubleclick.net","ad.br.doubleclick.net","ad.ca.doubleclick.net","ad.ch.doubleclick.net","ad.cl.doubleclick.net","ad.cn.doubleclick.net","ad.de.doubleclick.net","ad.dk.doubleclick.net","ad.es.doubleclick.net","ad.fi.doubleclick.net","ad.fr.doubleclick.net","ad.gr.doubleclick.net","ad.hk.doubleclick.net","ad.hr.doubleclick.net","ad.hu.doubleclick.net","ad.ie.doubleclick.net","ad.in.doubleclick.net","ad.jp.doubleclick.net","ad.kr.doubleclick.net","ad.it.doubleclick.net","ad.nl.doubleclick.net","ad.no.doubleclick.net","ad.nz.doubleclick.net","ad.pl.doubleclick.net","ad.pt.doubleclick.net","ad.ro.doubleclick.net","ad.ru.doubleclick.net","ad.se.doubleclick.net","ad.sg.doubleclick.net","ad.si.doubleclick.net","ad.terra.doubleclick.net","ad.th.doubleclick.net","ad.tw.doubleclick.net","ad.uk.doubleclick.net","ad.us.doubleclick.net","ad.za.doubleclick.net","ad.n2434.doubleclick.net","creatives.doubleclick.net","dfp.doubleclick.net","feedads.g.doubleclick.net","fls.uk.doubleclick.net","ir.doubleclick.net","iv.doubleclick.net","n4052ad.doubleclick.net","n4403ad.doubleclick.net","n479ad.doubleclick.net","paypalssl.doubleclick.net","s2.video.doubleclick.net","www3.doubleclick.net","www.doubleclick.net","ad.rs.doubleclick.net","ad-apac.doubleclick.net","ad.mo.doubleclick.net","adclick.g.doubleclick.net","gan.doubleclick.net","googleads2.g.doubleclick.net","n4061ad.hk.doubleclick.net","ad-ace.doubleclick.net","ad.bg.doubleclick.net","fls.au.doubleclick.net","ad.ve.doubleclick.net","ad.my.doubleclick.net","n4061ad.jp.doubleclick.net","pixel.invitemedia.com","adaptv.pixel.invitemedia.com","g-pixel.invitemedia.com","segment-pixel.invitemedia.com","t.invitemedia.com","conversion-pixel.invitemedia.com","akamai.invitemedia.com"],"name":"DoubleClick","exodusId":71,"link":"https://reports.exodus-privacy.eu.org/trackers/71"},{"id":"exodus_70","hostnames":[".facebook.com","an.facebook.com","pixel.facebook.com"],"name":"Facebook Share","exodusId":70,"link":"https://reports.exodus-privacy.eu.org/trackers/70"},{"id":"exodus_7","hostnames":["adsrvr.org","akamai.smartadserver.com","cdn1.smartadserver.com","diff2.smartadserver.com","diff3.smartadserver.com","diff.smartadserver.com","eqx.smartadserver.com","gallery.smartadserver.com","im2.smartadserver.com","insight.adsrvr.org","itx5-publicidad.smartadserver.com","itx5.smartadserver.com","js.adsrvr.org","match.adsrvr.org","preview.smartadserver.com","rtb-csync.smartadserver.com","smartadserver.com","tmk.smartadserver.com","usw-lax.adsrvr.org","a.adsrvr.org","ad.adsrvr.org","ca4-bid.adsrvr.org","data.adsrvr.org","de1-bid.adsrvr.org","direct.adsrvr.org","html5.adsrvr.org","jp1-bid.adsrvr.org","jp1-bid-ga.adsrvr.org","ny1-bid.adsrvr.org","sg2-bid.adsrvr.org","update.adsrvr.org","s.update.adsrvr.org","use-tor.adsrvr.org","usedirect.adsrvr.org","usw-ca2.adsrvr.org","uswdirect.adsrvr.org","v.adsrvr.org","va6-bid.adsrvr.org","vae-bid.adsrvr.org","rtb-csync-itx5.smartadserver.com","itx4.smartadserver.com","prg.smartadserver.com","prg3429.smartadserver.com","prg8.smartadserver.com","prga.smartadserver.com","qc.smartadserver.com","rtb-csync-itx4.smartadserver.com","rtb-csync-tmk.smartadserver.com","ssb-sgp.smartadserver.com","ssb-us.smartadserver.com","ssbsync.smartadserver.com","ssbsync-geo.smartadserver.com","ssbsync-global.smartadserver.com","ssbsync-us.smartadserver.com","ssp-csync.smartadserver.com","sync.smartadserver.com","tagmanager.smartadserver.com","usw1.smartadserver.com","ww1772.smartadserver.com","ww2951.smartadserver.com","ww3050.smartadserver.com","www9.smartadserver.com","www.adsrvr.org","rtb-csync-eqx.smartadserver.com","eqx-secure.smartadserver.com","geoced.smartadserver.com","itx4-secure.smartadserver.com","itx5-secure.smartadserver.com","na.smartadserver.com","sgp.smartadserver.com","ssbsync-sgp.smartadserver.com","ww2060.smartadserver.com","ww2060-sgp.smartadserver.com","ww3232.smartadserver.com","ww651.smartadserver.com","diff4.smartadserver.com","mobile.smartadserver.com","www2.smartadserver.com","www3.smartadserver.com","www4.smartadserver.com","www5.smartadserver.com","www6.smartadserver.com","ww14.smartadserver.com","ww38.smartadserver.com","ww57.smartadserver.com","ww62.smartadserver.com","ww84.smartadserver.com","ww129.smartadserver.com","ww135.smartadserver.com","ww147.smartadserver.com","ww150.smartadserver.com","ww206.smartadserver.com","ww251.smartadserver.com","ww302.smartadserver.com","ww370.smartadserver.com","ww381.smartadserver.com","ww392.smartadserver.com","ww400.smartadserver.com","ww690.smartadserver.com","ww691.smartadserver.com","ww797.smartadserver.com","ww965.smartadserver.com","ww1003.smartadserver.com","ww1097.smartadserver.com","ww1270.smartadserver.com","ww2026.smartadserver.com","ww2468.smartadserver.com","www.smartadserver.com","ww881.smartadserver.com","www8.smartadserver.com","csync.smartadserver.com","diff1.smartadserver.com","ww1510.smartadserver.com","www14.smartadserver.com","ak-ns.sascdn.com","mobileconfig.sascdn.com","ced.sascdn.com","static.styria-digital.com","smart.styria-digital.com"],"name":"SMART AdServer","exodusId":7,"link":"https://reports.exodus-privacy.eu.org/trackers/7"},{"id":"exodus_69","hostnames":[".facebook.com"],"name":"Facebook Places","exodusId":69,"link":"https://reports.exodus-privacy.eu.org/trackers/69"},{"id":"exodus_68","hostnames":[".facebook.com"],"name":"Facebook Notifications","exodusId":68,"link":"https://reports.exodus-privacy.eu.org/trackers/68"},{"id":"exodus_67","hostnames":[".facebook.com"],"name":"Facebook Login","exodusId":67,"link":"https://reports.exodus-privacy.eu.org/trackers/67"},{"id":"exodus_66","hostnames":[".facebook.com"],"name":"Facebook Analytics","exodusId":66,"link":"https://reports.exodus-privacy.eu.org/trackers/66"},{"id":"exodus_65","hostnames":[".facebook.com"],"name":"Facebook Ads","exodusId":65,"link":"https://reports.exodus-privacy.eu.org/trackers/65"},{"id":"exodus_63","hostnames":["management.azure.com"],"name":"Mobile Engagement","exodusId":63,"link":"https://reports.exodus-privacy.eu.org/trackers/63"},{"id":"exodus_62","hostnames":["api.segment.io","app.segment.com","cdn.segment.com","cdn-settings.segment.com","idsync.segment.com","mobile-service.segment.com","profiles.segment.com","d2dq2ahtl5zl1z.cloudfront.net","d47xnnr8b1rki.cloudfront.net","t.arcade.show","cdn.segment.io"],"name":"Segment","exodusId":62,"link":"https://reports.exodus-privacy.eu.org/trackers/62"},{"id":"exodus_61","hostnames":["apx.moatads.com","geo.moatads.com","js.moatads.com","mb.moatads.com","moat.com","pixel.moatads.com","px.moatads.com","sejs.moatads.com","yt.moatads.com","yts.moatads.com","z.moatads.com","ecs.mb.moatads.com","ap-southeast-1.ecs.mb.moatads.com","us-west-2.ecs.mb.moatads.com","panel.moat.com"],"name":"Moat","exodusId":61,"link":"https://reports.exodus-privacy.eu.org/trackers/61"},{"id":"exodus_60","hostnames":["api.locuslabs.com","assets.locuslabs.com","rest.locuslabs.com"],"name":"Locuslabs","exodusId":60,"link":"https://reports.exodus-privacy.eu.org/trackers/60"},{"id":"exodus_6","hostnames":["weborama.fr","weborama.com","cetelemportugal2.solution.weborama.fr","cstatic.weborama.fr","pg2.solution.weborama.fr","samsung3.solution.weborama.fr","solution.weborama.fr","vodafoneit.solution.weborama.fr","media.adrcdn.com"],"name":"Weborama","exodusId":6,"link":"https://reports.exodus-privacy.eu.org/trackers/6"},{"id":"exodus_57","hostnames":["cuebiq.com","in.cuebiq.com"],"name":"Cuebiq","exodusId":57,"link":"https://reports.exodus-privacy.eu.org/trackers/57"},{"id":"exodus_56","hostnames":["siterecruit.comscore.com","zqtk.net","segment-data.zqtk.net","segment-data-us-east.zqtk.net","t.zqtk.net"],"name":"ComScore","exodusId":56,"link":"https://reports.exodus-privacy.eu.org/trackers/56"},{"id":"exodus_55","hostnames":["api.areametrics.com"],"name":"Areametrics","exodusId":55,"link":"https://reports.exodus-privacy.eu.org/trackers/55"},{"id":"exodus_53","hostnames":[".chartboost.com","a2.chartboost.com","da.chartboost.com","live.chartboost.com","ssp-events.chartboost.com","t.chartboost.com","t2.chartboost.com","v-ak.chartboost.com","v2.chartboost.com","www.chartboost.com"],"name":"ChartBoost","exodusId":53,"link":"https://reports.exodus-privacy.eu.org/trackers/53"},{"id":"exodus_52","hostnames":["adj.st","adjust.com","3p3x.adj.st","4495.adj.st","94vs.adj.st","af4a.adj.st","bhpz.adj.st","q4mn.adj.st","r8qs.adj.st","sxj8.adj.st","app.adjust.com","s2s.adjust.com","ulink.adjust.com","app.us.adjust.com","view.adjust.com","7wmw.adj.st","nu9k.adj.st","qqrp.adj.st"],"name":"Adjust","exodusId":52,"link":"https://reports.exodus-privacy.eu.org/trackers/52"},{"id":"exodus_5","hostnames":["2mdn.net","doubleclick.com","doubleclick.net","mng-ads.com","s0.2mdn.net","accounts.doubleclick.net","ad.doubleclick.net","ad-emea.doubleclick.net","ff.doubleclick.net","fls.doubleclick.net","5290727.fls.doubleclick.net","8168974.fls.doubleclick.net","8397396.fls.doubleclick.net","g.doubleclick.net","adx.g.doubleclick.net","bid.g.doubleclick.net","cm.g.doubleclick.net","googleads.g.doubleclick.net","googleads4.g.doubleclick.net","pubads.g.doubleclick.net","securepubads.g.doubleclick.net","stats.g.doubleclick.net","survey.g.doubleclick.net","dart.l.doubleclick.net","m.doubleclick.net","s0.doubleclick.net","static.doubleclick.net","creative.mng-ads.com","dispatcher.mng-ads.com","lb-adsdis.mng-ads.com","lb-adsmob.mng-ads.com","mobile.mng-ads.com","www2.doubleclick.com","www3.doubleclick.com","www.doubleclick.com","mobileads.google.com","ads.google.com","googlesyndication.com","googleadservices.com","adservice.google..*","adservice.g.cn"],"name":"Adometry","exodusId":5,"link":"https://reports.exodus-privacy.eu.org/trackers/5"},{"id":"exodus_49","hostnames":["firebaselogging-pa.googleapis.com"],"name":"Google Firebase Analytics","exodusId":49,"link":"https://reports.exodus-privacy.eu.org/trackers/49"},{"id":"exodus_48","hostnames":["google-analytics.com","ssl.google-analytics.com","www.google-analytics.com","region1.google-analytics.com","googleanalytics.com","ssl.googleanalytics.com","click.googleanalytics.com","alt2.googleanalytics.com","alt4.googleanalytics.com","sandbox.googleanalytics.com"],"name":"Google Analytics","exodusId":48,"link":"https://reports.exodus-privacy.eu.org/trackers/48"},{"id":"exodus_47","hostnames":[".facebook.com","an.facebook.com","pixel.facebook.com"],"name":"Facebook Audience","exodusId":47,"link":"https://reports.exodus-privacy.eu.org/trackers/47"},{"id":"exodus_46","hostnames":["api.crowdtangle.com"],"name":"CrowdTangle","exodusId":46,"link":"https://reports.exodus-privacy.eu.org/trackers/46"},{"id":"exodus_45","hostnames":[".commander1.com",".tagcommander.com","engage.commander1.com","privacy.commander1.com","sync.commander1.com","cdn.tagcommander.com","serverside4285.tagcommander.com","mytheresa.commander1.com"],"name":"TagCommander (Commanders Act.)","exodusId":45,"link":"https://reports.exodus-privacy.eu.org/trackers/45"},{"id":"exodus_440","hostnames":["api.tusdk.com"],"name":"Tutucloud","exodusId":440,"link":"https://reports.exodus-privacy.eu.org/trackers/440"},{"id":"exodus_44","hostnames":["api.safegraph.com"],"name":"OpenLocate","exodusId":44,"link":"https://reports.exodus-privacy.eu.org/trackers/44"},{"id":"exodus_430","hostnames":["marketo.com",".mktorest.com","ab-mknodepub.marketo.com","abrtp1.marketo.com","abrtp1-cdn.marketo.com","app.marketo.com","app-ab01.marketo.com","app-ab02.marketo.com","app-ab03.marketo.com","app-ab04.marketo.com","app-ab05.marketo.com","app-ab06.marketo.com","app-ab07.marketo.com","app-ab08.marketo.com","app-ab09.marketo.com","app-ab10.marketo.com","app-ab11.marketo.com","app-ab12.marketo.com","app-ab13.marketo.com","app-ab14.marketo.com","app-ab15.marketo.com","app-ab16.marketo.com","app-ab17.marketo.com","app-ab18.marketo.com","app-ab19.marketo.com","app-ab20.marketo.com","app-ab21.marketo.com","app-ab22.marketo.com","app-ab23.marketo.com","app-ab24.marketo.com","app-ab25.marketo.com","app-ab26.marketo.com","app-ab27.marketo.com","app-ab28.marketo.com","app-ab29.marketo.com","app-ab30.marketo.com","app-ab31.marketo.com","app-ab32.marketo.com","app-ab33.marketo.com","app-ab34.marketo.com","app-aba.marketo.com","app-abb.marketo.com","app-abc.marketo.com","app-abd.marketo.com","app-abj.marketo.com","app-abk.marketo.com","app-abm.marketo.com","app-abq.marketo.com","app-e.marketo.com","app-lon02.marketo.com","app-lon03.marketo.com","app-lon04.marketo.com","app-lon05.marketo.com","app-lon06.marketo.com","app-lon07.marketo.com","app-lon08.marketo.com","app-sj01.marketo.com","app-sj02.marketo.com","app-sj03.marketo.com","app-sj04.marketo.com","app-sj05.marketo.com","app-sj06.marketo.com","app-sj07.marketo.com","app-sj08.marketo.com","app-sj09.marketo.com","app-sj10.marketo.com","app-sj11.marketo.com","app-sj13.marketo.com","app-sj14.marketo.com","app-sj15.marketo.com","app-sj16.marketo.com","app-sj17.marketo.com","app-sj19.marketo.com","app-sj20.marketo.com","app-sj21.marketo.com","app-sj22.marketo.com","app-sj24.marketo.com","app-sj25.marketo.com","app-sj28.marketo.com","app-sjf.marketo.com","app-sjg.marketo.com","app-sjh.marketo.com","app-sji.marketo.com","app-sjn.marketo.com","app-sjo.marketo.com","app-sjp.marketo.com","app-sjqe.marketo.com","app-sn01.marketo.com","b2c-msm.marketo.com","lonrtp1.marketo.com","lonrtp1-cdn.marketo.com","micro.marketo.com","na-ab19.marketo.com","na-ab20.marketo.com","na-ab25.marketo.com","na-ab26.marketo.com","na-ab33.marketo.com","na-b.marketo.com","na-g.marketo.com","na-sj23.marketo.com","nation.marketo.com","rtp-static.marketo.com","sj-mknodepub.marketo.com","sjrtp-cdn.marketo.com","sjrtp1.marketo.com","sjrtp2.marketo.com","sjrtp2-cdn.marketo.com","sjrtp3.marketo.com","sjrtp3-cdn.marketo.com","sjrtp4.marketo.com","sjrtp4-cdn.marketo.com","sjrtp5.marketo.com","sjrtp5-cdn.marketo.com","sjrtp6.marketo.com","sjrtp6-cdn.marketo.com","sjrtp7.marketo.com","sjrtp7-cdn.marketo.com","sjrtp8.marketo.com","sjrtp8-cdn.marketo.com","snrtp-cdn.marketo.com","snrtp1.marketo.com","munchkin.marketo.net","mktoresp.com","engage.marketo.com","na-ab28.marketo.com","na-ab30.marketo.com","na-ab31.marketo.com","na-sj06.marketo.com","na-sj14.marketo.com","na-sj24.marketo.com"],"name":"Marketo","exodusId":430,"link":"https://reports.exodus-privacy.eu.org/trackers/430"},{"id":"exodus_43","hostnames":["omniture.com","omtrdc.net","api.omniture.com","appservice5.omniture.com","hb.omtrdc.net","cbsinteractive.hb.omtrdc.net","espn.hb.omtrdc.net","foxnews.hb.omtrdc.net","hulu.hb.omtrdc.net","nbcume.hb.omtrdc.net","nbcume.hb-api.omtrdc.net","sc.omtrdc.net","allstate.sc.omtrdc.net","audible.sc.omtrdc.net","bamtech.sc.omtrdc.net","amazoncustomerservice.d2.sc.omtrdc.net","fox.com.ssl.d2.sc.omtrdc.net","philipslighting.d3.sc.omtrdc.net","deutschebahn.sc.omtrdc.net","nbcstreaming.sc.omtrdc.net","nbcume.sc.omtrdc.net","unitedparcelservice.sc.omtrdc.net","viacom.sc.omtrdc.net","vodafonetr.sc.omtrdc.net","tt.omtrdc.net","abcnews.tt.omtrdc.net","adobe.tt.omtrdc.net","aetv.tt.omtrdc.net","allstate.tt.omtrdc.net","audible.tt.omtrdc.net","bamtech.tt.omtrdc.net","cdn.tt.omtrdc.net","consumerinfo.tt.omtrdc.net","fcanafta.tt.omtrdc.net","foxnews.tt.omtrdc.net","homedepot.tt.omtrdc.net","mboxedge17.tt.omtrdc.net","mboxedge28.tt.omtrdc.net","mboxedge34.tt.omtrdc.net","southwestairlines.tt.omtrdc.net","subway2016.tt.omtrdc.net","verizontelecom.tt.omtrdc.net","2o7.net","du8783wkf05yr.cloudfront.net","hitbox.com","sitestat.com","sc5.omniture.com","stats.esomniture.com","www.omniture.com","e-2dj6wfk4ehd5afq.stats.esomniture.com","e-2dj6wfk4ggdzkbo.stats.esomniture.com","e-2dj6wfk4gkcpiep.stats.esomniture.com","e-2dj6wfk4skdpogo.stats.esomniture.com","e-2dj6wfkiakdjgcp.stats.esomniture.com","e-2dj6wfkiepczoeo.stats.esomniture.com","e-2dj6wfkikjd5glq.stats.esomniture.com","e-2dj6wfkiokc5odp.stats.esomniture.com","e-2dj6wfkiqjcpifp.stats.esomniture.com","e-2dj6wfkocjczedo.stats.esomniture.com","e-2dj6wfkokjajseq.stats.esomniture.com","e-2dj6wfkowkdjokp.stats.esomniture.com","e-2dj6wfkykpazskq.stats.esomniture.com","e-2dj6wflicocjklo.stats.esomniture.com","e-2dj6wfligpd5iap.stats.esomniture.com","e-2dj6wflikgdpodo.stats.esomniture.com","e-2dj6wflikiajslo.stats.esomniture.com","e-2dj6wflioldzoco.stats.esomniture.com","e-2dj6wfliwpczolp.stats.esomniture.com","e-2dj6wfloenczmkq.stats.esomniture.com","e-2dj6wflokmajedo.stats.esomniture.com","e-2dj6wfloqgc5mho.stats.esomniture.com","e-2dj6wfmysgdzobo.stats.esomniture.com","e-2dj6wgkigpcjedo.stats.esomniture.com","e-2dj6wgkisnd5abo.stats.esomniture.com","e-2dj6wgkoandzieq.stats.esomniture.com","e-2dj6wgkycpcpsgq.stats.esomniture.com","e-2dj6wgkyepajmeo.stats.esomniture.com","e-2dj6wgkyknd5sko.stats.esomniture.com","e-2dj6wgkyomdpalp.stats.esomniture.com","e-2dj6whkiandzkko.stats.esomniture.com","e-2dj6whkiepd5iho.stats.esomniture.com","e-2dj6whkiwjdjwhq.stats.esomniture.com","e-2dj6wjk4amd5mfp.stats.esomniture.com","e-2dj6wjk4kkcjalp.stats.esomniture.com","e-2dj6wjk4ukazebo.stats.esomniture.com","e-2dj6wjkosodpmaq.stats.esomniture.com","e-2dj6wjkouhd5eao.stats.esomniture.com","e-2dj6wjkowhd5ggo.stats.esomniture.com","e-2dj6wjkowjajcbo.stats.esomniture.com","e-2dj6wjkyandpogq.stats.esomniture.com","e-2dj6wjkycpdzckp.stats.esomniture.com","e-2dj6wjkyqmdzcgo.stats.esomniture.com","e-2dj6wjkysndzigp.stats.esomniture.com","e-2dj6wjl4qhd5kdo.stats.esomniture.com","e-2dj6wjlichdjoep.stats.esomniture.com","e-2dj6wjliehcjglp.stats.esomniture.com","e-2dj6wjlignajgaq.stats.esomniture.com","e-2dj6wjloagc5oco.stats.esomniture.com","e-2dj6wjlougazmao.stats.esomniture.com","e-2dj6wjlyamdpogo.stats.esomniture.com","e-2dj6wjlyckcpelq.stats.esomniture.com","e-2dj6wjlyeodjkcq.stats.esomniture.com","e-2dj6wjlygkd5ecq.stats.esomniture.com","e-2dj6wjmiekc5olo.stats.esomniture.com","e-2dj6wjmyehd5mfo.stats.esomniture.com","e-2dj6wjmyooczoeo.stats.esomniture.com","e-2dj6wjny-1idzkh.stats.esomniture.com","e-2dj6wjnyagcpkko.stats.esomniture.com","e-2dj6wjnyeocpcdo.stats.esomniture.com","e-2dj6wjnygidjskq.stats.esomniture.com","e-2dj6wjnyqkajabp.stats.esomniture.com","e-n.y-1shz2prbmdj6wvny-1sez2pra2dj6wjmyepdzadpwudj6x9ny-1seq-2-2.stats.esomniture.com","e-ny.a-1shz2prbmdj6wvny-1sez2pra2dj6wjny-1jcpgbowsdj6x9ny-1seq-2-2.stats.esomniture.com","stmicroelectronics.d3.sc.omtrdc.net","carfax.sc.omtrdc.net","coxcommunications.sc.omtrdc.net","kroger.sc.omtrdc.net","lplfinancial.sc.omtrdc.net","subwayfranchiseeadvertising.sc.omtrdc.net","bbg.d1.sc.omtrdc.net","buzzfeed.d1.sc.omtrdc.net","idgenterprise.d1.sc.omtrdc.net","lakeshore.d1.sc.omtrdc.net","pcworldcommunication.d2.sc.omtrdc.net","lowes.tt.omtrdc.net","nautilus.tt.omtrdc.net","toysrus.tt.omtrdc.net","1und1internetag.d3.sc.omtrdc.net","cafemom.d2.sc.omtrdc.net","centricabritishgas.d3.sc.omtrdc.net","comcastresidentialservices.tt.omtrdc.net","comvelgmbh.d1.sc.omtrdc.net","condenast.insight.omtrdc.net","cri.d1.sc.omtrdc.net","daimlerag.d2.sc.omtrdc.net","espndotcom.tt.omtrdc.net","fairfaxau.d1.sc.omtrdc.net","hm.d1.sc.omtrdc.net","internetretailer.d2.sc.omtrdc.net","marchofdimes.d2.sc.omtrdc.net","mashable.d2.sc.omtrdc.net","nascardigitalsap.d2.sc.omtrdc.net","nzz.d3.sc.omtrdc.net","nydailynews.d1.sc.omtrdc.net","petfooddirect.d1.sc.omtrdc.net","rtve.d1.sc.omtrdc.net","seb.d1.sc.omtrdc.net","softlayer.d1.sc.omtrdc.net","tacobell.d1.sc.omtrdc.net","crain.d1.sc.omtrdc.net","newjobs.d1.sc.omtrdc.net","rodale.d1.sc.omtrdc.net","siemens.d1.sc.omtrdc.net","truevalue.d2.sc.omtrdc.net","americaneagleoutfitt.tt.omtrdc.net","angieslist.tt.omtrdc.net","carbonite.tt.omtrdc.net","comcast.tt.omtrdc.net","educationmanagementl.tt.omtrdc.net","dellinc.tt.omtrdc.net","readersdigest.tt.omtrdc.net","rentcom.tt.omtrdc.net","reunion.tt.omtrdc.net","abcnews.hb.omtrdc.net","amazonwebservices.d2.sc.omtrdc.net","qatarairways.tt.omtrdc.net","babycenter.tt.omtrdc.net","bankofamerica.tt.omtrdc.net","discoverecommerce.tt.omtrdc.net","huntingtonbank.tt.omtrdc.net","idearc.tt.omtrdc.net","jcrew.tt.omtrdc.net","marriottinternationa.tt.omtrdc.net","opentable.tt.omtrdc.net","overstock.tt.omtrdc.net","restaurantcom.tt.omtrdc.net","rosettastone.tt.omtrdc.net","salesforcecom.tt.omtrdc.net","schwab.tt.omtrdc.net","sonycomputerentertai.tt.omtrdc.net","stampscom.tt.omtrdc.net","surveymonkeycom.tt.omtrdc.net","tdameritrade.tt.omtrdc.net","turnerapac.d1.sc.omtrdc.net","webmdcom.tt.omtrdc.net","yodleeinc.tt.omtrdc.net","logitechlogitechglobal.112.2o7.net","www.logitechlogitechglobal.112.2o7.net","www.2o7.net","va-pool.2o7.net","ns-4.2o7.net","hertz.122.2o7.net","starz.122.2o7.net","vodafonenz.122.2o7.net","aoltmz.122.2o7.net","bestbuy.122.2o7.net","coty.122.2o7.net","aolwbpspfboy.122.2o7.net","journalregistercompany.122.2o7.net","millerbrewingcompany.122.2o7.net","aolgamedaily.122.2o7.net","zipzoomfly.122.2o7.net","infrastrategy.122.2o7.net","survey.122.2o7.net","aolturnercnnmoney.122.2o7.net","wrigley.122.2o7.net","gateway.122.2o7.net","newsday.122.2o7.net","movitex.122.2o7.net","westwickfarrow.122.2o7.net","aolwpnswhatsnew.122.2o7.net","multiview.122.2o7.net","timeew.122.2o7.net","actontv.122.2o7.net","lintv.122.2o7.net","premiumtv.122.2o7.net","chumtv.122.2o7.net","aolmov.122.2o7.net","jiktnv.122.2o7.net","thestardev.122.2o7.net","meetupdev.122.2o7.net","webmetrodev.122.2o7.net","cnhinewsservicedev.122.2o7.net","planetout.122.2o7.net","ipcuncut.122.2o7.net","saxoeverett.122.2o7.net","rtst.122.2o7.net","vitacost.122.2o7.net","aolwbluxist.122.2o7.net","aolstylist.122.2o7.net","timespctenbest.122.2o7.net","cnnireport.122.2o7.net","extrovert.122.2o7.net","dmcontactmanagement.122.2o7.net","cyberagent.122.2o7.net","cnhidailyindependent.122.2o7.net","lucent.122.2o7.net","ciaoshopit.122.2o7.net","laxwht.122.2o7.net","swsoft.122.2o7.net","eset.122.2o7.net","aolwbengadget.122.2o7.net","dunandbradstreet.122.2o7.net","bet.122.2o7.net","bobcat.122.2o7.net","saxopeninsuladailynews.122.2o7.net","usnews.122.2o7.net","aolnews.122.2o7.net","dealnews.122.2o7.net","sportingnews.122.2o7.net","aolmus.122.2o7.net","aolsports.122.2o7.net","amazonmerchants.122.2o7.net","americanexpress.122.2o7.net","thelibraryofcongress.122.2o7.net","primediabusiness.122.2o7.net","hisnakiamotors.122.2o7.net","trailblazers.122.2o7.net","saxofosters.122.2o7.net","rrpartners.122.2o7.net","timehealthtips.122.2o7.net","efashionsolutions.122.2o7.net","timeoutcommunications.122.2o7.net","nttcommunications.122.2o7.net","saxowesterncommunications.122.2o7.net","haymarketbusinesspublications.122.2o7.net","bentleysystems.122.2o7.net","aolpolls.122.2o7.net","aoljournals.122.2o7.net","powellsbooks.122.2o7.net","aolbks.122.2o7.net","tescostores.122.2o7.net","tomsshoes.122.2o7.net","austrianairlines.122.2o7.net","saxowatertowndailytimes.122.2o7.net","chicagosuntimes.122.2o7.net","stpetersburgtimes.122.2o7.net","popcapgames.122.2o7.net","homesteadtechnologies.122.2o7.net","superpages.122.2o7.net","adpretirementservices.122.2o7.net","amazonservices.122.2o7.net","vogelservices.122.2o7.net","lgelectronics.122.2o7.net","jaccs.122.2o7.net","entrepreneur.122.2o7.net","bmwmotor.122.2o7.net","saxoconcordmonitor.122.2o7.net","gsgir.122.2o7.net","pfizer.122.2o7.net","manpower.122.2o7.net","bmwmoter.122.2o7.net","saxotechtylerpaper.122.2o7.net","cnhinewscourier.122.2o7.net","cyberdefender.122.2o7.net","zdau-builder.122.2o7.net","marksandspencer.122.2o7.net","aolcamember.122.2o7.net","eurostar.122.2o7.net","thestar.122.2o7.net","goodyear.122.2o7.net","netgear.122.2o7.net","aolffxtoolbar.122.2o7.net","aoltoolbar.122.2o7.net","aolwbtvsq.122.2o7.net","aolwbdnlsq.122.2o7.net","aolwpmq.122.2o7.net","nasdaq.122.2o7.net","1105governmentinformationgroup.122.2o7.net","vodafonegroup.122.2o7.net","createthegroup.122.2o7.net","reagroup.122.2o7.net","experianservicescorp.122.2o7.net","bonniercorp.122.2o7.net","olwmbhrp.122.2o7.net","aarp.122.2o7.net","amznshopbop.122.2o7.net","amazonshopbop.122.2o7.net","aolcmp.122.2o7.net","aolwinamp.122.2o7.net","parship.122.2o7.net","sento.122.2o7.net","saxogreensboro.122.2o7.net","harpo.122.2o7.net","indigio.122.2o7.net","aoltruveo.122.2o7.net","aolvideo.122.2o7.net","saxotoledo.122.2o7.net","cnhijohnstown.122.2o7.net","mun.122.2o7.net","smokinggun.122.2o7.net","ozon.122.2o7.net","allbritton.122.2o7.net","skyauction.122.2o7.net","asiainspection.122.2o7.net","bradycorporation.122.2o7.net","toyotamotorcorporation.122.2o7.net","interchangecorporation.122.2o7.net","healthination.122.2o7.net","livenation.122.2o7.net","pcworldcommunication.122.2o7.net","albanytimesunion.122.2o7.net","cnn.122.2o7.net","nihonkogakuin.122.2o7.net","alliancebernstein.122.2o7.net","tgn.122.2o7.net","phillipsvanheusen.122.2o7.net","aolcsmen.122.2o7.net","volkswagen.122.2o7.net","cbn.122.2o7.net","cnetjapan.122.2o7.net","developjapan.122.2o7.net","atlassian.122.2o7.net","clubmom.122.2o7.net","heavycom.122.2o7.net","buycom.122.2o7.net","newcom.122.2o7.net","farecastcom.122.2o7.net","giftscom.122.2o7.net","aolwpnscom.122.2o7.net","hotelscom.122.2o7.net","jrcdelcotimescom.122.2o7.net","insiderpagescom.122.2o7.net","registercom.122.2o7.net","examinercom.122.2o7.net","apalmercom.122.2o7.net","ciaocom.122.2o7.net","bwincom.122.2o7.net","yellcom.122.2o7.net","jcom.122.2o7.net","infratotalduicom.122.2o7.net","kopticom.122.2o7.net","advertisingcom.122.2o7.net","timecom.122.2o7.net","montblanccom.122.2o7.net","americanblinds.com.122.2o7.net","sa.aol.com.122.2o7.net","popsci.com.122.2o7.net","flyingmag.com.122.2o7.net","maxim.122.2o7.net","adultswim.122.2o7.net","fim.122.2o7.net","saxosumteritem.122.2o7.net","aolcommem.122.2o7.net","usdm.122.2o7.net","aolgam.122.2o7.net","highbeam.122.2o7.net","universityofchicagograduateschool.122.2o7.net","timepespanol.122.2o7.net","csaisonmail.122.2o7.net","aoldechattpportal.122.2o7.net","hearstdigital.122.2o7.net","torstardigital.122.2o7.net","associatednorthcliffedigital.122.2o7.net","nbcuniversal.122.2o7.net","newsinternational.122.2o7.net","cnhiautovertical.122.2o7.net","amdvglobal.122.2o7.net","cnnglobal.122.2o7.net","partygamingglobal.122.2o7.net","microsoftuk.122.2o7.net","ciaoshopcouk.122.2o7.net","aoluk.122.2o7.net","avivauk.122.2o7.net","and.co.uk.122.2o7.net","cartoonnetwork.122.2o7.net","dragerwerk.122.2o7.net","earthlink.122.2o7.net","guj.122.2o7.net","jiwtmj.122.2o7.net","aolturnersi.122.2o7.net","mlarmani.122.2o7.net","rcci.122.2o7.net","senshukai.122.2o7.net","cardinalhealth.122.2o7.net","aolmobdash.122.2o7.net","saxotelegraph.122.2o7.net","aolswitch.122.2o7.net","ussearch.122.2o7.net","aolnssearch.122.2o7.net","aolsearch.122.2o7.net","pch.122.2o7.net","awarenesstech.122.2o7.net","saxotech.122.2o7.net","hyperlinktech.122.2o7.net","aollatblog.122.2o7.net","aolwbautoblog.122.2o7.net","imiliving.122.2o7.net","partygaming.122.2o7.net","aolwbgadling.122.2o7.net","bellglobemediapublishing.122.2o7.net","buydig.122.2o7.net","bshg.122.2o7.net","aolcg.122.2o7.net","zag.122.2o7.net","daimlerag.122.2o7.net","laptopmag.122.2o7.net","aolpf.122.2o7.net","couponchief.122.2o7.net","aollove.122.2o7.net","belointeractive.122.2o7.net","tribuneinteractive.122.2o7.net","marketlive.122.2o7.net","earthlnkpsplive.122.2o7.net","saksfifthavenue.122.2o7.net","deloitte.122.2o7.net","eventbrite.122.2o7.net","adbrite.122.2o7.net","allstate.122.2o7.net","brighthouse.122.2o7.net","honfurniture.122.2o7.net","thomasvillefurniture.122.2o7.net","homestore.122.2o7.net","amazonwebstore.122.2o7.net","prnewswire.122.2o7.net","cantire.122.2o7.net","smokingeverywhere.122.2o7.net","cneteurope.122.2o7.net","cnhieagletribune.122.2o7.net","cnhibatesvilleheraldtribune.122.2o7.net","timefoodandwine.122.2o7.net","cnhibdtonline.122.2o7.net","jijsonline.122.2o7.net","sylvane.122.2o7.net","whitecastle.122.2o7.net","timeteenpeople.122.2o7.net","timepeople.122.2o7.net","microsoftwindowsmobile.122.2o7.net","virginmobile.122.2o7.net","gianteagle.122.2o7.net","saxobutlereagle.122.2o7.net","cnhirecordeagle.122.2o7.net","cnhicrossvillechronicle.122.2o7.net","aoldrambuie.122.2o7.net","saxogoerie.122.2o7.net","stgeorge.122.2o7.net","mckinseyknowledge.122.2o7.net","timelife.122.2o7.net","metacafe.122.2o7.net","wissende.122.2o7.net","parade.122.2o7.net","bahn.de.122.2o7.net","salesforce.122.2o7.net","timeessence.122.2o7.net","avivafrance.122.2o7.net","bostonglobe.122.2o7.net","cnhijoplinglobe.122.2o7.net","aolwbwowinsd.122.2o7.net","ipcnowprod.122.2o7.net","superpagesdexknowsprod.122.2o7.net","wcastrprod.122.2o7.net","ipcwebuserprod.122.2o7.net","mswmwpapolloprod.122.2o7.net","bertelwissenprod.122.2o7.net","amexopenprod.122.2o7.net","aoncomprod.122.2o7.net","f5networksdevcentralprod.122.2o7.net","f5networksthreatstackprod.122.2o7.net","oodpreprod.122.2o7.net","ipcmarieclaireprod.122.2o7.net","nmeprod.122.2o7.net","ipcyachtingworldprod.122.2o7.net","poacprod.122.2o7.net","hollywood.122.2o7.net","bigpond.122.2o7.net","saxorutland.122.2o7.net","interland.122.2o7.net","saxowenworld.122.2o7.net","aolcommvid.122.2o7.net","cnhienid.122.2o7.net","konicaminoltahd.122.2o7.net","aolshred.122.2o7.net","aolsvc.122.2o7.net","entrepreneurpoc.122.2o7.net","intuitinc.122.2o7.net","marketworksinc.122.2o7.net","memberservicesinc.122.2o7.net","facebookinc.122.2o7.net","timeinc.122.2o7.net","montblanc.122.2o7.net","vpmc.122.2o7.net","mmc.122.2o7.net","emc.122.2o7.net","wlaptoplogic.122.2o7.net","medialogic.122.2o7.net","cnetasiapacific.122.2o7.net","fdic.122.2o7.net","opinionlabcc.122.2o7.net","cbc.122.2o7.net","stubhub.122.2o7.net","snagajob.122.2o7.net","aolinttlb.122.2o7.net","softbankbb.122.2o7.net","factiva.122.2o7.net","eloqua.122.2o7.net","brangista.122.2o7.net","usenpita.122.2o7.net","alliancedata.122.2o7.net","mattressusa.122.2o7.net","edsa.122.2o7.net","belluna.122.2o7.net","aolwbcinema.122.2o7.net","aoldlama.122.2o7.net","capella.122.2o7.net","patagonia.122.2o7.net","cnetaustralia.122.2o7.net","pelmorexmedia.122.2o7.net","hswmedia.122.2o7.net","rainbowmedia.122.2o7.net","fwmedia.122.2o7.net","itmedia.122.2o7.net","riptownmedia.122.2o7.net","pentonmedia.122.2o7.net","newsquestdigitalmedia.122.2o7.net","foxinteractivemedia.122.2o7.net","gatehousemedia.122.2o7.net","poweronemedia.122.2o7.net","ipcmedia.122.2o7.net","atlanticmedia.122.2o7.net","saxoorklamedia.122.2o7.net","yamaha.122.2o7.net","www.ikea.122.2o7.net","aolyedda.122.2o7.net","skinmedica.122.2o7.net","cba.122.2o7.net","192.168.122.2o7.net","ptvgoalv15.122.2o7.net","imc2.122.2o7.net","bottegaverde.it.102.122.2o7.net","teambeachbody.com.102.122.2o7.net","beachbody.com.102.122.2o7.net","digitalinsight.com.102.122.2o7.net","avnet.com.102.122.2o7.net","adultswim.com.102.122.2o7.net","northwesternmutual.com.102.122.2o7.net","active.com.102.122.2o7.net","randomhouse.com.102.122.2o7.net","autozone.com.102.122.2o7.net","avaya.com.102.122.2o7.net","aafp.org.102.122.2o7.net","bahn.de.102.122.2o7.net","102.122.2o7.net","mkt10.122.2o7.net","122.2o7.net","furnlevitz.112.2o7.net","viaquiz.112.2o7.net","gntbcstwlbz.112.2o7.net","gntbcstwmaz.112.2o7.net","amzna2z.112.2o7.net","ameritradeogilvy.112.2o7.net","algbdconsumerloyalty.112.2o7.net","azusapacificuniversity.112.2o7.net","nmkansascity.112.2o7.net","aehistory.112.2o7.net","patrickhillery.112.2o7.net","ctvcrimelibrary.112.2o7.net","cancalgary.112.2o7.net","eharmony.112.2o7.net","corporationservicecompany.112.2o7.net","newyorkandcompany.112.2o7.net","dummy.112.2o7.net","gntbcstwfmy.112.2o7.net","multiply.112.2o7.net","randmcnally.112.2o7.net","10xonegreatfamily.112.2o7.net","scrippsdiy.112.2o7.net","bhgdiy.112.2o7.net","nmmclatchy.112.2o7.net","mcclatchy.112.2o7.net","nyttechnology.112.2o7.net","softbanktechnology.112.2o7.net","avidtechnology.112.2o7.net","survey.112.2o7.net","northjersey.112.2o7.net","jcwhitney.112.2o7.net","smartmoney.112.2o7.net","msnportalprivacy.112.2o7.net","oberoniplay.112.2o7.net","bruceclay.112.2o7.net","4imprintdealoftheday.112.2o7.net","divx.112.2o7.net","ziffdavisdesktoplinux.112.2o7.net","nytrthibodaux.112.2o7.net","gntbcstwltx.112.2o7.net","doctorsassociatesrx.112.2o7.net","algbotox.112.2o7.net","microsoftxbox.112.2o7.net","tjx.112.2o7.net","algozurdex.112.2o7.net","ciscowebex.112.2o7.net","carfax.112.2o7.net","smwww.112.2o7.net","bbhwww.112.2o7.net","mgjournalnow.112.2o7.net","mgoanow.112.2o7.net","foxamw.112.2o7.net","scrippsfoodnetnew.112.2o7.net","aolwpnswhatsnew.112.2o7.net","techreview.112.2o7.net","gntbcstkxtv.112.2o7.net","tnttv.112.2o7.net","tbstv.112.2o7.net","viamtv.112.2o7.net","itv.112.2o7.net","ctvtsgtv.112.2o7.net","scrippshgtv.112.2o7.net","fusetv.112.2o7.net","aetv.112.2o7.net","mngisv.112.2o7.net","sbsblukgov.112.2o7.net","gntbcstwtlv.112.2o7.net","gntbcstkthv.112.2o7.net","huludev.112.2o7.net","mswlspcmktdev.112.2o7.net","activecampaignsubsdev.112.2o7.net","bladeshadowlauncherdev.112.2o7.net","brunswickcorporationbcgpdev.112.2o7.net","lenovosimpletapdev.112.2o7.net","allianceacdtmdev.112.2o7.net","btcomdev.112.2o7.net","cxocomdev.112.2o7.net","pldev.112.2o7.net","viamtvukdev.112.2o7.net","byuibyuidev.112.2o7.net","btoreachdev.112.2o7.net","evepdeagledev.112.2o7.net","ehadvicedev.112.2o7.net","bnebnefdcdev.112.2o7.net","capelladev.112.2o7.net","bancoaztecadev.112.2o7.net","bnkr8dev.112.2o7.net","tel3adv.112.2o7.net","mgwsav.112.2o7.net","homepproav.112.2o7.net","byu.112.2o7.net","midcru.112.2o7.net","hulu.112.2o7.net","byuibyuiedu.112.2o7.net","mdwjuneau.112.2o7.net","vianewnownext.112.2o7.net","expedia6vt.112.2o7.net","conpst.112.2o7.net","denverpost.112.2o7.net","cannationalpost.112.2o7.net","canfinancialpost.112.2o7.net","canadapost.112.2o7.net","optimost.112.2o7.net","angieslist.112.2o7.net","viavh1scandalist.112.2o7.net","canwest.112.2o7.net","bankwest.112.2o7.net","ameritradeamerivest.112.2o7.net","amdvtest.112.2o7.net","siriuscontenttest.112.2o7.net","boltonadhuhufrtest.112.2o7.net","condenast.112.2o7.net","questdsgsupport.112.2o7.net","nmbeaufort.112.2o7.net","mdwskirt.112.2o7.net","sixapart.112.2o7.net","walmart.112.2o7.net","jackpot.112.2o7.net","webroot.112.2o7.net","vcomdeepdiscount.112.2o7.net","ziffdavisfilefront.112.2o7.net","associatedcontent.112.2o7.net","mgstarexponent.112.2o7.net","emblhthdevelopment.112.2o7.net","lccronadevelopment.112.2o7.net","wbprocurement.112.2o7.net","bgeo1xxpnwparliament.112.2o7.net","microsoftwlmessengermkt.112.2o7.net","microsoftwlmailmkt.112.2o7.net","microsoftwllivemkt.112.2o7.net","microsoftwlmobilemkt.112.2o7.net","recruit.112.2o7.net","natgeoedit.112.2o7.net","laxwht.112.2o7.net","chgsupereight.112.2o7.net","buzznet.112.2o7.net","coxnet.112.2o7.net","gmointernet.112.2o7.net","ottacknet.112.2o7.net","acckalaharinet.112.2o7.net","msstonojstechnet.112.2o7.net","cnetzdnet.112.2o7.net","scrippsfoodnet.112.2o7.net","btigspresalessandt.112.2o7.net","mgwnct.112.2o7.net","brandmuscleinstantimpact.112.2o7.net","f2nbt.112.2o7.net","omniscbt.112.2o7.net","amazonhrhvhuat.112.2o7.net","mngiyhnat.112.2o7.net","kerplat.112.2o7.net","microsoftwindows.112.2o7.net","laxnws.112.2o7.net","f2communitynews.112.2o7.net","mngimercurynews.112.2o7.net","msnportalaunews.112.2o7.net","deseretnews.112.2o7.net","cnetnews.112.2o7.net","natgeonews.112.2o7.net","mngirockymtnnews.112.2o7.net","wbnews.112.2o7.net","tmslexus.112.2o7.net","sonyelectronicssupportus.112.2o7.net","affargenus.112.2o7.net","aramarkus.112.2o7.net","agnvbmaus.112.2o7.net","evepdbrazossports.112.2o7.net","turnersports.112.2o7.net","evepdaggiesports.112.2o7.net","electronicarts.112.2o7.net","biglots.112.2o7.net","agwebshots.112.2o7.net","mdpparents.112.2o7.net","dardenrestaurants.112.2o7.net","spencergifts.112.2o7.net","gourmetgiftbaskets.112.2o7.net","bostoncommonpress.112.2o7.net","primemensfitness.112.2o7.net","alliancefrictionless.112.2o7.net","verizonwireless.112.2o7.net","nikegoddess.112.2o7.net","laxprs.112.2o7.net","alliancebreadfinancialinvestors.112.2o7.net","uolfreeservers.112.2o7.net","mediamatters.112.2o7.net","shawnewspapers.112.2o7.net","omniturebanners.112.2o7.net","viagametrailers.112.2o7.net","deckers.112.2o7.net","schaeffers.112.2o7.net","borders.112.2o7.net","sears.112.2o7.net","ewscripps.112.2o7.net","philips.112.2o7.net","viaaddictingclips.112.2o7.net","warnerbros.112.2o7.net","walgrns.112.2o7.net","networksolutions.112.2o7.net","intouchsolutions.112.2o7.net","classicvacations.112.2o7.net","mdwathens.112.2o7.net","eplans.112.2o7.net","hickoryfarms.112.2o7.net","bigfishgamesprodesntls.112.2o7.net","bbgbrukerbiospinprodesntls.112.2o7.net","dpiprodesntls.112.2o7.net","a2aprodesntls.112.2o7.net","mgwsls.112.2o7.net","bureaunacustomertools.112.2o7.net","xhealthmobiltools.112.2o7.net","brifiols.112.2o7.net","mgtbopanels.112.2o7.net","bizjournals.112.2o7.net","rebtelnetworks.112.2o7.net","sparknetworks.112.2o7.net","brooks.112.2o7.net","safaribooks.112.2o7.net","bnk30livejs.112.2o7.net","johnlewis.112.2o7.net","avis.112.2o7.net","calpis.112.2o7.net","nmminneapolis.112.2o7.net","ewsmemphis.112.2o7.net","his.112.2o7.net","harrahs.112.2o7.net","sonygs.112.2o7.net","agegreetings.112.2o7.net","fujielectricholdings.112.2o7.net","gmgmacfs.112.2o7.net","jpmpartnersites.112.2o7.net","gmglobalt3sites.112.2o7.net","msnlivefavorites.112.2o7.net","epocrates.112.2o7.net","dominionenterprises.112.2o7.net","leeenterprises.112.2o7.net","pccomponenteses.112.2o7.net","hearstmagazines.112.2o7.net","acpmagazines.112.2o7.net","northwestairlines.112.2o7.net","malaysiaairlines.112.2o7.net","caravelgames.112.2o7.net","viaaddictinggames.112.2o7.net","ewsnaples.112.2o7.net","eaglemiles.112.2o7.net","mngitwincities.112.2o7.net","mgtricities.112.2o7.net","joelosteenministries.112.2o7.net","avgtechnologies.112.2o7.net","corinthiancolleges.112.2o7.net","karavelabcroisierees.112.2o7.net","healthgrades.112.2o7.net","msnaccountservices.112.2o7.net","msnservices.112.2o7.net","viasatsatelliteservices.112.2o7.net","searshomeservices.112.2o7.net","natgeopeopleplaces.112.2o7.net","warnerbrothersrecords.112.2o7.net","dillards.112.2o7.net","plsoyfoods.112.2o7.net","edmunds.112.2o7.net","corelividkds.112.2o7.net","ezgds.112.2o7.net","tbsveryfunnyads.112.2o7.net","analytics.112.2o7.net","fanatics.112.2o7.net","jetbluepkgcs.112.2o7.net","gsicpbs.112.2o7.net","wpnipostcomjobs.112.2o7.net","smibs.112.2o7.net","cbs.112.2o7.net","abbottlabs.112.2o7.net","novonordiskas.112.2o7.net","viamtvtr3s.112.2o7.net","cbspgatour.112.2o7.net","viamtvtr.112.2o7.net","vrsmicros38msfteducationstorepr.112.2o7.net","suzukimotor.112.2o7.net","trinitymirror.112.2o7.net","intelcorperror.112.2o7.net","scrippsfrontdoor.112.2o7.net","telenor.112.2o7.net","synacor.112.2o7.net","nebnr.112.2o7.net","gntbcstwbir.112.2o7.net","grunerandjahr.112.2o7.net","cfr.112.2o7.net","pfizer.112.2o7.net","gjincscobleizer.112.2o7.net","viaukplayer.112.2o7.net","viabestweekever.112.2o7.net","dotster.112.2o7.net","nytrworcester.112.2o7.net","bassmaster.112.2o7.net","microsoftadvertisingdevcenter.112.2o7.net","concursolutionseudatacenter.112.2o7.net","concursolutionsusdatacenter.112.2o7.net","spamfighter.112.2o7.net","microsoftinternetexplorer.112.2o7.net","harconsumer.112.2o7.net","wweconsumer.112.2o7.net","aumofourwheeler.112.2o7.net","guthyrenker.112.2o7.net","wbrostheatricalother.112.2o7.net","kiplinger.112.2o7.net","f2nmycareer.112.2o7.net","gpapercareer.112.2o7.net","asahibeer.112.2o7.net","saxounionleader.112.2o7.net","neber.112.2o7.net","angdr.112.2o7.net","angpar.112.2o7.net","angmar.112.2o7.net","mgwjar.112.2o7.net","vermontteddybear.112.2o7.net","midar.112.2o7.net","hisrentalcar.112.2o7.net","scrippsrecipezaar.112.2o7.net","autobytelcorppopup.112.2o7.net","citgroup.112.2o7.net","costargroup.112.2o7.net","capitalgroup.112.2o7.net","thegroup.112.2o7.net","enterprisemediagroup.112.2o7.net","infoworldmediagroup.112.2o7.net","adviggroupdailyfxrollup.112.2o7.net","adviggrouprollup.112.2o7.net","vialogorollup.112.2o7.net","microsofteup.112.2o7.net","gntbcstwtsp.112.2o7.net","yrkdsp.112.2o7.net","pennwellcorp.112.2o7.net","neccorp.112.2o7.net","mediacorp.112.2o7.net","intelcorpsupp.112.2o7.net","wdgnewabcnewsandroidapp.112.2o7.net","app.112.2o7.net","elkjop.112.2o7.net","cmp.112.2o7.net","nikonjp.112.2o7.net","videorvrcip.112.2o7.net","riverdeep.112.2o7.net","adp.112.2o7.net","msnportalscp.112.2o7.net","jmsyap.112.2o7.net","bhgscrap.112.2o7.net","sofmap.112.2o7.net","gap.112.2o7.net","microsoftsto.112.2o7.net","nmmodesto.112.2o7.net","natgeophoto.112.2o7.net","nmsacramento.112.2o7.net","mediabistro.112.2o7.net","10xhellometro.112.2o7.net","scrippshgtvpro.112.2o7.net","nmsanluisobispo.112.2o7.net","nmfresno.112.2o7.net","msnportallatino.112.2o7.net","yukoyuko.112.2o7.net","microsoftgamestudio.112.2o7.net","byuidaho.112.2o7.net","hearstugo.112.2o7.net","tpciletsgo.112.2o7.net","zango.112.2o7.net","natgeovideo.112.2o7.net","viamtvnvideo.112.2o7.net","msnportalvideo.112.2o7.net","viavh1video.112.2o7.net","thayhoteldelcoronado.112.2o7.net","mlbsanfrancisco.112.2o7.net","cisco.112.2o7.net","mgtbo.112.2o7.net","ibibo.112.2o7.net","tcinvitationsbydawn.112.2o7.net","mtvn.112.2o7.net","apdigitalorgovn.112.2o7.net","ctvsmokinggun.112.2o7.net","cbmsn.112.2o7.net","avon.112.2o7.net","worldnowboston.112.2o7.net","evepdcharleston.112.2o7.net","nmbradenton.112.2o7.net","nytrlexington.112.2o7.net","nmlexington.112.2o7.net","nytrwilmington.112.2o7.net","carlsonradisson.112.2o7.net","chghowardjohnson.112.2o7.net","carlson.112.2o7.net","cbstelevisiondistribution.112.2o7.net","bcacinchpartnersproduction.112.2o7.net","bpizzabpproduction.112.2o7.net","avivaplproduction.112.2o7.net","canadaoneautoglobalproduction.112.2o7.net","amsstellensucheneuwebsiteproduction.112.2o7.net","rubrikincproduction.112.2o7.net","amswebproduction.112.2o7.net","smugmugincflickrprodudction.112.2o7.net","sanfordcorporation.112.2o7.net","bostonscientificcorporation.112.2o7.net","microsoftmachinetranslation.112.2o7.net","geaviation.112.2o7.net","dailyheraldpaddockpublication.112.2o7.net","cablevision.112.2o7.net","central1creditunion.112.2o7.net","mngidmn.112.2o7.net","cbsspln.112.2o7.net","leroymerlin.112.2o7.net","nmthatsracin.112.2o7.net","yellspain.112.2o7.net","edietsmain.112.2o7.net","hchrmain.112.2o7.net","winmpmain.112.2o7.net","kbbmain.112.2o7.net","petamain.112.2o7.net","geosign.112.2o7.net","nytrwinterhaven.112.2o7.net","rakuten.112.2o7.net","nielsen.112.2o7.net","midsen.112.2o7.net","sympmsnglobalen.112.2o7.net","daiwashoken.112.2o7.net","volkswagen.112.2o7.net","sonytaiwan.112.2o7.net","fcaapacjeepstylejapan.112.2o7.net","thayvenetian.112.2o7.net","intelcorpchan.112.2o7.net","allergan.112.2o7.net","ccacheapcaribbean.112.2o7.net","gntbcstwzzm.112.2o7.net","assetdtmewm.112.2o7.net","microsoftwlsearchcrm.112.2o7.net","viaatom.112.2o7.net","gjfastcompanycom.112.2o7.net","gifastcompanycom.112.2o7.net","phillycom.112.2o7.net","southcoasttodaycom.112.2o7.net","foxcom.112.2o7.net","carfaxcom.112.2o7.net","cablevisuowcom.112.2o7.net","jcrewcom.112.2o7.net","viamtvcom.112.2o7.net","capcityadvcom.112.2o7.net","natgeonavcom.112.2o7.net","kakakucom.112.2o7.net","wineenthusiastcom.112.2o7.net","searskmartcom.112.2o7.net","4imprintcom.112.2o7.net","rentcom.112.2o7.net","natgeoeditcom.112.2o7.net","maplesoftcom.112.2o7.net","recordnetcom.112.2o7.net","btcom.112.2o7.net","searscom.112.2o7.net","aumo123usedcarscom.112.2o7.net","stampscom.112.2o7.net","pctoolscom.112.2o7.net","ccrgaviscom.112.2o7.net","harrahscom.112.2o7.net","agamgreetingscom.112.2o7.net","ottdailytidingscom.112.2o7.net","classmatescom.112.2o7.net","cmpdotnetjunkiescom.112.2o7.net","trailerservicescom.112.2o7.net","creditcardscom.112.2o7.net","phillyburbscom.112.2o7.net","cbscom.112.2o7.net","jrcom.112.2o7.net","babycentercom.112.2o7.net","msnmercom.112.2o7.net","thedailystarcom.112.2o7.net","bonintnewsktarcom.112.2o7.net","aumonewcarcom.112.2o7.net","mediabistrocom.112.2o7.net","cxociocom.112.2o7.net","eapogocom.112.2o7.net","orlandoinfocom.112.2o7.net","videotroncom.112.2o7.net","pcconnectioncom.112.2o7.net","reunioncom.112.2o7.net","stylincom.112.2o7.net","ctvmaincom.112.2o7.net","dotsterdomaincom.112.2o7.net","evepdaikencom.112.2o7.net","natgeongmcom.112.2o7.net","gmgmcom.112.2o7.net","hallmarkibmcom.112.2o7.net","agbmcom.112.2o7.net","assetdtmamcom.112.2o7.net","sciamcom.112.2o7.net","novellcom.112.2o7.net","rmgroyalmailcom.112.2o7.net","sltravelcom.112.2o7.net","nortelcom.112.2o7.net","corelcom.112.2o7.net","santacruzsentinelcom.112.2o7.net","mmdmakemydealcom.112.2o7.net","livedealcom.112.2o7.net","overstockcom.112.2o7.net","delphicom.112.2o7.net","fbfredericksburgcom.112.2o7.net","cookingcom.112.2o7.net","autoanythingcom.112.2o7.net","natgeotravelermagcom.112.2o7.net","aumoautomobilemagcom.112.2o7.net","aumoautomotivecom.112.2o7.net","newstimeslivecom.112.2o7.net","aumotradeinvaluecom.112.2o7.net","onlinegurupopularsitecom.112.2o7.net","overturecom.112.2o7.net","furniturecom.112.2o7.net","omniturecom.112.2o7.net","mailtribunecom.112.2o7.net","winecom.112.2o7.net","seacoastonlinecom.112.2o7.net","builderonlinecom.112.2o7.net","csoonlinecom.112.2o7.net","remodelingonlinecom.112.2o7.net","recordonlinecom.112.2o7.net","capecodonlinecom.112.2o7.net","timecom.112.2o7.net","examplecom.112.2o7.net","recordeaglecom.112.2o7.net","rcntelecom.112.2o7.net","oraclecom.112.2o7.net","thgalecom.112.2o7.net","dmvguidecom.112.2o7.net","aumointernetautoguidecom.112.2o7.net","rmgparcelforcecom.112.2o7.net","salliemaecom.112.2o7.net","poconorecordcom.112.2o7.net","computerworldcom.112.2o7.net","natgeongkidsmagccom.112.2o7.net","msnbcom.112.2o7.net","mlbcom.112.2o7.net","slbbbcom.112.2o7.net","vintacom.112.2o7.net","prisacom.112.2o7.net","telefloracom.112.2o7.net","questiacom.112.2o7.net","eaeacom.112.2o7.net","tehomercacom.112.2o7.net","viavh1com.112.2o7.net","msna1com.112.2o7.net","bonappetit.com.112.2o7.net","apartmentfinder.com.112.2o7.net","nysun.com.112.2o7.net","homepjlconline.com.112.2o7.net","bmwtechnicalinformationsystem.112.2o7.net","imeem.112.2o7.net","airmilesrewardprogram.112.2o7.net","chgwyndham.112.2o7.net","mseupwinxpfam.112.2o7.net","vintadream.112.2o7.net","mlbam.112.2o7.net","viay2m.112.2o7.net","delightful.112.2o7.net","aumoautomotivectl.112.2o7.net","barclayscapital-ssl.112.2o7.net","viacomedycentralrl.112.2o7.net","avivapl.112.2o7.net","foxidol.112.2o7.net","ldscol.112.2o7.net","advertisementnl.112.2o7.net","tele2nl.112.2o7.net","qwestfull.112.2o7.net","nmrockhill.112.2o7.net","novell.112.2o7.net","cpusall.112.2o7.net","nikefootball.112.2o7.net","betheball.112.2o7.net","angmil.112.2o7.net","btiemail.112.2o7.net","nhl.112.2o7.net","cbsnfl.112.2o7.net","autobytel.112.2o7.net","bhgremodel.112.2o7.net","cwportal.112.2o7.net","msnportal.112.2o7.net","viacomedycentral.112.2o7.net","ringcentral.112.2o7.net","paypal.112.2o7.net","medhelpinternational.112.2o7.net","ancestryglobal.112.2o7.net","canwestglobal.112.2o7.net","gntbcstglobal.112.2o7.net","sprintglobal.112.2o7.net","algqusglobal.112.2o7.net","mlsglobal.112.2o7.net","ziffdavisglobal.112.2o7.net","coxnetmasterglobal.112.2o7.net","hphqglobal.112.2o7.net","aarpglobal.112.2o7.net","aaplepglobal.112.2o7.net","natgeoglobal.112.2o7.net","dpagcoagcoglobal.112.2o7.net","sunglobal.112.2o7.net","westernunionglobal.112.2o7.net","anaplanglobal.112.2o7.net","a64lmglobal.112.2o7.net","mswindowswolglobal.112.2o7.net","nikefootballglobal.112.2o7.net","asustekglobal.112.2o7.net","figlobal.112.2o7.net","nikerunningglobal.112.2o7.net","discoverydpgolfglobal.112.2o7.net","ziffdavisenterpriseglobal.112.2o7.net","appleglobal.112.2o7.net","oracleglobal.112.2o7.net","ivillageglobal.112.2o7.net","allianceacglobal.112.2o7.net","mlbglobal.112.2o7.net","milbglobal.112.2o7.net","cbglobal.112.2o7.net","applecaglobal.112.2o7.net","viamtvuk.112.2o7.net","eagamesuk.112.2o7.net","dixonscouk.112.2o7.net","coreluk.112.2o7.net","pdrnetwork.112.2o7.net","f2network.112.2o7.net","americanwoodmark.112.2o7.net","newsok.112.2o7.net","newlook.112.2o7.net","kelleybluebook.112.2o7.net","pultheworldlink.112.2o7.net","tranest-schlage-link.112.2o7.net","keybank.112.2o7.net","jpmprivatebank.112.2o7.net","vectrabank.112.2o7.net","ziffdaviseweek.112.2o7.net","thinkgeek.112.2o7.net","gntbcstksdk.112.2o7.net","ewscorpuschristi.112.2o7.net","mlbcincinnati.112.2o7.net","coxhsi.112.2o7.net","upi.112.2o7.net","hpepdfembedapi.112.2o7.net","api.112.2o7.net","wpni.112.2o7.net","tumi.112.2o7.net","nmmiami.112.2o7.net","mitsubishi.112.2o7.net","mngi.112.2o7.net","nikkei.112.2o7.net","sonyscei.112.2o7.net","amazonhrhvh.112.2o7.net","nmfortworth.112.2o7.net","xhealth.112.2o7.net","bhgkitchenbath.112.2o7.net","snapfish.112.2o7.net","gntbcstwcsh.112.2o7.net","f2nsmh.112.2o7.net","nmraleigh.112.2o7.net","mgtimesdispatch.112.2o7.net","gmgoodwrench.112.2o7.net","cnettech.112.2o7.net","smpopmech.112.2o7.net","mdwsavannah.112.2o7.net","poloralphlaurenlotusstg.112.2o7.net","actforvictoryorg.112.2o7.net","aporg.112.2o7.net","mormonorg.112.2o7.net","apdigitalorg.112.2o7.net","mngimng.112.2o7.net","levelwing.112.2o7.net","scrippsfineliving.112.2o7.net","bhgdiabeticliving.112.2o7.net","bhgquilting.112.2o7.net","marinermarketing.112.2o7.net","condeconsumermarketing.112.2o7.net","leveragemarketing.112.2o7.net","msntrademarketing.112.2o7.net","shopping.112.2o7.net","nikerunning.112.2o7.net","applecmscoedeploymenttraining.112.2o7.net","ageo1xxpnwherodigitaltraining.112.2o7.net","applecmscoeappletraining.112.2o7.net","wileypublishing.112.2o7.net","dennispublishing.112.2o7.net","brandmuscleinstantimpactstaging.112.2o7.net","bneadoptionstaging.112.2o7.net","1stcentral1stcentralinsurancestaging.112.2o7.net","erstegroupholding.112.2o7.net","osiristrading.112.2o7.net","oberonincredig.112.2o7.net","jennycraig.112.2o7.net","betterhg.112.2o7.net","aeg.112.2o7.net","zag.112.2o7.net","asknetag.112.2o7.net","dtag.112.2o7.net","ringierag.112.2o7.net","agyahooag.112.2o7.net","agmsnag.112.2o7.net","aaassciencemag.112.2o7.net","audiag.112.2o7.net","dgag.112.2o7.net","bnpppf.112.2o7.net","canfaceoff.112.2o7.net","neref.112.2o7.net","mngidailybreeze.112.2o7.net","brightcove.112.2o7.net","carmaxadaptive.112.2o7.net","newsinteractive.112.2o7.net","bitdrive.112.2o7.net","iusacomlive.112.2o7.net","msnportallive.112.2o7.net","1stcentralinsurancelive.112.2o7.net","viashockwave.112.2o7.net","nmcharlotte.112.2o7.net","pittsburghpostgazette.112.2o7.net","msninvite.112.2o7.net","solarwindsglobalreportingsuite.112.2o7.net","uolphotosite.112.2o7.net","carfaxsubscriberwebsite.112.2o7.net","sonycorporate.112.2o7.net","bankrate.112.2o7.net","amazditemplate.112.2o7.net","msnportalaffiliate.112.2o7.net","victoriaadvocate.112.2o7.net","kaboose.112.2o7.net","ziffdavisenterprise.112.2o7.net","idgenterprise.112.2o7.net","nsdldlese.112.2o7.net","canshowcase.112.2o7.net","msneshopbase.112.2o7.net","omniture.112.2o7.net","wlgore.112.2o7.net","jiwire.112.2o7.net","mpire.112.2o7.net","budgetcarhire.112.2o7.net","questsoftware.112.2o7.net","sonymediasoftware.112.2o7.net","pandasoftware.112.2o7.net","gntbcstkare.112.2o7.net","msnonecare.112.2o7.net","msnwinonecare.112.2o7.net","nissaneurope.112.2o7.net","canoe.112.2o7.net","timefortune.112.2o7.net","cnheagletribune.112.2o7.net","stepstone.112.2o7.net","onetoone.112.2o7.net","primestarmagazine.112.2o7.net","newyorkmagazine.112.2o7.net","msnbcnewsvine.112.2o7.net","mdstaugustine.112.2o7.net","morningnewsonline.112.2o7.net","jijsonline.112.2o7.net","vialogoonline.112.2o7.net","apnonline.112.2o7.net","bmwdevbaonline.112.2o7.net","surfline.112.2o7.net","blethenmaine.112.2o7.net","ewsabilene.112.2o7.net","trane.112.2o7.net","couhome.112.2o7.net","thome.112.2o7.net","dreamhome.112.2o7.net","msnportalhome.112.2o7.net","nikehome.112.2o7.net","msnportalgame.112.2o7.net","viashockwavekeyhole.112.2o7.net","affilcrtopcolle.112.2o7.net","nytrgainesville.112.2o7.net","nytrhendersonville.112.2o7.net","mdjacksonville.112.2o7.net","bonneville.112.2o7.net","nmbelleville.112.2o7.net","boostmobile.112.2o7.net","adobemobile.112.2o7.net","mgdothaneagle.112.2o7.net","cwnetworkmparticle.112.2o7.net","oracle.112.2o7.net","audible.112.2o7.net","viaspike.112.2o7.net","expertsexchange.112.2o7.net","nmstatecollege.112.2o7.net","mdwoakridge.112.2o7.net","nmanchorage.112.2o7.net","ageo1xxsinnorthstarhomepage.112.2o7.net","natgeohomepage.112.2o7.net","gmgmacmortgage.112.2o7.net","f2ntheage.112.2o7.net","genetree.112.2o7.net","viacomedyde.112.2o7.net","vianickde.112.2o7.net","tvguide.112.2o7.net","scottrade.112.2o7.net","ameritrade.112.2o7.net","ziffdavispennyarcade.112.2o7.net","vcommerce.112.2o7.net","oklahomadepartmentofcommerce.112.2o7.net","nytrflorence.112.2o7.net","cadence.112.2o7.net","geconsumerfinance.112.2o7.net","aumocarsbelowinvoice.112.2o7.net","chchoice.112.2o7.net","microsoftoffice.112.2o7.net","ice.112.2o7.net","mkcthehomemarketplace.112.2o7.net","nytbglobe.112.2o7.net","adobe.112.2o7.net","svd.112.2o7.net","laxpsd.112.2o7.net","aiservicenowintegprd.112.2o7.net","cpfprd.112.2o7.net","berlinairportcorporateprd.112.2o7.net","bekbprd.112.2o7.net","applecmscoeedwebprd.112.2o7.net","bancoaztecaprd.112.2o7.net","ford.112.2o7.net","mghickoryrecord.112.2o7.net","discovercard.112.2o7.net","gmgmcard.112.2o7.net","hyundaicard.112.2o7.net","verisignwildcard.112.2o7.net","omazeuceeazczprod.112.2o7.net","amazdimxprod.112.2o7.net","nutanixprod.112.2o7.net","dexdexprod.112.2o7.net","bnppbecwprod.112.2o7.net","bcaeuprod.112.2o7.net","amazdiauprod.112.2o7.net","btimyaccountprod.112.2o7.net","usmtprod.112.2o7.net","amazdiitprod.112.2o7.net","lenovoappsshareitprod.112.2o7.net","inginternetprod.112.2o7.net","gapincintranetprod.112.2o7.net","bamsfirestonedirectprod.112.2o7.net","boehrusprod.112.2o7.net","amazdiusprod.112.2o7.net","acutsprod.112.2o7.net","bassprod.112.2o7.net","rwhgrosewoodhotelsprod.112.2o7.net","accelerategsprod.112.2o7.net","cluesprod.112.2o7.net","btbventuresprod.112.2o7.net","itgirishtimesprod.112.2o7.net","amazdiesprod.112.2o7.net","luxemlocatorprod.112.2o7.net","amazdifrprod.112.2o7.net","amazdibrprod.112.2o7.net","msnmercustacqprod.112.2o7.net","bglbnpparibasbglbnpparibasmvpprod.112.2o7.net","bglbnpparibaswebbankingdekstopprod.112.2o7.net","cnoompprod.112.2o7.net","amazdijpprod.112.2o7.net","amgpprod.112.2o7.net","brunswickcorporationbcgpprod.112.2o7.net","bpsbassproprod.112.2o7.net","bcadealerproprod.112.2o7.net","eucpelgraficoprod.112.2o7.net","amazdiinprod.112.2o7.net","applepstcrmprod.112.2o7.net","adtcomprod.112.2o7.net","landolakescomprod.112.2o7.net","autocarcomprod.112.2o7.net","cablevissdlcomprod.112.2o7.net","bancoaztitkecommprod.112.2o7.net","eycnlprod.112.2o7.net","dstsscfscomportalprod.112.2o7.net","synchronyglobalprod.112.2o7.net","mattelplaysitesglobalprod.112.2o7.net","avnglobalprod.112.2o7.net","amcalterraglobalprod.112.2o7.net","aldisaldiukprod.112.2o7.net","bancoaztitkprod.112.2o7.net","aubankprod.112.2o7.net","atiprod.112.2o7.net","bcacinchprod.112.2o7.net","msninviteprod.112.2o7.net","aiglifemicrositeprod.112.2o7.net","lenovoappssystemupdateprod.112.2o7.net","bnpppffrb2b2cauroreprod.112.2o7.net","mckinseyglobalnewsitecoreprod.112.2o7.net","pacificlifereprod.112.2o7.net","nbagametimeprod.112.2o7.net","aldisaldiieprod.112.2o7.net","renfeprod.112.2o7.net","batgsdglodeprod.112.2o7.net","dfbfussballdeprod.112.2o7.net","amazdideprod.112.2o7.net","amazdiaeprod.112.2o7.net","leaitworldprod.112.2o7.net","bnebnedfdcprod.112.2o7.net","mssbcprod.112.2o7.net","barclaysinternationalibprod.112.2o7.net","amazdigbprod.112.2o7.net","abprod.112.2o7.net","batgsdglouaprod.112.2o7.net","eucpviveusaprod.112.2o7.net","amazdisaprod.112.2o7.net","avalaraprod.112.2o7.net","bupachilebupaprod.112.2o7.net","boehrahnaprod.112.2o7.net","btbaemaprod.112.2o7.net","gmgoodwrenchdmaprod.112.2o7.net","capellaprod.112.2o7.net","telateladivulgaprod.112.2o7.net","bupachileagendaprod.112.2o7.net","bupachilecruzblancaprod.112.2o7.net","amazdicaprod.112.2o7.net","cnocanoecaprod.112.2o7.net","bskybsuper6prod.112.2o7.net","ampacr6prod.112.2o7.net","restoredchurchofgod.112.2o7.net","viarnd.112.2o7.net","landsend.112.2o7.net","aumomotortrend.112.2o7.net","trane-ir-corp-ingersollrand.112.2o7.net","thayhiltonlongisland.112.2o7.net","nytrlakeland.112.2o7.net","pulkauaiworld.112.2o7.net","epebuild.112.2o7.net","clubmed.112.2o7.net","nmmerced.112.2o7.net","wbextecd.112.2o7.net","mgwcbd.112.2o7.net","3gupload.112.2o7.net","nmhiltonhead.112.2o7.net","gntbcstwkyc.112.2o7.net","msnportalmsgboardsrvc.112.2o7.net","njmvc.112.2o7.net","businessweekpoc.112.2o7.net","cpocommerceinc.112.2o7.net","lab88inc.112.2o7.net","btibtplc.112.2o7.net","educationmanagementllc.112.2o7.net","analytic.112.2o7.net","cruisecritic.112.2o7.net","sonymusic.112.2o7.net","sympmsnmusic.112.2o7.net","turnerclassic.112.2o7.net","mitsubishielectric.112.2o7.net","softonic.112.2o7.net","bnkholic.112.2o7.net","nationalgeographic.112.2o7.net","ihc.112.2o7.net","petakfc.112.2o7.net","cengagecsinfosec.112.2o7.net","cdc.112.2o7.net","msnbc.112.2o7.net","bbc.112.2o7.net","mngislcnac.112.2o7.net","scrippsgac.112.2o7.net","bskyb.112.2o7.net","samsclub.112.2o7.net","laxtrb.112.2o7.net","mngislctrib.112.2o7.net","lastminengb.112.2o7.net","twcimaxweb.112.2o7.net","autoweb.112.2o7.net","asiamlweb.112.2o7.net","lacaixa.112.2o7.net","canottowa.112.2o7.net","aviva.112.2o7.net","bbva.112.2o7.net","mdwaugusta.112.2o7.net","overturecomvista.112.2o7.net","cmpglobalvista.112.2o7.net","tmstoyota.112.2o7.net","nytrsarasota.112.2o7.net","mlbatlanta.112.2o7.net","sitespectdata.112.2o7.net","gntbcstwusa.112.2o7.net","wwatchcomusa.112.2o7.net","gntbcstkusa.112.2o7.net","nytrsantarosa.112.2o7.net","nytrtuscaloosa.112.2o7.net","ewsventura.112.2o7.net","bupachilebupaqa.112.2o7.net","sonychina.112.2o7.net","airchina.112.2o7.net","ana.112.2o7.net","puma.112.2o7.net","nmtacoma.112.2o7.net","midala.112.2o7.net","nytrocala.112.2o7.net","gntbcstwxia.112.2o7.net","cmtvia.112.2o7.net","sonypanasia.112.2o7.net","viamtvromania.112.2o7.net","travidia.112.2o7.net","phillymedia.112.2o7.net","cbcnewmedia.112.2o7.net","waterfrontmedia.112.2o7.net","summitbusinessmedia.112.2o7.net","sevenoneintermedia.112.2o7.net","mxmacromedia.112.2o7.net","tangomedia.112.2o7.net","nandomedia.112.2o7.net","nmcomnancomedia.112.2o7.net","virginmedia.112.2o7.net","cbsdigitalmedia.112.2o7.net","himedia.112.2o7.net","incisivemedia.112.2o7.net","eremedia.112.2o7.net","instadia.112.2o7.net","nmcolumbia.112.2o7.net","chacha.112.2o7.net","microsoftwga.112.2o7.net","subaruofamerica.112.2o7.net","aunica.112.2o7.net","cmpmedica.112.2o7.net","bupachileintegramedica.112.2o7.net","nmbakersfieldca.112.2o7.net","ariba.112.2o7.net","angiba.112.2o7.net","bpceceprod1609.112.2o7.net","expedia8.112.2o7.net","192.168.112.2o7.net","aetnaaetnaprod2018.112.2o7.net","mlbglobal08.112.2o7.net","dotsterdotsteraug08.112.2o7.net","gpaper107.112.2o7.net","algfrance2007.112.2o7.net","msnportalbeetoffice2007.112.2o7.net","viaatomv6.112.2o7.net","autoscout24.112.2o7.net","gpapermom104.112.2o7.net","bawagpsk2013.112.2o7.net","bnkicomv2.112.2o7.net","uolnetzeronet2.112.2o7.net","wwecorp2.112.2o7.net","mapscom2.112.2o7.net","uoljunocom2.112.2o7.net","jetbluecom2.112.2o7.net","g2.112.2o7.net","care2.112.2o7.net","gemoneysinsbicard2.112.2o7.net","adbemdigitalmediarebootprod2.112.2o7.net","carhartt.com.102.112.2o7.net","4imprint.com.102.112.2o7.net","aavacations.com.102.112.2o7.net","hickoryfarms.com.102.112.2o7.net","bcbsks.com.102.112.2o7.net","abbottnutrition.com.102.112.2o7.net","tabelog.com.102.112.2o7.net","adobe.com.102.112.2o7.net","avid.com.102.112.2o7.net","appleglobal.102.112.2o7.net","102.112.2o7.net","usatoday1.112.2o7.net","omvisidtest1.112.2o7.net","classifiedventures1.112.2o7.net","expedia1.112.2o7.net","beachbuydig2020.112.2o7.net","112.2o7.net","byubroadcast.112.2o7.net","kasperthreatpostprod.112.2o7.net","kaspersky.122.2o7.net","ldsfch.112.2o7.net","myfamilyancestry.112.2o7.net","nautilus.122.2o7.net","tirerackcom.112.2o7.net","actforvictory.112.2o7.net","adbrite.112.2o7.net","americanbaby.112.2o7.net","ancestrymsn.112.2o7.net","ancestryuki.112.2o7.net","and.co.uk.102.122.2o7.net","angtr.112.2o7.net","angts.112.2o7.net","angvac.112.2o7.net","anm.112.2o7.net","aolcareers.122.2o7.net","aolnsnews.122.2o7.net","aolpolls.112.2o7.net","aolturnercnnmoney.112.2o7.net","aolukglobal.122.2o7.net","aolwpaim.112.2o7.net","aolwpicq.122.2o7.net","aolwpmq.112.2o7.net","aolwpmqnoban.112.2o7.net","bbcnewscouk.112.2o7.net","bellca.112.2o7.net","bellglovemediapublishing.122.2o7.net","bellserviceeng.112.2o7.net","bhgmarketing.112.2o7.net","bidentonrccom.122.2o7.net","biwwltvcom.112.2o7.net","biwwltvcom.122.2o7.net","blackpress.122.2o7.net","bntbcstglobal.112.2o7.net","bosecom.112.2o7.net","bulldog.122.2o7.net","bzresults.122.2o7.net","canwestcom.112.2o7.net","capcityadvcom.122.2o7.net","careers.112.2o7.net","cbaol.112.2o7.net","cbcca.112.2o7.net","cbcca.122.2o7.net","cbcincinnatienquirer.112.2o7.net","cbsncaasports.112.2o7.net","ccrbudgetca.112.2o7.net","cfrfa.112.2o7.net","classifiedscanada.112.2o7.net","cnhimcalesternews.122.2o7.net","cnhipicayuneitemv.112.2o7.net","cnhitribunestar.122.2o7.net","cnhitribunestara.122.2o7.net","cnhregisterherald.122.2o7.net","coxpalmbeachpost.112.2o7.net","diginet.112.2o7.net","digitalhomediscountptyltd.122.2o7.net","disccglobal.112.2o7.net","disccstats.112.2o7.net","dischannel.112.2o7.net","dixonslnkcouk.112.2o7.net","dogpile.112.2o7.net","donval.112.2o7.net","dowjones.122.2o7.net","dreammates.112.2o7.net","ebay1.112.2o7.net","ebaynonreg.112.2o7.net","ebayreg.112.2o7.net","ebayus.112.2o7.net","ebcom.112.2o7.net","ectestlampsplus1.112.2o7.net","edmundsinsideline.112.2o7.net","edsa.112.2o7.net","ehg-moma.hitbox.com.112.2o7.net","employ22.112.2o7.net","employ26.112.2o7.net","employment.112.2o7.net","enterprisenewsmedia.122.2o7.net","epost.122.2o7.net","ewstcpalm.112.2o7.net","execulink.112.2o7.net","expedia.ca.112.2o7.net","expedia4.112.2o7.net","f2ncracker.112.2o7.net","faceoff.112.2o7.net","fbkmnr.112.2o7.net","forbesattache.112.2o7.net","forbesauto.112.2o7.net","forbesautos.112.2o7.net","forbescom.112.2o7.net","foxsimpsons.112.2o7.net","georgewbush.112.2o7.net","georgewbushcom.112.2o7.net","gettyimages.122.2o7.net","gmchevyapprentice.112.2o7.net","gmhummer.112.2o7.net","gpaper104.112.2o7.net","gpaper105.112.2o7.net","gpaper108.112.2o7.net","gpaper109.112.2o7.net","gpaper110.112.2o7.net","gpaper111.112.2o7.net","gpaper112.112.2o7.net","gpaper113.112.2o7.net","gpaper114.112.2o7.net","gpaper115.112.2o7.net","gpaper116.112.2o7.net","gpaper117.112.2o7.net","gpaper118.112.2o7.net","gpaper119.112.2o7.net","gpaper120.112.2o7.net","gpaper121.112.2o7.net","gpaper122.112.2o7.net","gpaper123.112.2o7.net","gpaper124.112.2o7.net","gpaper125.112.2o7.net","gpaper126.112.2o7.net","gpaper127.112.2o7.net","gpaper128.112.2o7.net","gpaper129.112.2o7.net","gpaper131.112.2o7.net","gpaper132.112.2o7.net","gpaper133.112.2o7.net","gpaper138.112.2o7.net","gpaper139.112.2o7.net","gpaper140.112.2o7.net","gpaper141.112.2o7.net","gpaper142.112.2o7.net","gpaper144.112.2o7.net","gpaper145.112.2o7.net","gpaper147.112.2o7.net","gpaper149.112.2o7.net","gpaper151.112.2o7.net","gpaper154.112.2o7.net","gpaper156.112.2o7.net","gpaper157.112.2o7.net","gpaper158.112.2o7.net","gpaper162.112.2o7.net","gpaper164.112.2o7.net","gpaper166.112.2o7.net","gpaper167.112.2o7.net","gpaper169.112.2o7.net","gpaper170.112.2o7.net","gpaper171.112.2o7.net","gpaper172.112.2o7.net","gpaper173.112.2o7.net","gpaper174.112.2o7.net","gpaper176.112.2o7.net","gpaper177.112.2o7.net","gpaper180.112.2o7.net","gpaper183.112.2o7.net","gpaper184.112.2o7.net","gpaper191.112.2o7.net","gpaper192.112.2o7.net","gpaper193.112.2o7.net","gpaper194.112.2o7.net","gpaper195.112.2o7.net","gpaper196.112.2o7.net","gpaper197.112.2o7.net","gpaper198.112.2o7.net","gpaper202.112.2o7.net","gpaper204.112.2o7.net","gpaper205.112.2o7.net","gpaper212.112.2o7.net","gpaper214.112.2o7.net","gpaper219.112.2o7.net","gpaper223.112.2o7.net","heavycom.112.2o7.net","homesclick.112.2o7.net","hostdomainpeople.112.2o7.net","hostdomainpeopleca.112.2o7.net","hostpowermedium.112.2o7.net","hpglobal.112.2o7.net","hphqsearch.112.2o7.net","infomart.ca.112.2o7.net","infospace.com.112.2o7.net","intelcorpcim.112.2o7.net","intelglobal.112.2o7.net","jitmj4.122.2o7.net","kddi.122.2o7.net","krafteurope.112.2o7.net","ktva.112.2o7.net","ladieshj.112.2o7.net","lenovo.112.2o7.net","logoworksdev.112.2o7.net","losu.112.2o7.net","mailtribune.112.2o7.net","maxvr.112.2o7.net","mdamarillo.112.2o7.net","mdtopeka.112.2o7.net","mdwardmore.112.2o7.net","medbroadcast.112.2o7.net","meetupcom.112.2o7.net","metro.co.uk.102.122.2o7.net","mgwspa.112.2o7.net","microsoftconsumermarketing.112.2o7.net","mlbastros.112.2o7.net","mlbcolorado.112.2o7.net","mlbhouston.112.2o7.net","mlbstlouis.112.2o7.net","mlbtoronto.112.2o7.net","mmsshopcom.112.2o7.net","mnfidnahub.112.2o7.net","mngiyrkdr.112.2o7.net","mseuppremain.112.2o7.net","mtvu.112.2o7.net","natgeoeditco.112.2o7.net","nationalpost.112.2o7.net","nba.112.2o7.net","netrp.112.2o7.net","netsdartboards.122.2o7.net","nike.112.2o7.net","nikeplus.112.2o7.net","nmbrampton.112.2o7.net","nmcommancomedia.112.2o7.net","nmkawartha.112.2o7.net","nmmississauga.112.2o7.net","nmnandomedia.112.2o7.net","nmtoronto.112.2o7.net","nmtricity.112.2o7.net","nmyork.112.2o7.net","nytglobe.112.2o7.net","nythglobe.112.2o7.net","nytimesglobal.112.2o7.net","nytimesnonsampled.112.2o7.net","nytimesnoonsampled.112.2o7.net","nytmembercenter.112.2o7.net","nytrgadsden.112.2o7.net","nytrgainseville.112.2o7.net","nytrhouma.112.2o7.net","omnitureglobal.112.2o7.net","onlineindigoca.112.2o7.net","overstock.com.112.2o7.net","projectorpeople.112.2o7.net","publicationsunbound.112.2o7.net","pulharktheherald.112.2o7.net","pulpantagraph.112.2o7.net","rckymtnnws.112.2o7.net","rey3935.112.2o7.net","rezrezwhistler.112.2o7.net","rncgopcom.122.2o7.net","roxio.112.2o7.net","santacruzsentinel.112.2o7.net","sciamglobal.112.2o7.net","scrippsbathvert.112.2o7.net","scrippswfts.112.2o7.net","scrippswxyz.112.2o7.net","sonycorporate.122.2o7.net","sonyglobal.112.2o7.net","southcoasttoday.112.2o7.net","spiketv.112.2o7.net","suncom.112.2o7.net","sunonesearch.112.2o7.net","sympmsnsports.112.2o7.net","timebus2.112.2o7.net","timehealth.112.2o7.net","timeofficepirates.122.2o7.net","timepopsci.122.2o7.net","timerealsimple.112.2o7.net","timewarner.122.2o7.net","tmsscion.112.2o7.net","travidiathebrick.112.2o7.net","usun.112.2o7.net","vanns.112.2o7.net","verisonwildcard.112.2o7.net","vh1com.112.2o7.net","viaatomvideo.112.2o7.net","viasyndimedia.112.2o7.net","viralvideo.112.2o7.net","walmartcom.112.2o7.net","westjet.112.2o7.net","wileydumcom.112.2o7.net","wmg.112.2o7.net","wmgmulti.112.2o7.net","workopolis.122.2o7.net","xhealthmobiletools.112.2o7.net","youtube.112.2o7.net","yrkeve.112.2o7.net","ns-vip2.hitbox.com","ns-vip3.hitbox.com","ns2.hitbox.com","adminec1.hitbox.com","ads.hitbox.com","ai.hitbox.com","counter.hitbox.com","counter2.hitbox.com","dev101.hitbox.com","download.hitbox.com","ec1.hitbox.com","ehg-247internet.hitbox.com","ehg-accuweather.hitbox.com","ehg-acdsystems.hitbox.com","ehg-adeptscience.hitbox.com","ehg-affinitynet.hitbox.com","ehg-aha.hitbox.com","ehg-amerix.hitbox.com","ehg-apcc.hitbox.com","ehg-ati.hitbox.com","ehg-attenza.hitbox.com","ehg-autodesk.hitbox.com","ehg-baa.hitbox.com","ehg-backweb.hitbox.com","ehg-bestbuy.hitbox.com","ehg-bizjournals.hitbox.com","ehg-boschsiemens.hitbox.com","ehg-bskyb.hitbox.com","ehg-cafepress.hitbox.com","ehg-careerbuilder.hitbox.com","ehg-cbc.hitbox.com","ehg-cbs.hitbox.com","ehg-cbsradio.hitbox.com","ehg-cedarpoint.hitbox.com","ehg-clearchannel.hitbox.com","ehg-closetmaid.hitbox.com","ehg-commjun.hitbox.com","ehg-communityconnect.hitbox.com","ehg-comscore.hitbox.com","ehg-corusentertainment.hitbox.com","ehg-coverityinc.hitbox.com","ehg-crain.hitbox.com","ehg-ctv.hitbox.com","ehg-cygnusbm.hitbox.com","ehg-datamonitor.hitbox.com","ehg-dig.hitbox.com","ehg-digg.hitbox.com","ehg-eckounlimited.hitbox.com","ehg-esa.hitbox.com","ehg-espn.hitbox.com","ehg-fifa.hitbox.com","ehg-findlaw.hitbox.com","ehg-foundation.hitbox.com","ehg-foxsports.hitbox.com","ehg-futurepub.hitbox.com","ehg-gamedaily.hitbox.com","ehg-gamespot.hitbox.com","ehg-gatehousemedia.hitbox.com","ehg-glam.hitbox.com","ehg-groceryworks.hitbox.com","ehg-groupernetworks.hitbox.com","ehg-guardian.hitbox.com","ehg-hasbro.hitbox.com","ehg-hellodirect.hitbox.com","ehg-himedia.hitbox.com","ehg-hitent.hitbox.com","ehg-hollywood.hitbox.com","ehg-idg.hitbox.com","ehg-idgentertainment.hitbox.com","ehg-ifilm.hitbox.com","ehg-ignitemedia.hitbox.com","ehg-intel.hitbox.com","ehg-ittoolbox.hitbox.com","ehg-itworldcanada.hitbox.com","ehg-kingstontechnology.hitbox.com","ehg-knightridder.hitbox.com","ehg-learningco.hitbox.com","ehg-legonewyorkinc.hitbox.com","ehg-liveperson.hitbox.com","ehg-macpublishingllc.hitbox.com","ehg-macromedia.hitbox.com","ehg-magicalia.hitbox.com","ehg-maplesoft.hitbox.com","ehg-mgnlimited.hitbox.com","ehg-mindshare.hitbox.com","ehg-mtv.hitbox.com","ehg-mybc.hitbox.com","ehg-newegg.hitbox.com","ehg-newscientist.hitbox.com","ehg-nokiafin.hitbox.com","ehg-novell.hitbox.com","ehg-nvidia.hitbox.com","ehg-oreilly.hitbox.com","ehg-pacifictheatres.hitbox.com","ehg-pennwell.hitbox.com","ehg-peoplesoft.hitbox.com","ehg-philipsvheusen.hitbox.com","ehg-pizzahut.hitbox.com","ehg-playboy.hitbox.com","ehg-qualcomm.hitbox.com","ehg-quantumcorp.hitbox.com","ehg-randomhouse.hitbox.com","ehg-redherring.hitbox.com","ehg-register.hitbox.com","ehg-researchinmotion.hitbox.com","ehg-rfa.hitbox.com","ehg-rodale.hitbox.com","ehg-salesforce.hitbox.com","ehg-salonmedia.hitbox.com","ehg-samsungusa.hitbox.com","ehg-seca.hitbox.com","ehg-shoppersdrugmart.hitbox.com","ehg-sonybssc.hitbox.com","ehg-sonycomputer.hitbox.com","ehg-sonyelec.hitbox.com","ehg-sonymusic.hitbox.com","ehg-sonyny.hitbox.com","ehg-space.hitbox.com","ehg-streamload.hitbox.com","ehg-superpages.hitbox.com","ehg-techtarget.hitbox.com","ehg-tfl.hitbox.com","ehg-thefirstchurchchrist.hitbox.com","ehg-tigerdirect.hitbox.com","ehg-tigerdirect2.hitbox.com","ehg-topps.hitbox.com","ehg-tribute.hitbox.com","ehg-tumbleweed.hitbox.com","ehg-ubisoft.hitbox.com","ehg-uniontrib.hitbox.com","ehg-usnewsworldreport.hitbox.com","ehg-verizoncommunications.hitbox.com","ehg-viacom.hitbox.com","ehg-vmware.hitbox.com","ehg-vonage.hitbox.com","ehg-wachovia.hitbox.com","ehg-wacomtechnology.hitbox.com","ehg-womanswallstreet.hitbox.com","ehg-wss.hitbox.com","ehg-xxolympicwintergames.hitbox.com","ehg-yellowpages.hitbox.com","ehg-youtube.hitbox.com","ehg.hitbox.com","ejs.hitbox.com","enterprise.hitbox.com","esg.hitbox.com","evwr.hitbox.com","get.hitbox.com","hg1.hitbox.com","hg10.hitbox.com","hg11.hitbox.com","hg12.hitbox.com","hg13.hitbox.com","hg14.hitbox.com","hg15.hitbox.com","hg16.hitbox.com","hg17.hitbox.com","hg2.hitbox.com","hg6a.hitbox.com","host6.hitbox.com","ias.hitbox.com","ias2.hitbox.com","ibg.hitbox.com","ics.hitbox.com","idb.hitbox.com","js1.hitbox.com","lookup.hitbox.com","mrtg.hitbox.com","myhitbox.com","nei.hitbox.com","noc.hitbox.com","ns1.hitbox.com","oas.hitbox.com","phg.hitbox.com","rd1.hitbox.com","reseller.hitbox.com","resources.hitbox.com","sitesearch.hitbox.com","ss.hitbox.com","stage.hitbox.com","stage101.hitbox.com","stage102.hitbox.com","stage103.hitbox.com","stats.hitbox.com","stats2.hitbox.com","stats3.hitbox.com","tetra.hitbox.com","tools.hitbox.com","tools2.hitbox.com","toolsa.hitbox.com","ts1.hitbox.com","ts2.hitbox.com","vwr1.hitbox.com","w1.hitbox.com","w10.hitbox.com","w100.hitbox.com","w101.hitbox.com","w102.hitbox.com","w103.hitbox.com","w104.hitbox.com","w105.hitbox.com","w106.hitbox.com","w107.hitbox.com","w108.hitbox.com","w109.hitbox.com","w11.hitbox.com","w110.hitbox.com","w111.hitbox.com","w112.hitbox.com","w113.hitbox.com","w114.hitbox.com","w115.hitbox.com","w116.hitbox.com","w117.hitbox.com","w118.hitbox.com","w119.hitbox.com","w12.hitbox.com","w120.hitbox.com","w121.hitbox.com","w122.hitbox.com","w123.hitbox.com","w124.hitbox.com","w126.hitbox.com","w128.hitbox.com","w129.hitbox.com","w13.hitbox.com","w130.hitbox.com","w131.hitbox.com","w132.hitbox.com","w133.hitbox.com","w135.hitbox.com","w136.hitbox.com","w137.hitbox.com","w138.hitbox.com","w139.hitbox.com","w14.hitbox.com","w140.hitbox.com","w141.hitbox.com","w144.hitbox.com","w147.hitbox.com","w15.hitbox.com","w153.hitbox.com","w154.hitbox.com","w155.hitbox.com","w157.hitbox.com","w159.hitbox.com","w16.hitbox.com","w161.hitbox.com","w162.hitbox.com","w167.hitbox.com","w168.hitbox.com","w17.hitbox.com","w170.hitbox.com","w175.hitbox.com","w18.hitbox.com","w19.hitbox.com","w2.hitbox.com","w20.hitbox.com","w21.hitbox.com","w22.hitbox.com","w23.hitbox.com","w24.hitbox.com","w25.hitbox.com","w26.hitbox.com","w27.hitbox.com","w28.hitbox.com","w29.hitbox.com","w3.hitbox.com","w30.hitbox.com","w31.hitbox.com","w32.hitbox.com","w33.hitbox.com","w36.hitbox.com","w4.hitbox.com","w5.hitbox.com","w6.hitbox.com","w7.hitbox.com","w8.hitbox.com","w9.hitbox.com","webload101.hitbox.com","wvwr1.hitbox.com","ww1.hitbox.com","ww2.hitbox.com","ww3.hitbox.com","wwa.hitbox.com","wwb.hitbox.com","wwc.hitbox.com","wwd.hitbox.com","www.hitbox.com","yang.hitbox.com","ying.hitbox.com","www.nedstat.com","be.sitestat.com","de.sitestat.com","fi.sitestat.com","int.sitestat.com","se.sitestat.com","uk.sitestat.com"],"name":"Omniture","exodusId":43,"link":"https://reports.exodus-privacy.eu.org/trackers/43"},{"id":"exodus_420","hostnames":["sdk6.ibm.xtify.com"],"name":"IBM Mobile Marketing (Acoustic)","exodusId":420,"link":"https://reports.exodus-privacy.eu.org/trackers/420"},{"id":"exodus_42","hostnames":[".exacttarget."],"name":"ExactTarget","exodusId":42,"link":"https://reports.exodus-privacy.eu.org/trackers/42"},{"id":"exodus_418","hostnames":["cdn-api.swirl.com"],"name":"Swirl","exodusId":418,"link":"https://reports.exodus-privacy.eu.org/trackers/418"},{"id":"exodus_41","hostnames":["adswizz.com","cdn.adswizz.com.edgesuite.net","cdn.adswizz.com","deliveryengine.cox.adswizz.com","delivery-cdn-cf.adswizz.com","cox.deliveryengine.adswizz.com","streamguys.deliveryengine.adswizz.com","synchroscript.deliveryengine.adswizz.com","synchrobox.adswizz.com","zc.adswizz.com","delivery-s3.adswizz.com","adsradios.adswizz.com","exchange.adswizz.com"],"name":"AdsWizz","exodusId":41,"link":"https://reports.exodus-privacy.eu.org/trackers/41"},{"id":"exodus_405","hostnames":[".tele.fm"],"name":"Cifrasoft","exodusId":405,"link":"https://reports.exodus-privacy.eu.org/trackers/405"},{"id":"exodus_404","hostnames":["radar.cedexis.com","cedexis.fastlylb.net","cn.ecritel.bench.cedexis.com","probes.cedexis.com"],"name":"Cedexis Radar","exodusId":404,"link":"https://reports.exodus-privacy.eu.org/trackers/404"},{"id":"exodus_400","hostnames":["inputs.alooma.com"],"name":"Alooma","exodusId":400,"link":"https://reports.exodus-privacy.eu.org/trackers/400"},{"id":"exodus_40","hostnames":["demdex.net","americanairlines.demdex.net","audible.demdex.net","bestbuy.demdex.net","condenast.demdex.net","dickssportinggoods.demdex.net","disney.demdex.net","dpm.demdex.net","fandangollc.demdex.net","foxnet.demdex.net","foxnews.demdex.net","gannett.demdex.net","iqdigital.demdex.net","fast.mtvn.demdex.net","nbcu.demdex.net","pepsico.demdex.net","pythagore.demdex.net","swa.demdex.net","tdameritrade.demdex.net","ups.demdex.net","vanguard.demdex.net","verizon.demdex.net","vivaki.demdex.net","webmd.demdex.net","everesttech.net","fast.gannett.demdex.net","fast.cbsi.demdex.net","fast.timeinc.demdex.net","fast.ecs.demdex.net","fast.ford.demdex.net","fast.td.demdex.net","fast.fairfaxau.demdex.net","fast.philly.demdex.net","cdn.demdex.net","fast.bostonglobe.demdex.net","fast.nbcu.demdex.net","fast.nbcots.demdex.net","fast.nrjgroup.demdex.net","cam.demdex.net","everydayhealth.demdex.net","fairfaxau.demdex.net","gm.demdex.net","nfl.demdex.net","philly.demdex.net","postmedia.demdex.net","torontostar.demdex.net","toyota.demdex.net","dm.demdex.net","marthastewart.demdex.net","fedex.demdex.net","mscom.demdex.net","schwab.demdex.net","timeinc.demdex.net","adobe.demdex.net","fairfax.demdex.net","mtvn.demdex.net","aexp.demdex.net","nbcots.demdex.net","dmg.demdex.net","charter.demdex.net","freecharge.demdex.net","iyogi.demdex.net","scripps.demdex.net","bostonglobe.demdex.net","ford.demdex.net","swisscom.demdex.net","bet.demdex.net","cbsi.demdex.net","de.demdex.net","sears.demdex.net","td.demdex.net","dailymotion.demdex.net","error.demdex.net","comcast.demdex.net","ecs.demdex.net","fast.fairfax.demdex.net","crosspixel.demdex.net","sstats.adobe.com","campaign.adobe.com","mcd-mkt-prod31-lb.campaign.adobe.com","pandoramedia-mkt-prod1-t.campaign.adobe.com","wdpro-mkt-prod2-lb.campaign.adobe.com","geo.adobe.com","adtag.primetime.adobe.com","atsmetrics.adobe.com","tt11.adobe.com","3dns-1.adobe.com","3dns-2.adobe.com","3dns-3.adobe.com","3dns-4.adobe.com","3dns.adobe.com","adelogs.adobe.com","www.everestjs.net","ads.everesttech.net","cm.everesttech.net","statsf-tm.everesttech.net","sync-tm.everesttech.net","pixel.everesttech.net","pixel-user-1039.everesttech.net","pixel1097.everesttech.net","pixel1324.everesttech.net","pixel1350.everesttech.net","pixel1370.everesttech.net","pixel1553.everesttech.net","pixel1739.everesttech.net"],"name":"Adobe Audience Manager","exodusId":40,"link":"https://reports.exodus-privacy.eu.org/trackers/40"},{"id":"exodus_4","hostnames":["pingapi.accengage.com","api.accengage.com"],"name":"Ad4Screen","exodusId":4,"link":"https://reports.exodus-privacy.eu.org/trackers/4"},{"id":"exodus_398","hostnames":["api.proximi.fi"],"name":"Proximi.io","exodusId":398,"link":"https://reports.exodus-privacy.eu.org/trackers/398"},{"id":"exodus_396","hostnames":["api-device.mocaplatform.com"],"name":"MOCA","exodusId":396,"link":"https://reports.exodus-privacy.eu.org/trackers/396"},{"id":"exodus_394","hostnames":["ipsws.indooratlas.com"],"name":"IndoorAtlas","exodusId":394,"link":"https://reports.exodus-privacy.eu.org/trackers/394"},{"id":"exodus_393","hostnames":["sdk.gpshopper.com","sypi.gpshopper.com"],"name":"GPShopper","exodusId":393,"link":"https://reports.exodus-privacy.eu.org/trackers/393"},{"id":"exodus_39","hostnames":["api.pushwoosh.com","0ce3c-1fd43.api.pushwoosh.com","cache-ha.pushwoosh.com","cbcnewmedia.pushwoosh.com","cdn.pushwoosh.com","cp.pushwoosh.com","ha.pushwoosh.com","ha-api.pushwoosh.com","haaretz.pushwoosh.com","post-log.pushwoosh.com","rambler.pushwoosh.com","richmedia.pushwoosh.com","sulake.pushwoosh.com","uefa.pushwoosh.com","wetter.pushwoosh.com","78901-8cf0d.api.pushwoosh.com","bbumgames.pushwoosh.com","cache-07.pushwoosh.com","dbs.pushwoosh.com"],"name":"Pushwoosh","exodusId":39,"link":"https://reports.exodus-privacy.eu.org/trackers/39"},{"id":"exodus_387","hostnames":[".*.anvato.net"],"name":"Anvato (A Google Company)","exodusId":387,"link":"https://reports.exodus-privacy.eu.org/trackers/387"},{"id":"exodus_386","hostnames":["frm.acuant.net","medicscan.acuant.net","services.assureid.net"],"name":"Acuant","exodusId":386,"link":"https://reports.exodus-privacy.eu.org/trackers/386"},{"id":"exodus_38","hostnames":["deeplink.mobileapptracking.com","7336.deeplink.mobileapptracking.com","engine.mobileapptracking.com","167154.engine.mobileapptracking.com","189358.engine.mobileapptracking.com","189904.engine.mobileapptracking.com","190829.engine.mobileapptracking.com","194192.engine.mobileapptracking.com","195724.engine.mobileapptracking.com","20298.engine.mobileapptracking.com","7336.engine.mobileapptracking.com","943.engine.mobileapptracking.com","10148.engine.mobileapptracking.com","167126.engine.mobileapptracking.com","17058.engine.mobileapptracking.com","17908.engine.mobileapptracking.com","190107.engine.mobileapptracking.com","194985.engine.mobileapptracking.com","199107.engine.mobileapptracking.com","22006.engine.mobileapptracking.com","8604.engine.mobileapptracking.com","9864.engine.mobileapptracking.com"],"name":"Tune","exodusId":38,"link":"https://reports.exodus-privacy.eu.org/trackers/38"},{"id":"exodus_362","hostnames":["data.de.coremetrics.com"],"name":"IBM Digital Analytics","exodusId":362,"link":"https://reports.exodus-privacy.eu.org/trackers/362"},{"id":"exodus_361","hostnames":["grid.amap.com","tm.amap.com","mst[0-9]*.is.autonavi.com","mt[0-9]*.google.cn","abroad.apilocate.amap.com","apilocate.amap.com","restapi.amap.com","yuntuapi.amap.com","m5.amap.com","wb.amap.com","apiinit.amap.com","logs.amap.com","cgicol.amap.com","lbs.amap.com","wap.amap.com"],"name":"AutoNavi / Amap","exodusId":361,"link":"https://reports.exodus-privacy.eu.org/trackers/361"},{"id":"exodus_360","hostnames":[".*.admitad.com"],"name":"Admitad","exodusId":360,"link":"https://reports.exodus-privacy.eu.org/trackers/360"},{"id":"exodus_36","hostnames":["lb.aatkit.com","reporting.aatkit.com","rules.aatkit.com","rules2.aatkit.com","rules3.aatkit.com","tracking.aatkit.com"],"name":"Add Apt Tr","exodusId":36,"link":"https://reports.exodus-privacy.eu.org/trackers/36"},{"id":"exodus_357","hostnames":["sdk.predic.io"],"name":"PredicIO","exodusId":357,"link":"https://reports.exodus-privacy.eu.org/trackers/357"},{"id":"exodus_354","hostnames":["api.myendpoint.io","bin5y4muil.execute-api.us-east-1.amazonaws.com","api.smartechmetrics.com"],"name":"X-Mode","exodusId":354,"link":"https://reports.exodus-privacy.eu.org/trackers/354"},{"id":"exodus_350","hostnames":["api.infinario.com","sygic-api.infinario.com","skypicker-api.infinario.com"],"name":"Exponea","exodusId":350,"link":"https://reports.exodus-privacy.eu.org/trackers/350"},{"id":"exodus_35","hostnames":["mopub.com","ads.mopub.com","analytics.mopub.com","cb.mopub.com","mpx.mopub.com","a.r10.mopub.com","b.r10.mopub.com","c.r10.mopub.com","d.r10.mopub.com","s.mopub.com"],"name":"MoPub","exodusId":35,"link":"https://reports.exodus-privacy.eu.org/trackers/35"},{"id":"exodus_349","hostnames":["event.split.io","sdk.split.io"],"name":"Split","exodusId":349,"link":"https://reports.exodus-privacy.eu.org/trackers/349"},{"id":"exodus_347","hostnames":[".prebid.org","currency.prebid.org"],"name":"Prebid Mobile","exodusId":347,"link":"https://reports.exodus-privacy.eu.org/trackers/347"},{"id":"exodus_345","hostnames":[".partner-service.link"],"name":"Lenddo","exodusId":345,"link":"https://reports.exodus-privacy.eu.org/trackers/345"},{"id":"exodus_344","hostnames":["mobile-sdk-resources.jumio.com","nv-sdk.jumio.com"],"name":"Jumio","exodusId":344,"link":"https://reports.exodus-privacy.eu.org/trackers/344"},{"id":"exodus_343","hostnames":[".*.jiguang.cn"],"name":"JiGuang Aurora Mobile JPush","exodusId":343,"link":"https://reports.exodus-privacy.eu.org/trackers/343"},{"id":"exodus_340","hostnames":[".usebutton.com","api.usebutton.com","cdn.usebutton.com","mobileapi.usebutton.com","app-03c19ea7c9fd0c57.mobileapi.usebutton.com","app-10d1b5add9b529e5.mobileapi.usebutton.com","app-5f80612999bcf5c9.mobileapi.usebutton.com","app-67a1a4bb9dffba86.mobileapi.usebutton.com","app-6b7903104cffc647.mobileapi.usebutton.com","app-7101fcd60945d6ec.mobileapi.usebutton.com","app-796db8a17c48a13b.mobileapi.usebutton.com"],"name":"Button","exodusId":340,"link":"https://reports.exodus-privacy.eu.org/trackers/340"},{"id":"exodus_34","hostnames":["presage.io","ah-v1.presage.io","bip.presage.io","ext-inv-cdn.presage.io","medias.presage.io","mraid.presage.io","ms-ads.presage.io","ms-ads-events.presage.io","ms-auction.presage.io","p.presage.io","p-v2.presage.io","pad-v3.presage.io","pl-v2.presage.io","resources.presage.io","sy-v1.presage.io","tr-v1.presage.io","wsback-event.presage.io","wsback-get-config.presage.io","wsback-profile.presage.io","ogury.com","l-v1.presage.io","pr-v1.presage.io","wsback-track.presage.io","wsback-videotracking.presage.io"],"name":"Ogury","exodusId":34,"link":"https://reports.exodus-privacy.eu.org/trackers/34"},{"id":"exodus_338","hostnames":[".alimama.",".adsmogo."],"name":"Alimama (formerly AdsMogo)","exodusId":338,"link":"https://reports.exodus-privacy.eu.org/trackers/338"},{"id":"exodus_337","hostnames":["api.airpush.com","apidm.airpush.com","apistaging.airpush.com","apportal.airpush.com","appwall.api.airpush.com","beta.airpush.com","cdnap.airpush.com","m.airpush.com"],"name":"Airpush","exodusId":337,"link":"https://reports.exodus-privacy.eu.org/trackers/337"},{"id":"exodus_333","hostnames":["datacollector-dra.dt.dbankcloud.cn"],"name":"Huawei Mobile Services (HMS) Core","exodusId":333,"link":"https://reports.exodus-privacy.eu.org/trackers/333"},{"id":"exodus_33","hostnames":["nexage.com","ads.nexage.com","hb.nexage.com","pinger.ads.nexage.com","prod-m-node-1112.nexage.com","prod-m-node-1212.nexage.com","admax.nexage.com"],"name":"Nexage","exodusId":33,"link":"https://reports.exodus-privacy.eu.org/trackers/33"},{"id":"exodus_325","hostnames":["hb-minify-juc1ugur1qwqqqo4.stackpathdns.com"],"name":"ACRCloud","exodusId":325,"link":"https://reports.exodus-privacy.eu.org/trackers/325"},{"id":"exodus_324","hostnames":["abtasty.com","ariane.abtasty.com","dcinfos-cache.abtasty.com","sr-tag.abtasty.com","d1447tq2m68ekg.cloudfront.net","heatmap-quota.abtasty.com","dcinfos.abtasty.com","datacollect3.abtasty.com","datacollect6.abtasty.com","try.abtasty.com"],"name":"ABTasty","exodusId":324,"link":"https://reports.exodus-privacy.eu.org/trackers/324"},{"id":"exodus_32","hostnames":["tealiumiq.com","tiqcdn.com","collect.tealiumiq.com","collect-ap-northeast-1.tealiumiq.com","collect-ap-southeast-2.tealiumiq.com","collect-eu-central-1.tealiumiq.com","collect-eu-west-1.tealiumiq.com","datacloud.tealiumiq.com","datacloud-eu-central-1.tealiumiq.com","datacloud-us-east-1.tealiumiq.com","pc-cmsgov-collect.tealiumiq.com","pc-humana-collect.tealiumiq.com","pc-humana-visitor-service-us-east-1.tealiumiq.com","pc-providence-collect.tealiumiq.com","pc-providence-collect-us-east-1.tealiumiq.com","pc-providence-visitor-service-us-east-1.tealiumiq.com","uconnect.tealiumiq.com","visitor-service.tealiumiq.com","visitor-service-ap-northeast-1.tealiumiq.com","visitor-service-ap-southeast-2.tealiumiq.com","visitor-service-eu-central-1.tealiumiq.com","visitor-service-eu-west-1.tealiumiq.com","visitor-service-us-east-1.tealiumiq.com","tags.tiqcdn.com","tags-eu.tiqcdn.com","collect-us-east-1.tealiumiq.com"],"name":"Tealium","exodusId":32,"link":"https://reports.exodus-privacy.eu.org/trackers/32"},{"id":"exodus_316","hostnames":["deliver.oztam.com.au"],"name":"OzTAM","exodusId":316,"link":"https://reports.exodus-privacy.eu.org/trackers/316"},{"id":"exodus_314","hostnames":["api.factual.com"],"name":"Factual","exodusId":314,"link":"https://reports.exodus-privacy.eu.org/trackers/314"},{"id":"exodus_312","hostnames":["2mdn.net","doubleclick.com","doubleclick.net","mng-ads.com","mobileads.google.com","ads.google.com","googlesyndication.com","googleadservices.com","googleads.g.doubleclick.net","adservice.google..*","adservice.g.cn","ade.googlesyndication.com","pagead2.googlesyndication.com","tpc.googlesyndication.com","pagead2.googleadservices.com","www.googleadservices.com","8a97175fd63e1d3a69f36979b9b34470.safeframe.googlesyndication.com","b2b6d102cb7a4898bc54a3b73e31b759.safeframe.googlesyndication.com","80d4b6e40cc712bf92fcdbabdd4345fd.safeframe.googlesyndication.com","facf31c1c8559131d653f3c5ad4ecc78.safeframe.googlesyndication.com","c23811bc8d067cdb4f00f6af2c918f3d.safeframe.googlesyndication.com","pagead.googlesyndication.com","video-ad-stats.googlesyndication.com","buttons.googlesyndication.com","4.afs.googleadservices.com","partner.googleadservices.com"],"name":"Google AdServices","exodusId":312,"link":"https://reports.exodus-privacy.eu.org/trackers/312"},{"id":"exodus_310","hostnames":[".zapr.in","appmm.zapr.in","sdk.zapr.in","submit.zapr.in"],"name":"Zapr","exodusId":310,"link":"https://reports.exodus-privacy.eu.org/trackers/310"},{"id":"exodus_31","hostnames":["xiti.com","tag.aticdn.net","logs1413.xiti.com","logs1407.xiti.com","loga.xiti.com","logc1.xiti.com","logc2.xiti.com","logc3.xiti.com","logc8.xiti.com","logc11.xiti.com","logc13.xiti.com","logc14.xiti.com","logc22.xiti.com","logc26.xiti.com","logc31.xiti.com","logc32.xiti.com","logc35.xiti.com","logc89.xiti.com","logc142.xiti.com","logc146.xiti.com","logc149.xiti.com","logc169.xiti.com","logc173.xiti.com","logc180.xiti.com","logc181.xiti.com","logc187.xiti.com","logc189.xiti.com","logc202.xiti.com","logc205.xiti.com","logc206.xiti.com","logc209.xiti.com","logc238.xiti.com","logc253.xiti.com","logc279.xiti.com","logc407.xiti.com","logi4.xiti.com","logi5.xiti.com","logi6.xiti.com","logi7.xiti.com","logi8.xiti.com","logi9.xiti.com","logi10.xiti.com","logi11.xiti.com","logi12.xiti.com","logi13.xiti.com","logi103.xiti.com","logi104.xiti.com","logi118.xiti.com","logi125.xiti.com","logc135.xiti.com","logi141.xiti.com","logi150.xiti.com","logi151.xiti.com","logi162.xiti.com","logi163.xiti.com","logi242.xiti.com","logliberation.xiti.com","logp.xiti.com","logp2.xiti.com","logp3.xiti.com","logs1122.xiti.com","logs1125.xiti.com","logs1204.xiti.com","logs1242.xiti.com","logv1.xiti.com","logv2.xiti.com","logv3.xiti.com","logv4.xiti.com","logv5.xiti.com","logv6.xiti.com","logv7.xiti.com","logv8.xiti.com","logv9.xiti.com","logv10.xiti.com","logv11.xiti.com","logv12.xiti.com","logv13.xiti.com","logv14.xiti.com","logv16.xiti.com","logv17.xiti.com","logv18.xiti.com","logv19.xiti.com","logv20.xiti.com","logv21.xiti.com","logv22.xiti.com","logv23.xiti.com","logv24.xiti.com","logv25.xiti.com","logv26.xiti.com","logv27.xiti.com","logv28.xiti.com","logv29.xiti.com","logv30.xiti.com","logv31.xiti.com","logv32.xiti.com","logv143.xiti.com","logv144.xiti.com","logv145.xiti.com","www.xiti.com"],"name":"ATInternet","exodusId":31,"link":"https://reports.exodus-privacy.eu.org/trackers/31"},{"id":"exodus_307","hostnames":["evt.tamoco.com"],"name":"Tamoco","exodusId":307,"link":"https://reports.exodus-privacy.eu.org/trackers/307"},{"id":"exodus_306","hostnames":["siteintercept.qualtrics.com","siteinterceptco1.qualtrics.com"],"name":"Qualtrics","exodusId":306,"link":"https://reports.exodus-privacy.eu.org/trackers/306"},{"id":"exodus_302","hostnames":["ads.mdotm.com"],"name":"MDOTM","exodusId":302,"link":"https://reports.exodus-privacy.eu.org/trackers/302"},{"id":"exodus_300","hostnames":["heapanalytics.com","cdn.heapanalytics.com","d36lvucg9kzous.cloudfront.net"],"name":"Heap","exodusId":300,"link":"https://reports.exodus-privacy.eu.org/trackers/300"},{"id":"exodus_3","hostnames":["krxd.net","apiservices.krxd.net","beacon.krxd.net","beacon-ash-prod.krxd.net","beacon-sie.krxd.net","cdn.krxd.net","consumer.krxd.net","jslog.krxd.net","link.krxd.net","usermatch.krxd.net","wpp.krxd.net","services.krxd.net"],"name":"Salesforce DMP","exodusId":3,"link":"https://reports.exodus-privacy.eu.org/trackers/3"},{"id":"exodus_299","hostnames":["api.giphy.com","pingback.giphy.com"],"name":"GIPHY Analytics","exodusId":299,"link":"https://reports.exodus-privacy.eu.org/trackers/299"},{"id":"exodus_297","hostnames":["app-config.enhance.co","data-location.enhance.co"],"name":"Enhance","exodusId":297,"link":"https://reports.exodus-privacy.eu.org/trackers/297"},{"id":"exodus_293","hostnames":["account.talkingdata.com","av1.xdrig.com","cloud.xdrig.com","m.talkingdata.com","push.xdrig.com"],"name":"TalkingData","exodusId":293,"link":"https://reports.exodus-privacy.eu.org/trackers/293"},{"id":"exodus_292","hostnames":["api.beaconinside.com"],"name":"Square Metrics","exodusId":292,"link":"https://reports.exodus-privacy.eu.org/trackers/292"},{"id":"exodus_291","hostnames":["smartlook.com"],"name":"SmartLook","exodusId":291,"link":"https://reports.exodus-privacy.eu.org/trackers/291"},{"id":"exodus_290","hostnames":["api.sentiance.com"],"name":"Sentiance","exodusId":290,"link":"https://reports.exodus-privacy.eu.org/trackers/290"},{"id":"exodus_29","hostnames":["etl.tindersparks.com"],"name":"Tinder Analytics","exodusId":29,"link":"https://reports.exodus-privacy.eu.org/trackers/29"},{"id":"exodus_289","hostnames":["app.roximity.com"],"name":"Roximity","exodusId":289,"link":"https://reports.exodus-privacy.eu.org/trackers/289"},{"id":"exodus_286","hostnames":["api.pushspring.com"],"name":"PushSpring","exodusId":286,"link":"https://reports.exodus-privacy.eu.org/trackers/286"},{"id":"exodus_283","hostnames":[".glympse.com"],"name":"Glympse","exodusId":283,"link":"https://reports.exodus-privacy.eu.org/trackers/283"},{"id":"exodus_282","hostnames":["conversantmedia.com","www.conversantmedia.com"],"name":"Conversant","exodusId":282,"link":"https://reports.exodus-privacy.eu.org/trackers/282"},{"id":"exodus_28","hostnames":["api.leanplum.com","prod.leanplum.com","assets.prod.leanplum.com","www.leanplum.com"],"name":"LeanPlum","exodusId":28,"link":"https://reports.exodus-privacy.eu.org/trackers/28"},{"id":"exodus_278","hostnames":["amobee.com","ad.amgdgt.com","ads.amgdgt.com","vfdeprod.amobee.com"],"name":"Amobee","exodusId":278,"link":"https://reports.exodus-privacy.eu.org/trackers/278"},{"id":"exodus_276","hostnames":["cdn-api.admost.com","go.admost.com","med-api.admost.com"],"name":"Admost","exodusId":276,"link":"https://reports.exodus-privacy.eu.org/trackers/276"},{"id":"exodus_275","hostnames":["admixer.co.kr","admixer.net","adn.admixer.co.kr","inv-nets-eu.admixer.net","cdn.admixer.net","inv-nets.admixer.net"],"name":"Admixer","exodusId":275,"link":"https://reports.exodus-privacy.eu.org/trackers/275"},{"id":"exodus_272","hostnames":["ads.adadapted.com"],"name":"AdAdapted","exodusId":272,"link":"https://reports.exodus-privacy.eu.org/trackers/272"},{"id":"exodus_27","hostnames":["crashlytics.com","e.crashlytics.com"],"name":"Google CrashLytics","exodusId":27,"link":"https://reports.exodus-privacy.eu.org/trackers/27"},{"id":"exodus_269","hostnames":["api.altamob.com"],"name":"Altamob","exodusId":269,"link":"https://reports.exodus-privacy.eu.org/trackers/269"},{"id":"exodus_268","hostnames":["apiv2.moengage.com"],"name":"MoEngage","exodusId":268,"link":"https://reports.exodus-privacy.eu.org/trackers/268"},{"id":"exodus_267","hostnames":[".chartbeat.com",".chartbeat.net","api.chartbeat.com","dashapi.chartbeat.com","mab.chartbeat.com","static.chartbeat.com","static2.chartbeat.com","mabping.chartbeat.net","pespn.chartbeat.net","ping.chartbeat.net","pnytimes.chartbeat.net","ptimeinc.chartbeat.net","adsapi.chartbeat.com","www.chartbeat.com","pdev.chartbeat.net"],"name":"Chartbeat","exodusId":267,"link":"https://reports.exodus-privacy.eu.org/trackers/267"},{"id":"exodus_266","hostnames":["sdk.follow-apps.com","sor-sdk.follow-apps.com"],"name":"FollowAnalytics","exodusId":266,"link":"https://reports.exodus-privacy.eu.org/trackers/266"},{"id":"exodus_261","hostnames":["api.pingstart.com"],"name":"PingStart","exodusId":261,"link":"https://reports.exodus-privacy.eu.org/trackers/261"},{"id":"exodus_260","hostnames":["e-ssl.apsalar.com","e.apsalar.com"],"name":"Apsalar","exodusId":260,"link":"https://reports.exodus-privacy.eu.org/trackers/260"},{"id":"exodus_258","hostnames":["ads.tapdaq.com"],"name":"Tapdaq","exodusId":258,"link":"https://reports.exodus-privacy.eu.org/trackers/258"},{"id":"exodus_257","hostnames":["ad.cauly.co.kr"],"name":"Cauly","exodusId":257,"link":"https://reports.exodus-privacy.eu.org/trackers/257"},{"id":"exodus_256","hostnames":["ad-brix.com","config.ad-brix.com","campaign.ad-brix.com","cvr.ad-brix.com","tracking.ad-brix.com","ref.ad-brix.com"],"name":"Adbrix","exodusId":256,"link":"https://reports.exodus-privacy.eu.org/trackers/256"},{"id":"exodus_253","hostnames":["verify.uxcam.com"],"name":"UXCam","exodusId":253,"link":"https://reports.exodus-privacy.eu.org/trackers/253"},{"id":"exodus_25","hostnames":["flurry.com","adlog.flurry.com","ads.flurry.com","cdn.flurry.com","cfg.flurry.com","data.flurry.com","gw.flurry.com","proton.flurry.com","dev.flurry.com"],"name":"Flurry","exodusId":25,"link":"https://reports.exodus-privacy.eu.org/trackers/25"},{"id":"exodus_234","hostnames":[".wootric.com.herokudns.com","api.wootric.com.herokudns.com","production.wootric.com.herokudns.com","api.wootric.com","app.wootric.com","eligibility.wootric.com","production.wootric.com","survey.wootric.com"],"name":"Wootric","exodusId":234,"link":"https://reports.exodus-privacy.eu.org/trackers/234"},{"id":"exodus_231","hostnames":["sdk.inlocomedia.com","sdk-analytics.inlocomedia.com","visits.inlocomedia.com"],"name":"In Loco","exodusId":231,"link":"https://reports.exodus-privacy.eu.org/trackers/231"},{"id":"exodus_230","hostnames":["teads.tv","a.teads.tv","be-ms.teads.tv","cdn.teads.tv","cdn2.teads.tv","criteo-sync.teads.tv","mp.teads.tv","p.teads.tv","r.teads.tv","s8t.teads.tv","studio-t.teads.tv","sundaysky-sync-us.teads.tv","sync.teads.tv","t.teads.tv"],"name":"Teads","exodusId":230,"link":"https://reports.exodus-privacy.eu.org/trackers/230"},{"id":"exodus_23","hostnames":["via.batch.com","ws.batch.com"],"name":"Batch","exodusId":23,"link":"https://reports.exodus-privacy.eu.org/trackers/23"},{"id":"exodus_227","hostnames":["gemius.pl","gatr.hit.gemius.pl","googlecm.hit.gemius.pl","arbo.hit.gemius.pl","gapl.hit.gemius.pl","idm.hit.gemius.pl","seznam.hit.gemius.pl","st1.hit.gemius.pl","24ratownik.hit.gemius.pl","adbg.hit.gemius.pl","adclick.hit.gemius.pl","gahu.hit.gemius.pl","gazeta.hit.gemius.pl","gdeee.hit.gemius.pl","gdelt.hit.gemius.pl","gdelv.hit.gemius.pl","ghmtr.hit.gemius.pl","go2.hit.gemius.pl","goldbach.hit.gemius.pl","gspro.hit.gemius.pl","huiwiw.hit.gemius.pl","ls.hit.gemius.pl","onet.hit.gemius.pl","pro.hit.gemius.pl","rp.hit.gemius.pl","sec.hit.gemius.pl","si.hit.gemius.pl","tvn.hit.gemius.pl"],"name":"Gemius","exodusId":227,"link":"https://reports.exodus-privacy.eu.org/trackers/227"},{"id":"exodus_226","hostnames":["ads.mobclix.com","axonix.com","data.mobclix.com","mobclix.com","s.mobclix.com"],"name":"Axonix","exodusId":226,"link":"https://reports.exodus-privacy.eu.org/trackers/226"},{"id":"exodus_224","hostnames":["fwmrm.net","adm.fwmrm.net","v.fwmrm.net","7f077.v.fwmrm.net","dsp.v.fwmrm.net","ads.aws.fwmrm.net","prd.ads.aws.fwmrm.net","g13v.prd.ads.aws.fwmrm.net","nbcu.prd.ads.aws.fwmrm.net","m1.fwmrm.net","5d406.v.fwmrm.net","2822.v.fwmrm.net","2945.v.fwmrm.net","5d4a1.v.fwmrm.net","g1.v.fwmrm.net","1c6e2.v.fwmrm.net","2df7e.v.fwmrm.net","5bde1.v.fwmrm.net","2975c.v.fwmrm.net","29773.v.fwmrm.net","bea4.v.fwmrm.net","m.v.fwmrm.net","2ab7f.v.fwmrm.net","29ccd.v.fwmrm.net","m2.fwmrm.net","mssl.fwmrm.net"],"name":"FreeWheel","exodusId":224,"link":"https://reports.exodus-privacy.eu.org/trackers/224"},{"id":"exodus_22","hostnames":["serving-sys.com","bs.serving-sys.com","ds.serving-sys.com","gizmo.serving-sys.com","lm.serving-sys.com","msntest.serving-sys.com","secure-ds.serving-sys.com","services.serving-sys.com","amazon-adsystem.com","sizmek.com","ds-vn.serving-sys.com","ds-ll.serving-sys.com","activity.serving-sys.com","datacapture.serving-sys.com","detik.serving-sys.com","msn.serving-sys.com","aax-dtb-cf.amazon-adsystem.com","aax.amazon-adsystem.com","aax-eu-retail-direct.amazon-adsystem.com","aax-fe.amazon-adsystem.com","aax-fe-sin.amazon-adsystem.com","aax-us.amazon-adsystem.com","aax-us-east.amazon-adsystem.com","aax-us-east-retail-direct.amazon-adsystem.com","c.amazon-adsystem.com","cdn-a.amazon-adsystem.com","fls-eu.amazon-adsystem.com","fls-fe.amazon-adsystem.com","fls-na.amazon-adsystem.com","ir-na.amazon-adsystem.com","mads.amazon-adsystem.com","s.amazon-adsystem.com","ws-eu.amazon-adsystem.com","ws-na.amazon-adsystem.com","z-eu.amazon-adsystem.com","z-na.amazon-adsystem.com","rcm-eu.amazon-adsystem.com","wms-eu.amazon-adsystem.com","wms-na.amazon-adsystem.com","aax-eu.amazon-adsystem.com","ir-de.amazon-adsystem.com","ir-uk.amazon-adsystem.com","ps-eu.amazon-adsystem.com","ps-us.amazon-adsystem.com","aax-us-east-rtb.amazon-adsystem.com","rcm-na.amazon-adsystem.com","aax-cpm.amazon-adsystem.com","aax-us-pdx.amazon-adsystem.com","dra.amazon-adsystem.com","ir-jp.amazon-adsystem.com","ps-jp.amazon-adsystem.com","rcm-fe.amazon-adsystem.com","ws-fe.amazon-adsystem.com"],"name":"Amazon Advertising","exodusId":22,"link":"https://reports.exodus-privacy.eu.org/trackers/22"},{"id":"exodus_219","hostnames":["data.altbeacon.org"],"name":"AltBeacon","exodusId":219,"link":"https://reports.exodus-privacy.eu.org/trackers/219"},{"id":"exodus_218","hostnames":["adsafeprotected.com","iasds01.com","cdn.adsafeprotected.com","dt.adsafeprotected.com","fw.adsafeprotected.com","mobile.adsafeprotected.com","orfw.adsafeprotected.com","orpixel.adsafeprotected.com","pixel.adsafeprotected.com","sgfw.adsafeprotected.com","sgpixel.adsafeprotected.com","spixel.adsafeprotected.com","static.adsafeprotected.com","unified.adsafeprotected.com","vafw.adsafeprotected.com","vapixel.adsafeprotected.com","vast.adsafeprotected.com","video.adsafeprotected.com","wrapper-vast.adsafeprotected.com","ci.iasds01.com","sc.iasds01.com","appvast.adsafeprotected.com","dtvc.adsafeprotected.com","fwvc.adsafeprotected.com","mobile-static.adsafeprotected.com","nyidt.adsafeprotected.com","5726.bapi.adsafeprotected.com","6063.bapi.adsafeprotected.com","pm.adsafeprotected.com","anycast.dt.adsafeprotected.com"],"name":"Integral Ad Science","exodusId":218,"link":"https://reports.exodus-privacy.eu.org/trackers/218"},{"id":"exodus_216","hostnames":["sdk.adbuddiz.com"],"name":"AdBuddiz","exodusId":216,"link":"https://reports.exodus-privacy.eu.org/trackers/216"},{"id":"exodus_215","hostnames":["api.mobpowertech.com","log.mobpowertech.com","mobpowertech.com","scheme.mobpowertech.com","sg-tk.mobpowertech.com","upload.mobpowertech.com"],"name":"MobPower","exodusId":215,"link":"https://reports.exodus-privacy.eu.org/trackers/215"},{"id":"exodus_214","hostnames":["kiip.me","api.kiip.me"],"name":"Kiip","exodusId":214,"link":"https://reports.exodus-privacy.eu.org/trackers/214"},{"id":"exodus_213","hostnames":["analytics.ooyala.com"],"name":"Ooyala","exodusId":213,"link":"https://reports.exodus-privacy.eu.org/trackers/213"},{"id":"exodus_212","hostnames":["analytics.yinzcam.com"],"name":"Yinzcam Sobek","exodusId":212,"link":"https://reports.exodus-privacy.eu.org/trackers/212"},{"id":"exodus_211","hostnames":["api.taplytics.com","ping.tapylitics.com","6491480h9-capi.taplytics.com"],"name":"Taplytics","exodusId":211,"link":"https://reports.exodus-privacy.eu.org/trackers/211"},{"id":"exodus_210","hostnames":["openx.net","us-ads.openx.net","nytimes-d.openx.net","rtb.openx.net","samyonews-d.openx.net","u.openx.net","us-u.openx.net","servedbyopenx.com","update.openx.com","s.update.openx.com","taboola-d.openx.net","didna-d.openx.net","freestar-d.openx.net","ox-rtb-us-east1.openx.net","ox-rtb-us-east4.openx.net","indium.openx.net","r.openx.net","ascendeum-d.openx.net","prebid.openx.net","bid.openx.net","kiosked-d.openx.net","uk-ads.openx.net"],"name":"OpenX","exodusId":210,"link":"https://reports.exodus-privacy.eu.org/trackers/210"},{"id":"exodus_203","hostnames":["ad.auditude.com","cdn.auditude.com","adunit.cdn.auditude.com","ndn.cdn.auditude.com"],"name":"Auditude","exodusId":203,"link":"https://reports.exodus-privacy.eu.org/trackers/203"},{"id":"exodus_202","hostnames":["cws.conviva.com","47e224be59415ec068b94bca857581bd7dde7fb6.cws.conviva.com","87a6b28bc7823e67a5bb2a0a6728c702afcae78d.cws.conviva.com","efcad85fded269f462c434c4c5f84654a17d4a77.cws.conviva.com","www.cws.conviva.com","zee.cws.conviva.com","www.zee.cws.conviva.com","a6709203f34992a5095d2bc7ceaf2ec504f651a8.cws.conviva.com","ipv4.cws.conviva.com"],"name":"Conviva","exodusId":202,"link":"https://reports.exodus-privacy.eu.org/trackers/202"},{"id":"exodus_201","hostnames":["analytics-server.gimbal.com","api.gimbal.com","registration.gimbal.com","sdk-info.gimbal.com"],"name":"Gimbal","exodusId":201,"link":"https://reports.exodus-privacy.eu.org/trackers/201"},{"id":"exodus_200","hostnames":["analytics.rayjump.com","cdn-adn.rayjump.com","de01.rayjump.com","de.rayjump.com","detect.rayjump.com","fk-mtrack.rayjump.com","hybird.rayjump.com","jssdk.rayjump.com","net.rayjump.com","online.rayjump.com","rayjump.com","setting.rayjump.com","sg-mtrack.rayjump.com","sg01.rayjump.com","sg.rayjump.com","tknet.rayjump.com","us01.rayjump.com","adx-tk.rayjump.com","cdn-adn-https.rayjump.com","cdn-adn-ws.rayjump.com","check.rayjump.com","configure.rayjump.com","hb.rayjump.com","lazy.rayjump.com","play.rayjump.com","policy.rayjump.com","sg-new-ap-southeast-1a-hb.rayjump.com","sg-new-ap-southeast-1b-hb.rayjump.com","sg-new-ap-southeast-1c-hb.rayjump.com","sg-new-cdn-ap-southeast-1a-hb.rayjump.com","sg-new-cdn-ap-southeast-1b-hb.rayjump.com","sg-new-cdn-ap-southeast-1c-hb.rayjump.com","sg-setting.rayjump.com","vg-aws-us-east-1a-hb.rayjump.com","vg-aws-us-east-1b-hb.rayjump.com","vg-new-hb.rayjump.com","vg-setting.rayjump.com"],"name":"Mintegral","exodusId":200,"link":"https://reports.exodus-privacy.eu.org/trackers/200"},{"id":"exodus_20","hostnames":["sam4m.com","us-ma.sam4m.com","eu-ma.sam4m.com"],"name":"S4M","exodusId":20,"link":"https://reports.exodus-privacy.eu.org/trackers/20"},{"id":"exodus_2","hostnames":["fidzup"],"name":"FidZup","exodusId":2,"link":"https://reports.exodus-privacy.eu.org/trackers/2"},{"id":"exodus_199","hostnames":["tapjoy.com","tapjoyads.com","www.5rocks.io","bid.tapjoy.com","connect.tapjoy.com","content.tapjoy.com","placements.tapjoy.com","rpc.tapjoy.com","ws.tapjoy.com","ws.tapjoyads.com"],"name":"Tapjoy","exodusId":199,"link":"https://reports.exodus-privacy.eu.org/trackers/199"},{"id":"exodus_198","hostnames":[".target.my.com"],"name":"myTarget","exodusId":198,"link":"https://reports.exodus-privacy.eu.org/trackers/198"},{"id":"exodus_197","hostnames":["de.ioam.de"],"name":"INFOnline","exodusId":197,"link":"https://reports.exodus-privacy.eu.org/trackers/197"},{"id":"exodus_196","hostnames":["ads.aerserv.com","debug.aerserv.com","prod-ads.aerserv.com"],"name":"AerServ","exodusId":196,"link":"https://reports.exodus-privacy.eu.org/trackers/196"},{"id":"exodus_195","hostnames":["c2i.startappnetwork.com","c2s.startappnetwork.com","click.startappservice.com","dts.startappservice.com","events.startappservice.com","images.startappservice.com","imp.startappservice.com","info.static.startappservice.com","init.startappservice.com","req.startappservice.com","soda.startappservice.com","startappservice.com","va.origin.startappservice.com","adimpression.startappservice.com","adsmetadata.startappservice.com","adwin.startappservice.com","funnel-assets.startappservice.com","info.startappservice.com","infoevent.startappservice.com","static.startappservice.com","trackdownload.startappservice.com","video.startappservice.com"],"name":"StartApp","exodusId":195,"link":"https://reports.exodus-privacy.eu.org/trackers/195"},{"id":"exodus_194","hostnames":["col.eum-appdynamics.com","fra-col.eum-appdynamics.com","mobile.eum-appdynamics.com","pdx-col.eum-appdynamics.com","syd-col.eum-appdynamics.com","cdn.appdynamics.com","de8of677fyt0b.cloudfront.net"],"name":"Appdynamics","exodusId":194,"link":"https://reports.exodus-privacy.eu.org/trackers/194"},{"id":"exodus_193","hostnames":["cdn.onesignal.com"],"name":"OneSignal","exodusId":193,"link":"https://reports.exodus-privacy.eu.org/trackers/193"},{"id":"exodus_192","hostnames":["api.swrve.com","content.swrve.com","1170.api.swrve.com","1188.api.swrve.com","1353.api.swrve.com","1456.api.swrve.com","2359.api.swrve.com","2405.api.swrve.com","2578.api.swrve.com","2712.api.swrve.com","30572.api.swrve.com","30736.api.swrve.com","30819.api.swrve.com","3193.api.swrve.com","3426.api.swrve.com","3444.api.swrve.com","3606.api.swrve.com","3616.api.swrve.com","3789.api.swrve.com","3790.api.swrve.com","3791.api.swrve.com","409.api.swrve.com","4167.api.swrve.com","4421.api.swrve.com","4422.api.swrve.com","4445.api.swrve.com","4698.api.swrve.com","4699.api.swrve.com","4700.api.swrve.com","4706.api.swrve.com","758.api.swrve.com","eu-api.swrve.com","6379.eu-api.swrve.com","6384.eu-api.swrve.com","1170.content.swrve.com","1188.content.swrve.com","1353.content.swrve.com","1456.content.swrve.com","2359.content.swrve.com","2405.content.swrve.com","2578.content.swrve.com","2712.content.swrve.com","30572.content.swrve.com","30736.content.swrve.com","30819.content.swrve.com","3616.content.swrve.com","3789.content.swrve.com","3790.content.swrve.com","409.content.swrve.com","4167.content.swrve.com","4421.content.swrve.com","4422.content.swrve.com","4445.content.swrve.com","4706.content.swrve.com","758.content.swrve.com","eu-content.swrve.com","6379.eu-content.swrve.com","6384.eu-content.swrve.com","30506.api.swrve.com","31123.api.swrve.com","3285.api.swrve.com","3696.api.swrve.com","4572.api.swrve.com","4761.api.swrve.com","4768.api.swrve.com","854.api.swrve.com","30181.content.swrve.com","30506.content.swrve.com","31123.content.swrve.com","3285.content.swrve.com","3696.content.swrve.com","4572.content.swrve.com","4698.content.swrve.com","4699.content.swrve.com","4700.content.swrve.com","4768.content.swrve.com"],"name":"Swrve","exodusId":192,"link":"https://reports.exodus-privacy.eu.org/trackers/192"},{"id":"exodus_191","hostnames":["duapps.com","common.duapps.com","pasta.da.duapps.com","pasta.dc.duapps.com","gc.ds.duapps.com","pasta.ds.duapps.com","pasta.durecorder.duapps.com","pasta.esfile.duapps.com","pasta.estrongspro.duapps.com","nrc.sd.duapps.com","pasta.sd.duapps.com","api.mobula.sdk.duapps.com","rts.mobula.sdk.duapps.com","ioslog.ssl2.duapps.com","mblapi.ssl2.duapps.com","nrcapi.ssl2.duapps.com","rts.ssl2.duapps.com","nrc.ds.duapps.com","u.ds.duapps.com","pasta.esapplocker.duapps.com","api.gif.duapps.com","s.duapps.com","motu-hk.ssl2.duapps.com"],"name":"Duapps","exodusId":191,"link":"https://reports.exodus-privacy.eu.org/trackers/191"},{"id":"exodus_190","hostnames":["bugly.qq.com","aexception.bugly.qq.com","android.bugly.qq.com","astat.bugly.qq.com","ios.bugly.qq.com"],"name":"Bugly","exodusId":190,"link":"https://reports.exodus-privacy.eu.org/trackers/190"},{"id":"exodus_189","hostnames":["hyprmx.com","live.hyprmx.com","marketplace-android-b235.hyprmx.com","static.hyprmx.com"],"name":"HyprMX","exodusId":189,"link":"https://reports.exodus-privacy.eu.org/trackers/189"},{"id":"exodus_188","hostnames":["appsrv.display.io"],"name":"Display","exodusId":188,"link":"https://reports.exodus-privacy.eu.org/trackers/188"},{"id":"exodus_187","hostnames":["balanced-collect.deltadna.net","balanced-engage.deltadna.net","collect10791rllrc.deltadna.net","collect10854wrdcr.deltadna.net","collect11136gwntd.deltadna.net","collect12348wrdvs.deltadna.net","collect12981wrdfl.deltadna.net","collect2585gmsfw.deltadna.net","collect3515gvrnr.deltadna.net","collect5081wrdch.deltadna.net","engage10854wrdcr.deltadna.net","engage12348wrdvs.deltadna.net","engage12981wrdfl.deltadna.net","engage13764wrdst.deltadna.net","engage3515gvrnr.deltadna.net","engage5081wrdch.deltadna.net","engage8829thscr.deltadna.net","collect17070dvntr.deltadna.net","collect4739mgndm.deltadna.net","engage10665dd4kq.deltadna.net","engage10791rllrc.deltadna.net","engage11442ldybg.deltadna.net","engage17070dvntr.deltadna.net"],"name":"deltaDNA","exodusId":187,"link":"https://reports.exodus-privacy.eu.org/trackers/187"},{"id":"exodus_184","hostnames":["appnext.com","admin.appnext.com","cdn.appnext.com","global.appnext.com","si.appnext.com"],"name":"Appnext","exodusId":184,"link":"https://reports.exodus-privacy.eu.org/trackers/184"},{"id":"exodus_183","hostnames":["pubnative.net","api.pubnative.net","hbrc.pubnative.net"],"name":"PubNative","exodusId":183,"link":"https://reports.exodus-privacy.eu.org/trackers/183"},{"id":"exodus_182","hostnames":["api.otherlevels.com","geodata.otherlevels.com","mdn.otherlevels.com","rich.otherlevels.com","tags.otherlevels.com","ws.otherlevels.com","events-api.otherlevels.com","native-set-tags.otherlevels.com","js-api.otherlevels.com","js-tags.otherlevels.com"],"name":"OtherLevels","exodusId":182,"link":"https://reports.exodus-privacy.eu.org/trackers/182"},{"id":"exodus_181","hostnames":["sdk.foursquare.com"],"name":"Pilgrim by Foursquare","exodusId":181,"link":"https://reports.exodus-privacy.eu.org/trackers/181"},{"id":"exodus_180","hostnames":["m2m-api.inmarket.com"],"name":"InMarket","exodusId":180,"link":"https://reports.exodus-privacy.eu.org/trackers/180"},{"id":"exodus_18","hostnames":["mparticle.com","config2.mparticle.com","cookiesync.mparticle.com","identity.mparticle.com","jssdkcdn.mparticle.com","jssdkcdns.mparticle.com","jssdks.mparticle.com","nativesdks.mparticle.com","pixels.mparticle.com","s2s.mparticle.com","static.mparticle.com"],"name":"mParticle","exodusId":18,"link":"https://reports.exodus-privacy.eu.org/trackers/18"},{"id":"exodus_179","hostnames":[".dov-e.com"],"name":"DOV-E","exodusId":179,"link":"https://reports.exodus-privacy.eu.org/trackers/179"},{"id":"exodus_176","hostnames":["api.cloudmobi.net","cloudmobi.net","logger.cloudmobi.net","vast.cloudmobi.net"],"name":"Cloudmobi","exodusId":176,"link":"https://reports.exodus-privacy.eu.org/trackers/176"},{"id":"exodus_175","hostnames":["tracker-api.my.com"],"name":"myTracker","exodusId":175,"link":"https://reports.exodus-privacy.eu.org/trackers/175"},{"id":"exodus_174","hostnames":["wzrkt.com","eu1.wzrkt.com","eu1-spiky.wzrkt.com","in.wzrkt.com","in-spiky.wzrkt.com","in1.wzrkt.com","in1-spiky.wzrkt.com","sg1.wzrkt.com","sg1-spiky.wzrkt.com","us1.wzrkt.com","us1-spiky.wzrkt.com"],"name":"CleverTap","exodusId":174,"link":"https://reports.exodus-privacy.eu.org/trackers/174"},{"id":"exodus_173","hostnames":["taboola.com","15.taboola.com","am-match.taboola.com","am-sync.taboola.com","am-trc-events.taboola.com","am-vid-events.taboola.com","am-wf.taboola.com","api.taboola.com","beacon.taboola.com","c2.taboola.com","c3.taboola.com","cdn.taboola.com","cds.taboola.com","ch-match.taboola.com","ch-sync.taboola.com","ch-vid-events.taboola.com","ch-wf.taboola.com","hk-match.taboola.com","hk-sync.taboola.com","hk-vid-events.taboola.com","hk-wf.taboola.com","images.taboola.com","images-dl.taboola.com","impr.taboola.com","imprammp.taboola.com","imprchmp.taboola.com","imprhkmp.taboola.com","imprlatbmp.taboola.com","imprnjmp.taboola.com","imprsgmp.taboola.com","la-match.taboola.com","la-sync.taboola.com","la-trc-events.taboola.com","la-vid-events.taboola.com","la-wf.taboola.com","match.taboola.com","mb.taboola.com","nr.taboola.com","nr-events.taboola.com","opps.taboola.com","popup.taboola.com","resources.taboola.com","sg-match.taboola.com","sg-sync.taboola.com","sg-trc-events.taboola.com","sg-vid-events.taboola.com","sg-wf.taboola.com","sync.taboola.com","sync-t1.taboola.com","tracking.taboola.com","trc.taboola.com","trc-events.taboola.com","us-match.taboola.com","us-sync.taboola.com","us-vid-events.taboola.com","us-wf.taboola.com","vidanalytics.taboola.com","vidstat.taboola.com","vidstatb.taboola.com","vidutils.taboola.com","wf.taboola.com","basebanner.com","taboolasyndication.com","convhkmp.taboola.com","convlatbmp.taboola.com","assets.taboola.com","convchmp.taboola.com","convnjmp.taboola.com","mpg.taboola.com","timeinc.trc.taboola.com","api-s2s.taboola.com","img.img-taboola.com","www.api.taboola.com","www.c2.taboola.com","www.cdn.taboola.com","www.images.taboola.com","www.popup.taboola.com","www.taboola.com","www.trc.taboola.com","cdn-yjp.taboola.com","match.basebanner.com","convnjmp.basebanner.com","15.basebanner.com","wf.basebanner.com","cdn.taboolasyndication.com","trc.taboolasyndication.com","urc.taboolasyndication.com"],"name":"Taboola","exodusId":173,"link":"https://reports.exodus-privacy.eu.org/trackers/173"},{"id":"exodus_172","hostnames":["optimizely.com","api.optimizely.com","app.optimizely.com","cdn.optimizely.com","cdn3.optimizely.com","logx.optimizely.com","events.mobile.optimizely.com","284419414.log.optimizely.com","www.284419414.log.optimizely.com","a125375509.cdn.optimizely.com","log3.optimizely.com","log.optimizely.com","3459571470.log.optimizely.com"],"name":"Optimizely","exodusId":172,"link":"https://reports.exodus-privacy.eu.org/trackers/172"},{"id":"exodus_171","hostnames":["a.tiles.mapbox.com","api.tiles.mapbox.com"],"name":"Mapbox","exodusId":171,"link":"https://reports.exodus-privacy.eu.org/trackers/171"},{"id":"exodus_170","hostnames":["criteo.com","as.criteo.com","ads.as.criteo.com","cas.as.criteo.com","dis.as.criteo.com","hk.as.criteo.com","privacy.as.criteo.com","rdi.as.criteo.com","widget.as.criteo.com","b.criteo.com","bidder.criteo.com","cat.criteo.com","dis.criteo.com","dynamic.criteo.com","ebs.criteo.com","eu.criteo.com","ads.eu.criteo.com","cas.eu.criteo.com","d.eu.criteo.com","fr.eu.criteo.com","cat.fr.eu.criteo.com","rat.fr.eu.criteo.com","widget.fr.eu.criteo.com","nl.eu.criteo.com","rat.nl.eu.criteo.com","widget.eu.criteo.com","gbc.criteo.com","ag.gbc.criteo.com","gem.gbc.criteo.com","gum.criteo.com","marketing.criteo.com","mug.criteo.com","prod.criteo.com","vip.prod.criteo.com","am5.vip.prod.criteo.com","da1.vip.prod.criteo.com","bidder.da1.vip.prod.criteo.com","cat.da1.vip.prod.criteo.com","cbsd.da1.vip.prod.criteo.com","dynamic.da1.vip.prod.criteo.com","gum.da1.vip.prod.criteo.com","mug.da1.vip.prod.criteo.com","rdi.da1.vip.prod.criteo.com","widget.da1.vip.prod.criteo.com","par.vip.prod.criteo.com","widget.par.vip.prod.criteo.com","va1.vip.prod.criteo.com","bidder.va1.vip.prod.criteo.com","cat.va1.vip.prod.criteo.com","gum.va1.vip.prod.criteo.com","widget.va1.vip.prod.criteo.com","pub-sdk-cfg.criteo.com","sslwidget.criteo.com","static.criteo.com","us.criteo.com","ads.us.criteo.com","d.us.criteo.com","da.us.criteo.com","cat.da.us.criteo.com","gbc0.da.us.criteo.com","gbc1.da.us.criteo.com","gbc2.da.us.criteo.com","gbc3.da.us.criteo.com","gbc4.da.us.criteo.com","gbc5.da.us.criteo.com","gbc6.da.us.criteo.com","gbc7.da.us.criteo.com","gbc8.da.us.criteo.com","rtb.da.us.criteo.com","widget.da.us.criteo.com","dis.us.criteo.com","privacy.us.criteo.com","rdi.us.criteo.com","va.us.criteo.com","cat.va.us.criteo.com","rtb.va.us.criteo.com","widget.va.us.criteo.com","widget.us.criteo.com","criteo.net","rdi.eu.criteo.com","ssp-sync.criteo.com","cat.hk.as.criteo.com","gbc0.hk.as.criteo.com","gbc1.hk.as.criteo.com","gbc2.hk.as.criteo.com","gbc3.hk.as.criteo.com","gbc4.hk.as.criteo.com","gbc5.hk.as.criteo.com","gbc6.hk.as.criteo.com","gbc7.hk.as.criteo.com","gbc8.hk.as.criteo.com","rtb.hk.as.criteo.com","widget.hk.as.criteo.com","cat.nl.eu.criteo.com","widget.nl.eu.criteo.com","widget.am5.vip.prod.criteo.com","hk5.vip.prod.criteo.com","bidder.hk5.vip.prod.criteo.com","cas.hk5.vip.prod.criteo.com","cat.hk5.vip.prod.criteo.com","gum.hk5.vip.prod.criteo.com","mug.hk5.vip.prod.criteo.com","rdi.hk5.vip.prod.criteo.com","rtax.hk5.vip.prod.criteo.com","widget.hk5.vip.prod.criteo.com","cas.criteo.com","dis.eu.criteo.com","rtax.criteo.com","sapatoru.widget.criteo.com","widget.criteo.com","www.criteo.com","as.criteo.net","csm.as.criteo.net","hk.as.criteo.net","csm.hk.as.criteo.net","pix.as.criteo.net","eu.criteo.net","csm.eu.criteo.net","fr.eu.criteo.net","csm.fr.eu.criteo.net","nl.eu.criteo.net","csm.nl.eu.criteo.net","pix.eu.criteo.net","static.eu.criteo.net","prod.criteo.net","vip.prod.criteo.net","am5.vip.prod.criteo.net","static.am5.vip.prod.criteo.net","da1.vip.prod.criteo.net","csm.da1.vip.prod.criteo.net","pix.da1.vip.prod.criteo.net","static.da1.vip.prod.criteo.net","hk5.vip.prod.criteo.net","csm.hk5.vip.prod.criteo.net","pix.hk5.vip.prod.criteo.net","static.hk5.vip.prod.criteo.net","par.vip.prod.criteo.net","static.par.vip.prod.criteo.net","va1.vip.prod.criteo.net","csm.va1.vip.prod.criteo.net","static.va1.vip.prod.criteo.net","static.criteo.net","us.criteo.net","csm.us.criteo.net","da.us.criteo.net","csm.da.us.criteo.net","pix.us.criteo.net","va.us.criteo.net","csm.va.us.criteo.net"],"name":"Criteo","exodusId":170,"link":"https://reports.exodus-privacy.eu.org/trackers/170"},{"id":"exodus_17","hostnames":["appboy.com","dev.appboy.com","iad.appboy.com","axion.iad.appboy.com","carina.iad.appboy.com","equuleus.iad.appboy.com","lacerta.iad.appboy.com","null.iad.appboy.com","orion.iad.appboy.com","pyxis.iad.appboy.com","serpens.iad.appboy.com","shared.iad.appboy.com","venetia.iad.appboy.com","iad-03.appboy.com","lacerta.iad-03.appboy.com","sdk.iad-03.appboy.com","yildun.iad-03.appboy.com","sdk-orion.appboy.com","www.orion.iad.appboy.com","akar.iad.appboy.com","hercules.iad.appboy.com"],"name":"Braze (formerly Appboy)","exodusId":17,"link":"https://reports.exodus-privacy.eu.org/trackers/17"},{"id":"exodus_169","hostnames":["ads.api.vungle.com","akamai.vungle-cdn.vungle.com","api.vungle.akadns.net","api.vungle.com","bd.vungle.com","billboard.vungle.com","cdn-lb.vungle.com","ci.vungle.com","data.vungle.com","ingest.vungle.com","jaeger.vungle.com","ltv-data-api.kube-prod.vungle.com","monitoring.vungle.com","ssl.vungle.com","v.vungle.com","tpat.api.vungle.com","tpat.api.vungle.akadns.net","dsp.api.vungle.com","events.api.vungle.com"],"name":"Vungle","exodusId":169,"link":"https://reports.exodus-privacy.eu.org/trackers/169"},{"id":"exodus_168","hostnames":["lcf.cmplay.cmcm.com","magic.cmcm.com","ms.cmcm.com","tealand.cmcm.com","tileswan.cmcm.com"],"name":"Cheetah Ads","exodusId":168,"link":"https://reports.exodus-privacy.eu.org/trackers/168"},{"id":"exodus_167","hostnames":["api.branch.io"],"name":"Branch","exodusId":167,"link":"https://reports.exodus-privacy.eu.org/trackers/167"},{"id":"exodus_166","hostnames":["dev-api.persona.ly","dev.dsp.persona.ly","dev.persona.ly","dsp.persona.ly","rtb.persona.ly","sdk.persona.ly"],"name":"Persona.ly","exodusId":166,"link":"https://reports.exodus-privacy.eu.org/trackers/166"},{"id":"exodus_165","hostnames":["sdk.adincube.com"],"name":"Adincube","exodusId":165,"link":"https://reports.exodus-privacy.eu.org/trackers/165"},{"id":"exodus_164","hostnames":["assets.soom.la","teleport.soom.la","highway2.soom.la"],"name":"Soomla","exodusId":164,"link":"https://reports.exodus-privacy.eu.org/trackers/164"},{"id":"exodus_162","hostnames":["appodeal.com","api.appodeal.com","eu-central-1.appodeal.com","api.appodealx.com","ach.appodeal.com","api-us.appodealx.com"],"name":"Appodeal","exodusId":162,"link":"https://reports.exodus-privacy.eu.org/trackers/162"},{"id":"exodus_16","hostnames":["analytics.localytics.com","manifest.localytics.com","profile.localytics.com","sdk-assets.localytics.com","webanalytics.localytics.com"],"name":"Localytics","exodusId":16,"link":"https://reports.exodus-privacy.eu.org/trackers/16"},{"id":"exodus_159","hostnames":["mobvista.com","3s-smart-rtb.mobvista.com","3s-smart-rtb-cdn.mobvista.com","smart.mobvista.com"],"name":"Mobvista","exodusId":159,"link":"https://reports.exodus-privacy.eu.org/trackers/159"},{"id":"exodus_158","hostnames":["adfurikun.jp","ginf.adfurikun.jp","api.adfurikun.jp","i.adfurikun.jp"],"name":"Adfurikun","exodusId":158,"link":"https://reports.exodus-privacy.eu.org/trackers/158"},{"id":"exodus_157","hostnames":["adform.com","adformdsp.net","adx.adform.net","files.adform.net","track.adform.net","adform.net","seadform.net","site.adform.com","server.adformdsp.net","a1.adform.net","adx2.adform.net","asia.adform.net","c1.adform.net","cm.adform.net","cm2.adform.net","cm3.adform.net","dmp.adform.net","s2.adform.net","asia.seadform.net","server.seadform.net","track.seadform.net","a1.seadform.net","s1.adform.net"],"name":"Adform","exodusId":157,"link":"https://reports.exodus-privacy.eu.org/trackers/157"},{"id":"exodus_156","hostnames":["analytics.ad.daum.net","statistics.videofarm.daum.net"],"name":"AdFit (Daum)","exodusId":156,"link":"https://reports.exodus-privacy.eu.org/trackers/156"},{"id":"exodus_155","hostnames":["api.crittercism.com","appload.ingest.crittercism.com","txn.ingest.crittercism.com"],"name":"Apteligent by VMWare (formerly Crittercism)","exodusId":155,"link":"https://reports.exodus-privacy.eu.org/trackers/155"},{"id":"exodus_153","hostnames":["stags.bluekai.com","tags.bluekai.com"],"name":"BlueKai (acquired by Oracle)","exodusId":153,"link":"https://reports.exodus-privacy.eu.org/trackers/153"},{"id":"exodus_152","hostnames":["adm.dynamicyield.com","api.dynamicyield.com","cdn.dynamicyield.com","px.dynamicyield.com","st.dynamicyield.com","async-px.dynamicyield.com","rest.dynamicyield.com"],"name":"Dynamic Yield","exodusId":152,"link":"https://reports.exodus-privacy.eu.org/trackers/152"},{"id":"exodus_151","hostnames":["nexus.ensighten.com"],"name":"Ensighten","exodusId":151,"link":"https://reports.exodus-privacy.eu.org/trackers/151"},{"id":"exodus_150","hostnames":["a.fiksu.com","sdk.fiksu.com"],"name":"Fiksu","exodusId":150,"link":"https://reports.exodus-privacy.eu.org/trackers/150"},{"id":"exodus_15","hostnames":["247realmedia.com","adnxs.com","appnexus.com","appnexus.net","acdn.adnxs.com","adscale-emea.adnxs.com","ams1-ib.adnxs.com","anycast.adnxs.com","ib.anycast.adnxs.com","m.anycast.adnxs.com","mobile.anycast.adnxs.com","b.adnxs.com","cdn.adnxs.com","crcdn01.adnxs.com","crcdn09.adnxs.com","dcdn.adnxs.com","ib.adnxs.com","iqzn-useast.adnxs.com","lax1-ib.adnxs.com","m.adnxs.com","mediation.adnxs.com","nym1-ib.adnxs.com","p.adnxs.com","nine-a.p.adnxs.com","yj.p.adnxs.com","yj-a.p.adnxs.com","prebid.adnxs.com","rb.adnxs.com","secure.adnxs.com","sharethrough.adnxs.com","sin3-ib.adnxs.com","vcdn.adnxs.com","sin1.geoadnxs.com","ib.sin1.geoadnxs.com","m.ib.sin1.geoadnxs.com","mobile.ib.sin1.geoadnxs.com","sin3-ib.sin1.geoadnxs.com","adnxs-simple.com","oasc02023.247realmedia.com","oasc05.247realmedia.com","oasc05050.247realmedia.com","oasc16.247realmedia.com","oasc18065.247realmedia.com","www.247realmedia.com","oasc03012.247realmedia.com","oasc03049.247realmedia.com","oasc06006.247realmedia.com","oasc08008.247realmedia.com","oasc09.247realmedia.com","www.prebid.adnxs.com","update.ib.adnxs.com","s.update.ib.adnxs.com","oas-c18.adnxs.com","cdn.oas-c18.adnxs.com","sin1-ib.adnxs.com","thunder.adnxs.com","cdn.oas-c17.adnxs.com","secure-ams.adnxs.com","photobucket.adnxs.com","ym.adnxs.com","nym1.b.adnxs.com","gam.adnxs.com","mob.adnxs.com","nym1.ib.adnxs.com","sin1.g.adnxs.com","ams1.ib.adnxs.com","ams1-mobile.adnxs.com","fra1-ib.adnxs.com","g.adnxs.com","www.adnxs.com","www.appnexus.com","acdn.adnxs-simple.com","ib.adnxs-simple.com","nym1-ib.adnxs-simple.com","fra1-ib.adnxs-simple.com"],"name":"AppNexus","exodusId":15,"link":"https://reports.exodus-privacy.eu.org/trackers/15"},{"id":"exodus_149","hostnames":["4seeresults.com","analytics.foresee.com","foresee.com","i.4see.mobi","rec.replay.answerscloud.com","controller.4seeresults.com","device.4seeresults.com","replaycontroller.4seeresults.com","bd-nplb01.foresee.com","bd-nplb02.foresee.com","bd-nplb03.foresee.com","brain.foresee.com","cx.foresee.com","gateway.foresee.com","static.foresee.com","events.foreseeresults.com","controller.foreseeresults.com"],"name":"Foresee","exodusId":149,"link":"https://reports.exodus-privacy.eu.org/trackers/149"},{"id":"exodus_147","hostnames":["ads.heyzap.com","fyc.heyzap.com","img-cloudflare-2.haizap.com","img-cloudflare.haizap.com","med.heyzap.com","x.heyzap.com"],"name":"Heyzap (bought by Fyber)","exodusId":147,"link":"https://reports.exodus-privacy.eu.org/trackers/147"},{"id":"exodus_144","hostnames":["android-quinoa-config-prod.sense360eng.com","incoming-data-sense360.s3.amazonaws.com","quinoa-personal-identify-prod.sense360eng.com","ios-quinoa-personal-identify-prod.sense360eng.com"],"name":"Sense360","exodusId":144,"link":"https://reports.exodus-privacy.eu.org/trackers/144"},{"id":"exodus_140","hostnames":["analytics.mobile.yandex.net","appmetrica.yandex.com","banners-slb.mobile.yandex.net","banners.mobile.yandex.net","mc.yandex.ru","report.appmetrica.yandex.net","startup.mobile.yandex.net"],"name":"AppMetrica","exodusId":140,"link":"https://reports.exodus-privacy.eu.org/trackers/140"},{"id":"exodus_14","hostnames":["widespace.com","engine.widespace.com","dckappa.widespace.com","inscreen.widespace.com","dc.widespace.com","sdk-controller.widespace.com","www.widespace.com"],"name":"Widespace","exodusId":14,"link":"https://reports.exodus-privacy.eu.org/trackers/14"},{"id":"exodus_138","hostnames":["piwik.org"],"name":"Matomo (Piwik)","exodusId":138,"link":"https://reports.exodus-privacy.eu.org/trackers/138"},{"id":"exodus_137","hostnames":[".dynatrace.com","bf20578xco.bf.dynatrace.com","js-cdn.dynatrace.com"],"name":"Dynatrace","exodusId":137,"link":"https://reports.exodus-privacy.eu.org/trackers/137"},{"id":"exodus_136","hostnames":["sdk.appbrain.com"],"name":"AppBrain","exodusId":136,"link":"https://reports.exodus-privacy.eu.org/trackers/136"},{"id":"exodus_135","hostnames":["brahe.apptimize.com","md-a-c.apptimize.com","md-a-s.apptimize.com"],"name":"Apptimize","exodusId":135,"link":"https://reports.exodus-privacy.eu.org/trackers/135"},{"id":"exodus_133","hostnames":["quantcast.com","cmp.quantcast.com","quantserve.com","ak.quantcast.com","widget.quantcast.com","aboutads.quantcast.com","2kpixel.quantserve.com","cms.quantserve.com","edge.quantserve.com","exch.quantserve.com","pixel.quantserve.com","px.quantserve.com","global.px.quantserve.com","px2.px.quantserve.com","qcx.quantserve.com","secure.quantserve.com","us-west-notify-rtb.quantserve.com","vast.quantserve.com","www.edge.quantserve.com","flash.quantserve.com","segapi.quantserve.com","www.quantserve.com"],"name":"Quantcast","exodusId":133,"link":"https://reports.exodus-privacy.eu.org/trackers/133"},{"id":"exodus_130","hostnames":["js-agent.newrelic.com","mobile-collector.newrelic.com","nr-data.net","insights-collector.newrelic.com","bam.nr-data.net","eu01.nr-data.net","bam.eu01.nr-data.net","d1ros97qkrwjf5.cloudfront.net","beacon-1.newrelic.com","beacon-3.newrelic.com"],"name":"New Relic","exodusId":130,"link":"https://reports.exodus-privacy.eu.org/trackers/130"},{"id":"exodus_13","hostnames":["ligatus.com","a.ligatus.com","ligatus.de","a-ssl.ligatus.com","d.ligatus.com","i.ligatus.com","a.ligatus.de"],"name":"Ligatus","exodusId":13,"link":"https://reports.exodus-privacy.eu.org/trackers/13"},{"id":"exodus_129","hostnames":["dc.webtrends.com","c.webtrends.com","s.webtrends.com","webtrendslive.com","scs.webtrends.com","ots.optimize.webtrends.com","statse.webtrendslive.com"],"name":"Webtrends","exodusId":129,"link":"https://reports.exodus-privacy.eu.org/trackers/129"},{"id":"exodus_127","hostnames":["control.kochava.com","kvinit-prod.api.kochava.com","imp.control.kochava.com","web-sdk.control.kochava.com"],"name":"Kochava","exodusId":127,"link":"https://reports.exodus-privacy.eu.org/trackers/127"},{"id":"exodus_126","hostnames":["api.appsee.com"],"name":"AppSee","exodusId":126,"link":"https://reports.exodus-privacy.eu.org/trackers/126"},{"id":"exodus_125","hostnames":["api.amplitude.com","api2.amplitude.com","cdn.amplitude.com","info.amplitude.com","regionconfig.amplitude.com","static.amplitude.com","d24n15hnbwhuhn.cloudfront.net","api.eu.amplitude.com","api.lab.amplitude.com"],"name":"Amplitude","exodusId":125,"link":"https://reports.exodus-privacy.eu.org/trackers/125"},{"id":"exodus_123","hostnames":["device-api.urbanairship.com","device-api.asnapieu.com","boxoffice.urbanairship.com","c00162-dl.urbanairship.com","combine.urbanairship.com","remote-data.urbanairship.com","sbux-dl.urbanairship.com","web-sdk.urbanairship.com"],"name":"Urbanairship","exodusId":123,"link":"https://reports.exodus-privacy.eu.org/trackers/123"},{"id":"exodus_121","hostnames":["adserver.unityads.unity3d.com","analytics.social.unity.com","api.uca.cloud.unity3d.com","auction.unityads.unity3d.com","cdn-highwinds.unityads.unity3d.com","cdn.unityads.unity3d.com","config.uca.cloud.unity3d.com","config.unityads.unity3d.com","stats.unity3d.com","webview.unityads.unity3d.com","geocdn.unityads.unity3d.com","publisher-config.unityads.unity3d.com"],"name":"Unity3d Ads","exodusId":121,"link":"https://reports.exodus-privacy.eu.org/trackers/121"},{"id":"exodus_120","hostnames":["alog.umeng.com","alogs.umeng.com","ar.umeng.com","oc.umeng.com","umeng.com","uop.umeng.com","alog-default.umeng.com","alogsus.umeng.com","alogus.umeng.com","at.umeng.com","au.umeng.com","errlog.umeng.com","ocx.umeng.com","ouplog.umeng.com","plbslog.umeng.com","sec.umeng.com","ulogs.umeng.com","v1.cnzz.com"],"name":"Umeng Feedback","exodusId":120,"link":"https://reports.exodus-privacy.eu.org/trackers/120"},{"id":"exodus_12","hostnames":["appsflyer.com","adrevenue.appsflyer.com","api.appsflyer.com","api2.appsflyer.com","app.appsflyer.com","attr.appsflyer.com","banner.appsflyer.com","cdn.appsflyer.com","cdnappicons.appsflyer.com","conversions.appsflyer.com","dlsdk.appsflyer.com","events.appsflyer.com","fvalid.appsflyer.com","gcd-s2s.appsflyer.com","gcdsdk.appsflyer.com","hq1.appsflyer.com","impression.appsflyer.com","inapps.appsflyer.com","launches.appsflyer.com","onelink.appsflyer.com","register.appsflyer.com","sdk.appsflyer.com","sdk-services.appsflyer.com","stats.appsflyer.com","t.appsflyer.com","track.appsflyer.com","validate.appsflyer.com","wa.appsflyer.com","websdk.appsflyer.com"],"name":"AppsFlyer","exodusId":12,"link":"https://reports.exodus-privacy.eu.org/trackers/12"},{"id":"exodus_119","hostnames":["alog.umeng.com","alogs.umeng.com","ar.umeng.com","oc.umeng.com","umeng.com","uop.umeng.com","alog-default.umeng.com","alogsus.umeng.com","alogus.umeng.com","at.umeng.com","au.umeng.com","errlog.umeng.com","ocx.umeng.com","ouplog.umeng.com","plbslog.umeng.com","sec.umeng.com","ulogs.umeng.com"],"name":"Umeng Analytics","exodusId":119,"link":"https://reports.exodus-privacy.eu.org/trackers/119"},{"id":"exodus_118","hostnames":["api.mixpanel.com","decide.mixpanel.com","mixpanel.com","switchboard.mixpanel.com","api-js.mixpanel.com","mxpnl.com","cdn.mxpnl.com","cdn4.mxpnl.com","images.mxpnl.com"],"name":"MixPanel","exodusId":118,"link":"https://reports.exodus-privacy.eu.org/trackers/118"},{"id":"exodus_115","hostnames":["api.apptentive.com"],"name":"Apptentive","exodusId":115,"link":"https://reports.exodus-privacy.eu.org/trackers/115"},{"id":"exodus_111","hostnames":["devices.carnivalmobile.com"],"name":"Carnival","exodusId":111,"link":"https://reports.exodus-privacy.eu.org/trackers/111"},{"id":"exodus_110","hostnames":["click-haproxy.supersonicads.com","cx.ssacdn.com","init.supersonicads.com","logs.supersonic.com","outcome.supersonicads.com","ow-gateway.supersonicads.com","pixel-tracking.sonic-us.supersonicads.com","rv-gateway.supersonicads.com","static.ssacdn.com","supersonicads-a.akamaihd.net","tag-mediation.supersonic.com","ua.supersonicads.com","v.ssacdn.com","www.supersonicads.com"],"name":"Supersonic Ads","exodusId":110,"link":"https://reports.exodus-privacy.eu.org/trackers/110"},{"id":"exodus_11","hostnames":["outbrain.com","images.outbrainimg.com","log.outbrainimg.com","tcheck.outbrainimg.com","zem.outbrainimg.com","amplify.outbrain.com","amplify-imp.outbrain.com","amplifypixel.outbrain.com","chi.outbrain.com","eventlog.outbrain.com","hpr.outbrain.com","images.outbrain.com","libs.outbrain.com","log.outbrain.com","mcdp-chidc2.outbrain.com","mcdp-nydc1.outbrain.com","mcdp-sadc1.outbrain.com","mv.outbrain.com","ny.outbrain.com","odb.outbrain.com","revee.outbrain.com","sa.outbrain.com","stas.outbrain.com","sync.outbrain.com","vastcdn.outbrain.com","videoclientsservicescalls.outbrain.com","videoevents.outbrain.com","vrt.outbrain.com","widget-pixels.outbrain.com","widgetmonitor.outbrain.com","widgets.outbrain.com","alldcs.outbrain.com","paid.outbrain.com","tr.outbrain.com","traffic.outbrain.com","www.outbrain.com"],"name":"Outbrain","exodusId":11,"link":"https://reports.exodus-privacy.eu.org/trackers/11"},{"id":"exodus_109","hostnames":["appengage-video.sponsorpay.com","cdn1.sponsorpay.com","cdn2.sponsorpay.com","cdn3.sponsorpay.com","cdn4.sponsorpay.com","engine.sponsorpay.com"],"name":"Fyber SponsorPay","exodusId":109,"link":"https://reports.exodus-privacy.eu.org/trackers/109"},{"id":"exodus_107","hostnames":["adtech.de","contextual.media.net","media.net","adserver.adtech.de","aka-cdn.adtech.de","aka-cdn-ns.adtech.de","be.durationmedia.net","tag.durationmedia.net","gplayer.kmpmedia.net","update.kmpmedia.net","adservetx.media.net","adservex.media.net","amprtc.media.net","cs.media.net","forbes.media.net","hblg.media.net","hbx.media.net","lg3.media.net","mycdn.media.net","prebid.media.net","qsearch.media.net","recommends.media.net","res.media.net","static.media.net","warp.media.net","whitelabel.media.net","adtechus.com","ad.dc2.adtech.de","im.adtech.de","secserv.adtech.de","abd.media.net","cdnaimg-ra.media.net","search.media.net","filter.adsparkmedia.net","ias.avidmedia.net","xml.adsparkmedia.net","best4kmedia.net","traversemedia.net","www.best4kmedia.net","www.traversemedia.net","openx.camelmedia.net","stats.infomedia.net","cdn.interactivemedia.net","cdn.total-media.net","w00tpublishers.wootmedia.net","cdn.adsrvmedia.net","tag.adtrendmedia.net","a.cdn.intentmedia.net","ads.empoweringmedia.net","adtrack.cimedia.net","realaudio.cimedia.net","pb-logs.media.net","pixel.bilinmedia.net","rightmedia.net","www.rightmedia.net","a.total-media.net","ads.adsrvmedia.net","ads.networldmedia.net","edog2017.karyamedia.net","i.total-media.net","trekmedia.net","bannieres.wdmedia.net","a.adtechus.com","adserver.adtechus.com","adserverwc.adtechus.com","aka-cdn.adtechus.com","aka-cdn-ns.adtechus.com","ums.adtechus.com","glb.adtechus.com","www.adtechus.com"],"name":"ADTECH","exodusId":107,"link":"https://reports.exodus-privacy.eu.org/trackers/107"},{"id":"exodus_106","hostnames":["c.w.inmobi.com","china.inmobi.com","config-ltvp.inmobi.com","config.inmobi.com","et.w.inmobi.com","i.l.inmobicdn.net","i.w.inmobi.com","inmobi.cn","inmobi.com","inmobicdn.net","inmobisdk-a.akamaihd.net","japan.inmobi.com","r.w.inmobi.com","sdkm.w.inmobi.com","sdktm.w.inmobi.com","w.inmobi.com","api.w.inmobi.com","sdk.inmobi.cn","telemetry.sdk.inmobi.cn","w.inmobi.cn","sdkm.w.inmobi.cn","ads.inmobi.com","appgwv2.inmobi.com","eastus-ssp.appgwv2.inmobi.com","config.eastus-ssp.appgwv2.inmobi.com","vastproxy.brand.inmobi.com","de.inmobi.com","b.de.inmobi.com","e.de.inmobi.com","ic.de.inmobi.com","glance.inmobi.com","analytics.glance.inmobi.com","id.analytics.glance.inmobi.com","in.analytics.glance.inmobi.com","api.glance.inmobi.com","id.api.glance.inmobi.com","in.api.glance.inmobi.com","glance-internal.inmobi.com","analytics-prod2.glance-internal.inmobi.com","content-prod3.glance-internal.inmobi.com","s.iff.inmobi.com","dspbeacons.error.ihasdsp.inmobi.com","imces.inmobi.com","mcg-ads.inmobi.com","pulse.inmobi.com","carpet.pulse.inmobi.com","sdk.inmobi.com","telemetry.sdk.inmobi.com","ssp-prod-telemerty-eastus-appgwv2.inmobi.com","trafficmanager.inmobi.com","eastus.trafficmanager.inmobi.com","nonmutt.eastus.trafficmanager.inmobi.com","w.eastus.trafficmanager.inmobi.com","et.w.eastus.trafficmanager.inmobi.com","sgp.trafficmanager.inmobi.com","au.w.inmobi.com","c-eus.w.inmobi.com","et-eus.w.inmobi.com","vast.w.inmobi.com","l.inmobicdn.net","i.l-dsp.inmobicdn.net","supply.inmobicdn.net","et-l.w.inmobi.com","nonmutt.sgp.trafficmanager.inmobi.com","imces.dfw1.vip.inmobi.com","js.w.inmobi.com","cf.cdn.inmobi.com","go.inmobi.com","r.edge.inmobicdn.com","i.l-new.inmobicdn.net","glance.l.inmobicdn.net"],"name":"Inmobi","exodusId":106,"link":"https://reports.exodus-privacy.eu.org/trackers/106"},{"id":"exodus_105","hostnames":["www.googletagmanager.com","www.googletagservices.com","www-googletagmanager.l.google.com"],"name":"Google Tag Manager","exodusId":105,"link":"https://reports.exodus-privacy.eu.org/trackers/105"},{"id":"exodus_102","hostnames":[".*.estimote.com"],"name":"Estimote","exodusId":102,"link":"https://reports.exodus-privacy.eu.org/trackers/102"},{"id":"exodus_1","hostnames":["databerries.com"],"name":"Teemo","exodusId":1,"link":"https://reports.exodus-privacy.eu.org/trackers/1"},{"id":"adaway_zynga.com","name":"zynga.com","hostnames":["log-collector.svctr.zynga.com"]},{"id":"adaway_zucks.net","name":"zucks.net","hostnames":["zucks.net","k.zucks.net","sh.zucks.net"]},{"id":"adaway_ztgame.com","name":"ztgame.com","hostnames":["beacon.ztgame.com"]},{"id":"adaway_zkcdn.net","name":"zkcdn.net","hostnames":["s.zkcdn.net"]},{"id":"adaway_ziftsolutions.com","name":"Zift Solutions","hostnames":["analytics.ziftsolutions.com","static.ziftsolutions.com"],"link":"https://www.ghostery.com/whotracksme/trackers/zift_solutions"},{"id":"adaway_ziffdavis.com","name":"Ziff Davis","hostnames":["ziffdavis.com","static.ziffdavis.com","zdbb.net","geo.ziffdavis.com","gurgle.zdbb.net","ns.zdbb.net","a.zdbb.net","jogger.zdbb.net","static.zdbb.net","analytics.zdbb.net","cdn.static.zdbb.net"],"link":"https://www.ghostery.com/whotracksme/trackers/ziff_davis"},{"id":"adaway_zhugeio.com","name":"zhugeio.com","hostnames":["zgsdk.zhugeio.com"]},{"id":"adaway_zg-api.com","name":"zg-api.com","hostnames":["analytics.zg-api.com","e.zg-api.com"]},{"id":"adaway_zeustechnology.com","name":"zeustechnology.com","hostnames":["audience.zeustechnology.com"]},{"id":"adaway_zeronaught.com","name":"zeronaught.com","hostnames":["content.zeronaught.com","us.dev.zeronaught.com"]},{"id":"adaway_zergnet.com","name":"zergnet.com","hostnames":["www.zergnet.com"]},{"id":"adaway_zeptolab.com","name":"zeptolab.com","hostnames":["bms.zeptolab.com"]},{"id":"adaway_zeotap.com","name":"zeotap.com","hostnames":["mwzeom.zeotap.com","spl.zeotap.com"]},{"id":"adaway_zenmxapps.com","name":"zenmxapps.com","hostnames":["mxvp-feature-toggle-prod-1.zenmxapps.com","tracking-server-prod-1.zenmxapps.com"]},{"id":"adaway_zendesk.com","name":"zendesk.com","hostnames":["analytics.zendesk.com"]},{"id":"adaway_zemanta.com","name":"zemanta.com","hostnames":["b1-chidc2.zemanta.com","b1-nydc1.zemanta.com","b1sync.zemanta.com","b1t-chidc2.zemanta.com","b1t-nydc1.zemanta.com","images2.zemanta.com","widgets.zemanta.com"]},{"id":"adaway_zdn.vn","name":"zdn.vn","hostnames":["zplayer-trk.zdn.vn"]},{"id":"adaway_zcoup.com","name":"zcoup.com","hostnames":["zcoup.com","api.zcoup.com"]},{"id":"adaway_zarget.com","name":"zarget.com","hostnames":["zarget.com","cdn.zarget.com","www.zarget.com"]},{"id":"adaway_zapps.vn","name":"zapps.vn","hostnames":["zplayer.trk.zapps.vn"]},{"id":"adaway_zaloapp.com","name":"zaloapp.com","hostnames":["log.api.zaloapp.com","events.zaloapp.com","ztevents.zaloapp.com"]},{"id":"adaway_zadn.vn","name":"zadn.vn","hostnames":["adtima-static.zadn.vn","sdk.zadn.vn","api.sdk.zadn.vn","log.sdk.zadn.vn"]},{"id":"adaway_yyapi.net","name":"yyapi.net","hostnames":["global.yyapi.net","t.global.yyapi.net"]},{"id":"adaway_youtube.com","name":"youtube.com","hostnames":["ads.youtube.com"]},{"id":"adaway_youradexchange.com","name":"youradexchange.com","hostnames":["youradexchange.com","c11370896.c.youradexchange.com","c2366475.c.youradexchange.com","c35000246.c.youradexchange.com"]},{"id":"adaway_youmi.net","name":"youmi.net","hostnames":["youmi.net","s.youmi.net","static.youmi.net"]},{"id":"adaway_youdao.com","name":"youdao.com","hostnames":["dsp.youdao.com"]},{"id":"adaway_youborafds01.com","name":"youborafds01.com","hostnames":["youborafds01.com","a-fds.youborafds01.com"]},{"id":"adaway_youappi.com","name":"youappi.com","hostnames":["sdk.youappi.com"]},{"id":"adaway_yomedia.vn","name":"Yomedia","hostnames":["yomedia.vn","analytics.yomedia.vn","delivery.yomedia.vn","ss.yomedia.vn","tracking.yomedia.vn","demo.yomedia.vn","dmp-log.yomedia.vn","media.yomedia.vn","sslstatic.yomedia.vn","static.yomedia.vn"],"link":"https://www.ghostery.com/whotracksme/trackers/yomedia"},{"id":"adaway_yolanda.hk","name":"yolanda.hk","hostnames":["sdk.yolanda.hk"]},{"id":"adaway_yolacdn.net","name":"yolacdn.net","hostnames":["analytics.yolacdn.net"]},{"id":"adaway_yodo1api.com","name":"yodo1api.com","hostnames":["olc.yodo1api.com","payment.yodo1api.com","rodeoconfig.yodo1api.com","sensors.yodo1api.com","uc-ap.yodo1api.com"]},{"id":"adaway_yinzcam.com","name":"yinzcam.com","hostnames":["analytics-chi-nfl.yinzcam.com","analytics-phi-nfl.yinzcam.com","analytics-pit-nfl.yinzcam.com"]},{"id":"adaway_yieldify-production.com","name":"yieldify-production.com","hostnames":["assets-v2.yieldify-production.com","gateway.yieldify-production.com","nightswatch-go-collector-y2.yieldify-production.com"]},{"id":"adaway_yicha.jp","name":"yicha.jp","hostnames":["yicha.jp","adone.yicha.jp","adpimg.yicha.jp","advisionapp.yicha.jp","advisionclick.yicha.jp","advisionsort.yicha.jp","advisionweb.yicha.jp","advisionwebp.yicha.jp","advpic.yicha.jp","advtrack.yicha.jp","s1.yicha.jp"]},{"id":"adaway_yeshen.com","name":"yeshen.com","hostnames":["bi.yeshen.com"]},{"id":"adaway_yemonisoni.com","name":"yemonisoni.com","hostnames":["yemonisoni.com"]},{"id":"adaway_yandexadexchange.net","name":"Yandex AdExchange","hostnames":["yandexadexchange.net","mobile.yandexadexchange.net"],"link":"https://www.ghostery.com/whotracksme/trackers/yandex_adexchange"},{"id":"adaway_yadro.ru","name":"yadro.ru","hostnames":["counter.yadro.ru"]},{"id":"adaway_xtify.com","name":"xtify.com","hostnames":["sdk8.ibm.xtify.com"]},{"id":"adaway_ximalaya.com","name":"ximalaya.com","hostnames":["xdcs-collector.ximalaya.com"]},{"id":"adaway_ximad.com","name":"ximad.com","hostnames":["ximad.com","mjp-analytics.ximad.com","opt.ximad.com"]},{"id":"adaway_xiaomi.com","name":"xiaomi.com","hostnames":["api.ad.xiaomi.com","log.ad.xiaomi.com","sdkconfig.ad.xiaomi.com","track.ad.xiaomi.com","zeus.ad.xiaomi.com","sdkconfig.ad.india.xiaomi.com","api.ad.intl.xiaomi.com","diagnosis.ad.intl.xiaomi.com","sdkconfig.ad.intl.xiaomi.com","zeus.ad.intl.xiaomi.com","globalapi.ad.xiaomi.com"]},{"id":"adaway_xdrig.com","name":"xdrig.com","hostnames":["xdrig.com","adt.xdrig.com","conf.xdrig.com","ga.xdrig.com","gv1.xdrig.com","me.xdrig.com","pg.xdrig.com"]},{"id":"adaway_xcal.tv","name":"xcal.tv","hostnames":["metricscollector.lp.xcal.tv","api.player.xcal.tv"]},{"id":"adaway_xad.com","name":"GroundTruth","hostnames":["xad.com","bidagent.xad.com","us-notify.bidagent.xad.com","cf.xad.com","display.xad.com","ap-notify.bidagent.xad.com"],"link":"https://www.ghostery.com/whotracksme/trackers/groundtruth"},{"id":"adaway_wsod.com","name":"Wall Street on Demand","hostnames":["wsod.com","ad.wsod.com","admedia.wsod.com"],"link":"https://www.ghostery.com/whotracksme/trackers/wall_street_on_demand"},{"id":"adaway_wrating.com","name":"Dratio","hostnames":["wrating.com"],"link":"https://www.ghostery.com/whotracksme/trackers/dratio"},{"id":"adaway_wpdigital.net","name":"wpdigital.net","hostnames":["usersegment.wpdigital.net"]},{"id":"adaway_worldnow.com","name":"worldnow.com","hostnames":["content.worldnow.com","ftpcontent.worldnow.com","kake.images.worldnow.com"]},{"id":"adaway_wonderpush.com","name":"wonderpush.com","hostnames":["api.wonderpush.com"]},{"id":"adaway_wmcdp.io","name":"wmcdp.io","hostnames":["identity.api.wmcdp.io","logs.psm.wmcdp.io"]},{"id":"adaway_wknd.ai","name":"wknd.ai","hostnames":["tag.wknd.ai"]},{"id":"adaway_wirelessregistry.com","name":"wirelessregistry.com","hostnames":["pie.wirelessregistry.com"]},{"id":"adaway_winudf.com","name":"winudf.com","hostnames":["tracker.winudf.com"]},{"id":"adaway_wildtangent.com","name":"wildtangent.com","hostnames":["analytics.wildtangent.com","mobile.analytics.wildtangent.com"]},{"id":"adaway_wigetmedia.com","name":"Wiget Media","hostnames":["wigetmedia.com","www.wigetmedia.com"],"link":"https://www.ghostery.com/whotracksme/trackers/wiget_media"},{"id":"adaway_wickedreports.com","name":"wickedreports.com","hostnames":["widget.wickedreports.com"]},{"id":"adaway_wesdk.co","name":"wesdk.co","hostnames":["track.wesdk.co"]},{"id":"adaway_weplayer.cc","name":"weplayer.cc","hostnames":["ad.weplayer.cc","crosspromotion.weplayer.cc"]},{"id":"adaway_wecloud.io","name":"wecloud.io","hostnames":["goload.wecloud.io"]},{"id":"adaway_webtracker.jp","name":"webtracker.jp","hostnames":["webtracker.jp","a.t.webtracker.jp","ssl.webtracker.jp"]},{"id":"adaway_webengage.com","name":"webengage.com","hostnames":["afiles.webengage.com","api.webengage.com","c.webengage.com","msdk-files.webengage.com","notification.webengage.com","p.webengage.com","wsdk-files.webengage.com"]},{"id":"adaway_webcontentassessor.com","name":"webcontentassessor.com","hostnames":["scripts.webcontentassessor.com"]},{"id":"adaway_webads.eu","name":"webads.eu","hostnames":["analytics.webads.eu"]},{"id":"adaway_weatherbug.net","name":"weatherbug.net","hostnames":["and-ads.pulse.weatherbug.net","ios-ads.pulse.weatherbug.net"]},{"id":"adaway_we-stats.com","name":"we-stats.com","hostnames":["bcdn-god.we-stats.com","cfr.us.v2.we-stats.com","log-dbff2e04.us.v2.we-stats.com"]},{"id":"adaway_wdacashtrk.com","name":"wdacashtrk.com","hostnames":["trk.wdacashtrk.com"]},{"id":"adaway_waze.com","name":"waze.com","hostnames":["ads-resources.waze.com","ads-resources-legacy.waze.com","adsassets.waze.com"]},{"id":"adaway_wayfair.com","name":"wayfair.com","hostnames":["t.wayfair.com"]},{"id":"adaway_waust.at","name":"waust.at","hostnames":["waust.at","www.waust.at"]},{"id":"adaway_wattpad.com","name":"wattpad.com","hostnames":["track.wattpad.com"]},{"id":"adaway_watchingthat.net","name":"watchingthat.net","hostnames":["cdn.watchingthat.net"]},{"id":"adaway_walmart.com","name":"walmart.com","hostnames":["drfdisvc.walmart.com","analytics.mobile.walmart.com"]},{"id":"adaway_walgreens.com","name":"walgreens.com","hostnames":["smetrics.walgreens.com"]},{"id":"adaway_wafour.com","name":"wafour.com","hostnames":["ads.wafour.com"]},{"id":"adaway_vzw.com","name":"vzw.com","hostnames":["engage.vzw.com"]},{"id":"adaway_vungle.com","name":"vungle.com","hostnames":["vungle.com","eks-prod-1b.vungle.com","kourier-tpat.eks-prod-1b.vungle.com","eks-prod-1c.vungle.com","kourier-tpat.eks-prod-1c.vungle.com"]},{"id":"adaway_vrtzads.com","name":"vrtzads.com","hostnames":["cookie.vrtzads.com"]},{"id":"adaway_vrtcal.com","name":"vrtcal.com","hostnames":["adplatform.vrtcal.com"]},{"id":"adaway_vpon.com","name":"vpon.com","hostnames":["bts.vpon.com","m.vpon.com","tw-api.vpon.com"]},{"id":"adaway_vpadn.com","name":"vpadn.com","hostnames":["dailymotion-cs.vpadn.com","ids-dmp.vpadn.com","m.vpadn.com","tw-api.vpadn.com"]},{"id":"adaway_voxmedia.com","name":"voxmedia.com","hostnames":["phonograph2.voxmedia.com"]},{"id":"adaway_vox-cdn.com","name":"vox-cdn.com","hostnames":["concertads-configs.vox-cdn.com"]},{"id":"adaway_voodoo.io","name":"voodoo.io","hostnames":["crosspromo.voodoo.io"]},{"id":"adaway_voodoo-tech.io","name":"voodoo-tech.io","hostnames":["api-gdpr.voodoo-tech.io"]},{"id":"adaway_voodoo-ads.io","name":"voodoo-ads.io","hostnames":["addelivery-engine-api.voodoo-ads.io","front-logs.voodoo-ads.io","splash-screen.voodoo-ads.io"]},{"id":"adaway_voiceads.cn","name":"voiceads.cn","hostnames":["api.voiceads.cn","imp.voiceads.cn","bj.imp.voiceads.cn"]},{"id":"adaway_vodafone.com","name":"vodafone.com","hostnames":["mplusps.ims.vodafone.com","mpluswf.ims.vodafone.com"]},{"id":"adaway_vntsm.com","name":"Venatus Media","hostnames":["vntsm.com","cdn1.vntsm.com","hb.vntsm.com","ads.vntsm.com"],"link":"https://www.ghostery.com/whotracksme/trackers/vntsm.com"},{"id":"adaway_vnet.cn","name":"vnet.cn","hostnames":["vnet.cn","zzhc.vnet.cn"]},{"id":"adaway_vmweb.net","name":"vmweb.net","hostnames":["vmweb.net","lib.vmweb.net","sync.vmweb.net"]},{"id":"adaway_vm5apis.com","name":"vm5apis.com","hostnames":["vm5apis.com"]},{"id":"adaway_vivoglobal.com","name":"vivoglobal.com","hostnames":["asia-analyzer-appstore.vivoglobal.com","asia-comonrt-stsdk.vivoglobal.com","asia-comort-stsdk.vivoglobal.com","asia-ex-adlog.vivoglobal.com","asia-exstsdk.vivoglobal.com","asia-monitor-stsdk.vivoglobal.com","asia-onrt-stsdk.vivoglobal.com","asia-ort-stsdk.vivoglobal.com","asia-pnrt-stsdk.vivoglobal.com","asia-prt-stsdk.vivoglobal.com","asia-stsdk.vivoglobal.com","onrt-stsdk.vivoglobal.com","stsdk.vivoglobal.com","onrt.stsdk.vivoglobal.com","tr-romsp-unifyconfig.vivoglobal.com","tr-st-sl.vivoglobal.com","tr-vcode-od.vivoglobal.com","prt.stsdk.vivoglobal.com"]},{"id":"adaway_vindicosuite.com","name":"Vindico Group","hostnames":["vindicosuite.com","addirector.vindicosuite.com","web.vindicosuite.com","mpp.vindicosuite.com","tracking.vindicosuite.com"],"link":"https://www.ghostery.com/whotracksme/trackers/vindico_group"},{"id":"adaway_viewdeos.com","name":"viewdeos.com","hostnames":["cdn.viewdeos.com","go1.viewdeos.com","sync.viewdeos.com","sync.sync.viewdeos.com","tags.viewdeos.com","track.viewdeos.com"]},{"id":"adaway_vidverto.io","name":"vidverto.io","hostnames":["ad.vidverto.io"]},{"id":"adaway_vidora.com","name":"vidora.com","hostnames":["vidora.com","a.vidora.com","api.vidora.com","assets.vidora.com","cortex.vidora.com"]},{"id":"adaway_videosecrets.com","name":"videosecrets.com","hostnames":["banners.videosecrets.com"]},{"id":"adaway_videoplayerhub.com","name":"videoplayerhub.com","hostnames":["kinja-com.videoplayerhub.com","pmc-com.videoplayerhub.com"]},{"id":"adaway_videohub.tv","name":"videohub.tv","hostnames":["videohub.tv","ads-secure.videohub.tv","adserver.videohub.tv","dt-secure.videohub.tv","l0-secure.videohub.tv","tp.videohub.tv","ads.videohub.tv"]},{"id":"adaway_videoamp.com","name":"videoamp.com","hostnames":["videoamp.com","b.videoamp.com","u.videoamp.com","b3.videoamp.com"]},{"id":"adaway_vice.com","name":"vice.com","hostnames":["sourcepoint.vice.com"]},{"id":"adaway_viber.com","name":"viber.com","hostnames":["ads-d.viber.com"]},{"id":"adaway_viantsuite.com","name":"viantsuite.com","hostnames":["sdk.viantsuite.com"]},{"id":"adaway_viacom.tech","name":"viacom.tech","hostnames":["events-collector-api.viacom.tech"]},{"id":"adaway_vi-serve.com","name":"vi-serve.com","hostnames":["vi-serve.com","nv.vi-serve.com","s.vi-serve.com","t.vi-serve.com","vis.vi-serve.com"]},{"id":"adaway_vervemobile.com","name":"vervemobile.com","hostnames":["vervemobile.com"]},{"id":"adaway_vertamedia.com","name":"vertamedia.com","hostnames":["a.vertamedia.com","ads12.vertamedia.com","ads24.vertamedia.com","ads36.vertamedia.com","s.vertamedia.com","sync.vertamedia.com"]},{"id":"adaway_verizonwireless.com","name":"verizonwireless.com","hostnames":["sanalytics.verizonwireless.com"]},{"id":"adaway_verizon.com","name":"verizon.com","hostnames":["sanalytics.verizon.com"]},{"id":"adaway_vendimob.pl","name":"vendimob.pl","hostnames":["vendimob.pl"]},{"id":"adaway_vendemore.com","name":"vendemore.com","hostnames":["analytics.vendemore.com"]},{"id":"adaway_vdopia.com","name":"Vdopia","hostnames":["vdopia.com","cs.vdopia.com","cdn.vdopia.com"],"link":"https://www.ghostery.com/whotracksme/trackers/vdopia"},{"id":"adaway_vcommission.com","name":"vCommission","hostnames":["tracking.vcommission.com"],"link":"https://www.ghostery.com/whotracksme/trackers/vcommission"},{"id":"adaway_vamaker.com","name":"vamaker.com","hostnames":["vamaker.com"]},{"id":"adaway_vaicore.xyz","name":"vaicore.xyz","hostnames":["vaicore.xyz","co.vaicore.xyz","int.vaicore.xyz"]},{"id":"adaway_vaicore.store","name":"vaicore.store","hostnames":["int.vaicore.store"]},{"id":"adaway_vaicore.site","name":"vaicore.site","hostnames":["co.vaicore.site","int.vaicore.site"]},{"id":"adaway_v-mate.mobi","name":"v-mate.mobi","hostnames":["log.apk.v-mate.mobi"]},{"id":"adaway_utarget.ru","name":"uTarget","hostnames":["utarget.ru","tag.rutarget.ru"],"link":"https://www.ghostery.com/whotracksme/trackers/utarget"},{"id":"adaway_userzoom.com","name":"userzoom.com","hostnames":["cdn4.userzoom.com","cdn5.userzoom.com"]},{"id":"adaway_userleap.com","name":"userleap.com","hostnames":["api.userleap.com"]},{"id":"adaway_usbla.net","name":"usbla.net","hostnames":["out.usbla.net","sdk.out.usbla.net"]},{"id":"adaway_usabilla.com","name":"usabilla.com","hostnames":["api.usabilla.com","w.usabilla.com"]},{"id":"adaway_upush.co","name":"upush.co","hostnames":["sdk.upush.co"]},{"id":"adaway_upsnap.com","name":"upsnap.com","hostnames":["upsnap.com"]},{"id":"adaway_upsight-api.com","name":"upsight-api.com","hostnames":["upsight-api.com","batch.upsight-api.com","bootstrap.upsight-api.com","marketing-ssl.upsight-api.com","single.upsight-api.com"]},{"id":"adaway_uprivaladserver.net","name":"uprivaladserver.net","hostnames":["api.uprivaladserver.net","cdn.uprivaladserver.net"]},{"id":"adaway_upqzfile.com","name":"upqzfile.com","hostnames":["mobilelog.upqzfile.com","v6.mobilelog.upqzfile.com","other.upqzfile.com","video.upqzfile.com"]},{"id":"adaway_upalytics.com","name":"upalytics.com","hostnames":["upalytics.com"]},{"id":"adaway_uodoo.com","name":"uodoo.com","hostnames":["event.allnews.uodoo.com"]},{"id":"adaway_unity3d.com","name":"unity3d.com","hostnames":["cdp.cloud.unity3d.com","perf-events.cloud.unity3d.com","data-optout-service.uca.cloud.unity3d.com","userreporting.cloud.unity3d.com","ads.prd.ie.internal.unity3d.com","publisher-event.ads.prd.ie.internal.unity3d.com","ads-privacy-api.prd.mz.internal.unity3d.com","unityads.unity3d.com","adsx.unityads.unity3d.com","auction-banner.unityads.unity3d.com","auction-load.unityads.unity3d.com","configv2.unityads.unity3d.com","httpkafka.unityads.unity3d.com","publisher-event.unityads.unity3d.com","thind.unityads.unity3d.com","ads-brand-postback.unityads.unity3d.com","auiopt.unityads.unity3d.com","cdn-creatives-highwinds-prd.unityads.unity3d.com","cdn-webview-pge.unityads.unity3d.com","dsp-tracking.unityads.unity3d.com","dsp-vast.unityads.unity3d.com","pge.unityads.unity3d.com","admediator.unityads.unity3d.com"]},{"id":"adaway_unionstatistics.com","name":"unionstatistics.com","hostnames":["sa.unionstatistics.com"]},{"id":"adaway_unimhk.com","name":"unimhk.com","hostnames":["unimhk.com"]},{"id":"adaway_uniconsent.com","name":"uniconsent.com","hostnames":["cmp.uniconsent.com","edge.uniconsent.com"]},{"id":"adaway_under9.co","name":"under9.co","hostnames":["rlog-api.under9.co"]},{"id":"adaway_umtrack.com","name":"umtrack.com","hostnames":["umtrack.com","at.umtrack.com","log.umtrack.com"]},{"id":"adaway_umsns.com","name":"umsns.com","hostnames":["log.umsns.com","stats.umsns.com"]},{"id":"adaway_umengcloud.com","name":"umengcloud.com","hostnames":["umengcloud.com","alog.umengcloud.com","alogs.umengcloud.com","msg.umengcloud.com","ulogs.umengcloud.com","upoll.umengcloud.com","utop.umengcloud.com"]},{"id":"adaway_umeng.co","name":"umeng.co","hostnames":["umeng.co","alog.umeng.co","au.umeng.co","oc.umeng.co"]},{"id":"adaway_umbel.com","name":"Umbel","hostnames":["umbel.com","api.umbel.com","tags.api.umbel.com"],"link":"https://www.ghostery.com/whotracksme/trackers/umbel"},{"id":"adaway_ulta.com","name":"ulta.com","hostnames":["sweb.ulta.com"]},{"id":"adaway_uimserv.net","name":"United Internet Media GmbH","hostnames":["uimserv.net","pixelbox.uimserv.net","adclient.uimserv.net","adimg.uimserv.net","madclient.uimserv.net","uidbox.uimserv.net","advideo.uimserv.net","uim.tifbs.net"],"link":"https://www.ghostery.com/whotracksme/trackers/united_internet_media_gmbh"},{"id":"adaway_ucweb.com","name":"ucweb.com","hostnames":["adtrack.ucweb.com","gjtrack.ucweb.com","insight.ucweb.com","adn.insight.ucweb.com","logserver.insight.ucweb.com","sdkupgrade.insight.ucweb.com","puds.ucweb.com","uc.ucweb.com","click.union.ucweb.com"]},{"id":"adaway_uc.cn","name":"uc.cn","hostnames":["applog.uc.cn","gj.applog.uc.cn","applogios.uc.cn","gjapplog.uc.cn","mparticle.uc.cn","track.uc.cn","gj.track.uc.cn","woodpecker.uc.cn"]},{"id":"adaway_ubimo.com","name":"ubimo.com","hostnames":["reports.ubimo.com"]},{"id":"adaway_uberinternal.com","name":"uberinternal.com","hostnames":["local-analytics.uberinternal.com"]},{"id":"adaway_uberads.com","name":"uberads.com","hostnames":["uberads.com","ads.uberads.com","serve.uberads.com","serve-prod1204.uberads.com"]},{"id":"adaway_ua.com","name":"ua.com","hostnames":["lightstep-collector.api.ua.com"]},{"id":"adaway_twilio.com","name":"twilio.com","hostnames":["sdkgw.us1.twilio.com"]},{"id":"adaway_tvsquared.com","name":"TVSquared","hostnames":["tvsquared.com","collector-12255.tvsquared.com","collector-6651.tvsquared.com","collector-9306.us.tvsquared.com","collectoru.us.tvsquared.com","collector-1054.tvsquared.com","collector-195.tvsquared.com","collector-2398.tvsquared.com","collector-184.tvsquared.com","collector-428.tvsquared.com"],"link":"https://www.ghostery.com/whotracksme/trackers/tvsquared.com"},{"id":"adaway_tvpixel.com","name":"LiveRamp","hostnames":["tvpixel.com","c.tvpixel.com","p.tvpixel.com","pippio.com","rlcdn.com","api.rlcdn.com","ats.rlcdn.com","cdn.rlcdn.com","di.rlcdn.com","ei.rlcdn.com","geo.rlcdn.com","id.rlcdn.com","idsync.rlcdn.com","rc-ext-geo.rlcdn.com","so.rlcdn.com","sr-weight.rlcdn.com","tv.rlcdn.com","sr.rlcdn.com","rc.rlcdn.com"],"link":"https://www.ghostery.com/whotracksme/trackers/liveramp"},{"id":"adaway_tvadsync.com","name":"tvadsync.com","hostnames":["px.tvadsync.com"]},{"id":"adaway_tutoads.tv","name":"tutoads.tv","hostnames":["tutoads.tv","cdn.tutoads.tv","get.tutoads.tv","tracy.tutoads.tv"]},{"id":"adaway_turn.com","name":"Turn Inc.","hostnames":["turn.com","ad.turn.com","cdns.turn.com","ad2.cdns.turn.com","d.turn.com","img.turn.com","presentation-ams1.turn.com","presentation-hkg1.turn.com","r.turn.com","img.cdns.turn.com","amazon-ca-return.com","credituturn.com","manage.credituturn.com","whosturn.com","www.amazon-ca-return.com","www.credituturn.com","www.manage.credituturn.com","www.whosturn.com","resources.eyereturn.com","presentation-atl1.turn.com","ad2.turn.com","cdn.turn.com","cm.eyereturn.com","bb.o2.eyereturn.com","eyereact.eyereturn.com","o2.eyereturn.com","voken.eyereturn.com","www.turn.com"],"link":"https://www.ghostery.com/whotracksme/trackers/turn_inc."},{"id":"adaway_tune.com","name":"tune.com","hostnames":["ma.tune.com","analytics.ma.tune.com"]},{"id":"adaway_tubi.io","name":"tubi.io","hostnames":["analytics-ingestion.production-public.tubi.io"]},{"id":"adaway_tuanguwen.com","name":"tuanguwen.com","hostnames":["ad-mediation.tuanguwen.com"]},{"id":"adaway_ttpsdk.info","name":"ttpsdk.info","hostnames":["gateway.ttpsdk.info","promo-images.ttpsdk.info","ttplugins.ttpsdk.info"]},{"id":"adaway_trustx.org","name":"trustx.org","hostnames":["sofia.trustx.org"]},{"id":"adaway_truste.com","name":"truste.com","hostnames":["choices.truste.com","preferences.truste.com","privacy-policy.truste.com"]},{"id":"adaway_trustarc.com","name":"trustarc.com","hostnames":["choices.trustarc.com"]},{"id":"adaway_truoptik.com","name":"Tru Optik","hostnames":["truoptik.com","dmp.truoptik.com"],"link":"https://www.ghostery.com/whotracksme/trackers/truoptik"},{"id":"adaway_trueleadid.com","name":"trueleadid.com","hostnames":["deviceid.trueleadid.com"]},{"id":"adaway_truecaller.com","name":"truecaller.com","hostnames":["ads-router-noneu.truecaller.com","ads5-noneu.truecaller.com","pushid-noneu.truecaller.com"]},{"id":"adaway_tru.am","name":"True Anthem","hostnames":["tru.am","beacon.tru.am"],"link":"https://www.ghostery.com/whotracksme/trackers/trueanthem"},{"id":"adaway_trinitymedia.ai","name":"trinitymedia.ai","hostnames":["depart.trinitymedia.ai"]},{"id":"adaway_tresensa.com","name":"tresensa.com","hostnames":["analytics.tresensa.com"]},{"id":"adaway_tremormedia.com","name":"tremormedia.com","hostnames":["tremormedia.com","cdna.tremormedia.com","objects.tremormedia.com"]},{"id":"adaway_tremorhub.com","name":"tremorhub.com","hostnames":["tremorhub.com","adelphic-partners.tremorhub.com","ads.tremorhub.com","4cywq-eqnre.ads.tremorhub.com","5ew8d-b3mmu.ads.tremorhub.com","5nbh3-h9cpz.ads.tremorhub.com","6psex-axuft.ads.tremorhub.com","6psex-fm1gy.ads.tremorhub.com","6psex-sootr.ads.tremorhub.com","bktr2-06hdl.ads.tremorhub.com","cguke-9h64o.ads.tremorhub.com","gklfs-0vg08.ads.tremorhub.com","gklfs-fvifs.ads.tremorhub.com","gklfs-giam6.ads.tremorhub.com","gklfs-idnhw.ads.tremorhub.com","gklfs-ktn14.ads.tremorhub.com","gklfs-x8k98.ads.tremorhub.com","jzwjq.ads.tremorhub.com","m7hdh-2damu.ads.tremorhub.com","oryj8-jzbmc.ads.tremorhub.com","p4dt2-4nrdw.ads.tremorhub.com","p4dt2-8d2sv.ads.tremorhub.com","p4dt2-980w2.ads.tremorhub.com","p4dt2-uma55.ads.tremorhub.com","pc031-edgup.ads.tremorhub.com","pc051-k4snh.ads.tremorhub.com","pc083-0qo9e.ads.tremorhub.com","pc083-ii06c.ads.tremorhub.com","q017o-d42by.ads.tremorhub.com","q017o-jh7o1.ads.tremorhub.com","regional.ads.tremorhub.com","slckg-4znyf.ads.tremorhub.com","slckg-kqe2e.ads.tremorhub.com","slckg-lyoc5.ads.tremorhub.com","slckg-nugvu.ads.tremorhub.com","slckg-qrmhc.ads.tremorhub.com","v4r9z-3jgr1.ads.tremorhub.com","v4r9z-fjydq.ads.tremorhub.com","amobee-partners.tremorhub.com","appnexus-partners.tremorhub.com","brightroll-partners.tremorhub.com","cdn.tremorhub.com","connatix-supply-partners.tremorhub.com","criteo-partners.tremorhub.com","events.tremorhub.com","partners.tremorhub.com","quantcast.partners.tremorhub.com","simplifi.partners.tremorhub.com","publishers.tremorhub.com","pbs.publishers.tremorhub.com","qds0l.publishers.tremorhub.com","scm.publishers.tremorhub.com","sundaysky-partners.tremorhub.com","taboola-supply-partners.tremorhub.com","eq97f.publishers.tremorhub.com","2ciy2-9kbup.ads.tremorhub.com","eq97f-1j0az.ads.tremorhub.com","eq97f-3ak3i.ads.tremorhub.com","eq97f-d6025.ads.tremorhub.com","h250p-y3urn.ads.tremorhub.com","i79zj-tzyj9.ads.tremorhub.com","mb9eo-7w62j.ads.tremorhub.com","mb9eo-nkrlx.ads.tremorhub.com","p4dt2-0pwq8.ads.tremorhub.com","p4dt2-9fzxj.ads.tremorhub.com","p4dt2-hr9oj.ads.tremorhub.com","pc083-aipdx.ads.tremorhub.com","playbuzzmm.ads.tremorhub.com","playbuzzmobileweb.ads.tremorhub.com","px2ii-ufb66.ads.tremorhub.com","vtrdn-wjdav.ads.tremorhub.com","videology-partners.tremorhub.com","m6dqx-ad3hl.ads.tremorhub.com","p4dt2-scyd6.ads.tremorhub.com","slckg-2p3vy.ads.tremorhub.com","pg308-zmbra.ads.tremorhub.com"]},{"id":"adaway_traktum.com","name":"traktum.com","hostnames":["traktum.com"]},{"id":"adaway_trafficmanager.net","name":"trafficmanager.net","hostnames":["analytics-listener.trafficmanager.net","collector-main.trafficmanager.net"]},{"id":"adaway_traffichunt.com","name":"traffichunt.com","hostnames":["ads.traffichunt.com"]},{"id":"adaway_trackonomics.net","name":"trackonomics.net","hostnames":["cdn-magiclinks.trackonomics.net"]},{"id":"adaway_trackingio.com","name":"trackingio.com","hostnames":["log.trackingio.com","slog.trackingio.com"]},{"id":"adaway_tpdads.com","name":"tpdads.com","hostnames":["cdn.tpdads.com"]},{"id":"adaway_tpctrust.com","name":"tpctrust.com","hostnames":["s.tpctrust.com"]},{"id":"adaway_tpbid.com","name":"tpbid.com","hostnames":["tpbid.com","c.tpbid.com","gota.tpbid.com","gotu.tpbid.com"]},{"id":"adaway_tout.com","name":"tout.com","hostnames":["analytics.tout.com"]},{"id":"adaway_torrenti.al","name":"torrenti.al","hostnames":["m1.torrenti.al"]},{"id":"adaway_topaz-analytics.com","name":"topaz-analytics.com","hostnames":["playtest-api.topaz-analytics.com","push-api.topaz-analytics.com"]},{"id":"adaway_toolmatrix.plus","name":"toolmatrix.plus","hostnames":["apitm.toolmatrix.plus"]},{"id":"adaway_tohsoft.com","name":"tohsoft.com","hostnames":["adservice.tohsoft.com"]},{"id":"adaway_togothermany.cn","name":"togothermany.cn","hostnames":["adscfg.togothermany.cn","adsup.togothermany.cn"]},{"id":"adaway_today.com","name":"today.com","hostnames":["aamt.today.com","srepdata.usatoday.com"]},{"id":"adaway_toast.com","name":"toast.com","hostnames":["ad-exchange.toast.com","adlc-exchange.toast.com","adx-exchange.toast.com","tagmanager.toast.com","static.tagmanager.toast.com"]},{"id":"adaway_tnkfactory.com","name":"tnkfactory.com","hostnames":["tnkfactory.com","ap.tnkfactory.com"]},{"id":"adaway_tinypass.com","name":"tinypass.com","hostnames":["api-v3.tinypass.com","buy.tinypass.com","cdn.tinypass.com","dashboard.tinypass.com","experience.tinypass.com","id.tinypass.com","sandbox.tinypass.com"]},{"id":"adaway_tingyun.com","name":"tingyun.com","hostnames":["beacon.tingyun.com"]},{"id":"adaway_timewarnercable.com","name":"timewarnercable.com","hostnames":["metrics.timewarnercable.com"]},{"id":"adaway_tiltingpoint.io","name":"tiltingpoint.io","hostnames":["registration.tiltingpoint.io","utctime.tiltingpoint.io"]},{"id":"adaway_tiktokv.com","name":"TikTok Analytics","hostnames":["log-va.tiktokv.com","mon.tiktokv.com","mon-va.tiktokv.com","analytics.tiktok.com"],"link":"https://www.ghostery.com/whotracksme/trackers/tiktok_analytics"},{"id":"adaway_tidaltv.com","name":"Videology","hostnames":["tidaltv.com","trk.tidaltv.com","req.tidaltv.com","uav.tidaltv.com"],"link":"https://www.ghostery.com/whotracksme/trackers/videology"},{"id":"adaway_thrtle.com","name":"thrtle.com","hostnames":["thrtle.com"]},{"id":"adaway_thinknearhub.com","name":"thinknearhub.com","hostnames":["thinknear-hosted.thinknearhub.com"]},{"id":"adaway_thetrafficstat.net","name":"thetrafficstat.net","hostnames":["thetrafficstat.net"]},{"id":"adaway_thetimmedia.site","name":"thetimmedia.site","hostnames":["thetimmedia.site","trinity-player.thetimmedia.site","trinity-cdn.thetimmedia.site"]},{"id":"adaway_thescore.com","name":"thescore.com","hostnames":["analytics-tracker.thescore.com"]},{"id":"adaway_theoremreach.com","name":"theoremreach.com","hostnames":["theoremreach.com"]},{"id":"adaway_themoneytizer.com","name":"Moneytizer","hostnames":["ads.themoneytizer.com"],"link":"https://www.ghostery.com/whotracksme/trackers/moneytizer"},{"id":"adaway_theguardian.com","name":"theguardian.com","hostnames":["ophan.theguardian.com"]},{"id":"adaway_thebrighttag.com","name":"thebrighttag.com","hostnames":["s.thebrighttag.com"]},{"id":"adaway_teragence.net","name":"teragence.net","hostnames":["control.teragence.net"]},{"id":"adaway_tenjin.io","name":"tenjin.io","hostnames":["track.tenjin.io"]},{"id":"adaway_tenjin.com","name":"tenjin.com","hostnames":["track.tenjin.com"]},{"id":"adaway_tend.io","name":"tend.io","hostnames":["tend.io","track.tend.io"]},{"id":"adaway_telematicsdirect.com","name":"telematicsdirect.com","hostnames":["nav.telematicsdirect.com"]},{"id":"adaway_teenvogue.com","name":"teenvogue.com","hostnames":["sstats.teenvogue.com"]},{"id":"adaway_ted.com","name":"ted.com","hostnames":["error-collector.ted.com","metrics.ted.com","api.videometrics.ted.com"]},{"id":"adaway_techcrunch.com","name":"techcrunch.com","hostnames":["ampmetrics.techcrunch.com"]},{"id":"adaway_tbs.com","name":"tbs.com","hostnames":["sanalytics.tbs.com"]},{"id":"adaway_targetspot.com","name":"targetspot.com","hostnames":["targetspot.com","cdn.targetspot.com","nodeny.targetspot.com","content.cdn.targetspot.com"]},{"id":"adaway_target2sell.com","name":"Target 2 Sell","hostnames":["target2sell.com","api.target2sell.com","serv-api.target2sell.com","static.target2sell.com"],"link":"https://www.ghostery.com/whotracksme/trackers/target_2_sell"},{"id":"adaway_taptica.com","name":"taptica.com","hostnames":["taptica.com","balanced-clk.taptica.com","clk.taptica.com","impression.taptica.com"]},{"id":"adaway_taptapnetworks.com","name":"taptapnetworks.com","hostnames":["cdnsonata.taptapnetworks.com","sonata-notifications.taptapnetworks.com","sonata-notifications-us-east.taptapnetworks.com"]},{"id":"adaway_tapstream.com","name":"tapstream.com","hostnames":["api.tapstream.com","reporting.tapstream.com"]},{"id":"adaway_tapsell.ir","name":"tapsell.ir","hostnames":["api.tapsell.ir","plus.tapsell.ir"]},{"id":"adaway_taps.io","name":"taps.io","hostnames":["api.taps.io"]},{"id":"adaway_taplytics.com","name":"taplytics.com","hostnames":["decision.taplytics.com","js.taplytics.com","ping.taplytics.com"]},{"id":"adaway_tapinfluence.com","name":"tapinfluence.com","hostnames":["a.tapinfluence.com","influencers.tapinfluence.com"]},{"id":"adaway_tapfiliate.com","name":"tapfiliate.com","hostnames":["script.tapfiliate.com","static.tapfiliate.com"]},{"id":"adaway_tapatalk.com","name":"tapatalk.com","hostnames":["log.tapatalk.com"]},{"id":"adaway_tapas.net","name":"tapas.net","hostnames":["tapas.net","nrc.tapas.net"]},{"id":"adaway_tapad.com","name":"Tapad","hostnames":["tapad.com","assets.tapad.com","pandg.tapad.com","pixel.tapad.com","tapestry.tapad.com"],"link":"https://www.ghostery.com/whotracksme/trackers/tapad"},{"id":"adaway_taobao.com","name":"taobao.com","hostnames":["audid-api.taobao.com","adashx4ae.ut.taobao.com","h-adashx.ut.taobao.com","h-adashx4ae.ut.taobao.com"]},{"id":"adaway_tango.me","name":"tango.me","hostnames":["acme.tango.me"]},{"id":"adaway_tamgrt.com","name":"tamgrt.com","hostnames":["www.tamgrt.com"]},{"id":"adaway_talkingdata.net","name":"talkingdata.net","hostnames":["tdcv3.talkingdata.net"]},{"id":"adaway_talkable.com","name":"talkable.com","hostnames":["www.talkable.com"]},{"id":"adaway_tagular.com","name":"tagular.com","hostnames":["cdn.tagular.com"]},{"id":"adaway_tagsrvcs.com","name":"tagsrvcs.com","hostnames":["s.tagsrvcs.com"]},{"id":"adaway_tagdelivery.com","name":"tagdelivery.com","hostnames":["ad-thd-east.tagdelivery.com"]},{"id":"adaway_tactilews.com","name":"tactilews.com","hostnames":["adserver.tactilews.com","analytics.tactilews.com","analytics-eu.tactilews.com"]},{"id":"adaway_tacoda.net","name":"Tacoda","hostnames":["tacoda.net","an.tacoda.net","anrtx.tacoda.net"],"link":"https://www.ghostery.com/whotracksme/trackers/tacoda"},{"id":"adaway_tabmo.io","name":"tabmo.io","hostnames":["events.tabmo.io"]},{"id":"adaway_swrve.com","name":"swrve.com","hostnames":["swrve.com","content-cdn.swrve.com","31123.identity.swrve.com","link.swrve.com"]},{"id":"adaway_swiftype.com","name":"swiftype.com","hostnames":["cc.swiftype.com"]},{"id":"adaway_swiftkey.com","name":"swiftkey.com","hostnames":["telemetry.api.swiftkey.com"]},{"id":"adaway_survicate.com","name":"survicate.com","hostnames":["api.survicate.com","survey.survicate.com"]},{"id":"adaway_survata.com","name":"survata.com","hostnames":["survata.com","ir.surveywall-api.survata.com"]},{"id":"adaway_supersonicads.com","name":"supersonicads.com","hostnames":["supersonicads.com","iab-imp-gateway.supersonicads.com","is-gateway.supersonicads.com","outcome-cdn.supersonicads.com","outcome-ssp.supersonicads.com","pm-gateway.supersonicads.com","sonic-us.supersonicads.com","guc-api.sonic-us.supersonicads.com","tagmediation.supersonicads.com","banner-gateway.supersonicads.com","nativeapi.supersonicads.com"]},{"id":"adaway_superawesome.tv","name":"superawesome.tv","hostnames":["ads.superawesome.tv"]},{"id":"adaway_superads.cn","name":"superads.cn","hostnames":["trk.superads.cn"]},{"id":"adaway_sumome.com","name":"Sumo","hostnames":["sumome.com","load.sumome.com","sumo.com","load.sumo.com","segurosumo.com","www.segurosumo.com"],"link":"https://www.ghostery.com/whotracksme/trackers/sumome"},{"id":"adaway_subiz.com","name":"subiz.com","hostnames":["static.subiz.com"]},{"id":"adaway_strikeiron.com","name":"strikeiron.com","hostnames":["strikeiron.com"]},{"id":"adaway_streamguys1.com","name":"streamguys1.com","hostnames":["ad-im-cmg.streamguys1.com"]},{"id":"adaway_stocard.de","name":"stocard.de","hostnames":["mb-cdn.stocard.de"]},{"id":"adaway_stickyadstv.com","name":"StickyAds","hostnames":["stickyadstv.com","ads.stickyadstv.com","cdn.stickyadstv.com","update.stickyadstv.com","s.update.stickyadstv.com"],"link":"https://www.ghostery.com/whotracksme/trackers/stickyads"},{"id":"adaway_steelhousemedia.com","name":"Steel House Media","hostnames":["steelhousemedia.com","c.steelhousemedia.com","cookie-sync-service-prod.steelhousemedia.com","delivery.steelhousemedia.com","events.steelhousemedia.com","px.steelhousemedia.com","dx.steelhousemedia.com"],"link":"https://www.ghostery.com/whotracksme/trackers/steelhouse"},{"id":"adaway_steelhouse.com","name":"steelhouse.com","hostnames":["steelhouse.com"]},{"id":"adaway_stat24.com","name":"Stat24","hostnames":["hit.stat24.com","ipla.hit.stat24.com","active.hit.stat24.com","home.hit.stat24.com","lt3.hit.stat24.com","nl4.hit.stat24.com","pro.hit.stat24.com","redefine.hit.stat24.com","redefine2.hit.stat24.com","ru2.hit.stat24.com","s1.hit.stat24.com","s2.hit.stat24.com","s3.hit.stat24.com","s4.hit.stat24.com","ua1.hit.stat24.com","ua2.hit.stat24.com","ua3.hit.stat24.com","ua4.hit.stat24.com","ua5.hit.stat24.com","uk4.hit.stat24.com"],"link":"https://www.ghostery.com/whotracksme/trackers/stat24"},{"id":"adaway_startappexchange.com","name":"startappexchange.com","hostnames":["init.startappexchange.com"]},{"id":"adaway_starbolt.io","name":"starbolt.io","hostnames":["alkutbay.starbolt.io","sdk.starbolt.io"]},{"id":"adaway_ssacdn.com","name":"ssacdn.com","hostnames":["cf.ssacdn.com","v.cf.ssacdn.com","images-demand.ssacdn.com","networksdk.ssacdn.com","platform.ssacdn.com"]},{"id":"adaway_srmdata.com","name":"srmdata.com","hostnames":["www.srmdata.com"]},{"id":"adaway_srmdata-us.com","name":"srmdata-us.com","hostnames":["www.srmdata-us.com"]},{"id":"adaway_spylog.com","name":"OpenStat","hostnames":["spylog.com","openstat.net","counter.spylog.com","hits.spylog.com","www.spylog.com","counteraport.spylog.com","u1817.16.spylog.com","u3102.47.spylog.com","u3305.71.spylog.com","u3608.20.spylog.com","u4056.56.spylog.com","u432.77.spylog.com","u4396.79.spylog.com","u4443.84.spylog.com","u4556.11.spylog.com","u5234.87.spylog.com","u5234.98.spylog.com","u5687.48.spylog.com","u574.07.spylog.com","u604.41.spylog.com","u6762.46.spylog.com","u6905.71.spylog.com","u7748.16.spylog.com","u810.15.spylog.com","u920.31.spylog.com","u977.40.spylog.com","tools.spylog.ru"],"link":"https://www.ghostery.com/whotracksme/trackers/openstat"},{"id":"adaway_springserve.com","name":"SpringServe","hostnames":["springserve.com","bc-ssb-iad.springserve.com","cdn.springserve.com","datplus.springserve.com","morgdog.springserve.com","update.morgdog.springserve.com","s.update.morgdog.springserve.com","sps.springserve.com","sync.springserve.com","vid.springserve.com","vid-io.springserve.com","vid-io-iad.springserve.com","vid-io-sin.springserve.com","vpaid.springserve.com","vid-io-dub.springserve.com"],"link":"https://www.ghostery.com/whotracksme/trackers/springserve"},{"id":"adaway_spotxchange.com","name":"SpotX","hostnames":["spotxchange.com","den01-event.spotxchange.com","den01-search.spotxchange.com","event.spotxchange.com","den01.event.spotxchange.com","sin01.event.spotxchange.com","iad02-event.spotxchange.com","iad02-search.spotxchange.com","search.spotxchange.com","sin01.search.spotxchange.com","sync.search.spotxchange.com","den01.sync.search.spotxchange.com","iad02.sync.search.spotxchange.com","sin01.sync.search.spotxchange.com","sin01-event.spotxchange.com","sin01-search.spotxchange.com","spotx.tv","js.spotx.tv","aka.spotxcdn.com","cdn.spotxcdn.com"],"link":"https://www.ghostery.com/whotracksme/trackers/spotxchange"},{"id":"adaway_spotscenered.info","name":"spotscenered.info","hostnames":["spotscenered.info","engine.spotscenered.info","cdn.engine.spotscenered.info"]},{"id":"adaway_spotify.com","name":"spotify.com","hostnames":["adeventtracker.spotify.com","pixel.spotify.com","pixel-static.spotify.com"]},{"id":"adaway_sponsorpay.com","name":"sponsorpay.com","hostnames":["sponsorpay.com","api.sponsorpay.com","service.sponsorpay.com","be.sponsorpay.com","offer.sponsorpay.com"]},{"id":"adaway_splkmobile.com","name":"splkmobile.com","hostnames":["api.splkmobile.com","3581a62b.api.splkmobile.com","9ed5f5b4.api.splkmobile.com","e1345286.api.splkmobile.com","ff1c0cc5.api.splkmobile.com","29627a66.api.splkmobile.com"]},{"id":"adaway_split.io","name":"split.io","hostnames":["auth.split.io","cdn.split.io","events.split.io"]},{"id":"adaway_splicky.com","name":"splicky.com","hostnames":["splicky.com","bidswitch-eu.splicky.com"]},{"id":"adaway_southwest.com","name":"southwest.com","hostnames":["smetrics.southwest.com"]},{"id":"adaway_sonataplatform.com","name":"sonataplatform.com","hostnames":["ads.sonataplatform.com"]},{"id":"adaway_solocpm.com","name":"solocpm.com","hostnames":["solocpm.com","ck.solocpm.com","clk.solocpm.com"]},{"id":"adaway_sociomantic.com","name":"Sociomantic","hostnames":["sociomantic.com"],"link":"https://www.ghostery.com/whotracksme/trackers/sociomantic"},{"id":"adaway_sociaplus.com","name":"SociaPlus","hostnames":["sociaplus.com","api.sociaplus.com"],"link":"https://www.ghostery.com/whotracksme/trackers/sociaplus.com"},{"id":"adaway_socialquantum.ru","name":"socialquantum.ru","hostnames":["collector.stats.socialquantum.ru"]},{"id":"adaway_socialquantum.com","name":"socialquantum.com","hostnames":["mobile-stats.socialquantum.com"]},{"id":"adaway_socdm.com","name":"Supership","hostnames":["socdm.com","adgen.socdm.com","apc.socdm.com","dr.socdm.com","bid.dr.socdm.com","tg.dr.socdm.com","frtn.socdm.com","gdn.socdm.com","rubicon.socdm.com","aol.socdm.com","imobile.socdm.com","bid.socdm.com","d.socdm.com","i.socdm.com","ssl.socdm.com","tg.socdm.com"],"link":"https://www.ghostery.com/whotracksme/trackers/supership"},{"id":"adaway_snapmobile.asia","name":"snapmobile.asia","hostnames":["snapmobile.asia","snap.snapmobile.asia"]},{"id":"adaway_snapdeal.com","name":"snapdeal.com","hostnames":["log.snapdeal.com"]},{"id":"adaway_snapchat.com","name":"snapchat.com","hostnames":["ads.snapchat.com","adsapi.snapchat.com","tr.snapchat.com","tr6.snapchat.com"]},{"id":"adaway_snapads.com","name":"snapads.com","hostnames":["snapads.com","adserver.snapads.com","usc.adserver.snapads.com","adserver.shadow.snapads.com","study.snapads.com","euw.adserver.snapads.com"]},{"id":"adaway_snackly.co","name":"snackly.co","hostnames":["counter.snackly.co"]},{"id":"adaway_smbeat.jp","name":"smbeat.jp","hostnames":["api.smbeat.jp"]},{"id":"adaway_smartnews-ads.com","name":"smartnews-ads.com","hostnames":["cdn.smartnews-ads.com","conf.smartnews-ads.com","i.smartnews-ads.com","thumbnail.smartnews-ads.com","api.smartnews-ads.com"]},{"id":"adaway_smarterhq.io","name":"smarterhq.io","hostnames":["global.smarterhq.io","onsiteshq.smarterhq.io","tr2.smarterhq.io"]},{"id":"adaway_smartclip.net","name":"SmartClip","hostnames":["smartclip.net","stats.smartclip.net","sxp.smartclip.net","stats.sxp.smartclip.net","sync.sxp.smartclip.net","bid.sxp.smartclip.net","ad.sxp.smartclip.net","ad.smartclip.net"],"link":"https://www.ghostery.com/whotracksme/trackers/smartclip"},{"id":"adaway_smart.link","name":"smart.link","hostnames":["smart.link"]},{"id":"adaway_smardroid.com","name":"smardroid.com","hostnames":["ap.smardroid.com","lg.smardroid.com","sc.smardroid.com","tkclick.smardroid.com"]},{"id":"adaway_smaato.com","name":"smaato.com","hostnames":["smaato.com","creatives.smaato.com"]},{"id":"adaway_slicktext.com","name":"slicktext.com","hostnames":["slicktext.com"]},{"id":"adaway_sitemaji.com","name":"sitemaji.com","hostnames":["sitemaji.com","ad.sitemaji.com"]},{"id":"adaway_singular.net","name":"singular.net","hostnames":["singular.net","i.singular.net","s2s.singular.net","sdk-api-v1.singular.net","t.singular.net"]},{"id":"adaway_sinajs.cn","name":"sinajs.cn","hostnames":["newspush.sinajs.cn"]},{"id":"adaway_sina.cn","name":"sina.cn","hostnames":["log.sina.cn","sdkapp.mobile.sina.cn","wbapp.mobile.sina.cn","sax.sina.cn"]},{"id":"adaway_simplycast.com","name":"simplycast.com","hostnames":["simplycast.com"]},{"id":"adaway_simplesharebuttons.com","name":"simplesharebuttons.com","hostnames":["simplesharebuttons.com"]},{"id":"adaway_signalr.net","name":"signalr.net","hostnames":["community.service.signalr.net"]},{"id":"adaway_sidearmsports.com","name":"sidearmsports.com","hostnames":["statcollector.sidearmsports.com"]},{"id":"adaway_shazam.com","name":"shazam.com","hostnames":["beacon.shazam.com"]},{"id":"adaway_sharedid.org","name":"sharedid.org","hostnames":["id.sharedid.org"]},{"id":"adaway_shalltry.com","name":"shalltry.com","hostnames":["shalltry.com"]},{"id":"adaway_sgdmobile.com","name":"sgdmobile.com","hostnames":["track.sgdmobile.com"]},{"id":"adaway_servebom.com","name":"Purch","hostnames":["servebom.com","ads.servebom.com","ads2.servebom.com","pixel.servebom.com","m.servebom.com","assets.purch.com","li.purch.com"],"link":"https://www.ghostery.com/whotracksme/trackers/purch"},{"id":"adaway_sense360eng.com","name":"sense360eng.com","hostnames":["ios-quinoa-config-prod.sense360eng.com"]},{"id":"adaway_sendtonews.com","name":"sendtonews.com","hostnames":["embed.sendtonews.com","www.embed.sendtonews.com"]},{"id":"adaway_sendo.vn","name":"sendo.vn","hostnames":["track.sendo.vn"]},{"id":"adaway_sembox.it","name":"sembox.it","hostnames":["tracking.sembox.it"]},{"id":"adaway_selectablemedia.com","name":"selectablemedia.com","hostnames":["cdn.selectablemedia.com"]},{"id":"adaway_sekindo.com","name":"Sekindo","hostnames":["sekindo.com","live.sekindo.com"],"link":"https://www.ghostery.com/whotracksme/trackers/sekindo"},{"id":"adaway_segmentify.com","name":"segmentify.com","hostnames":["cdn.segmentify.com"]},{"id":"adaway_segmentapis.com","name":"segmentapis.com","hostnames":["segmentapis.com","silver-fir.cd.segmentapis.com"]},{"id":"adaway_seewhy.com","name":"SAP CRM","hostnames":["saas.seewhy.com","abandonment6.saas.seewhy.com","d13im3ek7neeqp.cloudfront.net","d28ethi6slcjbm.cloudfront.net","d2uevgmgh16uk4.cloudfront.net","d3m83gvgzupli.cloudfront.net"],"link":"https://www.ghostery.com/whotracksme/trackers/sap_crm"},{"id":"adaway_secondstreetapp.com","name":"secondstreetapp.com","hostnames":["secondstreetapp.com","api.secondstreetapp.com","embed.secondstreetapp.com"]},{"id":"adaway_seattleclouds.com","name":"seattleclouds.com","hostnames":["analytics.seattleclouds.com"]},{"id":"adaway_scroll.com","name":"scroll.com","hostnames":["block.scroll.com","connect.scroll.com","static.scroll.com"]},{"id":"adaway_scorecardresearch.com","name":"ScoreCard Research Beacon","hostnames":["scorecardresearch.com","ads.scorecardresearch.com","b.scorecardresearch.com","bs.scorecardresearch.com","end.scorecardresearch.com","sb.scorecardresearch.com","udm.scorecardresearch.com","beacon.scorecardresearch.com","a.scorecardresearch.com","c.scorecardresearch.com","udm.ia8.scorecardresearch.com","udm.ia9.scorecardresearch.com","udm.ri1.scorecardresearch.com","udm.ri2.scorecardresearch.com","udm.ri3.scorecardresearch.com","udm.ri4.scorecardresearch.com","udm.ri5.scorecardresearch.com","udm.ri6.scorecardresearch.com","udm.ri7.scorecardresearch.com","udm.ri8.scorecardresearch.com","udm.ri9.scorecardresearch.com","udm.ia6.scorecardresearch.com","udm.ia7.scorecardresearch.com","sa.scorecardresearch.com","comscoreresearch.com","apple.comscoreresearch.com","oss-content.securestudies.com","post.securestudies.com","beacon.securestudies.com","rules.securestudies.com"],"link":"https://www.ghostery.com/whotracksme/trackers/scorecard_research_beacon"},{"id":"adaway_scopely.io","name":"scopely.io","hostnames":["aprod.scopely.io","adsgard.aprod.scopely.io","fenrir-resolver.aprod.scopely.io","static.aprod.scopely.io","collector.scopely.io","event.collector.scopely.io","489a19fa-d831-4954-858d-46436d5cdb20.event.collector.scopely.io","register.collector.scopely.io","489a19fa-d831-4954-858d-46436d5cdb20.register.collector.scopely.io","4af7c20b-7646-4fb7-b64f-ae0a8c51c1f1.register.collector.scopely.io","6b73d00a-d4a1-4350-825a-cd3f49afa460.register.collector.scopely.io","sdk.scopely.io","config.sdk.scopely.io","raven.aprod.scopely.io"]},{"id":"adaway_sc-static.net","name":"Snapchat For Business","hostnames":["sc-static.net","app-analytics-v2.snapchat.com","app-analytics.snapchat.com"],"link":"https://www.ghostery.com/whotracksme/trackers/snapchat"},{"id":"adaway_sbbanner.com","name":"sbbanner.com","hostnames":["sbbanner.com","www.sbbanner.com"]},{"id":"adaway_saypromo.net","name":"saypromo.net","hostnames":["api.saypromo.net"]},{"id":"adaway_saymedia.com","name":"saymedia.com","hostnames":["saymedia.com","embed.tempest-identity.prod.saymedia.com","dove.saymedia.com","ads.saymedia.com"]},{"id":"adaway_saygames.io","name":"saygames.io","hostnames":["track.saygames.io"]},{"id":"adaway_sas.com","name":"sas.com","hostnames":["execution-use.ci360.sas.com"]},{"id":"adaway_sandai.net","name":"sandai.net","hostnames":["etl.xlmc.sandai.net"]},{"id":"adaway_samsungads.com","name":"samsungads.com","hostnames":["samsungads.com","ads.samsungads.com","config.samsungads.com","events.samsungads.com"]},{"id":"adaway_samsungadhub.com","name":"samsungadhub.com","hostnames":["ad.samsungadhub.com"]},{"id":"adaway_samsung.com","name":"samsung.com","hostnames":["insights.samsung.com"]},{"id":"adaway_samplicio.us","name":"Lucid","hostnames":["tracker.samplicio.us"],"link":"https://www.ghostery.com/whotracksme/trackers/lucid"},{"id":"adaway_samba.tv","name":"Samba TV","hostnames":["samba.tv","ads.samba.tv","events.cid.samba.tv","pixel.mtrcs.samba.tv","tag.mtrcs.samba.tv","mtrcs.samba.tv"],"link":"https://www.ghostery.com/whotracksme/trackers/samba.tv"},{"id":"adaway_salmonads.com","name":"salmonads.com","hostnames":["api.salmonads.com","net.salmonads.com"]},{"id":"adaway_salesforceliveagent.com","name":"salesforceliveagent.com","hostnames":["d.la1-c2-iad.salesforceliveagent.com"]},{"id":"adaway_safedk.com","name":"safedk.com","hostnames":["api.safedk.com","config.safedk.com","edge.safedk.com"]},{"id":"adaway_rundsp.com","name":"RUN","hostnames":["rundsp.com","match.rundsp.com","cdna.runadtag.com"],"link":"https://www.ghostery.com/whotracksme/trackers/run"},{"id":"adaway_rudderlabs.com","name":"rudderlabs.com","hostnames":["api.rudderlabs.com"]},{"id":"adaway_rtbsrv.com","name":"rtbsrv.com","hostnames":["dmp.rtbsrv.com"]},{"id":"adaway_rovio.com","name":"rovio.com","hostnames":["ads-cloud.rovio.com","videoads-cloud.rovio.com"]},{"id":"adaway_rotaban.ru","name":"RotaBan","hostnames":["rotaban.ru"],"link":"https://www.ghostery.com/whotracksme/trackers/rotaban"},{"id":"adaway_roku.com","name":"roku.com","hostnames":["p.ads.roku.com","austin.logs.roku.com","mobile.logs.roku.com","scribe.logs.roku.com"]},{"id":"adaway_riskified.com","name":"riskified.com","hostnames":["beacon.riskified.com","c.riskified.com","img.riskified.com"]},{"id":"adaway_richrelevance.com","name":"richrelevance.com","hostnames":["image.richrelevance.com","integration.richrelevance.com","media.richrelevance.com","rm.recs.richrelevance.com"]},{"id":"adaway_rfihub.com","name":"rfihub.com","hostnames":["rfihub.com","20738914p.rfihub.com","20766699p.rfihub.com","a.rfihub.com","ewr-rtb1.rfihub.com","p.rfihub.com","s.rfihub.com","sjc-rtb1.rfihub.com","sjc-249.sjc-rtb1.rfihub.com","20585485p.rfihub.com"]},{"id":"adaway_rezync.com","name":"rezync.com","hostnames":["live.rezync.com"]},{"id":"adaway_reyrey.net","name":"reyrey.net","hostnames":["analytics.reyrey.net"]},{"id":"adaway_revrtb.com","name":"revrtb.com","hostnames":["revrtb.com","xml.revrtb.com"]},{"id":"adaway_revjet.com","name":"revjet.com","hostnames":["ads.revjet.com","cdn.revjet.com","pix.revjet.com","pix-us.revjet.com"]},{"id":"adaway_returngo.ai","name":"returngo.ai","hostnames":["static.returngo.ai"]},{"id":"adaway_retentionscience.com","name":"Retention Science","hostnames":["waves.retentionscience.com","d1stxfv94hrhia.cloudfront.net"],"link":"https://www.ghostery.com/whotracksme/trackers/retention_science"},{"id":"adaway_retargeting.biz","name":"retargeting.biz","hostnames":["tracking.retargeting.biz"]},{"id":"adaway_retagro.com","name":"retagro.com","hostnames":["retagro.com"]},{"id":"adaway_resu.io","name":"resu.io","hostnames":["sdk.resu.io"]},{"id":"adaway_restartad.com","name":"restartad.com","hostnames":["restartad.com","api2.restartad.com","gateway.restartad.com","gateway-2.restartad.com","stats.restartad.com"]},{"id":"adaway_responsys.net","name":"responsys.net","hostnames":["static.cdn.responsys.net"]},{"id":"adaway_resonate.com","name":"resonate.com","hostnames":["cdn.resonate.com"]},{"id":"adaway_researchnow.com","name":"Research Now","hostnames":["researchnow.com","tag.researchnow.com"],"link":"https://www.ghostery.com/whotracksme/trackers/research_now"},{"id":"adaway_remarketingpixel.com","name":"remarketingpixel.com","hostnames":["remarketingpixel.com","r.remarketingpixel.com"]},{"id":"adaway_relap.io","name":"Relap","hostnames":["relap.io"],"link":"https://www.ghostery.com/whotracksme/trackers/relap"},{"id":"adaway_reftagger.com","name":"reftagger.com","hostnames":["api.reftagger.com"]},{"id":"adaway_redretarget.com","name":"redretarget.com","hostnames":["app.redretarget.com","trackifyx.redretarget.com"]},{"id":"adaway_redintelligence.net","name":"The Reach Group","hostnames":["redintelligence.net","hal9000.redintelligence.net"],"link":"https://www.ghostery.com/whotracksme/trackers/the_reach_group"},{"id":"adaway_redfast.com","name":"redfast.com","hostnames":["redfast.com","conduit.redfast.com"]},{"id":"adaway_recreativ.ru","name":"Recreativ","hostnames":["recreativ.ru","track.recreativ.ru"],"link":"https://www.ghostery.com/whotracksme/trackers/recreativ"},{"id":"adaway_rebel.ai","name":"rebel.ai","hostnames":["cdn.rebel.ai"]},{"id":"adaway_realvu.net","name":"realvu.net","hostnames":["ac.realvu.net"]},{"id":"adaway_realme.com","name":"realme.com","hostnames":["iot-logser.realme.com"]},{"id":"adaway_realclever.com","name":"realclever.com","hostnames":["realclever.com","pixel.realclever.com"]},{"id":"adaway_rbthre.work","name":"rbthre.work","hostnames":["rbthre.work"]},{"id":"adaway_rbnt.org","name":"rbnt.org","hostnames":["rbnt.org"]},{"id":"adaway_rbl.ms","name":"rbl.ms","hostnames":["assets.rbl.ms","pages-stats.rbl.ms","user-stats.rbl.ms"]},{"id":"adaway_ravm.tv","name":"ravm.tv","hostnames":["display.ravm.tv","hb-t5u9.raps.ravm.tv"]},{"id":"adaway_rave-api.com","name":"rave-api.com","hostnames":["client.rave-api.com"]},{"id":"adaway_rallydev.com","name":"rallydev.com","hostnames":["beacon.rallydev.com"]},{"id":"adaway_radar.io","name":"radar.io","hostnames":["api.radar.io"]},{"id":"adaway_qwapi.com","name":"qwapi.com","hostnames":["iadctest.qwapi.com"]},{"id":"adaway_quantumgraph.com","name":"quantumgraph.com","hostnames":["api.quantumgraph.com","config.quantumgraph.com","users.quantumgraph.com"]},{"id":"adaway_quantcount.com","name":"Quantcount","hostnames":["quantcount.com","assets.quantcount.com","content.quantcount.com","creative-assets.quantcount.com","m.quantcount.com","pixel.quantcount.com","rules.quantcount.com","static.quantcount.com"],"link":"https://www.ghostery.com/whotracksme/trackers/quantcount"},{"id":"adaway_qq.com","name":"qq.com","hostnames":["lcsdk.3g.qq.com","masdk.3g.qq.com","pmir.3g.qq.com","tools.3g.qq.com","analy.qq.com","beacon.qq.com","e.qq.com","sdk.e.qq.com","mi.gdt.qq.com","v.gdt.qq.com","httpring.qq.com","c.isdspeed.qq.com","l.qq.com","c.l.qq.com","lives.l.qq.com","p.l.qq.com","msdk.qq.com","ssl.msdk.qq.com","img.ssl.msdk.qq.com","omgmta.qq.com","pingfore.qq.com","pingjs.qq.com","pingma.qq.com","pingtcss.qq.com","qring-tms.qq.com","rs1.qq.com","rs2.qq.com","scdown.qq.com","tajs.qq.com","log.tbs.qq.com","trace.qq.com","monitor.uu.qq.com","wspeed.qq.com","log.wtlogin.qq.com","ysdk.qq.com","tgw-masdk.3g.qq.com","adsfile.qq.com","adslvfile.qq.com","c2.l.qq.com","hm.l.qq.com","imc.l.qq.com","l2.l.qq.com","p2.l.qq.com","w.l.qq.com"]},{"id":"adaway_qgraph.io","name":"qgraph.io","hostnames":["sdk.api.qgraph.io"]},{"id":"adaway_qccoccocmedia.vn","name":"qccoccocmedia.vn","hostnames":["qccoccocmedia.vn"]},{"id":"adaway_qbk1.com","name":"qbk1.com","hostnames":["c2.qbk1.com"]},{"id":"adaway_px-cloud.net","name":"px-cloud.net","hostnames":["collector-px8fcgygk4.px-cloud.net"]},{"id":"adaway_pv-cdn.net","name":"pv-cdn.net","hostnames":["cf-us-popular.dash.pv-cdn.net"]},{"id":"adaway_pushnami.com","name":"pushnami.com","hostnames":["pushnami.com","api.pushnami.com","trc.pushnami.com"]},{"id":"adaway_pushengage.com","name":"pushengage.com","hostnames":["clientcdn.pushengage.com","clients-api.pushengage.com"]},{"id":"adaway_pushcrew.com","name":"pushcrew.com","hostnames":["cdn.pushcrew.com","dacdn.pushcrew.com","tracking.pushcrew.com"]},{"id":"adaway_push-notifs.com","name":"push-notifs.com","hostnames":["ws.push-notifs.com"]},{"id":"adaway_push-ad.com","name":"push-ad.com","hostnames":["app.push-ad.com"]},{"id":"adaway_pulsatehq.com","name":"pulsatehq.com","hostnames":["app.pulsatehq.com"]},{"id":"adaway_pubnative.info","name":"pubnative.info","hostnames":["pubnative.info"]},{"id":"adaway_publitas.com","name":"publitas.com","hostnames":["analytics.publitas.com"]},{"id":"adaway_pub2srv.com","name":"pub2srv.com","hostnames":["pub2srv.com","go.pub2srv.com"]},{"id":"adaway_pub.network","name":"pub.network","hostnames":["pub.network","a.pub.network","c.pub.network","d.pub.network"],"link":"https://www.ghostery.com/whotracksme/trackers/pub.network"},{"id":"adaway_provesrc.com","name":"provesrc.com","hostnames":["cdn.provesrc.com"]},{"id":"adaway_propellerads.com","name":"propellerads.com","hostnames":["ad.propellerads.com"]},{"id":"adaway_prooffactor.com","name":"prooffactor.com","hostnames":["prooffactor.com","api.prooffactor.com"]},{"id":"adaway_privy.com","name":"privy.com","hostnames":["privy.com","assets.privy.com","events.privy.com","widget.privy.com"]},{"id":"adaway_privacytrck.com","name":"privacytrck.com","hostnames":["static.privacytrck.com"]},{"id":"adaway_prinit.net","name":"prinit.net","hostnames":["schemea.prinit.net"]},{"id":"adaway_pricespider.com","name":"pricespider.com","hostnames":["locate.pricespider.com","track.pricespider.com"]},{"id":"adaway_prfct.cc","name":"prfct.cc","hostnames":["cdn-assets.prfct.cc","cdn-otf-cas.prfct.cc","cdn-resources.prfct.cc"]},{"id":"adaway_pressboard.ca","name":"pressboard.ca","hostnames":["adserver.pressboard.ca"]},{"id":"adaway_powerad.ai","name":"powerad.ai","hostnames":["powerad.ai"]},{"id":"adaway_postscript.io","name":"postscript.io","hostnames":["api.postscript.io","sdk.postscript.io"]},{"id":"adaway_postitial.com","name":"postitial.com","hostnames":["postitial.com","cdn-cf.postitial.com"]},{"id":"adaway_poperblocker.com","name":"poperblocker.com","hostnames":["api2.poperblocker.com"]},{"id":"adaway_popcap.com","name":"popcap.com","hostnames":["stats.popcap.com"]},{"id":"adaway_polyad.net","name":"PolyAd","hostnames":["polyad.net","core.polyad.net","ds.polyad.net","st.polyad.net","cp.polyad.net","cpx.polyad.net","dst.polyad.net","dt.polyad.net","go.polyad.net","html.polyad.net","img.polyad.net","st.core.polyad.net","st.html.polyad.net"],"link":"https://www.ghostery.com/whotracksme/trackers/polyad"},{"id":"adaway_polarisoffice.com","name":"polarisoffice.com","hostnames":["analysis.polarisoffice.com","logconfig.polarisoffice.com"]},{"id":"adaway_polarcdn.com","name":"polarcdn.com","hostnames":["static.polarcdn.com"]},{"id":"adaway_polarcdn-pentos.com","name":"polarcdn-pentos.com","hostnames":["polarcdn-pentos.com"]},{"id":"adaway_pokki.com","name":"pokki.com","hostnames":["analytics.pokki.com"]},{"id":"adaway_pointmediatracker.com","name":"pointmediatracker.com","hostnames":["pixel.pointmediatracker.com"]},{"id":"adaway_pocketmath.com","name":"pocketmath.com","hostnames":["pocketmath.com"]},{"id":"adaway_pmc.com","name":"pmc.com","hostnames":["iabusprivacy.pmc.com"]},{"id":"adaway_pluto.tv","name":"pluto.tv","hostnames":["service-ad-impression-proxy.clusters.pluto.tv"]},{"id":"adaway_playtem.com","name":"playtem.com","hostnames":["sdk.playtem.com"]},{"id":"adaway_placeiq.com","name":"placeiq.com","hostnames":["ads.placeiq.com","partner.ads.placeiq.com","secure.ads.placeiq.com"]},{"id":"adaway_placed.com","name":"placed.com","hostnames":["placed.com","api.placed.com","p.placed.com","panelist.placed.com","equallyplaced.com","www.equallyplaced.com"]},{"id":"adaway_pixels.ai","name":"pixels.ai","hostnames":["pub.pixels.ai"]},{"id":"adaway_pixel.watch","name":"pixel.watch","hostnames":["pixel.watch"]},{"id":"adaway_pinsightmedia.com","name":"pinsightmedia.com","hostnames":["v8.analytics.pinsightmedia.com","fusion-files-cf.pinsightmedia.com","intelligence-head.pinsightmedia.com","topapps-func.pinsightmedia.com","trackdat.pinsightmedia.com"]},{"id":"adaway_pinger.com","name":"pinger.com","hostnames":["ads.pinger.com","cf-ads.pinger.com"]},{"id":"adaway_picsart.com","name":"picsart.com","hostnames":["analytics.picsart.com","www.analytics.picsart.com"]},{"id":"adaway_picooapps.com","name":"picooapps.com","hostnames":["adsdk.picooapps.com"]},{"id":"adaway_phunware.com","name":"phunware.com","hostnames":["phunware.com"]},{"id":"adaway_phonepe.com","name":"phonepe.com","hostnames":["ads.phonepe.com","ads-static.phonepe.com"]},{"id":"adaway_phonalytics.com","name":"phonalytics.com","hostnames":["app.phonalytics.com"]},{"id":"adaway_petametrics.com","name":"petametrics.com","hostnames":["cdn.petametrics.com","query.petametrics.com","query-us-east1.petametrics.com","query1.petametrics.com"]},{"id":"adaway_perzonalization.com","name":"perzonalization.com","hostnames":["api.perzonalization.com","cdn.perzonalization.com"]},{"id":"adaway_personyze.com","name":"personyze.com","hostnames":["count.personyze.com"]},{"id":"adaway_personizely.net","name":"personizely.net","hostnames":["tracker.personizely.net"]},{"id":"adaway_permutive.com","name":"Permutive","hostnames":["permutive.com","amp.permutive.com","buzzfeed.amp.permutive.com","esi.amp.permutive.com","guardian.amp.permutive.com","hearst.amp.permutive.com","idg.amp.permutive.com","immediatemedia.amp.permutive.com","pmc.amp.permutive.com","vox.amp.permutive.com","api.permutive.com","cdn.permutive.com","mailmetromedia.amp.permutive.com","businessinsider.amp.permutive.com","conde.amp.permutive.com"],"link":"https://www.ghostery.com/whotracksme/trackers/permutive"},{"id":"adaway_permutive.app","name":"permutive.app","hostnames":["cdn.permutive.app","6093eccf-6734-4877-ac8b-83d6d0e27b46.edge.permutive.app"]},{"id":"adaway_perk0mean.com","name":"perk0mean.com","hostnames":["secure.perk0mean.com"]},{"id":"adaway_period-calendar.com","name":"period-calendar.com","hostnames":["ad.period-calendar.com"]},{"id":"adaway_performancehorizon.com","name":"performancehorizon.com","hostnames":["performancehorizon.com"]},{"id":"adaway_perfectionholic.com","name":"perfectionholic.com","hostnames":["featured.perfectionholic.com","newfeatureview.perfectionholic.com"]},{"id":"adaway_perfectcorp.com","name":"perfectcorp.com","hostnames":["abtesting.perfectcorp.com","appad-api-01.perfectcorp.com","clad.perfectcorp.com"]},{"id":"adaway_perf-serving.com","name":"perf-serving.com","hostnames":["images.perf-serving.com"]},{"id":"adaway_pdbarea.com","name":"pdbarea.com","hostnames":["ads.pdbarea.com","api.pdbarea.com"]},{"id":"adaway_paypal.com","name":"paypal.com","hostnames":["b.stats.paypal.com","slc.stats.paypal.com"]},{"id":"adaway_particlenews.com","name":"particlenews.com","hostnames":["log.particlenews.com"]},{"id":"adaway_parse.com","name":"parse.com","hostnames":["api.parse.com"]},{"id":"adaway_parrable.com","name":"parrable.com","hostnames":["parrable.com","h.parrable.com"]},{"id":"adaway_pangle.io","name":"pangle.io","hostnames":["pangle.io","api16-access-gcp.pangle.io","api16-access-sg.pangle.io"]},{"id":"adaway_pandora.com","name":"pandora.com","hostnames":["adserver.pandora.com"]},{"id":"adaway_pandoiq.com","name":"pandoiq.com","hostnames":["tracking.pandoiq.com"]},{"id":"adaway_pages03.net","name":"pages03.net","hostnames":["sc.pages03.net","www.sc.pages03.net"]},{"id":"adaway_pagefair.net","name":"pagefair.net","hostnames":["asset.pagefair.net"]},{"id":"adaway_pagefair.com","name":"pagefair.com","hostnames":["asset.pagefair.com"]},{"id":"adaway_padsdel.com","name":"padsdel.com","hostnames":["padsdel.com","go.padsdel.com"]},{"id":"adaway_p-n.io","name":"p-n.io","hostnames":["cdn.p-n.io"]},{"id":"adaway_ownlocal.com","name":"ownlocal.com","hostnames":["local.ownlocal.com","secure.ownlocal.com","origami.secure.ownlocal.com","widget.secure.ownlocal.com","snowplow.ownlocal.com"]},{"id":"adaway_outlookmobile.com","name":"outlookmobile.com","hostnames":["prod-collecticon.outlookmobile.com"]},{"id":"adaway_outgrow.co","name":"outgrow.co","hostnames":["api-h.outgrow.co","api-live.outgrow.co","api-n.outgrow.co"]},{"id":"adaway_outbrain.org","name":"outbrain.org","hostnames":["alldcs.outbrain.org","chidc2.outbrain.org","log.outbrain.org","nychi2.outbrain.org","sadc1.outbrain.org"]},{"id":"adaway_oupeng.com","name":"oupeng.com","hostnames":["cp.oupeng.com","startup.oupeng.com","turbo2sdk-push.oupeng.com"]},{"id":"adaway_otherlevels.com","name":"otherlevels.com","hostnames":["otherlevels.com","cdn.otherlevels.com","config.otherlevels.com"]},{"id":"adaway_org.vn","name":"org.vn","hostnames":["ad.org.vn","serving.ad.org.vn","cdn.serving.ad.org.vn","member.ad.org.vn","static.ad.org.vn","www.ad.org.vn"]},{"id":"adaway_orangeclickmedia.com","name":"orangeclickmedia.com","hostnames":["cdn.orangeclickmedia.com"]},{"id":"adaway_optnmstr.com","name":"optnmstr.com","hostnames":["a.optnmstr.com"]},{"id":"adaway_optnmnstr.com","name":"optnmnstr.com","hostnames":["a.optnmnstr.com"]},{"id":"adaway_optmstr.com","name":"optmstr.com","hostnames":["a.optmstr.com","api.optmstr.com"]},{"id":"adaway_optmnstr.com","name":"optmnstr.com","hostnames":["a.optmnstr.com","api.optmnstr.com"]},{"id":"adaway_optimove.net","name":"optimove.net","hostnames":["sdk-cdn.optimove.net","sdkuaservice.optimove.net"]},{"id":"adaway_optimost.io","name":"optimost.io","hostnames":["origin.optimost.io"]},{"id":"adaway_optimix.asia","name":"iClick","hostnames":["optimix.asia","bx.optimix.asia","bx01.optimix.asia"],"link":"https://www.ghostery.com/whotracksme/trackers/iclick"},{"id":"adaway_optaim.com","name":"OptAim","hostnames":["optaim.com","cm.optaim.com","imp.optaim.com"],"link":"https://www.ghostery.com/whotracksme/trackers/optaim"},{"id":"adaway_optad360.io","name":"optad360.io","hostnames":["optad360.io","cmp.optad360.io","get.optad360.io"]},{"id":"adaway_opstag.com","name":"opstag.com","hostnames":["cdn1.opstag.com"]},{"id":"adaway_oppomobile.com","name":"oppomobile.com","hostnames":["adx.ads.oppomobile.com","bdapi.ads.oppomobile.com","data.ads.oppomobile.com","data-id.ads.oppomobile.com","adsfs.oppomobile.com"]},{"id":"adaway_opera.com","name":"opera.com","hostnames":["api-a.op-mobile.opera.com"]},{"id":"adaway_opensharecount.com","name":"Open Share Count","hostnames":["opensharecount.com"],"link":"https://www.ghostery.com/whotracksme/trackers/open_share_count"},{"id":"adaway_onthe.io","name":"OnThe.io","hostnames":["onthe.io","cdn.onthe.io","v7.cdn.onthe.io","as.v7.cdn.onthe.io","na.v7.cdn.onthe.io","i.onthe.io","tt.onthe.io"],"link":"https://www.ghostery.com/whotracksme/trackers/onthe.io"},{"id":"adaway_online-metrix.net","name":"ThreatMetrix","hostnames":["online-metrix.net","aa.online-metrix.net","h.online-metrix.net","h-sdk.online-metrix.net"],"link":"https://www.ghostery.com/whotracksme/trackers/threatmetrix"},{"id":"adaway_onetrust.com","name":"onetrust.com","hostnames":["geolocation.onetrust.com"]},{"id":"adaway_onetag-sys.com","name":"onetag-sys.com","hostnames":["onetag-sys.com"]},{"id":"adaway_onelouder.com","name":"onelouder.com","hostnames":["advrts.onelouder.com"]},{"id":"adaway_onelink.me","name":"onelink.me","hostnames":["snssdk1233.onelink.me"]},{"id":"adaway_onecount.net","name":"onecount.net","hostnames":["validate.onecount.net"]},{"id":"adaway_omnilocal.ai","name":"omnilocal.ai","hostnames":["api.omnilocal.ai"]},{"id":"adaway_omguk.com","name":"omguk.com","hostnames":["track.omguk.com","static.track.omguk.com"]},{"id":"adaway_okanjo.com","name":"okanjo.com","hostnames":["api2.okanjo.com","cdn.okanjo.com"]},{"id":"adaway_ogury.io","name":"ogury.io","hostnames":["cloud.ogury.io","medias.cloud.ogury.io","prod.cloud.ogury.io","ext-inv-cdn.prod.cloud.ogury.io","format.prod.cloud.ogury.io","mraid.prod.cloud.ogury.io","ms-ads.prod.cloud.ogury.io","wsback2b.prod.cloud.ogury.io","consent-manager-events.ogury.io","dsp-1.ogury.io"]},{"id":"adaway_ogury.co","name":"ogury.co","hostnames":["sdk-monitoring.ogury.co"]},{"id":"adaway_offerstrack.net","name":"offerstrack.net","hostnames":["adcanopus.offerstrack.net","dopemobi.offerstrack.net","fuzeclick.offerstrack.net","heatmobi.offerstrack.net","midoweb.offerstrack.net"]},{"id":"adaway_oclasrv.com","name":"oclasrv.com","hostnames":["go.oclasrv.com"]},{"id":"adaway_oclaserver.com","name":"Propeller Ads","hostnames":["oclaserver.com","onclasrv.com","onclickads.net","onclkds.com","propellerads.com","propellerpops.com","go.oclaserver.com","go.onclasrv.com","offers.propellerads.com","promo.propellerads.com","tracking.propellerads.com"],"link":"https://www.ghostery.com/whotracksme/trackers/propeller_ads"},{"id":"adaway_o18.click","name":"o18.click","hostnames":["twotreymedia10001697.o18.click"]},{"id":"adaway_nytimes.com","name":"nytimes.com","hostnames":["a-reporting.nytimes.com","als-svc.nytimes.com","dd.nytimes.com","et.nytimes.com","a.et.nytimes.com","meter-svc.nytimes.com"]},{"id":"adaway_ns1p.net","name":"ns1p.net","hostnames":["b.ns1p.net"]},{"id":"adaway_npttech.com","name":"npttech.com","hostnames":["www.npttech.com"]},{"id":"adaway_nodle.io","name":"nodle.io","hostnames":["dev.nodle.io"]},{"id":"adaway_nmcdn.us","name":"Newsmax","hostnames":["nmcdn.us"],"link":"https://www.ghostery.com/whotracksme/trackers/newsmax"},{"id":"adaway_nixcdn.com","name":"nixcdn.com","hostnames":["log4x.nixcdn.com","stc-nas.nixcdn.com"]},{"id":"adaway_ninthdecimal.com","name":"ninthdecimal.com","hostnames":["ninthdecimal.com","lciapi.ninthdecimal.com","rtb.ninthdecimal.com"]},{"id":"adaway_ning.com","name":"ning.com","hostnames":["api.ning.com"]},{"id":"adaway_nile.works","name":"nile.works","hostnames":["targeting.washpost.nile.works"]},{"id":"adaway_nike.com","name":"nike.com","hostnames":["analytics.nike.com"]},{"id":"adaway_nielsen.com","name":"nielsen.com","hostnames":["apps.nielsen.com","onsite-tag-logs.apps.nielsen.com"]},{"id":"adaway_nicovideo.jp","name":"nicovideo.jp","hostnames":["ads.nicovideo.jp"]},{"id":"adaway_nextdoor.com","name":"nextdoor.com","hostnames":["us-tracking.nextdoor.com"]},{"id":"adaway_nextclick.pl","name":"Nextclick","hostnames":["nextclick.pl"],"link":"https://www.ghostery.com/whotracksme/trackers/nextclick"},{"id":"adaway_nexstardigital.net","name":"nexstardigital.net","hostnames":["ccpa.psg.nexstardigital.net","segment.psg.nexstardigital.net"]},{"id":"adaway_nexac.com","name":"Datalogix","hostnames":["nexac.com","gtm04.nexac.com","h.nexac.com","p.nexac.com","tf.nexac.com"],"link":"https://www.ghostery.com/whotracksme/trackers/datalogix"},{"id":"adaway_nex8.net","name":"nex8.net","hostnames":["nex8.net","cs.nex8.net"]},{"id":"adaway_newsbreak.com","name":"newsbreak.com","hostnames":["www.newsbreak.com"]},{"id":"adaway_neustar.biz","name":"neustar.biz","hostnames":["wpm.neustar.biz","rum-collector.wpm.neustar.biz"]},{"id":"adaway_networld.hk","name":"networld.hk","hostnames":["networld.hk"]},{"id":"adaway_networkad.net","name":"networkad.net","hostnames":["app.networkad.net"]},{"id":"adaway_netsolads.com","name":"netsolads.com","hostnames":["stats.netsolads.com"]},{"id":"adaway_netmng.com","name":"Netmining","hostnames":["netmng.com","adb2waycm-atl.netmng.com","com-fcagroup.netmng.com","gcm.netmng.com","j2waycm.netmng.com","krux2waycm.netmng.com","liveramp2waycm-atl.netmng.com","nan.netmng.com","sinkhole.netmng.com","lijit2waycm.netmng.com","bkrntr.netmng.com","com-quidco.netmng.com","rbk.netmng.com","atrd.netmng.com","brnys.netmng.com","com-kia.netmng.com","com-kodak.netmng.com","com-mitsubishi.netmng.com","com-morningstar.netmng.com","com-vw.netmng.com","dms.netmng.com","nbcustr.netmng.com","vw.netmng.com","a.netmng.com","com-cdiscount.netmng.com","nl-moneyou.netmining.com","nl-saab.netmining.com"],"link":"https://www.ghostery.com/whotracksme/trackers/netmining"},{"id":"adaway_netmera.com","name":"netmera.com","hostnames":["sdkapi.netmera.com"]},{"id":"adaway_netizen.co","name":"netizen.co","hostnames":["assets.netizen.co"]},{"id":"adaway_net.vn","name":"net.vn","hostnames":["vads.net.vn","client.vads.net.vn","log.vads.net.vn","www.vads.net.vn"]},{"id":"adaway_net.ua","name":"C8 Network","hostnames":["c8.net.ua"],"link":"https://www.ghostery.com/whotracksme/trackers/c8_network"},{"id":"adaway_net.in","name":"net.in","hostnames":["adjust.net.in","app.adjust.net.in"]},{"id":"adaway_nervoussummer.com","name":"nervoussummer.com","hostnames":["nervoussummer.com"]},{"id":"adaway_nend.net","name":"nend.net","hostnames":["nend.net","vdapp.nend.net","ad1.nend.net","ad2.nend.net","ad3.nend.net","img1.nend.net","impression.nend.net","js1.nend.net","lois.nend.net","lona.nend.net","s2.nend.net"]},{"id":"adaway_ne.jp","name":"ne.jp","hostnames":["adcdn.goo.ne.jp","owb101.goo.ne.jp","r-ad.ne.jp","bk.r-ad.ne.jp","cs.r-ad.ne.jp","tm.r-ad.ne.jp","tm2.r-ad.ne.jp"]},{"id":"adaway_nct.vn","name":"nct.vn","hostnames":["apinas.nct.vn"]},{"id":"adaway_ncaudienceexchange.com","name":"ncaudienceexchange.com","hostnames":["ncaudienceexchange.com","log.ncaudienceexchange.com"]},{"id":"adaway_nbcuni.com","name":"nbcuni.com","hostnames":["video-ads-module.ad-tech.nbcuni.com","osimg.nbcuni.com","pix.nbcuni.com"]},{"id":"adaway_nbcuas.com","name":"nbcuas.com","hostnames":["tracker.nbcuas.com"]},{"id":"adaway_nbcsports.com","name":"nbcsports.com","hostnames":["geo.nbcsports.com"]},{"id":"adaway_nbcnews.com","name":"nbcnews.com","hostnames":["aamt.nbcnews.com"]},{"id":"adaway_native.ai","name":"native.ai","hostnames":["cdn.native.ai"]},{"id":"adaway_narvar.com","name":"narvar.com","hostnames":["assets.narvar.com"]},{"id":"adaway_narrativ.com","name":"narrativ.com","hostnames":["static.narrativ.com"]},{"id":"adaway_nappyattack.com","name":"nappyattack.com","hostnames":["nappyattack.com"]},{"id":"adaway_nanigans.com","name":"Nanigans","hostnames":["nanigans.com","api.nanigans.com","cdn.nanigans.com"],"link":"https://www.ghostery.com/whotracksme/trackers/nanigans"},{"id":"adaway_naiadsystems.com","name":"naiadsystems.com","hostnames":["naiadsystems.com","hybridclient.naiadsystems.com","manifest-server.naiadsystems.com","nginxborder-server.naiadsystems.com","sea1b-ls.naiadsystems.com","dyn.naiadsystems.com","www.naiadsystems.com"]},{"id":"adaway_mzbcdn.net","name":"mzbcdn.net","hostnames":["mzbcdn.net"]},{"id":"adaway_myvisualiq.net","name":"Visual IQ","hostnames":["myvisualiq.net","q.myvisualiq.net","t.myvisualiq.net","vt.myvisualiq.net"],"link":"https://www.ghostery.com/whotracksme/trackers/visual_iq"},{"id":"adaway_myinstashot.com","name":"myinstashot.com","hostnames":["ad.myinstashot.com"]},{"id":"adaway_mydas.mobi","name":"mydas.mobi","hostnames":["mydas.mobi","cvt.mydas.mobi","ads.mp.mydas.mobi","androidsdk.ads.mp.mydas.mobi","www.ads.mp.mydas.mobi","bank01.ads.dt.mydas.mobi","bank02.ads.dt.mydas.mobi","bank03.ads.dt.mydas.mobi","bank04.ads.dt.mydas.mobi","bank05.ads.dt.mydas.mobi","bank06.ads.dt.mydas.mobi","bank07.ads.dt.mydas.mobi","bank08.ads.dt.mydas.mobi","bank09.ads.dt.mydas.mobi","bank10.ads.dt.mydas.mobi","bank11.ads.dt.mydas.mobi","bank12.ads.dt.mydas.mobi","bank13.ads.dt.mydas.mobi","bank15.ads.dt.mydas.mobi","bank16.ads.dt.mydas.mobi","bank17.ads.dt.mydas.mobi","bank18.ads.dt.mydas.mobi","bank19.ads.dt.mydas.mobi","bank20.ads.dt.mydas.mobi","bank01.ads.mp.mydas.mobi","bank02.ads.mp.mydas.mobi","bank03.ads.mp.mydas.mobi","bank04.ads.mp.mydas.mobi","bank05.ads.mp.mydas.mobi","bank06.ads.mp.mydas.mobi","bank07.ads.mp.mydas.mobi","bank08.ads.mp.mydas.mobi","bank09.ads.mp.mydas.mobi","bank10.ads.mp.mydas.mobi","bank11.ads.mp.mydas.mobi","bank12.ads.mp.mydas.mobi","bank13.ads.mp.mydas.mobi","bank15.ads.mp.mydas.mobi","bank16.ads.mp.mydas.mobi","bank17.ads.mp.mydas.mobi","bank18.ads.mp.mydas.mobi","bank19.ads.mp.mydas.mobi","bank20.ads.mp.mydas.mobi","aio.lp.mydas.mobi","golds.lp.mydas.mobi","lp.mp.mydas.mobi","lp.mydas.mobi","media.mydas.mobi","progressive.lp.mydas.mobi","suo.lp.mydas.mobi"]},{"id":"adaway_mybuys.com","name":"mybuys.com","hostnames":["mybuys.com"]},{"id":"adaway_mxmcdn.net","name":"mxmcdn.net","hostnames":["adv.mxmcdn.net"]},{"id":"adaway_mtvnservices.com","name":"mtvnservices.com","hostnames":["cdn-aka.ts.mtvnservices.com"]},{"id":"adaway_mtrcss.com","name":"mtrcss.com","hostnames":["mtrcss.com"]},{"id":"adaway_msstatic.com","name":"msstatic.com","hostnames":["sdkconf.msstatic.com"]},{"id":"adaway_msn.com","name":"msn.com","hostnames":["ads.msn.com","a.ads1.msn.com","b.ads1.msn.com","ads2.msn.com","a.ads2.msn.com","mobileads.msn.com","srtb.msn.com","rads.msn.com","blu.mobileads.msn.com","col.mobileads.msn.com","rmads.msn.com","dub.mobileads.msn.com","mobileleads.msn.com","live.rads.msn.com","b.ads2.msn.com"]},{"id":"adaway_msads.net","name":"msads.net","hostnames":["msads.net","a.global.msads.net","global.msads.net","ads1.msads.net","a.ads1.msads.net","a.ads2.msads.net","b.ads2.msads.net"]},{"id":"adaway_mrtnsvr.com","name":"mrtnsvr.com","hostnames":["ad.mrtnsvr.com"]},{"id":"adaway_mpnrs.com","name":"M. P. NEWMEDIA","hostnames":["mpnrs.com","www1.mpnrs.com"],"link":"https://www.ghostery.com/whotracksme/trackers/m._p._newmedia"},{"id":"adaway_moz.com","name":"moz.com","hostnames":["analytics.moz.com","mozbar.moz.com"]},{"id":"adaway_morgdm.ru","name":"morgdm.ru","hostnames":["morgdm.ru"]},{"id":"adaway_moonactive.net","name":"moonactive.net","hostnames":["vik-analytics.moonactive.net","vik-analytics-gke.moonactive.net"]},{"id":"adaway_monedata.io","name":"monedata.io","hostnames":["api.monedata.io"]},{"id":"adaway_moengage.com","name":"moengage.com","hostnames":["cdn.moengage.com","cfimage.moengage.com","ec.moengage.com","image.moengage.com","sdk-02.moengage.com","websdk.moengage.com"]},{"id":"adaway_mobtrks.com","name":"mobtrks.com","hostnames":["go.mobtrks.com"]},{"id":"adaway_mobsocmedia.com","name":"mobsocmedia.com","hostnames":["cdn.mobsocmedia.com"]},{"id":"adaway_mobivity.com","name":"mobivity.com","hostnames":["mobivity.com"]},{"id":"adaway_mobiuspace.net","name":"mobiuspace.net","hostnames":["ad.mobiuspace.net","creative-accelerate.ad.mobiuspace.net","api-ad-callback.mobiuspace.net","api.ad.mobiuspace.net"]},{"id":"adaway_mobitech-content.xyz","name":"mobitech-content.xyz","hostnames":["api.mobitech-content.xyz"]},{"id":"adaway_mobisla.com","name":"mobisla.com","hostnames":["mobisla.com","go.mobisla.com"]},{"id":"adaway_mobimagic.com","name":"mobimagic.com","hostnames":["mobimagic.com","a.mobimagic.com","l.a.mobimagic.com","pks.a.mobimagic.com","ul.a.mobimagic.com"]},{"id":"adaway_mobilityware.com","name":"mobilityware.com","hostnames":["apps.mobilityware.com","cross-promo.mwx.ext.mobilityware.com"]},{"id":"adaway_mobileposse.com","name":"mobileposse.com","hostnames":["mobileposse.com","boost.mobileposse.com","cricket.mobileposse.com","metropcs.mobileposse.com","mp5-wl.mobileposse.com","neptune.mobileposse.com"]},{"id":"adaway_mobilemonkey.com","name":"mobilemonkey.com","hostnames":["static.mobilemonkey.com"]},{"id":"adaway_mobilegamestats.com","name":"mobilegamestats.com","hostnames":["config.mobilegamestats.com"]},{"id":"adaway_mobilefuse.com","name":"mobilefuse.com","hostnames":["mobilefuse.com","mfx.mobilefuse.com","i.mobilefuse.com"]},{"id":"adaway_mobilecore.com","name":"mobilecore.com","hostnames":["mobilecore.com"]},{"id":"adaway_mobilebanner.ru","name":"mobilebanner.ru","hostnames":["mobilebanner.ru"]},{"id":"adaway_mobileapphelper.com","name":"mobileapphelper.com","hostnames":["analytics.lb.mobileapphelper.com"]},{"id":"adaway_mobileanjian.com","name":"mobileanjian.com","hostnames":["api.mobileanjian.com"]},{"id":"adaway_mobileadstrk.com","name":"mobileadstrk.com","hostnames":["avowtech.mobileadstrk.com"]},{"id":"adaway_mobify.net","name":"mobify.net","hostnames":["engagement-collector.mobify.net","online.mobify.net"]},{"id":"adaway_mobify.com","name":"Mobify","hostnames":["a.mobify.com","cdn.mobify.com"],"link":"https://www.ghostery.com/whotracksme/trackers/mobify"},{"id":"adaway_mobidia.com","name":"mobidia.com","hostnames":["narwhal.mobidia.com","wifi-test.mobidia.com"]},{"id":"adaway_mobagent.com","name":"mobagent.com","hostnames":["xmlserving.mobagent.com"]},{"id":"adaway_mobadvent.com","name":"mobadvent.com","hostnames":["ads.mobadvent.com","api.mobadvent.com","ds.mobadvent.com","et.mobadvent.com","ssp-api.mobadvent.com","tads.mobadvent.com"]},{"id":"adaway_mob.com","name":"Rekmob","hostnames":["applink.mob.com","api.applink.mob.com","d.mob.com","data.mob.com","c.data.mob.com","devs.data.mob.com","m.data.mob.com","df.mob.com","api.df.mob.com","exc.mob.com","api.exc.mob.com","gm.mob.com","f.gm.mob.com","l.gm.mob.com","guard.mob.com","sdk.guard.mob.com","mic.mob.com","aw.mic.mob.com","df.mic.mob.com","dfe.mic.mob.com","push.mob.com","sdk.push.mob.com","tcp.push.mob.com","k.tcp.push.mob.com","l.tcp.push.mob.com","share.mob.com","api.share.mob.com","sms.mob.com","init.sms.mob.com","verify.mob.com","api.verify.mob.com","adimg.rekmob.com","ads.rekmob.com","revmob.com","adconf.rqmob.com","adcs.rqmob.com","ap-adcs.rqmob.com","api.rqmob.com","appclick.rqmob.com","ascribe.rqmob.com","msdk.rqmob.com","static.rqmob.com","silvermob.com","jp.devs.data.mob.com","jp.f.gm.mob.com","jp.l.gm.mob.com","udp.push.mob.com","jp.api.share.mob.com"],"link":"https://www.ghostery.com/whotracksme/trackers/rekmob"},{"id":"adaway_moatpixel.com","name":"moatpixel.com","hostnames":["s.moatpixel.com","adtheorent107077183660.s.moatpixel.com","bayercaftdisplay369718976092.s.moatpixel.com","bayerusftdisplay331911571035.s.moatpixel.com","beeswaxdisplay108801632049.s.moatpixel.com","bloombergdfpcw4670778881.s.moatpixel.com","cbsdfp5832910442.s.moatpixel.com","churchdwightsizmek22033498.s.moatpixel.com","cpxiappnexusvpaidvideo235346.s.moatpixel.com","cpxigen865632366955.s.moatpixel.com","dailymotionjsvideo432290662219.s.moatpixel.com","dealerdotcomdisplay576919175878.s.moatpixel.com","exponential54894892.s.moatpixel.com","exponentialjsint8023749877114.s.moatpixel.com","financialtimesdfp415669142494.s.moatpixel.com","forbes274355.s.moatpixel.com","goodwaythetradedeskvideo910663478306.s.moatpixel.com","inskinmedia689754970364.s.moatpixel.com","kargodfpnew803390365855.s.moatpixel.com","kargovideojstag.s.moatpixel.com","kbbdfp963631743209.s.moatpixel.com","maxpointimpression857454451729.s.moatpixel.com","medscapedfp285029738901.s.moatpixel.com","nbcudisplay.s.moatpixel.com","nbcuvideo.s.moatpixel.com","openxdisplay970503469688.s.moatpixel.com","openxvideo114183407631.s.moatpixel.com","pgthetradedeskv275874568748.s.moatpixel.com","pgthetradedeskvideo910663478306.s.moatpixel.com","pgttdinnovidna5267443539015.s.moatpixel.com","quantcast584928381.s.moatpixel.com","quantcastvpaid04786010.s.moatpixel.com","rubiconproject883925.s.moatpixel.com","sparkusdiscoverdcm781744349491.s.moatpixel.com","stackadaptdisplay515602019759.s.moatpixel.com","teads245638586802.s.moatpixel.com","terminusdisplay296618589072.s.moatpixel.com","thetradedeskinnovidmaster582779829774.s.moatpixel.com","thetradedeskv275874568748.s.moatpixel.com","tubemogul154237275611.s.moatpixel.com","ubimoinappdisplay34181600889.s.moatpixel.com","voxcustomdfp152282307853.s.moatpixel.com","voxvidint960547728228.s.moatpixel.com","webmddfp936579382290.s.moatpixel.com","yellowhammerflashint188671193078.s.moatpixel.com","bloombergprebidheader853620778109.s.moatpixel.com","chaseusbs823221627973.s.moatpixel.com","reutersdfpcw319687550988.s.moatpixel.com","tubemogulvideoint58768396734.s.moatpixel.com"]},{"id":"adaway_moatads.com","name":"Moat","hostnames":["moatads.com","d3.moatads.com","dbg52463.moatads.com","dsa.moatads.com","obo.moatads.com","px2.moatads.com","px2m.moatads.com","s-jsonp.moatads.com","svastx.moatads.com","video.moatads.com","moatpixel.com","vastx.moatads.com","s.moatads.com"],"link":"https://www.ghostery.com/whotracksme/trackers/moat"},{"id":"adaway_mmaglobal.com","name":"mmaglobal.com","hostnames":["mmaglobal.com"]},{"id":"adaway_ml314.com","name":"Bombora","hostnames":["ml314.com","cdn.ml314.com","vi.ml314.com"],"link":"https://www.ghostery.com/whotracksme/trackers/bombora"},{"id":"adaway_mixadvert.com","name":"mixadvert.com","hostnames":["mixadvert.com","i.mixadvert.com","m.mixadvert.com"]},{"id":"adaway_miui.com","name":"miui.com","hostnames":["tracking.india.miui.com","sa.api.intl.miui.com","tracking.intl.miui.com","tracking.rus.miui.com","logupdate.avlyun.sec.miui.com","tracking.miui.com","fcanr.tracking.miui.com"]},{"id":"adaway_minutemediacdn.com","name":"minutemediacdn.com","hostnames":["assets.minutemediacdn.com","images2.minutemediacdn.com"]},{"id":"adaway_minute.ly","name":"minute.ly","hostnames":["apv-launcher.minute.ly","snippet.minute.ly"]},{"id":"adaway_mintegral.net","name":"mintegral.net","hostnames":["analytics-tcp.mintegral.net","pok.mintegral.net"]},{"id":"adaway_midosoo.com","name":"midosoo.com","hostnames":["client.midosoo.com"]},{"id":"adaway_microadinc.com","name":"microadinc.com","hostnames":["send.microadinc.com","cache.send.microadinc.com","s-rtb.send.microadinc.com","ssp.send.microadinc.com","cm.send.microadinc.com","d-track.send.microadinc.com"]},{"id":"adaway_microad.net","name":"MicroAd","hostnames":["microad.net","j.microad.net","jgl.microad.net","microad.co.jp","microad.jp","cdn.microad.jp","s-rtb.send.microad.jp","s-rtb-pb.send.microad.jp","ssp.send.microad.jp","universe.send.microad.jp","rtbtest.send.microad.jp","adf.send.microad.jp","adfp.send.microad.jp","aid.send.microad.jp","cache.send.microad.jp","cache.ssend.microad.jp","d-cache.microad.jp","d-track.send.microad.jp","image-vsc.microad.jp","msend.microad.jp","s-cm.send.microad.jp","s-cs.send.microad.jp","send.microad.jp","spvsc.send.microad.jp","ssend.microad.jp","vsc.send.microad.jp","d-cache.microadinc.com"],"link":"https://www.ghostery.com/whotracksme/trackers/microad"},{"id":"adaway_micpn.com","name":"micpn.com","hostnames":["micpn.com","assets.micpn.com"]},{"id":"adaway_miaozhen.com","name":"Miaozhen","hostnames":["miaozhen.com","ads.cn.miaozhen.com","pd.ads.cn.miaozhen.com","cm.cn.miaozhen.com","e.cn.miaozhen.com","g.cn.miaozhen.com","stm-cdn.cn.miaozhen.com","stm-collect.cn.miaozhen.com","xiaomi-mipdx.cn.miaozhen.com","monitor-tools.cn.miaozhen.com"],"link":"https://www.ghostery.com/whotracksme/trackers/miaozhen"},{"id":"adaway_mgsn.it","name":"mgsn.it","hostnames":["fi-analytics.mgsn.it"]},{"id":"adaway_mgid.com","name":"mgid.com","hostnames":["a.mgid.com","c.mgid.com","cdn.mgid.com","cm.mgid.com","jsc.mgid.com","mg.mgid.com","notify.mgid.com","prebid.mgid.com","s-img.mgid.com","servicer.mgid.com","video-native.mgid.com","widgets.mgid.com"]},{"id":"adaway_mgage.com","name":"mgage.com","hostnames":["mgage.com","push.mgage.com"]},{"id":"adaway_mfadsrvr.com","name":"mfadsrvr.com","hostnames":["rtb.mfadsrvr.com","rtb-use.mfadsrvr.com","rtb-usw.mfadsrvr.com"]},{"id":"adaway_metrix.ir","name":"metrix.ir","hostnames":["analytics.metrix.ir"]},{"id":"adaway_metrilo.com","name":"metrilo.com","hostnames":["metrilo.com","p.metrilo.com","shoparty.metrilo.com","t.metrilo.com"]},{"id":"adaway_metaps.com","name":"metaps.com","hostnames":["api-analytics.metaps.com","api-analytics-bootstrap.metaps.com"]},{"id":"adaway_metalocator.com","name":"metalocator.com","hostnames":["analytics.metalocator.com","cdn.metalocator.com","code.metalocator.com"]},{"id":"adaway_memob.com","name":"memob.com","hostnames":["ads.memob.com","creatives.ads.memob.com"]},{"id":"adaway_meltwater.com","name":"meltwater.com","hostnames":["app.meltwater.com"]},{"id":"adaway_mellowads.com","name":"mellowads.com","hostnames":["banners.mellowads.com"]},{"id":"adaway_megacool.co","name":"megacool.co","hostnames":["api.megacool.co"]},{"id":"adaway_medio.com","name":"medio.com","hostnames":["medio.com"]},{"id":"adaway_medietall.no","name":"medietall.no","hostnames":["log.medietall.no"]},{"id":"adaway_mediawayss.com","name":"mediawayss.com","hostnames":["mediawayss.com","ad.mediawayss.com"]},{"id":"adaway_mediav.com","name":"MediaV","hostnames":["mediav.com","show.3.mediav.com","360fenxi.mediav.com","3m.mediav.com","api-ext.mediav.com","cjhd.mediav.com","ckmap.mediav.com","cm.mediav.com","show.g.mediav.com","g1max.mediav.com","g1xd.mediav.com","guess.mediav.com","imgx.mediav.com","material.mediav.com","material-ssl.mediav.com","max-l.mediav.com","s3m.mediav.com","sdk.mediav.com","secure.mediav.com","show-3.mediav.com","show-f.mediav.com","show-g.mediav.com","show-m.mediav.com","ssxd.mediav.com","static-ssl.mediav.com","xdssp.mediav.com","static.mediav.com"],"link":"https://www.ghostery.com/whotracksme/trackers/mediav"},{"id":"adaway_mediatek.com","name":"mediatek.com","hostnames":["lepodownload.mediatek.com"]},{"id":"adaway_mediasmart.es","name":"mediasmart.es","hostnames":["ads.mediasmart.es"]},{"id":"adaway_mediamelon.com","name":"mediamelon.com","hostnames":["beacons.mediamelon.com"]},{"id":"adaway_medialytics.com","name":"medialytics.com","hostnames":["medialytics.com","s-cdn-tag.medialytics.com"]},{"id":"adaway_mediaiqdigital.com","name":"mediaiqdigital.com","hostnames":["mediaiqdigital.com","pixel.mediaiqdigital.com"]},{"id":"adaway_mediaforge.com","name":"Rakuten Display","hostnames":["mediaforge.com","consent.mediaforge.com","jp-tags.mediaforge.com","stats.mediaforge.com","tags.mediaforge.com","ads.mediaforge.com","intljs.rmtag.com"],"link":"https://www.ghostery.com/whotracksme/trackers/rakuten_display"},{"id":"adaway_media-412.com","name":"media-412.com","hostnames":["tarsan.media-412.com"]},{"id":"adaway_measurementapi.com","name":"measurementapi.com","hostnames":["measurementapi.com"]},{"id":"adaway_measurelib.com","name":"measurelib.com","hostnames":["mobile.measurelib.com"]},{"id":"adaway_measuread.com","name":"measuread.com","hostnames":["measuread.com","b.measuread.com"]},{"id":"adaway_mdrctr.com","name":"mdrctr.com","hostnames":["track.mdrctr.com"]},{"id":"adaway_mdpcdn.com","name":"mdpcdn.com","hostnames":["karma.mdpcdn.com"]},{"id":"adaway_mdhv.io","name":"mdhv.io","hostnames":["jelly.mdhv.io"]},{"id":"adaway_mczbf.com","name":"mczbf.com","hostnames":["www.mczbf.com"]},{"id":"adaway_maxonclick.com","name":"maxonclick.com","hostnames":["maxonclick.com","www.maxonclick.com"]},{"id":"adaway_matomy.com","name":"matomy.com","hostnames":["matomy.com"]},{"id":"adaway_mathtag.com","name":"MediaMath","hostnames":["mathtag.com","mathid.mathtag.com","pixel.mathtag.com","pixel-origin.mathtag.com","pixel-s2s.mathtag.com","sync.mathtag.com","tags.mathtag.com","u3s.mathtag.com","vast.mathtag.com","vast-pop-pao.mathtag.com","video-assets.mathtag.com","vast-test.mathtag.com","action.mathtag.com","emea-bidder.mathtag.com","creative.mathads.com"],"link":"https://www.ghostery.com/whotracksme/trackers/mediamath"},{"id":"adaway_matheranalytics.com","name":"Mather Analytics","hostnames":["matheranalytics.com","app.matheranalytics.com","i.matheranalytics.com","js.matheranalytics.com","cdn.matheranalytics.com","www.i.matheranalytics.com"],"link":"https://www.ghostery.com/whotracksme/trackers/mather_analytics"},{"id":"adaway_mastermind.com","name":"mastermind.com","hostnames":["mastermind.com"]},{"id":"adaway_masoffer.net","name":"masoffer.net","hostnames":["static.masoffer.net"]},{"id":"adaway_maropost.com","name":"maropost.com","hostnames":["api.maropost.com","cdn.maropost.com","content.maropost.com","img.maropost.com"]},{"id":"adaway_marketingcloudapis.com","name":"marketingcloudapis.com","hostnames":["device.marketingcloudapis.com","mc-kzgvx04-jk8n38gyn7s08m1d8.device.marketingcloudapis.com","mcf4wh-jdfmxrzzzttwqcrf-d3b4.device.marketingcloudapis.com","mcvsb5ngty4dzxx8jp80yt3q5614.device.marketingcloudapis.com","mcy8q-n2f8ttyv729bcg5v83dsp4.device.marketingcloudapis.com","mcgthfrqrs95vdbzkhtchf5fc0g4.device.marketingcloudapis.com","mctd22d-xfy4kdg18w8cmd9bvhsq.device.marketingcloudapis.com"]},{"id":"adaway_marketgid.com","name":"MarketGid","hostnames":["marketgid.com","jsc.marketgid.com","mgid.com","a.marketgid.com","autocounter.marketgid.com","c.marketgid.com","cdn.marketgid.com","counter.marketgid.com","mg.marketgid.com","imgn.marketgid.com","jsn.marketgid.com","img.marketgid.com","imgg.marketgid.com","mg.dt00.net","imgn.dt00.net","img.dt00.net","nbimg.dt00.net","jsn.dt00.net","imgg.dt00.net","jsg.dt07.net","imgg.dt07.net","counter.dt07.net","jsc.dt07.net","jsn.dt07.net","api.mgid.com","imggprx.mgid.com","www.mgid.com","rtbproxy.mgid.com","jsu.mgid.com","jsn.mgid.com","imgg.mgid.com"],"link":"https://www.ghostery.com/whotracksme/trackers/marketgid"},{"id":"adaway_marinsm.com","name":"Marin Search Marketer","hostnames":["marinsm.com","pro.marinsm.com","tag.marinsm.com","tracker.marinsm.com","t3.marinsm.com"],"link":"https://www.ghostery.com/whotracksme/trackers/marin_search_marketer"},{"id":"adaway_marfeelrev.com","name":"marfeelrev.com","hostnames":["mbid.marfeelrev.com"]},{"id":"adaway_marfeelcdn.com","name":"marfeelcdn.com","hostnames":["alexandria.marfeelcdn.com"]},{"id":"adaway_marfeel.com","name":"marfeel.com","hostnames":["marfeel.com","bc.marfeel.com","cosmos.marfeel.com"]},{"id":"adaway_manychat.com","name":"manychat.com","hostnames":["widget.manychat.com"]},{"id":"adaway_mantisadnetwork.com","name":"mantisadnetwork.com","hostnames":["assets.mantisadnetwork.com","ecs.mantisadnetwork.com","resizer.mantisadnetwork.com"]},{"id":"adaway_malwarebytes.com","name":"malwarebytes.com","hostnames":["telemetry.malwarebytes.com"]},{"id":"adaway_mainadv.com","name":"mainADV","hostnames":["mainadv.com","www.mainadv.com"],"link":"https://www.ghostery.com/whotracksme/trackers/mainadv"},{"id":"adaway_mailmunch.co","name":"mailmunch.co","hostnames":["analytics.mailmunch.co"]},{"id":"adaway_mail.ru","name":"Mail.Ru Banner Network","hostnames":["ad.mail.ru","top-fwz1.mail.ru"],"link":"https://www.ghostery.com/whotracksme/trackers/mail.ru_banner"},{"id":"adaway_magmamobile.com","name":"magmamobile.com","hostnames":["api.magmamobile.com"]},{"id":"adaway_madkudu.com","name":"madkudu.com","hostnames":["api.madkudu.com","cdn.madkudu.com"]},{"id":"adaway_macromill.com","name":"macromill.com","hostnames":["macromill.com","img.macromill.com"]},{"id":"adaway_m2appmonitor.com","name":"m2appmonitor.com","hostnames":["ingest.m2appmonitor.com"]},{"id":"adaway_luminati.io","name":"luminati.io","hostnames":["clientsdk.luminati.io"]},{"id":"adaway_lululemon.com","name":"lululemon.com","hostnames":["smetrics.lululemon.com"]},{"id":"adaway_lsosad.com","name":"lsosad.com","hostnames":["adx.lsosad.com","conf.lsosad.com","dc.lsosad.com"]},{"id":"adaway_lp4.io","name":"Linkpulse","hostnames":["lp4.io","pp.lp4.io"],"link":"https://www.ghostery.com/whotracksme/trackers/linkpulse"},{"id":"adaway_loveota.net","name":"loveota.net","hostnames":["sdk.loveota.net"]},{"id":"adaway_lovelydrum.com","name":"lovelydrum.com","hostnames":["lovelydrum.com"]},{"id":"adaway_loopme.me","name":"loopme.me","hostnames":["loopme.me","csync.loopme.me","i.loopme.me","m.loopme.me","track.loopme.me"]},{"id":"adaway_lookbookhq.com","name":"lookbookhq.com","hostnames":["app.cdn.lookbookhq.com"]},{"id":"adaway_logsss.com","name":"logsss.com","hostnames":["analytics.logsss.com","glsdk.logsss.com","ma.logsss.com","s.logsss.com","slapi-bts.logsss.com"]},{"id":"adaway_logrocket.io","name":"logrocket.io","hostnames":["cdn.logrocket.io"]},{"id":"adaway_logrocket.com","name":"logrocket.com","hostnames":["cdn.logrocket.com"]},{"id":"adaway_logentries.com","name":"logentries.com","hostnames":["api.logentries.com","data.logentries.com","js.logentries.com","webhook.logentries.com"]},{"id":"adaway_locationlabs.com","name":"locationlabs.com","hostnames":["sparkle.locationlabs.com"]},{"id":"adaway_locately.com","name":"locately.com","hostnames":["api.locately.com"]},{"id":"adaway_localytics.com","name":"Localytics","hostnames":["localytics.com","53.localytics.com","api.53.localytics.com","manifest.53.localytics.com","profile-api-prod-elb.53.localytics.com","queuer-prod-elb.53.localytics.com","web.53.localytics.com","api.localytics.com","web.localytics.com","www.localytics.com","profile-lookup.services.53.localytics.com"],"link":"https://www.ghostery.com/whotracksme/trackers/localytics"},{"id":"adaway_localstars.com","name":"localstars.com","hostnames":["merciless.localstars.com","adserver.merciless.localstars.com"]},{"id":"adaway_locallogic.co","name":"locallogic.co","hostnames":["analytics.locallogic.co","api.locallogic.co","cdn.locallogic.co","static.locallogic.co"]},{"id":"adaway_llnwd.net","name":"llnwd.net","hostnames":["appnext.hs.llnwd.net","tealium.hs.llnwd.net"]},{"id":"adaway_livesegmentservice.com","name":"livesegmentservice.com","hostnames":["sds.livesegmentservice.com"]},{"id":"adaway_liveperson.net","name":"liveperson.net","hostnames":["server.iad.liveperson.net","lptag.liveperson.net"]},{"id":"adaway_live-video.net","name":"live-video.net","hostnames":["player.stats.live-video.net"]},{"id":"adaway_listhub.net","name":"listhub.net","hostnames":["tracking.listhub.net"]},{"id":"adaway_lionmobi.com","name":"lionmobi.com","hostnames":["ad.lionmobi.com","analysis.lionmobi.com","battery.lionmobi.com","param.lionmobi.com","parameter.lionmobi.com","updater.lionmobi.com"]},{"id":"adaway_linkedin.com","name":"LinkedIn Ads","hostnames":["ads.linkedin.com","px.ads.linkedin.com","dc.ads.linkedin.com","us-east-1.dc.ads.linkedin.com","px4.ads.linkedin.com","p.adsymptotic.com","cdn.linkedin.oribi.io","gw.linkedin.oribi.io","sjs.bizographics.com"],"link":"https://www.ghostery.com/whotracksme/trackers/linkedin_ads"},{"id":"adaway_liftoff.io","name":"liftoff.io","hostnames":["adexp.liftoff.io","build-cdn.liftoff.io","cdn.liftoff.io","click.liftoff.io","impression-asia.liftoff.io","impression-east.liftoff.io","impression-europe.liftoff.io"]},{"id":"adaway_licdn.com","name":"LinkedIn Analytics","hostnames":["snap.licdn.com"],"link":"https://www.ghostery.com/whotracksme/trackers/linkedin_analytics"},{"id":"adaway_lgtvcommon.com","name":"lgtvcommon.com","hostnames":["aic.cdpbeacon.lgtvcommon.com"]},{"id":"adaway_lgsmartad.com","name":"lgsmartad.com","hostnames":["lgsmartad.com","us.info.lgsmartad.com"]},{"id":"adaway_lg.com","name":"lg.com","hostnames":["tracking.lg.com"]},{"id":"adaway_lfengmobile.com","name":"lfengmobile.com","hostnames":["agnes.scloud.lfengmobile.com","push.scloud.lfengmobile.com"]},{"id":"adaway_letv.com","name":"letv.com","hostnames":["ark.letv.com","g3.letv.com","api.hdtv.letv.com","api.itv.letv.com","api.platform.letv.com"]},{"id":"adaway_lentainform.com","name":"lentainform.com","hostnames":["lentainform.com","cm.lentainform.com","s-img.lentainform.com","servicer.lentainform.com","c.lentainform.com","cdn.lentainform.com","clck.lentainform.com"]},{"id":"adaway_lemonpi.io","name":"lemonpi.io","hostnames":["log.lemonpi.io"]},{"id":"adaway_leanlab.co","name":"leanlab.co","hostnames":["track.leanlab.co"]},{"id":"adaway_leads.su","name":"leads.su","hostnames":["leads.su"]},{"id":"adaway_leadpages.net","name":"leadpages.net","hostnames":["static.leadpages.net"]},{"id":"adaway_leadpages.io","name":"leadpages.io","hostnames":["api.leadpages.io"]},{"id":"adaway_leadlander.com","name":"leadlander.com","hostnames":["tracking.leadlander.com"]},{"id":"adaway_leadfeeder.com","name":"leadfeeder.com","hostnames":["lftracker.leadfeeder.com"]},{"id":"adaway_leadboxer.com","name":"leadboxer.com","hostnames":["kibana.leadboxer.com","log.leadboxer.com","script.leadboxer.com"]},{"id":"adaway_leadboltapps.net","name":"leadboltapps.net","hostnames":["leadboltapps.net","ad.leadboltapps.net"]},{"id":"adaway_leadbolt.net","name":"leadbolt.net","hostnames":["leadbolt.net","ad.leadbolt.net"]},{"id":"adaway_ldplayer.net","name":"ldplayer.net","hostnames":["advertise.ldplayer.net"]},{"id":"adaway_ldmnq.com","name":"ldmnq.com","hostnames":["storeen.ldmnq.com"]},{"id":"adaway_lbesecapi.com","name":"lbesecapi.com","hostnames":["events.lbesecapi.com"]},{"id":"adaway_lbesec.com","name":"lbesec.com","hostnames":["cc.lbesec.com"]},{"id":"adaway_lavanetwork.net","name":"lavanetwork.net","hostnames":["lavanetwork.net","delivery.lavanetwork.net","libs.lavanetwork.net","pub.lavanetwork.net","ad.lavanetwork.net","admin.lavanetwork.net","banner.lavanetwork.net","creatives.lavanetwork.net","delivery1.lavanetwork.net","img.lavanetwork.net","revive.lavanetwork.net","video.lavanetwork.net","www.lavanetwork.net"]},{"id":"adaway_kuyun.com","name":"kuyun.com","hostnames":["ask.log.kuyun.com"]},{"id":"adaway_kuwo.cn","name":"kuwo.cn","hostnames":["log.kuwo.cn","wa.kuwo.cn"]},{"id":"adaway_kumulos.com","name":"kumulos.com","hostnames":["events.kumulos.com","stats.kumulos.com"]},{"id":"adaway_ktplay.com","name":"ktplay.com","hostnames":["dataapi.ktplay.com","track.ktplay.com"]},{"id":"adaway_kt.com","name":"kt.com","hostnames":["freesam.kt.com","ilb.pns.kt.com"]},{"id":"adaway_koowo.com","name":"koowo.com","hostnames":["g.koowo.com"]},{"id":"adaway_kookong.com","name":"kookong.com","hostnames":["sdkapi.kookong.com"]},{"id":"adaway_kongregate.io","name":"kongregate.io","hostnames":["analytics.kongregate.io"]},{"id":"adaway_koneomobiledsp.com","name":"koneomobiledsp.com","hostnames":["koneomobiledsp.com","inmobi.koneomobiledsp.com","us.inmobi.koneomobiledsp.com","js.koneomobiledsp.com","eu.inmobi.koneomobiledsp.com","sg.inmobi.koneomobiledsp.com"]},{"id":"adaway_kochava.com","name":"kochava.com","hostnames":["kochava.com","api.kochava.com","token.api.kochava.com","assets.kochava.com","entitlements.kochava.com","icm.kochava.com"]},{"id":"adaway_knlob.com","name":"knlob.com","hostnames":["track.knlob.com"]},{"id":"adaway_kmsmep.com","name":"kmsmep.com","hostnames":["brand-sdk.kmsmep.com","brands.kmsmep.com","metrics.kmsmep.com"]},{"id":"adaway_klclick1.com","name":"klclick1.com","hostnames":["trk.klclick1.com"]},{"id":"adaway_klaviyo.com","name":"Klaviyo","hostnames":["a.klaviyo.com","fast.a.klaviyo.com","static.klaviyo.com","telemetrics.klaviyo.com","static-tracking.klaviyo.com"],"link":"https://www.ghostery.com/whotracksme/trackers/klaviyo"},{"id":"adaway_kiosked.com","name":"Kiosked","hostnames":["kiosked.com","widgets.kiosked.com","resources.kiosked.com","events.kiosked.com","scripts.kiosked.com"],"link":"https://www.ghostery.com/whotracksme/trackers/kiosked"},{"id":"adaway_kingsoft.com","name":"kingsoft.com","hostnames":["counter.kingsoft.com"]},{"id":"adaway_kingsoft-office-service.com","name":"kingsoft-office-service.com","hostnames":["abroad-ad.kingsoft-office-service.com","cloudservice14.kingsoft-office-service.com","cloudservice24.kingsoft-office-service.com"]},{"id":"adaway_kik.com","name":"kik.com","hostnames":["clientmetrics.kik.com","clientmetrics-augmentum.kik.com"]},{"id":"adaway_kidoz.net","name":"kidoz.net","hostnames":["analytics.kidoz.net"]},{"id":"adaway_kejet.net","name":"kejet.net","hostnames":["kejet.net"]},{"id":"adaway_kampyle.com","name":"kampyle.com","hostnames":["kampyle.com","api-usent.kampyle.com","assets.kampyle.com","cdn-prod.kampyle.com","cdn-usent.kampyle.com","cooladata.kampyle.com","mobilesdk-us.kampyle.com","nebula-cdn.kampyle.com","udc-neb.kampyle.com","screencaptue-cdn.kampyle.com","screencapture.kampyle.com","cf.kampyle.com"]},{"id":"adaway_kaltura.com","name":"kaltura.com","hostnames":["analytics.kaltura.com"]},{"id":"adaway_kaffnet.com","name":"kaffnet.com","hostnames":["kaffnet.com","adapter.kaffnet.com","ad.adapter.kaffnet.com","api.kaffnet.com","ad.api.kaffnet.com","data.api.kaffnet.com","sdk.api.kaffnet.com"]},{"id":"adaway_jwplayer.com","name":"jwplayer.com","hostnames":["entitlements.jwplayer.com"]},{"id":"adaway_justwatch.com","name":"justwatch.com","hostnames":["sentry.justwatch.com"]},{"id":"adaway_justuno.com","name":"justuno.com","hostnames":["cdn.justuno.com"]},{"id":"adaway_jumboprivacy.com","name":"jumboprivacy.com","hostnames":["analytics.jumboprivacy.com"]},{"id":"adaway_juiceadv.com","name":"JuiceADV","hostnames":["juiceadv.com","www.juiceadv.com","srv.juiceadv.com"],"link":"https://www.ghostery.com/whotracksme/trackers/juiceadv"},{"id":"adaway_jst.ai","name":"jst.ai","hostnames":["cdn.jst.ai"]},{"id":"adaway_jpush.io","name":"jpush.io","hostnames":["sis.jpush.io"]},{"id":"adaway_jpush.cn","name":"jpush.cn","hostnames":["im64.jpush.cn","s.jpush.cn","stats.jpush.cn"]},{"id":"adaway_jorte.com","name":"jorte.com","hostnames":["ad.jorte.com"]},{"id":"adaway_jiguang.cn","name":"jiguang.cn","hostnames":["ad.jiguang.cn","im.jiguang.cn","sdk.im.jiguang.cn","sdk.jiguang.cn","update.sdk.jiguang.cn","verification.jiguang.cn","sdk.verification.jiguang.cn","res-push.ad.jiguang.cn"]},{"id":"adaway_jeeng.com","name":"Jeeng Widgets","hostnames":["api.jeeng.com","users.api.jeeng.com","sdk.jeeng.com","telemetries.jeeng.com"],"link":"https://www.ghostery.com/whotracksme/trackers/jeeng_widgets"},{"id":"adaway_jampp.com","name":"jampp.com","hostnames":["jampp.com","cdn.jampp.com","imgx.jampp.com","imp-lb-us2.jampp.com","static.jampp.com"]},{"id":"adaway_ja2n2u30a6rgyd.com","name":"ja2n2u30a6rgyd.com","hostnames":["ja2n2u30a6rgyd.com"]},{"id":"adaway_izooto.com","name":"iZooto","hostnames":["cdn.izooto.com","cdnimg.izooto.com","err.izooto.com"],"link":"https://www.ghostery.com/whotracksme/trackers/izooto"},{"id":"adaway_ivymobile.com","name":"ivymobile.com","hostnames":["api.ivymobile.com"]},{"id":"adaway_itracker360.com","name":"itracker360.com","hostnames":["ip.itracker360.com"]},{"id":"adaway_itim.vn","name":"itim.vn","hostnames":["itim.vn","spell.itim.vn"]},{"id":"adaway_iteratehq.com","name":"iteratehq.com","hostnames":["iteratehq.com","platform.iteratehq.com"]},{"id":"adaway_iterable.com","name":"iterable.com","hostnames":["api.iterable.com","assets.iterable.com","static.iterable.com"]},{"id":"adaway_ispot.tv","name":"iSpot.tv","hostnames":["ispot.tv","pi.ispot.tv","pt.ispot.tv"],"link":"https://www.ghostery.com/whotracksme/trackers/ispot.tv"},{"id":"adaway_isnssdk.com","name":"isnssdk.com","hostnames":["dm.isnssdk.com","h5.isnssdk.com","hotapi-va.isnssdk.com","i.isnssdk.com","i16-tb.isnssdk.com","ichannel.isnssdk.com","log.isnssdk.com","log-tb.isnssdk.com","mon.isnssdk.com","open.isnssdk.com","pangolin16.isnssdk.com","tnc16-alisg.isnssdk.com","tnc16-useast1a.isnssdk.com"]},{"id":"adaway_irs01.com","name":"irs01.com","hostnames":["irs01.com","m.irs01.com","v.irs01.com","z.irs01.com"]},{"id":"adaway_irr.ru","name":"irr.ru","hostnames":["irr.ru"]},{"id":"adaway_irquest.com","name":"irquest.com","hostnames":["iam-agof-app.irquest.com"]},{"id":"adaway_ironsrc.mobi","name":"ironsrc.mobi","hostnames":["logs.ironsrc.mobi"]},{"id":"adaway_iris.tv","name":"iris.tv","hostnames":["iris.tv","context.iris.tv","ovp.iris.tv","api.iris.tv"]},{"id":"adaway_iqzone.com","name":"iqzone.com","hostnames":["iqzone.com","pssvc.iqzone.com"]},{"id":"adaway_ipstack.com","name":"ipstack.com","hostnames":["api.ipstack.com"]},{"id":"adaway_iponweb.net","name":"iponweb.net","hostnames":["fastg8.pool.iponweb.net"]},{"id":"adaway_ipinyou.com","name":"ipinyou.com","hostnames":["ipinyou.com","cm.ipinyou.com","fm.ipinyou.com","fms.ipinyou.com","stats.ipinyou.com","vt.ipinyou.com"]},{"id":"adaway_iperceptions.com","name":"iperceptions.com","hostnames":["api.iperceptions.com","collect.iperceptions.com","ips-img.iperceptions.com","post.iperceptions.com","sd.iperceptions.com","universal.iperceptions.com"]},{"id":"adaway_iosappsworld.com","name":"iosappsworld.com","hostnames":["ads.iosappsworld.com"]},{"id":"adaway_invocacdn.com","name":"invocacdn.com","hostnames":["invocacdn.com","solutions.invocacdn.com"]},{"id":"adaway_invoca.net","name":"invoca.net","hostnames":["invoca.net","pnapi.invoca.net"]},{"id":"adaway_intuit.com","name":"intuit.com","hostnames":["logging.api.intuit.com","monitoring-sdk.experimentation.intuit.com"]},{"id":"adaway_intowow.com","name":"intowow.com","hostnames":["intowow.com","adcfg.intowow.com","geoinfo.intowow.com"]},{"id":"adaway_intermarkets.net","name":"Intermarkets","hostnames":["intermarkets.net","cdn.intermarkets.net"],"link":"https://www.ghostery.com/whotracksme/trackers/intermarkets.net"},{"id":"adaway_intergient.com","name":"intergient.com","hostnames":["cdn.intergient.com"]},{"id":"adaway_intergi.com","name":"intergi.com","hostnames":["cdn.intergi.com"]},{"id":"adaway_intentarget.com","name":"intentarget.com","hostnames":["static.intentarget.com"]},{"id":"adaway_intellimize.co","name":"intellimize.co","hostnames":["api.intellimize.co","log.intellimize.co"]},{"id":"adaway_integromat.com","name":"integromat.com","hostnames":["hook.integromat.com"]},{"id":"adaway_instana.io","name":"instana.io","hostnames":["eum-orange-saas.instana.io"]},{"id":"adaway_insigit.com","name":"insigit.com","hostnames":["cdn.insigit.com"]},{"id":"adaway_insightexpressai.com","name":"InsightExpress","hostnames":["insightexpressai.com","secure.insightexpressai.com","surveys.insightexpressai.com","ad.insightexpressai.com","icompass.insightexpressai.com","core.insightexpressai.com"],"link":"https://www.ghostery.com/whotracksme/trackers/insightexpress"},{"id":"adaway_inshorts.com","name":"inshorts.com","hostnames":["analytics-events.inshorts.com"]},{"id":"adaway_innovid.com","name":"Innovid","hostnames":["innovid.com","ag.innovid.com","dts.innovid.com","rtr.innovid.com","s.innovid.com","s-a.innovid.com","s-cdn.innovid.com","s-files.innovid.com","s-static.innovid.com","s-video.innovid.com","service.innovid.com","static.innovid.com","cdn.innovid.com"],"link":"https://www.ghostery.com/whotracksme/trackers/innovid"},{"id":"adaway_innity.net","name":"Innity","hostnames":["innity.net","avd.innity.net","cdn.innity.net","media.innity.net","vcdn.media.innity.net","ssl-avd.innity.net","innity.com","as.innity.com","avd.innity.com","avn.innity.com","avp.innity.com","cast.innity.com","optimize.innity.com","ps.innity.com"],"link":"https://www.ghostery.com/whotracksme/trackers/innity"},{"id":"adaway_innertrends.com","name":"innertrends.com","hostnames":["babel.innertrends.com","io.innertrends.com"]},{"id":"adaway_inner-active.mobi","name":"inner-active.mobi","hostnames":["inner-active.mobi","cdn2.inner-active.mobi","event.inner-active.mobi","event-staging.inner-active.mobi","m2m1.inner-active.mobi","sdk-events.inner-active.mobi","vast-events.inner-active.mobi","vast-events-staging.inner-active.mobi","wv.inner-active.mobi","ad-tag.inner-active.mobi","client-events.inner-active.mobi"]},{"id":"adaway_inmarket.com","name":"inmarket.com","hostnames":["cdn-engagement.inmarket.com","engagement.inmarket.com"]},{"id":"adaway_inlcorp.com","name":"inlcorp.com","hostnames":["adapi.inlcorp.com"]},{"id":"adaway_inhousedsp.com","name":"inhousedsp.com","hostnames":["inhousedsp.com","content.inhousedsp.com"]},{"id":"adaway_informatm.com","name":"informatm.com","hostnames":["images.informatm.com"]},{"id":"adaway_influenster.com","name":"influenster.com","hostnames":["image.influenster.com"]},{"id":"adaway_influencemobile.com","name":"influencemobile.com","hostnames":["engage-network.influencemobile.com","events.influencemobile.com","messaging.influencemobile.com","targeting.influencemobile.com"]},{"id":"adaway_indicative.com","name":"indicative.com","hostnames":["api.indicative.com","cdn.indicative.com"]},{"id":"adaway_indiatimes.com","name":"indiatimes.com","hostnames":["mobileads.indiatimes.com"]},{"id":"adaway_in25app.com","name":"in25app.com","hostnames":["trk.in25app.com"]},{"id":"adaway_imtwjwoasak.com","name":"imtwjwoasak.com","hostnames":["imtwjwoasak.com"]},{"id":"adaway_impression.link","name":"impression.link","hostnames":["impression.link"]},{"id":"adaway_impactradius.com","name":"impactradius.com","hostnames":["ct.impactradius.com","linkto-ext-hp-com.ct.impactradius.com","customtraffic.impactradius.com","goto-target-com.customtraffic.impactradius.com","partners-hotwire-com.impactradius.com"]},{"id":"adaway_impactradius-event.com","name":"impactradius-event.com","hostnames":["d.impactradius-event.com"]},{"id":"adaway_immomo.com","name":"immomo.com","hostnames":["api.immomo.com","live-api.immomo.com","paas-push-api.immomo.com","paas-push-api-log.immomo.com"]},{"id":"adaway_immobilienscout24.de","name":"immobilienscout24.de","hostnames":["tracking.immobilienscout24.de"]},{"id":"adaway_imimobile.com","name":"imimobile.com","hostnames":["imimobile.com"]},{"id":"adaway_imhd.io","name":"imhd.io","hostnames":["cdn.imhd.io"]},{"id":"adaway_imguol.com","name":"imguol.com","hostnames":["e.imguol.com"]},{"id":"adaway_imgix.net","name":"imgix.net","hostnames":["amplify-com-mktg.imgix.net","marketingweek.imgix.net","moengagewebsdk.imgix.net"]},{"id":"adaway_imaginationunwired.com","name":"imaginationunwired.com","hostnames":["sdkv2.imaginationunwired.com"]},{"id":"adaway_ilyf4amifh.com","name":"ilyf4amifh.com","hostnames":["ilyf4amifh.com"]},{"id":"adaway_ijinshan.com","name":"ijinshan.com","hostnames":["dcys.ijinshan.com","zj.dcys.ijinshan.com","cntj.zj.dcys.ijinshan.com","did.ijinshan.com","cmplay.did.ijinshan.com","dl.ijinshan.com","kpns.ijinshan.com","mobad.ijinshan.com","sj.ijinshan.com","dl.sj.ijinshan.com","tj.ijinshan.com","lb3d.tj.ijinshan.com","lbdata.tj.ijinshan.com","utag.ijinshan.com","db.utag.ijinshan.com","kbd1.kpns.ijinshan.com","pc.mobad.ijinshan.com","sdk.mobad.ijinshan.com"]},{"id":"adaway_ihsmarkit.com","name":"ihsmarkit.com","hostnames":["wass.ihsmarkit.com"]},{"id":"adaway_iheart.com","name":"iheart.com","hostnames":["us-events.api.iheart.com","smy.iheart.com"]},{"id":"adaway_igodigital.com","name":"igodigital.com","hostnames":["collect.igodigital.com","100016075.collect.igodigital.com","10870841.collect.igodigital.com","7227272.collect.igodigital.com","stack9.collect.igodigital.com","nova.collect.igodigital.com","stack7.collect.igodigital.com"]},{"id":"adaway_igexin.com","name":"igexin.com","hostnames":["inc2.igexin.com","open.inc2.igexin.com","sdk.open.inc2.igexin.com","open.phone.igexin.com","sdk.open.phone.igexin.com","talk.igexin.com","open.talk.igexin.com","sdk.open.talk.igexin.com"]},{"id":"adaway_igetget.com","name":"igetget.com","hostnames":["entree.igetget.com","piccdn.igetget.com","seeder.igetget.com"]},{"id":"adaway_ifood.tv","name":"ifood.tv","hostnames":["adlog.ifood.tv","log.ifood.tv"]},{"id":"adaway_idreams.pl","name":"idreams.pl","hostnames":["server.idreams.pl"]},{"id":"adaway_idio.co","name":"Idio","hostnames":["a.idio.co","api.idio.co","i.idio.co","js.idio.co","s.idio.co","sales.idio.co","ssl-s.idio.co"],"link":"https://www.ghostery.com/whotracksme/trackers/idio"},{"id":"adaway_id5-sync.com","name":"ID5 Sync","hostnames":["id5-sync.com","cdn.id5-sync.com","lb.eu-1-id5-sync.com"],"link":"https://www.ghostery.com/whotracksme/trackers/id5_sync"},{"id":"adaway_id1.cn","name":"id1.cn","hostnames":["id1.cn"]},{"id":"adaway_icloud.com","name":"icloud.com","hostnames":["metrics.icloud.com"]},{"id":"adaway_icloseli.com","name":"icloseli.com","hostnames":["ads.icloseli.com"]},{"id":"adaway_ibmcloud.com","name":"Tealeaf","hostnames":["planning-analytics.ibmcloud.com","tealeaf.ibmcloud.com","collector.tealeaf.ibmcloud.com","uscollector.tealeaf.ibmcloud.com"],"link":"https://www.ghostery.com/whotracksme/trackers/tealeaf"},{"id":"adaway_iaudienc.com","name":"iaudienc.com","hostnames":["iaudienc.com","s.iaudienc.com"]},{"id":"adaway_iappmobi.com","name":"iappmobi.com","hostnames":["data.iappmobi.com"]},{"id":"adaway_i2i.jp","name":"i2i.jp","hostnames":["i2i.jp","i2idata.com","ac.i2i.jp","ac10.i2i.jp","ac2.i2i.jp","ac4.i2i.jp","ac5.i2i.jp","ac7.i2i.jp","ac8.i2i.jp","ac9.i2i.jp","ad4.i2i.jp","adimg.i2i.jp","ads-i2i.jp","adsp1.i2i.jp","cc.i2i.jp","cc2.i2i.jp","img.i2i.jp","ma-i2i.jp","rc.i2i.jp","rc2.i2i.jp","rc3.i2i.jp","rc4.i2i.jp","rc5.i2i.jp","rc6.i2i.jp","rc7.i2i.jp","rc8.i2i.jp","rc9.i2i.jp","sg.i2i.jp","sh.i2i.jp","sr.i2i.jp","adsp.i2idata.com"],"link":"https://www.ghostery.com/whotracksme/trackers/i2i.jp"},{"id":"adaway_i2ad.jp","name":"i2ad.jp","hostnames":["i2ad.jp"]},{"id":"adaway_huuuge.net","name":"huuuge.net","hostnames":["stats.huuuge.net"]},{"id":"adaway_huq.io","name":"huq.io","hostnames":["huq.io","api.huq.io"]},{"id":"adaway_humann.com","name":"humann.com","hostnames":["segment-api.humann.com"]},{"id":"adaway_hulu.com","name":"hulu.com","hostnames":["t2.hulu.com"]},{"id":"adaway_htmedia.in","name":"htmedia.in","hostnames":["analytics.htmedia.in"]},{"id":"adaway_hs-analytics.net","name":"HubSpot","hostnames":["hs-analytics.net","hs-banner.com","hsleadflows.net","js.hs-analytics.net","js.hs-scripts.com","js.hsleadflows.net","academy.hubspot.com","www.academy.hubspot.com","js.hubspot.com","track.hubspot.com","tracking.hubspot.com"],"link":"https://www.ghostery.com/whotracksme/trackers/hubspot"},{"id":"adaway_hrzn-nxt.com","name":"hrzn-nxt.com","hostnames":["hrzn-nxt.com","c.hrzn-nxt.com","hmi-hershey.hrzn-nxt.com","l.hrzn-nxt.com"]},{"id":"adaway_howdoesin.net","name":"howdoesin.net","hostnames":["howdoesin.net","click.howdoesin.net"]},{"id":"adaway_hot-mob.com","name":"hot-mob.com","hostnames":["hot-mob.com","ad.hot-mob.com","cdn.hot-mob.com","code.hot-mob.com","trk.hot-mob.com","webapi.hot-mob.com","wpr.hot-mob.com"]},{"id":"adaway_hitsteps.com","name":"hitsteps.com","hostnames":["log.hitsteps.com"]},{"id":"adaway_hiido.com","name":"hiido.com","hostnames":["config.hiido.com","hlog.hiido.com","klog.hiido.com","mlog.hiido.com","trans.hiido.com","ylog.hiido.com"]},{"id":"adaway_hghit.com","name":"hghit.com","hostnames":["hghit.com"]},{"id":"adaway_heytapdl.com","name":"heytapdl.com","hostnames":["mdp-appconf-sg.heytapdl.com"]},{"id":"adaway_hexagon-analytics.com","name":"Brandwatch","hostnames":["hexagon-analytics.com"],"link":"https://www.ghostery.com/whotracksme/trackers/crimsonhexagon_com"},{"id":"adaway_herokudns.com","name":"herokudns.com","hostnames":["analytics.yopify.com.herokudns.com"]},{"id":"adaway_herokuapp.com","name":"herokuapp.com","hostnames":["evening-badlands-6215.herokuapp.com","ilyonanalytics.herokuapp.com","powr-counter.herokuapp.com","wootric-eligibility.herokuapp.com"]},{"id":"adaway_herocraft.com","name":"herocraft.com","hostnames":["adv.herocraft.com"]},{"id":"adaway_hbi-ingest.net","name":"hbi-ingest.net","hostnames":["hbi-ingest.net"]},{"id":"adaway_havasedge.com","name":"havasedge.com","hostnames":["havasedge.com","event.havasedge.com"]},{"id":"adaway_hasmobi.net","name":"hasmobi.net","hostnames":["hasmobi.net","adx.hasmobi.net","na.hasmobi.net","stat.hasmobi.net","stra.hasmobi.net"]},{"id":"adaway_hapyak.com","name":"hapyak.com","hostnames":["analytics-production.hapyak.com"]},{"id":"adaway_hansel.io","name":"hansel.io","hostnames":["sdk.hansel.io","ujm.hansel.io"]},{"id":"adaway_h12-media.com","name":"H12 Ads","hostnames":["h12-media.com","tags.h12-media.com","bidder.h12-media.com"],"link":"https://www.ghostery.com/whotracksme/trackers/h12_ads"},{"id":"adaway_h-cdn.com","name":"h-cdn.com","hostnames":["perr.h-cdn.com"]},{"id":"adaway_gwallet.com","name":"RadiumOne","hostnames":["gwallet.com","rp.gwallet.com","rs.gwallet.com","rcdna.gwallet.com"],"link":"https://www.ghostery.com/whotracksme/trackers/radiumone"},{"id":"adaway_guoshipartners.com","name":"guoshipartners.com","hostnames":["ad-specs.guoshipartners.com"]},{"id":"adaway_gumgum.com","name":"gumgum","hostnames":["gumgum.com","aba.gumgum.com","jp-g2.gumgum.com","jp-lb.gumgum.com","or-g2.gumgum.com","or-lb.gumgum.com","px.gumgum.com","rtb.gumgum.com","va-g2.gumgum.com","va-lb.gumgum.com","wo.gumgum.com","update.wo.gumgum.com","s.update.wo.gumgum.com","ads.gumgum.com","c.gumgum.com","cdn.gumgum.com","g2.gumgum.com","gonzogrape.gumgum.com","js.gumgum.com"],"link":"https://www.ghostery.com/whotracksme/trackers/gumgum"},{"id":"adaway_gu-web.net","name":"gu-web.net","hostnames":["phar.gu-web.net"]},{"id":"adaway_growthpush.com","name":"growthpush.com","hostnames":["api.growthpush.com"]},{"id":"adaway_growthbeat.com","name":"growthbeat.com","hostnames":["api.growthbeat.com"]},{"id":"adaway_gridsumdissector.com","name":"gridsumdissector.com","hostnames":["cm-udmp.gridsumdissector.com","diag-wd.gridsumdissector.com","i.gridsumdissector.com","recv-bak-wd.gridsumdissector.com","recv-wd.gridsumdissector.com","static.gridsumdissector.com"]},{"id":"adaway_grabify.link","name":"grabify.link","hostnames":["grabify.link","www.grabify.link"]},{"id":"adaway_gotraffic.net","name":"gotraffic.net","hostnames":["cdn.gotraffic.net"]},{"id":"adaway_gotrackier.com","name":"gotrackier.com","hostnames":["adapace.gotrackier.com","adjar.gotrackier.com","adsapp.gotrackier.com","adstory.gotrackier.com","adyogis.gotrackier.com","affilsoft.gotrackier.com","appmontize.gotrackier.com","auctera.gotrackier.com","blendai.gotrackier.com","click2commission.gotrackier.com","conup.gotrackier.com","harvest.gotrackier.com","hyperads.gotrackier.com","inkrevenue.gotrackier.com","kormzi.gotrackier.com","mediaxpedia.gotrackier.com","momentus.gotrackier.com","netsetgo.gotrackier.com","playdigo.gotrackier.com","quickadsmedia.gotrackier.com","vihit.gotrackier.com","vytomi.gotrackier.com"]},{"id":"adaway_gotoip55.com","name":"gotoip55.com","hostnames":["gotoip55.com"]},{"id":"adaway_googleusercontent.com","name":"googleusercontent.com","hostnames":["displayads-formats.googleusercontent.com"]},{"id":"adaway_googleadsserving.cn","name":"googleadsserving.cn","hostnames":["static.googleadsserving.cn"]},{"id":"adaway_gooddata.com","name":"gooddata.com","hostnames":["secure.gooddata.com"]},{"id":"adaway_golfrival.net","name":"golfrival.net","hostnames":["log1.golfrival.net"]},{"id":"adaway_goldspotmedia.com","name":"goldspotmedia.com","hostnames":["goldspotmedia.com","gcmast-cdn.goldspotmedia.com","jp3adv-cdn.goldspotmedia.com"]},{"id":"adaway_goforandroid.com","name":"goforandroid.com","hostnames":["adlockscreen.goforandroid.com","adpush.goforandroid.com","adpushsdk.goforandroid.com","adviap.goforandroid.com","advshield.goforandroid.com","geoip.goforandroid.com","navigation.api.hk.goforandroid.com"]},{"id":"adaway_gocarrot.com","name":"gocarrot.com","hostnames":["gocarrot.com","iroko.gocarrot.com","parsnip.gocarrot.com"]},{"id":"adaway_goadservices.com","name":"Internet BillBoard","hostnames":["goadservices.com","bo.goadservices.com","bbelements.com","ibillboard.com","t.goadservices.com","go.arbopl.bbelements.com","bbcdn.go.arbopl.bbelements.com","go.eu.bbelements.com","go.goldbachpoland.bbelements.com","go.adlt.bbelements.com","go.adlv.bbelements.com","bbcdn.go.adlv.bbelements.com","bbcdn.go.pl.bbelements.com","go.gba.bbelements.com","bbcdn.go.eu.bbelements.com","bbnaut.bbelements.com","cz.bbelements.com","go.bb007.bbelements.com","go.cz.bbelements.com","go.pl.bbelements.com","pl.bbelements.com","www.bbelements.com","bbnaut.ibillboard.com","bbcdn-bbnaut.ibillboard.com","bbcdn-tag.ibillboard.com","video-adserver.ibillboard.com"],"link":"https://www.ghostery.com/whotracksme/trackers/internet_billboard"},{"id":"adaway_go2speed.org","name":"go2speed.org","hostnames":["media.go2speed.org"]},{"id":"adaway_go2cloud.org","name":"go2cloud.org","hostnames":["tapjoy.go2cloud.org"]},{"id":"adaway_go.com","name":"go.com","hostnames":["log.go.com","sw88.go.com","tredir.go.com","unid.go.com","android.unid.go.com","cdn.unid.go.com","ios.unid.go.com","gowadogo.com","click.gowadogo.com","ad-monitor.kargo.com","storage.cloud.kargo.com","cma.kargo.com","crb.kargo.com","kds-pixel.kargo.com","klkstrm.kargo.com","krk.kargo.com","socialcanvas-cdn.kargo.com"]},{"id":"adaway_gmossp-sp.jp","name":"AkaNe","hostnames":["gmossp-sp.jp","cdn.gmossp-sp.jp","adn-d.sp.gmossp-sp.jp","adn-i.sp.gmossp-sp.jp","adn-j.sp.gmossp-sp.jp","sp.gmossp-sp.jp"],"link":"https://www.ghostery.com/whotracksme/trackers/akane"},{"id":"adaway_glulive.com","name":"glulive.com","hostnames":["personalization.centech.glulive.com","prd1.personalization.centech.glulive.com","revid.centech.glulive.com","prd1.revid.centech.glulive.com"]},{"id":"adaway_glispa.com","name":"glispa.com","hostnames":["glispa.com"]},{"id":"adaway_gleam.io","name":"gleam.io","hostnames":["js.gleam.io"]},{"id":"adaway_gladly.com","name":"gladly.com","hostnames":["cdn.gladly.com","us-1.gladly.com"]},{"id":"adaway_gismart.xyz","name":"gismart.xyz","hostnames":["analytics.gismart.xyz","prod-defaulting-subscriptiontool.gismart.xyz"]},{"id":"adaway_gioneemobile.net","name":"gioneemobile.net","hostnames":["stats.gioneemobile.net"]},{"id":"adaway_gimbal.tech","name":"gimbal.tech","hostnames":["cdn.gimbal.tech"]},{"id":"adaway_gimbal.com","name":"gimbal.com","hostnames":["communicate.gimbal.com","placebubble.gimbal.com","sdk-configuration.gimbal.com"]},{"id":"adaway_getwoohoo.com","name":"getwoohoo.com","hostnames":["app.getwoohoo.com"]},{"id":"adaway_getui.net","name":"getui.net","hostnames":["sdk.open.talk.getui.net"]},{"id":"adaway_getsocial.im","name":"getsocial.im","hostnames":["hades.getsocial.im"]},{"id":"adaway_getshogun.com","name":"getshogun.com","hostnames":["analytics.getshogun.com"]},{"id":"adaway_getgo.com","name":"getgo.com","hostnames":["api-telemetry.servers.getgo.com","telemetry.servers.getgo.com"]},{"id":"adaway_getdrip.com","name":"getdrip.com","hostnames":["api.getdrip.com","tag.getdrip.com"]},{"id":"adaway_gepush.com","name":"gepush.com","hostnames":["sdk.open.talk.gepush.com"]},{"id":"adaway_geoplugin.net","name":"geoPlugin","hostnames":["geoplugin.net","www.geoplugin.net"],"link":"https://www.ghostery.com/whotracksme/trackers/geoplugin"},{"id":"adaway_geoedge.be","name":"geoedge.be","hostnames":["gw.geoedge.be","protect.geoedge.be","rumcdn.geoedge.be"]},{"id":"adaway_genieessp.com","name":"genieessp.com","hostnames":["genieessp.com","gi-js.genieessp.com","js.genieessp.com","6159.genieessp.com"]},{"id":"adaway_gdeslon.ru","name":"GdeSlon","hostnames":["gdeslon.ru"],"link":"https://www.ghostery.com/whotracksme/trackers/gdeslon"},{"id":"adaway_gannettdigital.com","name":"gannettdigital.com","hostnames":["traxex.gannettdigital.com"]},{"id":"adaway_gamooga.com","name":"gamooga.com","hostnames":["evbk.gamooga.com"]},{"id":"adaway_gammaplatform.com","name":"gammaplatform.com","hostnames":["gammaplatform.com","cm.gammaplatform.com","hb.gammaplatform.com","tag.gammaplatform.com","imp.gammaplatform.com","static.gammaplatform.com","stc.gammaplatform.com","t.gammaplatform.com","app.gammaplatform.com","clk.gammaplatform.com","cm-supply-web.gammaplatform.com","d.gammaplatform.com","imp2.gammaplatform.com","in-view.gammaplatform.com","login.gammaplatform.com","track.gammaplatform.com","www.gammaplatform.com"]},{"id":"adaway_games-to-run123.com","name":"games-to-run123.com","hostnames":["trk.games-to-run123.com"]},{"id":"adaway_gameofwhales.com","name":"gameofwhales.com","hostnames":["api.gameofwhales.com"]},{"id":"adaway_gamemonetize.com","name":"gamemonetize.com","hostnames":["html5.gamemonetize.com"]},{"id":"adaway_gameloft.com","name":"gameloft.com","hostnames":["igp06.gameloft.com","ingameads.gameloft.com"]},{"id":"adaway_gameanalytics.com","name":"gameanalytics.com","hostnames":["gameanalytics.com","api.gameanalytics.com","rubick.gameanalytics.com"]},{"id":"adaway_game-insight.com","name":"game-insight.com","hostnames":["tribez.game-insight.com"]},{"id":"adaway_g5e.com","name":"g5e.com","hostnames":["cdn.g5e.com","ceg.g5e.com","collecting-consent.g5e.com","most-popular-info.g5e.com","pgpl.g5e.com","pushwoosh.g5e.com","specialdeals.g5e.com","xpromo.g5e.com"]},{"id":"adaway_g2afse.com","name":"g2afse.com","hostnames":["appsclicks.g2afse.com","aterru.g2afse.com","tarsan.g2afse.com"]},{"id":"adaway_fuse-ad.com","name":"fuse-ad.com","hostnames":["pokkt.fuse-ad.com"]},{"id":"adaway_funshion.com","name":"funshion.com","hostnames":["pub.funshion.com"]},{"id":"adaway_funheroic.com","name":"funheroic.com","hostnames":["dat.funheroic.com"]},{"id":"adaway_ftstats.com","name":"ftstats.com","hostnames":["c.ftstats.com"]},{"id":"adaway_foxsports.com","name":"foxsports.com","hostnames":["analytics.nova.foxsports.com"]},{"id":"adaway_foxnews.com","name":"foxnews.com","hostnames":["smetrics.foxnews.com"]},{"id":"adaway_foxitcloud.com","name":"foxitcloud.com","hostnames":["adlog.foxitcloud.com","logger.foxitcloud.com"]},{"id":"adaway_fout.jp","name":"FreakOut","hostnames":["fout.jp","cnt.fout.jp","dmp.fout.jp","sync.dmp.fout.jp","dsp.fout.jp","js.fout.jp","rfp.fout.jp","ad.rfp.fout.jp","imp.rfp.fout.jp","js.rfp.fout.jp","sync.rfp.fout.jp","sync.fout.jp","ad.fout.jp","click.fout.jp","conv.fout.jp"],"link":"https://www.ghostery.com/whotracksme/trackers/fout.jp"},{"id":"adaway_fotoable.net","name":"fotoable.net","hostnames":["geoip.fotoable.net"]},{"id":"adaway_fotoable.com","name":"fotoable.com","hostnames":["dl.fotoable.com"]},{"id":"adaway_fosrv.com","name":"fosrv.com","hostnames":["analytics.fosrv.com"]},{"id":"adaway_forter.com","name":"forter.com","hostnames":["9e97cf8b099a.cdn4.forter.com","e44177b6b805.cdn4.forter.com","fdfe4ed62699.cdn4.forter.com"]},{"id":"adaway_formisimo.com","name":"Formisimo","hostnames":["cdn-static.formisimo.com"],"link":"https://www.ghostery.com/whotracksme/trackers/formisimo"},{"id":"adaway_forbes.com","name":"forbes.com","hostnames":["fuse.forbes.com","geolocation.forbes.com"]},{"id":"adaway_footprintdns.com","name":"footprintdns.com","hostnames":["footprintdns.com","918a7a98a85c63f2244669a0f54e12ba.clo.footprintdns.com","bdc10654944f452cbeefa3a612d5a3b4.clo.footprintdns.com"]},{"id":"adaway_footprint.net","name":"footprint.net","hostnames":["king-contenido-prod.secure2.footprint.net"]},{"id":"adaway_fomo.com","name":"fomo.com","hostnames":["load.fomo.com","geocode.usefomo.com","www.usefomo.com"]},{"id":"adaway_follow-apps.com","name":"follow-apps.com","hostnames":["auth.follow-apps.com"]},{"id":"adaway_fn-pz.com","name":"fn-pz.com","hostnames":["vision.fn-pz.com"]},{"id":"adaway_fmpub.net","name":"Federated Media","hostnames":["fmpub.net","static.fmpub.net"],"link":"https://www.ghostery.com/whotracksme/trackers/federated_media"},{"id":"adaway_flyermobi.com","name":"flyermobi.com","hostnames":["adbsc.flyermobi.com","adbsdk.flyermobi.com","adc.flyermobi.com"]},{"id":"adaway_flow.io","name":"flow.io","hostnames":["beacon.flow.io"]},{"id":"adaway_flipboard.com","name":"flipboard.com","hostnames":["ad.flipboard.com","ue.flipboard.com"]},{"id":"adaway_flashtalking.com","name":"Flashtalking","hostnames":["flashtalking.com","ad-events.flashtalking.com","d9.flashtalking.com","fdz.flashtalking.com","i.flashtalking.com","img.flashtalking.com","imgcf.flashtalking.com","s3cf.flashtalking.com","servedby.flashtalking.com","stat8.flashtalking.com","prod-customfeeds.flashtalking.com","cdn.flashtalking.com","stat.flashtalking.com","secure.flashtalking.com"],"link":"https://www.ghostery.com/whotracksme/trackers/flashtalking"},{"id":"adaway_fixel.ai","name":"fixel.ai","hostnames":["script.fixel.ai"]},{"id":"adaway_fishsticksgames.com","name":"fishsticksgames.com","hostnames":["logging.fishsticksgames.com"]},{"id":"adaway_firstimpression.io","name":"First Impression","hostnames":["firstimpression.io","cdn.firstimpression.io","ecdn.firstimpression.io"],"link":"https://www.ghostery.com/whotracksme/trackers/first_impression"},{"id":"adaway_fingersoft.net","name":"fingersoft.net","hostnames":["ads3.fingersoft.net"]},{"id":"adaway_fiksu.com","name":"Fiksu","hostnames":["fiksu.com","rtb-creatives.fiksu.com"],"link":"https://www.ghostery.com/whotracksme/trackers/fiksu"},{"id":"adaway_fidelity-media.com","name":"Fidelity Media","hostnames":["fidelity-media.com","x.fidelity-media.com"],"link":"https://www.ghostery.com/whotracksme/trackers/fidelity_media"},{"id":"adaway_feedmob.com","name":"feedmob.com","hostnames":["tracking.feedmob.com"]},{"id":"adaway_fbcdn.net","name":"fbcdn.net","hostnames":["sonar-iad.xx.fbcdn.net"]},{"id":"adaway_fastly.net","name":"fastly.net","hostnames":["mparticle.map.fastly.net","confiant-integrations.global.ssl.fastly.net"]},{"id":"adaway_fastapi.net","name":"fastapi.net","hostnames":["fastapi.net"]},{"id":"adaway_fam-ad.com","name":"fam-ad.com","hostnames":["fam-ad.com"]},{"id":"adaway_fabric.io","name":"fabric.io","hostnames":["fabric.io"]},{"id":"adaway_ezoic.net","name":"ezoic.net","hostnames":["go.ezoic.net"]},{"id":"adaway_ezmob.com","name":"ezmob.com","hostnames":["filter.ezmob.com","xml.ezmob.com"]},{"id":"adaway_extremereach.io","name":"extremereach.io","hostnames":["extremereach.io","beacons.extremereach.io","cdn1.extremereach.io","cdn2.extremereach.io","vast.extremereach.io"]},{"id":"adaway_extreme-ip-lookup.com","name":"extreme-ip-lookup.com","hostnames":["extreme-ip-lookup.com"]},{"id":"adaway_extole.io","name":"extole.io","hostnames":["everlywell.extole.io"]},{"id":"adaway_extend.tv","name":"ZypMedia","hostnames":["extend.tv","adserver-east.extend.tv","freewheeleventsbidder-east.extend.tv","sync.extend.tv","telariaeventsbidder-east.extend.tv"],"link":"https://www.ghostery.com/whotracksme/trackers/zypmedia"},{"id":"adaway_experian.com","name":"experian.com","hostnames":["smetrics1.experian.com"]},{"id":"adaway_exacttargetapis.com","name":"exacttargetapis.com","hostnames":["exacttargetapis.com","consumer.exacttargetapis.com"]},{"id":"adaway_ex.co","name":"ex.co","hostnames":["cdn-channels-pixel.ex.co","prd-collector-anon.ex.co"]},{"id":"adaway_evolv.ai","name":"evolv.ai","hostnames":["media.evolv.ai","participants.evolv.ai"]},{"id":"adaway_evidon.com","name":"evidon.com","hostnames":["evidon.com","c.evidon.com","iabmap.evidon.com","info.evidon.com","l.evidon.com","l3.evidon.com","ads.evidon.com"]},{"id":"adaway_everestads.net","name":"everestads.net","hostnames":["everestads.net","dco-assets.everestads.net"]},{"id":"adaway_etahub.com","name":"etahub.com","hostnames":["etahub.com","atlas.etahub.com","www.etahub.com"]},{"id":"adaway_estara.com","name":"ATG Optimization","hostnames":["as00.estara.com"],"link":"https://www.ghostery.com/whotracksme/trackers/atg_optimization"},{"id":"adaway_espn.com","name":"espn.com","hostnames":["log.espn.com","sw88.espn.com"]},{"id":"adaway_epom.com","name":"Epom","hostnames":["epom.com"],"link":"https://www.ghostery.com/whotracksme/trackers/epom"},{"id":"adaway_ensighten.com","name":"ensighten.com","hostnames":["ensighten.com","activate.ensighten.com","scarf.ensighten.com","b.ensighten.com"]},{"id":"adaway_engageya.com","name":"Engageya Widget","hostnames":["engageya.com","images9.engageya.com","recs.engageya.com","widget.engageya.com","events.engageya.com","ecs1.engageya.com"],"link":"https://www.ghostery.com/whotracksme/trackers/engageya_widget"},{"id":"adaway_engageclick.com","name":"engageclick.com","hostnames":["tracker.engageclick.com"]},{"id":"adaway_emxdgt.com","name":"ORC International","hostnames":["emxdgt.com","cs.emxdgt.com","e1.emxdgt.com","emxhb.emxdgt.com","hb.emxdgt.com","imp.emxdgt.com","local.emxdgt.com","pub.local.emxdgt.com","imp-east.pub.local.emxdgt.com","us-east-1.local.emxdgt.com","vast.emxdgt.com"],"link":"https://www.ghostery.com/whotracksme/trackers/orc_international"},{"id":"adaway_emb-api.com","name":"emb-api.com","hostnames":["config.emb-api.com","data.emb-api.com"]},{"id":"adaway_emarsys.net","name":"emarsys.net","hostnames":["assets.emarsys.net","me-client.eservice.emarsys.net","mobile-sdk-config.gservice.emarsys.net"]},{"id":"adaway_edgekey.net","name":"edgekey.net","hostnames":["analytics.edgekey.net","79423.analytics.edgekey.net","ma1169-r.analytics.edgekey.net","ma1275-r.analytics.edgekey.net","ma1498-r.analytics.edgekey.net","ma193-r.analytics.edgekey.net","ma312-r.analytics.edgekey.net","ma479-r.analytics.edgekey.net","ma562-r.analytics.edgekey.net","ma788-r.analytics.edgekey.net","cdn-inner-active.edgekey.net","addthis.com.edgekey.net","ds-api-public.addthis.com.edgekey.net","ds-s7.addthis.com.edgekey.net","ds-www.addthis.com.edgekey.net","ds-m.addthisedge.com.edgekey.net","v1.addthisedge.com.edgekey.net","adobetag.com.edgekey.net","san-www.adobetag.com.edgekey.net","aniview.com.edgekey.net","wildcard.aniview.com.edgekey.net","wl.aniview.com.edgekey.net","smetrics.att.com.edgekey.net","betrad.com.edgekey.net","wildcard.betrad.com.edgekey.net","bkrtx.com.edgekey.net","wildcard.bkrtx.com.edgekey.net","bluekai.com.edgekey.net","tags.bluekai.com.edgekey.net","casalemedia.com.edgekey.net","r.casalemedia.com.edgekey.net","convertexperiments.com.edgekey.net","cdn-3.convertexperiments.com.edgekey.net","cxense.com.edgekey.net","cdn.cxense.com.edgekey.net","evidon.com.edgekey.net","wildcard.evidon.com.edgekey.net","metrics.fidelity.com.edgekey.net","flashtalking.com.edgekey.net","cdn.flashtalking.com.edgekey.net","secure.flashtalking.com.edgekey.net","metrics.hackerrank.com.edgekey.net","innovid.com.edgekey.net","s-static.innovid.com.edgekey.net","insightexpressai.com.edgekey.net","global-wildcard.insightexpressai.com.edgekey.net","i16-tb.isnssdk.com.edgekey.net","analytics.libertymutual.com.edgekey.net","marketo.com.edgekey.net","wildcard.marketo.com.edgekey.net","mathtag.com.edgekey.net","pixel.mathtag.com.edgekey.net","stats.mediaforge.com.edgekey.net","moatads.com.edgekey.net","wildcard.moatads.com.edgekey.net","mookie1.com.edgekey.net","outbrain.com.edgekey.net","wildcard.outbrain.com.edgekey.net","outbrainimg.com.edgekey.net","wildcard.outbrainimg.com.edgekey.net","rubiconproject.com.edgekey.net","digicertwc.rubiconproject.com.edgekey.net","eus.rubiconproject.com.edgekey.net","sgsnssdk.com.edgekey.net","spotxcdn.com.edgekey.net","cdn.spotxcdn.com.edgekey.net","marketingassets.staples.com.edgekey.net","unityads.unity3d.com.edgekey.net","cdn-store-icons-akamai-prd.unityads.unity3d.com.edgekey.net","rubiconproject.com-v1.edgekey.net","video-ads.rubiconproject.com-v1.edgekey.net","v6analytics.htmedia.in.edgekey.net","akstat.io.edgekey.net","wildcard46.akstat.io.edgekey.net","dable.io.edgekey.net","ntv.io.edgekey.net","wildcard.ntv.io.edgekey.net","onetag.io.edgekey.net","deluxe.onetag.io.edgekey.net","oracleinfinity.io.edgekey.net","c.oracleinfinity.io.edgekey.net","pangle.io.edgekey.net","push.io.edgekey.net","san.push.io.edgekey.net","moatpixel1.edgekey.net","tracking.admarketplace.net.edgekey.net","everestjs.net.edgekey.net","marketo.net.edgekey.net","wildcard.marketo.net.edgekey.net","owneriq.net.edgekey.net","wildcard.owneriq.net.edgekey.net","yieldlab.net.edgekey.net","pubmatic.edgekey.net","aktrack.pubmatic.edgekey.net","secure-adnxs.edgekey.net","teads.tv.edgekey.net","a.teads.tv.edgekey.net","cdn.teads.tv.edgekey.net","cdn2.teads.tv.edgekey.net","criteo-sync.teads.tv.edgekey.net","perf.teads.tv.edgekey.net","sync.teads.tv.edgekey.net","t.teads.tv.edgekey.net","ma1310-r.analytics.edgekey.net","ma80-r.analytics.edgekey.net","ma156-r.analytics.edgekey.net","as-sec.casalemedia.com.edgekey.net","dsum.casalemedia.com.edgekey.net","dsum-sec.casalemedia.com.edgekey.net","htlb.casalemedia.com.edgekey.net","js-sec.casalemedia.com.edgekey.net","ssum.casalemedia.com.edgekey.net","ssum-sec.casalemedia.com.edgekey.net"]},{"id":"adaway_ecorebates.com","name":"ecorebates.com","hostnames":["static.ecorebates.com"]},{"id":"adaway_ecbsn.com","name":"ecbsn.com","hostnames":["apituner.ecbsn.com","api.engager.ecbsn.com","events.engager.ecbsn.com","ffconf.ecbsn.com"]},{"id":"adaway_ebz.io","name":"eBuzzing","hostnames":["ebz.io","beead.co.uk","ebuzzing.com","www.beead.co.uk"],"link":"https://www.ghostery.com/whotracksme/trackers/ebuzzing"},{"id":"adaway_easy-ads.com","name":"easy-ads.com","hostnames":["ads.easy-ads.com"]},{"id":"adaway_easebar.com","name":"easebar.com","hostnames":["applog.matrix.easebar.com","mcount.easebar.com","appdump.nie.easebar.com","sigma-statistics-push.proxima.nie.easebar.com","who.nie.easebar.com"]},{"id":"adaway_eagllwin.com","name":"eagllwin.com","hostnames":["api.eagllwin.com","creative.eagllwin.com"]},{"id":"adaway_eacdn.com","name":"eacdn.com","hostnames":["eacdn.com","sportingbeteur.adsrv.eacdn.com","adsrv.eacdn.com"]},{"id":"adaway_dyntrk.com","name":"DynAdmic","hostnames":["dyntrk.com","gu.dyntrk.com","c.us1.dyntrk.com"],"link":"https://www.ghostery.com/whotracksme/trackers/dynadmic"},{"id":"adaway_dynstc.com","name":"dynstc.com","hostnames":["cdn.n.dynstc.com"]},{"id":"adaway_dynatrace-managed.com","name":"dynatrace-managed.com","hostnames":["dlt-beacon.dynatrace-managed.com"]},{"id":"adaway_dynamicyield.com","name":"dynamicyield.com","hostnames":["async-px-eu.dynamicyield.com","cdn-eu.dynamicyield.com","em.dynamicyield.com","rcom.dynamicyield.com","rcom-eu.dynamicyield.com","st-eu.dynamicyield.com","static.dynamicyield.com"]},{"id":"adaway_dxsvr.com","name":"dxsvr.com","hostnames":["ak.dxsvr.com","rc.dxsvr.com","tls.dxsvr.com","u.dxsvr.com"]},{"id":"adaway_duapp.com","name":"duapp.com","hostnames":["agentchannel.api.duapp.com","channel.api.duapp.com"]},{"id":"adaway_dtscdn.com","name":"dtscdn.com","hostnames":["t.dtscdn.com"]},{"id":"adaway_dspcdn.com","name":"dspcdn.com","hostnames":["banner.dspcdn.com"]},{"id":"adaway_dpmsrv.com","name":"Addaptive","hostnames":["dpmsrv.com","a.dpmsrv.com","s.dpmsrv.com"],"link":"https://www.ghostery.com/whotracksme/trackers/addaptive"},{"id":"adaway_dozuki.com","name":"dozuki.com","hostnames":["ping.dozuki.com"]},{"id":"adaway_douyucdn.cn","name":"douyucdn.cn","hostnames":["bjfesdk.douyucdn.cn"]},{"id":"adaway_doumob.com","name":"doumob.com","hostnames":["api.doumob.com"]},{"id":"adaway_doubleverify.com","name":"DoubleVerify","hostnames":["doubleverify.com","cdn.doubleverify.com","cdn3.doubleverify.com","pub.doubleverify.com","rtb0.doubleverify.com","rtb2.doubleverify.com","rtbcdn.doubleverify.com","tps.doubleverify.com","tps10232.doubleverify.com","tps30.doubleverify.com","tps711.doubleverify.com","vast.doubleverify.com","vpaid.doubleverify.com","vtrk.doubleverify.com","cacp-hlb.doubleverify.com","rtb3.doubleverify.com","e100.yt.srs.doubleverify.com","e101.yt.srs.doubleverify.com","e102.yt.srs.doubleverify.com","e103.yt.srs.doubleverify.com","e104.yt.srs.doubleverify.com","e105.yt.srs.doubleverify.com","e106.yt.srs.doubleverify.com","e107.yt.srs.doubleverify.com","e108.yt.srs.doubleverify.com","e109.yt.srs.doubleverify.com","e110.yt.srs.doubleverify.com","e111.yt.srs.doubleverify.com","e112.yt.srs.doubleverify.com","tps10216.doubleverify.com","tps20519.doubleverify.com","tps31.doubleverify.com"],"link":"https://www.ghostery.com/whotracksme/trackers/doubleverify"},{"id":"adaway_doordash.com","name":"doordash.com","hostnames":["collector.doordash.com"]},{"id":"adaway_domainforlite.com","name":"domainforlite.com","hostnames":["ti.domainforlite.com"]},{"id":"adaway_dofunapps.com","name":"dofunapps.com","hostnames":["ads.dofunapps.com"]},{"id":"adaway_doesxyz.com","name":"doesxyz.com","hostnames":["ufz.doesxyz.com"]},{"id":"adaway_dmpxs.com","name":"dmpxs.com","hostnames":["bob.dmpxs.com","ciq.dmpxs.com"]},{"id":"adaway_disqus.com","name":"disqus.com","hostnames":["referrer.disqus.com","glitter.services.disqus.com","tempest.services.disqus.com"]},{"id":"adaway_disq.us","name":"disq.us","hostnames":["x.disq.us"]},{"id":"adaway_disneyplus.com","name":"disneyplus.com","hostnames":["sanalytics.disneyplus.com"]},{"id":"adaway_directservices.it","name":"directservices.it","hostnames":["multi-cluster.directservices.it","tracking.directservices.it","xpig-dev.directservices.it"]},{"id":"adaway_directadvert.ru","name":"Direct/ADVERT","hostnames":["directadvert.ru","code.directadvert.ru","msn.directadvert.ru"],"link":"https://www.ghostery.com/whotracksme/trackers/directadvert"},{"id":"adaway_dimml.io","name":"dimml.io","hostnames":["cdn.dimml.io"]},{"id":"adaway_digitru.st","name":"DigiTrust","hostnames":["digitru.st","cdn.digitru.st","prebid.digitru.st"],"link":"https://www.ghostery.com/whotracksme/trackers/digitrust"},{"id":"adaway_digital-metric.com","name":"digital-metric.com","hostnames":["tags.digital-metric.com"]},{"id":"adaway_dictionary.com","name":"dictionary.com","hostnames":["track.dictionary.com"]},{"id":"adaway_dickssportinggoods.com","name":"dickssportinggoods.com","hostnames":["smetrics.dickssportinggoods.com","tag.dickssportinggoods.com"]},{"id":"adaway_dice.com","name":"dice.com","hostnames":["insights.dice.com"]},{"id":"adaway_dewrain.world","name":"dewrain.world","hostnames":["int.dewrain.world"]},{"id":"adaway_dewrain.site","name":"dewrain.site","hostnames":["int.dewrain.site"]},{"id":"adaway_dewrain.life","name":"dewrain.life","hostnames":["co.dewrain.life","int.dewrain.life"]},{"id":"adaway_devtodev.com","name":"devtodev.com","hostnames":["balancer.devtodev.com","statgw.devtodev.com"]},{"id":"adaway_destinilocators.com","name":"destinilocators.com","hostnames":["cdn.destinilocators.com"]},{"id":"adaway_demandbase.com","name":"demandbase.com","hostnames":["api.demandbase.com","autocomplete.demandbase.com","dsp.demandbase.com","dsp-creative.demandbase.com","scripts.demandbase.com","tag.demandbase.com"]},{"id":"adaway_deltago.com","name":"deltago.com","hostnames":["deltago.com"]},{"id":"adaway_deloton.com","name":"deloton.com","hostnames":["deloton.com"]},{"id":"adaway_deliverimp.com","name":"deliverimp.com","hostnames":["compass-allbids.deliverimp.com","compass-errors.deliverimp.com","compass-events.deliverimp.com","compass-v2.deliverimp.com"]},{"id":"adaway_decagames.com","name":"decagames.com","hostnames":["prod-dcs-eventlog.decagames.com"]},{"id":"adaway_de.com","name":"NetRatings SiteCensus","hostnames":["s79.research.de.com","imrworldwide.com","cdn-gl.imrworldwide.com","cloudapi.imrworldwide.com","cm.imrworldwide.com","errors.imrworldwide.com","global.imrworldwide.com","priv-policy.imrworldwide.com","sdk.imrworldwide.com","seccdn-gl.imrworldwide.com","secure-au.imrworldwide.com","secure-cert.imrworldwide.com","secure-dcr.imrworldwide.com","secure-dcr-cert.imrworldwide.com","secure-drm.imrworldwide.com","secure-eu.imrworldwide.com","secure-gg.imrworldwide.com","secure-gl.imrworldwide.com","secure-it.imrworldwide.com","secure-nz.imrworldwide.com","secure-proxy.imrworldwide.com","secure-sdk.imrworldwide.com","secure-sg.imrworldwide.com","secure-uk.imrworldwide.com","secure-us.imrworldwide.com","uaid-linkage.imrworldwide.com","analytics.tdameritrade.com","appdeumext.tdameritrade.com","b95.s79.research.de.com","secure-yt.imrworldwide.com","lycos-eu.imrworldwide.com","ninemsn.imrworldwide.com","nt-es.imrworldwide.com","safe-es.imrworldwide.com","secure-asia.imrworldwide.com","secure-dk.imrworldwide.com","secure-jp.imrworldwide.com","secure-za.imrworldwide.com","server-au.imrworldwide.com","server-br.imrworldwide.com","server-by.imrworldwide.com","server-de.imrworldwide.com","server-dk.imrworldwide.com","server-ee.imrworldwide.com","server-fi.imrworldwide.com","server-it.imrworldwide.com","server-jp.imrworldwide.com","server-lv.imrworldwide.com","server-lt.imrworldwide.com","server-no.imrworldwide.com","server-nz.imrworldwide.com","server-oslo.imrworldwide.com","server-pl.imrworldwide.com","server-se.imrworldwide.com","server-sg.imrworldwide.com","server-stockh.imrworldwide.com","server-uk.imrworldwide.com","server-us.imrworldwide.com","telstra.imrworldwide.com","secure-sts-prod.imrworldwide.com","fe-au.imrworldwide.com","fe1-au.imrworldwide.com","fe2-au.imrworldwide.com","fe3-au.imrworldwide.com","rc-au.imrworldwide.com","server-fr.imrworldwide.com","server-hk.imrworldwide.com","server-ru.imrworldwide.com","server-ua.imrworldwide.com"],"link":"https://www.ghostery.com/whotracksme/trackers/netratings_sitecensus"},{"id":"adaway_daumcdn.net","name":"daumcdn.net","hostnames":["adimg.daumcdn.net"]},{"id":"adaway_daum.net","name":"daum.net","hostnames":["ad.daum.net","bc.ad.daum.net","display.ad.daum.net","keyword.ad.daum.net","kyson.ad.daum.net","wat.ad.daum.net","webid.ad.daum.net","track.tiara.daum.net"]},{"id":"adaway_datorama.com","name":"datorama.com","hostnames":["app.datorama.com","oauth.datorama.com"]},{"id":"adaway_dataxu.com","name":"dataxu.com","hostnames":["dataxu.com"]},{"id":"adaway_datawrapper.de","name":"datawrapper.de","hostnames":["stats.datawrapper.de"]},{"id":"adaway_datahc.com","name":"datahc.com","hostnames":["media.datahc.com"]},{"id":"adaway_datadoghq.com","name":"datadoghq.com","hostnames":["logs.datadoghq.com","browser-http-intake.logs.datadoghq.com","rum-http-intake.logs.datadoghq.com"]},{"id":"adaway_databrain.com","name":"databrain.com","hostnames":["tracker.databrain.com"]},{"id":"adaway_dable.io","name":"dable.io","hostnames":["dable.io","ad-hub.dable.io","static.dable.io","ad-log.dable.io","r-log.dable.io","admin.dable.io","adx.dable.io","api.dable.io","dsp.dable.io","images.dable.io","k8s.dable.io","marketing.dable.io","news.dable.io","redirect.dable.io","sp-api.dable.io","sp-r.dable.io","thumb.dable.io","www.dable.io"]},{"id":"adaway_d2cmedia.ca","name":"d2cmedia.ca","hostnames":["d2cmedia.ca"]},{"id":"adaway_cymera.com","name":"cymera.com","hostnames":["openapi.cymera.com"]},{"id":"adaway_cxpublic.com","name":"cxpublic.com","hostnames":["content-thumbnail.cxpublic.com"]},{"id":"adaway_customer.io","name":"customer.io","hostnames":["assets.customer.io","edge-west.customer.io","track.customer.io"]},{"id":"adaway_cszz.ru","name":"cszz.ru","hostnames":["cszz.ru"]},{"id":"adaway_crownpeak.com","name":"crownpeak.com","hostnames":["snippet.omm.crownpeak.com"]},{"id":"adaway_crowdtwist.com","name":"crowdtwist.com","hostnames":["resources.crowdtwist.com"]},{"id":"adaway_crowdtangle.com","name":"crowdtangle.com","hostnames":["apps.crowdtangle.com"]},{"id":"adaway_crossinstall.io","name":"crossinstall.io","hostnames":["impressions.crossinstall.io","step-service.crossinstall.io"]},{"id":"adaway_crossinstall.com","name":"crossinstall.com","hostnames":["rtb-east-wins.crossinstall.com"]},{"id":"adaway_crittercism.com","name":"crittercism.com","hostnames":["crittercism.com","apm.crittercism.com","userflows.ingest.crittercism.com","5-7-3-ios.userflows.ingest.crittercism.com","5-9-5-ios.userflows.ingest.crittercism.com","5-8-12-c45a17f790-android.userflows.ingest.crittercism.com"]},{"id":"adaway_creativecdn.com","name":"RTB House","hostnames":["creativecdn.com","ash.creativecdn.com","asia.creativecdn.com","sin.creativecdn.com"],"link":"https://www.ghostery.com/whotracksme/trackers/rtb_house"},{"id":"adaway_crasheye.cn","name":"crasheye.cn","hostnames":["crasheye.cn","rp.crasheye.cn"]},{"id":"adaway_cpx.to","name":"Captify","hostnames":["cpx.to","s.cpx.to","ads.captifymedia.com"],"link":"https://www.ghostery.com/whotracksme/trackers/cpx.to"},{"id":"adaway_cpmstar.com","name":"CPMStar","hostnames":["cpmstar.com","cdne.cpmstar.com","ssl.cdne.cpmstar.com","cdn.cpmstar.com","server.cpmstar.com","dev.server.cpmstar.com","staging.server.cpmstar.com"],"link":"https://www.ghostery.com/whotracksme/trackers/cpmstar"},{"id":"adaway_count.ly","name":"count.ly","hostnames":["count.ly"]},{"id":"adaway_coronalabs.com","name":"coronalabs.com","hostnames":["monetize-api.coronalabs.com","stats.coronalabs.com"]},{"id":"adaway_corevm.com","name":"corevm.com","hostnames":["locator1.corevm.com","locatorpp.corevm.com"]},{"id":"adaway_coremetrics.com","name":"IBM Digital Analytics","hostnames":["coremetrics.com","data.coremetrics.com","libs.coremetrics.com","cmcore.com","iocdn.coremetrics.com","tmscdn.coremetrics.com","testdata.coremetrics.com","jsfp.coremetrics.com","test.coremetrics.com","twci.coremetrics.com","data.cmcore.com"],"link":"https://www.ghostery.com/whotracksme/trackers/ibm_customer_experience"},{"id":"adaway_coremedia.cloud","name":"coremedia.cloud","hostnames":["sitegenesis.production.deckers.coremedia.cloud"]},{"id":"adaway_cordial.com","name":"cordial.com","hostnames":["events-stream-svc.usw2.cordial.com","message-hub-svc.usw2.cordial.com"]},{"id":"adaway_cookieyes.com","name":"cookieyes.com","hostnames":["geoip.cookieyes.com"]},{"id":"adaway_cookiepro.com","name":"cookiepro.com","hostnames":["cookie-cdn.cookiepro.com"]},{"id":"adaway_conviva.com","name":"Conviva","hostnames":["conviva.com","cws-eu.conviva.com","cws-hulu.conviva.com","cws-iad1.conviva.com","cws-iad4.conviva.com","cws-sjc2.conviva.com","cws-us-east.conviva.com","cws-usw2.conviva.com","pings.conviva.com","vrl.m.conviva.com","www.vrl.m.conviva.com","cws-hotstar.conviva.com"],"link":"https://www.ghostery.com/whotracksme/trackers/conviva"},{"id":"adaway_contineljs.com","name":"contineljs.com","hostnames":["contineljs.com","cdn.contineljs.com","defaultdsp.contineljs.com","static.contineljs.com"]},{"id":"adaway_contentstream.pl","name":"contentstream.pl","hostnames":["contentstream.pl","emisja.contentstream.pl"]},{"id":"adaway_contentsquare.net","name":"ContentSquare","hostnames":["contentsquare.net","t.contentsquare.net"],"link":"https://www.ghostery.com/whotracksme/trackers/contentsquare.net"},{"id":"adaway_content.ad","name":"Content.ad","hostnames":["content.ad","api.content.ad","partners.content.ad"],"link":"https://www.ghostery.com/whotracksme/trackers/content.ad"},{"id":"adaway_content-square.net","name":"content-square.net","hostnames":["mobile-production.content-square.net"]},{"id":"adaway_consoliads.com","name":"consoliads.com","hostnames":["sdk.consoliads.com"]},{"id":"adaway_connecto.io","name":"connecto.io","hostnames":["api.connecto.io","push.connecto.io","server.connecto.io"]},{"id":"adaway_connectad.io","name":"connectad.io","hostnames":["e.connectad.io","i.connectad.io","sync.connectad.io","sync-eu.connectad.io"]},{"id":"adaway_confsettings.com","name":"confsettings.com","hostnames":["mobile.confsettings.com"]},{"id":"adaway_conductrics.com","name":"conductrics.com","hostnames":["cdn-cbc-v3.conductrics.com","cdn-v3.conductrics.com"]},{"id":"adaway_concert.io","name":"concert.io","hostnames":["concert.io","bids.concert.io","cdn.concert.io"]},{"id":"adaway_company-target.com","name":"Demandbase","hostnames":["company-target.com","api.company-target.com","segments.company-target.com","demandbase.com","a.company-target.com","c.company-target.com","d.company-target.com","e.company-target.com"],"link":"https://www.ghostery.com/whotracksme/trackers/demandbase"},{"id":"adaway_comcast.com","name":"comcast.com","hostnames":["collector.pabs.comcast.com"]},{"id":"adaway_com.vn","name":"com.vn","hostnames":["log.oto.com.vn"]},{"id":"adaway_com.ua","name":"com.ua","hostnames":["holder.com.ua"]},{"id":"adaway_com.tw","name":"com.tw","hostnames":["agent.tamedia.com.tw"]},{"id":"adaway_com.tr","name":"Admatic","hostnames":["cdn2.admatic.com.tr","adtarget.com.tr","console.adtarget.com.tr","sync.console.adtarget.com.tr","netperform-is.vodafone.com.tr","admatic.com.tr","ads5.admatic.com.tr","ghb.console.adtarget.com.tr","ads4.admatic.com.tr"],"link":"https://www.ghostery.com/whotracksme/trackers/admatic"},{"id":"adaway_com.sg","name":"com.sg","hostnames":["superad2.com.sg","track.superad2.com.sg"]},{"id":"adaway_com.ph","name":"com.ph","hostnames":["ads.allaccess.com.ph"]},{"id":"adaway_com.my","name":"com.my","hostnames":["nuffnang.com.my","synad3.nuffnang.com.my"]},{"id":"adaway_com.mx","name":"com.mx","hostnames":["homify.com.mx"]},{"id":"adaway_com.cn","name":"AdMaster.cn","hostnames":["admaster.com.cn","cm.admaster.com.cn","iclick.cm.admaster.com.cn","smt.admaster.com.cn","duiba.com.cn","sdk.stat.foreign.nearme.com.cn","adbox.sina.com.cn","beacon.sina.com.cn","emarketing.sina.com.cn","sbeacon.sina.com.cn","adlog.vivo.com.cn","adreq.vivo.com.cn","ads-marketing-vivofs.vivo.com.cn","adsdk.vivo.com.cn","adxlog.vivo.com.cn","monitor-stsdk.vivo.com.cn","onrt-stsdk.vivo.com.cn","ort-stsdk.vivo.com.cn","pnrt-stsdk.vivo.com.cn","prt-stsdk.vivo.com.cn","stnetsdk.vivo.com.cn","stsdk.vivo.com.cn","bronrt.stsdk.vivo.com.cn","brort.stsdk.vivo.com.cn","brpnrt.stsdk.vivo.com.cn","brprt.stsdk.vivo.com.cn","onrt.stsdk.vivo.com.cn","ort.stsdk.vivo.com.cn","pnrt.stsdk.vivo.com.cn","prt.stsdk.vivo.com.cn","vcardsdkservice.vivo.com.cn","v.admaster.com.cn"],"link":"https://www.ghostery.com/whotracksme/trackers/admaster.cn"},{"id":"adaway_com.br","name":"com.br","hostnames":["apis.com.br","tags.premiumads.com.br","api.soclminer.com.br"]},{"id":"adaway_colossusssp.com","name":"colossusssp.com","hostnames":["colossusssp.com","sync.colossusssp.com","supply.colossusssp.com"]},{"id":"adaway_collabollc.com","name":"collabollc.com","hostnames":["sdk.collabollc.com"]},{"id":"adaway_coinzillatag.com","name":"coinzillatag.com","hostnames":["coinzillatag.com"]},{"id":"adaway_cognitivlabs.com","name":"cognitivlabs.com","hostnames":["lynx.cognitivlabs.com","beacon.lynx.cognitivlabs.com"]},{"id":"adaway_cobrowser.com","name":"cobrowser.com","hostnames":["app.cobrowser.com"]},{"id":"adaway_co.uk","name":"CommuniGator","hostnames":["ad-x.co.uk","apps.ad-x.co.uk","a.adskeeper.co.uk","cm.adskeeper.co.uk","jsc.adskeeper.co.uk","s-img.adskeeper.co.uk","a1.api.bbc.co.uk","mybbc-analytics.files.bbci.co.uk","johnston.grapeshot.co.uk","mediaforce.grapeshot.co.uk","newscorp.grapeshot.co.uk","telegraph.grapeshot.co.uk","trinitymirror.grapeshot.co.uk","guardianapps.co.uk","nextgen.guardianapps.co.uk","api.nextgen.guardianapps.co.uk","api.huqindustries.co.uk","ipw.metadsp.co.uk","tracking.onefeed.co.uk","rightmoveanalytics.co.uk","wowanalytics.co.uk","lbal.wowanalytics.co.uk","t.wowanalytics.co.uk"],"link":"https://www.ghostery.com/whotracksme/trackers/communigator"},{"id":"adaway_co.kr","name":"co.kr","hostnames":["adplex.co.kr","log.adplex.co.kr","image.cauly.co.kr","xconf.cauly.co.kr","ads.inven.co.kr","largosoft.co.kr","ads.mncmedia.co.kr","ads.vcnc.co.kr"]},{"id":"adaway_co.jp","name":"i-mobile","hostnames":["i-mobile.co.jp","fc.itmedia.co.jp","b.logly.co.jp","cdn.logly.co.jp","dsp.logly.co.jp","l.logly.co.jp","sync.logly.co.jp","aff.i-mobile.co.jp","cgi.i-mobile.co.jp","imp-adedge.i-mobile.co.jp","spad.i-mobile.co.jp","spadp.i-mobile.co.jp","spadpc2.i-mobile.co.jp","spadpc3.i-mobile.co.jp","spapi.i-mobile.co.jp","spcdnsp.i-mobile.co.jp","spcnv.i-mobile.co.jp","spdeliver.i-mobile.co.jp","spdeliverp.i-mobile.co.jp","spmeasure.i-mobile.co.jp","spnet2-1.i-mobile.co.jp","spnet33.i-mobile.co.jp","spnet5.i-mobile.co.jp","spsvc5.i-mobile.co.jp","ssp-sync.i-mobile.co.jp"],"link":"https://www.ghostery.com/whotracksme/trackers/i-mobile"},{"id":"adaway_cnt.my","name":"cnt.my","hostnames":["cnt.my"]},{"id":"adaway_cnn.com","name":"cnn.com","hostnames":["agility.cnn.com","collector.cdp.cnn.com","z.cdp-dev.cnn.com","data.cnn.com","lightning.cnn.com","mms.cnn.com","smetrics.cnn.com"]},{"id":"adaway_cmgdigital.com","name":"cmgdigital.com","hostnames":["appconfig.cmgdigital.com","cmgfeeds.cmgdigital.com"]},{"id":"adaway_cluep.com","name":"cluep.com","hostnames":["cas.cluep.com","dev-as.cluep.com"]},{"id":"adaway_cludo.com","name":"cludo.com","hostnames":["customer.cludo.com"]},{"id":"adaway_cloudfunctions.net","name":"cloudfunctions.net","hostnames":["us-central1-adaptive-growth.cloudfunctions.net"]},{"id":"adaway_clouddn.com","name":"clouddn.com","hostnames":["bkt.clouddn.com"]},{"id":"adaway_cloud-elements.com","name":"cloud-elements.com","hostnames":["g2c.cloud-elements.com"]},{"id":"adaway_clmbtech.com","name":"Columbia Online","hostnames":["ade.clmbtech.com","ase.clmbtech.com","cade.clmbtech.com","case.clmbtech.com","mxase.clmbtech.com","tml.clmbtech.com","static.clmbtech.com","www.ase.clmbtech.com"],"link":"https://www.ghostery.com/whotracksme/trackers/columbia_online"},{"id":"adaway_clkdeals.com","name":"clkdeals.com","hostnames":["clkdeals.com"]},{"id":"adaway_clinch.co","name":"clinch.co","hostnames":["cdn.clinch.co","img-cdn.clinch.co","realtime.clinch.co","trk.clinch.co"]},{"id":"adaway_clickfuse.com","name":"clickfuse.com","hostnames":["clickfuse.com","cdn.clickfuse.com","srv.clickfuse.com"]},{"id":"adaway_clickdimensions.com","name":"ClickDimensions","hostnames":["analytics.clickdimensions.com","analytics-au.clickdimensions.com","analytics-eu.clickdimensions.com"],"link":"https://www.ghostery.com/whotracksme/trackers/clickdimensions"},{"id":"adaway_clickcease.com","name":"clickcease.com","hostnames":["monitor.clickcease.com"]},{"id":"adaway_clickagy.com","name":"clickagy.com","hostnames":["aorta.clickagy.com","i.clickagy.com","tags.clickagy.com"]},{"id":"adaway_clevertap.com","name":"clevertap.com","hostnames":["static.clevertap.com"]},{"id":"adaway_clevernt.com","name":"clevernt.com","hostnames":["sender.clevernt.com"]},{"id":"adaway_clean.gg","name":"clean.gg","hostnames":["i.clean.gg"]},{"id":"adaway_claspws.tv","name":"claspws.tv","hostnames":["config.claspws.tv","events.claspws.tv"]},{"id":"adaway_cision.com","name":"cision.com","hostnames":["app.cision.com","prapi.cision.com"]},{"id":"adaway_cintnetworks.com","name":"cintnetworks.com","hostnames":["c.cintnetworks.com"]},{"id":"adaway_cint.com","name":"cint.com","hostnames":["collector.cint.com","qps.cint.com"]},{"id":"adaway_cinarra.com","name":"cinarra.com","hostnames":["jp.cinarra.com","3ppa.jp.cinarra.com","dps.jp.cinarra.com"]},{"id":"adaway_chrysler.com","name":"chrysler.com","hostnames":["smetrics.chrysler.com"]},{"id":"adaway_chase.com","name":"chase.com","hostnames":["analytics.chase.com"]},{"id":"adaway_chartboosts.com","name":"chartboosts.com","hostnames":["chartboosts.com","ads.chartboosts.com","analysis2.chartboosts.com","remain.chartboosts.com"]},{"id":"adaway_chango.com","name":"Chango","hostnames":["chango.com","as.chango.com","blackhole.chango.com","cc.chango.com","ads.chango.com","adunit.chango.com","p.chango.com","c.chango.com","d.chango.com","dnetshelter3.d.chango.com"],"link":"https://www.ghostery.com/whotracksme/trackers/chango"},{"id":"adaway_centurygame.com","name":"centurygame.com","hostnames":["logagent-wf.centurygame.com","ta-collector.centurygame.com"]},{"id":"adaway_center.io","name":"center.io","hostnames":["js.center.io"]},{"id":"adaway_celtra.com","name":"celtra.com","hostnames":["celtra.com","ads.celtra.com","cache.celtra.com","cache-ssl.celtra.com","geo.celtra.com","track.celtra.com"]},{"id":"adaway_celltick.com","name":"celltick.com","hostnames":["celltick.com","contentapi.celltick.com"]},{"id":"adaway_cellrebel.com","name":"cellrebel.com","hostnames":["metricreceiver.cellrebel.com"]},{"id":"adaway_cdnwidget.com","name":"cdnwidget.com","hostnames":["cdnwidget.com","ids.cdnwidget.com","pixel.cdnwidget.com","u.cdnwidget.com"]},{"id":"adaway_cdnstoremedia.com","name":"cdnstoremedia.com","hostnames":["cdnstoremedia.com","static.cdnstoremedia.com","vp.cdnstoremedia.com"]},{"id":"adaway_cdnads.com","name":"cdnads.com","hostnames":["perf.cdnads.com"]},{"id":"adaway_cdn7.rocks","name":"cdn7.rocks","hostnames":["cdn7.rocks"]},{"id":"adaway_cdn-image.com","name":"cdn-image.com","hostnames":["cdn-image.com"]},{"id":"adaway_ccgateway.net","name":"ccgateway.net","hostnames":["ccgateway.net","analytics.ccgateway.net","ads.ccgateway.net"]},{"id":"adaway_cbsnews.com","name":"cbsnews.com","hostnames":["tealium.cbsnews.com"]},{"id":"adaway_carthook.com","name":"carthook.com","hostnames":["gcheck.carthook.com"]},{"id":"adaway_carambo.la","name":"Carambola","hostnames":["carambo.la","analytics.carambo.la","content.carambo.la","inimage.carambo.la","logging.carambo.la","media.carambo.la","pixel.carambo.la","psa.carambo.la","route.carambo.la","xtr.carambo.la","cdata.carambo.la"],"link":"https://www.ghostery.com/whotracksme/trackers/carambola"},{"id":"adaway_capturly.com","name":"capturly.com","hostnames":["collector.capturly.com"]},{"id":"adaway_capitalone.com","name":"capitalone.com","hostnames":["m-metrics.capitalone.com"]},{"id":"adaway_campaignmonitor.com","name":"campaignmonitor.com","hostnames":["commerce.campaignmonitor.com"]},{"id":"adaway_camera360.com","name":"camera360.com","hostnames":["applog.camera360.com"]},{"id":"adaway_c1exchange.com","name":"C1 Exchange","hostnames":["c1exchange.com"],"link":"https://www.ghostery.com/whotracksme/trackers/c1_exchange"},{"id":"adaway_byteoversea.com","name":"byteoversea.com","hostnames":["mon-va.byteoversea.com"]},{"id":"adaway_buzzfeed.com","name":"buzzfeed.com","hostnames":["pixiedust.buzzfeed.com"]},{"id":"adaway_buysellads.net","name":"buysellads.net","hostnames":["cdn-s2s.buysellads.net","cdn4.buysellads.net"]},{"id":"adaway_burstnet.com","name":"Burst Media","hostnames":["burstnet.com","www.burstnet.com"],"link":"https://www.ghostery.com/whotracksme/trackers/burst_media"},{"id":"adaway_bulldogcpi.com","name":"bulldogcpi.com","hostnames":["ads.bulldogcpi.com"]},{"id":"adaway_bugsense.com","name":"bugsense.com","hostnames":["bugsense.com","ticks2.bugsense.com"]},{"id":"adaway_bugsee.com","name":"bugsee.com","hostnames":["api.bugsee.com"]},{"id":"adaway_bugreplay.com","name":"bugreplay.com","hostnames":["app.bugreplay.com"]},{"id":"adaway_bughd.com","name":"bughd.com","hostnames":["collector.bughd.com"]},{"id":"adaway_bugfender.com","name":"bugfender.com","hostnames":["api.bugfender.com","app.bugfender.com"]},{"id":"adaway_bttrack.com","name":"Bidtellect","hostnames":["bttrack.com","api.bttrack.com","video.bttrack.com","cdn.bttrack.com"],"link":"https://www.ghostery.com/whotracksme/trackers/bidtellect"},{"id":"adaway_bttn.io","name":"bttn.io","hostnames":["bttn.io","etsy.bttn.io","uberm.bttn.io","lyft.bttn.io","mystore.bttn.io"]},{"id":"adaway_btstatic.com","name":"btstatic.com","hostnames":["s.btstatic.com"]},{"id":"adaway_btrll.com","name":"BrightRoll","hostnames":["btrll.com","cache.btrll.com"],"link":"https://www.ghostery.com/whotracksme/trackers/brightroll"},{"id":"adaway_btncdn.com","name":"btncdn.com","hostnames":["web.btncdn.com"]},{"id":"adaway_btloader.com","name":"btloader.com","hostnames":["btloader.com","api.btloader.com"]},{"id":"adaway_browsiprod.com","name":"browsiprod.com","hostnames":["events.browsiprod.com","yield-manager.browsiprod.com"]},{"id":"adaway_britepool.com","name":"britepool.com","hostnames":["api.britepool.com","px.britepool.com"]},{"id":"adaway_brightline.tv","name":"brightline.tv","hostnames":["events.brightline.tv","services.brightline.tv"]},{"id":"adaway_bridgebase.com","name":"bridgebase.com","hostnames":["ads.bridgebase.com","adserver.bridgebase.com"]},{"id":"adaway_brid.tv","name":"brid.tv","hostnames":["cdn.brid.tv","p.brid.tv","services.brid.tv","stats-dev.brid.tv"]},{"id":"adaway_brealtime.com","name":"EMX Digital","hostnames":["brealtime.com","biddr.brealtime.com","cookie.brealtime.com","biddr-cloud.brealtime.com","optimizedby.brealtime.com"],"link":"https://www.ghostery.com/whotracksme/trackers/brealtime"},{"id":"adaway_braze.eu","name":"braze.eu","hostnames":["cdn.braze.eu","fra-01.braze.eu","blink.fra-01.braze.eu","clusava.fra-01.braze.eu","sdk.fra-01.braze.eu"]},{"id":"adaway_braze.com","name":"braze.com","hostnames":["braze.com","iad-01.braze.com","andromeda.iad-01.braze.com","ibilisk.iad-01.braze.com","indus.iad-01.braze.com","rest.iad-01.braze.com","sdk.iad-01.braze.com","serpens.iad-01.braze.com","vela.iad-01.braze.com","gudja.iad-02.braze.com","sdk.iad-02.braze.com","iad-03.braze.com","atlas.iad-03.braze.com","belgikanst.iad-03.braze.com","blucher.iad-03.braze.com","bond.iad-03.braze.com","carinus.iad-03.braze.com","ceres.iad-03.braze.com","clair.iad-03.braze.com","customer.iad-03.braze.com","daviik.iad-03.braze.com","gaspra.iad-03.braze.com","hassaleh.iad-03.braze.com","hiram.iad-03.braze.com","inferna.iad-03.braze.com","izar.iad-03.braze.com","phillateemis.iad-03.braze.com","rest.iad-03.braze.com","rotanev.iad-03.braze.com","sagan.iad-03.braze.com","sargas.iad-03.braze.com","sdk.iad-03.braze.com","seginus.iad-03.braze.com","sirius.iad-03.braze.com","tali.iad-03.braze.com","wahacondrax.iad-03.braze.com","wurren.iad-03.braze.com","yildun.iad-03.braze.com","iad-06.braze.com","sdk.iad-06.braze.com","iad-08.braze.com","sdk.iad-08.braze.com","caesar.iad-03.braze.com","cursa.iad-03.braze.com","ibis.iad-03.braze.com","lalande.iad-03.braze.com","timbol.iad-03.braze.com","nashira.iad-06.braze.com"]},{"id":"adaway_brandcdn.com","name":"brandcdn.com","hostnames":["adservices.brandcdn.com"]},{"id":"adaway_brand-display.com","name":"brand-display.com","hostnames":["dmp.brand-display.com"]},{"id":"adaway_branch.io","name":"Branch","hostnames":["branch.io","api2.branch.io","cdn.branch.io","vulcan.branch.io","jhqvy.app.link"],"link":"https://www.ghostery.com/whotracksme/trackers/branch_metrics"},{"id":"adaway_braintreegateway.com","name":"braintreegateway.com","hostnames":["client-analytics.braintreegateway.com"]},{"id":"adaway_brainient.com","name":"Brainient","hostnames":["brainient.com","tag.brainient.com"],"link":"https://www.ghostery.com/whotracksme/trackers/brainient"},{"id":"adaway_brafton.com","name":"brafton.com","hostnames":["atlantisjs.brafton.com"]},{"id":"adaway_boston.com","name":"boston.com","hostnames":["smetrics.boston.com"]},{"id":"adaway_boomtrain.com","name":"boomtrain.com","hostnames":["events.api.boomtrain.com","onsiterecs.api.boomtrain.com","people.api.boomtrain.com","cdn.boomtrain.com"]},{"id":"adaway_bnmla.com","name":"Blink New Media","hostnames":["bnmla.com","match.bnmla.com","ad.bnmla.com","dsp.bnmla.com","edge.bnmla.com"],"link":"https://www.ghostery.com/whotracksme/trackers/blink_new_media"},{"id":"adaway_blueoxtech.com","name":"blueoxtech.com","hostnames":["blizzard.blueoxtech.com","hobbes.blueoxtech.com"]},{"id":"adaway_bluelithium.com","name":"Bluelithium","hostnames":["bluelithium.com","ads.bluelithium.com","adrevolver.com","gambling911.adrevolver.com","aps.media.adrevolver.com","media.adrevolver.com","track.adrevolver.com"],"link":"https://www.ghostery.com/whotracksme/trackers/bluelithium"},{"id":"adaway_bluekai.com","name":"BlueKai","hostnames":["bluekai.com","analytics.bluekai.com","bkrtx.com","tags.bkrtx.com","www.bkrtx.com"],"link":"https://www.ghostery.com/whotracksme/trackers/bluekai"},{"id":"adaway_bluedot.io","name":"bluedot.io","hostnames":["globalconfig.bluedot.io","us1-sdk.bluedot.io"]},{"id":"adaway_blueconic.net","name":"BlueConic Plugin","hostnames":["blueconic.net","advancelocal.blueconic.net","americanmedia.blueconic.net","cdn.blueconic.net","digitalfirstmedia.blueconic.net","encyclopediabritannica.blueconic.net","hearst.blueconic.net","idg.blueconic.net","lee.blueconic.net","maven.blueconic.net","nexstar.blueconic.net","npgco.blueconic.net","plugins.blueconic.net","soundpublishing.blueconic.net","theatlantic.blueconic.net"],"link":"https://www.ghostery.com/whotracksme/trackers/blueconic.net"},{"id":"adaway_bluecava.com","name":"Qualia","hostnames":["bluecava.com","ads.bluecava.com","gcloud.bluecava.com","graph.gcloud.bluecava.com","sync.graph.gcloud.bluecava.com","sync.graph.geo.bluecava.com","graph.bluecava.com","sync.graph.bluecava.com","clients.bluecava.com"],"link":"https://www.ghostery.com/whotracksme/trackers/qualia"},{"id":"adaway_bluebillywig.com","name":"bluebillywig.com","hostnames":["cdn.bluebillywig.com","stats.bluebillywig.com","vms.bluebillywig.com"]},{"id":"adaway_bloomberg.com","name":"bloomberg.com","hostnames":["personalization.bloomberg.com","tracking.bloomberg.com"]},{"id":"adaway_blisspointmedia.com","name":"blisspointmedia.com","hostnames":["cdn.blisspointmedia.com"]},{"id":"adaway_bkav.com","name":"bkav.com","hostnames":["analytics.bkav.com"]},{"id":"adaway_bizrate.com","name":"bizrate.com","hostnames":["insights.bizrate.com"]},{"id":"adaway_bizible.com","name":"bizible.com","hostnames":["cdn.bizible.com","sf.bizible.com"]},{"id":"adaway_bitmedianetwork.com","name":"bitmedianetwork.com","hostnames":["bitmedianetwork.com","cdn.bitmedianetwork.com","engine.bitmedianetwork.com"]},{"id":"adaway_bitmango.com","name":"bitmango.com","hostnames":["api.bitmango.com"]},{"id":"adaway_bidstack.com","name":"bidstack.com","hostnames":["server.bidstack.com"]},{"id":"adaway_bidr.io","name":"Beeswax","hostnames":["bidr.io","media.bidr.io","prod.bidr.io","event.prod.bidr.io","ap-northeast-1.event.prod.bidr.io","cnv.event.prod.bidr.io","global.event.prod.bidr.io","us-east-1.event.prod.bidr.io","us-west-2.event.prod.bidr.io","match.prod.bidr.io","segment.prod.bidr.io","stinger-ad.bidr.io","us-east-1.stinger-ad.bidr.io","blisspoint.us-east-1.stinger-ad.bidr.io","fanserv.us-east-1.stinger-ad.bidr.io","us-west-2.stinger-ad.bidr.io","blisspoint.us-west-2.stinger-ad.bidr.io","fanserv.us-west-2.stinger-ad.bidr.io"],"link":"https://www.ghostery.com/whotracksme/trackers/beeswax"},{"id":"adaway_bidgear.com","name":"BidGear","hostnames":["bidgear.com","demand.bidgear.com","imp-dsp.bidgear.com","platform.bidgear.com","source.bidgear.com","vn-platform.bidgear.com","www.bidgear.com","asset.bidgear.com","cdn.bidgear.com","dsp.bidgear.com","imp8.bidgear.com","imp9.bidgear.com","media.bidgear.com","pixel-dsp.bidgear.com","zabbix.bidgear.com"],"link":"https://www.ghostery.com/whotracksme/trackers/bidgear"},{"id":"adaway_betrad.com","name":"betrad.com","hostnames":["c.betrad.com"]},{"id":"adaway_bestbuy.com","name":"bestbuy.com","hostnames":["analytics.bestbuy.com","smetrics.bestbuy.com"]},{"id":"adaway_bepolite.eu","name":"smartAD","hostnames":["bepolite.eu"],"link":"https://www.ghostery.com/whotracksme/trackers/smartad"},{"id":"adaway_beop.io","name":"beop.io","hostnames":["s.beop.io","widget.beop.io"]},{"id":"adaway_bee7.com","name":"bee7.com","hostnames":["api.bee7.com","api-proxy.bee7.com"]},{"id":"adaway_beaconsinspace.com","name":"beaconsinspace.com","hostnames":["api.beaconsinspace.com"]},{"id":"adaway_bazaarvoice.com","name":"bazaarvoice.com","hostnames":["network.bazaarvoice.com","apps.nexus.bazaarvoice.com","analytics-static.ugc.bazaarvoice.com"]},{"id":"adaway_batmobil.net","name":"batmobil.net","hostnames":["batmobil.net","dsp.batmobil.net","api5.batmobil.net"]},{"id":"adaway_batmobi.net","name":"batmobi.net","hostnames":["adxcallback.batmobi.net","an.batmobi.net","api2.batmobi.net","dsp.batmobi.net","gtsdk.batmobi.net","ploy.batmobi.net","sdk.batmobi.net","update.sdk.batmobi.net","sts.batmobi.net"]},{"id":"adaway_bannersnack.com","name":"Bannersnack","hostnames":["bannersnack.com","cdn.bannersnack.com","live-tag.bannersnack.com","stats.bannersnack.com","files.bannersnack.com"],"link":"https://www.ghostery.com/whotracksme/trackers/bannersnack"},{"id":"adaway_banggood.com","name":"banggood.com","hostnames":["collect.banggood.com","dc.banggood.com"]},{"id":"adaway_b2c.com","name":"Aidem","hostnames":["b2c.com","api.b2c.com"],"link":"https://www.ghostery.com/whotracksme/trackers/aidem"},{"id":"adaway_azurewebsites.net","name":"azurewebsites.net","hostnames":["ffg-analytics-functionsk3nvxfne4dp4s.azurewebsites.net"]},{"id":"adaway_azureedge.net","name":"azureedge.net","hostnames":["masdpanalytics.azureedge.net"]},{"id":"adaway_ay.delivery","name":"ay.delivery","hostnames":["csxmhkahpy9y6cwwr.ay.delivery"]},{"id":"adaway_avocarrot.com","name":"avocarrot.com","hostnames":["avocarrot.com"]},{"id":"adaway_avct.cloud","name":"avct.cloud","hostnames":["ads.avct.cloud"]},{"id":"adaway_avast.com","name":"avast.com","hostnames":["analytics.ff.avast.com","stats.avast.com"]},{"id":"adaway_avantisvideo.com","name":"avantisvideo.com","hostnames":["cdn.avantisvideo.com","events.avantisvideo.com"]},{"id":"adaway_autoimg.cn","name":"autoimg.cn","hostnames":["adm3.autoimg.cn","img2.autoimg.cn"]},{"id":"adaway_autoads.asia","name":"autoads.asia","hostnames":["autoads.asia","fcd.autoads.asia","alpha2.autoads.asia","alphaapi.autoads.asia","api.autoads.asia","betaapi.autoads.asia","betacdn.autoads.asia","cdn.autoads.asia","file.autoads.asia","indo.autoads.asia","mantis.autoads.asia","pixel.autoads.asia","tracking.autoads.asia","www.autoads.asia","xacthuc.autoads.asia"]},{"id":"adaway_augur.io","name":"augur.io","hostnames":["augur.io","auspice.augur.io","cdn.augur.io"]},{"id":"adaway_atwola.com","name":"atwola.com","hostnames":["at.atwola.com","tacoda.at.atwola.com","uc.atwola.com","cdn.uc.atwola.com","cdn.at.atwola.com","ol.uk.at.atwola.com","uk.at.atwola.com","jp.at.atwola.com"]},{"id":"adaway_attn.tv","name":"attn.tv","hostnames":["cdn.attn.tv"]},{"id":"adaway_attentivemobile.com","name":"attentivemobile.com","hostnames":["api.attentivemobile.com","events.attentivemobile.com"]},{"id":"adaway_att.com","name":"att.com","hostnames":["smetrics.att.com"]},{"id":"adaway_atomex.net","name":"atomex.net","hostnames":["arg.atomex.net","data.atomex.net","trk.atomex.net"]},{"id":"adaway_atom-data.io","name":"atom-data.io","hostnames":["track.atom-data.io"]},{"id":"adaway_atemda.com","name":"Admeta","hostnames":["atemda.com","p287.atemda.com","s.atemda.com"],"link":"https://www.ghostery.com/whotracksme/trackers/admeta"},{"id":"adaway_atedra.com","name":"Atedra","hostnames":["atedra.com"],"link":"https://www.ghostery.com/whotracksme/trackers/atedra"},{"id":"adaway_ateam-ad.jp","name":"ateam-ad.jp","hostnames":["api.ateam-ad.jp","ad.api.ateam-ad.jp"]},{"id":"adaway_aswpsdkus.com","name":"aswpsdkus.com","hostnames":["aswpsdkus.com"]},{"id":"adaway_aspireclicks.com","name":"aspireclicks.com","hostnames":["images.aspireclicks.com"]},{"id":"adaway_asnapieu.com","name":"asnapieu.com","hostnames":["combine.asnapieu.com","remote-data.asnapieu.com"]},{"id":"adaway_asapp.com","name":"asapp.com","hostnames":["rcn.asapp.com","sdk.asapp.com","sprint.asapp.com","sprint-srs-appopen.asapp.com"]},{"id":"adaway_arity.com","name":"arity.com","hostnames":["api.arity.com"]},{"id":"adaway_areyouwatchingthis.com","name":"areyouwatchingthis.com","hostnames":["metabet.api.areyouwatchingthis.com","metabet.static.api.areyouwatchingthis.com","metabet.static.areyouwatchingthis.com"]},{"id":"adaway_arcsoft.com","name":"arcsoft.com","hostnames":["intouch.arcsoft.com"]},{"id":"adaway_aralego.com","name":"aralego.com","hostnames":["ads.aralego.com","agent.aralego.com","apac-sg-ad-track.aralego.com","hb.aralego.com","sync.aralego.com","us-east-ad-track.aralego.com"]},{"id":"adaway_apxlv.com","name":"apxlv.com","hostnames":["tag.apxlv.com"]},{"id":"adaway_apsalar.com","name":"apsalar.com","hostnames":["apsalar.com","api.apsalar.com","ad.apsalar.com"]},{"id":"adaway_apptrackerlink.com","name":"apptrackerlink.com","hostnames":["tracking.apptrackerlink.com"]},{"id":"adaway_apptornado.com","name":"apptornado.com","hostnames":["apptornado.com","applift-a.apptornado.com","applift-b.apptornado.com","eu-srv.apptornado.com","sdk-b.apptornado.com"]},{"id":"adaway_apptentive.com","name":"apptentive.com","hostnames":["app-icons.apptentive.com","sdk.apptentive.com"]},{"id":"adaway_apptap.com","name":"apptap.com","hostnames":["api.apptap.com","appdiscovery.apptap.com"]},{"id":"adaway_appspot.com","name":"Muscula","hostnames":["amp-error-reporting.appspot.com","ga-beacon.appspot.com","geoapi123.appspot.com","ima3vpaid.appspot.com","is-tracking-pixel-api-prod.appspot.com","musculahq.appspot.com","sc-analytics.appspot.com","snapabug.appspot.com"],"link":"https://www.ghostery.com/whotracksme/trackers/muscula"},{"id":"adaway_appsgeyser.com","name":"appsgeyser.com","hostnames":["ads.appsgeyser.com","config.appsgeyser.com","stat.appsgeyser.com"]},{"id":"adaway_appsflyersdk.com","name":"appsflyersdk.com","hostnames":["cdn-settings.appsflyersdk.com"]},{"id":"adaway_appsflyer.tk","name":"appsflyer.tk","hostnames":["sdk.appsflyer.tk"]},{"id":"adaway_appsdt.com","name":"appsdt.com","hostnames":["appsdt.com","d.appsdt.com"]},{"id":"adaway_apps.fm","name":"apps.fm","hostnames":["ad.apps.fm"]},{"id":"adaway_apprope.com","name":"apprope.com","hostnames":["cdn.apprope.com"]},{"id":"adaway_apprissmobile.com","name":"apprissmobile.com","hostnames":["mobile-ws.apprissmobile.com"]},{"id":"adaway_applicaster.com","name":"applicaster.com","hostnames":["assets-secure.applicaster.com"]},{"id":"adaway_appleads-trk.com","name":"appleads-trk.com","hostnames":["appleads-trk.com","redirect.appleads-trk.com"]},{"id":"adaway_applanga.com","name":"applanga.com","hostnames":["sdkapicdn.applanga.com"]},{"id":"adaway_appier.net","name":"Appier","hostnames":["ad.appier.net","ad2.apx.appier.net","ad3.apx.appier.net","a.c.appier.net","aiqua-config.c.appier.net","aiqua-sdk.c.appier.net","aiqua-user.c.appier.net","anylist.c.appier.net","apn.c.appier.net","arm.c.appier.net","g.c.appier.net","gocm.c.appier.net","rcp.c.appier.net","s.c.appier.net","sg.c.appier.net","ss.c.appier.net","t0.c.appier.net","tw.c.appier.net","vst.c.appier.net","jscdn.appier.net","web0.track.appier.net"],"link":"https://www.ghostery.com/whotracksme/trackers/appier"},{"id":"adaway_appia.com","name":"appia.com","hostnames":["appia.com"]},{"id":"adaway_appflood.com","name":"appflood.com","hostnames":["appflood.com","atracking-auto.appflood.com"]},{"id":"adaway_apperol.com","name":"apperol.com","hostnames":["trk.apperol.com"]},{"id":"adaway_appclick.co","name":"appclick.co","hostnames":["appclick.co"]},{"id":"adaway_appboy-images.com","name":"appboy-images.com","hostnames":["appboy-images.com"]},{"id":"adaway_appbaqend.com","name":"appbaqend.com","hostnames":["appbaqend.com","a.appbaqend.com"]},{"id":"adaway_appads.com","name":"appads.com","hostnames":["appads.com"]},{"id":"adaway_appadhoc.com","name":"appadhoc.com","hostnames":["experiment.appadhoc.com","sdk.appadhoc.com","tracker.appadhoc.com"]},{"id":"adaway_app-adforce.jp","name":"app-adforce.jp","hostnames":["app-adforce.jp","analytics.app-adforce.jp"]},{"id":"adaway_aotter.net","name":"aotter.net","hostnames":["tkportal.aotter.net"]},{"id":"adaway_anzuinfra.com","name":"anzuinfra.com","hostnames":["assets.anzuinfra.com","emqx.anzuinfra.com","events.anzuinfra.com","logic.anzuinfra.com"]},{"id":"adaway_anzu.io","name":"anzu.io","hostnames":["caps-server.anzu.io","l1-1.anzu.io"]},{"id":"adaway_anvato.net","name":"anvato.net","hostnames":["analytics.anvato.net","rt.analytics.anvato.net"]},{"id":"adaway_ants.vn","name":"ants.vn","hostnames":["d.ants.vn","dsp-d.ants.vn","st-au.ants.vn","t.ants.vn","ad.ants.vn","prebid.ants.vn","staging-d.ants.vn","t.d.ants.vn","au-insight.ants.vn","insight.ants.vn","oms-t.ants.vn"]},{"id":"adaway_anthill.vn","name":"Ants","hostnames":["anthill.vn","e-vcdn.anthill.vn","st-a.anthill.vn","ants.vn","analytics.anthill.vn","atrack-a.anthill.vn","c0.anthill.vn","c0-vcdn.anthill.vn","d.anthill.vn","e.anthill.vn","i0.anthill.vn","i0-vcdn.anthill.vn","id.anthill.vn","origin-c0.anthill.vn","origin-e.anthill.vn","origin-st-a.anthill.vn","p.anthill.vn","st.a.anthill.vn","st.anthill.vn","st-a1.anthill.vn","staging-e.anthill.vn","staging-e-vcdn.anthill.vn","st-a-id.anthill.vn","st-analytics.anthill.vn","st-ssp.anthill.vn","st-vcdn.anthill.vn","v0.anthill.vn","v0-vcdn.anthill.vn","v3-ads-st-vcdn.anthill.vn","v3-st-vcdn.anthill.vn","vcdn.anthill.vn","www.anthill.vn","a.ants.vn","abs.ants.vn","ads.ants.vn","adx.ants.vn","antalyser.ants.vn","api-app.ants.vn","app.ants.vn","apps.ants.vn","au.ants.vn","babe.ants.vn","crm.ants.vn","developers.ants.vn","e.ants.vn","ma.ants.vn","m-a.ants.vn","ogs.ants.vn","p.ants.vn","schemas.ants.vn","staging-d-tiki.ants.vn","tiki.ants.vn","www.ants.vn"],"link":"https://www.ghostery.com/whotracksme/trackers/ants"},{"id":"adaway_answerscloud.com","name":"answerscloud.com","hostnames":["gateway.answerscloud.com"]},{"id":"adaway_anquan.org","name":"anquan.org","hostnames":["anquan.org"]},{"id":"adaway_annoyingacoustics.com","name":"annoyingacoustics.com","hostnames":["annoyingacoustics.com"]},{"id":"adaway_andomedia.com","name":"andomedia.com","hostnames":["andomedia.com","lt.andomedia.com"]},{"id":"adaway_analyticssystems.net","name":"analyticssystems.net","hostnames":["analyticssystems.net"]},{"id":"adaway_analytics-egain.com","name":"eGain Analytics","hostnames":["analytics.analytics-egain.com","cloud-emea.analytics-egain.com","cloud-us.analytics-egain.com"],"link":"https://www.ghostery.com/whotracksme/trackers/egain_analytics"},{"id":"adaway_analysys.cn","name":"analysys.cn","hostnames":["analysys.cn"]},{"id":"adaway_analysis.fi","name":"analysis.fi","hostnames":["ecdn.analysis.fi"]},{"id":"adaway_amung.us","name":"Whos.amung.us","hostnames":["amung.us","whos.amung.us","widgets.amung.us","www.amung.us"],"link":"https://www.ghostery.com/whotracksme/trackers/whos.amung.us"},{"id":"adaway_amoad.com","name":"AMoAd","hostnames":["amoad.com","m.amoad.com","cdni.amoad.com","d.amoad.com","i.amoad.com","j.amoad.com","mk.ca-conv.amoad.com","p.amoad.com"],"link":"https://www.ghostery.com/whotracksme/trackers/amoad"},{"id":"adaway_amazonaws.com","name":"AdColony","hostnames":["ads-api-new-2052271615.ap-northeast-1.elb.amazonaws.com","adserver-1277986481.ap-northeast-1.elb.amazonaws.com","ad-server-lb-294150285.ap-southeast-1.elb.amazonaws.com","ads-816899299.ap-southeast-1.elb.amazonaws.com","rw-yieldmo-com-1673518954.ap-southeast-1.elb.amazonaws.com","adservingvpc-1239633584.eu-west-1.elb.amazonaws.com","beaconserver-ce-vpc0-1537565064.eu-west-1.elb.amazonaws.com","prod-dem-collector-elb-611025824.eu-west-1.elb.amazonaws.com","adktracking-1671721947.eu-west-3.elb.amazonaws.com","adn-tktracking-virginia-621472495.us-east-1.elb.amazonaws.com","adserver-2084671375.us-east-1.elb.amazonaws.com","adserver-vpc-alb-0-2072243822.us-east-1.elb.amazonaws.com","adserver-vpc-alb-1-2048135467.us-east-1.elb.amazonaws.com","adserver-vpc-alb-2-1898430250.us-east-1.elb.amazonaws.com","adsk-pnxproxy-prd-1753980530.us-east-1.elb.amazonaws.com","audience-164723144.us-east-1.elb.amazonaws.com","log-collectors-73517960.us-east-1.elb.amazonaws.com","lynx-prod-beacon-alb-498367235.us-east-1.elb.amazonaws.com","nova-collector-1192479543.us-east-1.elb.amazonaws.com","prod-ash-beacon-1960876484.us-east-1.elb.amazonaws.com","rpc-tapjoy-com-lb-1378811527.us-east-1.elb.amazonaws.com","tapjoy-com-lb-vpc-332546193.us-east-1.elb.amazonaws.com","tracking-1611167402.us-east-1.elb.amazonaws.com","wildcard-ads-new-1653986885.us-east-1.elb.amazonaws.com","ads-b-480313385.us-west-1.elb.amazonaws.com","ads-c-1854119718.us-west-1.elb.amazonaws.com","adserver-vpc-alb-0-2075095491.us-west-2.elb.amazonaws.com","adserver-vpc-alb-1-725730730.us-west-2.elb.amazonaws.com","adserver-vpc-alb-2-553366957.us-west-2.elb.amazonaws.com","adserver-vpc-alb-3-578630024.us-west-2.elb.amazonaws.com","beaconserver-ce-vpc0-1909323404.us-west-2.elb.amazonaws.com","dco-jads-727222375.us-west-2.elb.amazonaws.com","prod-pdx-beacon-1406086907.us-west-2.elb.amazonaws.com","rw-yieldmo-com-1857737650.us-west-2.elb.amazonaws.com","wildcard-ads-448740142.us-west-2.elb.amazonaws.com","huq-query-loggers-europe-west1-32ef7f4bbf54ce27.elb.eu-west-1.amazonaws.com","admarvel.s3.amazonaws.com","advancelocal-adapter-image-uploads.s3.amazonaws.com","ignifyecom.s3.amazonaws.com","nativead.s3.amazonaws.com","surveygizmobeacon.s3.amazonaws.com","later-analytics-reports.s3-accelerate.amazonaws.com","huq-query-loggers-california-3cec807da3e9dc0d.elb.us-west-1.amazonaws.com","ads.admarvel.com"],"link":"https://www.ghostery.com/whotracksme/trackers/adcolony"},{"id":"adaway_amazon.com","name":"amazon.com","hostnames":["aan.amazon.com","aax-us-east-retail-direct.amazon.com","fls-na.amazon.com"]},{"id":"adaway_am15.net","name":"advmaker.ru","hostnames":["am15.net","b.am15.net","w1.am15.net","w2.am15.net"],"link":"https://www.ghostery.com/whotracksme/trackers/advmaker.ru"},{"id":"adaway_altitude-arena.com","name":"altitude-arena.com","hostnames":["altitude-arena.com","ads.altitude-arena.com","vpc.altitude-arena.com","arena.altitude-arena.com","ca.altitude-arena.com"]},{"id":"adaway_alphonso.tv","name":"alphonso.tv","hostnames":["alphonso.tv","prov-lg.alphonso.tv","sync.alphonso.tv","acrdb.alphonso.tv","ads.alphonso.tv","assets.alphonso.tv","bwlkup.alphonso.tv","clockskew.alphonso.tv","degea.alphonso.tv","demo.alphonso.tv","dimaria.alphonso.tv","insights.alphonso.tv","koudas.alphonso.tv","neymar.alphonso.tv","optout.alphonso.tv","ppjs.alphonso.tv","proxy.alphonso.tv","rtbdev4.alphonso.tv","tn.alphonso.tv","tr.alphonso.tv","tvads.alphonso.tv","villa.alphonso.tv","web2.alphonso.tv","www.alphonso.tv"]},{"id":"adaway_allstarcluster.com","name":"allstarcluster.com","hostnames":["p102-clb.allstarcluster.com"]},{"id":"adaway_aliyuncs.com","name":"aliyuncs.com","hostnames":["beacon-api.aliyuncs.com","fineboost-loghub.ap-southeast-1.log.aliyuncs.com"]},{"id":"adaway_aliyun.com","name":"aliyun.com","hostnames":["acjs.aliyun.com"]},{"id":"adaway_aliexpress.com","name":"aliexpress.com","hostnames":["s.click.aliexpress.com"]},{"id":"adaway_alicdn.com","name":"alicdn.com","hostnames":["gma.alicdn.com"]},{"id":"adaway_alibaba.com","name":"alibaba.com","hostnames":["abtest.alibaba.com","hydra.alibaba.com"]},{"id":"adaway_alexametrics.com","name":"Alexa Metrics","hostnames":["alexametrics.com","certify.alexametrics.com","certify-amp.alexametrics.com","certify-js.alexametrics.com","d31qbv1cthcecs.cloudfront.net","d5nxst8fruw4z.cloudfront.net"],"link":"https://www.ghostery.com/whotracksme/trackers/alexa_metrics"},{"id":"adaway_alcmpn.com","name":"alcmpn.com","hostnames":["p.alcmpn.com"]},{"id":"adaway_akstat.io","name":"akstat.io","hostnames":["17de4c16.akstat.io","17de4c17.akstat.io"]},{"id":"adaway_akisinn.site","name":"akisinn.site","hostnames":["int.akisinn.site"]},{"id":"adaway_akisinn.info","name":"akisinn.info","hostnames":["co.akisinn.info","int.akisinn.info"]},{"id":"adaway_akamaized.net","name":"Speee","hostnames":["113vod-adaptive.akamaized.net","appsflyer.com.akamaized.net","jioads.akamaized.net","speee-ad.akamaized.net","statics-marketingsites-eus-ms-com.akamaized.net","statics-marketingsites-neu-ms-com.akamaized.net","fvalid.appsflyer.com.akamaized.net"],"link":"https://www.ghostery.com/whotracksme/trackers/speee"},{"id":"adaway_akamaihd.net","name":"akamaihd.net","hostnames":["ds-aksb-a.akamaihd.net","middycdn-a.akamaihd.net","ntvcld-a.akamaihd.net"]},{"id":"adaway_akamaiedge.net","name":"akamaiedge.net","hostnames":["e7876.dscg.akamaiedge.net"]},{"id":"adaway_akamai.net","name":"akamai.net","hostnames":["a1843.g.akamai.net","a50.g2.akamai.net"]},{"id":"adaway_akadns.net","name":"akadns.net","hostnames":["innovid.com.akadns.net","ag.innovid.com.akadns.net","aws-oreg-cali-virg.ag.innovid.com.akadns.net","dts.innovid.com.akadns.net","aws-oregon-california-virginia.dts.innovid.com.akadns.net","dts-5-split-vohnu.dts.innovid.com.akadns.net","rtr.innovid.com.akadns.net","aws-oregon-jrtr.rtr.innovid.com.akadns.net","s.innovid.com.akadns.net","aws-oregon-ohio-virginia.s.innovid.com.akadns.net","stats-5-split-vohnu.s.innovid.com.akadns.net","jadserve.postrelease.com.akadns.net","stickyadstv.com.akadns.net","ads.stickyadstv.com.akadns.net","fp3.ads.stickyadstv.com.akadns.net","ip1.ads.stickyadstv.com.akadns.net","ip2.ads.stickyadstv.com.akadns.net","cdn.stickyadstv.com.akadns.net","ip1.cdn.stickyadstv.com.akadns.net","wlb1.cdn.stickyadstv.com.akadns.net","wlb2.cdn.stickyadstv.com.akadns.net","tidaltv.com.akadns.net","sync.tidaltv.com.akadns.net","sync-usva.tidaltv.com.akadns.net","turn.com.akadns.net","ad.turn.com.akadns.net","d.turn.com.akadns.net","beacon-cdn.walmart.com.akadns.net","beacon-cdn-custom.walmart.com.akadns.net","analytics.mobile-cdn.walmart.com.akadns.net","weighted.com.akadns.net","dotomi.weighted.com.akadns.net","dvgtm.akadns.net","bs-geo.dvgtm.akadns.net","bs-wlb-uswest.dvgtm.akadns.net","tps-wlb-uswest.dvgtm.akadns.net","eyeblaster.akadns.net","bs.eyeblaster.akadns.net","adlanding.admarketplace.net.akadns.net","rubiconproject.net.akadns.net","beacon-nf.rubiconproject.net.akadns.net","beacon-sjc2.rubiconproject.net.akadns.net","pixel.rubiconproject.net.akadns.net","pixel-apac.rubiconproject.net.akadns.net","pixel-eu.rubiconproject.net.akadns.net","pixel-us-east.rubiconproject.net.akadns.net","pixel-us-west.rubiconproject.net.akadns.net","prebid-a.rubiconproject.net.akadns.net","prebid-server.rubiconproject.net.akadns.net","prebid-server-perf.rubiconproject.net.akadns.net","tagged-by.rubiconproject.net.akadns.net","adgrx.com.tech.akadns.net","rtb.adgrx.com.tech.akadns.net","tvx.adgrx.com.tech.akadns.net","vungle.akadns.net","cdn-lb.vungle.akadns.net","sync-apsg.tidaltv.com.akadns.net","r.turn.com.akadns.net","cacp-hlb.dvgtm.akadns.net","nycp-hlb.dvgtm.akadns.net","bsnj.eyeblaster.akadns.net","ingest.vungle.akadns.net"]},{"id":"adaway_airpush.com","name":"airpush.com","hostnames":["airpush.com","ab.airpush.com"]},{"id":"adaway_aimatch.com","name":"SAS","hostnames":["aimatch.com","content.aimatch.com","adactive-ads.aimatch.com","crtl.aimatch.com","www.marinoderosas.com","iclsas.com","www.iclsas.com","appkiossas.com","fabcomsas.com","gmasociadossas.com","jconsultingvisas.com","lascordobesas.com","santoafonsomassas.com","www.appkiossas.com","www.fabcomsas.com","www.gmasociadossas.com","www.jconsultingvisas.com","www.lascordobesas.com","www.santoafonsomassas.com","sdc.flysas.com"],"link":"https://www.ghostery.com/whotracksme/trackers/sas"},{"id":"adaway_agoop.net","name":"agoop.net","hostnames":["latency.agoop.net","roundrobin-log.agoop.net"]},{"id":"adaway_agkn.com","name":"Aggregate Knowledge","hostnames":["agkn.com","aa.agkn.com","d.agkn.com","data.agkn.com","js.agkn.com","static.agkn.com","fid.agkn.com","www.agkn.com"],"link":"https://www.ghostery.com/whotracksme/trackers/aggregate_knowledge"},{"id":"adaway_aflink.com","name":"aflink.com","hostnames":["app.aflink.com"]},{"id":"adaway_afftrack.com","name":"afftrack.com","hostnames":["fizzylabs.afftrack.com"]},{"id":"adaway_affluent.io","name":"affluent.io","hostnames":["static.affluent.io"]},{"id":"adaway_affiz.net","name":"Affiz CPM","hostnames":["affiz.net","cpm1.affiz.net","server1.affiz.net"],"link":"https://www.ghostery.com/whotracksme/trackers/affiz_cpm"},{"id":"adaway_affilae.com","name":"affilae.com","hostnames":["lb.affilae.com","static.affilae.com"]},{"id":"adaway_afcpatrk.com","name":"afcpatrk.com","hostnames":["track.afcpatrk.com"]},{"id":"adaway_aetnd.com","name":"aetnd.com","hostnames":["insights.vip.aetnd.com"]},{"id":"adaway_aetn.com","name":"aetn.com","hostnames":["metrics.aetn.com","smetrics.aetn.com"]},{"id":"adaway_aerserv.com","name":"aerserv.com","hostnames":["aerserv.com","alpha-events.aerserv.com","events.aerserv.com"]},{"id":"adaway_adztec.com","name":"adztec.com","hostnames":["adztec.com"]},{"id":"adaway_adzmedia.com","name":"adzmedia.com","hostnames":["adzmedia.com","pixels.adzmedia.com","imp.adzmedia.com"]},{"id":"adaway_adziff.com","name":"adziff.com","hostnames":["static.adziff.com"]},{"id":"adaway_adzerk.net","name":"Adzerk","hostnames":["adzerk.net","e-10077.adzerk.net","e-10220.adzerk.net","e-10457.adzerk.net","e-9660.adzerk.net","engine.adzerk.net","static.adzerk.net","e-prod-alb-default-us-east-1.adzerk.net","e-prod-alb-e-us-east-1.adzerk.net","engine2.adzerk.net","www.adzerk.net"],"link":"https://www.ghostery.com/whotracksme/trackers/adzerk"},{"id":"adaway_adzcore.com","name":"adzcore.com","hostnames":["setting.adzcore.com"]},{"id":"adaway_adywind.com","name":"adywind.com","hostnames":["adywind.com","app.adywind.com","log.adywind.com","scheme.adywind.com"]},{"id":"adaway_adxserve.com","name":"adxserve.com","hostnames":["www.adxserve.com"]},{"id":"adaway_adxcel.com","name":"adxcel.com","hostnames":["cf.adxcel.com"]},{"id":"adaway_adxcel-ec2.com","name":"adxcel-ec2.com","hostnames":["cfg.adxcel-ec2.com","data.adxcel-ec2.com"]},{"id":"adaway_adx.io","name":"adx.io","hostnames":["d.adx.io","s.adx.io"]},{"id":"adaway_advmob.cn","name":"advmob.cn","hostnames":["advmob.cn","folder.advmob.cn","fota.advmob.cn","bigdata.advmob.cn"]},{"id":"adaway_adview.pl","name":"Agora","hostnames":["adview.pl","ad.adview.pl","adv.adview.pl"],"link":"https://www.ghostery.com/whotracksme/trackers/agora"},{"id":"adaway_adview.com","name":"adview.com","hostnames":["bid.adview.com","ghkbid.adview.com","gusabid.adview.com","webfile.adview.com"]},{"id":"adaway_adview.cn","name":"adview.cn","hostnames":["bid.adview.cn","open.adview.cn"]},{"id":"adaway_adverty.com","name":"adverty.com","hostnames":["adserver.adverty.com"]},{"id":"adaway_advertur.ru","name":"advertur.ru","hostnames":["advertur.ru"]},{"id":"adaway_advertnative.com","name":"advertnative.com","hostnames":["advertnative.com","click.advertnative.com","worker1.advertnative.com","worker2.advertnative.com","worker20.advertnative.com","worker21.advertnative.com","worker22.advertnative.com","worker23.advertnative.com","worker24.advertnative.com","worker3.advertnative.com","worker4.advertnative.com","worker70.advertnative.com","worker71.advertnative.com","worker72.advertnative.com","worker73.advertnative.com"]},{"id":"adaway_advertising.com","name":"Verizon Media","hostnames":["advertising.com","ace-tag.advertising.com","ads.adaptv.advertising.com","cdn.adaptv.advertising.com","conversions.adaptv.advertising.com","log.adaptv.advertising.com","sync.adaptv.advertising.com","video.adaptv.advertising.com","wtag.adaptv.advertising.com","update.wtag.adaptv.advertising.com","adserver.adtech.advertising.com","adserver-eu.adtech.advertising.com","adserver-us.adtech.advertising.com","cmp.advertising.com","cdn.cmp.advertising.com","o.cmp.advertising.com","secure.leadback.advertising.com","pixel.advertising.com","sp.advertising.com","tag.sp.advertising.com","ssp.advertising.com","prod-m-node-1111.ssp.advertising.com","prod-m-node-1211.ssp.advertising.com","prod-m-node-2111.ssp.advertising.com","prod-m-node-3111.ssp.advertising.com","crispadvertising.com","api.crispadvertising.com","cdn2.crispadvertising.com","cdn4.crispadvertising.com","dts.crispadvertising.com","atwola.com","data-ero-advertising.com","www.data-ero-advertising.com","0latfee.ero-advertising.com","www.0latfee.ero-advertising.com","2baners.ero-advertising.com","www.2baners.ero-advertising.com","2ds.ero-advertising.com","www.2ds.ero-advertising.com","2fbanners.ero-advertising.com","www.2fbanners.ero-advertising.com","2fflatfee.ero-advertising.com","www.2fflatfee.ero-advertising.com","2fspeedclicks.ero-advertising.com","www.2fspeedclicks.ero-advertising.com","3ds.ero-advertising.com","www.3ds.ero-advertising.com","4anners.ero-advertising.com","www.4anners.ero-advertising.com","9ata.ero-advertising.com","www.9ata.ero-advertising.com","www.a.ero-advertising.com","aata.ero-advertising.com","www.aata.ero-advertising.com","acspaces.ero-advertising.com","www.acspaces.ero-advertising.com","ad1.ero-advertising.com","www.ad1.ero-advertising.com","ad2.ero-advertising.com","www.ad2.ero-advertising.com","s7.adaces.ero-advertising.com","www.s7.adaces.ero-advertising.com","adf.ero-advertising.com","www.adf.ero-advertising.com","adfpaces.ero-advertising.com","www.adfpaces.ero-advertising.com","ads1.ero-advertising.com","www.ads1.ero-advertising.com","adsances.ero-advertising.com","www.adsances.ero-advertising.com","adspacds.ero-advertising.com","www.adspacds.ero-advertising.com","adspaces2.ero-advertising.com","www.adspaces2.ero-advertising.com","adspaes.ero-advertising.com","www.adspaes.ero-advertising.com","adspages.ero-advertising.com","www.adspages.ero-advertising.com","adspcces.ero-advertising.com","www.adspcces.ero-advertising.com","adsspaces.ero-advertising.com","www.adsspaces.ero-advertising.com","adstaces.ero-advertising.com","www.adstaces.ero-advertising.com","adw.ero-advertising.com","www.adw.ero-advertising.com","adwpaces.ero-advertising.com","www.adwpaces.ero-advertising.com","afs.ero-advertising.com","www.afs.ero-advertising.com","analytics.ero-advertising.com","www.analytics.ero-advertising.com","anners.ero-advertising.com","www.anners.ero-advertising.com","ad0.api.ero-advertising.com","www.ad0.api.ero-advertising.com","ad1.api.ero-advertising.com","www.ad1.api.ero-advertising.com","ad2.api.ero-advertising.com","www.ad2.api.ero-advertising.com","ad3.api.ero-advertising.com","www.ad3.api.ero-advertising.com","ad4.api.ero-advertising.com","www.ad4.api.ero-advertising.com","ad7.api.ero-advertising.com","www.ad7.api.ero-advertising.com","ad8.api.ero-advertising.com","www.ad8.api.ero-advertising.com","ata.ero-advertising.com","www.ata.ero-advertising.com","ban3ers.ero-advertising.com","www.ban3ers.ero-advertising.com","ban4ers.ero-advertising.com","www.ban4ers.ero-advertising.com","banjers.ero-advertising.com","www.banjers.ero-advertising.com","bann12s.ero-advertising.com","www.bann12s.ero-advertising.com","bann13s.ero-advertising.com","www.bann13s.ero-advertising.com","bann14s.ero-advertising.com","www.bann14s.ero-advertising.com","bann1rs.ero-advertising.com","www.bann1rs.ero-advertising.com","banne2s.ero-advertising.com","www.banne2s.ero-advertising.com","banne3s.ero-advertising.com","www.banne3s.ero-advertising.com","banne4s.ero-advertising.com","www.banne4s.ero-advertising.com","banner.ero-advertising.com","www.banner.ero-advertising.com","ad0.banners.ero-advertising.com","www.ad0.banners.ero-advertising.com","ad1.banners.ero-advertising.com","www.ad1.banners.ero-advertising.com","ad2.banners.ero-advertising.com","www.ad2.banners.ero-advertising.com","ad3.banners.ero-advertising.com","www.ad3.banners.ero-advertising.com","ad4.banners.ero-advertising.com","www.ad4.banners.ero-advertising.com","ad5.banners.ero-advertising.com","www.ad5.banners.ero-advertising.com","ad6.banners.ero-advertising.com","www.ad6.banners.ero-advertising.com","ad7.banners.ero-advertising.com","www.ad7.banners.ero-advertising.com","ad8.banners.ero-advertising.com","www.ad8.banners.ero-advertising.com","www.banners.ero-advertising.com","banners1.ero-advertising.com","www.banners1.ero-advertising.com","www.banners2.ero-advertising.com","bannevs.ero-advertising.com","www.bannevs.ero-advertising.com","bavners2.ero-advertising.com","www.bavners2.ero-advertising.com","blatfee.ero-advertising.com","www.blatfee.ero-advertising.com","blog.ero-advertising.com","btw.ero-advertising.com","www.btw.ero-advertising.com","cata.ero-advertising.com","www.cata.ero-advertising.com","chat.ero-advertising.com","www.chat.ero-advertising.com","www.ero-adverising.com.ero-advertising.com","s10.histats.com.ero-advertising.com","www.s10.histats.com.ero-advertising.com","cyhners.ero-advertising.com","www.cyhners.ero-advertising.com","daaa.ero-advertising.com","www.daaa.ero-advertising.com","daea.ero-advertising.com","www.daea.ero-advertising.com","daia.ero-advertising.com","www.daia.ero-advertising.com","dat2.ero-advertising.com","www.dat2.ero-advertising.com","data2.ero-advertising.com","ad0.data2.ero-advertising.com","www.ad0.data2.ero-advertising.com","forums.data2.ero-advertising.com","www.forums.data2.ero-advertising.com","stats.data2.ero-advertising.com","www.stats.data2.ero-advertising.com","www.data2.ero-advertising.com","date.ero-advertising.com","www.date.ero-advertising.com","dats.ero-advertising.com","www.dats.ero-advertising.com","datt.ero-advertising.com","www.datt.ero-advertising.com","daua.ero-advertising.com","www.daua.ero-advertising.com","dava.ero-advertising.com","www.dava.ero-advertising.com","dawa.ero-advertising.com","www.dawa.ero-advertising.com","dbta.ero-advertising.com","www.dbta.ero-advertising.com","deta.ero-advertising.com","www.deta.ero-advertising.com","dtta.ero-advertising.com","www.dtta.ero-advertising.com","e-hpaces.ero-advertising.com","www.e-hpaces.ero-advertising.com","eedclicks.ero-advertising.com","www.eedclicks.ero-advertising.com","adspaces.ero-ades.ero-advertising.com","www.adspaces.ero-ades.ero-advertising.com","adspaces.ero-apaces.ero-advertising.com","www.adspaces.ero-apaces.ero-advertising.com","ers.ero-advertising.com","www.ers.ero-advertising.com","es.ero-advertising.com","www.es.ero-advertising.com","fanners.ero-advertising.com","www.fanners.ero-advertising.com","fata.ero-advertising.com","www.fata.ero-advertising.com","fhatfee.ero-advertising.com","www.fhatfee.ero-advertising.com","flashtest.ero-advertising.com","www.flashtest.ero-advertising.com","flatdee.ero-advertising.com","www.flatdee.ero-advertising.com","flatfae.ero-advertising.com","www.flatfae.ero-advertising.com","flatfea.ero-advertising.com","www.flatfea.ero-advertising.com","flatfee.ero-advertising.com","www.flatfee.ero-advertising.com","flw.ero-advertising.com","www.flw.ero-advertising.com","fnatfee.ero-advertising.com","www.fnatfee.ero-advertising.com","forum.ero-advertising.com","www.forum.ero-advertising.com","forums.ero-advertising.com","www.forums.ero-advertising.com","fpa.ero-advertising.com","ad3.fpa.ero-advertising.com","www.ad3.fpa.ero-advertising.com","ad5.fpa.ero-advertising.com","www.ad5.fpa.ero-advertising.com","www.fpa.ero-advertising.com","gata.ero-advertising.com","www.gata.ero-advertising.com","hata.ero-advertising.com","www.hata.ero-advertising.com","s10.hiadspaces.ero-advertising.com","www.s10.hiadspaces.ero-advertising.com","s10.hipaces.ero-advertising.com","www.s10.hipaces.ero-advertising.com","s10.his.ero-advertising.com","www.s10.his.ero-advertising.com","s10.hispaces.ero-advertising.com","www.s10.hispaces.ero-advertising.com","s10.histas.ero-advertising.com","www.s10.histas.ero-advertising.com","idspaces.ero-advertising.com","www.idspaces.ero-advertising.com","www.imads.ero-advertising.com","imeds.ero-advertising.com","www.imeds.ero-advertising.com","intext.ero-advertising.com","blog.intext.ero-advertising.com","www.blog.intext.ero-advertising.com","www.intext.ero-advertising.com","ioads.ero-advertising.com","www.ioads.ero-advertising.com","phpmyadmin.js.ero-advertising.com","www.phpmyadmin.js.ero-advertising.com","kds.ero-advertising.com","www.kds.ero-advertising.com","ad4.layerads.ero-advertising.com","www.ad4.layerads.ero-advertising.com","layers.ero-advertising.com","www.layers.ero-advertising.com","mata.ero-advertising.com","www.mata.ero-advertising.com","miami.ero-advertising.com","www.miami.ero-advertising.com","mobileads.ero-advertising.com","www.mobileads.ero-advertising.com","movieads.ero-advertising.com","www.movieads.ero-advertising.com","mx.ero-advertising.com","www.mx.ero-advertising.com","mybb.ero-advertising.com","www.mybb.ero-advertising.com","nata.ero-advertising.com","www.nata.ero-advertising.com","nl1.ero-advertising.com","www.nl1.ero-advertising.com","nl2.ero-advertising.com","www.nl2.ero-advertising.com","nners.ero-advertising.com","www.nners.ero-advertising.com","oata.ero-advertising.com","www.oata.ero-advertising.com","opads.ero-advertising.com","www.opads.ero-advertising.com","tcm.optica.ero-advertising.com","www.tcm.optica.ero-advertising.com","pagepeel.ero-advertising.com","www.pagepeel.ero-advertising.com","pata.ero-advertising.com","www.pata.ero-advertising.com","phpmyadmin.ero-advertising.com","www.phpmyadmin.ero-advertising.com","piwik.ero-advertising.com","www.piwik.ero-advertising.com","popacs.ero-advertising.com","www.popacs.ero-advertising.com","www.popads.ero-advertising.com","rata.ero-advertising.com","www.rata.ero-advertising.com","redirect.ero-advertising.com","www.redirect.ero-advertising.com","rs.ero-advertising.com","www.rs.ero-advertising.com","rs2.ero-advertising.com","www.rs2.ero-advertising.com","s.ero-advertising.com","www.s.ero-advertising.com","s10paces.ero-advertising.com","www.s10paces.ero-advertising.com","sin.ero-advertising.com","www.sin.ero-advertising.com","smtp.ero-advertising.com","www.smtp.ero-advertising.com","spaces.ero-advertising.com","www.spaces.ero-advertising.com","speed4cksa.ero-advertising.com","www.speed4cksa.ero-advertising.com","speedclecks.ero-advertising.com","www.speedclecks.ero-advertising.com","stats.speedclicks.ero-advertising.com","www.stats.speedclicks.ero-advertising.com","www.speedclicks.ero-advertising.com","speedclics.ero-advertising.com","www.speedclics.ero-advertising.com","speedlicks.ero-advertising.com","www.speedlicks.ero-advertising.com","speeuclicks.ero-advertising.com","www.speeuclicks.ero-advertising.com","stats.ero-advertising.com","www.stats.ero-advertising.com","tex.ero-advertising.com","www.tex.ero-advertising.com","thumb.ero-advertising.com","www.thumb.ero-advertising.com","thumbads.ero-advertising.com","www.thumbads.ero-advertising.com","ad2.thumbs.ero-advertising.com","www.ad2.thumbs.ero-advertising.com","ad4.thumbs.ero-advertising.com","www.ad4.thumbs.ero-advertising.com","ad7.thumbs.ero-advertising.com","www.ad7.thumbs.ero-advertising.com","thumbs2.ero-advertising.com","www.thumbs2.ero-advertising.com","tiumbs.ero-advertising.com","www.tiumbs.ero-advertising.com","topads.ero-advertising.com","www.topads.ero-advertising.com","tracking.ero-advertising.com","www.tracking.ero-advertising.com","typo3.ero-advertising.com","www.typo3.ero-advertising.com","umbs.ero-advertising.com","www.umbs.ero-advertising.com","users.ero-advertising.com","www.users.ero-advertising.com","wdata.ero-advertising.com","www.wdata.ero-advertising.com","steenbergen.web.ero-advertising.com","www.steenbergen.web.ero-advertising.com","wiki.ero-advertising.com","www.wiki.ero-advertising.com","wks.ero-advertising.com","www.wks.ero-advertising.com","wow.ero-advertising.com","www.wow.ero-advertising.com","wsw.ero-advertising.com","www.wsw.ero-advertising.com","wta.ero-advertising.com","www.wta.ero-advertising.com","ww2.ero-advertising.com","www.ww2.ero-advertising.com","wwa.ero-advertising.com","www.wwa.ero-advertising.com","wwbanners2.ero-advertising.com","www.wwbanners2.ero-advertising.com","wws.ero-advertising.com","www.wws.ero-advertising.com","www.ero-advertising.com","thumbs.xlaces.ero-advertising.com","www.thumbs.xlaces.ero-advertising.com","xn--adspace-kvg.ero-advertising.com","www.xn--adspace-kvg.ero-advertising.com","zww.ero-advertising.com","www.zww.ero-advertising.com","pxl.ace.advertising.com","ads-ap.adaptv.advertising.com","s.update.wtag.adaptv.advertising.com","adserver-as.adtech.advertising.com","cdn7v2.crispadvertising.com","exactadvertising.com","www.exactadvertising.com","pixelperfectadvertising.com","www.pixelperfectadvertising.com","publishers.domainadvertising.com","www.buycheapadvertising.com","ads.ero-advertising.com","adspaces.ero-advertising.com","api.ero-advertising.com","apo.ero-advertising.com","banners.ero-advertising.com","data.ero-advertising.com","invideo.ero-advertising.com","layerads.ero-advertising.com","redirects.ero-advertising.com","speedclicks.ero-advertising.com","thumbs.ero-advertising.com","ads2.ero-advertising.com","askjolene.ero-advertising.com","banners2.ero-advertising.com","imads.ero-advertising.com","js.ero-advertising.com","popads.ero-advertising.com","tracker.ero-advertising.com","pops.ero-advertising.com","alternativos.iw-advertising.com","www.gcmadvertising.com","in-appadvertising.com","ads.videoadvertising.com","christianbusinessadvertising.com","data-failover.eroadvertising.com","data.eroadvertising.com","datingadvertising.com","ebayadvertising.com","ero-advertising.com","needadvertising.com","star-advertising.com","uac.advertising.com","www.christianbusinessadvertising.com","www.datingadvertising.com","www.ebayadvertising.com","www.needadvertising.com","www.star-advertising.com","www.traveladvertising.com","adaptv.advertising.com","adultadvertising.com","fireworks-advertising.com","pronetadvertising.com","yesadvertising.com","cdn2.adsdk.com","akibaol.com","wwaol.com","www.wwaol.com","free.aol.com","dynamic.aol.com","advertising.aol.com","specialoffers.aol.com","y.atwola.com","as.y.atwola.com","tw.as.y.atwola.com","eu.y.atwola.com","us.y.atwola.com","cdn.atwola.com","ar.atwola.com","ads.pictela.net","ads-us.pictela.net","secure-ads.pictela.net"],"link":"https://www.ghostery.com/whotracksme/trackers/advertising.com"},{"id":"adaway_advertica-cdn.com","name":"advertica-cdn.com","hostnames":["advertica-cdn.com","ylx-aff.advertica-cdn.com"]},{"id":"adaway_adversal.com","name":"adversal.com","hostnames":["adversal.com","go.adversal.com","www.adversal.com"]},{"id":"adaway_adventori.com","name":"adventori.com","hostnames":["cf-cdn.adventori.com","eu.adventori.com","f24.adventori.com"]},{"id":"adaway_advanseads.com","name":"advanseads.com","hostnames":["cdn.advanseads.com","count.advanseads.com","delivery.advanseads.com"]},{"id":"adaway_advangelists.com","name":"advangelists.com","hostnames":["nep.advangelists.com"]},{"id":"adaway_adups.com","name":"adups.com","hostnames":["adups.com","ap.adups.com","clean.adups.com","fota5.adups.com","fota5db.adups.com","fota5p.adups.com","fota5s.adups.com","fota5t.adups.com","fota5tbk.adups.com","ht.adups.com","iotapi.adups.com","ph5t.adups.com","push5.adups.com","bigdata.adups.com"]},{"id":"adaway_adups.cn","name":"adups.cn","hostnames":["fota4.adups.cn","fota5.adups.cn","fota5s.adups.cn","fota5t.adups.cn"]},{"id":"adaway_adtrue.com","name":"Adtrue","hostnames":["adtrue.com","cdn.adtrue.com","exchange.adtrue.com","track.adtrue.com"],"link":"https://www.ghostery.com/whotracksme/trackers/adtrue"},{"id":"adaway_adtrade.com","name":"adtrade.com","hostnames":["api.adtrade.com"]},{"id":"adaway_adtraction.com","name":"Adtraction","hostnames":["track.adtraction.com"],"link":"https://www.ghostery.com/whotracksme/trackers/adtraction"},{"id":"adaway_adtng.com","name":"adtng.com","hostnames":["adtng.com","a.adtng.com","hw-cdn2.adtng.com","vz-cdn2.adtng.com"],"link":"https://www.ghostery.com/whotracksme/trackers/adtng.com"},{"id":"adaway_adtiming.com","name":"adtiming.com","hostnames":["img.adtiming.com","m.adtiming.com","ociasb.adtiming.com","rt.adtiming.com","sdk.adtiming.com"]},{"id":"adaway_adtimaserver.vn","name":"Adtima","hostnames":["adtimaserver.vn","api.adtimaserver.vn","log.adtimaserver.vn","media.adtimaserver.vn","media.org.adtimaserver.vn","staging.api.adtimaserver.vn","static.adtimaserver.vn","static2.adtimaserver.vn","stream.adtimaserver.vn","stream.org.adtimaserver.vn","web.api.adtimaserver.vn"],"link":"https://www.ghostery.com/whotracksme/trackers/adtima"},{"id":"adaway_adtima.vn","name":"adtima.vn","hostnames":["adtima.vn","stc.adtima.vn","api.adtima.vn","demo.adtima.vn","gallery.adtima.vn","ignite.adtima.vn","manage.adtima.vn","product.adtima.vn","prp.adtima.vn","static.adtima.vn","www.adtima.vn"]},{"id":"adaway_adtilt.com","name":"adtilt.com","hostnames":["adc-ad-assets.adtilt.com"]},{"id":"adaway_adthrive.com","name":"adthrive.com","hostnames":["ads.adthrive.com","logger.adthrive.com","marmalade.adthrive.com","track.adthrive.com","dev-track.adthrive.com"]},{"id":"adaway_adthor.com","name":"adthor.com","hostnames":["adthor.com","logger.adthor.com","api.adthor.com"]},{"id":"adaway_adtheorent.com","name":"adtheorent.com","hostnames":["adtheorent.com","ads.adtheorent.com","cdn.adtheorent.com"]},{"id":"adaway_adtelligent.com","name":"adtelligent.com","hostnames":["dsp3.adtelligent.com","ghb.adtelligent.com","ghb1.adtelligent.com","ghb2.adtelligent.com","pixel.adtelligent.com","player.adtelligent.com","s.adtelligent.com","static.adtelligent.com","sync.adtelligent.com"]},{"id":"adaway_adtechjp.com","name":"adtechjp.com","hostnames":["adserver.adtechjp.com","adserver-toy.adtechjp.com","prod.adtechjp.com","ter-adserver-origin-ap.prod.adtechjp.com"]},{"id":"adaway_adtech.com","name":"adtech.com","hostnames":["adtech.com","ums.adtech.com"]},{"id":"adaway_adsymptotic.com","name":"Drawbridge","hostnames":["adsymptotic.com","api.adsymptotic.com","p.adsymptotic.com","pinterest.adsymptotic.com"],"link":"https://www.ghostery.com/whotracksme/trackers/drawbridge"},{"id":"adaway_adsunflower.com","name":"adsunflower.com","hostnames":["adsunflower.com","folder.adsunflower.com","rebootv5.adsunflower.com","bigdata.adsunflower.com"]},{"id":"adaway_adstune.com","name":"adstune.com","hostnames":["adstune.com"]},{"id":"adaway_adspruce.com","name":"adspruce.com","hostnames":["adspruce.com","sdk.adspruce.com","ani.adspruce.com","assets.adspruce.com","info.adspruce.com","queue.adspruce.com","sync.adspruce.com","track.adspruce.com"]},{"id":"adaway_adsplay.net","name":"adsplay.net","hostnames":["adsplay.net","d.adsplay.net","log.adsplay.net","admin.adsplay.net","d1.adsplay.net","d2.adsplay.net","d3.adsplay.net","d4.adsplay.net","d5.adsplay.net","d6.adsplay.net","engineering.adsplay.net","id.adsplay.net","log1.adsplay.net","log2.adsplay.net","log3.adsplay.net","log4.adsplay.net","report.adsplay.net","st.adsplay.net","static.adsplay.net","www.adsplay.net"]},{"id":"adaway_adsplay.in","name":"adsplay.in","hostnames":["track.adsplay.in"]},{"id":"adaway_adsorb.com","name":"adsorb.com","hostnames":["collect.adsorb.com"]},{"id":"adaway_adsolutions.com","name":"adsolutions.com","hostnames":["tagmans3.adsolutions.com"]},{"id":"adaway_adsniper.ru","name":"AdSniper","hostnames":["adsniper.ru","sync3.adsniper.ru","pixel.adsniper.ru"],"link":"https://www.ghostery.com/whotracksme/trackers/adsniper.ru"},{"id":"adaway_adsmovil.com","name":"adsmovil.com","hostnames":["atr.adsmovil.com"]},{"id":"adaway_adsmoloco.com","name":"adsmoloco.com","hostnames":["adsmoloco.com","bidfnt-asia.adsmoloco.com","cdn-f.adsmoloco.com","tr-asia.adsmoloco.com","tr-eu.adsmoloco.com","tr-us.adsmoloco.com"]},{"id":"adaway_adsmogo.org","name":"adsmogo.org","hostnames":["adsmogo.org"]},{"id":"adaway_adsmogo.net","name":"adsmogo.net","hostnames":["adsmogo.net"]},{"id":"adaway_adsmogo.mobi","name":"adsmogo.mobi","hostnames":["adsmogo.mobi"]},{"id":"adaway_adsimilate.com","name":"adsimilate.com","hostnames":["filteradkernel.adsimilate.com","xml1.adsimilate.com"]},{"id":"adaway_adserve.work","name":"adserve.work","hostnames":["adserve.work"]},{"id":"adaway_adsbynimbus.com","name":"adsbynimbus.com","hostnames":["adsbynimbus.com","growlr.adsbynimbus.com","mw-encyclopediabritannica.adsbynimbus.com","timehop.adsbynimbus.com","turbo.adsbynimbus.com","ua-myfitnesspal.adsbynimbus.com","weatherbug.adsbynimbus.com","yoc-steps.adsbynimbus.com"]},{"id":"adaway_adsame.com","name":"Adsame","hostnames":["adsame.com"],"link":"https://www.ghostery.com/whotracksme/trackers/adsame"},{"id":"adaway_ads5-adnow.com","name":"ads5-adnow.com","hostnames":["ads5-adnow.com","n.ads5-adnow.com","st-n.ads5-adnow.com"]},{"id":"adaway_ads3-adnow.com","name":"Adnow","hostnames":["ads3-adnow.com","n.ads3-adnow.com","st-n.ads3-adnow.com","ad.smaclick.com","st.ad.smaclick.com"],"link":"https://www.ghostery.com/whotracksme/trackers/adnow"},{"id":"adaway_ads2-adnow.com","name":"ads2-adnow.com","hostnames":["ads2-adnow.com","n.ads2-adnow.com","st-n.ads2-adnow.com","st.n.ads2-adnow.com"]},{"id":"adaway_ads1-adnow.com","name":"ads1-adnow.com","hostnames":["ads1-adnow.com","n.ads1-adnow.com","st-n.ads1-adnow.com"]},{"id":"adaway_ads-twitter.com","name":"X Advertising","hostnames":["ads-twitter.com","static.ads-twitter.com"],"link":"https://www.ghostery.com/whotracksme/trackers/twitter_ads"},{"id":"adaway_adrta.com","name":"Pixalate","hostnames":["adrta.com","cdn.adrta.com","gateway.adrta.com","ipds.gateway.adrta.com","ipds.adrta.com","ipv6.adrta.com","p.adrta.com","pix.adrta.com","q.adrta.com","r.adrta.com"],"link":"https://www.ghostery.com/whotracksme/trackers/pixalate"},{"id":"adaway_adroll.com","name":"AdRoll","hostnames":["adroll.com","adx-winners-ap-southeast-1-rtb.adroll.com","adx-winners-eu-west-1-rtb.adroll.com","adx-winners-us-east-1-rtb.adroll.com","adx-winners-us-west-2-rtb.adroll.com","apn-winners-ap-southeast-1-rtb.adroll.com","apn-winners-eu-west-1-rtb.adroll.com","apn-winners-us-east-1-rtb.adroll.com","apn-winners-us-west-2-rtb.adroll.com","app.adroll.com","d.adroll.com","index-winners-ap-southeast-1-rtb.adroll.com","index-winners-eu-west-1-rtb.adroll.com","index-winners-us-east-1-rtb.adroll.com","index-winners-us-west-2-rtb.adroll.com","opx-winners-eu-west-1-rtb.adroll.com","opx-winners-us-east-1-rtb.adroll.com","opx-winners-us-west-2-rtb.adroll.com","pubmatic-winners-eu-west-1-rtb.adroll.com","pubmatic-winners-us-east-1-rtb.adroll.com","pubmatic-winners-us-west-2-rtb.adroll.com","rub-winners-eu-west-1-rtb.adroll.com","rub-winners-us-east-1-rtb.adroll.com","rub-winners-us-west-2-rtb.adroll.com","yax-winners-ap-southeast-1-rtb.adroll.com","yax-winners-eu-west-1-rtb.adroll.com","yax-winners-us-east-1-rtb.adroll.com","yax-winners-us-west-2-rtb.adroll.com","pubmatic-winners-ap-northeast-1-rtb.adroll.com","assets1.adroll.com","a.adroll.com","s.adroll.com","c.adroll.com"],"link":"https://www.ghostery.com/whotracksme/trackers/adroll"},{"id":"adaway_adrizer.com","name":"adrizer.com","hostnames":["run.adrizer.com"]},{"id":"adaway_adpxl.co","name":"adpxl.co","hostnames":["adpxl.co","adpxljs.adpxl.co","fl.adpxl.co"]},{"id":"adaway_adpushup.com","name":"adpushup.com","hostnames":["amp.adpushup.com","public-webservice.apdc1n.adpushup.com","apdc3n.adpushup.com","public-webservice.apdc3n.adpushup.com","cdn.adpushup.com","geo.adpushup.com","public-webservice.geo.adpushup.com","vastdump-staging.adpushup.com"]},{"id":"adaway_adpopcorn.com","name":"adpopcorn.com","hostnames":["sspi.adpopcorn.com","ssptrk.adpopcorn.com"]},{"id":"adaway_adpies.com","name":"adpies.com","hostnames":["adp.adpies.com"]},{"id":"adaway_adpia.vn","name":"adpia.vn","hostnames":["click.adpia.vn"]},{"id":"adaway_adotube.com","name":"AdoTube","hostnames":["adotube.com","www.adotube.com","stats.adotube.com"],"link":"https://www.ghostery.com/whotracksme/trackers/adotube"},{"id":"adaway_adop.cc","name":"adop.cc","hostnames":["adop.cc","appinfo.adop.cc","compass.adop.cc"]},{"id":"adaway_adnium.com","name":"Adnium","hostnames":["adnium.com","a.adnium.com"],"link":"https://www.ghostery.com/whotracksme/trackers/adnium.com"},{"id":"adaway_adnetwork.vn","name":"Ambient Digital","hostnames":["adnetwork.vn","delivery.adnetwork.vn","media.adnetwork.vn","adnetwork.net.vn","ambientplatform.vn","track.adnetwork.vn","client-pages.adnetwork.vn","conv.adnetwork.vn","imp.adnetwork.vn","member.adnetwork.vn","metrics.adnetwork.vn","retg.adnetwork.vn","s-cm.send.adnetwork.vn","www.adnetwork.vn","campaigns.ambientplatform.vn","cdn.ambientplatform.vn","cdn.m.ambientplatform.vn","click.m.ambientplatform.vn","delivery.m.ambientplatform.vn","imp.m.ambientplatform.vn","media.ambientplatform.vn","media.m.ambientplatform.vn","metrics.m.ambientplatform.vn","rd.ambientplatform.vn"],"link":"https://www.ghostery.com/whotracksme/trackers/ambient_digital"},{"id":"adaway_adnetmedia.lt","name":"adnetmedia.lt","hostnames":["banners.adnetmedia.lt"]},{"id":"adaway_admulti.com","name":"ADmulti","hostnames":["admulti.com","gag.admulti.com","go.admulti.com","s.admulti.com"],"link":"https://www.ghostery.com/whotracksme/trackers/admulti"},{"id":"adaway_admost.com","name":"admost.com","hostnames":["admost.com","run.admost.com"]},{"id":"adaway_admob.com","name":"admob.com","hostnames":["apps.admob.com","media.admob.com"]},{"id":"adaway_admitad.com","name":"Admitad","hostnames":["admitad.com","ad.admitad.com","fonts.ad.admitad.com","cdn.admitad.com"],"link":"https://www.ghostery.com/whotracksme/trackers/admitad.com"},{"id":"adaway_admedo.com","name":"Admedo","hostnames":["admedo.com","l.admedo.com","pj.l.admedo.com","ps.l.admedo.com","adizio.com","pool.admedo.com","pool.adizio.com"],"link":"https://www.ghostery.com/whotracksme/trackers/admedo_com"},{"id":"adaway_admarvel.com","name":"admarvel.com","hostnames":["admarvel.com","ads.admarvel.com","amp.admarvel.com","base-cdn.admarvel.com","omax.admarvel.com"]},{"id":"adaway_admarketplace.net","name":"admarketplace.net","hostnames":["bridge.lga1.admarketplace.net","pca.admarketplace.net","bridge.sfo1.admarketplace.net","tracking.admarketplace.net"]},{"id":"adaway_adligature.com","name":"adligature.com","hostnames":["cdn.adligature.com"]},{"id":"adaway_adledge.com","name":"adledge.com","hostnames":["rs2.adledge.com"]},{"id":"adaway_adkmob.com","name":"adkmob.com","hostnames":["bp.adkmob.com","cm.adkmob.com","profile.adkmob.com","ssdk.adkmob.com","ufs.adkmob.com"]},{"id":"adaway_adkernel.com","name":"adkernel.com","hostnames":["dsp.adkernel.com","static-rtb.adkernel.com","sync.adkernel.com","tag.adkernel.com"]},{"id":"adaway_adjust.world","name":"adjust.world","hostnames":["adjust.world","app.adjust.world"]},{"id":"adaway_adjoe.zone","name":"adjoe.zone","hostnames":["fraud.adjoe.zone","prod.fraud.adjoe.zone","prod.adjoe.zone"]},{"id":"adaway_adingo.jp","name":"Fluct","hostnames":["adingo.jp","cc.adingo.jp","hv.adingo.jp","pdn.adingo.jp","sh.adingo.jp","hb.adingo.jp","cdn-fluct.sh.adingo.jp","cs.adingo.jp","i.adingo.jp","s.sh.adingo.jp"],"link":"https://www.ghostery.com/whotracksme/trackers/fluct"},{"id":"adaway_adincube.com","name":"adincube.com","hostnames":["tag.adincube.com"]},{"id":"adaway_adikteev.com","name":"adikteev.com","hostnames":["aksdk-images.adikteev.com"]},{"id":"adaway_adhood.com","name":"adhood","hostnames":["adhood.com","ads.adhood.com","www.adhood.com","testapp.adhood.com"],"link":"https://www.ghostery.com/whotracksme/trackers/adhood"},{"id":"adaway_adhitzads.com","name":"AdHitz","hostnames":["adhitzads.com","p3.adhitzads.com"],"link":"https://www.ghostery.com/whotracksme/trackers/adhitz"},{"id":"adaway_adhaven.com","name":"adhaven.com","hostnames":["adobe.adhaven.com","beachfront.adhaven.com","e.adhaven.com","nxd.adhaven.com","openx.adhaven.com","telaria.adhaven.com"]},{"id":"adaway_adgrx.com","name":"AdGear","hostnames":["adgrx.com","cdn.adgrx.com","cdn-stv.adgrx.com","cm.adgrx.com","rtb.adgrx.com","tvx.adgrx.com","adgear.com","cdn.adgear.com","d.adgear.com","o.adgear.com"],"link":"https://www.ghostery.com/whotracksme/trackers/adgear"},{"id":"adaway_adgaterewards.com","name":"adgaterewards.com","hostnames":["clk.adgaterewards.com","wall.adgaterewards.com"]},{"id":"adaway_adfuture.cn","name":"adfuture.cn","hostnames":["adfuture.cn","folder.adfuture.cn","fotacontrol.adfuture.cn","rebootv5.adfuture.cn","bigdata.adfuture.cn"]},{"id":"adaway_adfox.net","name":"adfox.net","hostnames":["banners.adfox.net"]},{"id":"adaway_adforgames.com","name":"adforgames.com","hostnames":["adforgames.com","www.adforgames.com"]},{"id":"adaway_adfalcon.com","name":"AdFalcon","hostnames":["adfalcon.com","api.adfalcon.com"],"link":"https://www.ghostery.com/whotracksme/trackers/adfalcon"},{"id":"adaway_adelement.com","name":"adelement.com","hostnames":["ads.adelement.com","ctv.adelement.com","sc.adelement.com"]},{"id":"adaway_addealsnetwork.com","name":"addealsnetwork.com","hostnames":["adsinter1.addealsnetwork.com","adsvideo1.addealsnetwork.com","trk-int.addealsnetwork.com"]},{"id":"adaway_adcell.com","name":"adcell.com","hostnames":["t.adcell.com"]},{"id":"adaway_adcel.co","name":"adcel.co","hostnames":["rtb.adcel.co"]},{"id":"adaway_adbro.me","name":"adbro.me","hostnames":["adbro.me","apis.adbro.me","cdn.adbro.me","api.adbro.me","portal.adbro.me","tag.adbro.me"]},{"id":"adaway_adblade.com","name":"Adblade","hostnames":["adblade.com","dmp.adblade.com","pixel.adblade.com","static-cdn.adblade.com","web.adblade.com","static.cdn.adblade.com","y.cdn.adblade.com","staticd.cdn.adblade.com"],"link":"https://www.ghostery.com/whotracksme/trackers/adblade.com"},{"id":"adaway_adasiaholdings.com","name":"AdAsia Holdings","hostnames":["adasiaholdings.com","adnetwork.adasiaholdings.com","advertisers.adasiaholdings.com","apm.adasiaholdings.com","media.adasiaholdings.com","pixel.adasiaholdings.com","publishers.adasiaholdings.com","www.adasiaholdings.com"],"link":"https://www.ghostery.com/whotracksme/trackers/adasia_holdings"},{"id":"adaway_adapex.io","name":"adapex.io","hostnames":["adapex.io","cdn.adapex.io"]},{"id":"adaway_adap.tv","name":"Adap.tv","hostnames":["adap.tv","segments.adap.tv","sync.adap.tv","ads.adap.tv","redir.adap.tv","control.adap.tv","u-ads.adap.tv","log.adap.tv","qlog.adap.tv","t-ads.adap.tv","companion.adap.tv"],"link":"https://www.ghostery.com/whotracksme/trackers/adap.tv"},{"id":"adaway_adadapted.com","name":"adadapted.com","hostnames":["ec.adadapted.com","images.adadapted.com","payload.adadapted.com"]},{"id":"adaway_ad6media.fr","name":"ad6media","hostnames":["ad6media.fr","ad6media.co.uk","c.ad6media.fr","jb9clfifs6.s.ad6media.fr","mr4evmd0r1.s.ad6media.fr","t8t7frium3.s.ad6media.fr","uelbdc74fn.s.ad6media.fr","www.ad6media.fr"],"link":"https://www.ghostery.com/whotracksme/trackers/ad6media"},{"id":"adaway_ad4game.com","name":"ad4game","hostnames":["ads.ad4game.com"],"link":"https://www.ghostery.com/whotracksme/trackers/ad4game"},{"id":"adaway_ad2iction.com","name":"ad2iction.com","hostnames":["adlogs.ad2iction.com","ads.ad2iction.com","content.ad2iction.com"]},{"id":"adaway_ad-stir.com","name":"adstir","hostnames":["ad-stir.com","bypass.ad-stir.com","js.ad-stir.com","sync.ad-stir.com","tr.ad-stir.com","ad.ad-stir.com","dist.bpc.ad-stir.com"],"link":"https://www.ghostery.com/whotracksme/trackers/adstir"},{"id":"adaway_ad-srv.co","name":"ad-srv.co","hostnames":["c.ad-srv.co"]},{"id":"adaway_ad-score.com","name":"ad-score.com","hostnames":["data.ad-score.com","data2.ad-score.com","js2.ad-score.com","rdr.ad-score.com","rt.ad-score.com"]},{"id":"adaway_ad-locus.com","name":"ad-locus.com","hostnames":["api.ad-locus.com","a.api.ad-locus.com"]},{"id":"adaway_ad-delivery.net","name":"ad-delivery.net","hostnames":["ad-delivery.net"]},{"id":"adaway_activemetering.com","name":"activemetering.com","hostnames":["activemetering.com","track.activemetering.com"]},{"id":"adaway_acmeaom.com","name":"acmeaom.com","hostnames":["tags.acmeaom.com"]},{"id":"adaway_accesstrade.vn","name":"accesstrade.vn","hostnames":["static.accesstrade.vn"]},{"id":"adaway_abc.com","name":"JuggCash","hostnames":["sw88.abc.com","contentabc.com","ads.contentabc.com","cdn11.contentabc.com","hw-cdn.contentabc.com","hw-cdn2.contentabc.com","vz-cdn.contentabc.com","vz-cdn2.contentabc.com","static.contentabc.com","ads2.contentabc.com","cdn1.ads.contentabc.com","viamichelin.cdn11.contentabc.com","ads3.contentabc.com","scripts.mofos.com","ads.mofos.com"],"link":"https://www.ghostery.com/whotracksme/trackers/juggcash"},{"id":"adaway_abbi.io","name":"abbi.io","hostnames":["assets.abbi.io","rtapi.abbi.io","stats.abbi.io"]},{"id":"adaway_aarki.net","name":"aarki.net","hostnames":["adx-asia.aarki.net","adx-asia-imp.aarki.net","adx-west-imp.aarki.net","chartboost-imp.aarki.net","rm.aarki.net","rm-hk.aarki.net","spire.aarki.net","unity-imp.aarki.net"]},{"id":"adaway_aamsitecertifier.com","name":"aamsitecertifier.com","hostnames":["aamcf.aamsitecertifier.com"]},{"id":"adaway_aamapi.com","name":"aamapi.com","hostnames":["aamapi.com"]},{"id":"adaway_aa.com","name":"aa.com","hostnames":["smetrics.aa.com"]},{"id":"adaway_a8.net","name":"A8","hostnames":["a8.net","ad.a8.net","amz-ad.a8.net","px.a8.net","rot0.a8.net","rot1.a8.net","rot2.a8.net","rot3.a8.net","rot4.a8.net","rot5.a8.net","rot6.a8.net","rot7.a8.net","rot8.a8.net","rot9.a8.net","rws.a8.net","www10.a8.net","www11.a8.net","www12.a8.net","www12.moba8.net","www13.a8.net","www13.moba8.net","www14.a8.net","www14.moba8.net","www15.a8.net","www15.moba8.net","www16.a8.net","www16.moba8.net","www17.a8.net","www17.moba8.net","www18.a8.net","www18.moba8.net","www19.a8.net","www19.moba8.net","www20.a8.net","www20.moba8.net","www21.a8.net","www21.moba8.net","www22.a8.net","www22.moba8.net","www23.a8.net","www23.moba8.net","www24.a8.net","www24.moba8.net","www25.a8.net","www25.moba8.net","www26.a8.net","www26.moba8.net","www27.a8.net","www27.moba8.net","www28.a8.net","www28.moba8.net","www29.a8.net","www29.moba8.net","trck.a8.net"],"link":"https://www.ghostery.com/whotracksme/trackers/a8"},{"id":"adaway_a3cloud.net","name":"a3cloud.net","hostnames":["segment.a3cloud.net"]},{"id":"adaway_a2z.com","name":"a2z.com","hostnames":["prod.cm.publishers.advertising.a2z.com","notify.bugsnag.appstore.a2z.com","analytics.console.aws.a2z.com","pr.analytics.console.aws.a2z.com","prod.pr.analytics.console.aws.a2z.com","ap-southeast-1.prod.pr.analytics.console.aws.a2z.com","us-east-1.prod.pr.analytics.console.aws.a2z.com","us-east-2.prod.pr.analytics.console.aws.a2z.com","us-west-2.prod.pr.analytics.console.aws.a2z.com","pw.analytics.console.aws.a2z.com","prod.pw.analytics.console.aws.a2z.com","metrics.client-eng.a2z.com","global.telemetry.insights.video.a2z.com","us-east-1.prod.pw.analytics.console.aws.a2z.com"]},{"id":"adaway_a.ki","name":"a.ki","hostnames":["fl.a.ki"]},{"id":"adaway_9gag.com","name":"9gag.com","hostnames":["rlog.9gag.com"]},{"id":"adaway_88-f.net","name":"88-f.net","hostnames":["cdn.88-f.net","config.88-f.net"]},{"id":"adaway_81plug.com","name":"81plug.com","hostnames":["logs.81plug.com"]},{"id":"adaway_51ginkgo.com","name":"51ginkgo.com","hostnames":["51ginkgo.com"]},{"id":"adaway_4dsply.com","name":"AdSupply","hostnames":["4dsply.com","cdn.engine.adsupply.com","cdn.engine.4dsply.com","engine.4dsply.com","engine.trklnks.com","cdn.engine.trklnks.com"],"link":"https://www.ghostery.com/whotracksme/trackers/adsupply"},{"id":"adaway_4dex.io","name":"4dex.io","hostnames":["c.4dex.io","script.4dex.io"]},{"id":"adaway_404mobi.com","name":"404mobi.com","hostnames":["404mobi.com"]},{"id":"adaway_3gl.net","name":"Catchpoint","hostnames":["3gl.net","g.3gl.net","r.3gl.net"],"link":"https://www.ghostery.com/whotracksme/trackers/catchpoint"},{"id":"adaway_360in.com","name":"360in.com","hostnames":["360in.com","ad.360in.com","challenge.360in.com","dispatcher.360in.com","exp.360in.com"]},{"id":"adaway_247-inc.net","name":"247-inc.net","hostnames":["api.247-inc.net","tie.247-inc.net"]},{"id":"adaway_206ads.com","name":"206ads.com","hostnames":["s.206ads.com"]},{"id":"adaway_1mobile.com","name":"1mobile.com","hostnames":["api4.1mobile.com"]},{"id":"adaway_163.com","name":"NetEase","hostnames":["analytics.163.com","crash.163.com","iad.g.163.com"],"link":"https://www.ghostery.com/whotracksme/trackers/163"}],"createdAt":"2024-06-07T08:42:47.323Z"} \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..b7b76b7b98c12d33670d2ce4e08e8cf8a27a04cc GIT binary patch literal 90574 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

y$q?a(td#(Q@rN8(=7o! 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

    #pvs?d&S`OGU) zPUoY}&;bi)expDUZ-DBd3%So-)=+YV8{WJx1&r6gkmKu58pLA2JCks=jRUiyh$VG9 zY>=a5O~EsPWXhk%vG#$7z5`r}0eKFSNHxh$am58zIw?i!sd~@KlJ68CzjFhmOu2g$ zasKy*h){AMP>z-oEJ%2P=hlKM%MDO#NW*{;h8#~(&fA=~DcEH$)v9@rKdH8*@x0Mz ztUw!8l#gVMWTI|;n|w=rOng`aCV%GVI`IG5(h7DkRf7YirZ`p*2t&|__HiNHRU5?V z3*wgpK;3HQxCvIBSH_QSKDsH|5Ba0~9|DCcggI!^Lr5|($8p$V4fQc;57t0Xu!fE0 zne~>{Kq|^z47AkM>C;_z4XSUD+V^)k;Zo-#Z!L4>Yseyu1@>jl zgymUNcFMpQpIAIZe~?7Etg!F?g#IW(4bw*VK+!QFX=6RqO2_(%sT0(sWlrkL>@_&E z<@@-S`-jeVHuOJxibMdx_&pT_0&--336MO<6=9~h9R#Z(7tehw}jp%a4q1t0UqJon(*V-FnvxgQW zNrZGJ*3;&&j?AIp?P$JlnfD>NA#{f{176kHBCJ}(CIQ|+0dx^ac8ICv`@==2(VsztXxc%xG6hAs1X3xFdz=AN4%o;G@#P}n+AVeYS2VpI-x28h9Wqa0k zKV;vy>P4LB-m>StlHB)~5;60vMTfx(suf9Q#qpY+lap};mPXWqjRkb7)qP{VpQ3V@ zB4nB1B`c)?F<;nhN%E%`C!w>*90io1V<2`hAk5w)%puq8CC4@RiDXqA@^%*KDKx*0 zSD;jf=Kr*^+>Kh>HBA+lULU7=4u~5Y`oDU~0IU8WVNtT}5kpRlAEJAgEZr)gk!2e4 zehr`N@!dNw(|rVxw4V%~^``>H^U4+2 z28tM;X+0CG_#x`9n*uqO|F7RuZ(+o0V2?h7#P6?w2|T%F7D|Gn$g)om6QI;?-wJPy zhtS|UD-~O92S1hsnHcZPLQJ?uQ67?s#yv=-U^nSLlQcNMOyrL17lmgm$u-)8CTZ32 zU-knE&isLe)iT``&iBDW3^X_ZS<$1U9;oEG3$SKN8@uN_hg@ZPeamOV>c6$w6KwUF`$E@;u#gEFq|Z4vQ+#N`cb4ySTpa@Vs_ z=*5OIGHQwgL3M5vK1`?C@raB60XU5-9IRgxQXzY(a0f2BUV8}eUTSBf3ClX`y3KV7*ykmY3qG}Cg$A+Pn}bca zoQHU_*alIBE140^T$~@W$dJ=)>Qn9@zRQF#5|=I`2>-{NMo6` zh^wp09<;76&Ng)hfH5!7%@B#=)$DDFPpPj8|2fp!MEBYE%J0FEDPReSeRoYk2FD98 zs{ggh3aNA-3Xyj&-!PVeY4eJkpa2fNaO_C=!L^@B$>&w+JAtsXp{)!8OX64!pLK>Q zA&iESN9CHZ4sHaKF4_qqv>XVWBay_Sa&4kEGn$wOQu8{^0mn|a@IBMsf*5F4<e@g}JBrxl4P+Za09Uky)qPZ88OO4r zcaQ-Q-g2}FEwGmF69{3LrKMzq!zgSVEn`qOKA=3_54%nlNl@tprV98~==&h4j6X9v zDM_3$Nzw~Fo}K3I&P$8WfdKex8pTgh-gYOB$#y4p13IGmBm2_HUjk&zke7)2j81f9 z8Dtv3mqEOEbM@^TXTP3H!HkdE=d$|>OQ=x7-*=C4GZz91Qy+N6b9dF}?mfEegAbCF z6(HrEwCmi>#EySv(&2kiTuYKqAhBRzOH~r=kE>U2*TEd7wd5XqZl7LV;^qeA{jVk3 zk9CLq?vgC4Evbtlk<~0HU`#*GJZ^bh)0w~XS~!KL~6}Lpg7D z6ZqcBSMU_IwaDHg(8PHBVqTVB$@;m))*plg=b$becQY5tEE*uu_YixG3@KG3>hBLC zf6^&83%a-WuB3`*Eq>s4i(Gx@QBf34Ssq^_;64M9o8EU(VjBq$$=Q`%x4}`FW8XumveOye?*y$R@e3=r=HssL2$@=>v(l5wD z5=|7AvuH%T^ReY`4&X62my)I+VC`_WSH?O%SS;RAaB!3 z+4&rZA9#u#mqloUCW$vlss{eD0Q~@@XX_KkKn@_i4=3^YL&Vu1vc;_pbr9uF00XfO zZky|+pub}d>ij?(WU~TLzay3-#-MJ1d({K#u%-Kk zTF1dvRgk~AtVl#v1IJWZvPgro++G{qZz+ghl(`&#bJP0&o&fWd_3vY=ViQxE8er|q zfbP`N;77HEk<@bznX2&=?k209*~A2H*6q%oAO%!iKpZb2so!z-ARQjK;}ve^R|Y^uCZtNHWD&=wGVf9LJ8P$1sd<-%NtylNoXcZ!*uV<0pD zunE#6qs%Tpg-36gm9`5%%1*2t$}dOEov78BV4{-1(7(|?Ka-4rw5L|0XQqZ1%oeap znMs&T?((>QtX#swU}L9$6=1PqsZowqoRM)#R$$eGc0KujpY9RIbst8$^f;{I#C zgZ3k@i`86G%}IseL#jQ-^5F_WqSx$>1`C7-a(FMBVz-D1iPb4;A*GhX|zuhS3reN;}ZyWLwfC0h?HWSt=gv|HDpYzKmKNaz=3 zFcrqjDtRx|K}7Db6cudRhi?^E1x2EtmGPUgNpJ>{|6}o@y!1$BD%MuDMZg*>R;oeN zKS9ozM%ngsO3KQcFtO5@UB`FLU7xE&XEas+(V*gi6vYePE& zY5*h7E=6nS2zWm?gI^HQpKKKG5KPlF<9equ-m&4(dfg6s`tweV;iWRu3Z zmsh3KGV7@)6AgXYt`klt+_=W@K_V_Tz#GUBtxR z2}q~lnk<2`reYn8&;W~QZgbe#4OLm*`Mp)(;DCCC7jF}au+7A+^>opqLDTMrmWIU5 ztiKgW5-59sV%G?7c%2A|Ks29hGMQ+SENne^)Zt8Q12rQJd>h18FG%42t}(=hPLu^% zuVh17bQJe2F(9=nnxl~7H)N|p%8VcI36<&=_) zR!OB2+Gbux>xq;WNlc|pPB|@-l$mLvPNc$7R5K__VT8QQ@_yGd{lDMutVQO1pXa&n z>%Q*mz8-Hv!*ZUP^3u7!I4gE^)g}J)8?$fB z)cI$d1FP`yyKY7874WR(4dR@aJQQMM!L>=Pz#PYrfQ4SeTQp+K$@JkO8L;_57L5iM6x9hr4=B^=$d~l68SAj zrV}y|8X#mQ$_i3w2?xSnIlAzJer%Q~Jxf%sx$IRLUoR_OUD02;E^q<@-cnA7jVU}b zmx}(@|23NbH0eiryne_6L_BR{aqo3dcgeV$+cPnCqzqsDeZhBq9hptSx^ef{+3;22 zKcfqm#({Aq(WNG*eO)O!si1|Vx}>KsV+L%KA5r`HotvjWt(x(#{h&)1k0KH>7b4rl zS3asVi5#z#F++9L4xzO}Bgf9KW0$dgr`ZD*@14xrg4bl9#pz4BgEhV>Wh{rzJd-;6 zi-e6b`GuRv**=SW%2^Z5`b?XCgitJ_CG7CdQM;BhK@}gsyGLDWB!plMENF*SN@iDX0Lw8FiY0;JFc?OCIkkd+&mne>fV80 z{dFA9*ZC{oHgyTuxhE7TYQk}5vW5t8l<~u~l@$jn=15rg0ViX&O#jMhrjn%TDDH4> z)a(0;azH)+$ZYQF8l;?BZ!UK|1K7nF0CIU=4BsVvR(vJFHrrOQv~tSCX>b{l`)@HM zxZ!O}gbVorST_!Pn_TFZ?wvkAeO~$ugB^~;gzC|bBY)^j4p>d1F2uBjMpK{% z9tVY0yXsRcipV_N(S9D-O!r5~r)lAyKH6n%@6O05Ycu6?=y$8SgCLB+>j2C-4{4pY z$nEgdE2+VFn`oUIR$;$Xp<*^b4ye!XtnvQH@ zS7$8uyl989l9NT!*@2(to1c+oqD_s(zNdOt3-Q~ne#)&!e_YlY3~BXU(8&w83{x)o zx;Sm|ibDdee~dB}79adGsTi-He`{KWly;}l?z37*J?Qxm^qi82l%cJHK6fnN_r-Q0 zTiJ?P#+rWe@3{|eOk&;cW~@CUifbndnD!DfPXNdV&%C=9WF*f7oH@q5$t}_j#fytg zeT!G`bNeG`=m!8e)Gio6(E{?bmbn5eDB8`}96$#|AS&0RHW#r$yQ_p}C!nlbGX|VK zS+3e*M72Mg!U+8if-Zg`Cz}FLAiP=izuV+FM|Q{~(6(8zXvM-O@p!hFS0#5vFnIpc zvF)mDS1-&-axRlwneQq-cF~xXL#G$oz8lz82Nu*Og^YW@hC z2|CV+kX1|=R1S`~Mlse*$2J=gox!pSTr%@zdl(HbDS zR19Z`XxoS_q7 zp`vDn-Ny3)8n>Q;qI}z#xG*aGdbWYmM2vG7+z7S&%k9GF1_)Ld#PUPi)d}aTbYaEu ziU|2-w;|SP@lO^?-p@W=1}dqada1};Aa%Q)x918dF zC)kPe`=?K4#ZUMq%emK6i=`QF8G9K^^PjCXk=}=O8PNxyXmfIh=FTJ!RNVM{lrLk# z`5uA$lL4@`d9DQhgvpRj2!)JYS52mGhY_W~?pXgp;L~h~7-oP06s8EchRW72?VbFf zX#Rff7(d3QRU2j+uG1T&RahbH| zOM@A64;^EV+)=raefs##DzOf>@bzPt(%ew6)=^2cMhK*<2`a}6F6=QD0f7J9+%|{v-gKBZC zy3)^tzBM*?&~JrHpr-7Zr>iMi?2p1704wEE*SIxvJC9If#HHW;JSLsZ5lSSBf4y$; zS+Y{SXRqlD=EKfx()-fE=qq_tQdESZgAesGC>w|?L4In;sVXx{8Te_uGiyzE0u@_U ztuSQp*Pi1Z^$}MzWIV?fbJf5e;21Dz$Si=c`sn=j2fUY&tZzM%ZjTj9!zE-^DlV)Sc%}h6lTVA_7(}}DzCBM z7ic^GZj1fn#z{&$Sx(Bhm>Ih2m06}0!z8S^wQinkhSkKKl^Iag+lAABqA!BzC?V9= z9*jZ@XOJ0qT!0D&NtCZ)wf5*Z94%8QEFQE-TC)zP-XKi>VNy&9q+L^m|4+zcAezu~ z>}kzj%|6YEoYY6plV0n|2k1LA$NUzs81jG{_Fyn3_H~4HhkN>$!dZ3ZXu}6cM17$| zf-p)S)bw3a*&X|f4aGmDZJ<0fzh%X7{gBJ(>P+FJtT=h%hC0K7lPr@aR;O3TS3@SW zv8rv7=gf>LlZGl$9Hl5AeT)Qyrc3AbjOlcRuG2y!22uFLgrAD5WO3@u;0}?An`oHX z(4yqECw>;DgzkuJEqu8xKW4S}3}!}C{W2n-7o$q=1hJ*3MtwrMRXD24Wt?HAbkdxu zFy+D&6W*%|9Y?mIaym_I{3Y&QAJba=R> z!Ld!hm=gv4mBO(IE}*CEH)=#y@ldI^&PJyQ&+Ug?1mQDDO5a}cyyYANY3@UzJgI8S zPRsLyb>o$NSWsst zh|`r19GO50@`hVRI)>`Lar{AaXJD|AveIXF17viV5em4VHCKnaQ7Ogs&wMS8%LSLq zTJI)mo(?hob~0(>a|h=7?1r=fUB!F&-77=wzA9N=4!I5SBcMnn6iN)0j%W zeXqy5;H&+Lt0BQe~XeMY5J=s>F{!vAsx{esTwqK z{#Wjb&3MfL^6%S`h~3-ps3eefMuC__lVt;#)-b67G>42mR?i>ofmNQ9sa;&p3{oTTw zguVfAZRHiUVy;~CxPErX-XBTJ!5Q6Z(%Z$wI5{#(t8gj0iPm^w+bZBJaI(yMc~hj1 z*uGs|GwBkOK4r&QcR9vV{hAU;6g9&x{zw$5*t#!yy|JS}`He-MiN?`uMK9QWkvmHj zEe7NBRBJM;c2jI1WG2(T#y|{^lWGO8k>z% zjK%+Hj%*)e@$FL$66t}SF&@ya5WSH5Th@Dx=6MSYC#`C!6d z-eN}AfGcA#Tpq5OVq-q{5IUx?81OJfF}V!_r0NFB3iY2Bg(3Vka>n${a@9?(W6`2> z-zgj6`@Hs?j|Z}|s67~q3y@=pG0Q@5qZ8(0JHB{YDIFUj42S5#j4`Z$bqDvZN3Lz< z{LS(1bd=wnZT9A46&U|Na|(nJqCe*X?pCOJv=b8$cct^AnxGYgOR4)|_KM$l%*rx$ zGo)%8R_#JZz@`)PZOnuXbSr6s;%xBLSQd}B! zMB!}a5P>!7%DX*!>bKDP0ltuyOd;cP+e}2%OEovtoXklyd(Muvtuv2m-9Is+rSDxc zH8q@;M$p61CIrzSB~jWPZ<91L;3I&P*&pA02L%wULC)OBx^d06ZH3dhb4E*?q4U5D zZ)fr_12i?cU2h>vLs<~@zzJXgW~^jC z6+<)%d6K96>gGbGVc*VoPl#Q zDn)UJ^g}X{W?;|b@scm!W5(HtF~RdkCqB@6xBoEnag$sT+;|5cPAqh+7yg*o<$Qv+ z%I#@Jw*!)X=?Zz0mm{96bw3<+Y$cr2uSLmc=gKM2H}hjbCb-Z!v-%UJO9GDDe`cht z3^$V@df=ErU5e`IY8>VMR3aL)N&aNhjLiwH*PdKs7qDMkJVok*Cskx34nN0U76Xf- zV7seYA#WqBX?K7_h;!A^Cs>^5D>N(h?h3M~e?!f;5!?uw*tWXJU)wqs+Dp`U3W&@X zV>t&Yp{?)DZyL8yVl1{nN@-me&uL}}C!@XgDj=SJ2VoN0Gid6vxfS#9{vnzzkcq6& zhRK_GuSbM}ut^KkFRjf)1kq}XGL;FZB^s*7@b|z^Ef)}0_whsHmvZj8n$j_jOE7C@l5k$@9f&r;pruG3j}~DJ zaH>WT?HU*5jUnYh_#VaS@4qKOqD8Sx6}oyGng%y5Yr0=&$x`ypNV2=klw5KPFG}~S z092o-?ud-}`*!ZUI>-THnaI%+sB!VAa4=92sgvmF+H8$5=w$+DbH0By`iAUTKLdlc zn4!--#l=-*6sCZ*1@tJV!_3a7D^w%dkRKF&iq&XIhRR5f(lvf8geO&3|GWI3#C3gh zlaKoD7tuj%dp-6piT#n1>;0)2D#r zUxye<%zQAwZ$e7i@P*-ZOEy|{WiG#jmHZl`=`9qT?h18Yp3<=+=Qx>vZ`P%*8uRxT zTH`oOm)AqcpwM7d2g}&p31lV);p=A{HAPch+{HxpkRTFba4s-%2(e_8cGT)g#;i|g zKFKz#`}*&6QUwNsn-fbvCrJ6}(Dy<;S54r`VP-SP%;z{eWANjQ;rUVcAv7Ksn*ho^VFm(!YG$Xe1$KvxhFwHM1~Y7c zt7marPAD1Xy~INg3r7SRv?nqt27CdZ$YSD%o|i%$gxcIbj2aw-(boAl4&+>2J}|F? zo9=6ayf~b89{{Bvm;)oe8=CF*dF{Ego7A&4L=5VBJ35^hF8He638x-25$I@gqlaZ| zr%h>`Xy~hE(1q?m0SDXKsby{+c)?yHdZ`y@m0v42+Q|B3F+Zv&MR6NLpr!PeC{LR< zDt?DNbPV*hW%D8DzB&L*Spd{wOcH1^LrBGRm3f)`V0@Oi!qMt*jHJ%HL=FHz0wT>} zG9f8|3CWf^>CkW3=agnR5oukIQ!=6A-!mm0j7huG&nuWdk8S!#(po~VLFCN|?aWzs z9jf}Aa-uemsg|)0ZTGHeawUmt!Z6By38tHWke6@&*1GHW+#GA(YUV1m{Aey zu}+}SNh&Yz&#aUas(?rV5Lx_`EvRdmdhD`cYQ_5sw~Bnd$*flIDtX^{ zlR~866qM_@)w#MUr?41$P>l&2e&P*Hp@rRuK05w>%ZF2~4@dyQv8xrwjMZ}vb6OLy zi8GI5y!e>$?@_Z*(uLC#z3K*u4(_RhIcuboUkbYbEU*4gEM&8B1Gqn5(nDj2_Z zOZjoi%@2Q|^f6MFU4E7M%Kp68nfs=l`>_@wt6WOhGoIvHD_39yy!j3M|9|5D|HUx2m|Fd_y@sg zWWLB}&Bf)t8_zuZ=bB<$^LOk?S*x7fv>a{$|1T@VLkxmpKjMmd37XAhP?9aWaP+*^ z6i1Q|?_Jb-cm3@YqJMD97V2XT(pbE~GWN|EL!4ItOXs#seSTBdMZ}e)j13PzG>%nQ zpM%V@@Jr!DxyYD6DmR>rw)*Z5`QTiDpKb{afK$M z852Dhr5X~HwmMPfkL(Uh%cX#V644(c<@P$n+y2ZLdG7Kdl;e>Qv#$E;DxW?Wk{m&X zG>LF)UR_Mim*!8Sfm-S!qzCoIL~+ENIvmG_UrT%3HeUi-Hla=92a%JpI{lcg=v);W zC{8~_bWUHkR-JKf*?a@aKU>%{v`Hp9_TbQi`^)rMY?CYVFR4@c+lA?fYV$E}N@;P3 z5T&;|=6E{2LQB2vkQlEJHZ6$%dOf9gd(ym>rDXa6yM=_>r7(W;8c8Y|J+%uRGu;JX z8oz|m7e8g21;zvy5)3mscS`Qy+;M7`=GE_BshLX`PIjS$CHDM$JqopVgkE|`?Xrq1^I!$M52&%*Ja2#Mm79qLgt@2JQ5;C!wzexejGjamP4hUAVkmY1ly8Qv~T z?)GfEgay^*%xTwhL?=ryC>jthD;XD);nmyGd+fel(3*lRFaFkTkUuJ z16~Q~AYu2ID`%R*GvTmCzsMcDO+SXxlO9 zvy^$UVXwFU9l#Id#DY<7^?;@X)wK$!p`#@teWeV5+dlp?QAQZinNLleTwx}6C!q6O zYT~9e6Q>94+QMb4S>WJEuYkM?Y2;F>Yd%8H1?hZTGN0Rnfp3e7RQR7j>;C$2Fgyza zlmzY^=D?rCx@+icovprzI;}6;p4yY0THVBspGxOs-n_bHz`*CM=We4;w05G%+sB4J z8T~qD5FCdfv{m|N?n2-fnX9XC#n6~b@zCDb&qfH^PS_1%;jh zqJdDHk(!BfasAVo>q92l8A83`#ty`E?;Kgqu=fQ98Yn^*F3M#CUJf3t9S^4ID?y^x z_u8y9jA(&|-gYg$5^d-SuttL;#qI6e^UF4Of=8B1XMObjIOF5e0XqM%%$Qxe%)w9O zj`jIUvs$>Goj`skZYC%Nh*XPskD|!BgRMXS%I^*?wX`lmU-`&SSsDxMNn(s<$SxU! zWGE4E%B;W@3UzR}$ZSfM#r55<`iOriWxu*7#gf^rCwD$n>8R6v`z!aH{hFNd2yED# zH>?HeVKUCgokSXmS^OY)KTJ0=C`X~^o!a(<@-7=!LHe^(;Bh1S>o$k@-oj4IN}0DP zZ*k0^ClH5?x#s@Rx{D_mO-_{wrjn-N(^1F;cprqh#j%ch+gT}-8kUlA#Ox8N^d24c2tZbn^a<-7I(vxH2|eA8KdFsV_pa`#?X4D= zY~%dPgI7d9EJ)LqpbR z5#s}}@){v860UjdnMh&PSedi%;`_;Blm3$Z>{eLdVlf5OVWI|F(VHbfQ2b=G!U_!bT>S%$eeZUD{R3A2N^<7tpzteq;H4%5hKpK|OIX3SPbF|=i^edx!q|Vl; z{0t146$h%Wje(huDD6Q&MVB$lA$B~qc&z&BLz(c<4+~8O7>z)GiLfZINmmf{xed)e zz(yXK11O^)<5`-n9u+~nTVf>C;3gUS@DA)_so4vp1mr-Sro)(5PNQ8h+k<@y7M~Qi zW1wY(`3!7GD8r`1)N~kR**7_f|V=*jQ{jkVAW2=*!Q)X1$G663YR; zohP%ZPL29nV4&s&Knfo66r47wCfvkFD)=lUIP8V7sM$U~6-`K%VF=F$ssA|c zP~pQ42%CZ$ix@~WLEBdkTxm15ob{n|RQ#?FNjta`Cb4v>gAhe<9)qC66l`)v%M(;h zPO$1zy_zWJZUUhG@TVln=9&!*L1Bk+et+f$*3p|Fw=xM1$3k&*{v#@pMlguP)N~mv zcGeXkrMtFC4_eY$2d{bc6l&42`m#|Un#gP&D9Px$6c>=z;dNARi24X(^OQ>uV>4Fg z!EG}c_y=S~w$tEUoArh(TkQm7VsBdhOP&YeL$(ot z!d4ezbQYv^;F7M&#o*pvm4&g2z~B(B z|I<@{4_}WN9up=U&^j|0qks(WZeJxe8_|EPy6u1J--6?4%o!8ag%Q#$^du-Fk=->l zzZ$>@hf?ot>?`)INHSW@ z`gNYLhAy6*+k$8zSuUTzUad2lPQhG}BvCT12bhRN{5H(kbJ1JZPsPRG_OYm(h`6`jkJl>l4O05drHZE-t$-phbOT1OR)_!Pf9FyS^;hjt|euL!w;X` zb?8&7Z~|obvWixL=rkgTf9ONvX96wuwdIf_OpMhEscw~*5@D+9@0#wT7f}X-HSHiW z1`YcbCM)i&NW{+6aE#+DW6dUj1B$VYC|jzhG49DZ?eB?#O2CYVc7dpQw1_Q^gwi?duS|h>BofxPZ=1k!lQt<^iz0P73a(hd zbMRv(%8}eUt~UR7rd@>pKa1H~&`6xjZ*ckJm&`9+*zb3&LAb_%nMPKkc&DkHL}&De z8!OlN>he7&?h%(&n0P8DVW~EeH9PmTO#I^1TGEO(CLEkh8oAcqSUd)hJ?4~(3>9;{ zJ!X4+#6l6<{0o>hz&3M1t<+!nD2#M;iIE-xjwMF$?a`dz9%>*{8CbD66xmNUZkJH~ zl5t{0=E+2iU5KBfwtaJ7Lm7fI{%vha{A^HPNfW4rG-+M%eis@fEOEsgzlH?qmaYH^ zCk@9Z{+b*1rJ?#L3LIPl7}^<=^y+_o@883n(}ZD=aHeUDqc!Mlarg2mHLMW#U-%HaIzNsS{Z|(jj#a3Srz= z2#u0uJQjqc3ZH6oECxbIUXK;953_zQuBZSiB`Xs!0~a#swvjTHELCsS-K7*&fzd;f zz;j4mnJbPUhMz_qlgyo6os%T0_KvnEv490VLjl}|$*TzL!(|R1epkNXD^!Pxm|$$V z4u28*K5E;eBtuS#7an%9i2~WZXT9+CuH7#K# zcAneYTm#*#=N=~RP8Ks-vq+53hMRz!)E{uo8wcxtUDcFI+-P`q%IOU9uJmOFz#QRj(JR& zapObS5=qp`$*dR%b6-DpQ*Ju9_^>!fjs$<0H2iN8^X@BJJMW|6Uk}3X4L56kQ+MHJ zR&Yamm#z9!4~grGz`HoNarOgw)S35!cLwKB2dS00No(sw{l6i*q6ll388Bh6Y$gOh z3MkkHL&X5XJ7yLJT3;hCoTXg_qDoF5Z_+PC2~D|8&S*0MQIaEvc$Ku%4MwKY9=~}K z7^7euD&?#&@R+5q@ud6V%V)e*ZRk4nyJ{SxuJ@flZ~H52SWOLY_x~Q5kYKsQohQQC z6!zmWi*z|HFiD1=ieM1Gxa|3^Q&T&5RX-=t#TBEyel7KHfo-oR1a4kB@?s2zv7_W& z(}cU@daNodac;jWRh7Ur=3i^@H|JnS7tNkI1W*84Rw6tgZDV!+rq@t{!awP}rjJ8h zMZ&8A4)mZ&*Xx0&(`!z@#0ZT=R?kRp1x_)kjI~v{;fv%p=xZ2t1k4(u>`j3o;gJ`z zu%f(>l%{CVxxweS8hxOMWMY>x{v~e`zGJ9-&8m&ZJ-4t7JGDf$Gv8*w`xXL%n_mXX zh3j`iM&{`b8m~H{G5(*$#E}-29S=;7XUpZ5q{-hTWb@w#6zDp&gIvJ8CM1rXI|`oS z^ANV`Ut-J$%qUmP-Ou;4UufUOgS6jx8Vpv!4~U-Yp*@E85W6!Qtno0UJ{(75&?4X) zvzfK96W9Qk_H9I}osJWqbC~jn5g=f08orJY&7V+q&es<6q^ zUXyCNhm#iahox|dYIQPI_TvBHtGPl#&o=03S;@0gqiJ4V`Z<$k7&ZbZgD1rP&%HT(5^jZvS#i z(xIA!?=Y9!&#|3uJKJ_Ki!|5he*6SA9#TBu7} zgE1gD-3Z2{K}*}L`HH~cR#MyKp|J!1@;_GoBC`&5G&BFvoJaE?5yT+fz#0JfhNQC% zqt=F&c|GK!j;g1W86Y2Mbz_vE=n{Kn##oby_fQS<3`GD)N|5Bn2qmako3I&stCt)n zMS&jfrnm^I4=23@3L@+tWB#u6vMnSNZ>j^cR92BAFZS<^sd;~KIcxVwC$_r5U8;EQY5l%J+Adxd^gBV@xb&!IweQvWGm9I=@Bq0pBt zw`4(Ff)R-S4WXev6S@L0pzZ?Np&W0UF(+fWfp{)+y7g$s2@r?`(=k1BhrPFHM&%Aw z5<&ZjvHkHc7^wPbj84>HrUj=1Aom8w%lUcPwyUzQd>e*BHi7L3MZ>-RYQ<}94UK?F z$Rf%%$5?&D4|B~QQvgnN`GiZC#gP3=w7PAhI|ux}3+S%H0e#tZ^sC?nI`oI2EcmW86rI=dzZGS7quB&eHCv(mL@>XpQ z(R2{C32H1CIzYh2Z{k0H5p5DQ)bJ9*Ba){9qsG<9i@1$x{pBVukMuc9FD;!At2Jf6 zzBuJ~cQhq61LD6N$lVN;D5ss)!3~7}$4nLO)v(u8l*Y#5sDYvRCJ=z#{KCT>4QjBf zdX}*_w@;;|u_tJ#yjC`GEB25F@g^KZIyMzH2u~*Ji_3~g(d%;@?GFI}0ir?yLb)|w zfDxTE?GGYm$E4oVoG{VCY|4Fd%ywZKPLQUFV2&muc0eQ+&S(@QFlib_mJ})ctCe8I zG#o-BS=0zKX!_8Af`EGfxsqn6g_C+?lj!+ViT_vlZRG!N*nkM))Wz6>S9rv}`wt%- zc@V*{LH;^h*NpK%8JCyyg@>(+yFp~@EMrr!2~klPs2!VRl(6ZF=T~gPNto0m-3vl1 zzis&~`8L8GQe$Z7EWA}io%2!sQ^R0{)?0a17hsN5EpRm2R|IJrx{BynRmCG{5J@2q zBPpZ{K&lp4|APmJWtjKwCJtGD{on~LrcG)*=g{)tLBl@NNf%eYG95T@Wu*A;zugS} zteE{QVRhe-Sqn^OoAw&n|4+fiWWDtvizudbM~q)U)r~y`dmgA%7aB7fyE81J^7cH< zQ2e)N{>KMbDupg;-1Sy~nl49sgpBS zOKx4(6sq3&;JF?vj+&fE!Af*ky}v;Cx;U>SCWzH1$(&VsSKi;8#k>B~K%`psNj+v6 zE8&Z_toX%$H~G4fhy-eaqfA)j8@m1^qa8BboOKgPvDJyFMmr#l)Dmq*^^uFKgmZa% zqUu5|>SUWVp$}bvajyM^VV&lV^+}Fuvwp_>@`e~mgcb8iE`8M~;9igpAl}UX(kZiB zN_k`Ap}^~j~od^^^Tc*LQO1l;wmWAbg+ z(q!u{_^S89BQp-0y9)3P!h5PYa+5WNeEG;=5658Eb4i5i1EK9=ESGID0z!Vl$iz3^qjHeGY_!uU~Z3a&dzLR;bawy z4TddEIv6dz3wZimo({i;&J^bq;mRxrc{c8JwCOOJ*1^MW#v8Gt^QLKnM$K?TpzjDV zvQcClHxVV>8)ALGS&o@+%+ALqO;Y=fG2}Z*rGbJX(TPi9|C$J0W>`tazL&v*;4g)& z;T?MhY4d~cT9!4nmgj+C;yho`=l?Wj{LQ+zEz!2=x@`K&pvJxE4V(s!6nyYM>-7`?$GP##K|>kTaGBzPfM)d$qL$~b1vIO%0B z0EyKw3qtW`zR!vg)k-Vb>y_U}3{l=}!(*B#k7CC}Sb?6%g^Ls3Pq>mfIe;!L@^r=# zyxF!#ob+gs#qAiMALV{@W=hyM?ehlatc+4#qO5gHusrQf53}BzF`k1!dGiM_D6dziVx)4G!Mxj-;_22QB3IFgpA- z%0cv`(-y@?zTV%d_1f2n*S-8lz^O<1WzM)T@%YsI*6;moSyz1f3b;2oZuMSlvF;q-(m6^`J>imAbS$fKa+03d zDu^}9f-!oo&nz~ygf5jQ3;0@qR2uLdo!p3Q#&K3eOS=VSty|W_(W;ek`qau|63J&L z(|&j)6H@sM#s;dP{qQNtMA=-JY~#HG7X^sQXd^BBgC}z(@h3%BLa`!;mtRPo$l9Rt zctWc7mGZPvdyWLN_CCSQ#+-@fba_!yTe2>PziRAuEeAJE(D71k;{SQdO4;yj?{cqS z_~pNKjbg)2JR!=fN^B5k-=T|5yep`&)x3#~yN_3O1mv@J>OG6Y>&J)E69wWUJR$P$ zTvgBwb^GhPD}hZF3HY!zB${Apsfq^Af=Xz7HuvMRQPIRm*v|E?vK&KK97H^p#+XtP z;Q|bqv=RMUWM8jXwt>^oG%SVwZJP^H0AjDfqCHC)Ht$FfhzBpK_{c3I^_x0pzH*|s zJl;Imw|0MLo@Vc{+nuUK6Lk0=WmjeFeVgjLJT8UmnzKgz6~ywb*AD6V90CBB(~Ng& zE6R_zFGn>}%7g-Typgwx7qaV}+K%}lJQ8{f6=<@Fs} zuhWd+`p|B;rDZYQxJJ23mgI=AQQZO_)qYOL3*OB(#L>KLY(5hm5eb|4UuT?b*j^=w z7RU=owfKs59#+p?Bru={JjgH8W3JS>B4gk;-0P)2w_R|@Jmb)?wc%RBE!NlR@+w-) zoV_HA5Hm-0*)J6%%vq}6Yghj3;QkU45oaTHxAv*!szM*KHeA_XMyIMCP5{pSATvm6 z8>RTRm$Ow%J`;(+&B|1*9D3H>^&QT)b;og-rDm-fbn)Ir%bc52A8p*+b@}C$j4z#P zz2FrYGato73bmL_Lj%!01(blxWtfy1?DV)6DIA)ahu=no5Z%BznE#c;ibk%Qw0oEw> zm7=-#+L*D+WyO=%Pqn}AqzN*6C3<4n_494n%~o=&de_iS*I`vJ^~C!SX?A=3?J1B6 z2YhPs>Wz;Sh&U6QwZ0+q!uBnz|NQ>G^J>2RN|#Qg4N4~8b zW+DpOMoGK_He&RI+ggjbJUb5I$wYat?O-X{=rJez(A_@gbeT7OBuQ)ZIBfg-=a{{2 zU87do&Bg_-^0Ir0=uCRWO8>YNIw5kh{f>bx;f*V1>fIEKgT;8wI1LrB zol=)SWR)G&V7`IoEbfxaF`c7oXsZ<}!(9{Y&C@x!vH5bY;-`O+7=-P6tu5qm-0P0a?Eyln!8efc6lTf+S@B^3 z-`a?}0kZ(4In|W@r)n*RtS`5@r3>$DIF0{w0^5k%%-$Z4L@8hPDeRQ7*&exqdSJg|!Kx8CD?9xi@5}_y74;r3 zFWWC*JEo<^?cc{-{b`-E_)Fje7R}DF&nFVl>`t&*TMW^zkyUl`&!9=-S|sgN>!jW* zriKe-WmhW^+ioI!eNPY>UtFQe2KXz7z6jXIsounied1Xz)mw&ild(Ig(gPGP~Q$wd)P@|A@a$Xm6 zu_JcjA&+PtvRS3e;aEK}lUPs{Yj#=rw3z@M|QpAeY}5m=BjtWlhvzqsg>&qo3T=E@T!SjdakH7C7S!-{Pn8~Dr(&=sg+B~ zOTPnClAi`nr-ZFpJ5MgJdf7^= zpna->bwFR-Y6&F`@YB}<;CuBy1n;6aX46U2@3wiBqV)Z)&oRfoZmc0Em7KvlNK}+r z0?Gq%P9)*IoXONpB6rPttWpu3cX|`bgNWXAW`eZ(LzN*~1MV_|8|={D2im`9g`WJT zKTVt2y1w6?1vRRCF(4wc(w#HKA~SWU-9GHBga`!ZaC5%A)tvDNyR{AOL z+E$F-$JriKdS5<@^Mqqpl7Yg4Ni*iJo!^q?F?tt=y0s+H$51^!QC4NluPqX4GdU$| z*Y|fa6-}zTZ@tci$cpd?EAqhc1>7KGKU|9)e_?Lmm5@8ztDK3U!CwdAk zs6VrTS}Fl*Nb10#P;VfdfDn~Tl1<|SNNduk1iw4EJmJ1C|?gciR7&ZeTAX7zl-Pp{1N)K3-+rn_cMp`Ro$ zTtfrO3MUzmm=FpzO(|sI>@QV{4(PVlOQ$V*EghFWj^IwBIvUuszDSgU?W}>*r2YeE zrX?4ao_lgGpvZ`2shYP>y?GzgO2%>k-MKyuBRuY^AJhsal~|A@U9acUUwzO_`Q(EI zw$TV#=#D2#o&;SKE8^>b&OUc>5LRL?6H5{yes(ZHR>XMGt>`z$gy#3pVKM z7}OyV@tV|Pgq$P>_CR#=bmG?lh)-=qd`{rjs5~+9g}MICq&kSj&bAUg{+-eF$R=>c zE*JHado`1@eATD7GJT95Uz^=HufKXpiI0+R(>3bheRKQhfkMOiV`z~z{oP>h`bZ(U z6nCR4OrCbIqvZUgkDNgI`1p$(RB3N%=?FR;*P-aBcVtVoDeZ6ZOZq2#`n4oOaiwm; zd52Wtmlwv8;-3$ST0Ku!ovReZ3cCUao~RSMn^l=9MS7?VROj2SiaDpdk6S!RC~E!b zu_gKVL-pwu--OLK9$u09eshqu!n72{tlgYn`W!a>aivPX2caFot&o7N2NFa)l<{A^ z;;1#CzOdQf>2qpm=MkjJcjhP7G`SLW&po{A9Q)~@IKmU!YVz9iflaAp*%Z|a_5w}_ zk_e8dpc(2+d#aJHaOLQCCbNfZxpVDwHOHLg+DEqkt-dG~xhF3{)b?$!t|+6DF^D{& zsNR24{l0$(Gq!_c65ff*Wuxzs-xL%gZRxj|G&!Uj|V&6$*LABl2JlUU%^!l z4zbK}THLMpX|?f=m}5F#&g>gbQ?cYuazp-eL*J9N54W6J^Kq8s`vH>;%ERIpz@rP( z6c<6$AVUD8fx5w&XCK;tB#c^?9BM+{d_N~TMzR!JAHWU=_%Z!N46z}OH;@&wG?D_P z^8$<6<5`cFl87Kbm>K|`C4xM%VpG+IG-mP(7ofPi;D!1r4wE2HBC zy^t8gi4WSs+~Kq_3Fy4 z-*|LCcc-x;a=~l5nY@UuKQ0;cTFJ`!Qn*9nJg}>u(rHE_HN+8tJ5+4aebnNBx8vkp zAFuD=?!J}t{l&rWZQ~ND167(wfw;g;?6t-UI4cnka@rbuAoGH?7-aX^UlRO=*L?r%npJ~xLY?yeNk26=;>SxfWv{U+w`_m4=ilGSTz4RI+<4*9^v+%^H*`7e~C3APBgGMJfraOUFdc~H!Va+znqMfh z{xMK_-*<6bj$K6D(H5_JL;f<)i|VB+NaYw4xjejFX6|k(4hZ?M@81JPAFAx`8mglV z)&2vO>m#|3_7R{jpgiAp1++g_RUO-@)i2<>!+wF&_Xz^(FAB^gCrpv`HS|VdTck_s z5#L8H142KU?Nash;`USKBFS|Z5}c*QY=v*{1rv+Mdk-J>H9*~V@utkV(8ip#5hi*8 zG*$}X7?X!Fi6XPdCh}Vdc+wvz`tVjZf>8g3PPdJ+k`R_Brm^};N5JzgIQ z{M?>)5-0BVM8zZA8)H6+XaFM4M*u3~<=Twy#d|$ut8=8SIjib)t#<4`T;c21?!=IL z#0eu}lT?fP`EBosovYF(j_Wz?9vr*k%`c9zKpJ!mzI$)!!%X^w}kqAP!`l%qJ?E6zc+%J;-QCLcnc30 z%gOHTt+Gc<_}QzReIk&zNNNA!V!+yWdM68v93~DR9VrPgYmH_W9{+OAC&;ZeR>^*Q zB8S-I;GC0{!IANPmQI!zdteoIM42AnnUt(xX4OFi`UN70cCXjze+GiIHBhM?!d2z1{mO>o+6e)cnWR2B<6S$r1$YT)4RwVQ~My z2iy(S-=@nI_Rq&7Df`dtnU%XuxqHH;=Z$$!m#jba(DT1VbDBh(?yB~Rg^$F4e+j)I zQoQxM-YW027^XP*q*k1@=!zdpN=;fYioKe3=bqy25nj5FXS&z;?*i|*8Zw%!$!Vfx z_yNFlu>{pAqauYfP~@bxV4CIh|`P6hJbU2r%XiOPdf zCtD$SpcZtcaj`4u1Km^bii8<$HO<%n{dyK}>A&Mk)ou6vCmKY9B#gvRqFqC`>ypjB zk5aJ(DIcr0%rjN;c1^$8%RrPr+p)GtoQghx}3XFTH@^lEo6pqjX$pX**l7l4%B?@1zde|?&;DaxJJb6V4@9g4n zjMhMgPDmQ-;U7Th#w1b^`{Jokz#TiF`hi5e@b#btb(7=?6tZER0iQp82nG9lLt{-3 zr1;=gSu8-ncY`hAy`&!+UlCRo+u-@v|tM5 z@tPx@O$Z{wL0y3nX+(TU0(VV3=Wl|BoY4|M?Mg~KLf%&Xg8O8mbkmPJiJ%BbytmBd z;jGB9HQp8CwGoPzgc5Qz@EgDvmE@omffpgcFl|gPre}p7S2{K*<>YeXK@(?xr6d(S zq@Adv=9H(}o#8B&Pcheic|V7{!Bm+e7X*DVplH4KQ#riJpHs}v{MQm*JTTz;#_={r zZTb=p2!$5y@*iW`c(2B09uVgGuhagkX6?nQHv65nLlgMO2?W7_ZH#9&H`q4#HAI!1 z3>X*mWvTV?HRa<4E&wa!RJK}DKXuG_ zvHpcJZooy?u2dK5T|?oF1a3X*#X>Dn%MTMBYD5urR5zm039kdg_nTTk8^b#LYkjn2 z2fumuL3z@>l8p~T%x5rNx9SY2Gj0ASO3J$pnWS!2^tkO2y0s!x31e#i+{mM#$24mC z{Gpep-s(G$!_&7Akpk)2sVvUUN9SICFZx3%TN%>Ob514Lr!0}i^}1iq`z8oy{pb7X zRoD29>xMfLwBjijY3Xr3J2wneQ;LvS#oKiYuPzwoUo=f1@(e+uV<&6{ONF|KwB;~7 zC3B6$n}V7ILZ58>a$Zm7?^?c`gBx4d>;g}L$fj(Tak8oUAq zz+Dh+{jcirY-0)Ml+0hQm{`yFZ5NQYkuT__-2LM3kp-icZESdO?M%C+ggbCk=l5st z^q5)q&DTD^|K`}OtJCLgO^Xg%7kp>e=Cs4XCB8Xr%vtrhRK13>UyXe*B&t)(6ez{t zy(d*3tcrPbs&!_^OGnMpDW*wGb{*bzd{>-Na_GE&>{l)Pd(Df~%(hjZp|VI2Ekky) zp%YOOp}lt}5qR(l!hm{mN2W{He#kHtAcKku9qOeE1YW-^$;*h9e*7IMh#sN30fAsM z$|?G_K{Eb|89_V@Zz9drleP=s2XxGW3T36aEe_EH;geq%gWkYHd z9t|(X{qYqwL1j`^OV>D?)>ShG;p~!{l!_QEpP8{HWBQDYhR3S$fBl(XS^N2e>BFNi z3Yv*zSHzu5)|+%`IGX|pd;j85zW)tPv5#K>iFvoDvL}*ssgNPcNZC}IbB|pK=nVE& zI7(fE2{n||C3M8eO>*gk3$kLJl6ZmDp1Iu~yVJy+12W{-@5kJ*u5UdFE^kLNqG#$qW?AAn%DMGj`%q$Y+HQjvw(_ z?su zBxWWqlC|m~;`O>>O=T2M@*bA?=eG?P&RrihyDQ}1pfhc)iD=+|MGIdbU#VJ1!Vi|Z z77vW}++FmphSuj8YB9~>rHHLWc5Ubjk?=iicjDo38*r!MODnMEO@SK;4n=wq^oxe+Zdjnx??%$efU;xogp zo$!)h+F|YUZ`Qp=D!cFJH|m}4&?BOIOt7ya8URMBFM;P^HnKi+S)1ioFMta`r3Y78 zc^PRdLnm=#_5Jfi;^7yqF95FENRR=zlSrlkZd}9mH1fTJ)`E=05@K@sfDa zpbM7sRtVo-EOe4^j>{s(4NyiU@1thUn6{=^{p^*xm+GUTO3T-8r;$s^(>cR=)77cw zpM8eUJkm7lY2}dc{`28wu_Q^T z6v;A4McF=Wl(k(#iV9(lhLTFOO3I{2B~$$y{p%&oql@&*fx~GQ7#SVoWsnvj@2f!&PfmcKE0^o<;d7nVI+vaNJ zqFKQ2uo|fFow5ndI*Ga4el=hRP*hS;3kQ4(w!>UO1%KPr6)LutZn^AkljroU{p+T5 zO4cV=&$zI!HzdZ=V@Ls1lQ7+V=O$Zjm-{Vlx_y$quL2hG8d}{T$A*9snKDgE&L8n< z1Mj57Gvr1HUU-_nlcUapc7d>9ibJF^y6lF`{ujW!xN7~`R0S0Z1 zn!HL&CL3LH!NzeX|z8FD$WNKa7xOTNe60(;bialr%V9sYY1Vk!7SmtPlx5AgjJj ztepTO+nIGpg=m-OoVx9O~N%uVU$L(?W z1GR)s$0+Wr@)>hkNmlqqm#Fu8=%b~Hy+e%yScr0}@2b`N=Qi;Ye!ZX}s==zk3$;1X zS6JGyRk-X%eAx}zvV-Sr0KUgfKgi)vN!!>a*qISEaIiz;KF8#;NLf}ntZWiJW(95l z{LZ8s2o16?;6b@h@?Xh0#g$uEy!Su%YGQ3(Va2LgZVt1jKIc0$_V{;0&|^P$`b&EI=%qv43V4!xt5# zdCK2ve0*4%*nUs2L5z4SgFs}JDf$Q6oBI&ft+mxl~A%}xv%Hz^UPmG@P^lTSw^Ujax3O||# zac@h$a9MIt(K#*BF&q2&OYYCa{&`+vgZ8e0iMV+vz!YUQz^t}R!b%Qug91)0aWLUH zsM=^g@a#ZpEr1*jFAyMt2F74KVT5W#Cpn7;V`XGO<&zd9JvN3|Q6~pWKJ*fG4(b4X zA=z@qTD#rYn73PEjpQ9Atgu9AFXJUG`ZJO4$Mv~1zN?wu*Q);N^d9MJf+fY~hX<3z zkSIEr;+dqB)P!(bn*qWx$gTEYlvil0FXl5gr8y4<@d-{>!tQk$j!16Jx32S#YE}`h z_z;)2{#p$!iJP}Nb@m1jw@u=BYC1m-OYX1n-*2|2=Wf^80i)nTt9_+%DKFPOS!aEx zcrSpnfKXVN;7c)GHE6i3`FYFOs&n_)A)qy&Od!c;pp*i!G6(1t8==D^pi@)DVKE*|K4v%l7VqRd@tsgc<@Wu(emB*B#St<RfgUFbV$j`Ul((g#PLXXLBuwkWHui! zT@NoeC!Mu`d^Aui0f+;Qn16K@auWs&kh-inDmeSz2n4~ z*pM{N6wI|QAV_20v{ql!=T7%}AC} zQiw1RLk8h0jwJMm;)k=T3(@QJ4IJMj)!8?2NcUIFh~X(Vq;li4*|J_JRJvPX8Y}r# z{e@ir^bMY%e^MJYr8`Mr&u-3oSC99czz^04y*R^ryYu$c$hmWr=Qja*fRd&HvuT+SR0hEtU`8EH0w6Fi;HJc zkI!-GQRFL6Phyp5@_{9;n^uyGAWDp>LLY<2TCE5bjZ`3 z{qS4mVcgVx_Zvo4zmD0V$bt zk~TO(yuB7W+-*m%VV<$kp!Bz=sQejKx>thJlFtfTzjIoPUl8VJ9mVikFrxXyMjhrY z4!_qrdGLIDLV0OIE5~C;%a4D&iveU$i3Rd~Bt+>S-Zxx`ZJjRnW_opml&Q42#|3z) z+$^twG8DuYkq~1%QhZC3lvAZMn|iHDew_oZ6cU;s)zeU8k`)+mHBhvWT_(JihXDH4 zXXLA1h=#jX1&dn5pytUeV`*Vc|6SaI7Q26bo%?`_m0m>_e&zZ;`GOOg0d^|uG`1Pq zSGp&2nKuJrQ;^F{l=vy`Nth{Gu4s3Sjvw&!1o;NSe+kS3z z23>hM!ZOoZhr96duST@s3uGsNv?25$Qh+A{vTtfk$+ahv8`r<1d>fWI$SuT&UWF(e5cJiu?c1T_>*Bhzf;DzMUKs1PQy27 zU%MHE@%kLHp13_7Xgx;7$NoT>m4S}!R-9B=DPaIvJe%Ewo+dxZ6va<;$O(o_EqPZ?^SO(BW*_Vk{{?e9SH2lE}^ z`>r@)SuExH5g(YeU()7ZJTnBWKKy%GTB0~7g>zT`-c-ujq>(L+Keb}+#6*VcvuP&a za5#}4Z040B=T_JL;^G>;v4fszhZ;&2rk|5e-Ba1%?@aw>S2U9_;Tyw&lU_4i{(auw zyk#M|J!hu2?=}aVn~f}-hiYY+WF1Jm{}IXCwLER;<4NU*SEBcP==!67m3&?3ABO)W zYmx2w9 zea#7IK-tEvZC~&-%HwnQ686j=S>j%!G#-}{t_o-pfDa%%Bl7I6?t~s(5F*~`^X-Mz z5hBJceTeeu1Xw_*XH#zv7nmCUXid|?h(DEfo~Le?-x*FQ^r*a=d%I$_em%7*?#I*f+!V~1*63y}Ex6Ln@$DfVV z&U>YI)8)v%@)BdG`9-}4^+hm4(1Bb4=v$722qds4zd#*f1nm-(&p@S8QP~G0eWX?7 zmnxyF*wK;o9r|l0km2X;;B%H;P=~YHg-sNoB((zdGmre+oSinqrQmC?n%Z!D70y(#2&4J>sA%y?2K%kzYs?YC>KnhbT{#CTpEewzw zTR%pbvg*2=JwCDCy>KwW%OI`qOpp0D-}7)tLfu0={vd*MU$2-tnA;IE9PA5a!)L7Z z)|K$U3aNGJ+$QpIvVzx;xsO_Ut7^MVjslsZyXN3iA)y0N+cw+m)?U943-P|z;LRxa zd%q?66Keav9(wMm&ha5^kC#C=sSb7KnNM>}JA*vRDNyr)w-J6N*blTlSn=5O|LAxi zn7)HM$O(#+ra2B3YC3S64InnJ0c(QTw~;#;Rh;C0y{G-Himl@ws`Za8`|!0x&zDFO z!hl@_kqVESHHmA{6zSNZ5)aKot*1CyNndHcR?m~Uh=C~nl4Ruyp)_mpc;Ws0(C@hN zFmN+%d9X#^%`?0;*!W;eCiBGlveEu`f1^hvJp^r({!*0$y{W|FhiNEzw4`_}lW4+a-CAMD~~h_UG0P z*S9;V9|(kE7nH$d3<>D?N!3|>EjpEqRUrjEU`)ILh!haV|3hBXSg!<;q$GMydj5-g z6a&zz5P&Mqk>3uP7yI$+bd8VDMmF9}b38Mii}&> zvhzq?t|;pw*CnkZ)M8wSDN!o!Qs1b%Uge=|%4vAo0ic z+Wz@2BNa{uQi`%* z2HNboF?pu&AID*^7U(O!;mx^?47wTRt?gkQsMvYF7WGisU}2iS|p!2AzOac zRxWq@h-U>cliGqVkXhjd<8mmnRSj#{d$fVt(314U{|#@KedZux^^>q`f?5(_?eji| zOuejJW|6bLg!u*Vk|zwAiO+SKq>&D=^nXwTkg8Dtm_Ncznmv+g3JW;m5YumhX4p9e zMIBVX@Rvd=JwQmzha*kHE@PoI*+09*0u8F^D!min$!G_3+a>l8W*@^;b=pP!^+5kz z^P0m|_hNCcPLlDfjM;N~c*b!Z%epDgqm-xM=7}JFD%{mF9+b$=2N1k7SUWnyW^O3t zo%3ep)?Ry5Jh5O8mg1}vx1lpCC>xXnr1min$`M2=WL1cKv#?ySW?uc0k7Jt)9Mg4k z2n_}z!DcSkg>Dlf%(i1BfB0Y|d!q07M5r>+JRLx4;UzHZZkip&Wo>4V^bwq&V~|Lc z#|P%FD(EL1)+8nef~CIM1LU8m!iD&*Rv)FU+Wm3lY^&oJ)UVBi2b#ObzSwzJ+Dg8T z!2UNyONZDus1g6|I!jQbi$?fzYC+xnqa*I~Y_>sK?zV!z6Q=GHKVSV|>XY4BBL5BN zLDJwgb8|Lg@S2V24C+Mq|55X-f6-aFg?(m2=^2^4w^{p-D#ABOAk*LH-dQt5D4&*3 zwZ0Xl{~&NjuX@1CZ`&Cb(s&Alpt%yDgbs$U1!RgUK&Mc>LwgQOpXOW*-8S$feIg|1 zK#E3rw?JF>Ki$BEO0rOZRYCe-SS#96XRE6SEn9xK5_@s)Z}!gLOy8*Wl=Cd(X5%0K zg32FIZ1{<`G8j!$j()UfW$)xc55hfG@Z8aj!7?o&wa@d>KYo9m2R6Uob@QJGEqs~l z;GPci6{p_s+1+m#IW_hsib|I%nBhfpfX;1wJC&4H87#i}#-c+-GYW)T9F-2k-NwN-yUh0Rlkv0czdVyY2s(cNu+nDfeH`wA4(r#wM2G znCp7d6~y3FHa@NbgIS=Q@?hT)Dej<5t~PXhIh3Wvyn9A`SA7ORtuc4BXwV!2tR4-j9Rj1 z5uN+i$kGIO(*;j8ekgJxUE>G*@GZY8i`FZ5R%)L|blI#b3LQ*13<$!}V<$oZ5a*N| zxbCojb?M*6sw6Wsq#}I&t|ek1WB|T}%{=qyr{#yoQyVpYS4Ab3bj`4gE5vz50q)^; zZyx|CyOlVHlG6jn&LPr$0y8G*{S4z<$?Xo1> zBT;VA3s?Bz>Yry^bTH;pH0vV3OHj-V&AmEo3epT~MkWprykiq8$Dt#qke?I~L-+>) zG~k2hm(ty5tb{N6FTPg7D1JWEFrn~r;g2m9D6f@K#S@x7a}p)t?%#4Q!J2;4rTy?v;~B6} z6rLxMuOO^aCnDS9K8OETu}@ERmuG~7op9U@kGMxGzRgwXym)0a6s$jGt1L_`4hoN@ z1lSqfj!J+3obl%vo~nd_%#tdZG9Ez8dH)Vo99LonhBrek&lwhb81O z*m?!GPgqueE-u8V-|f8R_q{DGC^fFR;!Up2mwuQ?7bJ`Oj_t z*m|K;m%VSjTj1t5uq?o9#0TpM7_KKrgtqF9XI62-T#+p**!Ql*mwogDW*4p8!e`!I z*WLO9>T-%2B7<1~^3s;pHb3Nuy614^mg$A=!NM=4*$9nIL@Yv!Z}LSWA&D2_i=a7P zfL|c(z@*2{IEj>B1C9nKm_;`z?cw|)ds1j%EB&#G%o0!o(GE22Ij)E!^A#=M<)x1B z%+z-+9dGi*WrE;01fOQW1S~DB{>Uf|BK%b1N)~--J1qHcWc1cN&?2sb@#FkN zG1`qOH#h4@6PAyQPjeI#)-mDXc2Jx_EC&2o2=fAY+>w(B95}Qj%$0oVR1a_cazRD} zIif~{U;qEY1#x2jDv}p!yGLtvMO}-QCVm_}U{kqC)=0>7DazAD^#mUOl@&q>4$L)t zt;bbNf1o%3bD(+s&zS{l5e}xJnRPoz4-fP$03MRH2zX-V<_z|c2swQd>&|Cpb>1(Q zd_YH*W7A})Y+and(emD{Xvex+qo?|%EKuG+`2oJYUji7y8!g(uXI1BD7t|4`I zA;CTs_p1lm>ke=G^4{m}{Jm-4e_!A-9r=1{q#utC-vik1QJ148E0dh`_p3jSnRWi- z?I{(oy&Fm5GEb1|4zjsQfCAJG_^LSvo+&u_1L5c*c>FwntIGwK`L7#nr z_XmsQ!aejpDz*9wtKpnF=R^r8CB_(t2M`j}{(z4G)d8{FUTc}ZmcD#$8QSIcRCBy| z={T>qHONnZ{D6WGggM9E$lF!|v93YV*UDjL@q`eyPynJYlCz(?m8_)6phJUkmi-a6 zPQtJg;kYq!whQOHe|8MbmY;E3%|c1#e_0OB2K?QmcbDLtK_~0DKE7BQz3n%vqJT9+ z4FjII?qZ5->8uf*Wn(#;=>Nso>O-I6WzGdO{Z$J&rUjS5P2j~KJ2+vnL!J4((NHnh zP|lNWg(l{OvRf4}xdhT|PpHG+!>0JX4TwIzk4bBPqx^MUYO8ki%b;y&kmCUDe(6ob z>Moc0gsgXgzX8gXbQ*(sE}H~~+d5Q^U~cxETr>6At0SoiQBZs}Mgdpl-$ko}3)UAC z)fK|~V{x}w;#Y%0!!pr(UyjlYH!&Y-G{>vj^WFXwgQp%4C}HVdyAQPy$s(^~Es!Gb ztX0f4vL@hoAhD<=bUvr9WA#PzMZrG%n7`R{-ZG}by>^g-rHPSqK{qO*{2TGK&~NLQh36F80u?{e53sN&kq|KiG0_5{JnR; zH2=84-pgFhU2_H(VSHw~%8=|E>4u&2iITn>sIkXDq#SgM?@AU?&@&^(pqnITnaD(u z;!FzMFd)coNi^QYNAA@iw;0ID6zaf$fzX08hP4H{sE>oyQ@!UcK_n_pOPbCQ{z^#p zGQPGEyDXHjysv0B%#ARGt!2Htiw>uYaRd(|v%vz*#qy;fj0)+$;r)!p9 z3u#0QnqaT@Utw!nJzM#W=*v5^rcTduUT$D>ZgTUS$wY#Ws9CHmT^@ZnZR^^ny?>o| zyW9J-!|iL6|1IBpkI#wWvxYR;ao9jOd@WL8a~JLuJ5>Pw-2Rdpq!#Gjz;8(sT5!{t zg7Mr}oyb>=w0E&4gE>u6E70H)mc54<#94Zv*`|B-%f9VzOy1$Yb~l}KyM~s&ijQ0? z7%^e45~L&^KZaM_?PA($%MfY)@>sGWrc`Z4y3NfP6qnK?OFNNc0mLao?@TYDsI|O( zx3W#7wyD5n3mM1Yz1g^duNI~mep3E2UDNJ0?qnT!fhUE($$&ZziOPUfNgr8>|DCq3 zH7>8U_Z4{RPp(**mU%^}8WD9Ta4}eQWlm%)^&I*Igw$MJ*$r4h+G zt(Y&e@Z;#B74?r~jfLw=gIexCfADY}n`M-*H@1jPq?0CX_)2ql73j!8aEj#2l}zMD zhu()oc7V}*NlI=(N&5}rbph3LyC*YFxPt&xXlVLOMemQ{;wyZgJD>IT$59R}?2&-X zG4ckr-v3(<<4|S$Ll^e^x?$NDQ^mOxetusPnG9gfby1`3^nFSs_fLx4d82DRu9y41 z@W1PpiNsp(S(loU|M=ASfbJ#<1gvR8tG7;SQ6`PQT&yxg^8*>y4cH4(m3RpA*ObB+ zr2I)al5*rf1BU|{1_1doq4)Hu$r|bhd96>Oc<<--#HJVRDu45%rk;a z0}{5H13Q2&&Sy7?LqQJ5J1EA%QX$SNBQ4+{g@qE^zlO8%ZJrh;seoEl2E<2APkmQ4 z+*>U$IdMXKI&)n*B9VYBV#A%UV@6)i?nE3YoM}&tEe0Hke>O{dSR{W;s=Yi@>|ax#lCQZBxkj(4jpzI-R~Bl zsk{D($-aSZWd`!}MFLDn%M)rxwH)3?gGeqzw^^iR!GfOi`;SZo-iuHec2LCZf`w0x znKO2X5fHya6+^09|FJx)*}$mnAYqn3faZa&`$-4pNd>Td-}5YyJ+XLDEWW(gl#ZMZ zN#n&WINY;c?zXMZGBo=Un=FAw(@UlBQ(9mE`mi}$a0iWS^#%G>*_{$Z?KxgCC z&6DWs)W4acq~%*2%rVF#pF@hE~dIZ?b3N9H>S3}t+qR)3*vp}em`SeAVOO9CIN`uCM$mmFiGLf|q|3VlLyW&%g zl`(q=(Brp~Ck#kfR7CJdh?Y1H%65=yhEBjmFLHLm>@$iGJ6CmP>wZq;vM$#kTRVEE zR1%Oqn^-34v^##6=A3*r92I>&>uve_a)8Ba;lx?ki0s=$tlUIEjR=MP+i=enL&Qh7 zgJ|uZvn@Fu#oHMyD%&Sj92dxo5#IJ}8UWeN(-%$j?gS{mG`gcb&bhVcrRFzaw}Q?u z#SFp@x~ciVJ1@eYB56U9&TkT)<@YVJamRWh?l;* zy@EkM^MRW$jeo)1Rm70*Ly`P~nUrEUSk)T_WK-z7{yeyGdfzz9t5I<(@cPq|sRSUU zj$!szdKLawCb8yf!H#~p{-@p-+P7$}-?U->S)n;W8DIj7+x(q}+vlGPYZ7UbFkTbb zQG9G?f3v{#596Tj_Mb9O=Zllzq6h+Pgkg&A-R})M85@j*=zCrH)F*3G7uJ^;DZH>9 zqov74JBtzBVuZXqv0RNsfe&IU{vGDZ^xHn77Cai zv~sz#zVdEo6-KkaOqR*d=%l#Qpg@2EAb;)+*hHatk{hc>g!^r$U81mk+I?1C;1bSbe&XJGgJtrQvyh-v zbRl;^_lgotX7M3w9aQCF48RD!g)`SBXw7lq{aF&>rLsMBHy$+G{2iMZ#z0hQzYnP- zYqRpYT)U;}NdZ2zR*bkH zMhG2U&!*k~PP@;g;-GY<+VY!TC4j^Tv@P#?D_K%FmD4?-fWMW-L9Kt1fvnF#gjlRw zoS-bNaWnOA4HU+TEtwkcXWQh&hem=<6uEWyQ2I)MVnQ5GPWfFxs8~Oo<_%W5 z?YeT5wJe=jYSJ16M>1I~`7p-2clw&dz4sN=wnQFRDY)*n`Yt!G&JQClk}NEUiX__P zcV);8C#~DQ&fm_TL7aS61qO(pFv-ss+XiSn>&99JlQ!?=GF#Ma)vi{h`%{UF9|Qi9ci!z&JD#>5G-e=+(>YwSVF~CC zrPgQbP3a!?ay**5z4F918AB<-+q>t*2oZJ6{3=ZvU$+wmc{jY7*O@3MHfE}P+SyQ~ z>pP$0^$Xp{6?wQ$MX3JA^uuWR(VU4hq`z={%Uva0;G&26j`(Z;AoIQ;sYn59kd@VH zqA)B&clVnL`mKm!?;7zcW4NS5@%tw9^<3Xi*+(i5oNZ}6LtbMa%g(;rdb_<_m4Vy| zaJXbJPWp|Z)&9(x2WoJa;Z!aEN0Knw(?-`nQvuI1+@`b?RS$qcuJ}^aEu@O&tcDF_ zRVA9jLnqu#n7%int(jZ0X3Ga-+h$q3l~O8(JW>GgMgmiR zOTi1TgM{VZU88KS&AyasuSeQwsP|UB2%B~Vj9KSt0Qx7uc$(BzscT|srYiSeUpQ%{ zU@X#gym!k>V<(hK6=OwNFx~%02O*C~Oqy0V$>+K>U9_B7lb=0HchbMKJEIdZW)r>u zZjqFh8u6YV&Frsc^6rNxe7tho zYi(!aBP!9d(Sl@^ay!0TDan@|7lcPs32>I&3lw|M<-F0eu`nqz`dT#+b5n}A!1fZD zn@zEWX=7{0cCQ;#=&74O9AR4c@?i0T9pO=KYD6B}74fcVI(^{Nfls;4Y~nsdy~i8m z9(6mHz55UCelY00DE-nhtI-@x^NZo+Q5;XGZdDQo@KDn+D^G?w#cO zrhO`2iyur&%KXry`29G;s#QMnDWAl@LF?o~riGtvn9q1-A#HR?MHn(BzS{9O%{-{b z7Fw1XA18ARjC;5BO7|j6d3@;Cl))1z!NjrIL_8P!>C$?~nn>?!=>&W1e{}W9&Rj;9Eu=A#)+p=$2{F`>qR-9>C6%s=_=@4O% zUTkQN=hG7Sv{UL+QNYp~1-9kIM5L%D6hXrws9~DFE?%%kZ)(rO=bQM;d_uQPJ-Fu{ zi`@{z)6`wLL*v(=$AYw=;ycP{ak3El%D|SdH!1Jf=5X>rJG#0WjueGa1I3v>n;FQ8 zQi7#cmI!Zd)f~R~X;=Z(-MZ2&BchJpT8MiJ-Xth3@X`|_Ma{)6iOQ(UA?G8`DdOhS zT1)gxcuH=br~Go9UU@4;9h+@2ht1x!h&8*{JLE7gXlGYnc8Ksx;dH`Yp@u0&oPgLO zE7fY&fgtwo-g42dEgLF#Q11zc{KW^b0UXop;S-X z@s*?g69Fn~0d=F1$0CTLA?*1kdWH|DS?mBV`GwxM?CqKSw>O51q;T^Z+x|h;mpb2p z`vQNXE6%)~cFM=Ov+Ff(}6(!$TMR->F3H8I4Dh0-# z)5!(1zoD`#*>k*@C^PtiHff_-N|+o(S8XB-U6Vw>&%-m)!ml9}XW~7G9BCXNzcZk~ zBoh;9DdzF!uOx!8fuuv^QStD8Qf_;?!)pnEj@@JA2 zR(iUAM%JTP)?ltrl zdsn#LO$N^kSv^}*+TciMUII(+ctz^${;P1IhR23qI!S+O*3(&p`Q~&?ojCqwv=t_O z>y2l}fTquax|2&2?N_A%-6;}cskorFg64an+4PzR0rGR-oF5Vfu11LwegYG9G8BQ~ z6HLpnOC0dBdAVPgEqks$eb(E_(49~$z>CC)u~^(w1q%eZlNmS2Sd~xJgakouEgQ~o zTk+=kN}j=v+ssziENCSHGdmG$mh%_@cciz>F&ms4aVc?kCHrjNu-*;s_*lyFrb-FC z8!+W@(6$Bw_!Bs025mi`cFp{#Y0r<@>B6N=T2Q(j-6=K^j7oMAnh8YW3soeOgGTvI z4Aeyd2e|Cjaq+D$nq@rne9AUwriy^gq^Pg!pq-Hj8E6K4%>N*!W{9qb$5d#z&hRM} zDj64Js}0Y>Q$F%ui?u*weOJGe^aV`8NboVCPK4G;RHZ?BX+S~Np7wu?oE@jw|AC|O zCu)(Yv=%%ViAS#WKI(g_fekcve@8&f?x{R`NBQr4nB9J~<=JDp@o$M>JX?%5L|9s7Q`<~{!=N;vozYD5%jTm> z7iqp_H!LqL2fF*f0jFwWgBr0JP}D|%`RVqF;Vbh5NonK4)*-D*ubKw%HM$d>paZ9owePMVtUyim-SeRIHP6kvz3py@LS`U z9ew^21HIN%l;=B~bI3ckBR|5g6LFN?gjoEf2QiQn@>qK6Y!V1qeM08JDrA^PuIYJ6 zK+ke#mJWs|x8GZS%NAvfaGd!>7s;!JSl*e+GxZb;So*^TrYG`#eEYhkYMAjrn&_)` z7i{PQt%TkxG6e=Mr7Y>KXS%exj$g8tkY93Ntl*qJ%32HQ)x8w_MPt;-s-}*&9ZnlL zg&uyLoE+VBmoZ-Tg)PbEbbcrUb_FvrOO@36H zpnwHR<0_zTzm-86HCN+@zs|*QtrkNX%^AF=1)g7Ye=EtiYVVH4e>UinB`m9EEJ=e* zeFmXfE?6UY2Zz7O{Mfg+b0&yOx!2aoG#GSFpyFy;H)6sA9kT*Wjr^>er+gZyf(;q zFGUAno-fHZkuF0`J`D4=wD~p7Snb&AaHo1hre_IspXs;XG_hLmiQ$=I#4&nK0x2(m zCYx;hI6Ek%6_lQ$U&?rofIx z8d+q}(?(6Xc(U6V227h2?=g`fiq5TI&i;OXtC||zTO@5RSh9&_qy~(OI-e>bi#bZ- z5!CexuZhMaQPcRK=_|0qULBhWlp@r>KPT(%YVkRhL_4MbRTVF-W9s5?m)kM&M^)&` zk-{HbTUhSMZ>m?p`s^Qrt^}eG9a8G=)*Gzq`zRAhFXV1A5^+7l0gD-)`{+;JCT^$} z=CggbrHOS13NehJgFf+~wp^t2Nb63G(Z`uN;r3ZeQrrZRXbH55W+#SYMCrZJn;#uy z#mn86{ESWg`Vhq`0p(QC({&z?8_(UAn^MBgkhodUr+-sqE@f7(p;qITs7<@9x)q zR-LQ?eTKCdQYei0*1&@5WN}lw8OXTeMXH*C7l_{@w`-+3$%QQW*DFnjsEU z9{RT?@y~=RGWx;0#}xPYT3V_$>T_?}DdN^>0Al!|&7qk;l`%xCZJ_+F1=Q3RHYUxF zlxMZY`O)To9X>fFfGRJSRcfmE!UgrQyC2>)fP%r;JTe2!|G`{u^Gv0a}p@>v&sYE8wl-WPQ8HfeexS|YWcAGBBO z*q5152z7R1u)hE92u<&y;OfvO05?4**~#L6lDYaOUw62)Y)e$_@JLK-*9se(H20j` zBY9S8E0`tsI7+z7N(h~8LT^run1li>PpmOB-FPA_*(X$gLgGyT%3NQ6&Yr>m+7m=L zG%(RE$!`tom3T0lJmU*qtCCTpf``*V_NY%q=6+9byy?N0j9LnevZRs7d=QItb5_m& z{7AraM5lDe{ev6OiW)EjRUrl;7T~E%emI;fgPqFb-jo#U8<&64QyB^-M330n?PB!4 z&F__>QhcQF3*n2~u7F3iW8)YL7k!cg`+DJl%C+ZNDz+$3IiG!8X^Awh?R`>MNa*!(#02h?fxH;Yc) zM*0KkNoiRowkD+SQ_^{u#K4B#ApHTF*@iRglKg2)u?cJ9hWpx#UH;YKp$z!oXU~2n z$1k9hB6J^;g*ck3NL>tu1gK_Y5NTA@l#;ez4*m9VPd8V zHdz;Cw|iO5l3y}?4_BuCStgDp%?jiI#{jcvcID= zn>g!{bemIucE}w1aC5d9YtkCGTYbicJTZ?8_Hli4y@X0`ZzxJVvAYiojDI z^@h;_kiK>}aM<<@*^-1FI_tFY=T|(mzZ!8J9k79ZV9#cS8DO*t@M8uUJcaA>6*=wb zKfXivK7m~A?xnx2({(2;{sb)&Kc)vWrt8ObQ9>J4Isn%Zp&`v6wBVN&qiGzGA|$F= z&$IR)G-jW7EH__e6x9DI;;7$6KF>VOr>_}>3!D^sAHsg^KhKn}xcFb?zZhj~_EzMM z?SJ#O{tZ2J9K?yo0rdx&&&#T&f*d_mns{K`H#P9LJLcC^0xVVV)fkDKRq@=+Pt-*R z5=KC(U`vX4h*J&H3&N(p-T5&!sK`{fA^b`Wz!E{1?vCh@>4s#InJ`Vm7iMDA zS-x*wis@My{6!i2Gi!+_NMgytrtRm6S4G%4?J*O!57ipbv%a4#ps!*O{{YJ4CFMqG zxea#W^WM9D#3()rhKU{O3+yUV{KkMNc;QORm(4dJR-V<6Y#UjFSG4@^aTlgP6686e zK3ma5s1M0_$QqP#1FOn|QJtF44n^FAu9W+r+2fIbQz)g0wku#k^4LvjTpVDd29%e4 z70Qc&(5KJ*xhWRG> zN}a6cu-@$-iblNFK~D#=I+k`0v4(+&u$eE}oE;4Al+}Z#XhPY~vNR8$$F}GzcxRoQ zw`1m1^g@7ixvYDTM$0F*@b$EhV%tcH8l=U{BxTeO3)^~wEUS#yRHP)|brXy6S+IEg z+WrT^jPE0x9!}pb;=Jk-7${E8n#81Bgmf{zDb;Q>m%k>E#Slpgr_vZ)*2U7xrNJ6w zT0NuJ&ZR}qhA4YLy;tdE`=@hCX@<3Fz7ura?HyUGxj~?t0-dL1<)`^H+af(I)ct)F z2aaKX1tZ8vt|q!*7yyhaF`AAcc1tgA^N4a5|81S8J4uu+6n2j#gxBIz()jf8S+FLk zL$yKPe}33L*p3F64cdK%-4`T1{73uYFGAja%^d9Qfoa$S?CG*oHuVl#ziY`WZ@Q$aBktcEkDq7Pt_+hXrU`qXP zYJCcNz=Qnl7pAkuwHOX5?xa*n7Vo+0vjz&8t27wGJWX_JbF1&H=ifN<>eg&pCIsR6 zY$9}yo(HEkP{gc2ND)fb6~|k@YGEVG#!TOeZzMv+BSKE`iv?xx3Xk0yF45z+Y7K_^ zKaK3k-26x9PzhvLRvQ6W3M;($Ws z(UU?j&1G*DqNGS@n4y{9j6rCLZ{{X0qiaa(Kp8yN$6pk-a^%~ol+r%ucM;+$|B6=b z8Tn5cce*PvKTa<~iB$ndX z(bM|3R}q)Xqa;~t(eNq?vp`olKp16u?nrRwd*9+`e79%w6}H{m`jtj`hNx(~rTb$`9-oaN(w>Urzv`gF ziMtd^z$_%YOD=c%UNOs7iTy~HK=UL}y~-{3%jTwuIs6V#Vvgd~+ zb}8fD%Y4t&f8m)Pq1>wmPef+Q4mJHVlSJQ%!q4?9-sd4Nn)ysRvMbl~c;xl8(X5?I z4j#V{JO6L-g<_qNxL@4j@8}^#M1?)R>(Ii7}JL+3q{_`8|Qz0v$vPjc4&A989@ zv#j~=cT6d)qU~pGlQ*AJyMrGm9ObxjSUf2L+mqI+;c~!U(fkHIDr{{POP1So1!l6s z@^ra{x^#)~eLL43KCtG?Q^Q??os%KiyPw-`7D6JT5hqDUk&aCI`O0mxPrfndVb;DA zO<{M?uvv52T|z`ARUVP!_m!m1cIAx7j_(qqiDL8qj?F_Q7r`6GbKV{b8IoJSUU{3~ zh{U%B1B-{d)`wJGMZE-*)^rH|br7Vzqi|%ULOId3s~vyk7S!&%D>6P%y-UgS>)Y?b z*7p}RiiFWGVFS*J_}UN+RX``PZer$6O=h44^ej3tVN!@nHEe1Pr}Vu88Xihmg0JsU3T z5H|d9t&|9sT-^*kwLdltgBxM2u>>*IBTg*79L*Gt!o_(C%Y@8jFLCxI)u~{2F4kY) zJ!>qysySLoSkT(JIGSc$xDNllm{sahW$XuqtE2@)35PB~nohUg?*BJxCc;lO@j@5e z9};KzJoEWJ)qS3J*6cyA><#ux(YjX#?vC0RaQW?7T(9k3_gf~q(V z#Ieqet<=@hVUkpz6_O)Ay7e7}XM9Cw4s|~8hLMjP3g*-%i(lkR+v5{=bf!6v{qYqo z2UcVV)|`~g5F8Ogei%*AwvMoQ+cA3U=tUpR-|^B_CCQhX@|ne}#KV#|j^ncMPPm=Q$aT!xA%>MpdCxP}`E;T6pa_5Dc-J-m)7mFDF6G*N4WdxQQ8y8+ z4Y!+oaxU6M8^)`#Br7A%dDmE(b@8rkt6fMd782yI7G5OB50XUR!oxO3)m3qXtc7zE z^Y#QS=tz0?M1!8WbIB(WtX>!&x{fAi?IgzzkM#iN$4$ODTP+$NTJC5$S?Fjq-rm%4 zBbWE(ot+5YDvIrb{Ic6KzqrX~=)y!(&o&IRFz5PgS3pgwnhY-48pMYl5_x&paD@1- z6zXN?*`$&DoG)J0Dn8B=8Mot(ghnG~)+#GX9yA#Ps!;480J-;|2rEo&mr50pwxYj7 zhr(@@`8cdVs* z_#W{z=o>e3JnPlz3vNcY#_P#xX<*K3siLcYYi{&W<7jCz8f`VLk! zbyXEC51nZfE>jZa{oGg{wrkZm_VsJqndMIHnv~E}g?%6Y-2R8`S^fi&;rJh};A&PmJ^IbUiXgd+xjmY|CLiNIQ$AC}LaBu2Q zKycPB5n5yiHLP6e`cX-A*3tS-n`(mC|$*E>b&$86<@q5xbgkw{Vr}#DiZc4OGf^QW+AphK5E$3w+2FZ$2Zup-#U_) zlb=y{SM4-^2#pMnh`gZx#8lO>??DwipD8>pOqh)AZ2ts?abxlqThhE*NtihCGR-4> z=d+zEH;|UTc$Wcc4_)+<+cr1k_1x@XmYu#=eX2lpq~OcDm|6uh>Ya-Q7ZM!T3Dpsi zOYt&*HIfnR@zoSyH+;>z_T>gSMhUzY6jB!1~jOkjw#HRv(%jQoOcZ-<% z^`evODR$;Za6C(Agd>3_#;BNQ;=Aw7?lhd3%^7hhB|e?JyCF|zS608{1EG)Ca_;_g zv-jO8(J^wa$y_>~SQm}REfdlT>PjRRaF8Bu|BRX|-TFaJ@_0j2ieZEo{nP0B*Ta@?zYC9KysP^yw&&4IgoT!vA zT|}1?i9#-;IvvHtiAq;f5lI#=kTjigNh;xVB(g_jDoG(Km)WS~I(v$l zZS2|m_ntoAf8p2TA&-a0WA?oFd%xdnz1DNB{a)u{YMif({ik~K?|~&P^rzJQQ+Q<|FasyZ$*?2p9Ai7Y>?0Zyr|-3$dT=SdTY_EB-ofa4gpPxLZWlgdKwT<2Mp}&?fZ0%P(vtZ)<{;QtH z&+EN{b$y}qnmPp)XIaspH1(91Ob0pJbH(R5*?+{*&BGdc+~khByC~2m3&Mj!FsQ_1 zppo=>q3A{b!I(sF{Wa<)=ptdGCL+<{CYC?ng*2k)m|1NpO?S3B^anq5iwVui%NwyZ zKa^G*bw%#8?lbHrP?Gv0CIcnE4})4W#jZXD9Ud42zik{VnsyBe_>im1^iYz?&JmP} zvkZ=^8oa33vMX{7(Ic!(JONkys)br8$VzlF!U>Y4YMOC?rP ziJKI%Neh>GsunDA!%}~^hK$pdk&%*GL`gQbAP+R0gxw+SsvI*Aqd3&e>Cs15$2JD!Z)KgOFa7h}>4wqZojmQ9=JcL* zhgOK}Dd>=7YPAuM`3l;Wc~hwW-7AU-A}x>%)8@e=anZd3Dy!3W>US<*STB^hNp41C zc8^~Ntu8W8gEIa??JdZbwuwZEg?a-cP13>s({-FgGw^!CBAhAeKlHz4$Xd8qNLPxf z#4`$U0z^~E(DW0Ji6>ZnTPJ!juf%vQh>5m06 zv2$q*-I8L{WDy=Dn78M%`))eQrJ=0Tbu3ea!_3CaFe`Pp)gx%}K5e|nQI{7xyJ~s> zjWn?7eE#oVC)}h3*S6JhKXmg{m1}qJGJ~L&i;+Q66}ptd3h)s&mLNWlE1I-m321v$ zC^SQ3UTTgR+dUph6lBjGXNCz@?V$}1(UtVxM9yo~s4pToZas9t5pWprXa%0+3hZg@j<{t1fM zry=v()Zpt~*Fu9`X9sSsGM=12ThP*K^$zMW$R`+QPpiP?hL9tLoaQpPF}@mMQ1MtI zdfh(u?a{kd9n#?vX%C1u@u%qw4vnLx0eAx;<)tAfPZ6^ z^Pha$*&Ate@m83d?x*00n0#~*pQ*FTYECHY#w=WJ0vEJ4b=Ltt>B6|F*OU;_=M*wR z#Z&h~u?qy%l}Btgao^Zi8@BwrV#T&o`1*O;%6J)`xOC(nLjUJM(J~5Igi1H4D$$rz zRqa1KD_8-A;GKI(baierQ@T~#gRmMbI2eia7L#f8mz()*`t6VDB6j1iw zXd({k^H{(w1IcIv%}2>M1{kzonhEO1Mjc-bcg&Ti@9_7tK)v4(i#?)>6_;OnS; zOGf#M_{|xiTOK^WId!@I-6`MOBRz3CcmGM9CdG62SOY^Ah%akP5J7uqd$y4kP*J|$ z1ld@RJfiXlpKx(8(88KZ#6oW;l>2$gJBV-Ref@Ppa7Vhdue==_`R2yJdOY{#U$}@s zb0>^98r|{C^Ubpm!CDBp{1)tJj%_Lg=p+LO+OPL{diX@f7=^g#Z%BqMlg*xUUa}_T23vermx2)Dzm;(3*!Wt z=sQ9u=`Ey*U5ew)fwEHh(1!KiC&-mlx9Yc|p`L=}R8cz=YH6wA1Om7{s?utyHW8~< z0bg6)KroyD(>o2MP{#{C8S%spk-XuV4Wza72)CLoCZ~#E2XkXfPMbFylrad4ZK~*BRUa!gNF6kASD1G+T))L z@_nl5xTMbF7NZ4i$Z|WVRq*ef(*s}6Ehki>1{5>p3yOdC+RrLJN~tFFZaB&+Yb4p} z8A?THittV{b8+Q}lu!JX-!V$Zn*Kh{n|z$>$1Z5q8apLo(s6h)W*m%{w?{=I7CfQg zUwa}OGGDtHV8)*ewA8NKYGdH6H1d5Wr4v80d~CW1ey&gK_>!yo1Nb`NLxAOJe_Z9Y zY8n}3ceHFz-O6EEuHOc7#ucTHCSFO!DeogKM0u6Ck=njf;ar}xx&b>lh&cci1Zv~L zsOdOrg)WMiZkeu14P9jTBdOT#S-fsbww0ZJ@~3UzEmZ!pi8a{dnqm9E78Tl66~@wjwzA>73ahejN1i`VX9|zq-;|L~4lO*Vg0N-`wCj>5_5q z(49*Cy+?Od*7Y!Y7>I(}6a())8TNapU?9cM45l%7=I@w^0-3@_s)2u^!WICR zWsk(ADM!>XSTGX;VwDfu?Lx$ppJp1}cXk8OfAG`CPDI=p)w2!dH`1V%n|y*qWs&(t zwcUVvKxWwf=Pc!?A3knr~aAQ!I$j6cT8wr$LC1EpYCj${!WN z8JO*?flEan`!<$Sa9ut$)114$S4cx`ew+rIL{s^y4aDYFzmJz0TroYR6=qPEH8g3Fq)J9#8pL|WpjaT9!r%PeyZcq&{+ zsKHE3A=$)deW;Vndy^o~c6t}?20noZbUr-LmvQAqS+b^=PObexxarD~so#ChIneNm zLM!kLy#^JV@ZKZrykOg_8hFEZLVZUOUUR3u^WXW~)UJ!IEFDC0nU&O)Ofr60g7?JJ zF(bZYbrCBvlGz+{cWFz2)0+Z3A#2K;-)rpqx4U#xQIgVUJQ=egy5)*FtZ$`Ff;(`) zB>f*jJO?GFCvw^*H1W}I)mseVQ1DI(_rISL$Hzf4Z^a#YcZNI``ux`5>OsX??-!Rt zBEDSce!Ko@m*1DeBMr}+Hr>ge_xgFziXneTn{jnR+_IdeJ%bKIz>H;_^E%SM_tm`J z^1CJ!XvZEYaLq|KuE-^4%BlE1pj_X91OmVlW2%Q=AB&`5{DM0k@`u5nZ<&_P zpFd(){usGiIAd)Mm#K+at=RMlfY-}MMvYLf3J~Q3`t`3+7wbv}7)VX2%ZY5VBDN$g83?Y z@(tB3StLEj%dHUTi8v=2hNMCMB?qc%zHs>NmL*$Lbx}wgk?5i!bbKFB&Aq_tKK!y0 zamW~ptr0eqgp5m1$ArJME|D4JKQOj^@Mr1HWA0WoKF<=77z-9qIPUl`UDn4ga)3F#-R|>j=s%6_O0`Uf6LIoIRN*~lX2I7 zW_0B7fKjT>vGMNhKV7DbDIK~`{MIrvw<6_8)~Y>k{{7e9i23f@lKx>#C()Klp@@%A zF=}m-f`;z{`rxT@Qxs=D3P1maT%Uorm~9Hd(gyh(u9|qo?lF@oS0l&&QwQ%fEa~Os zUf5y%;(|^age6-`VX~Mh*F+#bF9sA;JfsH0;iDJ%OzQ;2{3vG;>sbGL5C3v;t}j?2 zRojd}9FcT*UiTCfDAs*t^#Fd9sCS({;kvo922Rm?J1BYc-s>cKF{aDsMoHD@i8C?il zc+?0%KohK6-SEfpVcWtj06X6quNzOrrBuv=itjRfAT#Cz!=r~S_{zKdEZ2&On}UOo z_kLY%@NicBn7G2bo%h~BN2yZ?Yj(~+NiD>~(_D9Z+^iqk@QywxM`Z+l{TggbXNVQ= z|F#TJRf7&46SyH1LS@xUs2j^w(a)W;b#R`c<{m3<3= zRq-%n-Ovd^PFeDvzyA16BMAtdFUBsfEvp2&h*n+)(iKI>a_^#Qaw zlH?BC_I?>3(sqZgL4_Q!0su798w1*LviXDXAgEqZZ^|${^;`7` z3K*Ge8?f(_E6o?Zsy>-ZoZFz{_8uK15&&WcNgbUUhIY(y&2xPd*`EW!bH7&`ut7DR zDrcQ3H@+_g`HuWnz#uo`*^cYcvg6xG23yZ9Y3Os{>MLolHNcB!cHK|sZQ1{FmuYNZ z4rv0i!WS zsUGoSm=Db}-ra1+svGkPa9qyq&3_$LdUsY=*{HqV<;5=!bi2)bMOui+01HBRqZKTe z${L#?JlPP0EZ%(nUQ-tX7X9$ zjgwm7v;dY7OMIHNir&*q-+(_#8kkI(rwpIc(i)Xj?{A2G4s`h~(vn8oDMLy#HB3`< z+|58JinI7X;Pw@+Wwj8f7#+1!n+1+P#EX)6#~zukghB?lw>#xY|BKWNT)YYqTNLuv zW9=VmkS|9KNRL*u(Z~TfWI$WG|bauk+!8Uuego)r%Jiblf-P5;K83 zLJ#wya7VQ1D_hWCrwxA+Go$!E2HK+&^moFGt%BmHb~_BS=fnBwV;8lDyCN;;HQu9P z#?RyT#YwzBX2pS?O#MdRvmf%n$Etkc!vj%ZQpr6%?ns$yp6BE4&DAcJ9$OAy_f#v- zTU&EYB3iZhAzgXs6h3t7a4$g7U7aC@;1&F);U(i9BUVDWrPT#A!H5<`kf zwGghidHZ#5#7cbLErHNy^(`xtd%#Z4TO86vtfs`Sbgwd8J{hQ}wgUAJ!g?ZOjE#JM zT$Pb+NWfSe#)li|3lAmdzxYA_Vh;R_7kV>-+TW4ZRDnVRNR50%#2-$T^`T~ zMH^(SQjlr@S&@J~pt2y;!*yDf=^Z5Yd!ln>5%_t z)AKS^_W59;ga+Mfj1O0n6e|tVJNEZD`fg)uv38AbvikdGM!wb0+@>`ETOxuw$3O!^ zXi73`7zjkEHg8A2j|P!ysz>ZYJxoD$h(nJA{Dd`F#Ua2xRLAeYAM6FXWlbG5A^2#MrmOgHaPwbM-)+{0Z2Wo?EAW z*`o0c99Rh1A`+uyh}!aH*()!AlcLpL^D6*_Q1-Kov8vZV#Qew%=&m1YW*Zp9E-O9; zU;dQ$_1(?ttH)O$FB5nz3o5phox5>jzl}S2yr9IU^r}r$r9e_##4(VSc&T`ZLY?CC z=@mz{a8WwCFd~QpU;1DUgZnSM@DBz5!Dlrq>K>xL262z;siZNu{Wir&9UvH)zO2ba za;10VMxOx3kK8qm@A?Dt$?AqN>F>ZG%uqat9=JkR&Gc~Uz`WmF=zL>*a7;(r#5$z^ zKF?cUjqIcSNw)-+c7UdWFN<0?W2B^L3ouA?4M9%s6&Y;c9XpF@BhUm6eAE}vGvMzk z=7N=>eRTM7)iktB5nWA+NOO>gFG345HSCYd2aP4Q(YotW%O(~${K$#b^=p&J&L{u1 zu8N^gRcY;xSR(*o1p;EjAT>SUIt#gl5=;;=clk6y7vd@ZsGj%ZSC*98|23L^h#hFF zgT<{jBt7}8FD)OMG!aM$#EtJDNWnk}W~icPJIZQ!7nwe zEpvg>7E8Lp*n!CayQ+tl4=5@tWb+2HA=BinTpx#kECKIQ_h-}zgxV+V9qjzPe-ypk zIS68#d+WTsA(5l#_}JAAc$26v6>F#B^T?IJMFECb^Xs{Tq4P<2cZ9Q$O8O1&Zf(iV z@j7Xq#H>B@W#6TK>76X|r^12i2HRVO?ny1G14}Q8{*fGK0bMJHUKaQ_=bZ}3aHxpY;4>y|$ z(yw69x?b_nApl;a++Lq!k(}MASFc11(t;_Z=ED$JO?!OJwDv184K`&b4Yye^E?6@t z8QcUGJWzXHS*#hT-k9(UO)Wy55$KE=%9_FwX}156e~Gvyo}WJ|38XE*HZVGwIa;OV z=4ahs!VxEI$-OANo^#pbQt=LkMSPWDhvcZcnsaYO3z|Q`oMcW_PR=tt@l(aU@&wgt zu=+fY&(eKYoTMX~9UC{Tkep*dEGt~d^NC_ks`)=pt%|Il{8MaI`S9ym=``tq!O}~G zKV9;@7uZt2ziJ&lnJ+I`@z`l@d6R9<4y{Mrx5sqr-wy}GYFJWcaoT(>h-W3qtZozd znLrJ%C_+{EXnGw>r(Q#_{KRdgJPbr#AONt=-#42rH3#W>8a_$GTT+$f^JPg!>JU3U z0SrSXl3Ea_!%pa9($kfqnCCf&LBwPipESw;FY~ufxot~hPS2_vC;HCrme-qj3)l6m zDtXnuG@>D$q8iHd9<4jp{1>0uckqJDzUE2kM=A&qK+dzWmGga%D!-L*LwN6{IU(m(6hqeso@Qr0e0F_c@SLyN`KLkmv>8rUnwAV$#2szW zVmB58kI;K*rbE=DiRB{5?3SSa$c29H>7zGZmLM6w$P(aMvFdo;Q_XPocyZ7aiItK% z+VnO{H3M0<-{b5ro3(wzWagBy69$Oz^1lGTNHo9qFH{e$(FFc`q6?AMPihgndUhe% zJ#%{Cnj^?iPgoC`SWLZDd@^z1wH!5LXY8ptwsC9zHV;vCdHbt=YBU~ihgY^x-d@9` z-Y+0Y@7CCrmQ?JiRjpM`BbYxmMgY4qp6>&+IY?T*D$&MbZ^86>#lkd9m{bg!{QjEA z$z{2!r9C{;Sh^vBRWYpQ9#;63aA987&ey2&bVKuGV z#me-_SV;aw=KiO*mbRRASdp{!!_c)Od-3>&B*%!)rXuD*wWgIeeE(+$lF_Oz=~Kl! zRRDwn4qK*^uD^$}X5A1cyy?N7Fym5Gt{|bag=CrWSmk484yKt5Y`k#2x2q$ zUdfQ;1ITxRcrW1>&^hvH>!7*@Lu7yz_t8*JBlz9B2<} ztK=GKKp%iMfTa{lMh8hhMEvE<^7j}1p3oLSXNx{bjMR3e@B*8{JD#7klTI`teHDB{ zH#QM;dSl>em?ptPKxraK3jnVQkf-q@@SYU-DJY>sRC4hR7g;+n_~ijs6K80 zAI1e*81;d56Acf`TrC{~2fvP9Z2thmVBwK$`Du_RUaSCkX7Nuw5NUuQ^FRvFLn02S z3KFoav6$Mh+X!jXY2ubR9_{wa)UqSPpI1J+5EaK2uc45j9?R7&W7n1cefSz?1L(MM zRE-HaG0Xr%|kDkBn}1EwzT&9Cy&m_mu)Hx5%*E9qNs@Xd>Y?B^aO ztK{mD5AMC@H|-#Yn$ADO=WU8LF(iZe&{7dt$Mc3a;WtO(hAn_&3mr{wsLHY85|+=f!(fU(Y7-Fmi;V|G&y zE!G%|p)2{lA0mdp!vhsB>M{QsCoLWZSzDk?H+}Ze;GJSZzUZ9qA!UBO911fKwo+fk z*K8GSI6DF@=2G#N+JvHDFv(fg4V$WSn$!gv`otE%Z2*_hAM1M{n_Q{bSja)7RCv25 zUeqI9TZ5d6Jsb>c|L;m|gI$#|%WeAZf%+-!9?^?Cph5yHQvX34(QpI!1Ia;zM~X>=!=s z3ITTm=3G5>!0_Y|8j~13%h@S&VuABwa>kRTyA7>tKEDHrA$8om|7lgLx&k_U>4$qf z^PCUK17qbq94c`m9x#MapKF+rnxz0{sO>**grSWwzxn1__vy~aO@ycJe$8|JbyJ1% zHE+FX6*tS*yMjI=pafI|v0QExhDOJ!g|k!-i}zBUq7bReZ?dMej6@hc*=;W?I5z(1 zm(ja7{p;_Hmw(JHa`CIxjdjt{;%9g2p#t0!G*D(r!_fweda&Wfo4 znK8Rm<*DUYt1jC$?5WH1{16yYTy3E;lyCoa1>YGZxx=GutwVnw-(9vM4T@q@tRv&z zJRsCXJIgxE1(+hQ$8Z@svE=<3&h^KsKEL*K@3N4!@0PS=O%J-Nfi(ouBDDMtG|bpz zy+BwrYmYeNt%|*;>DM;>b+iAQuK#_VdI$Xf{i9i_5^B2tZ0DVa=esE2-^TUce>_~f H_w@e*mT;Wu literal 0 HcmV?d00001 diff --git a/app/src/main/java/foundation/e/advancedprivacy/AdvancedPrivacyApplication.kt b/app/src/main/java/foundation/e/advancedprivacy/AdvancedPrivacyApplication.kt new file mode 100644 index 0000000..b640c9e --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/AdvancedPrivacyApplication.kt @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2022 - 2023 MURENA SAS + * Copyright (C) 2021 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy + +import android.app.Application +import foundation.e.advancedprivacy.common.WarningDialog +import foundation.e.advancedprivacy.domain.usecases.FakeLocationStateUseCase +import foundation.e.advancedprivacy.domain.usecases.GetQuickPrivacyStateUseCase +import foundation.e.advancedprivacy.domain.usecases.IpScramblingStateUseCase +import foundation.e.advancedprivacy.domain.usecases.ShowFeaturesWarningUseCase +import foundation.e.advancedprivacy.domain.usecases.TrackersStateUseCase +import foundation.e.advancedprivacy.domain.usecases.TrackersStatisticsUseCase +import foundation.e.advancedprivacy.domain.usecases.VpnSupervisorUseCase +import foundation.e.advancedprivacy.externalinterfaces.permissions.IPermissionsPrivacyModule +import foundation.e.advancedprivacy.trackers.services.UpdateTrackersWorker +import foundation.e.lib.telemetry.Telemetry +import kotlinx.coroutines.CoroutineScope +import org.koin.android.ext.koin.androidContext +import org.koin.core.context.startKoin +import org.koin.java.KoinJavaComponent.get + +class AdvancedPrivacyApplication : Application() { + override fun onCreate() { + super.onCreate() + Telemetry.init(BuildConfig.SENTRY_DSN, this, true) + + startKoin { + androidContext(this@AdvancedPrivacyApplication) + modules(appModule) + } + initBackgroundSingletons() + } + + private fun initBackgroundSingletons() { + UpdateTrackersWorker.periodicUpdate(this) + + WarningDialog.startListening( + get(ShowFeaturesWarningUseCase::class.java), + get(CoroutineScope::class.java), + this + ) + + Widget.startListening( + this, + get(GetQuickPrivacyStateUseCase::class.java), + get(TrackersStatisticsUseCase::class.java) + ) + + Notifications.startListening( + this, + get(GetQuickPrivacyStateUseCase::class.java), + get(IPermissionsPrivacyModule::class.java), + get(CoroutineScope::class.java) + ) + + get(IpScramblingStateUseCase::class.java) + get(TrackersStateUseCase::class.java) + get(FakeLocationStateUseCase::class.java) + get(VpnSupervisorUseCase::class.java).listenSettings() + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/KoinModule.kt b/app/src/main/java/foundation/e/advancedprivacy/KoinModule.kt new file mode 100644 index 0000000..fa9f16b --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/KoinModule.kt @@ -0,0 +1,204 @@ +/* + * Copyright (C) 2023 - 2024 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy + +import android.content.res.Resources +import android.graphics.drawable.Drawable +import android.os.Process +import foundation.e.advancedprivacy.core.coreModule +import foundation.e.advancedprivacy.data.repositories.AppListRepository +import foundation.e.advancedprivacy.data.repositories.LocalStateRepositoryImpl +import foundation.e.advancedprivacy.data.repositories.ResourcesRepository +import foundation.e.advancedprivacy.domain.entities.ApplicationDescription +import foundation.e.advancedprivacy.domain.entities.DisplayableApp +import foundation.e.advancedprivacy.domain.entities.ProfileType +import foundation.e.advancedprivacy.domain.repositories.LocalStateRepository +import foundation.e.advancedprivacy.domain.usecases.AppTrackersUseCase +import foundation.e.advancedprivacy.domain.usecases.FakeLocationForAppUseCase +import foundation.e.advancedprivacy.domain.usecases.FakeLocationStateUseCase +import foundation.e.advancedprivacy.domain.usecases.GetQuickPrivacyStateUseCase +import foundation.e.advancedprivacy.domain.usecases.IpScramblingStateUseCase +import foundation.e.advancedprivacy.domain.usecases.ListenLocationUseCase +import foundation.e.advancedprivacy.domain.usecases.ShowFeaturesWarningUseCase +import foundation.e.advancedprivacy.domain.usecases.TrackerDetailsUseCase +import foundation.e.advancedprivacy.domain.usecases.TrackersAndAppsListsUseCase +import foundation.e.advancedprivacy.domain.usecases.TrackersScreenUseCase +import foundation.e.advancedprivacy.domain.usecases.TrackersStateUseCase +import foundation.e.advancedprivacy.domain.usecases.TrackersStatisticsUseCase +import foundation.e.advancedprivacy.dummy.CityDataSource +import foundation.e.advancedprivacy.externalinterfaces.permissions.IPermissionsPrivacyModule +import foundation.e.advancedprivacy.features.dashboard.DashboardViewModel +import foundation.e.advancedprivacy.features.internetprivacy.InternetPrivacyViewModel +import foundation.e.advancedprivacy.features.location.FakeLocationViewModel +import foundation.e.advancedprivacy.features.trackers.Period +import foundation.e.advancedprivacy.features.trackers.TrackersPeriodViewModel +import foundation.e.advancedprivacy.features.trackers.TrackersViewModel +import foundation.e.advancedprivacy.features.trackers.apptrackers.AppTrackersViewModel +import foundation.e.advancedprivacy.features.trackers.trackerdetails.TrackerDetailsViewModel +import foundation.e.advancedprivacy.ipscrambler.ipScramblerModule +import foundation.e.advancedprivacy.permissions.externalinterfaces.PermissionsPrivacyModuleImpl +import foundation.e.advancedprivacy.trackers.data.TrackersRepository +import foundation.e.advancedprivacy.trackers.domain.entities.Tracker +import foundation.e.advancedprivacy.trackers.service.trackerServiceModule +import foundation.e.advancedprivacy.trackers.trackersModule +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import org.koin.android.ext.koin.androidContext +import org.koin.androidx.viewmodel.dsl.viewModel +import org.koin.androidx.viewmodel.dsl.viewModelOf +import org.koin.core.module.dsl.singleOf +import org.koin.core.qualifier.named +import org.koin.dsl.module +import timber.log.Timber + +val appModule = module { + includes(coreModule, trackersModule, ipScramblerModule, trackerServiceModule) + + single { + CoroutineScope( + SupervisorJob() + + Dispatchers.IO + + CoroutineExceptionHandler { _, throwable -> + Timber.e(throwable, "Uncaught error in backgroundScope") + } + ) + } + + factory { androidContext().resources } + single { + LocalStateRepositoryImpl(context = androidContext()) + } + + single(named("AdvancedPrivacy")) { + ApplicationDescription( + packageName = androidContext().packageName, + uid = Process.myUid(), + label = androidContext().resources.getString(R.string.app_name), + icon = null, + profileId = -1, + profileType = ProfileType.MAIN + ) + } + + single(named("SystemAppLabel")) { + androidContext().getString(R.string.dummy_system_app_label) + } + single(named("SystemAppIcon")) { + androidContext().getDrawable(R.drawable.ic_e_app_logo)!! + } + + single(named("CompatibilityAppLabel")) { + androidContext().getString(R.string.dummy_apps_compatibility_app_label) + } + single(named("CompatibilityAppIcon")) { + androidContext().getDrawable(R.drawable.ic_apps_compatibility_components)!! + } + + single { CityDataSource } + single { ResourcesRepository(androidContext()) } + + singleOf(::FakeLocationStateUseCase) + + single { + ListenLocationUseCase( + permissionsModule = get(), + appDesc = get(named("AdvancedPrivacy")), + appContext = androidContext() + ) + } + + singleOf(::FakeLocationForAppUseCase) + + singleOf(::GetQuickPrivacyStateUseCase) + single { + IpScramblingStateUseCase( + orbotSupervisor = get(), + localStateRepository = get(), + appListRepository = get(), + backgroundScope = get() + ) + } + + singleOf(::ShowFeaturesWarningUseCase) + singleOf(::TrackersStateUseCase) + singleOf(::TrackersStatisticsUseCase) + singleOf(::TrackersAndAppsListsUseCase) + + singleOf(::AppTrackersUseCase) + singleOf(::TrackerDetailsUseCase) + single { + TrackersScreenUseCase(localStateRepository = get()) + } + + single { + PermissionsPrivacyModuleImpl(context = androidContext()) + } + + viewModel { parameters -> + val appListRepository: AppListRepository = get() + val app = appListRepository.getAppById(parameters.get()) ?: DisplayableApp( + id = "dummy-app", + label = androidContext().resources.getString(R.string.app_name), + icon = get(named("SystemAppIcon")), + apps = setOf(get(named("AdvancedPrivacy"))), + hasLocationPermission = true, + hasInternetPermission = true, + profileType = ProfileType.MAIN + ) + + AppTrackersViewModel( + app = app, + trackersStateUseCase = get(), + trackersStatisticsUseCase = get(), + getQuickPrivacyStateUseCase = get(), + appTrackersUseCase = get() + ) + } + + viewModel { parameters -> + val trackersRepository: TrackersRepository = get() + val tracker = trackersRepository.getTracker(parameters.get()) ?: Tracker("-1", emptySet(), "dummy", null) + + TrackerDetailsViewModel( + tracker = tracker, + trackersStateUseCase = get(), + trackersStatisticsUseCase = get(), + getQuickPrivacyStateUseCase = get(), + trackerDetailsUseCase = get() + ) + } + + viewModel { parameters -> + + val period: Period = runCatching { Period.valueOf(parameters.get()) }.getOrDefault(Period.DAY) + + TrackersPeriodViewModel( + period = period, + trackersStatisticsUseCase = get(), + trackersAndAppsListsUseCase = get(), + trackersScreenUseCase = get() + ) + } + + viewModelOf(::TrackersViewModel) + viewModelOf(::FakeLocationViewModel) + viewModelOf(::InternetPrivacyViewModel) + viewModelOf(::DashboardViewModel) +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/Notifications.kt b/app/src/main/java/foundation/e/advancedprivacy/Notifications.kt new file mode 100644 index 0000000..4051ce2 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/Notifications.kt @@ -0,0 +1,190 @@ +/* + * Copyright (C) 2024 E FOUNDATION + * Copyright (C) 2022 - 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy + +import android.app.NotificationChannel +import android.app.NotificationManager +import android.content.Context +import androidx.annotation.StringRes +import androidx.core.app.NotificationCompat +import androidx.core.app.NotificationManagerCompat +import foundation.e.advancedprivacy.core.utils.notificationBuilder +import foundation.e.advancedprivacy.domain.entities.CHANNEL_FAKE_LOCATION_FLAG +import foundation.e.advancedprivacy.domain.entities.CHANNEL_FIRST_BOOT +import foundation.e.advancedprivacy.domain.entities.CHANNEL_IPSCRAMBLING_FLAG +import foundation.e.advancedprivacy.domain.entities.CHANNEL_TRACKER_FLAG +import foundation.e.advancedprivacy.domain.entities.FeatureMode +import foundation.e.advancedprivacy.domain.entities.FeatureState +import foundation.e.advancedprivacy.domain.entities.NOTIFICATION_FAKE_LOCATION_FLAG +import foundation.e.advancedprivacy.domain.entities.NOTIFICATION_FIRST_BOOT +import foundation.e.advancedprivacy.domain.entities.NOTIFICATION_IPSCRAMBLING_FLAG +import foundation.e.advancedprivacy.domain.entities.NotificationContent +import foundation.e.advancedprivacy.domain.usecases.GetQuickPrivacyStateUseCase +import foundation.e.advancedprivacy.externalinterfaces.permissions.IPermissionsPrivacyModule +import foundation.e.advancedprivacy.main.MainActivity +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.onEach + +object Notifications { + fun showFirstBootNotification(context: Context) { + createNotificationFirstBootChannel(context) + val notificationBuilder: NotificationCompat.Builder = notificationBuilder( + context, + NotificationContent( + channelId = CHANNEL_FIRST_BOOT, + icon = R.drawable.ic_notification_logo, + title = R.string.first_notification_title, + description = R.string.first_notification_summary, + pendingIntent = MainActivity.deepLinkBuilder(context) + .setDestination(R.id.dashboardFragment) + .createPendingIntent() + ) + ) + .setAutoCancel(true) + + NotificationManagerCompat.from(context).notify( + NOTIFICATION_FIRST_BOOT, + notificationBuilder.build() + ) + } + + fun startListening( + appContext: Context, + getQuickPrivacyStateUseCase: GetQuickPrivacyStateUseCase, + permissionsPrivacyModule: IPermissionsPrivacyModule, + appScope: CoroutineScope + ) { + createNotificationFlagChannel( + context = appContext, + permissionsPrivacyModule = permissionsPrivacyModule, + channelId = CHANNEL_FAKE_LOCATION_FLAG, + channelName = R.string.notifications_fake_location_channel_name, + channelDescription = R.string.notifications_fake_location_channel_description + ) + + createNotificationFlagChannel( + context = appContext, + permissionsPrivacyModule = permissionsPrivacyModule, + channelId = CHANNEL_IPSCRAMBLING_FLAG, + channelName = R.string.notifications_ipscrambling_channel_name, + channelDescription = R.string.notifications_ipscrambling_channel_description + ) + + createNotificationFlagChannel( + context = appContext, + permissionsPrivacyModule = permissionsPrivacyModule, + channelId = CHANNEL_TRACKER_FLAG, + channelName = R.string.notifications_tracker_channel_name, + channelDescription = R.string.notifications_tracker_channel_description + ) + + getQuickPrivacyStateUseCase.locationMode.map { + it != FeatureMode.VULNERABLE + }.distinctUntilChanged().onEach { + if (it) { + showFlagNotification(appContext, NOTIFICATION_FAKE_LOCATION_FLAG) + } else { + hideFlagNotification(appContext, NOTIFICATION_FAKE_LOCATION_FLAG) + } + }.launchIn(appScope) + + getQuickPrivacyStateUseCase.ipScramblingMode.map { + it != FeatureState.OFF + }.distinctUntilChanged().onEach { + if (it) { + showFlagNotification(appContext, NOTIFICATION_IPSCRAMBLING_FLAG) + } else { + hideFlagNotification(appContext, NOTIFICATION_IPSCRAMBLING_FLAG) + } + }.launchIn(appScope) + } + + private fun createNotificationFirstBootChannel(context: Context) { + val channel = NotificationChannel( + CHANNEL_FIRST_BOOT, + context.getString(R.string.notifications_first_boot_channel_name), + NotificationManager.IMPORTANCE_HIGH + ) + NotificationManagerCompat.from(context).createNotificationChannel(channel) + } + + private fun createNotificationFlagChannel( + context: Context, + permissionsPrivacyModule: IPermissionsPrivacyModule, + channelId: String, + @StringRes channelName: Int, + @StringRes channelDescription: Int + ) { + val channel = NotificationChannel( + channelId, + context.getString(channelName), + NotificationManager.IMPORTANCE_LOW + ) + channel.description = context.getString(channelDescription) + permissionsPrivacyModule.setBlockable(channel) + NotificationManagerCompat.from(context).createNotificationChannel(channel) + } + + private fun showFlagNotification(context: Context, id: Int) { + when (id) { + NOTIFICATION_FAKE_LOCATION_FLAG -> showFlagNotification( + context = context, + id = NOTIFICATION_FAKE_LOCATION_FLAG, + content = NotificationContent( + channelId = CHANNEL_FAKE_LOCATION_FLAG, + icon = R.drawable.ic_fmd_bad, + title = R.string.notifications_fake_location_title, + description = R.string.notifications_fake_location_content, + pendingIntent = MainActivity.deepLinkBuilder(context) + .addDestination(R.id.fakeLocationFragment) + .createPendingIntent() + ) + ) + NOTIFICATION_IPSCRAMBLING_FLAG -> showFlagNotification( + context = context, + id = NOTIFICATION_IPSCRAMBLING_FLAG, + content = NotificationContent( + channelId = CHANNEL_IPSCRAMBLING_FLAG, + icon = R.drawable.ic_language, + title = R.string.notifications_ipscrambling_title, + description = R.string.notifications_ipscrambling_content, + pendingIntent = MainActivity.deepLinkBuilder(context) + .addDestination(R.id.internetPrivacyFragment) + .createPendingIntent() + ) + ) + else -> {} + } + } + + private fun showFlagNotification(context: Context, id: Int, content: NotificationContent) { + val builder = notificationBuilder(context, content) + .setPriority(NotificationCompat.PRIORITY_LOW) + .setOngoing(true) + + NotificationManagerCompat.from(context).notify(id, builder.build()) + } + + private fun hideFlagNotification(context: Context, id: Int) { + NotificationManagerCompat.from(context).cancel(id) + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/common/BigNumberFormatter.kt b/app/src/main/java/foundation/e/advancedprivacy/common/BigNumberFormatter.kt new file mode 100644 index 0000000..a2ead00 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/common/BigNumberFormatter.kt @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2024 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.common + +import android.content.Context +import android.icu.number.NumberFormatter + +class BigNumberFormatter(context: Context) { + private val formatter = NumberFormatter.withLocale(context.resources.configuration.locales[0]) + + fun format(number: Int): CharSequence = formatter.format(number) +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/common/BindingAdapter.kt b/app/src/main/java/foundation/e/advancedprivacy/common/BindingAdapter.kt new file mode 100644 index 0000000..fffa671 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/common/BindingAdapter.kt @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2024 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.common + +import androidx.recyclerview.widget.RecyclerView +import androidx.viewbinding.ViewBinding + +class BindingViewHolder(val binding: T) : RecyclerView.ViewHolder(binding.root) + +abstract class BindingListAdapter : RecyclerView.Adapter>() { + var dataSet: List = emptyList() + set(value) { + field = value + notifyDataSetChanged() + } + + override fun getItemCount(): Int = dataSet.size +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/common/BootCompletedReceiver.kt b/app/src/main/java/foundation/e/advancedprivacy/common/BootCompletedReceiver.kt new file mode 100644 index 0000000..8ddb1b3 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/common/BootCompletedReceiver.kt @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2023 MURENA SAS + * Copyright (C) 2022 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.common + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import foundation.e.advancedprivacy.Notifications +import foundation.e.advancedprivacy.core.utils.goAsync +import foundation.e.advancedprivacy.domain.repositories.LocalStateRepository +import kotlinx.coroutines.CoroutineScope +import org.koin.java.KoinJavaComponent.inject + +class BootCompletedReceiver : BroadcastReceiver() { + + private val localStateRepository by inject(LocalStateRepository::class.java) + private val backgroundScope by inject(CoroutineScope::class.java) + + override fun onReceive(context: Context, intent: Intent?) { + if (intent?.action == Intent.ACTION_BOOT_COMPLETED) { + goAsync(backgroundScope) { + if (localStateRepository.isFirstBoot()) { + Notifications.showFirstBootNotification(context) + localStateRepository.setFirstBoot(false) + } + } + } + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/common/BuildFlavor.kt b/app/src/main/java/foundation/e/advancedprivacy/common/BuildFlavor.kt new file mode 100644 index 0000000..ecb24ce --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/common/BuildFlavor.kt @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.common + +import foundation.e.advancedprivacy.BuildConfig + +const val isStandaloneBuild: Boolean = BuildConfig.FLAVOR == "standalone" diff --git a/app/src/main/java/foundation/e/advancedprivacy/common/NavToolbarFragment.kt b/app/src/main/java/foundation/e/advancedprivacy/common/NavToolbarFragment.kt new file mode 100644 index 0000000..93d7783 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/common/NavToolbarFragment.kt @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2023 MURENA SAS + * Copyright (C) 2021 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.common + +import android.os.Bundle +import android.view.View +import androidx.annotation.LayoutRes +import androidx.fragment.app.Fragment +import androidx.navigation.fragment.findNavController +import com.google.android.material.appbar.MaterialToolbar +import foundation.e.advancedprivacy.R + +abstract class NavToolbarFragment(@LayoutRes contentLayoutId: Int) : Fragment(contentLayoutId) { + + /** + * @return title to be used in toolbar + */ + open fun getTitle(): CharSequence { + return findNavController().currentDestination?.label ?: "" + } + + fun setTitle(title: CharSequence?) { + getToolbar()?.title = title + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + view.findViewById(R.id.toolbar).let { toolbar -> + toolbar.title = getTitle() + toolbar.setNavigationOnClickListener { + onNavigateUp() + } + } + } + + open fun onNavigateUp(): Boolean { + return findNavController().navigateUp() + } + + fun getToolbar(): MaterialToolbar? = view?.findViewById(R.id.toolbar) +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/common/RightRadioButton.kt b/app/src/main/java/foundation/e/advancedprivacy/common/RightRadioButton.kt new file mode 100644 index 0000000..c10d755 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/common/RightRadioButton.kt @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2021 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.common + +import android.annotation.SuppressLint +import android.content.Context +import android.util.AttributeSet +import android.widget.RadioButton + +/** + * A custom [RadioButton] which displays the radio drawable on the right side. + */ +@SuppressLint("AppCompatCustomView") +class RightRadioButton : RadioButton { + + constructor(context: Context) : super(context) + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super( + context, + attrs, + defStyleAttr + ) + + // Returns layout direction as right-to-left to draw the compound button on right side. + override fun getLayoutDirection(): Int { + return LAYOUT_DIRECTION_RTL + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/common/TextViewHelpers.kt b/app/src/main/java/foundation/e/advancedprivacy/common/TextViewHelpers.kt new file mode 100644 index 0000000..50cad5e --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/common/TextViewHelpers.kt @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2022 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.common + +import android.content.Context +import android.content.res.ColorStateList +import android.text.Spannable +import android.text.SpannableString +import android.text.style.DynamicDrawableSpan +import android.text.style.ImageSpan +import android.widget.TextView +import androidx.annotation.StringRes +import androidx.appcompat.content.res.AppCompatResources +import androidx.appcompat.widget.TooltipCompat +import foundation.e.advancedprivacy.R + +fun setToolTipForAsterisk(textView: TextView, @StringRes textId: Int, @StringRes tooltipTextId: Int) { + textView.text = asteriskAsInfoIconSpannable(textView.context, textId, textView.textColors) + TooltipCompat.setTooltipText(textView, textView.context.getString(tooltipTextId)) + + textView.setOnClickListener { it.performLongClick() } +} + +private fun asteriskAsInfoIconSpannable(context: Context, @StringRes textId: Int, tint: ColorStateList): Spannable { + val spannable = SpannableString(context.getString(textId)) + val index = spannable.lastIndexOf("*") + if (index != -1) { + AppCompatResources.getDrawable(context, R.drawable.ic_info_16dp)?.let { + it.setTintList(tint) + it.setBounds(0, 0, it.intrinsicWidth, it.intrinsicHeight) + spannable.setSpan( + ImageSpan(it, DynamicDrawableSpan.ALIGN_CENTER), + index, + index + 1, + Spannable.SPAN_INCLUSIVE_INCLUSIVE + ) + } + } + return spannable +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/common/ThrottleFlow.kt b/app/src/main/java/foundation/e/advancedprivacy/common/ThrottleFlow.kt new file mode 100644 index 0000000..06fa073 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/common/ThrottleFlow.kt @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2022 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.common + +import kotlin.time.Duration +import kotlinx.coroutines.FlowPreview +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow + +@FlowPreview +fun Flow.throttleFirst(windowDuration: Duration): Flow = flow { + var lastEmissionTime = 0L + collect { upstream -> + val currentTime = System.currentTimeMillis() + val mayEmit = currentTime - lastEmissionTime > windowDuration.inWholeMilliseconds + if (mayEmit) { + lastEmissionTime = currentTime + emit(upstream) + } + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/common/WarningDialog.kt b/app/src/main/java/foundation/e/advancedprivacy/common/WarningDialog.kt new file mode 100644 index 0000000..6075fe2 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/common/WarningDialog.kt @@ -0,0 +1,166 @@ +/* + * Copyright (C) 2023 MURENA SAS + * Copyright (C) 2022 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.common + +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.graphics.drawable.ColorDrawable +import android.os.Build +import android.os.Bundle +import android.view.View +import android.widget.CheckBox +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AlertDialog +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.lifecycleScope +import foundation.e.advancedprivacy.R +import foundation.e.advancedprivacy.domain.entities.MainFeatures +import foundation.e.advancedprivacy.domain.entities.MainFeatures.FakeLocation +import foundation.e.advancedprivacy.domain.entities.MainFeatures.IpScrambling +import foundation.e.advancedprivacy.domain.entities.MainFeatures.TrackersControl +import foundation.e.advancedprivacy.domain.usecases.ShowFeaturesWarningUseCase +import foundation.e.advancedprivacy.domain.usecases.VpnSupervisorUseCase +import foundation.e.advancedprivacy.main.MainActivity +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import org.koin.android.ext.android.inject +import org.koin.java.KoinJavaComponent.get +import timber.log.Timber + +class WarningDialog : AppCompatActivity() { + companion object { + private const val PARAM_FEATURE = "feature" + + fun startListening(showFeaturesWarningUseCase: ShowFeaturesWarningUseCase, appScope: CoroutineScope, appContext: Context) { + showFeaturesWarningUseCase.showWarning().map { feature -> + appContext.startActivity( + createIntent(context = appContext, feature = feature) + ) + }.launchIn(appScope) + } + + private fun createIntent(context: Context, feature: MainFeatures): Intent { + val intent = Intent(context, WarningDialog::class.java) + intent.putExtra(PARAM_FEATURE, feature) + intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK + return intent + } + } + + private val showFeaturesWarningUseCase: ShowFeaturesWarningUseCase by inject() + private val vpnSupervisorUseCase: VpnSupervisorUseCase by inject() + + private var isWaitingForResult = false + private lateinit var feature: MainFeatures + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + window.setBackgroundDrawable(ColorDrawable(0)) + + feature = try { + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.TIRAMISU) { + intent.getParcelableExtra(PARAM_FEATURE, MainFeatures::class.java)!! + } else { + @Suppress("DEPRECATION") + intent.getParcelableExtra(PARAM_FEATURE)!! + } + } catch (e: Exception) { + Timber.e(e, "Missing mandatory activity parameter") + finish() + return + } + showWarningDialog(feature) + } + + private fun showWarningDialog(feature: MainFeatures) { + val builder = AlertDialog.Builder(this) + builder.setOnDismissListener { if (!isWaitingForResult) finish() } + + val content: View = layoutInflater.inflate(R.layout.alertdialog_do_not_show_again, null) + val checkbox = content.findViewById(R.id.checkbox) + builder.setView(content) + + builder.setMessage( + when (feature) { + is TrackersControl -> R.string.warningdialog_trackers_message + is FakeLocation -> R.string.warningdialog_location_message + is IpScrambling -> R.string.warningdialog_ipscrambling_message + } + ) + + builder.setTitle( + when (feature) { + is TrackersControl -> R.string.warningdialog_trackers_title + is FakeLocation -> R.string.warningdialog_location_title + is IpScrambling -> R.string.warningdialog_ipscrambling_title + } + ) + + builder.setPositiveButton( + when (feature) { + is IpScrambling -> R.string.warningdialog_ipscrambling_cta + else -> R.string.ok + } + ) { _, _ -> + lifecycleScope.launch { + if (checkbox.isChecked) { + withContext(Dispatchers.IO) { + showFeaturesWarningUseCase.doNotShowAgain(feature) + } + } + + val vpnDisclaimerIntent = (feature as? IpScrambling)?.startVpnDisclaimer + + if (vpnDisclaimerIntent != null) { + isWaitingForResult = true + launchAndroidVpnDisclaimer.launch(vpnDisclaimerIntent) + } else { + finish() + } + } + } + + if (feature is TrackersControl) { + builder.setNeutralButton(R.string.warningdialog_trackers_secondary_cta) { _, _ -> + MainActivity.deepLinkBuilder(this) + .setDestination(R.id.trackersFragment) + .createPendingIntent().send() + + finish() + } + } + builder.show() + } + + private val launchAndroidVpnDisclaimer = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + lifecycleScope.launch { + if (result.resultCode == Activity.RESULT_OK) { + vpnSupervisorUseCase.startVpnService(feature) + } else { + vpnSupervisorUseCase.cancelStartVpnService(feature) + } + finish() + } + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/common/extensions/IntExtensions.kt b/app/src/main/java/foundation/e/advancedprivacy/common/extensions/IntExtensions.kt new file mode 100644 index 0000000..537b891 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/common/extensions/IntExtensions.kt @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2024 MURENA SAS + * Copyright (C) 2022 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.common.extensions + +import android.content.Context + +fun Int.dpToPxF(context: Context): Float = this.toFloat() * context.resources.displayMetrics.density + +fun Int.dpToPx(context: Context): Int = (this * context.resources.displayMetrics.density).toInt() diff --git a/app/src/main/java/foundation/e/advancedprivacy/common/extensions/ViewPager2Extensions.kt b/app/src/main/java/foundation/e/advancedprivacy/common/extensions/ViewPager2Extensions.kt new file mode 100644 index 0000000..e17d692 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/common/extensions/ViewPager2Extensions.kt @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.common.extensions + +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import androidx.viewpager2.widget.ViewPager2 + +fun ViewPager2.findViewHolderForAdapterPosition(position: Int): RecyclerView.ViewHolder? { + return (getChildAt(0) as RecyclerView).findViewHolderForAdapterPosition(position) +} + +fun ViewPager2.updatePagerHeightForChild(itemView: View) { + itemView.post { + val wMeasureSpec = + View.MeasureSpec.makeMeasureSpec(itemView.width, View.MeasureSpec.EXACTLY) + val hMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + itemView.measure(wMeasureSpec, hMeasureSpec) + + if (layoutParams.height != itemView.measuredHeight) { + layoutParams = (layoutParams) + .also { lp -> + // applying Fragment Root View Height to + // the pager LayoutParams, so they match + lp.height = itemView.measuredHeight + } + } + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/data/repositories/CityDataSource.kt b/app/src/main/java/foundation/e/advancedprivacy/data/repositories/CityDataSource.kt new file mode 100644 index 0000000..06fb9ac --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/data/repositories/CityDataSource.kt @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2021 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.dummy + +object CityDataSource { + private val BARCELONA = Pair(41.3851f, 2.1734f) + private val BUDAPEST = Pair(47.4979f, 19.0402f) + private val ABU_DHABI = Pair(24.4539f, 54.3773f) + private val HYDERABAD = Pair(17.3850f, 78.4867f) + private val QUEZON_CITY = Pair(14.6760f, 121.0437f) + private val PARIS = Pair(48.8566f, 2.3522f) + private val LONDON = Pair(51.5074f, 0.1278f) + private val SHANGHAI = Pair(31.2304f, 121.4737f) + private val MADRID = Pair(40.4168f, -3.7038f) + private val LAHORE = Pair(31.5204f, 74.3587f) + private val CHICAGO = Pair(41.8781f, -87.6298f) + + val citiesLocationsList = listOf( + BARCELONA, + BUDAPEST, + ABU_DHABI, + HYDERABAD, + QUEZON_CITY, + PARIS, + LONDON, + SHANGHAI, + MADRID, + LAHORE, + CHICAGO + ) +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/data/repositories/LocalStateRepositoryImpl.kt b/app/src/main/java/foundation/e/advancedprivacy/data/repositories/LocalStateRepositoryImpl.kt new file mode 100644 index 0000000..d7b716a --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/data/repositories/LocalStateRepositoryImpl.kt @@ -0,0 +1,188 @@ +/* + * Copyright (C) 2023-2024 MURENA SAS + * Copyright (C) 2021 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.data.repositories + +import android.content.Context +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.SharedPreferencesMigration +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.booleanPreferencesKey +import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.core.floatPreferencesKey +import androidx.datastore.preferences.core.intPreferencesKey +import androidx.datastore.preferences.core.stringSetPreferencesKey +import androidx.datastore.preferences.preferencesDataStore +import foundation.e.advancedprivacy.core.utils.getValue +import foundation.e.advancedprivacy.core.utils.mapKey +import foundation.e.advancedprivacy.core.utils.setValue +import foundation.e.advancedprivacy.core.utils.toggleValue +import foundation.e.advancedprivacy.domain.entities.ApplicationDescription +import foundation.e.advancedprivacy.domain.entities.DisplayableApp +import foundation.e.advancedprivacy.domain.entities.FeatureState +import foundation.e.advancedprivacy.domain.entities.MainFeatures +import foundation.e.advancedprivacy.domain.repositories.LocalStateRepository +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.map + +class LocalStateRepositoryImpl(context: Context) : LocalStateRepository { + companion object { + private const val SHARED_PREFS_FILE = "localState" + private const val PREF_DATASTORE = "localstate_datastore" + } + + private val blockTrackersKey = booleanPreferencesKey("blockTrackers") + private val ipScramblingKey = booleanPreferencesKey("ipScrambling") + private val fakeLocationKey = booleanPreferencesKey("fakeLocation") + private val fakeLatitudeKey = floatPreferencesKey("fakeLatitude") + private val fakeLongitudeKey = floatPreferencesKey("fakeLongitude") + private val fakeLocationWhitelistKey = stringSetPreferencesKey("fakeLocationWhitelist") + private val firstBootKey = booleanPreferencesKey("firstBoot") + private val hideWarningTrackersKey = booleanPreferencesKey("hide_warning_trackers") + private val hideWarningLocationKey = booleanPreferencesKey("hide_warning_location") + private val hideWarningIpScramblingKey = booleanPreferencesKey("hide_warning_ipscrambling") + private val trackersScreenLastPositionKey = intPreferencesKey("trackers_screen_last_position") + + private val Context.dataStore: DataStore by preferencesDataStore( + name = PREF_DATASTORE, + produceMigrations = ::sharedPreferencesMigration + ) + + private val store = context.dataStore + + private fun sharedPreferencesMigration(context: Context) = listOf(SharedPreferencesMigration(context, SHARED_PREFS_FILE)) + + override val blockTrackers: Flow = store.mapKey(blockTrackersKey, true) + + override suspend fun toggleBlockTrackers(enabled: Boolean?) { + store.toggleValue(blockTrackersKey, enabled, true) + } + + override val areAllTrackersBlocked: MutableStateFlow = MutableStateFlow(false) + + override val fakeLocationEnabled = store.mapKey(fakeLocationKey, false) + + override suspend fun toggleFakeLocation(enabled: Boolean?) { + store.toggleValue(fakeLocationKey, enabled, false) + } + + override val fakeLocation: Flow> = store.data.map { preferences -> + // Initial default value is Quezon City + val lat = preferences[fakeLatitudeKey] ?: 14.6760f + val lon = preferences[fakeLongitudeKey] ?: 121.0437f + lat to lon + } + + override suspend fun getFakeLocation(): Pair = fakeLocation.first() + override suspend fun setFakeLocation(latLon: Pair) { + store.edit { preferences -> + preferences[fakeLatitudeKey] = latLon.first + preferences[fakeLongitudeKey] = latLon.second + } + } + + override val fakeLocationWhitelistedApps = store.mapKey(fakeLocationWhitelistKey, emptySet()) + + override suspend fun toggleAppFakeLocationWhitelisted(app: DisplayableApp) { + store.edit { preferences -> + val whitelist = preferences[fakeLocationWhitelistKey] ?: emptySet() + + val apIds = app.apps.map { it.apId }.toSet() + + val appInWhitelist = apIds.any { whitelist.contains(it) } + preferences[fakeLocationWhitelistKey] = if (appInWhitelist) { + whitelist - apIds + } else { + whitelist + apIds + } + } + } + + override suspend fun resetFakeLocationWhitelistedApp() { + store.setValue(fakeLocationWhitelistKey, emptySet()) + } + + override val ipScramblingEnabled = store.mapKey(ipScramblingKey, false) + override suspend fun toggleIpScrambling(enabled: Boolean?) { + store.toggleValue(ipScramblingKey, enabled, false) + } + + override val internetPrivacyMode: MutableStateFlow = MutableStateFlow(FeatureState.OFF) + + private val _startVpnDisclaimer = MutableSharedFlow() + + override suspend fun emitStartVpnDisclaimer(feature: MainFeatures) { + _startVpnDisclaimer.emit(feature) + } + + override val startVpnDisclaimer: SharedFlow = _startVpnDisclaimer + + private val _otherVpnRunning = MutableSharedFlow() + + override suspend fun emitOtherVpnRunning(appDesc: ApplicationDescription) { + _otherVpnRunning.emit(appDesc) + } + + override val otherVpnRunning: SharedFlow = _otherVpnRunning + + override suspend fun isFirstBoot(): Boolean { + return store.getValue(firstBootKey) ?: true + } + + override suspend fun setFirstBoot(isStillFirstBoot: Boolean) { + store.setValue(firstBootKey, isStillFirstBoot) + } + + override suspend fun isHideWarningTrackers(): Boolean { + return store.getValue(hideWarningTrackersKey) ?: false + } + + override suspend fun hideWarningTrackers(hide: Boolean) { + return store.setValue(hideWarningTrackersKey, hide) + } + + override suspend fun isHideWarningLocation(): Boolean { + return store.getValue(hideWarningLocationKey) ?: false + } + + override suspend fun hideWarningLocation(hide: Boolean) { + return store.setValue(hideWarningLocationKey, hide) + } + + override suspend fun isHideWarningIpScrambling(): Boolean { + return store.getValue(hideWarningIpScramblingKey) ?: false + } + + override suspend fun hideWarningIpScrambling(hide: Boolean) { + return store.setValue(hideWarningIpScramblingKey, hide) + } + + override suspend fun getTrackersScreenLastPosition(): Int { + return store.getValue(trackersScreenLastPositionKey) ?: 0 + } + + override suspend fun setTrackersScreenLastPosition(position: Int) { + store.setValue(trackersScreenLastPositionKey, position) + } + + override var trackersScreenTabStartPosition: Int = 0 +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/data/repositories/ResourcesRepository.kt b/app/src/main/java/foundation/e/advancedprivacy/data/repositories/ResourcesRepository.kt new file mode 100644 index 0000000..23ea9b6 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/data/repositories/ResourcesRepository.kt @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.data.repositories + +import android.content.Context +import android.content.res.Configuration +import android.content.res.Resources +import androidx.annotation.StringRes +import java.time.format.DateTimeFormatter +import java.util.Locale +import timber.log.Timber + +class ResourcesRepository(private val context: Context) { + private val defaultResources by lazy { getLocalizedResources(context, Locale("")) } + + private fun getLocalizedResources(context: Context, desiredLocale: Locale?): Resources { + var conf: Configuration = context.resources.configuration + conf = Configuration(conf) + conf.setLocale(desiredLocale) + val localizedContext = context.createConfigurationContext(conf) + return localizedContext.resources + } + + fun getFormatter(@StringRes formatRes: Int): DateTimeFormatter { + return runCatching { + DateTimeFormatter.ofPattern(context.getString(formatRes)) + }.getOrElse { + Timber.w(it, "Can't parse DateTimeFormatter") + DateTimeFormatter.ofPattern(defaultResources.getString(formatRes)) + } + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/domain/entities/FeatureMode.kt b/app/src/main/java/foundation/e/advancedprivacy/domain/entities/FeatureMode.kt new file mode 100644 index 0000000..b6bc0b9 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/domain/entities/FeatureMode.kt @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2022 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.domain.entities + +enum class FeatureMode { + DENIED, + CUSTOM, + VULNERABLE +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/domain/entities/TrackersAndAppsLists.kt b/app/src/main/java/foundation/e/advancedprivacy/domain/entities/TrackersAndAppsLists.kt new file mode 100644 index 0000000..ebd6e07 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/domain/entities/TrackersAndAppsLists.kt @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2024 E FOUNDATION + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.domain.entities + +import foundation.e.advancedprivacy.trackers.domain.entities.Tracker + +data class TrackersAndAppsLists( + val trackers: List, + val allApps: List, + val appsWithTrackers: List +) + +data class AppWithCount( + val app: DisplayableApp, + val count: Int = 0 +) + +data class TrackerWithCount( + val tracker: Tracker, + val count: Int = 0 +) diff --git a/app/src/main/java/foundation/e/advancedprivacy/domain/entities/TrackersPeriodicStatistics.kt b/app/src/main/java/foundation/e/advancedprivacy/domain/entities/TrackersPeriodicStatistics.kt new file mode 100644 index 0000000..95c5c3d --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/domain/entities/TrackersPeriodicStatistics.kt @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2023 MURENA SAS + * Copyright (C) 2022 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.domain.entities + +data class TrackersPeriodicStatistics( + val callsBlockedNLeaked: List>, + val periods: List, + val trackersCount: Int, + val trackersAllowedCount: Int = 0, + val graduations: List? = null +) diff --git a/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/AppTrackersUseCase.kt b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/AppTrackersUseCase.kt new file mode 100644 index 0000000..56ab3f6 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/AppTrackersUseCase.kt @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2024 E FOUNDATION + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.domain.usecases + +import foundation.e.advancedprivacy.domain.entities.DisplayableApp +import foundation.e.advancedprivacy.trackers.data.StatsDatabase +import foundation.e.advancedprivacy.trackers.data.TrackersRepository +import foundation.e.advancedprivacy.trackers.data.WhitelistRepository +import foundation.e.advancedprivacy.trackers.domain.entities.Tracker +import foundation.e.advancedprivacy.trackers.domain.usecases.FilterHostnameUseCase + +class AppTrackersUseCase( + private val whitelistRepository: WhitelistRepository, + private val trackersStateUseCase: TrackersStateUseCase, + private val statsDatabase: StatsDatabase, + private val trackersRepository: TrackersRepository, + private val filterHostnameUseCase: FilterHostnameUseCase +) { + suspend fun toggleAppWhitelist(app: DisplayableApp, trackers: List, isBlocked: Boolean) { + val realApIds = app.apps.map { it.apId } + val trackerIds = trackers.map { it.id } + + whitelistRepository.setWhiteListed(realApIds, !isBlocked) + whitelistRepository.setWhitelistedTrackersForApps(realApIds, trackerIds, !isBlocked) + trackersStateUseCase.updateAllTrackersBlockedState() + } + + suspend fun clearWhitelist(app: DisplayableApp) { + app.apps.forEach { + whitelistRepository.clearWhiteList(it.apId) + } + trackersStateUseCase.updateAllTrackersBlockedState() + } + + suspend fun getCalls(app: DisplayableApp): Pair { + return app.apps.map { + statsDatabase.getCallsForApp(it.apId) + }.unzip().let { (blocked, leaked) -> + blocked.sum() to leaked.sum() + } + } + + suspend fun getTrackersWithBlockedList(app: DisplayableApp): List> { + val realApIds = app.apps.map { it.apId } + val trackers = statsDatabase.getTrackerIds(realApIds) + .mapNotNull { trackersRepository.getTracker(it) } + + return enrichWithBlockedState(app, trackers) + } + + suspend fun enrichWithBlockedState(app: DisplayableApp, trackers: List): List> { + val realAppUids = app.apps.map { it.uid } + return trackers.map { tracker -> + tracker to !realAppUids.any { uid -> + filterHostnameUseCase.isWhitelisted(uid, tracker.id) + } + }.sortedBy { it.first.label.lowercase() } + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/FakeLocationForAppUseCase.kt b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/FakeLocationForAppUseCase.kt new file mode 100644 index 0000000..fd6c78d --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/FakeLocationForAppUseCase.kt @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.domain.usecases + +import foundation.e.advancedprivacy.data.repositories.AppListRepository +import foundation.e.advancedprivacy.domain.repositories.LocalStateRepository +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.map + +class FakeLocationForAppUseCase( + private val appListRepository: AppListRepository, + localStateRepository: LocalStateRepository, + backgroundScope: CoroutineScope +) { + // Cache these values to allow true sync exectution on getFakeLocationOrNull, + // which is called by the ContentProvider + private var fakeLocation: Pair? = null + private var whitelistedApp: Set = emptySet() + + private val nullFakeLocationPkgs = listOf( + AppListRepository.PNAME_MICROG_SERVICES_CORE, + AppListRepository.PNAME_FUSED_LOCATION, + AppListRepository.PNAME_ANDROID_SYSTEM + ) + + init { + combine( + localStateRepository.fakeLocationEnabled, + localStateRepository.fakeLocation + ) { enabled, latLon -> + fakeLocation = if (enabled) latLon else null + }.launchIn(backgroundScope) + + localStateRepository.fakeLocationWhitelistedApps.map { whitelistedApp = it }.launchIn(backgroundScope) + } + + fun getFakeLocationOrNull(packageName: String?, uid: Int): Pair? { + if (packageName == null || fakeLocation == null || packageName in nullFakeLocationPkgs) { + return null + } + + val app = appListRepository.getApp(uid) + return if (app?.apId != null && app.apId in whitelistedApp) { + null + } else { + fakeLocation + } + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/FakeLocationStateUseCase.kt b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/FakeLocationStateUseCase.kt new file mode 100644 index 0000000..47c24e8 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/FakeLocationStateUseCase.kt @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2023 MURENA SAS + * Copyright (C) 2021 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.domain.usecases + +import foundation.e.advancedprivacy.data.repositories.AppListRepository +import foundation.e.advancedprivacy.domain.entities.DisplayableApp +import foundation.e.advancedprivacy.domain.entities.LocationMode +import foundation.e.advancedprivacy.domain.entities.ToggleableApp +import foundation.e.advancedprivacy.domain.repositories.LocalStateRepository +import foundation.e.advancedprivacy.dummy.CityDataSource +import kotlin.random.Random +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.launch + +class FakeLocationStateUseCase( + private val localStateRepository: LocalStateRepository, + private val citiesRepository: CityDataSource, + private val appListRepository: AppListRepository, + coroutineScope: CoroutineScope +) { + private val _configuredLocationMode = MutableStateFlow>( + Triple(LocationMode.REAL_LOCATION, null, null) + ) + val configuredLocationMode: StateFlow> = _configuredLocationMode + + init { + coroutineScope.launch { + localStateRepository.fakeLocationEnabled.collect { + applySettings(it, localStateRepository.getFakeLocation()) + } + } + } + + private fun applySettings(isEnabled: Boolean, fakeLocation: Pair, isSpecificLocation: Boolean = false) { + val locationMode = when { + !isEnabled -> LocationMode.REAL_LOCATION + isRandomLocation(fakeLocation, isSpecificLocation) -> LocationMode.RANDOM_LOCATION + else -> LocationMode.SPECIFIC_LOCATION + } + + _configuredLocationMode.value = Triple(locationMode, fakeLocation.first, fakeLocation.second) + } + + private fun isRandomLocation(fakeLocation: Pair, isSpecificLocation: Boolean): Boolean { + return fakeLocation in citiesRepository.citiesLocationsList && !isSpecificLocation + } + + suspend fun setSpecificLocation(latitude: Float, longitude: Float) { + setFakeLocation(latitude to longitude, true) + } + + suspend fun setRandomLocation() { + val randomIndex = Random.nextInt(citiesRepository.citiesLocationsList.size) + val location = citiesRepository.citiesLocationsList[randomIndex] + + setFakeLocation(location) + } + + private suspend fun setFakeLocation(location: Pair, isSpecificLocation: Boolean = false) { + localStateRepository.setFakeLocation(location) + localStateRepository.toggleFakeLocation(true) + applySettings(true, location, isSpecificLocation) + } + + suspend fun stopFakeLocation() { + localStateRepository.toggleFakeLocation(false) + applySettings(false, localStateRepository.getFakeLocation()) + } + + suspend fun toggleBlacklist(app: DisplayableApp) { + localStateRepository.toggleAppFakeLocationWhitelisted(app) + } + + suspend fun resetBlacklist() { + localStateRepository.resetFakeLocationWhitelistedApp() + } + + fun canResetBlacklist(): Flow = localStateRepository.fakeLocationWhitelistedApps.map { + it.isNotEmpty() + } + + fun appsWithBlacklist(): Flow> { + return combine( + appListRepository.displayableApps.map { apps -> + apps.filter { it.hasLocationPermission }.sortedBy { it.label.toString() } + }, + localStateRepository.fakeLocationWhitelistedApps + ) { apps, whitelist -> + apps.map { app -> + ToggleableApp(app = app, isOn = !app.apps.any { whitelist.contains(it.apId) }) + } + } + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/GetQuickPrivacyStateUseCase.kt b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/GetQuickPrivacyStateUseCase.kt new file mode 100644 index 0000000..0a293ef --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/GetQuickPrivacyStateUseCase.kt @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2023 MURENA SAS + * Copyright (C) 2021 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.domain.usecases + +import foundation.e.advancedprivacy.domain.entities.ApplicationDescription +import foundation.e.advancedprivacy.domain.entities.FeatureMode +import foundation.e.advancedprivacy.domain.entities.FeatureState +import foundation.e.advancedprivacy.domain.repositories.LocalStateRepository +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.combine + +class GetQuickPrivacyStateUseCase( + private val localStateRepository: LocalStateRepository +) { + val trackerMode: Flow = combine( + localStateRepository.blockTrackers, + localStateRepository.areAllTrackersBlocked + ) { isBlockTrackers, isAllTrackersBlocked -> + when { + isBlockTrackers && isAllTrackersBlocked -> FeatureMode.DENIED + isBlockTrackers && !isAllTrackersBlocked -> FeatureMode.CUSTOM + else -> FeatureMode.VULNERABLE + } + } + + val locationMode: Flow = combine( + localStateRepository.fakeLocationEnabled, + localStateRepository.fakeLocationWhitelistedApps + ) { enabled, whitelist -> + when { + !enabled -> FeatureMode.VULNERABLE + whitelist.isEmpty() -> FeatureMode.DENIED + else -> FeatureMode.CUSTOM + } + } + + val ipScramblingMode: Flow = + localStateRepository.internetPrivacyMode + + suspend fun toggleTrackers(enabled: Boolean?) { + localStateRepository.toggleBlockTrackers(enabled) + } + + suspend fun toggleLocation(enabled: Boolean?) { + localStateRepository.toggleFakeLocation(enabled) + } + + suspend fun toggleIpScrambling(enabled: Boolean?) { + localStateRepository.toggleIpScrambling(enabled) + } + + val otherVpnRunning: SharedFlow = localStateRepository.otherVpnRunning +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/IpScramblingStateUseCase.kt b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/IpScramblingStateUseCase.kt new file mode 100644 index 0000000..2586f9e --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/IpScramblingStateUseCase.kt @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2023 MURENA SAS + * Copyright (C) 2021 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.domain.usecases + +import foundation.e.advancedprivacy.data.repositories.AppListRepository +import foundation.e.advancedprivacy.domain.entities.DisplayableApp +import foundation.e.advancedprivacy.domain.entities.FeatureState +import foundation.e.advancedprivacy.domain.entities.ProfileType +import foundation.e.advancedprivacy.domain.entities.ToggleableApp +import foundation.e.advancedprivacy.domain.repositories.LocalStateRepository +import foundation.e.advancedprivacy.ipscrambler.OrbotSupervisor +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.update + +class IpScramblingStateUseCase( + private val orbotSupervisor: OrbotSupervisor, + private val localStateRepository: LocalStateRepository, + private val appListRepository: AppListRepository, + private val backgroundScope: CoroutineScope +) { + val internetPrivacyMode: StateFlow = orbotSupervisor.state + + private val whitelistedPackages = MutableStateFlow(orbotSupervisor.appList) + + init { + orbotSupervisor.requestStatus() + + orbotSupervisor.state.map { + localStateRepository.internetPrivacyMode.value = it + }.launchIn(backgroundScope) + + whitelistedPackages.map { + orbotSupervisor.appList = it + }.launchIn(backgroundScope) + } + + suspend fun toggle(hideIp: Boolean) { + localStateRepository.toggleIpScrambling(enabled = hideIp) + } + + suspend fun getTorToggleableApp(): Flow> { + return combine( + appListRepository.displayableApps.map { apps -> + apps.filter { app -> + app.hasInternetPermission && app.profileType == ProfileType.MAIN + } + }, + whitelistedPackages + ) { apps, pNames -> + apps.map { app -> + ToggleableApp(app = app, isOn = !app.isWhitelisted(pNames)) + } + } + } + + fun toggleBypassTor(app: DisplayableApp) { + whitelistedPackages.update { whitelist -> + val packageNames = app.apps.map { it.packageName }.toSet() + if (app.isWhitelisted()) { + whitelist.minus(packageNames) + } else { + whitelist.union(packageNames) + } + } + } + + val availablesLocations: List = orbotSupervisor.getAvailablesLocations().sorted() + + val exitCountry: String get() = orbotSupervisor.getExitCountryCode() + + suspend fun setExitCountry(locationId: String) { + if (locationId != exitCountry) { + orbotSupervisor.setExitCountryCode(locationId) + } + } + + private fun DisplayableApp.isWhitelisted(whitelistedPackageNames: Set = whitelistedPackages.value): Boolean = apps.any { + it.packageName in whitelistedPackageNames + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/ListenLocationUseCase.kt b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/ListenLocationUseCase.kt new file mode 100644 index 0000000..cd64be9 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/ListenLocationUseCase.kt @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.domain.usecases + +import android.content.Context +import android.content.pm.PackageManager +import android.location.Location +import android.location.LocationListener +import android.location.LocationManager +import foundation.e.advancedprivacy.domain.entities.ApplicationDescription +import foundation.e.advancedprivacy.externalinterfaces.permissions.IPermissionsPrivacyModule +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.update +import timber.log.Timber + +class ListenLocationUseCase( + private val permissionsModule: IPermissionsPrivacyModule, + private val appContext: Context, + private val appDesc: ApplicationDescription +) { + companion object { + const val MIN_TIME_INTERVAL = 1000L + const val MIN_DIST_INTERVAL = 0f + } + + private val locationManager: LocationManager + get() = appContext.getSystemService(LocationManager::class.java) as LocationManager + + private fun hasAcquireLocationPermission(): Boolean { + return isAccessFineLocationGranted() || + permissionsModule.toggleDangerousPermission(appDesc, android.Manifest.permission.ACCESS_FINE_LOCATION, true) + } + + private fun isAccessFineLocationGranted(): Boolean { + return appContext.checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED + } + + private val _currentLocation = MutableStateFlow(null) + val currentLocation: StateFlow = _currentLocation + + private var localListener = object : LocationListener { + + override fun onLocationChanged(location: Location) { + _currentLocation.update { location } + } + + override fun onProviderEnabled(provider: String) { + reset() + } + + override fun onProviderDisabled(provider: String) { + reset() + } + + private fun reset() { + stopListeningLocation() + _currentLocation.value = null + startListeningLocation() + } + } + + fun startListeningLocation(): Boolean { + return if (hasAcquireLocationPermission()) { + requestLocationUpdates() + true + } else { + false + } + } + + fun stopListeningLocation() { + locationManager.removeUpdates(localListener) + } + + private fun requestLocationUpdates() { + val networkProvider = LocationManager.NETWORK_PROVIDER + .takeIf { it in locationManager.allProviders } + val gpsProvider = LocationManager.GPS_PROVIDER + .takeIf { it in locationManager.allProviders } + + try { + networkProvider?.let { + locationManager.requestLocationUpdates( + it, + MIN_TIME_INTERVAL, + MIN_DIST_INTERVAL, + localListener + ) + } + gpsProvider?.let { + locationManager.requestLocationUpdates( + it, + MIN_TIME_INTERVAL, + MIN_DIST_INTERVAL, + localListener + ) + } + + var lastKnownLocation = networkProvider?.let { + locationManager.getLastKnownLocation(it) + } + + if (lastKnownLocation == null) { + lastKnownLocation = gpsProvider?.let { + locationManager.getLastKnownLocation(it) + } + } + + lastKnownLocation?.let { localListener.onLocationChanged(it) } + } catch (se: SecurityException) { + Timber.e(se, "Missing permission") + } + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/ShowFeaturesWarningUseCase.kt b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/ShowFeaturesWarningUseCase.kt new file mode 100644 index 0000000..8c37faf --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/ShowFeaturesWarningUseCase.kt @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2023 MURENA SAS + * Copyright (C) 2022 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.domain.usecases + +import foundation.e.advancedprivacy.domain.entities.MainFeatures +import foundation.e.advancedprivacy.domain.entities.MainFeatures.FakeLocation +import foundation.e.advancedprivacy.domain.entities.MainFeatures.IpScrambling +import foundation.e.advancedprivacy.domain.entities.MainFeatures.TrackersControl +import foundation.e.advancedprivacy.domain.repositories.LocalStateRepository +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.drop +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.merge + +class ShowFeaturesWarningUseCase( + private val localStateRepository: LocalStateRepository +) { + + fun showWarning(): Flow { + return merge( + localStateRepository.fakeLocationEnabled.drop(1).filter { it } + .filter { it && !localStateRepository.isHideWarningLocation() } + .map { FakeLocation }, + localStateRepository.startVpnDisclaimer.filter { + (it is IpScrambling && !localStateRepository.isHideWarningIpScrambling()) || + (it is TrackersControl && !localStateRepository.isHideWarningTrackers()) + } + ) + } + + suspend fun doNotShowAgain(feature: MainFeatures) { + when (feature) { + is TrackersControl -> localStateRepository.hideWarningTrackers(true) + is FakeLocation -> localStateRepository.hideWarningLocation(true) + is IpScrambling -> localStateRepository.hideWarningIpScrambling(true) + } + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackerDetailsUseCase.kt b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackerDetailsUseCase.kt new file mode 100644 index 0000000..e94ee3d --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackerDetailsUseCase.kt @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2024 E FOUNDATION + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.domain.usecases + +import foundation.e.advancedprivacy.data.repositories.AppListRepository +import foundation.e.advancedprivacy.domain.entities.DisplayableApp +import foundation.e.advancedprivacy.domain.entities.ToggleableApp +import foundation.e.advancedprivacy.trackers.data.StatsDatabase +import foundation.e.advancedprivacy.trackers.data.WhitelistRepository +import foundation.e.advancedprivacy.trackers.domain.entities.Tracker +import foundation.e.advancedprivacy.trackers.domain.usecases.FilterHostnameUseCase + +class TrackerDetailsUseCase( + private val whitelistRepository: WhitelistRepository, + private val trackersStateUseCase: TrackersStateUseCase, + private val appListRepository: AppListRepository, + private val statsDatabase: StatsDatabase, + private val filterHostnameUseCase: FilterHostnameUseCase +) { + suspend fun toggleTrackerWhitelist(tracker: Tracker, apps: List, isBlocked: Boolean) { + whitelistRepository.setWhiteListed(tracker, !isBlocked) + whitelistRepository.setWhitelistedAppsForTracker( + apps.flatMap { it.apps }.map { it.apId }, + tracker.id, + !isBlocked + ) + trackersStateUseCase.updateAllTrackersBlockedState() + } + + suspend fun getAppsWithBlockedState(tracker: Tracker): List { + return enrichWithBlockedState( + statsDatabase.getApIds(tracker.id).mapNotNull { + appListRepository.getInternetAppByApId(it) + }.distinct().sortedBy { it.label.toString() }, + tracker + ) + } + + suspend fun enrichWithBlockedState(apps: List, tracker: Tracker): List { + return apps.map { app -> + ToggleableApp( + app = app, + isOn = app.apps.any { !filterHostnameUseCase.isWhitelisted(it.uid, tracker.id) } + ) + } + } + + suspend fun getCalls(tracker: Tracker): Pair { + return statsDatabase.getCallsForTracker(tracker.id) + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackersAndAppsListsUseCase.kt b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackersAndAppsListsUseCase.kt new file mode 100644 index 0000000..bdfef3b --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackersAndAppsListsUseCase.kt @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2023-2024 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.domain.usecases + +import foundation.e.advancedprivacy.data.repositories.AppListRepository +import foundation.e.advancedprivacy.domain.entities.AppWithCount +import foundation.e.advancedprivacy.domain.entities.DisplayableApp +import foundation.e.advancedprivacy.domain.entities.TrackerWithCount +import foundation.e.advancedprivacy.domain.entities.TrackersAndAppsLists +import foundation.e.advancedprivacy.features.trackers.Period +import foundation.e.advancedprivacy.trackers.data.StatsDatabase +import foundation.e.advancedprivacy.trackers.data.TrackersRepository +import foundation.e.advancedprivacy.trackers.domain.entities.Tracker +import java.time.Instant +import kotlinx.coroutines.flow.first + +class TrackersAndAppsListsUseCase( + private val statsDatabase: StatsDatabase, + private val trackersRepository: TrackersRepository, + private val appListRepository: AppListRepository +) { + suspend fun getAppsAndTrackersCounts(period: Period): TrackersAndAppsLists { + val countByEntitiesMaps = getCountByEntityMaps(period) + + return TrackersAndAppsLists( + trackers = buildTrackerList(countByEntitiesMaps.countByTrackers), + allApps = buildAllAppList(countByEntitiesMaps.countByApps), + appsWithTrackers = buildAppList(countByEntitiesMaps.countByApps) + ) + } + + suspend fun buildWallOfShame(): TrackersAndAppsLists { + val trackers = statsDatabase + .get5MostCalledTrackers(since = Period.MONTH.getPeriodStart().epochSecond) + .mapNotNull { (trackerId, calls) -> + trackersRepository.getTracker(trackerId)?.let { + TrackerWithCount(it, calls) + } + } + + return TrackersAndAppsLists( + trackers = trackers, + appsWithTrackers = get5MostTrackedAppsLastMonth(), + allApps = emptyList() + ) + } + + private suspend fun get5MostTrackedAppsLastMonth(): List { + val countByApIds = statsDatabase.getCallsByAppIds(since = Period.MONTH.getPeriodStart().epochSecond) + + val countByApps = mutableMapOf() + countByApIds.forEach { (apId, count) -> + appListRepository.getInternetAppByApId(apId)?.let { app -> + countByApps[app] = count + (countByApps[app] ?: 0) + } + } + return countByApps.toList().sortedByDescending { it.second }.take(5).map { (app, count) -> + AppWithCount(app, count) + } + } + + private suspend fun getCountByEntityMaps(period: Period): CountByEntitiesMaps { + val periodStart: Instant = period.getPeriodStart() + val trackersAndAppsIds = statsDatabase.getDistinctTrackerAndApp(periodStart) + val trackersAndApps = mapIdsToEntities(trackersAndAppsIds) + return foldToCountByEntityMaps(trackersAndApps) + } + + private fun buildTrackerList(countByTracker: Map): List { + return countByTracker.map { (tracker, count) -> + TrackerWithCount(tracker = tracker, count = count) + }.sortedByDescending { it.count } + } + + private suspend fun buildAllAppList(countByApp: Map): List { + return appListRepository.displayableApps.first() + .filter { it.hasInternetPermission } + .map { app: DisplayableApp -> + AppWithCount(app = app, count = countByApp[app] ?: 0) + }.sortedByDescending { it.count } + } + + private fun buildAppList(countByApp: Map): List { + return countByApp.map { (app, count) -> + AppWithCount(app = app, count = count) + }.sortedByDescending { it.count } + } + + private suspend fun mapIdsToEntities(trackersAndAppsIds: List>): List> { + return trackersAndAppsIds.mapNotNull { (trackerId, apId) -> + trackersRepository.getTracker(trackerId)?.let { tracker -> + appListRepository.getInternetAppByApId(apId)?.let { app -> + tracker to app + } + } + // appListsRepository.getDisplayableApp() may transform many apId to one + // ApplicationDescription, so the lists is not distinct anymore. + }.distinct() + } + + private fun foldToCountByEntityMaps(trackersAndApps: List>): CountByEntitiesMaps { + return trackersAndApps.fold( + mutableMapOf() to mutableMapOf() + ) { (countByApp, countByTracker), (tracker, app) -> + countByApp[app] = countByApp.getOrDefault(app, 0) + 1 + countByTracker[tracker] = countByTracker.getOrDefault(tracker, 0) + 1 + countByApp to countByTracker + }.let { (countByApp, countByTracker) -> + CountByEntitiesMaps( + countByApps = countByApp, + countByTrackers = countByTracker + ) + } + } + + private data class CountByEntitiesMaps( + val countByApps: Map, + val countByTrackers: Map + ) +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackersScreenUseCase.kt b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackersScreenUseCase.kt new file mode 100644 index 0000000..f0a2fef --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackersScreenUseCase.kt @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2023 - 2024 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.domain.usecases + +import foundation.e.advancedprivacy.domain.repositories.LocalStateRepository +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +class TrackersScreenUseCase( + private val localStateRepository: LocalStateRepository, + private val backgroundDispatcher: CoroutineDispatcher = Dispatchers.IO +) { + + suspend fun getLastPosition(): Int = withContext(backgroundDispatcher) { + localStateRepository.getTrackersScreenLastPosition() + } + + suspend fun savePosition(currentPosition: Int) = withContext(backgroundDispatcher) { + localStateRepository.setTrackersScreenLastPosition(currentPosition) + } + + fun getTrackerTabStartPosition(): Int { + return localStateRepository.trackersScreenTabStartPosition + } + + fun resetTrackerTabStartPosition() { + localStateRepository.trackersScreenTabStartPosition = -1 + } + + suspend fun preselectTab(periodPosition: Int, tabPosition: Int) = withContext(backgroundDispatcher) { + localStateRepository.setTrackersScreenLastPosition(periodPosition) + localStateRepository.trackersScreenTabStartPosition = tabPosition + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackersStateUseCase.kt b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackersStateUseCase.kt new file mode 100644 index 0000000..c2dddfc --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackersStateUseCase.kt @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2022 - 2023 MURENA SAS + * Copyright (C) 2021 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.domain.usecases + +import foundation.e.advancedprivacy.domain.entities.DisplayableApp +import foundation.e.advancedprivacy.domain.repositories.LocalStateRepository +import foundation.e.advancedprivacy.trackers.data.WhitelistRepository +import foundation.e.advancedprivacy.trackers.domain.entities.Tracker +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +class TrackersStateUseCase( + private val whitelistRepository: WhitelistRepository, + private val localStateRepository: LocalStateRepository, + coroutineScope: CoroutineScope +) { + init { + coroutineScope.launch { + localStateRepository.blockTrackers.collect { enabled -> + whitelistRepository.isBlockingEnabled = enabled + updateAllTrackersBlockedState() + } + } + } + + fun updateAllTrackersBlockedState() { + localStateRepository.areAllTrackersBlocked.value = whitelistRepository.isBlockingEnabled && + whitelistRepository.areWhiteListEmpty() + } + + fun isWhitelisted(app: DisplayableApp): Boolean { + return isWhitelisted(app, whitelistRepository) + } + + fun isWhitelisted(tracker: Tracker): Boolean { + return whitelistRepository.isWhiteListed(tracker) + } + + suspend fun blockTracker(app: DisplayableApp, tracker: Tracker, isBlocked: Boolean) { + whitelistRepository.setWhitelistedAppsForTracker( + app.apps.map { it.apId }, + tracker.id, + !isBlocked + ) + updateAllTrackersBlockedState() + } +} + +fun isWhitelisted(app: DisplayableApp, whitelistRepository: WhitelistRepository): Boolean { + return app.apps.any(whitelistRepository::isAppWhiteListed) +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackersStatisticsUseCase.kt b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackersStatisticsUseCase.kt new file mode 100644 index 0000000..35b1eae --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackersStatisticsUseCase.kt @@ -0,0 +1,184 @@ +/* + * Copyright (C) 2022 - 2024 MURENA SAS + * Copyright (C) 2021 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.domain.usecases + +import foundation.e.advancedprivacy.R +import foundation.e.advancedprivacy.common.throttleFirst +import foundation.e.advancedprivacy.data.repositories.AppListRepository +import foundation.e.advancedprivacy.data.repositories.ResourcesRepository +import foundation.e.advancedprivacy.domain.entities.ApplicationDescription +import foundation.e.advancedprivacy.domain.entities.DisplayableApp +import foundation.e.advancedprivacy.domain.entities.TrackersPeriodicStatistics +import foundation.e.advancedprivacy.features.trackers.Period +import foundation.e.advancedprivacy.trackers.data.StatsDatabase +import foundation.e.advancedprivacy.trackers.data.TrackersRepository +import foundation.e.advancedprivacy.trackers.data.WhitelistRepository +import foundation.e.advancedprivacy.trackers.domain.entities.Tracker +import java.time.ZonedDateTime +import java.time.temporal.ChronoUnit +import kotlin.time.Duration +import kotlin.time.Duration.Companion.seconds +import kotlinx.coroutines.FlowPreview +import kotlinx.coroutines.flow.onStart + +class TrackersStatisticsUseCase( + private val whitelistRepository: WhitelistRepository, + private val trackersRepository: TrackersRepository, + private val appListRepository: AppListRepository, + private val statsDatabase: StatsDatabase, + private val resourcesRepository: ResourcesRepository +) { + fun initAppList() { + appListRepository.refreshAppDescriptions() + } + + @OptIn(FlowPreview::class) + fun listenUpdates(debounce: Duration = 1.seconds) = statsDatabase.newDataAvailable + .throttleFirst(windowDuration = debounce) + .onStart { emit(Unit) } + + private fun buildGraduations(period: Period): List { + return when (period) { + Period.DAY -> buildDayGraduations() + Period.MONTH -> buildMonthGraduations() + Period.YEAR -> buildYearGraduations() + } + } + + private fun buildDayGraduations(): List { + val formatter = resourcesRepository.getFormatter(R.string.trackers_graph_hours_period_format) + + val periods = mutableListOf() + var end = ZonedDateTime.now() + for (i in 1..24) { + val start = end.truncatedTo(ChronoUnit.HOURS) + periods.add(if (start.hour % 6 == 0) formatter.format(start) else null) + end = start.minus(1, ChronoUnit.MINUTES) + } + return periods.reversed() + } + + private fun buildMonthGraduations(): List { + val formatter = resourcesRepository.getFormatter( + R.string.trackers_graph_month_graduations_format + ) + + val periods = mutableListOf() + var end = ZonedDateTime.now() + for (i in 1..30) { + val start = end.truncatedTo(ChronoUnit.DAYS) + periods.add(if ((start.dayOfMonth) % 6 == 0) formatter.format(start) else null) + end = start.minus(1, ChronoUnit.HOURS) + } + + return periods.reversed() + } + + private fun buildYearGraduations(): List { + val formatter = resourcesRepository.getFormatter(R.string.trackers_graph_year_graduations_format) + + val periods = mutableListOf() + var end = ZonedDateTime.now() + for (i in 1..12) { + val start = end.truncatedTo(ChronoUnit.DAYS).let { + it.minusDays(it.dayOfMonth.toLong()) + } + periods.add(if (start.monthValue % 3 == 0) formatter.format(start) else null) + end = start.minus(1, ChronoUnit.DAYS) + } + + return periods.reversed() + } + + private fun buildLabels(period: Period): List { + return when (period) { + Period.DAY -> buildDayLabels() + Period.MONTH -> buildMonthLabels() + Period.YEAR -> buildYearLabels() + } + } + + private fun buildDayLabels(): List { + val formatter = resourcesRepository.getFormatter(R.string.trackers_graph_hours_period_format) + + val periods = mutableListOf() + var end = ZonedDateTime.now() + for (i in 1..24) { + val start = end.truncatedTo(ChronoUnit.HOURS) + periods.add("${formatter.format(start)} - ${formatter.format(end)}") + end = start.minus(1, ChronoUnit.MINUTES) + } + return periods.reversed() + } + + private fun buildMonthLabels(): List { + val formater = resourcesRepository.getFormatter(R.string.trackers_graph_days_period_format) + + val periods = mutableListOf() + var day = ZonedDateTime.now().truncatedTo(ChronoUnit.DAYS) + for (i in 1..30) { + periods.add(formater.format(day)) + day = day.minus(1, ChronoUnit.DAYS) + } + return periods.reversed() + } + + private fun buildYearLabels(): List { + val formater = resourcesRepository.getFormatter(R.string.trackers_graph_months_period_format) + + val periods = mutableListOf() + var month = ZonedDateTime.now().truncatedTo(ChronoUnit.DAYS).withDayOfMonth(1) + for (i in 1..12) { + periods.add(formater.format(month)) + month = month.minus(1, ChronoUnit.MONTHS) + } + return periods.reversed() + } + + suspend fun getGraphData(period: Period): TrackersPeriodicStatistics { + return TrackersPeriodicStatistics( + callsBlockedNLeaked = statsDatabase.getTrackersCallsOnPeriod( + period.periodsCount, + period.periodUnit + ), + periods = buildLabels(period), + trackersCount = statsDatabase.getTrackersCount(period.periodsCount, period.periodUnit), + trackersAllowedCount = statsDatabase.getLeakedTrackersCount(period.periodsCount, period.periodUnit), + graduations = buildGraduations(period) + ) + } + + suspend fun isWhiteListEmpty(app: DisplayableApp): Boolean { + return app.apps.all { getWhiteList(it).isEmpty() } + } + + suspend fun getLastMonthBlockedLeaksCount(): Int { + return statsDatabase.getBlockedLeaksCount(Period.MONTH.periodsCount, Period.MONTH.periodUnit) + } + + suspend fun getLastMonthAppsWithBlockedLeaksCount(): Int { + return statsDatabase.getAppsWithBlockedLeaksCount(Period.MONTH.periodsCount, Period.MONTH.periodUnit) + } + + private fun getWhiteList(app: ApplicationDescription): List { + return whitelistRepository.getWhiteListForApp(app).mapNotNull { + trackersRepository.getTracker(it) + } + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/externalinterfaces/contentproviders/FakeLocationContentProvider.kt b/app/src/main/java/foundation/e/advancedprivacy/externalinterfaces/contentproviders/FakeLocationContentProvider.kt new file mode 100644 index 0000000..09b2c78 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/externalinterfaces/contentproviders/FakeLocationContentProvider.kt @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.externalinterfaces.contentproviders + +import android.content.ContentProvider +import android.content.ContentValues +import android.database.Cursor +import android.net.Uri +import android.os.Bundle +import foundation.e.advancedprivacy.domain.usecases.FakeLocationForAppUseCase +import org.koin.android.ext.android.inject + +class FakeLocationContentProvider : ContentProvider() { + private val PARAM_UID = "uid" + private val PARAM_LATITUDE = "latitude" + private val PARAM_LONGITUDE = "longitude" + + private val fakeLocationForAppUseCase: FakeLocationForAppUseCase by inject() + + override fun call(method: String, arg: String?, extras: Bundle?): Bundle? { + val appUid = extras?.getInt(PARAM_UID, -1) ?: -1 + + return fakeLocationForAppUseCase.getFakeLocationOrNull(arg, appUid)?.let { (lat, lon) -> + Bundle().apply { + putDouble(PARAM_LATITUDE, lat.toDouble()) + putDouble(PARAM_LONGITUDE, lon.toDouble()) + } + } + } + + override fun onCreate(): Boolean { + return true + } + + override fun query( + uri: Uri, + projection: Array?, + selection: String?, + selectionArgs: Array?, + sortOrder: String? + ): Cursor? { + // Use call instead + return null + } + + override fun getType(uri: Uri): String? { + return "text/plain" + } + + override fun insert(p0: Uri, p1: ContentValues?): Uri? { + // ReadOnly content provider + return null + } + + override fun delete(p0: Uri, p1: String?, p2: Array?): Int { + // ReadOnly content provider + return 0 + } + + override fun update(p0: Uri, p1: ContentValues?, p2: String?, p3: Array?): Int { + // ReadOnly content provider + return 0 + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/dashboard/DashboardFragment.kt b/app/src/main/java/foundation/e/advancedprivacy/features/dashboard/DashboardFragment.kt new file mode 100644 index 0000000..099d8fb --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/dashboard/DashboardFragment.kt @@ -0,0 +1,252 @@ +/* + * Copyright (C) 2023-2024 MURENA SAS + * Copyright (C) 2021 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.features.dashboard + +import android.os.Bundle +import android.view.View +import android.widget.Toast +import androidx.core.content.ContextCompat +import androidx.core.content.ContextCompat.getColor +import androidx.core.view.isVisible +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import androidx.navigation.fragment.findNavController +import com.google.android.material.tabs.TabLayoutMediator +import foundation.e.advancedprivacy.R +import foundation.e.advancedprivacy.common.BigNumberFormatter +import foundation.e.advancedprivacy.common.NavToolbarFragment +import foundation.e.advancedprivacy.databinding.FragmentDashboardBinding +import foundation.e.advancedprivacy.domain.entities.FeatureMode +import foundation.e.advancedprivacy.domain.entities.FeatureState +import foundation.e.advancedprivacy.features.dashboard.DashboardViewModel.SingleEvent +import foundation.e.advancedprivacy.features.trackers.TrackerTab +import kotlinx.coroutines.launch +import org.koin.androidx.viewmodel.ext.android.viewModel + +class DashboardFragment : NavToolbarFragment(R.layout.fragment_dashboard) { + private val viewModel: DashboardViewModel by viewModel() + private val numberFormatter: BigNumberFormatter by lazy { BigNumberFormatter(requireContext()) } + + private lateinit var binding: FragmentDashboardBinding + + private lateinit var tabAdapter: ShameListsTabPagerAdapter + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentDashboardBinding.bind(view) + + with(binding.dataBlockedTrackers) { + primaryMessage.apply { + setText(R.string.dashboard_data_blocked_trackers_primary) + setCompoundDrawables( + ContextCompat.getDrawable(requireContext(), R.drawable.ic_block_24), + null, + null, + null + ) + } + + secondaryMessage.setText(R.string.dashboard_data_blocked_trackers_secondary) + } + with(binding.dataApps) { + primaryMessage.apply { + setText(R.string.dashboard_data_apps_primary) + setCompoundDrawables( + ContextCompat.getDrawable(requireContext(), R.drawable.ic_apps_24), + null, + null, + null + ) + } + + secondaryMessage.setText(R.string.dashboard_data_apps_secondary) + } + + binding.trackersControl.title.setText(R.string.dashboard_trackers_title) + binding.fakeLocation.title.setText(R.string.dashboard_location_title) + binding.ipScrambling.title.setText(R.string.dashboard_ipscrambling_title) + + tabAdapter = ShameListsTabPagerAdapter( + onClickShameApp = viewModel::onClickShameApp, + onClickShameTracker = viewModel::onClickShameTracker, + onClickViewAllApps = viewModel::onClickViewAllApps, + onClickViewAllTrackers = viewModel::onClickViewAllTrackers + ) + + binding.listsPager.adapter = tabAdapter + + TabLayoutMediator(binding.listsTabs, binding.listsPager) { tab, position -> + tab.text = getString( + when (position) { + TrackerTab.APPS.position -> R.string.trackers_toggle_list_apps + else -> R.string.trackers_toggle_list_trackers + } + ) + }.attach() + + setOnClickListeners() + + listenViewModel() + } + + private fun setOnClickListeners() { + binding.viewTrackersStatistics.setOnClickListener { + viewModel.onClickViewTrackersStatistics() + } + + with(binding.trackersControl) { + root.setOnClickListener { + viewModel.onClickTrackersControl() + } + + switchFeature.setOnCheckedChangeListener { _, isChecked -> + viewModel.onClickToggleTrackersContol(isChecked) + } + } + + with(binding.fakeLocation) { + root.setOnClickListener { + viewModel.onClickFakeLocation() + } + + switchFeature.setOnCheckedChangeListener { _, isChecked -> + viewModel.onClickToggleFakeLocation(isChecked) + } + } + + with(binding.ipScrambling) { + root.setOnClickListener { + viewModel.onClickIpScrambling() + } + + switchFeature.setOnCheckedChangeListener { _, isChecked -> + viewModel.onClickToggleIpScrambling(isChecked) + } + } + + binding.appsPermissions.setOnClickListener { + viewModel.onClickAppsPermissions() + } + } + + private fun listenViewModel() { + viewLifecycleOwner.lifecycleScope.launch { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) { + render(viewModel.state.value) + viewModel.state.collect(::render) + } + } + + viewLifecycleOwner.lifecycleScope.launch { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.singleEvents.collect { event -> + when (event) { + is SingleEvent.ToastMessageSingleEvent -> + Toast.makeText( + requireContext(), + getString(event.message, *event.args.toTypedArray()), + Toast.LENGTH_LONG + ).show() + } + } + } + } + + viewLifecycleOwner.lifecycleScope.launch { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.navigate.collect(findNavController()::navigate) + } + } + + viewLifecycleOwner.lifecycleScope.launch { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.doOnStartedState() + } + } + } + + override fun onNavigateUp(): Boolean { + requireActivity().finish() + return true + } + + private fun render(state: DashboardState) { + binding.dataBlockedTrackers.number.text = numberFormatter.format(state.blockedCallsCount) + binding.dataApps.number.text = state.appsWithCallsCount.toString() + + with(binding.trackersControl) { + switchFeature.isChecked = state.trackerMode != FeatureMode.VULNERABLE + + stateLabel.setText( + when (state.trackerMode) { + FeatureMode.DENIED -> R.string.dashboard_state_trackers_on + FeatureMode.VULNERABLE -> R.string.dashboard_state_trackers_off + FeatureMode.CUSTOM -> R.string.dashboard_state_trackers_custom + } + ) + + stateLabel.setTextColor(getStateColor(state.trackerMode != FeatureMode.VULNERABLE)) + } + + with(binding.fakeLocation) { + switchFeature.isChecked = state.locationMode != FeatureMode.VULNERABLE + stateLabel.setText( + when (state.locationMode) { + FeatureMode.DENIED -> R.string.dashboard_state_geolocation_on + FeatureMode.VULNERABLE -> R.string.dashboard_state_geolocation_off + FeatureMode.CUSTOM -> R.string.dashboard_state_trackers_custom + } + ) + stateLabel.setTextColor(getStateColor(state.locationMode != FeatureMode.VULNERABLE)) + } + + with(binding.ipScrambling) { + switchFeature.isChecked = state.ipScramblingMode.isChecked + + val isLoading = state.ipScramblingMode.isLoading + switchFeature.isEnabled = (state.ipScramblingMode != FeatureState.STOPPING) + + stateLoader.isVisible = isLoading + stateLabel.visibility = if (!isLoading) View.VISIBLE else View.INVISIBLE + + stateLabel.setText( + if (state.ipScramblingMode == FeatureState.ON) { + R.string.dashboard_state_ipaddress_on + } else { + R.string.dashboard_state_ipaddress_off + } + ) + stateLabel.setTextColor(getStateColor(state.ipScramblingMode == FeatureState.ON)) + } + + tabAdapter.updateDataSet(state) + } + + private fun getStateColor(isActive: Boolean): Int { + return getColor( + requireContext(), + if (isActive) { + R.color.green_valid + } else { + R.color.red_off + } + ) + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/dashboard/DashboardState.kt b/app/src/main/java/foundation/e/advancedprivacy/features/dashboard/DashboardState.kt new file mode 100644 index 0000000..4afdc84 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/dashboard/DashboardState.kt @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2024 MURENA SAS + * Copyright (C) 2022 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.features.dashboard + +import foundation.e.advancedprivacy.domain.entities.AppWithCount +import foundation.e.advancedprivacy.domain.entities.FeatureMode +import foundation.e.advancedprivacy.domain.entities.FeatureState +import foundation.e.advancedprivacy.domain.entities.TrackerWithCount + +data class DashboardState( + val trackerMode: FeatureMode = FeatureMode.VULNERABLE, + val locationMode: FeatureMode = FeatureMode.VULNERABLE, + val ipScramblingMode: FeatureState = FeatureState.STOPPING, + val blockedCallsCount: Int = 0, + val appsWithCallsCount: Int = 0, + val shameApps: List = emptyList(), + val shameTrackers: List = emptyList() +) diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/dashboard/DashboardViewModel.kt b/app/src/main/java/foundation/e/advancedprivacy/features/dashboard/DashboardViewModel.kt new file mode 100644 index 0000000..72c616d --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/dashboard/DashboardViewModel.kt @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2023 - 2024 MURENA SAS + * Copyright (C) 2021 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.features.dashboard + +import androidx.annotation.StringRes +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import androidx.navigation.NavDirections +import foundation.e.advancedprivacy.R +import foundation.e.advancedprivacy.domain.entities.DisplayableApp +import foundation.e.advancedprivacy.domain.usecases.GetQuickPrivacyStateUseCase +import foundation.e.advancedprivacy.domain.usecases.TrackersAndAppsListsUseCase +import foundation.e.advancedprivacy.domain.usecases.TrackersScreenUseCase +import foundation.e.advancedprivacy.domain.usecases.TrackersStatisticsUseCase +import foundation.e.advancedprivacy.features.trackers.Period +import foundation.e.advancedprivacy.features.trackers.TrackerTab +import foundation.e.advancedprivacy.trackers.domain.entities.Tracker +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.mapLatest +import kotlinx.coroutines.flow.merge +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +class DashboardViewModel( + private val getPrivacyStateUseCase: GetQuickPrivacyStateUseCase, + private val trackersStatisticsUseCase: TrackersStatisticsUseCase, + private val trackersAndAppsListsUseCase: TrackersAndAppsListsUseCase, + private val trackersScreenUseCase: TrackersScreenUseCase +) : ViewModel() { + + private val _state = MutableStateFlow(DashboardState()) + val state = _state.asStateFlow() + + private val _singleEvents = MutableSharedFlow() + val singleEvents = _singleEvents.asSharedFlow() + + private val _navigate = MutableSharedFlow() + val navigate = _navigate.asSharedFlow() + init { + viewModelScope.launch(Dispatchers.IO) { trackersStatisticsUseCase.initAppList() } + } + + suspend fun doOnStartedState() = withContext(Dispatchers.IO) { + merge( + getPrivacyStateUseCase.ipScramblingMode.map { + _state.update { s -> s.copy(ipScramblingMode = it) } + }, + + trackersStatisticsUseCase.listenUpdates().mapLatest { + fetchStatistics() + }, + + getPrivacyStateUseCase.trackerMode.map { + _state.update { s -> s.copy(trackerMode = it) } + }, + getPrivacyStateUseCase.locationMode.map { + _state.update { s -> s.copy(locationMode = it) } + }, + getPrivacyStateUseCase.otherVpnRunning.map { + _singleEvents.emit( + SingleEvent.ToastMessageSingleEvent( + R.string.ipscrambling_error_always_on_vpn_already_running, + listOf(it.label ?: "") + ) + ) + } + ).collect {} + } + + fun onClickViewTrackersStatistics() = viewModelScope.launch { + _navigate.emit(DashboardFragmentDirections.gotoTrackersFragment()) + } + + fun onClickTrackersControl() = viewModelScope.launch { + _navigate.emit(DashboardFragmentDirections.gotoTrackersFragment()) + } + + fun onClickToggleTrackersContol(enabled: Boolean) = viewModelScope.launch(Dispatchers.IO) { + getPrivacyStateUseCase.toggleTrackers(enabled) + } + + fun onClickFakeLocation() = viewModelScope.launch { + _navigate.emit(DashboardFragmentDirections.gotoFakeLocationFragment()) + } + + fun onClickToggleFakeLocation(enabled: Boolean) = viewModelScope.launch(Dispatchers.IO) { + getPrivacyStateUseCase.toggleLocation(enabled) + } + + fun onClickIpScrambling() = viewModelScope.launch { + _navigate.emit(DashboardFragmentDirections.gotoInternetPrivacyFragment()) + } + + fun onClickToggleIpScrambling(enabled: Boolean) = viewModelScope.launch(Dispatchers.IO) { + getPrivacyStateUseCase.toggleIpScrambling(enabled) + } + + fun onClickAppsPermissions() = viewModelScope.launch { + _navigate.emit(DashboardFragmentDirections.gotoSettingsPermissionsActivity()) + } + + fun onClickShameApp(app: DisplayableApp) = viewModelScope.launch { + _navigate.emit(DashboardFragmentDirections.gotoAppTrackersFragment(appId = app.id)) + } + + fun onClickShameTracker(tracker: Tracker) = viewModelScope.launch { + _navigate.emit(DashboardFragmentDirections.gotoTrackerDetailsFragment(trackerId = tracker.id)) + } + + fun onClickViewAllApps() = viewModelScope.launch { + trackersScreenUseCase.preselectTab(Period.MONTH.ordinal, TrackerTab.APPS.ordinal) + _navigate.emit(DashboardFragmentDirections.gotoTrackersFragment()) + } + + fun onClickViewAllTrackers() = viewModelScope.launch { + trackersScreenUseCase.preselectTab(Period.MONTH.ordinal, TrackerTab.TRACKERS.ordinal) + _navigate.emit(DashboardFragmentDirections.gotoTrackersFragment()) + } + private suspend fun fetchStatistics() = withContext(Dispatchers.IO) { + val blockedCallsCount = trackersStatisticsUseCase.getLastMonthBlockedLeaksCount() + + val appsWithBlockedLeaksCount = trackersStatisticsUseCase.getLastMonthAppsWithBlockedLeaksCount() + + val lists = trackersAndAppsListsUseCase.buildWallOfShame() + _state.update { + it.copy( + blockedCallsCount = blockedCallsCount, + appsWithCallsCount = appsWithBlockedLeaksCount, + shameApps = lists.appsWithTrackers, + shameTrackers = lists.trackers + ) + } + } + + sealed class SingleEvent { + data class ToastMessageSingleEvent( + @StringRes val message: Int, + val args: List = emptyList() + ) : SingleEvent() + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/dashboard/ShameListsTabPagerAdapter.kt b/app/src/main/java/foundation/e/advancedprivacy/features/dashboard/ShameListsTabPagerAdapter.kt new file mode 100644 index 0000000..e1fc7e4 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/dashboard/ShameListsTabPagerAdapter.kt @@ -0,0 +1,185 @@ +/* + * Copyright (C) 2023 - 2024 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.features.dashboard + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.core.view.isVisible +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.divider.MaterialDividerItemDecoration +import foundation.e.advancedprivacy.R +import foundation.e.advancedprivacy.common.BigNumberFormatter +import foundation.e.advancedprivacy.common.BindingListAdapter +import foundation.e.advancedprivacy.common.BindingViewHolder +import foundation.e.advancedprivacy.common.extensions.dpToPx +import foundation.e.advancedprivacy.databinding.DashboardShameListBinding +import foundation.e.advancedprivacy.databinding.TrackersItemAppBinding +import foundation.e.advancedprivacy.domain.entities.AppWithCount +import foundation.e.advancedprivacy.domain.entities.DisplayableApp +import foundation.e.advancedprivacy.domain.entities.TrackerWithCount +import foundation.e.advancedprivacy.features.trackers.TrackerTab +import foundation.e.advancedprivacy.trackers.domain.entities.Tracker + +class ShameListsTabPagerAdapter( + private val onClickShameApp: (DisplayableApp) -> Unit, + private val onClickShameTracker: (Tracker) -> Unit, + private val onClickViewAllApps: () -> Unit, + private val onClickViewAllTrackers: () -> Unit +) : RecyclerView.Adapter() { + private var uiState: DashboardState = DashboardState() + + fun updateDataSet(state: DashboardState) { + uiState = state + notifyDataSetChanged() + } + + override fun getItemViewType(position: Int): Int = position + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListsTabViewHolder { + val view = DashboardShameListBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return when (viewType) { + TrackerTab.APPS.position -> { + ListsTabViewHolder.AppsListViewHolder(view, onClickShameApp, onClickViewAllApps) + } + else -> { + ListsTabViewHolder.TrackersListViewHolder(view, onClickShameTracker, onClickViewAllTrackers) + } + } + } + + override fun getItemCount(): Int { + return 2 + } + + override fun onBindViewHolder(holder: ListsTabViewHolder, position: Int) { + when (position) { + TrackerTab.APPS.position -> { + (holder as ListsTabViewHolder.AppsListViewHolder).onBind(uiState) + } + TrackerTab.TRACKERS.position -> { + (holder as ListsTabViewHolder.TrackersListViewHolder).onBind(uiState) + } + } + } + + sealed class ListsTabViewHolder(view: View) : RecyclerView.ViewHolder(view) { + protected val numberFormatter: BigNumberFormatter by lazy { BigNumberFormatter(itemView.context) } + + protected fun setupRecyclerView(recyclerView: RecyclerView) { + recyclerView.apply { + layoutManager = LinearLayoutManager(context) + setHasFixedSize(true) + isNestedScrollingEnabled = false + addItemDecoration( + MaterialDividerItemDecoration(context, LinearLayoutManager.VERTICAL).apply { + dividerColor = ContextCompat.getColor(context, R.color.divider) + dividerInsetStart = 16.dpToPx(context) + dividerInsetEnd = 16.dpToPx(context) + } + ) + } + } + + class AppsListViewHolder( + private val binding: DashboardShameListBinding, + private val onClickShameApp: (DisplayableApp) -> Unit, + private val onClickViewAllApps: () -> Unit + ) : ListsTabViewHolder(binding.root) { + + private val adapter = object : BindingListAdapter() { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingViewHolder { + return BindingViewHolder( + TrackersItemAppBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } + + override fun onBindViewHolder(holder: BindingViewHolder, position: Int) { + val item = dataSet[position] + holder.binding.icon.setImageDrawable(item.app.icon) + holder.binding.title.text = item.app.label + holder.binding.counts.text = itemView.context.getString( + R.string.dashboard_wall_of_shame_app_calls, + numberFormatter.format(item.count) + ) + holder.binding.root.setOnClickListener { onClickShameApp(item.app) } + } + } + init { + setupRecyclerView(binding.list) + binding.list.adapter = adapter + binding.viewAll.apply { + text = binding.root.context.getString(R.string.dashboard_view_all_apps) + setOnClickListener { onClickViewAllApps() } + } + } + + fun onBind(uiState: DashboardState) { + adapter.dataSet = uiState.shameApps + } + } + + class TrackersListViewHolder( + private val binding: DashboardShameListBinding, + private val onClickShameTracker: (Tracker) -> Unit, + private val onClickViewAllTrackers: () -> Unit + ) : ListsTabViewHolder(binding.root) { + + private val adapter = object : BindingListAdapter() { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingViewHolder { + return BindingViewHolder( + TrackersItemAppBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } + + override fun onBindViewHolder(holder: BindingViewHolder, position: Int) { + val item = dataSet[position] + holder.binding.icon.isVisible = false + holder.binding.title.text = item.tracker.label + holder.binding.counts.text = itemView.context.getString( + R.string.dashboard_wall_of_shame_trackers_calls, + numberFormatter.format(item.count) + ) + holder.binding.root.setOnClickListener { onClickShameTracker(item.tracker) } + } + } + + init { + setupRecyclerView(binding.list) + binding.list.adapter = adapter + binding.viewAll.apply { + text = binding.root.context.getString(R.string.dashboard_view_all_trackers) + setOnClickListener { onClickViewAllTrackers() } + } + } + + fun onBind(uiState: DashboardState) { + adapter.dataSet = uiState.shameTrackers + } + } + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/internetprivacy/InternetPrivacyFragment.kt b/app/src/main/java/foundation/e/advancedprivacy/features/internetprivacy/InternetPrivacyFragment.kt new file mode 100644 index 0000000..f9f5700 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/internetprivacy/InternetPrivacyFragment.kt @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2023 MURENA SAS + * Copyright (C) 2021 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.features.internetprivacy + +import android.os.Bundle +import android.view.View +import android.widget.AdapterView +import android.widget.ArrayAdapter +import android.widget.Toast +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import androidx.recyclerview.widget.LinearLayoutManager +import foundation.e.advancedprivacy.R +import foundation.e.advancedprivacy.common.NavToolbarFragment +import foundation.e.advancedprivacy.common.setToolTipForAsterisk +import foundation.e.advancedprivacy.databinding.FragmentInternetActivityPolicyBinding +import foundation.e.advancedprivacy.domain.entities.FeatureState +import java.util.Locale +import kotlinx.coroutines.launch +import org.koin.androidx.viewmodel.ext.android.viewModel + +class InternetPrivacyFragment : NavToolbarFragment(R.layout.fragment_internet_activity_policy) { + + private val viewModel: InternetPrivacyViewModel by viewModel() + + private var _binding: FragmentInternetActivityPolicyBinding? = null + private val binding get() = _binding!! + + private fun displayToast(message: String) { + Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT) + .show() + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + _binding = FragmentInternetActivityPolicyBinding.bind(view) + + binding.apps.apply { + layoutManager = LinearLayoutManager(requireContext()) + setHasFixedSize(true) + adapter = ToggleAppsAdapter(R.layout.item_app_toggle) { app -> + viewModel.onClickToggleAppIpScrambled(app) + } + } + + binding.radioUseRealIp.radiobutton.setOnClickListener { + viewModel.submitAction(InternetPrivacyViewModel.Action.UseRealIPAction) + } + + binding.radioUseHiddenIp.radiobutton.setOnClickListener { + viewModel.submitAction(InternetPrivacyViewModel.Action.UseHiddenIPAction) + } + + setToolTipForAsterisk( + textView = binding.ipscramblingSelectApps, + textId = R.string.ipscrambling_select_app, + tooltipTextId = R.string.ipscrambling_app_list_infos + ) + + binding.ipscramblingSelectLocation.apply { + adapter = ArrayAdapter( + requireContext(), android.R.layout.simple_spinner_item, + viewModel.availablesLocationsIds.map { + if (it == "") { + getString(R.string.ipscrambling_any_location) + } else { + Locale("", it).displayCountry + } + } + ).apply { + setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + } + + onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parentView: AdapterView<*>, selectedItemView: View?, position: Int, id: Long) { + viewModel.submitAction( + InternetPrivacyViewModel.Action.SelectLocationAction( + position + ) + ) + } + + override fun onNothingSelected(parentView: AdapterView<*>?) {} + } + } + + viewLifecycleOwner.lifecycleScope.launch { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { + render(viewModel.state.value) + viewModel.state.collect(::render) + } + } + + viewLifecycleOwner.lifecycleScope.launch { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.singleEvents.collect { event -> + when (event) { + is InternetPrivacyViewModel.SingleEvent.ErrorEvent -> { + displayToast(getString(event.errorResId, *event.args.toTypedArray())) + } + } + } + } + } + viewLifecycleOwner.lifecycleScope.launch { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.doOnStartedState() + } + } + } + + private fun render(state: InternetPrivacyState) { + binding.radioUseHiddenIp.radiobutton.apply { + isChecked = state.mode.isChecked + isEnabled = state.mode != FeatureState.STARTING + } + binding.radioUseRealIp.radiobutton.apply { + isChecked = !state.mode.isChecked + isEnabled = state.mode != FeatureState.STOPPING + } + + binding.ipscramblingSelectLocation.setSelection(state.selectedLocationPosition) + + // TODO: this should not be mandatory. + binding.apps.post { + (binding.apps.adapter as ToggleAppsAdapter?)?.setData( + list = state.torToggleableApp, + isEnabled = state.mode == FeatureState.ON + ) + } + + val viewIdsToHide = listOf( + binding.ipscramblingLocationLabel, + binding.selectLocationContainer, + binding.ipscramblingSelectLocation, + binding.ipscramblingSelectApps, + binding.apps + ) + + when { + state.mode.isLoading || + state.torToggleableApp.isEmpty() -> { + binding.loader.visibility = View.VISIBLE + viewIdsToHide.forEach { it.visibility = View.GONE } + } + else -> { + binding.loader.visibility = View.GONE + viewIdsToHide.forEach { it.visibility = View.VISIBLE } + } + } + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/internetprivacy/InternetPrivacyState.kt b/app/src/main/java/foundation/e/advancedprivacy/features/internetprivacy/InternetPrivacyState.kt new file mode 100644 index 0000000..b02ce49 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/internetprivacy/InternetPrivacyState.kt @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2022 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.features.internetprivacy + +import foundation.e.advancedprivacy.domain.entities.FeatureState +import foundation.e.advancedprivacy.domain.entities.ToggleableApp + +data class InternetPrivacyState( + val mode: FeatureState = FeatureState.OFF, + val torToggleableApp: List = emptyList(), + val selectedLocation: String = "", + val availableLocationIds: List = emptyList(), + val forceRedraw: Boolean = false +) { + val selectedLocationPosition get() = availableLocationIds.indexOf(selectedLocation) +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/internetprivacy/InternetPrivacyViewModel.kt b/app/src/main/java/foundation/e/advancedprivacy/features/internetprivacy/InternetPrivacyViewModel.kt new file mode 100644 index 0000000..d998973 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/internetprivacy/InternetPrivacyViewModel.kt @@ -0,0 +1,147 @@ +/* + * Copyright (C) 2023 MURENA SAS + * Copyright (C) 2021 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.features.internetprivacy + +import androidx.annotation.StringRes +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import foundation.e.advancedprivacy.R +import foundation.e.advancedprivacy.domain.entities.DisplayableApp +import foundation.e.advancedprivacy.domain.entities.FeatureState +import foundation.e.advancedprivacy.domain.usecases.GetQuickPrivacyStateUseCase +import foundation.e.advancedprivacy.domain.usecases.IpScramblingStateUseCase +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.FlowPreview +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.debounce +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.merge +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +class InternetPrivacyViewModel( + private val getQuickPrivacyStateUseCase: GetQuickPrivacyStateUseCase, + private val ipScramblingStateUseCase: IpScramblingStateUseCase +) : ViewModel() { + companion object { + private const val WARNING_LOADING_LONG_DELAY = 5 * 1000L + } + + private val _state = MutableStateFlow(InternetPrivacyState()) + val state = _state.asStateFlow() + + private val _singleEvents = MutableSharedFlow() + val singleEvents = _singleEvents.asSharedFlow() + + val availablesLocationsIds = listOf("", *ipScramblingStateUseCase.availablesLocations.toTypedArray()) + + init { + viewModelScope.launch(Dispatchers.IO) { + _state.update { + it.copy( + mode = ipScramblingStateUseCase.internetPrivacyMode.value, + availableLocationIds = availablesLocationsIds, + selectedLocation = ipScramblingStateUseCase.exitCountry + ) + } + } + } + + @OptIn(FlowPreview::class) + suspend fun doOnStartedState() = withContext(Dispatchers.IO) { + launch { + merge( + ipScramblingStateUseCase.getTorToggleableApp().map { apps -> + _state.update { it.copy(torToggleableApp = apps) } + }, + ipScramblingStateUseCase.internetPrivacyMode.map { + _state.update { s -> s.copy(mode = it) } + } + ).collect {} + } + + launch { + ipScramblingStateUseCase.internetPrivacyMode + .map { it == FeatureState.STARTING } + .debounce(WARNING_LOADING_LONG_DELAY) + .collect { + if (it) { + _singleEvents.emit( + SingleEvent.ErrorEvent(R.string.ipscrambling_warning_starting_long) + ) + } + } + } + + launch { + getQuickPrivacyStateUseCase.otherVpnRunning.collect { + _singleEvents.emit( + SingleEvent.ErrorEvent( + R.string.ipscrambling_error_always_on_vpn_already_running, + listOf(it.label ?: "") + ) + ) + _state.update { it.copy(forceRedraw = !it.forceRedraw) } + } + } + } + + fun submitAction(action: Action) = viewModelScope.launch { + when (action) { + is Action.UseRealIPAction -> actionUseRealIP() + is Action.UseHiddenIPAction -> actionUseHiddenIP() + is Action.SelectLocationAction -> actionSelectLocation(action) + } + } + + private suspend fun actionUseRealIP() { + ipScramblingStateUseCase.toggle(hideIp = false) + } + + private suspend fun actionUseHiddenIP() { + ipScramblingStateUseCase.toggle(hideIp = true) + } + + fun onClickToggleAppIpScrambled(app: DisplayableApp) = viewModelScope.launch(Dispatchers.IO) { + ipScramblingStateUseCase.toggleBypassTor(app) + } + + private suspend fun actionSelectLocation(action: Action.SelectLocationAction) = withContext(Dispatchers.IO) { + val locationId = _state.value.availableLocationIds[action.position] + ipScramblingStateUseCase.setExitCountry(locationId) + _state.update { it.copy(selectedLocation = locationId) } + } + + sealed class SingleEvent { + data class ErrorEvent( + @StringRes val errorResId: Int, + val args: List = emptyList() + ) : SingleEvent() + } + + sealed class Action { + object UseRealIPAction : Action() + object UseHiddenIPAction : Action() + data class SelectLocationAction(val position: Int) : Action() + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/internetprivacy/ToggleAppsAdapter.kt b/app/src/main/java/foundation/e/advancedprivacy/features/internetprivacy/ToggleAppsAdapter.kt new file mode 100644 index 0000000..1c49a3e --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/internetprivacy/ToggleAppsAdapter.kt @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2021 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.features.internetprivacy + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.CheckBox +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import foundation.e.advancedprivacy.R +import foundation.e.advancedprivacy.domain.entities.DisplayableApp +import foundation.e.advancedprivacy.domain.entities.ToggleableApp + +class ToggleAppsAdapter( + private val itemsLayout: Int, + private val listener: (DisplayableApp) -> Unit +) : + RecyclerView.Adapter() { + + class ViewHolder(view: View, private val listener: (DisplayableApp) -> Unit) : RecyclerView.ViewHolder(view) { + val appName: TextView = view.findViewById(R.id.title) + + val togglePermission: CheckBox = view.findViewById(R.id.toggle) + + fun bind(item: ToggleableApp, isEnabled: Boolean) { + appName.text = item.app.label + togglePermission.isChecked = item.isOn + togglePermission.isEnabled = isEnabled + + itemView.findViewById(R.id.icon).setImageDrawable(item.app.icon) + togglePermission.setOnClickListener { listener(item.app) } + } + } + + var dataSet: List = emptyList() + set(value) { + field = value + notifyDataSetChanged() + } + + var isEnabled: Boolean = true + + fun setData(list: List, isEnabled: Boolean = true) { + this.isEnabled = isEnabled + dataSet = list + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val view = LayoutInflater.from(parent.context) + .inflate(itemsLayout, parent, false) + return ViewHolder(view, listener) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val permission = dataSet[position] + holder.bind(permission, isEnabled) + } + + override fun getItemCount(): Int = dataSet.size +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationFragment.kt b/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationFragment.kt new file mode 100644 index 0000000..f218190 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationFragment.kt @@ -0,0 +1,446 @@ +/* + * Copyright (C) 2023 MURENA SAS + * Copyright (C) 2021 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.features.location + +import android.Manifest +import android.annotation.SuppressLint +import android.content.Context +import android.location.Location +import android.os.Bundle +import android.text.Editable +import android.view.View +import android.view.inputmethod.InputMethodManager +import android.widget.Toast +import androidx.activity.result.contract.ActivityResultContracts +import androidx.annotation.NonNull +import androidx.core.view.isVisible +import androidx.core.widget.addTextChangedListener +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import androidx.recyclerview.widget.LinearLayoutManager +import com.google.android.material.textfield.TextInputLayout +import com.google.android.material.textfield.TextInputLayout.END_ICON_CUSTOM +import com.google.android.material.textfield.TextInputLayout.END_ICON_NONE +import com.mapbox.android.gestures.MoveGestureDetector +import com.mapbox.mapboxsdk.Mapbox +import com.mapbox.mapboxsdk.WellKnownTileServer +import com.mapbox.mapboxsdk.camera.CameraPosition +import com.mapbox.mapboxsdk.camera.CameraUpdateFactory +import com.mapbox.mapboxsdk.geometry.LatLng +import com.mapbox.mapboxsdk.location.LocationComponent +import com.mapbox.mapboxsdk.location.LocationComponentActivationOptions +import com.mapbox.mapboxsdk.location.modes.CameraMode +import com.mapbox.mapboxsdk.location.modes.RenderMode +import com.mapbox.mapboxsdk.maps.MapboxMap +import com.mapbox.mapboxsdk.maps.Style +import foundation.e.advancedprivacy.R +import foundation.e.advancedprivacy.common.NavToolbarFragment +import foundation.e.advancedprivacy.common.setToolTipForAsterisk +import foundation.e.advancedprivacy.databinding.FragmentFakeLocationBinding +import foundation.e.advancedprivacy.domain.entities.LocationMode +import foundation.e.advancedprivacy.features.internetprivacy.ToggleAppsAdapter +import foundation.e.advancedprivacy.features.location.FakeLocationViewModel.Action +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import org.koin.androidx.viewmodel.ext.android.viewModel +import timber.log.Timber + +class FakeLocationFragment : NavToolbarFragment(R.layout.fragment_fake_location) { + + private var isFirstLaunch: Boolean = true + + private val viewModel: FakeLocationViewModel by viewModel() + + private var _binding: FragmentFakeLocationBinding? = null + private val binding get() = _binding!! + + private var mapboxMap: MapboxMap? = null + private var locationComponent: LocationComponent? = null + + private var inputJob: Job? = null + + private var updateLocationJob: Job? = null + + private val locationPermissionRequest = registerForActivityResult( + ActivityResultContracts.RequestMultiplePermissions() + ) { permissions -> + if (permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) || + permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) + ) { + viewModel.submitAction(Action.StartListeningLocation) + } // TODO: else. + } + + companion object { + private const val MAP_STYLE = "mapbox://styles/mapbox/outdoors-v12" + } + + override fun onAttach(context: Context) { + super.onAttach(context) + Mapbox.getInstance(requireContext(), getString(R.string.mapbox_key), WellKnownTileServer.Mapbox) + } + + private fun displayToast(message: String) { + Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT) + .show() + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + _binding = FragmentFakeLocationBinding.bind(view) + + binding.mapView.setup(savedInstanceState) { mapboxMap -> + this.mapboxMap = mapboxMap + mapboxMap.uiSettings.isRotateGesturesEnabled = false + mapboxMap.setStyle(MAP_STYLE) { style -> + enableLocationPlugin(style) + + mapboxMap.addOnMoveListener(onMoveListener) + + mapboxMap.cameraPosition = CameraPosition.Builder().zoom(8.0).build() + + // Bind click listeners once map is ready. + bindClickListeners() + + render(viewModel.state.value) + startUpdateLocationJob() + } + } + + binding.apps.apply { + layoutManager = LinearLayoutManager(requireContext()) + setHasFixedSize(true) + adapter = ToggleAppsAdapter(R.layout.item_app_toggle) { app -> + viewModel.onToggleApp(app) + } + } + + setToolTipForAsterisk( + textView = binding.targetedAppsSubtitles, + textId = R.string.ipscrambling_select_app, + tooltipTextId = R.string.location_app_list_infos + ) + + startListening() + } + + private val onMoveListener = object : MapboxMap.OnMoveListener { + private val cameraIdleListener: MapboxMap.OnCameraIdleListener = + object : MapboxMap.OnCameraIdleListener { + override fun onCameraIdle() { + mapboxMap?.cameraPosition?.target?.let { + viewModel.submitAction( + Action.SetSpecificLocationAction( + it.latitude.toFloat(), + it.longitude.toFloat() + ) + ) + startUpdateLocationJob() + } + mapboxMap?.removeOnCameraIdleListener(this) + } + } + + override fun onMoveBegin(detector: MoveGestureDetector) { + updateLocationJob?.cancel() + updateLocationJob = null + mapboxMap?.removeOnCameraIdleListener(cameraIdleListener) + } + + override fun onMove(detector: MoveGestureDetector) {} + + override fun onMoveEnd(detector: MoveGestureDetector) { + mapboxMap?.addOnCameraIdleListener(cameraIdleListener) + } + } + + private fun startListening() { + viewLifecycleOwner.lifecycleScope.launch { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { + render(viewModel.state.value) + viewModel.state.collect(::render) + } + } + + viewLifecycleOwner.lifecycleScope.launch { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.singleEvents.collect { event -> + when (event) { + is FakeLocationViewModel.SingleEvent.ErrorEvent -> { + displayToast(event.error) + } + is FakeLocationViewModel.SingleEvent.RequestLocationPermission -> { + // TODO for standalone: rationale dialog + locationPermissionRequest.launch( + arrayOf( + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.ACCESS_COARSE_LOCATION + ) + ) + } + } + } + } + } + + viewLifecycleOwner.lifecycleScope.launch { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.doOnStartedState() + } + } + } + + private fun startUpdateLocationJob() { + updateLocationJob?.cancel() + updateLocationJob = viewLifecycleOwner.lifecycleScope.launch { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { + // Without this delay, onResume, map apply the updateLocation and then + // move to an old fake location. + delay(1000) + viewModel.currentLocation.collect { location -> + updateLocation(location, viewModel.state.value.mode) + } + } + } + } + + private fun validateCoordinate(inputLayout: TextInputLayout, maxValue: Float): Boolean { + return try { + val value = inputLayout.editText?.text?.toString()?.toFloat()!! + + if (value > maxValue || value < -maxValue) { + throw NumberFormatException("value $value is out of bounds") + } + inputLayout.error = null + + inputLayout.setEndIconDrawable(R.drawable.ic_valid) + inputLayout.endIconMode = END_ICON_CUSTOM + true + } catch (e: Exception) { + inputLayout.endIconMode = END_ICON_NONE + inputLayout.error = getString(R.string.location_input_error) + false + } + } + + private fun updateSpecificCoordinates() { + try { + val lat = binding.edittextLatitude.text.toString().toFloat() + val lon = binding.edittextLongitude.text.toString().toFloat() + if (lat <= 90f && lat >= -90f && lon <= 180f && lon >= -180f) { + viewModel.submitAction( + Action.SetSpecificLocationAction( + lat, + lon + ) + ) + } + } catch (e: NumberFormatException) { + Timber.e("Unfiltered wrong lat lon format") + } + } + + @Suppress("UNUSED_PARAMETER") + private fun onLatTextChanged(editable: Editable?) { + if (!binding.edittextLatitude.isFocused || + !validateCoordinate(binding.textlayoutLatitude, 90f) + ) { + return + } + + updateSpecificCoordinates() + } + + @Suppress("UNUSED_PARAMETER") + private fun onLonTextChanged(editable: Editable?) { + if (!binding.edittextLongitude.isFocused || + !validateCoordinate(binding.textlayoutLongitude, 180f) + ) { + return + } + + updateSpecificCoordinates() + } + + private val isEditingLatLon get() = binding.edittextLongitude.isFocused || binding.edittextLatitude.isFocused + + private val latLonOnFocusChangeListener = object : View.OnFocusChangeListener { + override fun onFocusChange(v: View?, hasFocus: Boolean) { + if (!isEditingLatLon) { + (context?.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager)?.hideSoftInputFromWindow( + v?.windowToken, + 0 + ) + } + } + } + + @SuppressLint("ClickableViewAccessibility") + private fun bindClickListeners() { + binding.radioUseRealLocation.setOnClickListener { + viewModel.submitAction(Action.UseRealLocationAction) + } + binding.radioUseRandomLocation.setOnClickListener { + viewModel.submitAction(Action.UseRandomLocationAction) + } + binding.radioUseSpecificLocation.setOnClickListener { + mapboxMap?.cameraPosition?.target?.let { + viewModel.submitAction( + Action.SetSpecificLocationAction(it.latitude.toFloat(), it.longitude.toFloat()) + ) + } + } + + binding.edittextLatitude.addTextChangedListener(afterTextChanged = ::onLatTextChanged) + binding.edittextLongitude.addTextChangedListener(afterTextChanged = ::onLonTextChanged) + binding.edittextLatitude.onFocusChangeListener = latLonOnFocusChangeListener + binding.edittextLongitude.onFocusChangeListener = latLonOnFocusChangeListener + + binding.btnReset.setOnClickListener { + viewModel.onClickResetAllApplications() + } + } + + @SuppressLint("MissingPermission") + private fun render(state: FakeLocationState) { + binding.radioUseRandomLocation.isChecked = state.mode == LocationMode.RANDOM_LOCATION + + binding.radioUseSpecificLocation.isChecked = state.mode == LocationMode.SPECIFIC_LOCATION + + binding.radioUseRealLocation.isChecked = state.mode == LocationMode.REAL_LOCATION + + binding.mapView.isEnabled = (state.mode == LocationMode.SPECIFIC_LOCATION) + + if (state.mode == LocationMode.REAL_LOCATION) { + binding.centeredMarker.isVisible = false + } else { + binding.mapLoader.isVisible = false + binding.mapOverlay.isVisible = state.mode != LocationMode.SPECIFIC_LOCATION + binding.centeredMarker.isVisible = true + mapboxMap?.moveCamera( + CameraUpdateFactory.newLatLng( + LatLng( + state.specificLatitude?.toDouble() ?: 0.0, + state.specificLongitude?.toDouble() ?: 0.0 + ) + ) + ) + } + + binding.textlayoutLatitude.isVisible = (state.mode == LocationMode.SPECIFIC_LOCATION) + binding.textlayoutLongitude.isVisible = (state.mode == LocationMode.SPECIFIC_LOCATION) + + if (!isEditingLatLon) { + binding.edittextLatitude.setText(state.specificLatitude?.toString()) + binding.edittextLongitude.setText(state.specificLongitude?.toString()) + } + + binding.apps.post { + (binding.apps.adapter as ToggleAppsAdapter?)?.setData( + list = state.appsWithBlackList, + isEnabled = state.mode != LocationMode.REAL_LOCATION + ) + } + + binding.btnReset.isVisible = state.showResetBlacklist + binding.btnReset.isClickable = state.showResetBlacklist + } + + @SuppressLint("MissingPermission") + private fun updateLocation(lastLocation: Location?, mode: LocationMode) { + lastLocation?.let { location -> + locationComponent?.isLocationComponentEnabled = true + locationComponent?.forceLocationUpdate(location) + + if (mode == LocationMode.REAL_LOCATION) { + binding.mapLoader.isVisible = false + binding.mapOverlay.isVisible = false + + val update = CameraUpdateFactory.newLatLng( + LatLng(location.latitude, location.longitude) + ) + if (isFirstLaunch) { + mapboxMap?.moveCamera(update) + isFirstLaunch = false + } else { + mapboxMap?.animateCamera(update) + } + } + } ?: run { + locationComponent?.isLocationComponentEnabled = false + if (mode == LocationMode.REAL_LOCATION) { + binding.mapLoader.isVisible = true + binding.mapOverlay.isVisible = true + } + } + } + + @SuppressLint("MissingPermission") + private fun enableLocationPlugin(@NonNull loadedMapStyle: Style) { + // Check if permissions are enabled and if not request + locationComponent = mapboxMap?.locationComponent + locationComponent?.activateLocationComponent( + LocationComponentActivationOptions.builder( + requireContext(), + loadedMapStyle + ).useDefaultLocationEngine(false).build() + ) + locationComponent?.isLocationComponentEnabled = true + locationComponent?.cameraMode = CameraMode.NONE + locationComponent?.renderMode = RenderMode.NORMAL + } + + override fun onStart() { + super.onStart() + binding.mapView.onStart() + } + + override fun onResume() { + super.onResume() + viewModel.submitAction(Action.StartListeningLocation) + binding.mapView.onResume() + } + + override fun onPause() { + super.onPause() + viewModel.submitAction(Action.StopListeningLocation) + binding.mapView.onPause() + } + + override fun onStop() { + super.onStop() + binding.mapView.onStop() + } + + override fun onLowMemory() { + super.onLowMemory() + binding.mapView.onLowMemory() + } + + override fun onDestroyView() { + super.onDestroyView() + binding.mapView.onDestroy() + mapboxMap = null + locationComponent = null + inputJob = null + _binding = null + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationMapView.kt b/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationMapView.kt new file mode 100644 index 0000000..8280426 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationMapView.kt @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2021 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.features.location + +import android.annotation.SuppressLint +import android.content.Context +import android.os.Bundle +import android.util.AttributeSet +import android.view.MotionEvent +import com.mapbox.mapboxsdk.maps.MapView +import com.mapbox.mapboxsdk.maps.OnMapReadyCallback + +class FakeLocationMapView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : MapView(context, attrs, defStyleAttr) { + + /** + * Overrides onTouchEvent because this MapView is part of a scroll view + * and we want this map view to consume all touch events originating on this view. + */ + @SuppressLint("ClickableViewAccessibility") + override fun onTouchEvent(event: MotionEvent?): Boolean { + when (event?.action) { + MotionEvent.ACTION_DOWN -> { + parent.requestDisallowInterceptTouchEvent(true) + requestFocus() + } + MotionEvent.ACTION_UP -> parent.requestDisallowInterceptTouchEvent(false) + } + super.onTouchEvent(event) + return true + } +} + +fun FakeLocationMapView.setup(savedInstanceState: Bundle?, callback: OnMapReadyCallback) = this.apply { + onCreate(savedInstanceState) + getMapAsync(callback) +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationState.kt b/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationState.kt new file mode 100644 index 0000000..364fe41 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationState.kt @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2022 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.features.location + +import android.location.Location +import foundation.e.advancedprivacy.domain.entities.LocationMode +import foundation.e.advancedprivacy.domain.entities.ToggleableApp + +data class FakeLocationState( + val mode: LocationMode = LocationMode.REAL_LOCATION, + val currentLocation: Location? = null, + val specificLatitude: Float? = null, + val specificLongitude: Float? = null, + val forceRefresh: Boolean = false, + val appsWithBlackList: List = emptyList(), + val showResetBlacklist: Boolean = false +) diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationViewModel.kt b/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationViewModel.kt new file mode 100644 index 0000000..af5c1a3 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationViewModel.kt @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2021, 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.features.location + +import android.location.Location +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import foundation.e.advancedprivacy.domain.entities.DisplayableApp +import foundation.e.advancedprivacy.domain.usecases.FakeLocationStateUseCase +import foundation.e.advancedprivacy.domain.usecases.ListenLocationUseCase +import kotlin.time.Duration.Companion.milliseconds +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.FlowPreview +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.debounce +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.merge +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +class FakeLocationViewModel( + private val fakeLocationStateUseCase: FakeLocationStateUseCase, + private val listenLocationUseCase: ListenLocationUseCase +) : ViewModel() { + companion object { + private val SET_SPECIFIC_LOCATION_DELAY = 200.milliseconds + } + + private val _state = MutableStateFlow(FakeLocationState()) + val state = _state.asStateFlow() + + val currentLocation: StateFlow = listenLocationUseCase.currentLocation + + private val _singleEvents = MutableSharedFlow() + val singleEvents = _singleEvents.asSharedFlow() + + private val specificLocationInputFlow = MutableSharedFlow() + + @OptIn(FlowPreview::class) + suspend fun doOnStartedState() = withContext(Dispatchers.Main) { + launch { + merge( + fakeLocationStateUseCase.configuredLocationMode.map { (mode, lat, lon) -> + _state.update { s -> + s.copy( + mode = mode, + specificLatitude = lat, + specificLongitude = lon + ) + } + }, + specificLocationInputFlow + .debounce(SET_SPECIFIC_LOCATION_DELAY).map { action -> + fakeLocationStateUseCase.setSpecificLocation(action.latitude, action.longitude) + }, + fakeLocationStateUseCase.appsWithBlacklist().map { apps -> + _state.update { s -> s.copy(appsWithBlackList = apps) } + }, + fakeLocationStateUseCase.canResetBlacklist().map { + _state.update { s -> s.copy(showResetBlacklist = it) } + } + ).collect {} + } + } + + fun submitAction(action: Action) = viewModelScope.launch { + when (action) { + is Action.StartListeningLocation -> actionStartListeningLocation() + is Action.StopListeningLocation -> listenLocationUseCase.stopListeningLocation() + is Action.SetSpecificLocationAction -> setSpecificLocation(action) + is Action.UseRandomLocationAction -> fakeLocationStateUseCase.setRandomLocation() + is Action.UseRealLocationAction -> + fakeLocationStateUseCase.stopFakeLocation() + } + } + + private suspend fun actionStartListeningLocation() { + val started = listenLocationUseCase.startListeningLocation() + if (!started) { + _singleEvents.emit(SingleEvent.RequestLocationPermission) + } + } + + private suspend fun setSpecificLocation(action: Action.SetSpecificLocationAction) { + specificLocationInputFlow.emit(action) + } + + fun onToggleApp(app: DisplayableApp) = viewModelScope.launch(Dispatchers.IO) { + fakeLocationStateUseCase.toggleBlacklist(app) + } + + fun onClickResetAllApplications() = viewModelScope.launch(Dispatchers.IO) { + fakeLocationStateUseCase.resetBlacklist() + } + + sealed class SingleEvent { + object RequestLocationPermission : SingleEvent() + data class ErrorEvent(val error: String) : SingleEvent() + } + + sealed class Action { + object StartListeningLocation : Action() + object StopListeningLocation : Action() + object UseRealLocationAction : Action() + object UseRandomLocationAction : Action() + data class SetSpecificLocationAction( + val latitude: Float, + val longitude: Float + ) : Action() + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/ListsTabPagerAdapter.kt b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/ListsTabPagerAdapter.kt new file mode 100644 index 0000000..3897c63 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/ListsTabPagerAdapter.kt @@ -0,0 +1,191 @@ +/* + * Copyright (C) 2023 - 2024 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.features.trackers + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.core.view.isVisible +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.divider.MaterialDividerItemDecoration +import foundation.e.advancedprivacy.R +import foundation.e.advancedprivacy.common.BindingListAdapter +import foundation.e.advancedprivacy.common.BindingViewHolder +import foundation.e.advancedprivacy.common.extensions.dpToPx +import foundation.e.advancedprivacy.databinding.TrackersAppsListBinding +import foundation.e.advancedprivacy.databinding.TrackersItemAppBinding +import foundation.e.advancedprivacy.databinding.TrackersListBinding +import foundation.e.advancedprivacy.domain.entities.AppWithCount +import foundation.e.advancedprivacy.domain.entities.DisplayableApp +import foundation.e.advancedprivacy.domain.entities.TrackerWithCount +import foundation.e.advancedprivacy.trackers.domain.entities.Tracker + +class ListsTabPagerAdapter( + private val onClickTracker: (Tracker) -> Unit, + private val onClickApp: (DisplayableApp) -> Unit, + private val onToggleHideNoTrackersApps: () -> Unit +) : RecyclerView.Adapter() { + private var uiState: TrackersPeriodState = TrackersPeriodState() + + fun updateDataSet(state: TrackersPeriodState) { + uiState = state + notifyDataSetChanged() + } + + override fun getItemViewType(position: Int): Int = position + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListsTabViewHolder { + val inflater = LayoutInflater.from(parent.context) + return when (viewType) { + TrackerTab.APPS.position -> { + ListsTabViewHolder.AppsListViewHolder( + TrackersAppsListBinding.inflate(inflater, parent, false), + onClickApp, + onToggleHideNoTrackersApps + ) + } + else -> { + ListsTabViewHolder.TrackersListViewHolder( + TrackersListBinding.inflate(inflater, parent, false), + onClickTracker + ) + } + } + } + + override fun getItemCount(): Int { + return 2 + } + + override fun onBindViewHolder(holder: ListsTabViewHolder, position: Int) { + when (position) { + TrackerTab.APPS.position -> { + (holder as ListsTabViewHolder.AppsListViewHolder).onBind(uiState) + } + TrackerTab.TRACKERS.position -> { + (holder as ListsTabViewHolder.TrackersListViewHolder).onBind(uiState.trackers ?: emptyList()) + } + } + } + + sealed class ListsTabViewHolder(view: View) : RecyclerView.ViewHolder(view) { + protected fun setupRecyclerView(recyclerView: RecyclerView) { + recyclerView.apply { + layoutManager = LinearLayoutManager(context) + setHasFixedSize(true) + isNestedScrollingEnabled = false + addItemDecoration( + MaterialDividerItemDecoration(context, LinearLayoutManager.VERTICAL).apply { + dividerColor = ContextCompat.getColor(context, R.color.divider) + dividerInsetStart = 16.dpToPx(context) + dividerInsetEnd = 16.dpToPx(context) + } + ) + } + } + + class AppsListViewHolder( + private val binding: TrackersAppsListBinding, + private val onClickApp: (DisplayableApp) -> Unit, + private val onToggleHideNoTrackersApps: () -> Unit + ) : ListsTabViewHolder(binding.root) { + private val adapter = object : BindingListAdapter() { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingViewHolder { + return BindingViewHolder( + TrackersItemAppBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } + + override fun onBindViewHolder(holder: BindingViewHolder, position: Int) { + val item = dataSet[position] + holder.binding.icon.setImageDrawable(item.app.icon) + holder.binding.title.text = item.app.label + holder.binding.counts.text = itemView.context.getString( + R.string.trackers_list_app_trackers_counts, item.count.toString() + ) + holder.binding.root.setOnClickListener { + onClickApp(item.app) + } + } + } + + init { + setupRecyclerView(binding.list) + binding.list.adapter = adapter + binding.toggleNoTrackerApps.setOnClickListener { onToggleHideNoTrackersApps() } + } + + fun onBind(uiState: TrackersPeriodState) { + adapter.dataSet = ( + if (uiState.hideNoTrackersApps) { + uiState.appsWithTrackers + } else { + uiState.allApps + } + ) ?: emptyList() + + binding.toggleNoTrackerApps.apply { + isCloseIconVisible = uiState.hideNoTrackersApps + isChecked = uiState.hideNoTrackersApps + } + } + } + + class TrackersListViewHolder( + binding: TrackersListBinding, + private val onClickTracker: (Tracker) -> Unit + ) : ListsTabViewHolder(binding.root) { + + private val adapter = object : BindingListAdapter() { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingViewHolder { + return BindingViewHolder( + TrackersItemAppBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } + + override fun onBindViewHolder(holder: BindingViewHolder, position: Int) { + val item = dataSet[position] + holder.binding.icon.isVisible = false + holder.binding.title.text = item.tracker.label + holder.binding.counts.text = itemView.context.getString( + R.string.trackers_list_tracker_apps_counts, item.count.toString() + ) + holder.binding.root.setOnClickListener { onClickTracker(item.tracker) } + } + } + + init { + setupRecyclerView(binding.list) + binding.list.adapter = adapter + } + + fun onBind(trackers: List) { + adapter.dataSet = trackers + } + } + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackerControlDisclaimer.kt b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackerControlDisclaimer.kt new file mode 100644 index 0000000..f232e0d --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackerControlDisclaimer.kt @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.features.trackers + +import android.content.Context +import android.text.Spannable +import android.text.SpannableString +import android.text.style.ClickableSpan +import android.text.style.ForegroundColorSpan +import android.text.style.UnderlineSpan +import android.view.View +import android.widget.TextView +import androidx.core.content.ContextCompat +import foundation.e.advancedprivacy.R + +const val URL_LEARN_MORE_ABOUT_TRACKERS = "https://doc.e.foundation/support-topics/advanced_privacy#trackers-blocker" + +fun setupDisclaimerBlock(view: TextView, onClickLearnMore: () -> Unit) { + with(view) { + linksClickable = true + isClickable = true + movementMethod = android.text.method.LinkMovementMethod.getInstance() + text = buildSpan(view.context, onClickLearnMore) + } +} + +private fun buildSpan(context: Context, onClickLearnMore: () -> Unit): SpannableString { + val start = context.getString(R.string.trackercontroldisclaimer_start) + val body = context.getString(R.string.trackercontroldisclaimer_body) + val link = context.getString(R.string.trackercontroldisclaimer_link) + + val spannable = SpannableString("$start $body $link") + + val startEndIndex = start.length + 1 + val linkStartIndex = startEndIndex + body.length + 1 + val linkEndIndex = spannable.length + spannable.setSpan( + ForegroundColorSpan(ContextCompat.getColor(context, R.color.primary_text)), + 0, + startEndIndex, + Spannable.SPAN_INCLUSIVE_EXCLUSIVE + ) + + spannable.setSpan( + ForegroundColorSpan(ContextCompat.getColor(context, R.color.disabled)), + startEndIndex, + linkStartIndex, + Spannable.SPAN_INCLUSIVE_EXCLUSIVE + ) + + spannable.setSpan( + ForegroundColorSpan(ContextCompat.getColor(context, R.color.accent)), + linkStartIndex, + linkEndIndex, + Spannable.SPAN_INCLUSIVE_EXCLUSIVE + ) + spannable.setSpan(UnderlineSpan(), linkStartIndex, linkEndIndex, Spannable.SPAN_INCLUSIVE_EXCLUSIVE) + spannable.setSpan( + object : ClickableSpan() { + override fun onClick(p0: View) { + onClickLearnMore.invoke() + } + }, + linkStartIndex, + linkEndIndex, + Spannable.SPAN_INCLUSIVE_EXCLUSIVE + ) + return spannable +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersFragment.kt b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersFragment.kt new file mode 100644 index 0000000..5f55b1a --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersFragment.kt @@ -0,0 +1,171 @@ +/* + * Copyright (C) 2022 - 2024 MURENA SAS + * Copyright (C) 2021 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.features.trackers + +import android.content.ActivityNotFoundException +import android.content.Intent +import android.os.Bundle +import android.text.Spannable +import android.text.SpannableString +import android.text.method.LinkMovementMethod +import android.text.style.ClickableSpan +import android.text.style.ForegroundColorSpan +import android.text.style.UnderlineSpan +import android.view.View +import android.widget.Toast +import androidx.core.content.ContextCompat +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import androidx.navigation.fragment.findNavController +import androidx.viewpager2.widget.ViewPager2 +import com.google.android.material.tabs.TabLayoutMediator +import foundation.e.advancedprivacy.R +import foundation.e.advancedprivacy.common.NavToolbarFragment +import foundation.e.advancedprivacy.common.extensions.findViewHolderForAdapterPosition +import foundation.e.advancedprivacy.common.extensions.updatePagerHeightForChild +import foundation.e.advancedprivacy.databinding.FragmentTrackersBinding +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.launch +import org.koin.androidx.viewmodel.ext.android.viewModel + +class TrackersFragment : NavToolbarFragment(R.layout.fragment_trackers) { + private val viewModel: TrackersViewModel by viewModel() + private lateinit var binding: FragmentTrackersBinding + + private lateinit var pagerAdapter: TrackersPeriodAdapter + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + binding = FragmentTrackersBinding.bind(view) + + val trackersTabs = binding.trackersPeriodsTabs + val trackersPager = binding.trackersPeriodsPager + + pagerAdapter = TrackersPeriodAdapter(this, viewModel) + trackersPager.adapter = pagerAdapter + TabLayoutMediator(trackersTabs, trackersPager) { tab, position -> + tab.text = getString(viewModel.getDisplayDuration(position)) + }.attach() + + setupTrackersInfos() + + binding.trackersPeriodsPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { + override fun onPageScrollStateChanged(state: Int) { + super.onPageScrollStateChanged(state) + if (state == ViewPager2.SCROLL_STATE_IDLE) { + viewModel.onDisplayedItemChanged(binding.trackersPeriodsPager.currentItem) + } + } + }) + + listenViewModel() + } + + override fun onStart() { + super.onStart() + lifecycleScope.launch { + binding.trackersPeriodsPager.currentItem = viewModel.getLastPosition() + } + } + + fun refreshUiHeight(): SharedFlow { + return viewModel.refreshUiHeight + } + + private fun listenViewModel() { + with(viewLifecycleOwner) { + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.singleEvents.collect(::handleEvents) + } + } + + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.navigate.collect(findNavController()::navigate) + } + } + } + } + + private fun handleEvents(event: TrackersViewModel.SingleEvent) { + when (event) { + is TrackersViewModel.SingleEvent.ErrorEvent -> { + displayToast(event.error) + } + is TrackersViewModel.SingleEvent.OpenUrl -> { + try { + startActivity(Intent(Intent.ACTION_VIEW, event.url)) + } catch (e: ActivityNotFoundException) { + Toast.makeText( + requireContext(), + R.string.error_no_activity_view_url, + Toast.LENGTH_SHORT + ).show() + } + } + } + } + + private fun setupTrackersInfos() { + val infoText = getString(R.string.trackers_info) + val moreText = getString(R.string.trackers_info_more) + + val spannable = SpannableString("$infoText $moreText") + val startIndex = infoText.length + 1 + val endIndex = spannable.length + spannable.setSpan( + ForegroundColorSpan(ContextCompat.getColor(requireContext(), R.color.accent)), + startIndex, + endIndex, + Spannable.SPAN_INCLUSIVE_EXCLUSIVE + ) + spannable.setSpan(UnderlineSpan(), startIndex, endIndex, Spannable.SPAN_INCLUSIVE_EXCLUSIVE) + spannable.setSpan( + object : ClickableSpan() { + override fun onClick(p0: View) { + viewModel.onClickLearnMore() + } + }, + startIndex, + endIndex, + Spannable.SPAN_INCLUSIVE_EXCLUSIVE + ) + + with(binding.trackersInfo) { + linksClickable = true + isClickable = true + movementMethod = LinkMovementMethod.getInstance() + text = spannable + } + } + + fun updatePagerHeight() { + binding.trackersPeriodsPager.findViewHolderForAdapterPosition(binding.trackersPeriodsPager.currentItem) + .let { currentViewHolder -> + currentViewHolder?.itemView?.let { binding.trackersPeriodsPager.updatePagerHeightForChild(it) } + } + } + + private fun displayToast(message: String) { + Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show() + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersPeriodAdapter.kt b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersPeriodAdapter.kt new file mode 100644 index 0000000..721791b --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersPeriodAdapter.kt @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.features.trackers + +import androidx.fragment.app.Fragment +import androidx.viewpager2.adapter.FragmentStateAdapter + +class TrackersPeriodAdapter( + context: Fragment, + private val viewModel: TrackersViewModel +) : FragmentStateAdapter(context) { + + override fun getItemCount(): Int { + return viewModel.positionsCount + } + + override fun createFragment(position: Int): Fragment { + return TrackersPeriodFragment().apply { + arguments = TrackersPeriodFragment.buildArguments(period = viewModel.getPeriod(position)) + } + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersPeriodFragment.kt b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersPeriodFragment.kt new file mode 100644 index 0000000..91f5339 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersPeriodFragment.kt @@ -0,0 +1,199 @@ +/* + * Copyright (C) 2022 - 2024 MURENA SAS + * Copyright (C) 2021 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.features.trackers + +import android.annotation.SuppressLint +import android.content.ActivityNotFoundException +import android.content.Intent +import android.os.Bundle +import android.view.View +import android.widget.Toast +import androidx.fragment.app.Fragment +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import androidx.navigation.fragment.findNavController +import androidx.viewpager2.widget.ViewPager2 +import com.google.android.material.tabs.TabLayoutMediator +import foundation.e.advancedprivacy.R +import foundation.e.advancedprivacy.common.extensions.findViewHolderForAdapterPosition +import foundation.e.advancedprivacy.common.extensions.updatePagerHeightForChild +import foundation.e.advancedprivacy.databinding.TrackersPeriodFragmentBinding +import foundation.e.advancedprivacy.features.trackers.TrackersPeriodViewModel.SingleEvent +import foundation.e.advancedprivacy.features.trackers.graph.GraphHolder +import kotlinx.coroutines.FlowPreview +import kotlinx.coroutines.flow.debounce +import kotlinx.coroutines.flow.merge +import kotlinx.coroutines.launch +import org.koin.androidx.viewmodel.ext.android.viewModel +import org.koin.core.parameter.parametersOf + +class TrackersPeriodFragment : Fragment(R.layout.trackers_period_fragment) { + + companion object { + private const val ARG_PERIOD = "period" + + fun buildArguments(period: Period): Bundle { + return Bundle().apply { + putString(ARG_PERIOD, period.name) + } + } + } + + private val viewModel: TrackersPeriodViewModel by viewModel { + parametersOf( + requireArguments().getString( + ARG_PERIOD + ) + ) + } + + private val trackersFragment: TrackersFragment? + get() = parentFragment as? TrackersFragment? + + private lateinit var binding: TrackersPeriodFragmentBinding + + private lateinit var tabAdapter: ListsTabPagerAdapter + private lateinit var graphHolder: GraphHolder + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + binding = TrackersPeriodFragmentBinding.bind(view) + + graphHolder = GraphHolder(binding.graphContainer) + + tabAdapter = ListsTabPagerAdapter( + onClickApp = viewModel::onClickApp, + onClickTracker = viewModel::onClickTracker, + onToggleHideNoTrackersApps = viewModel::onToggleHideNoTrackersApps + ) + binding.listsPager.adapter = tabAdapter + + TabLayoutMediator(binding.listsTabs, binding.listsPager) { tab, position -> + tab.text = getString( + when (position) { + TrackerTab.APPS.position -> R.string.trackers_toggle_list_apps + else -> R.string.trackers_toggle_list_trackers + } + ) + }.attach() + + binding.listsPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { + override fun onPageScrollStateChanged(state: Int) { + super.onPageScrollStateChanged(state) + if (state == ViewPager2.SCROLL_STATE_IDLE) { + viewModel.onDisplayedItemChanged() + } + } + }) + + listenViewModel() + } + + override fun onResume() { + super.onResume() + lifecycleScope.launch { + viewModel.getStartPosition()?.let { + binding.listsPager.currentItem = it + } + } + } + + @OptIn(FlowPreview::class) + private fun listenViewModel() { + with(viewLifecycleOwner) { + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + render(viewModel.state.value) + viewModel.state.collect(::render) + } + } + + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.singleEvents.collect(::handleEvents) + } + } + + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.RESUMED) { + trackersFragment?.refreshUiHeight()?.let { parentFlow -> + merge( + parentFlow, + viewModel.refreshUiHeight + ) + .debounce(50) + .collect { updatePagerHeight() } + } + } + } + + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.navigate.collect(findNavController()::navigate) + } + } + + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.doOnStartedState() + } + } + } + } + + private fun handleEvents(event: SingleEvent) { + when (event) { + is SingleEvent.ErrorEvent -> { + displayToast(event.error) + } + is SingleEvent.OpenUrl -> { + try { + startActivity(Intent(Intent.ACTION_VIEW, event.url)) + } catch (e: ActivityNotFoundException) { + Toast.makeText( + requireContext(), + R.string.error_no_activity_view_url, + Toast.LENGTH_SHORT + ).show() + } + } + } + } + + private fun updatePagerHeight() { + binding.listsPager.findViewHolderForAdapterPosition(binding.listsPager.currentItem) + .let { currentViewHolder -> + currentViewHolder?.itemView?.let { binding.listsPager.updatePagerHeightForChild(it) } + } + + trackersFragment?.updatePagerHeight() + } + + private fun displayToast(message: String) { + Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show() + } + + @SuppressLint("NotifyDataSetChanged") + private fun render(state: TrackersPeriodState) { + graphHolder.onBind(state) + tabAdapter.updateDataSet(state) + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersPeriodViewModel.kt b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersPeriodViewModel.kt new file mode 100644 index 0000000..b416f2d --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersPeriodViewModel.kt @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2022 - 2024 MURENA SAS + * Copyright (C) 2021 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.features.trackers + +import android.net.Uri +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import androidx.navigation.NavDirections +import foundation.e.advancedprivacy.R +import foundation.e.advancedprivacy.domain.entities.DisplayableApp +import foundation.e.advancedprivacy.domain.usecases.TrackersAndAppsListsUseCase +import foundation.e.advancedprivacy.domain.usecases.TrackersScreenUseCase +import foundation.e.advancedprivacy.domain.usecases.TrackersStatisticsUseCase +import foundation.e.advancedprivacy.trackers.domain.entities.Tracker +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +class TrackersPeriodViewModel( + private val period: Period, + private val trackersStatisticsUseCase: TrackersStatisticsUseCase, + private val trackersAndAppsListsUseCase: TrackersAndAppsListsUseCase, + private val trackersScreenUseCase: TrackersScreenUseCase +) : ViewModel() { + + private val _state = MutableStateFlow( + TrackersPeriodState( + title = when (period) { + Period.DAY -> R.string.trackers_graph_title_day + Period.MONTH -> R.string.trackers_graph_title_month + Period.YEAR -> R.string.trackers_graph_title_year + } + ) + ) + + val state = _state.asStateFlow() + + private val _singleEvents = MutableSharedFlow() + val singleEvents = _singleEvents.asSharedFlow() + + private val _refreshUiHeight = MutableSharedFlow() + val refreshUiHeight = _refreshUiHeight.asSharedFlow() + + private val _navigate = MutableSharedFlow() + val navigate = _navigate.asSharedFlow() + + suspend fun doOnStartedState() = withContext(Dispatchers.IO) { + trackersStatisticsUseCase.listenUpdates().collect { + trackersStatisticsUseCase.getGraphData(period).let { graphData -> + _state.update { + it.copy( + callsBlockedNLeaked = graphData.callsBlockedNLeaked, + periods = graphData.periods, + trackersCount = graphData.trackersCount, + trackersAllowedCount = graphData.trackersAllowedCount, + graduations = graphData.graduations + ) + } + } + + trackersAndAppsListsUseCase.getAppsAndTrackersCounts(period).let { lists -> + _state.update { + it.copy( + trackers = lists.trackers, + allApps = lists.allApps, + appsWithTrackers = lists.appsWithTrackers + ) + } + _refreshUiHeight.emit(Unit) + } + } + } + + fun onClickTracker(tracker: Tracker) = viewModelScope.launch { + _navigate.emit(TrackersFragmentDirections.gotoTrackerDetailsFragment(trackerId = tracker.id)) + } + + fun onClickApp(app: DisplayableApp) = viewModelScope.launch { + _navigate.emit(TrackersFragmentDirections.gotoAppTrackersFragment(appId = app.id)) + } + + fun onToggleHideNoTrackersApps() = viewModelScope.launch { + _state.update { it.copy(hideNoTrackersApps = !it.hideNoTrackersApps) } + _refreshUiHeight.emit(Unit) + } + + fun onDisplayedItemChanged() = viewModelScope.launch { + _refreshUiHeight.emit(Unit) + } + + fun getStartPosition(): Int? { + val startPosition = trackersScreenUseCase.getTrackerTabStartPosition() + return startPosition.takeIf { it in 0..1 } + } + + sealed class SingleEvent { + data class ErrorEvent(val error: String) : SingleEvent() + data class OpenUrl(val url: Uri) : SingleEvent() + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersState.kt b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersState.kt new file mode 100644 index 0000000..0549265 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersState.kt @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2023 - 2024 MURENA SAS + * Copyright (C) 2022 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.features.trackers + +import androidx.annotation.StringRes +import foundation.e.advancedprivacy.R +import foundation.e.advancedprivacy.domain.entities.AppWithCount +import foundation.e.advancedprivacy.domain.entities.TrackerWithCount +import java.time.Instant +import java.time.ZonedDateTime +import java.time.temporal.ChronoUnit +import java.time.temporal.TemporalUnit + +data class TrackersPeriodState( + @StringRes val tabLabel: Int = R.string.empty, + @StringRes val title: Int = R.string.empty, + val callsBlockedNLeaked: List> = emptyList(), + val periods: List = emptyList(), + val trackersCount: Int = 0, + val trackersAllowedCount: Int = 0, + val graduations: List? = null, + val allApps: List? = null, + val trackers: List? = null, + val appsWithTrackers: List? = null, + val hideNoTrackersApps: Boolean = false +) { + + fun isEmptyCalls(): Boolean { + return callsBlockedNLeaked.isEmpty() || + callsBlockedNLeaked.all { it.first == 0 && it.second == 0 } + } +} + +enum class TrackerTab(val position: Int) { + APPS(0), + TRACKERS(1) +} + +enum class Period(val periodsCount: Int, val periodUnit: TemporalUnit) { + DAY(24, ChronoUnit.HOURS), + MONTH(30, ChronoUnit.DAYS), + YEAR(12, ChronoUnit.MONTHS); + + fun getPeriodStart(): Instant { + var start = ZonedDateTime.now() + .minus(periodsCount.toLong(), periodUnit) + .plus(1, periodUnit) + var truncatePeriodUnit = periodUnit + if (periodUnit === ChronoUnit.MONTHS) { + start = start.withDayOfMonth(1) + truncatePeriodUnit = ChronoUnit.DAYS + } + + return start.truncatedTo(truncatePeriodUnit).toInstant() + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersViewModel.kt b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersViewModel.kt new file mode 100644 index 0000000..b682adf --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersViewModel.kt @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2022 - 2024 MURENA SAS + * Copyright (C) 2021 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.features.trackers + +import android.net.Uri +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import androidx.navigation.NavDirections +import foundation.e.advancedprivacy.R +import foundation.e.advancedprivacy.domain.usecases.TrackersScreenUseCase +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.launch + +class TrackersViewModel(private val trackersScreenUseCase: TrackersScreenUseCase) : ViewModel() { + private val _singleEvents = MutableSharedFlow() + val singleEvents = _singleEvents.asSharedFlow() + + private val _navigate = MutableSharedFlow() + val navigate = _navigate.asSharedFlow() + + private val _refreshUiHeight = MutableSharedFlow() + val refreshUiHeight = _refreshUiHeight.asSharedFlow() + + val positionsCount = 3 + fun getPeriod(position: Int): Period { + return when (position) { + 0 -> Period.DAY + 1 -> Period.MONTH + 2 -> Period.YEAR + else -> Period.DAY + } + } + + fun getDisplayDuration(position: Int): Int { + return when (position) { + 0 -> R.string.trackers_period_day + 1 -> R.string.trackers_period_month + else -> R.string.trackers_period_year + } + } + + suspend fun getLastPosition(): Int { + val lastPosition = trackersScreenUseCase.getLastPosition() + return if (lastPosition in 0 until positionsCount) { + lastPosition + } else { + 0 + } + } + + fun onDisplayedItemChanged(position: Int) = viewModelScope.launch(Dispatchers.IO) { + trackersScreenUseCase.savePosition(position) + trackersScreenUseCase.resetTrackerTabStartPosition() + _refreshUiHeight.emit(Unit) + } + + fun onClickLearnMore() = viewModelScope.launch { + _singleEvents.emit(SingleEvent.OpenUrl(Uri.parse(URL_LEARN_MORE_ABOUT_TRACKERS))) + } + + sealed class SingleEvent { + data class ErrorEvent(val error: String) : SingleEvent() + data class OpenUrl(val url: Uri) : SingleEvent() + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/apptrackers/AppTrackersFragment.kt b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/apptrackers/AppTrackersFragment.kt new file mode 100644 index 0000000..99280dd --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/apptrackers/AppTrackersFragment.kt @@ -0,0 +1,180 @@ +/* + * Copyright (C) 2023-2024 MURENA SAS + * Copyright (C) 2021 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.features.trackers.apptrackers + +import android.content.ActivityNotFoundException +import android.content.Intent +import android.os.Bundle +import android.view.View +import android.widget.Toast +import androidx.core.content.ContextCompat +import androidx.core.view.isVisible +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import androidx.navigation.fragment.navArgs +import androidx.recyclerview.widget.LinearLayoutManager +import com.google.android.material.divider.MaterialDividerItemDecoration +import com.google.android.material.snackbar.Snackbar +import foundation.e.advancedprivacy.R +import foundation.e.advancedprivacy.common.BigNumberFormatter +import foundation.e.advancedprivacy.common.NavToolbarFragment +import foundation.e.advancedprivacy.databinding.ApptrackersFragmentBinding +import foundation.e.advancedprivacy.features.trackers.setupDisclaimerBlock +import kotlinx.coroutines.launch +import org.koin.androidx.viewmodel.ext.android.viewModel +import org.koin.core.parameter.parametersOf + +class AppTrackersFragment : NavToolbarFragment(R.layout.apptrackers_fragment) { + + private val args: AppTrackersFragmentArgs by navArgs() + private val viewModel: AppTrackersViewModel by viewModel { parametersOf(args.appId) } + + private val numberFormatter: BigNumberFormatter by lazy { BigNumberFormatter(requireContext()) } + + private lateinit var binding: ApptrackersFragmentBinding + + override fun getTitle(): CharSequence { + return "" + } + + private fun displayToast(message: String) { + Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT) + .show() + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = ApptrackersFragmentBinding.bind(view) + + binding.blockAllToggle.setOnClickListener { + viewModel.onToggleBlockAll(binding.blockAllToggle.isChecked) + } + binding.btnReset.setOnClickListener { viewModel.onClickResetAllTrackers() } + + binding.list.apply { + layoutManager = LinearLayoutManager(requireContext()) + setHasFixedSize(true) + addItemDecoration( + MaterialDividerItemDecoration(requireContext(), LinearLayoutManager.VERTICAL).apply { + dividerColor = ContextCompat.getColor(requireContext(), R.color.divider) + } + ) + adapter = ToggleTrackersAdapter(viewModel) + } + + listenViewModel() + + setupDisclaimerBlock(binding.disclaimerBlockTrackers.root, viewModel::onClickLearnMore) + } + + private fun listenViewModel() { + with(viewLifecycleOwner) { + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.singleEvents.collect(::handleEvents) + } + } + + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.doOnStartedState() + } + } + + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + render(viewModel.state.value) + viewModel.state.collect(::render) + } + } + } + } + private fun handleEvents(event: AppTrackersViewModel.SingleEvent) { + when (event) { + is AppTrackersViewModel.SingleEvent.ErrorEvent -> + displayToast(getString(event.errorResId)) + + is AppTrackersViewModel.SingleEvent.OpenUrl -> + try { + startActivity(Intent(Intent.ACTION_VIEW, event.url)) + } catch (e: ActivityNotFoundException) { + Toast.makeText( + requireContext(), + R.string.error_no_activity_view_url, + Toast.LENGTH_SHORT + ).show() + } + + is AppTrackersViewModel.SingleEvent.ToastTrackersControlDisabled -> + Snackbar.make( + binding.root, + R.string.apptrackers_tracker_control_disabled_message, + Snackbar.LENGTH_LONG + ).show() + } + } + + private fun render(state: AppTrackersState) { + setTitle(state.app?.label) + binding.subtitle.text = getString(R.string.apptrackers_subtitle, state.app?.label) + binding.dataDetectedTrackers.apply { + primaryMessage.setText(R.string.apptrackers_detected_tracker_primary) + number.text = state.getTrackersCount().toString() + secondaryMessage.setText(R.string.apptrackers_detected_tracker_secondary) + } + + binding.dataBlockedTrackers.apply { + primaryMessage.setText(R.string.apptrackers_blocked_tracker_primary) + number.text = state.getBlockedTrackersCount().toString() + secondaryMessage.setText(R.string.apptrackers_blocked_tracker_secondary) + } + + binding.dataBlockedLeaks.apply { + primaryMessage.setText(R.string.apptrackers_blocked_leaks_primary) + number.text = numberFormatter.format(state.blocked) + secondaryMessage.text = getString(R.string.apptrackers_blocked_leaks_secondary, numberFormatter.format(state.leaked)) + } + + binding.blockAllToggle.isChecked = state.isBlockingActivated + + val trackersStatus = state.trackersWithBlockedList + if (!trackersStatus.isEmpty()) { + binding.listTitle.isVisible = true + binding.list.isVisible = true + binding.list.post { + (binding.list.adapter as ToggleTrackersAdapter?)?.updateDataSet(trackersStatus) + } + binding.noTrackersYet.isVisible = false + binding.btnReset.isVisible = true + } else { + binding.listTitle.isVisible = false + binding.list.isVisible = false + binding.noTrackersYet.isVisible = true + binding.noTrackersYet.text = getString( + when { + !state.isBlockingActivated -> R.string.apptrackers_no_trackers_yet_block_off + state.isWhitelistEmpty -> R.string.apptrackers_no_trackers_yet_block_on + else -> R.string.app_trackers_no_trackers_yet_remaining_whitelist + } + ) + binding.btnReset.isVisible = state.isBlockingActivated && !state.isWhitelistEmpty + } + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/apptrackers/AppTrackersState.kt b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/apptrackers/AppTrackersState.kt new file mode 100644 index 0000000..4bb754b --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/apptrackers/AppTrackersState.kt @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2023 MURENA SAS + * Copyright (C) 2022 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.features.trackers.apptrackers + +import foundation.e.advancedprivacy.domain.entities.DisplayableApp +import foundation.e.advancedprivacy.trackers.domain.entities.Tracker + +data class AppTrackersState( + val app: DisplayableApp? = null, + val isBlockingActivated: Boolean = false, + val trackersWithBlockedList: List> = emptyList(), + val leaked: Int = 0, + val blocked: Int = 0, + val isTrackersBlockingEnabled: Boolean = false, + val isWhitelistEmpty: Boolean = true +) { + fun getTrackersCount() = trackersWithBlockedList.size + + fun getBlockedTrackersCount(): Int = trackersWithBlockedList.count { it.second } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/apptrackers/AppTrackersViewModel.kt b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/apptrackers/AppTrackersViewModel.kt new file mode 100644 index 0000000..8ccdd98 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/apptrackers/AppTrackersViewModel.kt @@ -0,0 +1,154 @@ +/* + * Copyright (C) 2023 MURENA SAS + * Copyright (C) 2021 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.features.trackers.apptrackers + +import android.net.Uri +import androidx.annotation.StringRes +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import foundation.e.advancedprivacy.domain.entities.DisplayableApp +import foundation.e.advancedprivacy.domain.entities.FeatureMode +import foundation.e.advancedprivacy.domain.usecases.AppTrackersUseCase +import foundation.e.advancedprivacy.domain.usecases.GetQuickPrivacyStateUseCase +import foundation.e.advancedprivacy.domain.usecases.TrackersStateUseCase +import foundation.e.advancedprivacy.domain.usecases.TrackersStatisticsUseCase +import foundation.e.advancedprivacy.features.trackers.URL_LEARN_MORE_ABOUT_TRACKERS +import foundation.e.advancedprivacy.trackers.domain.entities.Tracker +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.merge +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +class AppTrackersViewModel( + private val app: DisplayableApp, + private val appTrackersUseCase: AppTrackersUseCase, + private val trackersStateUseCase: TrackersStateUseCase, + private val trackersStatisticsUseCase: TrackersStatisticsUseCase, + private val getQuickPrivacyStateUseCase: GetQuickPrivacyStateUseCase +) : ViewModel() { + private val _state = MutableStateFlow(AppTrackersState()) + val state = _state.asStateFlow() + + private val _singleEvents = MutableSharedFlow() + val singleEvents = _singleEvents.asSharedFlow() + + init { + _state.update { + it.copy( + app = app + ) + } + } + + suspend fun doOnStartedState() = withContext(Dispatchers.IO) { + merge( + getQuickPrivacyStateUseCase.trackerMode.map { + _state.update { s -> s.copy(isTrackersBlockingEnabled = it != FeatureMode.VULNERABLE) } + }, + trackersStatisticsUseCase.listenUpdates().map { fetchStatistics() } + ).collect() + } + + fun onClickLearnMore() { + viewModelScope.launch { + _singleEvents.emit(SingleEvent.OpenUrl(Uri.parse(URL_LEARN_MORE_ABOUT_TRACKERS))) + } + } + + fun onToggleBlockAll(isBlocked: Boolean) { + viewModelScope.launch(Dispatchers.IO) { + if (!state.value.isTrackersBlockingEnabled) { + _singleEvents.emit(SingleEvent.ToastTrackersControlDisabled) + } + appTrackersUseCase.toggleAppWhitelist( + app, + state.value.trackersWithBlockedList.map { it.first }, + isBlocked + ) + updateWhitelist() + } + } + + fun onToggleTracker(tracker: Tracker, isBlocked: Boolean) { + viewModelScope.launch(Dispatchers.IO) { + if (!state.value.isTrackersBlockingEnabled) { + _singleEvents.emit(SingleEvent.ToastTrackersControlDisabled) + } + + trackersStateUseCase.blockTracker(app, tracker, isBlocked) + updateWhitelist() + } + } + + fun onClickTracker(tracker: Tracker) { + viewModelScope.launch(Dispatchers.IO) { + tracker.link?.let { + runCatching { Uri.parse(it) }.getOrNull() + }?.let { _singleEvents.emit(SingleEvent.OpenUrl(it)) } + } + } + + fun onClickResetAllTrackers() { + viewModelScope.launch(Dispatchers.IO) { + appTrackersUseCase.clearWhitelist(app) + updateWhitelist() + } + } + + private suspend fun fetchStatistics() = withContext(Dispatchers.IO) { + val (blocked, leaked) = appTrackersUseCase.getCalls(app) + val trackersWithBlockedList = appTrackersUseCase.getTrackersWithBlockedList(app) + + _state.update { s -> + s.copy( + leaked = leaked, + blocked = blocked, + isBlockingActivated = !trackersStateUseCase.isWhitelisted(app), + isWhitelistEmpty = trackersStatisticsUseCase.isWhiteListEmpty(app), + trackersWithBlockedList = trackersWithBlockedList + ) + } + } + + private suspend fun updateWhitelist() = withContext(Dispatchers.IO) { + _state.update { s -> + s.copy( + isBlockingActivated = !trackersStateUseCase.isWhitelisted(app), + trackersWithBlockedList = appTrackersUseCase.enrichWithBlockedState( + app, + s.trackersWithBlockedList.map { it.first } + ), + isWhitelistEmpty = trackersStatisticsUseCase.isWhiteListEmpty(app) + ) + } + } + + sealed class SingleEvent { + data class ErrorEvent(@StringRes val errorResId: Int) : SingleEvent() + data class OpenUrl(val url: Uri) : SingleEvent() + object ToastTrackersControlDisabled : SingleEvent() + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/apptrackers/ToggleTrackersAdapter.kt b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/apptrackers/ToggleTrackersAdapter.kt new file mode 100644 index 0000000..ac3a9a6 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/apptrackers/ToggleTrackersAdapter.kt @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2023 MURENA SAS + * Copyright (C) 2021 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.features.trackers.apptrackers + +import android.text.SpannableString +import android.text.style.UnderlineSpan +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.RecyclerView +import foundation.e.advancedprivacy.R +import foundation.e.advancedprivacy.databinding.ApptrackersItemTrackerToggleBinding +import foundation.e.advancedprivacy.trackers.domain.entities.Tracker + +class ToggleTrackersAdapter( + private val viewModel: AppTrackersViewModel +) : RecyclerView.Adapter() { + class ViewHolder( + private val binding: ApptrackersItemTrackerToggleBinding, + private val viewModel: AppTrackersViewModel + ) : RecyclerView.ViewHolder(binding.root) { + + fun bind(item: Pair) { + val label = item.first.label + with(binding.title) { + if (item.first.link != null) { + setTextColor(ContextCompat.getColor(context, R.color.accent)) + val spannable = SpannableString(label) + spannable.setSpan(UnderlineSpan(), 0, spannable.length, 0) + text = spannable + } else { + setTextColor(ContextCompat.getColor(context, R.color.primary_text)) + text = label + } + setOnClickListener { viewModel.onClickTracker(item.first) } + } + with(binding.toggle) { + isChecked = item.second + + setOnClickListener { + viewModel.onToggleTracker(item.first, isChecked) + } + } + } + } + + private var dataSet: List> = emptyList() + + fun updateDataSet(new: List>) { + dataSet = new + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder( + ApptrackersItemTrackerToggleBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ), + viewModel + ) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val permission = dataSet[position] + holder.bind(permission) + } + + override fun getItemCount(): Int = dataSet.size +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/graph/GraphHolder.kt b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/graph/GraphHolder.kt new file mode 100644 index 0000000..ed6c326 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/graph/GraphHolder.kt @@ -0,0 +1,299 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.features.trackers.graph + +import android.graphics.Canvas +import android.view.View +import androidx.core.content.ContextCompat +import androidx.core.view.isVisible +import com.github.mikephil.charting.components.AxisBase +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis.AxisDependency +import com.github.mikephil.charting.data.BarData +import com.github.mikephil.charting.data.BarDataSet +import com.github.mikephil.charting.data.BarEntry +import com.github.mikephil.charting.data.Entry +import com.github.mikephil.charting.formatter.ValueFormatter +import com.github.mikephil.charting.highlight.Highlight +import com.github.mikephil.charting.listener.OnChartValueSelectedListener +import com.github.mikephil.charting.renderer.XAxisRenderer +import foundation.e.advancedprivacy.R +import foundation.e.advancedprivacy.common.extensions.dpToPxF +import foundation.e.advancedprivacy.databinding.TrackersItemGraphBinding +import foundation.e.advancedprivacy.features.trackers.TrackersPeriodState +import kotlin.math.floor + +class GraphHolder(private val binding: TrackersItemGraphBinding) { + + companion object { + private const val x_axis_graduations_count_threshold = 24 + } + + private val context = binding.root.context + private val barChart = binding.graph + + private val periodMarker = PeriodMarkerView(context) + + private var data = emptyList>() + private var labels = emptyList() + private var graduations: List = emptyList() + private val isHalfGraduations: Boolean + get() = graduations.size > x_axis_graduations_count_threshold + + private var isHighlighted = false + + private val onChartValueSelectedListener = object : OnChartValueSelectedListener { + override fun onValueSelected(e: Entry?, h: Highlight?) { + h?.let { + val index = it.x.toInt() + if (index >= 0 && + index < labels.size && + index < data.size + ) { + val period = labels[index] + val (blocked, leaked) = data[index] + periodMarker.setLabel(period, blocked, leaked) + } + } + isHighlighted = true + } + + override fun onNothingSelected() { + isHighlighted = false + } + } + + private val xAxisRenderer = object : XAxisRenderer( + barChart.viewPortHandler, + barChart.xAxis, + barChart.getTransformer(AxisDependency.LEFT) + ) { + override fun renderAxisLine(c: Canvas) { + mAxisLinePaint.color = mXAxis.axisLineColor + mAxisLinePaint.strokeWidth = mXAxis.axisLineWidth + mAxisLinePaint.pathEffect = mXAxis.axisLineDashPathEffect + + // Bottom line + c.drawLine( + mViewPortHandler.contentLeft(), + mViewPortHandler.contentBottom() - 5.dpToPxF(context), + + mViewPortHandler.contentRight(), + mViewPortHandler.contentBottom() - 5.dpToPxF(context), + mAxisLinePaint + ) + } + + override fun renderGridLines(c: Canvas) { + if (!mXAxis.isDrawGridLinesEnabled || !mXAxis.isEnabled) return + val clipRestoreCount = c.save() + c.clipRect(gridClippingRect) + if (mRenderGridLinesBuffer.size != mAxis.mEntryCount * 2) { + mRenderGridLinesBuffer = FloatArray(mXAxis.mEntryCount * 2) + } + + val positions = mRenderGridLinesBuffer + mXAxis.mEntries.forEachIndexed { index, value -> + if ((index * 2 + 1) < positions.size) { + positions[index * 2] = value + positions[index * 2 + 1] = value + } + } + + mTrans.pointValuesToPixel(positions) + + val graduationPositions = positions.filterIndexed { index, _ -> index % 2 == 0 } + + setupGridPaint() + val gridLinePath = mRenderGridLinesPath + gridLinePath.reset() + + graduationPositions.forEachIndexed { i, x -> + + val graduationIndex = if (isHalfGraduations) 2 * i else i + val hasLabel = graduations.getOrNull(graduationIndex) != null + val bottomY = if (hasLabel) 0 else 3 + + gridLinePath.moveTo(x, mViewPortHandler.contentBottom() - 5.dpToPxF(context)) + gridLinePath.lineTo(x, mViewPortHandler.contentBottom() - bottomY.dpToPxF(context)) + + c.drawPath(gridLinePath, mGridPaint) + + gridLinePath.reset() + } + c.restoreToCount(clipRestoreCount) + } + } + + init { + with(barChart) { + description = null + setTouchEnabled(true) + setScaleEnabled(false) + + setDrawGridBackground(false) + setDrawBorders(false) + axisLeft.isEnabled = false + axisRight.isEnabled = false + + legend.isEnabled = false + + extraTopOffset = 40f + extraBottomOffset = 4f + + extraLeftOffset = 16f + extraRightOffset = 16f + + offsetTopAndBottom(0) + + minOffset = 0f + + offsetTopAndBottom(0) + + setDrawValueAboveBar(false) + + periodMarker.chartView = barChart + + marker = periodMarker + + setOnChartValueSelectedListener(onChartValueSelectedListener) + + setXAxisRenderer(xAxisRenderer) + } + } + + fun onBind(state: TrackersPeriodState) { + with(binding) { + title.text = context.getString(state.title) + val views = listOf( + helperText, + legendBlockedIcon, + legendBlocked, + legendAllowedIcon, + legendAllowed, + trackersDetected, + trackersAllowed + ) + + if (state.isEmptyCalls()) { + graph.visibility = View.INVISIBLE + graphEmpty.isVisible = true + views.forEach { it.isVisible = false } + } else { + graph.isVisible = true + graphEmpty.isVisible = false + views.forEach { it.isVisible = true } + trackersDetected.text = context.getString( + R.string.trackers_graph_detected_trackers, + state.trackersCount + ) + trackersAllowed.text = context.getString( + R.string.trackers_graph_allowed_trackers, + state.trackersAllowedCount + ) + + refreshDataSet(state) + } + } + } + + private fun refreshDataSet(state: TrackersPeriodState) { + data = state.callsBlockedNLeaked + labels = state.periods + graduations = state.graduations ?: emptyList() + + val trackersDataSet = BarDataSet( + data.mapIndexed { index, value -> + BarEntry( + index.toFloat(), + floatArrayOf(value.first.toFloat(), value.second.toFloat()) + ) + }, + "" + ) + + val blockedColor = ContextCompat.getColor(context, R.color.switch_track_on) + val leakedColor = ContextCompat.getColor(context, R.color.red_off) + + trackersDataSet.colors = listOf( + blockedColor, + leakedColor + ) + trackersDataSet.setDrawValues(false) + + barChart.data = BarData(trackersDataSet) + prepareYAxis() + prepareXAxis() + + barChart.invalidate() + } + + private fun prepareYAxis() { + val maxValue = data.maxOfOrNull { it.first + it.second } ?: 0 + + barChart.axisLeft.apply { + isEnabled = true + + setDrawGridLines(false) + setDrawLabels(true) + setCenterAxisLabels(false) + setLabelCount(2, true) + textColor = context.getColor(R.color.primary_text) + valueFormatter = object : ValueFormatter() { + override fun getAxisLabel(value: Float, axis: AxisBase?): String { + return if (value >= maxValue.toFloat()) maxValue.toString() else "" + } + } + } + } + + private val xAxisValueFormatter = object : ValueFormatter() { + override fun getAxisLabel(value: Float, axis: AxisBase?): String { + val index = floor(value).toInt() + 1 + return graduations.getOrNull(index) ?: "" + } + } + + private val halfGraduationsXAxisValueFormatter = object : ValueFormatter() { + override fun getAxisLabel(value: Float, axis: AxisBase?): String { + val index = floor(value).toInt() + 1 + return graduations.getOrNull(index) ?: graduations.getOrNull(index + 1) ?: "" + } + } + + private fun prepareXAxis() { + barChart.xAxis.apply { + isEnabled = true + position = XAxis.XAxisPosition.BOTTOM + + setDrawGridLines(true) + setDrawLabels(true) + setCenterAxisLabels(false) + textColor = context.getColor(R.color.primary_text) + + // setLabelCount can't have more than 25 labels. + if (isHalfGraduations) { + setLabelCount((graduations.size / 2) + 1, true) + valueFormatter = halfGraduationsXAxisValueFormatter + } else { + setLabelCount(graduations.size + 1, true) + valueFormatter = xAxisValueFormatter + } + } + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/graph/PeriodMarkerView.kt b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/graph/PeriodMarkerView.kt new file mode 100644 index 0000000..eb651be --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/graph/PeriodMarkerView.kt @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.features.trackers.graph + +import android.content.Context +import android.graphics.Canvas +import android.text.Spannable +import android.text.SpannableStringBuilder +import android.text.style.DynamicDrawableSpan +import android.text.style.ImageSpan +import android.view.View +import android.widget.TextView +import androidx.core.text.toSpannable +import androidx.core.view.isVisible +import com.github.mikephil.charting.components.MarkerView +import com.github.mikephil.charting.data.Entry +import com.github.mikephil.charting.highlight.Highlight +import com.github.mikephil.charting.utils.MPPointF +import foundation.e.advancedprivacy.R +import foundation.e.advancedprivacy.common.extensions.dpToPxF + +class PeriodMarkerView(context: Context) : MarkerView(context, R.layout.chart_tooltip) { + enum class ArrowPosition { LEFT, CENTER, RIGHT } + + private val arrowMargins = 10.dpToPxF(context) + private val mOffset2 = MPPointF(0f, 0f) + + private fun getArrowPosition(posX: Float): ArrowPosition { + val halfWidth = width / 2 + + return chartView?.let { chart -> + if (posX < halfWidth) { + ArrowPosition.LEFT + } else if (chart.width - posX < halfWidth) { + ArrowPosition.RIGHT + } else { + ArrowPosition.CENTER + } + } ?: ArrowPosition.CENTER + } + + private fun showArrow(position: ArrowPosition?) { + val ids = listOf( + R.id.arrow_bottom_left, + R.id.arrow_bottom_center, + R.id.arrow_bottom_right + ) + + val toShow = when (position) { + ArrowPosition.LEFT -> R.id.arrow_bottom_left + ArrowPosition.CENTER -> R.id.arrow_bottom_center + ArrowPosition.RIGHT -> R.id.arrow_bottom_right + else -> null + } + + ids.forEach { id -> + val showIt = id == toShow + findViewById(id)?.let { + if (it.isVisible != showIt) { + it.isVisible = showIt + } + } + } + } + + fun setLabel(period: String, blocked: Int, leaked: Int) { + val span = SpannableStringBuilder(period) + span.append(" | ") + span.setSpan( + ImageSpan(context, R.drawable.ic_legend_blocked, DynamicDrawableSpan.ALIGN_BASELINE), + span.length - 1, + span.length, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE + ) + span.append(" $blocked ") + span.setSpan( + ImageSpan(context, R.drawable.ic_legend_leaked, DynamicDrawableSpan.ALIGN_BASELINE), + span.length - 1, + span.length, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE + ) + span.append(" $leaked") + findViewById(R.id.label).text = span.toSpannable() + } + + override fun refreshContent(e: Entry?, highlight: Highlight?) { + highlight?.let { + showArrow(getArrowPosition(highlight.xPx)) + } + super.refreshContent(e, highlight) + } + + override fun getOffsetForDrawingAtPoint(posX: Float, posY: Float): MPPointF { + val x = when (getArrowPosition(posX)) { + ArrowPosition.LEFT -> -arrowMargins + ArrowPosition.RIGHT -> -width + arrowMargins + ArrowPosition.CENTER -> -width.toFloat() / 2 + } + + mOffset2.x = x + mOffset2.y = -posY + + return mOffset2 + } + + override fun draw(canvas: Canvas?, posX: Float, posY: Float) { + super.draw(canvas, posX, posY) + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/trackerdetails/TrackerAppsAdapter.kt b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/trackerdetails/TrackerAppsAdapter.kt new file mode 100644 index 0000000..46cf7d8 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/trackerdetails/TrackerAppsAdapter.kt @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2024 E FOUNDATION + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.features.trackers.trackerdetails + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import foundation.e.advancedprivacy.databinding.ApptrackersItemTrackerToggleBinding +import foundation.e.advancedprivacy.domain.entities.ToggleableApp + +class TrackerAppsAdapter( + private val viewModel: TrackerDetailsViewModel +) : RecyclerView.Adapter() { + + class ViewHolder( + private val binding: ApptrackersItemTrackerToggleBinding, + private val viewModel: TrackerDetailsViewModel + ) : RecyclerView.ViewHolder(binding.root) { + + fun bind(item: ToggleableApp) { + binding.title.text = item.app.label + binding.toggle.apply { + this.isChecked = item.isOn + setOnClickListener { + viewModel.onToggleUnblockApp(item.app, isChecked) + } + } + } + } + + private var dataSet: List = emptyList() + + fun updateDataSet(new: List) { + dataSet = new + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder( + ApptrackersItemTrackerToggleBinding.inflate(LayoutInflater.from(parent.context), parent, false), + viewModel + ) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(dataSet[position]) + } + + override fun getItemCount(): Int = dataSet.size +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/trackerdetails/TrackerDetailsFragment.kt b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/trackerdetails/TrackerDetailsFragment.kt new file mode 100644 index 0000000..863f93f --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/trackerdetails/TrackerDetailsFragment.kt @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2023-2024 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.features.trackers.trackerdetails + +import android.content.ActivityNotFoundException +import android.content.Intent +import android.os.Bundle +import android.view.View +import android.widget.Toast +import androidx.core.content.ContextCompat.getColor +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import androidx.navigation.fragment.navArgs +import androidx.recyclerview.widget.LinearLayoutManager +import com.google.android.material.divider.MaterialDividerItemDecoration +import com.google.android.material.snackbar.Snackbar +import foundation.e.advancedprivacy.R +import foundation.e.advancedprivacy.common.BigNumberFormatter +import foundation.e.advancedprivacy.common.NavToolbarFragment +import foundation.e.advancedprivacy.databinding.TrackerdetailsFragmentBinding +import foundation.e.advancedprivacy.features.trackers.setupDisclaimerBlock +import kotlinx.coroutines.launch +import org.koin.androidx.viewmodel.ext.android.viewModel +import org.koin.core.parameter.parametersOf + +class TrackerDetailsFragment : NavToolbarFragment(R.layout.trackerdetails_fragment) { + + private val args: TrackerDetailsFragmentArgs by navArgs() + private val viewModel: TrackerDetailsViewModel by viewModel { parametersOf(args.trackerId) } + private val numberFormatter: BigNumberFormatter by lazy { BigNumberFormatter(requireContext()) } + + private lateinit var binding: TrackerdetailsFragmentBinding + + override fun getTitle(): CharSequence { + return "" + } + + private fun displayToast(message: String) { + Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT) + .show() + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = TrackerdetailsFragmentBinding.bind(view) + + binding.blockAllToggle.setOnClickListener { + viewModel.onToggleBlockAll(binding.blockAllToggle.isChecked) + } + + binding.apps.apply { + layoutManager = LinearLayoutManager(requireContext()) + setHasFixedSize(true) + addItemDecoration( + MaterialDividerItemDecoration(requireContext(), LinearLayoutManager.VERTICAL).apply { + dividerColor = getColor(requireContext(), R.color.divider) + } + ) + adapter = TrackerAppsAdapter(viewModel) + } + + setupDisclaimerBlock(binding.disclaimerBlockTrackers.root, viewModel::onClickLearnMore) + + listenViewModel() + } + + private fun listenViewModel() { + with(viewLifecycleOwner) { + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.singleEvents.collect(::handleEvents) + } + } + + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.doOnStartedState() + } + } + + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + render(viewModel.state.value) + viewModel.state.collect(::render) + } + } + } + } + + private fun handleEvents(event: TrackerDetailsViewModel.SingleEvent) { + when (event) { + is TrackerDetailsViewModel.SingleEvent.ErrorEvent -> + displayToast(getString(event.errorResId)) + is TrackerDetailsViewModel.SingleEvent.ToastTrackersControlDisabled -> + Snackbar.make( + binding.root, + R.string.apptrackers_tracker_control_disabled_message, + Snackbar.LENGTH_LONG + ).show() + is TrackerDetailsViewModel.SingleEvent.OpenUrl -> { + try { + startActivity(Intent(Intent.ACTION_VIEW, event.url)) + } catch (e: ActivityNotFoundException) { + Toast.makeText( + requireContext(), + R.string.error_no_activity_view_url, + Toast.LENGTH_SHORT + ).show() + } + } + } + } + + private fun render(state: TrackerDetailsState) { + setTitle(state.tracker?.label) + binding.subtitle.text = getString(R.string.trackerdetails_subtitle, state.tracker?.label) + binding.dataAppCount.apply { + primaryMessage.setText(R.string.trackerdetails_app_count_primary) + number.text = state.detectedCount.toString() + secondaryMessage.setText(R.string.trackerdetails_app_count_secondary) + } + + binding.dataBlockedLeaks.apply { + primaryMessage.setText(R.string.trackerdetails_blocked_leaks_primary) + number.text = numberFormatter.format(state.blockedCount) + secondaryMessage.text = getString(R.string.trackerdetails_blocked_leaks_secondary, numberFormatter.format(state.leakedCount)) + } + + binding.blockAllToggle.isChecked = state.isBlockAllActivated + + binding.apps.post { + (binding.apps.adapter as TrackerAppsAdapter?)?.updateDataSet(state.appList) + } + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/trackerdetails/TrackerDetailsState.kt b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/trackerdetails/TrackerDetailsState.kt new file mode 100644 index 0000000..9c00200 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/trackerdetails/TrackerDetailsState.kt @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2024 E FOUNDATION + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.features.trackers.trackerdetails + +import foundation.e.advancedprivacy.domain.entities.ToggleableApp +import foundation.e.advancedprivacy.trackers.domain.entities.Tracker + +data class TrackerDetailsState( + val tracker: Tracker? = null, + val isBlockAllActivated: Boolean = false, + val detectedCount: Int = 0, + val blockedCount: Int = 0, + val leakedCount: Int = 0, + val appList: List = emptyList(), + val isTrackersBlockingEnabled: Boolean = false +) diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/trackerdetails/TrackerDetailsViewModel.kt b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/trackerdetails/TrackerDetailsViewModel.kt new file mode 100644 index 0000000..259869b --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/trackerdetails/TrackerDetailsViewModel.kt @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2024 E FOUNDATION + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.features.trackers.trackerdetails + +import android.net.Uri +import androidx.annotation.StringRes +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import foundation.e.advancedprivacy.domain.entities.DisplayableApp +import foundation.e.advancedprivacy.domain.entities.FeatureMode +import foundation.e.advancedprivacy.domain.usecases.GetQuickPrivacyStateUseCase +import foundation.e.advancedprivacy.domain.usecases.TrackerDetailsUseCase +import foundation.e.advancedprivacy.domain.usecases.TrackersStateUseCase +import foundation.e.advancedprivacy.domain.usecases.TrackersStatisticsUseCase +import foundation.e.advancedprivacy.features.trackers.URL_LEARN_MORE_ABOUT_TRACKERS +import foundation.e.advancedprivacy.trackers.domain.entities.Tracker +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.merge +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +class TrackerDetailsViewModel( + private val tracker: Tracker, + private val trackersStateUseCase: TrackersStateUseCase, + private val trackersStatisticsUseCase: TrackersStatisticsUseCase, + private val trackerDetailsUseCase: TrackerDetailsUseCase, + private val getQuickPrivacyStateUseCase: GetQuickPrivacyStateUseCase +) : ViewModel() { + private val _state = MutableStateFlow(TrackerDetailsState(tracker = tracker)) + val state = _state.asStateFlow() + + private val _singleEvents = MutableSharedFlow() + val singleEvents = _singleEvents.asSharedFlow() + + suspend fun doOnStartedState() = withContext(Dispatchers.IO) { + merge( + getQuickPrivacyStateUseCase.trackerMode.map { + _state.update { s -> s.copy(isTrackersBlockingEnabled = it != FeatureMode.VULNERABLE) } + }, + trackersStatisticsUseCase.listenUpdates().map { fetchStatistics() } + ).collect { } + } + + fun onToggleUnblockApp(app: DisplayableApp, isBlocked: Boolean) { + viewModelScope.launch(Dispatchers.IO) { + if (!state.value.isTrackersBlockingEnabled) { + _singleEvents.emit(SingleEvent.ToastTrackersControlDisabled) + } + + trackersStateUseCase.blockTracker(app, tracker, isBlocked) + updateWhitelist() + } + } + + fun onToggleBlockAll(isBlocked: Boolean) { + viewModelScope.launch(Dispatchers.IO) { + if (!state.value.isTrackersBlockingEnabled) { + _singleEvents.emit(SingleEvent.ToastTrackersControlDisabled) + } + trackerDetailsUseCase.toggleTrackerWhitelist( + tracker, + state.value.appList.map { it.app }, + isBlocked + ) + _state.update { + it.copy( + isBlockAllActivated = !trackersStateUseCase.isWhitelisted(tracker) + ) + } + updateWhitelist() + } + } + + fun onClickLearnMore() { + viewModelScope.launch { + _singleEvents.emit(SingleEvent.OpenUrl(Uri.parse(URL_LEARN_MORE_ABOUT_TRACKERS))) + } + } + + private suspend fun fetchStatistics() = withContext(Dispatchers.IO) { + val (blocked, leaked) = trackerDetailsUseCase.getCalls(tracker) + val appsWhitWhiteListState = trackerDetailsUseCase.getAppsWithBlockedState(tracker) + + _state.update { s -> + s.copy( + isBlockAllActivated = !trackersStateUseCase.isWhitelisted(tracker), + detectedCount = appsWhitWhiteListState.size, + blockedCount = blocked, + leakedCount = leaked, + appList = appsWhitWhiteListState + ) + } + } + + private suspend fun updateWhitelist() { + _state.update { s -> + s.copy( + isBlockAllActivated = !trackersStateUseCase.isWhitelisted(tracker), + appList = trackerDetailsUseCase.enrichWithBlockedState( + s.appList.map { it.app }, + tracker + ) + ) + } + } + + sealed class SingleEvent { + data class ErrorEvent(@StringRes val errorResId: Int) : SingleEvent() + object ToastTrackersControlDisabled : SingleEvent() + data class OpenUrl(val url: Uri) : SingleEvent() + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/main/MainActivity.kt b/app/src/main/java/foundation/e/advancedprivacy/main/MainActivity.kt new file mode 100644 index 0000000..fbe5cf8 --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/main/MainActivity.kt @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2023 MURENA SAS + * Copyright (C) 2021 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.main + +import android.content.Context +import android.content.Intent +import androidx.fragment.app.FragmentActivity +import androidx.navigation.NavDeepLinkBuilder +import androidx.navigation.findNavController +import foundation.e.advancedprivacy.R + +class MainActivity : FragmentActivity(R.layout.activity_main) { + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + findNavController(R.id.nav_host_fragment).handleDeepLink(intent) + } + + companion object { + fun deepLinkBuilder(context: Context) = NavDeepLinkBuilder(context) + .setGraph(R.navigation.nav_graph) + .setComponentName(MainActivity::class.java) + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/widget/Widget.kt b/app/src/main/java/foundation/e/advancedprivacy/widget/Widget.kt new file mode 100644 index 0000000..e9ed94f --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/widget/Widget.kt @@ -0,0 +1,147 @@ +/* + * Copyright (C) 2022 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy + +import android.appwidget.AppWidgetManager +import android.appwidget.AppWidgetProvider +import android.content.Context +import android.os.Bundle +import foundation.e.advancedprivacy.domain.usecases.GetQuickPrivacyStateUseCase +import foundation.e.advancedprivacy.domain.usecases.TrackersStatisticsUseCase +import foundation.e.advancedprivacy.widget.State +import foundation.e.advancedprivacy.widget.render +import foundation.e.advancedprivacy.widget.renderAll +import java.time.temporal.ChronoUnit +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.DelicateCoroutinesApi +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.FlowPreview +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.debounce +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.merge +import kotlinx.coroutines.flow.onStart +import kotlinx.coroutines.flow.sample +import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.launch + +/** + * Implementation of App Widget functionality. + */ +class Widget : AppWidgetProvider() { + + override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) { + appWidgetIds.forEach { id -> + render(context, state.value, appWidgetManager, id) + } + } + + override fun onEnabled(context: Context) { + // Enter relevant functionality for when the first widget is created + } + + override fun onDisabled(context: Context) { + // Enter relevant functionality for when the last widget is disabled + } + + companion object { + private var updateWidgetJob: Job? = null + + private var state: StateFlow = MutableStateFlow(State()) + + private const val DARK_TEXT_KEY = "foundation.e.blisslauncher.WIDGET_OPTION_DARK_TEXT" + var isDarkText = false + + @OptIn(FlowPreview::class) + private fun initState( + getPrivacyStateUseCase: GetQuickPrivacyStateUseCase, + trackersStatisticsUseCase: TrackersStatisticsUseCase, + coroutineScope: CoroutineScope + ): StateFlow { + return combine( + getPrivacyStateUseCase.trackerMode, + getPrivacyStateUseCase.locationMode, + getPrivacyStateUseCase.ipScramblingMode + ) { trackerMode, locationMode, ipScramblingMode -> + State( + trackerMode = trackerMode, + locationMode = locationMode, + ipScramblingMode = ipScramblingMode + ) + }.sample(50) + .combine( + merge( + trackersStatisticsUseCase.listenUpdates() + .onStart { emit(Unit) } + .debounce(5000), + flow { + while (true) { + emit(Unit) + delay(ChronoUnit.HOURS.duration.toMillis()) + } + } + + ) + ) { state, _ -> + state.copy( + blockedCallsCount = trackersStatisticsUseCase.getLastMonthBlockedLeaksCount(), + appsWithCallsCount = trackersStatisticsUseCase.getLastMonthAppsWithBlockedLeaksCount() + ) + }.stateIn( + scope = coroutineScope, + started = SharingStarted.Eagerly, + initialValue = State() + ) + } + + @OptIn(DelicateCoroutinesApi::class) + fun startListening( + appContext: Context, + getPrivacyStateUseCase: GetQuickPrivacyStateUseCase, + trackersStatisticsUseCase: TrackersStatisticsUseCase + ) { + state = initState( + getPrivacyStateUseCase, + trackersStatisticsUseCase, + GlobalScope + ) + + updateWidgetJob?.cancel() + updateWidgetJob = GlobalScope.launch(Dispatchers.Main) { + state.collect { + renderAll(appContext, it) + } + } + } + } + + override fun onAppWidgetOptionsChanged(context: Context, appWidgetManager: AppWidgetManager, appWidgetId: Int, newOptions: Bundle?) { + super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions) + if (newOptions != null) { + isDarkText = newOptions.getBoolean(DARK_TEXT_KEY) + } + + render(context, state.value, appWidgetManager, appWidgetId) + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/widget/WidgetCommandReceiver.kt b/app/src/main/java/foundation/e/advancedprivacy/widget/WidgetCommandReceiver.kt new file mode 100644 index 0000000..8c36d6e --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/widget/WidgetCommandReceiver.kt @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2022 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.widget + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import foundation.e.advancedprivacy.core.utils.goAsync +import foundation.e.advancedprivacy.domain.usecases.GetQuickPrivacyStateUseCase +import kotlinx.coroutines.CoroutineScope +import org.koin.java.KoinJavaComponent.get + +class WidgetCommandReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + val backgroundScope = get(CoroutineScope::class.java) + val getQuickPrivacyStateUseCase = get(GetQuickPrivacyStateUseCase::class.java) + + goAsync(backgroundScope) { + val featureEnabled = intent?.extras?.let { bundle -> + if (bundle.containsKey(PARAM_FEATURE_ENABLED)) { + bundle.getBoolean(PARAM_FEATURE_ENABLED) + } else { + null + } + } + + when (intent?.action) { + ACTION_TOGGLE_TRACKERS -> getQuickPrivacyStateUseCase.toggleTrackers(featureEnabled) + ACTION_TOGGLE_LOCATION -> getQuickPrivacyStateUseCase.toggleLocation(featureEnabled) + ACTION_TOGGLE_IPSCRAMBLING -> getQuickPrivacyStateUseCase.toggleIpScrambling(featureEnabled) + else -> {} + } + } + } + + companion object { + const val ACTION_TOGGLE_TRACKERS = "toggle_trackers" + const val ACTION_TOGGLE_LOCATION = "toggle_location" + const val ACTION_TOGGLE_IPSCRAMBLING = "toggle_ipscrambling" + const val PARAM_FEATURE_ENABLED = "param_feature_enabled" + } +} diff --git a/app/src/main/java/foundation/e/advancedprivacy/widget/WidgetUI.kt b/app/src/main/java/foundation/e/advancedprivacy/widget/WidgetUI.kt new file mode 100644 index 0000000..f07277f --- /dev/null +++ b/app/src/main/java/foundation/e/advancedprivacy/widget/WidgetUI.kt @@ -0,0 +1,273 @@ +/* + * Copyright (C) 2023-2024 MURENA SAS + * Copyright (C) 2022 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.widget + +import android.app.PendingIntent +import android.app.PendingIntent.FLAG_IMMUTABLE +import android.app.PendingIntent.FLAG_UPDATE_CURRENT +import android.appwidget.AppWidgetManager +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.graphics.drawable.Icon +import android.text.Spannable +import android.text.SpannableString +import android.text.style.ForegroundColorSpan +import android.view.View.GONE +import android.view.View.VISIBLE +import android.widget.RemoteViews +import androidx.annotation.StringRes +import foundation.e.advancedprivacy.R +import foundation.e.advancedprivacy.Widget +import foundation.e.advancedprivacy.Widget.Companion.isDarkText +import foundation.e.advancedprivacy.common.BigNumberFormatter +import foundation.e.advancedprivacy.domain.entities.FeatureMode +import foundation.e.advancedprivacy.domain.entities.FeatureState +import foundation.e.advancedprivacy.main.MainActivity +import foundation.e.advancedprivacy.widget.WidgetCommandReceiver.Companion.ACTION_TOGGLE_IPSCRAMBLING +import foundation.e.advancedprivacy.widget.WidgetCommandReceiver.Companion.ACTION_TOGGLE_LOCATION +import foundation.e.advancedprivacy.widget.WidgetCommandReceiver.Companion.ACTION_TOGGLE_TRACKERS +import foundation.e.advancedprivacy.widget.WidgetCommandReceiver.Companion.PARAM_FEATURE_ENABLED + +data class State( + val trackerMode: FeatureMode = FeatureMode.VULNERABLE, + val locationMode: FeatureMode = FeatureMode.VULNERABLE, + val ipScramblingMode: FeatureState = FeatureState.STOPPING, + val blockedCallsCount: Int = 0, + val appsWithCallsCount: Int = 0 +) + +fun renderAll(context: Context, state: State) { + val appWidgetManager = AppWidgetManager.getInstance(context) + appWidgetManager.getAppWidgetIds( + ComponentName(context, Widget::class.java) + ).forEach { id -> + render(context, state, appWidgetManager, id) + } +} + +fun render(context: Context, state: State, appWidgetManager: AppWidgetManager, widgetId: Int) { + val numberFormatter = BigNumberFormatter(context) + + val views = buildLayout(context, appWidgetManager, widgetId) + + applyDarkText(context, isDarkText, views) + + views.apply { + val openPIntent = PendingIntent.getActivity( + context, + REQUEST_CODE_DASHBOARD, + Intent(context, MainActivity::class.java), + FLAG_IMMUTABLE or FLAG_UPDATE_CURRENT + ) + setOnClickPendingIntent(R.id.settings_btn, openPIntent) + setOnClickPendingIntent(R.id.widget_container, openPIntent) + + val leaksLabel = context.getString(R.string.widget_data_blocked_trackers_secondary) + val countStr = numberFormatter.format(state.blockedCallsCount).toString() + if (shouldSplitLeaksCountInTwoLines(countStr, leaksLabel)) { + setTextViewText(R.id.data_blocked_trackers_number, countStr) + setTextViewText(R.id.data_blocked_trackers_secondary, leaksLabel) + setViewVisibility(R.id.data_blocked_trackers_number, VISIBLE) + } else { + setViewVisibility(R.id.data_blocked_trackers_number, GONE) + setTextViewText( + R.id.data_blocked_trackers_secondary, + buildDataSecondarySpan(context, isDarkText, countStr, R.string.widget_data_blocked_trackers_secondary) + ) + } + + setTextViewText( + R.id.data_apps_secondary, + buildDataSecondarySpan( + context, + isDarkText, + state.appsWithCallsCount.toString(), + R.string.widget_data_apps_secondary + ) + ) + + val trackersEnabled = state.trackerMode != FeatureMode.VULNERABLE + + setSwitchState(views, R.id.toggle_trackers, trackersEnabled) + + setOnClickPendingIntent( + R.id.trackers_control, + PendingIntent.getBroadcast( + context, + REQUEST_CODE_TOGGLE_TRACKERS, + Intent(context, WidgetCommandReceiver::class.java).apply { + action = ACTION_TOGGLE_TRACKERS + putExtra(PARAM_FEATURE_ENABLED, !trackersEnabled) + }, + FLAG_IMMUTABLE or FLAG_UPDATE_CURRENT + ) + ) + + val locationEnabled = state.locationMode != FeatureMode.VULNERABLE + setSwitchState(views, R.id.toggle_location, locationEnabled) + + setOnClickPendingIntent( + R.id.fake_location, + PendingIntent.getBroadcast( + context, + REQUEST_CODE_TOGGLE_LOCATION, + Intent(context, WidgetCommandReceiver::class.java).apply { + action = ACTION_TOGGLE_LOCATION + putExtra(PARAM_FEATURE_ENABLED, !locationEnabled) + }, + FLAG_IMMUTABLE or FLAG_UPDATE_CURRENT + ) + ) + + setSwitchState(views, R.id.toggle_ipscrambling, state.ipScramblingMode.isChecked) + + setOnClickPendingIntent( + R.id.ipscrambling, + PendingIntent.getBroadcast( + context, + REQUEST_CODE_TOGGLE_IPSCRAMBLING, + Intent(context, WidgetCommandReceiver::class.java).apply { + action = ACTION_TOGGLE_IPSCRAMBLING + putExtra(PARAM_FEATURE_ENABLED, !state.ipScramblingMode.isChecked) + }, + FLAG_IMMUTABLE or FLAG_UPDATE_CURRENT + ) + ) + } + + appWidgetManager.updateAppWidget(widgetId, views) +} + +private const val REQUEST_CODE_DASHBOARD = 1 +private const val REQUEST_CODE_TOGGLE_TRACKERS = 4 +private const val REQUEST_CODE_TOGGLE_LOCATION = 5 +private const val REQUEST_CODE_TOGGLE_IPSCRAMBLING = 6 + +private const val NARROW_MAXWIDTH_DP_BREAKPOINT = 240 + +private const val DATA_BLOCKED_TWO_LINES_THRESHOLD_DIGITS = 3 +private const val DATA_BLOCKED_TWO_LINES_THRESHOLD_LABEL = 14 + +private fun buildLayout(context: Context, appWidgetManager: AppWidgetManager, widgetId: Int): RemoteViews { + val width = appWidgetManager.getAppWidgetOptions(widgetId) + .getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH) + + return RemoteViews( + context.packageName, + when (width) { + in 1..NARROW_MAXWIDTH_DP_BREAKPOINT -> + R.layout.widget_narrow + else -> R.layout.widget_large + } + ) +} + +private fun applyDarkText(context: Context, isDarkText: Boolean, views: RemoteViews) { + views.apply { + // FFFFFF %87 + val primaryColor = context.getColor( + if (isDarkText) { + R.color.on_surface_medium_emphasis_light + } else { + R.color.on_surface_high_emphasis + } + ) + + listOf( + R.id.widget_title, + R.id.data_blocked_trackers_primary, + R.id.data_blocked_trackers_number, + R.id.data_apps_primary, + R.id.trackers_control_label, + R.id.fake_location_label, + R.id.ipscrambling_label + ).forEach { + setTextColor(it, primaryColor) + } + + listOf( + R.id.settings_btn to R.drawable.ic_settings, + R.id.data_blocked_trackers_icon to R.drawable.ic_block_24, + R.id.data_apps_icon to R.drawable.ic_apps_24 + ).forEach { (viewId, drawableId) -> + setImageViewIcon( + viewId, + Icon.createWithResource(context, drawableId).apply { setTint(primaryColor) } + ) + } + + // FFFFFF %60 + val secondaryColor = context.getColor(if (isDarkText) R.color.on_surface_disabled_light else R.color.on_primary_medium_emphasis) + + listOf( + R.id.period_label, + R.id.data_blocked_trackers_secondary + ).forEach { id -> + setTextColor(id, secondaryColor) + } + } +} + +private fun shouldSplitLeaksCountInTwoLines(countStr: String, leaksLabel: String): Boolean { + return countStr.length > DATA_BLOCKED_TWO_LINES_THRESHOLD_DIGITS && + (countStr.length + leaksLabel.length) > DATA_BLOCKED_TWO_LINES_THRESHOLD_LABEL +} + +private fun buildDataSecondarySpan(context: Context, isDarkText: Boolean, countStr: String, @StringRes secondaryRes: Int): CharSequence { + val primaryColor = context.getColor( + if (isDarkText) { + R.color.on_surface_medium_emphasis_light + } else { + R.color.on_surface_high_emphasis + } + ) + + val secondaryColor = context.getColor(if (isDarkText) R.color.on_surface_disabled_light else R.color.on_primary_medium_emphasis) + + val secondary = context.getString(secondaryRes) + + val spannable = SpannableString("$countStr $secondary") + + spannable.setSpan( + ForegroundColorSpan(primaryColor), + 0, + countStr.length, + Spannable.SPAN_INCLUSIVE_EXCLUSIVE + ) + + spannable.setSpan( + ForegroundColorSpan(secondaryColor), + countStr.length, + spannable.length, + Spannable.SPAN_INCLUSIVE_EXCLUSIVE + ) + return spannable +} + +private fun setSwitchState(views: RemoteViews, switchId: Int, checked: Boolean) { + views.setImageViewResource( + switchId, + if (checked) { + R.drawable.ic_switch_enabled_raster + } else { + R.drawable.ic_switch_disabled_raster + } + ) +} diff --git a/app/src/main/res/color/chip_background.xml b/app/src/main/res/color/chip_background.xml new file mode 100644 index 0000000..c7f8c8a --- /dev/null +++ b/app/src/main/res/color/chip_background.xml @@ -0,0 +1,22 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/chip_text.xml b/app/src/main/res/color/chip_text.xml new file mode 100644 index 0000000..1de4d22 --- /dev/null +++ b/app/src/main/res/color/chip_text.xml @@ -0,0 +1,22 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_outlined.xml b/app/src/main/res/drawable/bg_outlined.xml new file mode 100644 index 0000000..d33886a --- /dev/null +++ b/app/src/main/res/drawable/bg_outlined.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/app/src/main/res/drawable/bg_rounded_19.xml b/app/src/main/res/drawable/bg_rounded_19.xml new file mode 100644 index 0000000..fb2a784 --- /dev/null +++ b/app/src/main/res/drawable/bg_rounded_19.xml @@ -0,0 +1,23 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/bg_stroke_rounded_12.xml b/app/src/main/res/drawable/bg_stroke_rounded_12.xml new file mode 100644 index 0000000..d9c839c --- /dev/null +++ b/app/src/main/res/drawable/bg_stroke_rounded_12.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_stroke_rounded_8.xml b/app/src/main/res/drawable/bg_stroke_rounded_8.xml new file mode 100644 index 0000000..488961c --- /dev/null +++ b/app/src/main/res/drawable/bg_stroke_rounded_8.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_tag.xml b/app/src/main/res/drawable/bg_tag.xml new file mode 100644 index 0000000..018c0eb --- /dev/null +++ b/app/src/main/res/drawable/bg_tag.xml @@ -0,0 +1,22 @@ + + + + + + diff --git a/app/src/main/res/drawable/bg_widget.xml b/app/src/main/res/drawable/bg_widget.xml new file mode 100644 index 0000000..b0d91de --- /dev/null +++ b/app/src/main/res/drawable/bg_widget.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_apps_24.xml b/app/src/main/res/drawable/ic_apps_24.xml new file mode 100644 index 0000000..7e20536 --- /dev/null +++ b/app/src/main/res/drawable/ic_apps_24.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_apps_compatibility_components.xml b/app/src/main/res/drawable/ic_apps_compatibility_components.xml new file mode 100644 index 0000000..6ca9cec --- /dev/null +++ b/app/src/main/res/drawable/ic_apps_compatibility_components.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_block_24.xml b/app/src/main/res/drawable/ic_block_24.xml new file mode 100644 index 0000000..77537b3 --- /dev/null +++ b/app/src/main/res/drawable/ic_block_24.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_chevron_right_24dp.xml b/app/src/main/res/drawable/ic_chevron_right_24dp.xml new file mode 100644 index 0000000..28f1352 --- /dev/null +++ b/app/src/main/res/drawable/ic_chevron_right_24dp.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_close.xml b/app/src/main/res/drawable/ic_close.xml new file mode 100644 index 0000000..e9ad3c6 --- /dev/null +++ b/app/src/main/res/drawable/ic_close.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_e_app_logo.xml b/app/src/main/res/drawable/ic_e_app_logo.xml new file mode 100644 index 0000000..4a88b02 --- /dev/null +++ b/app/src/main/res/drawable/ic_e_app_logo.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_fmd_bad.xml b/app/src/main/res/drawable/ic_fmd_bad.xml new file mode 100644 index 0000000..beeff35 --- /dev/null +++ b/app/src/main/res/drawable/ic_fmd_bad.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_info_16dp.xml b/app/src/main/res/drawable/ic_info_16dp.xml new file mode 100644 index 0000000..063fb73 --- /dev/null +++ b/app/src/main/res/drawable/ic_info_16dp.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/drawable/ic_language.xml b/app/src/main/res/drawable/ic_language.xml new file mode 100644 index 0000000..ae37ec0 --- /dev/null +++ b/app/src/main/res/drawable/ic_language.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_launcher.xml b/app/src/main/res/drawable/ic_launcher.xml new file mode 100644 index 0000000..d372a4f --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..e009ebe --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..a97518b --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_legend_blocked.xml b/app/src/main/res/drawable/ic_legend_blocked.xml new file mode 100644 index 0000000..9a146a8 --- /dev/null +++ b/app/src/main/res/drawable/ic_legend_blocked.xml @@ -0,0 +1,22 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_legend_leaked.xml b/app/src/main/res/drawable/ic_legend_leaked.xml new file mode 100644 index 0000000..a96501f --- /dev/null +++ b/app/src/main/res/drawable/ic_legend_leaked.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_notification_logo.xml b/app/src/main/res/drawable/ic_notification_logo.xml new file mode 100644 index 0000000..a8ec9c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_notification_logo.xml @@ -0,0 +1,33 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..e68deb7 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_shield_alert.xml b/app/src/main/res/drawable/ic_shield_alert.xml new file mode 100644 index 0000000..9c20541 --- /dev/null +++ b/app/src/main/res/drawable/ic_shield_alert.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_switch_disabled_raster.png b/app/src/main/res/drawable/ic_switch_disabled_raster.png new file mode 100644 index 0000000000000000000000000000000000000000..d07fc453ff8c289df60affc625ef3e8ae7ea1a17 GIT binary patch literal 4651 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 jD5giJCfkIm`$H00000NkvXXu0mjfo;J6> literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_valid.xml b/app/src/main/res/drawable/ic_valid.xml new file mode 100644 index 0000000..e81474e --- /dev/null +++ b/app/src/main/res/drawable/ic_valid.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/part_square.xml b/app/src/main/res/drawable/part_square.xml new file mode 100644 index 0000000..6b1ae23 --- /dev/null +++ b/app/src/main/res/drawable/part_square.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/part_triangle.xml b/app/src/main/res/drawable/part_triangle.xml new file mode 100644 index 0000000..f835c44 --- /dev/null +++ b/app/src/main/res/drawable/part_triangle.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/pill_shape_tab_bg.xml b/app/src/main/res/drawable/pill_shape_tab_bg.xml new file mode 100644 index 0000000..5ef1de5 --- /dev/null +++ b/app/src/main/res/drawable/pill_shape_tab_bg.xml @@ -0,0 +1,22 @@ + + + + + + diff --git a/app/src/main/res/drawable/pill_shape_tab_indicator.xml b/app/src/main/res/drawable/pill_shape_tab_indicator.xml new file mode 100644 index 0000000..344a049 --- /dev/null +++ b/app/src/main/res/drawable/pill_shape_tab_indicator.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/pill_shape_tab_selected.xml b/app/src/main/res/drawable/pill_shape_tab_selected.xml new file mode 100644 index 0000000..520d985 --- /dev/null +++ b/app/src/main/res/drawable/pill_shape_tab_selected.xml @@ -0,0 +1,22 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/widget_large_preview.xml b/app/src/main/res/drawable/widget_large_preview.xml new file mode 100644 index 0000000..2242397 --- /dev/null +++ b/app/src/main/res/drawable/widget_large_preview.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..a5816f4 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,27 @@ + + diff --git a/app/src/main/res/layout/alertdialog_do_not_show_again.xml b/app/src/main/res/layout/alertdialog_do_not_show_again.xml new file mode 100644 index 0000000..1b60843 --- /dev/null +++ b/app/src/main/res/layout/alertdialog_do_not_show_again.xml @@ -0,0 +1,32 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/apptrackers_fragment.xml b/app/src/main/res/layout/apptrackers_fragment.xml new file mode 100644 index 0000000..06b8d3f --- /dev/null +++ b/app/src/main/res/layout/apptrackers_fragment.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/apptrackers_item_tracker_toggle.xml b/app/src/main/res/layout/apptrackers_item_tracker_toggle.xml new file mode 100644 index 0000000..753e734 --- /dev/null +++ b/app/src/main/res/layout/apptrackers_item_tracker_toggle.xml @@ -0,0 +1,45 @@ + + + + + + diff --git a/app/src/main/res/layout/chart_tooltip.xml b/app/src/main/res/layout/chart_tooltip.xml new file mode 100644 index 0000000..6fabd50 --- /dev/null +++ b/app/src/main/res/layout/chart_tooltip.xml @@ -0,0 +1,66 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dashboard_item_submenu_button.xml b/app/src/main/res/layout/dashboard_item_submenu_button.xml new file mode 100644 index 0000000..b826d05 --- /dev/null +++ b/app/src/main/res/layout/dashboard_item_submenu_button.xml @@ -0,0 +1,107 @@ + + + + + + + + + + diff --git a/app/src/main/res/layout/dashboard_shame_list.xml b/app/src/main/res/layout/dashboard_shame_list.xml new file mode 100644 index 0000000..51c2814 --- /dev/null +++ b/app/src/main/res/layout/dashboard_shame_list.xml @@ -0,0 +1,46 @@ + + + + + + + + diff --git a/app/src/main/res/layout/disclaimer_block_trackers.xml b/app/src/main/res/layout/disclaimer_block_trackers.xml new file mode 100644 index 0000000..5d58c5f --- /dev/null +++ b/app/src/main/res/layout/disclaimer_block_trackers.xml @@ -0,0 +1,33 @@ + + + + diff --git a/app/src/main/res/layout/fragment_dashboard.xml b/app/src/main/res/layout/fragment_dashboard.xml new file mode 100644 index 0000000..9dfc66e --- /dev/null +++ b/app/src/main/res/layout/fragment_dashboard.xml @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_fake_location.xml b/app/src/main/res/layout/fragment_fake_location.xml new file mode 100644 index 0000000..4309f13 --- /dev/null +++ b/app/src/main/res/layout/fragment_fake_location.xml @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_internet_activity_policy.xml b/app/src/main/res/layout/fragment_internet_activity_policy.xml new file mode 100644 index 0000000..12b51fb --- /dev/null +++ b/app/src/main/res/layout/fragment_internet_activity_policy.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_trackers.xml b/app/src/main/res/layout/fragment_trackers.xml new file mode 100644 index 0000000..89f6d4e --- /dev/null +++ b/app/src/main/res/layout/fragment_trackers.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/highlight_data_number.xml b/app/src/main/res/layout/highlight_data_number.xml new file mode 100644 index 0000000..4bb4563 --- /dev/null +++ b/app/src/main/res/layout/highlight_data_number.xml @@ -0,0 +1,61 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/ipscrambling_item_selectmode.xml b/app/src/main/res/layout/ipscrambling_item_selectmode.xml new file mode 100644 index 0000000..0ce0cc4 --- /dev/null +++ b/app/src/main/res/layout/ipscrambling_item_selectmode.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_app_toggle.xml b/app/src/main/res/layout/item_app_toggle.xml new file mode 100644 index 0000000..62d7ded --- /dev/null +++ b/app/src/main/res/layout/item_app_toggle.xml @@ -0,0 +1,37 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/topbar.xml b/app/src/main/res/layout/topbar.xml new file mode 100644 index 0000000..41f034e --- /dev/null +++ b/app/src/main/res/layout/topbar.xml @@ -0,0 +1,37 @@ + + + + + + + + diff --git a/app/src/main/res/layout/trackerdetails_fragment.xml b/app/src/main/res/layout/trackerdetails_fragment.xml new file mode 100644 index 0000000..45ba0e4 --- /dev/null +++ b/app/src/main/res/layout/trackerdetails_fragment.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/trackers_apps_list.xml b/app/src/main/res/layout/trackers_apps_list.xml new file mode 100644 index 0000000..63f4b24 --- /dev/null +++ b/app/src/main/res/layout/trackers_apps_list.xml @@ -0,0 +1,47 @@ + + + + + + + diff --git a/app/src/main/res/layout/trackers_item_app.xml b/app/src/main/res/layout/trackers_item_app.xml new file mode 100644 index 0000000..e44e531 --- /dev/null +++ b/app/src/main/res/layout/trackers_item_app.xml @@ -0,0 +1,84 @@ + + + + + + + + + + diff --git a/app/src/main/res/layout/trackers_item_graph.xml b/app/src/main/res/layout/trackers_item_graph.xml new file mode 100644 index 0000000..e6f2d1a --- /dev/null +++ b/app/src/main/res/layout/trackers_item_graph.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/trackers_list.xml b/app/src/main/res/layout/trackers_list.xml new file mode 100644 index 0000000..3191b91 --- /dev/null +++ b/app/src/main/res/layout/trackers_list.xml @@ -0,0 +1,24 @@ + + + + diff --git a/app/src/main/res/layout/trackers_period_fragment.xml b/app/src/main/res/layout/trackers_period_fragment.xml new file mode 100644 index 0000000..93647e6 --- /dev/null +++ b/app/src/main/res/layout/trackers_period_fragment.xml @@ -0,0 +1,61 @@ + + + + + + + + + + diff --git a/app/src/main/res/layout/widget_large.xml b/app/src/main/res/layout/widget_large.xml new file mode 100644 index 0000000..b836eac --- /dev/null +++ b/app/src/main/res/layout/widget_large.xml @@ -0,0 +1,267 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/widget_narrow.xml b/app/src/main/res/layout/widget_narrow.xml new file mode 100644 index 0000000..e354167 --- /dev/null +++ b/app/src/main/res/layout/widget_narrow.xml @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..c4a603d --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..c4a603d --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_e_app_logo.webp b/app/src/main/res/mipmap-hdpi/ic_e_app_logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..17d916931cf26095efa8348f1a713725f53849ef GIT binary patch literal 11726 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..02d2d781714085241ccfd5568c45b377e1e59d59 GIT binary patch literal 4538 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 YEFgf|5YTMB&{)`TBXR@s-$msI03!3-*8l(j literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..b45f54fe6077eb20cb7514d1aca533e2537cc97c GIT binary patch literal 5080 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..0ff33010e5c31e475af4e21898669b675091634e GIT binary patch literal 6652 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%0DZ#l+>n<$t8HUNWw0s#O8 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 z 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_e_app_logo.webp b/app/src/main/res/mipmap-xhdpi/ic_e_app_logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..8976bbc1533e9c54289bb0e258cd1b975a8e653f GIT binary patch literal 19000 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..8901f1fc3447998e68f7e400d44998ffed286a08 GIT binary patch literal 6308 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 t^whaO~E8`|wmq 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..fb4eb00456c915203ab538114464ed634b124b47 GIT binary patch literal 11798 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_e_app_logo.webp b/app/src/main/res/mipmap-xxxhdpi/ic_e_app_logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..7a8ec68edfab0de2181eaf2e55c82b7a960ab3dd GIT binary patch literal 60572 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%0DN5Sl9rG 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 z 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 KIiOg*w*vt=YDoS7 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..b8bf9a065c8a38dfce86a92793e27d2ac096bae3 GIT binary patch literal 17314 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

    g&d z%H^gPLp~oGjq*JATQo{r5B<8M#;`^qG)QJ=f4tibp(aeAPX3+G^ZYGlR>!eF%U2EZ z)4bXdFB(MTf}!hV8!7|krWZp5B>s9*DPZ7^+BPbJYzo-}j!DjEJ+R2i9|VOz5aWNf-Vta_?2?hV83^2GM+y*&ur!+Cec`oJv3%eAyhAfiy*)z213K5kZbMOyKp4hhhh_!V#h^eqf>nF@4U+m D2%3IE literal 0 HcmV?d00001 diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml new file mode 100644 index 0000000..39abf09 --- /dev/null +++ b/app/src/main/res/navigation/nav_graph.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml new file mode 100644 index 0000000..bbb3585 --- /dev/null +++ b/app/src/main/res/values-de/strings.xml @@ -0,0 +1,155 @@ + + + Dein Online-Datenschutz ist nicht gewährleistet + Tracker (Verfolger) + Verletzlich + Abgelehnt + Standort + Geschützt + Echte IP-Adresse + Verschleiert + Nutzerdaten-Lecks: + Heute + %s Tracker haben dich in den letzten 24 Stunden aufgezeichnet + App-Tracker verwalten + %1$d aufgedeckte Tracker, %2$d erlaubte Tracker + App-Berechtigungen verwalten + Meine Berechtigungen verwalten + Standort + Echter Standort + Bestimmter gefälschter Standort + Zufälliger gefälschter Standort + Meine IP-Adresse verwalten + Echte IP-Adresse verschleiert + Meine IP-Adresse verwalten + Dein Online-Datenschutz ist gewährleistet + Echte IP-Adresse ungeschützt + Ungeschützt + Ungeschützt + Benutze meine echte IP-Adresse + Ich kann über meine IP-Adresse verfolgt werden + Verschleiere meine echte IP-Adresse + Ich bin anonym im Internet + Bemerkung: Wenn diese Option aktiviert ist, kann das Internet spürbar langsamer sein. + Unser IP-Verschlüsselungsdienst benötigt Zeit zum Starten. Das kann einige Minuten dauern. Der Bildschirm kann verlassen werden, ohne dass der Prozess unterbrochen wird. + Meinen echten Standort benutzen + Einen zufälligen, aber möglichen Standort benutzen + Einen benutzerdefinierten Standort benutzen + Längengrad + Breitengrad + Ungültige Koordinaten + App-Tracker verwalten + Meinen Standort verwalten + Dein Standort kann sehr viel über dich und deine Aktivitäten verraten. +\n +\n„Meinen Standort verwalten“ ermöglicht dir, einen gefälschten Standort anstatt deines echten Aufenthaltsortes zu benutzen. Auf diese Weise wird dein echter Standort nicht mit Apps geteilt, die zu sehr herumspionieren. + Zufälliges Land + Wende diese Einstellungen auf alle ausgewählten Anwendungen an * : + System + Tracker (Verfolger) sind kleine Programme, die in Anwendungen eingebaut werden. Sie sammeln deine Daten und verfolgen andauernd deine Aktivität. Untenstehend kannst du sehen, welche Tracker auf deinem Gerät aktiv sind. + Tag + Monat + Jahr + HH:mm + d\'.\' MMMM EEE + MMMM yyyy + dd/MM + MMM + Tracker-Kontrolle anschalten + Es wurden noch keine Tracker gefunden. Sobald welche entdeckt werden, wird das hier aktualisiert. + Es wurden noch keine Tracker entdeckt. Alle zukünftigen Tracker werden blockiert. + Meine Internetaktivität soll erscheinen von: + Deine Internetadresse oder IP-Adresse ist die Kennung deines Telefons, wenn es mit dem Internet verbunden ist. +\n +\n„Meine IP-Adresse verwalten“ ermöglicht dir, eine gefälschte IP-Adresse anstatt deiner echten IP-Adresse zu benutzen. Auf diese Weise kann deine Internetaktivität nicht mit deiner echten IP-Adresse und deinem Telefon verknüpft werden. + Glückwunsch! Es wird kein Profil über dich von Trackern erstellt. + Entdecke Advanced Privacy + Tippe, um herauszufinden, wie Tracker einfach blockiert, dein Standort gefälscht und deine IP-Adresse verschleiert werden kann. + Benutzerdefinierte Datenschutz-Einstellungen werden angewendet + Ansicht + Nur Apps mit Internet-Berechtigung sind aufgeführt. + Benutzerdefiniert + Bitte deaktiviere die Drittanbieter-VPN %s, damit Advanced Privacy deine echte IP-Adresse verschleiern kann. + Die Veränderungen werden angewendet, wenn der Tracker-Blockierer aktiviert ist. + Ich habe verstanden + Diese Option benutzt das TOR-Netzwerk, um deine echte IP-Adresse zu verschleiern. Benutze dies nur für bestimme Anwendungen. Beim Verschleiern einer IP wird die Internetgeschwindigkeit stark beeinträchtigt. +\nBitte beachten: wir empfehlen, diese Option nicht für E-Maildienste zu aktivieren, da deine E-Mail-Adresse von deinem Dienstanbieter permanent verbannt werden könnte. + Meine IP-Adresse verstecken + Wenn diese Option aktiviert wird, ist es möglich, dass einige Apps, die auf Standortbestimmung angewiesen sind, nicht ordnungsgemäß funktionieren. Es wird deshalb empfohlen, diese Option nur zeitweise zu benutzten, wenn sie gebraucht wird. + Wenn diese Option aktiviert wird, ist es möglich, dass einige Apps nicht ordnungsgemäß funktionieren. Falls Probleme auftreten, kann die Tracker-Sperrung für bestimmte Apps oder Webseiten deaktiviert werden. + Meinen Standort täuschen + App-Tracker verwalten + Tracker-Verwaltung + Nicht mehr anzeigen + OK + Hervorheben, dass der Standort zurzeit von Advanced Privacy verschleiert wird + Das kann Auswirkungen auf die Funktion einiger Apps haben. + Echte IP versteckt + Hervorheben, dass die IP zurzeit von Advanced Privacy versteckt wird + Meine IP verstecken-Kennzeichen + Alle Apps, die deinen Standort benutzen, inklusive der Navigationsapp, benutzen den vorgetäuschten Standort. + Standort täuschen ist aktiviert + Standort-Kennzeichen vortäuschen + Erster Start + Mehr erfahren + Keine App, um Webseiten anzusehen + Kompatibilität mit Apps + Tracker zurücksetzen + Es wurden keine Tracker entdeckt. Einige Tracker wurden im Vorfeld erlaubt. + Zeigt an, dass die Tracker/Verfolger zurzeit von Advanced Privacy aufgezeichnet und blockiert werden + Tracker-Kontrolle ist angeschaltet + Das könnte die Funktion einiger Apps beeinträchtigen. + Apps + %s Tracking-Übersicht + Gesperrte Datenlecks + %s erlaubte Datenlecks + Tracker verwalten + %s Tracker entdeckt + Insgesamt + %s erlaubte Datenlecks + in %s Apps entdeckt + Entdeckt in + Bemerkung: + Schalte die Tracker aus, die du zulassen möchtest: + %s Tracker-Übersicht + Schalte die Apps um, für die du diesen Tracker erlauben willst: + Tracker-Kontrolle Warnung + Blockierte Datenlecks + Mehr erfahren. + Entdeckte Tracker + Verschiedene Apps + In einigen wenigen Fällen kann das Sperren von Trackern zur Fehlfunktion der App führen. Du kannst genau definieren, welche Tracker gesperrt werden sollen. + Tracker + Diesen Tracker in allen Apps sperren + Übersicht der Tracker-Aktivität + Tracker + Blockiert + Erlaubte Datenlecks + Blockierte Datenlecks + Datenlecks in den letzten 30 Tagen + %d erlaubt + Datenlecks in den letzten 12 Monaten + Tippe für mehr Info + %d aufgespürte Tracker + Datenlecks in den letzten 24 Stunden + Apps mit Tracker + Von + Apps + Letzte 30 Tage + Statistiken ansehen + Standort vortäuschen + Blockiert + Echte IP-Adresse + App-Tracker + IP-Adresse verstecken + Deine Datenschutz-Einstellungen + App-Tracker blockieren + Datenlecks + %s Datenlecks entdeckt + Alle Apps ansehen + hat %s Datenlecks verursacht + Alle Tracker ansehen + Schandmauer + Nur Apps mit Standort-Berechtigung werden angezeigt. + Apps zurücksetzen + \ No newline at end of file diff --git a/app/src/main/res/values-en-rUS/strings.xml b/app/src/main/res/values-en-rUS/strings.xml new file mode 100644 index 0000000..152bb92 --- /dev/null +++ b/app/src/main/res/values-en-rUS/strings.xml @@ -0,0 +1,25 @@ + + + + HH:mm + MMMM d - EEE + MMMM yyyy + + MM/dd + MMM + \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml new file mode 100644 index 0000000..86ed812 --- /dev/null +++ b/app/src/main/res/values-es/strings.xml @@ -0,0 +1,155 @@ + + + Vulnerable + Rechazado + Expuesto + Protegido + Expuesta + Oculta + Administra permisos de aplicaciones + Administrar mi dirección de Internet + Usar mi dirección IP real + Puedo ser rastreado por mi dirección IP + Ocultar mi dirección IP real + Estoy anónimo en Internet + Mi actividad en internet debe aparecer desde: + País al azar + Aplicar esta configuración a todas las aplicaciones seleccionadas * : + Administrar mi ubicación + Usar mi ubicación real + Usar una ubicación aceptable al azar + Usar una ubicación específica + Longitud + Latitud + Coordenadas inválidas + Administrar rastreadores de aplicaciones + Dia + Mes + Año + HH:mm + EEE d MMMM + MMMM yyyy + dd/MM + MMM + Activar control de rastreadores + No se han detectado rastreadores. Si se detectan nuevos rastreadores, se actualizarán aquí. + No se han detectado rastreadores. Futuros rastreadores serán bloqueados. + Ubicación + Nuestro servicio de codificación de IP está tardando en iniciarse. Puede tardar unos minutos. Salir de la pantalla no interrumpirá el proceso. + Tu dirección de Internet o dirección IP es el identificador asignado a tu teléfono cuando estás conectado al Internet. +\n +\n\"Administrar mi dirección de Internet\" te permite utilizar una dirección IP alternativa en lugar de tu dirección IP real. De este modo, tu actividad en Internet no puede asociarse a tu dirección IP real ni a tu dispositivo. + Tu ubicación puede revelar mucho sobre ti o tus actividades. +\n +\n\"Administrar mi ubicación\" te permite utilizar una ubicación alternativa en lugar de tu posición real. De este modo, tu ubicación real no se comparte con aplicaciones que curiosean demasiado. + Los rastreadores son fragmentos de código ocultos en las aplicaciones. Estos recopilan tus datos y tus actividades 24/7. Ve todas las aplicaciones que rastrean la actividad de tu dispositivo. + Nota: Mientras esta opción esté activa, puede que tu velocidad de Internet se reduzca considerablemente. + Sistema + Esto podría afectar el funcionamiento de algunas aplicaciones. + IP real oculta + Resaltar que la IP está oculta por Advanced Privacy + Todas las aplicaciones que usan tu ubicación, incluida la navegación, están usando la ubicación alternativa. + Ubicación alternativa activada + Descubre Privacidad avanzada + Resaltar que la ubicación ha sido cambiada por Privacidad avanzada + Indicador de ubicación alternativa + Pulsa aquí para descubrir cómo bloquear rastreadores, cambiar tu ubicación GPS y ocultar tu dirección IP fácilmente. + Primer arranque + Entiendo + Esta opción utiliza la red TOR para ocultar tu dirección IP real. Utilízala sólo para aplicaciones específicas. Mientras uses una IP alternativa, es probable que tu velocidad de Internet sea reducida. +\nImportante: te aconsejamos que desactives esta función para los servicios de correo electrónico, ya que tu dirección podría ser bloqueada permanentemente por tu proveedor. + Ocultar mi IP + Mientras esta opción está activa, es posible que algunas aplicaciones que dependen de tu ubicación real no funcionen correctamente. Se recomienda activarla sólo ocasionalmente o cuando sea necesario. + Cambiar mi ubicación + Administrar rastreadores de aplicaciones + Mientras esta opción esté activa, en casos raros, algunas aplicaciones no funcionarán correctamente. Si tienes algún problema, puedes desactivar el control de rastreadores para determinadas aplicaciones y sitios web en cualquier momento. + Control de rastreadores + No volver a mostrar + Los cambios surtirán efecto cuando el bloqueador de rastreadores esté activo. + Más información + Por favor, desactiva VPN %s de terceros para que Advanced Privacy pueda ocultar tu dirección IP real. + Sólo aparecerán aplicaciones con acceso a Internet. + Personalizado + No hay aplicación para ver páginas web + Ok + Enhorabuena. Ningún rastreador está haciendo un perfil. + Ocultar mi indicador IP + Geolocalización falsa al azar + Administra tus permisos + Rastreadores + Desde + Apps + Compatibilidad de aplicaciones + Tu privacidad en Internet no está protegida + Administrar rastreadores de aplicaciones + Geolocalización real + Últimos 30 días + Ver estadísticas + Dirección IP real oculta + Bloqueado + Tu privacidad en Internet está protegida + Ubicación + Dirección IP real + Rastreadores de aplicaciones + Administrar mi dirección de internet + Vista + Direccion IP real + Tus ajustes de privacidad + Hoy + Filtración de datos personales: + Fugas en las últimas 24 horas + Configuración de privacidad personalizada + %s rastreadores te han perfilado en las últimas 24 horas + Especifica geolocalización alternativa + Dirección IP real expuesta + %1$d rastreadores detectados, %2$d rastreadores permitidos + Fugas + Apps + Fugas permitidas + %s fugas permitidas + %s rastreadores detectados + Fugas bloqueadas + Total + detectados en %s apps + Desactiva los rastreadores que quieras permitir: + Fugas en los últimos 30 días + %d permitido + %s resumen de rastreadores + Fugas en los últimos 12 meses + Más información + %d rastreadores detectados + Fugas bloqueadas + Rastreadores detectados + Rastreadores + Resumen de actividad de los rastreadores + Aplicaciones con rastreadores + Rastreadores + Bloqueado + %s resumen de rastreadores + Fugas bloqueadas + Administrar rastreador + Resalta que los rastreadores están registrados y bloqueados por Privacidad Avanzada + %s fugas permitidas + Geolocalización alternativa + Detectado en + Nota: + Control de rastreadores activo + No se han detectado rastreadores. Algunos rastreadores se desbloquearon previamente. + Desactivar las aplicaciones para las que deseas permitir este rastreador: + Ocultar dirección IP + Indicador de control del rastreador + Reiniciar rastreadores + Más información. + Diferentes aplicaciones + En algunos casos, desactivar rastreadores puede causar mal funcionamiento en algunas aplicaciones. Puedes elegir específicamente qué rastreadores deseas bloquear. + Bloquear este rastreador en todas las aplicaciones + Esto podría afectar el funcionamiento de algunas aplicaciones. + Bloquear rastreadores de aplicaciones + %s fugas detectadas + Ver todas las aplicaciones + creado %s fugas + Ver todos los rastreadores + Muro de deshonra + Reiniciar aplicaciones + Sólo aparerán aplicaciones con permiso de localización. + \ No newline at end of file diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml new file mode 100644 index 0000000..bab086f --- /dev/null +++ b/app/src/main/res/values-fi/strings.xml @@ -0,0 +1,153 @@ + + + Napauta nädäksesi, miten helposti voit estää seuraimet, väärentää sijaintisi ja piilottaa IP-osoitteesi. + Tutustu Advanced Privacy:n + Seuraimia ei ole vielä havaittu. Kaikki jatkossa ilmestyvät seuraimet estetään. + Seuraimia ei ole vielä havaittu. Jos uusia seuraimia havaitaan, ne päivitetään tähän. + Estä seuraimet + MMMM yyyy + d MMMM EEE + HH:mm + dd/MM + MMM + kulunut vuosi + kulunut kuukausi + 24 tuntia + Seuraimet ovat sovelluksiin piilotettuja koodinpätkiä. Ne keräävät tietojasi ja seuraavat toimintaasi 24/7. Katso mitkä seuraimet ovat aktiivisia ja estä ne kaikki, parhaan mahdollisen suojan saavuttamiseksi. Koska tämä voi aiheuttaa joidenkin sovellusten osalta toimintahäiriöitä, voit valita erikseen mitä seuraimia haluat estää. + Hallitse sovellusten seuraimia + Virheelliset koordinaatit + Leveysaste + Pituusaste + Käytä tiettyä sijaintia + Käytä satunnaista uskottavaa sijaintia + Käytä oikeaa sijaintiani + Sijaintisi voi paljastaa paljon itsestäsi tai toiminnastasi. +\n +\nSijainnin hallinta mahdollistaa väärennetyn sijainnin käyttämisen todellisen sijaintisi sijasta. Näin todellista sijaintiasi ei jaeta sovelluksille, jotka saattavat nuuskia liikaa. + Hallitse sijaintiani + Piilotetun IP-palvelumme käynnistäminen vie aikaa. Se voi kestää muutaman minuutin. Ruudulta poistuminen ei keskeytä prosessia. + Sovella tätä asetusta kaikkiin valittuihin sovelluksiin * : + Satunnaisesta maasta + Internet-toimintani täytyy näyttää olevan peräisin: + Huomaa: Kun tämä vaihtoehto on käytössä, Internetyhteytesi nopeus todennäköisesti alenee merkittävästi. + Hallitse sijaintiasi + Hallitse sovellusten käyttöoikeuksia + Piilotettu + Paljastettu + Väärennetty + Paljastettu + Estetty + Haavoittuvainen + Onnittelut! Yksikään seurain ei profiloi sinua. + Järjestelmä + Olen anonyymi Internetissä + Piilota todellinen IP-osoitteeni + Toimintojani voidaan seurata IP-osoitteeni perusteella + Käytä oikeaa IP-osoitettani + Internet-osoitteesi tai IP-osoitteesi on tunniste, joka on määritetty puhelimellesi, kun se on yhteydessä Internetiin. +\n +\nInternet-osoitteen hallinta mahdollistaa väärennetyn IP-osoitteen käyttämisen oikean IP-osoitteesi sijaan. Näin Internet-toimintaasi ei voida yhdistää oikeaan IP-osoitteeseesi eikä laitteeseesi. + Hallitse Internet-osoitettani + Tämä voi vaikuttaa joidenkin sovellusten toimintaan. + Todellinen IP piilotettu + Korosta, että sijainti on tällä hetkellä väärennetty Advanced Privacy -sovelluksella + Korosta, että IP on tällä hetkellä piilotettu Advanced Privacy -sovelluksella + Piilota IP-osoitteeni lippu + Kaikki sijaintia käyttävät sovellukset, mukaan lukien navigointisovellus, käyttävät nyt tätä väärennettyä sijaintia. + Väärennetty sijainti on käytössä + Väärennetyn sijainnin lippu + Ensimmäinen käynnistyskerta + Ymmärrän + Tämä toiminto käyttää TOR-verkkoa todellisen IP-osoitteesi piilottamiseen. Käytä sitä vain tiettyihin sovelluksiin. Kun IP-osoitteesi on väärennetty, Internet-nopeutesi todennäköisesti heikkenee. +\nTärkeää: suosittelemme tämän ominaisuuden poistamista käytöstä sähköpostipalveluissa, koska osoitteesi voi päätyä pysyvään porttikieltoon palveluntarjoajan toimesta. + Piilota IP-osoitteeni + Kun tämä vaihtoehto on käytössä, jotkin sovellukset, jotka käyttävät todellista sijaintiasi, eivät ehkä toimi oikein. On suositeltavaa ottaa se käyttöön vain satunnaisesti ja vain tarvittaessa. + Väärennä sijaintini + Hallitse sovellusten seuraimia + Kun tämä vaihtoehto on käytössä, joissakin harvoissa tapauksissa jotkin sovellukset eivät ehkä toimi kunnolla. Jos havaitset ongelmia, voit milloin tahansa poistaa seurainten valvonnan käytöstä tiettyjen sovellusten ja verkkosivustojen osalta. + Seurainten hallinta + Älä näytä uudelleen + Muutokset tulevat voimaan, kun seurannan esto on päällä. + Lue lisää + Poista kolmannen osapuolen VPN %s käytöstä, jotta Advanced Privacy voi piilottaa todellisen IP-osoitteesi. + Vain sovellukset joilla on Internet-käyttöoikeus on lueteltuna. + Mukautettu + Ei sovellusta verkkosivujen katseluun + Sovellusten yhteensopivuus + OK + Yksityisyytesi verkossa on suojaamaton + Sovelletaan mukautettuja yksityisyysasetuksia + Sijainti + Todellinen IP-osoite + Henkilötietojen vuotaminen: + Tänään + %s seurainta ovat profiloineet sinut viimeisen 24 tunnin aikana + Näytä + Hallitse sovellusten seuraimia + %1$d havaittua seurainta, %2$d sallittua seurainta + Todellinen sijainti + Todellinen IP-osoite piilotettu + Estä sovellusseuraimet + Häpeämuuri + %s vuotoja havaittu + Näytä kaikki sovellukset + aiheutti %s vuotoa + Näytä kaikki seuraimet + Vuodot viimeisten 30 päivän aikana + Vuodot viimeisten 24 tunnin aikana + Vuodot viimeisten 12 kuukauden aikana + Napauta saadaksesi lisätietoja + Estetyt vuodot + Sallitut vuodot + %d havaittua seurainta + %d sallittua + Sovellukset + Seuraimet + Seurainten toiminnan yhteenveto + Sovellukset joissa on seuraimia + %s seurainta havaittu + havaittu %s sovelluksessa + %s seurannan yhteenveto + Yhteensä + Estetty + Seuraimet + Estettyä vuotoa + %s sallittua vuotoa + Kytke pois päältä ne seuraimet, jotka haluat sallia: + %s seurannan yhteenveto + Havaittu + Estetyt vuodot + Estä tämä seurain kaikissa sovelluksissa + Poista käytöstä niille sovelluksille, joille haluat sallia tämän seuraimen: + joissakin harvoissa tapauksissa seuraimen poistaminen käytöstä voi aiheuttaa joidenkin sovellusten toimintahäiriöitä. Voit valita erikseen, mitkä seuraimet haluat estää. + Huomautus: + Lisätietoja. + Väärennetty sijainti + Piilota IP-osoite + Seurannan ohjauslippu + Korosta, että seuraimet ovat todella kirjattu ja estetty Advanced Privacy:n toimesta + Seurainten halinta on käytössä + Näytä tilastot + Viimeiset 30 päivää + Estetty + Vuotoja + osoitteesta + Sovellukset + Yksityisyysasetukset + Sovellusseuraimet + Todellinen IP-osoite + Erilaiset sovellukset + %s sallitut vuodot + Havaittua seurainta + Hallitse käyttöoikeuksia + Hallitse seuraimia + Tämä voi vaikuttaa joidenkin sovellusten toimintaan. + Seuraimia ei ole vielä havaittu. Joitakin seuraimia on sallittu aiemmin. + Seuraimien nollaus + Erityinen väärennetty sijainti + Todellinen IP-osoite paljastettu + Yksityisyytesi verkossa on suojattu + Seuraimet + Satunnainen väärennetty sijainti + Internet-osoitteen hallinta + \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml new file mode 100644 index 0000000..7089ac0 --- /dev/null +++ b/app/src/main/res/values-fr/strings.xml @@ -0,0 +1,153 @@ + + + Votre vie privée en ligne est protégée + Votre vie privée en ligne n\'est pas protégée + Pisteurs + Autorisés + Bloqués + Position + Exposée + Protégée + Vraie adresse IP + Exposée + Fuites de données personnelles : + Aujourd\'hui + Gérer les autorisations des applis + Gérez vos autorisations + Position + Vraie position + Géolocalisation fictive spécifique + Géolocalisation fictive aléatoire + Gérer mon adresse Internet + Vraie adresse IP exposée + Vraie adresse IP masquée + Gérer mon adresse Internet + Utiliser ma vraie adresse IP + Je peux être tracé.e par mon adresse IP + Masquer ma vraie adresse IP + Je navigue anonymement sur Internet + Note : Tant que cette option est active, votre vitesse de connexion est susceptible d\'être considérablement réduite. + Mon activité Internet doit apparaître depuis : + Pays aléatoire + Appliquer ce paramètre à toutes les applications sélectionnées * : + %s pisteurs vous ont profilé durant les dernières 24 heures + Gérer les pisteurs + %1$d pisteurs détectés, %2$d pisteurs autorisés + Masquée + Longitude + Latitude + Coordonnées invalides + Jour + Mois + Année + Gérer les pisteurs + Activer le contrôle des pisteurs + Aucun pisteur n\'a été détecté pour l\'instant. Si de nouveaux pisteurs sont détectés, ils seront listés ici. + Aucun pisteur n\'a été détecté pour l\'instant. Tous les futurs pisteurs seront bloqués. + Gérer ma position + Utiliser ma vraie position + Utiliser une position aléatoire plausible + Utiliser une position spécifique + Votre adresse Internet ou adresse IP est l\'identifiant attribué à votre téléphone lorsqu\'il est connecté à Internet. +\n +\n\"Gérer mon adresse Internet\" vous permet d\'utiliser une adresse IP fictive au lieu de votre véritable adresse IP. Ainsi, votre activité Internet ne peut pas être liée à votre vraie adresse IP et à votre appareil. + Notre service de brouillage des adresses IP prend du temps à se lancer. Cela peut prendre quelques minutes. Quitter l\'écran n\'interrompra pas le processus. + Votre position peut révéler beaucoup de choses sur vous-même ou sur vos activités. +\n +\n\"Gérer ma position\" vous permet d\'utiliser une position fictive au lieu de votre véritable position. De cette façon, votre vraie position n\'est pas partagée avec des applications qui pourraient vous espionner. + Les pisteurs sont des morceaux de code dissimulés dans les applications. Ils collectent vos données et suivent votre activité 24h/24 et 7j/7. Découvrez ci-dessous tout le pistage qui a lieu sur votre téléphone. + Félicitations ! Aucun pisteur ne vous profile. + Paramètres de confidentialité personnalisés appliqués + Découvrez Advanced Privacy + Cliquez pour découvrir comment bloquer facilement les pisteurs, falsifier votre position et masquer votre adresse IP. + Voir + Applications Système + Merci de désactiver le VPN tiers %s afin de permettre à Advanced Privacy de masquer votre vraie adresse IP. + Seules les applications ayant la permission Internet sont listées. + Personnalisé + Cette option utilise le réseau TOR pour masquer votre véritable adressse IP. Ne l\'utilisez que pour des applications spécifiques. Tant que votre vraie adresse IP est cachée, votre vitesse de connexion est susceptible d\'être réduite. +\nImportant : nous vous recommandons de désactiver cette fonctionnalité pour utiliser les services emails car votre adresse email pourrait être radiée définitivement par votre fournisseur. + Contrôle des pisteurs + Tant que cette option est activée, certaines applications se basant sur votre vraie position pourraient ne pas fonctionner correctement. Il est recommandé de ne l\'activer qu\'occasionnellement, quand c\'est nécessaire. + Falsifier ma position + Je comprends + Masquer mon adresse IP + Les changements prendront effet quand le bloqueur de pisteurs sera activé. + Gérer les pisteurs + Dans quelques rares cas, tant que cette option est activée, certaines applications pourraient ne pas fonctionner correctement. Si vous rencontrez un problème, vous pouvez désactiver le blocage d\'un ou plusieurs pisteurs pour une application ou un site web spécifique quand vous le souhaitez. + Ne plus afficher + OK + En savoir plus + Aucune application pour afficher des pages web + Toutes les applications utilisant votre position y compris votre application de navigation utilisent désormais cette position fictive. + Localisation fictive activée + Indique que la position est actuellement fictive grâce à Advanced Privacy + Signalisation de position fictive + Premier démarrage + Indique que l\'adresse IP est actuellement masquée par Advanced Privacy + Signalisation d\'adresse IP masquée + Adresse IP réelle masquée + Cela pourrait impacter le fonctionnement de certaines applications. + Compatibilité des applications + Contrôle des pisteurs activé + Aucun pisteur détecté pour l\'instant. Certains pisteurs ont été débloqués auparavant. + Alerte concernant le contrôle des pisteurs + Réinitialiser les pisteurs + Ceci pourrait impacter le fonctionnement de certaines applications. + Apps + Activité du pisteur %s + Fuites bloquées + %s fuites autorisées + Gérer les pisteurs + %s pisteurs détectés + Indique que les pisteurs sont actuellement bloqués par Advanced Privacy + Total + %s fuites autorisées + détecté dans %s apps + Détecté dans + Note : + Désactivez les pisteur que vous voulez autoriser : + Activité de %s + Désactiver les apps pour lesquelles vous souhaitez autoriser ce pisteur + Fuites bloquées + Voir plus. + Pisteurs détectés + applications distinctes + dans de rares cas, bloquer un pisteur peut causer des dysfonctionnements dans certaines apps. Vous pouvez choisir les pisteurs que vous voulez bloquer + Pisteurs + Bloquer ce pisteur pour toutes les apps + Activité des pisteurs + Apps avec pisteurs + Pisteurs + Bloqués + HH:mm + EEE d MMMM + MMMM yyyy + dd/MM + MMM + 30 derniers jours + Voir les statistiques + Bloquées + Fuites + Depuis + Fuites autorisées + Applications + Fuites bloquées + Fuites sur les 30 derniers jours + Vraie adresse IP + Pisteurs d\'applications + Fuites sur les 12 derniers mois + Appuyez pour plus d\'info + Vos paramètres de confidentialité + Fuites sur les dernières 24h + Falsifier ma position + %d autorisés + Masquer mon adresse IP + %d pisteurs détectés + Bloquer les pisteurs d\'applications + Voir toutes les applis + a créé %s fuites + Voir tous les pisteurs + Mur de la honte + %s fuites détectées + \ No newline at end of file diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml new file mode 100644 index 0000000..a6b3dae --- /dev/null +++ b/app/src/main/res/values-in/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml new file mode 100644 index 0000000..89dba98 --- /dev/null +++ b/app/src/main/res/values-is/strings.xml @@ -0,0 +1,155 @@ + + + Í lagi + Kerfi + Samhæfni forrita + Rekjarar + Viðkvæmt + Hafnað + Sérsniðið + Staðsetning + Berskjaldað + Varið + Raunverulegt IP-vistfang + Berskjaldað + Falin + Leki persónulegra upplýsinga: + Í dag + Skoða + Nota tiltekna staðsetningu + Lengdargráða + Breiddargráða + Hnitin eru ógild + Kanna nánar + Dagur + Mánuður + Ár + HH:mm + d. MMMM, EEE + MMMM yyyy + dd/MM + MMM + Víxla á rekjarastýringu + Ekki sýna þetta aftur + Falsa staðsetninguna þína + Fela IP-vistfangið mitt + Ég skil + Friðhelgi þín á netinu er óvarin + Handahófskennd fölsuð hnattstaðsetning + Sýsla með internetslóðina mína + Raunverulegt IP-vistfang birt + Raunverulegt IP-vistfang falið + Sýsla með internetslóðina mína + Nota raunverulegt IP-vistfang mitt + Fela raunverulegt IP-vistfang mitt + Ég er nafnlaus á internetinu + Handahófskennt land + Sýsla með staðsetningu mína + Nota raunstaðsetningu mína + Nota handahófskennda en sennilega staðsetningu + Fyrsta ræsing + Til hamingju! Engir rekjarar eru að njósna um þig. + Ekkert forrit til að skoða vefsíður + Friðhelgi þín á netinu er varin + Sérsniðnar stillingar á friðhelgi virkjaðar + %s rekjarar hafa njósnað um þig á síðustu 24 klst + Sýsla með rekjara í forriti + %1$d rekjarar fundust, %2$d rekjarar leyfðir + Sýsla með heimildir forrits + Sýsla með heimildir þínar + Hnattstaðsetning + Raunveruleg hnattstaðsetning + Tiltekin fölsuð hnattstaðsetning + Sýsla með rekjara í forriti + Frumstilla rekjara + Sýsla með rekjara í forritum + Raunverulegt IP-vistfang falið + Hægt er að rekja slóðir mínar frá IP-vistfanginu mínu + Virkni mín á netinu verður að sýnast vera frá: + Virkja þessa stillingu í öllum völdum forritum * : + Eingöngu eru birt forrit með heimildir til að nota internetið. + Stýring rekjara + Kynntu þér ítarlegri persónuvernd + Kveikt á falsaðri staðsetningu + Þetta gæti haft áhrif á virkni sumra forrita. + Athugaðu: Á meðan þessi kostur er virkur, er hraði internettengingarinnar þinnar líklega verulega takmarkaður. + Gerðu utanaðkomandi %s VPN-tenginguna þína óvirka til að ítarlega persónuverndin geti falið raunverulega IP-vistfangið þitt. + Engir rekjarar hafa enn fundist. Ef nýir rekjarar finnast mun það sjást hér. + Engir rekjarar hafa enn fundist. Allir rekjarar sem finnast munu verða útilokaðir. + Engir rekjarar hafa enn fundist. Einhverjir rekjarar hafa verið teknir úr banni. + Breytingar taka gildi þegar kveikt er á útilokun rekjara. + Falsa staðsetningarflagg + Merkja að þessi staðsetning sé núna fölsuð af ítarlegu persónuverndinni + Öll forrit sem nota staðsetninguna þína, þar með talin leiðsagnarforrit, eru núna að nota þessa fölsuðu staðsetningu. + Fela IP-vistfangsflaggið mitt + Merkja að þetta IP-vistfang sé núna falsað af ítarlegu persónuverndinni + Ýttu til að sjá hvernig hægt sé að útiloka rekjara, falsa staðsetninguna þína og fela IP-vistfangið þitt. + Á meðan þessi kostur er virkur, gætu í einstaka tilfellum sum forrit virkað skringilega. Ef þú rekst á vandamál, geturðu gert rekjarastýringuna óvirka hvenær sem er, fyrir tiltekin forrit eða vefsvæði. + Á meðan þessi kostur er virkur, gætu sum forrit sem reiða sig á raunstaðsetningu þína virkað skringilega. Mælt er með því að þetta sé aðeins notað stöku sinnum, ef þörf krefur. + Þessi kostur notar TOR-netið til að fela raunverulega IP-vistfangið þitt. Notaðu það einungis fyrir sérstök forrit. Á meðan IP-vistfangið þitt er falsað, er líklegt að hraði internetsins minnki hjá þér. +\nMikilvægt: Við mælum með að þú notir þetta alls ekki fyrir tölvupóstþjónustur, því ákveðin hætta er á að tölvupóstfangið þitt verði bannað endanlega hjá þjónustuaðilanum þinum. + Þjónustan okkar til að rugla IP-vistföng þarf tiltekinn tíma til að komast í gang. Það gætu verið nokkrar mínútur. Sé farið af þessum skjá truflar ekki ferlið. + Internetslóðin eða IP-vistfangið þitt er auðkennið sem símanum þínum er úthlutað þegar tengst er við internetið. +\n +\n\"Sýsla með internetslóðina mína\" gerir þér kleift að nota falsað IP-vistfang í stað þess raunverulega. Þannig er ekki lengur hægt að tengja athafnir þínar á netinu við IP-vistfang þitt eða tækið þitt. + Rekjarar (trackers) eru kóðabútar faldir inni í forritum. Þeir safna gögnum um þig og fylgjast með athöfnum þínum allan sólarhringinn. Sjáðu hér fyrir neðan alla virkni rekjara á tækinu þínu. + Staðsetning þín getur upplýst margt um þig eða athafnir þínar. +\n +\n\"Sýsla með staðsetningu mína\" gerir þér kleift að nota falsaða staðsetningu í stað þeirrar raunverulegu. Þannig er raunstaðsetningu þinni haldið frá forritum sem eru kannski með nefið of mikið niðri í þínum málum. + Gefur merki um að ítarlega persónuverndin sé að fylgjast með rekjurum og loka á þá + Stýring rekjara er á + Flagg rekjarastýringar + Þetta gæti haft áhrif á virkni sumra forrita. + Forrit + %s yfirlit rekjara + Útilokaðir lekar + %s leyfðir lekar + Stýra rekjara + %s rekjarar fundust + Alls + %s leyfðir lekar + greint í %s forritum + Greint í + Athugaðu: + Veldu hvaða rekjara þú vilt leyfa: + %s yfirlit rekjara + Víxlaðu af þeim forritum þar sem þú vilt leyfa þennan rekjara: + Útilokaðir lekar + Kanna nánar. + Greindir rekjarar + Mismunandi forrit + í einstaka sjaldséðum tilfellum getur það að gera rekjara óvirkan valdið því að forrit virki illa. Þú getur valið sérstaklega hvaða rekjara þú vilt útiloka. + Rekjarar + Banna þennan rekjara í öllum forritum + Yfirlit um virkni rekjara + Rekjarar + Útilokað + Forrit með rekjurum + Lekar síðustu 24 klukkutíma + Lekar síðustu 30 daga + Lekar á síðustu 12 mánuðum + Ýttu til að sjá frekari upplýsingar + Útilokaðir lekar + Leyfðir lekar + %d greindir rekjarar + %d leyft + Frá + Forrit + Síðustu 30 daga + Skoða tölfræði + Útilokað + Raunverulegt IP-vistfang + Rekjarar forrita + Stillingar á gagnaleynd þinni + Lekar + Falsa hnattstaðsetningu + Fela IP-vistfang + Loka á forritsrekjara + %s lekar fundust + Sjá öll forrit + var valdur að %s lekum + Sjá alla rekjara + Helstu sökudólgar + Endurstilla forrit + Einungis forrit með heimild fyrir staðsetningu eru talin upp. + \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml new file mode 100644 index 0000000..4bf7d50 --- /dev/null +++ b/app/src/main/res/values-it/strings.xml @@ -0,0 +1,153 @@ + + + Vulnerabile + Bloccati + Esposta + Protetta + Esposto + Nascosto + Gestisci i permessi delle app + Posizione + Gestisci indirizzo Internet + Usa indirizzo IP reale + Posso essere tracciato dal mio indirizzo IP + Nascondi l\'indirizzo IP reale + Sono anonimo su Internet + Nota: Attivando la scelta, la tua velocità su Internet verrà ridotta significativamente. + La mia attività Internet deve apparire come provenisse da: + Una nazione a caso + Applica questa impostazione a tutte le app selezionate * : + Gestisci la posizione + Usa la posizione reale + Usa una posizione a caso plausibile + Usa una posizione specifica + Logitudine + Latitudine + Coordinate non valide + Gestisci i tracker nelle app + Giorno + Mese + Anno + HH:mm + EEE d MMMM + MMMM yyyy + dd/MM + MMM + Attiva il controllo tracker + Non sono stati ancora rilevati tracker. Nel caso in cui ciò accadesse verranno mostrati qui. + Non sono stati ancora rilevati tracker. Tutti quelli trovati in futuro verranno bloccati. + L\'indirizzo Internet o indirizzo IP è l\'identificativo assegnato allo smartphone quando è connesso a Internet. +\n +\nGestisci indirizzo Internet ti permette di utilizzare un indirizzo IP finto al posto di quello reale. In questo modo, la tua attività su Internet non può essere collegata all\'indirizzo IP reale e al tuo dispositivo. + Il servizio di cifratura dell\'IP richiede tempo per essere lanciato. Può richiedere alcuni minuti. Chiudere lo schermo non interromperà il processo. + La tua posizione può rivelare molto su di te o sulle tue attività. +\n +\nGestisci la posizione ti permette di utilizzare una posizione finta al posto di quella reale. In questo modo, la tua posizione reale non viene condivisa con le app troppo curiose. + I tracker sono pezzi di codice nascosti nelle app. Raccolgono i tuoi dati e seguono la tua attività 24/7. Di seguito puoi vedere il tracciamento eseguito da tutte le app sul tuo smartphone. + Tocca per scoprire com\'è facile bloccare i tracker, nascondere la posizione & l\'indirizzo IP. + Scopri Advanced Privacy + Complimenti! Nessun tracker ti sta profilando. + Sistema + Disabilita la VPN %s di terze parti in modo da permettere ad Advanced Privacy di nascondere l\'indirizzo IP reale. + Sono elencate le sole App con permesso di accesso a Internet. + Personalizzati + Ho capito + Questa scelta usa il network TOR per nascondere l\'indirizzo IP reale. Attivala solo per usare determinate App. Quando l\'indirizzo IP è nascosto, la velocità su Internet viene ridotta. +\nAttenzione: è opportuno disabilitare la scelta per i servizi email, dato che l\'indirizzo potrebbe finire per essere bannato permanentemente dal tuo provider. + Nascondi IP + Con questa scelta attiva, alcune App che utilizzano la posizione reale possono non funzionare correttamente. Raccomandiamo di attivarla occasionalmente, solo quando serve. + Nascondi la posizione + Gestisci i tracker nelle App + Se questa scelta è attiva, in alcuni rari casi, alcune App possono non funzionare correttamente. In caso di problemi, puoi sempre disabilitare il controllo tracker per queste App e siti web. + Controllo Tracker + Non mostrare più + Le modifiche avranno effetto se Blocca Tracker è attivo. + OK + Ciò potrebbe impattare sul funzionamento di alcune App. + IP reale nascosto + Segnala che l\'IP è attualmente nascosto da Advanced Privacy + Spia nascondi il mio IP + Spia posizione finta + Tutte le App che accedono alla posizione, inclusi i nevigatori, stanno ora usando questa posizione finta. + Posizione finta attiva + Segnala che la posizione è attualmente nascosta da Advanced Privacy + Primo Avvio + Maggiori informazioni + App per leggere pagine web assente + Resetta i tracker + Non è stato rilevato alcun tracker. Alcuni tracker sono stati sbloccati in precedenza. + Compatibilità App + Posizione finta casuale + App + Gestisci autorizzazioni + Riepilogo per il tracker %s + Fughe di dati permesse + Tracker + Da + App + Fughe di dati bloccate + La tua privacy online non è protetta + %s fughe di dati permesse + Gestisci tracker + %s tracker rilevati + Gestisci i trackers nelle app + Segnala che i Tracker sono loggati e bloccati da Advanced Privacy + Posizione reale + Ultimi 30 giorni + Fughe di dati bloccate + Vedi le Statistiche + Totale + %s fughe di dati permesse + Nascondi posizione + rilevato in %s app + Rilevato in + Indirizzo IP reale nascosto + Bloccati + Nota: + Disabilita i tracker che vuoi permettere: + La tua privacy online è protetta + Posizione + Fughe di dati in 30 giorni + Indirizzo IP reale + Il controllo Tracker è attivo + %d permessi + Riepilogo per l\'app %s + Tracker nelle App + Gestisci indirizzo Internet + Visualizza + Fughe di dati in 12mesi + Disabilita se vuoi che il tracker ti tracci in quelle app: + Tocca per maggiori informazioni + Indirizzo IP reale + Nascondi indirizzo IP + Spia controllo Tracker + %d tracker rilevati + Fughe di dati bloccate + Magiori informazioni. + Tracker rilevati + Diverse app + Le tue Impostazioni Privacy + Oggi + Fuga di dati personali: + in alcuni rari casi, disabilitare un tracker può portare ad un malfunzionamento di certe app. Qui puoi scegliere in quali specifiche app bloccare il tracker. + Fughe di dati nelle 24 ore + Tracker + Impostazioni personalizzate della privacy applicate + Blocca questo tracker in tutte le app + Riepilogo Attività Tracker + %s tracker ti hanno profilato nelle ultime 24 ore + Ciò potrebbe impattare il funzionamento di alcune app. + Imposta posizione finta + App con tracker + Blocca i tracker nelle app + Tracker + Indirizzo IP reale esposto + %1$d tracker rilevati, %2$d ammessi + Persi + Bloccati + Visualizza tutte le App + Visualizza tutti i tracker + Muro della vergogna + %s fughe di dati rilevate + create %s fughe di dati + \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml new file mode 100644 index 0000000..d75fe23 --- /dev/null +++ b/app/src/main/res/values-ja/strings.xml @@ -0,0 +1,119 @@ + + + OK + システム + アプリケーションの互換性 + 統計を閲覧 + ブロック済 + 件の流出 + 流出元 + 個のアプリ + あなたのプライバシーの設定 + アプリの追跡機能 + 実際のIPアドレス + 拒否 + 位置情報 + 表示 + 追跡機能 + 位置情報 + 今日 + 個人データの流出: + アプリの追跡機能の管理 + 権限を管理 + IPアドレスの管理 + 特定の位置を使用 + + + + アプリ + 追跡機能 + ブロック済 + 実際の位置を使用 + HH:mm + アプリの追跡機能を管理 + アプリの追跡機能をブロック + 追跡機能を管理 + dd/MM + 追跡機能 + あなたのオンライン上のプライバシーは保護されていません + ユーザー定義のプライバシー設定を適用しました + 実際のIPアドレス + 直近の24時間で%s個の追跡機能があなたの特徴を割り出しました + 実際の位置情報 + 偽の指定した位置情報 + 偽のランダムな位置情報 + IPアドレスの管理 + 実際のIPアドレスが露出しています + 実際のIPアドレスは保護されています + 実際のIPアドレスを使用 + 実際のIPアドレスを使用しない + インターネット上で匿名性を確保します + IPアドレスで追跡される可能性があります + ランダムな国家 + 位置情報の管理 + インターネットの接続元として使用する国家 + 注意:このオプションが有効に設定されている間、あなたのインターネット接続の速度が非常に遅くなる可能性が高いです。 + %1$d個の追跡機能が検出されました。%2$d個の追跡機能が許可されました + インターネット接続の権限が与えられているアプリのみが一覧表示されています。 + アプリの追跡機能の管理 + 直近24時間での流出 + 直近30日間での流出 + 直近12か月での流出 + 座標が不正です + %d個許可済 + 合計 + 検出された追跡機能 + 許可された流出 + ブロックされた流出 + ブロックされた流出 + %d個の追跡機能を検出 + %s個の追跡機能を検出 + %s個のアプリで検出 + EEE d MMMM + MMMM yyyy + 追跡機能の活動に関する要約 + 追跡機能が付属しているアプリ + MMM + %sのユーザー追跡に関する要約 + 経度 + 緯度 + 詳細を確認 + タップして詳細を確認 + 再び表示しない + 各種アプリケーション + ブロックされた流出 + %sのユーザー追跡に関する要約 + 詳細を確認。 + 偽の位置情報を使用 + 理解しました + 偽の位置情報 + IPアドレスを公開しない + 注意: + 追跡機能をリセット + 追跡機能のコントロール + 無防備 + このオプションが有効になっている間、実際の位置情報を必要とするアプリは適切に機能しなくなる可能性があります。必要な場合にのみ有効にすることを推奨します。 + ユーザー定義 + ウェブページを閲覧するためのアプリケーションがありません + アプリによる権限の要求 + おめでとうございます!あなたの特徴を割り出そうとしている追跡機能はありません。 + 直近30日 + 保護 + 露出 + このオプションでは、TORネットワークを使用して、あなたの実際のIPアドレスを確認できないようにします。特定のアプリケーションにのみ使用してください。IPアドレスは非公開となりますが、あなたのインターネット接続の速度は遅くなる可能性が高いです。 +\n注意:サービス提供者があなたのメールアドレスを永久に利用不可に設定する可能性があるため、この機能は電子メールのサービスでは無効にすることを推奨します。 + 露出 + 保護 + あなたのオンライン上のプライバシーは保護されています + この設定を選択した全てのアプリケーションに適用*: + この追跡機能を全てのアプリでブロック + 偽の位置情報が有効です + ナビゲーション用のアプリを含む、あなたの位置情報を使用する全てのアプリが、この偽の位置情報を使用しています。 + 追跡機能のコントロールが有効です + アプリケーションの機能に影響がある場合があります。 + %s件の流出を検知しました + 全てのアプリを表示 + Advanced Privacyであなたの実際のIPアドレスを隠すには、サードパーティー製のVPN %s を無効にしてください。 + 不名誉殿堂 + 追跡機能は、アプリの内に隠されているコードの一部です。あなたの活動や状態に関するデータを24時間休みなく収集しています。あなたの端末上で行われている追跡機能の実行状況については、以下より確認できます。 + \ No newline at end of file diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml new file mode 100644 index 0000000..a100444 --- /dev/null +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -0,0 +1,153 @@ + + + Fra + Applikasjoner + Gratulerer! Ingen sporere kartlegger deg. + Applikasjonskompatibilitet + Ingen applikasjon for å vise nettsider + Siste 30 dager + Vis statistikk + System + OK + Blokkert + Dine personverninnstillinger + Lekkasjer + Nektet + Tilpasset + App-sporere + Sårbar + Tilfeldig falsk geolokasjon + Administrer min lokasjon + Geolokalisering + Administrer appenes tillatelser + Sporere + Administrer min IP-adresse + Eksponert + Ditt personvern på nettet er ikke beskyttet + Bruk en spesifikk lokasjon + Administrer appenes sporere + Reell geolokalisering + Beskyttet + Din IP-adresse er identifikatoren som er tilordnet telefonen når den er koblet til Internett. +\n +\nMed Administrer min IP-adresse kan du bruke en falsk IP-adresse i stedet for den reelle IP-adressen din. På denne måten kan ikke Internett-aktiviteten din knyttes til din reelle IP-adresse og til enheten din. + Lengdegrad + Skjul min reelle IP-adresse + Eksponert + Dag + Breddegrad + Reell IP-adresse skjult + Et tilfeldig land + Din lokasjon kan avsløre mye om deg selv eller aktivitetene dine. +\n +\nMed Administrer min lokasjon kan du bruke en falsk lokasjon i stedet for den reelle lokasjonen din. På denne måten deles ikke den reelle lokasjonen din med applikasjoner som kanskje snoker for mye. + Ditt personvern på nettet er beskyttet + Merk: Når dette alternativet er aktivert, vil internetthastigheten sannsynligvis bli betydelig redusert. + Lokasjon + Bare applikasjoner med Internett-tillatelse vises i listen. + Reell IP-adresse + Administrer min IP-adresse + År + Vis + Administrer appenes sporere + Reell IP-adresse + Internett-aktiviteten min må vises fra: + Mer informasjon + Det kan ta noen minutter å starte vår IP-maskeringstjeneste. Hvis du forlater skjermen, vil prosessen ikke bli avbrutt. + I dag + Lekkasje av personlige data: + Administrer tillatelser for applikasjoner + Bruk min reelle lokasjon + Jeg kan spores ved hjelp av IP-adressen min + Egendefinerte personverninnstillinger + Skjult + Jeg er anonym på Internett + Bruk min reelle IP-adresse + Måned + %s sporere har kartlagt deg de siste 24 timene + Ugyldige koordinater + Bruk en tilfeldig, sannsynlig lokasjon + Vennligst deaktiver tredjeparts VPN %s for at Advanced Privacy skal kunne skjule din reelle IP-adresse. + Spesifikk falsk geolokasjon + Bruk denne innstillingen på alle valgte applikasjoner * : + Reell IP-adresse eksponert + %1$d sporere oppdaget, %2$d sporere tillatt + Sporere er programkode som er skjult i applikasjoner. De samler inn data og følger aktiviteten din 24/7. Nedenfor kan du se alle applikasjoner som sporer aktivitet på enheten din. + Applikasjoner + Tillatte lekkasjer + %s sporere oppdaget + Blokkerte lekkasjer + HH:mm + oppdaget i %s applikasjoner + Lekkasjer siste 30 dager + %d tillatt + Lekkasjer siste 12 måneder + Trykk for mer informasjon + %d sporere oppdaget + Lekkasjer siste 24 timer + Aktivitetsoversikt for sporere + Applikasjoner med sporere + Sporere + MMMM yyyy + EEEE d. MMMM + %s tillatte lekkasjer + dd.MM + Totalt + Slå på sporingskontroll + %s sporingsoversikt + MMM + Blokkerte lekkasjer + Sporere oppdaget + Sporere + Blokkert + Merk: + Slå av sporerne du vil tillatte: + i noen sjeldne tilfeller kan blokkering av sporere føre til at enkelte applikasjoner ikke fungerer som de skal. Du kan velge spesifikt hvilke sporere du vil tillate. + %s sporingsoversikt + Blokkerte lekkasjer + Administrer sporer + %s tillatte lekkasjer + Ikke vis igjen + Oppdaget i + Ingen sporere er oppdaget ennå. Hvis nye sporere oppdages, vil de bli oppdatert her. + Ingen sporere er oppdaget ennå. Alle fremtidige sporere vil bli blokkert. + Ingen sporere er oppdaget ennå. Noen sporere ble blokkert tidligere. + Slå av applikasjonene du vil tillate denne sporeren for: + Tilbakestill sporere + Mer informasjon. + Ulike applikasjoner + Endringene trer i kraft når sporingsblokkeringen er aktivert. + Blokker denne sporeren i alle applikasjoner + Oppdag Advanced Privacy + Når dette alternativet er aktivert, kan det hende at enkelte applikasjoner som er avhengige av din reelle lokasjon, ikke fungerer som de skal. Vi anbefaler at du bare aktiverer dette innimellom, og bare når det er nødvendig. + Jeg forstår + Administrer appenes sporere + Forfalsk min lokasjon + Sporingskontroll + Skjul min IP-adresse + Falsk geolokasjon + Dette alternativet bruker TOR-nettverket til å skjule den reelle IP-adressen din. Bruk det bare til spesifikke applikasjoner. Mens IP-adressen din er forfalsket, vil internetthastigheten sannsynligvis bli redusert. +\nViktig: Vi anbefaler at du deaktiverer denne funksjonen for e-posttjenester, da e-postadressen din kan bli permanent bannlyst av leverandøren din. + Skjul IP-adresse + Første oppstart + Blokker app-sporere + I sjeldne tilfeller kan det hende at enkelte applikasjoner ikke fungerer som de skal når dette alternativet er aktivert. Hvis du støter på problemer, kan du når som helst deaktivere sporingskontrollen for bestemte applikasjoner og nettsteder. + Trykk her for å finne ut hvordan du enkelt kan blokkere sporere, forfalske din lokasjon og skjule IP-adressen din. + Reell IP-adresse er skjult + Fremhev at sporerne blir logget og blokkert av Advanced Privacy + Sporingskontroll er aktivert + Fremhev at IP-adressen er skjult av Advanced Privacy + Skjul mitt IP-flagg + Falsk lokasjonsflagg + Sporingskontrollflagg + Falsk lokasjon er aktivert + Dette kan påvirke hvordan enkelte applikasjoner fungerer. + Alle applikasjoner som bruker posisjonen din, inkludert navigasjonsappen, bruker nå denne falske lokasjonen. + Dette kan påvirke hvordan enkelte applikasjoner fungerer. + Fremhev at lokasjonen er forfalsket av Advanced Privacy + Skammens vegg + %s lekkasjer oppdaget + Vis alle applikasjoner + genererte %s lekkasjer + Vis alle sporere + \ No newline at end of file diff --git a/app/src/main/res/values-night/bools.xml b/app/src/main/res/values-night/bools.xml new file mode 100644 index 0000000..179bb0e --- /dev/null +++ b/app/src/main/res/values-night/bools.xml @@ -0,0 +1,20 @@ + + + + false + diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml new file mode 100644 index 0000000..c40ef2a --- /dev/null +++ b/app/src/main/res/values-nl/strings.xml @@ -0,0 +1,69 @@ + + + OK + Gefeliciteerd! Er zijn geen trackers you aan het profileren. + Systeem + HH:mm + EEE d MMMM + MMMM yyyy + dd/MM + MMM + %s datalekken gedetecteerd + Bekijk alle apps + heeft %s datalekken veroorzaakt + Beheer mijn Internet adres + Compatibiliteit met apps + Beschermd + Onbeschermd + Verborgen + Lekken van persoonlijke data: + Statistieken bekijken + Geblokkeerd + Van + Apps + Jouw privacy instellingen + App trackers + Echt IP adres + Specifieke valse locatie + Willekeurige valse geolocatie + Beheer mijn internet adres + Echt IP adres onbeschermd + Echt IP adres verborgen + Datalekken + Echt IP adres + Laatste 30 dagen + Vandaag + Schandpaal + Bekijk alle trackers + Geen app om webpagina\'s te bekijken + Kwetsbaar + Geweigerd + Aangepast + Onbeschermd + Jouw online privacy is beschermd + Jouw online privacy in niet beschermd + Aangepaste privacy instellingen toegepast + Trackers + Locatie + Geolocatie + Beheer app rechten + %s trackers hebben jouw geprofileerd tijdens de laatste 24 uur + Bekijken + Beheer app trackers + %1$d gedetecteerde trackers, %2$d toegelaten trackers + Beheer jouw rechten + Echte geolocatie + Ik kan getraceerd worden op het internet + Verberg mijn echt IP adres + Ik ben anoniem op het internet + Opmerking: Wanneer deze optie is ingeschakeld kan jouw internet snelheid merkbaar langzamer zijn. + Jouw Internet adres of IP is het identificatie nummer toegewezen aan jouw telefoon wanneer je verbonden bent met internet. +\n +\nInternet adres beheer stelt een fake IP adres in, in plaats van jouw echt adres. Op deze manier kunnen jouw internet activiteiten niet gekoppeld worden aan jouw echt IP adres en jouw toestel. + Gebruik mijn echt IP adres + Willekeurig land + Pas deze instelling toe op alle selecteerde applicaties * : + Enkel apps met internet toelating zijn weergegeven. + Deactiveer a.u.b. de VPN %s zodat Advanced Privacy je werkelijke IP adres kan verbergen. + Mijn internet gebruik moet verschijnen van: + \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml new file mode 100644 index 0000000..df46321 --- /dev/null +++ b/app/src/main/res/values-ru/strings.xml @@ -0,0 +1,153 @@ + + + Скрытый + Раскрыто + Защищено + Раскрыто + Пользовательские + Отказано + Уязвимые места + Нет приложения для просмотра веб-страниц + Поздравляем! Никакие трекеры не профилируют вас. + Система + ОК + Это может повлиять на работу некоторых приложений. + Настоящий IP-адрес скрыт + Выделите тот IP, который в настоящее время скрыт с помощью \"Advanced Privacy\" + Флаг скрытия своего IP-адреса + Все приложения, использующие ваше местоположение, включая навигационное приложение, теперь используют это фальшивое местоположение. + Поддельное местоположение включено + Укажите, что местоположение в настоящее время подделывается \"Advanced Privacy\" + Флаг поддельного местоположения + Нажмите, чтобы узнать, как легко блокировать трекеры, подделывать свое местоположение и скрывать свой IP-адрес. + Откройте для себя \"Advanced Privacy\" + Первая Загрузка + Я понимаю + Этот параметр использует сеть TOR, чтобы скрыть ваш реальный IP-адрес. Используйте его только для определенных приложений. Хотя ваш IP-адрес подделан, скорость вашего Интернета, скорее всего, будет снижена. +\nВажно: мы рекомендуем отключить эту функцию для служб электронной почты, так как ваш адрес может быть заблокирован вашим провайдером навсегда. + Скрывать мой IP-адрес + Пока эта опция активна, некоторые приложения, которые полагаются на ваше реальное местоположение, могут работать некорректно. Рекомендуется включать ее лишь изредка, только при необходимости. + Подделать мое местоположение + Управление трекерами приложений + Пока эта опция активна, в редких случаях, некоторые приложения могут работать некорректно. Если у вас возникли проблемы, вы можете в любое время отключить контроль за трекерами для определенных приложений и веб-сайтов. + Изменения вступят в силу, если включен блокировщик трекеров. + Контроль за трекерами + Не показывать снова + Трекеры пока не обнаружены. Все будущие трекеры будут заблокированы. + Трекеры пока не обнаружены. Если будут обнаружены новые трекеры, они будут обновлены здесь. + Переключиться на управление трекерами + MMMM yyyy + EEE d MMMM + HH:mm + dd/MM + MMM + За год + За месяц + За день + Узнать больше + Трекеры - это фрагменты кода, спрятанные в приложениях. Они собирают ваши данные и следят за вашей активностью 24 часа в сутки 7 дней в неделю. Ниже представлены все приложения, отслеживающие активность на вашем устройстве. + Управление трекерами приложений + Неверные координаты + Широта + Долгота + Используйте специфичное место + Используйте случайное правдоподобное место + Использовать моё реальное местоположение + Ваше местоположение может многое рассказать о вас или вашей деятельности. +\n +\nФункция \"Управление моим местоположением\" позволяет вам использовать поддельное местоположение вместо вашего настоящего. Таким образом, ваше настоящее местоположение не будет передано приложениям, которые могут слишком много шпионить. + Управление своим местоположением + Запуск нашей услуги скремблирования IP-адресов занимает некоторое время. Это может занять несколько минут. Уход с экрана не прервет процесс. + Пожалуйста, отключите сторонние VPN %s, чтобы \"Advanced Privacy\" скрыл ваш реальный IP-адрес. + В списке отображаются только приложения с разрешением на использование Интернета. + Применить эту настройку ко всем выбранным приложениям * : + Случайная страна + Моя активность в Интернете должна исходить из: + Примечание: Пока эта опция активна, скорость вашего Интернета, скорее всего, будет значительно снижена. + Я анонимен в Интернете + Скрыть мой настоящий IP-адрес + Меня можно отследить по моему IP-адресу + Использовать свой настоящий IP-адрес + Ваш интернет-адрес или IP-адрес - это идентификатор, присвоенный вашему телефону при подключении к Интернету. +\n +\nУправление своим интернет-адресом позволяет использовать поддельный IP-адрес вместо своего настоящего IP-адреса. Таким образом, ваша деятельность в Интернете не может быть связана с вашим настоящим IP-адресом и вашим устройством. + Управление своим Интернет-адресом + Местоположение + Управление разрешениями приложения + Совместимость приложений + Просмотреть все приложения + создано %s утечек + Просмотреть все трекеры + Утечки за последние 30 дней + Утечки за последние 12 месяцев + Нажмите для получения дополнительной информации + Допущенные утечки + Заблокированные утечки + %d обнаружено трекеров + %d допущено + Приложения + Трекеры + Сводка активности трекеров + Приложения с трекерами + обнаружено в %s приложениях + %s суммарно отслеживают + Всего + Обнаружено трекеров + Заблокировано + Трекеры + Заблокированные утечки + %s допущенные утечки + Отключите те трекеры, которые вы хотите разрешить: + %s суммарно отслеживают + Различные приложения + Заблокированные утечки + %s допущенные утечки + Управлять трекером + Заблокировать этот трекер сквозь все приложения + Отключите приложения, для которых вы хотите разрешить этот трекер: + Примечание: + в некоторых редких случаях отключение трекеров может привести к сбоям в работе некоторых приложений. Вы можете выбрать, какие именно трекеры вы хотите заблокировать. + Поддельное местоположение + Скрыть IP-адрес + Подчеркните, что трекеры действительно регистрируются и блокируются Advanced Privacy + Управление трекером включено + Это может повлиять на работу некоторых приложений. + Блокировка трекеров приложения + Ваша онлайн конфиденциальность незащищенна + Применены пользовательские настройки конфиденциальности + Настоящий IP-адрес + Сегодня + %s трекеров составили о вас профиль за последние 24 часа + Управлять трекерами приложений + %1$d обнаруженных трекеров, %2$d разрешенных трекеров + Управлять разрешениями + Просмотр статистики + Заблокировано + Утечки + Из + Приложения + Трекеры приложений + Ваши настройки конфиденциальности + Настоящие IP-адрес + Утечки за последние 24 часа + Стена позора + %s утечек обнаружено + Узнать больше. + Последние 30 дней + Ваша онлайн конфиденциальность под защитой + %s трекеров обнаружено + Обнаружено в + Флаг управления трекером + Трекеры пока не обнаружены. Некоторые трекеры были разблокированы ранее. + Сброс трекеров + Трекеры + Местоположение + Посмотреть + Настоящее местоположение + Специальное поддельное местоположение + Случайное поддельное местоположение + Управлять адресом в Интернете + Настоящий IP-адрес раскрыт + Настоящий IP-адрес скрыт + Утечка персональных данных: + \ No newline at end of file diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml new file mode 100644 index 0000000..0cd623f --- /dev/null +++ b/app/src/main/res/values-sv/strings.xml @@ -0,0 +1,155 @@ + + + Göm mitt IP + Jag förstår + OK + System + Applikationers kompatibilitet + Grattis! Inga spårare profilerar dig. + Ingen applikation för att kunna se webbsidor + Din integritet online är skyddad + Din integritet online är inte skyddad + Anpassade integritetsinställningar applicerade + Spårare + Sårbar + Nekad + Anpassad + Plats + Exponerad + Skyddad + Riktig IP-adress + Exponerad + Dold + Personlig data som läckt: + Idag + %s spårare har profilerat dig de senaste 24 timmarna + Visa + Hantera appars spårare + %1$d upptäckta spårare, %2$d tillåtna spårare + Hantera appars behörigheter + Hantera dina behörigheter + Plats + Verklig plats + Specifik falsk plats + Slumpmässig falsk plats + Hantera min internetadress + Verklig internetadress exponerad + Verklig internetadress dold + Hantera min internetadress + Din internetadress eller IP-adress är en identifierare tilldelad din telefon när du ansluter till internet. +\n +\nHantera min internetadress tillåter dig att använda en falsk IP-adress istället för din verkliga IP-adress. På detta sätt kan din internetaktivitet inte kopplas till din verkliga IP-adress och din enhet. + Använd min verkliga IP-adress + Jag kan spåras via min IP-adress + Dölj min verkliga IP-adress + Jag är anonym på internet + Observera: Medan detta alternativ är aktiverat kan din internethastighet märkbart försämras. + Min internetaktivitet måste komma från: + Slumpmässigt land + Applicera denna inställning till alla valda applikationer * : + Endast appar med internetbehörighet är listade. + Hantera min plats + Din plats kan avslöja mycket om dig själv eller dina aktiviteter +\n +\nHantera min plats tillåter dig att använda en falsk plats istället för din verkliga plats. På detta sätt delas inte din verkliga plats med applikationer som kanske snokar för mycket. + Använd min verkliga plats + Använd en slumpmässig trolig plats + Använd en specifik plats + Longitud + Latitud + Ogiltiga koordinater + Hantera appars spårare + Spårare är bitar av kod gömda i appar. Dom samlar in din data och följer din aktivitet dygnet runt. Se all appspåraraktivitet nedan. + Ta reda på mer + Dag + Månad + År + Växla på spårarkontroll + Inga spårare har upptäckts än. Om nya spårare upptäcks kommer de uppdateras här. + Inga spårare har upptäckts än. Alla framtida spårare kommer blockeras. + Inga spårare har upptäckts än. Vissa spårare har tidigare avblockerats. + Ändringar kommer gälla från när spårarblockeraren är på. + Återställ spårare + Visa inte igen + Första start + Upptäck Avancerad Integritet + Tryck för att få reda på hur du lätt blockerar spårare, fejkar din plats & gömmer din IP-adress. + Verklig IP är dold + Detta kan påverka funktionen hos vissa appar. + Inaktivera tredjeparts-VPN %s för att dölja din verkliga IP-adress med Avancerad Integritet. + Vår tjänst för förvrängning av IP tar tid att starta. Det kan ta några minuter. Att lämna sidan kommer inte avbryta processen. + HH:mm + EEE d MMMM + MMMM yyyy + dd/MM + MMM + Spårarkontroll + Medan detta alternativ är aktiverat kan, i sällsynta fall, vissa appar sluta fungera korrekt. Om du stöter på problem kan du inaktivera Spårarkontroll för specifika appar och webbsidor när som helst. + Hantera spårare i appar + Fejka min plats + Medan detta alternativ är aktiverat kan vissa appar som förlitar sig på din verkliga plats sluta fungera korrekt. Det rekommenderas att aktivera det ibland och endast när det är nödvändigt. + Falsk platsflagga + Markera att platsen fejkas av Avancerad integritet + Detta alternativ använder TOR-nätverket för att gömma din verkliga IP-adress. Använd det endast för specifika applikationer. Medan ditt IP göms kommer internethastigheten troligtvis att bli långsammare. +\nViktigt: Vi rekommenderar att inaktivera denna funktion för e-posttjänster eftersom din adress kan komma att permanent blockeras av din leverantör. + Falsk plats är på + Alla appar som använder plats, inklusive navigeringsappen, använder nu denna falska plats. + Göm mitt IP-flagga + Markera att IP-adressen göms av Avancerad integritet + Markera att spårarna faktiskt loggas och blockeras av Avancerad integritet + Spårarkontroll är på + Spårarkontrollflagga + Detta kan påverka funktionen hos vissa appar. + Appar + %s spårarsammandrag + Tillåtna läckor + Blockerade läckor + %s tillåtna läckor + Hantera spårare + %s spårare upptäckta + Blockerade läckor + Totalt + %s tillåtna läckor + upptäckt i %s appar + Upptäckt i + OBS! + Växla av spårare du vill tillåta: + Läckor senaste 30 dagarna + %d tillåtna + %s spårarsammandrag + Läckor senaste 12 månaderna + Växla av apparna där du vill tillåta denna spårare: + Tryck för mer info + %d upptäckta spårare + Blockerade läckor + Ta reda på mer. + Upptäckta spårare + Olika applikationer + i vissa sällsynta fall kan inaktivering av spårare göra att vissa appar inte fungerar som dom ska. Du kan välja specifikt vilka spårare du vill blockera. + Läckor senaste 24 timmarna + Spårare + Blockera denna spårare i alla appar + Sammandrag för spåraraktivitet + Appar med spårare + Spårare + Blockerade + Från + Appar + Senaste 30 dagarna + Visa statistik + Blockerade + Dina integritetsinställningar + Läckor + Verklig IP-adress + Appspårare + Falsk plats + Göm IP-adress + Blockera appspårare + %s läckor upptäcktes + Visa alla appar + skapade %s läckor + Visa alla spårare + Skamvrån + Återställ applikationer + Endast appar med platsbehörighet listas. + \ No newline at end of file diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml new file mode 100644 index 0000000..0277b90 --- /dev/null +++ b/app/src/main/res/values-uk/strings.xml @@ -0,0 +1,148 @@ + + + Заблоковано + Вразливі + Нема застосунку для перегляду вебсторінок + Вітаємо! Жодних трекерів, що за вами стежать. + Система + ОК + Геолокація + Від + Застосунки + Розкрито + За останні 30 днів + Захищено + Переглянути статистику + Заблоковані + Користувацький + Реальна IP-адреса + Трекери застосунків + Ваші налаштування конфіденційності + Злиті дані + Випадкова фальшива геолокація + Керування дозволами + Трекери + Керування моєю IP-адресою + Ваша приватність в інтернеті не захищена + Керувати трекерами програм + Справжня геолокація + Ваша Інтернет-адреса або IP-адреса - це ідентифікатор, який присвоюється вашому телефону при підключенні до Інтернету. +\n +\nКерування інтернет-адресою дозволяє вам використовувати фальшиву IP-адресу замість вашої справжньої IP-адреси. Таким чином, ваша діяльність в Інтернеті не може бути пов\'язана з вашою справжньою IP-адресою та вашим пристроєм. + Приховати мою справжню IP-адресу + Розкрито + Справжню IP-адресу приховано + Ваша приватність в інтернеті захищена + Примітка: Поки ця опція активна, швидкість вашого інтернету, ймовірно, значно знизиться. + Місцезнаходження + Керування моєю інтернет-адресою + Подивитися + Реальна IP-адреса + Сьогодні + Витік персональних даних: + Запит на дозвіл застосунку + Мене можна відстежити за моєю IP-адресою + Опції приватності застосовані + Приховано + Я анонімний в Інтернеті + Використовувати справжню IP-адресу + %s трекерів відстежували вас за останні 24 години + Конкретна фальшива геолокація + Відкрита реальна IP-адреса + %1$d виявлених трекерів, %2$d дозволених трекерів + Керування моїм місцезнаходженням + Застосунки + Дозволені витоки + Сумісність із застосунками + Використовувати конкретне місце + Заблоковані витоки + Довгота + День + Широта + Випадкова країна + Ваше місцезнаходження може багато чого розповісти про вас або вашу діяльність. +\n +\nФункція \"Керування моїм місцезнаходженням\" дозволяє вам використовувати фальшиве місцезнаходження замість вашого справжнього. Таким чином, ваше справжнє місцезнаходження не буде доступне застосункам, які можуть надмірно стежити за вами. + Витоки за останні 30 днів + Перераховано лише застосунки, що мають дозвіл на доступ до Інтернету. + %d дозволено + Рік + Керування трекерами програм + Витоки за останні 12 місяців + Натисніть, щоб дізнатись більше + %d виявлених трекерів + Моя активність повинна відображатися з: + Дізнатися більше + Наша служба захисту IP-адресі потребує часу для запуску. Це може зайняти кілька хвилин. Вихід з екрану не перерве процес. + Використовувати моє реальне місцезнаходження + Витоки за останні 24 години + Місяць + Невірні координати + Використовувати випадкове правдоподібне місце + Будь ласка, вимкніть сторонні VPN %s, щоб Додаткова приватність приховувала вашу справжню IP-адресу. + Застосувати це налаштування до всіх вибраних застосунків * : + Трекери + Трекери - це фрагменти коду, вбудовані в застосунки. Вони збирають ваші дані та відстежують вашу активність 24/7. Нижче ви побачите всю активність застосунків, що відстежують ваші дії на вашому пристрої. + Підсумок відстеження %s + Коли ця опція активна, деякі застосунки, які залежать від вашого реального місцезнаходження, можуть працювати некоректно. Рекомендується вмикати цю опцію лише зрідка, лише за потреби. + Заблоковані витоки + Керування трекерами застосунків + %s дозволених витоків + Фальшиве місцезнаходження + Керування трекером + виявлено %s трекерів + Управління трекерами + dd/MM + Загалом + %s дозволених витоків + Не показувати більше + Приховати мою справжню IP-адресу + HH:mm + MMMM yyyy + виявлено у %s застосунках + Виявлено в + Примітка: + Вимкніть трекери, які ви хочете допустити: + Наразі не виявлено жодних трекерів. Якщо нові трекери будуть виявлені, вони будуть тут. + Увімкнути керування трекерами + Підсумок відстеження %s + MMM + Наразі не виявлено жодних трекерів. Всі майбутні трекери будуть заблоковані. + Наразі не виявлено жодних трекерів. Деякі трекери були розблоковані пізніше. + EEE d MMMM + Обнулити трекери + Заблоковані витоки + Дізнатися більше. + Виявлені трекери + Інші застосунки + у деяких рідкісних випадках вимкнення трекерів може призвести до збоїв у роботі деяких застосунків. Ви можете вибрати, які саме трекери ви хочете заблокувати. + Зміни набудуть чинності, коли блокування трекерів буде увімкнено. + Трекери + Заблокувати цей трекер у всіх застосунках + Підсумки активності трекерів + Застосунки з трекерами + Коли ця опція активна, у рідкісних випадках деякі застосунки можуть працювати некоректно. Якщо у вас виникли проблеми, ви можете будь-коли вимкнути контроль трекерів для певних застосунків і веб-сайтів. + Заблоковано + Відкрийте для себе Додаткову Приватність + Справжня IP-адреса прихована + Я розумію + Фальшива геолокація + Ця опція використовує мережу TOR для приховування вашої реальної IP-адреси. Використовуйте її лише для певних застосунків. Поки ваша IP-адреса фальшива, швидкість вашого інтернету, ймовірно, буде знижена. +\nВажливо: ми радимо вимкнути цю функцію для електронних поштових сервісів, оскільки ваша адреса може потрапити в постійний бан від вашого провайдера. + Зверніть увагу на те, що IP-адреса наразі прихована за допомогою Додаткової приватності + Приховати прапор мого IP + Фальшивий прапорець місцезнаходження + Приховати IP-адресу + Увімкнено фальшиве місцезнаходження + Це може вплинути на роботу деяких застосунків. + Перший запуск + Усі застосунки, що використовують ваше місцезнаходження, включно з навігаційною програмою, тепер використовують це фальшиве місцезнаходження. + Блокувати трекери в застосунках + Натисніть, щоб дізнатися, як легко заблокувати трекери, приховати своє місцезнаходження та IP-адресу. + Зверніть увагу на те, що місцезнаходження наразі підробляється за допомогою Додаткової приватності + Зверніть увагу, що трекери фактично реєструються та блокуються за допомогою Додаткової приватності + Керування трекером увімкнено + Вимкніть застосунки, для яких ви хочете дозволити цей трекер: + Прапорець керування трекером + Це може вплинути на роботу деяких застосунків. + \ No newline at end of file diff --git a/app/src/main/res/values/bools.xml b/app/src/main/res/values/bools.xml new file mode 100644 index 0000000..bdf8531 --- /dev/null +++ b/app/src/main/res/values/bools.xml @@ -0,0 +1,20 @@ + + + + true + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..240694c --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,59 @@ + + + + + @color/e_action_bar + @color/e_accent + + @color/e_primary_text_color + @color/e_secondary_text_color + + @color/e_background + @color/e_alpha_base + + @color/e_disabled_color + @color/e_divider_color + + @color/e_background_overlay + + @color/e_switch_track_on + @color/e_palette_9 + @color/e_switch_track_on + + + #32F8432E + #263238 + #FFFFFFFF + + + + + + @color/e_primary_text_color_dark + @color/e_secondary_text_color_dark + @color/e_primary_text_color_dark + @color/e_disabled_color_dark + + @color/e_launcher_widget_background + + #2CCF69 + + @color/e_secondary_text_color_light + @color/e_disabled_color_light + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..8cb46ef --- /dev/null +++ b/app/src/main/res/values/dimens.xml @@ -0,0 +1,5 @@ + + + 32dp + 16dp + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..f7728bd --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,221 @@ + + + + Advanced Privacy + + + + OK + + System + Applications compatibility + Congratulations! No trackers are profiling you. + No application to see webpages + + + + @string/app_name + + Last 30 days + View Statistics + Blocked + Leaks + From + Apps + Your Privacy Settings + App trackers + Vulnerable + Denied + Custom + Geolocation + Exposed + Protected + Real IP address + Exposed + Hidden + Manage apps\' permissions + + Your online privacy is protected + Your online privacy is unprotected + Custom privacy settings applied + Trackers + + Location + + Real IP address + + Personal data leakage: + Today + %s trackers have profiled you in the last 24 hours + View + Manage apps\' trackers + %1$d detected trackers, %2$d allowed trackers + + Manage your permissions + Real geolocation + Specific fake geolocation + Random fake geolocation + Manage my Internet address + Real IP address exposed + Real IP address hidden + Wall of shame + %s leaks detected + View all apps + created %s leaks + View all trackers + + + Manage my Internet address + Your Internet address or IP address is the identifier assigned to your phone when connected to the Internet.\n\nManage my Internet address enables you to use a fake IP address instead of your real IP address. This way, your Internet activity cannot be linked to your real IP address and to your device. + Use my real IP address + I can be tracked by my IP address + Hide my real IP address + I am anonymous on the Internet + Note: While this option is active, your Internet speed is likely to be significantly reduced. + My Internet activity must appear from: + Random country + Apply this setting to all selected applications * : + Only apps with Internet permission are listed. + Please disable the 3rd-party VPN %s in order for Advanced Privacy to hide your real IP address. + Our scrambling IP service is taking time to launch. It can take a few minutes. Leaving the screen won\'t interrupt the process. + + + Manage my location + Your location can reveal a lot about yourself or your activities.\n\nManage my location enables you to use a fake location instead of your real position. This way, your real location isn\'t shared with applications that might be snooping too much. + Use my real location + Use a random plausible location + Use a specific location + Longitude + Latitude + Invalid coordinates + + Only apps with location permission are listed. + Reset applications + + + + Manage apps\' trackers + Trackers are pieces of code hidden in apps. They collect your data and follow your activity 24/7. See below all app tracking activity in your device. + Know more + + Day + Month + Year + Leaks in the last 24 hours + Leaks in the last 30 days + Leaks in the last 12 months + Tap for more info + Blocked leaks + Allowed leaks + %d detected trackers + %d allowed + + Apps + Trackers + Trackers Activity Summary + Apps with trackers + + %s trackers detected + detected in %s apps + + HH:mm + EEE d MMMM + MMMM yyyy + + dd/MM + MMM + + + %s tracking summary + Total + Detected trackers + Blocked + Trackers + Blocked leaks + %s allowed leaks + Toggle on trackers control + Toggle off the trackers you want to allow: + No trackers were detected yet. If new trackers are detected they will be updated here. + No trackers were detected yet. All future trackers will be blocked. + No trackers were detected yet. Some trackers were unblocked previously. + Changes will take effect when tracker blocker is on. + Reset trackers + + + %s tracking summary + Detected in + Different applications + Blocked leaks + %s allowed leaks + Manage tracker + Block this tracker across all apps + Toggle off the apps for which you want to allow this tracker: + + + Note: + in some rare cases, disabling tracker can cause some apps to malfunction. You can choose specifically which trackers you want to block. + Know more. + + + + Do not show again + Trackers control + While this option is active, in some rare cases, some apps may not work properly. If you meet any problems, you can disable trackers control for specific apps and websites at anytime. + Manage app trackers + Fake my location + While this option is active, some apps that rely on your real location may not work properly. It\'s recommended to enable it only occasionally, only when needed. + Hide my IP + This option uses the TOR network to hide your real IP address. Only use it for specific applications. While your IP is faked, your Internet speed is likely to be reduced.\nImportant: we advise disabling this feature for email services as your address may end into permanent ban from your provider. + I understand + + + + @string/app_name + + @string/dashboard_number_period + @string/dashboard_data_blocked_trackers_primary + @string/dashboard_data_blocked_trackers_secondary + @string/dashboard_data_apps_primary + @string/dashboard_data_apps_secondary + + Block app trackers + Fake geolocation + Hide IP Address + + + First Boot + Discover Advanced Privacy + Tap to find out how to easily block trackers, fake your location & hide your IP address. + Fake location flag + Highlight that location is currently faked by Advanced Privacy + + Fake location is on + All apps using your location including your navigation app are now using this fake location. + + Hide my IP flag + Highlight that IP is currently hidden by Advanced Privacy + Real IP hidden + This could impact the functioning of some applications. + + Tracker control flag + Highlight that the trackers are actually logged and blocked by Advanced Privacy + Tracker control is on + This could impact the functioning of some applications. + + diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..7c1e4c3 --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,34 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/widget_info.xml b/app/src/main/res/xml/widget_info.xml new file mode 100644 index 0000000..fd7de6e --- /dev/null +++ b/app/src/main/res/xml/widget_info.xml @@ -0,0 +1,34 @@ + + + + diff --git a/app/src/standalone/res/values-night/colors.xml b/app/src/standalone/res/values-night/colors.xml new file mode 100644 index 0000000..079b968 --- /dev/null +++ b/app/src/standalone/res/values-night/colors.xml @@ -0,0 +1,28 @@ + + + + + #272727 + #5DB2FF + + #CCFFFFFF + #8CFFFFFF + + #121212 + + \ No newline at end of file diff --git a/app/src/standalone/res/values/colors.xml b/app/src/standalone/res/values/colors.xml new file mode 100644 index 0000000..bd27922 --- /dev/null +++ b/app/src/standalone/res/values/colors.xml @@ -0,0 +1,27 @@ + + + + + #FFFFFF + #0086FF + + #CC000000 + #8C000000 + + #FAFAFA + \ No newline at end of file diff --git a/app/src/standalone/res/values/strings.xml b/app/src/standalone/res/values/strings.xml new file mode 100644 index 0000000..7719e7b --- /dev/null +++ b/app/src/standalone/res/values/strings.xml @@ -0,0 +1,3 @@ + + A-P - Standalone + diff --git a/app/src/test/java/foundation/e/advancedprivacy/ExampleUnitTest.kt b/app/src/test/java/foundation/e/advancedprivacy/ExampleUnitTest.kt new file mode 100644 index 0000000..f75ec1a --- /dev/null +++ b/app/src/test/java/foundation/e/advancedprivacy/ExampleUnitTest.kt @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2021 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy + +import org.junit.Assert +import org.junit.Test + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + Assert.assertEquals(4, 2 + 2) + } +} diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..3ef11f8 --- /dev/null +++ b/build.gradle @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2023-2024 MURENA SAS + * Copyright (C) 2022 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + ext.buildConfig = [ + 'compileSdk': 34, + 'minSdk' : 30, + 'targetSdk' : 34, + 'version' : [ + 'major': 2, + 'minor': 5, + 'patch': 0, + ], + ] + + ext.buildConfig.version['name'] = "${buildConfig.version.major}.${buildConfig.version.minor}.${buildConfig.version.patch}" + ext.buildConfig.version['fullName'] = "${buildConfig.version.name}-${buildConfig.version.build}" + ext.buildConfig.version['code'] = buildConfig.version.major * 1000000 + buildConfig.version.minor * 1000 + buildConfig.version.patch + + // Load properties either from local.properties or system environment (on CI). + apply from: rootProject.file('load-properties.gradle') + + repositories { + google() + mavenCentral() + } +} + +plugins { + alias libs.plugins.spotless + alias libs.plugins.detekt + alias libs.plugins.benmanes.versions + alias libs.plugins.kotlin.android apply false + alias libs.plugins.android.application apply false + alias libs.plugins.kotlin.kapt apply false + alias libs.plugins.androidx.navigation.safeargs apply false + alias libs.plugins.android.library apply false +} + +allprojects { + //Support @JvmDefault, and @OptIn + tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { + kotlinOptions { + freeCompilerArgs = ['-Xjvm-default=all', '-opt-in=kotlin.RequiresOptIn'] + + jvmTarget = "17" + } + } +} + + + +spotless { + kotlin { + target("**/*.kt") + ktlint("1.0.1") + } + format 'misc', { + // define the files to apply `misc` to + target '*.gradle', '*.md', '.gitignore' + + // define the steps to apply to those files + trimTrailingWhitespace() + endWithNewline() + } +} + +subprojects { + tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { + kotlinOptions { + // Treat all Kotlin warnings as errors + allWarningsAsErrors = true + + freeCompilerArgs += "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi" + jvmTarget = "17" + } + } + + detekt { + toolVersion = libs.versions.detekt + + source = files( + "src/main/java" + ) + + config.setFrom("detekt.yml") + baseline = file("detekt-baseline.xml") + parallel = false + buildUponDefaultConfig = true + allRules = false + disableDefaultRuleSets = false + debug = false + ignoreFailures = false + basePath = projectDir + } +} + +Object propOrDef(String propertyName, Object defaultValue) { + def propertyValue = project.properties[propertyName] + return propertyValue != null ? propertyValue : defaultValue +} diff --git a/core/.gitignore b/core/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/core/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/core/build.gradle b/core/build.gradle new file mode 100644 index 0000000..2796f29 --- /dev/null +++ b/core/build.gradle @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2023 MURENA SAS + * Copyright (C) 2022 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +plugins { + id 'com.android.library' + id 'kotlin-android' + id 'kotlin-kapt' + id 'kotlin-parcelize' +} + +group 'foundation.e' + +android { + compileSdkVersion buildConfig.compileSdk + + defaultConfig { + minSdkVersion buildConfig.minSdk + targetSdkVersion buildConfig.targetSdk + + consumerProguardFiles "consumer-rules.pro" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + namespace 'foundation.e.advancedprivacy.core' +} + +dependencies { + implementation( + libs.androidx.core.ktx, + libs.androidx.datastore.preferences, + libs.bundles.koin, + libs.kotlinx.coroutines, + libs.timber + ) +} diff --git a/core/consumer-rules.pro b/core/consumer-rules.pro new file mode 100644 index 0000000..e69de29 diff --git a/core/proguard-rules.pro b/core/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/core/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/core/src/main/AndroidManifest.xml b/core/src/main/AndroidManifest.xml new file mode 100644 index 0000000..73d42f8 --- /dev/null +++ b/core/src/main/AndroidManifest.xml @@ -0,0 +1,20 @@ + + + + \ No newline at end of file diff --git a/core/src/main/java/foundation/e/advancedprivacy/core/KoinModule.kt b/core/src/main/java/foundation/e/advancedprivacy/core/KoinModule.kt new file mode 100644 index 0000000..d9f01c7 --- /dev/null +++ b/core/src/main/java/foundation/e/advancedprivacy/core/KoinModule.kt @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2024 E FOUNDATION + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.core + +import foundation.e.advancedprivacy.data.repositories.AppListRepository +import org.koin.android.ext.koin.androidContext +import org.koin.core.qualifier.named +import org.koin.dsl.module + +val coreModule = module { + single { + AppListRepository( + permissionsModule = get(), + context = androidContext(), + compatibilityAppLabel = get(named("CompatibilityAppLabel")), + compatibilityAppIcon = get(named("CompatibilityAppIcon")), + systemAppLabel = get(named("SystemAppLabel")), + systemAppIcon = get(named("SystemAppIcon")), + backgroundScope = get() + ) + } +} diff --git a/core/src/main/java/foundation/e/advancedprivacy/core/utils/BroadcastReceiverUtils.kt b/core/src/main/java/foundation/e/advancedprivacy/core/utils/BroadcastReceiverUtils.kt new file mode 100644 index 0000000..d72a06c --- /dev/null +++ b/core/src/main/java/foundation/e/advancedprivacy/core/utils/BroadcastReceiverUtils.kt @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.core.utils + +import android.content.BroadcastReceiver +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch +import timber.log.Timber + +fun BroadcastReceiver.goAsync(coroutineScope: CoroutineScope, block: suspend () -> Unit) { + val pendingResult = goAsync() + coroutineScope.launch { + try { + block() + } catch (ce: CancellationException) { + throw ce + } catch (e: Exception) { + Timber.e(e, "Uncaught exception in BroadcastReceiver.goAsync bloc") + } finally { + pendingResult.finish() + } + } +} diff --git a/core/src/main/java/foundation/e/advancedprivacy/core/utils/CoroutinesUtils.kt b/core/src/main/java/foundation/e/advancedprivacy/core/utils/CoroutinesUtils.kt new file mode 100644 index 0000000..cbc7787 --- /dev/null +++ b/core/src/main/java/foundation/e/advancedprivacy/core/utils/CoroutinesUtils.kt @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.core.utils + +import kotlin.contracts.ExperimentalContracts +import kotlin.contracts.InvocationKind +import kotlin.contracts.contract +import kotlinx.coroutines.CancellationException + +@OptIn(ExperimentalContracts::class) +inline fun runSuspendCatching(block: () -> T): Result { + contract { + callsInPlace(block, InvocationKind.EXACTLY_ONCE) + } + + return runCatching(block).onFailure { + if (it is CancellationException) { + throw it + } + } +} + +inline fun Result.recoverSuspendCatching(transform: (exception: Throwable) -> R): Result { + return when (val exception = exceptionOrNull()) { + null -> this + else -> runSuspendCatching { transform(exception) } + } +} diff --git a/core/src/main/java/foundation/e/advancedprivacy/core/utils/NotificationsHelper.kt b/core/src/main/java/foundation/e/advancedprivacy/core/utils/NotificationsHelper.kt new file mode 100644 index 0000000..47703ad --- /dev/null +++ b/core/src/main/java/foundation/e/advancedprivacy/core/utils/NotificationsHelper.kt @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.core.utils + +import android.content.Context +import androidx.core.app.NotificationCompat +import foundation.e.advancedprivacy.domain.entities.NotificationContent + +fun notificationBuilder(context: Context, content: NotificationContent): NotificationCompat.Builder { + val builder = NotificationCompat.Builder(context, content.channelId) + .setSmallIcon(content.icon) + .setPriority(NotificationCompat.PRIORITY_LOW) + .setContentTitle(context.getString(content.title)) + .setStyle(NotificationCompat.BigTextStyle().bigText(context.getString(content.description))) + content.pendingIntent?.let { builder.setContentIntent(it) } + + return builder +} diff --git a/core/src/main/java/foundation/e/advancedprivacy/core/utils/PreferenceDataStoreUtils.kt b/core/src/main/java/foundation/e/advancedprivacy/core/utils/PreferenceDataStoreUtils.kt new file mode 100644 index 0000000..ddd0afc --- /dev/null +++ b/core/src/main/java/foundation/e/advancedprivacy/core/utils/PreferenceDataStoreUtils.kt @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.core.utils + +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.edit +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.firstOrNull +import kotlinx.coroutines.flow.map + +suspend fun DataStore.getValue(key: Preferences.Key): T? { + return data.map { it[key] }.firstOrNull() +} + +suspend fun DataStore.setValue(key: Preferences.Key, value: T) { + edit { preferences -> + preferences[key] = value + } +} + +suspend fun DataStore.removeKey(key: Preferences.Key) { + edit { preferences -> + preferences.remove(key) + } +} + +suspend fun DataStore.toggleValue(key: Preferences.Key, enabled: Boolean?, defaultValue: Boolean = true) { + edit { preferences -> + val toSet = enabled ?: !(preferences[key]?: defaultValue) + preferences[key] = toSet + } +} + +fun DataStore.mapKey(key: Preferences.Key): Flow { + return data.map { preferences -> preferences[key] }.distinctUntilChanged() +} + +fun DataStore.mapKey(key: Preferences.Key, default: T): Flow { + return data.map { preferences -> preferences[key] ?: default }.distinctUntilChanged() +} diff --git a/core/src/main/java/foundation/e/advancedprivacy/data/repositories/AppListRepository.kt b/core/src/main/java/foundation/e/advancedprivacy/data/repositories/AppListRepository.kt new file mode 100644 index 0000000..9000fdc --- /dev/null +++ b/core/src/main/java/foundation/e/advancedprivacy/data/repositories/AppListRepository.kt @@ -0,0 +1,345 @@ +/* + * Copyright (C) 2022 - 2023 MURENA SAS + * Copyright (C) 2022 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.data.repositories + +import android.Manifest +import android.content.Context +import android.content.Intent +import android.content.pm.ApplicationInfo +import android.content.pm.PackageInfo +import android.graphics.drawable.Drawable +import foundation.e.advancedprivacy.domain.entities.ApplicationDescription +import foundation.e.advancedprivacy.domain.entities.DisplayableApp +import foundation.e.advancedprivacy.domain.entities.ProfileType +import foundation.e.advancedprivacy.externalinterfaces.permissions.IPermissionsPrivacyModule +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.joinAll +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking + +class AppListRepository( + private val permissionsModule: IPermissionsPrivacyModule, + private val context: Context, + private val compatibilityAppLabel: CharSequence, + private val compatibilityAppIcon: Drawable, + private val systemAppLabel: CharSequence, + private val systemAppIcon: Drawable, + private val backgroundScope: CoroutineScope +) { + companion object { + private const val PNAME_SETTINGS = "com.android.settings" + private const val PNAME_PWAPLAYER = "foundation.e.pwaplayer" + private const val PNAME_INTENT_VERIFICATION = "com.android.statementservice" + const val PNAME_MICROG_SERVICES_CORE = "com.google.android.gms" + const val PNAME_FUSED_LOCATION = "com.android.location.fused" + const val PNAME_ANDROID_SYSTEM = "android" + + private val compatibilityInternetPNames = setOf( + PNAME_PWAPLAYER, + PNAME_INTENT_VERIFICATION, + PNAME_MICROG_SERVICES_CORE + ) + + private val compatibilityLocationPNames = setOf( + PNAME_PWAPLAYER, + PNAME_INTENT_VERIFICATION + ) + + private val compatibilityPNames = compatibilityInternetPNames + compatibilityLocationPNames + } + + private val _displayableApps = MutableStateFlow>(emptySet()) + val displayableApps: StateFlow> = _displayableApps + + fun getAppById(id: String): DisplayableApp? = _displayableApps.value.find { it.id == id } + + fun getInternetAppByApId(apId: String): DisplayableApp? { + return _displayableApps.value.find { app -> app.hasInternetPermission && app.apps.any { it.apId == apId } } + } + + private var appsByUid = mapOf() + private var appsByAPId = mapOf() + + fun getApp(appUid: Int): ApplicationDescription? { + return appsByUid[appUid] ?: run { + runBlocking { refreshAppDescriptions(fetchMissingIcons = false, force = true)?.join() } + appsByUid[appUid] + } + } + + fun getApp(apId: String): ApplicationDescription? { + if (apId.isBlank()) return null + + return appsByAPId[apId] ?: run { + runBlocking { refreshAppDescriptions(fetchMissingIcons = false, force = true)?.join() } + appsByAPId[apId] + } + } + + private val appResources = mutableMapOf>() + + private suspend fun fetchAppDescriptions(fetchMissingIcons: Boolean = false) { + val compatibilyInternetApps = mutableSetOf() + val compatibilyLocationApps = mutableSetOf() + val systemInternetApps = mutableSetOf() + val systemLocationApps = mutableSetOf() + val appDescs = mutableSetOf() + val tempDisplayableApp = mutableSetOf() + + val fetchResourcesJobs: MutableList = mutableListOf() + + val launcherPackageNames = context.packageManager.queryIntentActivities( + Intent(Intent.ACTION_MAIN, null).apply { addCategory(Intent.CATEGORY_LAUNCHER) }, + 0 + ).mapNotNull { it.activityInfo?.packageName } + + permissionsModule.getApplications().forEach { (appDesc: ApplicationDescription, pkgInfo: PackageInfo) -> + val hasInternetPermission = hasInternetPermission(pkgInfo) + val hasLocationPermission = hasLocationPermission(pkgInfo) + + when { + pkgInfo.packageName in compatibilityPNames -> { + if (pkgInfo.packageName in compatibilityInternetPNames) { + compatibilyInternetApps.add(appDesc) + } + + if (pkgInfo.packageName in compatibilityLocationPNames) { + compatibilyLocationApps.add(appDesc) + } + appDescs.add(appDesc) + } + + !isNotHiddenSystemApp(pkgInfo.applicationInfo, launcherPackageNames) -> { + if (hasInternetPermission) { + systemInternetApps.add(appDesc) + } + + if (hasLocationPermission) { + systemLocationApps.add(appDesc) + } + appDescs.add(appDesc) + } + + hasInternetPermission || hasLocationPermission -> { + appDescs.add(appDesc) + val onResourcesReady: (CharSequence, Drawable) -> Unit = { label, icon -> + tempDisplayableApp.add( + buildDisplayableApp( + appDesc, + label, + icon, + hasInternetPermission, + hasLocationPermission + ) + ) + } + + val resources = appResources[appDesc.apId] + if (resources != null) { + val (label, icon) = resources + onResourcesReady(label, icon) + } else { + fetchResourcesJobs.add(fetchResources(appDesc, pkgInfo, onResourcesReady)) + } + } + + else -> {} // Skip other apps. + } + } + + updateMaps(appDescs.toList()) + + val displayableAppsJob = backgroundScope.launch { + fetchResourcesJobs.joinAll() + updateDisplayableApps( + tempDisplayableApp, + compatibilyInternetApps, + compatibilyLocationApps, + systemInternetApps, + systemLocationApps + ) + } + + if (fetchMissingIcons) { + displayableAppsJob.join() + } + } + + private fun fetchResources( + appDesc: ApplicationDescription, + pkgInfo: PackageInfo, + onResourcesReady: (CharSequence, Drawable) -> Unit + ): Job { + val id = appDesc.apId + return backgroundScope.launch { + val label = permissionsModule.getApplicationLabel(pkgInfo.applicationInfo) + val icon = permissionsModule.getApplicationIcon(appDesc) + + if (icon != null) { + appResources[id] = label to icon + onResourcesReady(label, icon) + } + } + } + + private fun buildDisplayableApp( + appDesc: ApplicationDescription, + label: CharSequence, + icon: Drawable, + hasInternetPermission: Boolean, + hasLocationPermission: Boolean + ): DisplayableApp { + return DisplayableApp( + id = appDesc.apId, + label = label, + icon = icon, + apps = setOf(appDesc), + hasLocationPermission = hasLocationPermission, + hasInternetPermission = hasInternetPermission, + profileType = appDesc.profileType + ) + } + + private fun updateMaps(apps: List) { + val byUid = mutableMapOf() + val byApId = mutableMapOf() + apps.forEach { app -> + byUid[app.uid]?.run { packageName > app.packageName } == true + if (byUid[app.uid].let { it == null || it.packageName > app.packageName }) { + byUid[app.uid] = app + } + + byApId[app.apId] = app + } + appsByUid = byUid + appsByAPId = byApId + } + + private fun updateDisplayableApps( + tempDisplayableApp: MutableSet, + compatibilyInternetApps: MutableSet, + compatibilyLocationApps: MutableSet, + systemInternetApps: MutableSet, + systemLocationApps: MutableSet + ) { + tempDisplayableApp.add( + DisplayableApp( + id = "compatibility-internet", + label = compatibilityAppLabel, + icon = compatibilityAppIcon, + apps = compatibilyInternetApps, + hasLocationPermission = false, + hasInternetPermission = true, + profileType = ProfileType.MAIN + ) + ) + + tempDisplayableApp.add( + DisplayableApp( + id = "compatibility-location", + label = compatibilityAppLabel, + icon = compatibilityAppIcon, + apps = compatibilyLocationApps, + hasLocationPermission = true, + hasInternetPermission = false, + profileType = ProfileType.MAIN + ) + ) + + tempDisplayableApp.add( + DisplayableApp( + id = "system-internet", + label = systemAppLabel, + icon = systemAppIcon, + apps = systemInternetApps, + hasLocationPermission = false, + hasInternetPermission = true, + profileType = ProfileType.MAIN + ) + ) + + tempDisplayableApp.add( + DisplayableApp( + id = "system-location", + label = systemAppLabel, + icon = systemAppIcon, + apps = systemLocationApps, + hasLocationPermission = true, + hasInternetPermission = false, + profileType = ProfileType.MAIN + ) + ) + + _displayableApps.update { + tempDisplayableApp + } + } + + private var lastFetchApps = 0 + private var refreshAppJob: Job? = null + + fun refreshAppDescriptions(fetchMissingIcons: Boolean = true, force: Boolean = false): Job? { + if (refreshAppJob == null || refreshAppJob?.isCompleted == true) { + refreshAppJob = backgroundScope.launch { + if (appsByUid.isEmpty() || appsByAPId.isEmpty() || + force || context.packageManager.getChangedPackages(lastFetchApps) != null + ) { + fetchAppDescriptions(fetchMissingIcons = fetchMissingIcons) + if (fetchMissingIcons) { + lastFetchApps = context.packageManager.getChangedPackages(lastFetchApps) + ?.sequenceNumber ?: lastFetchApps + } + } + } + } + + return refreshAppJob + } + + private fun hasInternetPermission(packageInfo: PackageInfo): Boolean { + return packageInfo.requestedPermissions?.contains(Manifest.permission.INTERNET) == true + } + + private fun hasLocationPermission(packageInfo: PackageInfo): Boolean { + return packageInfo.requestedPermissions?.contains(Manifest.permission.ACCESS_FINE_LOCATION) == true || + packageInfo.requestedPermissions?.contains(Manifest.permission.ACCESS_COARSE_LOCATION) == true + } + + @Suppress("ReturnCount") + private fun isNotHiddenSystemApp(app: ApplicationInfo, launcherApps: List): Boolean { + if (app.packageName == PNAME_SETTINGS) { + return false + } else if (app.packageName == PNAME_PWAPLAYER) { + return true + } else if (app.hasFlag(ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) { + return true + } else if (!app.hasFlag(ApplicationInfo.FLAG_SYSTEM)) { + return true + } else if (launcherApps.contains(app.packageName)) { + return true + } + return false + } + + private fun ApplicationInfo.hasFlag(flag: Int) = (flags and flag) == 1 +} diff --git a/core/src/main/java/foundation/e/advancedprivacy/domain/entities/AppOpModes.kt b/core/src/main/java/foundation/e/advancedprivacy/domain/entities/AppOpModes.kt new file mode 100644 index 0000000..66fa2a8 --- /dev/null +++ b/core/src/main/java/foundation/e/advancedprivacy/domain/entities/AppOpModes.kt @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2022 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.domain.entities + +import android.app.AppOpsManager.MODE_ALLOWED +import android.app.AppOpsManager.MODE_DEFAULT +import android.app.AppOpsManager.MODE_ERRORED +import android.app.AppOpsManager.MODE_FOREGROUND +import android.app.AppOpsManager.MODE_IGNORED +import android.os.Build + +enum class AppOpModes(val modeValue: Int) { + ALLOWED(MODE_ALLOWED), + IGNORED(MODE_IGNORED), + ERRORED(MODE_ERRORED), + DEFAULT(MODE_DEFAULT), + FOREGROUND(if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) MODE_ALLOWED else MODE_FOREGROUND); + + companion object { + private val byMode = mapOf( + FOREGROUND.modeValue to FOREGROUND, + ALLOWED.modeValue to ALLOWED, + IGNORED.modeValue to IGNORED, + ERRORED.modeValue to ERRORED, + DEFAULT.modeValue to DEFAULT + ) + + fun getByModeValue(modeValue: Int): AppOpModes { + return byMode.get(modeValue) ?: DEFAULT + } + } +} diff --git a/core/src/main/java/foundation/e/advancedprivacy/domain/entities/ApplicationDescription.kt b/core/src/main/java/foundation/e/advancedprivacy/domain/entities/ApplicationDescription.kt new file mode 100644 index 0000000..8f7b4ef --- /dev/null +++ b/core/src/main/java/foundation/e/advancedprivacy/domain/entities/ApplicationDescription.kt @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2023 MURENA SAS + * Copyright (C) 2022 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.domain.entities + +import android.graphics.drawable.Drawable + +/** + * Useful informations to identify and describe an application. + */ +data class ApplicationDescription( + val packageName: String, + val uid: Int, + val profileId: Int, + val profileType: ProfileType, + var label: CharSequence?, + var icon: Drawable? +) { + val profileFlag = when (profileType) { + ProfileType.MAIN -> PROFILE_FLAG_MAIN + ProfileType.WORK -> PROFILE_FLAG_WORK + else -> profileId + } + + val apId: String get() = "${profileFlag}_$packageName" + + companion object { + const val PROFILE_FLAG_MAIN = -1 + const val PROFILE_FLAG_WORK = -2 + } +} + +enum class ProfileType { + MAIN, + WORK, + OTHER +} diff --git a/core/src/main/java/foundation/e/advancedprivacy/domain/entities/DisplayableApp.kt b/core/src/main/java/foundation/e/advancedprivacy/domain/entities/DisplayableApp.kt new file mode 100644 index 0000000..e9441d4 --- /dev/null +++ b/core/src/main/java/foundation/e/advancedprivacy/domain/entities/DisplayableApp.kt @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.domain.entities + +import android.graphics.drawable.Drawable + +data class DisplayableApp( + val id: String, + val label: CharSequence, + val icon: Drawable, + val apps: Set, + val hasLocationPermission: Boolean, + val hasInternetPermission: Boolean, + val profileType: ProfileType +) diff --git a/core/src/main/java/foundation/e/advancedprivacy/domain/entities/FeatureState.kt b/core/src/main/java/foundation/e/advancedprivacy/domain/entities/FeatureState.kt new file mode 100644 index 0000000..75b8806 --- /dev/null +++ b/core/src/main/java/foundation/e/advancedprivacy/domain/entities/FeatureState.kt @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.domain.entities + +enum class FeatureState { + OFF, + ON, + STARTING, + STOPPING; + + val isChecked get() = this == ON || this == STARTING + + val isLoading get() = this == STARTING || this == STOPPING +} diff --git a/core/src/main/java/foundation/e/advancedprivacy/domain/entities/LocationMode.kt b/core/src/main/java/foundation/e/advancedprivacy/domain/entities/LocationMode.kt new file mode 100644 index 0000000..512080e --- /dev/null +++ b/core/src/main/java/foundation/e/advancedprivacy/domain/entities/LocationMode.kt @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2021 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.domain.entities + +enum class LocationMode { + REAL_LOCATION, + RANDOM_LOCATION, + SPECIFIC_LOCATION +} diff --git a/core/src/main/java/foundation/e/advancedprivacy/domain/entities/MainFeatures.kt b/core/src/main/java/foundation/e/advancedprivacy/domain/entities/MainFeatures.kt new file mode 100644 index 0000000..335565f --- /dev/null +++ b/core/src/main/java/foundation/e/advancedprivacy/domain/entities/MainFeatures.kt @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2023 MURENA SAS + * Copyright (C) 2022 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.domain.entities + +import android.content.Intent +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +sealed class MainFeatures : Parcelable { + @Parcelize + data class TrackersControl(val startVpnDisclaimer: Intent? = null) : MainFeatures() + + @Parcelize + object FakeLocation : MainFeatures() + + @Parcelize + data class IpScrambling(val startVpnDisclaimer: Intent? = null) : MainFeatures() +} diff --git a/core/src/main/java/foundation/e/advancedprivacy/domain/entities/NotificationChannels.kt b/core/src/main/java/foundation/e/advancedprivacy/domain/entities/NotificationChannels.kt new file mode 100644 index 0000000..4458e1d --- /dev/null +++ b/core/src/main/java/foundation/e/advancedprivacy/domain/entities/NotificationChannels.kt @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.domain.entities + +const val CHANNEL_FIRST_BOOT = "first_boot_notification" +const val CHANNEL_FAKE_LOCATION_FLAG = "fake_location_flag" +const val CHANNEL_IPSCRAMBLING_FLAG = "ipscrambling_flag" +const val CHANNEL_TRACKER_FLAG = "tracker_flag" + +const val NOTIFICATION_FIRST_BOOT = 1000 +const val NOTIFICATION_FAKE_LOCATION_FLAG = NOTIFICATION_FIRST_BOOT + 1 +const val NOTIFICATION_IPSCRAMBLING_FLAG = NOTIFICATION_FAKE_LOCATION_FLAG + 1 +const val NOTIFICATION_TRACKER_FLAG = NOTIFICATION_IPSCRAMBLING_FLAG + 1 diff --git a/core/src/main/java/foundation/e/advancedprivacy/domain/entities/NotificationContent.kt b/core/src/main/java/foundation/e/advancedprivacy/domain/entities/NotificationContent.kt new file mode 100644 index 0000000..44b508d --- /dev/null +++ b/core/src/main/java/foundation/e/advancedprivacy/domain/entities/NotificationContent.kt @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.domain.entities + +import android.app.PendingIntent + +data class NotificationContent( + val channelId: String, + val icon: Int, + val title: Int, + val description: Int, + val pendingIntent: PendingIntent? +) diff --git a/core/src/main/java/foundation/e/advancedprivacy/domain/entities/PermissionDescription.kt b/core/src/main/java/foundation/e/advancedprivacy/domain/entities/PermissionDescription.kt new file mode 100644 index 0000000..c3899a9 --- /dev/null +++ b/core/src/main/java/foundation/e/advancedprivacy/domain/entities/PermissionDescription.kt @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2022 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.domain.entities + +data class PermissionDescription( + val name: String, + var isDangerous: Boolean, + val group: String?, + var label: CharSequence?, + var description: CharSequence? +) diff --git a/core/src/main/java/foundation/e/advancedprivacy/domain/entities/ToggleableApp.kt b/core/src/main/java/foundation/e/advancedprivacy/domain/entities/ToggleableApp.kt new file mode 100644 index 0000000..bff4383 --- /dev/null +++ b/core/src/main/java/foundation/e/advancedprivacy/domain/entities/ToggleableApp.kt @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2024 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.domain.entities + +data class ToggleableApp( + val isOn: Boolean, + val app: DisplayableApp +) diff --git a/core/src/main/java/foundation/e/advancedprivacy/domain/repositories/LocalStateRepository.kt b/core/src/main/java/foundation/e/advancedprivacy/domain/repositories/LocalStateRepository.kt new file mode 100644 index 0000000..e8fcb54 --- /dev/null +++ b/core/src/main/java/foundation/e/advancedprivacy/domain/repositories/LocalStateRepository.kt @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2023 - 2024 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.domain.repositories + +import foundation.e.advancedprivacy.domain.entities.ApplicationDescription +import foundation.e.advancedprivacy.domain.entities.DisplayableApp +import foundation.e.advancedprivacy.domain.entities.FeatureState +import foundation.e.advancedprivacy.domain.entities.MainFeatures +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharedFlow + +interface LocalStateRepository { + val blockTrackers: Flow + suspend fun toggleBlockTrackers(enabled: Boolean?) + + val areAllTrackersBlocked: MutableStateFlow + + val fakeLocationEnabled: Flow + suspend fun toggleFakeLocation(enabled: Boolean?) + + val fakeLocation: Flow> + suspend fun getFakeLocation(): Pair + suspend fun setFakeLocation(latLon: Pair) + + val fakeLocationWhitelistedApps: Flow> + + suspend fun toggleAppFakeLocationWhitelisted(app: DisplayableApp) + suspend fun resetFakeLocationWhitelistedApp() + + val ipScramblingEnabled: Flow + suspend fun toggleIpScrambling(enabled: Boolean?) + + val internetPrivacyMode: MutableStateFlow + + suspend fun emitStartVpnDisclaimer(feature: MainFeatures) + + val startVpnDisclaimer: SharedFlow + + suspend fun emitOtherVpnRunning(appDesc: ApplicationDescription) + val otherVpnRunning: SharedFlow + + suspend fun isFirstBoot(): Boolean + suspend fun setFirstBoot(isStillFirstBoot: Boolean) + + suspend fun isHideWarningTrackers(): Boolean + suspend fun hideWarningTrackers(hide: Boolean) + + suspend fun isHideWarningLocation(): Boolean + suspend fun hideWarningLocation(hide: Boolean) + + suspend fun isHideWarningIpScrambling(): Boolean + suspend fun hideWarningIpScrambling(hide: Boolean) + + suspend fun getTrackersScreenLastPosition(): Int + suspend fun setTrackersScreenLastPosition(position: Int) + + var trackersScreenTabStartPosition: Int +} diff --git a/core/src/main/java/foundation/e/advancedprivacy/domain/usecases/VpnSupervisorUseCase.kt b/core/src/main/java/foundation/e/advancedprivacy/domain/usecases/VpnSupervisorUseCase.kt new file mode 100644 index 0000000..da35b47 --- /dev/null +++ b/core/src/main/java/foundation/e/advancedprivacy/domain/usecases/VpnSupervisorUseCase.kt @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.domain.usecases + +import foundation.e.advancedprivacy.domain.entities.MainFeatures + +interface VpnSupervisorUseCase { + fun listenSettings() + + fun startVpnService(feature: MainFeatures) + + suspend fun cancelStartVpnService(feature: MainFeatures) +} diff --git a/core/src/main/java/foundation/e/advancedprivacy/externalinterfaces/permissions/IPermissionsPrivacyModule.kt b/core/src/main/java/foundation/e/advancedprivacy/externalinterfaces/permissions/IPermissionsPrivacyModule.kt new file mode 100644 index 0000000..599cb37 --- /dev/null +++ b/core/src/main/java/foundation/e/advancedprivacy/externalinterfaces/permissions/IPermissionsPrivacyModule.kt @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2022 - 2023 MURENA SAS + * Copyright (C) 2021 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.externalinterfaces.permissions + +import android.app.NotificationChannel +import android.content.pm.ApplicationInfo +import android.content.pm.PackageInfo +import android.graphics.drawable.Drawable +import foundation.e.advancedprivacy.domain.entities.AppOpModes +import foundation.e.advancedprivacy.domain.entities.ApplicationDescription +import foundation.e.advancedprivacy.domain.entities.PermissionDescription +import foundation.e.advancedprivacy.domain.entities.ProfileType + +/** + * List applications and manage theirs permissions. + */ +interface IPermissionsPrivacyModule { + + fun buildApplicationDescription( + appInfo: ApplicationInfo, + profileId: Int = -1, + profileType: ProfileType = ProfileType.MAIN + ): ApplicationDescription + + fun getApplications(): List> + + /** + * List of permissions names used by an app, specified by its [packageName]. + * @param packageName the appId of the app + * @return the list off permission, in the "android.permission.PERMISSION" format. + */ + fun getPermissions(packageName: String): List + + fun getPermissionDescription(permissionName: String): PermissionDescription + + /** + * Get the filled up [ApplicationDescription] for the app specified by its [packageName] + * @param packageName the appId of the app + * @return the informations about the app. + */ + fun getApplicationDescription(packageName: String, withIcon: Boolean = true): ApplicationDescription + + /** + * Check if the current runtime permission is granted for the specified app. + * + * @param packageName the packageName of the app + * @param permissionName the name of the permission in "android.permission.PERMISSION" format. + * @return the current status for this permission. + */ + fun isDangerousPermissionGranted(packageName: String, permissionName: String): Boolean + + /** + * Get the appOps mode for the specified [appOpPermissionName] of the specified application. + * + * @param appDesc the application + * @param appOpPermissionName the AppOps permission name. + * @return mode, as a [AppOpModes] + */ + fun getAppOpMode(appDesc: ApplicationDescription, appOpPermissionName: String): AppOpModes + + /** + * Grant or revoke the specified permission for the specigfied app. + * If their is not enough privileges to get the permission, return the false + * + * @param appDesc the application + * @param permissionName the name of the permission in "android.permission.PERMISSION" format. + * @param grant true grant the permission, false revoke it. + * @return true if the permission is or has just been granted, false if + * user has to do it himself. + */ + fun toggleDangerousPermission(appDesc: ApplicationDescription, permissionName: String, grant: Boolean): Boolean + + /** + * Change the appOp Mode for the specified appOpPermission and application. + * @param appDesc the application + * @param appOpPermissionName the AppOps permission name. + * @return true if the mode has been changed, false if + * user has to do it himself. + */ + fun setAppOpMode(appDesc: ApplicationDescription, appOpPermissionName: String, status: AppOpModes): Boolean + + /** + * Return true if the application is flagged Dangerous. + */ + fun isPermissionsDangerous(permissionName: String): Boolean + + /** + * Get the application icon. + */ + fun getApplicationIcon(packageName: String): Drawable? + + /** + * Get the application icon. + */ + fun getApplicationIcon(app: ApplicationDescription): Drawable? + + fun getApplicationLabel(appInfo: ApplicationInfo): CharSequence + + /** + * Authorize the specified package to be used as Vpn. + * @return true if authorization has been set, false if an error has occurred. + */ + fun setVpnPackageAuthorization(packageName: String): Boolean + + /** + * Returns the package name of the currently set always-on VPN application, or null. + */ + fun getAlwaysOnVpnPackage(): String? + + /** + * Allows users to block notifications sent through this channel, if this channel belongs to + * a package that is signed with the system signature. + * + * If the channel does not belong to a package that is signed with the system signature, this + * method does nothing, since such channels are blockable by default and cannot be set to be + * unblockable. + */ + fun setBlockable(notificationChannel: NotificationChannel) +} diff --git a/core/src/main/java/foundation/e/advancedprivacy/externalinterfaces/permissions/PermissionsPrivacyModuleBase.kt b/core/src/main/java/foundation/e/advancedprivacy/externalinterfaces/permissions/PermissionsPrivacyModuleBase.kt new file mode 100644 index 0000000..0a19519 --- /dev/null +++ b/core/src/main/java/foundation/e/advancedprivacy/externalinterfaces/permissions/PermissionsPrivacyModuleBase.kt @@ -0,0 +1,153 @@ +/* + * Copyright (C) 2022 - 2023 MURENA SAS + * Copyright (C) 2021 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.externalinterfaces.permissions + +import android.app.AppOpsManager +import android.content.Context +import android.content.pm.ApplicationInfo +import android.content.pm.PackageManager +import android.content.pm.PermissionInfo +import android.content.pm.PermissionInfo.PROTECTION_DANGEROUS +import android.graphics.drawable.Drawable +import android.os.Build +import android.util.Log +import foundation.e.advancedprivacy.domain.entities.AppOpModes +import foundation.e.advancedprivacy.domain.entities.ApplicationDescription +import foundation.e.advancedprivacy.domain.entities.PermissionDescription +import foundation.e.advancedprivacy.domain.entities.ProfileType + +/** + * Implementation of the commons functionality between privileged and standard + * versions of the module. + * @param context an Android context, to retrieve packageManager for example. + */ +abstract class PermissionsPrivacyModuleBase(protected val context: Context) : IPermissionsPrivacyModule { + + companion object { + private const val TAG = "PermissionsModule" + } + + /** + * @see IPermissionsPrivacyModule.getInstalledApplications + */ + override fun getApplicationDescription(packageName: String, withIcon: Boolean): ApplicationDescription { + val appDesc = buildApplicationDescription(context.packageManager.getApplicationInfo(packageName, 0)) + if (withIcon) { + appDesc.icon = getApplicationIcon(appDesc.packageName) + } + return appDesc + } + + /** + * * @see IPermissionsPrivacyModule.getPermissions + */ + override fun getPermissions(packageName: String): List { + val packageInfo = context.packageManager.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS) + return packageInfo.requestedPermissions?.asList() ?: emptyList() + } + + override fun getPermissionDescription(permissionName: String): PermissionDescription { + val info = context.packageManager.getPermissionInfo(permissionName, 0) + return PermissionDescription( + name = permissionName, + isDangerous = isPermissionsDangerous(info), + group = null, + label = info.loadLabel(context.packageManager), + description = info.loadDescription(context.packageManager) + ) + } + + /** + * @see IPermissionsPrivacyModule.isDangerousPermissionGranted + */ + override fun isDangerousPermissionGranted(packageName: String, permissionName: String): Boolean { + return context.packageManager + .checkPermission(permissionName, packageName) == PackageManager.PERMISSION_GRANTED + } + + // on google version, work only for the current package. + @Suppress("DEPRECATION") + override fun getAppOpMode(appDesc: ApplicationDescription, appOpPermissionName: String): AppOpModes { + val appOps = context.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager + + val mode = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { + appOps.checkOpNoThrow( + appOpPermissionName, + + appDesc.uid, + appDesc.packageName + ) + } else { + appOps.unsafeCheckOpNoThrow( + appOpPermissionName, + appDesc.uid, + appDesc.packageName + ) + } + + return AppOpModes.getByModeValue(mode) + } + + override fun isPermissionsDangerous(permissionName: String): Boolean { + try { + val permissionInfo = context.packageManager.getPermissionInfo(permissionName, 0) + return isPermissionsDangerous(permissionInfo) + } catch (e: Exception) { + Log.w(TAG, "exception in isPermissionsDangerous(String)", e) + return false + } + } + + @Suppress("DEPRECATION") + private fun isPermissionsDangerous(permissionInfo: PermissionInfo): Boolean { + try { + return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { + permissionInfo.protectionLevel and PROTECTION_DANGEROUS == 1 + } else { + permissionInfo.protection == PROTECTION_DANGEROUS + } + } catch (e: Exception) { + Log.w(TAG, "exception in isPermissionsDangerous(PermissionInfo)", e) + return false + } + } + + override fun buildApplicationDescription(appInfo: ApplicationInfo, profileId: Int, profileType: ProfileType): ApplicationDescription { + return ApplicationDescription( + packageName = appInfo.packageName, + uid = appInfo.uid, + label = null, + icon = null, + profileId = profileId, + profileType = profileType + ) + } + + override fun getApplicationLabel(appInfo: ApplicationInfo): CharSequence { + return context.packageManager.getApplicationLabel(appInfo) + } + + fun getApplicationIcon(appInfo: ApplicationInfo): Drawable? { + return runCatching { context.packageManager.getApplicationIcon(appInfo) }.getOrNull() + } + + override fun getApplicationIcon(packageName: String): Drawable? { + return runCatching { context.packageManager.getApplicationIcon(packageName) }.getOrNull() + } +} diff --git a/core/src/main/java/foundation/e/advancedprivacy/externalinterfaces/servicesupervisors/FeatureSupervisor.kt b/core/src/main/java/foundation/e/advancedprivacy/externalinterfaces/servicesupervisors/FeatureSupervisor.kt new file mode 100644 index 0000000..632172d --- /dev/null +++ b/core/src/main/java/foundation/e/advancedprivacy/externalinterfaces/servicesupervisors/FeatureSupervisor.kt @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.externalinterfaces.servicesupervisors + +import foundation.e.advancedprivacy.domain.entities.FeatureState +import kotlinx.coroutines.flow.StateFlow + +interface FeatureSupervisor { + fun start(): Boolean + fun stop(): Boolean + + val state: StateFlow +} diff --git a/detekt.yml b/detekt.yml new file mode 100644 index 0000000..4efb865 --- /dev/null +++ b/detekt.yml @@ -0,0 +1,22 @@ +# Naming rules +naming: + + ConstructorParameterNaming: + active: false + + VariableNaming: + active: false + + +# Style rules +style: + + ForbiddenComment: + active: false + + +# Complexity rules +complexity: + + TooManyFunctions: + ignorePrivate: true diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..bcc06b3 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,23 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app"s APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true +gitLabPrivateToken="" +android.defaults.buildfeatures.buildconfig=true +android.nonTransitiveRClass=false +android.nonFinalResIds=false diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..71989aa --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,61 @@ +[versions] +agp = "8.2.0" +detekt = "1.23.1" +koin = "3.4.3" +kotlinx-coroutines = "1.7.3" +kotlin = "1.9.21" +androidx-navigation = "2.7.6" +androidx-lifecycle = "2.6.2" +orbotservice = "orbot-17.2.1-2" +retrofit = "2.9.0" +pcap4j = "1.8.2" + +[libraries] + +androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version = "1.6.1" } +androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version = "1.12.0" } +androidx-datastore-preferences = { group = "androidx.datastore", name="datastore-preferences", version = "1.1.1" } +androidx-fragment-ktx = { group = "androidx.fragment", name = "fragment-ktx", version = "1.6.2" } +androidx-lifecycle-runtime = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "androidx-lifecycle" } +androidx-lifecycle-viewmodel = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-ktx", version.ref = "androidx-lifecycle" } +androidx-localbroadcast = { group = "androidx.localbroadcastmanager", name = "localbroadcastmanager", version = "1.1.0" } +androidx-navigation-fragment = { group = "androidx.navigation", name = "navigation-fragment-ktx", version.ref = "androidx-navigation" } +androidx-navigation-ui = { group = "androidx.navigation", name = "navigation-ui-ktx", version.ref = "androidx-navigation" } +androidx-palette = { group = "androidx.palette", name = "palette", version = "1.0.0" } +androidx-viewpager2 = { group = "androidx.viewpager2", name = "viewpager2", version = "1.0.0" } +androidx-work-ktx = { group = "androidx.work", name = "work-runtime-ktx", version = "2.9.0" } +eos-elib = { group = "foundation.e", name = "elib", version = "0.0.1-alpha11" } +eos-orbotservice = { group = "foundation.e", name = "orbotservice", version.ref = "orbotservice" } +eos-telemetry = { group = "foundation.e.lib", name = "telemetry", version = "0.0.8-alpha" } +google-material = { group = "com.google.android.material", name = "material", version = "1.11.0" } +google-gson = { group = "com.google.code.gson", name = "gson", version = "2.10.1" } +junit = { group = "junit", name = "junit", version = "4.13.2" } +koin-core = { group = "io.insert-koin", name = "koin-core", version.ref = "koin" } +koin-android = { group = "io.insert-koin", name = "koin-android", version.ref = "koin" } +kotlinx-coroutines-android = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "kotlinx-coroutines" } +kotlinx-coroutines = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version.ref = "kotlinx-coroutines" } +leakcanary = { group = "com.squareup.leakcanary", name = "leakcanary-android", version = "2.10" } +maplibre = { group = "org.maplibre.gl", name = "android-sdk", version = "10.2.0" } +mpandroidcharts = { group = "com.github.PhilJay", name = "MPAndroidChart", version = "v3.1.0" } +pcap4j = { group = "org.pcap4j", name = "pcap4j-core", version.ref = "pcap4j" } +pcap4j-packetfactory-static = { group = "org.pcap4j", name = "pcap4j-packetfactory-static", version.ref = "pcap4j" } +retrofit = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "retrofit" } +retrofit-scalars = { group = "com.squareup.retrofit2", name = "converter-scalars", version.ref = "retrofit" } +timber = { group = "com.jakewharton.timber", name = "timber", version = "5.0.1" } + +[bundles] + +koin = ["koin-core", "koin-android"] +kotlin-android-coroutines = ["androidx-core-ktx", "kotlinx-coroutines"] +pcap4j = ["pcap4j", "pcap4j-packetfactory-static"] + +[plugins] + +android-application = { id = "com.android.application", version.ref = "agp" } +android-library = { id = "com.android.library", version.ref = "agp" } +androidx-navigation-safeargs = { id = "androidx.navigation.safeargs.kotlin", version.ref = "androidx-navigation" } +benmanes-versions = { id = "com.github.ben-manes.versions", version = "0.38.0" } +detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" } +kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" } +spotless = { id = "com.diffplug.spotless", version = "6.23.3" } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..f6b961fd5a86aa5fbfe90f707c3138408be7c718 GIT binary patch literal 54329 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

    <5G2M1WZP5 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 F{|7XC?P&l2 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..16a3dd5 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Sat Jul 16 09:07:59 CEST 2022 +distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..cccdd3d --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..f955316 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/hooks/pre-commit b/hooks/pre-commit new file mode 100755 index 0000000..6e0b167 --- /dev/null +++ b/hooks/pre-commit @@ -0,0 +1,46 @@ +#!/bin/bash + +filesToAddAfterFormatting=() +containsSpotlessEnabledFormats=0 + +# Collect all files currently in staging area, and check if there are any spotless enabled format file +# We currently support only *.kt, *.gradle', '*.md', '.gitignore' files. +for entry in $(git status --porcelain | sed -r 's/[ \t]+/-/g'); do + # entry can be for example: + # MM-src/main/java/net/project/MyController.java + # -M-src/main/java/net/project/AnotherController.java + + if [[ $entry == M* ]]; then + filesToAddAfterFormatting+=(${entry:2}) # strips the prefix + fi + + if [[ $entry == *.kt ]] || [[ $entry == *.gradle ]] || [[ $entry == *.md ]] || [[ $entry == .gitignore ]]; then + containsSpotlessEnabledFormats=1 + fi +done + +# If any java or kotlin files are found, run spotlessApply +if [ "$containsSpotlessEnabledFormats" == "1" ]; then + echo '[git hook] executing gradle spotlessCheck before commit' + ./gradlew spotlessCheck + EXIT_CODE=$? + if [ $EXIT_CODE -ne 0 ]; then + echo "❌ [git hook] spotlessCheck failed, running spotlessApply for you..." + + ./gradlew spotlessApply + + echo "[git hook] Formatting done, please try your commit again! If the problem persists, apply fixes manually." + exit $EXIT_CODE + fi + echo "✔️ [git hook] Spotless: Everything looks clean!" +else + echo "[git hook] Not running spotless" +fi + +# Add the files that were in the staging area +for file in "${filesToAddAfterFormatting[@]}"; do + echo "re-adding $file after formatting" + git add "$file" +done + +exit 0 diff --git a/hooks/setup-hooks b/hooks/setup-hooks new file mode 100755 index 0000000..4f48be0 --- /dev/null +++ b/hooks/setup-hooks @@ -0,0 +1,4 @@ +#!/bin/sh + +# This script setups symlink from .git/hooks directory to this directory. +ln -s -f ../../hooks/pre-commit .git/hooks/pre-commit \ No newline at end of file diff --git a/ipscrambling/.gitignore b/ipscrambling/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/ipscrambling/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/ipscrambling/Orbot_LICENSE b/ipscrambling/Orbot_LICENSE new file mode 100644 index 0000000..194b99d --- /dev/null +++ b/ipscrambling/Orbot_LICENSE @@ -0,0 +1,206 @@ +This file contains the license for Orbot, a free software project to +provide anonymity on the Internet from a Google Android smartphone. + +It also lists the licenses for other components used by Orbot, including +Tor, and iptables. + +For more information about Orbot, see https://guardianproject.info/apps/org.torproject.android/ + +If you got this file as a part of a larger bundle, there may be other +license terms that you should be aware of. +=============================================================================== +Orbot is distributed under this license (aka the 3-clause BSD license) + +Copyright (c) 2009-2010, Nathan Freitas, The Guardian Project + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + + * Neither the names of the copyright owners nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +***** + +=============================================================================== +Orbot includes the Obfs4 pluggable transport: +https://gitweb.torproject.org/pluggable-transports/obfs4.git + +Copyright (c) 2014, Yawning Angel +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +=============================================================================== + + +***** +Orbot contains a binary distribution of Tor: + + This file contains the license for Tor, + a free software project to provide anonymity on the Internet. + + It also lists the licenses for other components used by Tor. + + For more information about Tor, see https://www.torproject.org/. + + If you got this file as a part of a larger bundle, + there may be other license terms that you should be aware of. + +=============================================================================== +Tor is distributed under this license: + +Copyright (c) 2001-2004, Roger Dingledine +Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson +Copyright (c) 2007-2009, The Tor Project, Inc. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + + * Neither the names of the copyright owners nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +=============================================================================== + +src/common/strlcat.c and src/common/strlcpy.c by Todd C. Miller are licensed +under the following license: + + * Copyright (c) 1998 Todd C. Miller + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +=============================================================================== +If you got Tor as a static binary with OpenSSL included, then you should know: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.openssl.org/)" +=============================================================================== + +=============================================================================== +"This program uses the IP-to-Country Database provided by +WebHosting.Info (http://www.webhosting.info), available from +http://ip-to-country.webhosting.info." +See the src/config/geoip file in particular. +=============================================================================== + +=============================================================================== +Orbot also uses iptables from the Netfilter.org project + +netfilter/iptables is - like all of the Linux Kernel - Free Software (sometimes +referred to as Open Source Software), distributed under the terms of the GNU GPLv2 +only. Please, note that some source code files might differ, and in that case it +is explicitely stated in the header of every file. + +The GPL also contains some obligations. If you distribute netfilter/iptables code +in binary form, you have to offer the source code, too. +=============================================================================== + +=============================================================================== +Orbot also includes BadVPN tun2socks: https://github.com/ambrop72/badvpn + +Copyright (c) 2009, Ambroz Bizjak +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the author nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +=============================================================================== diff --git a/ipscrambling/README.md b/ipscrambling/README.md new file mode 100644 index 0000000..104060a --- /dev/null +++ b/ipscrambling/README.md @@ -0,0 +1,42 @@ +# Ipscrambling module + +This Module implements IpScramblerModule functionnalities with Tor, reliying on a fork of OrbotService. + +# Build + +Ipscrambling includes a git repo submodules of OrbotService, the module used by Orbot to run Tor + +Be sure that you have all of the git submodules up-to-date: + +` git submodule update --init --recursive +` +You can build the AAR modules : + + ./gradlew :ipscrambling:orbotservice:assembleRelease + +To deploy localy during development + + ./gradlew --console=verbose publishToMavenLocal + +This will put compiled AAR and pom file exposing their dependencies in the local maven +repository (usually in ~/.m2/repository). + + +To push release on gitlab (you will need a valid gitLabPrivateToken in ~/.gradle/gradle.properties) + + ./gradlew --console=verbose publish + +# Update orbotservice to an upper Orbot version + +1. Upgrade the code: follow the steps in [orbotservice/README.md](orbotservice/README.md) +2. Prepare the orbotservice the dependencies : follow the steps in [exportdependencies/update_dependencies.md](exportdependencies/update_dependencies.md), first using the mvn install:install-file command +3. build and deploy orbotservice locally: + + ./gradlew :ipscrambling:orbotservice:assembleRelease + ./gradlew --console=verbose :ipscrambling:orbotservice:publishToMavenLocal + +5. Test this new version with advanced privacy, and merge the orbotservice. +6. deploy the orbotservice dependencies to gitlab registry see [exportdependencies/update_dependencies.md](exportdependencies/update_dependencies.md), using mvn deploy:deploy-file command +7. deploy orbotservice in gitlab registry + ./gradlew --console=verbose :orbotservice:publish +8. Create MR in AdvancedPrivacy. diff --git a/ipscrambling/build.gradle b/ipscrambling/build.gradle new file mode 100644 index 0000000..e8fa006 --- /dev/null +++ b/ipscrambling/build.gradle @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2021 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +plugins { + id 'com.android.library' + id 'kotlin-android' +} + +android { + compileSdkVersion buildConfig.compileSdk + + defaultConfig { + minSdkVersion buildConfig.minSdk + targetSdkVersion buildConfig.targetSdk + + consumerProguardFiles "consumer-rules.pro" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + kotlinOptions { + jvmTarget = '17' + } + namespace 'foundation.e.advancedprivacy.ipscrambler' +} + +dependencies { + implementation( + libs.bundles.koin, + libs.bundles.kotlin.android.coroutines, + libs.androidx.localbroadcast, + libs.pcap4j, + libs.timber + ) + implementation libs.eos.orbotservice + implementation project(':core') +} diff --git a/ipscrambling/commons.gradle b/ipscrambling/commons.gradle new file mode 100644 index 0000000..478724d --- /dev/null +++ b/ipscrambling/commons.gradle @@ -0,0 +1,12 @@ + +/* + Applies across all modules + */ +android { + compileSdkVersion buildConfig.compileSdk + + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } +} diff --git a/ipscrambling/consumer-rules.pro b/ipscrambling/consumer-rules.pro new file mode 100644 index 0000000..e69de29 diff --git a/ipscrambling/dependencies.gradle b/ipscrambling/dependencies.gradle new file mode 100644 index 0000000..ce5d82b --- /dev/null +++ b/ipscrambling/dependencies.gradle @@ -0,0 +1,60 @@ +ext { + orbotversions = [ + android_material : "1.9.0", + android_shell : "1.0.0", + android_snowfall : "1.2.1", + android_volley : "1.2.0", + androidx_appcompat : "1.3.1", + androidx_constraint : "2.1.0", + androidx_coordinator : "1.1.0", + androidx_core : "1.13.1", + androidx_leanback : "1.2.0-alpha01", + androidx_leanback_paging : "1.1.0-alpha08", + androidx_leanback_tab : "1.1.0-beta01", + androidx_localbroadcast : "1.1.0", + androidx_multidex : "2.0.1", + androidx_palette : "1.0.0", + androidx_recyclerview : "1.2.1", + androidx_work : "2.7.1", + apl_appintro : "v4.2.3", + bclogic_pulsator : "1.0.3", + fastlane_screengrab : "2.0.0", + guardian_jtorctl : "0.4.5.7", + ipt_proxy : "1.7.1", + orbot_service : "orbot-17.2.1-2", //libs.versions.orbotservice, + orbot_service_dependencies : "orbot-17.2.1-1", + pcap_core : "1.8.2", + pcap_factory : "1.8.2", + tor_android : "0.4.8.7", + ] + + orbotlibs = [ + android_material : "com.google.android.material:material:$orbotversions.android_material", + android_shell : "com.jaredrummler:android-shell:$orbotversions.android_shell", + android_snowfall : "com.github.jetradarmobile:android-snowfall:$orbotversions.android_snowfall", + android_volley : "com.android.volley:volley:$orbotversions.android_volley", + androidx_appcompat : "androidx.appcompat:appcompat:$orbotversions.androidx_appcompat", + androidx_constraint : "androidx.constraintlayout:constraintlayout:$orbotversions.androidx_constraint", + androidx_coordinator : "androidx.coordinatorlayout:coordinatorlayout:$orbotversions.androidx_coordinator", + androidx_core : "androidx.core:core:$orbotversions.androidx_core", + androidx_leanback_core : "androidx.leanback:leanback:$orbotversions.androidx_leanback", + androidx_leanback_paging : "androidx.leanback:leanback-paging:$orbotversions.androidx_leanback_paging", + androidx_leanback_preferences : "androidx.leanback:leanback-preference:$orbotversions.androidx_leanback", + androidx_leanback_tab : "androidx.leanback:leanback-tab:$orbotversions.androidx_leanback_tab", + androidx_localbroadcast : "androidx.localbroadcastmanager:localbroadcastmanager:$orbotversions.androidx_localbroadcast", + androidx_multidex : "androidx.multidex:multidex:$orbotversions.androidx_multidex", + androidx_palette : "androidx.palette:palette:$orbotversions.androidx_palette", + androidx_recyclerview : "androidx.recyclerview:recyclerview:$orbotversions.androidx_recyclerview", + androidx_work : "androidx.work:work-runtime:$orbotversions.androidx_work", + androidx_work_kotlin : "androidx.work:work-runtime-ktx:$orbotversions.androidx_work", + apl_appintro : "com.github.apl-devs:appintro:$orbotversions.apl_appintro", + bclogic_pulsator : "pl.bclogic:pulsator4droid:$orbotversions.bclogic_pulsator", + fastlane_screengrab : "tools.fastlane:screengrab:$orbotversions.fastlane_screengrab", + guardian_geoip : "foundation.e:geoip:$orbotversions.orbot_service_dependencies", + guardian_jtorctl : "info.guardianproject:jtorctl:$orbotversions.guardian_jtorctl", + orbotlib : "foundation.e:orbotlib:$orbotversions.orbot_service_dependencies", + pcap_core : "org.pcap4j:pcap4j-core:$orbotversions.pcap_core", + pcap_factory : "org.pcap4j:pcap4j-packetfactory-static:$orbotversions.pcap_factory", + tor_android : "foundation.e:tor-android:$orbotversions.orbot_service_dependencies", + ] +} diff --git a/ipscrambling/exportdependencies/pom.xml b/ipscrambling/exportdependencies/pom.xml new file mode 100644 index 0000000..88238b6 --- /dev/null +++ b/ipscrambling/exportdependencies/pom.xml @@ -0,0 +1,24 @@ + + + 4.0.0 + foundation.e + orbotservice + orbot-17.2.1-1 + + + + + ${project.groupId} + ${project.artifactId} + ${project.version} + aar + OrbotLib.aar + + + + + gitlab-e-maven + https://gitlab.e.foundation/api/v4/projects/1063/packages/maven + + + diff --git a/ipscrambling/exportdependencies/publish.gradle b/ipscrambling/exportdependencies/publish.gradle new file mode 100644 index 0000000..3ff0f91 --- /dev/null +++ b/ipscrambling/exportdependencies/publish.gradle @@ -0,0 +1,52 @@ +apply plugin: 'maven-publish' + +publishing { + publications { + maven(MavenPublication) { + groupId 'foundation.e' + artifactId 'orbotservice' + version orbotversions.orbot_service + artifact "$buildDir/outputs/aar/orbotservice-release.aar" + + pom.withXml { + def dependenciesNode = asNode().appendNode('dependencies') + configurations.implementation.allDependencies.each { dependency -> + if (dependency.name != 'unspecified') { + def dependencyNode = dependenciesNode.appendNode('dependency') + dependencyNode.appendNode('groupId', dependency.group) + dependencyNode.appendNode('artifactId', dependency.name) + dependencyNode.appendNode('version', dependency.version) + } + } + } + + repositories { + def ciJobToken = System.getenv("CI_JOB_TOKEN") + def ciApiV4Url = System.getenv("CI_API_V4_URL") + if (ciJobToken != null) { + maven { + url "${ciApiV4Url}/projects/900/packages/maven" + credentials(HttpHeaderCredentials) { + name = 'Job-Token' + value = ciJobToken + } + authentication { + header(HttpHeaderAuthentication) + } + } + } else { + maven { + url "https://gitlab.e.foundation/api/v4/projects/900/packages/maven" + credentials(HttpHeaderCredentials) { + name = "Private-Token" + value = gitLabPrivateToken + } + authentication { + header(HttpHeaderAuthentication) + } + } + } + } + } + } +} \ No newline at end of file diff --git a/ipscrambling/exportdependencies/update_dependencies.md b/ipscrambling/exportdependencies/update_dependencies.md new file mode 100644 index 0000000..faf11f3 --- /dev/null +++ b/ipscrambling/exportdependencies/update_dependencies.md @@ -0,0 +1,43 @@ +A few orbot dependencies are added directly through the /libs directory, because remotely available version are outdated. We can't embed .aar or .jar into the orbotservice.aar (as any aar), so we have to expose this dependencies in the gitlab repository. + +To do that we use the mn deploy:deploy-file command ; and also the mvn install:install-file command to deploy in local maven repository for development. + +1. Update the orbot_service version in + * exportdependencies/pom.xml file + * dependencies.gradle +2. For each dependencies in orbot/libs, update or prepare an entry in dependecies.gradle, using groupId=foundation.e ; version orbot_service, and an approprioate artifactId . +3. For each dependencies in orbot/libs, run with appropriate PATH and ARTIFACTID : + +mvn install:install-file \ +-DartifactId=[ARTIFACTID] \ +-Dpackaging=aar \ +-Dfile=[PATH] + +4. Later, when isvalidated, deploy to gitlab repository: + +mvn deploy:deploy-file \ +-DrepositoryId=gitlab-e-maven \ +-Durl=https://gitlab.e.foundation/api/v4/projects/900/packages/maven \ +-DartifactId=[ARTIFACTID] \ +-Dpackaging=aar \ +-Dfile=[PATH] + +example, for tor-android-binary +step 2: +"info.guardianproject:tor-android:$versions.tor_android" -> "foundation.e:tor-android:$versions.orbot_service", + +step 3: + +mvn install:install-file \ +-DartifactId=tor-android \ +-Dpackaging=aar \ +-Dfile="../../orbot/libs/tor-android-binary-release.aar + +step 4 : + +mvn deploy:deploy-file \ +-DrepositoryId=gitlab-e-maven \ +-Durl=https://gitlab.e.foundation/api/v4/projects/900/packages/maven \ +-DartifactId=tor-android \ +-Dpackaging=aar \ +-Dfile="../../orbot/libs/tor-android-binary-release.aar diff --git a/ipscrambling/proguard-rules.pro b/ipscrambling/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/ipscrambling/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/ipscrambling/src/main/AndroidManifest.xml b/ipscrambling/src/main/AndroidManifest.xml new file mode 100644 index 0000000..7a64471 --- /dev/null +++ b/ipscrambling/src/main/AndroidManifest.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + diff --git a/ipscrambling/src/main/java/foundation/e/advancedprivacy/ipscrambler/KoinModule.kt b/ipscrambling/src/main/java/foundation/e/advancedprivacy/ipscrambler/KoinModule.kt new file mode 100644 index 0000000..d9ef0be --- /dev/null +++ b/ipscrambling/src/main/java/foundation/e/advancedprivacy/ipscrambler/KoinModule.kt @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.ipscrambler + +import org.koin.core.module.dsl.singleOf +import org.koin.dsl.module + +val ipScramblerModule = module { + singleOf(::OrbotSupervisor) +} diff --git a/ipscrambling/src/main/java/foundation/e/advancedprivacy/ipscrambler/OrbotSupervisor.kt b/ipscrambling/src/main/java/foundation/e/advancedprivacy/ipscrambler/OrbotSupervisor.kt new file mode 100644 index 0000000..bbba37f --- /dev/null +++ b/ipscrambling/src/main/java/foundation/e/advancedprivacy/ipscrambler/OrbotSupervisor.kt @@ -0,0 +1,323 @@ +/* + * Copyright (C) 2023 MURENA SAS + * Copyright (C) 2021 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.ipscrambler + +import android.annotation.SuppressLint +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.net.VpnService +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.os.Message +import foundation.e.advancedprivacy.domain.entities.FeatureState +import foundation.e.advancedprivacy.externalinterfaces.servicesupervisors.FeatureSupervisor +import java.security.InvalidParameterException +import java.util.function.Function +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import org.pcap4j.packet.DnsPacket +import org.torproject.android.service.OrbotConstants +import org.torproject.android.service.OrbotConstants.ACTION_STOP_FOREGROUND_TASK +import org.torproject.android.service.OrbotService +import org.torproject.android.service.util.Prefs +import timber.log.Timber + +@SuppressLint("CommitPrefEdits") +class OrbotSupervisor( + private val context: Context, + private val coroutineScope: CoroutineScope +) : FeatureSupervisor { + private val _state = MutableStateFlow(FeatureState.OFF) + override val state: StateFlow = _state + + enum class Status { + OFF, + ON, + STARTING, + STOPPING, + START_DISABLED + } + companion object { + private val EXIT_COUNTRY_CODES = setOf( + "DE", "AT", "SE", "CH", "IS", "CA", "US", "ES", "FR", "BG", "PL", "AU", + "BR", "CZ", "DK", "FI", "GB", "HU", "NL", "JP", "RO", "RU", "SG", "SK" + ) + + // Key where exit country is stored by orbot service. + private const val PREFS_KEY_EXIT_NODES = "pref_exit_nodes" + // Copy of the package private OrbotService.NOTIFY_ID value. + // const val ORBOT_SERVICE_NOTIFY_ID_COPY = 1 + } + + private var currentStatus: Status? = null + + private val localBroadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + val action = intent.action ?: return + if (action == OrbotConstants.ACTION_RUNNING_SYNC) { + try { + intent.getStringExtra(OrbotConstants.EXTRA_STATUS)?.let { + val newStatus = Status.valueOf(it) + currentStatus = newStatus + } + } catch (e: Exception) { + Timber.e("Can't parse Orbot service status.") + } + return + } + + val msg = messageHandler.obtainMessage() + msg.obj = action + msg.data = intent.extras + messageHandler.sendMessage(msg) + } + } + + private val messageHandler: Handler = object : Handler(Looper.getMainLooper()) { + override fun handleMessage(msg: Message) { + val action = msg.obj as? String ?: return + val data = msg.data + when (action) { + OrbotConstants.LOCAL_ACTION_PORTS -> { + httpProxyPort = data.getInt(OrbotService.EXTRA_HTTP_PROXY_PORT, -1) + socksProxyPort = data.getInt(OrbotService.EXTRA_SOCKS_PROXY_PORT, -1) + } + + OrbotConstants.LOCAL_ACTION_STATUS -> + data.getString(OrbotConstants.EXTRA_STATUS)?.let { + try { + val newStatus = Status.valueOf(it) + updateStatus(newStatus, force = true) + } catch (e: Exception) { + Timber.e("Can't parse Orbot service status.") + } + } + OrbotConstants.LOCAL_ACTION_LOG, + OrbotConstants.LOCAL_ACTION_BANDWIDTH -> {} // Unused in Advanced Privacy + } + super.handleMessage(msg) + } + } + + init { + Prefs.setContext(context) + @Suppress("DEPRECATION") + val lbm = androidx.localbroadcastmanager.content.LocalBroadcastManager.getInstance(context) + lbm.registerReceiver( + localBroadcastReceiver, + IntentFilter(OrbotConstants.LOCAL_ACTION_STATUS) + ) + lbm.registerReceiver( + localBroadcastReceiver, + IntentFilter(OrbotConstants.LOCAL_ACTION_BANDWIDTH) + ) + lbm.registerReceiver( + localBroadcastReceiver, + IntentFilter(OrbotConstants.LOCAL_ACTION_LOG) + ) + lbm.registerReceiver( + localBroadcastReceiver, + IntentFilter(OrbotConstants.LOCAL_ACTION_PORTS) + ) + lbm.registerReceiver( + localBroadcastReceiver, + IntentFilter(OrbotConstants.ACTION_RUNNING_SYNC) + ) + + Prefs.getSharedPrefs(context).edit() + .putInt(OrbotConstants.PREFS_DNS_PORT, OrbotConstants.TOR_DNS_PORT_DEFAULT) + .apply() + } + + private fun updateStatus(status: Status, force: Boolean = false) { + if (force || status != currentStatus) { + val newState = when (status) { + Status.OFF -> FeatureState.OFF + Status.ON -> FeatureState.ON + Status.STARTING -> FeatureState.STARTING + Status.STOPPING, + Status.START_DISABLED -> FeatureState.STOPPING + } + + coroutineScope.launch(Dispatchers.IO) { + _state.update { currentState -> + if (newState == FeatureState.OFF && + currentState == FeatureState.STOPPING + ) { + // Wait for orbot to relax before allowing user to reactivate it. + delay(1000) + } + newState + } + } + } + } + + private fun isServiceRunning(): Boolean { + // Reset status, and then ask to refresh it synchronously. + currentStatus = Status.OFF + @Suppress("DEPRECATION") + androidx.localbroadcastmanager.content.LocalBroadcastManager.getInstance(context) + .sendBroadcastSync(Intent(OrbotConstants.ACTION_CHECK_RUNNING_SYNC)) + return currentStatus != Status.OFF + } + + private fun sendIntentToService(action: String, extra: Bundle? = null) { + val intent = Intent(context, OrbotService::class.java) + intent.action = action + intent.putExtra(OrbotConstants.EXTRA_NOT_SYSTEM, true) + extra?.let { intent.putExtras(it) } + context.startService(intent) + } + + @SuppressLint("ApplySharedPref") + private fun saveTorifiedApps(packageNames: Collection) { + packageNames.joinToString("|") + Prefs.getSharedPrefs(context).edit().putString( + OrbotConstants.PREFS_KEY_TORIFIED, + packageNames.joinToString("|") + ).commit() + + if (isServiceRunning()) { + sendIntentToService(OrbotConstants.ACTION_RESTART_VPN) + } + } + + private fun getTorifiedApps(): Set { + val list = Prefs.getSharedPrefs(context).getString(OrbotConstants.PREFS_KEY_TORIFIED, "") + ?.split("|") + return if (list == null || list == listOf("")) { + emptySet() + } else { + list.toSet() + } + } + + @SuppressLint("ApplySharedPref") + suspend fun setExitCountryCode(countryCode: String) { + withContext(Dispatchers.IO) { + val countryParam = when { + countryCode.isEmpty() -> "" + countryCode in EXIT_COUNTRY_CODES -> "{$countryCode}" + else -> throw InvalidParameterException( + "Only these countries are available: ${EXIT_COUNTRY_CODES.joinToString { ", " }}" + ) + } + + if (isServiceRunning()) { + val extra = Bundle() + extra.putString("exit", countryParam) + sendIntentToService(OrbotConstants.CMD_SET_EXIT, extra) + } else { + Prefs.getSharedPrefs(context) + .edit().putString(PREFS_KEY_EXIT_NODES, countryParam) + .commit() + } + } + } + + fun getExitCountryCode(): String { + val raw = Prefs.getExitNodes() + return if (raw.isEmpty()) raw else raw.slice(1..2) + } + + fun prepareAndroidVpn(): Intent? { + return VpnService.prepare(context) + } + + fun setDNSFilter(shouldBlock: Function?) { + OrbotService.shouldBlock = shouldBlock + } + + override fun start(): Boolean { + val enableNotification = OrbotService.shouldBlock != null + Prefs.enableNotification(enableNotification) + Prefs.putUseVpn(true) + Prefs.putStartOnBoot(true) + + sendIntentToService(OrbotConstants.ACTION_START) + sendIntentToService(OrbotConstants.ACTION_START_VPN) + return true + } + + override fun stop(): Boolean { + if (!isServiceRunning()) return false + + updateStatus(Status.STOPPING) + + Prefs.putUseVpn(false) + Prefs.putStartOnBoot(false) + + sendIntentToService(OrbotConstants.ACTION_STOP_VPN) + sendIntentToService( + action = OrbotConstants.ACTION_STOP, + extra = Bundle().apply { putBoolean(ACTION_STOP_FOREGROUND_TASK, true) } + ) + stoppingWatchdog(5) + return true + } + + private fun stoppingWatchdog(countDown: Int) { + Handler(Looper.getMainLooper()).postDelayed( + { + if (isServiceRunning() && countDown > 0) { + stoppingWatchdog(countDown - 1) + } else { + updateStatus(Status.OFF, force = true) + } + }, + 500 + ) + } + + fun requestStatus() { + if (isServiceRunning()) { + sendIntentToService(OrbotConstants.ACTION_STATUS) + } else { + updateStatus(Status.OFF, force = true) + } + } + + var appList: Set + get() = getTorifiedApps() + set(value) = saveTorifiedApps(value) + + fun getAvailablesLocations(): Set = EXIT_COUNTRY_CODES + + var httpProxyPort: Int = -1 + private set + + var socksProxyPort: Int = -1 + private set + + fun onCleared() { + @Suppress("DEPRECATION") + androidx.localbroadcastmanager.content.LocalBroadcastManager.getInstance(context) + .unregisterReceiver(localBroadcastReceiver) + } +} diff --git a/load-properties.gradle b/load-properties.gradle new file mode 100644 index 0000000..8909270 --- /dev/null +++ b/load-properties.gradle @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2021 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * Read all the properties from local.properties if it exists otherwise try to load from + * system environment variables. + * + * We don't provide default value like empty string here because we want it to fail early + * if those properties can't be found. + */ +File localPropertiesFile = project.rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + Properties p = new Properties() + new FileInputStream(localPropertiesFile).withCloseable { is -> p.load(is) } + p.each { name, value -> ext[name] = value } +} else { + ext["MAPBOX_KEY"] = System.getenv('MAPBOX_KEY') + ext["SENTRY_DSN"] = System.getenv('SENTRY_DSN') +} diff --git a/permissionseos/.gitignore b/permissionseos/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/permissionseos/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/permissionseos/build.gradle b/permissionseos/build.gradle new file mode 100644 index 0000000..8b55827 --- /dev/null +++ b/permissionseos/build.gradle @@ -0,0 +1,33 @@ +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' + +android { + compileSdkVersion buildConfig.compileSdk + + defaultConfig { + minSdkVersion buildConfig.minSdk + targetSdkVersion buildConfig.targetSdk + + consumerProguardFiles "consumer-rules.pro" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + namespace 'foundation.e.advancedprivacy.permissions.eos' +} + +dependencies { + compileOnly project(':permissionseos:libs:hidden-apis-stub') + + implementation(libs.bundles.kotlin.android.coroutines) + implementation project(':core') + +} diff --git a/permissionseos/consumer-rules.pro b/permissionseos/consumer-rules.pro new file mode 100644 index 0000000..e69de29 diff --git a/permissionseos/libs/hidden-apis-stub/.gitignore b/permissionseos/libs/hidden-apis-stub/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/permissionseos/libs/hidden-apis-stub/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/permissionseos/libs/hidden-apis-stub/build.gradle b/permissionseos/libs/hidden-apis-stub/build.gradle new file mode 100644 index 0000000..5e8ca11 --- /dev/null +++ b/permissionseos/libs/hidden-apis-stub/build.gradle @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2022 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +plugins { + id 'com.android.library' +} + +android { + compileSdkVersion buildConfig.compileSdk + namespace 'foundation.e.advancedprivacy.hidden.apis' +} + + +java { + sourceCompatibility = JavaVersion.VERSION_1_7 + targetCompatibility = JavaVersion.VERSION_1_7 +} + +dependencies { + implementation 'org.jetbrains:annotations:15.0' + implementation 'androidx.annotation:annotation:1.5.0' +} diff --git a/permissionseos/libs/hidden-apis-stub/src/main/AndroidManifest.xml b/permissionseos/libs/hidden-apis-stub/src/main/AndroidManifest.xml new file mode 100644 index 0000000..e5fed01 --- /dev/null +++ b/permissionseos/libs/hidden-apis-stub/src/main/AndroidManifest.xml @@ -0,0 +1,23 @@ + + + + + + diff --git a/permissionseos/libs/hidden-apis-stub/src/main/java/android/app/AppOpsManager.java b/permissionseos/libs/hidden-apis-stub/src/main/java/android/app/AppOpsManager.java new file mode 100644 index 0000000..1bd64e5 --- /dev/null +++ b/permissionseos/libs/hidden-apis-stub/src/main/java/android/app/AppOpsManager.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2022 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package android.app; + +import android.annotation.TargetApi; + +import androidx.annotation.DeprecatedSinceApi; +import androidx.annotation.NonNull; +import androidx.annotation.RequiresPermission; + +// Stub based on: +// https://gitlab.e.foundation/e/os/android_frameworks_base/-/blob/[SDK_VERSION]/core/java/android/app/AppOpsManager.java +public class AppOpsManager { + + public static final int OP_NONE = -1; + + @TargetApi(29) + @DeprecatedSinceApi( + api = 35, + message = "Check availability in SDK35" + ) + public static int strOpToOp(@NonNull String op) { + return 0; + } + + @TargetApi(29) + @DeprecatedSinceApi( + api = 35, + message = "Check availability in SDK35" + ) + @RequiresPermission("android.permission.MANAGE_APP_OPS_MODES") + public void setMode(int code, int uid, String packageName, int mode) {} +} diff --git a/permissionseos/libs/hidden-apis-stub/src/main/java/android/app/NotificationChannel.java b/permissionseos/libs/hidden-apis-stub/src/main/java/android/app/NotificationChannel.java new file mode 100644 index 0000000..66be718 --- /dev/null +++ b/permissionseos/libs/hidden-apis-stub/src/main/java/android/app/NotificationChannel.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2024 E FOUNDATION + * Copyright (C) 2022 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package android.app; + +import android.annotation.TargetApi; + +import androidx.annotation.DeprecatedSinceApi; + +// Stub based on: +// https://gitlab.e.foundation/e/os/android_frameworks_base/-/blob/[SDK_VERSION]/core/java/android/app/NotificationChannel.java +public class NotificationChannel { + + @TargetApi(29) + @DeprecatedSinceApi(api = 30, message = "Use setBlockable() instead.") + public void setBlockableSystem(boolean blockableSystem) {} + + // Public in API 33. + @TargetApi(30) + public void setBlockable(boolean blockableSystem) {} + +} diff --git a/permissionseos/libs/hidden-apis-stub/src/main/java/android/content/pm/PackageManager.java b/permissionseos/libs/hidden-apis-stub/src/main/java/android/content/pm/PackageManager.java new file mode 100644 index 0000000..be45c77 --- /dev/null +++ b/permissionseos/libs/hidden-apis-stub/src/main/java/android/content/pm/PackageManager.java @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2024 E FOUNDATION + * Copyright (C) 2022 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package android.content.pm; + +import android.annotation.TargetApi; +import android.graphics.drawable.Drawable; +import android.os.UserHandle; + +import androidx.annotation.DeprecatedSinceApi; +import androidx.annotation.NonNull; +import androidx.annotation.RequiresPermission; + +import java.util.List; +import android.util.AndroidException; + +// Stub based on: +// https://gitlab.e.foundation/e/os/android_frameworks_base/-/blob/[SDK_VERSION]/core/java/android/content/pm/PackageManager.java +public abstract class PackageManager { + + @TargetApi(29) + @DeprecatedSinceApi( + api = 35, + message = "Check availability in SDK35" + ) + public static class NameNotFoundException extends AndroidException { + public NameNotFoundException() { + } + + public NameNotFoundException(String name) { + super(name); + } + } + + + @TargetApi(29) + @DeprecatedSinceApi( + api = 35, + message = "Check availability in SDK35" + ) + @RequiresPermission("android.permission.GRANT_RUNTIME_PERMISSIONS") + public abstract void grantRuntimePermission( + @NonNull String packageName, + @NonNull String permissionName, + @NonNull UserHandle user + ); + + @TargetApi(29) + @DeprecatedSinceApi( + api = 35, + message = "Check availability in SDK35" + ) + @RequiresPermission("android.permission.REVOKE_RUNTIME_PERMISSIONS") + public abstract void revokeRuntimePermission( + @NonNull String packageName, + @NonNull String permissionName, + @NonNull UserHandle user + ); + + @TargetApi(29) + @DeprecatedSinceApi( + api = 35, + message = "Check availability in SDK35, since SDK33, " + + "Use {@link #getApplicationInfoAsUser(String, ApplicationInfoFlags, int)} " + + "when long flags are needed." + ) + public abstract ApplicationInfo getApplicationInfoAsUser( + @NonNull String packageName, + int flags, + int userId + ) throws NameNotFoundException; + + + @TargetApi(29) + @DeprecatedSinceApi( + api = 35, + message = "Check availability in SDK35, since SDK33, " + + "Use {@link #getInstalledPackagesAsUser(PackageInfoFlags, int)} " + + "when long flags are needed." + ) + @RequiresPermission("android.permission.INTERACT_ACROSS_USERS_FULL") + public abstract List getInstalledPackagesAsUser(int flags, int userId); + + // Public + public abstract List getInstalledPackages(int flags); + + // Public + @NonNull + public abstract Drawable getUserBadgedIcon( + @NonNull Drawable drawable, + @NonNull UserHandle user + ); + + // Public + public static final int GET_PERMISSIONS = 0x00001000; +} diff --git a/permissionseos/libs/hidden-apis-stub/src/main/java/android/content/pm/UserInfo.java b/permissionseos/libs/hidden-apis-stub/src/main/java/android/content/pm/UserInfo.java new file mode 100644 index 0000000..827fb8a --- /dev/null +++ b/permissionseos/libs/hidden-apis-stub/src/main/java/android/content/pm/UserInfo.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2024 E FOUNDATION + * Copyright (C) 2022 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package android.content.pm; + +import android.annotation.TargetApi; +import android.os.UserHandle; + +import androidx.annotation.DeprecatedSinceApi; + +public class UserInfo { + public int id; + + @TargetApi(29) + @DeprecatedSinceApi( + api = 35, + message = "Check availability in SDK35" + ) + public UserHandle getUserHandle() { + return null; + } +} diff --git a/permissionseos/libs/hidden-apis-stub/src/main/java/android/net/IConnectivityManager.java b/permissionseos/libs/hidden-apis-stub/src/main/java/android/net/IConnectivityManager.java new file mode 100644 index 0000000..53440e0 --- /dev/null +++ b/permissionseos/libs/hidden-apis-stub/src/main/java/android/net/IConnectivityManager.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2022 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package android.net; + +import android.annotation.TargetApi; + +import android.os.Binder; +import android.os.IBinder; +import android.os.RemoteException; + +import androidx.annotation.DeprecatedSinceApi; + +// Stub based on: +// https://gitlab.e.foundation/e/os/android_frameworks_base/-/blob/[SDK_VERSION]/core/java/android/net/IConnectivityManager.java +public interface IConnectivityManager { + + @TargetApi(29) + @DeprecatedSinceApi( + api = 31, + message = "Moved to android.net.VpnManager" + ) + boolean prepareVpn(String oldPackage, String newPackage, int userId) throws RemoteException; + + @TargetApi(29) + @DeprecatedSinceApi( + api = 30, + message = "Use instead setVpnPackageAuthorization(String packageName, int userId, int vpnType)" + ) + void setVpnPackageAuthorization(String packageName, int userId, boolean authorized) throws RemoteException; + + @TargetApi(30) + @DeprecatedSinceApi( + api = 31, + message = "Moved to android.net.VpnManager" + ) + void setVpnPackageAuthorization(String packageName, int userId, int vpnType) throws RemoteException; + + @TargetApi(29) + @DeprecatedSinceApi( + api = 31, + message = "Moved to android.net.VpnManager" + ) + public String getAlwaysOnVpnPackage(int userId) throws RemoteException; + + public abstract static class Stub extends Binder implements IConnectivityManager { + public static IConnectivityManager asInterface(IBinder obj) { + return null; + } + } +} diff --git a/permissionseos/libs/hidden-apis-stub/src/main/java/android/net/VpnManager.java b/permissionseos/libs/hidden-apis-stub/src/main/java/android/net/VpnManager.java new file mode 100644 index 0000000..2854e2e --- /dev/null +++ b/permissionseos/libs/hidden-apis-stub/src/main/java/android/net/VpnManager.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2022 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package android.net; + +import android.annotation.TargetApi; + +import androidx.annotation.DeprecatedSinceApi; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresPermission; + +// Stub based on: +// https://gitlab.e.foundation/e/os/android_frameworks_base/-/blob/[SDK_VERSION]/core/java/android/net/VpnManager.java +public class VpnManager { + public static final int TYPE_VPN_SERVICE = 1; + + @TargetApi(31) + @DeprecatedSinceApi( + api = 35, + message = "Check availability in SDK35" + ) + public boolean prepareVpn( + @Nullable String oldPackage, + @Nullable String newPackage, + int userId + ) { + return true; + } + + @TargetApi(31) + @DeprecatedSinceApi( + api = 35, + message = "Check availability in SDK35" + ) + public void setVpnPackageAuthorization( + String packageName, + int userId, + int vpnType + ) {} + + @TargetApi(31) + @DeprecatedSinceApi( + api = 35, + message = "Check availability in SDK35" + ) + @RequiresPermission("android.permission.CONTROL_ALWAYS_ON_VPN") + public String getAlwaysOnVpnPackageForUser(int userId) { + return null; + } +} diff --git a/permissionseos/libs/hidden-apis-stub/src/main/java/android/os/ServiceManager.java b/permissionseos/libs/hidden-apis-stub/src/main/java/android/os/ServiceManager.java new file mode 100644 index 0000000..901dfce --- /dev/null +++ b/permissionseos/libs/hidden-apis-stub/src/main/java/android/os/ServiceManager.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2022 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package android.os; + +import android.annotation.TargetApi; + +import androidx.annotation.DeprecatedSinceApi; + +// Stub based on: +// https://gitlab.e.foundation/e/os/android_frameworks_base/-/blob/[SDK_VERSION]/core/java/android/os/ServiceManager.java +public class ServiceManager { + @TargetApi(30) + @DeprecatedSinceApi( + api = 35, + message = "Check availability in SDK35" + ) + public static IBinder getService(String name) { + return null; + } +} diff --git a/permissionseos/libs/hidden-apis-stub/src/main/java/android/os/UserHandle.java b/permissionseos/libs/hidden-apis-stub/src/main/java/android/os/UserHandle.java new file mode 100644 index 0000000..5279441 --- /dev/null +++ b/permissionseos/libs/hidden-apis-stub/src/main/java/android/os/UserHandle.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2022 - 2024 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package android.os; + +import android.annotation.TargetApi; + +import androidx.annotation.DeprecatedSinceApi; + +// Stub based on: +// https://gitlab.e.foundation/e/os/android_frameworks_base/-/blob/[SDK_VERSION]/core/java/android/os/ServiceManager.java +public class UserHandle { + + @TargetApi(30) + @DeprecatedSinceApi( + api = 35, + message = "Check availability in SDK35" + ) + public static /*@UserIdInt*/ int myUserId() { + return 0; + } +} diff --git a/permissionseos/libs/hidden-apis-stub/src/main/java/android/os/UserManager.java b/permissionseos/libs/hidden-apis-stub/src/main/java/android/os/UserManager.java new file mode 100644 index 0000000..01410d9 --- /dev/null +++ b/permissionseos/libs/hidden-apis-stub/src/main/java/android/os/UserManager.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2024 E FOUNDATION + * Copyright (C) 2022 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package android.os; + +import android.annotation.TargetApi; +import android.content.pm.UserInfo; + +import androidx.annotation.DeprecatedSinceApi; +import androidx.annotation.RequiresPermission; +import java.util.List; + +// Stub based on: +// https://gitlab.e.foundation/e/os/android_frameworks_base/-/blob/[SDK_VERSION]/core/java/android/os/UserManager.java +public class UserManager { + + // Since API 33, android.permission.QUERY_USERS can be used as an alternative + // to "android.permission.MANAGE_USERS" + @TargetApi(29) + @DeprecatedSinceApi( + api = 35, + message = "Check availability in SDK35" + ) + @RequiresPermission("android.permission.MANAGE_USERS") + public List getProfiles(int userHandle) { + return null; + } + + // Since API 33, android.permission.QUERY_USERS can be used as an alternative + // to "android.permission.MANAGE_USERS" + @TargetApi(29) + @DeprecatedSinceApi( + api = 35, + message = "Check availability in SDK35" + ) + @RequiresPermission("android.permission.MANAGE_USERS") + public boolean isManagedProfile(int userId) { + return false; + } +} diff --git a/permissionseos/proguard-rules.pro b/permissionseos/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/permissionseos/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/permissionseos/src/main/AndroidManifest.xml b/permissionseos/src/main/AndroidManifest.xml new file mode 100644 index 0000000..ef49179 --- /dev/null +++ b/permissionseos/src/main/AndroidManifest.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + diff --git a/permissionseos/src/main/java/foundation/e/advancedprivacy/externalinterfaces/permissions/PermissionsPrivacyModuleImpl.kt b/permissionseos/src/main/java/foundation/e/advancedprivacy/externalinterfaces/permissions/PermissionsPrivacyModuleImpl.kt new file mode 100644 index 0000000..43e3352 --- /dev/null +++ b/permissionseos/src/main/java/foundation/e/advancedprivacy/externalinterfaces/permissions/PermissionsPrivacyModuleImpl.kt @@ -0,0 +1,239 @@ +/* + * Copyright (C) 2021 - 2024 E FOUNDATION, + * Copyright (C) 2022 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.permissions.externalinterfaces + +import android.annotation.TargetApi +import android.app.AppOpsManager +import android.app.AppOpsManager.OP_NONE +import android.app.AppOpsManager.strOpToOp +import android.app.NotificationChannel +import android.content.Context +import android.content.pm.PackageInfo +import android.content.pm.PackageManager +import android.content.pm.UserInfo +import android.graphics.drawable.Drawable +import android.net.IConnectivityManager +import android.net.VpnManager +import android.net.VpnManager.TYPE_VPN_SERVICE +import android.os.Build +import android.os.ServiceManager +import android.os.UserHandle +import android.os.UserManager +import android.util.Log +import foundation.e.advancedprivacy.domain.entities.AppOpModes +import foundation.e.advancedprivacy.domain.entities.ApplicationDescription +import foundation.e.advancedprivacy.domain.entities.ProfileType.MAIN +import foundation.e.advancedprivacy.domain.entities.ProfileType.WORK +import foundation.e.advancedprivacy.externalinterfaces.permissions.PermissionsPrivacyModuleBase + +/** + * Implements [IPermissionsPrivacyModule] with all privileges of a system app. + */ +class PermissionsPrivacyModuleImpl(context: Context) : PermissionsPrivacyModuleBase(context) { + + private val appOpsManager: AppOpsManager + get() = context.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager + + /** + * @see IPermissionsPrivacyModule.toggleDangerousPermission + * Always return true, permission is set using privileged capacities. + */ + override fun toggleDangerousPermission(appDesc: ApplicationDescription, permissionName: String, grant: Boolean): Boolean { + try { + if (grant) { + context.packageManager.grantRuntimePermission( + appDesc.packageName, + permissionName, + android.os.Process.myUserHandle() + ) + } else { + context.packageManager.revokeRuntimePermission( + appDesc.packageName, + permissionName, + android.os.Process.myUserHandle() + ) + } + } catch (e: Exception) { + Log.e("Permissions-e", "Exception while setting permission", e) + return false + } + + return true + } + + override fun setAppOpMode(appDesc: ApplicationDescription, appOpPermissionName: String, status: AppOpModes): Boolean { + val op = strOpToOp(appOpPermissionName) + if (op != OP_NONE) { + appOpsManager.setMode(op, appDesc.uid, appDesc.packageName, status.modeValue) + } + return true + } + + override fun getApplications(): List> { + val pm = context.packageManager + val mainUserId = UserHandle.myUserId() + val workProfileId = getWorkProfile()?.id + + val userIds = listOf(mainUserId, workProfileId).filterNotNull() + return userIds.map { profileId -> + pm.getInstalledPackagesAsUser(PackageManager.GET_PERMISSIONS, profileId) + .map { pkgInfo: PackageInfo -> + buildApplicationDescription( + appInfo = pkgInfo.applicationInfo, + profileId = profileId, + profileType = if (profileId == mainUserId) MAIN else WORK + ) to pkgInfo + } + }.flatten() + } + + override fun getApplicationIcon(app: ApplicationDescription): Drawable? { + return if (app.profileType == WORK) { + getWorkProfile()?.let { workProfile -> + val pm = context.packageManager + getApplicationIcon( + pm.getApplicationInfoAsUser(app.packageName, 0, workProfile.id) + )?.let { + pm.getUserBadgedIcon(it, workProfile.getUserHandle()) + } + } + } else { + getApplicationIcon(app.packageName) + } + } + + override fun setBlockable(notificationChannel: NotificationChannel) { + when (Build.VERSION.SDK_INT) { + 29 -> notificationChannel.setBlockableSystem(true) + else -> notificationChannel.setBlockable(true) + } + } + + override fun setVpnPackageAuthorization(packageName: String): Boolean { + return when (Build.VERSION.SDK_INT) { + 29 -> setVpnPackageAuthorizationSDK29(packageName) + 30 -> setVpnPackageAuthorizationSDK30(packageName) + else -> setVpnPackageAuthorizationSDK31AndAbove(packageName) + } + } + + @TargetApi(29) + private fun setVpnPackageAuthorizationSDK29(packageName: String): Boolean { + val service: IConnectivityManager = IConnectivityManager.Stub.asInterface( + ServiceManager.getService(Context.CONNECTIVITY_SERVICE) + ) + + try { + if (service.prepareVpn(null, packageName, UserHandle.myUserId())) { + // Authorize this app to initiate VPN connections in the future without user + // intervention. + service.setVpnPackageAuthorization(packageName, UserHandle.myUserId(), true) + return true + } + } catch (e: java.lang.Exception) { + Log.e("Permissions-e", "Exception while setting VpnPackageAuthorization", e) + } catch (e: NoSuchMethodError) { + Log.e("Permissions-e", "Bad android sdk version", e) + } + return false + } + + @TargetApi(30) + private fun setVpnPackageAuthorizationSDK30(packageName: String): Boolean { + val service: IConnectivityManager = IConnectivityManager.Stub.asInterface( + ServiceManager.getService(Context.CONNECTIVITY_SERVICE) + ) + + try { + if (service.prepareVpn(null, packageName, UserHandle.myUserId())) { + // Authorize this app to initiate VPN connections in the future without user + // intervention. + service.setVpnPackageAuthorization(packageName, UserHandle.myUserId(), TYPE_VPN_SERVICE) + return true + } + } catch (e: java.lang.Exception) { + Log.e("Permissions-e", "Exception while setting VpnPackageAuthorization", e) + } catch (e: NoSuchMethodError) { + Log.e("Permissions-e", "Bad android sdk version", e) + } + return false + } + + @TargetApi(31) + private fun setVpnPackageAuthorizationSDK31AndAbove(packageName: String): Boolean { + val vpnManager = context.getSystemService(Context.VPN_MANAGEMENT_SERVICE) as VpnManager + + try { + if (vpnManager.prepareVpn(null, packageName, UserHandle.myUserId())) { + // Authorize this app to initiate VPN connections in the future without user + // intervention. + vpnManager.setVpnPackageAuthorization(packageName, UserHandle.myUserId(), TYPE_VPN_SERVICE) + return true + } + } catch (e: java.lang.Exception) { + Log.e("Permissions-e", "Exception while setting VpnPackageAuthorization", e) + } catch (e: NoSuchMethodError) { + Log.e("Permissions-e", "Bad android sdk version", e) + } + return false + } + + override fun getAlwaysOnVpnPackage(): String? { + return when (Build.VERSION.SDK_INT) { + 29, 30 -> getAlwaysOnVpnPackageSDK29() + else -> getAlwaysOnVpnPackageSDK31AndAbove() + } + } + + @TargetApi(29) + private fun getAlwaysOnVpnPackageSDK29(): String? { + val service: IConnectivityManager = IConnectivityManager.Stub.asInterface( + ServiceManager.getService(Context.CONNECTIVITY_SERVICE) + ) + + return try { + service.getAlwaysOnVpnPackage(UserHandle.myUserId()) + } catch (e: java.lang.Exception) { + Log.e("Permissions-e", "Bad android sdk version ", e) + return null + } + } + + @TargetApi(31) + private fun getAlwaysOnVpnPackageSDK31AndAbove(): String? { + val vpnManager = context.getSystemService(Context.VPN_MANAGEMENT_SERVICE) as VpnManager + return try { + vpnManager.getAlwaysOnVpnPackageForUser(UserHandle.myUserId()) + } catch (e: java.lang.Exception) { + Log.e("Permissions-e", "Bad android sdk version ", e) + return null + } + } + + private fun getWorkProfile(): UserInfo? { + val userManager: UserManager = context.getSystemService(UserManager::class.java) + val userId = UserHandle.myUserId() + for (user in userManager.getProfiles(UserHandle.myUserId())) { + if (user.id != userId && userManager.isManagedProfile(user.id)) { + return user + } + } + return null + } +} diff --git a/permissionsstandalone/.gitignore b/permissionsstandalone/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/permissionsstandalone/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/permissionsstandalone/build.gradle b/permissionsstandalone/build.gradle new file mode 100644 index 0000000..3ddfd88 --- /dev/null +++ b/permissionsstandalone/build.gradle @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2023 MURENA SAS + * Copyright (C) 2022 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +plugins { + id 'com.android.library' + id 'org.jetbrains.kotlin.android' +} + +android { + compileSdkVersion buildConfig.compileSdk + + defaultConfig { + minSdkVersion buildConfig.minSdk + targetSdkVersion buildConfig.targetSdk + + consumerProguardFiles "consumer-rules.pro" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + kotlinOptions { + jvmTarget = '17' + } + namespace 'foundation.e.advancedprivacy.permissions.standalone' +} + +dependencies { + implementation(libs.bundles.kotlin.android.coroutines) + implementation project(':core') + + testImplementation libs.junit +} diff --git a/permissionsstandalone/consumer-rules.pro b/permissionsstandalone/consumer-rules.pro new file mode 100644 index 0000000..e69de29 diff --git a/permissionsstandalone/proguard-rules.pro b/permissionsstandalone/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/permissionsstandalone/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/permissionsstandalone/src/main/AndroidManifest.xml b/permissionsstandalone/src/main/AndroidManifest.xml new file mode 100644 index 0000000..4f1c295 --- /dev/null +++ b/permissionsstandalone/src/main/AndroidManifest.xml @@ -0,0 +1,22 @@ + + + + + + \ No newline at end of file diff --git a/permissionsstandalone/src/main/java/foundation/e/advancedprivacy/permissions/externalinterfaces/PermissionsPrivacyModuleImpl.kt b/permissionsstandalone/src/main/java/foundation/e/advancedprivacy/permissions/externalinterfaces/PermissionsPrivacyModuleImpl.kt new file mode 100644 index 0000000..142e34e --- /dev/null +++ b/permissionsstandalone/src/main/java/foundation/e/advancedprivacy/permissions/externalinterfaces/PermissionsPrivacyModuleImpl.kt @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2022 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.permissions.externalinterfaces + +import android.app.NotificationChannel +import android.content.Context +import android.content.pm.PackageInfo +import android.content.pm.PackageManager +import android.graphics.drawable.Drawable +import foundation.e.advancedprivacy.domain.entities.AppOpModes +import foundation.e.advancedprivacy.domain.entities.ApplicationDescription +import foundation.e.advancedprivacy.externalinterfaces.permissions.PermissionsPrivacyModuleBase + +/** + * Implements [IPermissionsPrivacyModule] using only API authorized on the PlayStore. + */ +class PermissionsPrivacyModuleImpl(context: Context) : PermissionsPrivacyModuleBase(context) { + override fun getApplications(filter: ((PackageInfo) -> Boolean)?): List { + return context.packageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS) + .filter { filter?.invoke(it) == true } + .map { buildApplicationDescription(it.applicationInfo) } + } + + override fun getApplicationIcon(app: ApplicationDescription): Drawable? { + return getApplicationIcon(app.packageName) + } + + /** + * @see IPermissionsPrivacyModule.toggleDangerousPermission + * Return an ManualAction to go toggle manually the permission in the ap page of the settings. + */ + override fun toggleDangerousPermission(appDesc: ApplicationDescription, permissionName: String, grant: Boolean): Boolean = false + + override fun setAppOpMode(appDesc: ApplicationDescription, appOpPermissionName: String, status: AppOpModes): Boolean = false + + override fun setVpnPackageAuthorization(packageName: String): Boolean { + return false + } + + override fun getAlwaysOnVpnPackage(): String? { + return null + } + + override fun setBlockable(notificationChannel: NotificationChannel) {} +} diff --git a/privapp-permissions-foundation.e.advancedprivacy.xml b/privapp-permissions-foundation.e.advancedprivacy.xml new file mode 100644 index 0000000..7edaace --- /dev/null +++ b/privapp-permissions-foundation.e.advancedprivacy.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..0c00702 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,32 @@ +pluginManagement { + repositories { + gradlePluginPortal() + google() + mavenCentral() + } +} + +include ':app' +rootProject.name = "AdvancedPrivacy" +include ':core' +include ':permissionsstandalone' +include ':trackers' +include ':permissionseos' +include ':permissionseos:libs:hidden-apis-stub' +include ':ipscrambling' +// Uncomment and check ipscrambling/README.md to upgrade orbotservice. +//include ':ipscrambling:orbotservice' +include ':trackersservicestandalone' +include ':trackersserviceeos' + +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + mavenLocal() + google() + mavenCentral() + maven { url "https://jitpack.io" } + maven { url 'https://gitlab.e.foundation/api/v4/groups/9/-/packages/maven'} + maven { url "https://raw.githubusercontent.com/guardianproject/gpmaven/master" } + } +} diff --git a/trackers/build.gradle b/trackers/build.gradle new file mode 100644 index 0000000..f75ce5b --- /dev/null +++ b/trackers/build.gradle @@ -0,0 +1,59 @@ +/* + Copyright (C) 2023 MURENA SAS + Copyright (C) 2022 ECORP + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + */ + +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' + +android { + compileSdkVersion buildConfig.compileSdk + + defaultConfig { + minSdkVersion buildConfig.minSdk + targetSdkVersion buildConfig.targetSdk + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + namespace 'foundation.e.advancedprivacy.trackers' +} + +dependencies { + implementation project(':core') + implementation( + libs.androidx.work.ktx, + libs.bundles.koin, + libs.bundles.kotlin.android.coroutines, + libs.google.gson, + libs.pcap4j, + libs.retrofit, + libs.retrofit.scalars, + + libs.timber + ) +} diff --git a/trackers/src/main/AndroidManifest.xml b/trackers/src/main/AndroidManifest.xml new file mode 100644 index 0000000..0b294b5 --- /dev/null +++ b/trackers/src/main/AndroidManifest.xml @@ -0,0 +1,20 @@ + + + + \ No newline at end of file diff --git a/trackers/src/main/java/foundation/e/advancedprivacy/trackers/KoinModule.kt b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/KoinModule.kt new file mode 100644 index 0000000..4d5a80c --- /dev/null +++ b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/KoinModule.kt @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.trackers + +import foundation.e.advancedprivacy.data.repositories.RemoteTrackersListRepository +import foundation.e.advancedprivacy.trackers.data.StatsDatabase +import foundation.e.advancedprivacy.trackers.data.TrackersRepository +import foundation.e.advancedprivacy.trackers.data.WhitelistRepository +import foundation.e.advancedprivacy.trackers.domain.usecases.FilterHostnameUseCase +import foundation.e.advancedprivacy.trackers.domain.usecases.UpdateTrackerListUseCase +import org.koin.android.ext.koin.androidContext +import org.koin.core.module.dsl.factoryOf +import org.koin.core.module.dsl.singleOf +import org.koin.core.qualifier.named +import org.koin.dsl.module + +val trackersModule = module { + + factoryOf(::RemoteTrackersListRepository) + factoryOf(::UpdateTrackerListUseCase) + + singleOf(::TrackersRepository) + single { + StatsDatabase(context = androidContext()) + } + + single { + WhitelistRepository( + context = androidContext(), + appListRepository = get() + ) + } + + factory { + FilterHostnameUseCase( + trackersRepository = get(), + whitelistRepository = get(), + appDesc = get(named("AdvancedPrivacy")), + context = androidContext(), + database = get(), + appListRepository = get() + ) + } +} diff --git a/trackers/src/main/java/foundation/e/advancedprivacy/trackers/data/ETrackersResponse.kt b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/data/ETrackersResponse.kt new file mode 100644 index 0000000..d11415e --- /dev/null +++ b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/data/ETrackersResponse.kt @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.trackers.data + +data class ETrackersResponse(val trackers: List) { + data class ETracker( + val id: String?, + val hostnames: List?, + val name: String?, + val link: String? + ) +} diff --git a/trackers/src/main/java/foundation/e/advancedprivacy/trackers/data/RemoteTrackersListRepository.kt b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/data/RemoteTrackersListRepository.kt new file mode 100644 index 0000000..cf142b8 --- /dev/null +++ b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/data/RemoteTrackersListRepository.kt @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2022 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.data.repositories + +import java.io.File +import java.io.FileWriter +import java.io.IOException +import java.io.PrintWriter +import retrofit2.Retrofit +import retrofit2.converter.scalars.ScalarsConverterFactory +import retrofit2.http.GET +import timber.log.Timber + +class RemoteTrackersListRepository { + + fun saveData(file: File, data: String): Boolean { + try { + val fos = FileWriter(file, false) + val ps = PrintWriter(fos) + ps.apply { + print(data) + flush() + close() + } + return true + } catch (e: IOException) { + Timber.e(e, "While saving tracker file.") + } + return false + } +} + +interface ETrackersApi { + companion object { + fun build(): ETrackersApi { + val retrofit = Retrofit.Builder() + .baseUrl("https://gitlab.e.foundation/e/os/tracker-list/-/raw/main/") + .addConverterFactory(ScalarsConverterFactory.create()) + .build() + return retrofit.create(ETrackersApi::class.java) + } + } + + @GET("list/e_trackers.json") + suspend fun trackers(): String +} diff --git a/trackers/src/main/java/foundation/e/advancedprivacy/trackers/data/StatsDatabase.kt b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/data/StatsDatabase.kt new file mode 100644 index 0000000..79196c6 --- /dev/null +++ b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/data/StatsDatabase.kt @@ -0,0 +1,574 @@ +/* + * Copyright (C) 2023 - 2024 MURENA SAS + * Copyright (C) 2022 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.trackers.data + +import android.content.ContentValues +import android.content.Context +import android.database.Cursor +import android.database.sqlite.SQLiteDatabase +import android.database.sqlite.SQLiteOpenHelper +import android.provider.BaseColumns +import androidx.core.database.getStringOrNull +import foundation.e.advancedprivacy.trackers.data.StatsDatabase.AppTrackerEntry.COLUMN_NAME_APPID +import foundation.e.advancedprivacy.trackers.data.StatsDatabase.AppTrackerEntry.COLUMN_NAME_NUMBER_BLOCKED +import foundation.e.advancedprivacy.trackers.data.StatsDatabase.AppTrackerEntry.COLUMN_NAME_NUMBER_CONTACTED +import foundation.e.advancedprivacy.trackers.data.StatsDatabase.AppTrackerEntry.COLUMN_NAME_TIMESTAMP +import foundation.e.advancedprivacy.trackers.data.StatsDatabase.AppTrackerEntry.COLUMN_NAME_TRACKER +import foundation.e.advancedprivacy.trackers.data.StatsDatabase.AppTrackerEntry.TABLE_NAME +import java.time.Instant +import java.time.ZonedDateTime +import java.time.format.DateTimeFormatter +import java.time.temporal.ChronoUnit +import java.time.temporal.TemporalUnit +import java.util.concurrent.TimeUnit +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.withContext +import timber.log.Timber + +class StatsDatabase( + context: Context +) : + SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) { + + companion object { + const val DATABASE_VERSION = 2 + const val DATABASE_NAME = "TrackerFilterStats.db" + private const val SQL_CREATE_TABLE = "CREATE TABLE $TABLE_NAME (" + + "${BaseColumns._ID} INTEGER PRIMARY KEY," + + "$COLUMN_NAME_TIMESTAMP INTEGER," + + "$COLUMN_NAME_TRACKER TEXT," + + "$COLUMN_NAME_NUMBER_CONTACTED INTEGER," + + "$COLUMN_NAME_NUMBER_BLOCKED INTEGER," + + "$COLUMN_NAME_APPID TEXT)" + + private const val PROJECTION_NAME_PERIOD = "period" + private const val PROJECTION_NAME_CONTACTED_SUM = "contactedsum" + private const val PROJECTION_NAME_BLOCKED_SUM = "blockedsum" + private const val PROJECTION_NAME_LEAKED_SUM = "leakedsum" + private const val PROJECTION_NAME_TRACKERS_COUNT = "trackerscount" + + private val MIGRATE_1_2 = listOf( + "ALTER TABLE $TABLE_NAME ADD COLUMN $COLUMN_NAME_APPID TEXT" + // "ALTER TABLE $TABLE_NAME DROP COLUMN app_uid" + // DROP COLUMN is available since sqlite 3.35.0, and sdk29 as 3.22.0, sdk32 as 3.32.2 + ) + } + + object AppTrackerEntry : BaseColumns { + const val TABLE_NAME = "tracker_filter_stats" + const val COLUMN_NAME_TIMESTAMP = "timestamp" + const val COLUMN_NAME_TRACKER = "tracker" + const val COLUMN_NAME_NUMBER_CONTACTED = "sum_contacted" + const val COLUMN_NAME_NUMBER_BLOCKED = "sum_blocked" + const val COLUMN_NAME_APPID = "app_apid" + } + + private var projection = arrayOf( + COLUMN_NAME_TIMESTAMP, + COLUMN_NAME_TRACKER, + COLUMN_NAME_NUMBER_CONTACTED, + COLUMN_NAME_NUMBER_BLOCKED, + COLUMN_NAME_APPID + ) + + private val _newDataAvailable = MutableSharedFlow() + val newDataAvailable: SharedFlow = _newDataAvailable + + private val lock = Any() + + override fun onCreate(db: SQLiteDatabase) { + db.execSQL(SQL_CREATE_TABLE) + } + + override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { + if (oldVersion == 1 && newVersion == 2) { + MIGRATE_1_2.forEach(db::execSQL) + } else { + Timber.e( + "Unexpected database versions: oldVersion: $oldVersion ; newVersion: $newVersion" + ) + } + } + + private fun getCallsByPeriod(periodsCount: Int, periodUnit: TemporalUnit, sqlitePeriodFormat: String): Map> { + synchronized(lock) { + val minTimestamp = getPeriodStartTs(periodsCount, periodUnit) + val db = readableDatabase + val selection = "$COLUMN_NAME_TIMESTAMP >= ?" + val selectionArg = arrayOf("" + minTimestamp) + + val projection = ( + "$COLUMN_NAME_TIMESTAMP, " + + "STRFTIME('$sqlitePeriodFormat', DATETIME($COLUMN_NAME_TIMESTAMP, 'unixepoch', 'localtime')) $PROJECTION_NAME_PERIOD," + + "SUM($COLUMN_NAME_NUMBER_CONTACTED) $PROJECTION_NAME_CONTACTED_SUM, " + + "SUM($COLUMN_NAME_NUMBER_BLOCKED) $PROJECTION_NAME_BLOCKED_SUM" + ) + + val cursor = db.rawQuery( + "SELECT $projection FROM $TABLE_NAME WHERE $selection" + + " GROUP BY $PROJECTION_NAME_PERIOD" + + " ORDER BY $COLUMN_NAME_TIMESTAMP DESC LIMIT $periodsCount", + selectionArg + ) + val callsByPeriod = HashMap>() + while (cursor.moveToNext()) { + val contacted = cursor.getInt(PROJECTION_NAME_CONTACTED_SUM) + val blocked = cursor.getInt(PROJECTION_NAME_BLOCKED_SUM) + callsByPeriod[cursor.getString(PROJECTION_NAME_PERIOD)] = blocked to contacted - blocked + } + cursor.close() + db.close() + return callsByPeriod + } + } + + private fun callsByPeriodToPeriodsList( + callsByPeriod: Map>, + periodsCount: Int, + periodUnit: TemporalUnit, + javaPeriodFormat: String + ): List> { + var currentDate = ZonedDateTime.now().minus(periodsCount.toLong(), periodUnit) + val formatter = DateTimeFormatter.ofPattern(javaPeriodFormat) + val calls = mutableListOf>() + for (i in 0 until periodsCount) { + currentDate = currentDate.plus(1, periodUnit) + val currentPeriod = formatter.format(currentDate) + calls.add(callsByPeriod.getOrDefault(currentPeriod, 0 to 0)) + } + return calls + } + + fun getTrackersCallsOnPeriod(periodsCount: Int, periodUnit: TemporalUnit): List> { + var sqlitePeriodFormat = "%Y%m" + var javaPeriodFormat = "yyyyMM" + if (periodUnit === ChronoUnit.MONTHS) { + sqlitePeriodFormat = "%Y%m" + javaPeriodFormat = "yyyyMM" + } else if (periodUnit === ChronoUnit.DAYS) { + sqlitePeriodFormat = "%Y%m%d" + javaPeriodFormat = "yyyyMMdd" + } else if (periodUnit === ChronoUnit.HOURS) { + sqlitePeriodFormat = "%Y%m%d%H" + javaPeriodFormat = "yyyyMMddHH" + } + val callsByPeriod = getCallsByPeriod(periodsCount, periodUnit, sqlitePeriodFormat) + return callsByPeriodToPeriodsList(callsByPeriod, periodsCount, periodUnit, javaPeriodFormat) + } + + suspend fun getTrackersCount(periodsCount: Int, periodUnit: TemporalUnit): Int = withContext(Dispatchers.IO) { + synchronized(lock) { + val minTimestamp = getPeriodStartTs(periodsCount, periodUnit) + val db = readableDatabase + val selection = "$COLUMN_NAME_TIMESTAMP >= ?" + val selectionArg = arrayOf("" + minTimestamp) + val projection = + "COUNT(DISTINCT $COLUMN_NAME_TRACKER) $PROJECTION_NAME_TRACKERS_COUNT" + + val cursor = db.rawQuery( + "SELECT $projection FROM $TABLE_NAME WHERE $selection", + selectionArg + ) + var count = 0 + if (cursor.moveToNext()) { + count = cursor.getInt(0) + } + cursor.close() + db.close() + count + } + } + + suspend fun getLeakedTrackersCount(periodsCount: Int, periodUnit: TemporalUnit): Int = withContext(Dispatchers.IO) { + synchronized(lock) { + val minTimestamp = getPeriodStartTs(periodsCount, periodUnit) + val db = readableDatabase + val selection = "$COLUMN_NAME_TIMESTAMP >= ? AND " + + "$COLUMN_NAME_NUMBER_CONTACTED > $COLUMN_NAME_NUMBER_BLOCKED" + val selectionArg = arrayOf("" + minTimestamp) + val projection = + "COUNT(DISTINCT $COLUMN_NAME_TRACKER) $PROJECTION_NAME_TRACKERS_COUNT" + + val cursor = db.rawQuery( + "SELECT $projection FROM $TABLE_NAME WHERE $selection", + selectionArg + ) + var count = 0 + if (cursor.moveToNext()) { + count = cursor.getInt(0) + } + cursor.close() + db.close() + count + } + } + + fun getDistinctTrackerAndApp(periodStart: Instant): List> { + synchronized(lock) { + val db = readableDatabase + val projection = arrayOf(COLUMN_NAME_APPID, COLUMN_NAME_TRACKER) + val selection = "$COLUMN_NAME_TIMESTAMP >= ?" + val selectionArg = arrayOf("" + periodStart.epochSecond) + val cursor = db.query( + true, + TABLE_NAME, + projection, + selection, + selectionArg, + null, + null, + null, + null + ) + + val res = mutableListOf>() + while (cursor.moveToNext()) { + res.add( + cursor.getString(COLUMN_NAME_TRACKER) to cursor.getString(COLUMN_NAME_APPID) + ) + } + cursor.close() + db.close() + return res + } + } + + suspend fun getApIds(trackerId: String): List = withContext(Dispatchers.IO) { + synchronized(lock) { + val db = readableDatabase + val columns = arrayOf(COLUMN_NAME_APPID, COLUMN_NAME_TRACKER) + val selection = "$COLUMN_NAME_TRACKER = ?" + val selectionArg = arrayOf(trackerId) + val cursor = db.query( + true, + TABLE_NAME, + columns, + selection, + selectionArg, + null, + null, + null, + null + ) + + val apIds: MutableList = ArrayList() + while (cursor.moveToNext()) { + apIds.add(cursor.getString(COLUMN_NAME_APPID)) + } + cursor.close() + db.close() + + apIds + } + } + + suspend fun getCallsForApp(apId: String): Pair = withContext(Dispatchers.IO) { + synchronized(lock) { + val db = readableDatabase + val selection = "$COLUMN_NAME_APPID = ?" + val selectionArg = arrayOf(apId) + val projection = + "SUM($COLUMN_NAME_NUMBER_CONTACTED) $PROJECTION_NAME_CONTACTED_SUM," + + "SUM($COLUMN_NAME_NUMBER_BLOCKED) $PROJECTION_NAME_BLOCKED_SUM" + val cursor = db.rawQuery( + "SELECT $projection FROM $TABLE_NAME WHERE $selection", + selectionArg + ) + var calls: Pair = 0 to 0 + if (cursor.moveToNext()) { + val contacted = cursor.getInt(PROJECTION_NAME_CONTACTED_SUM) + val blocked = cursor.getInt(PROJECTION_NAME_BLOCKED_SUM) + calls = blocked to contacted - blocked + } + cursor.close() + db.close() + calls + } + } + + suspend fun getCallsForTracker(trackerId: String): Pair = withContext(Dispatchers.IO) { + synchronized(lock) { + val db = readableDatabase + val selection = "$COLUMN_NAME_TRACKER = ?" + val selectionArg = arrayOf(trackerId) + val projection = + "SUM($COLUMN_NAME_NUMBER_CONTACTED) $PROJECTION_NAME_CONTACTED_SUM," + + "SUM($COLUMN_NAME_NUMBER_BLOCKED) $PROJECTION_NAME_BLOCKED_SUM" + val cursor = db.rawQuery( + "SELECT $projection FROM $TABLE_NAME WHERE $selection", + selectionArg + ) + var calls: Pair = 0 to 0 + if (cursor.moveToNext()) { + val contacted = cursor.getInt(PROJECTION_NAME_CONTACTED_SUM) + val blocked = cursor.getInt(PROJECTION_NAME_BLOCKED_SUM) + calls = blocked to contacted - blocked + } + cursor.close() + db.close() + calls + } + } + + suspend fun getBlockedLeaksCount(periodCount: Int, periodUnit: TemporalUnit): Int = withContext(Dispatchers.IO) { + synchronized(lock) { + val minTimestamp = getPeriodStartTs(periodCount, periodUnit) + val db = readableDatabase + val selection = "$COLUMN_NAME_TIMESTAMP >= ?" + val selectionArg = arrayOf("" + minTimestamp) + val projection = "SUM($COLUMN_NAME_NUMBER_BLOCKED) $PROJECTION_NAME_BLOCKED_SUM" + val cursor = db.rawQuery( + "SELECT $projection FROM $TABLE_NAME WHERE $selection", + selectionArg + ) + + var count = 0 + if (cursor.moveToNext()) { + count = cursor.getInt(0) + } + cursor.close() + db.close() + count + } + } + + suspend fun getAppsWithBlockedLeaksCount(periodCount: Int, periodUnit: TemporalUnit): Int = withContext(Dispatchers.IO) { + synchronized(lock) { + val minTimestamp = getPeriodStartTs(periodCount, periodUnit) + val db = readableDatabase + val selection = "$COLUMN_NAME_TIMESTAMP >= ? AND $COLUMN_NAME_NUMBER_BLOCKED > 0" + val selectionArg = arrayOf("" + minTimestamp) + val cursor = db.rawQuery( + "SELECT COUNT (DISTINCT $COLUMN_NAME_APPID) FROM $TABLE_NAME WHERE $selection", + selectionArg + ) + + var count = 0 + if (cursor.moveToNext()) { + count = cursor.getInt(0) + } + cursor.close() + db.close() + count + } + } + + suspend fun getCallsByAppIds(since: Long): Map = withContext(Dispatchers.IO) { + synchronized(lock) { + val db = readableDatabase + val selection = "$COLUMN_NAME_TIMESTAMP >= ?" + val selectionArg = arrayOf("" + since) + val projection = "$COLUMN_NAME_APPID, " + + "SUM($COLUMN_NAME_NUMBER_CONTACTED) $PROJECTION_NAME_CONTACTED_SUM" + val cursor = db.rawQuery( + "SELECT $projection FROM $TABLE_NAME" + + " WHERE $selection" + + " GROUP BY $COLUMN_NAME_APPID", + selectionArg + ) + val callsByApp = HashMap() + + while (cursor.moveToNext()) { + val contacted = cursor.getInt(PROJECTION_NAME_CONTACTED_SUM) + callsByApp[cursor.getString(COLUMN_NAME_APPID)] = contacted + } + cursor.close() + db.close() + callsByApp + } + } + + suspend fun get5MostCalledTrackers(since: Long): List> = withContext(Dispatchers.IO) { + synchronized(lock) { + val db = readableDatabase + val selection = "$COLUMN_NAME_TIMESTAMP >= ?" + val selectionArg = arrayOf("" + since) + val projection = "$COLUMN_NAME_TRACKER, " + + "SUM($COLUMN_NAME_NUMBER_CONTACTED) $PROJECTION_NAME_CONTACTED_SUM" + val cursor = db.rawQuery( + "SELECT $projection FROM $TABLE_NAME" + + " WHERE $selection" + + " GROUP BY $COLUMN_NAME_TRACKER" + + " ORDER BY $PROJECTION_NAME_CONTACTED_SUM DESC" + + " LIMIT 5", + selectionArg + ) + val trackers = mutableListOf>() + while (cursor.moveToNext()) { + val trackerId = cursor.getString(COLUMN_NAME_TRACKER) + val calls = cursor.getInt(PROJECTION_NAME_CONTACTED_SUM) + trackers.add(trackerId to calls) + } + cursor.close() + db.close() + trackers + } + } + + suspend fun logAccess(trackerId: String?, appId: String, blocked: Boolean) = withContext( + Dispatchers.IO + ) { + synchronized(lock) { + val currentHour = getCurrentHourTs() + val db = writableDatabase + val values = ContentValues() + values.put(COLUMN_NAME_APPID, appId) + values.put(COLUMN_NAME_TRACKER, trackerId) + values.put(COLUMN_NAME_TIMESTAMP, currentHour) + + /*String query = "UPDATE product SET "+COLUMN_NAME_NUMBER_CONTACTED+" = "+COLUMN_NAME_NUMBER_CONTACTED+" + 1 "; + if(blocked) + query+=COLUMN_NAME_NUMBER_BLOCKED+" = "+COLUMN_NAME_NUMBER_BLOCKED+" + 1 "; +*/ + val selection = "$COLUMN_NAME_TIMESTAMP = ? AND " + + "$COLUMN_NAME_APPID = ? AND " + + "$COLUMN_NAME_TRACKER = ? " + val selectionArg = arrayOf("" + currentHour, "" + appId, trackerId) + val cursor = db.query( + TABLE_NAME, + projection, + selection, + selectionArg, + null, + null, + null + ) + if (cursor.count > 0) { + cursor.moveToFirst() + val entry = cursorToEntry(cursor) + if (blocked) { + values.put( + COLUMN_NAME_NUMBER_BLOCKED, + entry.sum_blocked + 1 + ) + } else { + values.put(COLUMN_NAME_NUMBER_BLOCKED, entry.sum_blocked) + } + values.put(COLUMN_NAME_NUMBER_CONTACTED, entry.sum_contacted + 1) + db.update(TABLE_NAME, values, selection, selectionArg) + + // db.execSQL(query, new String[]{""+hour, ""+day, ""+month, ""+year, ""+appUid, ""+trackerId}); + } else { + if (blocked) { + values.put( + COLUMN_NAME_NUMBER_BLOCKED, + 1 + ) + } else { + values.put(COLUMN_NAME_NUMBER_BLOCKED, 0) + } + values.put(COLUMN_NAME_NUMBER_CONTACTED, 1) + db.insert(TABLE_NAME, null, values) + } + cursor.close() + db.close() + } + _newDataAvailable.emit(Unit) + } + + private fun cursorToEntry(cursor: Cursor): StatEntry { + val entry = StatEntry() + entry.timestamp = cursor.getLong(COLUMN_NAME_TIMESTAMP) + entry.appId = cursor.getString(COLUMN_NAME_APPID) + entry.sum_blocked = cursor.getInt(COLUMN_NAME_NUMBER_BLOCKED) + entry.sum_contacted = cursor.getInt(COLUMN_NAME_NUMBER_CONTACTED) + entry.tracker = cursor.getInt(COLUMN_NAME_TRACKER) + return entry + } + + suspend fun getTrackerIds(appIds: List?): List = withContext(Dispatchers.IO) { + synchronized(lock) { + val columns = arrayOf(COLUMN_NAME_TRACKER, COLUMN_NAME_APPID) + var selection: String? = null + + var selectionArg: Array? = null + appIds?.let { appIds -> + selection = "$COLUMN_NAME_APPID IN (${appIds.joinToString(", ") { "'$it'" }})" + selectionArg = arrayOf() + } + + val db = readableDatabase + val cursor = db.query( + true, + TABLE_NAME, + columns, + selection, + selectionArg, + null, + null, + null, + null + ) + val trackerIds: MutableList = mutableListOf() + while (cursor.moveToNext()) { + trackerIds.add(cursor.getString(COLUMN_NAME_TRACKER)) + } + cursor.close() + db.close() + trackerIds + } + } + + class StatEntry { + var appId = "" + var sum_contacted = 0 + var sum_blocked = 0 + var timestamp: Long = 0 + var tracker = 0 + } + + private fun getCurrentHourTs(): Long { + val hourInMs = TimeUnit.HOURS.toMillis(1L) + val hourInS = TimeUnit.HOURS.toSeconds(1L) + return System.currentTimeMillis() / hourInMs * hourInS + } + + private fun getPeriodStartTs(periodsCount: Int, periodUnit: TemporalUnit): Long { + var start = ZonedDateTime.now() + .minus(periodsCount.toLong(), periodUnit) + .plus(1, periodUnit) + var truncatePeriodUnit = periodUnit + if (periodUnit === ChronoUnit.MONTHS) { + start = start.withDayOfMonth(1) + truncatePeriodUnit = ChronoUnit.DAYS + } + return start.truncatedTo(truncatePeriodUnit).toEpochSecond() + } + + private fun Cursor.getInt(columnName: String): Int { + val columnIndex = getColumnIndex(columnName) + return if (columnIndex >= 0) getInt(columnIndex) else 0 + } + + private fun Cursor.getLong(columnName: String): Long { + val columnIndex = getColumnIndex(columnName) + return if (columnIndex >= 0) getLong(columnIndex) else 0 + } + + private fun Cursor.getString(columnName: String): String { + val columnIndex = getColumnIndex(columnName) + return if (columnIndex >= 0) { + getStringOrNull(columnIndex) ?: "" + } else { + "" + } + } +} diff --git a/trackers/src/main/java/foundation/e/advancedprivacy/trackers/data/TrackersRepository.kt b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/data/TrackersRepository.kt new file mode 100644 index 0000000..d640a5d --- /dev/null +++ b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/data/TrackersRepository.kt @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2022 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.trackers.data + +import android.content.Context +import com.google.gson.Gson +import foundation.e.advancedprivacy.trackers.domain.entities.Tracker +import java.io.File +import java.io.FileInputStream +import java.io.InputStreamReader +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import timber.log.Timber + +class TrackersRepository( + private val context: Context, + coroutineScope: CoroutineScope +) { + + private var trackersById: Map = HashMap() + private var hostnameToId: Map = HashMap() + + private val eTrackerFileName = "e_trackers.json" + val eTrackerFile = File(context.filesDir.absolutePath, eTrackerFileName) + + init { + coroutineScope.launch(Dispatchers.IO) { + initTrackersFile() + } + } + fun initTrackersFile() { + try { + var inputStream = context.assets.open(eTrackerFileName) + if (eTrackerFile.exists()) { + inputStream = FileInputStream(eTrackerFile) + } + val reader = InputStreamReader(inputStream, "UTF-8") + val trackerResponse = + Gson().fromJson(reader, ETrackersResponse::class.java) + + setTrackersList(mapper(trackerResponse)) + + reader.close() + inputStream.close() + } catch (e: Exception) { + Timber.e(e, "While parsing trackers in assets") + } + } + + private fun mapper(response: ETrackersResponse): List { + return response.trackers.mapNotNull { + try { + it.toTracker() + } catch (e: Exception) { + null + } + } + } + + private fun ETrackersResponse.ETracker.toTracker(): Tracker { + return Tracker( + id = id!!, + hostnames = hostnames!!.toSet(), + label = name!!, + link = link + ) + } + + private fun setTrackersList(list: List) { + val trackersById: MutableMap = HashMap() + val hostnameToId: MutableMap = HashMap() + list.forEach { tracker -> + trackersById[tracker.id] = tracker + for (hostname in tracker.hostnames) { + hostnameToId[hostname] = tracker.id + } + } + this.trackersById = trackersById + this.hostnameToId = hostnameToId + } + + fun isTracker(hostname: String?): Boolean { + return hostnameToId.containsKey(hostname) + } + + fun getTrackerId(hostname: String?): String? { + return hostnameToId[hostname] + } + + fun getTracker(id: String?): Tracker? { + return trackersById[id] + } +} diff --git a/trackers/src/main/java/foundation/e/advancedprivacy/trackers/data/WhitelistRepository.kt b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/data/WhitelistRepository.kt new file mode 100644 index 0000000..4a4d337 --- /dev/null +++ b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/data/WhitelistRepository.kt @@ -0,0 +1,347 @@ +/* + * Copyright (C) 2023 MURENA SAS + * Copyright (C) 2022 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.trackers.data + +import android.content.Context +import android.content.SharedPreferences +import foundation.e.advancedprivacy.data.repositories.AppListRepository +import foundation.e.advancedprivacy.domain.entities.ApplicationDescription +import foundation.e.advancedprivacy.trackers.domain.entities.Tracker +import java.io.File +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withContext + +class WhitelistRepository( + context: Context, + private val appListRepository: AppListRepository +) { + private var appsWhitelist: Set = HashSet() + private var appUidsWhitelist: Set = HashSet() + + private var trackersWhitelist: Set = HashSet() + + private var apIdTrackersWhitelist: Map = emptyMap() + private var appUidTrackersWhitelist: Map = emptyMap() + + private val prefs: SharedPreferences + + companion object { + private const val SHARED_PREFS_FILE = "trackers_whitelist_v3" + private const val KEY_BLOCKING_ENABLED = "blocking_enabled" + private const val KEY_APPS_WHITELIST = "apps_whitelist" + private const val KEY_TRACKERS_WHITELIST = "trackers_whitelist" + private const val KEY_APP_TRACKER_WHITELIST = "app_tracker_whitelist" + private const val KEY_APP_TRACKER_BLACKLIST = "app_tracker_blacklist" + + // Deprecated keys. + private const val SHARED_PREFS_FILE_V1 = "trackers_whitelist.prefs" + private const val SHARED_PREFS_FILE_V2 = "trackers_whitelist_v2" + private const val KEY_APP_TRACKERS_WHITELIST_PREFIX = "app_trackers_whitelist_" + } + + init { + prefs = context.getSharedPreferences(SHARED_PREFS_FILE, Context.MODE_PRIVATE) + reloadCache() + migrate(context) + } + + private fun migrate(context: Context) { + if (context.sharedPreferencesExists(SHARED_PREFS_FILE_V1)) { + migrate1To2(context) + } + if (context.sharedPreferencesExists(SHARED_PREFS_FILE_V2)) { + migrate2To3(context) + } + } + + private fun Context.sharedPreferencesExists(fileName: String): Boolean { + return File( + "${applicationInfo.dataDir}/shared_prefs/$fileName.xml" + ).exists() + } + + private fun migrate1To2(context: Context) { + val prefsV1 = context.getSharedPreferences(SHARED_PREFS_FILE_V1, Context.MODE_PRIVATE) + val editorV2 = prefs.edit() + + editorV2.putBoolean(KEY_BLOCKING_ENABLED, prefsV1.getBoolean(KEY_BLOCKING_ENABLED, false)) + + val apIds = prefsV1.getStringSet(KEY_APPS_WHITELIST, HashSet())?.mapNotNull { + try { + val uid = it.toInt() + appListRepository.getApp(uid)?.apId + } catch (e: Exception) { + null + } + }?.toSet() ?: HashSet() + + editorV2.putStringSet(KEY_APPS_WHITELIST, apIds) + + prefsV1.all.keys.forEach { key -> + if (key.startsWith(KEY_APP_TRACKERS_WHITELIST_PREFIX)) { + try { + val uid = key.substring(KEY_APP_TRACKERS_WHITELIST_PREFIX.length).toInt() + val apId = appListRepository.getApp(uid)?.apId + apId?.let { + val trackers = prefsV1.getStringSet(key, emptySet()) + editorV2.putStringSet(KEY_APP_TRACKERS_WHITELIST_PREFIX + apId, trackers) + } + } catch (e: Exception) { } + } + } + editorV2.commit() + + context.deleteSharedPreferences(SHARED_PREFS_FILE_V1) + + reloadCache() + } + + private fun migrate2To3(context: Context) { + val prefsV2 = context.getSharedPreferences(SHARED_PREFS_FILE_V2, Context.MODE_PRIVATE) + val editorV3 = prefs.edit() + + editorV3.putBoolean(KEY_BLOCKING_ENABLED, prefsV2.getBoolean(KEY_BLOCKING_ENABLED, false)) + + prefsV2.getStringSet(KEY_APPS_WHITELIST, null)?.let { + editorV3.putStringSet(KEY_APPS_WHITELIST, it) + } + editorV3.commit() + + runBlocking { + prefsV2.all.keys.forEach { key -> + if (key.startsWith(KEY_APP_TRACKERS_WHITELIST_PREFIX)) { + runCatching { + val apId = key.substring(KEY_APP_TRACKERS_WHITELIST_PREFIX.length) + prefsV2.getStringSet(key, null) + ?.map { trackerId -> buildApIdTrackerKey(apId, trackerId) } + ?.let { setWhitelisted(it, true) } + } + } + } + } + + context.deleteSharedPreferences(SHARED_PREFS_FILE_V2) + + reloadCache() + } + + private fun reloadCache() { + isBlockingEnabled = prefs.getBoolean(KEY_BLOCKING_ENABLED, false) + reloadAppsWhiteList() + reloadAppTrackersWhitelist() + } + + private fun reloadAppsWhiteList() { + appsWhitelist = prefs.getStringSet(KEY_APPS_WHITELIST, HashSet()) ?: HashSet() + appUidsWhitelist = appsWhitelist + .mapNotNull { apId -> appListRepository.getApp(apId)?.uid } + .toSet() + } + + private fun reloadTrackersWhiteList() { + trackersWhitelist = prefs.getStringSet(KEY_TRACKERS_WHITELIST, HashSet()) ?: HashSet() + } + + private fun reloadAppTrackersWhitelist() { + val whitelist = mutableMapOf() + prefs.getStringSet(KEY_APP_TRACKER_WHITELIST, HashSet())?.forEach { key -> + whitelist[key] = true + } + + prefs.getStringSet(KEY_APP_TRACKER_BLACKLIST, HashSet())?.forEach { key -> + whitelist[key] = false + } + + apIdTrackersWhitelist = whitelist + appUidTrackersWhitelist = whitelist.mapNotNull { (apIdTrackerId, isWhitelisted) -> + val (apId, tracker) = parseApIdTrackerKey(apIdTrackerId) + appListRepository.getApp(apId)?.uid?.let { uid -> + buildAppUidTrackerKey(uid, tracker) to isWhitelisted + } + }.toMap() + } + + var isBlockingEnabled: Boolean = false + get() = field + set(enabled) { + prefs.edit().putBoolean(KEY_BLOCKING_ENABLED, enabled).apply() + field = enabled + } + + fun setWhiteListed(apIds: List, isWhiteListed: Boolean) { + val current = prefs.getStringSet(KEY_APPS_WHITELIST, HashSet())?.toHashSet() ?: HashSet() + + if (isWhiteListed) { + current.addAll(apIds) + } else { + current.removeAll(apIds) + } + prefs.edit().putStringSet(KEY_APPS_WHITELIST, current).commit() + reloadAppsWhiteList() + } + + private suspend fun setWhitelisted(keys: List, isWhitelisted: Boolean) = withContext(Dispatchers.IO) { + val whitelist = HashSet().apply { + prefs.getStringSet(KEY_APP_TRACKER_WHITELIST, HashSet())?.let { addAll(it) } + } + + val blacklist = HashSet().apply { + prefs.getStringSet(KEY_APP_TRACKER_BLACKLIST, HashSet())?.let { addAll(it) } + } + + if (isWhitelisted) { + blacklist.removeAll(keys) + whitelist.addAll(keys) + } else { + whitelist.removeAll(keys) + blacklist.addAll(keys) + } + + prefs.edit().apply { + putStringSet(KEY_APP_TRACKER_BLACKLIST, blacklist) + putStringSet(KEY_APP_TRACKER_WHITELIST, whitelist) + commit() + } + reloadAppTrackersWhitelist() + } + + suspend fun setWhiteListed(tracker: Tracker, apId: String, isWhitelisted: Boolean) { + setWhitelisted(listOf(buildApIdTrackerKey(apId, tracker.id)), isWhitelisted) + } + + suspend fun setWhitelistedTrackersForApps(apIds: List, trackerIds: List, isWhitelisted: Boolean) = withContext( + Dispatchers.IO + ) { + setWhitelisted( + apIds.flatMap { apId -> + trackerIds.map { trackerId -> buildApIdTrackerKey(apId, trackerId) } + }, + isWhitelisted + ) + } + + suspend fun setWhitelistedAppsForTracker(apIds: List, trackerId: String, isWhitelisted: Boolean) = withContext( + Dispatchers.IO + ) { + setWhitelisted( + apIds.map { apId -> buildApIdTrackerKey(apId, trackerId) }, + isWhitelisted + ) + } + + fun isAppWhiteListed(app: ApplicationDescription): Boolean { + return appsWhitelist.contains(app.apId) + } + + fun isAppWhiteListed(appUid: Int): Boolean { + return appUidsWhitelist.contains(appUid) + } + + fun isWhiteListed(appUid: Int, trackerId: String?): Boolean? { + trackerId ?: return null + + val key = buildAppUidTrackerKey(appUid, trackerId) + return appUidTrackersWhitelist.get(key) + } + + private fun buildApIdTrackerKey(apId: String, trackerId: String): String { + return "$apId|$trackerId" + } + + private fun parseApIdTrackerKey(key: String): Pair { + return key.split("|").let { it[0] to it[1] } + } + + private fun buildAppUidTrackerKey(appUid: Int, trackerId: String): String { + return "$appUid-$trackerId" + } + + fun areWhiteListEmpty(): Boolean { + return appsWhitelist.isEmpty() && + trackersWhitelist.isEmpty() && + apIdTrackersWhitelist.values.none { it } + } + + fun getWhiteListedApp(): List { + return appsWhitelist.mapNotNull(appListRepository::getApp) + } + + fun getWhiteListForApp(app: ApplicationDescription): List { + return apIdTrackersWhitelist.entries.mapNotNull { (key, isWhitelisted) -> + if (!isWhitelisted) { + null + } else { + val (apId, tracker) = parseApIdTrackerKey(key) + if (apId == app.apId) { + tracker + } else { + null + } + } + } + } + + fun clearWhiteList(apId: String) { + val (whitelistToRemove, blacklistToRemove) = apIdTrackersWhitelist.entries + .filter { (key, _) -> key.startsWith(apId) } + .partition { (_, whitelisted) -> whitelisted }.let { (whitelistEntries, blacklistEntries) -> + whitelistEntries.map { it.key }.toSet() to + blacklistEntries.map { it.key }.toSet() + } + + val whitelist = HashSet().apply { + prefs.getStringSet(KEY_APP_TRACKER_WHITELIST, HashSet())?.let { addAll(it) } + } + + val blacklist = HashSet().apply { + prefs.getStringSet(KEY_APP_TRACKER_BLACKLIST, HashSet())?.let { addAll(it) } + } + + whitelist.removeAll(whitelistToRemove) + blacklist.removeAll(blacklistToRemove) + + prefs.edit().apply { + putStringSet(KEY_APP_TRACKER_WHITELIST, whitelist) + putStringSet(KEY_APP_TRACKER_BLACKLIST, blacklist) + commit() + } + reloadAppTrackersWhitelist() + } + + fun setWhiteListed(tracker: Tracker, isWhiteListed: Boolean) { + val current = prefs.getStringSet(KEY_TRACKERS_WHITELIST, HashSet())?.toHashSet() ?: HashSet() + + if (isWhiteListed) { + current.add(tracker.id) + } else { + current.remove(tracker.id) + } + prefs.edit().putStringSet(KEY_TRACKERS_WHITELIST, current).commit() + reloadTrackersWhiteList() + } + + fun isWhiteListed(tracker: Tracker): Boolean { + return trackersWhitelist.contains(tracker.id) + } + + fun isTrackerWhiteListed(trackerId: String): Boolean { + return trackersWhitelist.contains(trackerId) + } +} diff --git a/trackers/src/main/java/foundation/e/advancedprivacy/trackers/domain/entities/Tracker.kt b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/domain/entities/Tracker.kt new file mode 100644 index 0000000..7759987 --- /dev/null +++ b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/domain/entities/Tracker.kt @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2022 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.trackers.domain.entities + +/** + * Describe a tracker. + */ +data class Tracker( + val id: String, + val hostnames: Set, + val label: String, + val link: String? +) diff --git a/trackers/src/main/java/foundation/e/advancedprivacy/trackers/domain/externalinterfaces/TrackersSupervisor.kt b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/domain/externalinterfaces/TrackersSupervisor.kt new file mode 100644 index 0000000..ca4e1eb --- /dev/null +++ b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/domain/externalinterfaces/TrackersSupervisor.kt @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.trackers.domain.externalinterfaces + +import foundation.e.advancedprivacy.externalinterfaces.servicesupervisors.FeatureSupervisor +import java.util.function.Function +import org.pcap4j.packet.DnsPacket + +interface TrackersSupervisor : FeatureSupervisor { + fun isRunning(): Boolean + + val dnsFilterForIpScrambling: Function? +} diff --git a/trackers/src/main/java/foundation/e/advancedprivacy/trackers/domain/usecases/FilterHostnameUseCase.kt b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/domain/usecases/FilterHostnameUseCase.kt new file mode 100644 index 0000000..d4650be --- /dev/null +++ b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/domain/usecases/FilterHostnameUseCase.kt @@ -0,0 +1,116 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.trackers.domain.usecases + +import android.content.Context +import android.content.pm.PackageManager +import foundation.e.advancedprivacy.core.utils.runSuspendCatching +import foundation.e.advancedprivacy.data.repositories.AppListRepository +import foundation.e.advancedprivacy.domain.entities.ApplicationDescription +import foundation.e.advancedprivacy.trackers.data.StatsDatabase +import foundation.e.advancedprivacy.trackers.data.TrackersRepository +import foundation.e.advancedprivacy.trackers.data.WhitelistRepository +import java.util.concurrent.LinkedBlockingQueue +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.isActive +import kotlinx.coroutines.launch +import timber.log.Timber + +class FilterHostnameUseCase( + private val trackersRepository: TrackersRepository, + private val whitelistRepository: WhitelistRepository, + context: Context, + private val appDesc: ApplicationDescription, + private val database: StatsDatabase, + private val appListRepository: AppListRepository +) { + private var eBrowserAppUid = -1 + + companion object { + private const val E_BROWSER_DOT_SERVER = "chrome.cloudflare-dns.com" + } + + init { + initEBrowserDoTFix(context) + } + + fun shouldBlock(hostname: String, appUid: Int = appDesc.uid): Boolean { + var isBlocked = false + + if (isEBrowserDoTBlockFix(appUid, hostname)) { + isBlocked = true + } else if (trackersRepository.isTracker(hostname)) { + val trackerId = trackersRepository.getTrackerId(hostname) + if (shouldBlock(appUid, trackerId)) { + isBlocked = true + } + queue.offer(DetectedTracker(trackerId, appUid, isBlocked)) + } + return isBlocked + } + + private fun initEBrowserDoTFix(context: Context) { + try { + eBrowserAppUid = + context.packageManager.getApplicationInfo("foundation.e.browser", 0).uid + } catch (e: PackageManager.NameNotFoundException) { + Timber.i("no E Browser package found.") + } + } + + private fun isEBrowserDoTBlockFix(appUid: Int, hostname: String): Boolean { + return appUid == eBrowserAppUid && + E_BROWSER_DOT_SERVER == hostname + } + + private fun shouldBlock(appUid: Int, trackerId: String?): Boolean { + return whitelistRepository.isBlockingEnabled && + trackerId != null && + !isWhitelisted(appUid, trackerId) + } + + fun isWhitelisted(appUid: Int, trackerId: String): Boolean { + return whitelistRepository.isWhiteListed(appUid, trackerId) ?: ( + whitelistRepository.isTrackerWhiteListed(trackerId) || + whitelistRepository.isAppWhiteListed(appUid) + ) + } + + private val queue = LinkedBlockingQueue() + + private suspend fun logAccess(detectedTracker: DetectedTracker) { + appListRepository.getApp(detectedTracker.appUid)?.let { app -> + database.logAccess(detectedTracker.trackerId, app.apId, detectedTracker.wasBlocked) + } + } + + fun writeLogJob(scope: CoroutineScope): Job { + return scope.launch(Dispatchers.IO) { + while (isActive) { + runSuspendCatching { + logAccess(queue.take()) + }.onFailure { + Timber.e(it, "writeLogLoop detectedTrackersQueue.take() interrupted: ") + } + } + } + } + + inner class DetectedTracker(var trackerId: String?, var appUid: Int, var wasBlocked: Boolean) +} diff --git a/trackers/src/main/java/foundation/e/advancedprivacy/trackers/domain/usecases/UpdateTrackerListUseCase.kt b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/domain/usecases/UpdateTrackerListUseCase.kt new file mode 100644 index 0000000..2645e60 --- /dev/null +++ b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/domain/usecases/UpdateTrackerListUseCase.kt @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.trackers.domain.usecases + +import foundation.e.advancedprivacy.data.repositories.ETrackersApi +import foundation.e.advancedprivacy.data.repositories.RemoteTrackersListRepository +import foundation.e.advancedprivacy.trackers.data.TrackersRepository +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch +import timber.log.Timber + +class UpdateTrackerListUseCase( + private val remoteTrackersListRepository: RemoteTrackersListRepository, + private val trackersRepository: TrackersRepository, + private val coroutineScope: CoroutineScope + +) { + fun updateTrackers() = coroutineScope.launch { + update() + } + + suspend fun update() { + val api = ETrackersApi.build() + try { + remoteTrackersListRepository.saveData(trackersRepository.eTrackerFile, api.trackers()) + trackersRepository.initTrackersFile() + } catch (e: Exception) { + Timber.e(e, "While updating trackers") + } + } +} diff --git a/trackers/src/main/java/foundation/e/advancedprivacy/trackers/services/ForegroundStarter.kt b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/services/ForegroundStarter.kt new file mode 100644 index 0000000..a0cea43 --- /dev/null +++ b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/services/ForegroundStarter.kt @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2021 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.trackers.services + +import android.app.Notification +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.Service +import android.content.Context +import android.os.Build + +object ForegroundStarter { + private const val NOTIFICATION_CHANNEL_ID = "blocker_service" + fun startForeground(service: Service) { + val mNotificationManager = + service.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + if (Build.VERSION.SDK_INT >= 26) { + mNotificationManager.createNotificationChannel( + NotificationChannel( + NOTIFICATION_CHANNEL_ID, + NOTIFICATION_CHANNEL_ID, + NotificationManager.IMPORTANCE_LOW + ) + ) + val notification = Notification.Builder(service, NOTIFICATION_CHANNEL_ID) + .setContentTitle("Trackers filter").build() + service.startForeground(1337, notification) + } + } +} diff --git a/trackers/src/main/java/foundation/e/advancedprivacy/trackers/services/UpdateTrackersWorker.kt b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/services/UpdateTrackersWorker.kt new file mode 100644 index 0000000..6b3d5d6 --- /dev/null +++ b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/services/UpdateTrackersWorker.kt @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2022 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.trackers.services + +import android.content.Context +import androidx.work.Constraints +import androidx.work.CoroutineWorker +import androidx.work.ExistingPeriodicWorkPolicy +import androidx.work.NetworkType +import androidx.work.PeriodicWorkRequestBuilder +import androidx.work.WorkManager +import androidx.work.WorkerParameters +import foundation.e.advancedprivacy.trackers.domain.usecases.UpdateTrackerListUseCase +import java.util.concurrent.TimeUnit +import org.koin.java.KoinJavaComponent.get + +class UpdateTrackersWorker(appContext: Context, workerParams: WorkerParameters) : + CoroutineWorker(appContext, workerParams) { + + override suspend fun doWork(): Result { + val updateTrackersUsecase: UpdateTrackerListUseCase = get(UpdateTrackerListUseCase::class.java) + + updateTrackersUsecase.updateTrackers() + return Result.success() + } + + companion object { + private val constraints = Constraints.Builder() + .setRequiredNetworkType(NetworkType.CONNECTED) + .build() + + fun periodicUpdate(context: Context) { + val request = PeriodicWorkRequestBuilder( + 7, + TimeUnit.DAYS + ) + .setConstraints(constraints).build() + + WorkManager.getInstance(context).enqueueUniquePeriodicWork( + UpdateTrackersWorker::class.qualifiedName ?: "", + ExistingPeriodicWorkPolicy.KEEP, + request + ) + } + } +} diff --git a/trackersserviceeos/.gitignore b/trackersserviceeos/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/trackersserviceeos/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/trackersserviceeos/build.gradle b/trackersserviceeos/build.gradle new file mode 100644 index 0000000..0891381 --- /dev/null +++ b/trackersserviceeos/build.gradle @@ -0,0 +1,41 @@ +plugins { + id 'com.android.library' + id 'org.jetbrains.kotlin.android' +} + +android { + namespace 'foundation.e.advancedprivacy.trackers.service' + compileSdkVersion buildConfig.compileSdk + + defaultConfig { + minSdkVersion buildConfig.minSdk + targetSdkVersion buildConfig.targetSdk + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + kotlinOptions { + jvmTarget = '17' + } +} + +dependencies { + implementation project(":core") + implementation project(":trackers") + implementation project(":ipscrambling") + + implementation( + libs.androidx.core.ktx, + libs.bundles.koin, + libs.kotlinx.coroutines, + libs.timber, + ) +} diff --git a/trackersserviceeos/consumer-rules.pro b/trackersserviceeos/consumer-rules.pro new file mode 100644 index 0000000..e69de29 diff --git a/trackersserviceeos/proguard-rules.pro b/trackersserviceeos/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/trackersserviceeos/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/trackersserviceeos/src/main/AndroidManifest.xml b/trackersserviceeos/src/main/AndroidManifest.xml new file mode 100644 index 0000000..688bfb0 --- /dev/null +++ b/trackersserviceeos/src/main/AndroidManifest.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/trackersserviceeos/src/main/java/foundation/e/advancedprivacy/trackers/service/DNSBlocker.kt b/trackersserviceeos/src/main/java/foundation/e/advancedprivacy/trackers/service/DNSBlocker.kt new file mode 100644 index 0000000..2da4fdb --- /dev/null +++ b/trackersserviceeos/src/main/java/foundation/e/advancedprivacy/trackers/service/DNSBlocker.kt @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2023 MURENA SAS + * Copyright (C) 2022 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.advancedprivacy.trackers.service + +import android.net.LocalServerSocket +import android.system.ErrnoException +import android.system.Os +import android.system.OsConstants +import foundation.e.advancedprivacy.core.utils.runSuspendCatching +import foundation.e.advancedprivacy.trackers.domain.usecases.FilterHostnameUseCase +import java.io.BufferedReader +import java.io.InputStreamReader +import java.io.PrintWriter +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.isActive +import kotlinx.coroutines.launch +import timber.log.Timber + +class DNSBlocker( + val filterHostnameUseCase: FilterHostnameUseCase +) { + private var resolverReceiver: LocalServerSocket? = null + + companion object { + private const val SOCKET_NAME = "foundation.e.advancedprivacy" + } + + private fun closeSocket() { + // Known bug and workaround that LocalServerSocket::close is not working well + // https://issuetracker.google.com/issues/36945762 + if (resolverReceiver != null) { + try { + Os.shutdown(resolverReceiver!!.fileDescriptor, OsConstants.SHUT_RDWR) + resolverReceiver!!.close() + resolverReceiver = null + } catch (e: ErrnoException) { + if (e.errno != OsConstants.EBADF) { + Timber.w("Socket already closed") + } else { + Timber.e(e, "Exception: cannot close DNS port on stop $SOCKET_NAME !") + } + } catch (e: Exception) { + Timber.e(e, "Exception: cannot close DNS port on stop $SOCKET_NAME !") + } + } + } + + fun listenJob(scope: CoroutineScope): Job = scope.launch(Dispatchers.IO) { + val resolverReceiver = runSuspendCatching { + LocalServerSocket(SOCKET_NAME) + }.getOrElse { + Timber.e(it, "Exception: cannot open DNS port on $SOCKET_NAME") + return@launch + } + + this@DNSBlocker.resolverReceiver = resolverReceiver + Timber.d("DNSFilterProxy running on port $SOCKET_NAME") + + while (isActive) { + runSuspendCatching { + val socket = resolverReceiver.accept() + val reader = BufferedReader(InputStreamReader(socket.inputStream)) + val line = reader.readLine() + val params = line.split(",").toTypedArray() + val output = socket.outputStream + val writer = PrintWriter(output, true) + val domainName = params[0] + val appUid = params[1].toInt() + if (filterHostnameUseCase.shouldBlock(domainName, appUid)) { + writer.println("block") + } else { + writer.println("pass") + } + socket.close() + }.onFailure { + if (it is CancellationException) { + closeSocket() + throw it + } else { + Timber.w(it, "Exception while listening DNS resolver") + } + } + } + } +} diff --git a/trackersserviceeos/src/main/java/foundation/e/advancedprivacy/trackers/service/TrackersService.kt b/trackersserviceeos/src/main/java/foundation/e/advancedprivacy/trackers/service/TrackersService.kt new file mode 100644 index 0000000..5f573b0 --- /dev/null +++ b/trackersserviceeos/src/main/java/foundation/e/advancedprivacy/trackers/service/TrackersService.kt @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2023 MURENA SAS + * Copyright (C) 2021 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.trackers.service + +import android.app.Service +import android.content.Intent +import android.os.IBinder +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.cancel +import org.koin.java.KoinJavaComponent.get + +class TrackersService : Service() { + companion object { + const val ACTION_START = "foundation.e.privacymodules.trackers.intent.action.START" + + var coroutineScope = CoroutineScope(Dispatchers.IO) + } + + override fun onBind(intent: Intent): IBinder? { + throw UnsupportedOperationException("Not yet implemented") + } + + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + if (ACTION_START == intent?.action) { + stop() + start() + } + return START_REDELIVER_INTENT + } + + private fun start() { + coroutineScope = CoroutineScope(Dispatchers.IO) + get(DNSBlocker::class.java).apply { + filterHostnameUseCase.writeLogJob(coroutineScope) + listenJob(coroutineScope) + } + } + + private fun stop() { + kotlin.runCatching { coroutineScope.cancel() } + } +} diff --git a/trackersserviceeos/src/main/java/foundation/e/advancedprivacy/trackers/service/TrackersSupervisorEos.kt b/trackersserviceeos/src/main/java/foundation/e/advancedprivacy/trackers/service/TrackersSupervisorEos.kt new file mode 100644 index 0000000..4580389 --- /dev/null +++ b/trackersserviceeos/src/main/java/foundation/e/advancedprivacy/trackers/service/TrackersSupervisorEos.kt @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.trackers.service + +import android.content.Context +import android.content.Intent +import foundation.e.advancedprivacy.domain.entities.FeatureState +import foundation.e.advancedprivacy.domain.usecases.VpnSupervisorUseCase +import foundation.e.advancedprivacy.trackers.domain.externalinterfaces.TrackersSupervisor +import foundation.e.advancedprivacy.trackers.service.TrackersService.Companion.ACTION_START +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.isActive +import org.koin.core.module.dsl.bind +import org.koin.core.module.dsl.factoryOf +import org.koin.core.module.dsl.singleOf +import org.koin.core.qualifier.named +import org.koin.dsl.module + +class TrackersSupervisorEos(private val context: Context) : TrackersSupervisor { + + override val state: StateFlow = MutableStateFlow(FeatureState.ON) + + override fun start(): Boolean { + val intent = Intent(context, TrackersService::class.java) + intent.action = ACTION_START + return context.startService(intent) != null + } + + override fun stop(): Boolean { + return context.stopService(Intent(context, TrackersService::class.java)) + } + + override fun isRunning(): Boolean { + return TrackersService.coroutineScope.isActive + } + + override val dnsFilterForIpScrambling = null +} + +val trackerServiceModule = module { + factoryOf(::DNSBlocker) + singleOf(::TrackersSupervisorEos) { + bind() + } + single { + VpnSupervisorUseCaseEos( + localStateRepository = get(), + orbotSupervisor = get(), + trackersSupervisor = get(), + appDesc = get(named("AdvancedPrivacy")), + permissionsPrivacyModule = get(), + scope = get() + ) + } +} diff --git a/trackersserviceeos/src/main/java/foundation/e/advancedprivacy/trackers/service/VpnSupervisorUseCaseEos.kt b/trackersserviceeos/src/main/java/foundation/e/advancedprivacy/trackers/service/VpnSupervisorUseCaseEos.kt new file mode 100644 index 0000000..afbf90f --- /dev/null +++ b/trackersserviceeos/src/main/java/foundation/e/advancedprivacy/trackers/service/VpnSupervisorUseCaseEos.kt @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2024 E FOUNDATION + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.trackers.service + +import foundation.e.advancedprivacy.domain.entities.ApplicationDescription +import foundation.e.advancedprivacy.domain.entities.FeatureState +import foundation.e.advancedprivacy.domain.entities.MainFeatures +import foundation.e.advancedprivacy.domain.entities.MainFeatures.IpScrambling +import foundation.e.advancedprivacy.domain.entities.MainFeatures.TrackersControl +import foundation.e.advancedprivacy.domain.repositories.LocalStateRepository +import foundation.e.advancedprivacy.domain.usecases.VpnSupervisorUseCase +import foundation.e.advancedprivacy.externalinterfaces.permissions.IPermissionsPrivacyModule +import foundation.e.advancedprivacy.ipscrambler.OrbotSupervisor +import foundation.e.advancedprivacy.trackers.domain.externalinterfaces.TrackersSupervisor +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.drop +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.launch + +class VpnSupervisorUseCaseEos( + private val localStateRepository: LocalStateRepository, + private val orbotSupervisor: OrbotSupervisor, + private val trackersSupervisor: TrackersSupervisor, + private val appDesc: ApplicationDescription, + private val permissionsPrivacyModule: IPermissionsPrivacyModule, + private val scope: CoroutineScope +) : VpnSupervisorUseCase { + + override fun listenSettings() { + trackersSupervisor.start() + + scope.launch(Dispatchers.IO) { + localStateRepository.ipScramblingEnabled.collect { + applySettings(it) + } + } + + scope.launch(Dispatchers.IO) { + localStateRepository.blockTrackers.drop(1).filter { it }.collect { + localStateRepository.emitStartVpnDisclaimer(TrackersControl()) + } + } + } + + private suspend fun applySettings(isIpScramblingEnabled: Boolean) { + val currentMode = localStateRepository.internetPrivacyMode.value + when { + ( + isIpScramblingEnabled && + currentMode in setOf(FeatureState.OFF, FeatureState.STOPPING) + ) -> { + applyStartIpScrambling() + } + ( + !isIpScramblingEnabled && + currentMode in setOf(FeatureState.ON, FeatureState.STARTING) + ) -> { + orbotSupervisor.stop() + } + else -> {} + } + } + + private suspend fun applyStartIpScrambling() { + if (orbotSupervisor.prepareAndroidVpn() != null) { + permissionsPrivacyModule.setVpnPackageAuthorization(appDesc.packageName) + val alwaysOnVpnPackage = permissionsPrivacyModule.getAlwaysOnVpnPackage() + if (alwaysOnVpnPackage != null) { + localStateRepository.emitOtherVpnRunning( + permissionsPrivacyModule.getApplicationDescription( + packageName = alwaysOnVpnPackage, + withIcon = false + ) + ) + localStateRepository.toggleIpScrambling(enabled = false) + return + } + } + + localStateRepository.emitStartVpnDisclaimer(IpScrambling()) + startVpnService(IpScrambling()) + } + + override fun startVpnService(feature: MainFeatures) { + localStateRepository.internetPrivacyMode.value = FeatureState.STARTING + orbotSupervisor.setDNSFilter(null) + orbotSupervisor.start() + } + + override suspend fun cancelStartVpnService(feature: MainFeatures) { + localStateRepository.toggleIpScrambling(enabled = false) + } +} diff --git a/trackersservicestandalone/.gitignore b/trackersservicestandalone/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/trackersservicestandalone/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/trackersservicestandalone/build.gradle b/trackersservicestandalone/build.gradle new file mode 100644 index 0000000..6e6e018 --- /dev/null +++ b/trackersservicestandalone/build.gradle @@ -0,0 +1,42 @@ +plugins { + id 'com.android.library' + id 'org.jetbrains.kotlin.android' +} + +android { + compileSdkVersion buildConfig.compileSdk + + defaultConfig { + minSdkVersion buildConfig.minSdk + targetSdkVersion buildConfig.targetSdk + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + kotlinOptions { + jvmTarget = '17' + } + namespace 'foundation.e.advancedprivacy.trackers.service' +} + +dependencies { + implementation project(":core") + implementation project(":trackers") + implementation project(":ipscrambling") + + implementation( + libs.androidx.core.ktx, + libs.bundles.koin, + libs.bundles.pcap4j, + libs.kotlinx.coroutines, + libs.timber, + ) +} diff --git a/trackersservicestandalone/consumer-rules.pro b/trackersservicestandalone/consumer-rules.pro new file mode 100644 index 0000000..e69de29 diff --git a/trackersservicestandalone/proguard-rules.pro b/trackersservicestandalone/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/trackersservicestandalone/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/trackersservicestandalone/src/main/AndroidManifest.xml b/trackersservicestandalone/src/main/AndroidManifest.xml new file mode 100644 index 0000000..54327c2 --- /dev/null +++ b/trackersservicestandalone/src/main/AndroidManifest.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/Config.kt b/trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/Config.kt new file mode 100644 index 0000000..9420e0e --- /dev/null +++ b/trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/Config.kt @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.trackers.service + +internal object Config { + const val SESSION_NAME = "TrackersService" + + const val FALLBACK_DNS = "1.1.1.1" + const val VERBOSE = true + + const val VIRTUALDNS_IPV4 = "10.10.10.10" + const val VIRTUALDNS_IPV6 = "fdc8:1095:91e1:aaaa:aaaa:aaaa:aaaa:aaa1" + const val ADDRESS_IPV4 = "10.0.2.15" + const val ADDRESS_IPV6 = "fdc8:1095:91e1:aaaa:aaaa:aaaa:aaaa:aaa2" + + const val BLOCKED_IPV4 = "127.0.0.1" + const val BLOCKED_IPV6 = "::1" + + const val MTU = 3000 + const val LOCAL_RESOLVER_TTL = 60 + + const val MAX_RESOLVER_COUNT = 100 + + val DNS_SERVER_TO_CATCH_IPV4 = listOf( + "8.8.8.8", + "8.8.4.4", + "1.1.1.1" + ) + val DNS_SERVER_TO_CATCH_IPV6 = listOf( + "2001:4860:4860::8888", + "2001:4860:4860::8844" + ) +} diff --git a/trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/TrackersService.kt b/trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/TrackersService.kt new file mode 100644 index 0000000..152a3e9 --- /dev/null +++ b/trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/TrackersService.kt @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.trackers.service + +import android.content.Intent +import android.net.VpnService +import android.os.Build +import android.os.ParcelFileDescriptor +import foundation.e.advancedprivacy.core.utils.notificationBuilder +import foundation.e.advancedprivacy.domain.entities.FeatureState +import foundation.e.advancedprivacy.domain.entities.NOTIFICATION_TRACKER_FLAG +import foundation.e.advancedprivacy.domain.entities.NotificationContent +import foundation.e.advancedprivacy.trackers.domain.externalinterfaces.TrackersSupervisor +import foundation.e.advancedprivacy.trackers.service.Config.DNS_SERVER_TO_CATCH_IPV4 +import foundation.e.advancedprivacy.trackers.service.Config.DNS_SERVER_TO_CATCH_IPV6 +import foundation.e.advancedprivacy.trackers.service.Config.SESSION_NAME +import foundation.e.advancedprivacy.trackers.service.data.NetworkDNSAddressRepository +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import org.koin.core.qualifier.named +import org.koin.java.KoinJavaComponent.get +import timber.log.Timber + +class TrackersService : VpnService() { + companion object { + var coroutineScope = CoroutineScope(Dispatchers.IO) + } + + private val networkDNSAddressRepository: NetworkDNSAddressRepository = get(NetworkDNSAddressRepository::class.java) + private val trackersSupervisor: TrackersSupervisorStandalone = get( + TrackersSupervisor::class.java + ) as TrackersSupervisorStandalone + + private val notificationTrackerFlag: NotificationContent = get(NotificationContent::class.java, named("notificationTrackerFlag")) + + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + startVPN() + + startForeground( + NOTIFICATION_TRACKER_FLAG, + notificationBuilder( + context = this, + content = notificationTrackerFlag + ).build() + ) + trackersSupervisor.mutableState.value = FeatureState.ON + + return START_STICKY + } + + override fun onDestroy() { + networkDNSAddressRepository.stop() + trackersSupervisor.mutableState.value = FeatureState.OFF + super.onDestroy() + } + + private fun startVPN() { + val vpnInterface = initVPN() + + if (vpnInterface != null) { + networkDNSAddressRepository.start() + + coroutineScope = CoroutineScope(Dispatchers.IO) + get(TunLooper::class.java).apply { + listenJob(vpnInterface, coroutineScope) + } + } else { + Timber.e("Cannot get VPN interface") + } + } + + private fun initVPN(): ParcelFileDescriptor? { + val builder = Builder() + builder.setSession(SESSION_NAME) + // IPV4: + builder + .addAddress(Config.ADDRESS_IPV4, 24) + .addDnsServer(Config.VIRTUALDNS_IPV4) + .addRoute(Config.VIRTUALDNS_IPV4, 32) + + // IPV6 + builder + .addAddress(Config.ADDRESS_IPV6, 48) + .addDnsServer(Config.VIRTUALDNS_IPV6) + .addRoute(Config.VIRTUALDNS_IPV6, 128) + + DNS_SERVER_TO_CATCH_IPV4.forEach { + builder.addRoute(it, 32) + } + DNS_SERVER_TO_CATCH_IPV6.forEach { + builder.addRoute(it, 128) + } + + // TODO: block private DNS. + // TODO 20230821: seen in privateDNSFilter, bypass filter for google apps on Android 7/8 + + builder.addDisallowedApplication(packageName) + builder.setBlocking(true) + builder.setMtu(Config.MTU) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + builder.setMetered(false) // take over defaults from underlying network + } + + return builder.establish() + } +} diff --git a/trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/TrackersSupervisorStandalone.kt b/trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/TrackersSupervisorStandalone.kt new file mode 100644 index 0000000..6b7dc0c --- /dev/null +++ b/trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/TrackersSupervisorStandalone.kt @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.trackers.service + +import android.content.Context +import android.content.Intent +import foundation.e.advancedprivacy.domain.entities.FeatureState +import foundation.e.advancedprivacy.domain.usecases.VpnSupervisorUseCase +import foundation.e.advancedprivacy.trackers.domain.externalinterfaces.TrackersSupervisor +import foundation.e.advancedprivacy.trackers.service.data.NetworkDNSAddressRepository +import foundation.e.advancedprivacy.trackers.service.data.RequestDNSRepository +import foundation.e.advancedprivacy.trackers.service.usecases.ResolveDNSUseCase +import foundation.e.advancedprivacy.trackers.service.usecases.VpnSupervisorUseCaseStandalone +import java.util.function.Function +import kotlinx.coroutines.cancel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import org.koin.core.module.dsl.bind +import org.koin.core.module.dsl.singleOf +import org.koin.dsl.module +import org.pcap4j.packet.DnsPacket + +class TrackersSupervisorStandalone( + private val context: Context, + private val resolveDNSUseCase: ResolveDNSUseCase +) : TrackersSupervisor { + internal val mutableState: MutableStateFlow = MutableStateFlow(FeatureState.OFF) + override val state: StateFlow = mutableState + + override fun start(): Boolean { + return if (!isRunning()) { + mutableState.value = FeatureState.STARTING + val intent = Intent(context, TrackersService::class.java) + context.startService(intent) + true + } else { + false + } + } + + override fun stop(): Boolean { + return when (mutableState.value) { + FeatureState.ON -> { + mutableState.value = FeatureState.STOPPING + kotlin.runCatching { TrackersService.coroutineScope.cancel() } + context.stopService(Intent(context, TrackersService::class.java)) + true + } + else -> false + } + } + + override fun isRunning(): Boolean { + return state.value != FeatureState.OFF + } + + override val dnsFilterForIpScrambling = Function { dnsRequest -> resolveDNSUseCase.shouldBlock(dnsRequest) } +} + +val trackerServiceModule = module { + singleOf(::NetworkDNSAddressRepository) + singleOf(::RequestDNSRepository) + singleOf(::ResolveDNSUseCase) + singleOf(::TunLooper) + singleOf(::TrackersSupervisorStandalone) { bind() } + singleOf(::VpnSupervisorUseCaseStandalone) { bind() } +} diff --git a/trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/TunLooper.kt b/trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/TunLooper.kt new file mode 100644 index 0000000..97bef83 --- /dev/null +++ b/trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/TunLooper.kt @@ -0,0 +1,167 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.trackers.service + +import android.os.ParcelFileDescriptor +import foundation.e.advancedprivacy.trackers.service.usecases.ResolveDNSUseCase +import java.io.DataOutputStream +import java.io.FileInputStream +import java.io.FileOutputStream +import java.io.IOException +import java.net.Inet6Address +import java.util.Arrays +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.isActive +import kotlinx.coroutines.launch +import org.pcap4j.packet.DnsPacket +import org.pcap4j.packet.IpPacket +import org.pcap4j.packet.IpSelector +import org.pcap4j.packet.IpV4Packet +import org.pcap4j.packet.IpV6Packet +import org.pcap4j.packet.UdpPacket +import org.pcap4j.packet.namednumber.IpNumber +import org.pcap4j.packet.namednumber.UdpPort +import timber.log.Timber + +class TunLooper( + private val resolveDNSUseCase: ResolveDNSUseCase +) { + private var vpnInterface: ParcelFileDescriptor? = null + private var fileInputStream: FileInputStream? = null + private var dataOutputStream: DataOutputStream? = null + + private fun closeStreams() { + fileInputStream?.close() + fileInputStream = null + + dataOutputStream?.close() + dataOutputStream = null + + vpnInterface?.close() + vpnInterface = null + } + + fun listenJob(vpnInterface: ParcelFileDescriptor, scope: CoroutineScope): Job = scope.launch(Dispatchers.IO) { + this@TunLooper.vpnInterface = vpnInterface + val fis = FileInputStream(vpnInterface.fileDescriptor) + this@TunLooper.fileInputStream = fis + dataOutputStream = DataOutputStream(FileOutputStream(vpnInterface.fileDescriptor)) + + while (isActive) { + runCatching { + val buffer = ByteArray(Config.MTU) + val pLen = fis.read(buffer) + + if (pLen > 0) { + scope.launch { handleIpPacket(buffer, pLen) } + } + }.onFailure { + if (it is CancellationException) { + closeStreams() + throw it + } else { + Timber.w(it, "while reading from VPN fd") + } + } + } + closeStreams() + } + + private suspend fun handleIpPacket(buffer: ByteArray, pLen: Int) { + val pdata = Arrays.copyOf(buffer, pLen) + try { + val packet = IpSelector.newPacket(pdata, 0, pdata.size) + if (packet is IpPacket) { + val ipPacket = packet + if (isPacketDNS(ipPacket)) { + handleDnsPacket(ipPacket) + } + } + } catch (e: Exception) { + Timber.w(e, "Can't parse packet, ignore it.") + } + } + + private fun isPacketDNS(p: IpPacket): Boolean { + if (p.header.protocol === IpNumber.UDP) { + val up = p.payload as UdpPacket + return up.header.dstPort === UdpPort.DOMAIN + } + return false + } + + private suspend fun handleDnsPacket(ipPacket: IpPacket) { + try { + val udpPacket = ipPacket.payload as UdpPacket + val dnsRequest = udpPacket.payload as DnsPacket + val dnsResponse = resolveDNSUseCase.processDNS(dnsRequest) + + if (dnsResponse != null) { + val dnsBuilder = dnsResponse.builder + + val udpBuilder = UdpPacket.Builder(udpPacket) + .srcPort(udpPacket.header.dstPort) + .dstPort(udpPacket.header.srcPort) + .srcAddr(ipPacket.getHeader().getDstAddr()) + .dstAddr(ipPacket.getHeader().getSrcAddr()) + .correctChecksumAtBuild(true) + .correctLengthAtBuild(true) + .payloadBuilder(dnsBuilder) + + val respPacket: IpPacket? = if (ipPacket is IpV4Packet) { + val ipV4Packet = ipPacket + val ipv4Builder = IpV4Packet.Builder() + ipv4Builder + .version(ipV4Packet.header.version) + .protocol(ipV4Packet.header.protocol) + .tos(ipV4Packet.header.tos) + .srcAddr(ipV4Packet.header.dstAddr) + .dstAddr(ipV4Packet.header.srcAddr) + .correctChecksumAtBuild(true) + .correctLengthAtBuild(true) + .dontFragmentFlag(ipV4Packet.header.dontFragmentFlag) + .reservedFlag(ipV4Packet.header.reservedFlag) + .moreFragmentFlag(ipV4Packet.header.moreFragmentFlag) + .ttl(Integer.valueOf(64).toByte()) + .payloadBuilder(udpBuilder) + ipv4Builder.build() + } else if (ipPacket is IpV6Packet) { + IpV6Packet.Builder(ipPacket as IpV6Packet?) + .srcAddr(ipPacket.getHeader().getDstAddr() as Inet6Address) + .dstAddr(ipPacket.getHeader().getSrcAddr() as Inet6Address) + .payloadBuilder(udpBuilder) + .build() + } else { + null + } + + respPacket?.let { + try { + dataOutputStream?.write(it.rawData) + } catch (e: IOException) { + Timber.e(e, "error writing to VPN fd") + } + } + } + } catch (ioe: java.lang.Exception) { + Timber.e(ioe, "could not parse DNS packet") + } + } +} diff --git a/trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/data/NetworkDNSAddressRepository.kt b/trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/data/NetworkDNSAddressRepository.kt new file mode 100644 index 0000000..7c36ed2 --- /dev/null +++ b/trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/data/NetworkDNSAddressRepository.kt @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.trackers.service.data + +import android.content.Context +import android.net.ConnectivityManager +import android.net.Network +import android.net.NetworkRequest +import foundation.e.advancedprivacy.trackers.service.Config +import java.net.InetAddress + +class NetworkDNSAddressRepository(private val context: Context) { + private val connectivityManager: ConnectivityManager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + + fun start() { + connectivityManager.registerNetworkCallback( + NetworkRequest.Builder().build(), + networkCallback + ) + } + + fun stop() { + kotlin.runCatching { + connectivityManager.unregisterNetworkCallback(networkCallback) + } + } + + var dnsAddress: InetAddress = InetAddress.getByName(Config.FALLBACK_DNS) + private set + + private val networkCallback = object : ConnectivityManager.NetworkCallback() { + override fun onAvailable(network: Network) { + super.onAvailable(network) + connectivityManager.getLinkProperties(network) + ?.dnsServers?.firstOrNull { + it.hostAddress.let { + it != Config.VIRTUALDNS_IPV4 && it != Config.VIRTUALDNS_IPV6 + } + }?.let { + dnsAddress = InetAddress.getByName(it.hostAddress) + } + } + } +} diff --git a/trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/data/RequestDNSRepository.kt b/trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/data/RequestDNSRepository.kt new file mode 100644 index 0000000..05fff3c --- /dev/null +++ b/trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/data/RequestDNSRepository.kt @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.trackers.service.data + +import foundation.e.advancedprivacy.core.utils.runSuspendCatching +import java.net.DatagramPacket +import java.net.DatagramSocket +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import org.pcap4j.packet.DnsPacket +import timber.log.Timber + +class RequestDNSRepository { + + suspend fun processDNS(request: DatagramPacket): DnsPacket? = withContext(Dispatchers.IO) { + runSuspendCatching { + var response: DnsPacket? = null + val datagramSocket = DatagramSocket() + datagramSocket.send(request) + + // Await response from DNS server + val buf = ByteArray(1024) + val packet = DatagramPacket(buf, buf.size) + datagramSocket.receive(packet) + val dnsResp = packet.data + if (dnsResp != null) { + response = DnsPacket.newPacket(dnsResp, 0, dnsResp.size) + } + response + }.onFailure { + Timber.w(it, "Can't make DNS request.") + }.getOrNull() + } +} diff --git a/trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/usecases/ResolveDNSUseCase.kt b/trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/usecases/ResolveDNSUseCase.kt new file mode 100644 index 0000000..c0938e0 --- /dev/null +++ b/trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/usecases/ResolveDNSUseCase.kt @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.trackers.service.usecases + +import foundation.e.advancedprivacy.core.utils.runSuspendCatching +import foundation.e.advancedprivacy.trackers.domain.usecases.FilterHostnameUseCase +import foundation.e.advancedprivacy.trackers.service.data.NetworkDNSAddressRepository +import foundation.e.advancedprivacy.trackers.service.data.RequestDNSRepository +import java.net.DatagramPacket +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.DelicateCoroutinesApi +import kotlinx.coroutines.GlobalScope +import org.pcap4j.packet.DnsPacket +import org.pcap4j.packet.namednumber.DnsRCode +import timber.log.Timber + +@OptIn(DelicateCoroutinesApi::class) +class ResolveDNSUseCase( + private val networkDNSAddressRepository: NetworkDNSAddressRepository, + private val filterHostnameUseCase: FilterHostnameUseCase, + private val requestDNSRepository: RequestDNSRepository, + private val scope: CoroutineScope = GlobalScope +) { + private val DNS_PORT = 53 + + init { + filterHostnameUseCase.writeLogJob(scope) + } + + fun shouldBlock(dnsRequest: DnsPacket?): DnsPacket? { + if (dnsRequest == null) return null + + return runSuspendCatching { + val host = dnsRequest.header.questions[0].qName.name + if (filterHostnameUseCase.shouldBlock(host)) { + dnsRequest.builder + .rCode(DnsRCode.NX_DOMAIN) + .response(true).build() + } else { + null + } + }.onFailure { + Timber.e(it, "Can't find host") + }.getOrNull() + } + + suspend fun processDNS(dnsRequest: DnsPacket): DnsPacket? { + val blockedDnsResponse = shouldBlock(dnsRequest) + + if (blockedDnsResponse != null) { + return blockedDnsResponse + } + + val payload = dnsRequest.rawData + val packet = DatagramPacket( + payload, + payload.size, + networkDNSAddressRepository.dnsAddress, + DNS_PORT + ) + return requestDNSRepository.processDNS(packet) + } +} diff --git a/trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/usecases/VpnSupervisorUseCaseStandalone.kt b/trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/usecases/VpnSupervisorUseCaseStandalone.kt new file mode 100644 index 0000000..3f86604 --- /dev/null +++ b/trackersservicestandalone/src/main/java/foundation/e/advancedprivacy/trackers/service/usecases/VpnSupervisorUseCaseStandalone.kt @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2024 E FOUNDATION + * Copyright (C) 2023 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package foundation.e.advancedprivacy.trackers.service.usecases + +import foundation.e.advancedprivacy.domain.entities.FeatureState +import foundation.e.advancedprivacy.domain.entities.MainFeatures +import foundation.e.advancedprivacy.domain.entities.MainFeatures.IpScrambling +import foundation.e.advancedprivacy.domain.entities.MainFeatures.TrackersControl +import foundation.e.advancedprivacy.domain.repositories.LocalStateRepository +import foundation.e.advancedprivacy.domain.usecases.VpnSupervisorUseCase +import foundation.e.advancedprivacy.externalinterfaces.servicesupervisors.FeatureSupervisor +import foundation.e.advancedprivacy.ipscrambler.OrbotSupervisor +import foundation.e.advancedprivacy.trackers.domain.externalinterfaces.TrackersSupervisor +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.launch + +class VpnSupervisorUseCaseStandalone( + private val localStateRepository: LocalStateRepository, + private val trackersSupervisor: TrackersSupervisor, + private val orbotSupervisor: OrbotSupervisor, + private val scope: CoroutineScope +) : VpnSupervisorUseCase { + private var applySettingJob: Job? = null + + init { + listenSettings() + } + + override fun listenSettings() { + var previousBlockTrackers: Boolean? = null + + localStateRepository.blockTrackers.combine( + localStateRepository.ipScramblingEnabled + ) { blockTrackers, hideIp -> + applySettingJob?.cancel() + applySettingJob = scope.launch { + when { + blockTrackers && !hideIp -> + launchVpnService(trackersSupervisor) + + !blockTrackers && !hideIp -> + stopAllServices() + + else -> { + if (blockTrackers && previousBlockTrackers != true) { + localStateRepository.emitStartVpnDisclaimer(IpScrambling()) + } + + launchVpnService(orbotSupervisor) + } + } + + previousBlockTrackers = blockTrackers + } + }.launchIn(scope) + } + + private fun stopAllServices() { + listOf(orbotSupervisor, trackersSupervisor).map { stopVpnService(it) } + } + + private fun stopVpnService(supervisor: FeatureSupervisor): FeatureSupervisor { + when (supervisor.state.value) { + FeatureState.ON, + FeatureState.STARTING -> + supervisor.stop() + + else -> {} + } + return supervisor + } + + private suspend fun launchVpnService(supervisor: FeatureSupervisor) { + stopVpnService(otherSupervisor(supervisor)).let { otherSupervisor -> + otherSupervisor.state.first { it == FeatureState.OFF } + } + + when (supervisor.state.value) { + FeatureState.STOPPING -> { + supervisor.state.first { it == FeatureState.OFF } + initiateStartVpnService(supervisor) + } + + FeatureState.OFF -> initiateStartVpnService(supervisor) + else -> {} + } + } + + private fun otherSupervisor(supervisor: FeatureSupervisor): FeatureSupervisor { + return when (supervisor) { + trackersSupervisor -> orbotSupervisor + else -> trackersSupervisor + } + } + + private fun getSupervisor(feature: MainFeatures): FeatureSupervisor { + return when (feature) { + is TrackersControl -> trackersSupervisor + else -> orbotSupervisor + } + } + + private suspend fun initiateStartVpnService(supervisor: FeatureSupervisor) { + val authorizeVpnIntent = orbotSupervisor.prepareAndroidVpn() + val feature = when (supervisor) { + trackersSupervisor -> TrackersControl(authorizeVpnIntent) + else -> IpScrambling(authorizeVpnIntent) + } + + if (authorizeVpnIntent == null) { + localStateRepository.emitStartVpnDisclaimer(feature) + startVpnService(feature) + } else { + localStateRepository.emitStartVpnDisclaimer(feature) + } + } + + override fun startVpnService(feature: MainFeatures) { + if (feature is IpScrambling) { + localStateRepository.internetPrivacyMode.value = FeatureState.STARTING + orbotSupervisor.setDNSFilter(trackersSupervisor.dnsFilterForIpScrambling) + } + + getSupervisor(feature).start() + } + + override suspend fun cancelStartVpnService(feature: MainFeatures) { + when (feature) { + is IpScrambling -> + localStateRepository.toggleIpScrambling(enabled = false) + is TrackersControl -> + trackersSupervisor.stop() + else -> {} + } + } +}