Google Analytics - Version 2.5.5

Version Description

  • Add code improvements.
  • Improve sanitization and localization.
  • Test with WordPress 6.0.
  • Test with PHP 8.0.
  • Fix privacy policy link.
Download this release

Release Info

Developer ShareThis
Plugin Icon wp plugin Google Analytics
Version 2.5.5
Comparing to
See all releases

Code changes from version 2.5.4 to 2.5.5

Files changed (91) hide show
  1. class/Ga_Admin.php +0 -997
  2. class/Ga_Helper.php +0 -743
  3. class/Ga_Notice.php +0 -35
  4. class/Ga_Sharethis.php +0 -101
  5. class/Ga_Stats.php +0 -1047
  6. class/Ga_Template.php +0 -73
  7. class/class-ga-admin.php +1228 -0
  8. class/{Ga_Autoloader.php → class-ga-autoloader.php} +21 -14
  9. class/{Ga_Frontend.php → class-ga-frontend.php} +25 -6
  10. class/class-ga-helper.php +888 -0
  11. class/{Ga_Hook.php → class-ga-hook.php} +9 -2
  12. class/class-ga-notice.php +54 -0
  13. class/class-ga-sharethis.php +146 -0
  14. class/class-ga-stats.php +1083 -0
  15. class/class-ga-template.php +82 -0
  16. class/controller/Ga_Admin_Controller.php +0 -113
  17. class/controller/class-ga-admin-controller.php +139 -0
  18. class/core/Ga_Controller_Core.php +0 -40
  19. class/core/class-ga-controller-core.php +47 -0
  20. class/core/{Ga_View_Core.php → class-ga-view-core.php} +15 -7
  21. css/ga_additional.css +221 -188
  22. css/ga_modal.css +62 -62
  23. css/ga_old_wp_support.css +11 -11
  24. css/googleanalytics.css +326 -328
  25. googleanalytics.php +31 -17
  26. js/googleanalytics.js +25 -23
  27. js/googleanalytics_createprop.js +48 -31
  28. js/googleanalytics_dashboard.js +262 -206
  29. js/googleanalytics_page.js +852 -677
  30. lib/Ga_Lib_Api_Request.php +0 -215
  31. lib/Ga_Lib_Api_Response.php +0 -42
  32. lib/cert/cacerts.pem +0 -4057
  33. lib/class-ga-lib-api-client-exception.php +13 -0
  34. lib/{Ga_Lib_Api_Client.php → class-ga-lib-api-client.php} +34 -15
  35. lib/class-ga-lib-api-request-exception.php +12 -0
  36. lib/class-ga-lib-api-request.php +241 -0
  37. lib/class-ga-lib-api-response.php +113 -0
  38. lib/class-ga-lib-google-api-client-accountsummaries-exception.php +12 -0
  39. lib/class-ga-lib-google-api-client-authcode-exception.php +45 -0
  40. lib/class-ga-lib-google-api-client-data-exception.php +12 -0
  41. lib/class-ga-lib-google-api-client-exception.php +90 -0
  42. lib/class-ga-lib-google-api-client-refreshtoken-exception.php +12 -0
  43. lib/{Ga_Lib_Google_Api_Client.php → class-ga-lib-google-api-client.php} +122 -155
  44. lib/class-ga-lib-sharethis-api-client-alerts-exception.php +12 -0
  45. lib/class-ga-lib-sharethis-api-client-exception.php +22 -0
  46. lib/class-ga-lib-sharethis-api-client-invaliddomain-exception.php +12 -0
  47. lib/class-ga-lib-sharethis-api-client-invite-exception.php +12 -0
  48. lib/class-ga-lib-sharethis-api-client-verify-exception.php +12 -0
  49. lib/{Ga_Lib_Sharethis_Api_Client.php → class-ga-lib-sharethis-api-client.php} +70 -52
  50. overwrite/ga-overwrite.php +19 -0
  51. overwrite/ga_overwrite.php +0 -13
  52. readme.txt +13 -5
  53. screenshot-1.png +0 -0
  54. screenshot-2.png +0 -0
  55. screenshot-3.png +0 -0
  56. screenshot-4.png +0 -0
  57. tools/{Ga_Cache.php → class-ga-cache.php} +73 -62
  58. tools/{class-support-logging.php → class-ga-supportlogger.php} +111 -55
  59. view/ga-accounts-selector.php +47 -0
  60. view/ga-auth-button.php +35 -0
  61. view/{ga_code.php → ga-code.php} +14 -1
  62. view/ga-dashboard-widget.php +110 -0
  63. view/ga-debug-modal.php +50 -0
  64. view/ga-googleanalytics-loader.php +20 -0
  65. view/ga-notice.php +22 -0
  66. view/ga-oauth-notice.php +12 -0
  67. view/ga-wp-notice.php +21 -0
  68. view/ga_accounts_selector.php +0 -26
  69. view/ga_auth_button.php +0 -7
  70. view/ga_dashboard_widget.php +0 -88
  71. view/ga_debug_modal.php +0 -32
  72. view/ga_googleanalytics_loader.php +0 -10
  73. view/ga_notice.php +0 -16
  74. view/ga_oauth_notice.php +0 -3
  75. view/ga_wp_notice.php +0 -9
  76. view/page.php +362 -256
  77. view/statistics.php +76 -13
  78. view/stats.php +223 -129
  79. view/templates/appearance.php +13 -5
  80. view/templates/date-custom-range-filter.php +32 -0
  81. view/templates/date_custom_range_filter.php +0 -26
  82. view/templates/demo-popup.php +11 -3
  83. view/templates/demographic-chart.php +69 -42
  84. view/templates/demographic.php +15 -9
  85. view/templates/exclusions.php +18 -13
  86. view/templates/gdpr-config.php +52 -32
  87. view/templates/gdpr.php +26 -18
  88. view/templates/purposes.php +68 -40
  89. view/templates/sidebar/demo-ad.php +26 -17
  90. view/templates/sidebar/gdpr-ad.php +30 -19
  91. view/trending.php +116 -85
class/Ga_Admin.php DELETED
@@ -1,997 +0,0 @@
1
- <?php
2
-
3
- class Ga_Admin {
4
-
5
- const GA_WEB_PROPERTY_ID_OPTION_NAME = 'googleanalytics_web_property_id';
6
- const GA_EXCLUDE_ROLES_OPTION_NAME = 'googleanalytics_exclude_roles';
7
- const GA_SHARETHIS_TERMS_OPTION_NAME = 'googleanalytics_sharethis_terms';
8
- const GA_HIDE_TERMS_OPTION_NAME = 'googleanalytics_hide_terms';
9
- const GA_VERSION_OPTION_NAME = 'googleanalytics_version';
10
- const GA_SELECTED_ACCOUNT = 'googleanalytics_selected_account';
11
- const GA_OAUTH_AUTH_CODE_OPTION_NAME = 'googleanalytics_oauth_auth_code';
12
- const GA_OAUTH_AUTH_TOKEN_OPTION_NAME = 'googleanalytics_oauth_auth_token';
13
- const GA_ACCOUNT_DATA_OPTION_NAME = 'googleanalytics_account_data';
14
- const GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME = 'googleanalytics_web_property_id_manually';
15
- const GA_WEB_PROPERTY_ID_MANUALLY_VALUE_OPTION_NAME = 'googleanalytics_web_property_id_manually_value';
16
- const GA_SHARETHIS_PROPERTY_ID = 'googleanalytics_sherethis_property_id';
17
- const GA_SHARETHIS_PROPERTY_SECRET = 'googleanalytics_sherethis_property_secret';
18
- const GA_SHARETHIS_VERIFICATION_RESULT = 'googleanalytics_sherethis_verification_result';
19
- const MIN_WP_VERSION = '3.8';
20
- const GA_SHARETHIS_API_ALIAS = 'sharethis';
21
- const GA_DISABLE_ALL_FEATURES = 'googleanalytics_disable_all_features';
22
- const GA_HEARTBEAT_API_CACHE_UPDATE = false;
23
- const NOTICE_SUCCESS = 'success';
24
- const NOTICE_WARNING = 'warning';
25
- const NOTICE_ERROR = 'error';
26
-
27
- /**
28
- * Instantiate API client.
29
- *
30
- * @return Ga_Lib_Google_Api_Client|null
31
- */
32
- public static function api_client( $type = '' ) {
33
- if ( self::GA_SHARETHIS_API_ALIAS === $type ) {
34
- $instance = Ga_Lib_Sharethis_Api_Client::get_instance();
35
- } else {
36
- $instance = Ga_Lib_Google_Api_Client::get_instance();
37
- $token = Ga_Helper::get_option( self::GA_OAUTH_AUTH_TOKEN_OPTION_NAME );
38
- try {
39
- if ( ! empty( $token ) ) {
40
- $token = json_decode( $token, true );
41
- $instance->set_access_token( $token );
42
- }
43
- } catch ( Exception $e ) {
44
- Ga_Helper::ga_oauth_notice( $e->getMessage() );
45
- }
46
- }
47
-
48
- return $instance;
49
- }
50
-
51
- /**
52
- * Initializes plugin's options during plugin activation process.
53
- */
54
- public static function activate_googleanalytics() {
55
- add_option( self::GA_WEB_PROPERTY_ID_OPTION_NAME, Ga_Helper::GA_DEFAULT_WEB_ID );
56
- add_option( self::GA_EXCLUDE_ROLES_OPTION_NAME, wp_json_encode( array() ) );
57
- add_option( self::GA_VERSION_OPTION_NAME );
58
- add_option( self::GA_OAUTH_AUTH_CODE_OPTION_NAME );
59
- add_option( self::GA_OAUTH_AUTH_TOKEN_OPTION_NAME );
60
- add_option( self::GA_ACCOUNT_DATA_OPTION_NAME );
61
- add_option( self::GA_SELECTED_ACCOUNT );
62
- add_option( self::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME );
63
- add_option( self::GA_WEB_PROPERTY_ID_MANUALLY_VALUE_OPTION_NAME );
64
- add_option( self::GA_DISABLE_ALL_FEATURES );
65
- Ga_Cache::add_cache_options();
66
- }
67
-
68
- /**
69
- * Deletes plugin's options during plugin activation process.
70
- */
71
- public static function deactivate_googleanalytics() {
72
- delete_option( self::GA_WEB_PROPERTY_ID_OPTION_NAME );
73
- delete_option( self::GA_EXCLUDE_ROLES_OPTION_NAME );
74
- delete_option( self::GA_OAUTH_AUTH_CODE_OPTION_NAME );
75
- delete_option( self::GA_OAUTH_AUTH_TOKEN_OPTION_NAME );
76
- delete_option( self::GA_ACCOUNT_DATA_OPTION_NAME );
77
- delete_option( self::GA_SELECTED_ACCOUNT );
78
- delete_option( self::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME );
79
- delete_option( self::GA_WEB_PROPERTY_ID_MANUALLY_VALUE_OPTION_NAME );
80
- delete_option( self::GA_DISABLE_ALL_FEATURES );
81
- delete_option( Ga_SupportLogger::LOG_OPTION );
82
- delete_option('googleanalytics_gdpr_config');
83
- delete_option('googleanalytics_demographic');
84
- delete_option('googleanalytics_demo_data');
85
- delete_option('googleanalytics_demo_date');
86
- delete_option('googleanalytics_send_data');
87
- delete_option('googleanalytics_hide_terms');
88
- delete_option('googleanalytics_sharethis_terms');
89
- delete_option('googleanalytics_sherethis_property_id');
90
- delete_option('googleanalytics_sherethis_property_secret');
91
- delete_option(self::GA_SHARETHIS_TERMS_OPTION_NAME );
92
- Ga_Cache::delete_cache_options();
93
- }
94
-
95
- /**
96
- * Deletes plugin's options during plugin uninstallation process.
97
- */
98
- public static function uninstall_googleanalytics() {
99
- delete_option( self::GA_SHARETHIS_TERMS_OPTION_NAME );
100
- delete_option( self::GA_HIDE_TERMS_OPTION_NAME );
101
- delete_option( self::GA_VERSION_OPTION_NAME );
102
- delete_option( self::GA_SHARETHIS_PROPERTY_ID );
103
- delete_option( self::GA_SHARETHIS_PROPERTY_SECRET );
104
- delete_option( self::GA_SHARETHIS_VERIFICATION_RESULT );
105
- }
106
-
107
- /**
108
- * Do actions during plugin load.
109
- */
110
- public static function loaded_googleanalytics() {
111
- self::update_googleanalytics();
112
- }
113
-
114
- /**
115
- * Update hook fires when plugin is being loaded.
116
- */
117
- public static function update_googleanalytics() {
118
- $version = get_option( self::GA_VERSION_OPTION_NAME );
119
- $installed_version = get_option( self::GA_VERSION_OPTION_NAME, '2.4.0' );
120
- $old_property_value = Ga_Helper::get_option( 'web_property_id' );
121
-
122
- if ( version_compare( $installed_version, GOOGLEANALYTICS_VERSION, 'eq' ) ) {
123
- return;
124
- }
125
-
126
- if ( version_compare( $installed_version, GOOGLEANALYTICS_VERSION, 'lt' ) ) {
127
-
128
- if ( ! empty( $old_property_value ) ) {
129
- Ga_Helper::update_option( self::GA_WEB_PROPERTY_ID_MANUALLY_VALUE_OPTION_NAME, $old_property_value );
130
- Ga_Helper::update_option( self::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME, 1 );
131
- delete_option( 'web_property_id' );
132
- }
133
- }
134
-
135
- update_option( self::GA_VERSION_OPTION_NAME, GOOGLEANALYTICS_VERSION );
136
- }
137
-
138
- public static function preupdate_exclude_roles( $new_value, $old_value ) {
139
- if ( ! Ga_Helper::are_features_enabled() ) {
140
- return '';
141
- }
142
-
143
- return wp_json_encode( $new_value );
144
- }
145
-
146
- /**
147
- * Pre-update hook for preparing JSON structure.
148
- *
149
- * @param $new_value
150
- * @param $old_value
151
- *
152
- * @return mixed
153
- */
154
- public static function preupdate_selected_account( $new_value, $old_value ) {
155
- $data = null;
156
- if ( ! empty( $new_value ) ) {
157
- $data = explode( '_', $new_value );
158
-
159
- if ( ! empty( $data[1] ) ) {
160
- Ga_Helper::update_option( self::GA_WEB_PROPERTY_ID_OPTION_NAME, $data[1] );
161
- }
162
- }
163
-
164
- return wp_json_encode( $data );
165
- }
166
-
167
- public static function preupdate_disable_all_features( $new_value, $old_value ) {
168
- if ( 'on' === $old_value ) {
169
- Ga_Helper::update_option( self::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME, false );
170
- }
171
-
172
- return $new_value;
173
- }
174
-
175
- public static function preupdate_optimize_code( $new_value, $old_value ) {
176
- if ( ! empty( $new_value ) ) {
177
- $new_value = sanitize_text_field( wp_unslash( $new_value ) );
178
- }
179
-
180
- return $new_value;
181
- }
182
-
183
- public static function preupdate_ip_anonymization( $new_value, $old_value ) {
184
- return $new_value;
185
- }
186
-
187
- /**
188
- * Registers plugin's settings.
189
- */
190
- public static function admin_init_googleanalytics() {
191
- register_setting( GA_NAME, self::GA_WEB_PROPERTY_ID_OPTION_NAME );
192
- register_setting( GA_NAME, self::GA_EXCLUDE_ROLES_OPTION_NAME );
193
- register_setting( GA_NAME, self::GA_SELECTED_ACCOUNT );
194
- register_setting( GA_NAME, self::GA_OAUTH_AUTH_CODE_OPTION_NAME );
195
- register_setting( GA_NAME, self::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME );
196
- register_setting( GA_NAME, self::GA_WEB_PROPERTY_ID_MANUALLY_VALUE_OPTION_NAME );
197
- register_setting( GA_NAME, self::GA_DISABLE_ALL_FEATURES );
198
- register_setting( GA_NAME, 'googleanalytics_optimize_code' );
199
- register_setting( GA_NAME, 'googleanalytics_ip_anonymization' );
200
- add_filter( 'pre_update_option_' . self::GA_EXCLUDE_ROLES_OPTION_NAME, 'Ga_Admin::preupdate_exclude_roles', 1, 2 );
201
- add_filter( 'pre_update_option_' . self::GA_SELECTED_ACCOUNT, 'GA_Admin::preupdate_selected_account', 1, 2 );
202
- add_filter( 'pre_update_option_googleanalytics_optimize_code', 'Ga_Admin::preupdate_optimize_code', 1, 2 );
203
- add_filter( 'pre_update_option_googleanalytics_ip_anonymization', 'Ga_Admin::preupdate_ip_anonymization', 1, 2 );
204
- }
205
-
206
- /**
207
- * Builds plugin's menu structure.
208
- */
209
- public static function admin_menu_googleanalytics() {
210
- $gdpr = get_option('googleanalytics_gdpr_config');
211
-
212
- if ( current_user_can( 'manage_options' ) ) {
213
- add_menu_page( 'Google Analytics', 'Google Analytics', 'manage_options', 'googleanalytics', 'Ga_Admin::statistics_page_googleanalytics', 'dashicons-chart-line', 1000 );
214
- add_submenu_page( 'googleanalytics', 'Google Analytics', __( 'Dashboard' ), 'manage_options', 'googleanalytics', 'Ga_Admin::statistics_page_googleanalytics' );
215
- add_submenu_page( 'googleanalytics', 'Google Analytics', __( 'Settings' ), 'manage_options', 'googleanalytics/settings', 'Ga_Admin::options_page_googleanalytics' );
216
-
217
- if (!empty($gdpr)) {
218
- add_submenu_page('googleanalytics', 'Google Analytics', __('GDPR'), 'manage_options',
219
- 'googleanalytics/gdpr', 'Ga_Admin::gdpr_page_googleanalytics');
220
- }
221
- }
222
- }
223
-
224
- /**
225
- * Prepares and displays plugin's stats page.
226
- */
227
- public static function statistics_page_googleanalytics() {
228
-
229
- if ( ! Ga_Helper::is_wp_version_valid() || ! Ga_Helper::is_php_version_valid() ) {
230
- return false;
231
- }
232
-
233
- $data = self::get_stats_page();
234
- Ga_View_Core::load(
235
- 'statistics',
236
- array(
237
- 'data' => $data,
238
- )
239
- );
240
-
241
- if ( Ga_Cache::is_data_cache_outdated( '', Ga_Helper::get_account_id() ) ) {
242
- self::api_client()->add_own_error( '1', __( 'Saved data is shown, it will be refreshed soon' ), 'Ga_Data_Outdated_Exception' );
243
- }
244
-
245
- self::display_api_errors();
246
- }
247
-
248
- /**
249
- * Prepares and displays plugin's settings page.
250
- */
251
- public static function options_page_googleanalytics() {
252
-
253
- if ( ! Ga_Helper::is_wp_version_valid() || ! Ga_Helper::is_php_version_valid() ) {
254
- return false;
255
- }
256
- if ( Ga_Helper::are_features_enabled() && Ga_Helper::is_curl_disabled() ) {
257
- echo wp_kses_post( Ga_Helper::ga_wp_notice( __( 'Looks like cURL is not configured on your server. In order to authenticate your Google Analytics account and display statistics, cURL is required. Please contact your server administrator to enable it, or manually enter your Tracking ID.' ), 'warning' ) );
258
- }
259
- /**
260
- * Keeps data to be extracted as variables in the view.
261
- *
262
- * @var array $data
263
- */
264
- $data = array();
265
-
266
- $data[ self::GA_WEB_PROPERTY_ID_OPTION_NAME ] = get_option( self::GA_WEB_PROPERTY_ID_OPTION_NAME );
267
- $data[ self::GA_WEB_PROPERTY_ID_MANUALLY_VALUE_OPTION_NAME ] = get_option( self::GA_WEB_PROPERTY_ID_MANUALLY_VALUE_OPTION_NAME );
268
- $data[ self::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME ] = get_option( self::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME );
269
- $data[ self::GA_DISABLE_ALL_FEATURES ] = get_option( self::GA_DISABLE_ALL_FEATURES );
270
-
271
- $roles = Ga_Helper::get_user_roles();
272
- $saved = json_decode( get_option( self::GA_EXCLUDE_ROLES_OPTION_NAME ), true );
273
-
274
- $tmp = array();
275
- if ( ! empty( $roles ) ) {
276
- foreach ( $roles as $role ) {
277
- $role_id = Ga_Helper::prepare_role_id( $role );
278
- $tmp[] = array(
279
- 'name' => $role,
280
- 'id' => $role_id,
281
- 'checked' => ( ! empty( $saved[ $role_id ] ) && 'on' === $saved[ $role_id ] ),
282
- );
283
- }
284
- }
285
- $data['roles'] = $tmp;
286
-
287
- if ( Ga_Helper::is_authorized() ) {
288
- $data['ga_accounts_selector'] = self::get_accounts_selector();
289
- $data['auth_button'] = self::get_auth_button( 'reauth' );
290
- } else {
291
- $data['popup_url'] = self::get_auth_popup_url();
292
- $data['auth_button'] = self::get_auth_button( 'auth' );
293
- }
294
- $data['debug_modal'] = self::get_debug_modal();
295
- $data['debug_info'] = Ga_SupportLogger::$debug_info;
296
-
297
- if ( ! empty( $_GET['err'] ) ) { // WPCS: CSRF ok.
298
- switch ( $_GET['err'] ) { // WPCS: CSRF ok.
299
- case 1:
300
- $data['error_message'] = Ga_Helper::ga_oauth_notice( 'There was a problem with Google Oauth2 authentication process. Please verify your site has a valid SSL Certificate in place and is using the HTTPS protocol.' );
301
- break;
302
- case 2:
303
- $data['error_message'] = Ga_Helper::ga_wp_notice( 'Authentication code is incorrect.', 'error', true );
304
- break;
305
- }
306
- }
307
- Ga_View_Core::load(
308
- 'page',
309
- array(
310
- 'data' => $data,
311
- 'tooltip' => Ga_Helper::get_tooltip(),
312
- )
313
- );
314
-
315
- self::display_api_errors();
316
- }
317
-
318
- /**
319
- * Prepares and displays plugin's gdpr page.
320
- */
321
- public static function gdpr_page_googleanalytics() {
322
-
323
- if ( ! Ga_Helper::is_wp_version_valid() || ! Ga_Helper::is_php_version_valid() ) {
324
- return false;
325
- }
326
- if ( Ga_Helper::are_features_enabled() && Ga_Helper::is_curl_disabled() ) {
327
- echo wp_kses_post( Ga_Helper::ga_wp_notice( __( 'Looks like cURL is not configured on your server. In order to authenticate your Google Analytics account and display statistics, cURL is required. Please contact your server administrator to enable it, or manually enter your Tracking ID.' ), 'warning' ) );
328
- }
329
-
330
- $vendor_data = self::getVendors();
331
- $vendors = $vendor_data['vendors'];
332
- $purposes = array_column($vendor_data['purposes'], 'name', 'id');
333
-
334
- include plugin_dir_path(__FILE__) . '../view/templates/gdpr-config.php';
335
- }
336
-
337
- /**
338
- * Prepares and returns a plugin's URL to be opened in a popup window
339
- * during Google authentication process.
340
- *
341
- * @return mixed
342
- */
343
- public static function get_auth_popup_url() {
344
- return admin_url( Ga_Helper::create_url( Ga_Helper::GA_SETTINGS_PAGE_URL, array( Ga_Controller_Core::ACTION_PARAM_NAME => 'ga_action_auth' ) ) );
345
- }
346
-
347
- /**
348
- * Prepares and returns Google Account's dropdown code.
349
- *
350
- * @return string
351
- */
352
- public static function get_accounts_selector() {
353
- $selected = Ga_Helper::get_selected_account_data();
354
- $selector = json_decode( get_option( self::GA_ACCOUNT_DATA_OPTION_NAME ), true );
355
- if ( ! Ga_Helper::is_code_manually_enabled() && empty( $selector ) ) {
356
- echo wp_kses_post( Ga_Helper::ga_wp_notice( "Hi there! It seems like we weren't able to locate a Google Analytics account attached to your email account. Can you please register for Google Analytics and then deactivate and reactivate the plugin?", 'warning' ) );
357
- }
358
-
359
- return Ga_View_Core::load(
360
- 'ga_accounts_selector',
361
- array(
362
- 'selector' => $selector,
363
- 'selected' => $selected ? implode( '_', $selected ) : null,
364
- 'add_manually_enabled' => Ga_Helper::is_code_manually_enabled() || Ga_Helper::is_all_feature_disabled(),
365
- ),
366
- true
367
- );
368
- }
369
-
370
- /**
371
- * Adds JS scripts for the settings page.
372
- */
373
- public static function enqueue_ga_scripts() {
374
- $property_id = get_option( 'googleanalytics_sherethis_property_id', true );
375
- $secret = get_option( 'googleanalytics_sherethis_property_secret', true );
376
- $config = wp_json_encode(get_option('googleanalytics_gdpr_config'));
377
-
378
- wp_register_script(
379
- GA_NAME . '-page-js',
380
- Ga_Helper::get_plugin_url_with_correct_protocol() . '/js/' . GA_NAME . '_page.js',
381
- [ 'jquery' ],
382
- time(),
383
- false
384
- );
385
-
386
- wp_enqueue_script(GA_NAME . '-page-js');
387
- wp_add_inline_script(
388
- GA_NAME . '-page-js',
389
- 'var siteAdminUrl = \'' .
390
- admin_url() .
391
- '\'; var gaGdprConfig = \''.
392
- $config .
393
- '\'; var ga_demo_nonce = "' .
394
- wp_create_nonce('ga_demo_nonce') .
395
- '"; var ga_property_id = "' . $property_id .
396
- '"; var ga_secret_id = "' .
397
- $secret .
398
- '";'
399
- );
400
- }
401
-
402
- /**
403
- * Adds CSS plugin's scripts.
404
- */
405
- public static function enqueue_ga_css() {
406
- wp_register_style( GA_NAME . '-css', Ga_Helper::get_plugin_url_with_correct_protocol() . '/css/' . GA_NAME . '.css', false, time(), 'all' );
407
- wp_register_style( GA_NAME . '-additional-css', Ga_Helper::get_plugin_url_with_correct_protocol() . '/css/ga_additional.css', false, GOOGLEANALYTICS_VERSION, 'all' );
408
- wp_enqueue_style( GA_NAME . '-css');
409
- wp_enqueue_style( GA_NAME . '-additional-css' );
410
- if ( Ga_Helper::is_wp_old() ) {
411
- wp_register_style( GA_NAME . '-old-wp-support-css', Ga_Helper::get_plugin_url_with_correct_protocol() . '/css/ga_old_wp_support.css', false, GOOGLEANALYTICS_VERSION, 'all' );
412
- wp_enqueue_style( GA_NAME . '-old-wp-support-css' );
413
- }
414
- wp_register_style( GA_NAME . '-modal-css', Ga_Helper::get_plugin_url_with_correct_protocol() . '/css/ga_modal.css', false, GOOGLEANALYTICS_VERSION, 'all' );
415
- wp_enqueue_style( GA_NAME . '-modal-css' );
416
- }
417
-
418
- /**
419
- * Enqueues dashboard JS scripts.
420
- */
421
- private static function enqueue_dashboard_scripts() {
422
- wp_register_script(
423
- GA_NAME . '-dashboard-js',
424
- Ga_Helper::get_plugin_url_with_correct_protocol() . '/js/' . GA_NAME . '_dashboard.js',
425
- [ 'jquery' ],
426
- GOOGLEANALYTICS_VERSION,
427
- false
428
- );
429
- wp_enqueue_script( GA_NAME . '-dashboard-js' );
430
- }
431
-
432
- /**
433
- * Enqueues plugin's JS and CSS scripts.
434
- */
435
- public static function enqueue_scripts() {
436
- $domain = str_replace('http://','', str_replace('https://', '', str_replace( '/wp-admin/', '', admin_url() )));
437
- $st_prop = get_option(self::GA_SHARETHIS_PROPERTY_ID);
438
- $st_secret = get_option(self::GA_SHARETHIS_PROPERTY_SECRET);
439
-
440
- if ( Ga_Helper::is_dashboard_page() || Ga_Helper::is_plugin_page() ) {
441
- wp_register_script(
442
- GA_NAME . '-js',
443
- Ga_Helper::get_plugin_url_with_correct_protocol() . '/js/' . GA_NAME . '.js',
444
- [ 'jquery' ],
445
- GOOGLEANALYTICS_VERSION,
446
- false
447
- );
448
- wp_enqueue_script( GA_NAME . '-js' );
449
-
450
- wp_register_script( 'googlecharts', 'https://www.gstatic.com/charts/loader.js', null, 1, false );
451
- wp_enqueue_script( 'googlecharts' );
452
- wp_add_inline_script(GA_NAME . '-js', 'var ga_demo_nonce = "' . wp_create_nonce('ga_demo_nonce') . '";');
453
-
454
- if ( empty($st_prop) || empty($st_secret) ) {
455
- wp_register_script( 'googlecreateprop', Ga_Helper::get_plugin_url_with_correct_protocol() . '/js/googleanalytics_createprop.js', ['jquery', 'wp-util'], time(), false );
456
- wp_enqueue_script('googlecreateprop');
457
- wp_add_inline_script('googlecreateprop', '
458
- var gaNonce = "' . wp_create_nonce('googleanalyticsnonce') . '";
459
- var gasiteURL = "' . $domain . '";
460
- var gaAdminEmail = "' . get_option('admin_email') . '";'
461
- );
462
- }
463
-
464
- self::enqueue_ga_css();
465
- }
466
-
467
- if ( Ga_Helper::is_dashboard_page() ) {
468
- self::enqueue_dashboard_scripts();
469
- }
470
-
471
- if ( Ga_Helper::is_plugin_page() ) {
472
- self::enqueue_ga_scripts();
473
- }
474
- }
475
-
476
- /**
477
- * Prepares plugin's statistics page and return HTML code.
478
- *
479
- * @return string HTML code
480
- */
481
- public static function get_stats_page() {
482
- $age_chart = null;
483
- $boxes = null;
484
- $chart = null;
485
- $device_chart = null;
486
- $gender_chart = null;
487
- $labels = null;
488
- $sources = null;
489
-
490
- if ( Ga_Helper::is_authorized() && Ga_Helper::is_account_selected() && ! Ga_Helper::is_all_feature_disabled() ) {
491
- list( $chart, $age_chart, $device_chart, $gender_chart, $boxes, $labels, $sources ) = self::generate_stats_data();
492
- }
493
-
494
- return Ga_Helper::get_chart_page(
495
- 'stats',
496
- compact(
497
- 'age_chart',
498
- 'boxes',
499
- 'chart',
500
- 'device_chart',
501
- 'gender_chart',
502
- 'labels',
503
- 'sources'
504
- )
505
- );
506
- }
507
-
508
- /**
509
- * Shows plugin's notice on the admin area.
510
- */
511
- public static function admin_notice_googleanalytics() {
512
- if ( (!get_option( self::GA_SHARETHIS_TERMS_OPTION_NAME ) && Ga_Helper::is_plugin_page() ) || (!get_option( self::GA_SHARETHIS_TERMS_OPTION_NAME ) && !get_option( self::GA_HIDE_TERMS_OPTION_NAME ) ) ) {
513
- $current_url = Ga_Helper::get_current_url();
514
- $url = ( strstr( $current_url, '?' ) ? $current_url . '&' : $current_url . '?' ) . http_build_query( array( Ga_Controller_Core::ACTION_PARAM_NAME => 'ga_action_update_terms' ) );
515
- Ga_View_Core::load( 'ga_notice', array(
516
- 'url' => $url
517
- ) );
518
- }
519
-
520
- if ( !empty( $_GET[ 'settings-updated' ] ) && Ga_Helper::is_plugin_page() ) {
521
- echo Ga_Helper::ga_wp_notice( _( 'Settings saved' ), self::NOTICE_SUCCESS );
522
- }
523
-
524
- if ( Ga_Helper::get_option( self::GA_DISABLE_ALL_FEATURES ) ) {
525
- echo Ga_Helper::ga_wp_notice(
526
- __( 'You have disabled all extra features, click here to enable Dashboards, Viral Alerts and Google API.' ),
527
- 'warning',
528
- false,
529
- array(
530
- 'url' => admin_url( Ga_Helper::create_url( Ga_Helper::GA_SETTINGS_PAGE_URL, array( Ga_Controller_Core::ACTION_PARAM_NAME => 'ga_action_enable_all_features' ) ) ),
531
- 'label' => __( 'Enable' ),
532
- )
533
- );
534
- }
535
- }
536
-
537
- /**
538
- * Prepare required PHP version warning.
539
- * @return string
540
- */
541
- public static function admin_notice_googleanalytics_php_version() {
542
- echo wp_kses_post( Ga_Helper::ga_wp_notice( 'Cannot use Google Analytics plugin. PHP version ' . phpversion() . ' is to low. Required PHP version: ' . Ga_Helper::PHP_VERSION_REQUIRED, 'error' ) );
543
- }
544
-
545
- /**
546
- * Prepare required WP version warning
547
- * @return string
548
- */
549
- public static function admin_notice_googleanalytics_wp_version() {
550
- echo Ga_Helper::ga_wp_notice( 'Google Analytics plugin requires at least WordPress version ' . self::MIN_WP_VERSION, 'error' );
551
- }
552
-
553
- /**
554
- * Hides plugin's notice
555
- */
556
- public static function admin_notice_hide_googleanalytics() {
557
- update_option( self::GA_HIDE_TERMS_OPTION_NAME, true );
558
- }
559
-
560
- /**
561
- * Adds GA dashboard widget only for administrators.
562
- */
563
- public static function add_dashboard_device_widget() {
564
- if ( Ga_Helper::is_administrator() ) {
565
- wp_add_dashboard_widget( 'ga_dashboard_widget', __( 'Google Analytics Dashboard' ), 'Ga_Helper::add_ga_dashboard_widget' );
566
- }
567
- }
568
-
569
- /**
570
- * Adds plugin's actions
571
- */
572
- public static function add_actions() {
573
- add_action( 'admin_init', 'Ga_Admin::admin_init_googleanalytics' );
574
- add_action( 'admin_menu', 'Ga_Admin::admin_menu_googleanalytics' );
575
- add_action( 'admin_enqueue_scripts', 'Ga_Admin::enqueue_scripts' );
576
- add_action( 'wp_dashboard_setup', 'Ga_Admin::add_dashboard_device_widget' );
577
- add_action( 'wp_ajax_ga_ajax_data_change', 'Ga_Admin::ga_ajax_data_change' );
578
- add_action( 'wp_ajax_ga_ajax_hide_review', 'Ga_Admin::ga_ajax_hide_review' );
579
- add_action( 'wp_ajax_ga_ajax_enable_gdpr', 'Ga_Admin::gaAjaxGdprEnable' );
580
- add_action( 'wp_ajax_ga_ajax_enable_demographic', 'Ga_Admin::gaAjaxEnableDemo' );
581
- add_action( 'admin_notices', 'Ga_Admin::admin_notice_googleanalytics' );
582
- add_action( 'heartbeat_tick', 'Ga_Admin::run_heartbeat_jobs' );
583
- add_action( 'wp_ajax_googleanalytics_send_debug_email', 'Ga_SupportLogger::send_email' );
584
- add_action( 'wp_ajax_set_ga_credentials', 'Ga_Admin::createGAProperty' );
585
-
586
- if ( !get_option( self::GA_SHARETHIS_TERMS_OPTION_NAME ) && !get_option( self::GA_HIDE_TERMS_OPTION_NAME ) ) {
587
- add_action( 'wp_ajax_googleanalytics_hide_terms', 'Ga_Admin::admin_notice_hide_googleanalytics' );
588
- }
589
- }
590
-
591
- /**
592
- * Runs jobs
593
- *
594
- * @param $response
595
- * @param $screen_id
596
- */
597
- public static function run_heartbeat_jobs( $response, $screen_id = '' ) {
598
-
599
- if ( self::GA_HEARTBEAT_API_CACHE_UPDATE ) {
600
- // Disable cache for ajax request
601
- self::api_client()->set_disable_cache( true );
602
-
603
- // Try to regenerate cache if needed
604
- self::generate_stats_data();
605
- }
606
- }
607
-
608
- /**
609
- * Adds plugin's filters
610
- */
611
- public static function add_filters() {
612
- add_filter( 'plugin_action_links', 'Ga_Admin::ga_action_links', 10, 5 );
613
- }
614
-
615
- /**
616
- * Adds new action links on the plugin list.
617
- *
618
- * @param $actions
619
- * @param $plugin_file
620
- *
621
- * @return mixed
622
- */
623
- public static function ga_action_links( $actions, $plugin_file ) {
624
-
625
- if ( basename( $plugin_file ) === GA_NAME . '.php' ) {
626
- array_unshift( $actions, '<a href="' . esc_url( get_admin_url( null, Ga_Helper::GA_SETTINGS_PAGE_URL ) ) . '">' . __( 'Settings' ) . '</a>' );
627
- }
628
-
629
- return $actions;
630
- }
631
-
632
- public static function init_oauth() {
633
-
634
- $code = Ga_Helper::get_option( self::GA_OAUTH_AUTH_CODE_OPTION_NAME );
635
-
636
- if ( ! empty( $code ) ) {
637
- Ga_Helper::update_option( self::GA_OAUTH_AUTH_CODE_OPTION_NAME, '' );
638
-
639
- // Get access token
640
- $response = self::api_client()->call( 'ga_auth_get_access_token', $code );
641
- if ( empty( $response ) ) {
642
- return false;
643
- }
644
- $param = '';
645
- if ( ! self::save_access_token( $response ) ) {
646
- $param = '&err=1';
647
- $errors = self::api_client()->get_errors();
648
- if ( ! empty( $errors ) ) {
649
- foreach ( $errors as $error ) {
650
- if ( 'invalid_grant' === $error['message'] ) {
651
- $param = '&err=2';
652
- }
653
- }
654
- }
655
- } else {
656
- self::api_client()->set_access_token( $response->getData() );
657
- // Get accounts data
658
- $account_summaries = self::api_client()->call( 'ga_api_account_summaries' );
659
- self::save_ga_account_summaries( $account_summaries->getData() );
660
- update_option( self::GA_SELECTED_ACCOUNT, '' );
661
- }
662
-
663
- wp_safe_redirect( admin_url( Ga_Helper::GA_SETTINGS_PAGE_URL . $param ) );
664
- }
665
- }
666
-
667
- /**
668
- * Save access token.
669
- *
670
- * @param Ga_Lib_Api_Response $response
671
- *
672
- * @return boolean
673
- */
674
- public static function save_access_token( $response, $refresh_token = '' ) {
675
- $access_token = $response->getData();
676
- if ( ! empty( $access_token ) ) {
677
- $access_token['created'] = time();
678
- } else {
679
- return false;
680
- }
681
-
682
- if ( ! empty( $refresh_token ) ) {
683
- $access_token['refresh_token'] = $refresh_token;
684
- }
685
-
686
- return update_option( self::GA_OAUTH_AUTH_TOKEN_OPTION_NAME, wp_json_encode( $access_token ) );
687
- }
688
-
689
- /**
690
- * Saves Google Analytics account data.
691
- *
692
- * @param $data
693
- *
694
- * @return array
695
- */
696
- public static function save_ga_account_summaries( $data ) {
697
- $return = array();
698
- if ( ! empty( $data['items'] ) ) {
699
- foreach ( $data['items'] as $item ) {
700
- $tmp = array();
701
- $tmp['id'] = $item['id'];
702
- $tmp['name'] = $item['name'];
703
- if ( is_array( $item['webProperties'] ) ) {
704
- foreach ( $item['webProperties'] as $property ) {
705
- $profiles = array();
706
- if ( is_array( $property['profiles'] ) ) {
707
- foreach ( $property['profiles'] as $profile ) {
708
- $profiles[] = array(
709
- 'id' => $profile['id'],
710
- 'name' => $profile['name'],
711
- );
712
- }
713
- }
714
-
715
- $tmp['webProperties'][] = array(
716
- 'internalWebPropertyId' => $property['internalWebPropertyId'],
717
- 'webPropertyId' => $property['id'],
718
- 'name' => $property['name'],
719
- 'profiles' => $profiles,
720
- );
721
- }
722
- }
723
-
724
- $return[] = $tmp;
725
- }
726
-
727
- update_option( self::GA_ACCOUNT_DATA_OPTION_NAME, wp_json_encode( $return ) );
728
- } else {
729
- update_option( self::GA_ACCOUNT_DATA_OPTION_NAME, '' );
730
- }
731
- update_option( self::GA_WEB_PROPERTY_ID_OPTION_NAME, '' );
732
-
733
- return $return;
734
- }
735
-
736
- /**
737
- * Handle AJAX data for the GA dashboard widget.
738
- */
739
- public static function ga_ajax_data_change() {
740
- if ( Ga_Admin_Controller::validate_ajax_data_change_post( $_POST ) ) {
741
- $date_range = ! empty( $_POST['date_range'] ) ? $_POST['date_range'] : null; // WPCS: CSRF ok.
742
- $metric = ! empty( $_POST['metric'] ) ? $_POST['metric'] : null; // WPCS: CSRF ok.
743
- echo wp_kses_post( Ga_Helper::get_ga_dashboard_widget_data_json( $date_range, $metric, false, true ) );
744
- } else {
745
- echo wp_json_encode( array( 'error' => __( 'Invalid request.' ) ) );
746
- }
747
-
748
- wp_die();
749
- }
750
-
751
- /**
752
- * Displays API error messages.
753
- */
754
- public static function display_api_errors( $alias = '' ) {
755
- $errors = self::api_client( $alias )->get_errors();
756
- if ( ! empty( $errors ) ) {
757
- foreach ( $errors as $error ) {
758
- echo wp_kses_post( Ga_Notice::get_message( $error ) );
759
- }
760
- }
761
- }
762
-
763
- /**
764
- * Gets dashboard data.
765
- *
766
- * @return array
767
- */
768
- public static function generate_stats_data() {
769
- $selected = Ga_Helper::get_selected_account_data( true );
770
- $update_data = self::checkDataDate();
771
-
772
- $current_period = Ga_Helper::getDateRangeFromRequest();
773
-
774
- $current_period['start'] = $current_period['from'] ?: date('Y-m-d', strtotime('-1 week'));
775
- $current_period['end'] = $current_period['to'] ?: date('Y-m-d', strtotime('now'));
776
-
777
- $previous_period = Ga_Helper::getPreviousPeriodForDates($current_period['start'], $current_period['end']);
778
-
779
- $period_in_days = Ga_Helper::getPeriodInDays($current_period['start'], $current_period['end']);
780
-
781
- $date_ranges = Ga_Stats::set_date_ranges(
782
- $current_period['start'],
783
- $current_period['end'],
784
- $previous_period['start'],
785
- $previous_period['end']
786
- );
787
-
788
- $query_params = Ga_Stats::get_query( 'main_chart', $selected['view_id'], $date_ranges );
789
- $stats_data = self::api_client()->call(
790
- 'ga_api_data',
791
- [ $query_params ]
792
- );
793
- $gender_params = Ga_Stats::get_query( 'gender', $selected['view_id'], $date_ranges );
794
- $gender_data = self::api_client()->call(
795
- 'ga_api_data',
796
- [$gender_params]
797
- );
798
- $age_params = Ga_Stats::get_query( 'age', $selected['view_id'], $date_ranges );
799
- $age_data = self::api_client()->call(
800
- 'ga_api_data',
801
- [$age_params]
802
- );
803
- $device_params = Ga_Stats::get_query( 'device', $selected['view_id'], $date_ranges );
804
- $device_data = self::api_client()->call(
805
- 'ga_api_data',
806
- [ $device_params ]
807
- );
808
-
809
- $boxes_data = self::api_client()->call(
810
- 'ga_api_data',
811
- [ Ga_Stats::get_query( 'boxes', $selected['view_id'] ) ]
812
- );
813
- $sources_data = self::api_client()->call(
814
- 'ga_api_data',
815
- [ Ga_Stats::get_query( 'sources', $selected['view_id'] ) ]
816
- );
817
-
818
- $chart = ! empty( $stats_data ) ? Ga_Stats::get_chart( $stats_data->getData(), $period_in_days ) : array();
819
- $device_chart = false === empty( $device_data ) ? Ga_Stats::get_device_chart( $device_data->getData() ) : array();
820
- $gender_chart = ! empty( $gender_data ) ? Ga_Stats::get_gender_chart( $gender_data->getData() ) : [];
821
- $age_chart = ! empty( $age_data ) ? Ga_Stats::get_age_chart( $age_data->getData() ) : [];
822
- $boxes = ! empty( $boxes_data ) ? Ga_Stats::get_boxes( $boxes_data->getData() ) : array();
823
- $last_chart_date = ! empty( $chart ) ? $chart['date'] : strtotime( 'now' );
824
-
825
- unset( $chart['date'] );
826
- $labels = array(
827
- 'thisWeek' => date( 'M d, Y', strtotime( '-6 day', $last_chart_date ) ) . ' - ' . date( 'M d, Y', $last_chart_date ),
828
- 'thisMonth' => date( 'M d, Y', strtotime( '-29 day', $last_chart_date ) ) . ' - ' . date( 'M d, Y', $last_chart_date ),
829
- );
830
- $sources = ! empty( $sources_data ) ? Ga_Stats::get_sources( $sources_data->getData() ) : array();
831
-
832
- // Add gender/age data for default period (1 week ago vs 2 weeks ago).
833
- if ($update_data) {
834
- $gender_params = Ga_Stats::get_query( 'gender', $selected['view_id'] );
835
- $gender_data = self::api_client()->call(
836
- 'ga_api_data',
837
- [$gender_params]
838
- );
839
- $age_params = Ga_Stats::get_query( 'age', $selected['view_id'] );
840
- $age_data = self::api_client()->call(
841
- 'ga_api_data',
842
- [$age_params]
843
- );
844
-
845
- $gender_chart = ! empty($gender_data) ? Ga_Stats::get_gender_chart($gender_data->getData()) : [];
846
- $age_chart = ! empty($age_data) ? Ga_Stats::get_age_chart($age_data->getData()) : [];
847
-
848
- self::updateDemoData(
849
- $gender_chart,
850
- $age_chart
851
- );
852
- }
853
-
854
- return [$chart, $age_chart, $device_chart, $gender_chart, $boxes, $labels, $sources];
855
- }
856
-
857
- private static function updateDemoData($gender_response = false, $age_response = false)
858
- {
859
- $x = 0;
860
- $demoSendData = [];
861
- if ($gender_response && $age_response) {
862
- foreach ($age_response as $type => $amount) {
863
- $demoSendData['age'][$type] = intval($amount);
864
- $x++;
865
- }
866
- foreach ($gender_response as $type => $amount) {
867
- $demoSendData['gender'][ucfirst($type)] = intval($amount);
868
- $x++;
869
- }
870
- }
871
-
872
- // Add data for send.
873
- update_option('googleanalytics_demo_data', wp_json_encode($demoSendData));
874
-
875
- // Trigger send.
876
- update_option('googleanalytics_send_data', "true");
877
- }
878
-
879
- /**
880
- * Check if we should send batch of demo data.
881
- *
882
- * @return bool
883
- */
884
- private static function checkDataDate()
885
- {
886
- $demo_enabled = get_option('googleanalytics_demographic');
887
- $demo_date = get_option('googleanalytics_demo_date');
888
- $demo_date = !empty($demo_date) ? strtotime($demo_date) : '';
889
- $current_date = date("Y-m-d");
890
- $thirty_date = '' !== $demo_date ? date("Y-m-d", strtotime("+1 month", $demo_date)) : '';
891
-
892
- if (empty($demo_enabled) || !$demo_enabled) {
893
- return false;
894
- }
895
-
896
- if ('' !== $demo_date && $thirty_date <= $current_date) {
897
- return true;
898
- } elseif ('' === $demo_date) {
899
- return true;
900
- }
901
-
902
- return false;
903
- }
904
-
905
- /**
906
- * Returns auth or re-auth button
907
- *
908
- * @return string
909
- */
910
- public static function get_auth_button( $type ) {
911
-
912
- return Ga_View_Core::load(
913
- 'ga_auth_button',
914
- [
915
- 'label' => 'auth' === $type ? 'Authenticate with Google' : 'Re-authenticate with Google',
916
- 'type' => $type,
917
- 'url' => self::get_auth_popup_url(),
918
- 'manually_id' => get_option( self::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME ),
919
- ],
920
- true
921
- );
922
- }
923
-
924
- /**
925
- * Returns debug modal
926
- *
927
- * @return string
928
- */
929
- public static function get_debug_modal() {
930
-
931
- return Ga_View_Core::load(
932
- 'ga_debug_modal',
933
- [ 'debug_info' => Ga_SupportLogger::$debug_info, 'debug_help_message' => Ga_SupportLogger::$debug_help_message ],
934
- true
935
- );
936
- }
937
-
938
- public static function ga_ajax_hide_review( $post ) {
939
- $error = 0;
940
-
941
- if ( Ga_Controller_Core::verify_nonce( 'ga_ajax_data_change' ) ) {
942
- update_option('googleanalytics-hide-review', true);
943
- }
944
-
945
- wp_send_json_success('hidden');
946
- }
947
-
948
- public static function gaAjaxGdprEnable( $post ) {
949
- if (!isset($_POST['config'])) {
950
- wp_send_json_error('No config found.');
951
- }
952
-
953
- update_option('googleanalytics_gdpr_config', $_POST['config']);
954
-
955
- wp_send_json_success('gdpr_on');
956
- }
957
-
958
- public static function gaAjaxEnableDemo( $post ) {
959
- check_ajax_referer( 'ga_demo_nonce', 'nonce' );
960
-
961
- $enabled = isset($_POST['enabled']) && $_POST['enabled'] === 'true' ? true : false;
962
-
963
- update_option('googleanalytics_demographic', $enabled);
964
-
965
- wp_send_json_success('demo_on');
966
- }
967
-
968
- /**
969
- * New property creation method.
970
- */
971
- public static function createGAProperty() {
972
- check_ajax_referer( 'googleanalyticsnonce', 'nonce' );
973
-
974
- if (! isset($_POST['propid'], $_POST['secret'])) { // WPCS: input var ok.
975
- wp_send_json_error( 'Set credentials failed.' );
976
- }
977
-
978
- $secret = sanitize_text_field( wp_unslash( $_POST['secret'] ) ); // WPCS: input var ok.
979
- $propid = sanitize_text_field( wp_unslash( $_POST['propid'] ) ); // WPCS: input var ok.
980
-
981
- update_option(self::GA_SHARETHIS_PROPERTY_ID, $propid);
982
- update_option(self::GA_SHARETHIS_PROPERTY_SECRET, $secret);
983
- }
984
-
985
- /**
986
- * Helper function get vendors.
987
- *
988
- * @param string $page
989
- * @return array
990
- */
991
- private static function getVendors()
992
- {
993
- $response = wp_remote_get('https://vendor-list.consensu.org/v2/vendor-list.json');
994
-
995
- return json_decode(wp_remote_retrieve_body($response), true);
996
- }
997
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
class/Ga_Helper.php DELETED
@@ -1,743 +0,0 @@
1
- <?php
2
-
3
- class Ga_Helper {
4
-
5
- const ROLE_ID_PREFIX = 'role-id-';
6
- const GA_DEFAULT_WEB_ID = 'UA-0000000-0';
7
- const GA_STATISTICS_PAGE_URL = 'admin.php?page=googleanalytics';
8
- const GA_SETTINGS_PAGE_URL = 'admin.php?page=googleanalytics/settings';
9
- const DASHBOARD_PAGE_NAME = 'dashboard';
10
- const PHP_VERSION_REQUIRED = '5.2.17';
11
- const GA_WP_MODERN_VERSION = '4.1';
12
- const GA_TOOLTIP_TERMS_NOT_ACCEPTED = 'Please accept the terms to use this feature.';
13
- const GA_TOOLTIP_FEATURES_DISABLED = 'Click the Enable button at the top to start using this feature.';
14
- const GA_DEBUG_MODE = false;
15
-
16
- /**
17
- * Init plugin actions.
18
- *
19
- */
20
- public static function init() {
21
-
22
- // Displays errors related to required PHP version
23
- if ( ! self::is_php_version_valid() ) {
24
- add_action( 'admin_notices', 'Ga_Admin::admin_notice_googleanalytics_php_version' );
25
-
26
- return false;
27
- }
28
-
29
- // Displays errors related to required WP version
30
- if ( ! self::is_wp_version_valid() ) {
31
- add_action( 'admin_notices', 'Ga_Admin::admin_notice_googleanalytics_wp_version' );
32
-
33
- return false;
34
- }
35
-
36
- if ( ! is_admin() ) {
37
- Ga_Frontend::add_actions();
38
- }
39
-
40
- if ( is_admin() ) {
41
- Ga_Admin::add_filters();
42
- Ga_Admin::add_actions();
43
- Ga_Admin::init_oauth();
44
-
45
-
46
- $admin_controller = new Ga_Admin_Controller();
47
- $admin_controller->handle_actions();
48
- }
49
- }
50
-
51
- /**
52
- * Checks if current page is a WordPress dashboard.
53
- * @return int
54
- */
55
- public static function is_plugin_page() {
56
- $site = get_current_screen();
57
-
58
- return preg_match( '/' . GA_NAME . '/i', $site->base ) || preg_match( '/' . GA_NAME . '/i', $_SERVER['REQUEST_URI'] );
59
- }
60
-
61
- /**
62
- * Checks if current page is a WordPress dashboard.
63
- * @return number
64
- */
65
- public static function is_dashboard_page() {
66
- $site = get_current_screen();
67
-
68
- return preg_match( '/' . self::DASHBOARD_PAGE_NAME . '/', $site->base );
69
- }
70
-
71
- /**
72
- * Check whether the plugin is configured.
73
- *
74
- * @param String $web_id
75
- *
76
- * @return boolean
77
- */
78
- public static function is_configured( $web_id ) {
79
- return ( self::GA_DEFAULT_WEB_ID !== $web_id ) && ! empty( $web_id );
80
- }
81
-
82
- /**
83
- * Prepare an array of current site's user roles
84
- *
85
- * return array
86
- */
87
- public static function get_user_roles() {
88
- global $wp_roles;
89
- if ( ! isset( $wp_roles ) ) {
90
- $wp_roles = new WP_Roles();
91
- }
92
-
93
- return $wp_roles->get_names();
94
- }
95
-
96
- /**
97
- * Prepare a role ID.
98
- *
99
- * The role ID is derived from the role's name and will be used
100
- * in its setting name in the additional settings.
101
- *
102
- * @param string $role_name Role name
103
- *
104
- * @return string
105
- */
106
- public static function prepare_role_id( $role_name ) {
107
- return self::ROLE_ID_PREFIX . strtolower( preg_replace( '/[\W]/', '-', before_last_bar( $role_name ) ) );
108
- }
109
-
110
- /**
111
- * Prepares role id.
112
- *
113
- * @param $v
114
- * @param $k
115
- */
116
- public static function prepare_role( &$v, $k ) {
117
- $v = self::prepare_role_id( $v );
118
- }
119
-
120
- /**
121
- * Checks whether user role is excluded from adding UA code.
122
- *
123
- * @return boolean
124
- */
125
- public static function can_add_ga_code() {
126
- $current_user = wp_get_current_user();
127
- $user_roles = !empty( $current_user->roles ) ? $current_user->roles : array();
128
- $exclude_roles = json_decode( get_option( Ga_Admin::GA_EXCLUDE_ROLES_OPTION_NAME ), true );
129
-
130
- array_walk( $user_roles, 'Ga_Helper::prepare_role' );
131
-
132
- $return = true;
133
- foreach ( $user_roles as $role ) {
134
- if ( !empty( $exclude_roles[ $role ] ) ) {
135
- $return = false;
136
- break;
137
- }
138
- }
139
-
140
- return $return;
141
- }
142
-
143
- /**
144
- * Adds ga dashboard widget HTML code for a WordPress
145
- * Dashboard widget hook.
146
- */
147
- public static function add_ga_dashboard_widget() {
148
- echo self::get_ga_dashboard_widget( null, false, false, true );
149
- }
150
-
151
- /**
152
- * Generates dashboard widget HTML code.
153
- *
154
- * @param string $date_range Google Analytics specific date range string.
155
- * @param boolean $text_mode
156
- * @param boolean $ajax
157
- *
158
- * @return null | string HTML dashboard widget code.
159
- */
160
- public static function get_ga_dashboard_widget( $date_range = null, $text_mode = false, $ajax = false, $trigger_request = false ) {
161
- if ( empty( $date_range ) ) {
162
- $date_range = '30daysAgo';
163
- }
164
-
165
- if ( !$trigger_request ) {
166
- // Get chart and boxes data
167
- $data = self::get_dashboard_widget_data( $date_range );
168
-
169
- if ( $text_mode ) {
170
- return self::get_chart_page( 'ga_dashboard_widget' . ( $ajax ? "_ajax" : "" ), array(
171
- 'chart' => $data[ 'chart' ],
172
- 'boxes' => $data[ 'boxes' ]
173
- ) );
174
- } else {
175
- echo self::get_chart_page( 'ga_dashboard_widget' . ( $ajax ? "_ajax" : "" ), array(
176
- 'chart' => $data[ 'chart' ],
177
- 'boxes' => $data[ 'boxes' ],
178
- 'more_details_url' => admin_url( self::GA_STATISTICS_PAGE_URL ),
179
- 'ga_nonce' => wp_create_nonce( 'ga_ajax_data_change' ),
180
- 'ga_nonce_name' => Ga_Admin_Controller::GA_NONCE_FIELD_NAME
181
- ) );
182
- }
183
- } else {
184
- echo self::get_chart_page( 'ga_dashboard_widget' . ( $ajax ? "_ajax" : "" ), array(
185
- 'chart' => array(),
186
- 'boxes' => Ga_Stats::get_empty_boxes_structure(),
187
- 'more_details_url' => admin_url( self::GA_STATISTICS_PAGE_URL ),
188
- 'show_trigger_button' => true,
189
- 'ga_nonce' => wp_create_nonce( 'ga_ajax_data_change' ),
190
- 'ga_nonce_name' => Ga_Admin_Controller::GA_NONCE_FIELD_NAME
191
- ) );
192
- }
193
-
194
- return null;
195
- }
196
-
197
- /**
198
- * Generates JSON data string for AJAX calls.
199
- *
200
- * @param string $date_range
201
- * @param string $metric
202
- * @param boolean $text_mode
203
- * @param boolean $ajax
204
- *
205
- * @return string|false Returns JSON data string
206
- */
207
- public static function get_ga_dashboard_widget_data_json(
208
- $date_range = null, $metric = null, $text_mode = false, $ajax = false
209
- ) {
210
- if ( empty( $date_range ) ) {
211
- $date_range = '30daysAgo';
212
- }
213
-
214
- if ( empty( $metric ) ) {
215
- $metric = 'pageviews';
216
- }
217
-
218
- $data = self::get_dashboard_widget_data( $date_range, $metric );
219
-
220
- return wp_json_encode( $data );
221
- }
222
-
223
- /**
224
- * Gets dashboard widget data.
225
- *
226
- * @param date_range
227
- * @param metric
228
- *
229
- * @return array Return chart and boxes data
230
- */
231
- private static function get_dashboard_widget_data( $date_range, $metric = null ) {
232
- $selected = self::get_selected_account_data( true );
233
- if ( self::is_authorized() && self::is_account_selected() ) {
234
- $query_params = Ga_Stats::get_query( 'main_chart', $selected[ 'view_id' ], $date_range, $metric, true );
235
- $stats_data = Ga_Admin::api_client()->call( 'ga_api_data', array(
236
- $query_params
237
- ) );
238
-
239
- $boxes_query = Ga_Stats::get_query( 'dashboard_boxes', $selected[ 'view_id' ], $date_range, null, true );
240
- $boxes_data = Ga_Admin::api_client()->call( 'ga_api_data', array(
241
- $boxes_query
242
- ) );
243
- }
244
- $chart = !empty( $stats_data ) ? Ga_Stats::get_dashboard_chart( $stats_data->getData() ) : array();
245
- $boxes = !empty( $boxes_data ) ? Ga_Stats::get_dashboard_boxes_data( $boxes_data->getData() ) : array();
246
-
247
- return array(
248
- 'chart' => $chart,
249
- 'boxes' => $boxes
250
- );
251
- }
252
-
253
- public static function is_account_selected() {
254
- return self::get_selected_account_data();
255
- }
256
-
257
- /**
258
- * Returns HTML code of the chart page or a notice.
259
- *
260
- * @param chart
261
- *
262
- * @return string Returns HTML code
263
- */
264
- public static function get_chart_page( $view, $params ) {
265
-
266
- $message = sprintf( __( 'Statistics can only be seen after you authenticate with your Google account on the <a href="%s">Settings page</a>.' ), admin_url( self::GA_SETTINGS_PAGE_URL ) );
267
-
268
- if ( self::is_authorized() && !self::is_code_manually_enabled() && !self::is_all_feature_disabled() ) {
269
- if ( self::is_account_selected() ) {
270
- if ( $params ) {
271
- return Ga_View_Core::load( $view, $params, true );
272
- } else {
273
- return self::ga_oauth_notice( sprintf( 'Please configure your <a href="%s">Google Analytics settings</a>.', admin_url( self::GA_SETTINGS_PAGE_URL ) ) );
274
- }
275
- } else {
276
- return self::ga_oauth_notice( $message );
277
- }
278
- } else {
279
- return self::ga_oauth_notice( $message );
280
- }
281
- }
282
-
283
- /**
284
- * Checks whether users is authorized with Google.
285
- *
286
- * @return boolean
287
- */
288
- public static function is_authorized() {
289
- return Ga_Admin::api_client()->get_instance()->is_authorized();
290
- }
291
-
292
- /**
293
- * Wrapper for WordPress method get_option
294
- *
295
- * @param string $name Option name
296
- *
297
- * @return NULL|mixed|boolean
298
- */
299
- public static function get_option( $name ) {
300
- $opt = get_option( $name );
301
-
302
- return !empty( $opt ) ? $opt : null;
303
- }
304
-
305
- /**
306
- * Wrapper for WordPress method update_option
307
- *
308
- * @param string $name
309
- * @param mixed $value
310
- *
311
- * @return NULL|boolean
312
- */
313
- public static function update_option( $name, $value ) {
314
- $opt = update_option( $name, $value );
315
-
316
- return !empty( $opt ) ? $opt : null;
317
- }
318
-
319
- /**
320
- * Loads ga notice HTML code with given message included.
321
- *
322
- * @param string $message
323
- * $param bool $cannot_activate Whether the plugin cannot be activated
324
- *
325
- * @return string
326
- */
327
- public static function ga_oauth_notice( $message ) {
328
- return Ga_View_Core::load( 'ga_oauth_notice', array(
329
- 'msg' => $message
330
- ), true );
331
- }
332
-
333
- /**
334
- * Displays notice following the WP style.
335
- *
336
- * @param $message
337
- * @param string $type
338
- * @param $is_dismissable
339
- * @param $action
340
- *
341
- * @return string
342
- */
343
- public static function ga_wp_notice( $message, $type = '', $is_dismissable = false, $action = array() ) {
344
- return Ga_View_Core::load( 'ga_wp_notice', array(
345
- 'type' => empty( $type ) ? Ga_Admin::NOTICE_WARNING : $type,
346
- 'msg' => $message,
347
- 'is_dismissable' => $is_dismissable,
348
- 'action' => $action
349
- ), true );
350
- }
351
-
352
- /**
353
- * Gets data according to selected GA account.
354
- *
355
- * @param boolean $assoc
356
- *
357
- * @return mixed
358
- */
359
- public static function get_selected_account_data( $assoc = false ) {
360
- $data = json_decode( self::get_option( Ga_Admin::GA_SELECTED_ACCOUNT ) );
361
- $data = (!empty( $data ) && count( $data ) == 3 ) ? $data : false;
362
-
363
- if ( $data ) {
364
- if ( $assoc ) {
365
- return array(
366
- 'account_id' => $data[ 0 ],
367
- 'web_property_id' => $data[ 1 ],
368
- 'view_id' => $data[ 2 ]
369
- );
370
- } else {
371
- return $data;
372
- }
373
- }
374
-
375
- return false;
376
- }
377
-
378
- /**
379
- * Chekcs whether option for manually UA-code
380
- * @return NULL|mixed|boolean
381
- */
382
- public static function is_code_manually_enabled() {
383
- return Ga_Helper::get_option( Ga_Admin::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME );
384
- }
385
-
386
- /**
387
- * Adds percent sign to the given text.
388
- *
389
- * @param $text
390
- *
391
- * @return string
392
- */
393
- public static function format_percent( $text ) {
394
- $text = self::add_plus( $text );
395
-
396
- return $text . '%';
397
- }
398
-
399
- /**
400
- * Adds plus sign before number.
401
- *
402
- * @param $number
403
- *
404
- * @return string
405
- */
406
- public static function add_plus( $number ) {
407
- if ( $number > 0 ) {
408
- return '+' . $number;
409
- }
410
-
411
- return $number;
412
- }
413
-
414
- /**
415
- * Check whether current user has administrator privileges.
416
- *
417
- * @return bool
418
- */
419
- public static function is_administrator() {
420
- if ( current_user_can( 'administrator' ) ) {
421
- return true;
422
- }
423
-
424
- return false;
425
- }
426
-
427
- public static function is_wp_version_valid() {
428
- $wp_version = get_bloginfo( 'version' );
429
-
430
- return version_compare( $wp_version, Ga_Admin::MIN_WP_VERSION, 'ge' );
431
- }
432
-
433
- /**
434
- * Check if terms are accepted
435
- *
436
- * @return bool
437
- */
438
- public static function are_terms_accepted() {
439
- return self::get_option( Ga_Admin::GA_SHARETHIS_TERMS_OPTION_NAME );
440
- }
441
-
442
- /**
443
- * Check if sharethis scripts enabled
444
- *
445
- * @return bool
446
- */
447
- public static function is_sharethis_included() {
448
- return GA_SHARETHIS_SCRIPTS_INCLUDED;
449
- }
450
-
451
- /**
452
- * @return mixed
453
- */
454
- public static function is_php_version_valid() {
455
- $p = '#(\.0+)+($|-)#';
456
- $ver1 = preg_replace( $p, '', phpversion() );
457
- $ver2 = preg_replace( $p, '', self::PHP_VERSION_REQUIRED );
458
- $operator = 'ge';
459
- $compare = isset( $operator ) ?
460
- version_compare( $ver1, $ver2, $operator ) :
461
- version_compare( $ver1, $ver2 );
462
-
463
- return $compare;
464
- }
465
-
466
- public static function get_current_url() {
467
- return $_SERVER[ 'REQUEST_URI' ];
468
- }
469
-
470
- public static function create_url( $url, $data = array() ) {
471
- return !empty( $data ) ? ( strstr( $url, '?' ) ? ( $url . '&' ) : ( $url . '?' ) ) . http_build_query( $data ) : $url;
472
- }
473
-
474
- public static function handle_url_message( $data ) {
475
- if ( !empty( $_GET[ 'ga_msg' ] ) ) {
476
- $invite_result = json_decode( base64_decode( $_GET[ 'ga_msg' ] ), true );
477
- if ( !empty( $invite_result[ 'status' ] ) && !empty( $invite_result[ 'message' ] ) ) {
478
- $data[ 'ga_msg' ] = Ga_Helper::ga_wp_notice( $invite_result[ 'message' ], $invite_result[ 'status' ], true );
479
- }
480
- }
481
-
482
- return $data;
483
- }
484
-
485
- public static function get_url_message_text() {
486
- $ga_msg = '';
487
- $invite_result = json_decode( base64_decode( $_GET[ 'ga_msg' ] ), true );
488
- if ( !empty( $invite_result[ 'status' ] ) && !empty( $invite_result[ 'message' ] ) ) {
489
- $ga_msg = $invite_result[ 'message' ];
490
- }
491
-
492
- return $ga_msg;
493
- }
494
-
495
- /**
496
- * Create base64 url message
497
- *
498
- * @param $msg
499
- * @param $status
500
- *
501
- * @return string
502
- */
503
- public static function create_url_msg( $msg, $status ) {
504
- $msg = array( 'status' => $status, 'message' => $msg );
505
-
506
- return base64_encode( json_encode( $msg ) );
507
- }
508
-
509
- public static function is_all_feature_disabled() {
510
- return self::get_option( Ga_Admin::GA_DISABLE_ALL_FEATURES );
511
- }
512
-
513
- public static function are_features_enabled() {
514
- return self::are_terms_accepted() && !self::is_all_feature_disabled();
515
- }
516
-
517
- public static function are_sharethis_properties_verified() {
518
- return ( get_option( Ga_Admin::GA_SHARETHIS_VERIFICATION_RESULT ) && self::are_sharethis_properties_set() );
519
- }
520
-
521
- public static function are_sharethis_properties_ready_to_verify() {
522
- return ( self::are_sharethis_properties_set() && !get_option( Ga_Admin::GA_SHARETHIS_VERIFICATION_RESULT ) );
523
- }
524
-
525
- public static function are_sharethis_properties_set() {
526
- return ( get_option( Ga_Admin::GA_SHARETHIS_PROPERTY_ID ) && get_option( Ga_Admin::GA_SHARETHIS_PROPERTY_SECRET ) );
527
- }
528
-
529
- public static function should_create_sharethis_property() {
530
- return ( self::are_features_enabled() && !self::are_sharethis_properties_set() );
531
- }
532
-
533
- public static function should_verify_sharethis_installation() {
534
- return ( self::are_features_enabled() && self::are_sharethis_properties_ready_to_verify() );
535
- }
536
-
537
- public static function get_tooltip() {
538
- if ( !self::are_terms_accepted() ) {
539
- return self::GA_TOOLTIP_TERMS_NOT_ACCEPTED;
540
- } else if ( !self::are_features_enabled() ) {
541
- return self::GA_TOOLTIP_FEATURES_DISABLED;
542
- } else {
543
- return '';
544
- }
545
- }
546
-
547
- /**
548
- * Is this version of WordPress considered old (< 4.1)?
549
- *
550
- * @return bool True if old, False if not.
551
- */
552
- public static function is_wp_old() {
553
- return version_compare( get_bloginfo( 'version' ), self::GA_WP_MODERN_VERSION, 'lt' );
554
- }
555
-
556
- /**
557
- * Should we load GA JavaScript on this property?
558
- *
559
- * @param string $web_property_id
560
- *
561
- * @return bool
562
- */
563
- public static function should_load_ga_javascript( $web_property_id ) {
564
- return ( self::is_configured( $web_property_id ) && ( self::can_add_ga_code() || self::is_all_feature_disabled() ) );
565
- }
566
-
567
- /**
568
- * Get account ID.
569
- *
570
- * @return string
571
- */
572
- public static function get_account_id() {
573
- $account_id = json_decode( Ga_Helper::get_option( Ga_Admin::GA_SELECTED_ACCOUNT ) );
574
-
575
- return ! empty( $account_id[0] ) ? $account_id[0] : '';
576
- }
577
-
578
- /**
579
- * Is curl disabled?
580
- *
581
- * @return bool True if disabled, false if enabled.
582
- */
583
- public static function is_curl_disabled() {
584
- return ! function_exists( 'curl_version' );
585
- }
586
-
587
- /**
588
- * Get URL with correct protocol.
589
- *
590
- * @return string URL with correct protocol.
591
- */
592
- public static function get_plugin_url_with_correct_protocol() {
593
- $url = parse_url( GA_PLUGIN_URL );
594
- return ( ( is_ssl() ) ? 'https://' : 'http://' ) . $url['host'] . $url['path'];
595
- }
596
-
597
- /**
598
- * Get code to manually label classes.
599
- *
600
- * @return string
601
- */
602
- public static function get_code_manually_label_classes() {
603
- $classes = '';
604
- if ( ! self::are_features_enabled() ){
605
- $classes = 'label-grey ga-tooltip';
606
- }
607
- else if( self::is_account_selected() ) {
608
- $classes = 'label-grey';
609
- }
610
- return $classes;
611
- }
612
-
613
- /**
614
- * Get Previous Period for Dates (date start and date end).
615
- *
616
- * @param string $date_start Date string.
617
- * @param string $date_end Date string.
618
- *
619
- * @return array Array of start and end dates in Y-m-d format.
620
- * @since 2.5.2
621
- */
622
- public static function getPreviousPeriodForDates($date_start = '', $date_end = '')
623
- {
624
- try {
625
- // Get distance between dates in days.
626
- $start = new DateTime($date_start);
627
- $end = new DateTime($date_end);
628
- } catch (\Exception $e) {
629
- return [
630
- 'start' => date('Y-m-d', strtotime('-1 week')),
631
- 'end' => date('Y-m-d'),
632
- ];
633
- }
634
-
635
- // Clone $start date into end_previous so we don't modify $start.
636
- $end_previous = clone $start;
637
-
638
- // Set the period to the difference between the start/end dates in days.
639
- $period = $end->diff($start)->days;
640
-
641
- // Subtract 1 day from $end_previous so it's one day before $start.
642
- $end_previous->modify('-1 day');
643
-
644
- // Clone $end_previous so we can subtract $period from it in days.
645
- $start_previous = clone $end_previous;
646
- $start_previous->modify(sprintf('-%d day', $period));
647
-
648
- return [
649
- 'start' => $start_previous->format('Y-m-d'),
650
- 'end' => $end_previous->format('Y-m-d'),
651
- ];
652
- }
653
-
654
- /**
655
- * Get period between dates in days.
656
- *
657
- * @param string $date_start Start date string.
658
- * @param string $date_end End date string.
659
- *
660
- * @return int
661
- * @since 2.5.2
662
- */
663
- public static function getPeriodInDays($date_start = '', $date_end = '')
664
- {
665
- $date_start = empty($date_start) ? date('Y-m-d', strtotime('-1 week')) : $date_start;
666
- $date_end = empty($date_end) ? date('Y-m-d') : $date_end;
667
-
668
- try {
669
- // Get distance between dates in days.
670
- $start = new DateTime($date_start);
671
- $end = new DateTime($date_end);
672
- } catch (\Exception $e) {
673
- return 0;
674
- }
675
-
676
- // Set the period to the difference between the start/end dates in days.
677
- return intval($start->diff($end)->format('%r%a'));
678
- }
679
-
680
- /**
681
- * Get period in Days as words.
682
- *
683
- * @param string $date_start Start date string.
684
- * @param string $date_end End date string.
685
- *
686
- * @return string Words to indicate days.
687
- * @since 2.5.2
688
- */
689
- public static function getPeriodInDaysWords($date_start = '', $date_end = '')
690
- {
691
- $days = self::getPeriodInDays($date_start, $date_end);
692
-
693
- $date_end = empty($date_end) ? strtotime('now') : strtotime($date_end);
694
-
695
- // If today is the same as the end date.
696
- if (date('Y-m-d', $date_end) === date('Y-m-d')) {
697
- if (0 === $days) {
698
- return __('Today', 'googleanalytics');
699
- }
700
-
701
- if (7 === $days) {
702
- return __('This Week', 'googleanalytics');
703
- }
704
-
705
- return sprintf(_n('Last %d Day', 'Last %d Days', $days, 'googleanalytics'), $days);
706
- }
707
-
708
- return sprintf(_n('%d Day', '%d Days', $days, 'googleanalytics'), $days);
709
- }
710
-
711
- /**
712
- * Get date range from GET request.
713
- *
714
- * @return array
715
- * @since 2.5.2
716
- */
717
- public static function getDateRangeFromRequest()
718
- {
719
- $date_range = filter_input_array(INPUT_GET, [
720
- 'date_from' => FILTER_SANITIZE_STRING,
721
- 'date_to' => FILTER_SANITIZE_STRING,
722
- ]);
723
-
724
- // If date_from is after date_to, let's reset 'from' to a week before 'to.'
725
- if (0 > Ga_Helper::getPeriodInDays($date_range['date_from'], $date_range['date_to'])) {
726
- try {
727
- $date = new DateTime($date_range['date_to']);
728
- $date->modify('-1 week');
729
-
730
- $date_from = $date->format('Y-m-d');
731
- } catch (\Exception $e) {
732
- $date_from = date('Y-m-d', strtotime('-1 week'));
733
- }
734
-
735
- $date_range['date_from'] = $date_from;
736
- }
737
-
738
- return [
739
- 'from' => $date_range['date_from'],
740
- 'to' => $date_range['date_to'],
741
- ];
742
- }
743
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
class/Ga_Notice.php DELETED
@@ -1,35 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Handles exception translations.
5
- *
6
- * Created by PhpStorm.
7
- * User: mdn
8
- * Date: 2017-01-25
9
- * Time: 14:37
10
- */
11
- class Ga_Notice {
12
-
13
- public static function get_message( $error ) {
14
- $message = '';
15
-
16
- if ( Ga_Helper::GA_DEBUG_MODE ) {
17
- $message = Ga_Helper::ga_wp_notice( (!empty( $error[ 'class' ] ) ? _( '[' . $error[ 'class' ] . ']' ) : '' ) . ' ' . $error[ 'message' ], 'error' );
18
- } elseif ( $error[ 'class' ] == 'Ga_Lib_Google_Api_Client_AuthCode_Exception' ) {
19
- $message = Ga_Helper::ga_wp_notice( $error[ 'message' ], 'error' );
20
- } elseif ( $error[ 'class' ] == 'Ga_Lib_Sharethis_Api_Client_InvalidDomain_Exception' ) {
21
- $message = Ga_Helper::ga_wp_notice( $error[ 'message' ], 'error' );
22
- } elseif ( $error[ 'class' ] == 'Ga_Lib_Sharethis_Api_Client_Invite_Exception' ) {
23
- $message = Ga_Helper::ga_wp_notice( $error[ 'message' ], 'error' );
24
- } elseif ( in_array( $error[ 'class' ], array( 'Ga_Lib_Sharethis_Api_Client_Verify_Exception', 'Ga_Lib_Sharethis_Api_Client_Alerts_Exception' ) ) ) {
25
- $message = Ga_Helper::ga_wp_notice( Ga_Sharethis::GA_SHARETHIS_ALERTS_ERROR, 'error' );
26
- } elseif ( $error[ 'class' ] == 'Ga_Data_Outdated_Exception' ) {
27
- $message = Ga_Helper::ga_wp_notice( $error[ 'message' ], 'warning' );
28
- } else {
29
- $message = Ga_Helper::ga_wp_notice( _( 'There are temporary connection issues, please try again later or go to Google Analytics website to see the dashboards' ), 'error' );
30
- }
31
-
32
- return $message;
33
- }
34
-
35
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
class/Ga_Sharethis.php DELETED
@@ -1,101 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Ga_Sharethis class
5
- *
6
- * Preparing request and parsing response from Sharethis Platform Api
7
- *
8
- * @author wle@adips.com
9
- * @version 1.0
10
- */
11
-
12
- class Ga_Sharethis {
13
-
14
- public static function get_body( $data ) {
15
- $body = $data->getBody();
16
- return json_decode( $body );
17
- }
18
-
19
- /**
20
- * Create sharethis options
21
- */
22
- public static function create_sharethis_options( $api_client ) {
23
- $data = array();
24
- $parsed_url = parse_url( get_option( 'siteurl' ) );
25
- $domain = $parsed_url['host'] . ( !empty( $parsed_url['path'] ) ? $parsed_url['path'] : '' );
26
- $query_params = array(
27
- 'domain' => $domain,
28
- 'is_wordpress' => true,
29
- 'onboarding_product' => 'ga',
30
- );
31
- $response = $api_client->call( 'ga_api_create_sharethis_property', array(
32
- $query_params
33
- ) );
34
- $sharethis_options = self::get_sharethis_options( $response );
35
- if ( !empty( $sharethis_options[ 'id' ] ) ) {
36
- add_option( Ga_Admin::GA_SHARETHIS_PROPERTY_ID, $sharethis_options[ 'id' ] );
37
- }
38
- if ( !empty( $sharethis_options[ 'secret' ] ) ) {
39
- add_option( Ga_Admin::GA_SHARETHIS_PROPERTY_SECRET, $sharethis_options[ 'secret' ] );
40
- }
41
-
42
- return $data;
43
- }
44
-
45
- public static function get_sharethis_options( $response ) {
46
- $body = self::get_body( $response );
47
- $options = array();
48
- if ( !empty( $body ) ) {
49
- foreach ( $body as $key => $value ) {
50
- if ( $key == '_id' ) {
51
- $options[ 'id' ] = $value;
52
- } else if ( $key == 'secret' ) {
53
- $options[ 'secret' ] = $value;
54
- } else if ( $key == 'error' ) {
55
- $options[ 'error' ] = $value;
56
- }
57
- }
58
- } else {
59
- $options[ 'error' ] = 'error';
60
- }
61
- return $options;
62
- }
63
-
64
- public static function sharethis_installation_verification( $api_client ) {
65
- if ( Ga_Helper::should_verify_sharethis_installation() ) {
66
- $query_params = array(
67
- 'id' => get_option( Ga_Admin::GA_SHARETHIS_PROPERTY_ID ),
68
- 'secret' => get_option( Ga_Admin::GA_SHARETHIS_PROPERTY_SECRET )
69
- );
70
- $response = $api_client->call( 'ga_api_sharethis_installation_verification', array(
71
- $query_params
72
- ) );
73
- $result = self::get_verification_result( $response );
74
- if ( !empty( $result ) ) {
75
- add_option( Ga_Admin::GA_SHARETHIS_VERIFICATION_RESULT, true );
76
- }
77
- }
78
- }
79
-
80
- public static function get_verification_result( $response ) {
81
- $body = self::get_body( $response );
82
- if ( !empty( $body->{"status"} ) ) {
83
- return true;
84
- }
85
- return false;
86
- }
87
-
88
- public static function get_alerts( $response ) {
89
- $body = self::get_body( $response );
90
- if ( !empty( $body ) ) {
91
- if ( !empty( $body[ 'error' ] ) ) {
92
- return (object) array( 'error' => self::GA_SHARETHIS_ALERTS_ERROR );
93
- }
94
-
95
- return $body;
96
- } else {
97
- return array();
98
- }
99
- }
100
-
101
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
class/Ga_Stats.php DELETED
@@ -1,1047 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Ga_Stats class
5
- *
6
- * Preparing request and parsing response from Google Analytics Reporting Api
7
- *
8
- * @author wle@adips.com
9
- * @version 1.0
10
- */
11
- class Ga_Stats {
12
-
13
- private $profile = array();
14
-
15
- /**
16
- * Primary class constructor.
17
- *
18
- * @access public
19
- * @since 7.0.0
20
- */
21
- public function __construct() {
22
- }
23
-
24
- /**
25
- * Preparing query to get Analytics data
26
- *
27
- * @param string $query query type
28
- * @param int $id_view The Analytics view ID from which to retrieve data.
29
- * @param string $date_range The start date for the query in the format YYYY-MM-DD or '7daysAgo'
30
- * @param string $metric A metric expression
31
- * @param bool $old Use old query style.
32
- *
33
- * @return array Request query
34
- */
35
- public static function get_query( $query, $id_view, $date_range = null, $metric = null, $old = false ) {
36
- if ( $query == 'main_chart' ) {
37
- return $old ? self::main_chart_query_old($id_view, $date_range, $metric) : self::main_chart_query($id_view,
38
- $date_range, $metric);
39
- } elseif ( $query == 'gender' ) {
40
- return self::gender_chart_query($id_view, $date_range, $metric);
41
- } elseif ( $query == 'device' ) {
42
- return self::device_chart_query($id_view, $date_range, $metric);
43
- } elseif ( $query == 'age' ) {
44
- return self::age_chart_query($id_view, $date_range, $metric);
45
- } elseif ( $query == 'boxes' ) {
46
- return self::boxes_query( $id_view );
47
- } elseif ( $query == 'dashboard_boxes' ) {
48
- return $old ? self::dashboard_boxes_query_old( $id_view, $date_range ) :
49
- self::dashboard_boxes_query( $id_view, $date_range );
50
- } elseif ( $query == 'sources' ) {
51
- return self::sources_query( $id_view, $date_range );
52
- } else {
53
- return array();
54
- }
55
- }
56
-
57
- /**
58
- * Preparing query for top traffic sources table
59
- *
60
- * @param int $id_view The Analytics view ID from which to retrieve data.
61
- * @param array $date_ranges An array representing the date ranges that will be passed to chart query.
62
- * @return array Sources query
63
- */
64
- public static function sources_query( $id_view, $date_ranges ) {
65
- $reports_requests = array();
66
-
67
- if ( isset( $_GET['ts'] ) ) {
68
- $reports_requests[] = array(
69
- 'viewId' => $id_view,
70
- 'dateRanges' => $date_ranges,
71
- 'metrics' => self::set_metrics( array( 'ga:pageviews' ) ),
72
- 'includeEmptyRows' => true,
73
- 'pageSize' => 10,
74
- 'dimensions' => self::set_dimensions( 'ga:sourceMedium' ),
75
- 'orderBys' => self::set_order_bys( 'ga:pageviews', 'DESCENDING' ),
76
- );
77
- } else {
78
- $reports_requests[] = array(
79
- 'viewId' => $id_view,
80
- 'dateRanges' => $date_ranges,
81
- 'metrics' => self::set_metrics( array(
82
- 'ga:pageviews',
83
- 'ga:uniquePageviews',
84
- 'ga:timeOnPage',
85
- 'ga:bounces',
86
- 'ga:entrances',
87
- 'ga:exits'
88
- ) ),
89
- 'includeEmptyRows' => true,
90
- 'pageSize' => 10,
91
- 'dimensions' => self::set_dimensions( 'ga:pagePath' ),
92
- 'orderBys' => self::set_order_bys( 'ga:pageviews', 'DESCENDING' ),
93
- );
94
- }
95
-
96
- $query = array(
97
- 'reportRequests' => $reports_requests
98
- );
99
-
100
- return $query;
101
- }
102
-
103
- /**
104
- * Preparing query for dashboard boxes
105
- *
106
- * @param int $id_view The Analytics view ID from which to retrieve data.
107
- * @param array $date_ranges An array representing the date ranges that will be passed to chart query.
108
- *
109
- * @return array Dashboard boxes query
110
- */
111
- public static function dashboard_boxes_query( $id_view, $date_ranges ) {
112
- $reports_requests = array();
113
-
114
- if ( isset( $_GET['ts'] ) ) {
115
- $reports_requests[] = array(
116
- 'viewId' => $id_view,
117
- 'dateRanges' => $date_ranges,
118
- 'metrics' => self::set_metrics( array( 'ga:pageviews' ) ),
119
- 'includeEmptyRows' => true,
120
- 'pageSize' => 10,
121
- 'dimensions' => self::set_dimensions( 'ga:sourceMedium' ),
122
- 'orderBys' => self::set_order_bys( 'ga:pageviews', 'DESCENDING' ),
123
- );
124
- } else {
125
- $reports_requests[] = array(
126
- 'viewId' => $id_view,
127
- 'dateRanges' => $date_ranges,
128
- 'metrics' => self::set_metrics( array(
129
- 'ga:pageviews',
130
- 'ga:uniquePageviews',
131
- 'ga:timeOnPage',
132
- 'ga:bounces',
133
- 'ga:entrances',
134
- 'ga:exits'
135
- ) ),
136
- 'includeEmptyRows' => true,
137
- 'pageSize' => 10,
138
- 'dimensions' => self::set_dimensions( 'ga:pagePath' ),
139
- 'orderBys' => self::set_order_bys( 'ga:pageviews', 'DESCENDING' ),
140
- );
141
- }
142
- $query = array(
143
- 'reportRequests' => $reports_requests
144
- );
145
-
146
- return $query;
147
- }
148
-
149
- /**
150
- * Preparing query for dashboard boxes
151
- *
152
- * @param int $id_view The Analytics view ID from which to retrieve data.
153
- * @param string $date_range The start date for the query in the format YYYY-MM-DD or '7daysAgo'
154
- *
155
- * @return array Dashboard boxes query
156
- * @deprecated
157
- *
158
- */
159
- public static function dashboard_boxes_query_old($id_view, $date_range)
160
- {
161
- $reports_requests = [];
162
- $daysAgo = isset($_GET['th']) ? '30daysAgo' : '7daysAgo';
163
-
164
- if (isset($_GET['ts'])) {
165
- $reports_requests[] = [
166
- 'viewId' => $id_view,
167
- 'dateRanges' => self::set_date_ranges($daysAgo, 'yesterday'),
168
- 'metrics' => self::set_metrics(['ga:pageviews']),
169
- 'includeEmptyRows' => true,
170
- 'pageSize' => 10,
171
- 'dimensions' => self::set_dimensions('ga:sourceMedium'),
172
- 'orderBys' => self::set_order_bys('ga:pageviews', 'DESCENDING'),
173
- ];
174
- } else {
175
- $reports_requests[] = [
176
- 'viewId' => $id_view,
177
- 'dateRanges' => self::set_date_ranges($daysAgo, 'yesterday'),
178
- 'metrics' => self::set_metrics([
179
- 'ga:pageviews',
180
- 'ga:uniquePageviews',
181
- 'ga:timeOnPage',
182
- 'ga:bounces',
183
- 'ga:entrances',
184
- 'ga:exits',
185
- ]),
186
- 'includeEmptyRows' => true,
187
- 'pageSize' => 10,
188
- 'dimensions' => self::set_dimensions('ga:pagePath'),
189
- 'orderBys' => self::set_order_bys('ga:pageviews', 'DESCENDING'),
190
- ];
191
- }
192
- $query = [
193
- 'reportRequests' => $reports_requests,
194
- ];
195
-
196
- return $query;
197
- }
198
-
199
- /**
200
- * Preparing query for stats boxes
201
- *
202
- * @param int $id_view The Analytics view ID from which to retrieve data.
203
- *
204
- * @return array Boxes query
205
- */
206
- public static function boxes_query( $id_view ) {
207
- $range = isset( $_GET['th'] ) ? '30daysAgo' : '7daysAgo';
208
- $range_s_prev = isset( $_GET['th'] ) ? '60daysAgo' : '14daysAgo';
209
- $range_e_prev = isset( $_GET['th'] ) ? '31daysAgo' : '8daysAgo';
210
- $reports_requests = array();
211
- $reports_requests[] = array(
212
- 'viewId' => $id_view,
213
- 'dateRanges' => self::set_date_ranges( $range, 'yesterday', $range_s_prev, $range_e_prev ),
214
- 'metrics' => self::set_metrics( array(
215
- 'ga:users',
216
- 'ga:pageviews',
217
- 'ga:pageviewsPerSession',
218
- 'ga:BounceRate'
219
- ) ),
220
- 'includeEmptyRows' => true,
221
- 'dimensions' => self::set_dimensions( 'ga:date' )
222
- );
223
- $query = array(
224
- 'reportRequests' => $reports_requests
225
- );
226
-
227
- return $query;
228
- }
229
-
230
- /**
231
- * Preparing query for chart
232
- *
233
- * @param int $id_view The Analytics view ID from which to retrieve data.
234
- * @param array $date_ranges An array representing the date ranges that will be passed to chart query.
235
- * @param string $metric A metric expression
236
- *
237
- * @return array Chart query
238
- */
239
- public static function main_chart_query( $id_view, $date_ranges = null, $metric = null ) {
240
- if ( true === empty( $metric ) ) {
241
- $metric = 'ga:pageviews';
242
- } else {
243
- $metric = 'ga:' . $metric;
244
- }
245
-
246
- $reports_requests = array();
247
- $reports_requests[] = array(
248
- 'viewId' => $id_view,
249
- 'dateRanges' => $date_ranges,
250
- 'metrics' => self::set_metrics( $metric ),
251
- 'includeEmptyRows' => true,
252
- 'dimensions' => self::set_dimensions( 'ga:date' )
253
- );
254
- $query = array(
255
- 'reportRequests' => $reports_requests
256
- );
257
-
258
- return $query;
259
- }
260
-
261
- /**
262
- * Preparing query for chart
263
- *
264
- * @param int $id_view The Analytics view ID from which to retrieve data.
265
- * @param string $date_range The start date for the query in the format YYYY-MM-DD or '7daysAgo'
266
- * @param string $metric A metric expression
267
- *
268
- * @return array Chart query
269
- * @deprecated
270
- *
271
- */
272
- public static function main_chart_query_old($id_view, $date_range = null, $metric = null)
273
- {
274
- if (empty($date_range)) {
275
- $date_ranges = self::set_date_ranges('7daysAgo', 'yesterday', '14daysAgo', '8daysAgo');
276
- } else {
277
- $date_ranges = self::set_date_ranges($date_range, 'yesterday', '14daysAgo', '8daysAgo');
278
- }
279
-
280
- if (empty($metric)) {
281
- $metric = 'ga:pageviews';
282
- } else {
283
- $metric = 'ga:' . $metric;
284
- }
285
-
286
- $reports_requests = [];
287
- $reports_requests[] = [
288
- 'viewId' => $id_view,
289
- 'dateRanges' => $date_ranges,
290
- 'metrics' => self::set_metrics($metric),
291
- 'includeEmptyRows' => true,
292
- 'dimensions' => self::set_dimensions('ga:date'),
293
- ];
294
- $query = [
295
- 'reportRequests' => $reports_requests,
296
- ];
297
-
298
- return $query;
299
- }
300
-
301
- /**
302
- * Preparing query for gender chart
303
- *
304
- * @param int $id_view The Analytics view ID from which to retrieve data.
305
- * @param array $date_ranges An array representing the date ranges that will be passed to chart query.
306
- * @param string $metric A metric expression
307
- *
308
- * @return array Chart query
309
- */
310
- public static function gender_chart_query( $id_view, $date_ranges = null, $metric = null ) {
311
- if ( true === empty( $date_ranges ) ) {
312
- $date_ranges = self::set_date_ranges( '7daysAgo', 'yesterday', '14daysAgo', '8daysAgo' );
313
- }
314
-
315
- $reports_requests = array();
316
- $reports_requests[] = array(
317
- 'viewId' => $id_view,
318
- 'dateRanges' => $date_ranges,
319
- 'metrics' => self::set_metrics( 'ga:sessions' ),
320
- 'includeEmptyRows' => true,
321
- 'dimensions' => self::set_dimensions( 'ga:userGender' )
322
- );
323
- $query = array(
324
- 'reportRequests' => $reports_requests
325
- );
326
-
327
- return $query;
328
- }
329
-
330
- /**
331
- * Preparing query for device chart.
332
- *
333
- * @param int $id_view The Analytics view ID from which to retrieve data.
334
- * @param array $date_ranges An array representing the date ranges that will be passed to chart query.
335
- * @param string $metric A metric expression
336
- *
337
- * @return array Chart query
338
- * @since 2.5.2
339
- */
340
- public static function device_chart_query( $id_view, $date_ranges = null, $metric = null ) {
341
- return array(
342
- 'reportRequests' => array(
343
- array(
344
- 'viewId' => $id_view,
345
- 'dateRanges' => $date_ranges,
346
- 'metrics' => self::set_metrics( 'ga:sessions' ),
347
- 'includeEmptyRows' => true,
348
- 'dimensions' => self::set_dimensions( 'ga:deviceCategory' )
349
- )
350
- )
351
- );
352
- }
353
-
354
- /**
355
- * Preparing query for age chart
356
- *
357
- * @param int $id_view The Analytics view ID from which to retrieve data.
358
- * @param array $date_ranges An array representing the date ranges that will be passed to chart query.
359
- * @param string $metric A metric expression
360
- *
361
- * @return array Chart query
362
- */
363
- public static function age_chart_query( $id_view, $date_ranges = null, $metric = null ) {
364
- if ( true === empty( $date_ranges ) ) {
365
- $date_ranges = self::set_date_ranges( '7daysAgo', 'yesterday', '14daysAgo', '8daysAgo' );
366
- }
367
-
368
- $reports_requests = array();
369
- $reports_requests[] = array(
370
- 'viewId' => $id_view,
371
- 'dateRanges' => $date_ranges,
372
- 'metrics' => self::set_metrics( 'ga:sessions' ),
373
- 'includeEmptyRows' => true,
374
- 'dimensions' => self::set_dimensions( 'ga:userAgeBracket' )
375
- );
376
- $query = array(
377
- 'reportRequests' => $reports_requests
378
- );
379
-
380
- return $query;
381
- }
382
-
383
- /**
384
- * Setting order for requests
385
- *
386
- * @param string $name The field which to sort by. The default sort order is ascending. Example: ga:browser.
387
- * @param string $sort The sorting order for the field. 'ASCENDING' or 'DESCENDING'
388
- *
389
- * @return array OrderBys
390
- */
391
- public static function set_order_bys( $name, $sort ) {
392
- $order = array();
393
- $order[] = array(
394
- 'fieldName' => $name,
395
- 'sortOrder' => $sort,
396
- );
397
-
398
- return $order;
399
- }
400
-
401
- /**
402
- * Setting metrics for requests
403
- *
404
- * @param mixed $expression A metric expression or array of expressions
405
- *
406
- * @return array Metrics
407
- */
408
- public static function set_metrics( $expression ) {
409
- $metrics = array();
410
- if ( is_array( $expression ) ) {
411
- foreach ( $expression as $exp ) {
412
- $metrics[] = array(
413
- 'expression' => $exp
414
- );
415
- }
416
- } else {
417
- $metrics[] = array(
418
- 'expression' => $expression
419
- );
420
- }
421
-
422
- return $metrics;
423
- }
424
-
425
- /**
426
- * Setting dimensions for requests
427
- *
428
- * @param string $name Name of the dimension to fetch, for example ga:browser.
429
- *
430
- * @return array Dimensions
431
- */
432
- public static function set_dimensions( $name ) {
433
- $dimensions = array();
434
- $dimensions[] = array(
435
- 'name' => $name
436
- );
437
-
438
- return $dimensions;
439
- }
440
-
441
- /**
442
- * Setting date ranges for requests
443
- *
444
- * @param string $start_date The start date for the query in the format YYYY-MM-DD.
445
- * @param string $end_date The end date for the query in the format YYYY-MM-DD.
446
- * @param string $prev_start_date The start date (second range) for the query in the format YYYY-MM-DD.
447
- * @param string $prev_end_date The start date (second range) for the query in the format YYYY-MM-DD.
448
- *
449
- * @return array Date ranges
450
- */
451
- public static function set_date_ranges( $start_date, $end_date, $prev_start_date = '', $prev_end_date = '' ) {
452
- $date_danges = array();
453
- $date_danges[] = array(
454
- 'startDate' => $start_date,
455
- 'endDate' => $end_date,
456
- );
457
- if ( !empty( $prev_start_date ) and ! empty( $prev_end_date ) ) {
458
- $date_danges[] = array(
459
- 'startDate' => $prev_start_date,
460
- 'endDate' => $prev_end_date,
461
- );
462
- }
463
-
464
- return $date_danges;
465
- }
466
-
467
- /**
468
- * Preparing response for data received from analytics
469
- *
470
- * @param array $data Analytics response
471
- *
472
- * @return array Response rows
473
- */
474
- public static function prepare_response( $data ) {
475
- $data = self::get_reports_from_response( $data );
476
- self::handle_more_reports( $data );
477
- $report = self::get_single_report( $data );
478
- self::get_report_column_header( $report );
479
- $report_data = self::get_report_data( $report );
480
- self::get_totals( $report_data );
481
- self::get_row_count( $report_data );
482
- $rows = self::get_rows( $report_data );
483
-
484
- return $rows;
485
- }
486
-
487
- /**
488
- * Get dimensions from response row
489
- *
490
- * @param array $row Analytics response row
491
- *
492
- * @return array|bool Dimensions
493
- */
494
- public static function get_dimensions( $row ) {
495
- if ( !empty( $row[ 'dimensions' ] ) ) {
496
- return $row[ 'dimensions' ];
497
- }
498
-
499
- return false;
500
- }
501
-
502
- /**
503
- * Get metrics from response row
504
- *
505
- * @param array $row Analytics response row
506
- *
507
- * @return array|bool Metrics
508
- */
509
- public static function get_metrics( $row ) {
510
- if ( !empty( $row[ 'metrics' ] ) ) {
511
- return $row[ 'metrics' ];
512
- }
513
-
514
- return false;
515
- }
516
-
517
- /**
518
- * Get row from response report data
519
- *
520
- * @param array $report_data Analytics response report data
521
- *
522
- * @return array|bool Rows
523
- */
524
- public static function get_rows( $report_data ) {
525
- if ( !empty( $report_data[ 'rows' ] ) ) {
526
- return $report_data[ 'rows' ];
527
- }
528
-
529
- return false;
530
- }
531
-
532
- /**
533
- * Get row count from response report data
534
- *
535
- * @param array $report_data Analytics response report data
536
- *
537
- * @return array|bool Row count
538
- */
539
- public static function get_row_count( $report_data ) {
540
- if ( !empty( $report_data[ 'rowCount' ] ) ) {
541
- return $report_data[ 'rowCount' ];
542
- }
543
-
544
- return false;
545
- }
546
-
547
- /**
548
- * Get totals from response report data
549
- *
550
- * @param array $report_data Analytics response report data
551
- *
552
- * @return array|bool Totals
553
- */
554
- public static function get_totals( $report_data ) {
555
- if ( !empty( $report_data[ 'totals' ] ) ) {
556
- return $report_data[ 'totals' ];
557
- }
558
-
559
- return false;
560
- }
561
-
562
- /**
563
- * Get reports from response data
564
- *
565
- * @param array $data Analytics response data
566
- *
567
- * @return array|bool Reports
568
- */
569
- public static function get_reports_from_response( $data ) {
570
- if ( !empty( $data[ 'reports' ] ) ) {
571
- return $data[ 'reports' ];
572
- }
573
-
574
- return false;
575
- }
576
-
577
- /**
578
- * Show info for multiple data
579
- *
580
- * @param array $data Analytics response data
581
- *
582
- */
583
- public static function handle_more_reports( $data ) {
584
- if ( count( $data ) > 1 ) {
585
- echo 'more than one report';
586
- }
587
- }
588
-
589
- /**
590
- * Show info for multiple rows
591
- *
592
- * @param array $rows Analytics response rows
593
- *
594
- */
595
- public static function handle_more_rows( $rows ) {
596
- if ( count( $rows ) > 1 ) {
597
- echo 'more than one row';
598
- }
599
- }
600
-
601
- /**
602
- * Get single report from response data
603
- *
604
- * @param array $data Analytics response data
605
- *
606
- * @return array|bool Report
607
- */
608
- public static function get_single_report( $data ) {
609
- if ( !empty( $data ) ) {
610
- foreach ( $data as $report ) {
611
- if ( !empty( $report ) ) {
612
- return $report;
613
- }
614
- }
615
- }
616
-
617
- return false;
618
- }
619
-
620
- /**
621
- * Get single row from response data rows
622
- *
623
- * @param array $rows Analytics response data rows
624
- *
625
- * @return array|bool Row
626
- */
627
- public static function get_single_row( $rows ) {
628
- if ( !empty( $rows ) ) {
629
- foreach ( $rows as $row ) {
630
- if ( !empty( $row ) ) {
631
- return $row;
632
- }
633
- }
634
- }
635
-
636
- return false;
637
- }
638
-
639
- /**
640
- * Get column header from response data
641
- *
642
- * @param array $data Analytics response data
643
- *
644
- * @return array Column header
645
- */
646
- public static function get_report_column_header( $data ) {
647
- if ( !empty( $data[ 'columnHeader' ] ) ) {
648
- return $data[ 'columnHeader' ];
649
- }
650
-
651
- return false;
652
- }
653
-
654
- /**
655
- * Get report data from response data
656
- *
657
- * @param array $data Analytics response data
658
- *
659
- * @return array data
660
- */
661
- public static function get_report_data( $data ) {
662
- if ( !empty( $data[ 'data' ] ) ) {
663
- return $data[ 'data' ];
664
- }
665
-
666
- return false;
667
- }
668
-
669
- /**
670
- * Get chart from response data
671
- *
672
- * @param array $response_data Analytics response data
673
- *
674
- * @return array chart data
675
- */
676
- public static function get_chart( $response_data, $period_in_days = 7 ) {
677
- $chart_data = array();
678
- if ( ! empty( $response_data ) ) {
679
- $data = ( ! empty( $response_data['reports'] ) && ! empty( $response_data['reports'][0] ) && ! empty( $response_data['reports'][0]['data'] ) ) ? $response_data['reports'][0]['data'] : array();
680
- $rows = ( ! empty( $data['rows'] ) ) ? $data['rows'] : array();
681
- if ( ! empty( $rows ) ) {
682
- foreach ( $rows as $key => $row ) {
683
- if ( $key < $period_in_days ) {
684
- $chart_data[ $key ]['previous'] = ! empty( $row['metrics'][1]['values'][0] ) ? $row['metrics'][1]['values'][0] : 0;
685
- $chart_data[ $key ]['previous-day'] = date( 'M j', strtotime( $row['dimensions'][0] ) );
686
- } else {
687
- $chart_data[ $key - $period_in_days ]['day'] = date( 'M j', strtotime( $row['dimensions'][0] ) );
688
- $chart_data[ $key - $period_in_days ]['current'] = ! empty( $row['metrics'][0]['values'][0] ) ? $row['metrics'][0]['values'][0] : 0;
689
- $chart_data['date'] = strtotime( $row['dimensions'][0] );
690
- }
691
- }
692
- }
693
- }
694
-
695
- return $chart_data;
696
- }
697
-
698
- /**
699
- * Get gender chart from response data
700
- *
701
- * @param array $response_data Analytics response data
702
- *
703
- * @return array chart data
704
- */
705
- public static function get_gender_chart( $response_data ) {
706
- $chart_data = [];
707
- if ( !empty( $response_data ) ) {
708
- $data = (!empty( $response_data[ 'reports' ] ) && !empty( $response_data[ 'reports' ][ 0 ] ) && !empty( $response_data[ 'reports' ][ 0 ][ 'data' ] ) ) ? $response_data[ 'reports' ][ 0 ][ 'data' ] : array();
709
- $rows = (!empty( $data[ 'rows' ] ) ) ? $data[ 'rows' ] : array();
710
- if ( !empty( $rows ) ) {
711
- foreach ( $rows as $key => $row ) {
712
- $chart_data[$row['dimensions'][0]] = self::get_metric_value($row['metrics']);
713
- }
714
- }
715
- }
716
-
717
- return $chart_data;
718
- }
719
-
720
- /**
721
- * Get device chart from response data.
722
- *
723
- * @param array $response_data Analytics response data array.
724
- *
725
- * @return array Chart data array.
726
- */
727
- public static function get_device_chart( $response_data ) {
728
- $chart_data = [];
729
- if ( false === empty( $response_data ) ) {
730
- $data = (false === empty( $response_data[ 'reports' ] ) && !empty( $response_data[ 'reports' ][ 0 ] ) && !empty( $response_data[ 'reports' ][ 0 ][ 'data' ] ) ) ? $response_data[ 'reports' ][ 0 ][ 'data' ] : array();
731
- $rows = ( false === empty( $data['rows'] ) ) ? $data['rows'] : array();
732
- if ( false === empty( $rows ) ) {
733
- foreach ( $rows as $row ) {
734
- $chart_data[$row['dimensions'][0]] = self::get_metric_value($row['metrics']);
735
- }
736
- }
737
- }
738
-
739
- return $chart_data;
740
- }
741
-
742
- /**
743
- * Get the value of metric data response.
744
- *
745
- * @param $metrics
746
- *
747
- * @return mixed
748
- */
749
- private static function get_metric_value($metrics)
750
- {
751
- if (is_array($metrics)) {
752
- foreach($metrics as $metric) {
753
- $values[] = $metric['values'][0];
754
- }
755
- }
756
-
757
- return $values[0];
758
- }
759
-
760
- /**
761
- * Get gender chart from response data
762
- *
763
- * @param array $response_data Analytics response data
764
- *
765
- * @return array chart data
766
- */
767
- public static function get_age_chart( $response_data ) {
768
- $chart_data = [];
769
- if ( !empty( $response_data ) ) {
770
- $data = (!empty( $response_data[ 'reports' ] ) && !empty( $response_data[ 'reports' ][ 0 ] ) && !empty( $response_data[ 'reports' ][ 0 ][ 'data' ] ) ) ? $response_data[ 'reports' ][ 0 ][ 'data' ] : array();
771
- $rows = (!empty( $data[ 'rows' ] ) ) ? $data[ 'rows' ] : array();
772
- if ( !empty( $rows ) ) {
773
- foreach ( $rows as $key => $row ) {
774
- $chart_data[$row['dimensions'][0]] = self::get_metric_value($row['metrics']);
775
- }
776
- }
777
- }
778
-
779
- return $chart_data;
780
- }
781
-
782
- /**
783
- * Get dasboard chart from response data
784
- *
785
- * @param array $response_data Analytics response data
786
- *
787
- * @return array dashboard chart data
788
- */
789
- public static function get_dashboard_chart( $response_data ) {
790
- $chart_data = array();
791
- if ( !empty( $response_data ) ) {
792
- $data = (!empty( $response_data[ 'reports' ] ) && !empty( $response_data[ 'reports' ][ 0 ] ) && !empty( $response_data[ 'reports' ][ 0 ][ 'data' ] ) ) ? $response_data[ 'reports' ][ 0 ][ 'data' ] : array();
793
- $rows = (!empty( $data[ 'rows' ] ) ) ? $data[ 'rows' ] : array();
794
- if ( !empty( $rows ) ) {
795
- foreach ( $rows as $row ) {
796
- $chart_data[] = array(
797
- 'day' => date( 'M j', strtotime( $row[ 'dimensions' ][ 0 ] ) ),
798
- 'current' => !empty( $row[ 'metrics' ][ 0 ][ 'values' ][ 0 ] ) ? $row[ 'metrics' ][ 0 ][ 'values' ][ 0 ] : 0
799
- );
800
- }
801
- }
802
- }
803
-
804
- return $chart_data;
805
- }
806
-
807
- /**
808
- * Get boxes from response data
809
- *
810
- * @param array $data Analytics response data
811
- *
812
- * @return array boxes data
813
- */
814
- public static function get_boxes( $data ) {
815
- if ( !empty( $data ) ) {
816
- $data = self::get_reports_from_response( $data );
817
- self::handle_more_reports( $data );
818
- $report = self::get_single_report( $data );
819
- self::get_report_column_header( $report );
820
- $report_data = self::get_report_data( $report );
821
- $totals = self::get_totals( $report_data );
822
-
823
- return self::get_boxes_from_totals( $totals );
824
- }
825
- }
826
-
827
- /**
828
- * Get boxes from totals
829
- *
830
- * @param array $totals Analytics response totals
831
- *
832
- * @return array boxes data
833
- */
834
- public static function get_boxes_from_totals( $totals ) {
835
- if ( !empty( $totals ) ) {
836
- $boxes_data = array();
837
- foreach ( $totals as $key => $total ) {
838
- if ( $key == 0 ) {
839
- $boxes_data[ 'Users' ][ 'current' ] = $total[ 'values' ][ 0 ];
840
- $boxes_data[ 'Pageviews' ][ 'current' ] = $total[ 'values' ][ 1 ];
841
- $boxes_data[ 'PageviewsPerSession' ][ 'current' ] = $total[ 'values' ][ 2 ];
842
- $boxes_data[ 'BounceRate' ][ 'current' ] = round( $total[ 'values' ][ 3 ], 2 );
843
- } else {
844
- $boxes_data[ 'Users' ][ 'previous' ] = $total[ 'values' ][ 0 ];
845
- $boxes_data[ 'Pageviews' ][ 'previous' ] = $total[ 'values' ][ 1 ];
846
- $boxes_data[ 'PageviewsPerSession' ][ 'previous' ] = $total[ 'values' ][ 2 ];
847
- $boxes_data[ 'BounceRate' ][ 'previous' ] = round( $total[ 'values' ][ 3 ], 2 );
848
- }
849
- }
850
-
851
- return self::prepare_boxes( $boxes_data );
852
- }
853
-
854
- return false;
855
- }
856
-
857
- /**
858
- * Prepare boxes data
859
- *
860
- * @param array $boxes_data Boxes data
861
- *
862
- * @return array boxes data
863
- */
864
- public static function prepare_boxes( $boxes_data ) {
865
- $boxes_data[ 'Users' ][ 'diff' ] = ( $boxes_data[ 'Users' ][ 'previous' ] > 0 ) ? round( ( $boxes_data[ 'Users' ][ 'current' ] - $boxes_data[ 'Users' ][ 'previous' ] ) / $boxes_data[ 'Users' ][ 'previous' ] * 100, 2 ) : 100;
866
- $boxes_data[ 'Pageviews' ][ 'diff' ] = ( $boxes_data[ 'Pageviews' ][ 'previous' ] > 0 ) ? round( ( $boxes_data[ 'Pageviews' ][ 'current' ] - $boxes_data[ 'Pageviews' ][ 'previous' ] ) / $boxes_data[ 'Pageviews' ][ 'previous' ] * 100, 2 ) : 100;
867
- $boxes_data[ 'PageviewsPerSession' ][ 'diff' ] = ( $boxes_data[ 'PageviewsPerSession' ][ 'previous' ] > 0 ) ? round( ( $boxes_data[ 'PageviewsPerSession' ][ 'current' ] - $boxes_data[ 'PageviewsPerSession' ][ 'previous' ] ) / $boxes_data[ 'PageviewsPerSession' ][ 'previous' ] * 100, 2 ) : 100;
868
- $boxes_data[ 'BounceRate' ][ 'diff' ] = ( $boxes_data[ 'BounceRate' ][ 'previous' ] > 0 ) ? round( ( $boxes_data[ 'BounceRate' ][ 'current' ] - $boxes_data[ 'BounceRate' ][ 'previous' ] ) / $boxes_data[ 'BounceRate' ][ 'previous' ] * 100, 2 ) : 100;
869
- $boxes_data[ 'Users' ][ 'diff' ] = ( $boxes_data[ 'Users' ][ 'previous' ] == 0 && $boxes_data[ 'Users' ][ 'current' ] == 0 ) ? 0 : $boxes_data[ 'Users' ][ 'diff' ];
870
- $boxes_data[ 'Pageviews' ][ 'diff' ] = ( $boxes_data[ 'Pageviews' ][ 'previous' ] == 0 && $boxes_data[ 'Pageviews' ][ 'current' ] == 0 ) ? 0 : $boxes_data[ 'Pageviews' ][ 'diff' ];
871
- $boxes_data[ 'PageviewsPerSession' ][ 'diff' ] = ( $boxes_data[ 'PageviewsPerSession' ][ 'previous' ] == 0 && $boxes_data[ 'PageviewsPerSession' ][ 'current' ] == 0 ) ? 0 : $boxes_data[ 'PageviewsPerSession' ][ 'diff' ];
872
- $boxes_data[ 'BounceRate' ][ 'diff' ] = ( $boxes_data[ 'BounceRate' ][ 'previous' ] == 0 && $boxes_data[ 'BounceRate' ][ 'current' ] == 0 ) ? 0 : $boxes_data[ 'BounceRate' ][ 'diff' ];
873
- $boxes_data[ 'Users' ][ 'label' ] = 'Users';
874
- $boxes_data[ 'Pageviews' ][ 'label' ] = 'Pageviews';
875
- $boxes_data[ 'PageviewsPerSession' ][ 'label' ] = 'Pages / Session';
876
- $boxes_data[ 'BounceRate' ][ 'label' ] = 'Bounce Rate';
877
- $boxes_data[ 'Users' ][ 'comparison' ] = $boxes_data[ 'Users' ][ 'current' ] . ' vs ' . $boxes_data[ 'Users' ][ 'previous' ];
878
- $boxes_data[ 'Pageviews' ][ 'comparison' ] = $boxes_data[ 'Pageviews' ][ 'current' ] . ' vs ' . $boxes_data[ 'Pageviews' ][ 'previous' ];
879
- $boxes_data[ 'PageviewsPerSession' ][ 'comparison' ] = self::number_format_clean( $boxes_data[ 'PageviewsPerSession' ][ 'current' ], 2, '.', ',' ) . ' vs ' . self::number_format_clean( $boxes_data[ 'PageviewsPerSession' ][ 'previous' ], 2, '.', ',' );
880
- $boxes_data[ 'BounceRate' ][ 'comparison' ] = self::number_format_clean( $boxes_data[ 'BounceRate' ][ 'current' ], 2, '.', ',' ) . '% vs ' . self::number_format_clean( $boxes_data[ 'BounceRate' ][ 'previous' ], 2, '.', ',' ) . '%';
881
- $boxes_data[ 'Users' ][ 'color' ] = ( $boxes_data[ 'Users' ][ 'diff' ] > 0 ) ? 'green' : 'red';
882
- $boxes_data[ 'Pageviews' ][ 'color' ] = ( $boxes_data[ 'Pageviews' ][ 'diff' ] > 0 ) ? 'green' : 'red';
883
- $boxes_data[ 'PageviewsPerSession' ][ 'color' ] = ( $boxes_data[ 'PageviewsPerSession' ][ 'diff' ] > 0 ) ? 'green' : 'red';
884
- $boxes_data[ 'BounceRate' ][ 'color' ] = ( $boxes_data[ 'BounceRate' ][ 'diff' ] > 0 ) ? 'red' : 'green';
885
- $boxes_data[ 'Users' ][ 'color' ] = ( $boxes_data[ 'Users' ][ 'diff' ] != 0 ) ? $boxes_data[ 'Users' ][ 'color' ] : 'black';
886
- $boxes_data[ 'Pageviews' ][ 'color' ] = ( $boxes_data[ 'Pageviews' ][ 'diff' ] != 0 ) ? $boxes_data[ 'Pageviews' ][ 'color' ] : 'black';
887
- $boxes_data[ 'PageviewsPerSession' ][ 'color' ] = ( $boxes_data[ 'PageviewsPerSession' ][ 'diff' ] != 0 ) ? $boxes_data[ 'PageviewsPerSession' ][ 'color' ] : 'black';
888
- $boxes_data[ 'BounceRate' ][ 'color' ] = ( $boxes_data[ 'BounceRate' ][ 'diff' ] != 0 ) ? $boxes_data[ 'BounceRate' ][ 'color' ] : 'black';
889
-
890
- return $boxes_data;
891
- }
892
-
893
- /**
894
- * Number format for boxes
895
- *
896
- * @param float $number Number to format
897
- * @param int $precision Precision
898
- * @param string $dec_point Decimal point
899
- * @param string $thousands_sep Thousands Separator
900
- *
901
- * @return string clean number format
902
- */
903
- public static function number_format_clean( $number, $precision = 0, $dec_point = '.', $thousands_sep = ',' ) {
904
- if ( $number == 0 ) {
905
- return 0;
906
- } else {
907
- $format = number_format( $number, $precision, $dec_point, $thousands_sep );
908
- if ( substr( $format, 2 ) == '.00' ) {
909
- return substr( $format, 0, - 3 );
910
- }
911
-
912
- return $format;
913
- }
914
- }
915
-
916
- /**
917
- * Get sources from analytics response data
918
- *
919
- * @param array $data Analytics response data
920
- *
921
- * @return array|bool sources data
922
- */
923
- public static function get_sources( $data ) {
924
- if ( !empty( $data ) ) {
925
- $data = self::get_reports_from_response( $data );
926
- self::handle_more_reports( $data );
927
- $report = self::get_single_report( $data );
928
- self::get_report_column_header( $report );
929
- $report_data = self::get_report_data( $report );
930
- $rows = self::get_rows( $report_data );
931
- $totals = self::get_totals( $report_data );
932
- $totalCount = array();
933
- if ( !empty( $totals ) ) {
934
- foreach ( $totals as $key => $total ) {
935
- $totalCount = $total[ 'values' ][ 0 ];
936
- }
937
- }
938
- $sources = array(
939
- 'total' => $totalCount,
940
- 'sum' => 0,
941
- 'rows' => array(),
942
- );
943
- if ( !empty( $rows ) ) {
944
- $i = 1;
945
- foreach ( $rows as $row ) {
946
- if ( !empty( $row ) ) {
947
- foreach ( $row as $key => $value ) {
948
- if ( $key == 'dimensions' ) {
949
- $sources[ 'rows' ][ $i ][ 'name' ] = $value[ 0 ];
950
- $sources[ 'rows' ][ $i ][ 'url' ] = $value[ 0 ];
951
- } elseif ( $key == 'metrics' ) {
952
- $sources[ 'rows' ][ $i ][ 'number' ] = $value[ 0 ][ 'values' ][ 0 ];
953
- $sources[ 'rows' ][ $i ][ 'percent' ] = (!empty( $totalCount ) ) ? round( $value[ 0 ][ 'values' ][ 0 ] / $totalCount * 100, 2 ) : 0;
954
- $sources[ 'sum' ] += $value[ 0 ][ 'values' ][ 0 ];
955
- }
956
- }
957
- $i ++;
958
- }
959
- }
960
- }
961
-
962
- return $sources;
963
- }
964
-
965
- return false;
966
- }
967
-
968
- /**
969
- * Get dashboard boxes data from analytics response data
970
- *
971
- * @param array $data Analytics response data
972
- *
973
- * @return array dashboard boxes data
974
- */
975
- public static function get_dashboard_boxes_data( $data ) {
976
- if ( !empty( $data ) ) {
977
- $data = self::get_reports_from_response( $data );
978
- self::handle_more_reports( $data );
979
- $report = self::get_single_report( $data );
980
- self::get_report_column_header( $report );
981
- $report_data = self::get_report_data( $report );
982
- $totals = self::get_totals( $report_data );
983
- $boxes_data = array();
984
- $boxes_data[ 'Sessions' ] = array(
985
- 'label' => 'Visits',
986
- 'value' => $totals[ 0 ][ 'values' ][ 0 ],
987
- );
988
- $boxes_data[ 'Pageviews' ] = array(
989
- 'label' => 'Pageviews',
990
- 'value' => $totals[ 0 ][ 'values' ][ 1 ],
991
- );
992
- $boxes_data[ 'pageviewsPerSession' ] = array(
993
- 'label' => 'Pages / Visit',
994
- 'value' => self::number_format_clean( $totals[ 0 ][ 'values' ][ 2 ], 2, '.', ',' ),
995
- );
996
- $boxes_data[ 'BounceRate' ] = array(
997
- 'label' => 'Bounce Rate',
998
- 'value' => self::number_format_clean( $totals[ 0 ][ 'values' ][ 3 ], 2, '.', ',' ) . '%',
999
- );
1000
- $boxes_data[ 'avgTimeOnPage' ] = array(
1001
- 'label' => 'Avg. Time on Site',
1002
- 'value' => gmdate( "H:i:s", $totals[ 0 ][ 'values' ][ 4 ] ),
1003
- );
1004
- $boxes_data[ 'percentNewSessions' ] = array(
1005
- 'label' => '% of New Visits',
1006
- 'value' => self::number_format_clean( $totals[ 0 ][ 'values' ][ 5 ], 2, '.', ',' ),
1007
- );
1008
-
1009
- return $boxes_data;
1010
- }
1011
- }
1012
-
1013
- /**
1014
- * Get Empty Boxes Structure.
1015
- *
1016
- * @return array Array of empty boxes structure values.
1017
- */
1018
- public static function get_empty_boxes_structure() {
1019
- $boxes_data = array();
1020
- $boxes_data[ 'Sessions' ] = array(
1021
- 'label' => 'Visits',
1022
- 'value' => 0,
1023
- );
1024
- $boxes_data[ 'Pageviews' ] = array(
1025
- 'label' => 'Pageviews',
1026
- 'value' => 0,
1027
- );
1028
- $boxes_data[ 'pageviewsPerSession' ] = array(
1029
- 'label' => 'Pages / Visit',
1030
- 'value' => self::number_format_clean( 0, 2, '.', ',' ),
1031
- );
1032
- $boxes_data[ 'BounceRate' ] = array(
1033
- 'label' => 'Bounce Rate',
1034
- 'value' => self::number_format_clean( 0, 2, '.', ',' ) . '%',
1035
- );
1036
- $boxes_data[ 'avgTimeOnPage' ] = array(
1037
- 'label' => 'Avg. Time on Site',
1038
- 'value' => gmdate( "H:i:s", 0 ),
1039
- );
1040
- $boxes_data[ 'percentNewSessions' ] = array(
1041
- 'label' => '% of New Visits',
1042
- 'value' => self::number_format_clean( 0, 2, '.', ',' ),
1043
- );
1044
-
1045
- return $boxes_data;
1046
- }
1047
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
class/Ga_Template.php DELETED
@@ -1,73 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Class Ga_Template
5
- */
6
- class Ga_Template {
7
- /**
8
- * @var array Array of template properties.
9
- */
10
- protected $props;
11
-
12
- /**
13
- * @var string Relative path in view/ folder.
14
- */
15
- protected $path;
16
-
17
- /**
18
- * Ga_Template constructor.
19
- *
20
- * @param string $path Relative path in view/ folder.
21
- * @param array $props Array of props to be passed to the template.
22
- */
23
- public function __construct( $path, $props = [] ) {
24
- $this->path = $path;
25
- $this->props = $props;
26
- }
27
-
28
- /**
29
- * Include rendered template inline.
30
- *
31
- * @param string $path Relative path in view/ folder.
32
- * @param array $props Array of props to be passed to the template.
33
- */
34
- public static function load( $path, $props = [] ) {
35
- ( new static( $path, $props ) )->includeTemplate();
36
- }
37
-
38
- /**
39
- * Get rendered template.
40
- *
41
- * @param string $path Relative path in view/ folder.
42
- * @param array $props Array of props to be passed to the template.
43
- *
44
- * @return string Rendered template.
45
- */
46
- public static function render( $path, $props = [] ) {
47
- return ( new static( $path, $props ) )->renderTemplate();
48
- }
49
-
50
- /**
51
- * Include template.
52
- */
53
- public function includeTemplate() {
54
- $template_path = GA_PLUGIN_DIR . '/view/' . $this->path . '.php';
55
-
56
- if ( is_readable( $template_path ) ) {
57
- load_template( $template_path, false, $this->props );
58
- }
59
- }
60
-
61
- /**
62
- * Get rendered template.
63
- *
64
- * @return string
65
- */
66
- public function renderTemplate() {
67
- ob_start();
68
- $this->includeTemplate();
69
- $render = ob_get_contents();
70
-
71
- return $render ?: '';
72
- }
73
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
class/class-ga-admin.php ADDED
@@ -0,0 +1,1228 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Google Analytics admin class.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ /**
9
+ * Admin class.
10
+ */
11
+ class Ga_Admin {
12
+
13
+ const GA_WEB_PROPERTY_ID_OPTION_NAME = 'googleanalytics_web_property_id';
14
+ const GA_EXCLUDE_ROLES_OPTION_NAME = 'googleanalytics_exclude_roles';
15
+ const GA_SHARETHIS_TERMS_OPTION_NAME = 'googleanalytics_sharethis_terms';
16
+ const GA_HIDE_TERMS_OPTION_NAME = 'googleanalytics_hide_terms';
17
+ const GA_VERSION_OPTION_NAME = 'googleanalytics_version';
18
+ const GA_SELECTED_ACCOUNT = 'googleanalytics_selected_account';
19
+ const GA_OAUTH_AUTH_CODE_OPTION_NAME = 'googleanalytics_oauth_auth_code';
20
+ const GA_OAUTH_AUTH_TOKEN_OPTION_NAME = 'googleanalytics_oauth_auth_token';
21
+ const GA_ACCOUNT_DATA_OPTION_NAME = 'googleanalytics_account_data';
22
+ const GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME = 'googleanalytics_web_property_id_manually';
23
+ const GA_WEB_PROPERTY_ID_MANUALLY_VALUE_OPTION_NAME = 'googleanalytics_web_property_id_manually_value';
24
+ const GA_SHARETHIS_PROPERTY_ID = 'googleanalytics_sherethis_property_id';
25
+ const GA_SHARETHIS_PROPERTY_SECRET = 'googleanalytics_sherethis_property_secret';
26
+ const GA_SHARETHIS_VERIFICATION_RESULT = 'googleanalytics_sherethis_verification_result';
27
+ const MIN_WP_VERSION = '3.8';
28
+ const GA_SHARETHIS_API_ALIAS = 'sharethis';
29
+ const GA_DISABLE_ALL_FEATURES = 'googleanalytics_disable_all_features';
30
+ const GA_HEARTBEAT_API_CACHE_UPDATE = false;
31
+ const NOTICE_SUCCESS = 'success';
32
+ const NOTICE_WARNING = 'warning';
33
+ const NOTICE_ERROR = 'error';
34
+
35
+ /**
36
+ * Instantiate API client.
37
+ *
38
+ * @param string $type Type string.
39
+ *
40
+ * @return Ga_Lib_Google_Api_Client|null
41
+ */
42
+ public static function api_client( $type = '' ) {
43
+ if ( self::GA_SHARETHIS_API_ALIAS === $type ) {
44
+ $instance = Ga_Lib_Sharethis_Api_Client::get_instance();
45
+ } else {
46
+ $instance = Ga_Lib_Google_Api_Client::get_instance();
47
+ $token = Ga_Helper::get_option( self::GA_OAUTH_AUTH_TOKEN_OPTION_NAME );
48
+ try {
49
+ if ( ! empty( $token ) ) {
50
+ $token = json_decode( $token, true );
51
+ $instance->set_access_token( $token );
52
+ }
53
+ } catch ( Exception $e ) {
54
+ Ga_Helper::ga_oauth_notice( $e->getMessage() );
55
+ }
56
+ }
57
+
58
+ return $instance;
59
+ }
60
+
61
+ /**
62
+ * Initializes plugin's options during plugin activation process.
63
+ */
64
+ public static function activate_googleanalytics() {
65
+ add_option( self::GA_WEB_PROPERTY_ID_OPTION_NAME, Ga_Helper::GA_DEFAULT_WEB_ID );
66
+ add_option( self::GA_EXCLUDE_ROLES_OPTION_NAME, wp_json_encode( array() ) );
67
+ add_option( self::GA_VERSION_OPTION_NAME );
68
+ add_option( self::GA_OAUTH_AUTH_CODE_OPTION_NAME );
69
+ add_option( self::GA_OAUTH_AUTH_TOKEN_OPTION_NAME );
70
+ add_option( self::GA_ACCOUNT_DATA_OPTION_NAME );
71
+ add_option( self::GA_SELECTED_ACCOUNT );
72
+ add_option( self::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME, '0' );
73
+ add_option( self::GA_WEB_PROPERTY_ID_MANUALLY_VALUE_OPTION_NAME );
74
+ add_option( self::GA_DISABLE_ALL_FEATURES );
75
+ Ga_Cache::add_cache_options();
76
+ }
77
+
78
+ /**
79
+ * Deletes plugin's options during plugin activation process.
80
+ */
81
+ public static function deactivate_googleanalytics() {
82
+ delete_option( self::GA_WEB_PROPERTY_ID_OPTION_NAME );
83
+ delete_option( self::GA_EXCLUDE_ROLES_OPTION_NAME );
84
+ delete_option( self::GA_OAUTH_AUTH_CODE_OPTION_NAME );
85
+ delete_option( self::GA_OAUTH_AUTH_TOKEN_OPTION_NAME );
86
+ delete_option( self::GA_ACCOUNT_DATA_OPTION_NAME );
87
+ delete_option( self::GA_SELECTED_ACCOUNT );
88
+ delete_option( self::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME );
89
+ delete_option( self::GA_WEB_PROPERTY_ID_MANUALLY_VALUE_OPTION_NAME );
90
+ delete_option( self::GA_DISABLE_ALL_FEATURES );
91
+ delete_option( Ga_SupportLogger::LOG_OPTION );
92
+ delete_option( 'googleanalytics_version' );
93
+ delete_option( 'googleanalytics_optimize_code' );
94
+ delete_option( 'googleanalytics_ip_anonymization' );
95
+ delete_option( 'googleanalytics-hide-review' );
96
+ delete_option( 'googleanalytics_enable_debug_mode' );
97
+ delete_option( 'googleanalytics_gdpr_config' );
98
+ delete_option( 'googleanalytics_demographic' );
99
+ delete_option( 'googleanalytics_demo_data' );
100
+ delete_option( 'googleanalytics_demo_date' );
101
+ delete_option( 'googleanalytics_send_data' );
102
+ delete_option( 'googleanalytics_hide_terms' );
103
+ delete_option( 'googleanalytics_sharethis_terms' );
104
+ delete_option( 'googleanalytics_sherethis_property_id' );
105
+ delete_option( 'googleanalytics_sherethis_property_secret' );
106
+ delete_option( self::GA_SHARETHIS_TERMS_OPTION_NAME );
107
+ Ga_Cache::delete_cache_options();
108
+ }
109
+
110
+ /**
111
+ * Deletes plugin's options during plugin uninstallation process.
112
+ */
113
+ public static function uninstall_googleanalytics() {
114
+ delete_option( self::GA_SHARETHIS_TERMS_OPTION_NAME );
115
+ delete_option( self::GA_HIDE_TERMS_OPTION_NAME );
116
+ delete_option( self::GA_VERSION_OPTION_NAME );
117
+ delete_option( self::GA_SHARETHIS_PROPERTY_ID );
118
+ delete_option( self::GA_SHARETHIS_PROPERTY_SECRET );
119
+ delete_option( self::GA_SHARETHIS_VERIFICATION_RESULT );
120
+ }
121
+
122
+ /**
123
+ * Do actions during plugin load.
124
+ */
125
+ public static function loaded_googleanalytics() {
126
+ self::update_googleanalytics();
127
+ }
128
+
129
+ /**
130
+ * Update hook fires when plugin is being loaded.
131
+ */
132
+ public static function update_googleanalytics() {
133
+ $version = get_option( self::GA_VERSION_OPTION_NAME );
134
+ $installed_version = get_option( self::GA_VERSION_OPTION_NAME, '2.4.0' );
135
+ $old_property_value = Ga_Helper::get_option( 'web_property_id' );
136
+
137
+ if ( version_compare( $installed_version, GOOGLEANALYTICS_VERSION, 'eq' ) ) {
138
+ return;
139
+ }
140
+
141
+ if ( version_compare( $installed_version, GOOGLEANALYTICS_VERSION, 'lt' ) ) {
142
+
143
+ if ( ! empty( $old_property_value ) ) {
144
+ Ga_Helper::update_option( self::GA_WEB_PROPERTY_ID_MANUALLY_VALUE_OPTION_NAME, $old_property_value );
145
+ Ga_Helper::update_option( self::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME, 1 );
146
+ delete_option( 'web_property_id' );
147
+ }
148
+ }
149
+
150
+ update_option( self::GA_VERSION_OPTION_NAME, GOOGLEANALYTICS_VERSION );
151
+ }
152
+
153
+ /**
154
+ * Preupdate excluding rules.
155
+ *
156
+ * @param string $new_value New value.
157
+ * @param string $old_value Old value.
158
+ *
159
+ * @return false|string
160
+ */
161
+ public static function preupdate_exclude_roles( $new_value, $old_value ) {
162
+ if ( false === Ga_Helper::are_features_enabled() ) {
163
+ return '';
164
+ }
165
+
166
+ return wp_json_encode( $new_value );
167
+ }
168
+
169
+ /**
170
+ * Pre-update hook for preparing JSON structure.
171
+ *
172
+ * @param string $new_value New value.
173
+ * @param string $old_value Old value.
174
+ *
175
+ * @return mixed
176
+ */
177
+ public static function preupdate_selected_account( $new_value, $old_value ) {
178
+ $data = null;
179
+ if ( ! empty( $new_value ) ) {
180
+ $data = explode( '_', $new_value );
181
+
182
+ if ( ! empty( $data[1] ) ) {
183
+ Ga_Helper::update_option( self::GA_WEB_PROPERTY_ID_OPTION_NAME, $data[1] );
184
+ }
185
+ }
186
+
187
+ return wp_json_encode( $data );
188
+ }
189
+
190
+ /**
191
+ * Pre-update disable all features.
192
+ *
193
+ * @param string $new_value New value.
194
+ * @param string $old_value Old value.
195
+ *
196
+ * @return mixed
197
+ */
198
+ public static function preupdate_disable_all_features( $new_value, $old_value ) {
199
+ if ( 'on' === $old_value ) {
200
+ Ga_Helper::update_option( self::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME, false );
201
+ }
202
+
203
+ return $new_value;
204
+ }
205
+
206
+ /**
207
+ * Pre-update optimize code.
208
+ *
209
+ * @param string $new_value New value.
210
+ * @param string $old_value Old value.
211
+ *
212
+ * @return mixed|string
213
+ */
214
+ public static function preupdate_optimize_code( $new_value, $old_value ) {
215
+ if ( ! empty( $new_value ) ) {
216
+ $new_value = sanitize_text_field( wp_unslash( $new_value ) );
217
+ }
218
+
219
+ return $new_value;
220
+ }
221
+
222
+ /**
223
+ * Pre-update IP Anonymization.
224
+ *
225
+ * @param string $new_value New value.
226
+ * @param string $old_value Old value.
227
+ *
228
+ * @return mixed
229
+ */
230
+ public static function preupdate_ip_anonymization( $new_value, $old_value ) {
231
+ return $new_value;
232
+ }
233
+
234
+ /**
235
+ * Pre-update Enable GA Debugging.
236
+ *
237
+ * @param string $new_value New value.
238
+ * @param string $old_value Old value.
239
+ *
240
+ * @return mixed
241
+ */
242
+ public static function preupdate_enable_debug_mode( $new_value, $old_value ) {
243
+ return $new_value;
244
+ }
245
+
246
+ /**
247
+ * Registers plugin's settings.
248
+ */
249
+ public static function admin_init_googleanalytics() {
250
+ register_setting( GA_NAME, self::GA_WEB_PROPERTY_ID_OPTION_NAME );
251
+ register_setting( GA_NAME, self::GA_EXCLUDE_ROLES_OPTION_NAME );
252
+ register_setting( GA_NAME, self::GA_SELECTED_ACCOUNT );
253
+ register_setting( GA_NAME, self::GA_OAUTH_AUTH_CODE_OPTION_NAME );
254
+ register_setting( GA_NAME, self::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME );
255
+ register_setting( GA_NAME, self::GA_WEB_PROPERTY_ID_MANUALLY_VALUE_OPTION_NAME );
256
+ register_setting( GA_NAME, self::GA_DISABLE_ALL_FEATURES );
257
+ register_setting( GA_NAME, 'googleanalytics_optimize_code' );
258
+ register_setting( GA_NAME, 'googleanalytics_ip_anonymization' );
259
+ register_setting( GA_NAME, 'googleanalytics_enable_debug_mode' );
260
+ add_filter( 'pre_update_option_' . self::GA_EXCLUDE_ROLES_OPTION_NAME, 'Ga_Admin::preupdate_exclude_roles', 1, 2 );
261
+ add_filter( 'pre_update_option_' . self::GA_SELECTED_ACCOUNT, 'GA_Admin::preupdate_selected_account', 1, 2 );
262
+ add_filter( 'pre_update_option_googleanalytics_optimize_code', 'Ga_Admin::preupdate_optimize_code', 1, 2 );
263
+ add_filter( 'pre_update_option_googleanalytics_ip_anonymization', 'Ga_Admin::preupdate_ip_anonymization', 1, 2 );
264
+ add_filter( 'pre_update_option_googleanalytics_enable_debug_mode', 'Ga_Admin::preupdate_enable_debug_mode', 1, 2 );
265
+ }
266
+
267
+ /**
268
+ * Builds plugin's menu structure.
269
+ */
270
+ public static function admin_menu_googleanalytics() {
271
+ $gdpr = get_option( 'googleanalytics_gdpr_config' );
272
+
273
+ if ( current_user_can( 'manage_options' ) ) {
274
+ add_menu_page( 'Google Analytics', 'Google Analytics', 'manage_options', 'googleanalytics', 'Ga_Admin::statistics_page_googleanalytics', 'dashicons-chart-line', 1000 );
275
+ add_submenu_page( 'googleanalytics', 'Google Analytics', __( 'Dashboard' ), 'manage_options', 'googleanalytics', 'Ga_Admin::statistics_page_googleanalytics' );
276
+ add_submenu_page( 'googleanalytics', 'Google Analytics', __( 'Settings' ), 'manage_options', 'googleanalytics/settings', 'Ga_Admin::options_page_googleanalytics' );
277
+
278
+ if ( ! empty( $gdpr ) ) {
279
+ add_submenu_page(
280
+ 'googleanalytics',
281
+ 'Google Analytics',
282
+ __( 'GDPR' ),
283
+ 'manage_options',
284
+ 'googleanalytics/gdpr',
285
+ 'Ga_Admin::gdpr_page_googleanalytics'
286
+ );
287
+ }
288
+ }
289
+ }
290
+
291
+ /**
292
+ * Prepares and displays plugin's stats page.
293
+ */
294
+ public static function statistics_page_googleanalytics() {
295
+
296
+ if ( ! Ga_Helper::is_wp_version_valid() || ! Ga_Helper::is_php_version_valid() ) {
297
+ return false;
298
+ }
299
+
300
+ $data = self::get_stats_page();
301
+ Ga_View_Core::load(
302
+ 'statistics',
303
+ array(
304
+ 'data' => $data,
305
+ )
306
+ );
307
+
308
+ if ( Ga_Cache::is_data_cache_outdated( '', Ga_Helper::get_account_id() ) ) {
309
+ self::api_client()->add_own_error( '1', __( 'Saved data is shown, it will be refreshed soon' ), 'Ga_Data_Outdated_Exception' );
310
+ }
311
+
312
+ self::display_api_errors();
313
+ }
314
+
315
+ /**
316
+ * Prepares and displays plugin's settings page.
317
+ */
318
+ public static function options_page_googleanalytics() {
319
+ if ( false === Ga_Helper::is_wp_version_valid() || false === Ga_Helper::is_php_version_valid() ) {
320
+ return false;
321
+ }
322
+
323
+ if ( true === Ga_Helper::are_features_enabled() && true === Ga_Helper::is_curl_disabled() ) {
324
+ echo wp_kses_post(
325
+ Ga_Helper::ga_wp_notice(
326
+ __(
327
+ 'Looks like cURL is not configured on your server. In order to authenticate your Google Analytics account and display statistics, cURL is required. Please contact your server administrator to enable it, or manually enter your Tracking ID.'
328
+ ),
329
+ 'warning'
330
+ )
331
+ );
332
+ }
333
+ /**
334
+ * Keeps data to be extracted as variables in the view.
335
+ *
336
+ * @var array $data
337
+ */
338
+ $data = array();
339
+
340
+ $data[ self::GA_WEB_PROPERTY_ID_OPTION_NAME ] = get_option( self::GA_WEB_PROPERTY_ID_OPTION_NAME );
341
+ $data[ self::GA_WEB_PROPERTY_ID_MANUALLY_VALUE_OPTION_NAME ] = get_option( self::GA_WEB_PROPERTY_ID_MANUALLY_VALUE_OPTION_NAME, '' );
342
+ $data[ self::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME ] = get_option( self::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME, '0' );
343
+ $data[ self::GA_DISABLE_ALL_FEATURES ] = get_option( self::GA_DISABLE_ALL_FEATURES );
344
+
345
+ $roles = Ga_Helper::get_user_roles();
346
+ $saved = json_decode( get_option( self::GA_EXCLUDE_ROLES_OPTION_NAME ), true );
347
+
348
+ $tmp = array();
349
+ if ( false === empty( $roles ) ) {
350
+ foreach ( $roles as $role ) {
351
+ $role_id = Ga_Helper::prepare_role_id( $role );
352
+ $tmp[] = array(
353
+ 'name' => $role,
354
+ 'id' => $role_id,
355
+ 'checked' => ( ! empty( $saved[ $role_id ] ) && 'on' === $saved[ $role_id ] ),
356
+ );
357
+ }
358
+ }
359
+ $data['roles'] = $tmp;
360
+
361
+ if ( Ga_Helper::is_authorized() ) {
362
+ $data['ga_accounts_selector'] = self::get_accounts_selector();
363
+ $data['auth_button'] = self::get_auth_button( 'reauth' );
364
+ } else {
365
+ $data['popup_url'] = self::get_auth_popup_url();
366
+ $data['auth_button'] = self::get_auth_button( 'auth' );
367
+ }
368
+
369
+ $data['debug_modal'] = self::get_debug_modal();
370
+ $data['debug_info'] = Ga_SupportLogger::$debug_info;
371
+
372
+ // Sanitize error.
373
+ $error = filter_input( INPUT_GET, 'err', FILTER_SANITIZE_STRING );
374
+
375
+ if ( false === empty( $error ) ) {
376
+ switch ( $error ) {
377
+ case 1:
378
+ $data['error_message'] = Ga_Helper::ga_oauth_notice( 'There was a problem with Google Oauth2 authentication process. Please verify your site has a valid SSL Certificate in place and is using the HTTPS protocol.' );
379
+ break;
380
+ case 2:
381
+ $data['error_message'] = Ga_Helper::ga_wp_notice(
382
+ 'Authentication code is incorrect.',
383
+ 'error',
384
+ true
385
+ );
386
+ break;
387
+ }
388
+ }
389
+
390
+ Ga_View_Core::load(
391
+ 'page',
392
+ array(
393
+ 'data' => $data,
394
+ 'tooltip' => Ga_Helper::get_tooltip(),
395
+ )
396
+ );
397
+
398
+ self::display_api_errors();
399
+ }
400
+
401
+ /**
402
+ * Prepares and displays plugin's gdpr page.
403
+ */
404
+ public static function gdpr_page_googleanalytics() {
405
+
406
+ if ( false === Ga_Helper::is_wp_version_valid() || false === Ga_Helper::is_php_version_valid() ) {
407
+ return false;
408
+ }
409
+ if ( true === Ga_Helper::are_features_enabled() && true === Ga_Helper::is_curl_disabled() ) {
410
+ echo wp_kses_post( Ga_Helper::ga_wp_notice( __( 'Looks like cURL is not configured on your server. In order to authenticate your Google Analytics account and display statistics, cURL is required. Please contact your server administrator to enable it, or manually enter your Tracking ID.' ), 'warning' ) );
411
+ }
412
+
413
+ $vendor_data = self::get_vendors();
414
+ $vendors = $vendor_data['vendors'];
415
+ $purposes = array_column( $vendor_data['purposes'], 'name', 'id' );
416
+
417
+ include plugin_dir_path( __FILE__ ) . '../view/templates/gdpr-config.php';
418
+ }
419
+
420
+ /**
421
+ * Prepares and returns a plugin's URL to be opened in a popup window
422
+ * during Google authentication process.
423
+ *
424
+ * @return mixed
425
+ */
426
+ public static function get_auth_popup_url() {
427
+ return admin_url( Ga_Helper::create_url( Ga_Helper::GA_SETTINGS_PAGE_URL, array( Ga_Controller_Core::ACTION_PARAM_NAME => 'ga_action_auth' ) ) );
428
+ }
429
+
430
+ /**
431
+ * Prepares and returns Google Account's dropdown code.
432
+ *
433
+ * @return string
434
+ */
435
+ public static function get_accounts_selector() {
436
+ $selected = Ga_Helper::get_selected_account_data();
437
+ $selector = json_decode( get_option( self::GA_ACCOUNT_DATA_OPTION_NAME ), true );
438
+
439
+ if ( false === Ga_Helper::is_code_manually_enabled() && true === empty( $selector ) ) {
440
+ echo wp_kses_post( Ga_Helper::ga_wp_notice( "Hi there! It seems like we weren't able to locate a Google Analytics account attached to your email account. Can you please register for Google Analytics and then deactivate and reactivate the plugin?", 'warning' ) );
441
+ }
442
+
443
+ return Ga_View_Core::load(
444
+ 'ga-accounts-selector',
445
+ array(
446
+ 'selector' => $selector,
447
+ 'selected' => $selected ? implode( '_', $selected ) : null,
448
+ 'add_manually_enabled' => Ga_Helper::is_code_manually_enabled() || Ga_Helper::is_all_feature_disabled(),
449
+ ),
450
+ true
451
+ );
452
+ }
453
+
454
+ /**
455
+ * Adds JS scripts for the settings page.
456
+ */
457
+ public static function enqueue_ga_scripts() {
458
+ $property_id = get_option( 'googleanalytics_sherethis_property_id', true );
459
+ $secret = get_option( 'googleanalytics_sherethis_property_secret', true );
460
+ $config = wp_json_encode( get_option( 'googleanalytics_gdpr_config' ) );
461
+
462
+ wp_register_script(
463
+ GA_NAME . '-page-js',
464
+ Ga_Helper::get_plugin_url_with_correct_protocol() . '/js/' . GA_NAME . '_page.js',
465
+ array( 'jquery' ),
466
+ time(),
467
+ false
468
+ );
469
+
470
+ wp_enqueue_script( GA_NAME . '-page-js' );
471
+ wp_localize_script(
472
+ GA_NAME . '-page-js',
473
+ 'googleAnalyticsPage',
474
+ array(
475
+ 'ajaxurl' => admin_url( 'admin-ajax.php' ),
476
+ 'nonce' => wp_create_nonce( 'ga_page_nonce' ),
477
+ 'settingsURL' => admin_url( 'admin.php?page=googleanalytics/settings' ),
478
+ )
479
+ );
480
+
481
+ // @deprecated - Phase this out in favor of wp_localize_script.
482
+ wp_add_inline_script(
483
+ GA_NAME . '-page-js',
484
+ 'var siteAdminUrl = \'' .
485
+ admin_url() .
486
+ '\'; var gaGdprConfig = \'' .
487
+ $config .
488
+ '\'; var ga_demo_nonce = "' .
489
+ wp_create_nonce( 'ga_demo_nonce' ) .
490
+ '"; var ga_property_id = "' . $property_id .
491
+ '"; var ga_secret_id = "' .
492
+ $secret .
493
+ '";'
494
+ );
495
+ }
496
+
497
+ /**
498
+ * Adds CSS plugin's scripts.
499
+ */
500
+ public static function enqueue_ga_css() {
501
+ wp_enqueue_style(
502
+ GA_NAME . '-css',
503
+ Ga_Helper::get_plugin_url_with_correct_protocol() . '/css/' . GA_NAME . '.css',
504
+ false,
505
+ time(),
506
+ 'all'
507
+ );
508
+
509
+ wp_enqueue_style(
510
+ GA_NAME . '-additional-css',
511
+ Ga_Helper::get_plugin_url_with_correct_protocol() . '/css/ga_additional.css',
512
+ false,
513
+ GOOGLEANALYTICS_VERSION,
514
+ 'all'
515
+ );
516
+
517
+ if ( true === Ga_Helper::is_wp_old() ) {
518
+ wp_enqueue_style(
519
+ GA_NAME . '-old-wp-support-css',
520
+ Ga_Helper::get_plugin_url_with_correct_protocol() . '/css/ga_old_wp_support.css',
521
+ false,
522
+ GOOGLEANALYTICS_VERSION,
523
+ 'all'
524
+ );
525
+ }
526
+
527
+ wp_enqueue_style(
528
+ GA_NAME . '-modal-css',
529
+ Ga_Helper::get_plugin_url_with_correct_protocol() . '/css/ga_modal.css',
530
+ false,
531
+ GOOGLEANALYTICS_VERSION,
532
+ 'all'
533
+ );
534
+ }
535
+
536
+ /**
537
+ * Enqueues dashboard JS scripts.
538
+ */
539
+ private static function enqueue_dashboard_scripts() {
540
+ wp_enqueue_script(
541
+ GA_NAME . '-dashboard-js',
542
+ Ga_Helper::get_plugin_url_with_correct_protocol() . '/js/' . GA_NAME . '_dashboard.js',
543
+ array( 'jquery' ),
544
+ GOOGLEANALYTICS_VERSION,
545
+ false
546
+ );
547
+ }
548
+
549
+ /**
550
+ * Enqueues plugin's JS and CSS scripts.
551
+ */
552
+ public static function enqueue_scripts() {
553
+ $domain = str_replace( 'http://', '', str_replace( 'https://', '', str_replace( '/wp-admin/', '', admin_url() ) ) );
554
+ $st_prop = get_option( self::GA_SHARETHIS_PROPERTY_ID );
555
+ $st_secret = get_option( self::GA_SHARETHIS_PROPERTY_SECRET );
556
+
557
+ if ( Ga_Helper::is_dashboard_page() || Ga_Helper::is_plugin_page() ) {
558
+ wp_register_script(
559
+ GA_NAME . '-js',
560
+ Ga_Helper::get_plugin_url_with_correct_protocol() . '/js/' . GA_NAME . '.js',
561
+ array( 'jquery' ),
562
+ GOOGLEANALYTICS_VERSION,
563
+ false
564
+ );
565
+ wp_enqueue_script( GA_NAME . '-js' );
566
+
567
+ wp_register_script( 'googlecharts', 'https://www.gstatic.com/charts/loader.js', null, 1, false );
568
+ wp_enqueue_script( 'googlecharts' );
569
+ wp_add_inline_script( GA_NAME . '-js', 'var ga_demo_nonce = "' . wp_create_nonce( 'ga_demo_nonce' ) . '";' );
570
+
571
+ if ( empty( $st_prop ) || empty( $st_secret ) ) {
572
+ wp_register_script( 'googlecreateprop', Ga_Helper::get_plugin_url_with_correct_protocol() . '/js/googleanalytics_createprop.js', array( 'jquery', 'wp-util' ), time(), false );
573
+ wp_enqueue_script( 'googlecreateprop' );
574
+ wp_add_inline_script(
575
+ 'googlecreateprop',
576
+ '
577
+ var gaNonce = "' . wp_create_nonce( 'googleanalyticsnonce' ) . '";
578
+ var gasiteURL = "' . $domain . '";
579
+ var gaAdminEmail = "' . get_option( 'admin_email' ) . '";'
580
+ );
581
+ }
582
+
583
+ self::enqueue_ga_css();
584
+ }
585
+
586
+ if ( Ga_Helper::is_dashboard_page() ) {
587
+ self::enqueue_dashboard_scripts();
588
+ }
589
+
590
+ if ( Ga_Helper::is_plugin_page() ) {
591
+ self::enqueue_ga_scripts();
592
+ }
593
+ }
594
+
595
+ /**
596
+ * Prepares plugin's statistics page and return HTML code.
597
+ *
598
+ * @return string HTML code
599
+ */
600
+ public static function get_stats_page() {
601
+ $age_chart = null;
602
+ $boxes = null;
603
+ $chart = null;
604
+ $device_chart = null;
605
+ $gender_chart = null;
606
+ $labels = null;
607
+ $sources = null;
608
+
609
+ if ( Ga_Helper::is_authorized() && Ga_Helper::is_account_selected() && ! Ga_Helper::is_all_feature_disabled() ) {
610
+ list( $chart, $age_chart, $device_chart, $gender_chart, $boxes, $labels, $sources ) = self::generate_stats_data();
611
+ }
612
+
613
+ return Ga_Helper::get_chart_page(
614
+ 'stats',
615
+ compact(
616
+ 'age_chart',
617
+ 'boxes',
618
+ 'chart',
619
+ 'device_chart',
620
+ 'gender_chart',
621
+ 'labels',
622
+ 'sources'
623
+ )
624
+ );
625
+ }
626
+
627
+ /**
628
+ * Prepare required PHP version warning.
629
+ */
630
+ public static function admin_notice_googleanalytics_php_version() {
631
+ echo wp_kses_post( Ga_Helper::ga_wp_notice( 'Cannot use Google Analytics plugin. PHP version ' . phpversion() . ' is to low. Required PHP version: ' . Ga_Helper::PHP_VERSION_REQUIRED, 'error' ) );
632
+ }
633
+
634
+ /**
635
+ * Shows plugin's notice on the admin area.
636
+ */
637
+ public static function admin_notice_googleanalytics() {
638
+ if ( ( ! get_option( self::GA_SHARETHIS_TERMS_OPTION_NAME ) && Ga_Helper::is_plugin_page() ) ||
639
+ ( ! get_option( self::GA_SHARETHIS_TERMS_OPTION_NAME ) && ! get_option( self::GA_HIDE_TERMS_OPTION_NAME ) ) ) {
640
+ $current_url = Ga_Helper::get_current_url();
641
+ $url = ( strstr(
642
+ $current_url,
643
+ '?'
644
+ ) ? $current_url . '&' : $current_url . '?' ) . http_build_query( array( Ga_Controller_Core::ACTION_PARAM_NAME => 'ga_action_update_terms' ) );
645
+ Ga_View_Core::load(
646
+ 'ga-notice',
647
+ array(
648
+ 'url' => $url,
649
+ )
650
+ );
651
+ }
652
+
653
+ $settings_updated = filter_input( INPUT_GET, 'settings-updated', FILTER_SANITIZE_STRING );
654
+
655
+ if ( false === empty( $settings_updated ) && Ga_Helper::is_plugin_page() ) {
656
+ echo wp_kses_post( Ga_Helper::ga_wp_notice( __( 'Settings saved' ), self::NOTICE_SUCCESS ) );
657
+ }
658
+
659
+ if ( true === boolval( Ga_Helper::get_option( self::GA_DISABLE_ALL_FEATURES ) ) ) {
660
+ echo wp_kses(
661
+ Ga_Helper::ga_wp_notice(
662
+ __( 'You have disabled all extra features, click here to enable Dashboards, Viral Alerts and Google API.' ),
663
+ 'warning',
664
+ false,
665
+ array(
666
+ 'url' => admin_url(
667
+ Ga_Helper::create_url(
668
+ Ga_Helper::GA_SETTINGS_PAGE_URL,
669
+ array( Ga_Controller_Core::ACTION_PARAM_NAME => 'ga_action_enable_all_features' )
670
+ )
671
+ ),
672
+ 'label' => __( 'Enable' ),
673
+ )
674
+ ),
675
+ array(
676
+ 'button' => array(
677
+ 'class' => array(),
678
+ 'onclick' => array(),
679
+ ),
680
+ 'div' => array(
681
+ 'class' => array(),
682
+ ),
683
+ 'p' => array(),
684
+ )
685
+ );
686
+ }
687
+ }
688
+
689
+ /**
690
+ * Prepare required WP version warning
691
+ */
692
+ public static function admin_notice_googleanalytics_wp_version() {
693
+ echo wp_kses(
694
+ Ga_Helper::ga_wp_notice(
695
+ 'Google Analytics plugin requires at least WordPress version ' . self::MIN_WP_VERSION,
696
+ 'error'
697
+ ),
698
+ array(
699
+ 'button' => array(
700
+ 'class' => array(),
701
+ 'onclick' => array(),
702
+ ),
703
+ 'div' => array(
704
+ 'class' => array(),
705
+ ),
706
+ 'p' => array(),
707
+ )
708
+ );
709
+ }
710
+
711
+ /**
712
+ * Hides plugin's notice
713
+ */
714
+ public static function admin_notice_hide_googleanalytics() {
715
+ update_option( self::GA_HIDE_TERMS_OPTION_NAME, true );
716
+ }
717
+
718
+ /**
719
+ * Adds GA dashboard widget only for administrators.
720
+ */
721
+ public static function add_dashboard_device_widget() {
722
+ if ( true === Ga_Helper::is_administrator() ) {
723
+ wp_add_dashboard_widget(
724
+ 'ga-dashboard-widget',
725
+ __( 'Google Analytics Dashboard' ),
726
+ 'Ga_Helper::add_ga_dashboard_widget'
727
+ );
728
+ }
729
+ }
730
+
731
+ /**
732
+ * Adds plugin's actions
733
+ */
734
+ public static function add_actions() {
735
+ add_action( 'admin_init', 'Ga_Admin::admin_init_googleanalytics' );
736
+ add_action( 'admin_menu', 'Ga_Admin::admin_menu_googleanalytics' );
737
+ add_action( 'admin_enqueue_scripts', 'Ga_Admin::enqueue_scripts' );
738
+ add_action( 'wp_dashboard_setup', 'Ga_Admin::add_dashboard_device_widget' );
739
+ add_action( 'wp_ajax_ga_ajax_data_change', 'Ga_Admin::ga_ajax_data_change' );
740
+ add_action( 'wp_ajax_ga_ajax_hide_review', 'Ga_Admin::ga_ajax_hide_review' );
741
+ add_action( 'wp_ajax_ga_ajax_enable_gdpr', 'Ga_Admin::ga_ajax_gdpr_enable' );
742
+ add_action( 'wp_ajax_ga_ajax_enable_demographic', 'Ga_Admin::ga_ajax_enable_demo' );
743
+ add_action( 'wp_ajax_ga_ajax_sign_out', 'Ga_Admin::ga_ajax_sign_out' );
744
+ add_action( 'admin_notices', 'Ga_Admin::admin_notice_googleanalytics' );
745
+ add_action( 'heartbeat_tick', 'Ga_Admin::run_heartbeat_jobs' );
746
+ add_action( 'wp_ajax_googleanalytics_send_debug_email', 'Ga_SupportLogger::send_email' );
747
+ add_action( 'wp_ajax_set_ga_credentials', 'Ga_Admin::create_ga_property' );
748
+
749
+ if ( ! get_option( self::GA_SHARETHIS_TERMS_OPTION_NAME ) && ! get_option( self::GA_HIDE_TERMS_OPTION_NAME ) ) {
750
+ add_action( 'wp_ajax_googleanalytics_hide_terms', 'Ga_Admin::admin_notice_hide_googleanalytics' );
751
+ }
752
+ }
753
+
754
+ /**
755
+ * Runs jobs
756
+ *
757
+ * @param string $response Response string.
758
+ * @param string $screen_id Screen ID string.
759
+ */
760
+ public static function run_heartbeat_jobs( $response, $screen_id = '' ) {
761
+
762
+ if ( self::GA_HEARTBEAT_API_CACHE_UPDATE ) {
763
+ // Disable cache for ajax request.
764
+ self::api_client()->set_disable_cache( true );
765
+
766
+ // Try to regenerate cache if needed.
767
+ self::generate_stats_data();
768
+ }
769
+ }
770
+
771
+ /**
772
+ * Adds plugin's filters
773
+ */
774
+ public static function add_filters() {
775
+ add_filter( 'plugin_action_links', 'Ga_Admin::ga_action_links', 10, 5 );
776
+ }
777
+
778
+ /**
779
+ * Adds new action links on the plugin list.
780
+ *
781
+ * @param array $actions Actions array.
782
+ * @param string $plugin_file Plugin file path string.
783
+ *
784
+ * @return mixed
785
+ */
786
+ public static function ga_action_links( $actions, $plugin_file ) {
787
+ if ( basename( $plugin_file ) === GA_NAME . '.php' ) {
788
+ array_unshift( $actions, '<a href="' . esc_url( get_admin_url( null, Ga_Helper::GA_SETTINGS_PAGE_URL ) ) . '">' . __( 'Settings' ) . '</a>' );
789
+ }
790
+
791
+ return $actions;
792
+ }
793
+
794
+ /**
795
+ * Init OAuth.
796
+ *
797
+ * @return false|void
798
+ */
799
+ public static function init_oauth() {
800
+ $code = Ga_Helper::get_option( self::GA_OAUTH_AUTH_CODE_OPTION_NAME );
801
+
802
+ if ( false === empty( $code ) ) {
803
+ Ga_Helper::update_option( self::GA_OAUTH_AUTH_CODE_OPTION_NAME, '' );
804
+
805
+ // Get access token.
806
+ $response = self::api_client()->call( 'ga_auth_get_access_token', $code );
807
+
808
+ if ( true === empty( $response ) ) {
809
+ return false;
810
+ }
811
+
812
+ $param = '';
813
+
814
+ if ( false === self::save_access_token( $response ) ) {
815
+ $param = '&err=1';
816
+ $errors = self::api_client()->get_errors();
817
+ if ( ! empty( $errors ) ) {
818
+ foreach ( $errors as $error ) {
819
+ if ( 'invalid_grant' === $error['message'] ) {
820
+ $param = '&err=2';
821
+ }
822
+ }
823
+ }
824
+ } else {
825
+ self::api_client()->set_access_token( $response->get_data() );
826
+ // Get accounts data.
827
+ $account_summaries = self::api_client()->call( 'ga_api_account_summaries' );
828
+ self::save_ga_account_summaries( $account_summaries->get_data() );
829
+ update_option( self::GA_SELECTED_ACCOUNT, '' );
830
+ }
831
+
832
+ wp_safe_redirect( admin_url( Ga_Helper::GA_SETTINGS_PAGE_URL . $param ) );
833
+ }
834
+ }
835
+
836
+ /**
837
+ * Save access token.
838
+ *
839
+ * @param Ga_Lib_Api_Response $response API response.
840
+ * @param string $refresh_token Refresh token string.
841
+ *
842
+ * @return boolean
843
+ */
844
+ public static function save_access_token( $response, $refresh_token = '' ) {
845
+ $access_token = $response->get_data();
846
+ if ( ! empty( $access_token ) ) {
847
+ $access_token['created'] = time();
848
+ } else {
849
+ return false;
850
+ }
851
+
852
+ if ( ! empty( $refresh_token ) ) {
853
+ $access_token['refresh_token'] = $refresh_token;
854
+ }
855
+
856
+ return update_option( self::GA_OAUTH_AUTH_TOKEN_OPTION_NAME, wp_json_encode( $access_token ) );
857
+ }
858
+
859
+ /**
860
+ * Saves Google Analytics account data.
861
+ *
862
+ * @param array $data Data array.
863
+ *
864
+ * @return array
865
+ */
866
+ public static function save_ga_account_summaries( $data ) {
867
+ $return = array();
868
+ if ( ! empty( $data['items'] ) ) {
869
+ foreach ( $data['items'] as $item ) {
870
+ $tmp = array();
871
+ $tmp['id'] = $item['id'];
872
+ $tmp['name'] = $item['name'];
873
+ if ( is_array( $item['webProperties'] ) ) {
874
+ foreach ( $item['webProperties'] as $property ) {
875
+ $profiles = array();
876
+ if ( is_array( $property['profiles'] ) ) {
877
+ foreach ( $property['profiles'] as $profile ) {
878
+ $profiles[] = array(
879
+ 'id' => $profile['id'],
880
+ 'name' => $profile['name'],
881
+ );
882
+ }
883
+ }
884
+
885
+ $tmp['webProperties'][] = array(
886
+ 'internalWebPropertyId' => $property['internalWebPropertyId'],
887
+ 'webPropertyId' => $property['id'],
888
+ 'name' => $property['name'],
889
+ 'profiles' => $profiles,
890
+ );
891
+ }
892
+ }
893
+
894
+ $return[] = $tmp;
895
+ }
896
+
897
+ update_option( self::GA_ACCOUNT_DATA_OPTION_NAME, wp_json_encode( $return ) );
898
+ } else {
899
+ update_option( self::GA_ACCOUNT_DATA_OPTION_NAME, '' );
900
+ }
901
+ update_option( self::GA_WEB_PROPERTY_ID_OPTION_NAME, '' );
902
+
903
+ return $return;
904
+ }
905
+
906
+ /**
907
+ * Handle AJAX data for the GA dashboard widget.
908
+ */
909
+ public static function ga_ajax_data_change() {
910
+ if ( Ga_Admin_Controller::validate_ajax_data_change_post() ) {
911
+ $date_range = filter_input( INPUT_POST, 'date_range', FILTER_SANITIZE_STRING );
912
+ $metric = filter_input( INPUT_POST, 'metric', FILTER_SANITIZE_STRING );
913
+
914
+ echo wp_kses_post( Ga_Helper::get_ga_dashboard_widget_data_json( $date_range, $metric, false, true ) );
915
+ } else {
916
+ echo wp_json_encode( array( 'error' => __( 'Invalid request.' ) ) );
917
+ }
918
+
919
+ wp_die();
920
+ }
921
+
922
+ /**
923
+ * Displays API error messages.
924
+ *
925
+ * @param string $alias Alias string.
926
+ */
927
+ public static function display_api_errors( $alias = '' ) {
928
+ $errors = self::api_client( $alias )->get_errors();
929
+ if ( ! empty( $errors ) ) {
930
+ foreach ( $errors as $error ) {
931
+ echo wp_kses_post( Ga_Notice::get_message( $error ) );
932
+ }
933
+ }
934
+ }
935
+
936
+ /**
937
+ * Gets dashboard data.
938
+ *
939
+ * @return array
940
+ */
941
+ public static function generate_stats_data() {
942
+ $selected = Ga_Helper::get_selected_account_data( true );
943
+ $update_data = self::check_data_date();
944
+
945
+ $current_period = Ga_Helper::get_date_range_from_request();
946
+
947
+ $current_period['start'] = false === empty( $current_period['from'] ) ?
948
+ $current_period['from'] : gmdate( 'Y-m-d', strtotime( '-1 week' ) );
949
+ $current_period['end'] = false === empty( $current_period['to'] ) ?
950
+ $current_period['to'] : gmdate( 'Y-m-d', strtotime( 'now' ) );
951
+
952
+ $previous_period = Ga_Helper::get_previous_period_for_dates( $current_period['start'], $current_period['end'] );
953
+
954
+ $period_in_days = Ga_Helper::get_period_in_days( $current_period['start'], $current_period['end'] );
955
+
956
+ $date_ranges = Ga_Stats::set_date_ranges(
957
+ $current_period['start'],
958
+ $current_period['end'],
959
+ $previous_period['start'],
960
+ $previous_period['end']
961
+ );
962
+
963
+ $query_params = Ga_Stats::get_query( 'main_chart', $selected['view_id'], $date_ranges );
964
+ $stats_data = self::api_client()->call(
965
+ 'ga_api_data',
966
+ array( $query_params )
967
+ );
968
+ $gender_params = Ga_Stats::get_query( 'gender', $selected['view_id'], $date_ranges );
969
+ $gender_data = self::api_client()->call(
970
+ 'ga_api_data',
971
+ array( $gender_params )
972
+ );
973
+ $age_params = Ga_Stats::get_query( 'age', $selected['view_id'], $date_ranges );
974
+ $age_data = self::api_client()->call(
975
+ 'ga_api_data',
976
+ array( $age_params )
977
+ );
978
+ $device_params = Ga_Stats::get_query( 'device', $selected['view_id'], $date_ranges );
979
+ $device_data = self::api_client()->call(
980
+ 'ga_api_data',
981
+ array( $device_params )
982
+ );
983
+
984
+ $boxes_data = self::api_client()->call(
985
+ 'ga_api_data',
986
+ array( Ga_Stats::get_query( 'boxes', $selected['view_id'] ) )
987
+ );
988
+ $sources_data = self::api_client()->call(
989
+ 'ga_api_data',
990
+ array( Ga_Stats::get_query( 'sources', $selected['view_id'] ) )
991
+ );
992
+
993
+ $chart = ! empty( $stats_data ) ? Ga_Stats::get_chart( $stats_data->get_data(), $period_in_days ) : array();
994
+ $device_chart = false === empty( $device_data ) ? Ga_Stats::get_device_chart( $device_data->get_data() ) : array();
995
+ $gender_chart = ! empty( $gender_data ) ? Ga_Stats::get_gender_chart( $gender_data->get_data() ) : array();
996
+ $age_chart = ! empty( $age_data ) ? Ga_Stats::get_age_chart( $age_data->get_data() ) : array();
997
+ $boxes = ! empty( $boxes_data ) ? Ga_Stats::get_boxes( $boxes_data->get_data() ) : array();
998
+ $last_chart_date = ! empty( $chart ) ? $chart['date'] : strtotime( 'now' );
999
+
1000
+ unset( $chart['date'] );
1001
+ $labels = array(
1002
+ 'thisWeek' => gmdate( 'M d, Y', strtotime( '-6 day', $last_chart_date ) ) . ' - ' . gmdate( 'M d, Y', $last_chart_date ),
1003
+ 'thisMonth' => gmdate( 'M d, Y', strtotime( '-29 day', $last_chart_date ) ) . ' - ' . gmdate( 'M d, Y', $last_chart_date ),
1004
+ );
1005
+ $sources = ! empty( $sources_data ) ? Ga_Stats::get_sources( $sources_data->get_data() ) : array();
1006
+
1007
+ // Add gender/age data for default period (1 week ago vs 2 weeks ago).
1008
+ if ( $update_data ) {
1009
+ $gender_params = Ga_Stats::get_query( 'gender', $selected['view_id'] );
1010
+ $gender_data = self::api_client()->call(
1011
+ 'ga_api_data',
1012
+ array( $gender_params )
1013
+ );
1014
+ $age_params = Ga_Stats::get_query( 'age', $selected['view_id'] );
1015
+ $age_data = self::api_client()->call(
1016
+ 'ga_api_data',
1017
+ array( $age_params )
1018
+ );
1019
+
1020
+ $gender_chart = ! empty( $gender_data ) ? Ga_Stats::get_gender_chart( $gender_data->get_data() ) : array();
1021
+ $age_chart = ! empty( $age_data ) ? Ga_Stats::get_age_chart( $age_data->get_data() ) : array();
1022
+
1023
+ self::update_demo_data(
1024
+ $gender_chart,
1025
+ $age_chart
1026
+ );
1027
+ }
1028
+
1029
+ return array( $chart, $age_chart, $device_chart, $gender_chart, $boxes, $labels, $sources );
1030
+ }
1031
+
1032
+ /**
1033
+ * Update demo data.
1034
+ *
1035
+ * @param array|bool $gender_response Gender response array.
1036
+ * @param array|bool $age_response Age response array.
1037
+ *
1038
+ * @return void
1039
+ */
1040
+ private static function update_demo_data( $gender_response = false, $age_response = false ) {
1041
+ $x = 0;
1042
+
1043
+ $demo_send_data = array();
1044
+ if ( $gender_response && $age_response ) {
1045
+ foreach ( $age_response as $type => $amount ) {
1046
+ $demo_send_data['age'][ $type ] = intval( $amount );
1047
+ $x ++;
1048
+ }
1049
+ foreach ( $gender_response as $type => $amount ) {
1050
+ $demo_send_data['gender'][ ucfirst( $type ) ] = intval( $amount );
1051
+ $x ++;
1052
+ }
1053
+ }
1054
+
1055
+ // Add data for send.
1056
+ update_option( 'googleanalytics_demo_data', wp_json_encode( $demo_send_data ) );
1057
+
1058
+ // Trigger send.
1059
+ update_option( 'googleanalytics_send_data', 'true' );
1060
+ }
1061
+
1062
+ /**
1063
+ * Check if we should send batch of demo data.
1064
+ *
1065
+ * @return bool
1066
+ */
1067
+ private static function check_data_date() {
1068
+ $demo_enabled = get_option( 'googleanalytics_demographic' );
1069
+ $demo_date = get_option( 'googleanalytics_demo_date' );
1070
+ $demo_date = ! empty( $demo_date ) ? strtotime( $demo_date ) : '';
1071
+ $current_date = gmdate( 'Y-m-d' );
1072
+ $thirty_date = '' !== $demo_date ? gmdate( 'Y-m-d', strtotime( '+1 month', $demo_date ) ) : '';
1073
+
1074
+ if ( empty( $demo_enabled ) || ! $demo_enabled ) {
1075
+ return false;
1076
+ }
1077
+
1078
+ if ( '' !== $demo_date && $thirty_date <= $current_date ) {
1079
+ return true;
1080
+ } elseif ( '' === $demo_date ) {
1081
+ return true;
1082
+ }
1083
+
1084
+ return false;
1085
+ }
1086
+
1087
+ /**
1088
+ * Returns auth or re-auth button
1089
+ *
1090
+ * @param string $button_type Button type.
1091
+ *
1092
+ * @return string
1093
+ */
1094
+ public static function get_auth_button( $button_type ) {
1095
+ return Ga_View_Core::load(
1096
+ 'ga-auth-button',
1097
+ array(
1098
+ 'label' => 'auth' === $button_type ? 'Authenticate with Google' : 'Re-authenticate with Google',
1099
+ 'button_type' => $button_type,
1100
+ 'url' => self::get_auth_popup_url(),
1101
+ 'manually_id' => get_option( self::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME ),
1102
+ ),
1103
+ true
1104
+ );
1105
+ }
1106
+
1107
+ /**
1108
+ * Returns debug modal
1109
+ *
1110
+ * @return string
1111
+ */
1112
+ public static function get_debug_modal() {
1113
+ return Ga_View_Core::load(
1114
+ 'ga-debug-modal',
1115
+ array(
1116
+ 'debug_info' => Ga_SupportLogger::$debug_info,
1117
+ 'debug_help_message' => Ga_SupportLogger::$debug_help_message,
1118
+ ),
1119
+ true
1120
+ );
1121
+ }
1122
+
1123
+ /**
1124
+ * Ajax hide review.
1125
+ *
1126
+ * @param \WP_Post $post Post object.
1127
+ *
1128
+ * @return void
1129
+ */
1130
+ public static function ga_ajax_hide_review( $post ) {
1131
+ if ( true === Ga_Controller_Core::verify_nonce( 'ga_ajax_data_change' ) ) {
1132
+ update_option( 'googleanalytics-hide-review', true );
1133
+ }
1134
+
1135
+ wp_send_json_success( 'hidden' );
1136
+ }
1137
+
1138
+ /**
1139
+ * GA: Ajax callback for GDPR Enable.
1140
+ *
1141
+ * @param object $post Post object.
1142
+ *
1143
+ * @return void
1144
+ */
1145
+ public static function ga_ajax_gdpr_enable( $post ) {
1146
+ $post = filter_input_array( INPUT_POST, FILTER_SANITIZE_STRING );
1147
+
1148
+ array_walk_recursive(
1149
+ $post['config'],
1150
+ function ( &$value ) {
1151
+ $value = filter_var( trim( $value ), FILTER_SANITIZE_STRING );
1152
+ }
1153
+ );
1154
+
1155
+ if ( true === empty( $post['config'] ) ) {
1156
+ wp_send_json_error( 'No config found.' );
1157
+ }
1158
+
1159
+ update_option( 'googleanalytics_gdpr_config', $post['config'] );
1160
+
1161
+ wp_send_json_success( 'gdpr_on' );
1162
+ }
1163
+
1164
+ /**
1165
+ * GA: Ajax callback for Demo Enable.
1166
+ *
1167
+ * @param object $post Post object.
1168
+ *
1169
+ * @return void
1170
+ */
1171
+ public static function ga_ajax_enable_demo( $post ) {
1172
+ check_ajax_referer( 'ga_demo_nonce', 'nonce' );
1173
+
1174
+ $enabled = 'true' === filter_input( INPUT_POST, 'enabled', FILTER_SANITIZE_STRING );
1175
+
1176
+ update_option( 'googleanalytics_demographic', $enabled );
1177
+
1178
+ wp_send_json_success( 'demo_on' );
1179
+ }
1180
+
1181
+ /**
1182
+ * GA: Ajax callback for Demo Enable.
1183
+ *
1184
+ * @param object $post Post object.
1185
+ *
1186
+ * @return void
1187
+ */
1188
+ public static function ga_ajax_sign_out( $post ) {
1189
+ check_ajax_referer( 'ga_page_nonce', 'nonce' );
1190
+
1191
+ update_option( self::GA_OAUTH_AUTH_CODE_OPTION_NAME, '' );
1192
+ update_option( self::GA_OAUTH_AUTH_TOKEN_OPTION_NAME, '' );
1193
+
1194
+ wp_send_json_success();
1195
+ }
1196
+
1197
+ /**
1198
+ * New property creation method.
1199
+ */
1200
+ public static function create_ga_property() {
1201
+ check_ajax_referer( 'googleanalyticsnonce', 'nonce' );
1202
+
1203
+ $property_id = filter_input( INPUT_POST, 'propid', FILTER_SANITIZE_STRING );
1204
+
1205
+ $secret = filter_input( INPUT_POST, 'secret', FILTER_SANITIZE_STRING );
1206
+
1207
+ if ( true === empty( $property_id ) || true === empty( $secret ) ) {
1208
+ wp_send_json_error( 'Set credentials failed.' );
1209
+ }
1210
+
1211
+ $secret = sanitize_text_field( wp_unslash( $secret ) );
1212
+ $property_id = sanitize_text_field( wp_unslash( $property_id ) );
1213
+
1214
+ update_option( self::GA_SHARETHIS_PROPERTY_ID, $property_id );
1215
+ update_option( self::GA_SHARETHIS_PROPERTY_SECRET, $secret );
1216
+ }
1217
+
1218
+ /**
1219
+ * Helper function to get vendors.
1220
+ *
1221
+ * @return array Array of vendors.
1222
+ */
1223
+ private static function get_vendors() {
1224
+ $response = wp_remote_get( 'https://vendor-list.consensu.org/v2/vendor-list.json' );
1225
+
1226
+ return json_decode( wp_remote_retrieve_body( $response ), true );
1227
+ }
1228
+ }
class/{Ga_Autoloader.php → class-ga-autoloader.php} RENAMED
@@ -1,7 +1,14 @@
1
  <?php
2
-
 
 
 
 
 
 
 
 
3
  class Ga_Autoloader {
4
-
5
  /**
6
  * Registers clas loader.
7
  */
@@ -12,45 +19,45 @@ class Ga_Autoloader {
12
  /**
13
  * Class loader.
14
  *
15
- * @param $class_name
16
  */
17
  private static function loader( $class_name ) {
 
18
 
19
- // Core classes
20
  if ( preg_match( '/_Core/', $class_name ) ) {
21
- $file_name = GA_PLUGIN_DIR . '/class/core/' . $class_name . '.php';
22
  if ( file_exists( $file_name ) ) {
23
  require $file_name;
24
  }
25
  }
26
 
27
- // Controllers
28
  if ( preg_match( '/_Controller/', $class_name ) ) {
29
- $file_name = GA_PLUGIN_DIR . '/class/controller/' . $class_name . '.php';
30
  if ( file_exists( $file_name ) ) {
31
  require $file_name;
32
  }
33
  }
34
 
35
- // classes
36
- $file_name = GA_PLUGIN_DIR . '/class/' . $class_name . '.php';
37
  if ( file_exists( $file_name ) ) {
38
  require $file_name;
39
  }
40
 
41
- // tools
42
- $file_name_tools = GA_PLUGIN_DIR . '/tools/' . $class_name . '.php';
43
  if ( file_exists( $file_name_tools ) ) {
44
  require $file_name_tools;
45
  }
46
 
47
- // Libs
48
  if ( preg_match( '/Ga_Lib/', $class_name ) ) {
49
- $file_name = GA_PLUGIN_DIR . '/lib/' . $class_name . '.php';
50
  if ( file_exists( $file_name ) ) {
51
  require $file_name;
52
  }
53
  }
54
  }
55
-
56
  }
1
  <?php
2
+ /**
3
+ * GoogleAnalytics Autoloader.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ /**
9
+ * Autoloader class.
10
+ */
11
  class Ga_Autoloader {
 
12
  /**
13
  * Registers clas loader.
14
  */
19
  /**
20
  * Class loader.
21
  *
22
+ * @param string $class_name Class name string.
23
  */
24
  private static function loader( $class_name ) {
25
+ $class_slug = 'class-' . str_replace( '_', '-', sanitize_title( $class_name ) );
26
 
27
+ // Core classes.
28
  if ( preg_match( '/_Core/', $class_name ) ) {
29
+ $file_name = GA_PLUGIN_DIR . '/class/core/' . $class_slug . '.php';
30
  if ( file_exists( $file_name ) ) {
31
  require $file_name;
32
  }
33
  }
34
 
35
+ // Controllers.
36
  if ( preg_match( '/_Controller/', $class_name ) ) {
37
+ $file_name = GA_PLUGIN_DIR . '/class/controller/' . $class_slug . '.php';
38
  if ( file_exists( $file_name ) ) {
39
  require $file_name;
40
  }
41
  }
42
 
43
+ // Classes.
44
+ $file_name = GA_PLUGIN_DIR . '/class/' . $class_slug . '.php';
45
  if ( file_exists( $file_name ) ) {
46
  require $file_name;
47
  }
48
 
49
+ // Tools.
50
+ $file_name_tools = GA_PLUGIN_DIR . '/tools/' . $class_slug . '.php';
51
  if ( file_exists( $file_name_tools ) ) {
52
  require $file_name_tools;
53
  }
54
 
55
+ // Libs.
56
  if ( preg_match( '/Ga_Lib/', $class_name ) ) {
57
+ $file_name = GA_PLUGIN_DIR . '/lib/' . $class_slug . '.php';
58
  if ( file_exists( $file_name ) ) {
59
  require $file_name;
60
  }
61
  }
62
  }
 
63
  }
class/{Ga_Frontend.php → class-ga-frontend.php} RENAMED
@@ -1,15 +1,29 @@
1
  <?php
 
 
 
 
 
2
 
 
 
 
3
  class Ga_Frontend {
4
 
5
  const GA_SHARETHIS_PLATFORM_URL = '//platform-api.sharethis.com/js/sharethis.js';
6
 
 
 
 
 
 
7
  public static function platform_sharethis() {
8
  $url = self::GA_SHARETHIS_PLATFORM_URL . '#product=ga';
9
  if ( get_option( Ga_Admin::GA_SHARETHIS_PROPERTY_ID ) ) {
10
  $url = $url . '&property=' . get_option( Ga_Admin::GA_SHARETHIS_PROPERTY_ID );
11
  }
12
- wp_register_script( GA_NAME . '-platform-sharethis', $url, null, null, false );
 
13
  wp_enqueue_script( GA_NAME . '-platform-sharethis' );
14
  }
15
 
@@ -23,11 +37,17 @@ class Ga_Frontend {
23
  add_action( 'wp_head', 'Ga_Frontend::insert_ga_script' );
24
  }
25
 
 
 
 
 
 
26
  public static function insert_ga_script() {
27
- if ( Ga_Helper::can_add_ga_code() || Ga_Helper::is_all_feature_disabled() ) {
28
- $web_property_id = Ga_Frontend::get_web_property_id();
29
  $optimize = get_option( 'googleanalytics_optimize_code' );
30
  $anonymization = get_option( 'googleanalytics_ip_anonymization' );
 
31
 
32
  if ( Ga_Helper::should_load_ga_javascript( $web_property_id ) ) {
33
  $data = array(
@@ -36,7 +56,7 @@ class Ga_Frontend {
36
  'anonymization' => $anonymization,
37
  );
38
 
39
- include plugin_dir_path( __FILE__ ) . '../view/ga_code.php';
40
  }
41
  }
42
  }
@@ -48,11 +68,10 @@ class Ga_Frontend {
48
  */
49
  public static function get_web_property_id() {
50
  $web_property_id = get_option( Ga_Admin::GA_WEB_PROPERTY_ID_OPTION_NAME );
51
- if ( Ga_Helper::is_code_manually_enabled() || Ga_Helper::is_all_feature_disabled() ) {
52
  $web_property_id = get_option( Ga_Admin::GA_WEB_PROPERTY_ID_MANUALLY_VALUE_OPTION_NAME );
53
  }
54
 
55
  return $web_property_id;
56
  }
57
-
58
  }
1
  <?php
2
+ /**
3
+ * GoogleAnalytics Frontend.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
 
8
+ /**
9
+ * Frontend.
10
+ */
11
  class Ga_Frontend {
12
 
13
  const GA_SHARETHIS_PLATFORM_URL = '//platform-api.sharethis.com/js/sharethis.js';
14
 
15
+ /**
16
+ * Platform ShareThis.
17
+ *
18
+ * @return void
19
+ */
20
  public static function platform_sharethis() {
21
  $url = self::GA_SHARETHIS_PLATFORM_URL . '#product=ga';
22
  if ( get_option( Ga_Admin::GA_SHARETHIS_PROPERTY_ID ) ) {
23
  $url = $url . '&property=' . get_option( Ga_Admin::GA_SHARETHIS_PROPERTY_ID );
24
  }
25
+
26
+ wp_register_script( GA_NAME . '-platform-sharethis', $url, null, null, false ); // phpcs:ignore
27
  wp_enqueue_script( GA_NAME . '-platform-sharethis' );
28
  }
29
 
37
  add_action( 'wp_head', 'Ga_Frontend::insert_ga_script' );
38
  }
39
 
40
+ /**
41
+ * Insert GoogleAnalytics script.
42
+ *
43
+ * @return void
44
+ */
45
  public static function insert_ga_script() {
46
+ if ( true === Ga_Helper::can_add_ga_code() || true === Ga_Helper::is_all_feature_disabled() ) {
47
+ $web_property_id = self::get_web_property_id();
48
  $optimize = get_option( 'googleanalytics_optimize_code' );
49
  $anonymization = get_option( 'googleanalytics_ip_anonymization' );
50
+ $debug_mode_on = 'on' === get_option( 'googleanalytics_enable_debug_mode', 'off' );
51
 
52
  if ( Ga_Helper::should_load_ga_javascript( $web_property_id ) ) {
53
  $data = array(
56
  'anonymization' => $anonymization,
57
  );
58
 
59
+ include plugin_dir_path( __FILE__ ) . '../view/ga-code.php';
60
  }
61
  }
62
  }
68
  */
69
  public static function get_web_property_id() {
70
  $web_property_id = get_option( Ga_Admin::GA_WEB_PROPERTY_ID_OPTION_NAME );
71
+ if ( true === Ga_Helper::is_code_manually_enabled() || true === Ga_Helper::is_all_feature_disabled() ) {
72
  $web_property_id = get_option( Ga_Admin::GA_WEB_PROPERTY_ID_MANUALLY_VALUE_OPTION_NAME );
73
  }
74
 
75
  return $web_property_id;
76
  }
 
77
  }
class/class-ga-helper.php ADDED
@@ -0,0 +1,888 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * GoogleAnalytics Helper.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ /**
9
+ * Helper class.
10
+ */
11
+ class Ga_Helper {
12
+
13
+ const ROLE_ID_PREFIX = 'role-id-';
14
+ const GA_DEFAULT_WEB_ID = 'UA-0000000-0';
15
+ const GA_STATISTICS_PAGE_URL = 'admin.php?page=googleanalytics';
16
+ const GA_SETTINGS_PAGE_URL = 'admin.php?page=googleanalytics/settings';
17
+ const DASHBOARD_PAGE_NAME = 'dashboard';
18
+ const PHP_VERSION_REQUIRED = '5.2.17';
19
+ const GA_WP_MODERN_VERSION = '4.1';
20
+ const GA_TOOLTIP_TERMS_NOT_ACCEPTED = 'Please accept the terms to use this feature.';
21
+ const GA_TOOLTIP_FEATURES_DISABLED = 'Click the Enable button at the top to start using this feature.';
22
+ const GA_DEBUG_MODE = false;
23
+
24
+ /**
25
+ * Init plugin actions.
26
+ */
27
+ public static function init() {
28
+
29
+ // Displays errors related to required PHP version.
30
+ if ( false === self::is_php_version_valid() ) {
31
+ add_action( 'admin_notices', 'Ga_Admin::admin_notice_googleanalytics_php_version' );
32
+
33
+ return false;
34
+ }
35
+
36
+ // Displays errors related to required WP version.
37
+ if ( false === self::is_wp_version_valid() ) {
38
+ add_action( 'admin_notices', 'Ga_Admin::admin_notice_googleanalytics_wp_version' );
39
+
40
+ return false;
41
+ }
42
+
43
+ if ( ! is_admin() ) {
44
+ Ga_Frontend::add_actions();
45
+ }
46
+
47
+ if ( is_admin() ) {
48
+ Ga_Admin::add_filters();
49
+ Ga_Admin::add_actions();
50
+ Ga_Admin::init_oauth();
51
+
52
+ $admin_controller = new Ga_Admin_Controller();
53
+ $admin_controller->handle_actions();
54
+ }
55
+ }
56
+
57
+ /**
58
+ * Checks if current page is a WordPress dashboard.
59
+ *
60
+ * @return integer
61
+ */
62
+ public static function is_plugin_page() {
63
+ $site = get_current_screen();
64
+
65
+ $request_uri = filter_input( INPUT_SERVER, 'REQUEST_URI', FILTER_SANITIZE_URL );
66
+
67
+ return preg_match( '/' . GA_NAME . '/i', $site->base )
68
+ || preg_match( '/' . GA_NAME . '/i', $request_uri );
69
+ }
70
+
71
+ /**
72
+ * Checks if current page is a WordPress dashboard.
73
+ *
74
+ * @return number
75
+ */
76
+ public static function is_dashboard_page() {
77
+ $site = get_current_screen();
78
+
79
+ return preg_match( '/' . self::DASHBOARD_PAGE_NAME . '/', $site->base );
80
+ }
81
+
82
+ /**
83
+ * Check whether the plugin is configured.
84
+ *
85
+ * @param string $web_id Web ID string.
86
+ *
87
+ * @return boolean
88
+ */
89
+ public static function is_configured( $web_id ) {
90
+ return self::GA_DEFAULT_WEB_ID !== $web_id && false === empty( $web_id );
91
+ }
92
+
93
+ /**
94
+ * Prepare an array of current site's user roles
95
+ *
96
+ * @return array
97
+ */
98
+ public static function get_user_roles() {
99
+ global $wp_roles;
100
+ if ( false === isset( $wp_roles ) ) {
101
+ $wp_roles = new WP_Roles(); // phpcs:ignore
102
+ }
103
+
104
+ return $wp_roles->get_names();
105
+ }
106
+
107
+ /**
108
+ * Prepare a role ID.
109
+ *
110
+ * The role ID is derived from the role's name and will be used
111
+ * in its setting name in the additional settings.
112
+ *
113
+ * @param string $role_name Role name.
114
+ *
115
+ * @return string
116
+ */
117
+ public static function prepare_role_id( $role_name ) {
118
+ return self::ROLE_ID_PREFIX . strtolower( preg_replace( '/[\W]/', '-', before_last_bar( $role_name ) ) );
119
+ }
120
+
121
+ /**
122
+ * Prepares role id.
123
+ *
124
+ * @param string $v Value string.
125
+ * @param string $k Key string.
126
+ */
127
+ public static function prepare_role( &$v, $k ) {
128
+ $v = self::prepare_role_id( $v );
129
+ }
130
+
131
+ /**
132
+ * Checks whether user role is excluded from adding UA code.
133
+ *
134
+ * @return boolean
135
+ */
136
+ public static function can_add_ga_code() {
137
+ $current_user = wp_get_current_user();
138
+ $user_roles = ! empty( $current_user->roles ) ? $current_user->roles : array();
139
+ $exclude_roles = json_decode( get_option( Ga_Admin::GA_EXCLUDE_ROLES_OPTION_NAME ), true );
140
+
141
+ array_walk( $user_roles, 'Ga_Helper::prepare_role' );
142
+
143
+ $return = true;
144
+ foreach ( $user_roles as $role ) {
145
+ if ( ! empty( $exclude_roles[ $role ] ) ) {
146
+ $return = false;
147
+ break;
148
+ }
149
+ }
150
+
151
+ return $return;
152
+ }
153
+
154
+ /**
155
+ * Adds ga dashboard widget HTML code for a WordPress Dashboard widget hook.
156
+ */
157
+ public static function add_ga_dashboard_widget() {
158
+ $widget = self::get_ga_dashboard_widget(
159
+ null,
160
+ false,
161
+ false,
162
+ true
163
+ );
164
+
165
+ echo wp_kses(
166
+ $widget,
167
+ array(
168
+ 'a' => array(
169
+ 'href' => array(),
170
+ ),
171
+ 'button' => array(
172
+ 'class' => array(),
173
+ 'id' => array(),
174
+ 'style' => array(),
175
+ ),
176
+ 'div' => array(
177
+ 'class' => array(),
178
+ 'id' => array(),
179
+ 'style' => array(),
180
+ ),
181
+ 'select' => array(
182
+ 'id' => array(),
183
+ 'autocomplete' => array(),
184
+ ),
185
+ 'script' => array(
186
+ 'type' => array(),
187
+ ),
188
+ 'option' => array(
189
+ 'value' => array(),
190
+ 'selected' => array(),
191
+ ),
192
+ )
193
+ );
194
+ }
195
+
196
+ /**
197
+ * Generates dashboard widget HTML code.
198
+ *
199
+ * @param string $date_range Google Analytics specific date range string.
200
+ * @param boolean $text_mode Text mode.
201
+ * @param boolean $ajax Ajax.
202
+ * @param boolean $trigger_request Trigger request.
203
+ *
204
+ * @return null | string HTML dashboard widget code.
205
+ */
206
+ public static function get_ga_dashboard_widget(
207
+ $date_range = null,
208
+ $text_mode = false,
209
+ $ajax = false,
210
+ $trigger_request = false
211
+ ) {
212
+ if ( empty( $date_range ) ) {
213
+ $date_range = '30daysAgo';
214
+ }
215
+
216
+ if ( false === $trigger_request ) {
217
+ // Get chart and boxes data.
218
+ $data = self::get_dashboard_widget_data( $date_range );
219
+
220
+ if ( $text_mode ) {
221
+ return self::get_chart_page(
222
+ 'ga-dashboard-widget' . ( $ajax ? '_ajax' : '' ),
223
+ array(
224
+ 'chart' => $data['chart'],
225
+ 'boxes' => $data['boxes'],
226
+ )
227
+ );
228
+ } else {
229
+ return self::get_chart_page(
230
+ 'ga-dashboard-widget' . ( $ajax ? '_ajax' : '' ),
231
+ array(
232
+ 'chart' => $data['chart'],
233
+ 'boxes' => $data['boxes'],
234
+ 'more_details_url' => admin_url( self::GA_STATISTICS_PAGE_URL ),
235
+ 'ga_nonce' => wp_create_nonce( 'ga_ajax_data_change' ),
236
+ 'ga_nonce_name' => Ga_Admin_Controller::GA_NONCE_FIELD_NAME,
237
+ )
238
+ );
239
+ }
240
+ } else {
241
+ return self::get_chart_page(
242
+ 'ga-dashboard-widget' . ( $ajax ? '_ajax' : '' ),
243
+ array(
244
+ 'chart' => array(),
245
+ 'boxes' => Ga_Stats::get_empty_boxes_structure(),
246
+ 'more_details_url' => admin_url( self::GA_STATISTICS_PAGE_URL ),
247
+ 'show_trigger_button' => true,
248
+ 'ga_nonce' => wp_create_nonce( 'ga_ajax_data_change' ),
249
+ 'ga_nonce_name' => Ga_Admin_Controller::GA_NONCE_FIELD_NAME,
250
+ )
251
+ );
252
+ }
253
+
254
+ return null;
255
+ }
256
+
257
+ /**
258
+ * Generates JSON data string for AJAX calls.
259
+ *
260
+ * @param string $date_range Date range.
261
+ * @param string $metric Metric string.
262
+ * @param boolean $text_mode Text mode.
263
+ * @param boolean $ajax Ajax.
264
+ *
265
+ * @return string|false Returns JSON data string
266
+ */
267
+ public static function get_ga_dashboard_widget_data_json(
268
+ $date_range = null, $metric = null, $text_mode = false, $ajax = false
269
+ ) {
270
+ if ( empty( $date_range ) ) {
271
+ $date_range = '30daysAgo';
272
+ }
273
+
274
+ if ( empty( $metric ) ) {
275
+ $metric = 'pageviews';
276
+ }
277
+
278
+ $data = self::get_dashboard_widget_data( $date_range, $metric );
279
+
280
+ return wp_json_encode( $data );
281
+ }
282
+
283
+ /**
284
+ * Gets dashboard widget data.
285
+ *
286
+ * @param string $date_range Date range string.
287
+ * @param string $metric Metric.
288
+ *
289
+ * @return array Return chart and boxes data
290
+ */
291
+ private static function get_dashboard_widget_data( $date_range, $metric = null ) {
292
+ $selected = self::get_selected_account_data( true );
293
+ if ( self::is_authorized() && self::is_account_selected() ) {
294
+ $query_params = Ga_Stats::get_query( 'main_chart', $selected['view_id'], $date_range, $metric, true );
295
+ $stats_data = Ga_Admin::api_client()->call(
296
+ 'ga_api_data',
297
+ array(
298
+ $query_params,
299
+ )
300
+ );
301
+
302
+ $boxes_query = Ga_Stats::get_query( 'dashboard_boxes', $selected['view_id'], $date_range, null, true );
303
+ $boxes_data = Ga_Admin::api_client()->call(
304
+ 'ga_api_data',
305
+ array(
306
+ $boxes_query,
307
+ )
308
+ );
309
+ }
310
+ $chart = ! empty( $stats_data ) ? Ga_Stats::get_dashboard_chart( $stats_data->get_data() ) : array();
311
+ $boxes = ! empty( $boxes_data ) ? Ga_Stats::get_dashboard_boxes_data( $boxes_data->get_data() ) : array();
312
+
313
+ return array(
314
+ 'chart' => $chart,
315
+ 'boxes' => $boxes,
316
+ );
317
+ }
318
+
319
+ /**
320
+ * Is account selected?
321
+ *
322
+ * @return bool
323
+ */
324
+ public static function is_account_selected() {
325
+ return false === empty( self::get_selected_account_data() );
326
+ }
327
+
328
+ /**
329
+ * Returns HTML code of the chart page or a notice.
330
+ *
331
+ * @param string $view View string.
332
+ * @param array $params Params array.
333
+ *
334
+ * @return string Returns HTML code
335
+ */
336
+ public static function get_chart_page( $view, $params ) {
337
+ $message = sprintf(
338
+ /* translators: %s is the settings page URL. */
339
+ __( 'Statistics can only be seen after you authenticate with your Google account on the <a href="%s">Settings page</a>.' ),
340
+ admin_url( self::GA_SETTINGS_PAGE_URL )
341
+ );
342
+
343
+ if ( true === self::is_authorized() && false === self::is_code_manually_enabled() && false === self::is_all_feature_disabled() ) {
344
+ if ( true === self::is_account_selected() ) {
345
+ if ( false === empty( $params ) ) {
346
+ return Ga_View_Core::load( $view, $params, true );
347
+ } else {
348
+ return self::ga_oauth_notice( sprintf( 'Please configure your <a href="%s">Google Analytics settings</a>.', admin_url( self::GA_SETTINGS_PAGE_URL ) ) );
349
+ }
350
+ } else {
351
+ return self::ga_oauth_notice( $message );
352
+ }
353
+ } else {
354
+ return self::ga_oauth_notice( $message );
355
+ }
356
+ }
357
+
358
+ /**
359
+ * Checks whether users is authorized with Google.
360
+ *
361
+ * @return boolean
362
+ */
363
+ public static function is_authorized() {
364
+ return Ga_Admin::api_client()->get_instance()->is_authorized();
365
+ }
366
+
367
+ /**
368
+ * Wrapper for WordPress method get_option
369
+ *
370
+ * @param string $name Option name.
371
+ * @param mixed|null $default Default value if fetched option is null.
372
+ *
373
+ * @return mixed|null
374
+ */
375
+ public static function get_option( $name, $default = null ) {
376
+ $opt = get_option( $name, $default );
377
+
378
+ return false === empty( $opt ) ? $opt : $default;
379
+ }
380
+
381
+ /**
382
+ * Wrapper for WordPress method update_option
383
+ *
384
+ * @param string $name Option name.
385
+ * @param mixed $value Option value.
386
+ *
387
+ * @return null|boolean
388
+ */
389
+ public static function update_option( $name, $value ) {
390
+ $opt = update_option( $name, $value );
391
+
392
+ return ! empty( $opt ) ? $opt : null;
393
+ }
394
+
395
+ /**
396
+ * Loads ga notice HTML code with given message included.
397
+ *
398
+ * @param string $message Message.
399
+ *
400
+ * @return string
401
+ */
402
+ public static function ga_oauth_notice( $message ) {
403
+ return Ga_View_Core::load(
404
+ 'ga-oauth-notice',
405
+ array(
406
+ 'msg' => $message,
407
+ ),
408
+ true
409
+ );
410
+ }
411
+
412
+ /**
413
+ * Displays notice following the WP style.
414
+ *
415
+ * @param string $message Message string.
416
+ * @param string $type Type string.
417
+ * @param bool $is_dismissable Whether the notice is dismissable.
418
+ * @param string $action Action type.
419
+ *
420
+ * @return string
421
+ */
422
+ public static function ga_wp_notice( $message, $type = '', $is_dismissable = false, $action = array() ) {
423
+ return Ga_View_Core::load(
424
+ 'ga-wp-notice',
425
+ array(
426
+ 'notice_type' => empty( $type ) ? Ga_Admin::NOTICE_WARNING : $type,
427
+ 'msg' => $message,
428
+ 'is_dismissable' => $is_dismissable,
429
+ 'action' => $action,
430
+ ),
431
+ true
432
+ );
433
+ }
434
+
435
+ /**
436
+ * Gets data according to selected GA account.
437
+ *
438
+ * @param boolean $assoc Whether the return should be an associative array.
439
+ *
440
+ * @return mixed
441
+ */
442
+ public static function get_selected_account_data( $assoc = false ) {
443
+ $data = json_decode( self::get_option( Ga_Admin::GA_SELECTED_ACCOUNT ) );
444
+ $data = ( false === empty( $data ) && 3 === count( $data ) ) ? $data : false;
445
+
446
+ if ( $data ) {
447
+ if ( $assoc ) {
448
+ return array(
449
+ 'account_id' => $data[0],
450
+ 'web_property_id' => $data[1],
451
+ 'view_id' => $data[2],
452
+ );
453
+ } else {
454
+ return $data;
455
+ }
456
+ }
457
+
458
+ return false;
459
+ }
460
+
461
+ /**
462
+ * Checks whether option for manually UA-code.
463
+ *
464
+ * @return boolean
465
+ */
466
+ public static function is_code_manually_enabled() {
467
+ return boolval( self::get_option( Ga_Admin::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME, false ) );
468
+ }
469
+
470
+ /**
471
+ * Adds percent sign to the given text.
472
+ *
473
+ * @param string $text Text string to format as a percentage.
474
+ *
475
+ * @return string
476
+ */
477
+ public static function format_percent( $text ) {
478
+ $text = self::add_plus( $text );
479
+
480
+ return $text . '%';
481
+ }
482
+
483
+ /**
484
+ * Adds plus sign before number.
485
+ *
486
+ * @param string $number Number string.
487
+ *
488
+ * @return string
489
+ */
490
+ public static function add_plus( $number ) {
491
+ if ( $number > 0 ) {
492
+ return '+' . $number;
493
+ }
494
+
495
+ return $number;
496
+ }
497
+
498
+ /**
499
+ * Check whether current user has administrator privileges.
500
+ *
501
+ * @return bool
502
+ */
503
+ public static function is_administrator() {
504
+ if ( current_user_can( 'administrator' ) ) {
505
+ return true;
506
+ }
507
+
508
+ return false;
509
+ }
510
+
511
+ /**
512
+ * Is this WordPress version valid?
513
+ *
514
+ * @return bool|int
515
+ */
516
+ public static function is_wp_version_valid() {
517
+ $wp_version = get_bloginfo( 'version' );
518
+
519
+ return version_compare( $wp_version, Ga_Admin::MIN_WP_VERSION, 'ge' );
520
+ }
521
+
522
+ /**
523
+ * Check if terms are accepted.
524
+ *
525
+ * @return bool
526
+ */
527
+ public static function are_terms_accepted() {
528
+ return boolval( self::get_option( Ga_Admin::GA_SHARETHIS_TERMS_OPTION_NAME ) );
529
+ }
530
+
531
+ /**
532
+ * Check if sharethis scripts enabled.
533
+ *
534
+ * @return bool
535
+ */
536
+ public static function is_sharethis_included() {
537
+ return boolval( GA_SHARETHIS_SCRIPTS_INCLUDED );
538
+ }
539
+
540
+ /**
541
+ * Is this PHP version valid?
542
+ *
543
+ * @return mixed
544
+ */
545
+ public static function is_php_version_valid() {
546
+ $p = '#(\.0+)+($|-)#';
547
+ $ver1 = preg_replace( $p, '', phpversion() );
548
+ $ver2 = preg_replace( $p, '', self::PHP_VERSION_REQUIRED );
549
+ $operator = 'ge';
550
+
551
+ return version_compare( $ver1, $ver2, $operator );
552
+ }
553
+
554
+ /**
555
+ * Get current URL.
556
+ *
557
+ * @return mixed
558
+ */
559
+ public static function get_current_url() {
560
+ return filter_input( INPUT_SERVER, 'REQUEST_URI', FILTER_SANITIZE_URL );
561
+ }
562
+
563
+ /**
564
+ * Create URL.
565
+ *
566
+ * @param string $url URL.
567
+ * @param array $data Data array.
568
+ *
569
+ * @return mixed|string
570
+ */
571
+ public static function create_url( $url, $data = array() ) {
572
+ return false === empty( $data ) ?
573
+ ( strstr( $url, '?' ) ?
574
+ ( $url . '&' ) :
575
+ ( $url . '?' ) ) . http_build_query( $data ) :
576
+ $url;
577
+ }
578
+
579
+ /**
580
+ * Create base64 url message
581
+ *
582
+ * @param string $msg Message.
583
+ * @param string $status Status.
584
+ *
585
+ * @return string
586
+ */
587
+ public static function create_url_msg( $msg, $status ) {
588
+ $msg = array(
589
+ 'status' => $status,
590
+ 'message' => $msg,
591
+ );
592
+
593
+ return base64_encode( wp_json_encode( $msg ) ); // phpcs:ignore
594
+ }
595
+
596
+ /**
597
+ * Are all features disabled?
598
+ *
599
+ * @return bool
600
+ */
601
+ public static function is_all_feature_disabled() {
602
+ return boolval( self::get_option( Ga_Admin::GA_DISABLE_ALL_FEATURES, false ) );
603
+ }
604
+
605
+ /**
606
+ * Are features enabled?
607
+ *
608
+ * @return bool
609
+ */
610
+ public static function are_features_enabled() {
611
+ return true === self::are_terms_accepted() && false === self::is_all_feature_disabled();
612
+ }
613
+
614
+ /**
615
+ * Are ShareThis properties verified?
616
+ *
617
+ * @return bool
618
+ */
619
+ public static function are_sharethis_properties_verified() {
620
+ return (
621
+ false !== get_option( Ga_Admin::GA_SHARETHIS_VERIFICATION_RESULT )
622
+ && true === self::are_sharethis_properties_set()
623
+ );
624
+ }
625
+
626
+ /**
627
+ * Are ShareThis properties ready to verify?
628
+ *
629
+ * @return bool
630
+ */
631
+ public static function are_sharethis_properties_ready_to_verify() {
632
+ return (
633
+ true === self::are_sharethis_properties_set()
634
+ && false === get_option( Ga_Admin::GA_SHARETHIS_VERIFICATION_RESULT )
635
+ );
636
+ }
637
+
638
+ /**
639
+ * Are ShareThis properties set?
640
+ *
641
+ * @return bool
642
+ */
643
+ public static function are_sharethis_properties_set() {
644
+ return (
645
+ false !== get_option( Ga_Admin::GA_SHARETHIS_PROPERTY_ID ) &&
646
+ false !== get_option( Ga_Admin::GA_SHARETHIS_PROPERTY_SECRET )
647
+ );
648
+ }
649
+
650
+ /**
651
+ * Should we create the ShareThis property?
652
+ *
653
+ * @return bool
654
+ */
655
+ public static function should_create_sharethis_property() {
656
+ return true === self::are_features_enabled() && false === self::are_sharethis_properties_set();
657
+ }
658
+
659
+ /**
660
+ * Should we verify the ShareThis installation?
661
+ *
662
+ * @return bool
663
+ */
664
+ public static function should_verify_sharethis_installation() {
665
+ return true === self::are_features_enabled() && true === self::are_sharethis_properties_ready_to_verify();
666
+ }
667
+
668
+ /**
669
+ * Get tooltip.
670
+ *
671
+ * @return string
672
+ */
673
+ public static function get_tooltip() {
674
+ if ( false === self::are_terms_accepted() ) {
675
+ return self::GA_TOOLTIP_TERMS_NOT_ACCEPTED;
676
+ } elseif ( false === self::are_features_enabled() ) {
677
+ return self::GA_TOOLTIP_FEATURES_DISABLED;
678
+ } else {
679
+ return '';
680
+ }
681
+ }
682
+
683
+ /**
684
+ * Is this version of WordPress considered old (< 4.1)?
685
+ *
686
+ * @return bool True if old, False if not.
687
+ */
688
+ public static function is_wp_old() {
689
+ return version_compare( get_bloginfo( 'version' ), self::GA_WP_MODERN_VERSION, 'lt' );
690
+ }
691
+
692
+ /**
693
+ * Should we load GA JavaScript on this property?
694
+ *
695
+ * @param string $web_property_id Web property ID.
696
+ *
697
+ * @return bool
698
+ */
699
+ public static function should_load_ga_javascript( $web_property_id ) {
700
+ return true === self::is_configured( $web_property_id )
701
+ && (
702
+ true === self::can_add_ga_code()
703
+ || true === self::is_all_feature_disabled()
704
+ );
705
+ }
706
+
707
+ /**
708
+ * Get account ID.
709
+ *
710
+ * @return string
711
+ */
712
+ public static function get_account_id() {
713
+ $account_id = json_decode( self::get_option( Ga_Admin::GA_SELECTED_ACCOUNT ) );
714
+
715
+ return ! empty( $account_id[0] ) ? $account_id[0] : '';
716
+ }
717
+
718
+ /**
719
+ * Is curl disabled?
720
+ *
721
+ * @return bool True if disabled, false if enabled.
722
+ */
723
+ public static function is_curl_disabled() {
724
+ return ! function_exists( 'curl_version' );
725
+ }
726
+
727
+ /**
728
+ * Get URL with correct protocol.
729
+ *
730
+ * @return string URL with correct protocol.
731
+ */
732
+ public static function get_plugin_url_with_correct_protocol() {
733
+ return GA_PLUGIN_URL;
734
+ }
735
+
736
+ /**
737
+ * Get code to manually label classes.
738
+ *
739
+ * @return string
740
+ */
741
+ public static function get_code_manually_label_classes() {
742
+ $classes = '';
743
+ if ( ! self::are_features_enabled() ) {
744
+ $classes = 'label-grey ga-tooltip';
745
+ } elseif ( self::is_account_selected() ) {
746
+ $classes = 'label-grey';
747
+ }
748
+ return $classes;
749
+ }
750
+
751
+ /**
752
+ * Get Previous Period for Dates (date start and date end).
753
+ *
754
+ * @param string $date_start Date string.
755
+ * @param string $date_end Date string.
756
+ *
757
+ * @return array Array of start and end dates in Y-m-d format.
758
+ * @since 2.5.2
759
+ */
760
+ public static function get_previous_period_for_dates( $date_start = '', $date_end = '' ) {
761
+ try {
762
+ // Get distance between dates in days.
763
+ $start = new DateTime( $date_start );
764
+ $end = new DateTime( $date_end );
765
+ } catch ( \Exception $e ) {
766
+ return array(
767
+ 'start' => gmdate( 'Y-m-d', strtotime( '-1 week' ) ),
768
+ 'end' => gmdate( 'Y-m-d' ),
769
+ );
770
+ }
771
+
772
+ // Clone $start date into end_previous so we don't modify $start.
773
+ $end_previous = clone $start;
774
+
775
+ // Set the period to the difference between the start/end dates in days.
776
+ $period = $end->diff( $start )->days;
777
+
778
+ // Subtract 1 day from $end_previous so it's one day before $start.
779
+ $end_previous->modify( '-1 day' );
780
+
781
+ // Clone $end_previous so we can subtract $period from it in days.
782
+ $start_previous = clone $end_previous;
783
+ $start_previous->modify( sprintf( '-%d day', $period ) );
784
+
785
+ return array(
786
+ 'start' => $start_previous->format( 'Y-m-d' ),
787
+ 'end' => $end_previous->format( 'Y-m-d' ),
788
+ );
789
+ }
790
+
791
+ /**
792
+ * Get period between dates in days.
793
+ *
794
+ * @param string $date_start Start date string.
795
+ * @param string $date_end End date string.
796
+ *
797
+ * @return int
798
+ * @since 2.5.2
799
+ */
800
+ public static function get_period_in_days( $date_start = '', $date_end = '' ) {
801
+ $date_start = empty( $date_start ) ? gmdate( 'Y-m-d', strtotime( '-1 week' ) ) : $date_start;
802
+ $date_end = empty( $date_end ) ? gmdate( 'Y-m-d' ) : $date_end;
803
+
804
+ try {
805
+ // Get distance between dates in days.
806
+ $start = new DateTime( $date_start );
807
+ $end = new DateTime( $date_end );
808
+ } catch ( \Exception $e ) {
809
+ return 0;
810
+ }
811
+
812
+ // Set the period to the difference between the start/end dates in days.
813
+ return intval( $start->diff( $end )->format( '%r%a' ) );
814
+ }
815
+
816
+ /**
817
+ * Get period in Days as words.
818
+ *
819
+ * @param string $date_start Start date string.
820
+ * @param string $date_end End date string.
821
+ *
822
+ * @return string Words to indicate days.
823
+ * @since 2.5.2
824
+ */
825
+ public static function get_period_in_days_words( $date_start = '', $date_end = '' ) {
826
+ $days = self::get_period_in_days( $date_start, $date_end );
827
+
828
+ $date_end = empty( $date_end ) ? strtotime( 'now' ) : strtotime( $date_end );
829
+
830
+ // If today is the same as the end date.
831
+ if ( gmdate( 'Y-m-d', $date_end ) === gmdate( 'Y-m-d' ) ) {
832
+ if ( 0 === $days ) {
833
+ return __( 'Today', 'googleanalytics' );
834
+ }
835
+
836
+ if ( 7 === $days ) {
837
+ return __( 'This Week', 'googleanalytics' );
838
+ }
839
+
840
+ return sprintf(
841
+ /* translators: %d stands for the Day or Days. */
842
+ _n( 'Last %d Day', 'Last %d Days', $days, 'googleanalytics' ),
843
+ $days
844
+ );
845
+ }
846
+
847
+ return sprintf(
848
+ /* translators: %d stands for the Day or Days. */
849
+ _n( '%d Day', '%d Days', $days, 'googleanalytics' ),
850
+ $days
851
+ );
852
+ }
853
+
854
+ /**
855
+ * Get date range from GET request.
856
+ *
857
+ * @return array
858
+ * @since 2.5.2
859
+ */
860
+ public static function get_date_range_from_request() {
861
+ $date_range = filter_input_array(
862
+ INPUT_GET,
863
+ array(
864
+ 'date_from' => FILTER_SANITIZE_STRING,
865
+ 'date_to' => FILTER_SANITIZE_STRING,
866
+ )
867
+ );
868
+
869
+ // If date_from is after date_to, let's reset 'from' to a week before 'to'.
870
+ if ( 0 > self::get_period_in_days( $date_range['date_from'], $date_range['date_to'] ) ) {
871
+ try {
872
+ $date = new DateTime( $date_range['date_to'] );
873
+ $date->modify( '-1 week' );
874
+
875
+ $date_from = $date->format( 'Y-m-d' );
876
+ } catch ( \Exception $e ) {
877
+ $date_from = gmdate( 'Y-m-d', strtotime( '-1 week' ) );
878
+ }
879
+
880
+ $date_range['date_from'] = $date_from;
881
+ }
882
+
883
+ return array(
884
+ 'from' => $date_range['date_from'],
885
+ 'to' => $date_range['date_to'],
886
+ );
887
+ }
888
+ }
class/{Ga_Hook.php → class-ga-hook.php} RENAMED
@@ -1,16 +1,23 @@
1
  <?php
 
 
 
 
 
2
 
 
 
 
3
  class Ga_Hook {
4
 
5
  /**
6
  * Adds WordPress hooks.
7
  *
8
- * @param string $plugin_file_path
9
  */
10
  public static function add_hooks( $plugin_file_path ) {
11
  register_activation_hook( $plugin_file_path, 'Ga_Admin::activate_googleanalytics' );
12
  register_deactivation_hook( $plugin_file_path, 'Ga_Admin::deactivate_googleanalytics' );
13
  register_uninstall_hook( $plugin_file_path, 'Ga_Admin::uninstall_googleanalytics' );
14
  }
15
-
16
  }
1
  <?php
2
+ /**
3
+ * Google Analytics hook class.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
 
8
+ /**
9
+ * Hook class.
10
+ */
11
  class Ga_Hook {
12
 
13
  /**
14
  * Adds WordPress hooks.
15
  *
16
+ * @param string $plugin_file_path Plugin file path string.
17
  */
18
  public static function add_hooks( $plugin_file_path ) {
19
  register_activation_hook( $plugin_file_path, 'Ga_Admin::activate_googleanalytics' );
20
  register_deactivation_hook( $plugin_file_path, 'Ga_Admin::deactivate_googleanalytics' );
21
  register_uninstall_hook( $plugin_file_path, 'Ga_Admin::uninstall_googleanalytics' );
22
  }
 
23
  }
class/class-ga-notice.php ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Google Analytics notice.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ /**
9
+ * Notice class.
10
+ */
11
+ class Ga_Notice {
12
+
13
+ /**
14
+ * Get translated error message.
15
+ *
16
+ * @param string $error Error string.
17
+ *
18
+ * @return string Translated error string.
19
+ */
20
+ public static function get_message( $error ) {
21
+ $message = '';
22
+
23
+ if ( Ga_Helper::GA_DEBUG_MODE ) {
24
+ $message = Ga_Helper::ga_wp_notice(
25
+ ( ! empty( $error['class'] ) ? esc_html( '[' . $error['class'] . ']' ) : '' ) . ' ' . $error['message'],
26
+ 'error'
27
+ );
28
+ } elseif ( 'Ga_Lib_Google_Api_Client_AuthCode_Exception' === $error['class'] ) {
29
+ $message = Ga_Helper::ga_wp_notice( $error['message'], 'error' );
30
+ } elseif ( 'Ga_Lib_Sharethis_Api_Client_InvalidDomain_Exception' === $error['class'] ) {
31
+ $message = Ga_Helper::ga_wp_notice( $error['message'], 'error' );
32
+ } elseif ( 'Ga_Lib_Sharethis_Api_Client_Invite_Exception' === $error['class'] ) {
33
+ $message = Ga_Helper::ga_wp_notice( $error['message'], 'error' );
34
+ } elseif (
35
+ in_array(
36
+ $error['class'],
37
+ array( 'Ga_Lib_Sharethis_Api_Client_Verify_Exception', 'Ga_Lib_Sharethis_Api_Client_Alerts_Exception' ),
38
+ true
39
+ )
40
+ ) {
41
+ $message = Ga_Helper::ga_wp_notice( $error['message'], 'error' );
42
+ } elseif ( 'Ga_Data_Outdated_Exception' === $error['class'] ) {
43
+ $message = Ga_Helper::ga_wp_notice( $error['message'], 'warning' );
44
+ } else {
45
+ $message = Ga_Helper::ga_wp_notice(
46
+ __( 'There are temporary connection issues, please try again later or go to Google Analytics website to see the dashboards' ),
47
+ 'error'
48
+ );
49
+ }
50
+
51
+ return $message;
52
+ }
53
+
54
+ }
class/class-ga-sharethis.php ADDED
@@ -0,0 +1,146 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Ga_Sharethis class
4
+ *
5
+ * Preparing request and parsing response from Sharethis Platform Api.
6
+ *
7
+ * @package GoogleAnalytics
8
+ */
9
+
10
+ /**
11
+ * Sharethis class.
12
+ */
13
+ class Ga_Sharethis {
14
+
15
+ /**
16
+ * Get body decoded from JSON.
17
+ *
18
+ * @param string $data Data string.
19
+ *
20
+ * @return mixed
21
+ */
22
+ public static function get_body( $data ) {
23
+ $body = $data->getBody();
24
+ return json_decode( $body );
25
+ }
26
+
27
+ /**
28
+ * Create sharethis options.
29
+ *
30
+ * @param object $api_client API client.
31
+ *
32
+ * @return array
33
+ */
34
+ public static function create_sharethis_options( $api_client ) {
35
+ $data = array();
36
+ $parsed_url = wp_parse_url( get_option( 'siteurl' ) );
37
+ $domain = $parsed_url['host'] . ( ! empty( $parsed_url['path'] ) ? $parsed_url['path'] : '' );
38
+ $query_params = array(
39
+ 'domain' => $domain,
40
+ 'is_wordpress' => true,
41
+ 'onboarding_product' => 'ga',
42
+ );
43
+ $response = $api_client->call(
44
+ 'ga_api_create_sharethis_property',
45
+ array(
46
+ $query_params,
47
+ )
48
+ );
49
+ $sharethis_options = self::get_sharethis_options( $response );
50
+ if ( ! empty( $sharethis_options['id'] ) ) {
51
+ add_option( Ga_Admin::GA_SHARETHIS_PROPERTY_ID, $sharethis_options['id'] );
52
+ }
53
+ if ( ! empty( $sharethis_options['secret'] ) ) {
54
+ add_option( Ga_Admin::GA_SHARETHIS_PROPERTY_SECRET, $sharethis_options['secret'] );
55
+ }
56
+
57
+ return $data;
58
+ }
59
+
60
+ /**
61
+ * Get ShareThis options array.
62
+ *
63
+ * @param object $response Response object.
64
+ *
65
+ * @return array
66
+ */
67
+ public static function get_sharethis_options( $response ) {
68
+ $body = self::get_body( $response );
69
+ $options = array();
70
+ if ( ! empty( $body ) ) {
71
+ foreach ( $body as $key => $value ) {
72
+ if ( '_id' === $key ) {
73
+ $options['id'] = $value;
74
+ } elseif ( 'secret' === $key ) {
75
+ $options['secret'] = $value;
76
+ } elseif ( 'error' === $key ) {
77
+ $options['error'] = $value;
78
+ }
79
+ }
80
+ } else {
81
+ $options['error'] = 'error';
82
+ }
83
+ return $options;
84
+ }
85
+
86
+ /**
87
+ * Installation verification.
88
+ *
89
+ * @param object $api_client API Client object.
90
+ *
91
+ * @return void
92
+ */
93
+ public static function sharethis_installation_verification( $api_client ) {
94
+ if ( Ga_Helper::should_verify_sharethis_installation() ) {
95
+ $query_params = array(
96
+ 'id' => get_option( Ga_Admin::GA_SHARETHIS_PROPERTY_ID ),
97
+ 'secret' => get_option( Ga_Admin::GA_SHARETHIS_PROPERTY_SECRET ),
98
+ );
99
+ $response = $api_client->call(
100
+ 'ga_api_sharethis_installation_verification',
101
+ array(
102
+ $query_params,
103
+ )
104
+ );
105
+ $result = self::get_verification_result( $response );
106
+ if ( ! empty( $result ) ) {
107
+ add_option( Ga_Admin::GA_SHARETHIS_VERIFICATION_RESULT, true );
108
+ }
109
+ }
110
+ }
111
+
112
+ /**
113
+ * Get verification result.
114
+ *
115
+ * @param object $response Response object.
116
+ *
117
+ * @return bool
118
+ */
119
+ public static function get_verification_result( $response ) {
120
+ $body = self::get_body( $response );
121
+ if ( ! empty( $body->{'status'} ) ) {
122
+ return true;
123
+ }
124
+ return false;
125
+ }
126
+
127
+ /**
128
+ * Get alerts.
129
+ *
130
+ * @param object $response Response object.
131
+ *
132
+ * @return array|mixed|object
133
+ */
134
+ public static function get_alerts( $response ) {
135
+ $body = self::get_body( $response );
136
+ if ( false === empty( $body ) ) {
137
+ if ( false === empty( $body['error'] ) ) {
138
+ return (object) array( 'error' => $body['error'] );
139
+ }
140
+
141
+ return $body;
142
+ } else {
143
+ return array();
144
+ }
145
+ }
146
+ }
class/class-ga-stats.php ADDED
@@ -0,0 +1,1083 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Google Analytics hook class.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ /**
9
+ * Ga_Stats class
10
+ *
11
+ * Preparing request and parsing response from Google Analytics Reporting Api
12
+ *
13
+ * @author wle@adips.com
14
+ * @version 1.0
15
+ */
16
+ class Ga_Stats {
17
+
18
+ /**
19
+ * Profile object.
20
+ *
21
+ * @var array Profile.
22
+ */
23
+ private $profile = array();
24
+
25
+ /**
26
+ * Primary class constructor.
27
+ *
28
+ * @access public
29
+ * @since 7.0.0
30
+ */
31
+ public function __construct() {
32
+ }
33
+
34
+ /**
35
+ * Preparing query to get Analytics data
36
+ *
37
+ * @param string $query Query type.
38
+ * @param int $id_view The Analytics view ID from which to retrieve data.
39
+ * @param string $date_range The start date for the query in the format YYYY-MM-DD or '7daysAgo'.
40
+ * @param string $metric A metric expression.
41
+ * @param bool $old Use old query style.
42
+ *
43
+ * @return array Request query
44
+ */
45
+ public static function get_query( $query, $id_view, $date_range = null, $metric = null, $old = false ) {
46
+ if ( 'main_chart' === $query ) {
47
+ return $old ? self::main_chart_query_old( $id_view, $date_range, $metric ) : self::main_chart_query(
48
+ $id_view,
49
+ $date_range,
50
+ $metric
51
+ );
52
+ } elseif ( 'gender' === $query ) {
53
+ return self::gender_chart_query( $id_view, $date_range, $metric );
54
+ } elseif ( 'device' === $query ) {
55
+ return self::device_chart_query( $id_view, $date_range, $metric );
56
+ } elseif ( 'age' === $query ) {
57
+ return self::age_chart_query( $id_view, $date_range, $metric );
58
+ } elseif ( 'boxes' === $query ) {
59
+ return self::boxes_query( $id_view );
60
+ } elseif ( 'dashboard_boxes' === $query ) {
61
+ return $old ? self::dashboard_boxes_query_old( $id_view, $date_range ) :
62
+ self::dashboard_boxes_query( $id_view, $date_range );
63
+ } elseif ( 'sources' === $query ) {
64
+ return self::sources_query( $id_view, $date_range );
65
+ } else {
66
+ return array();
67
+ }
68
+ }
69
+
70
+ /**
71
+ * Preparing query for top traffic sources table
72
+ *
73
+ * @param int $id_view The Analytics view ID from which to retrieve data.
74
+ * @param array $date_ranges An array representing the date ranges that will be passed to chart query.
75
+ *
76
+ * @return array Sources query
77
+ */
78
+ public static function sources_query( $id_view, $date_ranges ) {
79
+ $reports_requests = array();
80
+
81
+ $ts = filter_input( INPUT_GET, 'ts', FILTER_SANITIZE_STRING );
82
+
83
+ if ( false === empty( $ts ) ) {
84
+ $reports_requests[] = array(
85
+ 'viewId' => $id_view,
86
+ 'dateRanges' => $date_ranges,
87
+ 'metrics' => self::set_metrics( array( 'ga:pageviews' ) ),
88
+ 'includeEmptyRows' => true,
89
+ 'pageSize' => 10,
90
+ 'dimensions' => self::set_dimensions( 'ga:sourceMedium' ),
91
+ 'orderBys' => self::set_order_bys( 'ga:pageviews', 'DESCENDING' ),
92
+ );
93
+ } else {
94
+ $reports_requests[] = array(
95
+ 'viewId' => $id_view,
96
+ 'dateRanges' => $date_ranges,
97
+ 'metrics' => self::set_metrics(
98
+ array(
99
+ 'ga:pageviews',
100
+ 'ga:uniquePageviews',
101
+ 'ga:timeOnPage',
102
+ 'ga:bounces',
103
+ 'ga:entrances',
104
+ 'ga:exits',
105
+ )
106
+ ),
107
+ 'includeEmptyRows' => true,
108
+ 'pageSize' => 10,
109
+ 'dimensions' => self::set_dimensions( 'ga:pagePath' ),
110
+ 'orderBys' => self::set_order_bys( 'ga:pageviews', 'DESCENDING' ),
111
+ );
112
+ }
113
+
114
+ $query = array(
115
+ 'reportRequests' => $reports_requests,
116
+ );
117
+
118
+ return $query;
119
+ }
120
+
121
+ /**
122
+ * Preparing query for dashboard boxes
123
+ *
124
+ * @param int $id_view The Analytics view ID from which to retrieve data.
125
+ * @param array $date_ranges An array representing the date ranges that will be passed to chart query.
126
+ *
127
+ * @return array Dashboard boxes query
128
+ */
129
+ public static function dashboard_boxes_query( $id_view, $date_ranges ) {
130
+ $reports_requests = array();
131
+
132
+ $ts = filter_input( INPUT_GET, 'ts', FILTER_SANITIZE_STRING );
133
+
134
+ if ( false === empty( $ts ) ) {
135
+ $reports_requests[] = array(
136
+ 'viewId' => $id_view,
137
+ 'dateRanges' => $date_ranges,
138
+ 'metrics' => self::set_metrics( array( 'ga:pageviews' ) ),
139
+ 'includeEmptyRows' => true,
140
+ 'pageSize' => 10,
141
+ 'dimensions' => self::set_dimensions( 'ga:sourceMedium' ),
142
+ 'orderBys' => self::set_order_bys( 'ga:pageviews', 'DESCENDING' ),
143
+ );
144
+ } else {
145
+ $reports_requests[] = array(
146
+ 'viewId' => $id_view,
147
+ 'dateRanges' => $date_ranges,
148
+ 'metrics' => self::set_metrics(
149
+ array(
150
+ 'ga:pageviews',
151
+ 'ga:uniquePageviews',
152
+ 'ga:timeOnPage',
153
+ 'ga:bounces',
154
+ 'ga:entrances',
155
+ 'ga:exits',
156
+ )
157
+ ),
158
+ 'includeEmptyRows' => true,
159
+ 'pageSize' => 10,
160
+ 'dimensions' => self::set_dimensions( 'ga:pagePath' ),
161
+ 'orderBys' => self::set_order_bys( 'ga:pageviews', 'DESCENDING' ),
162
+ );
163
+ }
164
+ $query = array(
165
+ 'reportRequests' => $reports_requests,
166
+ );
167
+
168
+ return $query;
169
+ }
170
+
171
+ /**
172
+ * Preparing query for dashboard boxes
173
+ *
174
+ * @param int $id_view The Analytics view ID from which to retrieve data.
175
+ * @param string $date_range The start date for the query in the format YYYY-MM-DD or '7daysAgo'.
176
+ *
177
+ * @return array Dashboard boxes query
178
+ * @deprecated
179
+ */
180
+ public static function dashboard_boxes_query_old( $id_view, $date_range ) {
181
+ $reports_requests = array();
182
+
183
+ $th = filter_input( INPUT_GET, 'th', FILTER_SANITIZE_STRING );
184
+ $ts = filter_input( INPUT_GET, 'ts', FILTER_SANITIZE_STRING );
185
+
186
+ $days_ago = false === empty( $th ) ? '30daysAgo' : '7daysAgo';
187
+
188
+ if ( false === empty( $ts ) ) {
189
+ $reports_requests[] = array(
190
+ 'viewId' => $id_view,
191
+ 'dateRanges' => self::set_date_ranges( $days_ago, 'yesterday' ),
192
+ 'metrics' => self::set_metrics( array( 'ga:pageviews' ) ),
193
+ 'includeEmptyRows' => true,
194
+ 'pageSize' => 10,
195
+ 'dimensions' => self::set_dimensions( 'ga:sourceMedium' ),
196
+ 'orderBys' => self::set_order_bys( 'ga:pageviews', 'DESCENDING' ),
197
+ );
198
+ } else {
199
+ $reports_requests[] = array(
200
+ 'viewId' => $id_view,
201
+ 'dateRanges' => self::set_date_ranges( $days_ago, 'yesterday' ),
202
+ 'metrics' => self::set_metrics(
203
+ array(
204
+ 'ga:pageviews',
205
+ 'ga:uniquePageviews',
206
+ 'ga:timeOnPage',
207
+ 'ga:bounces',
208
+ 'ga:entrances',
209
+ 'ga:exits',
210
+ )
211
+ ),
212
+ 'includeEmptyRows' => true,
213
+ 'pageSize' => 10,
214
+ 'dimensions' => self::set_dimensions( 'ga:pagePath' ),
215
+ 'orderBys' => self::set_order_bys( 'ga:pageviews', 'DESCENDING' ),
216
+ );
217
+ }
218
+ $query = array(
219
+ 'reportRequests' => $reports_requests,
220
+ );
221
+
222
+ return $query;
223
+ }
224
+
225
+ /**
226
+ * Preparing query for stats boxes
227
+ *
228
+ * @param int $id_view The Analytics view ID from which to retrieve data.
229
+ *
230
+ * @return array Boxes query
231
+ */
232
+ public static function boxes_query( $id_view ) {
233
+ $th = filter_input( INPUT_GET, 'th', FILTER_SANITIZE_STRING );
234
+
235
+ $range = false === empty( $th ) ? '30daysAgo' : '7daysAgo';
236
+ $range_s_prev = false === empty( $th ) ? '60daysAgo' : '14daysAgo';
237
+ $range_e_prev = false === empty( $th ) ? '31daysAgo' : '8daysAgo';
238
+ $reports_requests = array();
239
+ $reports_requests[] = array(
240
+ 'viewId' => $id_view,
241
+ 'dateRanges' => self::set_date_ranges( $range, 'yesterday', $range_s_prev, $range_e_prev ),
242
+ 'metrics' => self::set_metrics(
243
+ array(
244
+ 'ga:users',
245
+ 'ga:pageviews',
246
+ 'ga:pageviewsPerSession',
247
+ 'ga:BounceRate',
248
+ )
249
+ ),
250
+ 'includeEmptyRows' => true,
251
+ 'dimensions' => self::set_dimensions( 'ga:date' ),
252
+ );
253
+ $query = array(
254
+ 'reportRequests' => $reports_requests,
255
+ );
256
+
257
+ return $query;
258
+ }
259
+
260
+ /**
261
+ * Preparing query for chart
262
+ *
263
+ * @param int $id_view The Analytics view ID from which to retrieve data.
264
+ * @param array $date_ranges An array representing the date ranges that will be passed to chart query.
265
+ * @param string $metric A metric expression.
266
+ *
267
+ * @return array Chart query
268
+ */
269
+ public static function main_chart_query( $id_view, $date_ranges = null, $metric = null ) {
270
+ if ( true === empty( $metric ) ) {
271
+ $metric = 'ga:pageviews';
272
+ } else {
273
+ $metric = 'ga:' . $metric;
274
+ }
275
+
276
+ $reports_requests = array();
277
+ $reports_requests[] = array(
278
+ 'viewId' => $id_view,
279
+ 'dateRanges' => $date_ranges,
280
+ 'metrics' => self::set_metrics( $metric ),
281
+ 'includeEmptyRows' => true,
282
+ 'dimensions' => self::set_dimensions( 'ga:date' ),
283
+ );
284
+ $query = array(
285
+ 'reportRequests' => $reports_requests,
286
+ );
287
+
288
+ return $query;
289
+ }
290
+
291
+ /**
292
+ * Preparing query for chart
293
+ *
294
+ * @param int $id_view The Analytics view ID from which to retrieve data.
295
+ * @param string $date_range The start date for the query in the format YYYY-MM-DD or '7daysAgo'.
296
+ * @param string $metric A metric expression.
297
+ *
298
+ * @return array Chart query
299
+ * @deprecated
300
+ */
301
+ public static function main_chart_query_old( $id_view, $date_range = null, $metric = null ) {
302
+ if ( empty( $date_range ) ) {
303
+ $date_ranges = self::set_date_ranges( '7daysAgo', 'yesterday', '14daysAgo', '8daysAgo' );
304
+ } else {
305
+ $date_ranges = self::set_date_ranges( $date_range, 'yesterday', '14daysAgo', '8daysAgo' );
306
+ }
307
+
308
+ if ( empty( $metric ) ) {
309
+ $metric = 'ga:pageviews';
310
+ } else {
311
+ $metric = 'ga:' . $metric;
312
+ }
313
+
314
+ $reports_requests = array();
315
+ $reports_requests[] = array(
316
+ 'viewId' => $id_view,
317
+ 'dateRanges' => $date_ranges,
318
+ 'metrics' => self::set_metrics( $metric ),
319
+ 'includeEmptyRows' => true,
320
+ 'dimensions' => self::set_dimensions( 'ga:date' ),
321
+ );
322
+ $query = array(
323
+ 'reportRequests' => $reports_requests,
324
+ );
325
+
326
+ return $query;
327
+ }
328
+
329
+ /**
330
+ * Preparing query for gender chart
331
+ *
332
+ * @param int $id_view The Analytics view ID from which to retrieve data.
333
+ * @param array $date_ranges An array representing the date ranges that will be passed to chart query.
334
+ * @param string $metric A metric expression.
335
+ *
336
+ * @return array Chart query
337
+ */
338
+ public static function gender_chart_query( $id_view, $date_ranges = null, $metric = null ) {
339
+ if ( true === empty( $date_ranges ) ) {
340
+ $date_ranges = self::set_date_ranges( '7daysAgo', 'yesterday', '14daysAgo', '8daysAgo' );
341
+ }
342
+
343
+ $reports_requests = array();
344
+ $reports_requests[] = array(
345
+ 'viewId' => $id_view,
346
+ 'dateRanges' => $date_ranges,
347
+ 'metrics' => self::set_metrics( 'ga:sessions' ),
348
+ 'includeEmptyRows' => true,
349
+ 'dimensions' => self::set_dimensions( 'ga:userGender' ),
350
+ );
351
+ $query = array(
352
+ 'reportRequests' => $reports_requests,
353
+ );
354
+
355
+ return $query;
356
+ }
357
+
358
+ /**
359
+ * Preparing query for device chart.
360
+ *
361
+ * @param int $id_view The Analytics view ID from which to retrieve data.
362
+ * @param array $date_ranges An array representing the date ranges that will be passed to chart query.
363
+ * @param string $metric A metric expression.
364
+ *
365
+ * @return array Chart query
366
+ * @since 2.5.2
367
+ */
368
+ public static function device_chart_query( $id_view, $date_ranges = null, $metric = null ) {
369
+ return array(
370
+ 'reportRequests' => array(
371
+ array(
372
+ 'viewId' => $id_view,
373
+ 'dateRanges' => $date_ranges,
374
+ 'metrics' => self::set_metrics( 'ga:sessions' ),
375
+ 'includeEmptyRows' => true,
376
+ 'dimensions' => self::set_dimensions( 'ga:deviceCategory' ),
377
+ ),
378
+ ),
379
+ );
380
+ }
381
+
382
+ /**
383
+ * Preparing query for age chart
384
+ *
385
+ * @param int $id_view The Analytics view ID from which to retrieve data.
386
+ * @param array $date_ranges An array representing the date ranges that will be passed to chart query.
387
+ * @param string $metric A metric expression.
388
+ *
389
+ * @return array Chart query
390
+ */
391
+ public static function age_chart_query( $id_view, $date_ranges = null, $metric = null ) {
392
+ if ( true === empty( $date_ranges ) ) {
393
+ $date_ranges = self::set_date_ranges( '7daysAgo', 'yesterday', '14daysAgo', '8daysAgo' );
394
+ }
395
+
396
+ $reports_requests = array();
397
+ $reports_requests[] = array(
398
+ 'viewId' => $id_view,
399
+ 'dateRanges' => $date_ranges,
400
+ 'metrics' => self::set_metrics( 'ga:sessions' ),
401
+ 'includeEmptyRows' => true,
402
+ 'dimensions' => self::set_dimensions( 'ga:userAgeBracket' ),
403
+ );
404
+ $query = array(
405
+ 'reportRequests' => $reports_requests,
406
+ );
407
+
408
+ return $query;
409
+ }
410
+
411
+ /**
412
+ * Setting order for requests
413
+ *
414
+ * @param string $name The field which to sort by. The default sort order is ascending. Example: ga:browser.
415
+ * @param string $sort The sorting order for the field. 'ASCENDING' or 'DESCENDING'.
416
+ *
417
+ * @return array OrderBys
418
+ */
419
+ public static function set_order_bys( $name, $sort ) {
420
+ $order = array();
421
+ $order[] = array(
422
+ 'fieldName' => $name,
423
+ 'sortOrder' => $sort,
424
+ );
425
+
426
+ return $order;
427
+ }
428
+
429
+ /**
430
+ * Setting metrics for requests
431
+ *
432
+ * @param mixed $expression A metric expression or array of expressions.
433
+ *
434
+ * @return array Metrics
435
+ */
436
+ public static function set_metrics( $expression ) {
437
+ $metrics = array();
438
+ if ( is_array( $expression ) ) {
439
+ foreach ( $expression as $exp ) {
440
+ $metrics[] = array(
441
+ 'expression' => $exp,
442
+ );
443
+ }
444
+ } else {
445
+ $metrics[] = array(
446
+ 'expression' => $expression,
447
+ );
448
+ }
449
+
450
+ return $metrics;
451
+ }
452
+
453
+ /**
454
+ * Setting dimensions for requests
455
+ *
456
+ * @param string $name Name of the dimension to fetch, for example ga:browser.
457
+ *
458
+ * @return array Dimensions
459
+ */
460
+ public static function set_dimensions( $name ) {
461
+ $dimensions = array();
462
+ $dimensions[] = array(
463
+ 'name' => $name,
464
+ );
465
+
466
+ return $dimensions;
467
+ }
468
+
469
+ /**
470
+ * Setting date ranges for requests
471
+ *
472
+ * @param string $start_date The start date for the query in the format YYYY-MM-DD.
473
+ * @param string $end_date The end date for the query in the format YYYY-MM-DD.
474
+ * @param string $prev_start_date The start date (second range) for the query in the format YYYY-MM-DD.
475
+ * @param string $prev_end_date The start date (second range) for the query in the format YYYY-MM-DD.
476
+ *
477
+ * @return array Date ranges
478
+ */
479
+ public static function set_date_ranges( $start_date, $end_date, $prev_start_date = '', $prev_end_date = '' ) {
480
+ $date_danges = array();
481
+ $date_danges[] = array(
482
+ 'startDate' => $start_date,
483
+ 'endDate' => $end_date,
484
+ );
485
+ if ( false === empty( $prev_start_date ) && false === empty( $prev_end_date ) ) {
486
+ $date_danges[] = array(
487
+ 'startDate' => $prev_start_date,
488
+ 'endDate' => $prev_end_date,
489
+ );
490
+ }
491
+
492
+ return $date_danges;
493
+ }
494
+
495
+ /**
496
+ * Preparing response for data received from analytics
497
+ *
498
+ * @param array $data Analytics response.
499
+ *
500
+ * @return array Response rows
501
+ */
502
+ public static function prepare_response( $data ) {
503
+ $data = self::get_reports_from_response( $data );
504
+ self::handle_more_reports( $data );
505
+ $report = self::get_single_report( $data );
506
+ self::get_report_column_header( $report );
507
+ $report_data = self::get_report_data( $report );
508
+ self::get_totals( $report_data );
509
+ self::get_row_count( $report_data );
510
+ $rows = self::get_rows( $report_data );
511
+
512
+ return $rows;
513
+ }
514
+
515
+ /**
516
+ * Get dimensions from response row
517
+ *
518
+ * @param array $row Analytics response row.
519
+ *
520
+ * @return array|bool Dimensions
521
+ */
522
+ public static function get_dimensions( $row ) {
523
+ if ( false === empty( $row['dimensions'] ) ) {
524
+ return $row['dimensions'];
525
+ }
526
+
527
+ return false;
528
+ }
529
+
530
+ /**
531
+ * Get metrics from response row
532
+ *
533
+ * @param array $row Analytics response row.
534
+ *
535
+ * @return array|bool Metrics
536
+ */
537
+ public static function get_metrics( $row ) {
538
+ if ( false === empty( $row['metrics'] ) ) {
539
+ return $row['metrics'];
540
+ }
541
+
542
+ return false;
543
+ }
544
+
545
+ /**
546
+ * Get row from response report data
547
+ *
548
+ * @param array $report_data Analytics response report data.
549
+ *
550
+ * @return array|bool Rows
551
+ */
552
+ public static function get_rows( $report_data ) {
553
+ if ( false === empty( $report_data['rows'] ) ) {
554
+ return $report_data['rows'];
555
+ }
556
+
557
+ return false;
558
+ }
559
+
560
+ /**
561
+ * Get row count from response report data
562
+ *
563
+ * @param array $report_data Analytics response report data.
564
+ *
565
+ * @return array|bool Row count
566
+ */
567
+ public static function get_row_count( $report_data ) {
568
+ if ( false === empty( $report_data['rowCount'] ) ) {
569
+ return $report_data['rowCount'];
570
+ }
571
+
572
+ return false;
573
+ }
574
+
575
+ /**
576
+ * Get totals from response report data
577
+ *
578
+ * @param array $report_data Analytics response report data.
579
+ *
580
+ * @return array|bool Totals
581
+ */
582
+ public static function get_totals( $report_data ) {
583
+ if ( false === empty( $report_data['totals'] ) ) {
584
+ return $report_data['totals'];
585
+ }
586
+
587
+ return false;
588
+ }
589
+
590
+ /**
591
+ * Get reports from response data
592
+ *
593
+ * @param array $data Analytics response data.
594
+ *
595
+ * @return array|bool Reports
596
+ */
597
+ public static function get_reports_from_response( $data ) {
598
+ if ( false === empty( $data['reports'] ) ) {
599
+ return $data['reports'];
600
+ }
601
+
602
+ return false;
603
+ }
604
+
605
+ /**
606
+ * Show info for multiple data
607
+ *
608
+ * @param array $data Analytics response data.
609
+ */
610
+ public static function handle_more_reports( $data ) {
611
+ if ( count( $data ) > 1 ) {
612
+ echo 'more than one report';
613
+ }
614
+ }
615
+
616
+ /**
617
+ * Show info for multiple rows
618
+ *
619
+ * @param array $rows Analytics response rows.
620
+ */
621
+ public static function handle_more_rows( $rows ) {
622
+ if ( count( $rows ) > 1 ) {
623
+ echo 'more than one row';
624
+ }
625
+ }
626
+
627
+ /**
628
+ * Get single report from response data
629
+ *
630
+ * @param array $data Analytics response data.
631
+ *
632
+ * @return array|bool Report
633
+ */
634
+ public static function get_single_report( $data ) {
635
+ if ( false === empty( $data ) ) {
636
+ foreach ( $data as $report ) {
637
+ if ( false === empty( $report ) ) {
638
+ return $report;
639
+ }
640
+ }
641
+ }
642
+
643
+ return false;
644
+ }
645
+
646
+ /**
647
+ * Get single row from response data rows
648
+ *
649
+ * @param array $rows Analytics response data rows.
650
+ *
651
+ * @return array|bool Row
652
+ */
653
+ public static function get_single_row( $rows ) {
654
+ if ( false === empty( $rows ) ) {
655
+ foreach ( $rows as $row ) {
656
+ if ( false === empty( $row ) ) {
657
+ return $row;
658
+ }
659
+ }
660
+ }
661
+
662
+ return false;
663
+ }
664
+
665
+ /**
666
+ * Get column header from response data
667
+ *
668
+ * @param array $data Analytics response data.
669
+ *
670
+ * @return array Column header
671
+ */
672
+ public static function get_report_column_header( $data ) {
673
+ if ( false === empty( $data['columnHeader'] ) ) {
674
+ return $data['columnHeader'];
675
+ }
676
+
677
+ return false;
678
+ }
679
+
680
+ /**
681
+ * Get report data from response data
682
+ *
683
+ * @param array $data Analytics response data.
684
+ *
685
+ * @return array|bool data
686
+ */
687
+ public static function get_report_data( $data ) {
688
+ if ( false === empty( $data['data'] ) ) {
689
+ return $data['data'];
690
+ }
691
+
692
+ return false;
693
+ }
694
+
695
+ /**
696
+ * Get chart from response data
697
+ *
698
+ * @param array $response_data Analytics response data.
699
+ * @param int $period_in_days Period in days (default = 7).
700
+ *
701
+ * @return array chart data
702
+ */
703
+ public static function get_chart( $response_data, $period_in_days = 7 ) {
704
+ $chart_data = array();
705
+ if ( false === empty( $response_data ) ) {
706
+ $data = (
707
+ false === empty( $response_data['reports'] )
708
+ && false === empty( $response_data['reports'][0] )
709
+ && false === empty( $response_data['reports'][0]['data'] )
710
+ )
711
+ ? $response_data['reports'][0]['data'] : array();
712
+ $rows = ( false === empty( $data['rows'] ) ) ? $data['rows'] : array();
713
+ if ( false === empty( $rows ) ) {
714
+ foreach ( $rows as $key => $row ) {
715
+ if ( $key < $period_in_days ) {
716
+ $chart_data[ $key ]['previous'] = false === empty( $row['metrics'][1]['values'][0] ) ? $row['metrics'][1]['values'][0] : 0;
717
+ $chart_data[ $key ]['previous-day'] = gmdate( 'M j', strtotime( $row['dimensions'][0] ) );
718
+ } else {
719
+ $chart_data[ $key - $period_in_days ]['day'] = gmdate( 'M j', strtotime( $row['dimensions'][0] ) );
720
+ $chart_data[ $key - $period_in_days ]['current'] = false === empty( $row['metrics'][0]['values'][0] ) ? $row['metrics'][0]['values'][0] : 0;
721
+ $chart_data['date'] = strtotime( $row['dimensions'][0] );
722
+ }
723
+ }
724
+ }
725
+ }
726
+
727
+ return $chart_data;
728
+ }
729
+
730
+ /**
731
+ * Get gender chart from response data
732
+ *
733
+ * @param array $response_data Analytics response data.
734
+ *
735
+ * @return array chart data
736
+ */
737
+ public static function get_gender_chart( $response_data ) {
738
+ $chart_data = array();
739
+ if ( false === empty( $response_data ) ) {
740
+ $data = ( false === empty( $response_data['reports'] ) && false === empty( $response_data['reports'][0] ) && false === empty( $response_data['reports'][0]['data'] ) ) ? $response_data['reports'][0]['data'] : array();
741
+ $rows = ( false === empty( $data['rows'] ) ) ? $data['rows'] : array();
742
+ if ( false === empty( $rows ) ) {
743
+ foreach ( $rows as $key => $row ) {
744
+ $chart_data[ $row['dimensions'][0] ] = self::get_metric_value( $row['metrics'] );
745
+ }
746
+ }
747
+ }
748
+
749
+ return $chart_data;
750
+ }
751
+
752
+ /**
753
+ * Get device chart from response data.
754
+ *
755
+ * @param array $response_data Analytics response data array.
756
+ *
757
+ * @return array Chart data array.
758
+ */
759
+ public static function get_device_chart( $response_data ) {
760
+ $chart_data = array();
761
+ if ( false === empty( $response_data ) ) {
762
+ $data = ( false === empty( $response_data['reports'] ) && false === empty( $response_data['reports'][0] ) && false === empty( $response_data['reports'][0]['data'] ) ) ? $response_data['reports'][0]['data'] : array();
763
+ $rows = ( false === empty( $data['rows'] ) ) ? $data['rows'] : array();
764
+ if ( false === empty( $rows ) ) {
765
+ foreach ( $rows as $row ) {
766
+ $chart_data[ $row['dimensions'][0] ] = self::get_metric_value( $row['metrics'] );
767
+ }
768
+ }
769
+ }
770
+
771
+ return $chart_data;
772
+ }
773
+
774
+ /**
775
+ * Get the value of metric data response.
776
+ *
777
+ * @param array $metrics Metrics array.
778
+ *
779
+ * @return mixed
780
+ */
781
+ private static function get_metric_value( $metrics ) {
782
+ if ( is_array( $metrics ) ) {
783
+ foreach ( $metrics as $metric ) {
784
+ $values[] = $metric['values'][0];
785
+ }
786
+ }
787
+
788
+ return $values[0];
789
+ }
790
+
791
+ /**
792
+ * Get gender chart from response data
793
+ *
794
+ * @param array $response_data Analytics response data.
795
+ *
796
+ * @return array chart data
797
+ */
798
+ public static function get_age_chart( $response_data ) {
799
+ $chart_data = array();
800
+ if ( false === empty( $response_data ) ) {
801
+ $data = ( false === empty( $response_data['reports'] ) && false === empty( $response_data['reports'][0] ) && false === empty( $response_data['reports'][0]['data'] ) ) ? $response_data['reports'][0]['data'] : array();
802
+ $rows = ( false === empty( $data['rows'] ) ) ? $data['rows'] : array();
803
+ if ( false === empty( $rows ) ) {
804
+ foreach ( $rows as $key => $row ) {
805
+ $chart_data[ $row['dimensions'][0] ] = self::get_metric_value( $row['metrics'] );
806
+ }
807
+ }
808
+ }
809
+
810
+ return $chart_data;
811
+ }
812
+
813
+ /**
814
+ * Get dasboard chart from response data
815
+ *
816
+ * @param array $response_data Analytics response data.
817
+ *
818
+ * @return array dashboard chart data
819
+ */
820
+ public static function get_dashboard_chart( $response_data ) {
821
+ $chart_data = array();
822
+ if ( false === empty( $response_data ) ) {
823
+ $data = (
824
+ false === empty( $response_data['reports'] )
825
+ && false === empty( $response_data['reports'][0] )
826
+ && false === empty( $response_data['reports'][0]['data'] )
827
+ ) ? $response_data['reports'][0]['data'] : array();
828
+
829
+ $rows = ( false === empty( $data['rows'] ) ) ? $data['rows'] : array();
830
+ if ( false === empty( $rows ) ) {
831
+ foreach ( $rows as $row ) {
832
+ $chart_data[] = array(
833
+ 'day' => gmdate( 'M j', strtotime( $row['dimensions'][0] ) ),
834
+ 'current' => false === empty( $row['metrics'][0]['values'][0] ) ? $row['metrics'][0]['values'][0] : 0,
835
+ );
836
+ }
837
+ }
838
+ }
839
+
840
+ return $chart_data;
841
+ }
842
+
843
+ /**
844
+ * Get boxes from response data
845
+ *
846
+ * @param array $data Analytics response data.
847
+ *
848
+ * @return array boxes data
849
+ */
850
+ public static function get_boxes( $data ) {
851
+ if ( false === empty( $data ) ) {
852
+ $data = self::get_reports_from_response( $data );
853
+ self::handle_more_reports( $data );
854
+ $report = self::get_single_report( $data );
855
+ self::get_report_column_header( $report );
856
+ $report_data = self::get_report_data( $report );
857
+ $totals = self::get_totals( $report_data );
858
+
859
+ return self::get_boxes_from_totals( $totals );
860
+ }
861
+ }
862
+
863
+ /**
864
+ * Get boxes from totals
865
+ *
866
+ * @param array $totals Analytics response totals.
867
+ *
868
+ * @return array|bool boxes data
869
+ */
870
+ public static function get_boxes_from_totals( $totals ) {
871
+ if ( false === empty( $totals ) ) {
872
+ $boxes_data = array();
873
+ foreach ( $totals as $key => $total ) {
874
+ if ( 0 === $key ) {
875
+ $boxes_data['Users']['current'] = $total['values'][0];
876
+ $boxes_data['Pageviews']['current'] = $total['values'][1];
877
+ $boxes_data['PageviewsPerSession']['current'] = $total['values'][2];
878
+ $boxes_data['BounceRate']['current'] = round( $total['values'][3], 2 );
879
+ } else {
880
+ $boxes_data['Users']['previous'] = $total['values'][0];
881
+ $boxes_data['Pageviews']['previous'] = $total['values'][1];
882
+ $boxes_data['PageviewsPerSession']['previous'] = $total['values'][2];
883
+ $boxes_data['BounceRate']['previous'] = round( $total['values'][3], 2 );
884
+ }
885
+ }
886
+
887
+ return self::prepare_boxes( $boxes_data );
888
+ }
889
+
890
+ return false;
891
+ }
892
+
893
+ /**
894
+ * Prepare boxes data
895
+ *
896
+ * @param array $boxes_data Boxes data.
897
+ *
898
+ * @return array boxes data
899
+ */
900
+ public static function prepare_boxes( $boxes_data ) {
901
+ $boxes_data['Users']['diff'] = ( $boxes_data['Users']['previous'] > 0 ) ? round( ( $boxes_data['Users']['current'] - $boxes_data['Users']['previous'] ) / $boxes_data['Users']['previous'] * 100, 2 ) : 100;
902
+ $boxes_data['Pageviews']['diff'] = ( $boxes_data['Pageviews']['previous'] > 0 ) ? round( ( $boxes_data['Pageviews']['current'] - $boxes_data['Pageviews']['previous'] ) / $boxes_data['Pageviews']['previous'] * 100, 2 ) : 100;
903
+ $boxes_data['PageviewsPerSession']['diff'] = ( $boxes_data['PageviewsPerSession']['previous'] > 0 ) ? round( ( $boxes_data['PageviewsPerSession']['current'] - $boxes_data['PageviewsPerSession']['previous'] ) / $boxes_data['PageviewsPerSession']['previous'] * 100, 2 ) : 100;
904
+ $boxes_data['BounceRate']['diff'] = ( $boxes_data['BounceRate']['previous'] > 0 ) ? round( ( $boxes_data['BounceRate']['current'] - $boxes_data['BounceRate']['previous'] ) / $boxes_data['BounceRate']['previous'] * 100, 2 ) : 100;
905
+ $boxes_data['Users']['diff'] = ( 0 === $boxes_data['Users']['previous'] && 0 === $boxes_data['Users']['current'] ) ? 0 : $boxes_data['Users']['diff'];
906
+ $boxes_data['Pageviews']['diff'] = ( 0 === $boxes_data['Pageviews']['previous'] && 0 === $boxes_data['Pageviews']['current'] ) ? 0 : $boxes_data['Pageviews']['diff'];
907
+ $boxes_data['PageviewsPerSession']['diff'] = ( 0 === $boxes_data['PageviewsPerSession']['previous'] && 0 === $boxes_data['PageviewsPerSession']['current'] ) ? 0 : $boxes_data['PageviewsPerSession']['diff'];
908
+ $boxes_data['BounceRate']['diff'] = ( 0 === $boxes_data['BounceRate']['previous'] && 0 === $boxes_data['BounceRate']['current'] ) ? 0 : $boxes_data['BounceRate']['diff'];
909
+ $boxes_data['Users']['label'] = 'Users';
910
+ $boxes_data['Pageviews']['label'] = 'Pageviews';
911
+ $boxes_data['PageviewsPerSession']['label'] = 'Pages / Session';
912
+ $boxes_data['BounceRate']['label'] = 'Bounce Rate';
913
+ $boxes_data['Users']['comparison'] = $boxes_data['Users']['current'] . ' vs ' . $boxes_data['Users']['previous'];
914
+ $boxes_data['Pageviews']['comparison'] = $boxes_data['Pageviews']['current'] . ' vs ' . $boxes_data['Pageviews']['previous'];
915
+ $boxes_data['PageviewsPerSession']['comparison'] = self::number_format_clean( $boxes_data['PageviewsPerSession']['current'], 2, '.', ',' ) . ' vs ' . self::number_format_clean( $boxes_data['PageviewsPerSession']['previous'], 2, '.', ',' );
916
+ $boxes_data['BounceRate']['comparison'] = self::number_format_clean( $boxes_data['BounceRate']['current'], 2, '.', ',' ) . '% vs ' . self::number_format_clean( $boxes_data['BounceRate']['previous'], 2, '.', ',' ) . '%';
917
+ $boxes_data['Users']['color'] = ( $boxes_data['Users']['diff'] > 0 ) ? 'green' : 'red';
918
+ $boxes_data['Pageviews']['color'] = ( $boxes_data['Pageviews']['diff'] > 0 ) ? 'green' : 'red';
919
+ $boxes_data['PageviewsPerSession']['color'] = ( $boxes_data['PageviewsPerSession']['diff'] > 0 ) ? 'green' : 'red';
920
+ $boxes_data['BounceRate']['color'] = ( $boxes_data['BounceRate']['diff'] > 0 ) ? 'red' : 'green';
921
+ $boxes_data['Users']['color'] = ( 0 !== $boxes_data['Users']['diff'] ) ? $boxes_data['Users']['color'] : 'black';
922
+ $boxes_data['Pageviews']['color'] = ( 0 !== $boxes_data['Pageviews']['diff'] ) ? $boxes_data['Pageviews']['color'] : 'black';
923
+ $boxes_data['PageviewsPerSession']['color'] = ( 0 !== $boxes_data['PageviewsPerSession']['diff'] ) ? $boxes_data['PageviewsPerSession']['color'] : 'black';
924
+ $boxes_data['BounceRate']['color'] = ( 0 !== $boxes_data['BounceRate']['diff'] ) ? $boxes_data['BounceRate']['color'] : 'black';
925
+
926
+ return $boxes_data;
927
+ }
928
+
929
+ /**
930
+ * Number format for boxes
931
+ *
932
+ * @param float $number Number to format.
933
+ * @param int $precision Precision.
934
+ * @param string $dec_point Decimal point.
935
+ * @param string $thousands_sep Thousands Separator.
936
+ *
937
+ * @return string clean number format
938
+ */
939
+ public static function number_format_clean( $number, $precision = 0, $dec_point = '.', $thousands_sep = ',' ) {
940
+ if ( 0 === $number ) {
941
+ return 0;
942
+ } else {
943
+ $format = number_format( $number, $precision, $dec_point, $thousands_sep );
944
+ if ( '.00' === substr( $format, 2 ) ) {
945
+ return substr( $format, 0, - 3 );
946
+ }
947
+
948
+ return $format;
949
+ }
950
+ }
951
+
952
+ /**
953
+ * Get sources from analytics response data
954
+ *
955
+ * @param array $data Analytics response data.
956
+ *
957
+ * @return array|bool sources data
958
+ */
959
+ public static function get_sources( $data ) {
960
+ if ( false === empty( $data ) ) {
961
+ $data = self::get_reports_from_response( $data );
962
+ self::handle_more_reports( $data );
963
+ $report = self::get_single_report( $data );
964
+ self::get_report_column_header( $report );
965
+ $report_data = self::get_report_data( $report );
966
+ $rows = self::get_rows( $report_data );
967
+ $totals = self::get_totals( $report_data );
968
+ $total_count = array();
969
+ if ( false === empty( $totals ) ) {
970
+ foreach ( $totals as $key => $total ) {
971
+ $total_count = $total['values'][0];
972
+ }
973
+ }
974
+ $sources = array(
975
+ 'total' => $total_count,
976
+ 'sum' => 0,
977
+ 'rows' => array(),
978
+ );
979
+ if ( false === empty( $rows ) ) {
980
+ $i = 1;
981
+ foreach ( $rows as $row ) {
982
+ if ( false === empty( $row ) ) {
983
+ foreach ( $row as $key => $value ) {
984
+ if ( 'dimensions' === $key ) {
985
+ $sources['rows'][ $i ]['name'] = $value[0];
986
+ $sources['rows'][ $i ]['url'] = $value[0];
987
+ } elseif ( 'metrics' === $key ) {
988
+ $sources['rows'][ $i ]['number'] = $value[0]['values'][0];
989
+ $sources['rows'][ $i ]['percent'] = ( false === empty( $total_count ) ) ? round( $value[0]['values'][0] / $total_count * 100, 2 ) : 0;
990
+ $sources['sum'] += $value[0]['values'][0];
991
+ }
992
+ }
993
+ $i ++;
994
+ }
995
+ }
996
+ }
997
+
998
+ return $sources;
999
+ }
1000
+
1001
+ return false;
1002
+ }
1003
+
1004
+ /**
1005
+ * Get dashboard boxes data from analytics response data
1006
+ *
1007
+ * @param array $data Analytics response data.
1008
+ *
1009
+ * @return array dashboard boxes data
1010
+ */
1011
+ public static function get_dashboard_boxes_data( $data ) {
1012
+ if ( false === empty( $data ) ) {
1013
+ $data = self::get_reports_from_response( $data );
1014
+ self::handle_more_reports( $data );
1015
+ $report = self::get_single_report( $data );
1016
+ self::get_report_column_header( $report );
1017
+ $report_data = self::get_report_data( $report );
1018
+ $totals = self::get_totals( $report_data );
1019
+ $boxes_data = array();
1020
+ $boxes_data['Sessions'] = array(
1021
+ 'label' => 'Visits',
1022
+ 'value' => $totals[0]['values'][0],
1023
+ );
1024
+ $boxes_data['Pageviews'] = array(
1025
+ 'label' => 'Pageviews',
1026
+ 'value' => $totals[0]['values'][1],
1027
+ );
1028
+ $boxes_data['pageviewsPerSession'] = array(
1029
+ 'label' => 'Pages / Visit',
1030
+ 'value' => self::number_format_clean( $totals[0]['values'][2], 2, '.', ',' ),
1031
+ );
1032
+ $boxes_data['BounceRate'] = array(
1033
+ 'label' => 'Bounce Rate',
1034
+ 'value' => self::number_format_clean( $totals[0]['values'][3], 2, '.', ',' ) . '%',
1035
+ );
1036
+ $boxes_data['avgTimeOnPage'] = array(
1037
+ 'label' => 'Avg. Time on Site',
1038
+ 'value' => gmdate( 'H:i:s', $totals[0]['values'][4] ),
1039
+ );
1040
+ $boxes_data['percentNewSessions'] = array(
1041
+ 'label' => '% of New Visits',
1042
+ 'value' => self::number_format_clean( $totals[0]['values'][5], 2, '.', ',' ),
1043
+ );
1044
+
1045
+ return $boxes_data;
1046
+ }
1047
+ }
1048
+
1049
+ /**
1050
+ * Get Empty Boxes Structure.
1051
+ *
1052
+ * @return array Array of empty boxes structure values.
1053
+ */
1054
+ public static function get_empty_boxes_structure() {
1055
+ $boxes_data = array();
1056
+ $boxes_data['Sessions'] = array(
1057
+ 'label' => 'Visits',
1058
+ 'value' => 0,
1059
+ );
1060
+ $boxes_data['Pageviews'] = array(
1061
+ 'label' => 'Pageviews',
1062
+ 'value' => 0,
1063
+ );
1064
+ $boxes_data['pageviewsPerSession'] = array(
1065
+ 'label' => 'Pages / Visit',
1066
+ 'value' => self::number_format_clean( 0, 2, '.', ',' ),
1067
+ );
1068
+ $boxes_data['BounceRate'] = array(
1069
+ 'label' => 'Bounce Rate',
1070
+ 'value' => self::number_format_clean( 0, 2, '.', ',' ) . '%',
1071
+ );
1072
+ $boxes_data['avgTimeOnPage'] = array(
1073
+ 'label' => 'Avg. Time on Site',
1074
+ 'value' => gmdate( 'H:i:s', 0 ),
1075
+ );
1076
+ $boxes_data['percentNewSessions'] = array(
1077
+ 'label' => '% of New Visits',
1078
+ 'value' => self::number_format_clean( 0, 2, '.', ',' ),
1079
+ );
1080
+
1081
+ return $boxes_data;
1082
+ }
1083
+ }
class/class-ga-template.php ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Google Analytics template.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ /**
9
+ * Class Ga_Template
10
+ */
11
+ class Ga_Template {
12
+ /**
13
+ * Array of template properties.
14
+ *
15
+ * @var array Props array.
16
+ */
17
+ protected $props;
18
+
19
+ /**
20
+ * Relative path in view/ folder.
21
+ *
22
+ * @var string Path string.
23
+ */
24
+ protected $path;
25
+
26
+ /**
27
+ * Ga_Template constructor.
28
+ *
29
+ * @param string $path Relative path in view/ folder.
30
+ * @param array $props Array of props to be passed to the template.
31
+ */
32
+ public function __construct( $path, $props = array() ) {
33
+ $this->path = $path;
34
+ $this->props = $props;
35
+ }
36
+
37
+ /**
38
+ * Include rendered template inline.
39
+ *
40
+ * @param string $path Relative path in view/ folder.
41
+ * @param array $props Array of props to be passed to the template.
42
+ */
43
+ public static function load( $path, $props = array() ) {
44
+ ( new static( $path, $props ) )->include_template();
45
+ }
46
+
47
+ /**
48
+ * Get rendered template.
49
+ *
50
+ * @param string $path Relative path in view/ folder.
51
+ * @param array $props Array of props to be passed to the template.
52
+ *
53
+ * @return string Rendered template.
54
+ */
55
+ public static function render( $path, $props = array() ) {
56
+ return ( new static( $path, $props ) )->render_template();
57
+ }
58
+
59
+ /**
60
+ * Include template.
61
+ */
62
+ public function include_template() {
63
+ $template_path = GA_PLUGIN_DIR . '/view/' . $this->path . '.php';
64
+
65
+ if ( is_readable( $template_path ) ) {
66
+ load_template( $template_path, false, $this->props );
67
+ }
68
+ }
69
+
70
+ /**
71
+ * Get rendered template.
72
+ *
73
+ * @return string
74
+ */
75
+ public function render_template() {
76
+ ob_start();
77
+ $this->include_template();
78
+ $render = ob_get_contents();
79
+
80
+ return false === empty( $render ) ? $render : '';
81
+ }
82
+ }
class/controller/Ga_Admin_Controller.php DELETED
@@ -1,113 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Manages actions in the admin area.
5
- *
6
- * Created by PhpStorm.
7
- * User: mdn
8
- * Date: 2017-01-25
9
- * Time: 09:50
10
- */
11
- class Ga_Admin_Controller extends Ga_Controller_Core {
12
-
13
- const ACTION_SHARETHIS_INVITE = 'ga_action_sharethis_invite';
14
-
15
- /**
16
- * Redirects to Google oauth authentication endpoint.
17
- */
18
- public static function ga_action_auth() {
19
- header( 'Location:' . Ga_Admin::api_client()->create_auth_url() );
20
- }
21
-
22
- /**
23
- * Handle Sharethis invite action
24
- */
25
- public static function ga_action_sharethis_invite() {
26
-
27
- if ( self::verify_nonce( self::ACTION_SHARETHIS_INVITE ) ) {
28
- $email = !empty( $_POST[ 'sharethis_invite_email' ] ) ? $_POST[ 'sharethis_invite_email' ] : null;
29
- $response = null;
30
- if ( !empty( $email ) ) {
31
- $data = array(
32
- 'id' => get_option( Ga_Admin::GA_SHARETHIS_PROPERTY_ID ),
33
- 'secret' => get_option( Ga_Admin::GA_SHARETHIS_PROPERTY_SECRET ),
34
- 'product' => 'viral-notifications',
35
- 'role' => 'admin', // array_shift(Ga_Helper::get_user_roles())
36
- 'email' => $email
37
- );
38
-
39
- $response = Ga_Admin::api_client( Ga_Admin::GA_SHARETHIS_API_ALIAS )->call( 'ga_api_sharethis_user_invite', array( $data ) );
40
- $errors = Ga_Admin::api_client( Ga_Admin::GA_SHARETHIS_API_ALIAS )->get_errors();
41
-
42
- if ( !empty( $errors ) ) {
43
- $msg = '';
44
- foreach ( $errors as $error ) {
45
- $msg .= $error[ 'message' ];
46
- }
47
- $msg = Ga_Helper::create_url_msg( $msg, Ga_Admin::NOTICE_ERROR );
48
- } else {
49
- $msg = Ga_Helper::create_url_msg( _( 'An invite was sent to this email' ), Ga_Admin::NOTICE_SUCCESS );
50
- }
51
- }
52
- } else {
53
- $msg = Ga_Helper::create_url_msg( _( 'Invalid request.' ), Ga_Admin::NOTICE_ERROR );
54
- }
55
- }
56
-
57
- /**
58
- * Sets accept terms option to TRUE.
59
- */
60
- public static function ga_action_update_terms() {
61
- update_option( Ga_Admin::GA_SHARETHIS_TERMS_OPTION_NAME, true );
62
-
63
- wp_redirect( admin_url( Ga_Helper::GA_SETTINGS_PAGE_URL ) );
64
- }
65
-
66
- /**
67
- * Enables all features option.
68
- */
69
- public static function ga_action_enable_all_features() {
70
- Ga_Helper::update_option( Ga_Admin::GA_DISABLE_ALL_FEATURES, false );
71
-
72
- $url = !empty( $_GET[ 'page' ] ) ? Ga_Helper::create_url( admin_url( 'admin.php' ), array( 'page' => $_GET[ 'page' ] ) ) : admin_url( Ga_Helper::create_url( Ga_Helper::GA_SETTINGS_PAGE_URL ) );
73
-
74
- wp_redirect( $url );
75
- }
76
-
77
- /**
78
- * Disables all features option.
79
- */
80
- public static function ga_action_disable_all_features() {
81
- Ga_Helper::update_option( Ga_Admin::GA_DISABLE_ALL_FEATURES, true );
82
-
83
- $url = !empty( $_GET[ 'page' ] ) ? Ga_Helper::create_url( admin_url( 'admin.php' ), array( 'page' => $_GET[ 'page' ] ) ) : admin_url( Ga_Helper::create_url( Ga_Helper::GA_SETTINGS_PAGE_URL ) );
84
-
85
- wp_redirect( $url );
86
- }
87
-
88
- public static function validate_ajax_data_change_post( $post ) {
89
- $error = 0;
90
-
91
- if ( self::verify_nonce( 'ga_ajax_data_change' ) ) {
92
- if ( !empty( $post[ 'date_range' ] ) ) {
93
- if ( !is_string( $post[ 'date_range' ] ) ) {
94
- $error ++;
95
- }
96
- } else {
97
- $error ++;
98
- }
99
-
100
- if ( !empty( $post[ 'metric' ] ) ) {
101
- if ( !is_string( $post[ 'metric' ] ) ) {
102
- $error ++;
103
- }
104
- } else {
105
- $error ++;
106
- }
107
- } else {
108
- $error ++;
109
- }
110
-
111
- return $error == 0;
112
- }
113
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
class/controller/class-ga-admin-controller.php ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Google Analytics admin controller.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ /**
9
+ * Admin controller.
10
+ */
11
+ class Ga_Admin_Controller extends Ga_Controller_Core {
12
+
13
+ const ACTION_SHARETHIS_INVITE = 'ga_action_sharethis_invite';
14
+
15
+ /**
16
+ * Redirects to Google oauth authentication endpoint.
17
+ */
18
+ public static function ga_action_auth() {
19
+ header( 'Location:' . Ga_Admin::api_client()->create_auth_url() );
20
+ }
21
+
22
+ /**
23
+ * Handle Sharethis invite action
24
+ */
25
+ public static function ga_action_sharethis_invite() {
26
+ if ( true === self::verify_nonce( self::ACTION_SHARETHIS_INVITE ) ) {
27
+ // Validate email.
28
+ $email = filter_input( INPUT_POST, 'sharethis_invite_email', FILTER_SANITIZE_EMAIL );
29
+
30
+ if ( false === empty( $email ) ) {
31
+ $data = array(
32
+ 'id' => get_option( Ga_Admin::GA_SHARETHIS_PROPERTY_ID ),
33
+ 'secret' => get_option( Ga_Admin::GA_SHARETHIS_PROPERTY_SECRET ),
34
+ 'product' => 'viral-notifications',
35
+ 'role' => 'admin',
36
+ 'email' => $email,
37
+ );
38
+
39
+ Ga_Admin::api_client( Ga_Admin::GA_SHARETHIS_API_ALIAS )
40
+ ->call( 'ga_api_sharethis_user_invite', array( $data ) );
41
+
42
+ $errors = Ga_Admin::api_client( Ga_Admin::GA_SHARETHIS_API_ALIAS )->get_errors();
43
+
44
+ if ( false === empty( $errors ) ) {
45
+ $msg = '';
46
+ foreach ( $errors as $error ) {
47
+ $msg .= $error['message'];
48
+ }
49
+ $msg = Ga_Helper::create_url_msg( $msg, Ga_Admin::NOTICE_ERROR );
50
+ } else {
51
+ $msg = Ga_Helper::create_url_msg(
52
+ __( 'An invite was sent to this email' ),
53
+ Ga_Admin::NOTICE_SUCCESS
54
+ );
55
+ }
56
+ }
57
+ } else {
58
+ $msg = Ga_Helper::create_url_msg(
59
+ __( 'Invalid request.' ),
60
+ Ga_Admin::NOTICE_ERROR
61
+ );
62
+ }
63
+ }
64
+
65
+ /**
66
+ * Sets accept terms option to TRUE.
67
+ */
68
+ public static function ga_action_update_terms() {
69
+ update_option( Ga_Admin::GA_SHARETHIS_TERMS_OPTION_NAME, true );
70
+
71
+ wp_safe_redirect( admin_url( Ga_Helper::GA_SETTINGS_PAGE_URL ) );
72
+ }
73
+
74
+ /**
75
+ * Enables all features option.
76
+ */
77
+ public static function ga_action_enable_all_features() {
78
+ Ga_Helper::update_option( Ga_Admin::GA_DISABLE_ALL_FEATURES, false );
79
+
80
+ $page = filter_input( INPUT_GET, 'page', FILTER_SANITIZE_STRING );
81
+
82
+ if ( false === empty( $page ) ) {
83
+ $url = Ga_Helper::create_url( admin_url( 'admin.php' ), compact( 'page' ) );
84
+ } else {
85
+ $url = admin_url( Ga_Helper::create_url( Ga_Helper::GA_SETTINGS_PAGE_URL ) );
86
+ }
87
+
88
+ wp_safe_redirect( $url );
89
+ }
90
+
91
+ /**
92
+ * Disables all features option.
93
+ */
94
+ public static function ga_action_disable_all_features() {
95
+ Ga_Helper::update_option( Ga_Admin::GA_DISABLE_ALL_FEATURES, true );
96
+
97
+ $page = filter_input( INPUT_GET, 'page', FILTER_SANITIZE_STRING );
98
+
99
+ $url = false === empty( $page ) ?
100
+ Ga_Helper::create_url( admin_url( 'admin.php' ), compact( 'page' ) ) :
101
+ admin_url( Ga_Helper::create_url( Ga_Helper::GA_SETTINGS_PAGE_URL ) );
102
+
103
+ wp_safe_redirect( $url );
104
+ }
105
+
106
+ /**
107
+ * Validate data change post ajax call.
108
+ *
109
+ * @return bool
110
+ */
111
+ public static function validate_ajax_data_change_post() {
112
+ $error = 0;
113
+
114
+ $date_range = filter_input( INPUT_POST, 'date_range', FILTER_SANITIZE_STRING );
115
+ $metric = filter_input( INPUT_POST, 'metric', FILTER_SANITIZE_STRING );
116
+
117
+ if ( true === self::verify_nonce( 'ga_ajax_data_change' ) ) {
118
+ if ( false === empty( $date_range ) ) {
119
+ if ( false === is_string( $date_range ) ) {
120
+ $error ++;
121
+ }
122
+ } else {
123
+ $error ++;
124
+ }
125
+
126
+ if ( false === empty( $metric ) ) {
127
+ if ( false === is_string( $metric ) ) {
128
+ $error ++;
129
+ }
130
+ } else {
131
+ $error ++;
132
+ }
133
+ } else {
134
+ $error ++;
135
+ }
136
+
137
+ return 0 === $error;
138
+ }
139
+ }
class/core/Ga_Controller_Core.php DELETED
@@ -1,40 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Created by PhpStorm.
5
- * User: mdn
6
- * Date: 2017-02-01
7
- * Time: 09:46
8
- */
9
- class Ga_Controller_Core {
10
-
11
- const GA_NONCE_FIELD_NAME = '_gawpnonce';
12
- const ACTION_PARAM_NAME = 'ga_action';
13
-
14
- /**
15
- * Runs particular action.
16
- */
17
- public function handle_actions() {
18
- $action = !empty( $_REQUEST[ self::ACTION_PARAM_NAME ] ) ? $_REQUEST[ self::ACTION_PARAM_NAME ] : null;
19
-
20
- if ( $action ) {
21
- $class = get_class( $this );
22
- if ( is_callable( array(
23
- $class,
24
- $action
25
- ) ) ) {
26
- call_user_func( $class . '::' . $action );
27
- }
28
- }
29
- }
30
-
31
- /**
32
- * Verifies nonce for given acction.
33
- *
34
- * @param $action
35
- * @return bool
36
- */
37
- public static function verify_nonce( $action ) {
38
- return isset( $_POST[ self::GA_NONCE_FIELD_NAME ] ) && wp_verify_nonce( $_POST[ self::GA_NONCE_FIELD_NAME ], $action );
39
- }
40
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
class/core/class-ga-controller-core.php ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * GoogleAnalytics Controller Core.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ /**
9
+ * Core Controller.
10
+ */
11
+ class Ga_Controller_Core {
12
+
13
+ const GA_NONCE_FIELD_NAME = '_gawpnonce';
14
+ const ACTION_PARAM_NAME = 'ga_action';
15
+
16
+ /**
17
+ * Runs particular action.
18
+ */
19
+ public function handle_actions() {
20
+ // Nonce verification happens in verify_nonce function.
21
+ $action = false === empty( $_REQUEST[ self::ACTION_PARAM_NAME ] ) ? sanitize_text_field( wp_unslash( $_REQUEST[ self::ACTION_PARAM_NAME ] ) ) : null; // phpcs:ignore
22
+
23
+ if ( $action ) {
24
+ $class = get_class( $this );
25
+ if ( is_callable(
26
+ array(
27
+ $class,
28
+ $action,
29
+ )
30
+ ) ) {
31
+ call_user_func( $class . '::' . $action );
32
+ }
33
+ }
34
+ }
35
+
36
+ /**
37
+ * Verifies nonce for given action.
38
+ *
39
+ * @param string $action Action.
40
+ * @return bool
41
+ */
42
+ public static function verify_nonce( $action ) {
43
+ $nonce = filter_input( INPUT_POST, self::GA_NONCE_FIELD_NAME, FILTER_SANITIZE_STRING );
44
+
45
+ return false !== wp_verify_nonce( $nonce, $action );
46
+ }
47
+ }
class/core/{Ga_View_Core.php → class-ga-view-core.php} RENAMED
@@ -1,5 +1,13 @@
1
  <?php
 
 
 
 
 
2
 
 
 
 
3
  class Ga_View_Core {
4
 
5
  /**
@@ -11,26 +19,26 @@ class Ga_View_Core {
11
  * Loads given view file and it's data.
12
  * Displays view or returns HTML code.
13
  *
14
- * @param string $view Filename
15
- * @param array $data Data array
16
- * @param bool $html Whether to display or return HTML code.
17
  *
18
  * @return string
19
  */
20
  public static function load( $view, $data_array = array(), $html = false ) {
21
- if ( !empty( $view ) ) {
22
  foreach ( $data_array as $k => $v ) {
23
  $$k = $v;
24
  }
25
 
26
  ob_start();
27
- include GA_PLUGIN_DIR . "/" . self::PATH . "/" . $view . ".php";
28
  if ( $html ) {
29
  return ob_get_clean();
30
  } else {
31
- echo ob_get_clean();
 
32
  }
33
  }
34
  }
35
-
36
  }
1
  <?php
2
+ /**
3
+ * GoogleAnalytics View Core.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
 
8
+ /**
9
+ * View Core class.
10
+ */
11
  class Ga_View_Core {
12
 
13
  /**
19
  * Loads given view file and it's data.
20
  * Displays view or returns HTML code.
21
  *
22
+ * @param string $view Filename string.
23
+ * @param array $data_array Data array.
24
+ * @param bool $html Whether to display or return HTML code.
25
  *
26
  * @return string
27
  */
28
  public static function load( $view, $data_array = array(), $html = false ) {
29
+ if ( ! empty( $view ) ) {
30
  foreach ( $data_array as $k => $v ) {
31
  $$k = $v;
32
  }
33
 
34
  ob_start();
35
+ include GA_PLUGIN_DIR . '/' . self::PATH . '/' . $view . '.php';
36
  if ( $html ) {
37
  return ob_get_clean();
38
  } else {
39
+ // Note: this gets escaped elsewhere.
40
+ echo ob_get_clean(); // phpcs:ignore
41
  }
42
  }
43
  }
 
44
  }
css/ga_additional.css CHANGED
@@ -1,325 +1,358 @@
1
  @-ms-viewport {
2
- width: device-width;
3
  }
 
4
  .ga-table {
5
- border-collapse: collapse;
6
- border-spacing: 0;
7
- background-color: transparent;
8
- width: 100%;
9
- max-width: 100%;
10
- margin-bottom: 20px;
11
- border: 1px solid #dddddd;
12
  }
13
 
14
  .ga-table > tbody > tr > th,
15
  .ga-table > tbody > tr > td {
16
- padding: 8px;
17
- line-height: 1.42857143;
18
- vertical-align: top;
19
- border: 1px solid #dddddd;
20
  }
 
21
  .ga-table col[class*="col-"] {
22
- position: static;
23
- float: none;
24
- display: table-column;
25
  }
 
26
  .ga-table td[class*="col-"],
27
  .ga-table th[class*="col-"] {
28
- position: static;
29
- float: none;
30
- display: table-cell;
31
  }
32
 
33
  .progress {
34
- overflow: hidden;
35
- height: 20px;
36
- margin-bottom: 20px;
37
- background-color: #f5f5f5;
38
- border-radius: 4px;
39
- -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
40
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
41
  }
 
42
  .progress-bar {
43
- float: left;
44
- width: 0%;
45
- height: 100%;
46
- font-size: 12px;
47
- line-height: 20px;
48
- color: #ffffff;
49
- text-align: center;
50
- background-color: #337ab7;
51
- -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
52
- box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
53
- -webkit-transition: width 0.6s ease;
54
- -o-transition: width 0.6s ease;
55
- transition: width 0.6s ease;
56
  }
 
57
  .progress.active .progress-bar,
58
  .progress-bar.active {
59
- -webkit-animation: progress-bar-stripes 2s linear infinite;
60
- -o-animation: progress-bar-stripes 2s linear infinite;
61
- animation: progress-bar-stripes 2s linear infinite;
62
  }
63
 
64
  .ga-panel {
65
- margin-bottom: 20px;
66
- background-color: #ffffff;
67
- border: 1px solid transparent;
68
- border-radius: 4px;
69
- -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
70
- box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
71
  }
 
72
  .ga-panel-body {
73
- padding: 15px;
74
  }
 
75
  .ga-panel-heading {
76
- padding: 10px 15px;
77
- border-bottom: 1px solid transparent;
78
- border-top-right-radius: 3px;
79
- border-top-left-radius: 3px;
80
  }
 
81
  .ga-panel-heading > .dropdown .dropdown-toggle {
82
- color: inherit;
83
  }
84
 
85
  .ga-panel-heading > strong {
86
- font-weight: bold;
87
  }
88
 
89
  .ga-panel > .ga-panel-heading + .ga-panel-collapse > .list-group .list-group-item:first-child {
90
- border-top-right-radius: 0;
91
- border-top-left-radius: 0;
92
  }
93
 
94
  .ga-panel > .ga-table {
95
- margin-bottom: 0;
96
  }
97
 
98
  .ga-panel > .ga-table:first-child {
99
- border-top-right-radius: 3px;
100
- border-top-left-radius: 3px;
101
  }
 
102
  .ga-panel > .ga-table:first-child > tbody:first-child > tr:first-child {
103
- border-top-left-radius: 3px;
104
- border-top-right-radius: 3px;
105
  }
106
 
107
 
108
  .ga-panel > .ga-table:first-child > tbody:first-child > tr:first-child td:first-child {
109
- border-top-left-radius: 3px;
110
- border-top-right-radius: 3px;
111
  }
112
 
113
  .ga-panel > .ga-table:last-child {
114
- border-bottom-right-radius: 3px;
115
- border-bottom-left-radius: 3px;
116
  }
 
117
  .ga-panel > .ga-table:last-child > tbody:last-child > tr:last-child {
118
- border-bottom-left-radius: 3px;
119
- border-bottom-right-radius: 3px;
120
  }
 
121
  .ga-panel > .ga-table:last-child > tbody:last-child > tr:last-child td:first-child,
122
  .ga-panel > .ga-table:last-child > tbody:last-child > tr:last-child th:first-child {
123
- border-bottom-left-radius: 3px;
124
- border-bottom-right-radius: 3px;
125
  }
 
126
  .ga-panel > .ga-panel-body + .ga-table,
127
  .ga-panel > .ga-table + .ga-panel-body {
128
- border-top: 1px solid #dddddd;
129
  }
 
130
  .ga-panel > .ga-table > tbody:first-child > tr:first-child th,
131
  .ga-panel > .ga-table > tbody:first-child > tr:first-child td {
132
- border-top: 0;
133
  }
134
- .ga-panel > .ga-table{
135
- border: 0;
 
136
  }
137
 
138
  .ga-panel-default {
139
- border-color: #dddddd;
140
  }
 
141
  .ga-panel-default > .ga-panel-heading {
142
- color: #333333;
143
- background-color: #dcdcdc;
144
- border-color: #dddddd;
145
  }
146
 
147
  .ga-col-pageviews, .ga-box, .ga-col-progressbar {
148
- position: relative;
149
- min-height: 1px;
150
- padding-left: 15px;
151
- padding-right: 15px;
152
  }
153
- .ga-col-name{
154
- width: 20%;
155
- overflow: hidden;
156
- text-overflow: ellipsis;
157
- word-wrap: break-word;
 
158
  }
 
159
  .ga-row:before,
160
  .ga-row:after,
161
  .ga-panel-body:before,
162
- .ga-panel-body:after{
163
- content: " ";
164
- display: table;
165
  }
166
 
167
  .ga-row:after,
168
  .ga-panel-body:after {
169
- clear: both;
170
  }
171
 
172
  .ga-row {
173
- margin-left: -15px;
174
- margin-right: -15px;
175
  }
176
 
177
  .ga-col-pageviews, .ga-box, .ga-col-progressbar {
178
- float: left;
179
  }
 
180
  .ga-col-pageviews {
181
- width: 16.66666667%;
182
  }
 
183
  .ga-col-progressbar {
184
- width: 41.66666667%;
185
  }
186
- .ga-box-diff{
187
- font-size: 16px;
 
188
  }
189
- .ga-box-comparison{
190
- color: grey;
191
- font-size: 12px;
192
- overflow: hidden;
193
- text-overflow: ellipsis;
194
- white-space: nowrap;
 
195
  }
196
- .ga-box-label{
197
- font-size: 14px;
198
- overflow: hidden;
199
- text-overflow: ellipsis;
200
- white-space: nowrap;
 
201
  }
202
- .ga-box{
203
- width: 140px;
204
- box-sizing: border-box;
 
205
  }
 
206
  @media (min-width: 600px) {
207
- .ga-box {
208
- width: 25%;
209
- }
210
  }
 
211
  @media (min-width: 760px) {
212
- .ga-box-diff{
213
- font-size: 24px;
214
- }
215
- .ga-box-comparison{
216
- font-size: 16px
217
- }
218
- .ga-box-label{
219
- font-size: 16px
220
- }
221
-
222
- }
223
- @media screen and (orientation: portrait) and (-webkit-device-pixel-ratio: 3){
224
- .ga-col-name{
225
- max-width: 100px;
226
- }
227
- .ga-chart {
228
- width:300px;
229
- overflow: hidden;
230
- text-overflow: ellipsis;
231
- }
232
- }
233
- .ga-source-name{
234
- color: #337ab7;
235
- text-decoration: none;
236
- word-wrap: break-word;
237
  }
 
 
 
 
 
 
 
238
  .ga-alert {
239
- padding: 15px;
240
- margin-bottom: 20px;
241
- border: 1px solid transparent;
242
- border-radius: 4px;
243
  }
244
 
245
  .ga-alert-success {
246
- color: #3c763d;
247
- background-color: #dff0d8;
248
- border-color: #d6e9c6;
249
- max-width: 95%;
250
  }
251
 
252
  .ga-alert-warning {
253
- color: #8a6d3b;
254
- background-color: #fcf8e3;
255
- border-color: #faebcc;
256
- max-width: 95%;
257
  }
258
 
259
  .ga-alert-danger {
260
- color: #a94442;
261
- background-color: #f2dede;
262
- border-color: #ebccd1;
263
- max-width: 95%;
264
  }
265
 
266
- .ga-alert-link{
267
- margin-left:10px;
268
  }
269
 
270
  .ga-switch {
271
- position: relative;
272
- display: inline-block;
273
- width: 42px;
274
- height: 14px;
275
  }
276
 
277
- .ga-switch input {display:none;}
 
 
278
 
279
  .ga-slider {
280
- position: absolute;
281
- cursor: pointer;
282
- top: 0;
283
- left: 0;
284
- right: 0;
285
- bottom: 0;
286
- background-color: #ccc;
287
- -webkit-transition: .1s;
288
- transition: .1s;
289
  }
290
 
291
  .ga-slider:before {
292
- position: absolute;
293
- content: "";
294
- height: 20px;
295
- width: 20px;
296
- left: 0px;
297
- bottom: -4px;
298
- border:solid 1px gray;
299
- background-color: white;
300
- -webkit-transition: .1s;
301
- transition: .1s;
302
  }
303
 
304
  input:checked + .ga-slider {
305
- background-color: #0085ba;
306
  }
307
 
308
  input:focus + .ga-slider {
309
- box-shadow: 0 0 1px #2196F3;
310
  }
311
 
312
  input:checked + .ga-slider:before {
313
- -webkit-transform: translateX(20px);
314
- -ms-transform: translateX(20px);
315
- transform: translateX(20px);
316
  }
317
 
318
  /* Rounded sliders */
319
  .ga-slider.round {
320
- border-radius: 34px;
321
  }
322
 
323
  .ga-slider.round:before {
324
- border-radius: 50%;
325
  }
1
  @-ms-viewport {
2
+ width: device-width;
3
  }
4
+
5
  .ga-table {
6
+ border-collapse: collapse;
7
+ border-spacing: 0;
8
+ background-color: transparent;
9
+ width: 100%;
10
+ max-width: 100%;
11
+ margin-bottom: 20px;
12
+ border: 1px solid #dddddd;
13
  }
14
 
15
  .ga-table > tbody > tr > th,
16
  .ga-table > tbody > tr > td {
17
+ padding: 8px;
18
+ line-height: 1.42857143;
19
+ vertical-align: top;
20
+ border: 1px solid #dddddd;
21
  }
22
+
23
  .ga-table col[class*="col-"] {
24
+ position: static;
25
+ float: none;
26
+ display: table-column;
27
  }
28
+
29
  .ga-table td[class*="col-"],
30
  .ga-table th[class*="col-"] {
31
+ position: static;
32
+ float: none;
33
+ display: table-cell;
34
  }
35
 
36
  .progress {
37
+ overflow: hidden;
38
+ height: 20px;
39
+ margin-bottom: 20px;
40
+ background-color: #f5f5f5;
41
+ border-radius: 4px;
42
+ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
43
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
44
  }
45
+
46
  .progress-bar {
47
+ float: left;
48
+ width: 0%;
49
+ height: 100%;
50
+ font-size: 12px;
51
+ line-height: 20px;
52
+ color: #ffffff;
53
+ text-align: center;
54
+ background-color: #337ab7;
55
+ -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
56
+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
57
+ -webkit-transition: width 0.6s ease;
58
+ -o-transition: width 0.6s ease;
59
+ transition: width 0.6s ease;
60
  }
61
+
62
  .progress.active .progress-bar,
63
  .progress-bar.active {
64
+ -webkit-animation: progress-bar-stripes 2s linear infinite;
65
+ -o-animation: progress-bar-stripes 2s linear infinite;
66
+ animation: progress-bar-stripes 2s linear infinite;
67
  }
68
 
69
  .ga-panel {
70
+ margin-bottom: 20px;
71
+ background-color: #ffffff;
72
+ border: 1px solid transparent;
73
+ border-radius: 4px;
74
+ -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
75
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
76
  }
77
+
78
  .ga-panel-body {
79
+ padding: 15px;
80
  }
81
+
82
  .ga-panel-heading {
83
+ padding: 10px 15px;
84
+ border-bottom: 1px solid transparent;
85
+ border-top-right-radius: 3px;
86
+ border-top-left-radius: 3px;
87
  }
88
+
89
  .ga-panel-heading > .dropdown .dropdown-toggle {
90
+ color: inherit;
91
  }
92
 
93
  .ga-panel-heading > strong {
94
+ font-weight: bold;
95
  }
96
 
97
  .ga-panel > .ga-panel-heading + .ga-panel-collapse > .list-group .list-group-item:first-child {
98
+ border-top-right-radius: 0;
99
+ border-top-left-radius: 0;
100
  }
101
 
102
  .ga-panel > .ga-table {
103
+ margin-bottom: 0;
104
  }
105
 
106
  .ga-panel > .ga-table:first-child {
107
+ border-top-right-radius: 3px;
108
+ border-top-left-radius: 3px;
109
  }
110
+
111
  .ga-panel > .ga-table:first-child > tbody:first-child > tr:first-child {
112
+ border-top-left-radius: 3px;
113
+ border-top-right-radius: 3px;
114
  }
115
 
116
 
117
  .ga-panel > .ga-table:first-child > tbody:first-child > tr:first-child td:first-child {
118
+ border-top-left-radius: 3px;
119
+ border-top-right-radius: 3px;
120
  }
121
 
122
  .ga-panel > .ga-table:last-child {
123
+ border-bottom-right-radius: 3px;
124
+ border-bottom-left-radius: 3px;
125
  }
126
+
127
  .ga-panel > .ga-table:last-child > tbody:last-child > tr:last-child {
128
+ border-bottom-left-radius: 3px;
129
+ border-bottom-right-radius: 3px;
130
  }
131
+
132
  .ga-panel > .ga-table:last-child > tbody:last-child > tr:last-child td:first-child,
133
  .ga-panel > .ga-table:last-child > tbody:last-child > tr:last-child th:first-child {
134
+ border-bottom-left-radius: 3px;
135
+ border-bottom-right-radius: 3px;
136
  }
137
+
138
  .ga-panel > .ga-panel-body + .ga-table,
139
  .ga-panel > .ga-table + .ga-panel-body {
140
+ border-top: 1px solid #dddddd;
141
  }
142
+
143
  .ga-panel > .ga-table > tbody:first-child > tr:first-child th,
144
  .ga-panel > .ga-table > tbody:first-child > tr:first-child td {
145
+ border-top: 0;
146
  }
147
+
148
+ .ga-panel > .ga-table {
149
+ border: 0;
150
  }
151
 
152
  .ga-panel-default {
153
+ border-color: #dddddd;
154
  }
155
+
156
  .ga-panel-default > .ga-panel-heading {
157
+ color: #333333;
158
+ background-color: #dcdcdc;
159
+ border-color: #dddddd;
160
  }
161
 
162
  .ga-col-pageviews, .ga-box, .ga-col-progressbar {
163
+ position: relative;
164
+ min-height: 1px;
165
+ padding-left: 15px;
166
+ padding-right: 15px;
167
  }
168
+
169
+ .ga-col-name {
170
+ width: 20%;
171
+ overflow: hidden;
172
+ text-overflow: ellipsis;
173
+ word-wrap: break-word;
174
  }
175
+
176
  .ga-row:before,
177
  .ga-row:after,
178
  .ga-panel-body:before,
179
+ .ga-panel-body:after {
180
+ content: " ";
181
+ display: table;
182
  }
183
 
184
  .ga-row:after,
185
  .ga-panel-body:after {
186
+ clear: both;
187
  }
188
 
189
  .ga-row {
190
+ margin-left: -15px;
191
+ margin-right: -15px;
192
  }
193
 
194
  .ga-col-pageviews, .ga-box, .ga-col-progressbar {
195
+ float: left;
196
  }
197
+
198
  .ga-col-pageviews {
199
+ width: 16.66666667%;
200
  }
201
+
202
  .ga-col-progressbar {
203
+ width: 41.66666667%;
204
  }
205
+
206
+ .ga-box-diff {
207
+ font-size: 16px;
208
  }
209
+
210
+ .ga-box-comparison {
211
+ color: grey;
212
+ font-size: 12px;
213
+ overflow: hidden;
214
+ text-overflow: ellipsis;
215
+ white-space: nowrap;
216
  }
217
+
218
+ .ga-box-label {
219
+ font-size: 14px;
220
+ overflow: hidden;
221
+ text-overflow: ellipsis;
222
+ white-space: nowrap;
223
  }
224
+
225
+ .ga-box {
226
+ width: 140px;
227
+ box-sizing: border-box;
228
  }
229
+
230
  @media (min-width: 600px) {
231
+ .ga-box {
232
+ width: 25%;
233
+ }
234
  }
235
+
236
  @media (min-width: 760px) {
237
+ .ga-box-diff {
238
+ font-size: 24px;
239
+ }
240
+
241
+ .ga-box-comparison {
242
+ font-size: 16px
243
+ }
244
+
245
+ .ga-box-label {
246
+ font-size: 16px
247
+ }
248
+
249
+ }
250
+
251
+ @media screen and (orientation: portrait) and (-webkit-device-pixel-ratio: 3) {
252
+ .ga-col-name {
253
+ max-width: 100px;
254
+ }
255
+
256
+ .ga-chart {
257
+ width: 300px;
258
+ overflow: hidden;
259
+ text-overflow: ellipsis;
260
+ }
 
261
  }
262
+
263
+ .ga-source-name {
264
+ color: #337ab7;
265
+ text-decoration: none;
266
+ word-wrap: break-word;
267
+ }
268
+
269
  .ga-alert {
270
+ padding: 15px;
271
+ margin-bottom: 20px;
272
+ border: 1px solid transparent;
273
+ border-radius: 4px;
274
  }
275
 
276
  .ga-alert-success {
277
+ color: #3c763d;
278
+ background-color: #dff0d8;
279
+ border-color: #d6e9c6;
280
+ max-width: 95%;
281
  }
282
 
283
  .ga-alert-warning {
284
+ color: #8a6d3b;
285
+ background-color: #fcf8e3;
286
+ border-color: #faebcc;
287
+ max-width: 95%;
288
  }
289
 
290
  .ga-alert-danger {
291
+ color: #a94442;
292
+ background-color: #f2dede;
293
+ border-color: #ebccd1;
294
+ max-width: 95%;
295
  }
296
 
297
+ .ga-alert-link {
298
+ margin-left: 10px;
299
  }
300
 
301
  .ga-switch {
302
+ position: relative;
303
+ display: inline-block;
304
+ width: 42px;
305
+ height: 14px;
306
  }
307
 
308
+ .ga-switch input {
309
+ display: none;
310
+ }
311
 
312
  .ga-slider {
313
+ position: absolute;
314
+ cursor: pointer;
315
+ top: 0;
316
+ left: 0;
317
+ right: 0;
318
+ bottom: 0;
319
+ background-color: #ccc;
320
+ -webkit-transition: .1s;
321
+ transition: .1s;
322
  }
323
 
324
  .ga-slider:before {
325
+ position: absolute;
326
+ content: "";
327
+ height: 20px;
328
+ width: 20px;
329
+ left: 0px;
330
+ bottom: -4px;
331
+ border: solid 1px gray;
332
+ background-color: white;
333
+ -webkit-transition: .1s;
334
+ transition: .1s;
335
  }
336
 
337
  input:checked + .ga-slider {
338
+ background-color: #0085ba;
339
  }
340
 
341
  input:focus + .ga-slider {
342
+ box-shadow: 0 0 1px #2196F3;
343
  }
344
 
345
  input:checked + .ga-slider:before {
346
+ -webkit-transform: translateX(20px);
347
+ -ms-transform: translateX(20px);
348
+ transform: translateX(20px);
349
  }
350
 
351
  /* Rounded sliders */
352
  .ga-slider.round {
353
+ border-radius: 34px;
354
  }
355
 
356
  .ga-slider.round:before {
357
+ border-radius: 50%;
358
  }
css/ga_modal.css CHANGED
@@ -1,100 +1,100 @@
1
  .ga-modal {
2
- display: none; /* Hidden by default */
3
- position: fixed; /* Stay in place */
4
- z-index: 1; /* Sit on top */
5
- left: 0;
6
- top: 0;
7
- width: 100%; /* Full width */
8
- height: 100%; /* Full height */
9
- overflow: auto; /* Enable scroll if needed */
10
- background-color: rgb(0, 0, 0); /* Fallback color */
11
- background-color: rgba(0, 0, 0, 0.4); /* Black w/ opacity */
12
  }
13
 
14
  .ga-modal-dialog {
15
  }
16
 
17
  .ga-modal-body {
18
- padding: 15px 0px 15px 16px;
19
- background-color: #fff;
20
  }
21
 
22
  .ga-modal-header {
23
- padding: 2px 16px;
24
- background-color: #fff;
25
- border-bottom: 1px solid #cccccc;
26
- border-top-left-radius: 4px;
27
- border-top-right-radius: 4px;
28
- color: #000;
29
  }
30
 
31
  .ga-modal-content {
32
- position: relative;
33
- background-color: transparent;
34
- margin: auto;
35
- margin-top: 50px;
36
- padding: 0;
37
- border: 1px solid #888;
38
- width: 50%;
39
- box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
40
- -webkit-animation-name: animatetop;
41
- -webkit-animation-duration: 0.4s;
42
- animation-name: animatetop;
43
- animation-duration: 0.4s
44
  }
45
 
46
  .ga-modal-footer {
47
- padding: 2px 16px 16px;
48
- background-color: #fff;
49
- color: #000;
50
- border: 1px solid #fff;
51
- border-bottom-left-radius: 4px;
52
- border-bottom-right-radius: 4px;
53
- text-align: right;
54
  }
55
 
56
  /* The Close Button */
57
  .ga-close {
58
- color: #aaa;
59
- float: right;
60
- font-size: 28px;
61
- font-weight: bold;
62
  }
63
 
64
  .ga-close:hover,
65
  .ga-close:focus {
66
- color: black;
67
- text-decoration: none;
68
- cursor: pointer;
69
  }
70
 
71
  /* Add Animation */
72
  @-webkit-keyframes animatetop {
73
- from {
74
- top: -300px;
75
- opacity: 0
76
- }
77
- to {
78
- top: 0;
79
- opacity: 1
80
- }
81
  }
82
 
83
  @keyframes animatetop {
84
- from {
85
- top: -300px;
86
- opacity: 0
87
- }
88
- to {
89
- top: 0;
90
- opacity: 1
91
- }
92
  }
93
 
94
  #ga_access_code_tmp {
95
- width: 80%;
96
  }
97
 
98
  @media screen {
99
 
100
- }
1
  .ga-modal {
2
+ display: none; /* Hidden by default */
3
+ position: fixed; /* Stay in place */
4
+ z-index: 1; /* Sit on top */
5
+ left: 0;
6
+ top: 0;
7
+ width: 100%; /* Full width */
8
+ height: 100%; /* Full height */
9
+ overflow: auto; /* Enable scroll if needed */
10
+ background-color: rgb(0, 0, 0); /* Fallback color */
11
+ background-color: rgba(0, 0, 0, 0.4); /* Black w/ opacity */
12
  }
13
 
14
  .ga-modal-dialog {
15
  }
16
 
17
  .ga-modal-body {
18
+ padding: 15px 0px 15px 16px;
19
+ background-color: #fff;
20
  }
21
 
22
  .ga-modal-header {
23
+ padding: 2px 16px;
24
+ background-color: #fff;
25
+ border-bottom: 1px solid #cccccc;
26
+ border-top-left-radius: 4px;
27
+ border-top-right-radius: 4px;
28
+ color: #000;
29
  }
30
 
31
  .ga-modal-content {
32
+ position: relative;
33
+ background-color: transparent;
34
+ margin: auto;
35
+ margin-top: 50px;
36
+ padding: 0;
37
+ border: 1px solid #888;
38
+ width: 50%;
39
+ box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
40
+ -webkit-animation-name: animatetop;
41
+ -webkit-animation-duration: 0.4s;
42
+ animation-name: animatetop;
43
+ animation-duration: 0.4s
44
  }
45
 
46
  .ga-modal-footer {
47
+ padding: 2px 16px 16px;
48
+ background-color: #fff;
49
+ color: #000;
50
+ border: 1px solid #fff;
51
+ border-bottom-left-radius: 4px;
52
+ border-bottom-right-radius: 4px;
53
+ text-align: right;
54
  }
55
 
56
  /* The Close Button */
57
  .ga-close {
58
+ color: #aaa;
59
+ float: right;
60
+ font-size: 28px;
61
+ font-weight: bold;
62
  }
63
 
64
  .ga-close:hover,
65
  .ga-close:focus {
66
+ color: black;
67
+ text-decoration: none;
68
+ cursor: pointer;
69
  }
70
 
71
  /* Add Animation */
72
  @-webkit-keyframes animatetop {
73
+ from {
74
+ top: -300px;
75
+ opacity: 0
76
+ }
77
+ to {
78
+ top: 0;
79
+ opacity: 1
80
+ }
81
  }
82
 
83
  @keyframes animatetop {
84
+ from {
85
+ top: -300px;
86
+ opacity: 0
87
+ }
88
+ to {
89
+ top: 0;
90
+ opacity: 1
91
+ }
92
  }
93
 
94
  #ga_access_code_tmp {
95
+ width: 80%;
96
  }
97
 
98
  @media screen {
99
 
100
+ }
css/ga_old_wp_support.css CHANGED
@@ -1,20 +1,20 @@
1
  .notice {
2
- background: #fff none repeat scroll 0 0;
3
- border-left: 4px solid #fff;
4
- box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
5
- margin: 5px 0 15px;
6
- padding: 1px 12px;
7
  }
8
  .notice-warning {
9
- border-left-color: #ffb900;
10
  }
11
  .notice-success {
12
- border-left-color: #46b450;
13
  }
14
  .notice-error{
15
- border-left-color: #dc3232;
16
  }
17
  .notice p{
18
- margin: 0.5em 0;
19
- padding: 2px;
20
- }
1
  .notice {
2
+ background: #fff none repeat scroll 0 0;
3
+ border-left: 4px solid #fff;
4
+ box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
5
+ margin: 5px 0 15px;
6
+ padding: 1px 12px;
7
  }
8
  .notice-warning {
9
+ border-left-color: #ffb900;
10
  }
11
  .notice-success {
12
+ border-left-color: #46b450;
13
  }
14
  .notice-error{
15
+ border-left-color: #dc3232;
16
  }
17
  .notice p{
18
+ margin: 0.5em 0;
19
+ padding: 2px;
20
+ }
css/googleanalytics.css CHANGED
@@ -1,125 +1,124 @@
1
  @CHARSET "UTF-8";
2
 
3
  .wrap.ga-wrap {
4
- margin: 0px auto !important;
5
- margin-top: 10px !important;
6
- margin-right: 0px !important;
7
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
8
- font-size: 14px;
9
- line-height: 1.42857143;
10
- color: #333333;
11
  }
12
 
13
  .ga_container {
14
- margin-top: 25px;
15
  }
16
 
17
  .google-analytics_page_googleanalytics-settings .ga_container {
18
- display: flex;
19
- flex-wrap: wrap;
20
- justify-content: space-between;
21
  }
22
 
23
  .ga_container .sidebar-ad {
24
- width: 50%;
25
- background: #fff;
26
- padding: 16px;
27
- box-shadow: 6px 7px 12px 6px #cdcdcd;
28
  }
29
 
30
  .ga_container .sidebar-ad img {
31
- width: 100%;
32
  }
33
 
34
  .ga_container a.view-report {
35
- background: #c6dafc;
36
- width: 200px;
37
- display: inline-block;
38
- padding: 10px 20px;
39
- border-radius: 5px;
40
- text-decoration: none;
41
- font-size: 15px;
42
- font-weight: bold;
43
- text-align: center;
44
- margin: 10px 5px 10px 0;
45
  }
46
 
47
  .ga_container .filter-choices a,
48
- .ga_container .filter-choices button
49
- {
50
- background: #f9f9f9;
51
- width: 105px;
52
- display: inline-block;
53
- padding: 10px 20px;
54
- border-radius: 5px;
55
- text-decoration: none;
56
- font-size: 15px;
57
- font-weight: bold;
58
- text-align: center;
59
- margin: 10px 5px 10px 0;
60
- color: #888888;
61
  }
62
 
63
  .ga_container .filter-choices a.selected,
64
  .ga_container .filter-choices button {
65
- background: #c6dafc;
66
- color: #353535;
67
  }
68
 
69
  .ga_container .filter-choices button {
70
- padding: 5px 20px;
71
  }
72
 
73
  #exTab1, #exTab2 {
74
- margin-right: 15px !important;
75
  }
76
 
77
  #exTab1 .tab-content {
78
- color: white;
79
- background-color: #428bca;
80
- padding: 5px 15px;
81
  }
82
 
83
  #exTab2 h3 {
84
- color: white;
85
- background-color: #428bca;
86
- padding: 5px 15px;
87
  }
88
 
89
  /* remove border radius for the tab */
90
  #exTab1 .nav-pills > li > a {
91
- border-radius: 0;
92
  }
93
 
94
  /* change border radius for the tab , apply corners on top*/
95
  #exTab3 .nav-pills > li > a {
96
- border-radius: 4px 4px 0 0;
97
  }
98
 
99
  #exTab3 .tab-content {
100
- color: white;
101
- background-color: #428bca;
102
- padding: 5px 15px;
103
  }
104
 
105
  label.ga_checkbox_label {
106
- margin-top: 6px !important;
107
  }
108
 
109
  .form-table th {
110
- width: 250px !important;
111
  }
112
 
113
  .wrap.ga-notice {
114
- width: 100% !important;
115
- margin-left: 0px !important;
116
- margin-right: 10px !important;
117
  }
118
 
119
  .ga_warning {
120
- font-size: 12px;
121
- font-weight: normal;
122
- margin-top: 10px;
123
  }
124
 
125
  .ga-boxes-container {
@@ -127,496 +126,495 @@ label.ga_checkbox_label {
127
  }
128
 
129
  .ga-box-row {
130
- display: table;
131
- width: 100%;
132
- table-layout: fixed;
133
- border-spacing: 10px;
134
  }
135
 
136
  .ga-box-column {
137
- display: table-cell;
138
- -moz-box-shadow: 0 0 5px #e5e5e5;
139
- -webkit-box-shadow: 0 0 5px #e5e5e5;
140
- box-shadow: 0px 0px 5px #e5e5e5;
141
  }
142
 
143
  .ga-box-dashboard {
144
- border: 1px solid #cccccc;
145
- border-radius: 0px;
146
- padding: 3px;
147
- text-align: center;
148
  }
149
 
150
  .ga-box-centered {
151
- text-align: center;
152
  }
153
 
154
  .ga-loader-wrapper {
155
- float: right;
156
- margin-top: 4px;
157
- margin-right: 5px;
158
  }
159
 
160
  .ga-loader-wrapper.stats-page {
161
- width: 45px;
162
- text-align: center;
163
- margin: 0 auto;
164
- float: none;
165
  }
166
 
167
  .ga-loader {
168
- border: 4px solid #f3f3f3; /* Light grey */
169
- border-top: 4px solid #3498db; /* Blue */
170
- border-radius: 50%;
171
- width: 15px;
172
- height: 15px;
173
- animation: spin 2s linear infinite;
174
- display: none;
175
  }
176
 
177
  .ga-loader.stats-page-loader {
178
- width: 45px;
179
- height: 45px;
180
- border-width: 6px;
181
  }
182
 
183
  @keyframes spin {
184
- 0% {
185
- transform: rotate(0deg);
186
- }
187
- 100% {
188
- transform: rotate(360deg);
189
- }
190
  }
191
 
192
  .ga-review-us {
193
- position: fixed;
194
- right: 10px;
195
- bottom: 40px;
196
- background: #fff;
197
- border: solid 1px #3379b7;
198
- border-radius: 10px;
199
- padding: 15px;
200
- width: 295px;
201
- text-align: center;
202
  }
203
 
204
  .ga-review-us #close-review-us {
205
- cursor: pointer;
206
  }
207
 
208
  .ga-review-us h3 {
209
- color: #3379b7;
210
  }
211
 
212
  .ga-review-us h3 a {
213
- color: #ff9801;
214
  }
215
 
216
  .ga-chart {
217
  }
218
 
219
  .label-grey {
220
- color: #ccc;
221
  }
222
 
223
  .ga-tooltip {
224
- position: relative;
225
- cursor: not-allowed;
226
  }
227
 
228
  .ga-tooltip input[disabled] {
229
- cursor: not-allowed;
230
  }
231
 
232
  .ga-tooltiptext {
233
- background-color: #ffe692;
234
- border: 1px solid #ffb900;
235
- border-radius: 4px;
236
- color: #444;
237
- font-size: 12px;
238
- font-weight: 500;
239
- margin-left: 10px;
240
- margin-top: 30px;
241
- padding: 3px 10px;
242
- position: relative;
243
- white-space: nowrap;
244
- text-align: center;
245
- visibility: hidden;
246
- width: auto;
247
- z-index: 1;
248
  }
249
 
250
  .ga-tt-abs {
251
- display: inline-block;
252
- position: absolute;
253
- margin-top: 0px;
254
  }
255
 
256
  .ga-tooltip:hover .ga-tooltiptext {
257
- visibility: visible;
258
  }
259
 
260
- .weight-normal{
261
- font-weight: normal;
262
  }
263
 
264
  .ga-love-text {
265
- display: block;
266
- margin-top: 20px;
267
- font-size: 10px;
268
- font-weight: bold;
269
  }
270
 
271
- .ga-debug-form-div{
272
- margin:5px;
273
  }
274
 
275
  .ga-debug-form-label {
276
- vertical-align: top;
277
- display: inline-block;
278
- width: 20%;
279
  }
280
 
281
  .ga-debug-form-field {
282
- width: 50%;
283
  }
284
 
285
  .ga-debug-form-loader {
286
- width: 20%;
287
  }
288
 
289
  .demo-ad.ga-panel-default img {
290
- opacity: .3;
291
- background: #cdcdcd;
292
- width: 100%;
293
  }
294
 
295
  .demo-enable-popup {
296
- display: none;
297
- position: fixed;
298
- top: 50%;
299
- left: 50%;
300
- transform: translate(-50%,-50%);
301
- background: #fff;
302
- border: 2px solid #428aca;
303
- padding: 15px;
304
- width: 500px;
305
  }
306
 
307
  .demo-enable-popup.engage {
308
- display: block;
309
  }
310
 
311
  .demo-enable-popup .close-demo-modal {
312
- position: absolute;
313
- right: 10px;
314
- top: 10px;
315
- border: 1px solid;
316
- border-radius: 20px;
317
- padding: 0 7px;
318
- color: #fff;
319
- background: #cdcdcd;
320
- cursor: pointer;
321
  }
322
 
323
  .demo-enable-popup p {
324
- font-size: 18px;
325
- text-align: center;
326
- padding: 0 20px 10px;
327
  }
328
 
329
  #sharethis-form-color {
330
- display: flex;
331
- flex-wrap: wrap;
332
- margin: auto;
333
- width: 50%;
334
  }
335
 
336
  #sharethis-form-color .color {
337
- box-shadow: 1px 1px 4px 1px #cdcdcd;
338
- cursor: pointer;
339
- margin: 5px;
340
  }
341
 
342
- #sharethis-form-color .color.selected{
343
- box-shadow: 0px 0px 3px 5px #4583ee;
344
  }
345
 
346
  #publisher-purpose .purpose-item {
347
- margin-bottom: 25px;
348
  }
349
 
350
  #publisher-purpose .purpose-item div.title {
351
- display: block;
352
- text-align: left;
353
- font-weight: bold;
354
- width: 100%;
355
  }
356
 
357
  #publisher-purpose .purpose-item label {
358
- display: inline-block;
359
- width: 21%;
360
  }
361
 
362
  .gdpr-platform {
363
- margin: 20px auto;
364
- max-width: 900px;
365
- background: #fff;
366
- padding: 20px;
367
- z-index: 999;
368
- position: relative;
369
  }
370
 
371
  .gdpr-submit-button {
372
- margin: 20px auto;
373
- max-width: 900px;
374
- z-index: 999;
375
- position: relative;
376
  }
377
 
378
  .gdpr-platform #publisher-purpose .purpose-item label:first-of-type {
379
- width: 14%;
380
  }
381
 
382
- .gdpr-platform .switch label input[type=radio]:checked+.lever,
383
- .gdpr-platform .switch label input[type=checkbox]:checked+.lever {
384
- background: #4583ee;
385
- border: 2px solid #4583ee;
386
- box-shadow: none;
387
  }
388
 
389
  .gdpr-platform input[type="text"] {
390
- line-height: 40px;
391
- margin-bottom: 10px;
392
- width: 300px;
393
  }
394
 
395
  .gdpr-platform select {
396
- margin-bottom: 10px;
397
- line-height: 40px;
398
- width: 300px;
399
  }
400
 
401
- .gdpr-platform .switch label input[type=radio]:checked+.lever:before,
402
- .gdpr-platform .switch label input[type=checkbox]:checked+.lever:before {
403
- content:"✓";
404
- position: absolute;
405
- top:0;
406
- left:3px;
407
- color: #fff;
408
  }
409
 
410
  .gdpr-platform .switch label {
411
- font-size: 12px;
412
- display: block;
413
- margin-top: 10px;
414
  }
415
 
416
  .gdpr-platform .switch label .lever {
417
- content: "";
418
- display: inline-block;
419
- position: relative;
420
- width: 20px;
421
- height: 18px;
422
- background-color: #fff;
423
- border: 1px solid #cdcdcd;
424
- border-radius: 0;
425
- margin-right: 10px;
426
- transition: background .3s ease;
427
- vertical-align: middle;
428
- margin: 0 16px;
429
  }
430
 
431
  .gdpr-platform .switch label .lever:after {
432
- border-radius: 0;
433
- content: unset;
434
- position: unset;
435
  }
436
 
437
 
438
- .gdpr-platform [type=radio].filled-in+label:before, .gdpr-platform [type=checkbox].filled-in+label:before {
439
- content: "";
440
- left: 0;
441
- position: absolute;
442
- transition: border .25s,background-color .25s,width .2s .1s,height .2s .1s,top .2s .1s,left .2s .1s;
443
- z-index: 1;
444
  }
445
 
446
  p.form-color {
447
- float: left;
448
- width: 100%;
449
- padding-top: 15px;
450
  }
451
 
452
  #sharethis-form-color {
453
- display: flex;
454
- flex-wrap: wrap;
455
- margin: auto;
456
- width: 50%;
457
  }
458
 
459
  #sharethis-form-color .color {
460
- box-shadow: 1px 1px 4px 1px #cdcdcd;
461
- cursor: pointer;
462
- margin: 5px;
463
  }
464
 
465
- #sharethis-form-color .color.selected{
466
- box-shadow: 0px 0px 3px 5px #4583ee;
467
  }
468
 
469
  .empty-choices {
470
- display: flex;
471
- justify-content: center;
472
- opacity: 1;
473
- transition: opacity .6s;
474
  }
475
 
476
  a.st-rc-link {
477
- margin: 20px 0 0 10px;
478
  }
479
 
480
  .gdpr-platform a.st-rc-link {
481
- background: #4583ee;
482
- border-radius: 3px;
483
- border: none;
484
- color: #fff;
485
- cursor: pointer;
486
- margin: .8em auto .5em;
487
- display: inline-block;
488
- padding: 15px 60px;
489
- letter-spacing: 0.1em;
490
- text-align: center;
491
- text-decoration: none;
492
- transition: opacity 0.2s ease-out
493
  }
494
 
495
  .empty-choices a {
496
- padding: 10px;
497
- min-width: 250px;
498
  }
499
 
500
  .empty-choices a.st-rc-link {
501
- margin: 20px 0 20px 10px;
502
  }
503
 
504
  .gdpr-platform .vendor-table-body {
505
- border: solid 1px #cdcdcd;
506
- padding: 10px;
507
- max-height: 600px;
508
- overflow: scroll;
509
  }
510
 
511
  .gdpr-platform .vendor-table-cell {
512
- padding: 20px 0;
513
- border-bottom: solid 1px #cdcdcd;
514
  }
515
 
516
  .gdpr-platform .purpose-item input[type="checkbox"],
517
  .gdpr-platform .vendor-table-cell input[type="checkbox"],
518
- .gdpr-platform .purpose-item input[type="radio"]
519
- {
520
- display: none;
521
  }
522
 
523
  .gdpr-platform .exclusion-item {
524
- padding: 20px 0;
525
- border-bottom: solid 1px #cdcdcd;
526
  }
527
 
528
  .gdpr-platform label.enable-tool {
529
- font-weight: bold;
530
- font-size: 16px;
531
- margin-bottom: 20px;
532
  }
533
 
534
  .gdpr-platform h2 {
535
- text-align: center;
536
  }
537
 
538
  .gdpr-platform .error-message {
539
- display: block;
540
- text-align: left;
541
  }
542
 
543
  .gdpr-platform .gdpr-landing img {
544
- margin: auto;
545
- width: 600px;
546
- display: block;
547
  }
548
 
549
  .register-section {
550
- text-align: center;
551
- padding: 30px 20px;
552
  }
553
 
554
  .register-section button {
555
- background-color: #4583ee;
556
- color: #fff;
557
- padding: 10px 15px;
558
- border: none;
559
- border-radius: 5px;
560
  }
561
 
562
  .accor-wrap {
563
- margin: 1rem 0 0;
564
- display: inline-block;
565
- width: 100%;
566
  }
567
 
568
  .accor-wrap .accor-tab {
569
- background: #4582ec;
570
- padding: .5rem;
571
- border-radius: 5px;
572
- color: #ffffff;
573
  }
574
 
575
  .accor-wrap .well {
576
- display: inline-block;
577
- width: 100%;
578
  }
579
 
580
  .accor-wrap .well h3 {
581
- margin: 1rem 0;
582
- padding-top: 20px;
583
- text-align: center;
584
- width: 100%;
585
  }
586
 
587
  .accor-wrap .well .col-md-12:first-of-type h3 {
588
- margin-top: 0;
589
  }
590
 
591
  .accor-wrap .accor-content {
592
- display: none;
593
  }
594
 
595
  .accor-wrap .accor-arrow {
596
- border: 1px solid #ffffff;
597
- padding: .2rem .4rem;
598
- border-radius: 5px;
599
- margin: 0 .3rem 0 .3rem;
600
- font-size: 12px;
601
- cursor: pointer;
602
- font-family: arial, sans-serif;
603
  }
604
 
605
  .ga-demo-chart .ga-chart {
606
- display: inline-block;
607
- width: 46%;
608
  }
609
 
610
  #ga_form .form-table {
611
- max-width: 560px;
612
  }
613
 
614
  .adBanner {
615
- background-color: transparent;
616
- height: 1px;
617
- width: 1px;
618
  }
619
 
620
  #adblocker-notice {
621
- display: none;
622
  }
1
  @CHARSET "UTF-8";
2
 
3
  .wrap.ga-wrap {
4
+ margin: 0px auto !important;
5
+ margin-top: 10px !important;
6
+ margin-right: 0px !important;
7
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
8
+ font-size: 14px;
9
+ line-height: 1.42857143;
10
+ color: #333333;
11
  }
12
 
13
  .ga_container {
14
+ margin-top: 25px;
15
  }
16
 
17
  .google-analytics_page_googleanalytics-settings .ga_container {
18
+ display: flex;
19
+ flex-wrap: wrap;
20
+ justify-content: space-between;
21
  }
22
 
23
  .ga_container .sidebar-ad {
24
+ width: 50%;
25
+ background: #fff;
26
+ padding: 16px;
27
+ box-shadow: 6px 7px 12px 6px #cdcdcd;
28
  }
29
 
30
  .ga_container .sidebar-ad img {
31
+ width: 100%;
32
  }
33
 
34
  .ga_container a.view-report {
35
+ background: #c6dafc;
36
+ width: 200px;
37
+ display: inline-block;
38
+ padding: 10px 20px;
39
+ border-radius: 5px;
40
+ text-decoration: none;
41
+ font-size: 15px;
42
+ font-weight: bold;
43
+ text-align: center;
44
+ margin: 10px 5px 10px 0;
45
  }
46
 
47
  .ga_container .filter-choices a,
48
+ .ga_container .filter-choices button {
49
+ background: #f9f9f9;
50
+ width: 105px;
51
+ display: inline-block;
52
+ padding: 10px 20px;
53
+ border-radius: 5px;
54
+ text-decoration: none;
55
+ font-size: 15px;
56
+ font-weight: bold;
57
+ text-align: center;
58
+ margin: 10px 5px 10px 0;
59
+ color: #888888;
 
60
  }
61
 
62
  .ga_container .filter-choices a.selected,
63
  .ga_container .filter-choices button {
64
+ background: #c6dafc;
65
+ color: #353535;
66
  }
67
 
68
  .ga_container .filter-choices button {
69
+ padding: 5px 20px;
70
  }
71
 
72
  #exTab1, #exTab2 {
73
+ margin-right: 15px !important;
74
  }
75
 
76
  #exTab1 .tab-content {
77
+ color: white;
78
+ background-color: #428bca;
79
+ padding: 5px 15px;
80
  }
81
 
82
  #exTab2 h3 {
83
+ color: white;
84
+ background-color: #428bca;
85
+ padding: 5px 15px;
86
  }
87
 
88
  /* remove border radius for the tab */
89
  #exTab1 .nav-pills > li > a {
90
+ border-radius: 0;
91
  }
92
 
93
  /* change border radius for the tab , apply corners on top*/
94
  #exTab3 .nav-pills > li > a {
95
+ border-radius: 4px 4px 0 0;
96
  }
97
 
98
  #exTab3 .tab-content {
99
+ color: white;
100
+ background-color: #428bca;
101
+ padding: 5px 15px;
102
  }
103
 
104
  label.ga_checkbox_label {
105
+ margin-top: 6px !important;
106
  }
107
 
108
  .form-table th {
109
+ width: 250px !important;
110
  }
111
 
112
  .wrap.ga-notice {
113
+ width: 100% !important;
114
+ margin-left: 0px !important;
115
+ margin-right: 10px !important;
116
  }
117
 
118
  .ga_warning {
119
+ font-size: 12px;
120
+ font-weight: normal;
121
+ margin-top: 10px;
122
  }
123
 
124
  .ga-boxes-container {
126
  }
127
 
128
  .ga-box-row {
129
+ display: table;
130
+ width: 100%;
131
+ table-layout: fixed;
132
+ border-spacing: 10px;
133
  }
134
 
135
  .ga-box-column {
136
+ display: table-cell;
137
+ -moz-box-shadow: 0 0 5px #e5e5e5;
138
+ -webkit-box-shadow: 0 0 5px #e5e5e5;
139
+ box-shadow: 0px 0px 5px #e5e5e5;
140
  }
141
 
142
  .ga-box-dashboard {
143
+ border: 1px solid #cccccc;
144
+ border-radius: 0px;
145
+ padding: 3px;
146
+ text-align: center;
147
  }
148
 
149
  .ga-box-centered {
150
+ text-align: center;
151
  }
152
 
153
  .ga-loader-wrapper {
154
+ float: right;
155
+ margin-top: 4px;
156
+ margin-right: 5px;
157
  }
158
 
159
  .ga-loader-wrapper.stats-page {
160
+ width: 45px;
161
+ text-align: center;
162
+ margin: 0 auto;
163
+ float: none;
164
  }
165
 
166
  .ga-loader {
167
+ border: 4px solid #f3f3f3; /* Light grey */
168
+ border-top: 4px solid #3498db; /* Blue */
169
+ border-radius: 50%;
170
+ width: 15px;
171
+ height: 15px;
172
+ animation: spin 2s linear infinite;
173
+ display: none;
174
  }
175
 
176
  .ga-loader.stats-page-loader {
177
+ width: 45px;
178
+ height: 45px;
179
+ border-width: 6px;
180
  }
181
 
182
  @keyframes spin {
183
+ 0% {
184
+ transform: rotate(0deg);
185
+ }
186
+ 100% {
187
+ transform: rotate(360deg);
188
+ }
189
  }
190
 
191
  .ga-review-us {
192
+ position: fixed;
193
+ right: 10px;
194
+ bottom: 40px;
195
+ background: #fff;
196
+ border: solid 1px #3379b7;
197
+ border-radius: 10px;
198
+ padding: 15px;
199
+ width: 295px;
200
+ text-align: center;
201
  }
202
 
203
  .ga-review-us #close-review-us {
204
+ cursor: pointer;
205
  }
206
 
207
  .ga-review-us h3 {
208
+ color: #3379b7;
209
  }
210
 
211
  .ga-review-us h3 a {
212
+ color: #ff9801;
213
  }
214
 
215
  .ga-chart {
216
  }
217
 
218
  .label-grey {
219
+ color: #ccc;
220
  }
221
 
222
  .ga-tooltip {
223
+ position: relative;
224
+ cursor: not-allowed;
225
  }
226
 
227
  .ga-tooltip input[disabled] {
228
+ cursor: not-allowed;
229
  }
230
 
231
  .ga-tooltiptext {
232
+ background-color: #ffe692;
233
+ border: 1px solid #ffb900;
234
+ border-radius: 4px;
235
+ color: #444;
236
+ font-size: 12px;
237
+ font-weight: 500;
238
+ margin-left: 10px;
239
+ margin-top: 30px;
240
+ padding: 3px 10px;
241
+ position: relative;
242
+ white-space: nowrap;
243
+ text-align: center;
244
+ visibility: hidden;
245
+ width: auto;
246
+ z-index: 1;
247
  }
248
 
249
  .ga-tt-abs {
250
+ display: inline-block;
251
+ position: absolute;
252
+ margin-top: 0px;
253
  }
254
 
255
  .ga-tooltip:hover .ga-tooltiptext {
256
+ visibility: visible;
257
  }
258
 
259
+ .weight-normal {
260
+ font-weight: normal;
261
  }
262
 
263
  .ga-love-text {
264
+ display: block;
265
+ margin-top: 20px;
266
+ font-size: 10px;
267
+ font-weight: bold;
268
  }
269
 
270
+ .ga-debug-form-div {
271
+ margin: 5px;
272
  }
273
 
274
  .ga-debug-form-label {
275
+ vertical-align: top;
276
+ display: inline-block;
277
+ width: 20%;
278
  }
279
 
280
  .ga-debug-form-field {
281
+ width: 50%;
282
  }
283
 
284
  .ga-debug-form-loader {
285
+ width: 20%;
286
  }
287
 
288
  .demo-ad.ga-panel-default img {
289
+ opacity: .3;
290
+ background: #cdcdcd;
291
+ width: 100%;
292
  }
293
 
294
  .demo-enable-popup {
295
+ display: none;
296
+ position: fixed;
297
+ top: 50%;
298
+ left: 50%;
299
+ transform: translate(-50%, -50%);
300
+ background: #fff;
301
+ border: 2px solid #428aca;
302
+ padding: 15px;
303
+ width: 500px;
304
  }
305
 
306
  .demo-enable-popup.engage {
307
+ display: block;
308
  }
309
 
310
  .demo-enable-popup .close-demo-modal {
311
+ position: absolute;
312
+ right: 10px;
313
+ top: 10px;
314
+ border: 1px solid;
315
+ border-radius: 20px;
316
+ padding: 0 7px;
317
+ color: #fff;
318
+ background: #cdcdcd;
319
+ cursor: pointer;
320
  }
321
 
322
  .demo-enable-popup p {
323
+ font-size: 18px;
324
+ text-align: center;
325
+ padding: 0 20px 10px;
326
  }
327
 
328
  #sharethis-form-color {
329
+ display: flex;
330
+ flex-wrap: wrap;
331
+ margin: auto;
332
+ width: 50%;
333
  }
334
 
335
  #sharethis-form-color .color {
336
+ box-shadow: 1px 1px 4px 1px #cdcdcd;
337
+ cursor: pointer;
338
+ margin: 5px;
339
  }
340
 
341
+ #sharethis-form-color .color.selected {
342
+ box-shadow: 0px 0px 3px 5px #4583ee;
343
  }
344
 
345
  #publisher-purpose .purpose-item {
346
+ margin-bottom: 25px;
347
  }
348
 
349
  #publisher-purpose .purpose-item div.title {
350
+ display: block;
351
+ text-align: left;
352
+ font-weight: bold;
353
+ width: 100%;
354
  }
355
 
356
  #publisher-purpose .purpose-item label {
357
+ display: inline-block;
358
+ width: 21%;
359
  }
360
 
361
  .gdpr-platform {
362
+ margin: 20px auto;
363
+ max-width: 900px;
364
+ background: #fff;
365
+ padding: 20px;
366
+ z-index: 999;
367
+ position: relative;
368
  }
369
 
370
  .gdpr-submit-button {
371
+ margin: 20px auto;
372
+ max-width: 900px;
373
+ z-index: 999;
374
+ position: relative;
375
  }
376
 
377
  .gdpr-platform #publisher-purpose .purpose-item label:first-of-type {
378
+ width: 14%;
379
  }
380
 
381
+ .gdpr-platform .switch label input[type=radio]:checked + .lever,
382
+ .gdpr-platform .switch label input[type=checkbox]:checked + .lever {
383
+ background: #4583ee;
384
+ border: 2px solid #4583ee;
385
+ box-shadow: none;
386
  }
387
 
388
  .gdpr-platform input[type="text"] {
389
+ line-height: 40px;
390
+ margin-bottom: 10px;
391
+ width: 300px;
392
  }
393
 
394
  .gdpr-platform select {
395
+ margin-bottom: 10px;
396
+ line-height: 40px;
397
+ width: 300px;
398
  }
399
 
400
+ .gdpr-platform .switch label input[type=radio]:checked + .lever:before,
401
+ .gdpr-platform .switch label input[type=checkbox]:checked + .lever:before {
402
+ content: "✓";
403
+ position: absolute;
404
+ top: 0;
405
+ left: 3px;
406
+ color: #fff;
407
  }
408
 
409
  .gdpr-platform .switch label {
410
+ font-size: 12px;
411
+ display: block;
412
+ margin-top: 10px;
413
  }
414
 
415
  .gdpr-platform .switch label .lever {
416
+ content: "";
417
+ display: inline-block;
418
+ position: relative;
419
+ width: 20px;
420
+ height: 18px;
421
+ background-color: #fff;
422
+ border: 1px solid #cdcdcd;
423
+ border-radius: 0;
424
+ margin-right: 10px;
425
+ transition: background .3s ease;
426
+ vertical-align: middle;
427
+ margin: 0 16px;
428
  }
429
 
430
  .gdpr-platform .switch label .lever:after {
431
+ border-radius: 0;
432
+ content: unset;
433
+ position: unset;
434
  }
435
 
436
 
437
+ .gdpr-platform [type=radio].filled-in + label:before, .gdpr-platform [type=checkbox].filled-in + label:before {
438
+ content: "";
439
+ left: 0;
440
+ position: absolute;
441
+ transition: border .25s, background-color .25s, width .2s .1s, height .2s .1s, top .2s .1s, left .2s .1s;
442
+ z-index: 1;
443
  }
444
 
445
  p.form-color {
446
+ float: left;
447
+ width: 100%;
448
+ padding-top: 15px;
449
  }
450
 
451
  #sharethis-form-color {
452
+ display: flex;
453
+ flex-wrap: wrap;
454
+ margin: auto;
455
+ width: 50%;
456
  }
457
 
458
  #sharethis-form-color .color {
459
+ box-shadow: 1px 1px 4px 1px #cdcdcd;
460
+ cursor: pointer;
461
+ margin: 5px;
462
  }
463
 
464
+ #sharethis-form-color .color.selected {
465
+ box-shadow: 0px 0px 3px 5px #4583ee;
466
  }
467
 
468
  .empty-choices {
469
+ display: flex;
470
+ justify-content: center;
471
+ opacity: 1;
472
+ transition: opacity .6s;
473
  }
474
 
475
  a.st-rc-link {
476
+ margin: 20px 0 0 10px;
477
  }
478
 
479
  .gdpr-platform a.st-rc-link {
480
+ background: #4583ee;
481
+ border-radius: 3px;
482
+ border: none;
483
+ color: #fff;
484
+ cursor: pointer;
485
+ margin: .8em auto .5em;
486
+ display: inline-block;
487
+ padding: 15px 60px;
488
+ letter-spacing: 0.1em;
489
+ text-align: center;
490
+ text-decoration: none;
491
+ transition: opacity 0.2s ease-out
492
  }
493
 
494
  .empty-choices a {
495
+ padding: 10px;
496
+ min-width: 250px;
497
  }
498
 
499
  .empty-choices a.st-rc-link {
500
+ margin: 20px 0 20px 10px;
501
  }
502
 
503
  .gdpr-platform .vendor-table-body {
504
+ border: solid 1px #cdcdcd;
505
+ padding: 10px;
506
+ max-height: 600px;
507
+ overflow: scroll;
508
  }
509
 
510
  .gdpr-platform .vendor-table-cell {
511
+ padding: 20px 0;
512
+ border-bottom: solid 1px #cdcdcd;
513
  }
514
 
515
  .gdpr-platform .purpose-item input[type="checkbox"],
516
  .gdpr-platform .vendor-table-cell input[type="checkbox"],
517
+ .gdpr-platform .purpose-item input[type="radio"] {
518
+ display: none;
 
519
  }
520
 
521
  .gdpr-platform .exclusion-item {
522
+ padding: 20px 0;
523
+ border-bottom: solid 1px #cdcdcd;
524
  }
525
 
526
  .gdpr-platform label.enable-tool {
527
+ font-weight: bold;
528
+ font-size: 16px;
529
+ margin-bottom: 20px;
530
  }
531
 
532
  .gdpr-platform h2 {
533
+ text-align: center;
534
  }
535
 
536
  .gdpr-platform .error-message {
537
+ display: block;
538
+ text-align: left;
539
  }
540
 
541
  .gdpr-platform .gdpr-landing img {
542
+ margin: auto;
543
+ width: 600px;
544
+ display: block;
545
  }
546
 
547
  .register-section {
548
+ text-align: center;
549
+ padding: 30px 20px;
550
  }
551
 
552
  .register-section button {
553
+ background-color: #4583ee;
554
+ color: #fff;
555
+ padding: 10px 15px;
556
+ border: none;
557
+ border-radius: 5px;
558
  }
559
 
560
  .accor-wrap {
561
+ margin: 1rem 0 0;
562
+ display: inline-block;
563
+ width: 100%;
564
  }
565
 
566
  .accor-wrap .accor-tab {
567
+ background: #4582ec;
568
+ padding: .5rem;
569
+ border-radius: 5px;
570
+ color: #ffffff;
571
  }
572
 
573
  .accor-wrap .well {
574
+ display: inline-block;
575
+ width: 100%;
576
  }
577
 
578
  .accor-wrap .well h3 {
579
+ margin: 1rem 0;
580
+ padding-top: 20px;
581
+ text-align: center;
582
+ width: 100%;
583
  }
584
 
585
  .accor-wrap .well .col-md-12:first-of-type h3 {
586
+ margin-top: 0;
587
  }
588
 
589
  .accor-wrap .accor-content {
590
+ display: none;
591
  }
592
 
593
  .accor-wrap .accor-arrow {
594
+ border: 1px solid #ffffff;
595
+ padding: .2rem .4rem;
596
+ border-radius: 5px;
597
+ margin: 0 .3rem 0 .3rem;
598
+ font-size: 12px;
599
+ cursor: pointer;
600
+ font-family: arial, sans-serif;
601
  }
602
 
603
  .ga-demo-chart .ga-chart {
604
+ display: inline-block;
605
+ width: 46%;
606
  }
607
 
608
  #ga_form .form-table {
609
+ max-width: 560px;
610
  }
611
 
612
  .adBanner {
613
+ background-color: transparent;
614
+ height: 1px;
615
+ width: 1px;
616
  }
617
 
618
  #adblocker-notice {
619
+ display: none;
620
  }
googleanalytics.php CHANGED
@@ -1,55 +1,69 @@
1
  <?php
2
- /*
3
  * Plugin Name: ShareThis Dashboard for Google Analytics
4
  * Plugin URI: http://wordpress.org/extend/plugins/googleanalytics/
5
  * Description: Use Google Analytics on your WordPress site without touching any code, and view visitor reports right in your WordPress admin dashboard!
6
- * Version: 2.5.4
7
  * Author: ShareThis
8
  * Author URI: http://sharethis.com
 
 
9
  */
10
 
11
- if ( !defined( 'WP_CONTENT_URL' ) ) {
12
  define( 'WP_CONTENT_URL', get_option( 'siteurl' ) . '/wp-content' );
13
  }
14
- if ( !defined( 'WP_CONTENT_DIR' ) ) {
15
  define( 'WP_CONTENT_DIR', ABSPATH . 'wp-content' );
16
  }
17
- if ( !defined( 'WP_PLUGIN_URL' ) ) {
18
  define( 'WP_PLUGIN_URL', WP_CONTENT_URL . '/plugins' );
19
  }
20
- if ( !defined( 'WP_PLUGIN_DIR' ) ) {
21
  define( 'WP_PLUGIN_DIR', WP_CONTENT_DIR . '/plugins' );
22
  }
23
- if ( !defined( 'GA_NAME' ) ) {
24
  define( 'GA_NAME', 'googleanalytics' );
25
  }
26
- if ( !defined( 'GA_PLUGIN_DIR' ) ) {
27
  define( 'GA_PLUGIN_DIR', WP_PLUGIN_DIR . '/' . GA_NAME );
28
  }
29
- if ( !defined( 'GA_PLUGIN_URL' ) ) {
30
  define( 'GA_PLUGIN_URL', WP_PLUGIN_URL . '/' . GA_NAME );
31
  }
32
- if ( !defined( 'GA_MAIN_FILE_PATH' ) ) {
33
  define( 'GA_MAIN_FILE_PATH', __FILE__ );
34
  }
35
- if ( !defined( 'GA_SHARETHIS_SCRIPTS_INCLUDED' ) ) {
36
  define( 'GA_SHARETHIS_SCRIPTS_INCLUDED', 0 );
37
  }
38
 
39
  /**
40
  * Prevent to launch the plugin within different plugin dir name
41
  */
42
- if ( !preg_match( '/(\/|\\\)' . GA_NAME . '(\/|\\\)/', realpath( __FILE__ ), $test ) ) {
43
- echo _( 'Invalid plugin installation directory. Please verify if the plugin\'s dir name is equal to "' . GA_NAME . '".' );
 
 
 
 
 
 
 
 
44
 
45
  // To make able the message above to be displayed in the activation error notice.
46
  die();
47
  }
48
 
49
- define( 'GOOGLEANALYTICS_VERSION', '2.5.4' );
50
- include_once GA_PLUGIN_DIR . '/overwrite/ga_overwrite.php';
51
- include_once GA_PLUGIN_DIR . '/class/Ga_Autoloader.php';
52
- include_once GA_PLUGIN_DIR . '/tools/class-support-logging.php';
 
 
 
 
53
  Ga_Autoloader::register();
54
  Ga_Hook::add_hooks( GA_MAIN_FILE_PATH );
55
 
1
  <?php
2
+ /**
3
  * Plugin Name: ShareThis Dashboard for Google Analytics
4
  * Plugin URI: http://wordpress.org/extend/plugins/googleanalytics/
5
  * Description: Use Google Analytics on your WordPress site without touching any code, and view visitor reports right in your WordPress admin dashboard!
6
+ * Version: 2.5.5
7
  * Author: ShareThis
8
  * Author URI: http://sharethis.com
9
+ *
10
+ * @package GoogleAnalytics
11
  */
12
 
13
+ if ( ! defined( 'WP_CONTENT_URL' ) ) {
14
  define( 'WP_CONTENT_URL', get_option( 'siteurl' ) . '/wp-content' );
15
  }
16
+ if ( ! defined( 'WP_CONTENT_DIR' ) ) {
17
  define( 'WP_CONTENT_DIR', ABSPATH . 'wp-content' );
18
  }
19
+ if ( ! defined( 'WP_PLUGIN_URL' ) ) {
20
  define( 'WP_PLUGIN_URL', WP_CONTENT_URL . '/plugins' );
21
  }
22
+ if ( ! defined( 'WP_PLUGIN_DIR' ) ) {
23
  define( 'WP_PLUGIN_DIR', WP_CONTENT_DIR . '/plugins' );
24
  }
25
+ if ( ! defined( 'GA_NAME' ) ) {
26
  define( 'GA_NAME', 'googleanalytics' );
27
  }
28
+ if ( ! defined( 'GA_PLUGIN_DIR' ) ) {
29
  define( 'GA_PLUGIN_DIR', WP_PLUGIN_DIR . '/' . GA_NAME );
30
  }
31
+ if ( ! defined( 'GA_PLUGIN_URL' ) ) {
32
  define( 'GA_PLUGIN_URL', WP_PLUGIN_URL . '/' . GA_NAME );
33
  }
34
+ if ( ! defined( 'GA_MAIN_FILE_PATH' ) ) {
35
  define( 'GA_MAIN_FILE_PATH', __FILE__ );
36
  }
37
+ if ( ! defined( 'GA_SHARETHIS_SCRIPTS_INCLUDED' ) ) {
38
  define( 'GA_SHARETHIS_SCRIPTS_INCLUDED', 0 );
39
  }
40
 
41
  /**
42
  * Prevent to launch the plugin within different plugin dir name
43
  */
44
+ if ( false === preg_match( '/(\/|\\\)' . GA_NAME . '(\/|\\\)/', realpath( __FILE__ ), $test ) ) {
45
+ echo esc_html(
46
+ sprintf(
47
+ /* translators: %s refers to the Google Analytics directory name. */
48
+ __(
49
+ 'Invalid plugin installation directory. Please verify if the plugin\'s dir name is equal to "%s".'
50
+ ),
51
+ esc_attr( GA_NAME )
52
+ )
53
+ );
54
 
55
  // To make able the message above to be displayed in the activation error notice.
56
  die();
57
  }
58
 
59
+ const GOOGLEANALYTICS_VERSION = '2.5.5';
60
+
61
+ // Requires.
62
+ require_once GA_PLUGIN_DIR . '/overwrite/ga-overwrite.php';
63
+ require_once GA_PLUGIN_DIR . '/class/class-ga-autoloader.php';
64
+ require_once GA_PLUGIN_DIR . '/class/class-ga-autoloader.php';
65
+ require_once GA_PLUGIN_DIR . '/tools/class-ga-supportlogger.php';
66
+
67
  Ga_Autoloader::register();
68
  Ga_Hook::add_hooks( GA_MAIN_FILE_PATH );
69
 
js/googleanalytics.js CHANGED
@@ -1,28 +1,30 @@
1
  /**
2
- * Created by mdn on 2016-12-02.
 
 
3
  */
4
 
5
  (function ($) {
6
- ga_loader = {
7
- show: function () {
8
- $('.ga-loader').show();
9
- },
10
- hide: function () {
11
- $('.ga-loader').hide();
12
- }
13
- };
14
 
15
- ga_tools = {
16
- getCurrentWidth: function (wrapperSelector) {
17
- return $(wrapperSelector).width();
18
- },
19
- recomputeChartWidth: function (minWidth, offset, wrapperSelector) {
20
- const currentWidth = ga_tools.getCurrentWidth(wrapperSelector);
21
- if (currentWidth >= minWidth) {
22
- return parseInt(currentWidth - offset);
23
- } else {
24
- return minWidth;
25
- }
26
- }
27
- };
28
- })(jQuery);
1
  /**
2
+ * Google Analytics loader script.
3
+ *
4
+ * @package GoogleAnalytics
5
  */
6
 
7
  (function ($) {
8
+ ga_loader = {
9
+ show: function () {
10
+ $( '.ga-loader' ).show();
11
+ },
12
+ hide: function () {
13
+ $( '.ga-loader' ).hide();
14
+ }
15
+ };
16
 
17
+ ga_tools = {
18
+ getCurrentWidth: function (wrapperSelector) {
19
+ return $( wrapperSelector ).width();
20
+ },
21
+ recomputeChartWidth: function (minWidth, offset, wrapperSelector) {
22
+ const currentWidth = ga_tools.getCurrentWidth( wrapperSelector );
23
+ if (currentWidth >= minWidth) {
24
+ return parseInt( currentWidth - offset );
25
+ } else {
26
+ return minWidth;
27
+ }
28
+ }
29
+ };
30
+ })( jQuery );
js/googleanalytics_createprop.js CHANGED
@@ -1,35 +1,52 @@
 
 
 
 
 
 
1
  (
2
- function ( $, wp ) {
3
- $( document ).ready( function () {
4
- var theData = JSON.stringify( {
5
- onboarding_product: 'ga',
6
- domain: gasiteURL,
7
- email: gaAdminEmail,
8
- is_wordpress: true
9
- } );
 
 
 
10
 
11
- $.ajax( {
12
- url: 'https://platform-api.sharethis.com/v1.0/property',
13
- method: 'POST',
14
- async: false,
15
- contentType: 'application/json; charset=utf-8',
16
- data: theData,
17
- success: function ( result ) {
18
- setGACredentials( result.secret, result._id );
19
- }
20
- } );
21
- } );
 
 
 
22
 
23
- /**
24
- * WP Ajax call to set prop id/secret
25
- */
26
- function setGACredentials(secret, propid) {
27
- wp.ajax.post( 'set_ga_credentials', {
28
- secret: secret,
29
- propid: propid,
30
- nonce: gaNonce
31
- } ).always( function( results ) {
32
- });
33
- }
34
- }
 
 
 
 
 
35
  )( window.jQuery, window.wp );
1
+ /**
2
+ * GoogleAnalytics CreateProp JS.
3
+ *
4
+ * @package GoogleAnalytics
5
+ */
6
+
7
  (
8
+ function ( $, wp ) {
9
+ $( document ).ready(
10
+ function () {
11
+ var theData = JSON.stringify(
12
+ {
13
+ onboarding_product: 'ga',
14
+ domain: gasiteURL,
15
+ email: gaAdminEmail,
16
+ is_wordpress: true
17
+ }
18
+ );
19
 
20
+ $.ajax(
21
+ {
22
+ url: 'https://platform-api.sharethis.com/v1.0/property',
23
+ method: 'POST',
24
+ async: false,
25
+ contentType: 'application/json; charset=utf-8',
26
+ data: theData,
27
+ success: function ( result ) {
28
+ setGACredentials( result.secret, result._id );
29
+ }
30
+ }
31
+ );
32
+ }
33
+ );
34
 
35
+ /**
36
+ * WP Ajax call to set prop id/secret
37
+ */
38
+ function setGACredentials(secret, propid) {
39
+ wp.ajax.post(
40
+ 'set_ga_credentials',
41
+ {
42
+ secret: secret,
43
+ propid: propid,
44
+ nonce: gaNonce
45
+ }
46
+ ).always(
47
+ function( results ) {
48
+ }
49
+ );
50
+ }
51
+ }
52
  )( window.jQuery, window.wp );
js/googleanalytics_dashboard.js CHANGED
@@ -1,207 +1,263 @@
1
- (function ($) {
 
 
 
 
2
 
3
- const wrapperSelector = '#ga_dashboard_widget';
4
- const minWidth = 350;
5
- const offset = 10;
6
-
7
- ga_dashboard = {
8
- chartData: [],
9
- init: function (dataArr, showLoader) {
10
- if (showLoader) {
11
- ga_loader.show();
12
- }
13
- google.charts.load('current', {'packages': ['corechart']});
14
- google.charts.setOnLoadCallback(function () {
15
- if (dataArr) {
16
- ga_dashboard.drawChart(dataArr);
17
- ga_dashboard.setChartData(dataArr);
18
- }
19
- });
20
- },
21
- events: function (data) {
22
- $(document).ready(function () {
23
- $('#range-selector').on('change', function () {
24
- const selected = $(this).val();
25
- const selected_name = $('#metrics-selector option:selected').html();
26
- const selected_metric = $('#metrics-selector option:selected').val() || null;
27
-
28
- ga_loader.show();
29
-
30
- var dataObj = {};
31
- dataObj['action'] = "ga_ajax_data_change";
32
- dataObj['date_range'] = selected;
33
- dataObj['metric'] = selected_metric;
34
- dataObj[GA_NONCE_FIELD] = GA_NONCE;
35
-
36
- $.ajax({
37
- type: "post",
38
- dataType: "json",
39
- url: ajaxurl,
40
- data: dataObj,
41
- success: function (response) {
42
-
43
- ga_loader.hide();
44
-
45
- if (typeof response.error !== "undefined") {
46
- $('#ga_widget_error').show().html(response.error);
47
- } else {
48
- var dataT = [['Day', selected_name]];
49
- $.each(response.chart, function (k, v) {
50
- dataT.push([v.day, parseInt(v.current)]);
51
- });
52
-
53
- $.each(response.boxes, function (k, v) {
54
- $('#ga_box_dashboard_label_' + k).html(v.label)
55
- $('#ga_box_dashboard_value_' + k).html(v.value);
56
- });
57
-
58
- ga_dashboard.drawChart(dataT, selected_name);
59
-
60
- // Set new data
61
- ga_dashboard.setChartData(dataT);
62
- }
63
- }
64
- });
65
- });
66
-
67
- $('#metrics-selector').on('change', function () {
68
- const selected = $(this).val();
69
- const selected_name = $('#metrics-selector option:selected').html();
70
- const selected_range = $('#range-selector option:selected').val() || null;
71
-
72
- ga_loader.show();
73
-
74
- var dataObj = {};
75
- dataObj['action'] = "ga_ajax_data_change";
76
- dataObj['metric'] = selected;
77
- dataObj['date_range'] = selected_range;
78
- dataObj[GA_NONCE_FIELD] = GA_NONCE;
79
-
80
- $.ajax({
81
- type: "post",
82
- dataType: "json",
83
- url: ajaxurl,
84
- data: dataObj,
85
- success: function (response) {
86
- ga_loader.hide();
87
-
88
- if (typeof response.error !== "undefined") {
89
- $('#ga_widget_error').show().html(response.error);
90
- } else {
91
- var dataT = [['Day', selected_name]];
92
- $.each(response.chart, function (k, v) {
93
- dataT.push([v.day, parseInt(v.current)]);
94
- });
95
-
96
- ga_dashboard.drawChart(dataT, selected_name);
97
-
98
- // Set new data
99
- ga_dashboard.setChartData(dataT);
100
- }
101
- }
102
- });
103
- });
104
-
105
- $('#ga-widget-trigger').on('click', function () {
106
- const selected_name = $('#metrics-selector option:selected').html();
107
- const selected_metric = $('#metrics-selector option:selected').val() || null;
108
- const selected_range = $('#range-selector option:selected').val() || null;
109
-
110
- ga_loader.show();
111
-
112
- var dataObj = {};
113
- dataObj['action'] = "ga_ajax_data_change";
114
- dataObj['metric'] = selected_metric;
115
- dataObj['date_range'] = selected_range;
116
- dataObj[GA_NONCE_FIELD] = GA_NONCE;
117
-
118
- $.ajax({
119
- type: "post",
120
- dataType: "json",
121
- url: ajaxurl,
122
- data: dataObj,
123
- success: function (response) {
124
-
125
- ga_loader.hide();
126
-
127
- if (typeof response.error !== "undefined") {
128
- $('#ga_widget_error').show().html(response.error);
129
- } else {
130
- var dataT = [['Day', selected_name]];
131
- $.each(response.chart, function (k, v) {
132
- dataT.push([v.day, parseInt(v.current)]);
133
- });
134
-
135
- $.each(response.boxes, function (k, v) {
136
- $('#ga_box_dashboard_label_' + k).html(v.label)
137
- $('#ga_box_dashboard_value_' + k).html(v.value);
138
- });
139
-
140
- ga_dashboard.drawChart(dataT, selected_name);
141
-
142
- // Set new data
143
- ga_dashboard.setChartData(dataT);
144
- }
145
- }
146
- });
147
- });
148
-
149
- $(window).on('resize', function () {
150
- ga_dashboard.drawChart(ga_dashboard.getChartData(), ga_tools.recomputeChartWidth(minWidth, offset, wrapperSelector));
151
- });
152
- });
153
- },
154
- /**
155
- * Returns chart data array.
156
- * @returns {Array}
157
- */
158
- getChartData: function () {
159
- return ga_dashboard.chartData;
160
- },
161
- /**
162
- * Overwrites initial data array.
163
- * @param new_data
164
- */
165
- setChartData: function (new_data) {
166
- ga_dashboard.chartData = new_data;
167
- },
168
- drawChart: function (dataArr, title) {
169
- const chart_dom_element = document.getElementById('chart_div');
170
-
171
- if (typeof title == 'undefined') {
172
- title = 'Pageviews';
173
- }
174
-
175
- if (dataArr.length > 1) {
176
- const data = google.visualization.arrayToDataTable(dataArr);
177
-
178
- const options = {
179
- /*title: title,*/
180
- legend: 'top',
181
- lineWidth: 2,
182
- chartArea: {
183
- left: 10,
184
- top: 60,
185
- bottom: 50,
186
- right: 10
187
-
188
- },
189
- width: '95%',
190
- height: 300,
191
- hAxis: {title: 'Day', titleTextStyle: {color: '#333'}, direction: 1},
192
- vAxis: {minValue: 0},
193
- pointSize: 5
194
- };
195
-
196
- var chart = new google.visualization.AreaChart(chart_dom_element);
197
- google.visualization.events.addListener(chart, 'ready', function () {
198
- ga_loader.hide();
199
- });
200
- chart.draw(data, options);
201
- } else {
202
- $('#ga_widget_error').show().html('No data available for selected range.');
203
- }
204
- }
205
- };
206
-
207
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * GoogleAnalytics Dashboard JS.
3
+ *
4
+ * @package GoogleAnalytics
5
+ */
6
 
7
+ (function ($) {
8
+ const wrapperSelector = '#ga-dashboard-widget';
9
+ const minWidth = 350;
10
+ const offset = 10;
11
+
12
+ ga_dashboard = {
13
+ chartData: [],
14
+ init: function (dataArr, showLoader) {
15
+ if (showLoader) {
16
+ ga_loader.show();
17
+ }
18
+ google.charts.load( 'current', {'packages': ['corechart']} );
19
+ google.charts.setOnLoadCallback(
20
+ function () {
21
+ if (dataArr) {
22
+ ga_dashboard.drawChart( dataArr );
23
+ ga_dashboard.setChartData( dataArr );
24
+ }
25
+ }
26
+ );
27
+ },
28
+ events: function (data) {
29
+ $( document ).ready(
30
+ function () {
31
+ $( '#range-selector' ).on(
32
+ 'change',
33
+ function () {
34
+ const selected = $( this ).val();
35
+ const selected_name = $( '#metrics-selector option:selected' ).html();
36
+ const selected_metric = $( '#metrics-selector option:selected' ).val() || null;
37
+
38
+ ga_loader.show();
39
+
40
+ var dataObj = {};
41
+ dataObj['action'] = "ga_ajax_data_change";
42
+ dataObj['date_range'] = selected;
43
+ dataObj['metric'] = selected_metric;
44
+ dataObj[GA_NONCE_FIELD] = GA_NONCE;
45
+
46
+ $.ajax(
47
+ {
48
+ type: "post",
49
+ dataType: "json",
50
+ url: ajaxurl,
51
+ data: dataObj,
52
+ success: function (response) {
53
+
54
+ ga_loader.hide();
55
+
56
+ if (typeof response.error !== "undefined") {
57
+ $( '#ga_widget_error' )
58
+ .removeClass( 'hidden' )
59
+ .html( `GA Dashboard: ${response.error}` );
60
+ } else {
61
+ var dataT = [['Day', selected_name]];
62
+ $.each(
63
+ response.chart,
64
+ function (k, v) {
65
+ dataT.push( [v.day, parseInt( v.current )] );
66
+ }
67
+ );
68
+
69
+ $.each(
70
+ response.boxes,
71
+ function (k, v) {
72
+ $( '#ga_box_dashboard_label_' + k ).html( v.label )
73
+ $( '#ga_box_dashboard_value_' + k ).html( v.value );
74
+ }
75
+ );
76
+
77
+ ga_dashboard.drawChart( dataT, selected_name );
78
+
79
+ // Set new data.
80
+ ga_dashboard.setChartData( dataT );
81
+ }
82
+ }
83
+ }
84
+ );
85
+ }
86
+ );
87
+
88
+ $( '#metrics-selector' ).on(
89
+ 'change',
90
+ function () {
91
+ const selected = $( this ).val();
92
+ const selected_name = $( '#metrics-selector option:selected' ).html();
93
+ const selected_range = $( '#range-selector option:selected' ).val() || null;
94
+
95
+ ga_loader.show();
96
+
97
+ var dataObj = {};
98
+ dataObj['action'] = "ga_ajax_data_change";
99
+ dataObj['metric'] = selected;
100
+ dataObj['date_range'] = selected_range;
101
+ dataObj[GA_NONCE_FIELD] = GA_NONCE;
102
+
103
+ $.ajax(
104
+ {
105
+ type: "post",
106
+ dataType: "json",
107
+ url: ajaxurl,
108
+ data: dataObj,
109
+ success: function (response) {
110
+ ga_loader.hide();
111
+
112
+ if (typeof response.error !== "undefined") {
113
+ $( '#ga_widget_error' )
114
+ .removeClass( 'hidden' )
115
+ .html( `GA Dashboard: ${response.error}` );
116
+ } else {
117
+ var dataT = [['Day', selected_name]];
118
+ $.each(
119
+ response.chart,
120
+ function (k, v) {
121
+ dataT.push( [v.day, parseInt( v.current )] );
122
+ }
123
+ );
124
+
125
+ ga_dashboard.drawChart( dataT, selected_name );
126
+
127
+ // Set new data.
128
+ ga_dashboard.setChartData( dataT );
129
+ }
130
+ }
131
+ }
132
+ );
133
+ }
134
+ );
135
+
136
+ $( '#ga-widget-trigger' ).on(
137
+ 'click',
138
+ function () {
139
+ const selected_name = $( '#metrics-selector option:selected' ).html();
140
+ const selected_metric = $( '#metrics-selector option:selected' ).val() || null;
141
+ const selected_range = $( '#range-selector option:selected' ).val() || null;
142
+
143
+ ga_loader.show();
144
+
145
+ var dataObj = {};
146
+ dataObj['action'] = "ga_ajax_data_change";
147
+ dataObj['metric'] = selected_metric;
148
+ dataObj['date_range'] = selected_range;
149
+ dataObj[GA_NONCE_FIELD] = GA_NONCE;
150
+
151
+ $.ajax(
152
+ {
153
+ type: "post",
154
+ dataType: "json",
155
+ url: ajaxurl,
156
+ data: dataObj,
157
+ success: function (response) {
158
+
159
+ ga_loader.hide();
160
+
161
+ if (typeof response.error !== "undefined") {
162
+ $( '#ga_widget_error' )
163
+ .removeClass( 'hidden' )
164
+ .html( `GA Dashboard: ${response.error}` );
165
+ } else {
166
+ var dataT = [['Day', selected_name]];
167
+ $.each(
168
+ response.chart,
169
+ function (k, v) {
170
+ dataT.push( [v.day, parseInt( v.current )] );
171
+ }
172
+ );
173
+
174
+ $.each(
175
+ response.boxes,
176
+ function (k, v) {
177
+ $( '#ga_box_dashboard_label_' + k ).html( v.label )
178
+ $( '#ga_box_dashboard_value_' + k ).html( v.value );
179
+ }
180
+ );
181
+
182
+ ga_dashboard.drawChart( dataT, selected_name );
183
+
184
+ // Set new data.
185
+ ga_dashboard.setChartData( dataT );
186
+ }
187
+ }
188
+ }
189
+ );
190
+ }
191
+ );
192
+
193
+ $( window ).on(
194
+ 'resize',
195
+ function () {
196
+ ga_dashboard.drawChart( ga_dashboard.getChartData(), ga_tools.recomputeChartWidth( minWidth, offset, wrapperSelector ) );
197
+ }
198
+ );
199
+ }
200
+ );
201
+ },
202
+ /**
203
+ * Returns chart data array.
204
+ *
205
+ * @returns {Array}
206
+ */
207
+ getChartData: function () {
208
+ return ga_dashboard.chartData;
209
+ },
210
+ /**
211
+ * Overwrites initial data array.
212
+ *
213
+ * @param new_data
214
+ */
215
+ setChartData: function (new_data) {
216
+ ga_dashboard.chartData = new_data;
217
+ },
218
+ drawChart: function (dataArr, title) {
219
+ const chart_dom_element = document.getElementById( 'chart_div' );
220
+
221
+ if (typeof title == 'undefined') {
222
+ title = 'Pageviews';
223
+ }
224
+
225
+ if (dataArr.length > 1) {
226
+ const data = google.visualization.arrayToDataTable( dataArr );
227
+
228
+ const options = {
229
+ /*title: title,*/
230
+ legend: 'top',
231
+ lineWidth: 2,
232
+ chartArea: {
233
+ left: 10,
234
+ top: 60,
235
+ bottom: 50,
236
+ right: 10
237
+
238
+ },
239
+ width: '95%',
240
+ height: 300,
241
+ hAxis: {title: 'Day', titleTextStyle: {color: '#333'}, direction: 1},
242
+ vAxis: {minValue: 0},
243
+ pointSize: 5
244
+ };
245
+
246
+ var chart = new google.visualization.AreaChart( chart_dom_element );
247
+ google.visualization.events.addListener(
248
+ chart,
249
+ 'ready',
250
+ function () {
251
+ ga_loader.hide();
252
+ }
253
+ );
254
+ chart.draw( data, options );
255
+ } else {
256
+ $( '#ga_widget_error' )
257
+ .removeClass( 'hidden' )
258
+ .html( 'GA Dashboard: No data available for selected range.' );
259
+ }
260
+ }
261
+ };
262
+
263
+ })( jQuery );
js/googleanalytics_page.js CHANGED
@@ -1,679 +1,854 @@
1
- const GA_ACCESS_CODE_MODAL_ID = "ga_access_code_modal";
2
- const GA_DEBUG_MODAL_ID = "ga_debug_modal";
3
- const GA_DEBUG_MODAL_CONTENT_ID = "ga_debug_modal_content";
4
- const GA_DEBUG_EMAIL = "ga_debug_email";
5
- const GA_DEBUG_DESCRIPTION = "ga_debug_description";
6
- const GA_ACCESS_CODE_TMP_ID = "ga_access_code_tmp";
7
- const GA_ACCESS_CODE_ID = "ga_access_code";
8
- const GA_FORM_ID = "ga_form";
9
- const GA_MODAL_CLOSE_ID = 'ga_close';
10
- const GA_MODAL_BTN_CLOSE_ID = 'ga_btn_close';
11
- const GA_GOOGLE_AUTH_BTN_ID = 'ga_authorize_with_google_button';
12
- const GA_SAVE_ACCESS_CODE_BTN_ID = 'ga_save_access_code';
 
 
 
 
 
 
13
  const GA_AUTHENTICATION_CODE_ERROR = 'That looks like your Google Analytics Tracking ID. Please enter the authentication token in this space. See here for <a href="https://cl.ly/1y1N1A3h0s1t" target="_blank">a walkthrough</a> of how to do it.';
14
 
15
- (function ($) {
16
- ga_popup = {
17
- url: '',
18
- authorize: function (e, url) {
19
- e.preventDefault();
20
- ga_popup.url = url;
21
- $('#' + GA_ACCESS_CODE_MODAL_ID).appendTo("body").show();
22
- ga_popup.open();
23
- },
24
- open: function () {
25
- const p_width = Math.round(screen.width / 2);
26
- const p_height = Math.round(screen.height / 2);
27
- const p_left = Math.round(p_width / 2);
28
- const p_top = 300;
29
- window.open(ga_popup.url, 'ga_auth_popup', 'width=' + p_width + ',height='
30
- + p_height + ',top=' + p_top + ',left=' + p_left);
31
- },
32
- saveAccessCode: function (e) {
33
- e.preventDefault();
34
- e.target.disabled = 'disabled';
35
- ga_loader.show();
36
- const ac_tmp = $('#' + GA_ACCESS_CODE_TMP_ID).val();
37
- if (ga_popup.validateCode(e, ac_tmp)) {
38
- $('#' + GA_ACCESS_CODE_ID).val(ac_tmp);
39
- $('#' + GA_FORM_ID).submit();
40
- }
41
- },
42
- validateCode: function (e, code) {
43
- if (!code){
44
- ga_loader.hide();
45
- $('#' + GA_SAVE_ACCESS_CODE_BTN_ID).removeAttr('disabled');
46
- return false;
47
- }
48
- else if (code.substring(0, 2) == 'UA'){
49
- $('#ga_code_error').show().html(GA_AUTHENTICATION_CODE_ERROR);
50
- ga_loader.hide();
51
- $('#' + GA_SAVE_ACCESS_CODE_BTN_ID).removeAttr('disabled');
52
- return false;
53
- }
54
- return true;
55
- }
56
- };
57
-
58
- ga_modal = {
59
- hide: function () {
60
- $('#' + GA_ACCESS_CODE_MODAL_ID).hide();
61
- $('#' + GA_DEBUG_MODAL_ID).hide();
62
- ga_loader.hide();
63
- $('#' + GA_SAVE_ACCESS_CODE_BTN_ID).removeAttr('disabled');
64
- }
65
- };
66
-
67
- ga_events = {
68
-
69
- /**
70
- * Send Demographic data.
71
- *
72
- * @param data
73
- */
74
- sendDemoData: function(demoData) {
75
-
76
- // Send demographic data.
77
- $.ajax( {
78
- url: 'https://platform-api.sharethis.com/v1.0/property?id=' + ga_property_id + '&secret=' + ga_secret_id,
79
- method: 'PUT',
80
- async: false,
81
- contentType: 'application/json; charset=utf-8',
82
- data: JSON.stringify( {
83
- "demographics": demoData
84
- } ),
85
- success: function( results ) {
86
- }
87
- } );
88
- },
89
- /**
90
- * Returns gdpr onboarding config values.
91
- */
92
- setGDPRConfig: function(isGDPR) {
93
-
94
- /**
95
- * Check if ad blocker exists and notify if so.
96
- */
97
- $(document).ready(function(){
98
- if($("#detectadblock").height() > 0) {
99
- } else {
100
- $('#adblocker-notice').show();
101
- }
102
- });
103
-
104
- if (!isGDPR || undefined === gaGdprConfig) {
105
- return;
106
- }
107
-
108
- var config = JSON.parse(gaGdprConfig);
109
-
110
- $('.gdpr-platform input[name="gdpr-enable"]').prop('checked', config['enabled'] === 'true');
111
- $('#sharethis-publisher-name').val(config['publisher_name']);
112
- $(`#sharethis-user-type option[value="${config['display']}"]` ).attr('selected',true);
113
- $(`#sharethis-consent-type option[value="${config['scope']}"]`).attr('selected', true);
114
- $(`#sharethis-form-color .color[data-value="${config['color']}"]`).addClass('selected');
115
- $(`#st-language option[value="${config['language']}"]`).attr('selected', true);
116
-
117
- if (undefined !== config['publisher_purposes']) {
118
- $( "#publisher-purpose .purpose-item input" ).prop('checked', false);
119
-
120
- config['publisher_purposes'].map( ( purpVal ) => {
121
- var legit = 'true' === purpVal['legitimate_interest'] || true === purpVal['legitimate_interest'];
122
- var consent = 'false' === purpVal['legitimate_interest'] || false === purpVal['legitimate_interest'];
123
-
124
- $( `#publisher-purpose .purpose-item input[name="purposes[${purpVal.id}]"][value="legitimate"]` ).prop( 'checked', legit );
125
- $( `#publisher-purpose .purpose-item input[name="purposes[${purpVal.id}]"][value="consent"]` ).prop( 'checked', consent );
126
- } );
127
- }
128
-
129
- if (undefined !== config['publisher_restrictions']) {
130
- $( ".vendor-table-cell-wrapper input" ).prop('checked', false);
131
-
132
- $.map(config['publisher_restrictions'], function (id, venVal ) {
133
- if(id) {
134
- $( `input[type="checkbox"][data-id="${venVal}"]` ).prop( 'checked', true );
135
- }
136
- } );
137
- }
138
- },
139
- scrollToAnchor: function(aid) {
140
- var aTag = $("a[name='"+ aid.toLowerCase() +"']");
141
-
142
- $('.vendor-table-body').animate({
143
- scrollTop: 0
144
- }, 0).animate({
145
- scrollTop: aTag.offset().top - 740
146
- }, 0);
147
- },
148
-
149
- click: function (selector, callback) {
150
- $(selector).live('click', callback);
151
- },
152
- codeManuallyCallback: function (features_enabled) {
153
- var checkbox = $('#ga_enter_code_manually');
154
- if ( features_enabled ) {
155
- if ( checkbox.is(':checked') ) {
156
- if (confirm('Warning: If you enter your Tracking ID manually, Analytics statistics will not be shown.')) {
157
- setTimeout(function () {
158
- $('#ga_authorize_with_google_button').attr('disabled','disabled').next().show();
159
- $('#ga_account_selector').attr('disabled', 'disabled');
160
- $('#ga_manually_wrapper').show();
161
- }, 350);
162
-
163
- } else {
164
- setTimeout(function () {
165
- checkbox.removeProp('checked');
166
- }, 350);
167
- }
168
- } else { // disable
169
- setTimeout(function () {
170
- $('#ga_authorize_with_google_button').removeAttr('disabled').next().hide();
171
- $('#ga_account_selector').removeAttr('disabled');
172
- $('#ga_manually_wrapper').hide();
173
- }, 350);
174
- }
175
- }
176
- },
177
- initModalEvents: function () {
178
- $('body').on('click', '#close-review-us', function() {
179
- var dataObj = {},
180
- self = this;
181
- dataObj['action'] = "ga_ajax_hide_review";
182
- dataObj[GA_NONCE_FIELD] = GA_NONCE;
183
-
184
- $.ajax({
185
- type: "post",
186
- dataType: "json",
187
- url: ajaxurl,
188
- data: dataObj,
189
- success: function (response) {
190
- $('.ga-review-us').fadeOut();
191
- }
192
- });
193
- });
194
-
195
- $('#' + GA_GOOGLE_AUTH_BTN_ID).on('click', function () {
196
- $('#' + GA_ACCESS_CODE_TMP_ID).focus();
197
- });
198
-
199
- $('#' + GA_MODAL_CLOSE_ID + ', #' + GA_MODAL_BTN_CLOSE_ID + ', #' + GA_DEBUG_MODAL_ID ).on('click', function () {
200
- ga_modal.hide();
201
- });
202
-
203
- $( '#copy-debug' ).on( 'click', function() {
204
- var copiedText = $( '#ga_debug_info' );
205
-
206
- copiedText.select();
207
- document.execCommand( 'copy' );
208
- } );
209
-
210
- $('#' + GA_DEBUG_MODAL_CONTENT_ID ).click(function(event){
211
- event.stopPropagation();
212
- });
213
- },
214
-
215
- getConfig: function () {
216
- var config,
217
- enabled = $('input[name="gdpr-enable"]').is(':checked'),
218
- publisherPurposes = [],
219
- display = $( '#sharethis-user-type option:selected' ).val(),
220
- name = $( '#sharethis-publisher-name' ).val(),
221
- scope = 'publisher',
222
- color = $( '#sharethis-form-color .color.selected' ).attr('data-value'),
223
- publisherRestrictions = {},
224
- language = $( '#st-language' ).val();
225
-
226
- $('#publisher-purpose input:checked').each( function( index, value ) {
227
- var theId = $(value).attr('data-id'),
228
- legit = 'consent' !== $(value).val();
229
-
230
- publisherPurposes.push({ 'id': theId, 'legitimate_interest' : legit });
231
- });
232
-
233
- $('.vendor-table-cell-wrapper label input:checked').each( function( index, value ) {
234
- var vendorId = $(value).attr('data-id');
235
- if (vendorId) {
236
- publisherRestrictions[vendorId] = true;
237
- }
238
- });
239
-
240
- config = {
241
- enabled: enabled,
242
- display: display,
243
- publisher_name: name,
244
- publisher_purposes: publisherPurposes,
245
- publisher_restrictions: publisherRestrictions,
246
- language: language,
247
- color: color,
248
- scope: scope,
249
- };
250
-
251
- return config;
252
- },
253
-
254
- enableGdpr: function () {
255
- var timer = '';
256
- this.$gdprContainer = $('.gdpr-platform');
257
-
258
- // New color select.
259
- this.$gdprContainer.on('click', "#sharethis-form-color .color", function() {
260
- $('#sharethis-form-color .color').removeClass('selected');
261
- $(this).addClass('selected');
262
- });
263
-
264
- // clear or show choices.
265
- this.$gdprContainer.on('click', '#clear-choices', function(e) {
266
- e.preventDefault();
267
- e.stopPropagation();
268
-
269
- $( '.purpose-item input' ).prop( 'checked', false );
270
- });
271
-
272
- // clear or show choices.
273
- this.$gdprContainer.on('click', '#see-st-choices', function(e) {
274
- e.preventDefault();
275
- e.stopPropagation();
276
- $('.purpose-item input[name="purposes[1]"]').prop('checked', true);
277
- $('.purpose-item input[name="purposes[3]"][value="consent"]').prop('checked', true);
278
- $('.purpose-item input[name="purposes[5]"][value="consent"]').prop('checked', true);
279
- $('.purpose-item input[name="purposes[6]"][value="consent"]').prop('checked', true);
280
- $('.purpose-item input[name="purposes[9]"][value="legitimate"]').prop('checked', true);
281
- $('.purpose-item input[name="purposes[10]"][value="legitimate"]').prop('checked', true);
282
- });
283
-
284
- // Uncheck radio if click on selected box.
285
- this.$gdprContainer.on( 'click', '.lever', (e) => {
286
- e.preventDefault();
287
- e.stopPropagation();
288
-
289
- const theInput = $( e.currentTarget ).siblings( 'input' );
290
-
291
- if ( theInput.is( ':checked' ) ) {
292
- $( `input[name="${theInput.attr( 'name' )}"]` ).prop( 'checked', false )
293
- } else {
294
- theInput.prop( 'checked', true )
295
- }
296
- } );
297
-
298
- // Toggle button menus when arrows are clicked.
299
- $( 'body' ).on( 'click', '.accor-wrap .accor-tab', function() {
300
- var type = $( this ).find( 'span.accor-arrow' );
301
-
302
- var closestButton = $( type ).parent( '.accor-tab' ).parent( '.accor-wrap' );
303
-
304
- if ( '' === type.html() ) {
305
-
306
- // Show the button configs.
307
- closestButton.find( '.accor-content' ).slideDown();
308
-
309
- // Change the icon next to title.
310
- closestButton.find( '.accor-arrow' ).html( '&#9660;' );
311
- } else {
312
-
313
- // Show the button configs.
314
- closestButton.find( '.accor-content' ).slideUp();
315
-
316
- // Change the icon next to title.
317
- closestButton.find( '.accor-arrow' ).html( '&#9658;' );
318
- }
319
- } );
320
-
321
- $('body').on('click', '.demo-enable-popup .close-demo-modal', function(e) {
322
- e.preventDefault();
323
- e.stopPropagation();
324
- $('.demo-enable-popup').removeClass('engage');
325
- });
326
-
327
- $('body').on('click', '#demographic-popup', function(e) {
328
- e.preventDefault();
329
- e.stopPropagation();
330
- $('.demo-enable-popup').addClass('engage');
331
- });
332
-
333
- $('body').on('click', '#enable-demographic, #Enable-demographic', function(e) {
334
- e.preventDefault();
335
- e.stopPropagation();
336
- ga_events.enableDemographic('enable');
337
- });
338
-
339
-
340
- $('body').on('click', '#Disable-demographic', function(e) {
341
- e.preventDefault();
342
- e.stopPropagation();
343
- ga_events.enableDemographic('disable');
344
- });
345
-
346
- // Enable GDPR tool.
347
- $('body').on('click', '.gdpr-submit', function(e) {
348
- e.preventDefault();
349
- e.stopPropagation();
350
-
351
- var dataObj = {},
352
- self = this,
353
- config = ga_events.getConfig();
354
-
355
- theData = JSON.stringify( {
356
- 'secret': ga_secret_id,
357
- 'id': ga_property_id,
358
- 'product': 'gdpr-compliance-tool-v2',
359
- 'config': config
360
- } );
361
-
362
- // Send new button status value.
363
- $.ajax( {
364
- url: 'https://platform-api.sharethis.com/v1.0/property/product',
365
- method: 'POST',
366
- async: false,
367
- contentType: 'application/json; charset=utf-8',
368
- data: theData,
369
- success: function( results ) {
370
- }
371
- } );
372
-
373
- dataObj['action'] = "ga_ajax_enable_gdpr";
374
- dataObj['nonce'] = 'true';
375
- dataObj['config'] = config;
376
-
377
- $.ajax({
378
- type: "post",
379
- dataType: "json",
380
- url: ajaxurl,
381
- data: dataObj,
382
- success: function (response) {
383
- window.location.reload();
384
- }
385
- });
386
- });
387
-
388
-
389
- // Enable GDPR tool.
390
- $('body').on('click', '.gdpr-enable', function(e) {
391
- e.preventDefault();
392
- e.stopPropagation();
393
-
394
- var dataObj = {},
395
- self = this,
396
- config = ga_events.getConfig();
397
-
398
- if ($('body').hasClass('google-analytics_page_googleanalytics-settings')) {
399
- config = {
400
- enabled: true,
401
- display: 'eu',
402
- publisher_name: '',
403
- publisher_purposes: [],
404
- language: 'en',
405
- color: '',
406
- scope: 'global',
407
- };
408
- }
409
-
410
- theData = JSON.stringify( {
411
- 'secret': ga_secret_id,
412
- 'id': ga_property_id,
413
- 'product': 'gdpr-compliance-tool-v2',
414
- 'config': config
415
- } );
416
-
417
- // Send new button status value.
418
- $.ajax( {
419
- url: 'https://platform-api.sharethis.com/v1.0/property/product',
420
- method: 'POST',
421
- async: false,
422
- contentType: 'application/json; charset=utf-8',
423
- data: theData,
424
- success: function( results ) {
425
- }
426
- } );
427
-
428
- dataObj['action'] = "ga_ajax_enable_gdpr";
429
- dataObj['nonce'] = 'true';
430
- dataObj['config'] = config;
431
-
432
- $.ajax({
433
- type: "post",
434
- dataType: "json",
435
- url: ajaxurl,
436
- data: dataObj,
437
- success: function (response) {
438
- window.location.href = siteAdminUrl + 'admin.php?page=googleanalytics%2Fgdpr';
439
- }
440
- });
441
- });
442
-
443
- // Scroll to anchor in vendor list.
444
- // Send user input to category search AFTER they stop typing.
445
- $('body').on( 'keyup', '.vendor-search input', function( e ) {
446
- clearTimeout( timer );
447
-
448
- timer = setTimeout( function() {
449
- ga_events.scrollToAnchor($(this).val());
450
- }.bind( this, ga_events ), 500 );
451
- } );
452
- },
453
-
454
- enableDemographic: function(disable) {
455
- var dataObj = {};
456
-
457
- dataObj['action'] = "ga_ajax_enable_demographic";
458
- dataObj['nonce'] = ga_demo_nonce;
459
- dataObj['enabled'] = 'disable' === disable ? 'false' : 'true';
460
-
461
- $.ajax({
462
- type: "post",
463
- dataType: "json",
464
- url: ajaxurl,
465
- data: dataObj,
466
- success: function (response) {
467
- window.location.href = siteAdminUrl + 'admin.php?page=googleanalytics&ga_action=demo-ad';
468
- }
469
- });
470
- }
471
- };
472
-
473
- /**
474
- * Handles "disable all features" switch button
475
- * @type {{init: ga_switcher.init}}
476
- */
477
- ga_switcher = {
478
- init: function (state) {
479
- var checkbox = $("#ga-disable");
480
-
481
- if (state) {
482
- checkbox.prop('checked', 'checked');
483
- } else {
484
- checkbox.removeProp('checked');
485
- }
486
-
487
- $(".ga-slider-disable").on("click", function (e) {
488
- var manually_enter_not_checked = $('#ga_enter_code_manually').not(':checked');
489
- if (checkbox.not(':checked').length > 0) {
490
- if (confirm('This will disable Dashboards and Google API')) {
491
- setTimeout(function () {
492
- window.location.href = GA_DISABLE_FEATURE_URL;
493
- }, 350);
494
- } else {
495
- setTimeout(function () {
496
- checkbox.removeProp('checked');
497
- }, 350);
498
- }
499
- } else { // disable
500
- setTimeout(function () {
501
- window.location.href = GA_ENABLE_FEATURE_URL;
502
- }, 350);
503
- }
504
- });
505
- }
506
- };
507
-
508
- $(document).ready(function () {
509
- const scrollData = $( '#ga-stats-container' ).attr( 'data-scroll' );
510
- const scrollEl = '' !== scrollData ? $('.' + scrollData) : '';
511
- const theBody = $('body');
512
-
513
- ga_events.initModalEvents();
514
- ga_events.enableGdpr();
515
- ga_events.setGDPRConfig(theBody.hasClass('google-analytics_page_googleanalytics-gdpr'));
516
-
517
- if ( '' !== scrollData && theBody.hasClass( 'toplevel_page_googleanalytics' ) ) {
518
- $([document.documentElement, document.body]).animate({
519
- scrollTop: scrollEl.offset().top + 450
520
- }, 500);
521
- }
522
- });
523
-
524
- const offset = 50;
525
- const minWidth = 350;
526
- const wrapperSelector = '#ga-stats-container';
527
- const chartContainer = 'chart_div';
528
- const demoChartDeviceContainer = 'demo_chart_device_div';
529
- const demoChartGenderContainer = 'demo_chart_gender_div';
530
- const demoChartAgeContainer = 'demo_chart_age_div';
531
-
532
- ga_charts = {
533
-
534
- init: function (callback) {
535
- $(document).ready(function () {
536
- google.charts.load('current', {
537
- 'packages': ['corechart']
538
- });
539
- ga_loader.show();
540
- google.charts.setOnLoadCallback(callback);
541
- });
542
- },
543
- createTooltip: function (day, pageviews) {
544
- return '<div style="padding:10px;width:100px;">' + '<strong>' + day
545
- + '</strong><br>' + 'Pageviews:<strong> ' + pageviews
546
- + '</strong>' + '</div>';
547
- },
548
- events: function (data) {
549
- $(window).on('resize', function () {
550
- ga_charts.drawChart(data, ga_tools.recomputeChartWidth(minWidth, offset, wrapperSelector));
551
- });
552
- },
553
- drawChart: function (data, chartWidth) {
554
-
555
- if (typeof chartWidth == 'undefined') {
556
- chartWidth = ga_tools.recomputeChartWidth(minWidth, offset, wrapperSelector);
557
- }
558
-
559
- const options = {
560
- /*title : 'Page Views',*/
561
- lineWidth: 5,
562
- pointSize: 10,
563
- tooltip: {
564
- isHtml: true
565
- },
566
- legend: {
567
- position: (ga_tools.getCurrentWidth(wrapperSelector) <= minWidth ? 'top'
568
- : 'top'),
569
- maxLines: 5,
570
- alignment: 'start',
571
- textStyle: {color: '#000', fontSize: 12}
572
- },
573
- colors: ['#4285f4'],
574
- hAxis: {
575
- title: 'Day',
576
- titleTextStyle: {
577
- color: '#333'
578
- }
579
- },
580
- vAxis: {
581
- minValue: 0
582
- },
583
- width: chartWidth,
584
- height: 500,
585
- chartArea: {
586
- top: 50,
587
- left: 50,
588
- right: 30,
589
- bottom: 100
590
- },
591
- };
592
- var chart = new google.visualization.AreaChart(document
593
- .getElementById(chartContainer));
594
- chart.draw(data, options);
595
- },
596
- drawDemoGenderChart: function (data, chartWidth) {
597
- if (typeof chartWidth == 'undefined') {
598
- chartWidth = ga_tools.recomputeChartWidth(minWidth, offset, wrapperSelector);
599
- }
600
-
601
- data = google.visualization.arrayToDataTable(data);
602
-
603
- var chart = new google.visualization.PieChart(document.getElementById(demoChartGenderContainer));
604
- var options = {
605
- title: 'Gender'
606
- };
607
-
608
- chart.draw(data, options);
609
- },
610
- drawDemoDeviceChart: function (data, chartWidth) {
611
- if (typeof chartWidth == 'undefined') {
612
- chartWidth = ga_tools.recomputeChartWidth(minWidth, offset, wrapperSelector);
613
- }
614
-
615
- data = google.visualization.arrayToDataTable(data);
616
-
617
- var chart = new google.visualization.PieChart(document.getElementById(demoChartDeviceContainer));
618
- var options = {
619
- title: 'Device Breakdown'
620
- };
621
-
622
- chart.draw(data, options);
623
- },
624
-
625
- drawDemoAgeChart: function (data, chartWidth) {
626
- if (typeof chartWidth == 'undefined') {
627
- chartWidth = ga_tools.recomputeChartWidth(minWidth, offset, wrapperSelector);
628
- }
629
-
630
- data = google.visualization.arrayToDataTable(data);
631
-
632
- var options = {
633
- title: 'Age',
634
- chartArea: {width: '50%'},
635
- hAxis: {
636
- minValue: 0
637
- },
638
- };
639
-
640
- var chart = new google.visualization.BarChart(document.getElementById(demoChartAgeContainer));
641
-
642
- chart.draw(data, options);
643
- }
644
- };
645
- ga_debug = {
646
- url: '',
647
- open_modal: function (e) {
648
- e.preventDefault();
649
- $('#' + GA_DEBUG_MODAL_ID).appendTo("body").show();
650
- $('#ga-send-debug-email').removeAttr('disabled');
651
- $('#ga_debug_error').hide();
652
- $('#ga_debug_success').hide();
653
- },
654
- send_email: function (e) {
655
- e.preventDefault();
656
- ga_loader.show();
657
- var dataObj = {};
658
- dataObj['action'] = "googleanalytics_send_debug_email";
659
- dataObj['email'] = $('#' + GA_DEBUG_EMAIL).val();
660
- dataObj['description'] = $('#' + GA_DEBUG_DESCRIPTION).val();
661
- $.ajax({
662
- type: "post",
663
- dataType: "json",
664
- url: ajaxurl,
665
- data: dataObj,
666
- success: function (response) {
667
- ga_loader.hide();
668
- if (typeof response.error !== "undefined") {
669
- $('#ga_debug_error').show().html(response.error);
670
- } else if (typeof response.success !== "undefined"){
671
- $('#ga_debug_error').hide();
672
- $('#ga-send-debug-email').attr('disabled','disabled');
673
- $('#ga_debug_success').show().html(response.success);
674
- }
675
- }
676
- });
677
- }
678
- };
679
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Google Analytics Page script.
3
+ *
4
+ * @package GoogleAnalytics
5
+ */
6
+
7
+ const GA_ACCESS_CODE_MODAL_ID = "ga_access_code_modal";
8
+ const GA_DEBUG_MODAL_ID = "ga_debug_modal";
9
+ const GA_DEBUG_MODAL_CONTENT_ID = "ga_debug_modal_content";
10
+ const GA_DEBUG_EMAIL = "ga_debug_email";
11
+ const GA_DEBUG_DESCRIPTION = "ga_debug_description";
12
+ const GA_ACCESS_CODE_TMP_ID = "ga_access_code_tmp";
13
+ const GA_ACCESS_CODE_ID = "ga_access_code";
14
+ const GA_FORM_ID = "ga_form";
15
+ const GA_MODAL_CLOSE_ID = 'ga_close';
16
+ const GA_MODAL_BTN_CLOSE_ID = 'ga_btn_close';
17
+ const GA_GOOGLE_AUTH_BTN_ID = 'ga_authorize_with_google_button';
18
+ const GA_SAVE_ACCESS_CODE_BTN_ID = 'ga_save_access_code';
19
  const GA_AUTHENTICATION_CODE_ERROR = 'That looks like your Google Analytics Tracking ID. Please enter the authentication token in this space. See here for <a href="https://cl.ly/1y1N1A3h0s1t" target="_blank">a walkthrough</a> of how to do it.';
20
 
21
+ ( function( $ ) {
22
+ ga_popup = {
23
+ url: '',
24
+ authorize: function( e, url ) {
25
+ e.preventDefault();
26
+ ga_popup.url = url;
27
+ $( '#' + GA_ACCESS_CODE_MODAL_ID ).appendTo( "body" ).show();
28
+ ga_popup.open();
29
+ },
30
+ open: function() {
31
+ const p_width = Math.round( screen.width / 2 );
32
+ const p_height = Math.round( screen.height / 2 );
33
+ const p_left = Math.round( p_width / 2 );
34
+ const p_top = 300;
35
+ window.open(
36
+ ga_popup.url,
37
+ 'ga_auth_popup',
38
+ 'width=' + p_width + ',height='
39
+ + p_height + ',top=' + p_top + ',left=' + p_left,
40
+ );
41
+ },
42
+ saveAccessCode: function( e ) {
43
+ e.preventDefault();
44
+ e.target.disabled = 'disabled';
45
+ ga_loader.show();
46
+ const ac_tmp = $( '#' + GA_ACCESS_CODE_TMP_ID ).val();
47
+ if ( ga_popup.validateCode( e, ac_tmp ) ) {
48
+ $( '#' + GA_ACCESS_CODE_ID ).val( ac_tmp );
49
+ $( '#' + GA_FORM_ID ).submit();
50
+ }
51
+ },
52
+ validateCode: function( e, code ) {
53
+ if ( ! code ) {
54
+ ga_loader.hide();
55
+ $( '#' + GA_SAVE_ACCESS_CODE_BTN_ID ).removeAttr( 'disabled' );
56
+ return false;
57
+ } else if ( code.substring( 0, 2 ) == 'UA' ) {
58
+ $( '#ga_code_error' ).show().html( GA_AUTHENTICATION_CODE_ERROR );
59
+ ga_loader.hide();
60
+ $( '#' + GA_SAVE_ACCESS_CODE_BTN_ID ).removeAttr( 'disabled' );
61
+ return false;
62
+ }
63
+ return true;
64
+ },
65
+ };
66
+
67
+ ga_modal = {
68
+ hide: function() {
69
+ $( '#' + GA_ACCESS_CODE_MODAL_ID ).hide();
70
+ $( '#' + GA_DEBUG_MODAL_ID ).hide();
71
+ ga_loader.hide();
72
+ $( '#' + GA_SAVE_ACCESS_CODE_BTN_ID ).removeAttr( 'disabled' );
73
+ },
74
+ };
75
+
76
+ ga_events = {
77
+
78
+ /**
79
+ * Send Demographic data.
80
+ *
81
+ * @param data
82
+ */
83
+ sendDemoData: function( demoData ) {
84
+ // Send demographic data.
85
+ $.ajax(
86
+ {
87
+ url: 'https://platform-api.sharethis.com/v1.0/property?id=' + ga_property_id + '&secret=' + ga_secret_id,
88
+ method: 'PUT',
89
+ async: false,
90
+ contentType: 'application/json; charset=utf-8',
91
+ data: JSON.stringify(
92
+ {
93
+ "demographics": demoData,
94
+ },
95
+ ),
96
+ },
97
+ );
98
+ },
99
+ /**
100
+ * Returns gdpr onboarding config values.
101
+ */
102
+ setGDPRConfig: function( isGDPR ) {
103
+
104
+ /**
105
+ * Check if ad blocker exists and notify if so.
106
+ */
107
+ $( document ).ready(
108
+ function() {
109
+ if ( $( "#detectadblock" ).height() > 0 ) {
110
+ } else {
111
+ $( '#adblocker-notice' ).show();
112
+ }
113
+ },
114
+ );
115
+
116
+ if ( ! isGDPR || undefined === gaGdprConfig ) {
117
+ return;
118
+ }
119
+
120
+ var config = JSON.parse( gaGdprConfig );
121
+
122
+ $( '.gdpr-platform input[name="gdpr-enable"]' ).prop( 'checked', config['enabled'] === 'true' );
123
+ $( '#sharethis-publisher-name' ).val( config['publisher_name'] );
124
+ $( '#sharethis-user-type option[value="' + config['display'] + '"]' ).attr( 'selected', true );
125
+ $( '#sharethis-consent-type option[value="' + config['scope'] + '"]' ).attr( 'selected', true );
126
+ $( '#sharethis-form-color .color[data-value="' + config['color'] + '"]' ).addClass( 'selected' );
127
+ $( '#st-language option[value="' + config['language'] + '"]' ).attr( 'selected', true );
128
+
129
+ if ( undefined !== config['publisher_purposes'] ) {
130
+ $( "#publisher-purpose .purpose-item input" ).prop( 'checked', false );
131
+
132
+ config['publisher_purposes'].map(
133
+ ( purpVal ) =>
134
+ {
135
+ var legit = 'true' === purpVal['legitimate_interest'] || true === purpVal['legitimate_interest'];
136
+ var consent = 'false' === purpVal['legitimate_interest'] || false === purpVal['legitimate_interest'];
137
+
138
+ $( '#publisher-purpose .purpose-item input[name="purposes[' + purpVal.id + ']"][value="legitimate"]' ).prop( 'checked', legit );
139
+ $( '#publisher-purpose .purpose-item input[name="purposes[' + purpVal.id + ']"][value="consent"]' ).prop( 'checked', consent );
140
+ }
141
+ );
142
+ }
143
+
144
+ if ( undefined !== config['publisher_restrictions'] ) {
145
+ $( ".vendor-table-cell-wrapper input" ).prop( 'checked', false );
146
+
147
+ $.map(
148
+ config['publisher_restrictions'],
149
+ function( id, venVal ) {
150
+ if ( id ) {
151
+ $( 'input[type="checkbox"][data-id="' + venVal + '"]' ).prop( 'checked', true );
152
+ }
153
+ },
154
+ );
155
+ }
156
+ },
157
+ scrollToAnchor: function( aid ) {
158
+ var aTag = $( "a[name='" + aid.toLowerCase() + "']" );
159
+
160
+ $( '.vendor-table-body' ).animate(
161
+ {
162
+ scrollTop: 0,
163
+ },
164
+ 0,
165
+ ).animate(
166
+ {
167
+ scrollTop: aTag.offset().top - 740,
168
+ },
169
+ 0,
170
+ );
171
+ },
172
+
173
+ click: function( selector, callback ) {
174
+ $( selector ).live( 'click', callback );
175
+ },
176
+ codeManuallyCallback: function( features_enabled ) {
177
+ var checkbox = $( '#ga_enter_code_manually' );
178
+ if ( features_enabled ) {
179
+ if ( checkbox.is( ':checked' ) ) {
180
+ if ( confirm( 'Warning: If you enter your Tracking ID manually, Analytics statistics will not be shown.' ) ) {
181
+ setTimeout(
182
+ function() {
183
+ $( '#ga_authorize_with_google_button' ).attr( 'disabled', 'disabled' ).next().show();
184
+ $( '#ga_account_selector' ).attr( 'disabled', 'disabled' );
185
+ $( '#ga_manually_wrapper' ).show();
186
+ },
187
+ 350,
188
+ );
189
+
190
+ } else {
191
+ setTimeout(
192
+ function() {
193
+ checkbox.removeProp( 'checked' );
194
+ },
195
+ 350,
196
+ );
197
+ }
198
+ } else {
199
+ setTimeout(
200
+ function() {
201
+ $( '#ga_authorize_with_google_button' ).removeAttr( 'disabled' ).next().hide();
202
+ $( '#ga_account_selector' ).removeAttr( 'disabled' );
203
+ $( '#ga_manually_wrapper' ).hide();
204
+ },
205
+ 350,
206
+ );
207
+ }
208
+ }
209
+ },
210
+ initModalEvents: function() {
211
+ $( 'body' ).on(
212
+ 'click',
213
+ '#close-review-us',
214
+ function() {
215
+ var dataObj = {},
216
+ self = this;
217
+ dataObj['action'] = "ga_ajax_hide_review";
218
+ dataObj[GA_NONCE_FIELD] = GA_NONCE;
219
+
220
+ $.ajax(
221
+ {
222
+ type: "post",
223
+ dataType: "json",
224
+ url: ajaxurl,
225
+ data: dataObj,
226
+ success: function( response ) {
227
+ $( '.ga-review-us' ).fadeOut();
228
+ },
229
+ },
230
+ );
231
+ },
232
+ );
233
+
234
+ $( '#' + GA_GOOGLE_AUTH_BTN_ID ).on(
235
+ 'click',
236
+ function() {
237
+ $( '#' + GA_ACCESS_CODE_TMP_ID ).focus();
238
+ },
239
+ );
240
+
241
+ $( '#' + GA_MODAL_CLOSE_ID + ', #' + GA_MODAL_BTN_CLOSE_ID + ', #' + GA_DEBUG_MODAL_ID ).on(
242
+ 'click',
243
+ function() {
244
+ ga_modal.hide();
245
+ },
246
+ );
247
+
248
+ $( '#copy-debug' ).on(
249
+ 'click',
250
+ function() {
251
+ var copiedText = $( '#ga_debug_info' );
252
+
253
+ copiedText.select();
254
+ document.execCommand( 'copy' );
255
+ },
256
+ );
257
+
258
+ $( '#' + GA_DEBUG_MODAL_CONTENT_ID ).click(
259
+ function( event ) {
260
+ event.stopPropagation();
261
+ },
262
+ );
263
+ },
264
+
265
+ getConfig: function() {
266
+ var config,
267
+ enabled = $( 'input[name="gdpr-enable"]' ).is( ':checked' ),
268
+ publisherPurposes = [],
269
+ display = $( '#sharethis-user-type option:selected' ).val(),
270
+ name = $( '#sharethis-publisher-name' ).val(),
271
+ scope = 'publisher',
272
+ color = $( '#sharethis-form-color .color.selected' ).attr( 'data-value' ),
273
+ publisherRestrictions = {},
274
+ language = $( '#st-language' ).val();
275
+
276
+ $( '#publisher-purpose input:checked' ).each(
277
+ function( index, value ) {
278
+ var theId = $( value ).attr( 'data-id' ),
279
+ legit = 'consent' !== $( value ).val();
280
+
281
+ publisherPurposes.push( { 'id': theId, 'legitimate_interest': legit } );
282
+ },
283
+ );
284
+
285
+ $( '.vendor-table-cell-wrapper label input:checked' ).each(
286
+ function( index, value ) {
287
+ var vendorId = $( value ).attr( 'data-id' );
288
+ if ( vendorId ) {
289
+ publisherRestrictions[vendorId] = true;
290
+ }
291
+ },
292
+ );
293
+
294
+ config = {
295
+ enabled: enabled,
296
+ display: display,
297
+ publisher_name: name,
298
+ publisher_purposes: publisherPurposes,
299
+ publisher_restrictions: publisherRestrictions,
300
+ language: language,
301
+ color: color,
302
+ scope: scope,
303
+ };
304
+
305
+ return config;
306
+ },
307
+
308
+ enableGdpr: function() {
309
+ var timer = '';
310
+ this.$gdprContainer = $( '.gdpr-platform' );
311
+
312
+ // New color select.
313
+ this.$gdprContainer.on(
314
+ 'click',
315
+ "#sharethis-form-color .color",
316
+ function() {
317
+ $( '#sharethis-form-color .color' ).removeClass( 'selected' );
318
+ $( this ).addClass( 'selected' );
319
+ }
320
+ );
321
+
322
+ // clear or show choices.
323
+ this.$gdprContainer.on(
324
+ 'click',
325
+ '#clear-choices',
326
+ function( e ) {
327
+ e.preventDefault();
328
+ e.stopPropagation();
329
+
330
+ $( '.purpose-item input' ).prop( 'checked', false );
331
+ },
332
+ );
333
+
334
+ // clear or show choices.
335
+ this.$gdprContainer.on(
336
+ 'click',
337
+ '#see-st-choices',
338
+ function( e ) {
339
+ e.preventDefault();
340
+ e.stopPropagation();
341
+ $( '.purpose-item input[name="purposes[1]"]' ).prop( 'checked', true );
342
+ $( '.purpose-item input[name="purposes[3]"][value="consent"]' ).prop( 'checked', true );
343
+ $( '.purpose-item input[name="purposes[5]"][value="consent"]' ).prop( 'checked', true );
344
+ $( '.purpose-item input[name="purposes[6]"][value="consent"]' ).prop( 'checked', true );
345
+ $( '.purpose-item input[name="purposes[9]"][value="legitimate"]' ).prop( 'checked', true );
346
+ $( '.purpose-item input[name="purposes[10]"][value="legitimate"]' ).prop( 'checked', true );
347
+ },
348
+ );
349
+
350
+ // Uncheck radio if click on selected box.
351
+ this.$gdprContainer.on(
352
+ 'click',
353
+ '.lever',
354
+ ( e ) =>
355
+ {
356
+ e.preventDefault();
357
+ e.stopPropagation();
358
+
359
+ const theInput = $( e.currentTarget ).siblings( 'input' );
360
+
361
+ if ( theInput.is( ':checked' ) ) {
362
+ $( 'input[name="' + theInput.attr( 'name' ) + '"]' ).prop( 'checked', false );
363
+ } else {
364
+ theInput.prop( 'checked', true );
365
+ }
366
+ },
367
+ );
368
+
369
+ // Toggle button menus when arrows are clicked.
370
+ $( 'body' ).on(
371
+ 'click',
372
+ '.accor-wrap .accor-tab',
373
+ function() {
374
+ var type = $( this ).find( 'span.accor-arrow' );
375
+
376
+ var closestButton = $( type ).parent( '.accor-tab' ).parent( '.accor-wrap' );
377
+
378
+ if ( '►' === type.html() ) {
379
+
380
+ // Show the button configs.
381
+ closestButton.find( '.accor-content' ).slideDown();
382
+
383
+ // Change the icon next to title.
384
+ closestButton.find( '.accor-arrow' ).html( '&#9660;' );
385
+ } else {
386
+
387
+ // Show the button configs.
388
+ closestButton.find( '.accor-content' ).slideUp();
389
+
390
+ // Change the icon next to title.
391
+ closestButton.find( '.accor-arrow' ).html( '&#9658;' );
392
+ }
393
+ },
394
+ );
395
+
396
+ $( 'body' ).on(
397
+ 'click',
398
+ '.demo-enable-popup .close-demo-modal',
399
+ function( e ) {
400
+ e.preventDefault();
401
+ e.stopPropagation();
402
+ $( '.demo-enable-popup' ).removeClass( 'engage' );
403
+ },
404
+ );
405
+
406
+ $( 'body' ).on(
407
+ 'click',
408
+ '#demographic-popup',
409
+ function( e ) {
410
+ e.preventDefault();
411
+ e.stopPropagation();
412
+ $( '.demo-enable-popup' ).addClass( 'engage' );
413
+ },
414
+ );
415
+
416
+ $( 'body' ).on(
417
+ 'click',
418
+ '#enable-demographic, #Enable-demographic',
419
+ function( e ) {
420
+ e.preventDefault();
421
+ e.stopPropagation();
422
+ ga_events.enableDemographic( 'enable' );
423
+ },
424
+ );
425
+
426
+ $( 'body' ).on(
427
+ 'click',
428
+ '#Disable-demographic',
429
+ function( e ) {
430
+ e.preventDefault();
431
+ e.stopPropagation();
432
+ ga_events.enableDemographic( 'disable' );
433
+ },
434
+ );
435
+
436
+ // Handle account sign-out via Ajax.
437
+ $( 'body' ).on(
438
+ 'click',
439
+ '#ga_sign_out',
440
+ function ( e ) {
441
+ e.preventDefault();
442
+ e.stopPropagation();
443
+
444
+ $.ajax(
445
+ {
446
+ type: 'post',
447
+ dataType: 'json',
448
+ url: googleAnalyticsPage.ajaxurl,
449
+ data: {
450
+ action: 'ga_ajax_sign_out',
451
+ nonce: googleAnalyticsPage.nonce,
452
+ },
453
+ success: function ( response ) {
454
+ window.location.href = encodeURI( googleAnalyticsPage.settingsURL )
455
+ },
456
+ },
457
+ );
458
+ },
459
+ );
460
+
461
+ // Enable GDPR tool.
462
+ $( 'body' ).on(
463
+ 'click',
464
+ '.gdpr-submit',
465
+ function( e ) {
466
+ e.preventDefault();
467
+ e.stopPropagation();
468
+
469
+ var dataObj = {},
470
+ self = this,
471
+ config = ga_events.getConfig();
472
+
473
+ theData = JSON.stringify(
474
+ {
475
+ 'secret': ga_secret_id,
476
+ 'id': ga_property_id,
477
+ 'product': 'gdpr-compliance-tool-v2',
478
+ 'config': config,
479
+ },
480
+ );
481
+
482
+ // Send new button status value.
483
+ $.ajax(
484
+ {
485
+ url: 'https://platform-api.sharethis.com/v1.0/property/product',
486
+ method: 'POST',
487
+ async: false,
488
+ contentType: 'application/json; charset=utf-8',
489
+ data: theData,
490
+ success:
491
+ function( results ) {
492
+ },
493
+ },
494
+ );
495
+
496
+ dataObj['action'] = "ga_ajax_enable_gdpr";
497
+ dataObj['nonce'] = 'true';
498
+ dataObj['config'] = config;
499
+
500
+ $.ajax(
501
+ {
502
+ type: "post",
503
+ dataType: "json",
504
+ url: ajaxurl,
505
+ data: dataObj,
506
+ success: function( response ) {
507
+ window.location.reload();
508
+ },
509
+ },
510
+ );
511
+ },
512
+ );
513
+
514
+ // Enable GDPR tool.
515
+ $( 'body' ).on(
516
+ 'click',
517
+ '.gdpr-enable',
518
+ function( e ) {
519
+ e.preventDefault();
520
+ e.stopPropagation();
521
+
522
+ var dataObj = {},
523
+ self = this,
524
+ config = ga_events.getConfig();
525
+
526
+ if ( $( 'body' ).hasClass( 'google-analytics_page_googleanalytics-settings' ) ) {
527
+ config = {
528
+ enabled: true,
529
+ display: 'eu',
530
+ publisher_name: '',
531
+ publisher_purposes: [],
532
+ language: 'en',
533
+ color: '',
534
+ scope: 'global',
535
+ };
536
+ }
537
+
538
+ theData = JSON.stringify(
539
+ {
540
+ 'secret': ga_secret_id,
541
+ 'id': ga_property_id,
542
+ 'product': 'gdpr-compliance-tool-v2',
543
+ 'config': config,
544
+ },
545
+ );
546
+
547
+ // Send new button status value.
548
+ $.ajax(
549
+ {
550
+ url: 'https://platform-api.sharethis.com/v1.0/property/product',
551
+ method: 'POST',
552
+ async: false,
553
+ contentType: 'application/json; charset=utf-8',
554
+ data: theData,
555
+ success: function( results ) {
556
+ },
557
+ },
558
+ );
559
+
560
+ dataObj['action'] = "ga_ajax_enable_gdpr";
561
+ dataObj['nonce'] = 'true';
562
+ dataObj['config'] = config;
563
+
564
+ $.ajax(
565
+ {
566
+ type: "post",
567
+ dataType: "json",
568
+ url: ajaxurl,
569
+ data: dataObj,
570
+ success: function( response ) {
571
+ window.location.href = siteAdminUrl + 'admin.php?page=googleanalytics%2Fgdpr';
572
+ },
573
+ },
574
+ );
575
+ },
576
+ );
577
+
578
+ // Scroll to anchor in vendor list.
579
+ // Send user input to category search AFTER they stop typing.
580
+ $( 'body' ).on(
581
+ 'keyup',
582
+ '.vendor-search input',
583
+ function( e ) {
584
+ clearTimeout( timer );
585
+
586
+ timer = setTimeout(
587
+ function() {
588
+ ga_events.scrollToAnchor( $( this ).val() );
589
+ }
590
+ .bind( this, ga_events ),
591
+ 500,
592
+ );
593
+ },
594
+ );
595
+ },
596
+
597
+ enableDemographic: function( disable ) {
598
+ var dataObj = {};
599
+
600
+ dataObj['action'] = "ga_ajax_enable_demographic";
601
+ dataObj['nonce'] = ga_demo_nonce;
602
+ dataObj['enabled'] = 'disable' === disable ? 'false' : 'true';
603
+
604
+ $.ajax(
605
+ {
606
+ type: "post",
607
+ dataType: "json",
608
+ url: ajaxurl,
609
+ data: dataObj,
610
+ success: function( response ) {
611
+ window.location.href = siteAdminUrl + 'admin.php?page=googleanalytics&ga_action=demo-ad';
612
+ },
613
+ },
614
+ );
615
+ },
616
+ };
617
+
618
+ /**
619
+ * Handles "disable all features" switch button
620
+ *
621
+ * @type {{init: ga_switcher.init}}
622
+ */
623
+ ga_switcher = {
624
+ init: function( state ) {
625
+ var checkbox = $( "#ga-disable" );
626
+
627
+ if ( state ) {
628
+ checkbox.prop( 'checked', 'checked' );
629
+ } else {
630
+ checkbox.removeProp( 'checked' );
631
+ }
632
+
633
+ $( ".ga-slider-disable" ).on(
634
+ "click",
635
+ function( e ) {
636
+ var manually_enter_not_checked = $( '#ga_enter_code_manually' ).not( ':checked' );
637
+ if ( checkbox.not( ':checked' ).length > 0 ) {
638
+ if ( confirm( 'This will disable Dashboards and Google API' ) ) {
639
+ setTimeout(
640
+ function() {
641
+ window.location.href = GA_DISABLE_FEATURE_URL;
642
+ },
643
+ 350,
644
+ );
645
+ } else {
646
+ setTimeout(
647
+ function() {
648
+ checkbox.removeProp( 'checked' );
649
+ },
650
+ 350,
651
+ );
652
+ }
653
+ } else {
654
+ setTimeout(
655
+ function() {
656
+ window.location.href = GA_ENABLE_FEATURE_URL;
657
+ },
658
+ 350,
659
+ );
660
+ }
661
+ },
662
+ );
663
+ },
664
+ };
665
+
666
+ $( document ).ready(
667
+ function() {
668
+ const scrollData = $( '#ga-stats-container' ).attr( 'data-scroll' );
669
+ const scrollEl = '' !== scrollData ? $( '.' + scrollData ) : '';
670
+ const theBody = $( 'body' );
671
+
672
+ ga_events.initModalEvents();
673
+ ga_events.enableGdpr();
674
+ ga_events.setGDPRConfig( theBody.hasClass( 'google-analytics_page_googleanalytics-gdpr' ) );
675
+
676
+ if ( '' !== scrollData && theBody.hasClass( 'toplevel_page_googleanalytics' ) ) {
677
+ $( [ document.documentElement, document.body ] ).animate(
678
+ {
679
+ scrollTop: scrollEl.offset().top + 450,
680
+ },
681
+ 500,
682
+ );
683
+ }
684
+ },
685
+ );
686
+
687
+ const offset = 50;
688
+ const minWidth = 350;
689
+ const wrapperSelector = '#ga-stats-container';
690
+ const chartContainer = 'chart_div';
691
+ const demoChartDeviceContainer = 'demo_chart_device_div';
692
+ const demoChartGenderContainer = 'demo_chart_gender_div';
693
+ const demoChartAgeContainer = 'demo_chart_age_div';
694
+
695
+ ga_charts = {
696
+ init: function( callback ) {
697
+ $( document ).ready(
698
+ function() {
699
+ google.charts.load(
700
+ 'current',
701
+ {
702
+ 'packages': [ 'corechart' ],
703
+ },
704
+ );
705
+ ga_loader.show();
706
+ google.charts.setOnLoadCallback( callback );
707
+ },
708
+ );
709
+ },
710
+ createTooltip: function( day, pageviews ) {
711
+ return '<div style="padding:10px;width:100px;"><strong>' + day
712
+ + '</strong><br>Pageviews:<strong> ' + pageviews
713
+ + '</strong></div>';
714
+ },
715
+ events: function( data ) {
716
+ $( window ).on(
717
+ 'resize',
718
+ function() {
719
+ ga_charts.drawChart( data, ga_tools.recomputeChartWidth( minWidth, offset, wrapperSelector ) );
720
+ },
721
+ );
722
+ },
723
+ drawChart: function( data, chartWidth ) {
724
+
725
+ if ( typeof chartWidth == 'undefined' ) {
726
+ chartWidth = ga_tools.recomputeChartWidth( minWidth, offset, wrapperSelector );
727
+ }
728
+
729
+ const options = {
730
+ lineWidth: 5,
731
+ pointSize: 10,
732
+ tooltip: {
733
+ isHtml: true,
734
+ },
735
+ legend: {
736
+ position: ( ga_tools.getCurrentWidth( wrapperSelector ) <= minWidth ? 'top' : 'top' ),
737
+ maxLines: 5,
738
+ alignment: 'start',
739
+ textStyle: {
740
+ color: '#000',
741
+ fontSize: 12,
742
+ },
743
+ },
744
+ colors: [ '#4285f4' ],
745
+ hAxis: {
746
+ title: 'Day',
747
+ titleTextStyle: {
748
+ color: '#333',
749
+ },
750
+ },
751
+ vAxis: {
752
+ minValue: 0,
753
+ },
754
+ width: chartWidth,
755
+ height: 500,
756
+ chartArea: {
757
+ top: 50,
758
+ left: 50,
759
+ right: 30,
760
+ bottom: 100,
761
+ },
762
+ };
763
+
764
+ var chart = new google.visualization.AreaChart(
765
+ document.getElementById( chartContainer )
766
+ );
767
+ chart.draw( data, options );
768
+ },
769
+ drawDemoGenderChart: function( data, chartWidth ) {
770
+ if ( typeof chartWidth == 'undefined' ) {
771
+ chartWidth = ga_tools.recomputeChartWidth( minWidth, offset, wrapperSelector );
772
+ }
773
+
774
+ data = google.visualization.arrayToDataTable( data );
775
+
776
+ var chart = new google.visualization.PieChart( document.getElementById( demoChartGenderContainer ) );
777
+ var options = {
778
+ title: 'Gender',
779
+ };
780
+
781
+ chart.draw( data, options );
782
+ },
783
+ drawDemoDeviceChart: function( data, chartWidth ) {
784
+ if ( typeof chartWidth == 'undefined' ) {
785
+ chartWidth = ga_tools.recomputeChartWidth( minWidth, offset, wrapperSelector );
786
+ }
787
+
788
+ data = google.visualization.arrayToDataTable( data );
789
+
790
+ var chart = new google.visualization.PieChart( document.getElementById( demoChartDeviceContainer ) );
791
+ var options = {
792
+ title: 'Device Breakdown',
793
+ };
794
+
795
+ chart.draw( data, options );
796
+ },
797
+
798
+ drawDemoAgeChart: function( data, chartWidth ) {
799
+ if ( typeof chartWidth == 'undefined' ) {
800
+ chartWidth = ga_tools.recomputeChartWidth( minWidth, offset, wrapperSelector );
801
+ }
802
+
803
+ data = google.visualization.arrayToDataTable( data );
804
+
805
+ var options = {
806
+ title: 'Age',
807
+ chartArea: { width: '50%' },
808
+ hAxis: {
809
+ minValue: 0,
810
+ },
811
+ };
812
+
813
+ var chart = new google.visualization.BarChart( document.getElementById( demoChartAgeContainer ) );
814
+
815
+ chart.draw( data, options );
816
+ },
817
+ };
818
+ ga_debug = {
819
+ url: '',
820
+ open_modal: function( e ) {
821
+ e.preventDefault();
822
+ $( '#' + GA_DEBUG_MODAL_ID ).appendTo( "body" ).show();
823
+ $( '#ga-send-debug-email' ).removeAttr( 'disabled' );
824
+ $( '#ga_debug_error' ).hide();
825
+ $( '#ga_debug_success' ).hide();
826
+ },
827
+ send_email: function( e ) {
828
+ e.preventDefault();
829
+ ga_loader.show();
830
+ var dataObj = {};
831
+ dataObj['action'] = "googleanalytics_send_debug_email";
832
+ dataObj['email'] = $( '#' + GA_DEBUG_EMAIL ).val();
833
+ dataObj['description'] = $( '#' + GA_DEBUG_DESCRIPTION ).val();
834
+ $.ajax(
835
+ {
836
+ type: "post",
837
+ dataType: "json",
838
+ url: ajaxurl,
839
+ data: dataObj,
840
+ success: function( response ) {
841
+ ga_loader.hide();
842
+ if ( typeof response.error !== "undefined" ) {
843
+ $( '#ga_debug_error' ).show().html( response.error );
844
+ } else if ( typeof response.success !== "undefined" ) {
845
+ $( '#ga_debug_error' ).hide();
846
+ $( '#ga-send-debug-email' ).attr( 'disabled', 'disabled' );
847
+ $( '#ga_debug_success' ).show().html( response.success );
848
+ }
849
+ },
850
+ },
851
+ );
852
+ },
853
+ };
854
+ } )( jQuery );
lib/Ga_Lib_Api_Request.php DELETED
@@ -1,215 +0,0 @@
1
- <?php
2
-
3
- class Ga_Lib_Api_Request {
4
-
5
- static $instance = null;
6
-
7
- const HEADER_CONTENT_TYPE = "application/x-www-form-urlencoded";
8
- const HEADER_CONTENT_TYPE_JSON = "Content-type: application/json";
9
- const HEADER_ACCEPT = "Accept: application/json, text/javascript, */*; q=0.01";
10
- const TIMEOUT = 5;
11
- const USER_AGENT = 'googleanalytics-wordpress-plugin';
12
-
13
- private $headers = array();
14
-
15
- // Whether to cache or not
16
- private $cache = false;
17
-
18
- private $appendix = '';
19
-
20
- private function __construct( $cache = false, $appendix = '' ) {
21
- $this->cache = $cache;
22
- $this->appendix = $appendix;
23
- }
24
-
25
- /**
26
- * Returns API client instance.
27
- *
28
- * @return Ga_Lib_Api_Request|null
29
- */
30
- public static function get_instance( $cache = false, $appendix = '' ) {
31
- if ( self::$instance === null ) {
32
- self::$instance = new Ga_Lib_Api_Request( $cache, $appendix );
33
- }
34
-
35
- return self::$instance;
36
- }
37
-
38
- /**
39
- * Sets request headers.
40
- *
41
- * @param $headers
42
- */
43
- public function set_request_headers( $headers ) {
44
- if ( is_array( $headers ) ) {
45
- $this->headers = array_merge( $this->headers, $headers );
46
- } else {
47
- $this->headers[] = $headers;
48
- }
49
- }
50
-
51
- /**
52
- * Perform HTTP request.
53
- *
54
- * @param string $url URL address
55
- * @param string $rawPostBody
56
- * @param boolean $json Whether to append JSON content type
57
- * @param boolean $force_no_cache Whether to force not to cache response data even if cache property is set to true
58
- *
59
- * @return string Response
60
- * @throws Exception
61
- */
62
- public function make_request( $url, $rawPostBody = null, $json = false, $force_no_cache = false ) {
63
-
64
- // Return cached data if exist
65
- if ( ! $force_no_cache ) {
66
- if ( $this->cache ) {
67
- $wp_transient_name = Ga_Cache::get_transient_name( $url, $rawPostBody, $this->appendix );
68
-
69
- if ( $cached = Ga_Cache::get_cached_result( $wp_transient_name ) ) {
70
- if ( ! Ga_Cache::is_data_cache_outdated( $wp_transient_name, $this->appendix ) ) {
71
- return $cached;
72
- }
73
- }
74
-
75
- // Check if the next request after error is allowed
76
- if ( false === Ga_Cache::is_next_request_allowed( $wp_transient_name ) ) {
77
- throw new Ga_Lib_Api_Client_Exception( _( 'There are temporary connection issues, please try again later.' ) );
78
- }
79
- }
80
- }
81
-
82
-
83
- if ( !function_exists( 'curl_init' ) ) {
84
- throw new Ga_Lib_Api_Client_Exception( _( 'cURL functions are not available' ) );
85
- }
86
-
87
- // Set default headers
88
- $this->set_request_headers( array(
89
- ( $json ? self::HEADER_CONTENT_TYPE_JSON : self::HEADER_CONTENT_TYPE ),
90
- self::HEADER_ACCEPT
91
- ) );
92
-
93
- $ch = curl_init( $url );
94
- $headers = $this->headers;
95
-
96
- $curl_timeout = self::TIMEOUT;
97
- $php_execution_time = ini_get( 'max_execution_time' );
98
- if ( !empty( $php_execution_time ) && is_numeric( $php_execution_time ) ) {
99
- if ( $php_execution_time < 36 && $php_execution_time > 9 ) {
100
- $curl_timeout = $php_execution_time - 5;
101
- } elseif ( $php_execution_time < 10 ) {
102
- $curl_timeout = 5;
103
- }
104
- }
105
-
106
- // Set the proxy configuration. The user can provide this in wp-config.php
107
- if ( defined( 'WP_PROXY_HOST' ) ) {
108
- curl_setopt( $ch, CURLOPT_PROXY, WP_PROXY_HOST );
109
- }
110
- if ( defined( 'WP_PROXY_PORT' ) ) {
111
- curl_setopt( $ch, CURLOPT_PROXYPORT, WP_PROXY_PORT );
112
- }
113
- if ( defined( 'WP_PROXY_USERNAME' ) ) {
114
- $auth = WP_PROXY_USERNAME;
115
- if ( defined( 'WP_PROXY_PASSWORD' ) ) {
116
- $auth .= ':' . WP_PROXY_PASSWORD;
117
- }
118
- curl_setopt( $ch, CURLOPT_PROXYUSERPWD, $auth );
119
- }
120
-
121
- curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $curl_timeout );
122
- curl_setopt( $ch, CURLOPT_TIMEOUT, $curl_timeout );
123
- curl_setopt( $ch, CURLOPT_HEADER, true );
124
- curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, true );
125
- curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 2 );
126
-
127
- if ( !function_exists( 'ini_get' ) || ! ini_get( 'curl.cainfo' ) ) {
128
- curl_setopt( $ch, CURLOPT_CAINFO, $this->get_cert_path() );
129
- }
130
-
131
- curl_setopt( $ch, CURLINFO_HEADER_OUT, true );
132
- curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );
133
- curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
134
- curl_setopt( $ch, CURLOPT_USERAGENT, self::USER_AGENT );
135
- if ( defined( 'CURLOPT_IPRESOLVE' ) && defined( 'CURL_IPRESOLVE_V4' ) ) {
136
- curl_setopt( $ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
137
- }
138
-
139
- // POST body
140
- if ( !empty( $rawPostBody ) ) {
141
- curl_setopt( $ch, CURLOPT_POST, true );
142
- curl_setopt( $ch, CURLOPT_POSTFIELDS, ( $json ? $rawPostBody : http_build_query( $rawPostBody , null, '&' ) ) );
143
- }
144
-
145
- // Execute request
146
- $response = curl_exec( $ch );
147
-
148
- if ( $error = curl_error( $ch ) ) {
149
- $errno = curl_errno( $ch );
150
- curl_close( $ch );
151
-
152
- // Store last cache time when unsuccessful
153
- if ( false === $force_no_cache ) {
154
- if ( true === $this->cache ) {
155
- Ga_Cache::set_last_cache_time( $wp_transient_name );
156
- Ga_Cache::set_last_time_attempt();
157
- }
158
- }
159
-
160
- throw new Ga_Lib_Api_Client_Exception( $error . ' (' . $errno . ')' );
161
- } else {
162
- $httpCode = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
163
- $headerSize = curl_getinfo( $ch, CURLINFO_HEADER_SIZE );
164
- $header = substr( $response, 0, $headerSize );
165
- $body = substr( $response, $headerSize, strlen( $response ) );
166
- if ( preg_match( '/^(4|5)[0-9]{2}/', $httpCode ) ) {
167
-
168
- throw new Ga_Lib_Api_Request_Exception( ( $httpCode == 404 ? _( 'Requested URL doesn\'t exists: ' . $url ) : $body ) );
169
- }
170
-
171
- curl_close( $ch );
172
-
173
- $response_data = array( $header, $body );
174
-
175
- if (isset($_REQUEST['key'])) {
176
- $profile = array(
177
- 'key' => sanitize_text_field( $_REQUEST['key'] ),
178
- 'token' => sanitize_text_field( $_REQUEST['token'] ),
179
- 'ua' => monsterinsights_is_valid_ua( $_REQUEST['ua'] ),
180
- 'viewname' => sanitize_text_field( $_REQUEST['miview'] ),
181
- 'a' => sanitize_text_field( $_REQUEST['a'] ), // AccountID
182
- 'w' => sanitize_text_field( $_REQUEST['w'] ), // PropertyID
183
- 'p' => sanitize_text_field( $_REQUEST['p'] ), // View ID
184
- 'siteurl' => site_url(),
185
- 'neturl' => network_admin_url(),
186
- );
187
- }
188
-
189
-
190
-
191
- // Cache result
192
- if ( false === $force_no_cache ) {
193
- if ( true === $this->cache ) {
194
- Ga_Cache::set_cache( $wp_transient_name, $response_data );
195
- }
196
- }
197
-
198
-
199
- return $response_data;
200
- }
201
- }
202
-
203
- private function get_cert_path() {
204
- return GA_PLUGIN_DIR . '/lib/cert/cacerts.pem';
205
- }
206
-
207
- }
208
-
209
- class Ga_Lib_Api_Request_Exception extends Exception {
210
-
211
- public function __construct( $message ) {
212
- parent::__construct( $message );
213
- }
214
-
215
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lib/Ga_Lib_Api_Response.php DELETED
@@ -1,42 +0,0 @@
1
- <?php
2
-
3
- class Ga_Lib_Api_Response {
4
-
5
- public static $empty_response = array( '', '' );
6
- private $header;
7
- private $body;
8
- private $data;
9
-
10
- function __construct( $raw_response = null ) {
11
- if (!empty($raw_response)) {
12
- $this->setHeader( $raw_response[ 0 ] );
13
- $this->setBody( $raw_response[ 1 ] );
14
- $this->setData( json_decode( $raw_response[ 1 ], true ) );
15
- }
16
- }
17
-
18
- public function setHeader( $header ) {
19
- $this->header = $header;
20
- }
21
-
22
- public function getHeader() {
23
- return $this->header;
24
- }
25
-
26
- public function setBody( $body ) {
27
- $this->body = $body;
28
- }
29
-
30
- public function getBody() {
31
- return $this->body;
32
- }
33
-
34
- public function setData( $data ) {
35
- $this->data = $data;
36
- }
37
-
38
- public function getData() {
39
- return $this->data;
40
- }
41
-
42
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lib/cert/cacerts.pem DELETED
@@ -1,4057 +0,0 @@
1
- # Certifcate Authority certificates for validating SSL connections.
2
- #
3
- # This file contains PEM format certificates generated from
4
- # http://mxr.mozilla.org/seamonkey/source/security/nss/lib/ckfw/builtins/certdata.txt
5
- #
6
- # ***** BEGIN LICENSE BLOCK *****
7
- # Version: MPL 1.1/GPL 2.0/LGPL 2.1
8
- #
9
- # The contents of this file are subject to the Mozilla Public License Version
10
- # 1.1 (the "License"); you may not use this file except in compliance with
11
- # the License. You may obtain a copy of the License at
12
- # http://www.mozilla.org/MPL/
13
- #
14
- # Software distributed under the License is distributed on an "AS IS" basis,
15
- # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
16
- # for the specific language governing rights and limitations under the
17
- # License.
18
- #
19
- # The Original Code is the Netscape security libraries.
20
- #
21
- # The Initial Developer of the Original Code is
22
- # Netscape Communications Corporation.
23
- # Portions created by the Initial Developer are Copyright (C) 1994-2000
24
- # the Initial Developer. All Rights Reserved.
25
- #
26
- # Contributor(s):
27
- #
28
- # Alternatively, the contents of this file may be used under the terms of
29
- # either the GNU General Public License Version 2 or later (the "GPL"), or
30
- # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
31
- # in which case the provisions of the GPL or the LGPL are applicable instead
32
- # of those above. If you wish to allow use of your version of this file only
33
- # under the terms of either the GPL or the LGPL, and not to allow others to
34
- # use your version of this file under the terms of the MPL, indicate your
35
- # decision by deleting the provisions above and replace them with the notice
36
- # and other provisions required by the GPL or the LGPL. If you do not delete
37
- # the provisions above, a recipient may use your version of this file under
38
- # the terms of any one of the MPL, the GPL or the LGPL.
39
- #
40
- # ***** END LICENSE BLOCK *****
41
-
42
- Verisign/RSA Secure Server CA
43
- =============================
44
-
45
- -----BEGIN CERTIFICATE-----
46
- MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkG
47
- A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD
48
- VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0
49
- MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UEBhMCVVMxIDAeBgNV
50
- BAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2Vy
51
- dmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUAA4GJ
52
- ADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII
53
- 0haGN1XpsSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphI
54
- uR2nKRoTLkoRWZweFdVJVCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZI
55
- hvcNAQECBQADfgBl3X7hsuyw4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3
56
- YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc
57
- 1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA==
58
- -----END CERTIFICATE-----
59
-
60
- Thawte Personal Basic CA
61
- ========================
62
-
63
- -----BEGIN CERTIFICATE-----
64
- MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkEx
65
- FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD
66
- VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
67
- ZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBlcnNvbmFsIEJhc2lj
68
- IENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tMB4X
69
- DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpBMRUw
70
- EwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE
71
- ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy
72
- dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBD
73
- QTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzAN
74
- BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53
75
- dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdK
76
- wPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7
77
- G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF
78
- AAOBgQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7
79
- c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P
80
- 9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ==
81
- -----END CERTIFICATE-----
82
-
83
- Thawte Personal Premium CA
84
- ==========================
85
-
86
- -----BEGIN CERTIFICATE-----
87
- MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkEx
88
- FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD
89
- VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
90
- ZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBlcnNvbmFsIFByZW1p
91
- dW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1pdW1AdGhhd3RlLmNv
92
- bTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQGEwJa
93
- QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAY
94
- BgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u
95
- IFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJl
96
- bWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUu
97
- Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0Vs
98
- Bd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWI
99
- Et12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYD
100
- ZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
101
- SIb3DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH
102
- b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBh
103
- KXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1KzGJ
104
- -----END CERTIFICATE-----
105
-
106
- Thawte Personal Freemail CA
107
- ===========================
108
-
109
- -----BEGIN CERTIFICATE-----
110
- MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx
111
- FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD
112
- VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
113
- ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt
114
- YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu
115
- Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT
116
- AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa
117
- MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp
118
- b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG
119
- cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh
120
- d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY
121
- DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E
122
- rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq
123
- uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN
124
- BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP
125
- MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa
126
- /RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei
127
- gQ==
128
- -----END CERTIFICATE-----
129
-
130
- Thawte Server CA
131
- ================
132
-
133
- -----BEGIN CERTIFICATE-----
134
- MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx
135
- FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
136
- VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
137
- biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm
138
- MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx
139
- MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
140
- DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3
141
- dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl
142
- cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3
143
- DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD
144
- gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91
145
- yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX
146
- L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj
147
- EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG
148
- 7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e
149
- QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ
150
- qdq5snUb9kLy78fyGPmJvKP/iiMucEc=
151
- -----END CERTIFICATE-----
152
-
153
- Thawte Premium Server CA
154
- ========================
155
-
156
- -----BEGIN CERTIFICATE-----
157
- MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx
158
- FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
159
- VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
160
- biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy
161
- dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t
162
- MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB
163
- MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG
164
- A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp
165
- b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl
166
- cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv
167
- bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE
168
- VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ
169
- ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR
170
- uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
171
- 9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI
172
- hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM
173
- pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==
174
- -----END CERTIFICATE-----
175
-
176
- Equifax Secure CA
177
- =================
178
-
179
- -----BEGIN CERTIFICATE-----
180
- MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
181
- UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
182
- dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
183
- MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
184
- dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
185
- AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
186
- BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
187
- cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
188
- AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
189
- MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
190
- aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
191
- ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
192
- IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
193
- MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
194
- A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
195
- 7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
196
- 1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
197
- -----END CERTIFICATE-----
198
-
199
- Verisign Class 1 Public Primary Certification Authority
200
- =======================================================
201
-
202
- -----BEGIN CERTIFICATE-----
203
- MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJ
204
- BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh
205
- c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05
206
- NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD
207
- VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJp
208
- bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB
209
- jQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0N
210
- H8xlbgyw0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR
211
- 4k5FVmkfeAKA2txHkSm7NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATAN
212
- BgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZo
213
- EWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5
214
- FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89Fx
215
- lA==
216
- -----END CERTIFICATE-----
217
-
218
- Verisign Class 2 Public Primary Certification Authority
219
- =======================================================
220
-
221
- -----BEGIN CERTIFICATE-----
222
- MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG
223
- A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
224
- cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
225
- MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
226
- BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt
227
- YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
228
- ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh
229
- YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7
230
- FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G
231
- CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg
232
- J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc
233
- r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY
234
- -----END CERTIFICATE-----
235
-
236
- Verisign Class 3 Public Primary Certification Authority
237
- =======================================================
238
-
239
- -----BEGIN CERTIFICATE-----
240
- MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG
241
- A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
242
- cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
243
- MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
244
- BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
245
- YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
246
- ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
247
- BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
248
- I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
249
- CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do
250
- lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc
251
- AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
252
- -----END CERTIFICATE-----
253
-
254
- Verisign Class 1 Public Primary Certification Authority - G2
255
- ============================================================
256
-
257
- -----BEGIN CERTIFICATE-----
258
- MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
259
- BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
260
- c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
261
- MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
262
- emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
263
- DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
264
- FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg
265
- UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
266
- YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
267
- MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
268
- AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK
269
- VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm
270
- Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID
271
- AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J
272
- h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul
273
- uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68
274
- DzFc6PLZ
275
- -----END CERTIFICATE-----
276
-
277
- Verisign Class 2 Public Primary Certification Authority - G2
278
- ============================================================
279
-
280
- -----BEGIN CERTIFICATE-----
281
- MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw
282
- CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns
283
- YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
284
- MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y
285
- aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe
286
- Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX
287
- MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj
288
- IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx
289
- KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
290
- eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B
291
- AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM
292
- HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw
293
- DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC
294
- AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji
295
- nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX
296
- rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn
297
- jBJ7xUS0rg==
298
- -----END CERTIFICATE-----
299
-
300
- Verisign Class 3 Public Primary Certification Authority - G2
301
- ============================================================
302
-
303
- -----BEGIN CERTIFICATE-----
304
- MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
305
- BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
306
- c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
307
- MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
308
- emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
309
- DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
310
- FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg
311
- UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
312
- YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
313
- MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
314
- AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4
315
- pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0
316
- 13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID
317
- AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk
318
- U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i
319
- F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY
320
- oJ2daZH9
321
- -----END CERTIFICATE-----
322
-
323
- Verisign Class 4 Public Primary Certification Authority - G2
324
- ============================================================
325
-
326
- -----BEGIN CERTIFICATE-----
327
- MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
328
- BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
329
- c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
330
- MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
331
- emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
332
- DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
333
- FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg
334
- UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
335
- YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
336
- MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
337
- AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM
338
- HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK
339
- qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID
340
- AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj
341
- cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y
342
- cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP
343
- T8qAkbYp
344
- -----END CERTIFICATE-----
345
-
346
- Verisign Class 1 Public Primary Certification Authority - G3
347
- ============================================================
348
-
349
- -----BEGIN CERTIFICATE-----
350
- MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw
351
- CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
352
- cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
353
- LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
354
- aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
355
- dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
356
- VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
357
- aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
358
- bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
359
- IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
360
- LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4
361
- nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO
362
- 8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV
363
- ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb
364
- PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2
365
- 6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr
366
- n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a
367
- qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4
368
- wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3
369
- ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs
370
- pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4
371
- E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g==
372
- -----END CERTIFICATE-----
373
-
374
- Verisign Class 2 Public Primary Certification Authority - G3
375
- ============================================================
376
-
377
- -----BEGIN CERTIFICATE-----
378
- MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ
379
- BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy
380
- aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s
381
- IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp
382
- Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
383
- eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV
384
- BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp
385
- Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu
386
- Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g
387
- Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
388
- IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU
389
- J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO
390
- JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY
391
- wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o
392
- koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN
393
- qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E
394
- Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe
395
- xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u
396
- 7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU
397
- sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI
398
- sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP
399
- cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q
400
- -----END CERTIFICATE-----
401
-
402
- Verisign Class 3 Public Primary Certification Authority - G3
403
- ============================================================
404
-
405
- -----BEGIN CERTIFICATE-----
406
- MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
407
- CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
408
- cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
409
- LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
410
- aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
411
- dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
412
- VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
413
- aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
414
- bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
415
- IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
416
- LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b
417
- N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t
418
- KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu
419
- kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm
420
- CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ
421
- Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu
422
- imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te
423
- 2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe
424
- DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
425
- /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p
426
- F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt
427
- TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
428
- -----END CERTIFICATE-----
429
-
430
- Verisign Class 4 Public Primary Certification Authority - G3
431
- ============================================================
432
-
433
- -----BEGIN CERTIFICATE-----
434
- MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
435
- CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
436
- cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
437
- LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
438
- aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
439
- dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
440
- VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
441
- aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
442
- bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
443
- IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
444
- LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1
445
- GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ
446
- +mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd
447
- U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm
448
- NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY
449
- ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/
450
- ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1
451
- CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq
452
- g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
453
- fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c
454
- 2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/
455
- bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
456
- -----END CERTIFICATE-----
457
-
458
- Equifax Secure Global eBusiness CA
459
- ==================================
460
-
461
- -----BEGIN CERTIFICATE-----
462
- MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc
463
- MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT
464
- ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw
465
- MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj
466
- dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l
467
- c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC
468
- UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc
469
- 58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/
470
- o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH
471
- MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr
472
- aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA
473
- A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA
474
- Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv
475
- 8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
476
- -----END CERTIFICATE-----
477
-
478
- Equifax Secure eBusiness CA 1
479
- =============================
480
-
481
- -----BEGIN CERTIFICATE-----
482
- MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc
483
- MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT
484
- ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw
485
- MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j
486
- LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ
487
- KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo
488
- RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu
489
- WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw
490
- Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD
491
- AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK
492
- eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM
493
- zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+
494
- WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN
495
- /Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ==
496
- -----END CERTIFICATE-----
497
-
498
- Equifax Secure eBusiness CA 2
499
- =============================
500
-
501
- -----BEGIN CERTIFICATE-----
502
- MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
503
- UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj
504
- dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0
505
- NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD
506
- VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B
507
- AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G
508
- vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/
509
- BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C
510
- AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX
511
- MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl
512
- IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw
513
- NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq
514
- y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF
515
- MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
516
- A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy
517
- 0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1
518
- E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN
519
- -----END CERTIFICATE-----
520
-
521
- Thawte Time Stamping CA
522
- =======================
523
-
524
- -----BEGIN CERTIFICATE-----
525
- MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkEx
526
- FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN
527
- BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAd
528
- BgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcwMTAxMDAwMDAwWhcN
529
- MjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4g
530
- Q2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG
531
- A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1l
532
- c3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT
533
- 6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQa
534
- Wt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL
535
- 8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMB
536
- Af8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC
537
- 9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQ
538
- pgCed/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZ
539
- CayJSdM=
540
- -----END CERTIFICATE-----
541
-
542
- thawte Primary Root CA
543
- ======================
544
-
545
- -----BEGIN CERTIFICATE-----
546
- MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB
547
- qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
548
- Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
549
- MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
550
- BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw
551
- NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j
552
- LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG
553
- A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
554
- IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG
555
- SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs
556
- W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta
557
- 3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk
558
- 6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6
559
- Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J
560
- NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
561
- MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP
562
- r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU
563
- DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz
564
- YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
565
- xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2
566
- /qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/
567
- LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
568
- jVaMaA==
569
- -----END CERTIFICATE-----
570
-
571
- VeriSign Class 3 Public Primary Certification Authority - G5
572
- ============================================================
573
-
574
- -----BEGIN CERTIFICATE-----
575
- MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
576
- yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
577
- ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
578
- U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
579
- ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
580
- aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
581
- MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
582
- ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
583
- biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
584
- U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
585
- aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
586
- nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
587
- t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
588
- SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
589
- BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
590
- rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
591
- NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
592
- BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
593
- BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
594
- aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
595
- MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
596
- p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
597
- 5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
598
- WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
599
- 4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
600
- hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
601
- -----END CERTIFICATE-----
602
-
603
- Entrust.net Secure Server Certification Authority
604
- =================================================
605
-
606
- -----BEGIN CERTIFICATE-----
607
- MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
608
- VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
609
- ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
610
- KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
611
- ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1
612
- MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE
613
- ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j
614
- b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
615
- bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg
616
- U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA
617
- A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/
618
- I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3
619
- wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC
620
- AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb
621
- oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
622
- BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
623
- dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk
624
- MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
625
- b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
626
- dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0
627
- MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi
628
- E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa
629
- MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
630
- hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN
631
- 95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd
632
- 2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
633
- -----END CERTIFICATE-----
634
-
635
- Go Daddy Certification Authority Root Certificate Bundle
636
- ========================================================
637
-
638
- -----BEGIN CERTIFICATE-----
639
- MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMx
640
- ITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
641
- RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMTYw
642
- MTU0MzdaFw0yNjExMTYwMTU0MzdaMIHKMQswCQYDVQQGEwJVUzEQMA4GA1UECBMH
643
- QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5j
644
- b20sIEluYy4xMzAxBgNVBAsTKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5j
645
- b20vcmVwb3NpdG9yeTEwMC4GA1UEAxMnR28gRGFkZHkgU2VjdXJlIENlcnRpZmlj
646
- YXRpb24gQXV0aG9yaXR5MREwDwYDVQQFEwgwNzk2OTI4NzCCASIwDQYJKoZIhvcN
647
- AQEBBQADggEPADCCAQoCggEBAMQt1RWMnCZM7DI161+4WQFapmGBWTtwY6vj3D3H
648
- KrjJM9N55DrtPDAjhI6zMBS2sofDPZVUBJ7fmd0LJR4h3mUpfjWoqVTr9vcyOdQm
649
- VZWt7/v+WIbXnvQAjYwqDL1CBM6nPwT27oDyqu9SoWlm2r4arV3aLGbqGmu75RpR
650
- SgAvSMeYddi5Kcju+GZtCpyz8/x4fKL4o/K1w/O5epHBp+YlLpyo7RJlbmr2EkRT
651
- cDCVw5wrWCs9CHRK8r5RsL+H0EwnWGu1NcWdrxcx+AuP7q2BNgWJCJjPOq8lh8BJ
652
- 6qf9Z/dFjpfMFDniNoW1fho3/Rb2cRGadDAW/hOUoz+EDU8CAwEAAaOCATIwggEu
653
- MB0GA1UdDgQWBBT9rGEyk2xF1uLuhV+auud2mWjM5zAfBgNVHSMEGDAWgBTSxLDS
654
- kdRMEXGzYcs9of7dqGrU4zASBgNVHRMBAf8ECDAGAQH/AgEAMDMGCCsGAQUFBwEB
655
- BCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZ29kYWRkeS5jb20wRgYDVR0f
656
- BD8wPTA7oDmgN4Y1aHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBv
657
- c2l0b3J5L2dkcm9vdC5jcmwwSwYDVR0gBEQwQjBABgRVHSAAMDgwNgYIKwYBBQUH
658
- AgEWKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeTAO
659
- BgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBANKGwOy9+aG2Z+5mC6IG
660
- OgRQjhVyrEp0lVPLN8tESe8HkGsz2ZbwlFalEzAFPIUyIXvJxwqoJKSQ3kbTJSMU
661
- A2fCENZvD117esyfxVgqwcSeIaha86ykRvOe5GPLL5CkKSkB2XIsKd83ASe8T+5o
662
- 0yGPwLPk9Qnt0hCqU7S+8MxZC9Y7lhyVJEnfzuz9p0iRFEUOOjZv2kWzRaJBydTX
663
- RE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsxuxN89txJx9OjxUUAiKEngHUuH
664
- qDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZEjYx8WnM25sgVjOuH0aBsXBTWV
665
- U+4=
666
- -----END CERTIFICATE-----
667
- -----BEGIN CERTIFICATE-----
668
- MIIE+zCCBGSgAwIBAgICAQ0wDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Zh
669
- bGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu
670
- Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g
671
- QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAe
672
- BgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTA0MDYyOTE3MDYyMFoX
673
- DTI0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBE
674
- YWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3MgMiBDZXJ0
675
- aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgC
676
- ggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
677
- 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+q
678
- N1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiO
679
- r18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lN
680
- f4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+YihfukEH
681
- U1jPEX44dMX4/7VpkI+EdOqXG68CAQOjggHhMIIB3TAdBgNVHQ4EFgQU0sSw0pHU
682
- TBFxs2HLPaH+3ahq1OMwgdIGA1UdIwSByjCBx6GBwaSBvjCBuzEkMCIGA1UEBxMb
683
- VmFsaUNlcnQgVmFsaWRhdGlvbiBOZXR3b3JrMRcwFQYDVQQKEw5WYWxpQ2VydCwg
684
- SW5jLjE1MDMGA1UECxMsVmFsaUNlcnQgQ2xhc3MgMiBQb2xpY3kgVmFsaWRhdGlv
685
- biBBdXRob3JpdHkxITAfBgNVBAMTGGh0dHA6Ly93d3cudmFsaWNlcnQuY29tLzEg
686
- MB4GCSqGSIb3DQEJARYRaW5mb0B2YWxpY2VydC5jb22CAQEwDwYDVR0TAQH/BAUw
687
- AwEB/zAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLmdv
688
- ZGFkZHkuY29tMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jZXJ0aWZpY2F0ZXMu
689
- Z29kYWRkeS5jb20vcmVwb3NpdG9yeS9yb290LmNybDBLBgNVHSAERDBCMEAGBFUd
690
- IAAwODA2BggrBgEFBQcCARYqaHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNv
691
- bS9yZXBvc2l0b3J5MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOBgQC1
692
- QPmnHfbq/qQaQlpE9xXUhUaJwL6e4+PrxeNYiY+Sn1eocSxI0YGyeR+sBjUZsE4O
693
- WBsUs5iB0QQeyAfJg594RAoYC5jcdnplDQ1tgMQLARzLrUc+cb53S8wGd9D0Vmsf
694
- SxOaFIqII6hR8INMqzW/Rn453HWkrugp++85j09VZw==
695
- -----END CERTIFICATE-----
696
- -----BEGIN CERTIFICATE-----
697
- MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
698
- IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
699
- BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
700
- aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
701
- 9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy
702
- NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
703
- azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
704
- YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
705
- Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
706
- cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY
707
- dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9
708
- WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS
709
- v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v
710
- UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu
711
- IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC
712
- W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd
713
- -----END CERTIFICATE-----
714
-
715
- GeoTrust Global CA
716
- ==================
717
-
718
- -----BEGIN CERTIFICATE-----
719
- MIIDfTCCAuagAwIBAgIDErvmMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT
720
- MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0
721
- aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDIwNTIxMDQwMDAwWhcNMTgwODIxMDQwMDAw
722
- WjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE
723
- AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
724
- CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9m
725
- OSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIu
726
- T8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6c
727
- JmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmR
728
- Cw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5asz
729
- PeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo4HwMIHtMB8GA1UdIwQYMBaAFEjm
730
- aPkr0rKV10fYIyAQTzOYkJ/UMB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrM
731
- TjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjA6BgNVHR8EMzAxMC+g
732
- LaArhilodHRwOi8vY3JsLmdlb3RydXN0LmNvbS9jcmxzL3NlY3VyZWNhLmNybDBO
733
- BgNVHSAERzBFMEMGBFUdIAAwOzA5BggrBgEFBQcCARYtaHR0cHM6Ly93d3cuZ2Vv
734
- dHJ1c3QuY29tL3Jlc291cmNlcy9yZXBvc2l0b3J5MA0GCSqGSIb3DQEBBQUAA4GB
735
- AHbhEm5OSxYShjAGsoEIz/AIx8dxfmbuwu3UOx//8PDITtZDOLC5MH0Y0FWDomrL
736
- NhGc6Ehmo21/uBPUR/6LWlxz/K7ZGzIZOKuXNBSqltLroxwUCEm2u+WR74M26x1W
737
- b8ravHNjkOR/ez4iyz0H7V84dJzjA1BOoa+Y7mHyhD8S
738
- -----END CERTIFICATE-----
739
-
740
- GlobalSign Root CA
741
- ==================
742
- -----BEGIN CERTIFICATE-----
743
- MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
744
- GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
745
- b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
746
- BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
747
- VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
748
- DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
749
- THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
750
- Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
751
- c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
752
- gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
753
- HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
754
- AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
755
- Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
756
- j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
757
- hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
758
- X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
759
- -----END CERTIFICATE-----
760
-
761
- GlobalSign Root CA - R2
762
- =======================
763
- -----BEGIN CERTIFICATE-----
764
- MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
765
- YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
766
- bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
767
- aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
768
- bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
769
- ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
770
- s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
771
- S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
772
- TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
773
- ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
774
- FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
775
- YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
776
- BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
777
- 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
778
- 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
779
- 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
780
- TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
781
- -----END CERTIFICATE-----
782
-
783
- Verisign Class 3 Public Primary Certification Authority - G3
784
- ============================================================
785
- -----BEGIN CERTIFICATE-----
786
- MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
787
- UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
788
- cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
789
- IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
790
- dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
791
- CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
792
- dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
793
- cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
794
- Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
795
- ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
796
- EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
797
- cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
798
- EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
799
- 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
800
- ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
801
- j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
802
- /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
803
- xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
804
- t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
805
- -----END CERTIFICATE-----
806
-
807
- Entrust.net Premium 2048 Secure Server CA
808
- =========================================
809
- -----BEGIN CERTIFICATE-----
810
- MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
811
- ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
812
- bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
813
- BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
814
- NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
815
- d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
816
- MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
817
- ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
818
- MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
819
- Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
820
- hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
821
- nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
822
- VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E
823
- BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ
824
- KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy
825
- T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
826
- zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT
827
- J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e
828
- nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=
829
- -----END CERTIFICATE-----
830
-
831
- Baltimore CyberTrust Root
832
- =========================
833
- -----BEGIN CERTIFICATE-----
834
- MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
835
- ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
836
- ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
837
- SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
838
- dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
839
- uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
840
- UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
841
- G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
842
- XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
843
- l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
844
- VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
845
- BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
846
- cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
847
- hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
848
- Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
849
- RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
850
- -----END CERTIFICATE-----
851
-
852
- AddTrust External Root
853
- ======================
854
- -----BEGIN CERTIFICATE-----
855
- MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
856
- QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
857
- VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
858
- NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
859
- cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
860
- Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
861
- +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
862
- Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
863
- aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
864
- 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
865
- 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
866
- BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
867
- VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
868
- VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
869
- IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
870
- j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
871
- 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
872
- e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
873
- G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
874
- -----END CERTIFICATE-----
875
-
876
- Entrust Root Certification Authority
877
- ====================================
878
- -----BEGIN CERTIFICATE-----
879
- MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
880
- BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
881
- b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
882
- A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
883
- MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
884
- MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
885
- Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
886
- dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
887
- ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
888
- A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
889
- Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
890
- j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
891
- rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
892
- DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
893
- MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
894
- hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
895
- A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
896
- Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
897
- v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
898
- W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
899
- tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
900
- -----END CERTIFICATE-----
901
-
902
- GeoTrust Global CA
903
- ==================
904
- -----BEGIN CERTIFICATE-----
905
- MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
906
- Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
907
- MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
908
- LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
909
- CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
910
- BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
911
- 8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
912
- T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
913
- vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
914
- AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
915
- DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
916
- zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
917
- d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
918
- mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
919
- XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
920
- Mw==
921
- -----END CERTIFICATE-----
922
-
923
- GeoTrust Universal CA
924
- =====================
925
- -----BEGIN CERTIFICATE-----
926
- MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
927
- R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
928
- MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
929
- Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
930
- ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
931
- JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
932
- RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
933
- 7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
934
- 8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
935
- qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
936
- Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
937
- Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
938
- KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
939
- ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
940
- XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
941
- hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
942
- aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
943
- qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
944
- oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
945
- xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
946
- KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
947
- DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
948
- xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
949
- p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
950
- P/rmMuGNG2+k5o7Y+SlIis5z/iw=
951
- -----END CERTIFICATE-----
952
-
953
- GeoTrust Universal CA 2
954
- =======================
955
- -----BEGIN CERTIFICATE-----
956
- MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
957
- R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
958
- MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
959
- SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
960
- A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
961
- DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
962
- j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
963
- JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
964
- QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
965
- WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
966
- 20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
967
- ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
968
- SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
969
- 8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
970
- +/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
971
- BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
972
- dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
973
- 4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
974
- mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
975
- A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
976
- Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
977
- pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
978
- FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
979
- gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
980
- X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
981
- -----END CERTIFICATE-----
982
-
983
- Visa eCommerce Root
984
- ===================
985
- -----BEGIN CERTIFICATE-----
986
- MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
987
- EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
988
- QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
989
- WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
990
- VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
991
- bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
992
- F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
993
- RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
994
- TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
995
- /k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
996
- GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
997
- MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
998
- CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
999
- YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
1000
- zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
1001
- YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
1002
- 398znM/jra6O1I7mT1GvFpLgXPYHDw==
1003
- -----END CERTIFICATE-----
1004
-
1005
- Comodo AAA Services root
1006
- ========================
1007
- -----BEGIN CERTIFICATE-----
1008
- MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
1009
- R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
1010
- TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
1011
- MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
1012
- c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
1013
- BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
1014
- ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
1015
- C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
1016
- i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
1017
- Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
1018
- Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
1019
- Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
1020
- BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
1021
- cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
1022
- LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
1023
- 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
1024
- Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
1025
- 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
1026
- 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
1027
- -----END CERTIFICATE-----
1028
-
1029
- QuoVadis Root CA
1030
- ================
1031
- -----BEGIN CERTIFICATE-----
1032
- MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
1033
- ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
1034
- eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
1035
- MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
1036
- cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
1037
- EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
1038
- AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
1039
- J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
1040
- F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
1041
- YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
1042
- AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
1043
- PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
1044
- ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
1045
- MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
1046
- YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
1047
- ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
1048
- Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
1049
- Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
1050
- BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
1051
- FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
1052
- aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
1053
- tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
1054
- fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
1055
- LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
1056
- gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
1057
- 5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
1058
- 5nrQNiOKSnQ2+Q==
1059
- -----END CERTIFICATE-----
1060
-
1061
- QuoVadis Root CA 2
1062
- ==================
1063
- -----BEGIN CERTIFICATE-----
1064
- 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
- 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
- ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
1067
- 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
- DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6
1069
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
1090
- -----END CERTIFICATE-----
1091
-
1092
- QuoVadis Root CA 3
1093
- ==================
1094
- -----BEGIN CERTIFICATE-----
1095
- MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
1096
- EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
1097
- OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
1098
- aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
1099
- DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
1100
- DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
1101
- KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
1102
- DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
1103
- BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
1104
- p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
1105
- nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
1106
- MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
1107
- Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
1108
- uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
1109
- BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
1110
- YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
1111
- aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
1112
- BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
1113
- VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
1114
- ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
1115
- AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
1116
- qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
1117
- hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
1118
- POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
1119
- Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
1120
- 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
1121
- bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
1122
- g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
1123
- vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
1124
- qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
1125
- -----END CERTIFICATE-----
1126
-
1127
- Security Communication Root CA
1128
- ==============================
1129
- -----BEGIN CERTIFICATE-----
1130
- MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
1131
- U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
1132
- HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
1133
- U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
1134
- ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
1135
- 8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
1136
- DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
1137
- 5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
1138
- DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
1139
- JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
1140
- DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
1141
- 0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
1142
- mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
1143
- s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
1144
- 6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
1145
- FL39vmwLAw==
1146
- -----END CERTIFICATE-----
1147
-
1148
- Sonera Class 2 Root CA
1149
- ======================
1150
- -----BEGIN CERTIFICATE-----
1151
- MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
1152
- U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
1153
- NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
1154
- IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
1155
- /Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
1156
- dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
1157
- f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
1158
- tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
1159
- nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
1160
- XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
1161
- 0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
1162
- cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
1163
- Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
1164
- EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
1165
- llpwrN9M
1166
- -----END CERTIFICATE-----
1167
-
1168
- XRamp Global CA Root
1169
- ====================
1170
- -----BEGIN CERTIFICATE-----
1171
- MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
1172
- BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
1173
- dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
1174
- dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
1175
- HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
1176
- U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
1177
- dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
1178
- IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
1179
- foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
1180
- zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
1181
- AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
1182
- xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
1183
- EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
1184
- oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
1185
- AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
1186
- /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
1187
- qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
1188
- nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
1189
- 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
1190
- -----END CERTIFICATE-----
1191
-
1192
- Go Daddy Class 2 CA
1193
- ===================
1194
- -----BEGIN CERTIFICATE-----
1195
- MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
1196
- VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
1197
- ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
1198
- A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
1199
- RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
1200
- ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
1201
- 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
1202
- qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
1203
- YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
1204
- vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
1205
- BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
1206
- atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
1207
- MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
1208
- A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
1209
- PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
1210
- I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
1211
- HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
1212
- Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
1213
- vZ8=
1214
- -----END CERTIFICATE-----
1215
-
1216
- Starfield Class 2 CA
1217
- ====================
1218
- -----BEGIN CERTIFICATE-----
1219
- MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
1220
- U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
1221
- Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
1222
- MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
1223
- A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
1224
- SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
1225
- bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
1226
- JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
1227
- epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
1228
- F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
1229
- MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
1230
- hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
1231
- bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
1232
- QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
1233
- afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
1234
- PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
1235
- xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
1236
- KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
1237
- QBFGmh95DmK/D5fs4C8fF5Q=
1238
- -----END CERTIFICATE-----
1239
-
1240
- Taiwan GRCA
1241
- ===========
1242
- -----BEGIN CERTIFICATE-----
1243
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2
1258
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
1268
- -----END CERTIFICATE-----
1269
-
1270
- DigiCert Assured ID Root CA
1271
- ===========================
1272
- -----BEGIN CERTIFICATE-----
1273
- MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
1274
- EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
1275
- IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
1276
- MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
1277
- ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
1278
- ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
1279
- 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
1280
- UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
1281
- /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
1282
- oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
1283
- GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
1284
- 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
1285
- hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
1286
- EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
1287
- SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
1288
- 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
1289
- +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
1290
- -----END CERTIFICATE-----
1291
-
1292
- DigiCert Global Root CA
1293
- =======================
1294
- -----BEGIN CERTIFICATE-----
1295
- MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
1296
- EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
1297
- HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
1298
- MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
1299
- dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
1300
- hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
1301
- TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
1302
- BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
1303
- 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
1304
- 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
1305
- o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
1306
- 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
1307
- BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
1308
- EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
1309
- tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
1310
- UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
1311
- CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
1312
- -----END CERTIFICATE-----
1313
-
1314
- DigiCert High Assurance EV Root CA
1315
- ==================================
1316
- -----BEGIN CERTIFICATE-----
1317
- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
1318
- EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
1319
- KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
1320
- MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
1321
- MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
1322
- Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
1323
- Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
1324
- OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
1325
- MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
1326
- NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
1327
- h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
1328
- Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
1329
- JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
1330
- V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
1331
- myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
1332
- mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
1333
- vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
1334
- -----END CERTIFICATE-----
1335
-
1336
- Certplus Class 2 Primary CA
1337
- ===========================
1338
- -----BEGIN CERTIFICATE-----
1339
- MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
1340
- BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
1341
- OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
1342
- dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
1343
- ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
1344
- 5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
1345
- Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
1346
- YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
1347
- e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
1348
- CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
1349
- YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
1350
- L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
1351
- P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
1352
- TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
1353
- 7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
1354
- //1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
1355
- l7+ijrRU
1356
- -----END CERTIFICATE-----
1357
-
1358
- DST Root CA X3
1359
- ==============
1360
- -----BEGIN CERTIFICATE-----
1361
- MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
1362
- ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
1363
- DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
1364
- cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
1365
- ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
1366
- rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
1367
- UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
1368
- xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
1369
- utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
1370
- AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
1371
- MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
1372
- dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
1373
- GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
1374
- RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
1375
- fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
1376
- -----END CERTIFICATE-----
1377
-
1378
- SwissSign Gold CA - G2
1379
- ======================
1380
- -----BEGIN CERTIFICATE-----
1381
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
1407
- -----END CERTIFICATE-----
1408
-
1409
- SwissSign Silver CA - G2
1410
- ========================
1411
- -----BEGIN CERTIFICATE-----
1412
- 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
- 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
- DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3
1415
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
1426
- 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
- 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
- cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P
1429
- 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
- kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L
1431
- 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
- /uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa
1433
- DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP
1434
- 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
- WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ
1436
- 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
- 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
1438
- -----END CERTIFICATE-----
1439
-
1440
- GeoTrust Primary Certification Authority
1441
- ========================================
1442
- -----BEGIN CERTIFICATE-----
1443
- MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
1444
- EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
1445
- ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
1446
- CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
1447
- cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
1448
- CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
1449
- b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
1450
- nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
1451
- RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
1452
- tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
1453
- AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
1454
- hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
1455
- Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
1456
- NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
1457
- Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
1458
- 1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
1459
- -----END CERTIFICATE-----
1460
-
1461
- thawte Primary Root CA
1462
- ======================
1463
- -----BEGIN CERTIFICATE-----
1464
- MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
1465
- BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
1466
- aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
1467
- cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
1468
- MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
1469
- SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
1470
- KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
1471
- FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
1472
- oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
1473
- 1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
1474
- q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
1475
- aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
1476
- afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
1477
- VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
1478
- AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
1479
- uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
1480
- xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
1481
- jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
1482
- z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
1483
- -----END CERTIFICATE-----
1484
-
1485
- VeriSign Class 3 Public Primary Certification Authority - G5
1486
- ============================================================
1487
- -----BEGIN CERTIFICATE-----
1488
- MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
1489
- BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
1490
- ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
1491
- IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
1492
- ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
1493
- yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
1494
- biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
1495
- dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
1496
- YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
1497
- ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
1498
- j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
1499
- Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
1500
- Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
1501
- fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
1502
- BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
1503
- Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
1504
- aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
1505
- SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
1506
- X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
1507
- KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
1508
- Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
1509
- ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
1510
- -----END CERTIFICATE-----
1511
-
1512
- SecureTrust CA
1513
- ==============
1514
- -----BEGIN CERTIFICATE-----
1515
- MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
1516
- EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
1517
- dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
1518
- BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
1519
- ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
1520
- OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
1521
- DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
1522
- GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
1523
- 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
1524
- ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
1525
- BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
1526
- aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
1527
- KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
1528
- SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
1529
- mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
1530
- nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
1531
- 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
1532
- -----END CERTIFICATE-----
1533
-
1534
- Secure Global CA
1535
- ================
1536
- -----BEGIN CERTIFICATE-----
1537
- MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
1538
- EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
1539
- bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
1540
- MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
1541
- Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
1542
- YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
1543
- bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
1544
- 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
1545
- HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
1546
- 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
1547
- EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
1548
- oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
1549
- MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
1550
- OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
1551
- CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
1552
- 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
1553
- f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
1554
- -----END CERTIFICATE-----
1555
-
1556
- COMODO Certification Authority
1557
- ==============================
1558
- -----BEGIN CERTIFICATE-----
1559
- MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
1560
- BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
1561
- A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
1562
- dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
1563
- MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
1564
- T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
1565
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
1566
- +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
1567
- xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
1568
- 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
1569
- 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
1570
- rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
1571
- BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
1572
- b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
1573
- AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
1574
- OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
1575
- RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
1576
- IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
1577
- +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
1578
- -----END CERTIFICATE-----
1579
-
1580
- Network Solutions Certificate Authority
1581
- =======================================
1582
- -----BEGIN CERTIFICATE-----
1583
- MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
1584
- EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
1585
- IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
1586
- MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
1587
- MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
1588
- CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
1589
- jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
1590
- aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
1591
- crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
1592
- /Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
1593
- AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
1594
- BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
1595
- bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
1596
- A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
1597
- 4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
1598
- GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
1599
- wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
1600
- ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
1601
- -----END CERTIFICATE-----
1602
-
1603
- COMODO ECC Certification Authority
1604
- ==================================
1605
- -----BEGIN CERTIFICATE-----
1606
- MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
1607
- R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
1608
- ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
1609
- dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
1610
- GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
1611
- Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
1612
- b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
1613
- 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
1614
- wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
1615
- BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
1616
- FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
1617
- U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
1618
- -----END CERTIFICATE-----
1619
-
1620
- OISTE WISeKey Global Root GA CA
1621
- ===============================
1622
- -----BEGIN CERTIFICATE-----
1623
- MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
1624
- BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
1625
- A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
1626
- bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
1627
- VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
1628
- IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
1629
- IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
1630
- Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
1631
- Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
1632
- d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
1633
- /yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
1634
- LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
1635
- AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
1636
- KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
1637
- MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
1638
- +vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
1639
- hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
1640
- okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
1641
- -----END CERTIFICATE-----
1642
-
1643
- Certigna
1644
- ========
1645
- -----BEGIN CERTIFICATE-----
1646
- MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
1647
- EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
1648
- MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
1649
- Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
1650
- XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
1651
- GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
1652
- ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
1653
- DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
1654
- Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
1655
- tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
1656
- BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
1657
- SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
1658
- hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
1659
- ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
1660
- PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
1661
- 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
1662
- WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
1663
- -----END CERTIFICATE-----
1664
-
1665
- Deutsche Telekom Root CA 2
1666
- ==========================
1667
- -----BEGIN CERTIFICATE-----
1668
- MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT
1669
- RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG
1670
- A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5
1671
- MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G
1672
- A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS
1673
- b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5
1674
- bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI
1675
- KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY
1676
- AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK
1677
- Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV
1678
- jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV
1679
- HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr
1680
- E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy
1681
- zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8
1682
- rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G
1683
- dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
1684
- Cm26OWMohpLzGITY+9HPBVZkVw==
1685
- -----END CERTIFICATE-----
1686
-
1687
- Cybertrust Global Root
1688
- ======================
1689
- -----BEGIN CERTIFICATE-----
1690
- MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
1691
- ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
1692
- MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
1693
- ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
1694
- +Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
1695
- 0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
1696
- AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
1697
- 89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
1698
- 8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
1699
- BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
1700
- MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
1701
- A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
1702
- lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
1703
- 5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
1704
- hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
1705
- X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
1706
- WL1WMRJOEcgh4LMRkWXbtKaIOM5V
1707
- -----END CERTIFICATE-----
1708
-
1709
- ePKI Root Certification Authority
1710
- =================================
1711
- -----BEGIN CERTIFICATE-----
1712
- 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
- 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
- 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
- MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq
1716
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi
1726
- 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
- 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
- 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
- 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
- KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV
1731
- 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
- NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r
1733
- 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
- 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
- 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
- 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
- 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
1738
- -----END CERTIFICATE-----
1739
-
1740
- certSIGN ROOT CA
1741
- ================
1742
- -----BEGIN CERTIFICATE-----
1743
- MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
1744
- VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
1745
- Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
1746
- CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
1747
- JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
1748
- rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
1749
- ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
1750
- 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
1751
- AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
1752
- Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
1753
- AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
1754
- SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
1755
- x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
1756
- vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
1757
- TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
1758
- -----END CERTIFICATE-----
1759
-
1760
- GeoTrust Primary Certification Authority - G3
1761
- =============================================
1762
- -----BEGIN CERTIFICATE-----
1763
- MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
1764
- BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
1765
- IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
1766
- eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
1767
- NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
1768
- YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
1769
- LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
1770
- hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
1771
- K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
1772
- c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
1773
- IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
1774
- dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
1775
- MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
1776
- 2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
1777
- cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
1778
- Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
1779
- AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
1780
- t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
1781
- -----END CERTIFICATE-----
1782
-
1783
- thawte Primary Root CA - G2
1784
- ===========================
1785
- -----BEGIN CERTIFICATE-----
1786
- MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
1787
- VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
1788
- IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
1789
- Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
1790
- MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
1791
- b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
1792
- IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
1793
- LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
1794
- 8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
1795
- mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
1796
- G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
1797
- rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
1798
- -----END CERTIFICATE-----
1799
-
1800
- thawte Primary Root CA - G3
1801
- ===========================
1802
- -----BEGIN CERTIFICATE-----
1803
- MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
1804
- BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
1805
- aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
1806
- cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
1807
- ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
1808
- d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
1809
- VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
1810
- A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
1811
- MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
1812
- P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
1813
- +BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
1814
- 7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
1815
- vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
1816
- BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
1817
- KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
1818
- A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
1819
- t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
1820
- 8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
1821
- er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
1822
- -----END CERTIFICATE-----
1823
-
1824
- GeoTrust Primary Certification Authority - G2
1825
- =============================================
1826
- -----BEGIN CERTIFICATE-----
1827
- MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
1828
- VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
1829
- Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
1830
- ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
1831
- OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
1832
- MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
1833
- b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
1834
- BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
1835
- KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
1836
- VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
1837
- EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
1838
- ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
1839
- npaqBA+K
1840
- -----END CERTIFICATE-----
1841
-
1842
- VeriSign Universal Root Certification Authority
1843
- ===============================================
1844
- -----BEGIN CERTIFICATE-----
1845
- MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
1846
- BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
1847
- ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
1848
- IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
1849
- IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
1850
- UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
1851
- cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
1852
- IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
1853
- aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
1854
- 1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
1855
- MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
1856
- 9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
1857
- AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
1858
- tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
1859
- CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
1860
- a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
1861
- DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
1862
- Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
1863
- Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
1864
- P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
1865
- wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
1866
- mJO37M2CYfE45k+XmCpajQ==
1867
- -----END CERTIFICATE-----
1868
-
1869
- VeriSign Class 3 Public Primary Certification Authority - G4
1870
- ============================================================
1871
- -----BEGIN CERTIFICATE-----
1872
- MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
1873
- VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
1874
- b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
1875
- ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
1876
- YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
1877
- MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
1878
- cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
1879
- b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
1880
- IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
1881
- Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
1882
- rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
1883
- /zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
1884
- HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
1885
- Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
1886
- A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
1887
- AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
1888
- -----END CERTIFICATE-----
1889
-
1890
- NetLock Arany (Class Gold) Főtanúsítvány
1891
- ========================================
1892
- -----BEGIN CERTIFICATE-----
1893
- MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
1894
- A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
1895
- dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
1896
- cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
1897
- MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
1898
- ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
1899
- biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
1900
- c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
1901
- 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
1902
- /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
1903
- H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
1904
- fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
1905
- neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
1906
- BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
1907
- qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
1908
- YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
1909
- bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
1910
- NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
1911
- dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
1912
- -----END CERTIFICATE-----
1913
-
1914
- Staat der Nederlanden Root CA - G2
1915
- ==================================
1916
- -----BEGIN CERTIFICATE-----
1917
- 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
- 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
- Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC
1920
- TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
1921
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
1943
- 66+KAQ==
1944
- -----END CERTIFICATE-----
1945
-
1946
- Hongkong Post Root CA 1
1947
- =======================
1948
- -----BEGIN CERTIFICATE-----
1949
- MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
1950
- DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
1951
- NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
1952
- IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
1953
- AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
1954
- ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
1955
- auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
1956
- qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
1957
- V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
1958
- HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
1959
- h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
1960
- l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
1961
- IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
1962
- T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
1963
- c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
1964
- -----END CERTIFICATE-----
1965
-
1966
- SecureSign RootCA11
1967
- ===================
1968
- -----BEGIN CERTIFICATE-----
1969
- MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
1970
- SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
1971
- b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
1972
- KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
1973
- cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
1974
- TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
1975
- wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
1976
- g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
1977
- O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
1978
- bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
1979
- t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
1980
- OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
1981
- bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
1982
- Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
1983
- y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
1984
- lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
1985
- -----END CERTIFICATE-----
1986
-
1987
- Microsec e-Szigno Root CA 2009
1988
- ==============================
1989
- -----BEGIN CERTIFICATE-----
1990
- MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
1991
- MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
1992
- c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
1993
- dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
1994
- BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
1995
- U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
1996
- DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
1997
- fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
1998
- 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
1999
- pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
2000
- 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
2001
- AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
2002
- QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
2003
- FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
2004
- lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
2005
- I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
2006
- tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
2007
- yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
2008
- LXpUq3DDfSJlgnCW
2009
- -----END CERTIFICATE-----
2010
-
2011
- GlobalSign Root CA - R3
2012
- =======================
2013
- -----BEGIN CERTIFICATE-----
2014
- MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
2015
- YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
2016
- bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
2017
- aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
2018
- bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
2019
- iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
2020
- 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
2021
- rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
2022
- OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
2023
- xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
2024
- FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
2025
- lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
2026
- EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
2027
- bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
2028
- YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
2029
- kpeDMdmztcpHWD9f
2030
- -----END CERTIFICATE-----
2031
-
2032
- Autoridad de Certificacion Firmaprofesional CIF A62634068
2033
- =========================================================
2034
- -----BEGIN CERTIFICATE-----
2035
- MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
2036
- BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
2037
- MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
2038
- QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
2039
- NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
2040
- Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
2041
- B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
2042
- 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
2043
- ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
2044
- plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
2045
- MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
2046
- LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
2047
- bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
2048
- vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
2049
- EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
2050
- DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
2051
- cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
2052
- bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
2053
- ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
2054
- 51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
2055
- R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
2056
- T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
2057
- Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
2058
- osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
2059
- crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
2060
- saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
2061
- KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
2062
- 6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
2063
- -----END CERTIFICATE-----
2064
-
2065
- Izenpe.com
2066
- ==========
2067
- -----BEGIN CERTIFICATE-----
2068
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
2095
- -----END CERTIFICATE-----
2096
-
2097
- Chambers of Commerce Root - 2008
2098
- ================================
2099
- -----BEGIN CERTIFICATE-----
2100
- MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
2101
- MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
2102
- bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
2103
- QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
2104
- Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
2105
- ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
2106
- EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
2107
- cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
2108
- AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
2109
- XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
2110
- h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
2111
- ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
2112
- NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
2113
- D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
2114
- lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
2115
- 0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
2116
- ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
2117
- EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
2118
- G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
2119
- BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
2120
- bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
2121
- bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
2122
- CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
2123
- AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
2124
- wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
2125
- 3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
2126
- RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
2127
- M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
2128
- YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
2129
- 9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
2130
- zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
2131
- nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
2132
- OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
2133
- -----END CERTIFICATE-----
2134
-
2135
- Global Chambersign Root - 2008
2136
- ==============================
2137
- -----BEGIN CERTIFICATE-----
2138
- MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
2139
- MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
2140
- bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
2141
- QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
2142
- NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
2143
- Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
2144
- QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
2145
- aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
2146
- VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
2147
- XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
2148
- ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
2149
- /gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
2150
- TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
2151
- H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
2152
- Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
2153
- HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
2154
- wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
2155
- AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
2156
- BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
2157
- BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
2158
- aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
2159
- aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
2160
- 1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
2161
- dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
2162
- /5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
2163
- ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
2164
- dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
2165
- 9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
2166
- foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
2167
- qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
2168
- P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
2169
- c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
2170
- 09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
2171
- -----END CERTIFICATE-----
2172
-
2173
- Go Daddy Root Certificate Authority - G2
2174
- ========================================
2175
- -----BEGIN CERTIFICATE-----
2176
- MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
2177
- B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
2178
- MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
2179
- MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
2180
- b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
2181
- A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
2182
- hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
2183
- 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
2184
- +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
2185
- fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
2186
- NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
2187
- MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
2188
- BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
2189
- vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
2190
- 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
2191
- N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
2192
- LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
2193
- -----END CERTIFICATE-----
2194
-
2195
- Starfield Root Certificate Authority - G2
2196
- =========================================
2197
- -----BEGIN CERTIFICATE-----
2198
- MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
2199
- B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
2200
- b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
2201
- eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
2202
- DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
2203
- VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
2204
- dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
2205
- W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
2206
- bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
2207
- N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
2208
- ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
2209
- JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
2210
- AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
2211
- TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
2212
- 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
2213
- F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
2214
- pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
2215
- c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
2216
- -----END CERTIFICATE-----
2217
-
2218
- Starfield Services Root Certificate Authority - G2
2219
- ==================================================
2220
- -----BEGIN CERTIFICATE-----
2221
- MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
2222
- B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
2223
- b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
2224
- IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
2225
- BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
2226
- dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
2227
- Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
2228
- AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
2229
- h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
2230
- hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
2231
- LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
2232
- rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
2233
- AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
2234
- SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
2235
- E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
2236
- xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
2237
- iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
2238
- YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
2239
- -----END CERTIFICATE-----
2240
-
2241
- AffirmTrust Commercial
2242
- ======================
2243
- -----BEGIN CERTIFICATE-----
2244
- MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
2245
- BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
2246
- MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
2247
- bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
2248
- AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
2249
- DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
2250
- C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
2251
- BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
2252
- MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
2253
- HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
2254
- AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
2255
- hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
2256
- qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
2257
- 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
2258
- sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
2259
- -----END CERTIFICATE-----
2260
-
2261
- AffirmTrust Networking
2262
- ======================
2263
- -----BEGIN CERTIFICATE-----
2264
- MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
2265
- BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
2266
- MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
2267
- bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
2268
- AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
2269
- Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
2270
- dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
2271
- /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
2272
- h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
2273
- HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
2274
- AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
2275
- UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
2276
- 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
2277
- WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
2278
- /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
2279
- -----END CERTIFICATE-----
2280
-
2281
- AffirmTrust Premium
2282
- ===================
2283
- -----BEGIN CERTIFICATE-----
2284
- MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
2285
- BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
2286
- OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
2287
- dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
2288
- MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
2289
- BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
2290
- 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
2291
- +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
2292
- GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
2293
- p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
2294
- S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
2295
- 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
2296
- /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
2297
- +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
2298
- /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
2299
- MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
2300
- Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
2301
- 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
2302
- L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
2303
- +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
2304
- BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
2305
- IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
2306
- g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
2307
- zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
2308
- -----END CERTIFICATE-----
2309
-
2310
- AffirmTrust Premium ECC
2311
- =======================
2312
- -----BEGIN CERTIFICATE-----
2313
- MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
2314
- BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
2315
- MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
2316
- cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
2317
- IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
2318
- N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
2319
- BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
2320
- BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
2321
- 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
2322
- eQ==
2323
- -----END CERTIFICATE-----
2324
-
2325
- Certum Trusted Network CA
2326
- =========================
2327
- -----BEGIN CERTIFICATE-----
2328
- MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
2329
- ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
2330
- biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
2331
- MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
2332
- ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
2333
- MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
2334
- AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
2335
- l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
2336
- J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
2337
- fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
2338
- cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
2339
- Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
2340
- DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
2341
- jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
2342
- mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
2343
- Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
2344
- 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
2345
- -----END CERTIFICATE-----
2346
-
2347
- TWCA Root Certification Authority
2348
- =================================
2349
- -----BEGIN CERTIFICATE-----
2350
- MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
2351
- VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
2352
- dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
2353
- EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
2354
- IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
2355
- AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
2356
- QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
2357
- oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
2358
- 4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
2359
- y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
2360
- BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
2361
- 9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
2362
- mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
2363
- QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
2364
- T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
2365
- Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
2366
- -----END CERTIFICATE-----
2367
-
2368
- Security Communication RootCA2
2369
- ==============================
2370
- -----BEGIN CERTIFICATE-----
2371
- MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
2372
- U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
2373
- dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
2374
- SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
2375
- aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
2376
- ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
2377
- +T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
2378
- 3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
2379
- spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
2380
- EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
2381
- QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
2382
- CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
2383
- u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
2384
- 3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
2385
- tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
2386
- mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
2387
- -----END CERTIFICATE-----
2388
-
2389
- EC-ACC
2390
- ======
2391
- -----BEGIN CERTIFICATE-----
2392
- MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE
2393
- BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w
2394
- ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD
2395
- VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE
2396
- CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT
2397
- BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7
2398
- MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt
2399
- SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl
2400
- Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh
2401
- cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND
2402
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK
2403
- w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT
2404
- ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4
2405
- HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a
2406
- E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw
2407
- 0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
2408
- BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD
2409
- VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0
2410
- Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l
2411
- dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ
2412
- lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa
2413
- Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe
2414
- l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2
2415
- E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D
2416
- 5EI=
2417
- -----END CERTIFICATE-----
2418
-
2419
- Hellenic Academic and Research Institutions RootCA 2011
2420
- =======================================================
2421
- -----BEGIN CERTIFICATE-----
2422
- MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT
2423
- O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y
2424
- aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
2425
- IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT
2426
- AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
2427
- IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
2428
- IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
2429
- AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI
2430
- 1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa
2431
- 71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u
2432
- 8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH
2433
- 3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/
2434
- MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8
2435
- MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu
2436
- b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt
2437
- XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
2438
- TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD
2439
- /md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N
2440
- 7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4
2441
- -----END CERTIFICATE-----
2442
-
2443
- Actalis Authentication Root CA
2444
- ==============================
2445
- -----BEGIN CERTIFICATE-----
2446
- MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM
2447
- BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE
2448
- AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky
2449
- MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz
2450
- IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
2451
- IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ
2452
- wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa
2453
- by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6
2454
- zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f
2455
- YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2
2456
- oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l
2457
- EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7
2458
- hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8
2459
- EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5
2460
- jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY
2461
- iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
2462
- ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI
2463
- WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0
2464
- JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx
2465
- K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+
2466
- Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC
2467
- 4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo
2468
- 2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz
2469
- lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem
2470
- OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
2471
- vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
2472
- -----END CERTIFICATE-----
2473
-
2474
- Trustis FPS Root CA
2475
- ===================
2476
- -----BEGIN CERTIFICATE-----
2477
- MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG
2478
- EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290
2479
- IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV
2480
- BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ
2481
- KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ
2482
- RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk
2483
- H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa
2484
- cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt
2485
- o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA
2486
- AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd
2487
- BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c
2488
- GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC
2489
- yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P
2490
- 8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV
2491
- l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl
2492
- iB6XzCGcKQENZetX2fNXlrtIzYE=
2493
- -----END CERTIFICATE-----
2494
-
2495
- Buypass Class 2 Root CA
2496
- =======================
2497
- -----BEGIN CERTIFICATE-----
2498
- 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
- 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
- DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
2501
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
2513
- 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
- A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI
2515
- 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
- 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
- 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
- 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
- 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
- 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
- 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
2522
- rJgWVqA=
2523
- -----END CERTIFICATE-----
2524
-
2525
- Buypass Class 3 Root CA
2526
- =======================
2527
- -----BEGIN CERTIFICATE-----
2528
- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
2529
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG
2546
- 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
- ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2
2548
- KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz
2549
- 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
- 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
- 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
2552
- Cp/HuZc=
2553
- -----END CERTIFICATE-----
2554
-
2555
- T-TeleSec GlobalRoot Class 3
2556
- ============================
2557
- -----BEGIN CERTIFICATE-----
2558
- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
2559
- IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
2560
- cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx
2561
- MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
2562
- dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
2563
- ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3
2564
- DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK
2565
- 9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU
2566
- NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF
2567
- iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W
2568
- 0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA
2569
- MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr
2570
- AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb
2571
- fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT
2572
- ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h
2573
- P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
2574
- e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
2575
- -----END CERTIFICATE-----
2576
-
2577
- EE Certification Centre Root CA
2578
- ===============================
2579
- -----BEGIN CERTIFICATE-----
2580
- MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
2581
- EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy
2582
- dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw
2583
- MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB
2584
- UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy
2585
- ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
2586
- DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM
2587
- TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2
2588
- rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw
2589
- 93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN
2590
- P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T
2591
- AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ
2592
- MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF
2593
- BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj
2594
- xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM
2595
- lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
2596
- uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
2597
- 3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
2598
- dcGWxZ0=
2599
- -----END CERTIFICATE-----
2600
-
2601
- D-TRUST Root Class 3 CA 2 2009
2602
- ==============================
2603
- -----BEGIN CERTIFICATE-----
2604
- MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK
2605
- DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe
2606
- Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE
2607
- LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw
2608
- DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD
2609
- ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA
2610
- BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv
2611
- KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z
2612
- p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC
2613
- AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ
2614
- 4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y
2615
- eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw
2616
- MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G
2617
- PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw
2618
- OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm
2619
- 2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
2620
- o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV
2621
- dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph
2622
- X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=
2623
- -----END CERTIFICATE-----
2624
-
2625
- D-TRUST Root Class 3 CA 2 EV 2009
2626
- =================================
2627
- -----BEGIN CERTIFICATE-----
2628
- MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
2629
- DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
2630
- OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
2631
- DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
2632
- OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS
2633
- egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh
2634
- zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T
2635
- 7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60
2636
- sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35
2637
- 11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv
2638
- cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v
2639
- ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El
2640
- MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp
2641
- b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh
2642
- c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+
2643
- PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
2644
- nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX
2645
- ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA
2646
- NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv
2647
- w9y4AyHqnxbxLFS1
2648
- -----END CERTIFICATE-----
2649
-
2650
- CA Disig Root R2
2651
- ================
2652
- -----BEGIN CERTIFICATE-----
2653
- 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
- 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
- ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx
2656
- 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
- c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC
2658
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8
2672
- 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
- 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
- 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
- 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
- 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
2677
- 7+ZtsH8tZ/3zbBt1RqPlShfppNcL
2678
- -----END CERTIFICATE-----
2679
-
2680
- ACCVRAIZ1
2681
- =========
2682
- -----BEGIN CERTIFICATE-----
2683
- MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB
2684
- SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1
2685
- MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH
2686
- UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
2687
- DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM
2688
- jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0
2689
- RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD
2690
- aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ
2691
- 0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG
2692
- WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7
2693
- 8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR
2694
- 5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J
2695
- 9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK
2696
- Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw
2697
- Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu
2698
- Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
2699
- VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM
2700
- Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA
2701
- QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh
2702
- AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA
2703
- YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj
2704
- AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA
2705
- IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk
2706
- aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0
2707
- dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2
2708
- MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI
2709
- hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E
2710
- R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN
2711
- YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49
2712
- nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ
2713
- TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3
2714
- sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
2715
- I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg
2716
- Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd
2717
- 3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p
2718
- EfbRD0tVNEYqi4Y7
2719
- -----END CERTIFICATE-----
2720
-
2721
- TWCA Global Root CA
2722
- ===================
2723
- -----BEGIN CERTIFICATE-----
2724
- MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT
2725
- CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD
2726
- QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK
2727
- EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg
2728
- Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C
2729
- nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV
2730
- r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR
2731
- Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV
2732
- tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W
2733
- KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99
2734
- sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p
2735
- yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn
2736
- kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI
2737
- zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC
2738
- AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g
2739
- cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
2740
- LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M
2741
- 8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg
2742
- /eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg
2743
- lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP
2744
- A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m
2745
- i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8
2746
- EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3
2747
- zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0=
2748
- -----END CERTIFICATE-----
2749
-
2750
- TeliaSonera Root CA v1
2751
- ======================
2752
- -----BEGIN CERTIFICATE-----
2753
- MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE
2754
- CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4
2755
- MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW
2756
- VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+
2757
- 6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA
2758
- 3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k
2759
- B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn
2760
- Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH
2761
- oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3
2762
- F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ
2763
- oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7
2764
- gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc
2765
- TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB
2766
- AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW
2767
- DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm
2768
- zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx
2769
- 0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW
2770
- pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV
2771
- G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc
2772
- c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT
2773
- JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2
2774
- qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6
2775
- Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems
2776
- WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
2777
- -----END CERTIFICATE-----
2778
-
2779
- E-Tugra Certification Authority
2780
- ===============================
2781
- -----BEGIN CERTIFICATE-----
2782
- MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w
2783
- DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls
2784
- ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN
2785
- ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw
2786
- NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx
2787
- QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl
2788
- cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD
2789
- DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
2790
- MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd
2791
- hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K
2792
- CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g
2793
- ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ
2794
- BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0
2795
- E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz
2796
- rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq
2797
- jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn
2798
- rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5
2799
- dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB
2800
- /wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG
2801
- MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK
2802
- kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO
2803
- XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807
2804
- VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo
2805
- a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc
2806
- dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV
2807
- KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT
2808
- Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0
2809
- 8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G
2810
- C7TbO6Orb1wdtn7os4I07QZcJA==
2811
- -----END CERTIFICATE-----
2812
-
2813
- T-TeleSec GlobalRoot Class 2
2814
- ============================
2815
- -----BEGIN CERTIFICATE-----
2816
- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
2817
- IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
2818
- cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx
2819
- MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
2820
- dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
2821
- ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3
2822
- DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ
2823
- SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F
2824
- vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970
2825
- 2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV
2826
- WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA
2827
- MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy
2828
- YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4
2829
- r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf
2830
- vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR
2831
- 3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
2832
- 9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg==
2833
- -----END CERTIFICATE-----
2834
-
2835
- Atos TrustedRoot 2011
2836
- =====================
2837
- -----BEGIN CERTIFICATE-----
2838
- MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU
2839
- cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4
2840
- MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG
2841
- A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV
2842
- hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr
2843
- 54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+
2844
- DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320
2845
- HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR
2846
- z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R
2847
- l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ
2848
- bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
2849
- CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h
2850
- k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh
2851
- TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9
2852
- 61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G
2853
- 3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
2854
- -----END CERTIFICATE-----
2855
-
2856
- QuoVadis Root CA 1 G3
2857
- =====================
2858
- -----BEGIN CERTIFICATE-----
2859
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN
2867
- 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
- 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
- 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
- 9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f
2871
- 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
- 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
- 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
- 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
- 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
- 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
- Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP
2878
- +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
- 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
- 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
- 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
- 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
2883
- hMJKzRwuJIczYOXD
2884
- -----END CERTIFICATE-----
2885
-
2886
- QuoVadis Root CA 2 G3
2887
- =====================
2888
- -----BEGIN CERTIFICATE-----
2889
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9
2907
- 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
- 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
- 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
- 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
- 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
- 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
2913
- O3jtZsSOeWmD3n+M
2914
- -----END CERTIFICATE-----
2915
-
2916
- QuoVadis Root CA 3 G3
2917
- =====================
2918
- -----BEGIN CERTIFICATE-----
2919
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
2943
- PpxxVJkES/1Y+Zj0
2944
- -----END CERTIFICATE-----
2945
-
2946
- DigiCert Assured ID Root G2
2947
- ===========================
2948
- -----BEGIN CERTIFICATE-----
2949
- MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG
2950
- EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
2951
- IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw
2952
- MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
2953
- ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw
2954
- ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH
2955
- 35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq
2956
- bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw
2957
- VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP
2958
- YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn
2959
- lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO
2960
- w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv
2961
- 0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz
2962
- d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW
2963
- hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M
2964
- jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
2965
- IhNzbM8m9Yop5w==
2966
- -----END CERTIFICATE-----
2967
-
2968
- DigiCert Assured ID Root G3
2969
- ===========================
2970
- -----BEGIN CERTIFICATE-----
2971
- MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV
2972
- UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD
2973
- VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
2974
- MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
2975
- d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ
2976
- BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb
2977
- RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs
2978
- KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF
2979
- UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy
2980
- YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy
2981
- 1vUhZscv6pZjamVFkpUBtA==
2982
- -----END CERTIFICATE-----
2983
-
2984
- DigiCert Global Root G2
2985
- =======================
2986
- -----BEGIN CERTIFICATE-----
2987
- MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG
2988
- EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
2989
- HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx
2990
- MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
2991
- dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq
2992
- hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ
2993
- kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO
2994
- 3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV
2995
- BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM
2996
- UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB
2997
- o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu
2998
- 5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr
2999
- F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U
3000
- WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH
3001
- QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/
3002
- iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
3003
- MrY=
3004
- -----END CERTIFICATE-----
3005
-
3006
- DigiCert Global Root G3
3007
- =======================
3008
- -----BEGIN CERTIFICATE-----
3009
- MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV
3010
- UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD
3011
- VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw
3012
- MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k
3013
- aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C
3014
- AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O
3015
- YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP
3016
- BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp
3017
- Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y
3018
- 3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34
3019
- VOKa5Vt8sycX
3020
- -----END CERTIFICATE-----
3021
-
3022
- DigiCert Trusted Root G4
3023
- ========================
3024
- -----BEGIN CERTIFICATE-----
3025
- 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
- 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
- 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
- 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
- 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
- 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
- pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o
3032
- 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
- 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
- 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
- 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
- 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
- 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
- dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8
3039
- 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
- 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
- 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
- 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
- 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
- 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
- ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN
3046
- 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
- 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
- 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
- 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
3050
- 82Z+
3051
- -----END CERTIFICATE-----
3052
-
3053
- COMODO RSA Certification Authority
3054
- ==================================
3055
- -----BEGIN CERTIFICATE-----
3056
- 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
- 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
- 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
- biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC
3060
- 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
- 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
- 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
- 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
- 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
- 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
- x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX
3067
- 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
- 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
- sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C
3070
- 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
- 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
- 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
- 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
- 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
- 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
- tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW
3077
- 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
- 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
- zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq
3080
- 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
- 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
3082
- LaZRfyHBNVOFBkpdn627G190
3083
- -----END CERTIFICATE-----
3084
-
3085
- USERTrust RSA Certification Authority
3086
- =====================================
3087
- -----BEGIN CERTIFICATE-----
3088
- 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
- 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
- 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
- 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
- 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
- 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
- dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz
3095
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM
3109
- 8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi
3110
- 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
- yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c
3112
- 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
- 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
3114
- Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9
3115
- -----END CERTIFICATE-----
3116
-
3117
- USERTrust ECC Certification Authority
3118
- =====================================
3119
- -----BEGIN CERTIFICATE-----
3120
- MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC
3121
- VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
3122
- aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
3123
- biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC
3124
- VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
3125
- aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
3126
- biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2
3127
- 0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez
3128
- nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV
3129
- HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB
3130
- HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu
3131
- 9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
3132
- -----END CERTIFICATE-----
3133
-
3134
- GlobalSign ECC Root CA - R4
3135
- ===========================
3136
- -----BEGIN CERTIFICATE-----
3137
- MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb
3138
- R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
3139
- EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
3140
- R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
3141
- EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl
3142
- OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P
3143
- AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV
3144
- MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF
3145
- JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q=
3146
- -----END CERTIFICATE-----
3147
-
3148
- GlobalSign ECC Root CA - R5
3149
- ===========================
3150
- -----BEGIN CERTIFICATE-----
3151
- MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb
3152
- R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
3153
- EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
3154
- R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
3155
- EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6
3156
- SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS
3157
- h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
3158
- BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx
3159
- uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7
3160
- yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3
3161
- -----END CERTIFICATE-----
3162
-
3163
- Staat der Nederlanden Root CA - G3
3164
- ==================================
3165
- -----BEGIN CERTIFICATE-----
3166
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1
3184
- v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA
3185
- 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
- 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
- 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
- 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
- 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
- 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
3191
- -----END CERTIFICATE-----
3192
-
3193
- Staat der Nederlanden EV Root CA
3194
- ================================
3195
- -----BEGIN CERTIFICATE-----
3196
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8
3204
- 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
- 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
- 08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV
3207
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
3220
- eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg==
3221
- -----END CERTIFICATE-----
3222
-
3223
- IdenTrust Commercial Root CA 1
3224
- ==============================
3225
- -----BEGIN CERTIFICATE-----
3226
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH
3242
- 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
- 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
- ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV
3245
- 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
- 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
- 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
- 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
- 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
3250
- cGzM7vRX+Bi6hG6H
3251
- -----END CERTIFICATE-----
3252
-
3253
- IdenTrust Public Sector Root CA 1
3254
- =================================
3255
- -----BEGIN CERTIFICATE-----
3256
- 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
- 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
- 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
- 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
- b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy
3261
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw
3271
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
3280
- 3Wl9af0AVqW3rLatt8o+Ae+c
3281
- -----END CERTIFICATE-----
3282
-
3283
- Entrust Root Certification Authority - G2
3284
- =========================================
3285
- -----BEGIN CERTIFICATE-----
3286
- MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV
3287
- BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy
3288
- bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug
3289
- b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw
3290
- HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT
3291
- DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx
3292
- OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s
3293
- eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi
3294
- MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP
3295
- /vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz
3296
- HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU
3297
- s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y
3298
- TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx
3299
- AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6
3300
- 0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z
3301
- iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
3302
- Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi
3303
- nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+
3304
- vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO
3305
- e4pIb4tF9g==
3306
- -----END CERTIFICATE-----
3307
-
3308
- Entrust Root Certification Authority - EC1
3309
- ==========================================
3310
- -----BEGIN CERTIFICATE-----
3311
- MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx
3312
- FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn
3313
- YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl
3314
- ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
3315
- IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw
3316
- FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs
3317
- LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg
3318
- dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
3319
- IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy
3320
- AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef
3321
- 9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
3322
- FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h
3323
- vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8
3324
- kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
3325
- -----END CERTIFICATE-----
3326
-
3327
- CFCA EV ROOT
3328
- ============
3329
- -----BEGIN CERTIFICATE-----
3330
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f
3340
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
3355
- -----END CERTIFICATE-----
3356
-
3357
- TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5
3358
- ====================================================
3359
- -----BEGIN CERTIFICATE-----
3360
- MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN
3361
- BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
3362
- bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1Qg
3363
- RWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAw
3364
- ODA3MDFaFw0yMzA0MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0w
3365
- SwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnE
3366
- n2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRp
3367
- ZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
3368
- CgKCAQEApCUZ4WWe60ghUEoI5RHwWrom/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537
3369
- jVJp45wnEFPzpALFp/kRGml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1m
3370
- ep5Fimh34khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z5UNP
3371
- 9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0hO8EuPbJbKoCPrZV
3372
- 4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QIDAQABo0IwQDAdBgNVHQ4EFgQUVpkH
3373
- HtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
3374
- hvcNAQELBQADggEBAJ5FdnsXSDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPo
3375
- BP5yCccLqh0lVX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq
3376
- URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nfpeYVhDfwwvJl
3377
- lpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CFYv4HAqGEVka+lgqaE9chTLd8
3378
- B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU=
3379
- -----END CERTIFICATE-----
3380
-
3381
- Certinomis - Root CA
3382
- ====================
3383
- -----BEGIN CERTIFICATE-----
3384
- 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
- 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
- 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
- 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
- ZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos
3389
- 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
- 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
- z8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00
3392
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- cyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr
3409
- hkIGuUE=
3410
- -----END CERTIFICATE-----
3411
-
3412
- OISTE WISeKey Global Root GB CA
3413
- ===============================
3414
- -----BEGIN CERTIFICATE-----
3415
- MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG
3416
- EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
3417
- ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw
3418
- MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD
3419
- VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds
3420
- b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX
3421
- scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP
3422
- rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk
3423
- 9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o
3424
- Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg
3425
- GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
3426
- /zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI
3427
- hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD
3428
- dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0
3429
- VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui
3430
- HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
3431
- Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
3432
- -----END CERTIFICATE-----
3433
-
3434
- SZAFIR ROOT CA2
3435
- ===============
3436
- -----BEGIN CERTIFICATE-----
3437
- MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG
3438
- A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV
3439
- BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ
3440
- BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD
3441
- VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q
3442
- qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK
3443
- DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE
3444
- 2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ
3445
- ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi
3446
- ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
3447
- AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC
3448
- AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5
3449
- O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67
3450
- oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul
3451
- 4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6
3452
- +/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw==
3453
- -----END CERTIFICATE-----
3454
-
3455
- Certum Trusted Network CA 2
3456
- ===========================
3457
- -----BEGIN CERTIFICATE-----
3458
- MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE
3459
- BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1
3460
- bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y
3461
- ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ
3462
- TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl
3463
- cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB
3464
- IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9
3465
- 7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o
3466
- CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b
3467
- Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p
3468
- uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130
3469
- GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ
3470
- 9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB
3471
- Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye
3472
- hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM
3473
- BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
3474
- AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI
3475
- hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW
3476
- Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA
3477
- L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo
3478
- clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM
3479
- pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb
3480
- w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo
3481
- J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm
3482
- ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX
3483
- is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7
3484
- zAYspsbiDrW5viSP
3485
- -----END CERTIFICATE-----
3486
-
3487
- Hellenic Academic and Research Institutions RootCA 2015
3488
- =======================================================
3489
- -----BEGIN CERTIFICATE-----
3490
- MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT
3491
- BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0
3492
- aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl
3493
- YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx
3494
- MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg
3495
- QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV
3496
- BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw
3497
- MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv
3498
- bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh
3499
- iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+
3500
- 6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd
3501
- FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr
3502
- i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F
3503
- GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2
3504
- fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu
3505
- iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc
3506
- Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
3507
- AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI
3508
- hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+
3509
- D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM
3510
- d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y
3511
- d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn
3512
- 82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb
3513
- davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F
3514
- Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt
3515
- J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa
3516
- JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q
3517
- p/UsQu0yrbYhnr68
3518
- -----END CERTIFICATE-----
3519
-
3520
- Hellenic Academic and Research Institutions ECC RootCA 2015
3521
- ===========================================================
3522
- -----BEGIN CERTIFICATE-----
3523
- MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0
3524
- aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u
3525
- cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj
3526
- aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw
3527
- MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj
3528
- IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD
3529
- VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290
3530
- Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP
3531
- dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK
3532
- Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
3533
- BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA
3534
- GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn
3535
- dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR
3536
- -----END CERTIFICATE-----
3537
-
3538
- Certplus Root CA G1
3539
- ===================
3540
- -----BEGIN CERTIFICATE-----
3541
- MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUAMD4xCzAJBgNV
3542
- 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
- Fw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhD
3544
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
3565
- qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo=
3566
- -----END CERTIFICATE-----
3567
-
3568
- Certplus Root CA G2
3569
- ===================
3570
- -----BEGIN CERTIFICATE-----
3571
- MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4xCzAJBgNVBAYT
3572
- AkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjAeFw0x
3573
- NDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0
3574
- cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IA
3575
- BM0PW1aC3/BFGtat93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uN
3576
- Am8xIk0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0PAQH/BAQD
3577
- AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMB8GA1Ud
3578
- IwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqGSM49BAMDA2gAMGUCMHD+sAvZ94OX7PNV
3579
- HdTcswYO/jOYnYs5kGuUIe22113WTNchp+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjl
3580
- vPl5adytRSv3tjFzzAalU5ORGpOucGpnutee5WEaXw==
3581
- -----END CERTIFICATE-----
3582
-
3583
- OpenTrust Root CA G1
3584
- ====================
3585
- -----BEGIN CERTIFICATE-----
3586
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYYEQRVzXR7z2FwefR7LFxckvzluFqr
3599
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- nR14SohWZ25g/4/Ii+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcm
3607
- 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
- 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
- 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
3610
- OXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj1oxx
3611
- -----END CERTIFICATE-----
3612
-
3613
- OpenTrust Root CA G2
3614
- ====================
3615
- -----BEGIN CERTIFICATE-----
3616
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- eYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fEFY8ElggGQgT4hNYdvJGmQr5J1WqIP7wt
3624
- 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
- 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
- 3CzMpSZyYhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaHvGOz
3627
- 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
- 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
- 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
- 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
- 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
- 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
- mUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qTRmTFAHneIWv2V6CG1wZy7HBG
3634
- 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
- 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
- 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
- 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
- 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
- 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
3640
- u7JwqkwR3v98KzfUetF3NI/n+UL3PIEMS1IK
3641
- -----END CERTIFICATE-----
3642
-
3643
- OpenTrust Root CA G3
3644
- ====================
3645
- -----BEGIN CERTIFICATE-----
3646
- MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAxCzAJBgNVBAYT
3647
- AkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEczMB4X
3648
- DTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9w
3649
- ZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQA
3650
- IgNiAARK7liuTcpm3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5B
3651
- ta1doYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4GA1UdDwEB
3652
- /wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAf
3653
- BgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAKBggqhkjOPQQDAwNpADBmAjEAj6jcnboM
3654
- BBf6Fek9LykBl7+BFjNAk2z8+e2AcG+qj9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta
3655
- 3U1fJAuwACEl74+nBCZx4nxp5V2a+EEfOzmTk51V6s2N8fvB
3656
- -----END CERTIFICATE-----
3657
-
3658
- ISRG Root X1
3659
- ============
3660
- -----BEGIN CERTIFICATE-----
3661
- MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE
3662
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
3685
- m+kXQ99b21/+jh5Xos1AnX5iItreGCc=
3686
- -----END CERTIFICATE-----
3687
-
3688
- AC RAIZ FNMT-RCM
3689
- ================
3690
- -----BEGIN CERTIFICATE-----
3691
- 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
- AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw
3693
- 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
- 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
- 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
- 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
- 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
- j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou
3699
- 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
- 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
- tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ
3702
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7
3712
- 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
- 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
- 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
- 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
3716
- -----END CERTIFICATE-----
3717
-
3718
- Amazon Root CA 1
3719
- ================
3720
- -----BEGIN CERTIFICATE-----
3721
- MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD
3722
- VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1
3723
- MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
3724
- bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
3725
- ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH
3726
- FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ
3727
- gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t
3728
- dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce
3729
- VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
3730
- /zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3
3731
- DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM
3732
- CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy
3733
- 8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa
3734
- 2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2
3735
- xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5
3736
- -----END CERTIFICATE-----
3737
-
3738
- Amazon Root CA 2
3739
- ================
3740
- -----BEGIN CERTIFICATE-----
3741
- MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD
3742
- VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1
3743
- MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
3744
- bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
3745
- ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4
3746
- kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp
3747
- N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9
3748
- AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd
3749
- fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx
3750
- kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS
3751
- btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0
3752
- Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN
3753
- c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+
3754
- 3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw
3755
- DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA
3756
- A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY
3757
- +gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE
3758
- YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW
3759
- xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ
3760
- gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW
3761
- aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV
3762
- Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3
3763
- KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi
3764
- JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw=
3765
- -----END CERTIFICATE-----
3766
-
3767
- Amazon Root CA 3
3768
- ================
3769
- -----BEGIN CERTIFICATE-----
3770
- MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG
3771
- EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy
3772
- NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
3773
- MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB
3774
- f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr
3775
- Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43
3776
- rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc
3777
- eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw==
3778
- -----END CERTIFICATE-----
3779
-
3780
- Amazon Root CA 4
3781
- ================
3782
- -----BEGIN CERTIFICATE-----
3783
- MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG
3784
- EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy
3785
- NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
3786
- MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN
3787
- /sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri
3788
- 83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
3789
- HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA
3790
- MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1
3791
- AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA==
3792
- -----END CERTIFICATE-----
3793
-
3794
- LuxTrust Global Root 2
3795
- ======================
3796
- -----BEGIN CERTIFICATE-----
3797
- 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
- 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
- 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
- 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
- AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wm
3802
- Kb3FibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTemhfY7RBi2
3803
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- TxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKrezrnK+T+Tb/mjuuqlPpmt
3820
- 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
- 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
- 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
3823
- -----END CERTIFICATE-----
3824
-
3825
- TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1
3826
- =============================================
3827
- -----BEGIN CERTIFICATE-----
3828
- MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT
3829
- D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr
3830
- IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g
3831
- TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp
3832
- ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD
3833
- VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt
3834
- c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth
3835
- bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11
3836
- IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
3837
- MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8
3838
- 6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc
3839
- wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0
3840
- 3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9
3841
- WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU
3842
- ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ
3843
- KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh
3844
- AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc
3845
- lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R
3846
- e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j
3847
- q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM=
3848
- -----END CERTIFICATE-----
3849
-
3850
- GDCA TrustAUTH R5 ROOT
3851
- ======================
3852
- -----BEGIN CERTIFICATE-----
3853
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ
3865
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
3878
- -----END CERTIFICATE-----
3879
-
3880
- TrustCor RootCert CA-1
3881
- ======================
3882
- -----BEGIN CERTIFICATE-----
3883
- MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYDVQQGEwJQQTEP
3884
- MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig
3885
- U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp
3886
- dHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkx
3887
- MjMxMTcyMzE2WjCBpDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFu
3888
- YW1hIENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUGA1UECwwe
3889
- VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZUcnVzdENvciBSb290Q2Vy
3890
- dCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv463leLCJhJrMxnHQFgKq1mq
3891
- jQCj/IDHUHuO1CAmujIS2CNUSSUQIpidRtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4
3892
- pQa81QBeCQryJ3pS/C3Vseq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0
3893
- JEsq1pme9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CVEY4h
3894
- gLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorWhnAbJN7+KIor0Gqw
3895
- /Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/DeOxCbeKyKsZn3MzUOcwHwYDVR0j
3896
- BBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
3897
- AYYwDQYJKoZIhvcNAQELBQADggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5
3898
- mDo4Nvu7Zp5I/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf
3899
- ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZyonnMlo2HD6C
3900
- qFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djtsL1Ac59v2Z3kf9YKVmgenFK+P
3901
- 3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdNzl/HHk484IkzlQsPpTLWPFp5LBk=
3902
- -----END CERTIFICATE-----
3903
-
3904
- TrustCor RootCert CA-2
3905
- ======================
3906
- -----BEGIN CERTIFICATE-----
3907
- MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNVBAYTAlBBMQ8w
3908
- DQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQwIgYDVQQKDBtUcnVzdENvciBT
3909
- eXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0
3910
- eTEfMB0GA1UEAwwWVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEy
3911
- MzExNzI2MzlaMIGkMQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5h
3912
- bWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U
3913
- cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0
3914
- IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnIG7CKqJiJJWQdsg4foDSq8Gb
3915
- ZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9Nk
3916
- RvRUqdw6VC0xK5mC8tkq1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1
3917
- oYxOdqHp2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nKDOOb
3918
- XUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hapeaz6LMvYHL1cEksr1
3919
- /p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF3wP+TfSvPd9cW436cOGlfifHhi5q
3920
- jxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQP
3921
- eSghYA2FFn3XVDjxklb9tTNMg9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+Ctg
3922
- rKAmrhQhJ8Z3mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh
3923
- 8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAdBgNVHQ4EFgQU
3924
- 2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6UnrybPZx9mCAZ5YwwYrIwDwYD
3925
- VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/h
3926
- Osh80QA9z+LqBrWyOrsGS2h60COXdKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnp
3927
- kpfbsEZC89NiqpX+MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv
3928
- 2wnL/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RXCI/hOWB3
3929
- S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYaZH9bDTMJBzN7Bj8RpFxw
3930
- PIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dv
3931
- DDqPys/cA8GiCcjl/YBeyGBCARsaU1q7N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYU
3932
- RpFHmygk71dSTlxCnKr3Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANE
3933
- xdqtvArBAs8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp5KeX
3934
- RKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu1uwJ
3935
- -----END CERTIFICATE-----
3936
-
3937
- TrustCor ECA-1
3938
- ==============
3939
- -----BEGIN CERTIFICATE-----
3940
- MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYDVQQGEwJQQTEP
3941
- MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig
3942
- U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp
3943
- dHkxFzAVBgNVBAMMDlRydXN0Q29yIEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3Mjgw
3944
- N1owgZwxCzAJBgNVBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5
3945
- MSQwIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29y
3946
- IENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3IgRUNBLTEwggEiMA0GCSqG
3947
- SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb3w9U73NjKYKtR8aja+3+XzP4Q1HpGjOR
3948
- MRegdMTUpwHmspI+ap3tDvl0mEDTPwOABoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23
3949
- xFUfJ3zSCNV2HykVh0A53ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmc
3950
- p0yJF4OuowReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/wZ0+
3951
- fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZFZtS6mFjBAgMBAAGj
3952
- YzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAfBgNVHSMEGDAWgBREnkj1zG1I1KBL
3953
- f/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF
3954
- AAOCAQEABT41XBVwm8nHc2FvcivUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u
3955
- /ukZMjgDfxT2AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F
3956
- hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50soIipX1TH0Xs
3957
- J5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BIWJZpTdwHjFGTot+fDz2LYLSC
3958
- jaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1WitJ/X5g==
3959
- -----END CERTIFICATE-----
3960
-
3961
- SSL.com Root Certification Authority RSA
3962
- ========================================
3963
- -----BEGIN CERTIFICATE-----
3964
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- fBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93EJNyAKoFBbZQ+yODJ
3976
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- u1OJD7OAUN5F7kR/q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjq
3985
- erQ0cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jra6x+3uxj
3986
- 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
- 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
- Pb9s2KJELtFOt3JY04kTlf5Eq/jXixtunLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406y
3989
- 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
3990
- WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k=
3991
- -----END CERTIFICATE-----
3992
-
3993
- SSL.com Root Certification Authority ECC
3994
- ========================================
3995
- -----BEGIN CERTIFICATE-----
3996
- MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV
3997
- BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv
3998
- BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy
3999
- MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO
4000
- BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv
4001
- bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA
4002
- BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+
4003
- 8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR
4004
- hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT
4005
- jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW
4006
- e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z
4007
- 5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl
4008
- -----END CERTIFICATE-----
4009
-
4010
- SSL.com EV Root Certification Authority RSA R2
4011
- ==============================================
4012
- -----BEGIN CERTIFICATE-----
4013
- MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w
4014
- DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u
4015
- MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy
4016
- MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI
4017
- DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD
4018
- VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN
4019
- BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh
4020
- hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w
4021
- cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO
4022
- Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+
4023
- B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh
4024
- CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim
4025
- 9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto
4026
- RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm
4027
- JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48
4028
- +qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV
4029
- HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp
4030
- qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1
4031
- ++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx
4032
- Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G
4033
- guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz
4034
- OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7
4035
- CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq
4036
- lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR
4037
- rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1
4038
- hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX
4039
- 9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w==
4040
- -----END CERTIFICATE-----
4041
-
4042
- SSL.com EV Root Certification Authority ECC
4043
- ===========================================
4044
- -----BEGIN CERTIFICATE-----
4045
- MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV
4046
- BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy
4047
- BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw
4048
- MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx
4049
- EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM
4050
- LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB
4051
- BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy
4052
- 3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O
4053
- BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe
4054
- 5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ
4055
- N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm
4056
- m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg==
4057
- -----END CERTIFICATE-----
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lib/class-ga-lib-api-client-exception.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Google API client exception.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ /**
9
+ * Google API Client exception.
10
+ */
11
+ class Ga_Lib_Api_Client_Exception extends Exception {
12
+
13
+ }
lib/{Ga_Lib_Api_Client.php → class-ga-lib-api-client.php} RENAMED
@@ -1,15 +1,25 @@
1
  <?php
 
 
 
 
 
2
 
 
 
 
3
  abstract class Ga_Lib_Api_Client {
4
 
5
  /**
6
  * Keeps error messages.
 
7
  * @var array
8
  */
9
  protected $errors = array();
10
 
11
  /**
12
  * Returns errors array.
 
13
  * @return array
14
  */
15
  public function get_errors() {
@@ -19,24 +29,24 @@ abstract class Ga_Lib_Api_Client {
19
  /**
20
  * Calls private API method from context client.
21
  *
22
- * @param $callback
23
- * @param $args
24
  *
25
  * @return Ga_Lib_Api_Response
26
  */
27
- abstract function call_api_method( $callback, $args );
28
 
29
  /**
30
  * Calls api methods.
31
  *
32
- * @param string $callback
33
- * @param mixed $args
34
  *
35
  * @return mixed
36
  */
37
  public function call( $callback, $args = null ) {
38
  try {
39
- delete_option('googleanalytics_sherethis_error_log');
40
  return $this->call_api_method( $callback, $args );
41
  } catch ( Ga_Lib_Api_Client_Exception $e ) {
42
  $this->add_error( $e );
@@ -56,20 +66,29 @@ abstract class Ga_Lib_Api_Client {
56
  /**
57
  * Prepares error data.
58
  *
59
- * @param Exception $e
60
- *
61
  */
62
  protected function add_error( Exception $e ) {
63
- $this->errors[ $e->getCode() ] = array( 'class' => get_class( $e ), 'message' => $e->getMessage() );
 
 
 
64
  do_action( 'st_support_save_error', $e );
65
  }
66
 
 
 
 
 
 
 
 
 
 
67
  public function add_own_error( $code, $message, $class = '' ) {
68
- $this->errors[ $code ] = array( 'class' => $class, 'message' => $message );
 
 
 
69
  }
70
-
71
- }
72
-
73
- class Ga_Lib_Api_Client_Exception extends Exception {
74
-
75
  }
1
  <?php
2
+ /**
3
+ * Google API Client.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
 
8
+ /**
9
+ * Google API Client.
10
+ */
11
  abstract class Ga_Lib_Api_Client {
12
 
13
  /**
14
  * Keeps error messages.
15
+ *
16
  * @var array
17
  */
18
  protected $errors = array();
19
 
20
  /**
21
  * Returns errors array.
22
+ *
23
  * @return array
24
  */
25
  public function get_errors() {
29
  /**
30
  * Calls private API method from context client.
31
  *
32
+ * @param callable $callback Callable function.
33
+ * @param array $args Array of arguments.
34
  *
35
  * @return Ga_Lib_Api_Response
36
  */
37
+ abstract public function call_api_method( $callback, $args );
38
 
39
  /**
40
  * Calls api methods.
41
  *
42
+ * @param string $callback Callback method name.
43
+ * @param mixed $args Arguments.
44
  *
45
  * @return mixed
46
  */
47
  public function call( $callback, $args = null ) {
48
  try {
49
+ delete_option( 'googleanalytics_sherethis_error_log' );
50
  return $this->call_api_method( $callback, $args );
51
  } catch ( Ga_Lib_Api_Client_Exception $e ) {
52
  $this->add_error( $e );
66
  /**
67
  * Prepares error data.
68
  *
69
+ * @param Exception $e Exception.
 
70
  */
71
  protected function add_error( Exception $e ) {
72
+ $this->errors[ $e->getCode() ] = array(
73
+ 'class' => get_class( $e ),
74
+ 'message' => $e->getMessage(),
75
+ );
76
  do_action( 'st_support_save_error', $e );
77
  }
78
 
79
+ /**
80
+ * Add own error.
81
+ *
82
+ * @param string $code Code string.
83
+ * @param string $message Message.
84
+ * @param string $class Class name.
85
+ *
86
+ * @return void
87
+ */
88
  public function add_own_error( $code, $message, $class = '' ) {
89
+ $this->errors[ $code ] = array(
90
+ 'class' => $class,
91
+ 'message' => $message,
92
+ );
93
  }
 
 
 
 
 
94
  }
lib/class-ga-lib-api-request-exception.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Google API request exception.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ /**
9
+ * Google API request exception.
10
+ */
11
+ class Ga_Lib_Api_Request_Exception extends Exception {
12
+ }
lib/class-ga-lib-api-request.php ADDED
@@ -0,0 +1,241 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * API Request library.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ // phpcs:disable Squiz.Commenting.FunctionCommentThrowTag.WrongNumber
9
+ // phpcs:disable WordPress.WP.AlternativeFunctions
10
+ // NOTE: Alternative function recommendation for curl noted! Plans to switch to google service library in backlog.
11
+
12
+ require_once 'class-ga-lib-api-request-exception.php';
13
+
14
+ /**
15
+ * API Request Library response.
16
+ */
17
+ class Ga_Lib_Api_Request {
18
+
19
+ /**
20
+ * Instance object.
21
+ *
22
+ * @var Ga_Lib_Api_Request|null
23
+ */
24
+ public static $instance = null;
25
+
26
+ const HEADER_CONTENT_TYPE = 'application/x-www-form-urlencoded';
27
+ const HEADER_CONTENT_TYPE_JSON = 'Content-type: application/json';
28
+ const HEADER_ACCEPT = 'Accept: application/json, text/javascript, */*; q=0.01';
29
+ const TIMEOUT = 5;
30
+ const USER_AGENT = 'googleanalytics-wordpress-plugin';
31
+
32
+ /**
33
+ * Headers array.
34
+ *
35
+ * @var array
36
+ */
37
+ private $headers = array();
38
+
39
+ /**
40
+ * Whether to cache or not.
41
+ *
42
+ * @var bool
43
+ */
44
+ private $cache = false;
45
+
46
+ /**
47
+ * Appendix.
48
+ *
49
+ * @var string
50
+ */
51
+ private $appendix = '';
52
+
53
+ /**
54
+ * Constructor.
55
+ *
56
+ * @param bool $cache Whether to cache or not.
57
+ * @param string $appendix Appendix string.
58
+ */
59
+ private function __construct( $cache = false, $appendix = '' ) {
60
+ $this->cache = $cache;
61
+ $this->appendix = $appendix;
62
+ }
63
+
64
+ /**
65
+ * Returns API client instance.
66
+ *
67
+ * @param bool $cache Whether to cache.
68
+ * @param string $appendix Appendix string.
69
+ *
70
+ * @return Ga_Lib_Api_Request|null
71
+ */
72
+ public static function get_instance( $cache = false, $appendix = '' ) {
73
+ if ( null === self::$instance ) {
74
+ self::$instance = new Ga_Lib_Api_Request( $cache, $appendix );
75
+ }
76
+
77
+ return self::$instance;
78
+ }
79
+
80
+ /**
81
+ * Sets request headers.
82
+ *
83
+ * @param array|mixed $headers Headers array.
84
+ */
85
+ public function set_request_headers( $headers ) {
86
+ if ( is_array( $headers ) ) {
87
+ $this->headers = array_merge( $this->headers, $headers );
88
+ } else {
89
+ $this->headers[] = $headers;
90
+ }
91
+ }
92
+
93
+ /**
94
+ * Perform HTTP request.
95
+ *
96
+ * @param string $url URL address.
97
+ * @param string $raw_post_body Raw Post body.
98
+ * @param boolean $json Whether to append JSON content type.
99
+ * @param boolean $force_no_cache Whether to force not to cache response data even if cache property is set to true.
100
+ *
101
+ * @return array Response object.
102
+ * @throws Exception Throws exception on error.
103
+ */
104
+ public function make_request( $url, $raw_post_body = null, $json = false, $force_no_cache = false ) {
105
+ // Return cached data if exist.
106
+ if ( false === $force_no_cache ) {
107
+ if ( $this->cache ) {
108
+ $wp_transient_name = Ga_Cache::get_transient_name( $url, $raw_post_body, $this->appendix );
109
+ $cached = Ga_Cache::get_cached_result( $wp_transient_name );
110
+
111
+ if ( false === empty( $cache ) ) {
112
+ if ( ! Ga_Cache::is_data_cache_outdated( $wp_transient_name, $this->appendix ) ) {
113
+ return $cached;
114
+ }
115
+ }
116
+
117
+ // Check if the next request after error is allowed.
118
+ if ( false === Ga_Cache::is_next_request_allowed( $wp_transient_name ) ) {
119
+ throw new Ga_Lib_Api_Client_Exception(
120
+ __( 'There are temporary connection issues, please try again later.' )
121
+ );
122
+ }
123
+ }
124
+ }
125
+
126
+ if ( false === function_exists( 'curl_init' ) ) {
127
+ throw new Ga_Lib_Api_Client_Exception(
128
+ __( 'cURL functions are not available' )
129
+ );
130
+ }
131
+
132
+ // Set default headers.
133
+ $this->set_request_headers(
134
+ array(
135
+ ( $json ? self::HEADER_CONTENT_TYPE_JSON : self::HEADER_CONTENT_TYPE ),
136
+ self::HEADER_ACCEPT,
137
+ )
138
+ );
139
+
140
+ $ch = curl_init( $url );
141
+ $headers = $this->headers;
142
+
143
+ $curl_timeout = self::TIMEOUT;
144
+ $php_execution_time = ini_get( 'max_execution_time' );
145
+ if ( false === empty( $php_execution_time ) && true === is_numeric( $php_execution_time ) ) {
146
+ if ( $php_execution_time < 36 && $php_execution_time > 9 ) {
147
+ $curl_timeout = $php_execution_time - 5;
148
+ } elseif ( $php_execution_time < 10 ) {
149
+ $curl_timeout = 5;
150
+ }
151
+ }
152
+
153
+ // Set the proxy configuration. The user can provide this in wp-config.php.
154
+ if ( defined( 'WP_PROXY_HOST' ) ) {
155
+ curl_setopt( $ch, CURLOPT_PROXY, WP_PROXY_HOST );
156
+ }
157
+ if ( defined( 'WP_PROXY_PORT' ) ) {
158
+ curl_setopt( $ch, CURLOPT_PROXYPORT, WP_PROXY_PORT );
159
+ }
160
+ if ( defined( 'WP_PROXY_USERNAME' ) ) {
161
+ $auth = WP_PROXY_USERNAME;
162
+ if ( defined( 'WP_PROXY_PASSWORD' ) ) {
163
+ $auth .= ':' . WP_PROXY_PASSWORD;
164
+ }
165
+ curl_setopt( $ch, CURLOPT_PROXYUSERPWD, $auth );
166
+ }
167
+
168
+ curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $curl_timeout );
169
+ curl_setopt( $ch, CURLOPT_TIMEOUT, $curl_timeout );
170
+ curl_setopt( $ch, CURLOPT_HEADER, true );
171
+ curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, true );
172
+ curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 2 );
173
+
174
+ if ( false === function_exists( 'ini_get' ) || false === ini_get( 'curl.cainfo' ) ) {
175
+ curl_setopt( $ch, CURLOPT_CAINFO, $this->get_cert_path() );
176
+ }
177
+
178
+ curl_setopt( $ch, CURLINFO_HEADER_OUT, true );
179
+ curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );
180
+ curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
181
+ curl_setopt( $ch, CURLOPT_USERAGENT, self::USER_AGENT );
182
+ if ( defined( 'CURLOPT_IPRESOLVE' ) && defined( 'CURL_IPRESOLVE_V4' ) ) {
183
+ curl_setopt( $ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
184
+ }
185
+
186
+ // POST body.
187
+ if ( false === empty( $raw_post_body ) ) {
188
+ curl_setopt( $ch, CURLOPT_POST, true );
189
+ curl_setopt(
190
+ $ch,
191
+ CURLOPT_POSTFIELDS,
192
+ ( $json ? $raw_post_body : http_build_query( $raw_post_body, null, '&' ) )
193
+ );
194
+ }
195
+
196
+ // Execute request.
197
+ $response = curl_exec( $ch );
198
+ $error = curl_error( $ch );
199
+
200
+ if ( false === empty( $error ) ) {
201
+ $errno = curl_errno( $ch );
202
+ curl_close( $ch );
203
+
204
+ // Store last cache time when unsuccessful.
205
+ if ( false === $force_no_cache && true === $this->cache ) {
206
+ Ga_Cache::set_last_cache_time( $wp_transient_name );
207
+ Ga_Cache::set_last_time_attempt();
208
+ }
209
+
210
+ throw new Ga_Lib_Api_Client_Exception( $error . ' (' . $errno . ')' );
211
+ } else {
212
+ $http_code = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
213
+ $header_size = curl_getinfo( $ch, CURLINFO_HEADER_SIZE );
214
+ $header = substr( $response, 0, $header_size );
215
+ $body = substr( $response, $header_size, strlen( $response ) );
216
+
217
+ if ( preg_match( '/^(4|5)[0-9]{2}/', $http_code ) ) {
218
+ throw new Ga_Lib_Api_Request_Exception(
219
+ 404 === $http_code ? sprintf(
220
+ /* translators: %s stands for the URL. */
221
+ __( 'Requested URL doesn\'t exists: %s', 'googleanalytics' ),
222
+ $url
223
+ ) : $body
224
+ );
225
+ }
226
+
227
+ curl_close( $ch );
228
+
229
+ $response_data = array( $header, $body );
230
+
231
+ // Cache result.
232
+ if ( false === $force_no_cache ) {
233
+ if ( true === $this->cache ) {
234
+ Ga_Cache::set_cache( $wp_transient_name, $response_data );
235
+ }
236
+ }
237
+
238
+ return $response_data;
239
+ }
240
+ }
241
+ }
lib/class-ga-lib-api-response.php ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * API Response library.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ /**
9
+ * API Response Library response.
10
+ */
11
+ class Ga_Lib_Api_Response {
12
+
13
+ /**
14
+ * Emtpy response.
15
+ *
16
+ * @var string[]
17
+ */
18
+ public static $empty_response = array( '', '' );
19
+
20
+ /**
21
+ * Header.
22
+ *
23
+ * @var mixed
24
+ */
25
+ private $header;
26
+
27
+ /**
28
+ * Body.
29
+ *
30
+ * @var mixed
31
+ */
32
+ private $body;
33
+
34
+ /**
35
+ * Data.
36
+ *
37
+ * @var mixed
38
+ */
39
+ private $data;
40
+
41
+ /**
42
+ * Constructor.
43
+ *
44
+ * @param array|null $raw_response Raw response array.
45
+ */
46
+ public function __construct( $raw_response = null ) {
47
+ if ( false === empty( $raw_response ) ) {
48
+ $this->set_header( $raw_response[0] );
49
+ $this->set_body( $raw_response[1] );
50
+ $this->set_data( json_decode( $raw_response[1], true ) );
51
+ }
52
+ }
53
+
54
+ /**
55
+ * Set header.
56
+ *
57
+ * @param mixed $header Header.
58
+ *
59
+ * @return void
60
+ */
61
+ public function set_header( $header ) {
62
+ $this->header = $header;
63
+ }
64
+
65
+ /**
66
+ * Get header.
67
+ *
68
+ * @return mixed
69
+ */
70
+ public function get_header() {
71
+ return $this->header;
72
+ }
73
+
74
+ /**
75
+ * Set body.
76
+ *
77
+ * @param mixed $body Body.
78
+ *
79
+ * @return void
80
+ */
81
+ public function set_body( $body ) {
82
+ $this->body = $body;
83
+ }
84
+
85
+ /**
86
+ * Get body.
87
+ *
88
+ * @return mixed
89
+ */
90
+ public function get_body() {
91
+ return $this->body;
92
+ }
93
+
94
+ /**
95
+ * Set data.
96
+ *
97
+ * @param mixed $data Data.
98
+ *
99
+ * @return void
100
+ */
101
+ public function set_data( $data ) {
102
+ $this->data = $data;
103
+ }
104
+
105
+ /**
106
+ * Get data.
107
+ *
108
+ * @return mixed
109
+ */
110
+ public function get_data() {
111
+ return $this->data;
112
+ }
113
+ }
lib/class-ga-lib-google-api-client-accountsummaries-exception.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Google API client account summaries exception.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ /**
9
+ * Google API client account summaries exception.
10
+ */
11
+ class Ga_Lib_Google_Api_Client_AccountSummaries_Exception extends Ga_Lib_Google_Api_Client_Exception {
12
+ }
lib/class-ga-lib-google-api-client-authcode-exception.php ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Google API client auth code exception.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ /**
9
+ * Google API client auth code exception.
10
+ */
11
+ class Ga_Lib_Google_Api_Client_AuthCode_Exception extends Ga_Lib_Google_Api_Client_Exception {
12
+
13
+ /**
14
+ * Get error response data.
15
+ *
16
+ * @param string $response Response.
17
+ *
18
+ * @return array[]
19
+ */
20
+ protected function get_error_response_data( $response ) {
21
+ $data = json_decode( $response, true );
22
+
23
+ $error = $data['error'];
24
+
25
+ if ( true === is_array( $error ) && true === isset( $error['message'] ) ) {
26
+ $error = $error['message'];
27
+ }
28
+
29
+ if ( false === empty( $data['error'] ) ) {
30
+ return array(
31
+ 'error' => array(
32
+ 'message' => $error,
33
+ 'code' => 500,
34
+ ),
35
+ );
36
+ } else {
37
+ return array(
38
+ 'error' => array(
39
+ 'message' => 'Google API - uknown error.',
40
+ 'code' => 500,
41
+ ),
42
+ );
43
+ }
44
+ }
45
+ }
lib/class-ga-lib-google-api-client-data-exception.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Google API client data exception.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ /**
9
+ * Google API client data exception.
10
+ */
11
+ class Ga_Lib_Google_Api_Client_Data_Exception extends Ga_Lib_Google_Api_Client_Exception {
12
+ }
lib/class-ga-lib-google-api-client-exception.php ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Google API client exception.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ /**
9
+ * Google API client exception.
10
+ */
11
+ class Ga_Lib_Google_Api_Client_Exception extends Ga_Lib_Api_Client_Exception {
12
+ /**
13
+ * Google error response.
14
+ *
15
+ * @var string|null
16
+ */
17
+ private $google_error_response = null;
18
+
19
+ /**
20
+ * Constructor.
21
+ *
22
+ * @param string $msg Exception message.
23
+ */
24
+ public function __construct( $msg ) {
25
+ $this->set_google_error_response( $msg );
26
+ $data = $this->get_error_response_data( $msg );
27
+ parent::__construct( $data['error']['message'], $data['error']['code'] );
28
+ }
29
+
30
+ /**
31
+ * Sets google JSON response.
32
+ * Response structure:
33
+ * {
34
+ * "error": {
35
+ * "code": 403,
36
+ * "message": "User does not have sufficient permissions for this profile.",
37
+ * "status": "PERMISSION_DENIED",
38
+ * "details": [
39
+ * {
40
+ * "@type": "type.googleapis.com/google.rpc.DebugInfo",
41
+ * "detail": "[ORIGINAL ERROR] generic::permission_denied: User does not have sufficient permissions for this profile.
42
+ * [google.rpc.error_details_ext] { message: \"User does not have sufficient permissions for this profile.\" }"
43
+ * }
44
+ * ]
45
+ * }
46
+ * }
47
+ *
48
+ * @param string $response Response string.
49
+ */
50
+ public function set_google_error_response( $response ) {
51
+ $this->google_error_response = $response;
52
+ }
53
+
54
+ /**
55
+ * Get Google error response.
56
+ *
57
+ * @return string
58
+ */
59
+ public function get_google_error_response() {
60
+ return $this->google_error_response;
61
+ }
62
+
63
+ /**
64
+ * Decodes JSON response
65
+ *
66
+ * @param string $response Response string.
67
+ *
68
+ * @return array Decoded object array.
69
+ */
70
+ protected function get_error_response_data( $response ) {
71
+ $data = json_decode( $response, true );
72
+ if ( is_array( $data['error'] ) && ! empty( $data['error'] ) && ! empty( $data['error']['message'] ) && ! empty( $data['error']['code'] ) ) {
73
+ return $data;
74
+ } elseif ( ! empty( $data['error'] ) ) {
75
+ return array(
76
+ 'error' => array(
77
+ 'message' => $data['error'],
78
+ 'code' => 500,
79
+ ),
80
+ );
81
+ } else {
82
+ return array(
83
+ 'error' => array(
84
+ 'message' => __( 'Google Reporting API - unknown error.' ),
85
+ 'code' => 500,
86
+ ),
87
+ );
88
+ }
89
+ }
90
+ }
lib/class-ga-lib-google-api-client-refreshtoken-exception.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Google API client refresh token exception.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ /**
9
+ * Google API client refresh token exception.
10
+ */
11
+ class Ga_Lib_Google_Api_Client_RefreshToken_Exception extends Ga_Lib_Google_Api_Client_Exception {
12
+ }
lib/{Ga_Lib_Google_Api_Client.php → class-ga-lib-google-api-client.php} RENAMED
@@ -1,19 +1,45 @@
1
  <?php
2
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  class Ga_Lib_Google_Api_Client extends Ga_Lib_Api_Client {
4
 
5
- static $instance = null;
 
 
 
 
 
6
 
7
- const OAUTH2_REVOKE_ENDPOINT = 'https://accounts.google.com/o/oauth2/revoke';
8
- const OAUTH2_TOKEN_ENDPOINT = 'https://accounts.google.com/o/oauth2/token';
9
- const OAUTH2_AUTH_ENDPOINT = 'https://accounts.google.com/o/oauth2/auth';
10
  const OAUTH2_FEDERATED_SIGNON_CERTS_ENDPOINT = 'https://www.googleapis.com/oauth2/v1/certs';
11
- const GA_ACCOUNT_SUMMARIES_ENDPOINT = 'https://www.googleapis.com/analytics/v3/management/accountSummaries';
12
- const GA_DATA_ENDPOINT = 'https://analyticsreporting.googleapis.com/v4/reports:batchGet';
13
- const OAUTH2_CALLBACK_URI = 'urn:ietf:wg:oauth:2.0:oob';
14
 
15
  const USE_CACHE = true;
16
 
 
 
 
 
 
17
  private $disable_cache = false;
18
 
19
  /**
@@ -27,7 +53,7 @@ class Ga_Lib_Google_Api_Client extends Ga_Lib_Api_Client {
27
  'client_id' => '207216681371-433ldmujuv4l0743c1j7g8sci57cb51r.apps.googleusercontent.com',
28
  'client_secret' => 'y0B-K-ODB1KZOam50aMEDhyc',
29
  'scopes' => array( 'https://www.googleapis.com/auth/analytics.readonly' ),
30
- 'approval_prompt' => 'force'
31
  );
32
 
33
  /**
@@ -37,6 +63,9 @@ class Ga_Lib_Google_Api_Client extends Ga_Lib_Api_Client {
37
  */
38
  private $token;
39
 
 
 
 
40
  private function __construct() {
41
  }
42
 
@@ -46,20 +75,34 @@ class Ga_Lib_Google_Api_Client extends Ga_Lib_Api_Client {
46
  * @return Ga_Lib_Api_Client|null
47
  */
48
  public static function get_instance() {
49
- if ( self::$instance === null ) {
50
  self::$instance = new Ga_Lib_Google_Api_Client();
51
  }
52
 
53
  return self::$instance;
54
  }
55
 
 
 
 
 
 
56
  public function set_disable_cache( $value ) {
57
  $this->disable_cache = $value;
58
  }
59
 
60
- function call_api_method( $callback, $args ) {
 
 
 
 
 
 
 
 
 
61
  $callback = array( get_class( $this ), $callback );
62
- if ( is_callable( $callback ) ) {
63
  try {
64
  if ( ! empty( $args ) ) {
65
  if ( is_array( $args ) ) {
@@ -70,20 +113,23 @@ class Ga_Lib_Google_Api_Client extends Ga_Lib_Api_Client {
70
  } else {
71
  return call_user_func( $callback );
72
  }
73
-
74
  } catch ( Ga_Lib_Api_Request_Exception $e ) {
75
  throw new Ga_Lib_Google_Api_Client_Exception( $e->getMessage() );
76
  }
77
  } else {
78
- throw new Ga_Lib_Google_Api_Client_Exception( '[' . get_class( $this ) . ']Unknown method: ' . print_r( $callback,
79
- true ) );
 
 
 
 
80
  }
81
  }
82
 
83
  /**
84
  * Sets access token.
85
  *
86
- * @param $token
87
  */
88
  public function set_access_token( $token ) {
89
  $this->token = $token;
@@ -107,21 +153,22 @@ class Ga_Lib_Google_Api_Client extends Ga_Lib_Api_Client {
107
  $params = array(
108
  'response_type' => 'code',
109
  'redirect_uri' => $this->get_redirect_uri(),
110
- 'client_id' => urlencode( $this->config['client_id'] ),
111
- 'scope' => implode( " ", $this->config['scopes'] ),
112
- 'access_type' => urlencode( $this->config['access_type'] ),
113
- 'approval_prompt' => urlencode( $this->config['approval_prompt'] )
114
  );
115
 
116
- return self::OAUTH2_AUTH_ENDPOINT . "?" . http_build_query( $params, null, '&' );
117
  }
118
 
119
  /**
120
  * Sends request for Access Token during Oauth2 process.
121
  *
122
- * @param $access_code
123
  *
124
  * @return Ga_Lib_Api_Response Returns response object
 
125
  */
126
  private function ga_auth_get_access_token( $access_code ) {
127
  $request = array(
@@ -129,11 +176,15 @@ class Ga_Lib_Google_Api_Client extends Ga_Lib_Api_Client {
129
  'grant_type' => 'authorization_code',
130
  'redirect_uri' => $this->get_redirect_uri(),
131
  'client_id' => $this->config['client_id'],
132
- 'client_secret' => $this->config['client_secret']
133
  );
134
  try {
135
- $response = Ga_Lib_Api_Request::get_instance()->make_request( self::OAUTH2_TOKEN_ENDPOINT,
136
- $request, false, true );
 
 
 
 
137
  } catch ( Ga_Lib_Api_Request_Exception $e ) {
138
  throw new Ga_Lib_Google_Api_Client_AuthCode_Exception( $e->getMessage() );
139
  }
@@ -144,21 +195,26 @@ class Ga_Lib_Google_Api_Client extends Ga_Lib_Api_Client {
144
  /**
145
  * Sends request to refresh Access Token.
146
  *
147
- * @param $refresh_token
148
  *
149
  * @return Ga_Lib_Api_Response
 
150
  */
151
  private function ga_auth_refresh_access_token( $refresh_token ) {
152
  $request = array(
153
  'refresh_token' => $refresh_token,
154
  'grant_type' => 'refresh_token',
155
  'client_id' => $this->config['client_id'],
156
- 'client_secret' => $this->config['client_secret']
157
  );
158
 
159
  try {
160
- $response = Ga_Lib_Api_Request::get_instance()->make_request( self::OAUTH2_TOKEN_ENDPOINT,
161
- $request, false, true );
 
 
 
 
162
  } catch ( Ga_Lib_Api_Request_Exception $e ) {
163
  throw new Ga_Lib_Google_Api_Client_RefreshToken_Exception( $e->getMessage() );
164
  }
@@ -170,10 +226,11 @@ class Ga_Lib_Google_Api_Client extends Ga_Lib_Api_Client {
170
  * Get list of the analytics accounts.
171
  *
172
  * @return Ga_Lib_Api_Response Returns response object
 
173
  */
174
  private function ga_api_account_summaries() {
175
- $request = Ga_Lib_Api_Request::get_instance();
176
- $request = $this->sign( $request );
177
  try {
178
  $response = $request->make_request( self::GA_ACCOUNT_SUMMARIES_ENDPOINT, null, false, true );
179
  } catch ( Ga_Lib_Api_Request_Exception $e ) {
@@ -186,9 +243,11 @@ class Ga_Lib_Google_Api_Client extends Ga_Lib_Api_Client {
186
  /**
187
  * Sends request for Google Analytics data using given query parameters.
188
  *
189
- * @param $query_params
190
  *
191
- * @return Ga_Lib_Api_Response Returns response object
 
 
192
  */
193
  private function ga_api_data( $query_params ) {
194
  $request = Ga_Lib_Api_Request::get_instance( $this->is_cache_enabled(), Ga_Helper::get_account_id() );
@@ -201,8 +260,11 @@ class Ga_Lib_Google_Api_Client extends Ga_Lib_Api_Client {
201
  $quota_user_string = '?quotaUser=' . $quota_user;
202
  }
203
  try {
204
- $response = $request->make_request( self::GA_DATA_ENDPOINT . $quota_user_string,
205
- wp_json_encode( $query_params ), true );
 
 
 
206
  } catch ( Ga_Lib_Api_Request_Exception $e ) {
207
  throw new Ga_Lib_Google_Api_Client_Data_Exception( $e->getMessage() );
208
  }
@@ -214,10 +276,10 @@ class Ga_Lib_Google_Api_Client extends Ga_Lib_Api_Client {
214
  * Sign request with Access Token.
215
  * Adds Access Token to the request's headers.
216
  *
217
- * @param Ga_Lib_Api_Request $request
218
  *
219
  * @return Ga_Lib_Api_Request Returns response object
220
- * @throws Ga_Lib_Api_Client_Exception
221
  */
222
  private function sign( Ga_Lib_Api_Request $request ) {
223
  if ( empty( $this->token ) ) {
@@ -228,7 +290,7 @@ class Ga_Lib_Google_Api_Client extends Ga_Lib_Api_Client {
228
  // (or has already expired).
229
  $this->check_access_token();
230
 
231
- // Add the OAuth2 header to the request
232
  $request->set_request_headers( array( 'Authorization: Bearer ' . $this->token['access_token'] ) );
233
 
234
  return $request;
@@ -237,15 +299,17 @@ class Ga_Lib_Google_Api_Client extends Ga_Lib_Api_Client {
237
  /**
238
  * Refresh and save refreshed Access Token.
239
  *
240
- * @param $refresh_token
 
 
241
  */
242
  public function refresh_access_token( $refresh_token ) {
243
- // Request for a new Access Token
244
  $response = $this->call_api_method( 'ga_auth_refresh_access_token', array( $refresh_token ) );
245
 
246
  Ga_Admin::save_access_token( $response, $refresh_token );
247
 
248
- // Set new access token
249
  $token = Ga_Helper::get_option( Ga_Admin::GA_OAUTH_AUTH_TOKEN_OPTION_NAME );
250
  $this->set_access_token( json_decode( $token, true ) );
251
  }
@@ -271,10 +335,11 @@ class Ga_Lib_Google_Api_Client extends Ga_Lib_Api_Client {
271
 
272
  /**
273
  * Returns if the access_token is expired.
 
274
  * @return bool Returns True if the access_token is expired.
275
  */
276
  public function is_access_token_expired() {
277
- if ( null == $this->token ) {
278
  return true;
279
  }
280
  if ( ! empty( $this->token['error'] ) ) {
@@ -286,10 +351,19 @@ class Ga_Lib_Google_Api_Client extends Ga_Lib_Api_Client {
286
  return $expired;
287
  }
288
 
 
 
 
 
 
 
 
289
  private function check_access_token() {
290
- if ( $this->is_access_token_expired() ) {
291
- if ( empty( $this->token['refresh_token'] ) ) {
292
- throw new Ga_Lib_Api_Client_Exception( _( 'Refresh token is not available. Please re-authenticate.' ) );
 
 
293
  } else {
294
  $this->refresh_access_token( $this->token['refresh_token'] );
295
  }
@@ -297,118 +371,11 @@ class Ga_Lib_Google_Api_Client extends Ga_Lib_Api_Client {
297
  }
298
 
299
  /**
 
 
300
  * @return bool
301
  */
302
  public function is_cache_enabled() {
303
- return self::USE_CACHE && ! $this->disable_cache;
304
- }
305
- }
306
-
307
- class Ga_Lib_Google_Api_Client_Exception extends Ga_Lib_Api_Client_Exception {
308
-
309
- private $google_error_response = null;
310
-
311
- function __construct( $msg ) {
312
- $this->set_google_error_response( $msg );
313
- $data = $this->get_error_response_data( $msg );
314
- parent::__construct( $data['error']['message'], $data['error']['code'] );
315
- }
316
-
317
- /**
318
- * Sets google JSON response.
319
- * Response structure:
320
- * {
321
- *"error": {
322
- *"code": 403,
323
- *"message": "User does not have sufficient permissions for this profile.",
324
- *"status": "PERMISSION_DENIED",
325
- *"details": [
326
- *{
327
- *"@type": "type.googleapis.com/google.rpc.DebugInfo",
328
- *"detail": "[ORIGINAL ERROR] generic::permission_denied: User does not have sufficient permissions for this profile.
329
- * [google.rpc.error_details_ext] { message: \"User does not have sufficient permissions for this profile.\" }"
330
- *}
331
- *]
332
- *}
333
- *}
334
- */
335
- public function set_google_error_response( $response ) {
336
- $this->google_error_response = $response;
337
- }
338
-
339
- public function get_google_error_response() {
340
- return $this->google_error_response;
341
- }
342
-
343
- /**
344
- * Decodes JSON response
345
- *
346
- * @param $response
347
- *
348
- * @return array
349
- */
350
- protected function get_error_response_data( $response ) {
351
- $data = json_decode( $response, true );
352
- if ( is_array( $data['error'] ) && ! empty( $data['error'] ) && ! empty( $data['error']['message'] ) && ! empty( $data['error']['code'] ) ) {
353
- return $data;
354
- } elseif ( ! empty( $data['error'] ) ) {
355
- return array(
356
- 'error' => array(
357
- 'message' => $data['error'],
358
- 'code' => 500
359
- )
360
- );
361
- } else {
362
- return array(
363
- 'error' => array(
364
- 'message' => _( 'Google Reporting API - unknown error.' ),
365
- 'code' => 500
366
- )
367
- );
368
- }
369
- }
370
-
371
- }
372
-
373
- class Ga_Lib_Google_Api_Client_AuthCode_Exception extends Ga_Lib_Google_Api_Client_Exception {
374
- function __construct( $msg ) {
375
- parent::__construct( $msg );
376
- }
377
-
378
- protected function get_error_response_data( $response ) {
379
- $data = json_decode( $response, true );
380
- if ( ! empty( $data['error'] ) ) {
381
- return array(
382
- 'error' => array(
383
- 'message' => $data['error'],
384
- 'code' => 500
385
- )
386
- );
387
- } else {
388
- return array(
389
- 'error' => array(
390
- 'message' => 'Google API - uknown error.',
391
- 'code' => 500
392
- )
393
- );
394
- }
395
- }
396
- }
397
-
398
- class Ga_Lib_Google_Api_Client_Data_Exception extends Ga_Lib_Google_Api_Client_Exception {
399
- function __construct( $msg ) {
400
- parent::__construct( $msg );
401
- }
402
- }
403
-
404
- class Ga_Lib_Google_Api_Client_RefreshToken_Exception extends Ga_Lib_Google_Api_Client_Exception {
405
- function __construct( $msg ) {
406
- parent::__construct( $msg );
407
- }
408
- }
409
-
410
- class Ga_Lib_Google_Api_Client_AccountSummaries_Exception extends Ga_Lib_Google_Api_Client_Exception {
411
- function __construct( $msg ) {
412
- parent::__construct( $msg );
413
  }
414
  }
1
  <?php
2
+ /**
3
+ * API Client library.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ // phpcs:disable Squiz.Commenting.FunctionCommentThrowTag.WrongNumber
9
+
10
+ require_once trailingslashit( __DIR__ ) . 'class-ga-lib-api-client-exception.php';
11
+ require_once trailingslashit( __DIR__ ) . 'class-ga-lib-google-api-client-exception.php';
12
+ require_once trailingslashit( __DIR__ ) . 'class-ga-lib-google-api-client-data-exception.php';
13
+ require_once trailingslashit( __DIR__ ) . 'class-ga-lib-google-api-client-authcode-exception.php';
14
+ require_once trailingslashit( __DIR__ ) . 'class-ga-lib-google-api-client-accountsummaries-exception.php';
15
+
16
+ /**
17
+ * API Client.
18
+ */
19
  class Ga_Lib_Google_Api_Client extends Ga_Lib_Api_Client {
20
 
21
+ /**
22
+ * Instance object.
23
+ *
24
+ * @var Ga_Lib_Api_Client|null
25
+ */
26
+ private static $instance = null;
27
 
28
+ const OAUTH2_REVOKE_ENDPOINT = 'https://accounts.google.com/o/oauth2/revoke';
29
+ const OAUTH2_TOKEN_ENDPOINT = 'https://accounts.google.com/o/oauth2/token';
30
+ const OAUTH2_AUTH_ENDPOINT = 'https://accounts.google.com/o/oauth2/auth';
31
  const OAUTH2_FEDERATED_SIGNON_CERTS_ENDPOINT = 'https://www.googleapis.com/oauth2/v1/certs';
32
+ const GA_ACCOUNT_SUMMARIES_ENDPOINT = 'https://www.googleapis.com/analytics/v3/management/accountSummaries';
33
+ const GA_DATA_ENDPOINT = 'https://analyticsreporting.googleapis.com/v4/reports:batchGet';
34
+ const OAUTH2_CALLBACK_URI = 'urn:ietf:wg:oauth:2.0:oob';
35
 
36
  const USE_CACHE = true;
37
 
38
+ /**
39
+ * Disable cache?
40
+ *
41
+ * @var bool
42
+ */
43
  private $disable_cache = false;
44
 
45
  /**
53
  'client_id' => '207216681371-433ldmujuv4l0743c1j7g8sci57cb51r.apps.googleusercontent.com',
54
  'client_secret' => 'y0B-K-ODB1KZOam50aMEDhyc',
55
  'scopes' => array( 'https://www.googleapis.com/auth/analytics.readonly' ),
56
+ 'approval_prompt' => 'force',
57
  );
58
 
59
  /**
63
  */
64
  private $token;
65
 
66
+ /**
67
+ * Constructor.
68
+ */
69
  private function __construct() {
70
  }
71
 
75
  * @return Ga_Lib_Api_Client|null
76
  */
77
  public static function get_instance() {
78
+ if ( null === self::$instance ) {
79
  self::$instance = new Ga_Lib_Google_Api_Client();
80
  }
81
 
82
  return self::$instance;
83
  }
84
 
85
+ /**
86
+ * Set disable cache.
87
+ *
88
+ * @param bool $value True if yes, false if no.
89
+ */
90
  public function set_disable_cache( $value ) {
91
  $this->disable_cache = $value;
92
  }
93
 
94
+ /**
95
+ * Call API method.
96
+ *
97
+ * @param callable $callback Callable function.
98
+ * @param array $args Array of arguments.
99
+ *
100
+ * @return false|Ga_Lib_Api_Response|mixed
101
+ * @throws Ga_Lib_Google_Api_Client_Exception Exception if callable if unknown.
102
+ */
103
+ public function call_api_method( $callback, $args ) {
104
  $callback = array( get_class( $this ), $callback );
105
+ if ( true === is_callable( $callback ) ) {
106
  try {
107
  if ( ! empty( $args ) ) {
108
  if ( is_array( $args ) ) {
113
  } else {
114
  return call_user_func( $callback );
115
  }
 
116
  } catch ( Ga_Lib_Api_Request_Exception $e ) {
117
  throw new Ga_Lib_Google_Api_Client_Exception( $e->getMessage() );
118
  }
119
  } else {
120
+ throw new Ga_Lib_Google_Api_Client_Exception(
121
+ '[' . get_class( $this ) . ']Unknown method: ' . print_r( // phpcs:ignore
122
+ $callback,
123
+ true
124
+ )
125
+ );
126
  }
127
  }
128
 
129
  /**
130
  * Sets access token.
131
  *
132
+ * @param string $token Token string.
133
  */
134
  public function set_access_token( $token ) {
135
  $this->token = $token;
153
  $params = array(
154
  'response_type' => 'code',
155
  'redirect_uri' => $this->get_redirect_uri(),
156
+ 'client_id' => rawurlencode( $this->config['client_id'] ),
157
+ 'scope' => implode( ' ', $this->config['scopes'] ),
158
+ 'access_type' => rawurlencode( $this->config['access_type'] ),
159
+ 'approval_prompt' => rawurlencode( $this->config['approval_prompt'] ),
160
  );
161
 
162
+ return self::OAUTH2_AUTH_ENDPOINT . '?' . http_build_query( $params, null, '&' );
163
  }
164
 
165
  /**
166
  * Sends request for Access Token during Oauth2 process.
167
  *
168
+ * @param string $access_code Access code.
169
  *
170
  * @return Ga_Lib_Api_Response Returns response object
171
+ * @throws Ga_Lib_Google_Api_Client_AuthCode_Exception Exception thrown for auth error.
172
  */
173
  private function ga_auth_get_access_token( $access_code ) {
174
  $request = array(
176
  'grant_type' => 'authorization_code',
177
  'redirect_uri' => $this->get_redirect_uri(),
178
  'client_id' => $this->config['client_id'],
179
+ 'client_secret' => $this->config['client_secret'],
180
  );
181
  try {
182
+ $response = Ga_Lib_Api_Request::get_instance()->make_request(
183
+ self::OAUTH2_TOKEN_ENDPOINT,
184
+ $request,
185
+ false,
186
+ true
187
+ );
188
  } catch ( Ga_Lib_Api_Request_Exception $e ) {
189
  throw new Ga_Lib_Google_Api_Client_AuthCode_Exception( $e->getMessage() );
190
  }
195
  /**
196
  * Sends request to refresh Access Token.
197
  *
198
+ * @param string $refresh_token Refresh token string.
199
  *
200
  * @return Ga_Lib_Api_Response
201
+ * @throws Ga_Lib_Google_Api_Client_RefreshToken_Exception Throws error on failed refresh token fetch.
202
  */
203
  private function ga_auth_refresh_access_token( $refresh_token ) {
204
  $request = array(
205
  'refresh_token' => $refresh_token,
206
  'grant_type' => 'refresh_token',
207
  'client_id' => $this->config['client_id'],
208
+ 'client_secret' => $this->config['client_secret'],
209
  );
210
 
211
  try {
212
+ $response = Ga_Lib_Api_Request::get_instance()->make_request(
213
+ self::OAUTH2_TOKEN_ENDPOINT,
214
+ $request,
215
+ false,
216
+ true
217
+ );
218
  } catch ( Ga_Lib_Api_Request_Exception $e ) {
219
  throw new Ga_Lib_Google_Api_Client_RefreshToken_Exception( $e->getMessage() );
220
  }
226
  * Get list of the analytics accounts.
227
  *
228
  * @return Ga_Lib_Api_Response Returns response object
229
+ * @throws Ga_Lib_Google_Api_Client_AccountSummaries_Exception On failed account summaries fetch.
230
  */
231
  private function ga_api_account_summaries() {
232
+ $request = Ga_Lib_Api_Request::get_instance();
233
+ $request = $this->sign( $request );
234
  try {
235
  $response = $request->make_request( self::GA_ACCOUNT_SUMMARIES_ENDPOINT, null, false, true );
236
  } catch ( Ga_Lib_Api_Request_Exception $e ) {
243
  /**
244
  * Sends request for Google Analytics data using given query parameters.
245
  *
246
+ * @param array $query_params Query params array.
247
  *
248
+ * @return Ga_Lib_Api_Response Returns response object.
249
+ * @throws Ga_Lib_Google_Api_Client_Data_Exception On failed client data.
250
+ * @throws Ga_Lib_Api_Client_Exception On failed data fetch.
251
  */
252
  private function ga_api_data( $query_params ) {
253
  $request = Ga_Lib_Api_Request::get_instance( $this->is_cache_enabled(), Ga_Helper::get_account_id() );
260
  $quota_user_string = '?quotaUser=' . $quota_user;
261
  }
262
  try {
263
+ $response = $request->make_request(
264
+ self::GA_DATA_ENDPOINT . $quota_user_string,
265
+ wp_json_encode( $query_params ),
266
+ true
267
+ );
268
  } catch ( Ga_Lib_Api_Request_Exception $e ) {
269
  throw new Ga_Lib_Google_Api_Client_Data_Exception( $e->getMessage() );
270
  }
276
  * Sign request with Access Token.
277
  * Adds Access Token to the request's headers.
278
  *
279
+ * @param Ga_Lib_Api_Request $request Request object.
280
  *
281
  * @return Ga_Lib_Api_Request Returns response object
282
+ * @throws Ga_Lib_Api_Client_Exception Throws client exception if access token not available.
283
  */
284
  private function sign( Ga_Lib_Api_Request $request ) {
285
  if ( empty( $this->token ) ) {
290
  // (or has already expired).
291
  $this->check_access_token();
292
 
293
+ // Add the OAuth2 header to the request.
294
  $request->set_request_headers( array( 'Authorization: Bearer ' . $this->token['access_token'] ) );
295
 
296
  return $request;
299
  /**
300
  * Refresh and save refreshed Access Token.
301
  *
302
+ * @param string $refresh_token Refresh token string.
303
+ *
304
+ * @throws Ga_Lib_Google_Api_Client_Exception Throws exception if refresh token fails.
305
  */
306
  public function refresh_access_token( $refresh_token ) {
307
+ // Request for a new Access Token.
308
  $response = $this->call_api_method( 'ga_auth_refresh_access_token', array( $refresh_token ) );
309
 
310
  Ga_Admin::save_access_token( $response, $refresh_token );
311
 
312
+ // Set new access token.
313
  $token = Ga_Helper::get_option( Ga_Admin::GA_OAUTH_AUTH_TOKEN_OPTION_NAME );
314
  $this->set_access_token( json_decode( $token, true ) );
315
  }
335
 
336
  /**
337
  * Returns if the access_token is expired.
338
+ *
339
  * @return bool Returns True if the access_token is expired.
340
  */
341
  public function is_access_token_expired() {
342
+ if ( null === $this->token ) {
343
  return true;
344
  }
345
  if ( ! empty( $this->token['error'] ) ) {
351
  return $expired;
352
  }
353
 
354
+ /**
355
+ * Check access token.
356
+ *
357
+ * @return void
358
+ * @throws Ga_Lib_Api_Client_Exception Throws client exception for failed fresh token.
359
+ * @throws Ga_Lib_Google_Api_Client_Exception Throws Api client exception for failed fresh token.
360
+ */
361
  private function check_access_token() {
362
+ if ( true === $this->is_access_token_expired() ) {
363
+ if ( true === empty( $this->token['refresh_token'] ) ) {
364
+ throw new Ga_Lib_Api_Client_Exception(
365
+ __( 'Refresh token is not available. Please re-authenticate.' )
366
+ );
367
  } else {
368
  $this->refresh_access_token( $this->token['refresh_token'] );
369
  }
371
  }
372
 
373
  /**
374
+ * Is cache enabled?
375
+ *
376
  * @return bool
377
  */
378
  public function is_cache_enabled() {
379
+ return true === self::USE_CACHE && false === $this->disable_cache;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
380
  }
381
  }
lib/class-ga-lib-sharethis-api-client-alerts-exception.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ShareThis API Client Alerts exception.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ /**
9
+ * ShareThis API Client Alerts exception.
10
+ */
11
+ class Ga_Lib_Sharethis_Api_Client_Alerts_Exception extends Ga_Lib_Sharethis_Api_Client_Exception {
12
+ }
lib/class-ga-lib-sharethis-api-client-exception.php ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ShareThis API client exception.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ /**
9
+ * ShareThis API client exception.
10
+ */
11
+ class Ga_Lib_Sharethis_Api_Client_Exception extends Ga_Lib_Api_Client_Exception {
12
+
13
+ /**
14
+ * Constructor.
15
+ *
16
+ * @param string $msg Message object.
17
+ */
18
+ public function __construct( $msg ) {
19
+ $data = json_decode( $msg, true );
20
+ parent::__construct( ! empty( $data['error'] ) ? $data['error'] : $msg );
21
+ }
22
+ }
lib/class-ga-lib-sharethis-api-client-invaliddomain-exception.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ShareThis API Client Invalid Domain Exception.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ /**
9
+ * ShareThis API Client Invalid Domain Exception.
10
+ */
11
+ class Ga_Lib_Sharethis_Api_Client_InvalidDomain_Exception extends Ga_Lib_Sharethis_Api_Client_Exception {
12
+ }
lib/class-ga-lib-sharethis-api-client-invite-exception.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ShareThis API Client Invite exception.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ /**
9
+ * ShareThis API Client Invite exception.
10
+ */
11
+ class Ga_Lib_Sharethis_Api_Client_Invite_Exception extends Ga_Lib_Sharethis_Api_Client_Exception {
12
+ }
lib/class-ga-lib-sharethis-api-client-verify-exception.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ShareThis API Client Verify exception.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ /**
9
+ * ShareThis API Client Verify exception.
10
+ */
11
+ class Ga_Lib_Sharethis_Api_Client_Verify_Exception extends Ga_Lib_Sharethis_Api_Client_Exception {
12
+ }
lib/{Ga_Lib_Sharethis_Api_Client.php → class-ga-lib-sharethis-api-client.php} RENAMED
@@ -1,13 +1,36 @@
1
  <?php
2
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  class Ga_Lib_Sharethis_Api_Client extends Ga_Lib_Api_Client {
4
 
5
- static $instance = null;
 
 
 
 
 
6
 
7
  const GA_SHARETHIS_ENDPOINT = 'platform-api.sharethis.com/v1.0/property';
8
 
9
  const USE_CACHE = false;
10
 
 
 
 
11
  private function __construct() {}
12
 
13
  /**
@@ -16,18 +39,27 @@ class Ga_Lib_Sharethis_Api_Client extends Ga_Lib_Api_Client {
16
  * @return Ga_Lib_Api_Client|null
17
  */
18
  public static function get_instance() {
19
- if ( self::$instance === null ) {
20
  self::$instance = new Ga_Lib_Sharethis_Api_Client();
21
  }
22
 
23
  return self::$instance;
24
  }
25
 
26
- function call_api_method( $callback, $args ) {
 
 
 
 
 
 
 
 
 
27
  $callback = array( get_class( $this ), $callback );
28
  if ( is_callable( $callback ) ) {
29
  try {
30
- if ( !empty( $args ) ) {
31
  if ( is_array( $args ) ) {
32
  return call_user_func_array( $callback, $args );
33
  } else {
@@ -47,14 +79,19 @@ class Ga_Lib_Sharethis_Api_Client extends Ga_Lib_Api_Client {
47
  /**
48
  * Sends request for Sharethis api
49
  *
50
- * @param $query_params
51
  *
52
  * @return Ga_Lib_Api_Response Returns response object
 
53
  */
54
  private function ga_api_create_sharethis_property( $query_params ) {
55
- $request = Ga_Lib_Api_Request::get_instance(self::USE_CACHE);
56
  try {
57
- $response = $request->make_request( $this->add_protocol( self::GA_SHARETHIS_ENDPOINT ), wp_json_encode( $query_params ), true );
 
 
 
 
58
  } catch ( Ga_Lib_Api_Request_Exception $e ) {
59
  throw new Ga_Lib_Sharethis_Api_Client_InvalidDomain_Exception( $e->getMessage() );
60
  }
@@ -62,8 +99,16 @@ class Ga_Lib_Sharethis_Api_Client extends Ga_Lib_Api_Client {
62
  return new Ga_Lib_Api_Response( $response );
63
  }
64
 
 
 
 
 
 
 
 
 
65
  private function ga_api_sharethis_installation_verification( $query_params ) {
66
- $request = Ga_Lib_Api_Request::get_instance(self::USE_CACHE);
67
  try {
68
  $response = $request->make_request( 'https://' . self::GA_SHARETHIS_ENDPOINT . '/verify', wp_json_encode( $query_params ), true );
69
  } catch ( Ga_Lib_Api_Request_Exception $e ) {
@@ -73,8 +118,16 @@ class Ga_Lib_Sharethis_Api_Client extends Ga_Lib_Api_Client {
73
  return new Ga_Lib_Api_Response( $response );
74
  }
75
 
 
 
 
 
 
 
 
 
76
  private function ga_api_sharethis_user_invite( $query_params ) {
77
- $request = Ga_Lib_Api_Request::get_instance(self::USE_CACHE);
78
  try {
79
  $response = $request->make_request( 'https://' . self::GA_SHARETHIS_ENDPOINT . '/user/join', wp_json_encode( $query_params ), true );
80
  } catch ( Ga_Lib_Api_Request_Exception $e ) {
@@ -84,49 +137,14 @@ class Ga_Lib_Sharethis_Api_Client extends Ga_Lib_Api_Client {
84
  return new Ga_Lib_Api_Response( $response );
85
  }
86
 
 
 
 
 
 
 
 
87
  private function add_protocol( $url ) {
88
  return ( is_ssl() ) ? 'https://' . $url : 'http://' . $url;
89
  }
90
-
91
- }
92
-
93
- class Ga_Lib_Sharethis_Api_Client_Exception extends Ga_Lib_Api_Client_Exception {
94
-
95
- function __construct( $msg ) {
96
- $data = json_decode( $msg, true );
97
- parent::__construct( !empty( $data[ 'error' ] ) ? $data[ 'error' ] : $msg );
98
- }
99
-
100
- }
101
-
102
- class Ga_Lib_Sharethis_Api_Client_InvalidDomain_Exception extends Ga_Lib_Sharethis_Api_Client_Exception {
103
-
104
- function __construct( $msg ) {
105
- parent::__construct( $msg );
106
- }
107
-
108
- }
109
-
110
- class Ga_Lib_Sharethis_Api_Client_Invite_Exception extends Ga_Lib_Sharethis_Api_Client_Exception {
111
-
112
- function __construct( $msg ) {
113
- parent::__construct( $msg );
114
- }
115
-
116
- }
117
-
118
- class Ga_Lib_Sharethis_Api_Client_Alerts_Exception extends Ga_Lib_Sharethis_Api_Client_Exception {
119
-
120
- function __construct( $msg ) {
121
- parent::__construct( $msg );
122
- }
123
-
124
- }
125
-
126
- class Ga_Lib_Sharethis_Api_Client_Verify_Exception extends Ga_Lib_Sharethis_Api_Client_Exception {
127
-
128
- function __construct( $msg ) {
129
- parent::__construct( $msg );
130
- }
131
-
132
  }
1
  <?php
2
+ /**
3
+ * ShareThis API Client.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ // Requires.
9
+ require_once 'class-ga-lib-sharethis-api-client-exception.php';
10
+ require_once 'class-ga-lib-sharethis-api-client-invaliddomain-exception.php';
11
+ require_once 'class-ga-lib-sharethis-api-client-invite-exception.php';
12
+ require_once 'class-ga-lib-sharethis-api-client-alerts-exception.php';
13
+ require_once 'class-ga-lib-sharethis-api-client-verify-exception.php';
14
+
15
+ /**
16
+ * ShareThis API Client.
17
+ */
18
  class Ga_Lib_Sharethis_Api_Client extends Ga_Lib_Api_Client {
19
 
20
+ /**
21
+ * ShareThis API client instance.
22
+ *
23
+ * @var Ga_Lib_Sharethis_Api_Client|null
24
+ */
25
+ public static $instance = null;
26
 
27
  const GA_SHARETHIS_ENDPOINT = 'platform-api.sharethis.com/v1.0/property';
28
 
29
  const USE_CACHE = false;
30
 
31
+ /**
32
+ * Private constructor.
33
+ */
34
  private function __construct() {}
35
 
36
  /**
39
  * @return Ga_Lib_Api_Client|null
40
  */
41
  public static function get_instance() {
42
+ if ( null === self::$instance ) {
43
  self::$instance = new Ga_Lib_Sharethis_Api_Client();
44
  }
45
 
46
  return self::$instance;
47
  }
48
 
49
+ /**
50
+ * Call API method.
51
+ *
52
+ * @param callable $callback Callable callback.
53
+ * @param array $args Array of arguments.
54
+ *
55
+ * @return false|Ga_Lib_Api_Response|mixed
56
+ * @throws Ga_Lib_Sharethis_Api_Client_Exception API client exception.
57
+ */
58
+ public function call_api_method( $callback, $args ) {
59
  $callback = array( get_class( $this ), $callback );
60
  if ( is_callable( $callback ) ) {
61
  try {
62
+ if ( ! empty( $args ) ) {
63
  if ( is_array( $args ) ) {
64
  return call_user_func_array( $callback, $args );
65
  } else {
79
  /**
80
  * Sends request for Sharethis api
81
  *
82
+ * @param array $query_params Query parameters.
83
  *
84
  * @return Ga_Lib_Api_Response Returns response object
85
+ * @throws Ga_Lib_Sharethis_Api_Client_InvalidDomain_Exception Invalid domain exception.
86
  */
87
  private function ga_api_create_sharethis_property( $query_params ) {
88
+ $request = Ga_Lib_Api_Request::get_instance( self::USE_CACHE );
89
  try {
90
+ $response = $request->make_request(
91
+ $this->add_protocol( self::GA_SHARETHIS_ENDPOINT ),
92
+ wp_json_encode( $query_params ),
93
+ true
94
+ );
95
  } catch ( Ga_Lib_Api_Request_Exception $e ) {
96
  throw new Ga_Lib_Sharethis_Api_Client_InvalidDomain_Exception( $e->getMessage() );
97
  }
99
  return new Ga_Lib_Api_Response( $response );
100
  }
101
 
102
+ /**
103
+ * Installation verification check.
104
+ *
105
+ * @param array $query_params Query parameters.
106
+ *
107
+ * @return Ga_Lib_Api_Response
108
+ * @throws Ga_Lib_Sharethis_Api_Client_Verify_Exception Client verification exception.
109
+ */
110
  private function ga_api_sharethis_installation_verification( $query_params ) {
111
+ $request = Ga_Lib_Api_Request::get_instance( self::USE_CACHE );
112
  try {
113
  $response = $request->make_request( 'https://' . self::GA_SHARETHIS_ENDPOINT . '/verify', wp_json_encode( $query_params ), true );
114
  } catch ( Ga_Lib_Api_Request_Exception $e ) {
118
  return new Ga_Lib_Api_Response( $response );
119
  }
120
 
121
+ /**
122
+ * User invite call.
123
+ *
124
+ * @param array $query_params Query parameters.
125
+ *
126
+ * @return Ga_Lib_Api_Response
127
+ * @throws Ga_Lib_Sharethis_Api_Client_Invite_Exception Client invitation exception.
128
+ */
129
  private function ga_api_sharethis_user_invite( $query_params ) {
130
+ $request = Ga_Lib_Api_Request::get_instance( self::USE_CACHE );
131
  try {
132
  $response = $request->make_request( 'https://' . self::GA_SHARETHIS_ENDPOINT . '/user/join', wp_json_encode( $query_params ), true );
133
  } catch ( Ga_Lib_Api_Request_Exception $e ) {
137
  return new Ga_Lib_Api_Response( $response );
138
  }
139
 
140
+ /**
141
+ * Add correct protocol based on HTTP/HTTPS.
142
+ *
143
+ * @param string $url URL string.
144
+ *
145
+ * @return string Modified URL string.
146
+ */
147
  private function add_protocol( $url ) {
148
  return ( is_ssl() ) ? 'https://' . $url : 'http://' . $url;
149
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
150
  }
overwrite/ga-overwrite.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Overwrite helpers.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ if ( false === function_exists( 'wp_json_encode' ) ) {
9
+ /**
10
+ * Encode a variable into JSON.
11
+ *
12
+ * @param mixed $data Variable (usually an array or object) to encode as JSON.
13
+ *
14
+ * @return false|string The JSON encoded string, or false if it cannot be encoded.
15
+ */
16
+ function wp_json_encode( $data ) {
17
+ return json_encode( $data ); // phpcs:ignore
18
+ }
19
+ }
overwrite/ga_overwrite.php DELETED
@@ -1,13 +0,0 @@
1
- <?php
2
- /**
3
- * Created by PhpStorm.
4
- * User: mdn
5
- * Date: 2016-12-08
6
- * Time: 09:15
7
- */
8
-
9
- if ( ! function_exists( 'wp_json_encode' ) ) {
10
- function wp_json_encode( $data ) {
11
- return json_encode( $data );
12
- }
13
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
readme.txt CHANGED
@@ -2,8 +2,9 @@
2
  Contributors: sharethis, scottstorebloom, scottmweaver
3
  Tags: analytics, google analytics, google analytics plugin, google analytics widget, google analytics dashboard
4
  Requires at least: 5.2
5
- Tested up to: 5.8.3
6
- Stable tag: 2.5.4
 
7
 
8
  Use Google Analytics on your WordPress site without touching any code, and view visitor reports right in your WordPress admin dashboard!
9
 
@@ -114,15 +115,22 @@ If you’re using Google Analytics on your WordPress website or a plugin like th
114
 
115
  == Changelog ==
116
 
117
- = 2.5.4
 
 
 
 
 
 
 
118
  * Fix dashboard widget.
119
  * Test plugin with WordPress 5.8.3.
120
 
121
- = 2.5.3
122
  * Fix sending of demographic data once per month.
123
  * Test plugin with WordPress 5.8.1.
124
 
125
- = 2.5.2
126
  * Add custom date range selector instead of 7/30-day selector.
127
  * Add device breakdown under demographics section.
128
  * Fix security issue for URL in admin.
2
  Contributors: sharethis, scottstorebloom, scottmweaver
3
  Tags: analytics, google analytics, google analytics plugin, google analytics widget, google analytics dashboard
4
  Requires at least: 5.2
5
+ Tested up to: 5.9.1
6
+ Stable tag: 2.5.5
7
+ Version: 2.5.5
8
 
9
  Use Google Analytics on your WordPress site without touching any code, and view visitor reports right in your WordPress admin dashboard!
10
 
115
 
116
  == Changelog ==
117
 
118
+ = 2.5.5 =
119
+ * Add code improvements.
120
+ * Improve sanitization and localization.
121
+ * Test with WordPress 6.0.
122
+ * Test with PHP 8.0.
123
+ * Fix privacy policy link.
124
+
125
+ = 2.5.4 =
126
  * Fix dashboard widget.
127
  * Test plugin with WordPress 5.8.3.
128
 
129
+ = 2.5.3 =
130
  * Fix sending of demographic data once per month.
131
  * Test plugin with WordPress 5.8.1.
132
 
133
+ = 2.5.2 =
134
  * Add custom date range selector instead of 7/30-day selector.
135
  * Add device breakdown under demographics section.
136
  * Fix security issue for URL in admin.
screenshot-1.png DELETED
Binary file
screenshot-2.png DELETED
Binary file
screenshot-3.png DELETED
Binary file
screenshot-4.png DELETED
Binary file
tools/{Ga_Cache.php → class-ga-cache.php} RENAMED
@@ -1,12 +1,12 @@
1
  <?php
2
-
3
  /**
4
- * Handles request caching.
5
  *
6
- * Created by PhpStorm.
7
- * User: mdn
8
- * Date: 2017-01-27
9
- * Time: 10:31
 
10
  */
11
  class Ga_Cache {
12
 
@@ -25,12 +25,22 @@ class Ga_Cache {
25
 
26
  const GA_WAIT_AFTER_ERROR_TIME = 300; // 60 * 5 = 5 min
27
 
 
 
 
 
 
28
  public static function add_cache_options() {
29
  add_option( self::GA_LAST_CACHE_OPTION_NAME );
30
  add_option( self::GA_BUFFER_CACHE_OPTION_NAME );
31
  add_option( self::GA_LAST_TIME_ATTEMPT_OPTION_NAME );
32
  }
33
 
 
 
 
 
 
34
  public static function delete_cache_options() {
35
  delete_option( self::GA_LAST_CACHE_OPTION_NAME );
36
  delete_option( self::GA_BUFFER_CACHE_OPTION_NAME );
@@ -40,50 +50,49 @@ class Ga_Cache {
40
  /**
41
  * Generates transient name.
42
  *
43
- * @param $rest_url
44
- * @param $query_params
45
- * @param string $apendix
46
  *
47
  * @return string
48
  */
49
- public static function get_transient_name( $rest_url, $query_params, $apendix = '' ) {
50
 
51
- if (is_array($query_params)) {
52
- $query_params = wp_json_encode($query_params);
53
  }
54
 
55
  $name = md5( $rest_url . $query_params );
56
 
57
- return self::GA_TRANSIENT_PREFIX . $name . '_' . $apendix;
58
  }
59
 
60
  /**
61
  * Gets cached data.
62
  *
63
- * @param $name
64
  *
65
  * @return bool|mixed
66
  */
67
  public static function get_cached_result( $name ) {
 
68
 
69
- $data = get_option( self::GA_BUFFER_CACHE_OPTION_NAME );
70
-
71
- // Check if cache exists
72
- if ( ! empty( $data[ $name ] ) ) { // Cache exists
73
  return $data[ $name ];
74
- } else {
75
- return false;
76
- }
77
  }
 
78
 
79
  /**
80
- * Sets ne cache value.
81
  *
82
- * @param $name
83
- * @param $result
84
  */
85
  public static function set_cache( $name, $result ) {
86
- if ( ! empty( $result ) ) {
87
  self::set_last_cache_time( $name );
88
  self::set_cache_buffer( $name, $result );
89
  self::delete_last_time_attempt();
@@ -93,7 +102,7 @@ class Ga_Cache {
93
  /**
94
  * Updates the time the response was cached.
95
  *
96
- * @param $name
97
  */
98
  public static function set_last_cache_time( $name ) {
99
  $data = get_option( self::GA_LAST_CACHE_OPTION_NAME );
@@ -111,8 +120,8 @@ class Ga_Cache {
111
  /**
112
  * Sets or update data cache.
113
  *
114
- * @param $name
115
- * @param $result
116
  */
117
  public static function set_cache_buffer( $name, $result ) {
118
  $data = get_option( self::GA_BUFFER_CACHE_OPTION_NAME );
@@ -131,7 +140,7 @@ class Ga_Cache {
131
  * Sets last time attempt option
132
  */
133
  public static function set_last_time_attempt() {
134
- update_option( self::GA_LAST_TIME_ATTEMPT_OPTION_NAME, time());
135
  }
136
 
137
  /**
@@ -146,62 +155,65 @@ class Ga_Cache {
146
  *
147
  * Next api request is allowed when there was an unsuccessful attempt and data_cache is empty.
148
  *
149
- * @param $name
150
  *
151
  * @return bool
152
  */
153
  public static function is_next_request_allowed( $name ) {
154
- $last_time_attempt = get_option( self::GA_LAST_TIME_ATTEMPT_OPTION_NAME );
155
- $outdated_last_attempt_time = true;
156
 
157
- if ( empty( $last_time_attempt ) ) {
158
- // If there is no last_time_attempt then return true
159
  return true;
160
- } elseif (!empty($last_time_attempt)) {
161
- $outdated_last_attempt_time = ( $last_time_attempt + self::GA_WAIT_AFTER_ERROR_TIME ) < time();
162
- }
163
 
164
- return ( ! self::get_cached_result( $name ) && $outdated_last_attempt_time );
165
  }
166
 
167
  /**
168
  * Checks whether data cache is outdated.
169
- * @param string $name
170
- * @param string $appendix
 
171
  *
172
  * @return bool
173
  */
174
- public static function is_data_cache_outdated($name = '', $appendix = '') {
175
- $last_time = get_option( self::GA_LAST_CACHE_OPTION_NAME );
176
- $outdated = 0;
177
- if (!empty($last_time)) {
178
-
179
- // Validate cache for given rest name
180
- if ( ! empty( $name ) ) {
181
-
182
- // if appendix is set then check only that cache which concerns given appendix
183
- if ( ! empty( $appendix ) ) {
184
- return ( ! empty( $appendix ) && preg_match( '/' . $appendix . '/',
185
- $name ) && ( $last_time[ $name ] + self::GA_DATA_EXPIRATION_TIME ) < time() );
 
 
186
  } else {
187
  return ! empty( $last_time[ $name ] ) && ( $last_time[ $name ] + self::GA_DATA_EXPIRATION_TIME ) < time();
188
  }
 
189
 
190
- } else { // Validate cache for all requests
191
-
192
- // If any of existing caches is outdated
193
  foreach ( $last_time as $item => $time ) {
194
- // if appendix is set then check only entries concerns given appendix
195
- if ( ! empty( $appendix ) ) {
196
- if ( ! empty( $appendix ) && preg_match( '/' . $appendix . '/', $item ) && ( $time + self::GA_DATA_EXPIRATION_TIME ) < time() ) {
 
 
197
  $outdated ++;
198
  }
199
  } else {
200
- if ( ( $time + self::GA_DATA_EXPIRATION_TIME ) < time() ) {
201
- $outdated ++;
 
202
  }
203
  }
204
- }
205
 
206
  return $outdated > 0;
207
  }
@@ -209,5 +221,4 @@ class Ga_Cache {
209
 
210
  return false;
211
  }
212
-
213
  }
1
  <?php
 
2
  /**
3
+ * Request caching tool.
4
  *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ /**
9
+ * Cache class.
10
  */
11
  class Ga_Cache {
12
 
25
 
26
  const GA_WAIT_AFTER_ERROR_TIME = 300; // 60 * 5 = 5 min
27
 
28
+ /**
29
+ * Add cache options.
30
+ *
31
+ * @return void
32
+ */
33
  public static function add_cache_options() {
34
  add_option( self::GA_LAST_CACHE_OPTION_NAME );
35
  add_option( self::GA_BUFFER_CACHE_OPTION_NAME );
36
  add_option( self::GA_LAST_TIME_ATTEMPT_OPTION_NAME );
37
  }
38
 
39
+ /**
40
+ * Delete cache options.
41
+ *
42
+ * @return void
43
+ */
44
  public static function delete_cache_options() {
45
  delete_option( self::GA_LAST_CACHE_OPTION_NAME );
46
  delete_option( self::GA_BUFFER_CACHE_OPTION_NAME );
50
  /**
51
  * Generates transient name.
52
  *
53
+ * @param string $rest_url Rest URL string.
54
+ * @param array $query_params Query params.
55
+ * @param string $appendix String to append.
56
  *
57
  * @return string
58
  */
59
+ public static function get_transient_name( $rest_url, $query_params, $appendix = '' ) {
60
 
61
+ if ( is_array( $query_params ) ) {
62
+ $query_params = wp_json_encode( $query_params );
63
  }
64
 
65
  $name = md5( $rest_url . $query_params );
66
 
67
+ return self::GA_TRANSIENT_PREFIX . $name . '_' . $appendix;
68
  }
69
 
70
  /**
71
  * Gets cached data.
72
  *
73
+ * @param string $name Cache key string.
74
  *
75
  * @return bool|mixed
76
  */
77
  public static function get_cached_result( $name ) {
78
+ $data = get_option( self::GA_BUFFER_CACHE_OPTION_NAME );
79
 
80
+ // Check if cache exists.
81
+ if ( false === empty( $data[ $name ] ) ) {
 
 
82
  return $data[ $name ];
83
+ } else {
84
+ return false;
 
85
  }
86
+ }
87
 
88
  /**
89
+ * Sets cache value.
90
  *
91
+ * @param string $name Cache key name.
92
+ * @param mixed $result Cache key value.
93
  */
94
  public static function set_cache( $name, $result ) {
95
+ if ( false === empty( $result ) ) {
96
  self::set_last_cache_time( $name );
97
  self::set_cache_buffer( $name, $result );
98
  self::delete_last_time_attempt();
102
  /**
103
  * Updates the time the response was cached.
104
  *
105
+ * @param string $name Cache key name.
106
  */
107
  public static function set_last_cache_time( $name ) {
108
  $data = get_option( self::GA_LAST_CACHE_OPTION_NAME );
120
  /**
121
  * Sets or update data cache.
122
  *
123
+ * @param string $name Cache key name.
124
+ * @param string $result Cache key value.
125
  */
126
  public static function set_cache_buffer( $name, $result ) {
127
  $data = get_option( self::GA_BUFFER_CACHE_OPTION_NAME );
140
  * Sets last time attempt option
141
  */
142
  public static function set_last_time_attempt() {
143
+ update_option( self::GA_LAST_TIME_ATTEMPT_OPTION_NAME, time() );
144
  }
145
 
146
  /**
155
  *
156
  * Next api request is allowed when there was an unsuccessful attempt and data_cache is empty.
157
  *
158
+ * @param string $name Name string.
159
  *
160
  * @return bool
161
  */
162
  public static function is_next_request_allowed( $name ) {
163
+ $last_time_attempt = get_option( self::GA_LAST_TIME_ATTEMPT_OPTION_NAME );
 
164
 
165
+ if ( true === empty( $last_time_attempt ) ) {
166
+ // If there is no last_time_attempt then return true.
167
  return true;
168
+ } else {
169
+ $outdated_last_attempt_time = ( $last_time_attempt + self::GA_WAIT_AFTER_ERROR_TIME ) < time();
170
+ }
171
 
172
+ return ( false === empty( self::get_cached_result( $name ) ) && true === $outdated_last_attempt_time );
173
  }
174
 
175
  /**
176
  * Checks whether data cache is outdated.
177
+ *
178
+ * @param string $name Cache key name string.
179
+ * @param string $appendix Cache key string to append.
180
  *
181
  * @return bool
182
  */
183
+ public static function is_data_cache_outdated( $name = '', $appendix = '' ) {
184
+ $last_time = get_option( self::GA_LAST_CACHE_OPTION_NAME );
185
+ $outdated = 0;
186
+ if ( false === empty( $last_time ) ) {
187
+
188
+ // Validate cache for given rest name.
189
+ if ( false === empty( $name ) ) {
190
+
191
+ // If appendix is set then check only that cache which concerns given appendix.
192
+ if ( false === empty( $appendix ) ) {
193
+ return (
194
+ preg_match( '/' . $appendix . '/', $name )
195
+ && ( $last_time[ $name ] + self::GA_DATA_EXPIRATION_TIME ) < time()
196
+ );
197
  } else {
198
  return ! empty( $last_time[ $name ] ) && ( $last_time[ $name ] + self::GA_DATA_EXPIRATION_TIME ) < time();
199
  }
200
+ } else { // Validate cache for all requests.
201
 
202
+ // If any of existing caches is outdated.
 
 
203
  foreach ( $last_time as $item => $time ) {
204
+ // If appendix is set then check only entries concerns given appendix.
205
+ if ( false === empty( $appendix ) ) {
206
+ if (
207
+ preg_match( '/' . $appendix . '/', $item )
208
+ && ( $time + self::GA_DATA_EXPIRATION_TIME ) < time() ) {
209
  $outdated ++;
210
  }
211
  } else {
212
+ if ( ( $time + self::GA_DATA_EXPIRATION_TIME ) < time() ) {
213
+ $outdated ++;
214
+ }
215
  }
216
  }
 
217
 
218
  return $outdated > 0;
219
  }
221
 
222
  return false;
223
  }
 
224
  }
tools/{class-support-logging.php → class-ga-supportlogger.php} RENAMED
@@ -1,24 +1,44 @@
1
  <?php
2
-
3
-
 
 
 
 
 
 
 
4
  class Ga_SupportLogger {
5
  const LOG_OPTION = 'googleanalytics_sherethis_error_log';
6
 
7
- static $debug_info;
8
- static $debug_help_message;
 
 
 
 
 
 
 
 
 
 
 
9
 
10
  /**
11
  * Constructor.
 
12
  * @return void
13
  */
14
  public function __construct() {
15
  add_action( 'st_support_show_button', array( $this, 'display_button' ) );
16
- add_action( 'st_support_save_error', array( $this, 'save_error' ) );
17
  $this->get_debug_body();
18
  }
19
 
20
  /**
21
  * Displays a button to email the debugging info.
 
22
  * @return void
23
  */
24
  public function display_button() {
@@ -31,17 +51,22 @@ class Ga_SupportLogger {
31
 
32
  /**
33
  * Saves an error to the log.
 
34
  * @param Exception $err Error to save.
35
  * @return void
36
  */
37
  public function save_error( Exception $err ) {
38
  $cur_log = get_option( self::LOG_OPTION, array() );
39
 
 
 
 
 
40
  // Creates the error object.
41
  $new_log = array(
42
  'message' => $err->getMessage(),
43
- 'stack' => $err->getTraceAsString(),
44
- 'date' => current_time( 'r' ),
45
  );
46
 
47
  if ( method_exists( $err, 'get_google_error_response' ) ) {
@@ -59,6 +84,22 @@ class Ga_SupportLogger {
59
  update_option( self::LOG_OPTION, $cur_log );
60
  }
61
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
  public function get_debug_body() {
63
  $debug_error = $this->get_formatted_log();
64
 
@@ -70,20 +111,25 @@ class Ga_SupportLogger {
70
 
71
  $debug_message = $this->get_formatted_message();
72
 
73
- $debug_link = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
74
 
75
  $let_debug_message = '<br> If you are still experiencing the issue after that click <a href="' . $debug_link . '&sdb=true" id="debug-message">here</a>';
76
 
77
- $debug_help_message = !empty($_GET['sdb']) ? false : $this->get_debug_help_message($debug_message);
78
 
79
- if (isset($debug_help_message['message'])) {
80
- $body = $debug_help_message['message'];
 
 
81
  $body .= $debug_help_message['let-debug'] ? $let_debug_message : '';
82
 
83
- self::$debug_info = array('message' => $body, 'debug' => $debug_help_message['let-debug']);
 
 
 
84
  } else {
85
- $body = 'Debug Info:' . PHP_EOL . PHP_EOL;
86
- $body .= implode( $this->get_debug_info(), PHP_EOL );
87
  $body .= PHP_EOL . PHP_EOL . 'Error Log:' . PHP_EOL . PHP_EOL;
88
  $body .= esc_html( $debug_error );
89
 
@@ -91,113 +137,122 @@ class Ga_SupportLogger {
91
  }
92
  }
93
 
94
- public function get_debug_help_message($error) {
 
 
 
 
 
 
 
95
 
96
- switch ($error) {
97
  case 'invalid_grant':
98
  return array(
99
  'message' => 'Hi! It looks like you submitted the wrong authentication grant. Please try again by re-authenticating.',
100
- 'let-debug' => true
101
  );
102
- break;
103
  case 'SSL certificate problem: unable to get local issuer certificate (60)':
104
  return array(
105
  'message' => 'Hi! Please check your site\'s SSL certificate. A functioning SSL certificate is required',
106
- 'let-debug' => false
107
  );
108
- break;
109
  case 'SSL certificate problem: unable to get local issuer certificate':
110
  return array(
111
  'message' => 'Hi! Please check your site\'s SSL certificate. A functioning SSL certificate is required',
112
- 'let-debug' => false
113
  );
114
- break;
115
  case 'User does not have any Google Analytics account.':
116
  return array(
117
  'message' => 'Hi! Looks like we’re not able to find a Google Analytics account. Please double check to make sure the Google account you used to authenticate with has a working Google Analytics account setup.',
118
- 'let-debug' => false
119
  );
120
- break;
121
  case 'SSL certificate problem: certificate has expired (60)':
122
  return array(
123
  'message' => 'Hi! Please check your site\'s SSL certificate. A functioning SSL certificate is required',
124
- 'let-debug' => false
125
  );
126
- break;
127
  case 'SSL certificate problem, verify that the CA cert is OK':
128
  return array(
129
  'message' => 'Hi! Please check your site\'s SSL certificate. A functioning SSL certificate is required',
130
- 'let-debug' => false
131
  );
132
- break;
133
  }
134
 
135
  return array(
136
- 'message' => 'Hi! It appears something went wrong. We apologize for the inconvenience! Please try to re-authenticate your Google account and verify your site has a proper SSL certficiate.',
137
- 'let-debug' => true
138
  );
139
  }
140
 
141
  /**
142
  * Gets an array of debugging information about the current system.
 
143
  * @return array
144
  */
145
  private function get_debug_info() {
146
  $theme = wp_get_theme();
147
  $plugins = wp_get_active_and_valid_plugins();
148
 
149
- $data = array(
150
- 'Plugin Version' => GOOGLEANALYTICS_VERSION,
151
- 'WordPress Version' => get_bloginfo( 'version' ),
152
- 'PHP Version' => phpversion(),
153
- 'CURL Version' => $this->get_curl_version(),
154
- 'Site URL' => get_bloginfo( 'wpurl' ),
155
- 'Theme Name' => $theme->get( 'Name' ),
156
- 'Theme URL' => $theme->get( 'ThemeURI' ),
157
- 'Theme Version' => $theme->get( 'Version' ),
158
- 'Active Plugins' => implode( $plugins, ', ' ),
159
- 'Operating System' => $this->get_operating_system(),
160
- 'Web Server' => $_SERVER['SERVER_SOFTWARE'],
161
- 'Current Time' => current_time( 'r' ),
162
- 'Browser' => !empty( $_SERVER['HTTP_USER_AGENT'] ) ? $_SERVER['HTTP_USER_AGENT'] : '',
163
- 'Excluded roles' => get_option( 'googleanalytics_exclude_roles' ),
 
 
 
164
  'Manually Tracking ID enabled' => get_option( 'googleanalytics_web_property_id_manually' ),
165
- 'Manually typed Tracking ID' => get_option( 'googleanalytics_web_property_id_manually_value' ),
166
- 'Tracking ID' => get_option( 'googleanalytics_web_property_id' ),
167
  );
168
  $formatted = array();
169
  foreach ( $data as $text => $value ) {
170
- $formatted[] = sprintf(
171
- __( $text ) . ': %s',
172
- $value
173
  );
174
  }
 
175
  return $formatted;
176
  }
177
 
178
  /**
179
  * Gets CURL version
 
180
  * @return string
181
  */
182
- private function get_curl_version(){
183
  $curl_version = curl_version();
184
- return !empty( $curl_version['version'] ) ? $curl_version['version'] : '';
185
  }
186
 
187
  /**
188
  * Gets operating system
 
189
  * @return string
190
  */
191
- private function get_operating_system(){
192
  if ( function_exists( 'ini_get' ) ) {
193
  $disabled = explode( ',', ini_get( 'disable_functions' ) );
194
- return !in_array( 'php_uname', $disabled ) ? php_uname() : PHP_OS;
195
  }
196
  return PHP_OS;
197
  }
198
 
199
  /**
200
  * Gets a string of formatted error log entries.
 
201
  * @return string
202
  */
203
  private function get_formatted_log() {
@@ -218,6 +273,7 @@ class Ga_SupportLogger {
218
 
219
  /**
220
  * Gets a string of formatted of just the message
 
221
  * @return string
222
  */
223
  private function get_formatted_message() {
@@ -226,7 +282,7 @@ class Ga_SupportLogger {
226
  return 'None';
227
  }
228
 
229
- return isset($log[0]['message']) ? $log[0]['message'] : '';
230
  }
231
 
232
  }
1
  <?php
2
+ /**
3
+ * Support Logger class.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ /**
9
+ * GA Support Logger class.
10
+ */
11
  class Ga_SupportLogger {
12
  const LOG_OPTION = 'googleanalytics_sherethis_error_log';
13
 
14
+ /**
15
+ * Debug info.
16
+ *
17
+ * @var mixed Info.
18
+ */
19
+ public static $debug_info;
20
+
21
+ /**
22
+ * Debug help message.
23
+ *
24
+ * @var string Message.
25
+ */
26
+ public static $debug_help_message;
27
 
28
  /**
29
  * Constructor.
30
+ *
31
  * @return void
32
  */
33
  public function __construct() {
34
  add_action( 'st_support_show_button', array( $this, 'display_button' ) );
35
+ add_action( 'st_support_save_error', array( $this, 'save_error' ) );
36
  $this->get_debug_body();
37
  }
38
 
39
  /**
40
  * Displays a button to email the debugging info.
41
+ *
42
  * @return void
43
  */
44
  public function display_button() {
51
 
52
  /**
53
  * Saves an error to the log.
54
+ *
55
  * @param Exception $err Error to save.
56
  * @return void
57
  */
58
  public function save_error( Exception $err ) {
59
  $cur_log = get_option( self::LOG_OPTION, array() );
60
 
61
+ if ( false === is_array( $cur_log ) ) {
62
+ $cur_log = array();
63
+ }
64
+
65
  // Creates the error object.
66
  $new_log = array(
67
  'message' => $err->getMessage(),
68
+ 'stack' => $err->getTraceAsString(),
69
+ 'date' => current_time( 'r' ),
70
  );
71
 
72
  if ( method_exists( $err, 'get_google_error_response' ) ) {
84
  update_option( self::LOG_OPTION, $cur_log );
85
  }
86
 
87
+ /**
88
+ * Get Current URL.
89
+ *
90
+ * @return string|void
91
+ */
92
+ public static function get_current_url() {
93
+ $request_uri = filter_input( INPUT_SERVER, 'REQUEST_URI', FILTER_SANITIZE_STRING );
94
+
95
+ return wp_unslash( $request_uri );
96
+ }
97
+
98
+ /**
99
+ * Get debug body.
100
+ *
101
+ * @return void
102
+ */
103
  public function get_debug_body() {
104
  $debug_error = $this->get_formatted_log();
105
 
111
 
112
  $debug_message = $this->get_formatted_message();
113
 
114
+ $debug_link = self::get_current_url();
115
 
116
  $let_debug_message = '<br> If you are still experiencing the issue after that click <a href="' . $debug_link . '&sdb=true" id="debug-message">here</a>';
117
 
118
+ $sdb = filter_input( INPUT_GET, 'sdb', FILTER_SANITIZE_STRING );
119
 
120
+ $debug_help_message = false === empty( $sdb ) ? false : $this->get_debug_help_message( $debug_message );
121
+
122
+ if ( isset( $debug_help_message['message'] ) ) {
123
+ $body = $debug_help_message['message'];
124
  $body .= $debug_help_message['let-debug'] ? $let_debug_message : '';
125
 
126
+ self::$debug_info = array(
127
+ 'message' => $body,
128
+ 'debug' => $debug_help_message['let-debug'],
129
+ );
130
  } else {
131
+ $body = 'Debug Info:' . PHP_EOL . PHP_EOL;
132
+ $body .= implode( PHP_EOL, $this->get_debug_info() );
133
  $body .= PHP_EOL . PHP_EOL . 'Error Log:' . PHP_EOL . PHP_EOL;
134
  $body .= esc_html( $debug_error );
135
 
137
  }
138
  }
139
 
140
+ /**
141
+ * Get debug help message.
142
+ *
143
+ * @param string $error Error string.
144
+ *
145
+ * @return array Array with message and let-debug boolean.
146
+ */
147
+ public function get_debug_help_message( $error ) {
148
 
149
+ switch ( $error ) {
150
  case 'invalid_grant':
151
  return array(
152
  'message' => 'Hi! It looks like you submitted the wrong authentication grant. Please try again by re-authenticating.',
153
+ 'let-debug' => true,
154
  );
 
155
  case 'SSL certificate problem: unable to get local issuer certificate (60)':
156
  return array(
157
  'message' => 'Hi! Please check your site\'s SSL certificate. A functioning SSL certificate is required',
158
+ 'let-debug' => false,
159
  );
 
160
  case 'SSL certificate problem: unable to get local issuer certificate':
161
  return array(
162
  'message' => 'Hi! Please check your site\'s SSL certificate. A functioning SSL certificate is required',
163
+ 'let-debug' => false,
164
  );
 
165
  case 'User does not have any Google Analytics account.':
166
  return array(
167
  'message' => 'Hi! Looks like we’re not able to find a Google Analytics account. Please double check to make sure the Google account you used to authenticate with has a working Google Analytics account setup.',
168
+ 'let-debug' => false,
169
  );
 
170
  case 'SSL certificate problem: certificate has expired (60)':
171
  return array(
172
  'message' => 'Hi! Please check your site\'s SSL certificate. A functioning SSL certificate is required',
173
+ 'let-debug' => false,
174
  );
 
175
  case 'SSL certificate problem, verify that the CA cert is OK':
176
  return array(
177
  'message' => 'Hi! Please check your site\'s SSL certificate. A functioning SSL certificate is required',
178
+ 'let-debug' => false,
179
  );
 
180
  }
181
 
182
  return array(
183
+ 'message' => 'Hi! It appears something went wrong. We apologize for the inconvenience! Please try to re-authenticate your Google account and verify your site has a proper SSL certficiate.',
184
+ 'let-debug' => true,
185
  );
186
  }
187
 
188
  /**
189
  * Gets an array of debugging information about the current system.
190
+ *
191
  * @return array
192
  */
193
  private function get_debug_info() {
194
  $theme = wp_get_theme();
195
  $plugins = wp_get_active_and_valid_plugins();
196
 
197
+ $server_software = filter_input( INPUT_SERVER, 'SERVER_SOFTWARE', FILTER_SANITIZE_STRING );
198
+ $http_user_agent = filter_input( INPUT_SERVER, 'HTTP_USER_AGENT', FILTER_SANITIZE_STRING );
199
+
200
+ $data = array(
201
+ 'Plugin Version' => GOOGLEANALYTICS_VERSION,
202
+ 'WordPress Version' => get_bloginfo( 'version' ),
203
+ 'PHP Version' => phpversion(),
204
+ 'CURL Version' => $this->get_curl_version(),
205
+ 'Site URL' => get_bloginfo( 'wpurl' ),
206
+ 'Theme Name' => $theme->get( 'Name' ),
207
+ 'Theme URL' => $theme->get( 'ThemeURI' ),
208
+ 'Theme Version' => $theme->get( 'Version' ),
209
+ 'Active Plugins' => implode( ', ', $plugins ),
210
+ 'Operating System' => $this->get_operating_system(),
211
+ 'Web Server' => $server_software,
212
+ 'Current Time' => current_time( 'r' ),
213
+ 'Browser' => false === empty( $http_user_agent ) ? $http_user_agent : '',
214
+ 'Excluded roles' => get_option( 'googleanalytics_exclude_roles' ),
215
  'Manually Tracking ID enabled' => get_option( 'googleanalytics_web_property_id_manually' ),
216
+ 'Manually typed Tracking ID' => get_option( 'googleanalytics_web_property_id_manually_value' ),
217
+ 'Tracking ID' => get_option( 'googleanalytics_web_property_id' ),
218
  );
219
  $formatted = array();
220
  foreach ( $data as $text => $value ) {
221
+ /* translators: %s refers to the value of the message. */
222
+ $formatted[] = esc_html__(
223
+ $text . sprintf( ': %s', $value ) // phpcs:ignore
224
  );
225
  }
226
+
227
  return $formatted;
228
  }
229
 
230
  /**
231
  * Gets CURL version
232
+ *
233
  * @return string
234
  */
235
+ private function get_curl_version() {
236
  $curl_version = curl_version();
237
+ return ! empty( $curl_version['version'] ) ? $curl_version['version'] : '';
238
  }
239
 
240
  /**
241
  * Gets operating system
242
+ *
243
  * @return string
244
  */
245
+ private function get_operating_system() {
246
  if ( function_exists( 'ini_get' ) ) {
247
  $disabled = explode( ',', ini_get( 'disable_functions' ) );
248
+ return false === in_array( 'php_uname', $disabled, true ) ? php_uname() : PHP_OS;
249
  }
250
  return PHP_OS;
251
  }
252
 
253
  /**
254
  * Gets a string of formatted error log entries.
255
+ *
256
  * @return string
257
  */
258
  private function get_formatted_log() {
273
 
274
  /**
275
  * Gets a string of formatted of just the message
276
+ *
277
  * @return string
278
  */
279
  private function get_formatted_message() {
282
  return 'None';
283
  }
284
 
285
+ return isset( $log[0]['message'] ) ? $log[0]['message'] : '';
286
  }
287
 
288
  }
view/ga-accounts-selector.php ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Accounts Selector view.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ // Set add_manually_enabled fallback.
9
+ $add_manually_enabled = isset( $add_manually_enabled ) ? $add_manually_enabled : false;
10
+
11
+ // Set selected value fallback.
12
+ $selected = isset( $selected ) ? $selected : '';
13
+ ?>
14
+ <div class="wrap">
15
+ <input type="hidden" name="<?php echo esc_attr( Ga_Admin::GA_SELECTED_ACCOUNT ); ?>"
16
+ value="<?php echo esc_attr( $selected ); ?>">
17
+ <select id="ga_account_selector"
18
+ name="<?php echo esc_attr( Ga_Admin::GA_SELECTED_ACCOUNT ); ?>"
19
+ <?php echo disabled( true === $add_manually_enabled ); ?>
20
+ >
21
+ <option><?php echo esc_html__( 'Please select your Google Analytics account:', 'googleanalytics' ); ?></option>
22
+ <?php
23
+ if ( false === empty( $selector ) ) :
24
+ foreach ( $selector as $account ) :
25
+ ?>
26
+ <optgroup label="<?php echo esc_attr( $account['name'] ); ?>">
27
+ <?php foreach ( $account['webProperties'] as $property ) : ?>
28
+ <?php
29
+ foreach ( $property['profiles'] as $profile ) :
30
+ $profile_value = $account['id'] . '_' . $property['webPropertyId'] . '_' . $profile['id'];
31
+ $profile_label = $property['name'] . '&nbsp;[' . $property['webPropertyId'] . '][' . $profile['id'] . ']';
32
+ ?>
33
+ <option value="<?php echo esc_attr( $profile_value ); ?>"
34
+ <?php echo selected( $selected, $profile_value ); ?>
35
+ >
36
+ <?php echo esc_html( $profile_label ); ?>
37
+ </option>
38
+ <?php endforeach; ?>
39
+ <?php endforeach; ?>
40
+ </optgroup>
41
+ <?php
42
+ endforeach;
43
+ endif;
44
+ ?>
45
+ </select>
46
+ </div>
47
+
view/ga-auth-button.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * GA Auth Button view.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ // Template partial fallback values.
9
+ $label = isset( $label ) ? $label : '';
10
+ $manually_id = isset( $manually_id ) ? $manually_id : '';
11
+ $button_type = isset( $button_type ) ? $button_type : '';
12
+ $url = isset( $url ) ? $url : '';
13
+ $classes = array();
14
+
15
+ // Determine button classes.
16
+ if ( 'auth' === $button_type ) {
17
+ $classes[] = 'button-primary';
18
+ } else {
19
+ $classes[] = 'button-secondary';
20
+ }
21
+ ?>
22
+ <button id="ga_authorize_with_google_button"
23
+ class="<?php echo esc_attr( implode( ' ', $classes ) ); ?>"
24
+ <?php if ( true === Ga_Helper::are_features_enabled() ) : ?>
25
+ onclick="ga_popup.authorize( event, '<?php echo esc_attr( $url ); ?>' )"
26
+ <?php endif; ?>
27
+ <?php
28
+ echo disabled(
29
+ false === empty( $manually_id )
30
+ || false === Ga_Helper::are_features_enabled()
31
+ || true === Ga_Helper::is_curl_disabled()
32
+ );
33
+ ?>
34
+ ><?php echo esc_html( $label ); ?>
35
+ </button>
view/{ga_code.php → ga-code.php} RENAMED
@@ -1,3 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <script>
2
  (function() {
3
  (function (i, s, o, g, r, a, m) {
@@ -10,7 +23,7 @@
10
  a.async = 1;
11
  a.src = g;
12
  m.parentNode.insertBefore(a, m)
13
- })(window, document, 'script', 'https://google-analytics.com/analytics.js', 'ga');
14
 
15
  ga('create', '<?php echo esc_attr( $data[ Ga_Admin::GA_WEB_PROPERTY_ID_OPTION_NAME ] ); ?>', 'auto');
16
  <?php if ( 'on' === $data['anonymization'] ) : ?>
1
+ <?php
2
+ /**
3
+ * Code view.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ $debug_mode_on = isset( $debug_mode_on ) ? $debug_mode_on : false;
9
+
10
+ $script = ( true === $debug_mode_on ) ?
11
+ 'https://google-analytics.com/analytics_debug.js' :
12
+ 'https://google-analytics.com/analytics.js';
13
+ ?>
14
  <script>
15
  (function() {
16
  (function (i, s, o, g, r, a, m) {
23
  a.async = 1;
24
  a.src = g;
25
  m.parentNode.insertBefore(a, m)
26
+ })(window, document, 'script', '<?php echo esc_url( $script ); ?>', 'ga');
27
 
28
  ga('create', '<?php echo esc_attr( $data[ Ga_Admin::GA_WEB_PROPERTY_ID_OPTION_NAME ] ); ?>', 'auto');
29
  <?php if ( 'on' === $data['anonymization'] ) : ?>
view/ga-dashboard-widget.php ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Dashboard Widget view.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ $ga_nonce = isset( $ga_nonce ) ? $ga_nonce : '';
9
+ $more_details_url = isset( $more_details_url ) ? $more_details_url : '#';
10
+ $show_trigger_button = isset( $show_trigger_button ) ? $show_trigger_button : false;
11
+ ?>
12
+ <div class="wrap ga-wrap">
13
+ <div class="form-group">
14
+ <select id="range-selector" autocomplete="off">
15
+ <option value="7daysAgo"><?php esc_html_e( 'Last 7 Days', 'googleanalytics' ); ?></option>
16
+ <option value="30daysAgo" selected="selected">
17
+ <?php esc_html_e( 'Last 30 Days', 'googleanalytics' ); ?></option>
18
+ <option value="90daysAgo"><?php esc_html_e( 'Last 90 Days', 'googleanalytics' ); ?></option>
19
+ </select>
20
+
21
+ <select id="metrics-selector" autocomplete="off">
22
+ <option value="pageviews"><?php esc_html_e( 'Pageviews', 'googleanalytics' ); ?></option>
23
+ <option value="sessions"><?php esc_html_e( 'Visits', 'googleanalytics' ); ?></option>
24
+ <option value="users"><?php esc_html_e( 'Users', 'googleanalytics' ); ?></option>
25
+ <option value="organicSearches"><?php esc_html_e( 'Organic Search', 'googleanalytics' ); ?></option>
26
+ <option value="visitBounceRate"><?php esc_html_e( 'Bounce Rate', 'googleanalytics' ); ?></option>
27
+ </select>
28
+
29
+ <div class="ga-loader-wrapper">
30
+ <div class="ga-loader"></div>
31
+ </div>
32
+ </div>
33
+
34
+ <div>
35
+ <div id="chart_div" style="width: 100%;">
36
+ <?php if ( true === $show_trigger_button ) : ?>
37
+ <div style="text-align: center">
38
+ <div style="margin: 20px auto;">
39
+ <button id="ga-widget-trigger" style="border: 1px solid #cccccc;width: 60%; padding: 10px"
40
+ class="button-link">
41
+ <?php esc_html_e( 'Click here to get data', 'googleanalytics' ); ?>
42
+ </button>
43
+ </div>
44
+ </div>
45
+ <?php endif; ?>
46
+ </div>
47
+ <div id="ga_widget_error" class="notice notice-warning hidden"></div>
48
+ <div>
49
+ <div id="boxes-container">
50
+ <div class="ga-box-row">
51
+ <?php if ( false === empty( $boxes ) ) : ?>
52
+ <?php $iter = 1; ?>
53
+ <?php foreach ( $boxes as $k => $v ) : ?>
54
+ <div class="ga-box-column ga-box-dashboard">
55
+ <div style="color: grey; font-size: 13px;" id="ga_box_dashboard_label_<?php echo esc_attr( $k ); ?>">
56
+ <?php echo esc_html( $v['label'] ); ?></div>
57
+ <div style="font-size: 15px;" id="ga_box_dashboard_value_<?php echo esc_attr( $k ); ?>">
58
+ <?php echo esc_html( $v['value'] ); ?></div>
59
+ </div>
60
+ <?php if ( ( ( $iter ++ ) % 3 ) === 0 ) : ?>
61
+ </div>
62
+ <div class="ga-box-row">
63
+ <?php endif; ?>
64
+ <?php endforeach; ?>
65
+ <?php endif; ?>
66
+ </div>
67
+ </div>
68
+ </div>
69
+ </div>
70
+
71
+ <div style="margin-top: 5px;">
72
+ <?php
73
+ echo wp_kses_post(
74
+ sprintf(
75
+ '<a href="%s">' . __( 'Show more details' ) . '</a>',
76
+ esc_url( $more_details_url )
77
+ )
78
+ );
79
+ ?>
80
+ </div>
81
+ </div>
82
+
83
+ <script type="text/javascript">
84
+ const GA_NONCE = '<?php echo esc_js( $ga_nonce ); ?>';
85
+ const GA_NONCE_FIELD = '<?php echo esc_js( Ga_Admin_Controller::GA_NONCE_FIELD_NAME ); ?>';
86
+ <?php if ( false === $show_trigger_button ) : ?>
87
+ <?php if ( false === empty( $chart ) ) : ?>
88
+ dataArr = [ [ 'Day', 'Pageviews' ],
89
+ <?php
90
+ $arr = '';
91
+ foreach ( $chart as $row ) {
92
+ if ( $arr ) {
93
+ $arr .= ',';
94
+ }
95
+ $arr .= "['" . $row['day'] . "'," . $row['current'] . ']';
96
+ }
97
+
98
+ echo esc_js( $arr );
99
+ ?>
100
+ ];
101
+
102
+ ga_dashboard.init( dataArr, true );
103
+ ga_dashboard.events( dataArr );
104
+ <?php endif; ?>
105
+ <?php else : ?>
106
+ dataArr = [ [ 'Day', 'Pageviews' ], [] ];
107
+ ga_dashboard.init( false, false );
108
+ ga_dashboard.events();
109
+ <?php endif; ?>
110
+ </script>
view/ga-debug-modal.php ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Debug Modal view.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ $sdb = filter_input( INPUT_GET, 'sdb', FILTER_SANITIZE_STRING );
9
+
10
+ $debug_info = isset( $debug_info ) ? $debug_info : array();
11
+ $show_modal = false === empty( $sdb ) ? 'style=display:block;' : '';
12
+ ?>
13
+
14
+ <div id="ga_debug_modal" class="ga-modal" tabindex="-1" <?php echo esc_attr( $show_modal ); ?>>
15
+ <div class="ga-modal-dialog">
16
+ <div id="ga_debug_modal_content" class="ga-modal-content">
17
+ <div class="ga-modal-header">
18
+ <h4 class="ga-modal-title"><?php echo esc_html( 'Debug helper:' ); ?></h4>
19
+ <span id="ga_close" class="ga-close">&times;</span>
20
+ </div>
21
+ <div class="ga-modal-body">
22
+ <div class="ga-loader-wrapper">
23
+ <div class="ga-loader"></div>
24
+ </div>
25
+ <div class="ga-debug-form-div">
26
+ <?php if ( is_array( $debug_info ) ) : ?>
27
+ <?php echo wp_kses_post( $debug_info['message'] ); ?>
28
+ <?php else : ?>
29
+ <h4 class="ga-modal-title"><?php echo esc_html( 'Copy and paste this debug info into an email and send to support@sharethis.com' ); ?></h4>
30
+ <label for="ga_debug_info"
31
+ class="ga-debug-form-label"><strong><?php echo esc_html( 'Debug info' ); ?></strong>:</label>
32
+ <textarea id="ga_debug_info" class="ga-debug-form-field" rows="8"
33
+ cols="50"><?php echo esc_html( $debug_info ); ?></textarea>
34
+ <div class="ga-modal-footer">
35
+ <button type="button" id="copy-debug" class="button">
36
+ <?php
37
+ esc_html_e(
38
+ 'Copy',
39
+ 'google-analytics'
40
+ );
41
+ ?>
42
+ </button>
43
+ <button id="ga_btn_close" type="button" class="button">Close</button>
44
+ </div>
45
+ <?php endif; ?>
46
+ </div>
47
+ </div>
48
+ </div><!-- /.modal-content -->
49
+ </div><!-- /.modal-dialog -->
50
+ </div><!-- /.modal -->
view/ga-googleanalytics-loader.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * GoogleAnalytics Loader view.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ ?>
9
+ <script>
10
+ jQuery(document).ready(function () {
11
+ jQuery.post(
12
+ '<?php echo esc_url( $ajaxurl ); ?>',
13
+ {action: 'googleanalytics_get_script'}, function(response) {
14
+ var s = document.createElement("script");
15
+ s.type = "text/javascript";
16
+ s.innerHTML = response;
17
+ jQuery("head").append(s);
18
+ });
19
+ });
20
+ </script>
view/ga-notice.php ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Notice view.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ $url = isset( $url ) ? $url : '';
9
+ ?>
10
+ <div id="googleanalytics_terms_notice"
11
+ class="notice notice-warning <?php echo esc_attr( Ga_Helper::is_plugin_page() ? '' : 'is-dismissible' ); ?>">
12
+ <p>
13
+ Google Analytics <?php echo esc_html( GOOGLEANALYTICS_VERSION ); ?> plugin <a
14
+ href="http://www.sharethis.com/news/2016/12/sharethis-adds-analytics-plugin-to-suite-of-tools/"
15
+ target="_blank">has joined the ShareThis family.</a> <strong>A host of new features</strong> have been
16
+ added in this version, including Google Analytics dashboards, demographics and device data.
17
+ The update requires agreeing to the <a href="http://www.sharethis.com/privacy/" target="_blank">privacy
18
+ policy</a> and <a
19
+ href="http://www.sharethis.com/publisher-terms-of-use/" target="_blank">terms of use</a> to enable them.
20
+ <a href="<?php echo esc_url( $url ); ?>"><span class="button button-primary">I accept</span></a>
21
+ </p>
22
+ </div>
view/ga-oauth-notice.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * OAuth Notice view.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ $msg = isset( $msg ) ? $msg : '';
9
+ ?>
10
+ <div class="ga-alert ga-alert-warning">
11
+ <?php echo wp_kses_post( $msg ); ?>
12
+ </div>
view/ga-wp-notice.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * WP Notice view.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ $is_dismissable = isset( $is_dismissable ) ? $is_dismissable : false;
9
+
10
+ $msg = isset( $msg ) ? $msg : '';
11
+
12
+ $notice_type = isset( $notice_type ) ? $notice_type : '';
13
+ ?>
14
+ <div class="notice notice-<?php echo esc_attr( $notice_type ); ?> <?php echo false === empty( $is_dismissable ) ? 'is-dismissible' : ''; ?>">
15
+ <p><?php echo esc_html( $msg ); ?>
16
+ <?php if ( ! empty( $action ) ) : ?>
17
+ <button onclick="window.location.href='<?php echo esc_js( $action['url'] ); ?>'"
18
+ class="button button-primary"><?php echo esc_html( $action['label'] ); ?></button>
19
+ <?php endif; ?>
20
+ </p>
21
+ </div>
view/ga_accounts_selector.php DELETED
@@ -1,26 +0,0 @@
1
- <div class="wrap">
2
- <input type="hidden" name="<?php echo esc_attr( Ga_Admin::GA_SELECTED_ACCOUNT ); ?>"
3
- value="<?php echo esc_attr( $selected ); ?>">
4
- <select id="ga_account_selector"
5
- name="<?php echo esc_attr( Ga_Admin::GA_SELECTED_ACCOUNT ); ?>" <?php echo esc_attr( $add_manually_enabled ? 'disabled="disabled"' : '' ); ?>>
6
- <option><?php _e( 'Please select your Google Analytics account:' ); ?></option>
7
- <?php
8
- if ( ! empty( $selector ) ) {
9
- foreach ( $selector as $account ) {
10
- ?>
11
- <optgroup label="<?php echo $account['name']; ?>">
12
- <?php foreach ( $account['webProperties'] as $property ): ?>
13
- <?php foreach ( $property['profiles'] as $profile ): ?>
14
- <option
15
- value="<?php echo esc_attr( $account['id'] . "_" . $property['webPropertyId'] . "_" . $profile['id'] ) ?>"
16
- <?php echo( $selected === $account['id'] . "_" . $property['webPropertyId'] . "_" . $profile['id'] ? 'selected="selected"' : '' ); ?>><?php echo esc_html( $property['name'] . "&nbsp;[" . $property['webPropertyId'] . "][" . $profile['id'] . "]" ) ?></option>
17
- <?php endforeach; ?>
18
- <?php endforeach; ?>
19
- </optgroup>
20
- <?php
21
- }
22
- }
23
- ?>
24
- </select>
25
- </div>
26
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
view/ga_auth_button.php DELETED
@@ -1,7 +0,0 @@
1
- <button id="ga_authorize_with_google_button" class="<?php echo ( $type == 'auth' ) ? 'button-primary' : 'button-secondary' ?>"
2
- <?php if ( Ga_Helper::are_features_enabled() ) : ?>
3
- onclick="ga_popup.authorize( event, '<?php echo esc_attr( $url ); ?>' )"
4
- <?php endif; ?>
5
- <?php echo( ( esc_attr( $manually_id ) || ! Ga_Helper::are_features_enabled() || Ga_Helper::is_curl_disabled() ) ? 'disabled="disabled"' : '' ); ?>
6
- ><?php _e( $label ) ?>
7
- </button>
 
 
 
 
 
 
 
view/ga_dashboard_widget.php DELETED
@@ -1,88 +0,0 @@
1
- <div class="wrap ga-wrap">
2
-
3
- <div class="form-group">
4
- <select id="range-selector" autocomplete="off">
5
- <option value="7daysAgo">Last 7 Days</option>
6
- <option value="30daysAgo" selected="selected">Last 30 Days</option>
7
- <option value="90daysAgo">Last 90 Days</option>
8
- </select>
9
-
10
- <select id="metrics-selector" autocomplete="off">
11
- <option value="pageviews">Pageviews</option>
12
- <option value="sessions">Visits</option>
13
- <option value="users">Users</option>
14
- <option value="organicSearches">Organic Search</option>
15
- <option value="visitBounceRate">Bounce Rate</option>
16
- </select>
17
-
18
- <div class="ga-loader-wrapper">
19
- <div class="ga-loader"></div>
20
- </div>
21
- </div>
22
-
23
- <div>
24
- <div id="chart_div" style="width: 100%;">
25
- <?php if ( $show_trigger_button ): ?>
26
- <div style="text-align: center">
27
- <div style="margin: 20px auto;">
28
- <button id="ga-widget-trigger" style="border: 1px solid #cccccc;width: 60%; padding: 10px"
29
- class="button-link">Click here to get data
30
- </button>
31
- </div>
32
- </div>
33
- <?php endif; ?>
34
- </div>
35
- <div id="ga_widget_error" class="notice notice-warning" style="display: none;"></div>
36
- <div>
37
- <div id="boxes-container">
38
- <div class="ga-box-row">
39
- <?php if ( ! empty( $boxes ) ) : ?>
40
- <?php $iter = 1; ?>
41
- <?php foreach ( $boxes as $k => $v ) : ?>
42
- <div class="ga-box-column ga-box-dashboard">
43
- <div style="color: grey; font-size: 13px;"
44
- id="ga_box_dashboard_label_<?php echo $k; ?>"><?php echo $v['label'] ?></div>
45
- <div style="font-size: 15px;"
46
- id="ga_box_dashboard_value_<?php echo $k; ?>"><?php echo $v['value'] ?></div>
47
- </div>
48
- <?php if ( ( ( $iter ++ ) % 3 ) == 0 ) : ?>
49
- </div>
50
- <div class="ga-box-row">
51
- <?php endif; ?>
52
- <?php endforeach; ?>
53
- <?php endif; ?>
54
- </div>
55
- </div>
56
- </div>
57
- </div>
58
-
59
- <div style="margin-top: 5px;"><?php echo sprintf( '<a href="%s">' . __( 'Show more details' ) . '</a>',
60
- $more_details_url ); ?></div>
61
- </div>
62
-
63
- <script type="text/javascript">
64
- const GA_NONCE = '<?php echo $ga_nonce; ?>';
65
- const GA_NONCE_FIELD = '<?php echo Ga_Admin_Controller::GA_NONCE_FIELD_NAME; ?>';
66
- <?php if ( empty( $show_trigger_button ) ): ?>
67
- <?php if ( ! empty( $chart ) ) : ?>
68
- dataArr = [['Day', 'Pageviews'],<?php
69
- $arr = "";
70
- foreach ( $chart as $row ) {
71
- if ( $arr ) {
72
- $arr .= ",";
73
- }
74
- $arr .= "['" . $row['day'] . "'," . $row['current'] . "]";
75
- }
76
-
77
- echo $arr;
78
- ?>];
79
-
80
- ga_dashboard.init(dataArr, true);
81
- ga_dashboard.events(dataArr);
82
- <?php endif; ?>
83
- <?php else: ?>
84
- dataArr = [['Day', 'Pageviews'], []];
85
- ga_dashboard.init(false, false);
86
- ga_dashboard.events();
87
- <?php endif; ?>
88
- </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
view/ga_debug_modal.php DELETED
@@ -1,32 +0,0 @@
1
- <?php
2
- $show_modal = !empty($_GET['sdb']) ? 'style=display:block;' : '';
3
- ?>
4
-
5
- <div id="ga_debug_modal" class="ga-modal" tabindex="-1" <?php echo esc_attr( $show_modal ); ?>>
6
- <div class="ga-modal-dialog">
7
- <div id="ga_debug_modal_content" class="ga-modal-content">
8
- <div class="ga-modal-header">
9
- <h4 class="ga-modal-title"><?php _e( 'Debug helper:' ) ?></h4>
10
- <span id="ga_close" class="ga-close">&times;</span>
11
- </div>
12
- <div class="ga-modal-body">
13
- <div class="ga-loader-wrapper">
14
- <div class="ga-loader"></div>
15
- </div>
16
- <div class="ga-debug-form-div">
17
- <?php if ( is_array( $debug_info ) ) : ?>
18
- <?php echo wp_kses_post( $debug_info['message'] ); ?>
19
- <?php else : ?>
20
- <h4 class="ga-modal-title"><?php _e( 'Copy and paste this debug info into an email and send to support@sharethis.com' ) ?></h4>
21
- <label for="ga_debug_info" class="ga-debug-form-label"><strong><?php _e( 'Debug info' ); ?></strong>:</label>
22
- <textarea id="ga_debug_info" class="ga-debug-form-field" rows="8" cols="50"><?php echo esc_html($debug_info); ?></textarea>
23
- <div class="ga-modal-footer">
24
- <button type="button" id="copy-debug" class="button"><?php esc_html_e( 'Copy', 'google-analytics' ); ?></button>
25
- <button id="ga_btn_close" type="button" class="button">Close</button>
26
- </div>
27
- <?php endif; ?>
28
- </div>
29
- </div>
30
- </div><!-- /.modal-content -->
31
- </div><!-- /.modal-dialog -->
32
- </div><!-- /.modal -->
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
view/ga_googleanalytics_loader.php DELETED
@@ -1,10 +0,0 @@
1
- <script>
2
- jQuery(document).ready(function () {
3
- jQuery.post('<?php echo esc_attr( $ajaxurl ); ?>', {action: 'googleanalytics_get_script'}, function(response) {
4
- var s = document.createElement("script");
5
- s.type = "text/javascript";
6
- s.innerHTML = response;
7
- jQuery("head").append(s);
8
- });
9
- });
10
- </script>
 
 
 
 
 
 
 
 
 
 
view/ga_notice.php DELETED
@@ -1,16 +0,0 @@
1
- <?php
2
- $url = isset($url) ? $url : '';
3
- ?>
4
- <div id="googleanalytics_terms_notice"
5
- class="notice notice-warning <?php echo Ga_Helper::is_plugin_page() ? '' : 'is-dismissible'; ?>">
6
- <p>
7
- Google Analytics <?php echo esc_html(GOOGLEANALYTICS_VERSION); ?> plugin <a
8
- href="http://www.sharethis.com/news/2016/12/sharethis-adds-analytics-plugin-to-suite-of-tools/"
9
- target="_blank">has joined the ShareThis family.</a> <strong>A host of new features</strong> have been
10
- added in this version, including Google Analytics dashboards, demographics and device data.
11
- The update requires agreeing to the <a href="http://www.sharethis.com/privacy/" target="_blank">privacy
12
- policy</a> and <a
13
- href="http://www.sharethis.com/publisher-terms-of-use/" target="_blank">terms of use</a> to enable them.
14
- <a href="<?php echo esc_url($url); ?>"><span class="button button-primary">I accept</span></a>
15
- </p>
16
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
view/ga_oauth_notice.php DELETED
@@ -1,3 +0,0 @@
1
- <div class="ga-alert ga-alert-warning">
2
- <?php echo $msg; ?>
3
- </div>
 
 
 
view/ga_wp_notice.php DELETED
@@ -1,9 +0,0 @@
1
- <div class="notice notice-<?php echo $type; ?> <?php echo( ! empty( $is_dismissable ) ? 'is-dismissible' : '' ); ?>">
2
- <p><?php echo $msg; ?>
3
- <?php if ( ! empty( $action ) ): ?>
4
- &nbsp;
5
- <button onclick="window.location.href='<?php echo $action['url']; ?>'"
6
- class="button button-primary"><?php echo $action['label']; ?></button>
7
- <?php endif; ?>
8
- </p>
9
- </div>
 
 
 
 
 
 
 
 
 
view/page.php CHANGED
@@ -1,268 +1,374 @@
1
  <?php
 
 
 
 
 
 
2
  $optimize_code = get_option( 'googleanalytics_optimize_code' );
3
  $universal = get_option( 'googleanalytics_enable_universal_analytics', true );
4
  $anonymization = get_option( 'googleanalytics_ip_anonymization', true );
5
- $gdpr_config = get_option( 'googleanalytics_gdpr_config');
6
- $plugin_dir = plugin_dir_path(__FILE__);
7
- $plugin_uri = trailingslashit(get_home_url()) . 'wp-content/plugins/googleanalytics/';
 
8
  ?>
9
- <div id="adblocker-notice" class="notice notice-error is-dismissible">
10
- <p>
11
- <?php echo esc_html__( 'It appears you have an ad blocker enabled. To avoid affecting this plugin\'s functionality, please disable while using its admin configurations and registrations. Thank you.', 'sharethis-share-buttons' ); ?>
12
- </p>
13
- </div>
14
- <div id="detectadblock">
15
- <div class="adBanner">
 
 
 
 
 
 
16
  </div>
17
- </div>
18
- <div id="ga_access_code_modal" class="ga-modal" tabindex="-1">
19
- <div class="ga-modal-dialog">
20
- <div class="ga-modal-content">
21
- <div class="ga-modal-header">
22
- <span id="ga_close" class="ga-close">&times;</span>
23
- <h4 class="ga-modal-title"><?php _e( 'Please paste the access code obtained from Google below:' ) ?></h4>
24
- </div>
25
- <div class="ga-modal-body">
26
- <div id="ga_code_error" class="ga-alert ga-alert-danger" style="display: none;"></div>
27
- <label for="ga_access_code"><strong><?php _e( 'Access Code' ); ?></strong>:</label>
28
- &nbsp;<input id="ga_access_code_tmp" type="text"
29
- placeholder="<?php _e( 'Paste your access code here' ) ?>"/>
30
- <div class="ga-loader-wrapper">
31
- <div class="ga-loader"></div>
32
- </div>
33
- </div>
34
- <div class="ga-modal-footer">
35
- <button id="ga_btn_close" type="button" class="button">Close</button>
36
- <button type="button" class="button-primary"
37
- id="ga_save_access_code"
38
- onclick="ga_popup.saveAccessCode( event )"><?php _e( 'Save Changes' ); ?></button>
39
- </div>
40
- </div><!-- /.modal-content -->
41
- </div><!-- /.modal-dialog -->
42
- </div><!-- /.modal -->
43
- <?php echo $data[ 'debug_modal' ] ?>
44
- <div class="wrap ga-wrap">
45
- <h2>Google Analytics - <?php _e( 'Settings' ); ?></h2>
46
- <div class="ga_container">
47
- <?php if ( ! empty( $data['error_message'] ) ) : ?>
48
- <?php echo $data['error_message']; ?>
49
- <?php endif; ?>
50
- <form id="ga_form" method="post" action="options.php">
51
- <?php settings_fields( 'googleanalytics' ); ?>
52
- <input id="ga_access_code" type="hidden"
53
- name="<?php echo esc_attr( Ga_Admin::GA_OAUTH_AUTH_CODE_OPTION_NAME ); ?>" value=""/>
54
- <table class="form-table">
55
- <tr valign="top">
56
- <?php if ( ! empty( $data['popup_url'] ) ): ?>
57
- <th scope="row">
58
- <label <?php echo ( ! Ga_Helper::are_features_enabled() ) ? 'class="label-grey ga-tooltip"' : '' ?>><?php echo _e( 'Google Profile' ) ?>
59
- :
60
- <span class="ga-tooltiptext ga-tt-abs"><?php _e( $tooltip ); ?></span>
61
- </label>
62
- </th>
63
- <td <?php echo ( ! Ga_Helper::are_features_enabled() ) ? 'class="ga-tooltip"' : ''; ?>>
64
- <?php echo $data[ 'auth_button' ] ?>
65
- <span class="ga-tooltiptext"><?php _e( $tooltip ); ?></span>
66
- <?php if ( ! empty( $data[ Ga_Admin::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME ] ) ): ?>
67
- <div class="ga_warning">
68
- <strong><?php _e( 'Notice' ) ?></strong>:&nbsp;<?php _e( 'Please uncheck the "Manually enter Tracking ID" option to authenticate and view statistics.' ); ?>
69
- </div>
70
- <?php endif; ?>
71
- </td>
72
- <?php endif; ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
73
 
74
- <?php if ( ! empty( $data['ga_accounts_selector'] ) ): ?>
75
- <th scope="row"><?php echo _e( 'Google Analytics Account' ) ?>:</th>
76
- <?php endif; ?>
77
- </tr>
78
- <?php if ( ! empty( $data['ga_accounts_selector'] ) ): ?>
79
- <tr valign="top">
80
- <td>
81
- <?php echo $data['ga_accounts_selector']; ?>
82
- </td>
83
- </tr>
84
- <?php endif; ?>
85
- <tr valign="top">
86
- <th scope="row">
87
- <div class="checkbox">
88
- <label class="ga_checkbox_label <?php echo Ga_Helper::get_code_manually_label_classes() ?>"
89
- for="ga_enter_code_manually"> <input
90
- <?php if ( Ga_Helper::are_features_enabled() ) : ?>
91
- onclick="ga_events.click( this, ga_events.codeManuallyCallback( <?php echo Ga_Helper::are_features_enabled() ? 1 : 0; ?> ) )"
92
- <?php endif; ?>
93
- type="checkbox"
94
- <?php echo ( ! Ga_Helper::are_features_enabled() ) ? 'disabled="disabled"' : ''; ?>
95
- name="<?php echo esc_attr( Ga_Admin::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME ); ?>"
96
- id="ga_enter_code_manually"
97
- value="1"
98
- <?php echo( ( $data[ Ga_Admin::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME ] || ! Ga_Helper::are_terms_accepted() ) ? 'checked="checked"' : '' ); ?>/>&nbsp;
99
- <?php _e( 'Manually enter Tracking ID' ) ?>
100
- <span class="ga-tooltiptext ga-tt-abs"><?php _e( $tooltip ); ?></span>
101
- </label>
102
- <?php if ( ! Ga_Helper::are_features_enabled() ) : ?>
103
- <input id="ga_enter_code_manually_hidden" type="hidden"
104
- name="<?php echo esc_attr( Ga_Admin::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME ); ?>"
105
- value="1"/>
106
- <?php endif; ?>
107
- </div>
108
- </th>
109
- <td></td>
110
- </tr>
111
- <tr valign="top"
112
- id="ga_manually_wrapper" <?php echo( ( $data[ Ga_Admin::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME ] || ! Ga_Helper::are_features_enabled() ) ? '' : 'style="display: none"' ); ?> >
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
113
 
114
- <th scope="row"><?php _e( 'Tracking ID' ) ?>:</th>
115
- </tr>
116
- <tr valing="top">
117
- <td>
118
- <input type="text"
119
- name="<?php echo esc_attr( Ga_Admin::GA_WEB_PROPERTY_ID_MANUALLY_VALUE_OPTION_NAME ); ?>"
120
- value="<?php echo esc_attr( $data[ Ga_Admin::GA_WEB_PROPERTY_ID_MANUALLY_VALUE_OPTION_NAME ] ); ?>"
121
- id="ga_manually_input"/>&nbsp;
122
- <div class="ga_warning">
123
- <strong><?php _e( 'Warning' ); ?></strong>:&nbsp;<?php _e( 'If you enter your Tracking ID manually, Analytics statistics will not be shown.' ); ?>
124
- <br>
125
- <?php _e( 'We strongly recommend to authenticate with Google using the button above.' ); ?>
126
- </div>
127
- </td>
128
- </tr>
129
- <tr valign="top" id="ga_roles_wrapper">
130
- <th scope="row">
131
- <label <?php echo ( ! Ga_Helper::are_features_enabled() ) ? 'class="label-grey ga-tooltip"' : '' ?>><?php _e( 'Exclude Tracking for Roles' ) ?>
132
- :
133
- <span class="ga-tooltiptext ga-tt-abs"><?php _e( $tooltip ); ?></span>
134
- </label>
135
- </th>
136
- </tr>
137
- <tr valign="top">
138
- <td>
139
- <?php
140
- if ( ! empty( $data['roles'] ) ) {
141
- $roles = $data['roles'];
142
- foreach ( $roles as $role ) {
143
- ?>
144
- <div class="checkbox">
145
- <label class="ga_checkbox_label <?php echo ( ! Ga_Helper::are_features_enabled() ) ? 'label-grey ga-tooltip' : ''; ?>"
146
- for="checkbox_<?php echo $role['id']; ?>">
147
- <input id="checkbox_<?php echo $role['id']; ?>" type="checkbox"
148
- <?php echo ( ! Ga_Helper::are_features_enabled() ) ? 'disabled="disabled"' : ''; ?>
149
- name="<?php echo esc_attr( Ga_Admin::GA_EXCLUDE_ROLES_OPTION_NAME . "[" . $role['id'] . "]" ); ?>"
150
- id="<?php echo esc_attr( $role['id'] ); ?>"
151
- <?php echo esc_attr( ( $role['checked'] ? 'checked="checked"' : '' ) ); ?> />&nbsp;
152
- <?php echo esc_html( $role['name'] ); ?>
153
- <span class="ga-tooltiptext"><?php _e( $tooltip ); ?></span>
154
- </label>
155
- </div>
156
- <?php
157
- }
158
- }
159
- ?>
160
- </td>
161
- </tr>
162
- <tr valign="top">
163
- <th scope="row"><?php _e( 'Enable IP Anonymization' ) ?>:</th>
164
- </tr>
165
- <tr valign="top">
166
- <td>
167
- <label class="ga-switch <?php echo ( ! Ga_Helper::are_features_enabled() ) ? 'label-grey ga-tooltip' : '' ?>">
168
- <?php if ( Ga_Helper::are_features_enabled() ) : ?>
169
- <input id="ga-anonymization" name="googleanalytics_ip_anonymization"
170
- type="checkbox" <?php echo checked( $anonymization, 'on' ); ?>>
 
171
 
172
- <div id="ga-slider" class="ga-slider round"></div>
173
- <?php else: ?>
174
- <input id="ga-anonymization" name="googleanalytics_ip_anonymization"
175
- type="checkbox" disabled="disabled">
176
 
177
- <div id="ga-slider" class="ga-slider round"></div>
178
- <span class="ga-tooltiptext ga-tt-abs"><?php _e( $tooltip ); ?></span>
179
- <?php endif; ?>
180
- </label>
181
- </td>
182
- </tr>
183
- <tr valign="top">
184
- <th scope="row"><?php _e( 'If using Google Optimize, enter optimize code here' ) ?>:</th>
185
- </tr>
186
- <tr valign="top">
187
- <td>
188
- <label class="ga-text <?php echo ( ! Ga_Helper::are_features_enabled() ) ? 'label-grey ga-tooltip' : '' ?>">
189
- <?php if ( Ga_Helper::are_features_enabled() ) : ?>
190
- <input id="ga-optimize" name="googleanalytics_optimize_code"
191
- type="text" placeholder="GTM-XXXXXX" value="<?php echo esc_attr( $optimize_code ); ?>">
192
- <?php else: ?>
193
- <input id="ga-optimize" name="googleanalytics_optimize_code"
194
- type="text" placeholder="GTM-XXXXXX" value="<?php echo esc_attr( $optimize_code ); ?>" readonly>
195
- <span class="ga-tooltiptext ga-tt-abs"><?php _e( $tooltip ); ?></span>
196
- <?php endif; ?>
197
- </label>
198
- </td>
199
- </tr>
200
- <tr valign="top">
201
- <th scope="row"><?php _e( 'Disable all features' ) ?>:</th>
202
- </tr>
203
- <tr valign="top">
204
- <td>
205
- <label class="ga-switch <?php echo ( ! Ga_Helper::are_features_enabled() ) ? 'label-grey ga-tooltip' : '' ?>">
206
- <?php if ( Ga_Helper::are_features_enabled() ) : ?>
207
- <input id="ga-disable" name="<?php echo Ga_Admin::GA_DISABLE_ALL_FEATURES; ?>"
208
- type="checkbox">
209
- <div id="ga-slider" class="ga-slider-disable ga-slider round"></div>
210
- <?php else: ?>
211
- <input id="ga-disable" name="<?php echo Ga_Admin::GA_DISABLE_ALL_FEATURES; ?>"
212
- type="checkbox" disabled="disabled">
213
- <div id="ga-slider" class="ga-slider-disable ga-slider round"></div>
214
- <span class="ga-tooltiptext ga-tt-abs"><?php _e( $tooltip ); ?></span>
215
- <?php endif; ?>
216
- </label>
217
- </td>
218
- </tr>
219
- <?php include $plugin_dir . 'templates/gdpr.php'; ?>
220
- </table>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
221
 
222
- <p class="submit">
223
- <input type="submit" class="button-primary"
224
- value="<?php _e( 'Save Changes' ) ?>"/>
225
- </p>
226
- </form>
227
- <?php
228
- // If GDPR isn't enabled show ad otherwise show demo ad.
229
- if (empty($gdpr_config)) {
230
- include $plugin_dir . 'templates/sidebar/gdpr-ad.php';
231
- } else {
232
- // If Demo is not enabled show ad.
233
- if (! get_option('googleanalytics_demographic')) {
234
- include $plugin_dir . 'templates/sidebar/demo-ad.php';
235
- }
236
- }
237
- ?>
238
- </div>
239
- <?php if ( $data['debug_info'] ) : ?>
240
- <tr valign="top">
241
- <td colspan="2">
242
- <p>If you are still experiencing an issue, we are here to help! We recommend clickingthe "Send Debugging Info" button below and pasting the information within an email to support@sharethis.com.</p>
243
- <p>
244
- <button id="ga_debug_button" class="button button-secondary" onclick="ga_debug.open_modal( event )" >Send Debugging Info</button>
245
- <?php if ( ! empty( $data['ga_accounts_selector'] ) ): ?>
246
- <?php echo $data[ 'auth_button' ] ?>
247
- <br>
248
- <small class="notice">
249
- *If you reset your google password you MUST re-authenticate to continue viewing your analytics dashboard.
250
- </small>
251
- <?php endif; ?>
252
- </p>
253
- </td>
254
- </tr>
255
- <?php endif; ?>
 
 
 
 
 
256
 
257
- <p class="ga-love-text"><?php _e( 'Love this plugin?' ); ?> <a
258
- href="https://wordpress.org/support/plugin/googleanalytics/reviews/#new-post"><?php _e( ' Please help spread the word by leaving a 5-star review!' ); ?> </a>
259
- </p>
260
- </div>
261
- <script type="text/javascript">
262
- const GA_DISABLE_FEATURE_URL = '<?php echo Ga_Helper::create_url(admin_url(Ga_Helper::GA_SETTINGS_PAGE_URL), array(Ga_Controller_Core::ACTION_PARAM_NAME => 'ga_action_disable_all_features')); ?>';
263
- const GA_ENABLE_FEATURE_URL = '<?php echo Ga_Helper::create_url(admin_url(Ga_Helper::GA_SETTINGS_PAGE_URL), array(Ga_Controller_Core::ACTION_PARAM_NAME => 'ga_action_enable_all_features')); ?>';
264
- jQuery(document).ready(function () {
265
- ga_switcher.init('<?php echo $data[ Ga_Admin::GA_DISABLE_ALL_FEATURES ]; ?>');
266
- });
267
- </script>
268
- <?php include 'templates/demo-popup.php';
 
1
  <?php
2
+ /**
3
+ * Page view.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
  $optimize_code = get_option( 'googleanalytics_optimize_code' );
9
  $universal = get_option( 'googleanalytics_enable_universal_analytics', true );
10
  $anonymization = get_option( 'googleanalytics_ip_anonymization', true );
11
+ $debug_mode = get_option( 'googleanalytics_enable_debug_mode', 'off' );
12
+ $gdpr_config = get_option( 'googleanalytics_gdpr_config' );
13
+ $plugin_dir = plugin_dir_path( __FILE__ );
14
+ $plugin_uri = trailingslashit( get_home_url() ) . 'wp-content/plugins/googleanalytics/';
15
  ?>
16
+ <div id="adblocker-notice" class="notice notice-error is-dismissible">
17
+ <p>
18
+ <?php
19
+ esc_html_e(
20
+ 'It appears you have an ad blocker enabled. To avoid affecting this plugin\'s functionality, please disable while using its admin configurations and registrations. Thank you.',
21
+ 'googleanalytics'
22
+ );
23
+ ?>
24
+ </p>
25
+ </div>
26
+ <div id="detectadblock">
27
+ <div class="adBanner">
28
+ </div>
29
  </div>
30
+ <div id="ga_access_code_modal" class="ga-modal" tabindex="-1">
31
+ <div class="ga-modal-dialog">
32
+ <div class="ga-modal-content">
33
+ <div class="ga-modal-header">
34
+ <span id="ga_close" class="ga-close">&times;</span>
35
+ <h4 class="ga-modal-title">
36
+ <?php esc_html_e( 'Please paste the access code obtained from Google below:' ); ?>
37
+ </h4>
38
+ </div>
39
+ <div class="ga-modal-body">
40
+ <div id="ga_code_error" class="ga-alert ga-alert-danger" style="display: none;"></div>
41
+ <label for="ga_access_code"><strong><?php esc_html_e( 'Access Code' ); ?></strong>:</label>
42
+ &nbsp;<input id="ga_access_code_tmp" type="text"
43
+ placeholder="<?php esc_html_e( 'Paste your access code here' ); ?>"/>
44
+ <div class="ga-loader-wrapper">
45
+ <div class="ga-loader"></div>
46
+ </div>
47
+ </div>
48
+ <div class="ga-modal-footer">
49
+ <button id="ga_btn_close" type="button" class="button">Close</button>
50
+ <button type="button" class="button-primary"
51
+ id="ga_save_access_code"
52
+ onclick="ga_popup.saveAccessCode( event )"><?php esc_html_e( 'Save Changes' ); ?></button>
53
+ </div>
54
+ </div><!-- /.modal-content -->
55
+ </div><!-- /.modal-dialog -->
56
+ </div><!-- /.modal -->
57
+ <?php echo wp_kses_post( $data['debug_modal'] ); ?>
58
+ <div class="wrap ga-wrap">
59
+ <h2>Google Analytics - <?php esc_html_e( 'Settings' ); ?></h2>
60
+ <div class="ga_container">
61
+ <?php if ( false === empty( $data['error_message'] ) ) : ?>
62
+ <?php echo wp_kses_post( $data['error_message'] ); ?>
63
+ <?php endif; ?>
64
+ <form id="ga_form" method="post" action="options.php">
65
+ <?php settings_fields( 'googleanalytics' ); ?>
66
+ <input id="ga_access_code" type="hidden"
67
+ name="<?php echo esc_attr( Ga_Admin::GA_OAUTH_AUTH_CODE_OPTION_NAME ); ?>" value=""/>
68
+ <table class="form-table">
69
+ <tr>
70
+ <?php if ( false === empty( $data['popup_url'] ) ) : ?>
71
+ <th scope="row">
72
+ <label class="<?php echo esc_attr( false === Ga_Helper::are_features_enabled() ? 'label-grey ga-tooltip"' : '' ); ?>">
73
+ <?php esc_html_e( 'Google Profile' ); ?>:
74
+ <span class="ga-tooltiptext ga-tt-abs"><?php echo esc_html( $tooltip ); ?></span>
75
+ </label>
76
+ </th>
77
+ <td <?php echo esc_attr( false === Ga_Helper::are_features_enabled() ? 'class="ga-tooltip"' : '' ); ?>>
78
+ <?php
79
+ echo wp_kses(
80
+ $data['auth_button'],
81
+ array(
82
+ 'button' => array(
83
+ 'class' => array(),
84
+ 'id' => array(),
85
+ 'onclick' => array(),
86
+ ),
87
+ )
88
+ );
89
+ ?>
90
+ <span class="ga-tooltiptext"><?php echo esc_html( $tooltip ); ?></span>
91
+ <?php if ( false === empty( $data[ Ga_Admin::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME ] ) ) : ?>
92
+ <div class="ga_warning">
93
+ <strong><?php esc_html_e( 'Notice' ); ?></strong>:&nbsp
94
+ <?php esc_html_e( 'Please uncheck the "Manually enter Tracking ID" option to authenticate and view statistics.' ); ?>
95
+ </div>
96
+ <?php endif; ?>
97
+ </td>
98
+ <?php endif; ?>
99
 
100
+ <?php if ( false === empty( $data['ga_accounts_selector'] ) ) : ?>
101
+ <th scope="row"><?php esc_html_e( 'Google Analytics Account' ); ?>:</th>
102
+ <?php endif; ?>
103
+ </tr>
104
+ <?php if ( false === empty( $data['ga_accounts_selector'] ) ) : ?>
105
+ <tr>
106
+ <td>
107
+ <?php
108
+ echo wp_kses(
109
+ $data['ga_accounts_selector'],
110
+ array(
111
+ 'input' => array(
112
+ 'name' => array(),
113
+ 'type' => array(),
114
+ 'value' => array(),
115
+ ),
116
+ 'select' => array(
117
+ 'id' => array(),
118
+ 'name' => array(),
119
+ ),
120
+ 'option' => array(
121
+ 'value' => array(),
122
+ 'selected' => array(),
123
+ ),
124
+ 'optgroup' => array(
125
+ 'label' => array(),
126
+ ),
127
+ )
128
+ );
129
+ ?>
130
+ </td>
131
+ <td>
132
+ <button id="ga_sign_out" class="button-secondary" type="button">
133
+ <?php esc_html_e( 'Sign out', 'googleanalytics' ); ?>
134
+ </button>
135
+ </td>
136
+ </tr>
137
+ <?php endif; ?>
138
+ <tr>
139
+ <th scope="row">
140
+ <div class="checkbox">
141
+ <label class="ga_checkbox_label <?php echo esc_attr( Ga_Helper::get_code_manually_label_classes() ); ?>"
142
+ for="ga_enter_code_manually"> <input
143
+ <?php if ( true === Ga_Helper::are_features_enabled() ) : ?>
144
+ onclick="ga_events.click( this, ga_events.codeManuallyCallback( <?php echo esc_js( Ga_Helper::are_features_enabled() ? 1 : 0 ); ?> ) )"
145
+ <?php endif; ?>
146
+ type="checkbox"
147
+ <?php echo disabled( false === Ga_Helper::are_features_enabled() ); ?>
148
+ name="<?php echo esc_attr( Ga_Admin::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME ); ?>"
149
+ id="ga_enter_code_manually"
150
+ value="1"
151
+ <?php
152
+ checked(
153
+ false === empty( $data[ Ga_Admin::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME ] )
154
+ || false === Ga_Helper::are_terms_accepted()
155
+ );
156
+ ?>
157
+ />&nbsp;
158
+ <?php esc_html_e( 'Manually enter Tracking ID' ); ?>
159
+ <span class="ga-tooltiptext ga-tt-abs"><?php echo esc_html( $tooltip ); ?></span>
160
+ </label>
161
+ <?php if ( false === Ga_Helper::are_features_enabled() ) : ?>
162
+ <input id="ga_enter_code_manually_hidden" type="hidden"
163
+ name="<?php echo esc_attr( Ga_Admin::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME ); ?>"
164
+ value="1"/>
165
+ <?php endif; ?>
166
+ </div>
167
+ </th>
168
+ <td></td>
169
+ </tr>
170
+ <tr
171
+ id="ga_manually_wrapper"
172
+ class="
173
+ <?php
174
+ echo esc_attr(
175
+ false === empty( $data[ Ga_Admin::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME ] )
176
+ || ! Ga_Helper::are_features_enabled() ? '' : 'hidden'
177
+ );
178
+ ?>
179
+ "
180
+ >
181
 
182
+ <th scope="row"><?php esc_html_e( 'Tracking ID' ); ?>:</th>
183
+ </tr>
184
+ <tr valing="top">
185
+ <td>
186
+ <input type="text"
187
+ name="<?php echo esc_attr( Ga_Admin::GA_WEB_PROPERTY_ID_MANUALLY_VALUE_OPTION_NAME ); ?>"
188
+ value="<?php echo esc_attr( $data[ Ga_Admin::GA_WEB_PROPERTY_ID_MANUALLY_VALUE_OPTION_NAME ] ); ?>"
189
+ id="ga_manually_input"/>&nbsp;
190
+ <div class="ga_warning">
191
+ <strong><?php esc_html_e( 'Warning' ); ?></strong>:&nbsp;<?php esc_html_e( 'If you enter your Tracking ID manually, Analytics statistics will not be shown.' ); ?>
192
+ <br>
193
+ <?php esc_html_e( 'We strongly recommend to authenticate with Google using the button above.' ); ?>
194
+ </div>
195
+ </td>
196
+ </tr>
197
+ <tr id="ga_roles_wrapper">
198
+ <th scope="row">
199
+ <label class="<?php echo esc_attr( false === Ga_Helper::are_features_enabled() ? 'label-grey ga-tooltip' : '' ); ?>">
200
+ <?php esc_html_e( 'Exclude Tracking for Roles' ); ?>
201
+ :
202
+ <span class="ga-tooltiptext ga-tt-abs"><?php echo esc_html( $tooltip ); ?></span>
203
+ </label>
204
+ </th>
205
+ </tr>
206
+ <tr>
207
+ <td>
208
+ <?php
209
+ if ( false === empty( $data['roles'] ) ) {
210
+ $roles = $data['roles'];
211
+ foreach ( $roles as $role_item ) {
212
+ ?>
213
+ <div class="checkbox">
214
+ <label class="ga_checkbox_label <?php echo esc_attr( ! Ga_Helper::are_features_enabled() ? 'label-grey ga-tooltip' : '' ); ?>"
215
+ for="checkbox_<?php echo esc_attr( $role_item['id'] ); ?>">
216
+ <input id="checkbox_<?php echo esc_attr( $role_item['id'] ); ?>" type="checkbox"
217
+ <?php echo disabled( false === Ga_Helper::are_features_enabled() ); ?>
218
+ name="<?php echo esc_attr( Ga_Admin::GA_EXCLUDE_ROLES_OPTION_NAME . '[' . $role_item['id'] . ']' ); ?>"
219
+ id="<?php echo esc_attr( $role_item['id'] ); ?>"
220
+ <?php echo esc_attr( ( $role_item['checked'] ? 'checked="checked"' : '' ) ); ?> />&nbsp;
221
+ <?php echo esc_html( $role_item['name'] ); ?>
222
+ <span class="ga-tooltiptext"><?php echo esc_html( $tooltip ); ?></span>
223
+ </label>
224
+ </div>
225
+ <?php
226
+ }
227
+ }
228
+ ?>
229
+ </td>
230
+ </tr>
231
+ <tr>
232
+ <th scope="row"><?php esc_html_e( 'Enable IP Anonymization' ); ?>:</th>
233
+ </tr>
234
+ <tr>
235
+ <td>
236
+ <label class="ga-switch <?php echo esc_attr( ! Ga_Helper::are_features_enabled() ? 'label-grey ga-tooltip' : '' ); ?>">
237
+ <?php if ( true === Ga_Helper::are_features_enabled() ) : ?>
238
+ <input id="ga-anonymization" name="googleanalytics_ip_anonymization"
239
+ type="checkbox" <?php echo checked( $anonymization, 'on' ); ?>>
240
 
241
+ <div id="ga-slider" class="ga-slider round"></div>
242
+ <?php else : ?>
243
+ <input id="ga-anonymization" name="googleanalytics_ip_anonymization"
244
+ type="checkbox" disabled="disabled">
245
 
246
+ <div id="ga-slider" class="ga-slider round"></div>
247
+ <span class="ga-tooltiptext ga-tt-abs"><?php echo esc_html( $tooltip ); ?></span>
248
+ <?php endif; ?>
249
+ </label>
250
+ </td>
251
+ </tr>
252
+ <tr>
253
+ <th scope="row"><?php esc_html_e( 'If using Google Optimize, enter optimize code here' ); ?>:</th>
254
+ </tr>
255
+ <tr>
256
+ <td>
257
+ <label class="ga-text <?php echo esc_attr( false === Ga_Helper::are_features_enabled() ? 'label-grey ga-tooltip' : '' ); ?>">
258
+ <?php if ( true === Ga_Helper::are_features_enabled() ) : ?>
259
+ <input id="ga-optimize" name="googleanalytics_optimize_code"
260
+ type="text" placeholder="GTM-XXXXXX"
261
+ value="<?php echo esc_attr( $optimize_code ); ?>">
262
+ <?php else : ?>
263
+ <input id="ga-optimize" name="googleanalytics_optimize_code"
264
+ type="text" placeholder="GTM-XXXXXX"
265
+ value="<?php echo esc_attr( $optimize_code ); ?>" readonly>
266
+ <span class="ga-tooltiptext ga-tt-abs"><?php echo esc_html( $tooltip ); ?></span>
267
+ <?php endif; ?>
268
+ </label>
269
+ </td>
270
+ </tr>
271
+ <tr>
272
+ <th scope="row"><?php esc_html_e( 'Disable all features' ); ?>:</th>
273
+ </tr>
274
+ <tr>
275
+ <td>
276
+ <label class="ga-switch <?php echo esc_attr( ! Ga_Helper::are_features_enabled() ? 'label-grey ga-tooltip' : '' ); ?>">
277
+ <?php if ( true === Ga_Helper::are_features_enabled() ) : ?>
278
+ <input id="ga-disable"
279
+ name="<?php echo esc_attr( Ga_Admin::GA_DISABLE_ALL_FEATURES ); ?>"
280
+ type="checkbox">
281
+ <div id="ga-slider" class="ga-slider-disable ga-slider round"></div>
282
+ <?php else : ?>
283
+ <input id="ga-disable"
284
+ name="<?php echo esc_attr( Ga_Admin::GA_DISABLE_ALL_FEATURES ); ?>"
285
+ type="checkbox" disabled="disabled">
286
+ <div id="ga-slider" class="ga-slider-disable ga-slider round"></div>
287
+ <span class="ga-tooltiptext ga-tt-abs"><?php echo esc_html( $tooltip ); ?></span>
288
+ <?php endif; ?>
289
+ </label>
290
+ </td>
291
+ </tr>
292
+ <tr>
293
+ <th scope="row"><?php esc_html_e( 'Turn on GA Debugging' ); ?>:</th>
294
+ </tr>
295
+ <tr>
296
+ <td>
297
+ <label class="ga-switch <?php echo esc_attr( false === Ga_Helper::are_features_enabled() ? 'label-grey ga-tooltip' : '' ); ?>">
298
+ <?php if ( true === Ga_Helper::are_features_enabled() ) : ?>
299
+ <input id="ga-debugging" name="googleanalytics_enable_debug_mode"
300
+ type="checkbox" <?php echo checked( $debug_mode, 'on' ); ?>>
301
+ <div id="ga-slider" class="ga-slider round"></div>
302
+ <?php else : ?>
303
+ <input id="ga-debugging" name="googleanalytics_enable_debug_mode"
304
+ type="checkbox" disabled="disabled">
305
+ <div id="ga-slider" class="ga-slider round"></div>
306
+ <?php endif; ?>
307
+ </label>
308
+ <div class="ga_warning">
309
+ <strong><?php esc_html_e( 'WARNING' ); ?></strong>:&nbsp
310
+ <?php
311
+ esc_html_e(
312
+ 'For debugging purposes only! Should NOT be used on live sites!',
313
+ 'googleanalytics'
314
+ );
315
+ ?>
316
+ </div>
317
+ </td>
318
+ </tr>
319
+ <?php require $plugin_dir . 'templates/gdpr.php'; ?>
320
+ </table>
321
 
322
+ <p class="submit">
323
+ <input type="submit" class="button-primary"
324
+ value="<?php esc_html_e( 'Save Changes' ); ?>"/>
325
+ </p>
326
+ </form>
327
+ <?php
328
+ // If GDPR isn't enabled show ad otherwise show demo ad.
329
+ if ( true === empty( $gdpr_config ) ) {
330
+ include $plugin_dir . 'templates/sidebar/gdpr-ad.php';
331
+ } else {
332
+ // If Demo is not enabled show ad.
333
+ if ( true === empty( get_option( 'googleanalytics_demographic' ) ) ) {
334
+ include $plugin_dir . 'templates/sidebar/demo-ad.php';
335
+ }
336
+ }
337
+ ?>
338
+ </div>
339
+ <?php if ( false === empty( $data['debug_info'] ) ) : ?>
340
+ <tr>
341
+ <td colspan="2">
342
+ <p>If you are still experiencing an issue, we are here to help! We recommend clickingthe "Send
343
+ Debugging Info" button below and pasting the information within an email to
344
+ support@sharethis.com.</p>
345
+ <p>
346
+ <button id="ga_debug_button" class="button button-secondary"
347
+ onclick="ga_debug.open_modal( event )">Send Debugging Info
348
+ </button>
349
+ <?php if ( false === empty( $data['ga_accounts_selector'] ) ) : ?>
350
+ <?php echo wp_kses_post( $data['auth_button'] ); ?>
351
+ <br>
352
+ <small class="notice">
353
+ *If you reset your google password you MUST re-authenticate to continue viewing your
354
+ analytics dashboard.
355
+ </small>
356
+ <?php endif; ?>
357
+ </p>
358
+ </td>
359
+ </tr>
360
+ <?php endif; ?>
361
 
362
+ <p class="ga-love-text"><?php esc_html_e( 'Love this plugin?' ); ?> <a
363
+ href="https://wordpress.org/support/plugin/googleanalytics/reviews/#new-post"><?php esc_html_e( ' Please help spread the word by leaving a 5-star review!' ); ?> </a>
364
+ </p>
365
+ </div>
366
+ <script type="text/javascript">
367
+ const GA_DISABLE_FEATURE_URL = '<?php echo esc_url( Ga_Helper::create_url( admin_url( Ga_Helper::GA_SETTINGS_PAGE_URL ), array( Ga_Controller_Core::ACTION_PARAM_NAME => 'ga_action_disable_all_features' ) ) ); ?>';
368
+ const GA_ENABLE_FEATURE_URL = '<?php echo esc_url( Ga_Helper::create_url( admin_url( Ga_Helper::GA_SETTINGS_PAGE_URL ), array( Ga_Controller_Core::ACTION_PARAM_NAME => 'ga_action_enable_all_features' ) ) ); ?>';
369
+ jQuery( document ).ready( function() {
370
+ ga_switcher.init( '<?php echo esc_js( $data[ Ga_Admin::GA_DISABLE_ALL_FEATURES ] ); ?>' );
371
+ } );
372
+ </script>
373
+ <?php
374
+ require 'templates/demo-popup.php';
view/statistics.php CHANGED
@@ -1,25 +1,88 @@
 
 
 
 
 
 
 
 
 
1
  <div class="wrap ga-wrap">
2
- <h2>Google Analytics - <?php _e( 'Dashboard' ); ?></h2>
3
- <div class="ga_container" id="exTab2">
4
- <?php echo $data ?>
5
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
 
7
- <?php if (empty(get_option('googleanalytics-hide-review'))) : ?>
8
  <div class="ga-review-us">
9
  <h3>
10
- <?php echo esc_html__( 'Love this plugin?', 'googleanalytics' ); ?>
11
  <br>
12
  <a href="https://wordpress.org/support/plugin/googleanalytics/reviews/#new-post">
13
- <?php echo esc_html__( 'Please spread the word by leaving us a 5 star review!', 'googleanalytics' ); ?>
 
 
 
 
 
14
  </a>
15
- <p>
16
- <div id="close-review-us">close</div>
17
- </p>
18
  </h3>
19
  </div>
20
  <?php endif; ?>
21
  </div>
22
  <script type="text/javascript">
23
- const GA_NONCE = '<?php echo wp_create_nonce( 'ga_ajax_data_change' ); ?>';
24
- const GA_NONCE_FIELD = '<?php echo Ga_Admin_Controller::GA_NONCE_FIELD_NAME; ?>';
25
- </script>
1
+ <?php
2
+ /**
3
+ * Statistics view.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ $data = isset( $data ) ? $data : '';
9
+ ?>
10
  <div class="wrap ga-wrap">
11
+ <h2>Google Analytics - <?php echo esc_html__( 'Dashboard', 'googleanalytics' ); ?></h2>
12
+ <div class="ga_container" id="exTab2">
13
+ <?php
14
+ echo wp_kses(
15
+ $data,
16
+ array(
17
+ 'a' => array(
18
+ 'class' => array(),
19
+ 'href' => array(),
20
+ ),
21
+ 'button' => array(
22
+ 'class' => array(),
23
+ 'id' => array(),
24
+ 'onclick' => array(),
25
+ ),
26
+ 'div' => array(
27
+ 'class' => array(),
28
+ 'id' => array(),
29
+ 'data-scroll' => array(),
30
+ 'style' => array(),
31
+ ),
32
+ 'form' => array(
33
+ 'action' => array(),
34
+ 'method' => array(),
35
+ ),
36
+ 'input' => array(
37
+ 'name' => array(),
38
+ 'type' => array(),
39
+ 'value' => array(),
40
+ ),
41
+ 'img' => array(
42
+ 'src' => array(),
43
+ ),
44
+ 'label' => array(
45
+ 'for' => array(),
46
+ ),
47
+ 'p' => array(),
48
+ 'script' => array(),
49
+ 'strong' => array(),
50
+ 'table' => array(
51
+ 'class' => array(),
52
+ ),
53
+ 'td' => array(
54
+ 'class' => array(),
55
+ 'colspan' => array(),
56
+ 'style' => array(),
57
+ ),
58
+ 'th' => array(
59
+ 'style' => array(),
60
+ ),
61
+ 'tr' => array(),
62
+ )
63
+ );
64
+ ?>
65
+ </div>
66
 
67
+ <?php if ( true === empty( get_option( 'googleanalytics-hide-review' ) ) ) : ?>
68
  <div class="ga-review-us">
69
  <h3>
70
+ <?php esc_html_e( 'Love this plugin?', 'googleanalytics' ); ?>
71
  <br>
72
  <a href="https://wordpress.org/support/plugin/googleanalytics/reviews/#new-post">
73
+ <?php
74
+ esc_html_e(
75
+ 'Please spread the word by leaving us a 5 star review!',
76
+ 'googleanalytics'
77
+ );
78
+ ?>
79
  </a>
80
+ <p><div id="close-review-us"><?php esc_html_e( 'close' ); ?></div></p>
 
 
81
  </h3>
82
  </div>
83
  <?php endif; ?>
84
  </div>
85
  <script type="text/javascript">
86
+ const GA_NONCE = '<?php echo esc_js( wp_create_nonce( 'ga_ajax_data_change' ) ); ?>';
87
+ const GA_NONCE_FIELD = '<?php echo esc_js( Ga_Admin_Controller::GA_NONCE_FIELD_NAME ); ?>';
88
+ </script>
view/stats.php CHANGED
@@ -1,6 +1,16 @@
1
  <?php
2
- $account_data = json_decode(get_option('googleanalytics_account_data', true), true);
3
- $selected_data = json_decode(get_option('googleanalytics_selected_account', true), true);
 
 
 
 
 
 
 
 
 
 
4
 
5
  foreach ( $account_data as $properties ) {
6
  if ( $properties['id'] === $selected_data[0] ) {
@@ -12,99 +22,132 @@ foreach ( $account_data as $properties ) {
12
  }
13
  }
14
 
15
- $demo_enabled = get_option('googleanalytics_demographic');
16
- $demo_enabled = !empty($demo_enabled) && $demo_enabled ? true: false;
17
- $selectedpage = isset($_GET['ts']) ? '' : 'selected';
18
- $selectedsource = isset($_GET['ts']) ? 'selected' : '';
19
- $report_url = 'https://analytics.google.com/analytics/web/#/report/content-pages/a' . $selected_data[0] . 'w' . $internal_prop . 'p' . $selected_data[2];
20
- $source_page_url = isset($_GET['ts']) ? str_replace('content-pages', 'trafficsources-all-traffic', $report_url) : $report_url;
21
- $demographic_page_url = str_replace('content-pages', 'visitors-demographics-overview', $report_url);
22
- $type_label = isset($_GET['ts']) ? 'Traffic Sources' : 'Pages/Posts';
23
- $source_url = 'admin.php?page=googleanalytics&ts';
24
- $send_data = get_option('googleanalytics_send_data');
25
- $need_account_demo_enable = [] === $gender_chart && [] === $age_chart;
 
 
 
 
 
 
 
26
 
27
  // Filter GA Action.
28
  $ga_action = filter_input( INPUT_GET, 'ga_action', FILTER_SANITIZE_STRING );
29
 
30
- $date_range = Ga_Helper::getDateRangeFromRequest();
31
 
32
- $days_in_english = Ga_Helper::getPeriodInDaysWords($date_range['from'], $date_range['to']);
33
  ?>
34
- <?php if (!$demo_enabled) {
35
- echo Ga_Helper::ga_wp_notice(
36
- __( 'Visualize gender and age data with our new demographic feature.' ),
37
- 'warning',
38
- false,
39
- [
40
- 'url' => Ga_Helper::create_url( Ga_Helper::get_current_url(), array( Ga_Controller_Core::ACTION_PARAM_NAME => 'demo-ad' ) ),
41
- 'label' => __( 'Access Now', 'googleanalytics' ),
42
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  );
44
- } ?>
45
- <div class="wrap ga-wrap" id="ga-stats-container" data-scroll="<?php echo esc_attr($ga_action); ?>">
46
- <?php if ( ! empty( $chart ) ) : ?>
47
- <div class="filter-choices">
48
- <div>
49
- <?php Ga_Template::load( 'templates/date_custom_range_filter', [
50
- 'date_from' => $date_range['from'],
51
- 'date_to' => $date_range['to']
52
- ] ); ?>
53
- </div>
54
- </div>
55
- <div class="ga-panel ga-panel-default">
56
- <div class="ga-panel-heading">
57
- <strong>
58
- <?php echo 'Pageviews - ' . $days_in_english; ?>
59
- </strong>
60
  </div>
61
- <div class="ga-panel-body ga-chart">
62
- <div id="chart_div" style="width: 100%;"></div>
63
- <div class="ga-loader-wrapper stats-page">
64
- <div class="ga-loader stats-page-loader"></div>
 
 
 
 
 
 
 
65
  </div>
66
  </div>
67
- </div>
68
  <?php endif; ?>
69
 
70
  <?php if ( ! empty( $boxes ) ) : ?>
71
- <div class="ga-panel ga-panel-default">
72
- <div class="ga-panel-heading"><strong><?php echo 'Comparison - ' . $days_in_english; ?></strong>
73
- </div>
74
- <div class="ga-panel-body">
75
- <div class="ga-row">
76
  <?php foreach ( $boxes as $box ) : ?>
77
  <div class="ga-box">
78
  <div class="ga-panel ga-panel-default">
79
  <div class="ga-panel-body ga-box-centered">
80
  <div class="ga-box-label"><?php echo esc_html( $box['label'] ); ?></div>
81
  <div class="ga-box-diff" style="color: <?php echo esc_attr( $box['color'] ); ?>;">
82
- <?php echo Ga_Helper::format_percent( $box['diff'] ); ?>
83
  </div>
84
- <div class="ga-box-comparison"><?php echo $box['comparison']; ?></div>
85
  </div>
86
  </div>
87
  </div>
88
  <?php endforeach; ?>
 
89
  </div>
90
  </div>
91
- </div>
92
- <?php
93
  endif;
94
 
95
- include plugin_dir_path(__FILE__) . '/templates/demographic-chart.php';
96
 
97
- if ( ! empty( $sources ) ) : ?>
98
- <div class="filter-choices">
99
- <a href="<?php echo get_admin_url('', 'admin.php?page=googleanalytics'); ?>" class="<?php echo esc_attr( $selectedpage ); ?>">
100
- Page View
 
 
101
  </a>
102
- <a href="<?php echo get_admin_url('', 'admin.php?page=googleanalytics&ts'); ?>" class="<?php echo esc_attr( $selectedsource ); ?>">
103
- Traffic Source
 
104
  </a>
105
  </div>
106
  <div class="ga-panel ga-panel-default">
107
- <div class="ga-panel-heading"><strong><?php _e( "Top 10 " . $type_label . " by page views" ); ?></strong>
 
108
  </div>
109
  <div class="ga-panel-body">
110
 
@@ -114,7 +157,7 @@ $days_in_english = Ga_Helper::getPeriodInDaysWords($date_range['from'], $date_ra
114
  <td colspan="2">
115
  </td>
116
  <th style="text-align: right;">
117
- <?php _e( 'Pageviews' ); ?>
118
  </th>
119
  <th style="text-align: right;">
120
  <?php echo '%'; ?>
@@ -123,47 +166,85 @@ $days_in_english = Ga_Helper::getPeriodInDaysWords($date_range['from'], $date_ra
123
  <tr>
124
  <td colspan="2"></td>
125
  <td class="ga-col-pageviews" style="text-align: right">
126
- <div style="font-size: 16px;"><?php echo $sources['total'] ?></div>
127
  <div style="color: grey; font-size: 10px;">% of
128
- Total: <?php echo Ga_Helper::format_percent( ( ! empty( $sources['total'] ) ) ? number_format( $sources['sum'] / $sources['total'] * 100,
129
- 2, '.', ' ' ) : 100 );
 
 
 
 
 
 
 
 
 
 
130
  ?>
131
- (<?php echo $sources['sum'] ?>)
132
  </div>
133
  </td>
134
  <td class="ga-col-progressbar" style="text-align: right">
135
- <div style="font-size: 16px;"><?php echo $sources['total'] ?></div>
136
  <div style="color: grey; font-size: 10px;">% of
137
- Total: <?php echo Ga_Helper::format_percent( ( ! empty( $sources['total'] ) ) ? number_format( $sources['sum'] / $sources['total'] * 100,
138
- 2, '.', ' ' ) : 100 );
 
 
 
 
 
 
 
 
 
 
139
  ?>
140
- (<?php echo $sources['sum'] ?>)
141
  </div>
142
  </td>
143
  </tr>
144
- <?php foreach ( $sources['rows'] as $key => $source ): ?>
145
  <tr>
146
- <td style="width: 5%;text-align: right"><?php echo $key ?>.</td>
147
  <td class="ga-col-name">
148
- <?php if ( $source['name'] != '(direct) / (none)' ) :
149
-
150
- $single_breakdown = isset($_GET['ts']) ? '/explorer-table.plotKeys=%5B%5D&_r.drilldown=analytics.sourceMedium:' : '/explorer-table.plotKeys=%5B%5D&_r.drilldown=analytics.pagePath:';
151
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  ?>
153
- <a class="ga-source-name" href="<?php echo esc_url( $source_page_url . $single_breakdown . str_replace( '+', '%20', str_replace( '2F', '~2F', str_replace( '%', '', urlencode( $source['url'] ) ) ) ) ); ?>/"
154
- target="_blank"><?php echo $source['name'] ?></a>
155
- <?php else: ?>
156
- <?php echo $source['name'] ?>
157
  <?php endif; ?>
158
  </td>
159
- <td style="text-align: right"><?php echo $source['number'] ?></td>
160
  <td>
161
  <div class="progress">
162
  <div class="progress-bar" role="progressbar"
163
- aria-valuenow="<?php echo $source['percent'] ?>" aria-valuemin="0"
164
- aria-valuemax="100"
165
- style="width: <?php echo $source['percent'] ?>%;"></div>
166
- <span style="margin-left: 10px;"><?php echo Ga_Helper::format_percent( $source['percent'] ); ?></span>
 
 
167
  </div>
168
  </td>
169
  </tr>
@@ -171,85 +252,98 @@ $days_in_english = Ga_Helper::getPeriodInDaysWords($date_range['from'], $date_ra
171
  </table>
172
  </div>
173
  <a href="<?php echo esc_url( $source_page_url ); ?>/" class="view-report" target="_blank">
174
- <?php echo esc_html__('View Full Report' ); ?>
175
  </a>
176
  </div>
177
  </div>
178
  <?php endif; ?>
179
 
180
- <?php if ( ! empty( $chart ) ) :
 
181
  ?>
182
  <script type="text/javascript">
183
 
184
- ga_charts.init(function () {
185
 
186
  var data = new google.visualization.DataTable();
187
  var demoGenderData = new google.visualization.DataTable();
188
  var demoAgeData = new google.visualization.DataTable();
189
 
190
- data.addColumn('string', '<?php echo esc_js( __( 'Day', 'googleanalytics' ) ); ?>');
191
- data.addColumn('number', '<?php echo esc_js( __( 'Pageviews', 'googleanalytics' ) ); ?>');
192
- data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
193
 
194
  <?php foreach ( $chart as $row ) : ?>
195
- data.addRow(['<?php echo $row['day'] ?>', <?php echo $row['current'] ?>, ga_charts.createTooltip('<?php echo $row['day'] ?>', '<?php echo $row['current'] ?>')]);
 
 
 
 
 
 
196
  <?php endforeach; ?>
197
- ga_charts.events(data);
198
- ga_charts.drawChart(data);
199
  ga_loader.hide();
200
 
201
  // Demographic gender chart
202
  <?php
203
- $demoGenderData[0] = ['Gender', 'The gender of visitors'];
 
204
  $x = 1;
205
- foreach ( $gender_chart as $type => $amount ) {
206
- $demoGenderData[$x] = [ucfirst($type), intval($amount)];
207
- $x++;
208
- } ?>
 
209
 
210
- ga_charts.drawDemoGenderChart(<?php echo json_encode($demoGenderData); ?>);
211
  ga_loader.hide();
212
 
213
  // Demographic age chart
214
  <?php
215
- $demoAgeData[0] = ['Age', 'Average age range of visitors'];
 
216
  $x = 1;
217
- foreach ( $age_chart as $type => $amount ) {
218
- $demoAgeData[$x] = [$type, intval($amount)];
219
- $x++;
220
- } ?>
221
- ga_charts.drawDemoAgeChart(<?php echo json_encode($demoAgeData); ?>);
 
 
222
 
223
  // Device chart.
224
- <?php
225
- $demoDeviceData = array();
226
- $demoDeviceData[0] = array(
227
- __( 'Device', 'googleanalytics' ),
228
- __( 'Device Breakdown', 'googleanalytics' ),
229
- );
230
-
231
- $x = 1;
232
- foreach( $device_chart as $type => $amount ) {
233
- $demoDeviceData[$x] = array($type, intval($amount));
234
- $x++;
235
- }
236
- ?>
237
- ga_charts.drawDemoDeviceChart(<?php echo json_encode($demoDeviceData); ?>);
238
 
239
  ga_loader.hide();
240
 
241
- <?php if (Ga_Helper::are_features_enabled() && !empty($send_data) && "true" === $send_data) : ?>
242
- ga_events.sendDemoData(<?php echo get_option('googleanalytics_demo_data'); ?>);
243
- <?php
244
- update_option('googleanalytics_demo_date', date("Y-m-d"));
245
- update_option('googleanalytics_send_data', "false");
246
  endif;
247
  ?>
248
- }
249
  );
250
  </script>
251
- <?php endif;
252
- include 'templates/demo-popup.php';
 
253
  ?>
254
 
255
  </div>
1
  <?php
2
+ /**
3
+ * Stats view.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ // Variables passed in (with fallbacks in case they aren't).
9
+ $age_chart = true === isset( $age_chart ) ? $age_chart : array();
10
+ $gender_chart = true === isset( $gender_chart ) ? $gender_chart : array();
11
+
12
+ $account_data = json_decode( get_option( 'googleanalytics_account_data', true ), true );
13
+ $selected_data = json_decode( get_option( 'googleanalytics_selected_account', true ), true );
14
 
15
  foreach ( $account_data as $properties ) {
16
  if ( $properties['id'] === $selected_data[0] ) {
22
  }
23
  }
24
 
25
+ $demo_enabled = get_option( 'googleanalytics_demographic' );
26
+ $demo_enabled = false === empty( $demo_enabled );
27
+
28
+ $ts = filter_input( INPUT_GET, 'ts', FILTER_SANITIZE_STRING );
29
+ $selected_page = false === empty( $ts ) ? '' : 'selected';
30
+ $selected_source = false === empty( $ts ) ? 'selected' : '';
31
+
32
+ $report_url = 'https://analytics.google.com/analytics/web/#/report/content-pages/a' . $selected_data[0] . 'w' . $internal_prop . 'p' . $selected_data[2];
33
+ $source_page_url = false === empty( $ts ) ? str_replace(
34
+ 'content-pages',
35
+ 'trafficsources-all-traffic',
36
+ $report_url
37
+ ) : $report_url;
38
+ $demographic_page_url = str_replace( 'content-pages', 'visitors-demographics-overview', $report_url );
39
+ $type_label = false === empty( $ts ) ? 'Traffic Sources' : 'Pages/Posts';
40
+ $source_url = 'admin.php?page=googleanalytics&ts=1';
41
+ $send_data = get_option( 'googleanalytics_send_data' );
42
+ $need_account_demo_enable = array() === $gender_chart && array() === $age_chart;
43
 
44
  // Filter GA Action.
45
  $ga_action = filter_input( INPUT_GET, 'ga_action', FILTER_SANITIZE_STRING );
46
 
47
+ $date_range = Ga_Helper::get_date_range_from_request();
48
 
49
+ $days_in_english = Ga_Helper::get_period_in_days_words( $date_range['from'], $date_range['to'] );
50
  ?>
51
+ <?php
52
+ if ( false === $demo_enabled ) {
53
+ echo wp_kses(
54
+ Ga_Helper::ga_wp_notice(
55
+ __( 'Visualize gender and age data with our new demographic feature.' ),
56
+ 'warning',
57
+ false,
58
+ array(
59
+ 'url' => Ga_Helper::create_url(
60
+ Ga_Helper::get_current_url(),
61
+ array( Ga_Controller_Core::ACTION_PARAM_NAME => 'demo-ad' )
62
+ ),
63
+ 'label' => __( 'Access Now', 'googleanalytics' ),
64
+ )
65
+ ),
66
+ array(
67
+ 'button' => array(
68
+ 'class' => array(),
69
+ 'onclick' => array(),
70
+ ),
71
+ 'div' => array(
72
+ 'class' => array(),
73
+ ),
74
+ 'p' => array(),
75
+ )
76
  );
77
+ }
78
+ ?>
79
+ <div class="wrap ga-wrap" id="ga-stats-container" data-scroll="<?php echo esc_attr( $ga_action ); ?>">
80
+ <?php if ( false === empty( $chart ) ) : ?>
81
+ <div class="filter-choices">
82
+ <div>
83
+ <?php
84
+ Ga_Template::load(
85
+ 'templates/date-custom-range-filter',
86
+ array(
87
+ 'date_from' => $date_range['from'],
88
+ 'date_to' => $date_range['to'],
89
+ )
90
+ );
91
+ ?>
92
+ </div>
93
  </div>
94
+ <div class="ga-panel ga-panel-default">
95
+ <div class="ga-panel-heading">
96
+ <strong>
97
+ <?php echo esc_html( 'Pageviews - ' . $days_in_english ); ?>
98
+ </strong>
99
+ </div>
100
+ <div class="ga-panel-body ga-chart">
101
+ <div id="chart_div" style="width: 100%;"></div>
102
+ <div class="ga-loader-wrapper stats-page">
103
+ <div class="ga-loader stats-page-loader"></div>
104
+ </div>
105
  </div>
106
  </div>
 
107
  <?php endif; ?>
108
 
109
  <?php if ( ! empty( $boxes ) ) : ?>
110
+ <div class="ga-panel ga-panel-default">
111
+ <div class="ga-panel-heading"><strong><?php echo esc_html( 'Comparison - ' . $days_in_english ); ?></strong>
112
+ </div>
113
+ <div class="ga-panel-body">
114
+ <div class="ga-row">
115
  <?php foreach ( $boxes as $box ) : ?>
116
  <div class="ga-box">
117
  <div class="ga-panel ga-panel-default">
118
  <div class="ga-panel-body ga-box-centered">
119
  <div class="ga-box-label"><?php echo esc_html( $box['label'] ); ?></div>
120
  <div class="ga-box-diff" style="color: <?php echo esc_attr( $box['color'] ); ?>;">
121
+ <?php echo esc_html( Ga_Helper::format_percent( $box['diff'] ) ); ?>
122
  </div>
123
+ <div class="ga-box-comparison"><?php echo esc_html( $box['comparison'] ); ?></div>
124
  </div>
125
  </div>
126
  </div>
127
  <?php endforeach; ?>
128
+ </div>
129
  </div>
130
  </div>
131
+ <?php
 
132
  endif;
133
 
134
+ require plugin_dir_path( __FILE__ ) . '/templates/demographic-chart.php';
135
 
136
+ if ( ! empty( $sources ) ) :
137
+ ?>
138
+ <div class="filter-choices" id="traffic-sources">
139
+ <a href="<?php echo esc_url( get_admin_url( '', 'admin.php?page=googleanalytics#traffic-sources' ) ); ?>"
140
+ class="<?php echo esc_attr( $selected_page ); ?>">
141
+ <?php esc_html_e( 'Page View', 'googleanalytics' ); ?>
142
  </a>
143
+ <a href="<?php echo esc_url( get_admin_url( '', 'admin.php?page=googleanalytics&ts=1#traffic-sources' ) ); ?>"
144
+ class="<?php echo esc_attr( $selected_source ); ?>">
145
+ <?php esc_html_e( 'Traffic Source', 'googleanalytics' ); ?>
146
  </a>
147
  </div>
148
  <div class="ga-panel ga-panel-default">
149
+ <div class="ga-panel-heading">
150
+ <strong><?php echo esc_html( 'Top 10 ' . $type_label . ' by page views' ); ?></strong>
151
  </div>
152
  <div class="ga-panel-body">
153
 
157
  <td colspan="2">
158
  </td>
159
  <th style="text-align: right;">
160
+ <?php echo esc_html( 'Pageviews' ); ?>
161
  </th>
162
  <th style="text-align: right;">
163
  <?php echo '%'; ?>
166
  <tr>
167
  <td colspan="2"></td>
168
  <td class="ga-col-pageviews" style="text-align: right">
169
+ <div style="font-size: 16px;"><?php echo esc_html( $sources['total'] ); ?></div>
170
  <div style="color: grey; font-size: 10px;">% of
171
+ Total:
172
+ <?php
173
+ echo esc_html(
174
+ Ga_Helper::format_percent(
175
+ ( false === empty( $sources['total'] ) ) ? number_format(
176
+ $sources['sum'] / $sources['total'] * 100,
177
+ 2,
178
+ '.',
179
+ ' '
180
+ ) : 100
181
+ )
182
+ );
183
  ?>
184
+ (<?php echo esc_html( $sources['sum'] ); ?>)
185
  </div>
186
  </td>
187
  <td class="ga-col-progressbar" style="text-align: right">
188
+ <div style="font-size: 16px;"><?php echo esc_html( $sources['total'] ); ?></div>
189
  <div style="color: grey; font-size: 10px;">% of
190
+ Total:
191
+ <?php
192
+ echo esc_html(
193
+ Ga_Helper::format_percent(
194
+ ( false === empty( $sources['total'] ) ) ? number_format(
195
+ $sources['sum'] / $sources['total'] * 100,
196
+ 2,
197
+ '.',
198
+ ' '
199
+ ) : 100
200
+ )
201
+ );
202
  ?>
203
+ (<?php echo esc_html( $sources['sum'] ); ?>)
204
  </div>
205
  </td>
206
  </tr>
207
+ <?php foreach ( $sources['rows'] as $key => $source ) : ?>
208
  <tr>
209
+ <td style="width: 5%;text-align: right"><?php echo esc_html( $key ); ?>.</td>
210
  <td class="ga-col-name">
211
+ <?php
212
+ if ( '(direct) / (none)' !== $source['name'] ) :
213
+ $single_breakdown = false === empty( $ts ) ?
214
+ '/explorer-table.plotKeys=%5B%5D&_r.drilldown=analytics.sourceMedium:' :
215
+ '/explorer-table.plotKeys=%5B%5D&_r.drilldown=analytics.pagePath:';
216
+ ?>
217
+ <a class="ga-source-name"
218
+ href="
219
+ <?php
220
+ echo esc_url(
221
+ $source_page_url . $single_breakdown . str_replace(
222
+ '+',
223
+ '%20',
224
+ str_replace(
225
+ '2F',
226
+ '~2F',
227
+ str_replace( '%', '', rawurlencode( $source['url'] ) )
228
+ )
229
+ )
230
+ );
231
  ?>
232
+ /"
233
+ target="_blank"><?php echo esc_html( $source['name'] ); ?></a>
234
+ <?php else : ?>
235
+ <?php echo esc_html( $source['name'] ); ?>
236
  <?php endif; ?>
237
  </td>
238
+ <td style="text-align: right"><?php echo esc_html( $source['number'] ); ?></td>
239
  <td>
240
  <div class="progress">
241
  <div class="progress-bar" role="progressbar"
242
+ aria-valuenow="<?php echo esc_attr( $source['percent'] ); ?>" aria-valuemin="0"
243
+ aria-valuemax="100"
244
+ style="width: <?php echo esc_attr( $source['percent'] ); ?>%;"></div>
245
+ <span style="margin-left: 10px;">
246
+ <?php echo esc_html( Ga_Helper::format_percent( $source['percent'] ) ); ?>
247
+ </span>
248
  </div>
249
  </td>
250
  </tr>
252
  </table>
253
  </div>
254
  <a href="<?php echo esc_url( $source_page_url ); ?>/" class="view-report" target="_blank">
255
+ <?php echo esc_html__( 'View Full Report' ); ?>
256
  </a>
257
  </div>
258
  </div>
259
  <?php endif; ?>
260
 
261
+ <?php
262
+ if ( ! empty( $chart ) ) :
263
  ?>
264
  <script type="text/javascript">
265
 
266
+ ga_charts.init( function() {
267
 
268
  var data = new google.visualization.DataTable();
269
  var demoGenderData = new google.visualization.DataTable();
270
  var demoAgeData = new google.visualization.DataTable();
271
 
272
+ data.addColumn( 'string', '<?php echo esc_js( __( 'Day', 'googleanalytics' ) ); ?>' );
273
+ data.addColumn( 'number', '<?php echo esc_js( __( 'Pageviews', 'googleanalytics' ) ); ?>' );
274
+ data.addColumn( { type: 'string', role: 'tooltip', 'p': { 'html': true } } );
275
 
276
  <?php foreach ( $chart as $row ) : ?>
277
+ data.addRow( [
278
+ '<?php echo esc_js( $row['day'] ); ?>',
279
+ <?php echo esc_js( $row['current'] ); ?>,
280
+ ga_charts.createTooltip( '<?php echo esc_js( $row['day'] ); ?>',
281
+ '<?php echo esc_js( $row['current'] ); ?>'
282
+ )
283
+ ] );
284
  <?php endforeach; ?>
285
+ ga_charts.events( data );
286
+ ga_charts.drawChart( data );
287
  ga_loader.hide();
288
 
289
  // Demographic gender chart
290
  <?php
291
+ $demo_gender_data[0] = array( 'Gender', 'The gender of visitors' );
292
+
293
  $x = 1;
294
+ foreach ( $gender_chart as $gender_type => $amount ) {
295
+ $demo_gender_data[ $x ] = array( ucfirst( $gender_type ), intval( $amount ) );
296
+ $x ++;
297
+ }
298
+ ?>
299
 
300
+ ga_charts.drawDemoGenderChart(<?php echo wp_json_encode( $demo_gender_data ); ?>);
301
  ga_loader.hide();
302
 
303
  // Demographic age chart
304
  <?php
305
+ $demo_age_data[0] = array( 'Age', 'Average age range of visitors' );
306
+
307
  $x = 1;
308
+
309
+ foreach ( $age_chart as $age_type => $amount ) {
310
+ $demo_age_data[ $x ] = array( $age_type, intval( $amount ) );
311
+ $x ++;
312
+ }
313
+ ?>
314
+ ga_charts.drawDemoAgeChart(<?php echo wp_json_encode( $demo_age_data ); ?>);
315
 
316
  // Device chart.
317
+ <?php
318
+ $demo_device_data = array();
319
+ $demo_device_data[0] = array(
320
+ __( 'Device', 'googleanalytics' ),
321
+ __( 'Device Breakdown', 'googleanalytics' ),
322
+ );
323
+
324
+ $x = 1;
325
+ foreach ( $device_chart as $age_type => $amount ) {
326
+ $demo_device_data[ $x ] = array( $age_type, intval( $amount ) );
327
+ $x ++;
328
+ }
329
+ ?>
330
+ ga_charts.drawDemoDeviceChart(<?php echo wp_json_encode( $demo_device_data ); ?>);
331
 
332
  ga_loader.hide();
333
 
334
+ <?php if ( Ga_Helper::are_features_enabled() && ! empty( $send_data ) && 'true' === $send_data ) : ?>
335
+ ga_events.sendDemoData(<?php echo esc_js( get_option( 'googleanalytics_demo_data' ) ); ?>);
336
+ <?php
337
+ update_option( 'googleanalytics_demo_date', gmdate( 'Y-m-d' ) );
338
+ update_option( 'googleanalytics_send_data', 'false' );
339
  endif;
340
  ?>
341
+ },
342
  );
343
  </script>
344
+ <?php
345
+ endif;
346
+ require 'templates/demo-popup.php';
347
  ?>
348
 
349
  </div>
view/templates/appearance.php CHANGED
@@ -1,14 +1,22 @@
 
 
 
 
 
 
 
 
1
  <div class="col-md-12">
2
  <h3><?php echo esc_html__( 'Form Color', 'googleanalytics' ); ?></h3>
3
  </div>
4
 
5
  <div id="sharethis-form-color" class="col-md-12">
6
- <?php foreach ($colors as $color) : ?>
7
- <div class="color<?php echo isset($gdpr_config['color']) && $color === $gdpr_config['color'] ? ' selected' : ''; ?>"
8
- data-value="<?php echo esc_attr($color); ?>"
9
- style="max-width: 30px; max-height: 30px; overflow: hidden;"
10
  >
11
- <span style="content: ' '; background-color:<?php echo esc_html($color); ?>; padding: 40px;"></span>
12
  </div>
13
  <?php endforeach; ?>
14
  </div>
1
+ <?php
2
+ /**
3
+ * Appearance view.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ ?>
9
  <div class="col-md-12">
10
  <h3><?php echo esc_html__( 'Form Color', 'googleanalytics' ); ?></h3>
11
  </div>
12
 
13
  <div id="sharethis-form-color" class="col-md-12">
14
+ <?php foreach ( $colors as $color ) : ?>
15
+ <div class="color<?php echo esc_attr( isset( $gdpr_config['color'] ) && $color === $gdpr_config['color'] ? ' selected' : '' ); ?>"
16
+ data-value="<?php echo esc_attr( $color ); ?>"
17
+ style="max-width: 30px; max-height: 30px; overflow: hidden;"
18
  >
19
+ <span style="content: ' '; background-color:<?php echo esc_attr( $color ); ?>; padding: 40px;"></span>
20
  </div>
21
  <?php endforeach; ?>
22
  </div>
view/templates/date-custom-range-filter.php ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Custom Date Range Filter template.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ $args = isset( $args ) ? $args : array();
9
+
10
+ $props = wp_parse_args(
11
+ $args,
12
+ array(
13
+ 'date_from' => gmdate( 'Y-m-d', strtotime( '-1 week' ) ),
14
+ 'date_to' => gmdate( 'Y-m-d' ),
15
+ )
16
+ );
17
+
18
+ $date_from = false === empty( $props['date_from'] ) ? $props['date_from'] : gmdate( 'Y-m-d', strtotime( '-1 week' ) );
19
+ $date_to = false === empty( $props['date_to'] ) ? $props['date_to'] : gmdate( 'Y-m-d' );
20
+ ?>
21
+ <form action="<?php echo esc_url( admin_url( 'admin.php' ) ); ?>" method="GET">
22
+ <input type="hidden" name="page" value="googleanalytics"/>
23
+ <label>
24
+ <?php esc_html_e( 'From:', 'googleanalytics' ); ?>
25
+ <input name="date_from" type="date" value="<?php echo esc_attr( $date_from ); ?>">
26
+ </label>
27
+ <label>
28
+ <?php esc_html_e( 'To:', 'googleanalytics' ); ?>
29
+ <input name="date_to" type="date" value="<?php echo esc_attr( $date_to ); ?>">
30
+ </label>
31
+ <button><?php esc_html_e( 'Filter', 'googleanalytics' ); ?></button>
32
+ </form>
view/templates/date_custom_range_filter.php DELETED
@@ -1,26 +0,0 @@
1
- <?php
2
- /**
3
- * Custom Date Range Filter template.
4
- */
5
- $args = isset($args) ? $args : [];
6
-
7
- $props = wp_parse_args($args, [
8
- 'date_from' => date('Y-m-d', strtotime('-1 week')),
9
- 'date_to' => date('Y-m-d'),
10
- ]);
11
-
12
- $date_from = false === empty($props['date_from']) ? $props['date_from'] : date('Y-m-d', strtotime('-1 week'));
13
- $date_to = false === empty($props['date_to']) ? $props['date_to'] : date('Y-m-d');
14
- ?>
15
- <form action="<?php echo esc_url(admin_url('admin.php')); ?>" method="GET">
16
- <input type="hidden" name="page" value="googleanalytics"/>
17
- <label>
18
- <?php esc_html_e('From:', 'googleanalytics'); ?>
19
- <input name="date_from" type="date" value="<?php echo esc_attr($date_from); ?>">
20
- </label>
21
- <label>
22
- <?php esc_html_e('To:', 'googleanalytics'); ?>
23
- <input name="date_to" type="date" value="<?php echo esc_attr($date_to); ?>">
24
- </label>
25
- <button><?php esc_html_e('Filter', 'googleanalytics'); ?></button>
26
- </form>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
view/templates/demo-popup.php CHANGED
@@ -1,16 +1,24 @@
 
 
 
 
 
 
 
 
1
  <div class="demo-enable-popup">
2
  <p>
3
  We are deploying additional data from your Google Analytics account to your WordPress dashboard
4
  as a free service to assist you in operating your WordPress site.
5
  This will result in Google Analytics having access to data collected from Your site(s)
6
  and subject to Google’s privacy policies as described in the <a
7
- href="http://www.sharethis.com/publisher-terms-of-use/" target="_blank">ShareThis Publisher TOU</a>.
8
  We will also use the aggregate demographic data related to your site for analytic purposes.
9
  We will not sell or transfer any of the demographic data relating to your site to any other party.
10
  For more information, please visit the <a
11
- href="http://www.sharethis.com/news/2016/12/sharethis-adds-analytics-plugin-to-suite-of-tools/"
12
  target="_blank">ShareThis Privacy Policy</a> and <a
13
- href="http://www.sharethis.com/publisher-terms-of-use/" target="_blank">Publisher TOU</a>.
14
  </p>
15
  <button id="enable-demographic">I accept</button>
16
  <button class="close-demo-modal">Decline</button>
1
+ <?php
2
+ /**
3
+ * Demo popup view.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ ?>
9
  <div class="demo-enable-popup">
10
  <p>
11
  We are deploying additional data from your Google Analytics account to your WordPress dashboard
12
  as a free service to assist you in operating your WordPress site.
13
  This will result in Google Analytics having access to data collected from Your site(s)
14
  and subject to Google’s privacy policies as described in the <a
15
+ href="https://www.sharethis.com/publisher-terms-of-use/" target="_blank">ShareThis Publisher TOU</a>.
16
  We will also use the aggregate demographic data related to your site for analytic purposes.
17
  We will not sell or transfer any of the demographic data relating to your site to any other party.
18
  For more information, please visit the <a
19
+ href="https://sharethis.com/privacy/"
20
  target="_blank">ShareThis Privacy Policy</a> and <a
21
+ href="https://www.sharethis.com/publisher-terms-of-use/" target="_blank">Publisher TOU</a>.
22
  </p>
23
  <button id="enable-demographic">I accept</button>
24
  <button class="close-demo-modal">Decline</button>
view/templates/demographic-chart.php CHANGED
@@ -1,49 +1,76 @@
1
- <?php if(!$demo_enabled) : ?>
 
 
 
 
 
 
 
 
2
  <div class="demo-ad ga-panel ga-panel-default">
3
  <div class="ga-panel-heading">
4
  <strong>
5
- <?php esc_html_e('Get Demographic Data!'); ?>
6
  <button id="demographic-popup">
7
- <?php esc_html_e('Click Here To Enable', 'googleanalytics'); ?>
8
  </button>
9
  </strong>
10
  </div>
11
- <img src="<?php echo trailingslashit(get_home_url()) . 'wp-content/plugins/googleanalytics/assets/images/demographics-ad.png'; ?>"/>
12
  </div>
13
- <?php elseif ($need_account_demo_enable) : ?>
14
- <div class="demo-ad ga-panel ga-panel-default">
15
- <div class="ga-panel-heading">
16
- <strong>
17
- <?php esc_html_e(
18
- "If no demographics data is shown, you'll most likely need to do one of the following:",
19
- 'googleanalytics'
20
- ); ?>
21
- <br>
22
- <ol>
23
- <li><?php esc_html_e('Enable "Demographics" within Google Analytics.', 'googleanalytics'); ?></li>
24
- <li><?php esc_html_e('If you just enabled this feature, it may require a refresh prior to seeing data.',
25
- 'googleanalytics'); ?></li>
26
- <li><?php esc_html_e('Wait until there\'s sufficient Demographic data to display.',
27
- 'googleanalytics'); ?></li>
28
- </ol>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
 
30
- <a href="<?php echo esc_url($demographic_page_url); ?>/" class="view-report" target="_blank">
31
- <?php echo esc_html__('Go to my account', 'googleanalytics'); ?>
32
- </a>
33
- </strong>
34
- </div>
35
- </div>
36
- <?php else: ?>
37
  <div class="filter-choices">
38
- <?php Ga_Template::load( 'templates/date_custom_range_filter', [
39
- 'date_from' => $date_range['from'],
40
- 'date_to' => $date_range['to']
41
- ] ); ?>
 
 
 
 
 
42
  </div>
43
  <div class="demo-ad ga-panel ga-panel-default">
44
  <div class="ga-panel-heading">
45
  <strong>
46
- <?php esc_html_e('Demographic by sessions'); ?>
47
  </strong>
48
  </div>
49
  <div class="ga-demo-chart">
@@ -60,18 +87,18 @@
60
  </div>
61
  </div>
62
  </div>
63
- <div class="ga-demo-chart">
64
- <div class="ga-panel-body ga-chart device">
65
- <div id="demo_chart_device_div" style="width: 100%;"></div>
66
- <div class="ga-loader-wrapper stats-page">
67
- <div class="ga-loader stats-page-loader"></div>
68
- </div>
69
- </div>
70
- </div>
71
  </div>
72
  <a href="<?php echo esc_url( $demographic_page_url ); ?>/" class="view-report" target="_blank">
73
- <?php echo esc_html__('View Full Report' ); ?>
74
  </a>
75
  <hr>
76
- <?php
77
  endif;
1
+ <?php
2
+ /**
3
+ * Demographic Chart view.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ ?>
9
+ <?php if ( false === $demo_enabled ) : ?>
10
  <div class="demo-ad ga-panel ga-panel-default">
11
  <div class="ga-panel-heading">
12
  <strong>
13
+ <?php esc_html_e( 'Get Demographic Data!', 'googleanalytics' ); ?>
14
  <button id="demographic-popup">
15
+ <?php esc_html_e( 'Click Here To Enable', 'googleanalytics' ); ?>
16
  </button>
17
  </strong>
18
  </div>
19
+ <img src="<?php echo esc_url( trailingslashit( get_home_url() ) . 'wp-content/plugins/googleanalytics/assets/images/demographics-ad.png' ); ?>"/>
20
  </div>
21
+ <?php elseif ( false === empty( $need_account_demo_enable ) ) : ?>
22
+ <div class="demo-ad ga-panel ga-panel-default">
23
+ <div class="ga-panel-heading">
24
+ <strong>
25
+ <?php
26
+ esc_html_e(
27
+ "If no demographics data is shown, you'll most likely need to do one of the following:",
28
+ 'googleanalytics'
29
+ );
30
+ ?>
31
+ <br>
32
+ <ol>
33
+ <li><?php esc_html_e( 'Enable "Demographics" within Google Analytics.', 'googleanalytics' ); ?></li>
34
+ <li>
35
+ <?php
36
+ esc_html_e(
37
+ 'If you just enabled this feature, it may require a refresh prior to seeing data.',
38
+ 'googleanalytics'
39
+ );
40
+ ?>
41
+ </li>
42
+ <li>
43
+ <?php
44
+ esc_html_e(
45
+ 'Wait until there\'s sufficient Demographic data to display.',
46
+ 'googleanalytics'
47
+ );
48
+ ?>
49
+ </li>
50
+ </ol>
51
 
52
+ <a href="<?php echo esc_url( $demographic_page_url ); ?>/" class="view-report" target="_blank">
53
+ <?php esc_html_e( 'Go to my account', 'googleanalytics' ); ?>
54
+ </a>
55
+ </strong>
56
+ </div>
57
+ </div>
58
+ <?php else : ?>
59
  <div class="filter-choices">
60
+ <?php
61
+ Ga_Template::load(
62
+ 'templates/date-custom-range-filter',
63
+ array(
64
+ 'date_from' => $date_range['from'],
65
+ 'date_to' => $date_range['to'],
66
+ )
67
+ );
68
+ ?>
69
  </div>
70
  <div class="demo-ad ga-panel ga-panel-default">
71
  <div class="ga-panel-heading">
72
  <strong>
73
+ <?php esc_html_e( 'Demographic by sessions' ); ?>
74
  </strong>
75
  </div>
76
  <div class="ga-demo-chart">
87
  </div>
88
  </div>
89
  </div>
90
+ <div class="ga-demo-chart">
91
+ <div class="ga-panel-body ga-chart device">
92
+ <div id="demo_chart_device_div" style="width: 100%;"></div>
93
+ <div class="ga-loader-wrapper stats-page">
94
+ <div class="ga-loader stats-page-loader"></div>
95
+ </div>
96
+ </div>
97
+ </div>
98
  </div>
99
  <a href="<?php echo esc_url( $demographic_page_url ); ?>/" class="view-report" target="_blank">
100
+ <?php esc_html_e( 'View Full Report', 'googleanalytics' ); ?>
101
  </a>
102
  <hr>
103
+ <?php
104
  endif;
view/templates/demographic.php CHANGED
@@ -1,19 +1,25 @@
1
  <?php
2
- $enabledisable = get_option('googleanalytics_demographic') === '1' ? 'Disable' : 'Enable';
 
 
 
 
 
 
3
  ?>
4
- <?php if ('Enable' === $enabledisable) : ?>
5
- <tr valign="top">
6
- <th scope="row"><?php esc_html_e('Enable demographic charts', 'googleanalytics'); ?>:</th>
7
  </tr>
8
- <?php if ( Ga_Helper::are_features_enabled() ) : ?>
9
  <td>
10
- <button id="demographic-popup"><?php esc_html_e('Enable', 'googleanalytics'); ?></button>
11
  </td>
12
  <?php else : ?>
13
  <td>
14
- <label class="<?php echo ( ! Ga_Helper::are_features_enabled() ) ? 'label-grey ga-tooltip' : '' ?>">
15
- <button class="gdpr-enable" disabled="disabled"><?php esc_html_e('Enable'); ?></button>
16
- <span class="ga-tooltiptext ga-tt-abs"><?php _e( $tooltip ); ?></span>
17
  </label>
18
  </td>
19
  <?php endif; ?>
1
  <?php
2
+ /**
3
+ * Demographic view.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ $enabledisable = get_option( 'googleanalytics_demographic' ) === '1' ? 'Disable' : 'Enable';
9
  ?>
10
+ <?php if ( 'Enable' === $enabledisable ) : ?>
11
+ <tr>
12
+ <th scope="row"><?php esc_html_e( 'Enable demographic charts', 'googleanalytics' ); ?>:</th>
13
  </tr>
14
+ <?php if ( true === Ga_Helper::are_features_enabled() ) : ?>
15
  <td>
16
+ <button id="demographic-popup"><?php esc_html_e( 'Enable', 'googleanalytics' ); ?></button>
17
  </td>
18
  <?php else : ?>
19
  <td>
20
+ <label class="<?php echo false === Ga_Helper::are_features_enabled() ? 'label-grey ga-tooltip' : ''; ?>">
21
+ <button class="gdpr-enable" disabled="disabled"><?php esc_html_e( 'Enable' ); ?></button>
22
+ <span class="ga-tooltiptext ga-tt-abs"><?php echo esc_html( $tooltip ); ?></span>
23
  </label>
24
  </td>
25
  <?php endif; ?>
view/templates/exclusions.php CHANGED
@@ -1,7 +1,10 @@
1
  <?php
2
  /**
3
  * Configure tool template for gdpr onboarding
 
 
4
  */
 
5
  ?>
6
  <div class="vendor-exclusion">
7
  <div class="vendor-table">
@@ -9,7 +12,7 @@
9
  <div class="vendor-table-header">
10
  <div class="vendor-name">
11
  <h3>
12
- <?php esc_html_e('Vendor names', 'googleanalytics'); ?>
13
  </h3>
14
  <div class="st-input vendor-search">
15
  <input autocomplete="off" id="vendor-search " placeholder="Search for vendor" type="text">
@@ -17,31 +20,33 @@
17
  </div>
18
  </div>
19
  <p class="vendor-info">
20
- <?php esc_html_e('Manage third-party vendors asking for consent across your sites.', 'sharethis-share-buttons'); ?>
21
  </p>
22
  </div>
23
  <div class="vendor-table-body">
24
- <?php foreach ($vendors as $vendor ) : ?>
25
  <div class="vendor-table-cell">
26
- <a name="<?php echo strtolower(esc_html($vendor['name'])); ?>"></a>
27
- <a name="<?php echo strtolower(esc_html(explode(' ', $vendor['name'])[0])); ?>"></a>
28
  <div class="vendor-table-cell-wrapper switch">
29
  <label>
30
- <input data-id="<?php echo esc_attr($vendor['id']); ?>" type="checkbox" name="vendor[<?php echo esc_attr($vendor['id']); ?>]" value="consent" />
31
  <span class="lever"></span>
32
- <strong><?php echo esc_html($vendor['name']); ?></strong>
33
  </label>
34
  <div class="vendor-accor">
35
  <p>
36
- <strong><?php esc_html_e('Privacy Policy: ', 'sharethis-share-buttons'); ?></strong>
37
- <?php echo '<a href="' . $vendor['policyUrl'] . '" target="_blank">' .
38
- $vendor['policyUrl'] . '</a>'; ?>
 
 
39
  </p>
40
  <p>
41
- <strong><?php esc_html_e('Purposes: ', 'sharethis-share-buttons'); ?></strong>
42
  <div class="vendor-purpose-list">
43
- <?php foreach ($vendor['purposes'] as $purpose) : ?>
44
- <p><?php echo esc_html($purposes[$purpose]); ?></p>
45
  <?php endforeach; ?>
46
  </div>
47
  </p>
1
  <?php
2
  /**
3
  * Configure tool template for gdpr onboarding
4
+ *
5
+ * @package GoogleAnalytics
6
  */
7
+
8
  ?>
9
  <div class="vendor-exclusion">
10
  <div class="vendor-table">
12
  <div class="vendor-table-header">
13
  <div class="vendor-name">
14
  <h3>
15
+ <?php esc_html_e( 'Vendor names', 'googleanalytics' ); ?>
16
  </h3>
17
  <div class="st-input vendor-search">
18
  <input autocomplete="off" id="vendor-search " placeholder="Search for vendor" type="text">
20
  </div>
21
  </div>
22
  <p class="vendor-info">
23
+ <?php esc_html_e( 'Manage third-party vendors asking for consent across your sites.', 'googleanalytics' ); ?>
24
  </p>
25
  </div>
26
  <div class="vendor-table-body">
27
+ <?php foreach ( $vendors as $vendor ) : ?>
28
  <div class="vendor-table-cell">
29
+ <a id="<?php echo esc_attr( strtolower( $vendor['name'] ) ); ?>"></a>
30
+ <a id="<?php echo esc_attr( strtolower( explode( ' ', $vendor['name'] )[0] ) ); ?>"></a>
31
  <div class="vendor-table-cell-wrapper switch">
32
  <label>
33
+ <input data-id="<?php echo esc_attr( $vendor['id'] ); ?>" type="checkbox" name="vendor[<?php echo esc_attr( $vendor['id'] ); ?>]" value="consent" />
34
  <span class="lever"></span>
35
+ <strong><?php echo esc_html( $vendor['name'] ); ?></strong>
36
  </label>
37
  <div class="vendor-accor">
38
  <p>
39
+ <strong><?php esc_html_e( 'Privacy Policy: ', 'googleanalytics' ); ?></strong>
40
+ <?php
41
+ echo '<a href="' . esc_url( $vendor['policyUrl'] ) . '" target="_blank">' .
42
+ esc_html( $vendor['policyUrl'] ) . '</a>';
43
+ ?>
44
  </p>
45
  <p>
46
+ <strong><?php esc_html_e( 'Purposes: ', 'googleanalytics' ); ?></strong>
47
  <div class="vendor-purpose-list">
48
+ <?php foreach ( $vendor['purposes'] as $purpose ) : ?>
49
+ <p><?php echo esc_html( $purposes[ $purpose ] ); ?></p>
50
  <?php endforeach; ?>
51
  </div>
52
  </p>
view/templates/gdpr-config.php CHANGED
@@ -1,10 +1,12 @@
1
  <?php
2
  /**
3
  * Appearence display for gdpr config.
 
 
4
  */
5
 
6
  // Template vars.
7
- $colors = [
8
  '#e31010',
9
  '#000000',
10
  '#ffffff',
@@ -34,29 +36,29 @@ $colors = [
34
  '#bedadc',
35
  '#c4def6',
36
  '#bed3f3',
37
- '#d4c4fb'
38
- ];
39
 
40
 
41
  // User type options.
42
  $user_types = array(
43
- 'eu' => esc_html__('Only visitors in the EU', 'sharethis-custom'),
44
- 'always' => esc_html__('All visitors globally', 'sharethis-custom'),
45
  );
46
 
47
  $languages = array(
48
- 'English' => 'en',
49
- 'German' => 'de',
50
- 'Spanish' => 'es',
51
- 'French' => 'fr'
52
  );
53
 
54
- $publisher_name = !empty($gdpr_config['publisher_name']) ? $gdpr_config['publisher_name'] : '';
55
- $enabled = !empty($gdpr_config['enabled']) ? $gdpr_config['enabled'] : false;
56
  ?>
57
  <div id="adblocker-notice" class="notice notice-error is-dismissible">
58
  <p>
59
- <?php echo esc_html__( 'It appears you have an ad blocker enabled. To avoid affecting this plugin\'s functionality, please disable while using its admin configurations and registrations. Thank you.', 'sharethis-share-buttons' ); ?>
60
  </p>
61
  </div>
62
  <div id="detectadblock">
@@ -67,42 +69,60 @@ $enabled = !empty($gdpr_config['enabled']) ? $gdpr_config['enabled'] : false;
67
  <div class="switch">
68
  <div class="purpose-item">
69
  <label class="enable-tool">
70
- <?php echo esc_html__('Enable GDPR', 'googleanalytics'); ?>
71
- <input type="checkbox" name="gdpr-enable" <?php echo checked('true', $enabled); ?>/>
72
  <span class="lever"></span>
73
  </label>
74
  </div>
75
  </div>
76
  <div class="well">
77
  <label class="control-label">
78
- <?php echo esc_html__('PUBLISHER NAME * (this will be displayed in the consent tool)',
79
- 'sharethis-share-buttons'); ?>
 
 
 
 
80
  </label>
81
  <div class="input-div">
82
- <input type="text" id="sharethis-publisher-name" placeholder="Enter your company name" value="<?php echo esc_attr($publisher_name); ?>">
83
  </div>
84
  <label class="control-label">
85
- <?php echo esc_html__('WHICH USERS SHOULD BE ASKED FOR CONSENT?',
86
- 'sharethis-share-buttons'); ?>
 
 
 
 
87
  </label>
88
  <div class="input-div">
89
  <select id="sharethis-user-type">
90
- <?php foreach ($user_types as $user_value => $name) : ?>
91
- <option value="<?php echo esc_attr($user_value); ?>" <?php echo isset($gdpr_config['display']) ? selected($user_value, $gdpr_config['display']) : ''; ?>>
92
- <?php echo esc_html($name); ?>
 
 
 
 
 
93
  </option>
94
  <?php endforeach; ?>
95
  </select>
96
  </div>
97
 
98
  <label class="control-label">
99
- <?php echo esc_html__('SELECT LANGUAGE', 'sharethis-share-buttons'); ?>
100
  </label>
101
  <div class="input-div">
102
  <select id="st-language">
103
- <?php foreach ($languages as $language => $code) : ?>
104
- <option value="<?php echo esc_attr($code); ?>" <?php echo isset($gdpr_config['language']) ? selected($code, $gdpr_config['language']) : ''; ?>>
105
- <?php echo esc_html($language); ?>
 
 
 
 
 
106
  </option>
107
  <?php endforeach; ?>
108
  </select>
@@ -111,33 +131,33 @@ $enabled = !empty($gdpr_config['enabled']) ? $gdpr_config['enabled'] : false;
111
  <div class="accor-wrap">
112
  <div class="accor-tab">
113
  <span class="accor-arrow">&#9658;</span>
114
- <?php echo esc_html__( 'Appearance', 'simple-share-buttons-adder' ); ?>
115
  </div>
116
  <div class="accor-content">
117
  <div class="well">
118
- <?php include plugin_dir_path(__FILE__) . 'appearance.php'; ?>
119
  </div>
120
  </div>
121
  </div>
122
  <div class="accor-wrap">
123
  <div class="accor-tab">
124
  <span class="accor-arrow">&#9658;</span>
125
- <?php echo esc_html__( 'Purposes', 'simple-share-buttons-adder' ); ?>
126
  </div>
127
  <div class="accor-content">
128
  <div class="well">
129
- <?php include plugin_dir_path(__FILE__) . 'purposes.php'; ?>
130
  </div>
131
  </div>
132
  </div>
133
  <div class="accor-wrap">
134
  <div class="accor-tab">
135
  <span class="accor-arrow">&#9658;</span>
136
- <?php echo esc_html__( 'Exclusions', 'googleanalytics' ); ?>
137
  </div>
138
  <div class="accor-content">
139
  <div class="well">
140
- <?php include plugin_dir_path(__FILE__) . 'exclusions.php'; ?>
141
  </div>
142
  </div>
143
  </div>
1
  <?php
2
  /**
3
  * Appearence display for gdpr config.
4
+ *
5
+ * @package GoogleAnalytics
6
  */
7
 
8
  // Template vars.
9
+ $colors = array(
10
  '#e31010',
11
  '#000000',
12
  '#ffffff',
36
  '#bedadc',
37
  '#c4def6',
38
  '#bed3f3',
39
+ '#d4c4fb',
40
+ );
41
 
42
 
43
  // User type options.
44
  $user_types = array(
45
+ 'eu' => esc_html__( 'Only visitors in the EU', 'googleanalytics' ),
46
+ 'always' => esc_html__( 'All visitors globally', 'googleanalytics' ),
47
  );
48
 
49
  $languages = array(
50
+ 'English' => 'en',
51
+ 'German' => 'de',
52
+ 'Spanish' => 'es',
53
+ 'French' => 'fr',
54
  );
55
 
56
+ $publisher_name = ! empty( $gdpr_config['publisher_name'] ) ? $gdpr_config['publisher_name'] : '';
57
+ $enabled = ! empty( $gdpr_config['enabled'] ) ? $gdpr_config['enabled'] : false;
58
  ?>
59
  <div id="adblocker-notice" class="notice notice-error is-dismissible">
60
  <p>
61
+ <?php esc_html_e( 'It appears you have an ad blocker enabled. To avoid affecting this plugin\'s functionality, please disable while using its admin configurations and registrations. Thank you.', 'googleanalytics' ); ?>
62
  </p>
63
  </div>
64
  <div id="detectadblock">
69
  <div class="switch">
70
  <div class="purpose-item">
71
  <label class="enable-tool">
72
+ <?php esc_html_e( 'Enable GDPR', 'googleanalytics' ); ?>
73
+ <input type="checkbox" name="gdpr-enable" <?php echo checked( 'true', $enabled ); ?>/>
74
  <span class="lever"></span>
75
  </label>
76
  </div>
77
  </div>
78
  <div class="well">
79
  <label class="control-label">
80
+ <?php
81
+ esc_html_e(
82
+ 'PUBLISHER NAME * (this will be displayed in the consent tool)',
83
+ 'googleanalytics'
84
+ );
85
+ ?>
86
  </label>
87
  <div class="input-div">
88
+ <input type="text" id="sharethis-publisher-name" placeholder="Enter your company name" value="<?php echo esc_attr( $publisher_name ); ?>">
89
  </div>
90
  <label class="control-label">
91
+ <?php
92
+ esc_html_e(
93
+ 'WHICH USERS SHOULD BE ASKED FOR CONSENT?',
94
+ 'googleanalytics'
95
+ );
96
+ ?>
97
  </label>
98
  <div class="input-div">
99
  <select id="sharethis-user-type">
100
+ <?php foreach ( $user_types as $user_value => $name ) : ?>
101
+ <option value="<?php echo esc_attr( $user_value ); ?>"
102
+ <?php
103
+ echo true === isset( $gdpr_config['display'] ) ?
104
+ selected( $user_value, $gdpr_config['display'] ) : '';
105
+ ?>
106
+ >
107
+ <?php echo esc_html( $name ); ?>
108
  </option>
109
  <?php endforeach; ?>
110
  </select>
111
  </div>
112
 
113
  <label class="control-label">
114
+ <?php esc_html_e( 'SELECT LANGUAGE', 'googleanalytics' ); ?>
115
  </label>
116
  <div class="input-div">
117
  <select id="st-language">
118
+ <?php foreach ( $languages as $language => $code ) : ?>
119
+ <option value="<?php echo esc_attr( $code ); ?>"
120
+ <?php
121
+ echo true === isset( $gdpr_config['language'] ) ?
122
+ selected( $code, $gdpr_config['language'] ) : '';
123
+ ?>
124
+ >
125
+ <?php echo esc_html( $language ); ?>
126
  </option>
127
  <?php endforeach; ?>
128
  </select>
131
  <div class="accor-wrap">
132
  <div class="accor-tab">
133
  <span class="accor-arrow">&#9658;</span>
134
+ <?php esc_html_e( 'Appearance', 'simple-share-buttons-adder' ); ?>
135
  </div>
136
  <div class="accor-content">
137
  <div class="well">
138
+ <?php require plugin_dir_path( __FILE__ ) . 'appearance.php'; ?>
139
  </div>
140
  </div>
141
  </div>
142
  <div class="accor-wrap">
143
  <div class="accor-tab">
144
  <span class="accor-arrow">&#9658;</span>
145
+ <?php esc_html_e( 'Purposes', 'simple-share-buttons-adder' ); ?>
146
  </div>
147
  <div class="accor-content">
148
  <div class="well">
149
+ <?php require plugin_dir_path( __FILE__ ) . 'purposes.php'; ?>
150
  </div>
151
  </div>
152
  </div>
153
  <div class="accor-wrap">
154
  <div class="accor-tab">
155
  <span class="accor-arrow">&#9658;</span>
156
+ <?php esc_html_e( 'Exclusions', 'googleanalytics' ); ?>
157
  </div>
158
  <div class="accor-content">
159
  <div class="well">
160
+ <?php require plugin_dir_path( __FILE__ ) . 'exclusions.php'; ?>
161
  </div>
162
  </div>
163
  </div>
view/templates/gdpr.php CHANGED
@@ -1,19 +1,27 @@
1
- <?php if(empty($gdpr_config)) : ?>
2
- <tr valign="top">
3
- <th scope="row"><?php esc_html_e('Enable GDPR Consent Management Tool', 'googleanalytics'); ?>:</th>
4
- </tr>
5
- <tr valign="top">
6
- <?php if ( Ga_Helper::are_features_enabled() ) : ?>
7
- <td>
8
- <button class="gdpr-enable"><?php esc_html_e('Enable'); ?></button>
9
- </td>
10
- <?php else : ?>
11
- <td>
12
- <label class="<?php echo ( ! Ga_Helper::are_features_enabled() ) ? 'label-grey ga-tooltip' : '' ?>">
13
- <button class="gdpr-enable" disabled="disabled"><?php esc_html_e('Enable'); ?></button>
14
- <span class="ga-tooltiptext ga-tt-abs"><?php _e( $tooltip ); ?></span>
15
- </label>
16
- </td>
17
- <?php endif; ?>
18
- </tr>
 
 
 
 
 
 
 
 
19
  <?php endif; ?>
1
+ <?php
2
+ /**
3
+ * GDPR view.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ ?>
9
+ <?php if ( true === empty( $gdpr_config ) ) : ?>
10
+ <tr>
11
+ <th scope="row"><?php esc_html_e( 'Enable GDPR Consent Management Tool', 'googleanalytics' ); ?>:</th>
12
+ </tr>
13
+ <tr>
14
+ <?php if ( true === Ga_Helper::are_features_enabled() ) : ?>
15
+ <td>
16
+ <button class="gdpr-enable"><?php esc_html_e( 'Enable' ); ?></button>
17
+ </td>
18
+ <?php else : ?>
19
+ <td>
20
+ <label class="<?php echo esc_attr( false === Ga_Helper::are_features_enabled() ? 'label-grey ga-tooltip' : '' ); ?>">
21
+ <button class="gdpr-enable" disabled="disabled"><?php esc_html_e( 'Enable' ); ?></button>
22
+ <span class="ga-tooltiptext ga-tt-abs"><?php echo esc_html( $tooltip ); ?></span>
23
+ </label>
24
+ </td>
25
+ <?php endif; ?>
26
+ </tr>
27
  <?php endif; ?>
view/templates/purposes.php CHANGED
@@ -1,5 +1,13 @@
 
 
 
 
 
 
 
 
1
  <h3>
2
- <?php echo esc_html__('WHY ARE YOU COLLECTING CUSTOMER DATA?', 'googleanalytics'); ?>
3
  </h3>
4
 
5
  <div id="publisher-purpose" class="switch">
@@ -9,175 +17,195 @@
9
  </div>
10
  <div class="purpose-item">
11
  <div class="title">
12
- <?php echo esc_html__(
 
13
  '1) Store and/or access information on a device (Do you collect information on users on your site through cookies or site identifiers?)',
14
  'googleanalytics'
15
- ); ?>
 
16
  </div>
17
  <label>
18
- <?php echo esc_html__('Consent', 'googleanalytics'); ?>
19
  <input data-id="1" type="checkbox" name="purposes[1]" value="consent" checked/>
20
  <span class="lever"></span>
21
  </label>
22
  </div>
23
  <div class="purpose-item">
24
  <div class="title">
25
- <?php echo esc_html__(
 
26
  '2) Select basic ads (Do you serve ads on your site?)',
27
  'googleanalytics'
28
- ); ?>
 
29
  </div>
30
  <label>
31
- <?php echo esc_html__('Consent', 'googleanalytics'); ?>
32
  <input data-id="2" type="radio" name="purposes[2]" value="consent" checked/>
33
  <span class="lever"></span>
34
  </label>
35
  <label>
36
- <?php echo esc_html__('Legitimate Interest', 'googleanalytics'); ?>
37
  <input data-id="2" type="radio" name="purposes[2]" value="legitimate"/>
38
  <span class="lever"></span>
39
  </label>
40
  </div>
41
  <div class="purpose-item">
42
  <div class="title">
43
- <?php echo esc_html__(
 
44
  '3) Create a personalised ads profile (Do you create personalised advertising profiles associated with users on your site (ie: profiles based on demographic information, location, user’s activity)?)',
45
  'googleanalytics'
46
- ); ?>
 
47
  </div>
48
  <label>
49
- <?php echo esc_html__('Consent', 'googleanalytics'); ?>
50
  <input data-id="3" type="radio" name="purposes[3]" value="consent" checked/>
51
  <span class="lever"></span>
52
  </label>
53
  <label>
54
- <?php echo esc_html__('Legitimate Interest', 'googleanalytics'); ?>
55
  <input data-id="3" type="radio" name="purposes[3]" value="legitimate"/>
56
  <span class="lever"></span>
57
  </label>
58
  </div>
59
  <div class="purpose-item">
60
  <div class="title">
61
- <?php echo esc_html__(
 
62
  '4) Select personalised ads (Do you show ads to users based on this user profile)',
63
  'googleanalytics'
64
- ); ?>
 
65
  </div>
66
  <label>
67
- <?php echo esc_html__('Consent', 'googleanalytics'); ?>
68
  <input data-id="4" type="radio" name="purposes[4]" value="consent" checked/>
69
  <span class="lever"></span>
70
  </label>
71
  <label>
72
- <?php echo esc_html__('Legitimate Interest', 'googleanalytics'); ?>
73
  <input data-id="4" type="radio" name="purposes[4]" value="legitimate"/>
74
  <span class="lever"></span>
75
  </label>
76
  </div>
77
  <div class="purpose-item">
78
  <div class="title">
79
- <?php echo esc_html__(
 
80
  '5) Create a personalised content profile (Do you build a personalized content profile associated with users on your site based on the type of content they have viewed?)',
81
  'googleanalytics'
82
- ); ?>
 
83
  </div>
84
  <label>
85
- <?php echo esc_html__('Consent', 'googleanalytics'); ?>
86
  <input data-id="5" type="radio" name="purposes[5]" value="consent" checked />
87
  <span class="lever"></span>
88
  </label>
89
  <label>
90
- <?php echo esc_html__('Legitimate Interest', 'googleanalytics'); ?>
91
  <input data-id="5" type="radio" name="purposes[5]" value="legitimate"/>
92
  <span class="lever"></span>
93
  </label>
94
  </div>
95
  <div class="purpose-item">
96
  <div class="title">
97
- <?php echo esc_html__(
 
98
  '6) Select personalised content (Do you serve content to the user on your site based on your recorded content interests)',
99
  'googleanalytics'
100
- ); ?>
 
101
  </div>
102
  <label>
103
- <?php echo esc_html__('Consent', 'googleanalytics'); ?>
104
  <input data-id="6" type="radio" name="purposes[6]" value="consent" checked />
105
  <span class="lever"></span>
106
  </label>
107
  <label>
108
- <?php echo esc_html__('Legitimate Interest', 'googleanalytics'); ?>
109
  <input data-id="6" type="radio" name="purposes[6]" value="legitimate"/>
110
  <span class="lever"></span>
111
  </label>
112
  </div>
113
  <div class="purpose-item">
114
  <div class="title">
115
- <?php echo esc_html__(
 
116
  '7) Measure ad performance (Do you measure the performance of advertisements on your site)',
117
  'googleanalytics'
118
- ); ?>
 
119
  </div>
120
  <label>
121
- <?php echo esc_html__('Consent', 'googleanalytics'); ?>
122
  <input data-id="7" type="radio" name="purposes[7]" value="consent" checked/>
123
  <span class="lever"></span>
124
  </label>
125
  <label>
126
- <?php echo esc_html__('Legitimate Interest', 'googleanalytics'); ?>
127
  <input data-id="7" type="radio" name="purposes[7]" value="legitimate"/>
128
  <span class="lever"></span>
129
  </label>
130
  </div>
131
  <div class="purpose-item">
132
  <div class="title">
133
- <?php echo esc_html__(
 
134
  '8) Measure content performance (Do you measure the performance of content served to your site visitors?)',
135
  'googleanalytics'
136
- ); ?>
 
137
  </div>
138
  <label>
139
- <?php echo esc_html__('Consent', 'googleanalytics'); ?>
140
  <input data-id="8" type="radio" name="purposes[8]" value="consent" checked/>
141
  <span class="lever"></span>
142
  </label>
143
  <label>
144
- <?php echo esc_html__('Legitimate Interest', 'googleanalytics'); ?>
145
  <input data-id="8" type="radio" name="purposes[8]" value="legitimate"/>
146
  <span class="lever"></span>
147
  </label>
148
  </div>
149
  <div class="purpose-item">
150
  <div class="title">
151
- <?php echo esc_html__(
 
152
  '9) Apply market research to generate audience insights (Do you aggregate reporting on the ads or content show to your site visitors to advertisers)',
153
  'googleanalytics'
154
- ); ?>
 
155
  </div>
156
  <label>
157
- <?php echo esc_html__('Consent', 'googleanalytics'); ?>
158
  <input data-id="9" type="radio" name="purposes[9]" value="consent" checked/>
159
  <span class="lever"></span>
160
  </label>
161
  <label>
162
- <?php echo esc_html__('Legitimate Interest', 'googleanalytics'); ?>
163
  <input data-id="9" type="radio" name="purposes[9]" value="legitimate"/>
164
  <span class="lever"></span>
165
  </label>
166
  </div>
167
  <div class="purpose-item">
168
  <div class="title">
169
- <?php echo esc_html__(
 
170
  '10) Develop and improve products (Do you use data collected on your site visitors to improve your systems or software or create new products?)',
171
  'googleanalytics'
172
- ); ?>
 
173
  </div>
174
  <label>
175
- <?php echo esc_html__('Consent', 'googleanalytics'); ?>
176
  <input data-id="10" type="radio" name="purposes[10]" value="consent" checked/>
177
  <span class="lever"></span>
178
  </label>
179
  <label>
180
- <?php echo esc_html__('Legitimate Interest', 'googleanalytics'); ?>
181
  <input data-id="10" type="radio" name="purposes[10]" value="legitimate"/>
182
  <span class="lever"></span>
183
  </label>
1
+ <?php
2
+ /**
3
+ * Purposes view.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ ?>
9
  <h3>
10
+ <?php esc_html_e( 'WHY ARE YOU COLLECTING CUSTOMER DATA?', 'googleanalytics' ); ?>
11
  </h3>
12
 
13
  <div id="publisher-purpose" class="switch">
17
  </div>
18
  <div class="purpose-item">
19
  <div class="title">
20
+ <?php
21
+ esc_html_e(
22
  '1) Store and/or access information on a device (Do you collect information on users on your site through cookies or site identifiers?)',
23
  'googleanalytics'
24
+ );
25
+ ?>
26
  </div>
27
  <label>
28
+ <?php esc_html_e( 'Consent', 'googleanalytics' ); ?>
29
  <input data-id="1" type="checkbox" name="purposes[1]" value="consent" checked/>
30
  <span class="lever"></span>
31
  </label>
32
  </div>
33
  <div class="purpose-item">
34
  <div class="title">
35
+ <?php
36
+ esc_html_e(
37
  '2) Select basic ads (Do you serve ads on your site?)',
38
  'googleanalytics'
39
+ );
40
+ ?>
41
  </div>
42
  <label>
43
+ <?php esc_html_e( 'Consent', 'googleanalytics' ); ?>
44
  <input data-id="2" type="radio" name="purposes[2]" value="consent" checked/>
45
  <span class="lever"></span>
46
  </label>
47
  <label>
48
+ <?php esc_html_e( 'Legitimate Interest', 'googleanalytics' ); ?>
49
  <input data-id="2" type="radio" name="purposes[2]" value="legitimate"/>
50
  <span class="lever"></span>
51
  </label>
52
  </div>
53
  <div class="purpose-item">
54
  <div class="title">
55
+ <?php
56
+ esc_html_e(
57
  '3) Create a personalised ads profile (Do you create personalised advertising profiles associated with users on your site (ie: profiles based on demographic information, location, user’s activity)?)',
58
  'googleanalytics'
59
+ );
60
+ ?>
61
  </div>
62
  <label>
63
+ <?php esc_html_e( 'Consent', 'googleanalytics' ); ?>
64
  <input data-id="3" type="radio" name="purposes[3]" value="consent" checked/>
65
  <span class="lever"></span>
66
  </label>
67
  <label>
68
+ <?php esc_html_e( 'Legitimate Interest', 'googleanalytics' ); ?>
69
  <input data-id="3" type="radio" name="purposes[3]" value="legitimate"/>
70
  <span class="lever"></span>
71
  </label>
72
  </div>
73
  <div class="purpose-item">
74
  <div class="title">
75
+ <?php
76
+ esc_html_e(
77
  '4) Select personalised ads (Do you show ads to users based on this user profile)',
78
  'googleanalytics'
79
+ );
80
+ ?>
81
  </div>
82
  <label>
83
+ <?php esc_html_e( 'Consent', 'googleanalytics' ); ?>
84
  <input data-id="4" type="radio" name="purposes[4]" value="consent" checked/>
85
  <span class="lever"></span>
86
  </label>
87
  <label>
88
+ <?php esc_html_e( 'Legitimate Interest', 'googleanalytics' ); ?>
89
  <input data-id="4" type="radio" name="purposes[4]" value="legitimate"/>
90
  <span class="lever"></span>
91
  </label>
92
  </div>
93
  <div class="purpose-item">
94
  <div class="title">
95
+ <?php
96
+ esc_html_e(
97
  '5) Create a personalised content profile (Do you build a personalized content profile associated with users on your site based on the type of content they have viewed?)',
98
  'googleanalytics'
99
+ );
100
+ ?>
101
  </div>
102
  <label>
103
+ <?php esc_html_e( 'Consent', 'googleanalytics' ); ?>
104
  <input data-id="5" type="radio" name="purposes[5]" value="consent" checked />
105
  <span class="lever"></span>
106
  </label>
107
  <label>
108
+ <?php esc_html_e( 'Legitimate Interest', 'googleanalytics' ); ?>
109
  <input data-id="5" type="radio" name="purposes[5]" value="legitimate"/>
110
  <span class="lever"></span>
111
  </label>
112
  </div>
113
  <div class="purpose-item">
114
  <div class="title">
115
+ <?php
116
+ esc_html_e(
117
  '6) Select personalised content (Do you serve content to the user on your site based on your recorded content interests)',
118
  'googleanalytics'
119
+ );
120
+ ?>
121
  </div>
122
  <label>
123
+ <?php esc_html_e( 'Consent', 'googleanalytics' ); ?>
124
  <input data-id="6" type="radio" name="purposes[6]" value="consent" checked />
125
  <span class="lever"></span>
126
  </label>
127
  <label>
128
+ <?php esc_html_e( 'Legitimate Interest', 'googleanalytics' ); ?>
129
  <input data-id="6" type="radio" name="purposes[6]" value="legitimate"/>
130
  <span class="lever"></span>
131
  </label>
132
  </div>
133
  <div class="purpose-item">
134
  <div class="title">
135
+ <?php
136
+ esc_html_e(
137
  '7) Measure ad performance (Do you measure the performance of advertisements on your site)',
138
  'googleanalytics'
139
+ );
140
+ ?>
141
  </div>
142
  <label>
143
+ <?php esc_html_e( 'Consent', 'googleanalytics' ); ?>
144
  <input data-id="7" type="radio" name="purposes[7]" value="consent" checked/>
145
  <span class="lever"></span>
146
  </label>
147
  <label>
148
+ <?php esc_html_e( 'Legitimate Interest', 'googleanalytics' ); ?>
149
  <input data-id="7" type="radio" name="purposes[7]" value="legitimate"/>
150
  <span class="lever"></span>
151
  </label>
152
  </div>
153
  <div class="purpose-item">
154
  <div class="title">
155
+ <?php
156
+ esc_html_e(
157
  '8) Measure content performance (Do you measure the performance of content served to your site visitors?)',
158
  'googleanalytics'
159
+ );
160
+ ?>
161
  </div>
162
  <label>
163
+ <?php esc_html_e( 'Consent', 'googleanalytics' ); ?>
164
  <input data-id="8" type="radio" name="purposes[8]" value="consent" checked/>
165
  <span class="lever"></span>
166
  </label>
167
  <label>
168
+ <?php esc_html_e( 'Legitimate Interest', 'googleanalytics' ); ?>
169
  <input data-id="8" type="radio" name="purposes[8]" value="legitimate"/>
170
  <span class="lever"></span>
171
  </label>
172
  </div>
173
  <div class="purpose-item">
174
  <div class="title">
175
+ <?php
176
+ esc_html_e(
177
  '9) Apply market research to generate audience insights (Do you aggregate reporting on the ads or content show to your site visitors to advertisers)',
178
  'googleanalytics'
179
+ );
180
+ ?>
181
  </div>
182
  <label>
183
+ <?php esc_html_e( 'Consent', 'googleanalytics' ); ?>
184
  <input data-id="9" type="radio" name="purposes[9]" value="consent" checked/>
185
  <span class="lever"></span>
186
  </label>
187
  <label>
188
+ <?php esc_html_e( 'Legitimate Interest', 'googleanalytics' ); ?>
189
  <input data-id="9" type="radio" name="purposes[9]" value="legitimate"/>
190
  <span class="lever"></span>
191
  </label>
192
  </div>
193
  <div class="purpose-item">
194
  <div class="title">
195
+ <?php
196
+ esc_html_e(
197
  '10) Develop and improve products (Do you use data collected on your site visitors to improve your systems or software or create new products?)',
198
  'googleanalytics'
199
+ );
200
+ ?>
201
  </div>
202
  <label>
203
+ <?php esc_html_e( 'Consent', 'googleanalytics' ); ?>
204
  <input data-id="10" type="radio" name="purposes[10]" value="consent" checked/>
205
  <span class="lever"></span>
206
  </label>
207
  <label>
208
+ <?php esc_html_e( 'Legitimate Interest', 'googleanalytics' ); ?>
209
  <input data-id="10" type="radio" name="purposes[10]" value="legitimate"/>
210
  <span class="lever"></span>
211
  </label>
view/templates/sidebar/demo-ad.php CHANGED
@@ -1,60 +1,69 @@
1
  <?php
2
  /**
3
  * Template for GDPR side bar ad in settings page.
 
 
4
  */
 
5
  ?>
6
  <div class="sidebar-ad">
7
  <div id="demo-ad">
8
  <h2 style="text-decoration: underline;">
9
- <?php esc_html_e('Demographics data now available!', 'googleanalytics'); ?>
10
  </h2>
11
  <div class="row">
12
  <div class="col-md-12">
13
- <img src="<?php echo esc_url($plugin_uri . 'assets/images/demographics-ex.png'); ?>"/>
14
  </div>
15
  <div class="col-md-6">
16
  <p>
17
- <?php esc_html_e('Find out more about your target audience by enabling the demographics feature!', 'googleanalytics'); ?>
18
  </p>
19
- <h3><?php esc_html_e('Why Collect Demographics and Interests Data?', 'googleanalytics'); ?></h3>
20
  <p>
21
- <?php esc_html_e(
 
22
  'By viewing demographics data, you will learn more details about your visitors so you can deliver content/create products that address their needs!',
23
  'googleanalytics'
24
- ); ?>
 
25
  </p>
26
  </div>
27
  <div class="col-md-6">
28
- <h3><?php esc_html_e('Gender', 'googleanalytics'); ?></h3>
29
  <p>
30
- <?php esc_html_e(
 
31
  'Understanding exactly which gender visits different areas of your website, could allow you to optimise those areas accordingly.',
32
  'googleanalytics'
33
- ); ?>
 
34
  </p>
35
  </div>
36
  </div>
37
  <div class="row">
38
  <div class="col-md-6">
39
- <h3><?php esc_html_e('Age', 'googleanalytics'); ?></h3>
40
  <p>
41
- <?php esc_html_e(
 
42
  'Determine your site\'s age demographic and make the site more friendly to use for that group.',
43
  'googleanalytics'
44
- ); ?>
 
45
  </p>
46
  </div>
47
  </div>
48
  <div class="row register-section">
49
- <?php if ( Ga_Helper::are_features_enabled() ) : ?>
50
  <td>
51
- <button id="demographic-popup"><?php esc_html_e('Enable'); ?></button>
52
  </td>
53
  <?php else : ?>
54
  <td>
55
- <label class="<?php echo ( ! Ga_Helper::are_features_enabled() ) ? 'label-grey ga-tooltip' : '' ?>">
56
- <button class="gdpr-enable" disabled="disabled"><?php esc_html_e('Enable'); ?></button>
57
- <span class="ga-tooltiptext ga-tt-abs"><?php _e( $tooltip ); ?></span>
58
  </label>
59
  </td>
60
  <?php endif; ?>
1
  <?php
2
  /**
3
  * Template for GDPR side bar ad in settings page.
4
+ *
5
+ * @package GoogleAnalytics
6
  */
7
+
8
  ?>
9
  <div class="sidebar-ad">
10
  <div id="demo-ad">
11
  <h2 style="text-decoration: underline;">
12
+ <?php esc_html_e( 'Demographics data now available!', 'googleanalytics' ); ?>
13
  </h2>
14
  <div class="row">
15
  <div class="col-md-12">
16
+ <img src="<?php echo esc_url( $plugin_uri . 'assets/images/demographics-ex.png' ); ?>"/>
17
  </div>
18
  <div class="col-md-6">
19
  <p>
20
+ <?php esc_html_e( 'Find out more about your target audience by enabling the demographics feature!', 'googleanalytics' ); ?>
21
  </p>
22
+ <h3><?php esc_html_e( 'Why Collect Demographics and Interests Data?', 'googleanalytics' ); ?></h3>
23
  <p>
24
+ <?php
25
+ esc_html_e(
26
  'By viewing demographics data, you will learn more details about your visitors so you can deliver content/create products that address their needs!',
27
  'googleanalytics'
28
+ );
29
+ ?>
30
  </p>
31
  </div>
32
  <div class="col-md-6">
33
+ <h3><?php esc_html_e( 'Gender', 'googleanalytics' ); ?></h3>
34
  <p>
35
+ <?php
36
+ esc_html_e(
37
  'Understanding exactly which gender visits different areas of your website, could allow you to optimise those areas accordingly.',
38
  'googleanalytics'
39
+ );
40
+ ?>
41
  </p>
42
  </div>
43
  </div>
44
  <div class="row">
45
  <div class="col-md-6">
46
+ <h3><?php esc_html_e( 'Age', 'googleanalytics' ); ?></h3>
47
  <p>
48
+ <?php
49
+ esc_html_e(
50
  'Determine your site\'s age demographic and make the site more friendly to use for that group.',
51
  'googleanalytics'
52
+ );
53
+ ?>
54
  </p>
55
  </div>
56
  </div>
57
  <div class="row register-section">
58
+ <?php if ( true === Ga_Helper::are_features_enabled() ) : ?>
59
  <td>
60
+ <button id="demographic-popup"><?php esc_html_e( 'Enable' ); ?></button>
61
  </td>
62
  <?php else : ?>
63
  <td>
64
+ <label class="<?php echo esc_attr( false === Ga_Helper::are_features_enabled() ? 'label-grey ga-tooltip' : '' ); ?>">
65
+ <button class="gdpr-enable" disabled="disabled"><?php esc_html_e( 'Enable' ); ?></button>
66
+ <span class="ga-tooltiptext ga-tt-abs"><?php echo esc_html( $tooltip ); ?></span>
67
  </label>
68
  </td>
69
  <?php endif; ?>
view/templates/sidebar/gdpr-ad.php CHANGED
@@ -1,66 +1,77 @@
1
  <?php
2
  /**
3
  * Template for GDPR side bar ad in settings page.
 
 
4
  */
 
5
  ?>
6
  <div class="sidebar-ad">
7
  <div id="gdpr-ad">
8
  <h2 style="text-decoration: underline;">
9
- <?php esc_html_e('Check out our new GDPR Compliance Tool!', 'googleanalytics'); ?>
10
  </h2>
11
  <div class="row">
12
  <div class="col-md-12">
13
- <img src="<?php echo $plugin_uri . 'assets/images/gdpr-ex.png'; ?>" />
14
  </div>
15
  <div class="col-md-6">
16
- <h3><?php esc_html_e('Confirm Consent', 'googleanalytics'); ?></h3>
17
  <p>
18
- <?php esc_html_e(
 
19
  'A simple and streamlined way to confirm a user’s initial acceptance or rejection of cookie collection',
20
  'googleanalytics'
21
- ); ?>
 
22
  </p>
23
  </div>
24
  <div class="col-md-6">
25
- <h3><?php esc_html_e('Select Purpose', 'googleanalytics'); ?></h3>
26
  <p>
27
- <?php esc_html_e(
 
28
  'A transparent system of verifying the intent of collecting a user’s cookies, and giving the option to opt in or out',
29
  'googleanalytics'
30
- ); ?>
 
31
  </p>
32
  </div>
33
  </div>
34
  <div class="row">
35
  <div class="col-md-6">
36
- <h3><?php esc_html_e('Indicate Company', 'googleanalytics'); ?></h3>
37
  <p>
38
- <?php esc_html_e(
 
39
  'A comprehensive record of company-level information that allows users to monitor and control the recipients of cookie collection',
40
  'googleanalytics'
41
- ); ?>
 
42
  </p>
43
  </div>
44
  <div class="col-md-6">
45
- <h3><?php esc_html_e('Access Data Rights', 'googleanalytics'); ?></h3>
46
  <p>
47
- <?php esc_html_e(
 
48
  'A centralized database where users can review the latest privacy policies and information pertaining to their cookie collection',
49
  'googleanalytics'
50
- ); ?>
 
51
  </p>
52
  </div>
53
  </div>
54
  <div class="row register-section">
55
- <?php if ( Ga_Helper::are_features_enabled() ) : ?>
56
  <td>
57
- <button class="gdpr-enable"><?php esc_html_e('Enable'); ?></button>
58
  </td>
59
  <?php else : ?>
60
  <td>
61
- <label class="<?php echo ( ! Ga_Helper::are_features_enabled() ) ? 'label-grey ga-tooltip' : '' ?>">
62
- <button class="gdpr-enable" disabled="disabled"><?php esc_html_e('Enable'); ?></button>
63
- <span class="ga-tooltiptext ga-tt-abs"><?php _e( $tooltip ); ?></span>
64
  </label>
65
  </td>
66
  <?php endif; ?>
1
  <?php
2
  /**
3
  * Template for GDPR side bar ad in settings page.
4
+ *
5
+ * @package GoogleAnalytics
6
  */
7
+
8
  ?>
9
  <div class="sidebar-ad">
10
  <div id="gdpr-ad">
11
  <h2 style="text-decoration: underline;">
12
+ <?php esc_html_e( 'Check out our new GDPR Compliance Tool!', 'googleanalytics' ); ?>
13
  </h2>
14
  <div class="row">
15
  <div class="col-md-12">
16
+ <img src="<?php echo esc_url( $plugin_uri . 'assets/images/gdpr-ex.png' ); ?>" />
17
  </div>
18
  <div class="col-md-6">
19
+ <h3><?php esc_html_e( 'Confirm Consent', 'googleanalytics' ); ?></h3>
20
  <p>
21
+ <?php
22
+ esc_html_e(
23
  'A simple and streamlined way to confirm a user’s initial acceptance or rejection of cookie collection',
24
  'googleanalytics'
25
+ );
26
+ ?>
27
  </p>
28
  </div>
29
  <div class="col-md-6">
30
+ <h3><?php esc_html_e( 'Select Purpose', 'googleanalytics' ); ?></h3>
31
  <p>
32
+ <?php
33
+ esc_html_e(
34
  'A transparent system of verifying the intent of collecting a user’s cookies, and giving the option to opt in or out',
35
  'googleanalytics'
36
+ );
37
+ ?>
38
  </p>
39
  </div>
40
  </div>
41
  <div class="row">
42
  <div class="col-md-6">
43
+ <h3><?php esc_html_e( 'Indicate Company', 'googleanalytics' ); ?></h3>
44
  <p>
45
+ <?php
46
+ esc_html_e(
47
  'A comprehensive record of company-level information that allows users to monitor and control the recipients of cookie collection',
48
  'googleanalytics'
49
+ );
50
+ ?>
51
  </p>
52
  </div>
53
  <div class="col-md-6">
54
+ <h3><?php esc_html_e( 'Access Data Rights', 'googleanalytics' ); ?></h3>
55
  <p>
56
+ <?php
57
+ esc_html_e(
58
  'A centralized database where users can review the latest privacy policies and information pertaining to their cookie collection',
59
  'googleanalytics'
60
+ );
61
+ ?>
62
  </p>
63
  </div>
64
  </div>
65
  <div class="row register-section">
66
+ <?php if ( true === Ga_Helper::are_features_enabled() ) : ?>
67
  <td>
68
+ <button class="gdpr-enable"><?php esc_html_e( 'Enable', 'googleanalytics' ); ?></button>
69
  </td>
70
  <?php else : ?>
71
  <td>
72
+ <label class="<?php echo esc_attr( false === Ga_Helper::are_features_enabled() ? 'label-grey ga-tooltip' : '' ); ?>">
73
+ <button class="gdpr-enable" disabled="disabled"><?php esc_html_e( 'Enable', 'googleanalytics' ); ?></button>
74
+ <span class="ga-tooltiptext ga-tt-abs"><?php echo esc_html( $tooltip ); ?></span>
75
  </label>
76
  </td>
77
  <?php endif; ?>
view/trending.php CHANGED
@@ -1,96 +1,127 @@
 
 
 
 
 
 
 
 
1
  <div class="wrap ga-wrap">
2
- <h3 class="ga-trending-h3">Google Analytics</h3>
3
- <h2 class="ga-trending-h2"><?php _e( 'Trending content' ); ?></h2>
4
- <div class="ga_container <?php echo ( ! Ga_Helper::are_features_enabled() ) ? 'label-grey ga-tooltip' : ''; ?>"
5
- id="exTab2">
6
- <?php if ( ! empty( $data['error_message'] ) ) : ?>
7
- <?php echo $data['error_message']; ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  <?php endif; ?>
9
- <?php if ( ! empty( $data['ga_msg'] ) ) : ?>
10
- <?php echo $data['ga_msg']; ?>
11
- <?php endif; ?>
12
- <span class="ga-tooltiptext ga-tooltiptext-trending"><?php _e( $tooltip ); ?></span>
13
- <div class="ga-trending-loader">
14
- <div class="ga-trending-loader-wrapper">
15
- <div class="ga-loader"></div>
16
- </div>
17
- <div class="ga-trending-loading-text"><?php _e( 'Please wait. Trending Content Alerts are loading.' ); ?></div>
18
- </div>
19
- <?php if ( Ga_Helper::are_features_enabled() && empty( $errors ) ) : ?>
20
- <?php if ( ! empty( $alerts ) && empty( $alerts->error ) ) : ?>
21
- <div class="trending-table-container">
22
- <table class="ga-table ga-table-trending">
23
- <tr>
24
- <th>
25
- <?php _e( 'Top 5 Recent alerts' ); ?>
26
- </th>
27
- <th class="weight-normal">
28
- <?php _e( 'Views' ); ?>
29
- </th>
30
- <th class="weight-normal trending-time">
31
- <?php _e( 'Time Notified' ); ?>
32
- </th>
33
- </tr>
34
- <?php foreach ( $alerts as $key => $alert ) : ?>
35
- <tr>
36
- <td>
37
- <a class="trending-link"
38
- href="<?php echo $alert->{"url"}; ?>"><?php echo $alert->{"url"}; ?></a>
39
- </td>
40
- <td><?php echo ( property_exists( $alert, "pageviews" ) ) ? $alert->{"pageviews"} : '0'; ?></td>
41
- <td><?php echo date( 'F jS, g:ia', strtotime( $alert->{"sent_at"} ) ); ?></td>
42
- </tr>
43
- <?php if ( $key >= 4 ) {
44
- break;
45
- } ?>
46
- <?php endforeach; ?>
47
- </table>
48
- </div>
49
- <?php elseif ( ! empty( $alerts->error ) ) : ?>
50
- <div class="ga-alert ga-alert-danger">
51
- <?php _e( $alerts->error ); ?>
52
- </div>
53
- <?php else : ?>
54
- <div class="ga-alert ga-alert-warning">
55
- <?php _e( 'You will see a history of trending content here once the first article takes off.' ); ?>
56
- <a class="ga-alert-link" href="http://tiny.cc/trending/"><?php _e( 'Click here to learn more' ); ?></a>
57
- </div>
58
- <?php endif; ?>
59
- <?php endif; ?>
60
- <div>
61
- <form method="post">
62
- <?php wp_nonce_field(Ga_Admin_Controller::ACTION_SHARETHIS_INVITE, Ga_Admin_Controller::GA_NONCE_FIELD_NAME); ?>
63
- <input type="hidden" name="<?php echo Ga_Controller_Core::ACTION_PARAM_NAME; ?>"
64
- value="<?php echo Ga_Admin_Controller::ACTION_SHARETHIS_INVITE; ?>">
65
- <table>
66
  <tr class="ga-ta-header">
67
  <th>
68
- <?php _e( 'Trending alerts' ); ?>
69
  </th>
70
  </tr>
71
- <tr>
72
- <td>
73
- <?php _e( 'Interested in receiving alerts via slack or email? Sign into your Social Optimization Platform account and activate it!
74
- Enter your email and we\'ll send you an invite' ); ?>
75
- </td>
76
- </tr>
77
- <tr>
78
- <td><?php _e( 'Enter your email to receive an invite' ); ?> <input name="sharethis_invite_email"
79
- type="email" value=""
80
- <?php echo ( ! Ga_Helper::are_features_enabled() ) ? 'disabled="disabled"' : ''; ?>
81
- placeholder="Your email address">
82
- <button <?php echo ( ! Ga_Helper::are_features_enabled() ) ? 'disabled="disabled"' : ''; ?>
83
- type="submit" class="button button-primary"><?php _e( 'Send' ); ?></button>
84
- </td>
85
- </tr>
86
- </table>
87
- </form>
88
- </div>
89
- </div>
 
 
 
 
 
90
  </div>
91
 
92
  <script type="text/javascript">
93
- <?php if( Ga_Helper::are_features_enabled() ) : ?>
94
- ga_trending_loader.show();
95
  <?php endif; ?>
96
  </script>
1
+ <?php
2
+ /**
3
+ * Trending view.
4
+ *
5
+ * @package GoogleAnalytics
6
+ */
7
+
8
+ ?>
9
  <div class="wrap ga-wrap">
10
+ <h3 class="ga-trending-h3">Google Analytics</h3>
11
+ <h2 class="ga-trending-h2"><?php esc_html_e( 'Trending content', 'googleanalytics' ); ?></h2>
12
+ <div class="ga_container <?php echo esc_attr( false === Ga_Helper::are_features_enabled() ? 'label-grey ga-tooltip' : '' ); ?>"
13
+ id="exTab2">
14
+ <?php if ( false === empty( $data['error_message'] ) ) : ?>
15
+ <?php echo esc_html( $data['error_message'] ); ?>
16
+ <?php endif; ?>
17
+ <?php if ( false === empty( $data['ga_msg'] ) ) : ?>
18
+ <?php echo esc_html( $data['ga_msg'] ); ?>
19
+ <?php endif; ?>
20
+ <span class="ga-tooltiptext ga-tooltiptext-trending"><?php echo esc_html( $tooltip ); ?></span>
21
+ <div class="ga-trending-loader">
22
+ <div class="ga-trending-loader-wrapper">
23
+ <div class="ga-loader"></div>
24
+ </div>
25
+ <div class="ga-trending-loading-text"><?php echo esc_html__( 'Please wait. Trending Content Alerts are loading.', 'googleanalytics' ); ?></div>
26
+ </div>
27
+ <?php if ( true === Ga_Helper::are_features_enabled() && true === empty( $errors ) ) : ?>
28
+ <?php if ( false === empty( $alerts ) && true === empty( $alerts->error ) ) : ?>
29
+ <div class="trending-table-container">
30
+ <table class="ga-table ga-table-trending">
31
+ <tr>
32
+ <th>
33
+ <?php echo esc_html__( 'Top 5 Recent alerts', 'googleanalytics' ); ?>
34
+ </th>
35
+ <th class="weight-normal">
36
+ <?php echo esc_html__( 'Views', 'googleanalytics' ); ?>
37
+ </th>
38
+ <th class="weight-normal trending-time">
39
+ <?php echo esc_html__( 'Time Notified', 'googleanalytics' ); ?>
40
+ </th>
41
+ </tr>
42
+ <?php foreach ( $alerts as $key => $alert ) : ?>
43
+ <tr>
44
+ <td>
45
+ <a class="trending-link" href="<?php echo esc_url( $alert->{'url'} ); ?>">
46
+ <?php echo esc_html( $alert->{'url'} ); ?>
47
+ </a>
48
+ </td>
49
+ <td>
50
+ <?php
51
+ echo esc_html(
52
+ property_exists(
53
+ $alert,
54
+ 'pageviews'
55
+ ) ? $alert->{'pageviews'} : '0'
56
+ );
57
+ ?>
58
+ </td>
59
+ <td><?php echo esc_html( gmdate( 'F jS, g:ia', strtotime( $alert->{'sent_at'} ) ) ); ?></td>
60
+ </tr>
61
+ <?php
62
+ if ( $key >= 4 ) {
63
+ break;
64
+ }
65
+ ?>
66
+ <?php endforeach; ?>
67
+ </table>
68
+ </div>
69
+ <?php elseif ( ! empty( $alerts->error ) ) : ?>
70
+ <div class="ga-alert ga-alert-danger">
71
+ <?php echo wp_kses_post( $alerts->error ); ?>
72
+ </div>
73
+ <?php else : ?>
74
+ <div class="ga-alert ga-alert-warning">
75
+ <?php echo esc_html__( 'You will see a history of trending content here once the first article takes off.', 'googleanalytics' ); ?>
76
+ <a class="ga-alert-link"
77
+ href="http://tiny.cc/trending/"><?php echo esc_html__( 'Click here to learn more', 'googleanalytics' ); ?></a>
78
+ </div>
79
+ <?php endif; ?>
80
  <?php endif; ?>
81
+ <div>
82
+ <form method="post">
83
+ <?php
84
+ wp_nonce_field(
85
+ Ga_Admin_Controller::ACTION_SHARETHIS_INVITE,
86
+ Ga_Admin_Controller::GA_NONCE_FIELD_NAME
87
+ );
88
+ ?>
89
+ <input type="hidden" name="<?php echo esc_attr( Ga_Controller_Core::ACTION_PARAM_NAME ); ?>"
90
+ value="<?php echo esc_attr( Ga_Admin_Controller::ACTION_SHARETHIS_INVITE ); ?>">
91
+ <table>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92
  <tr class="ga-ta-header">
93
  <th>
94
+ <?php echo esc_html__( 'Trending alerts', 'googleanalytics' ); ?>
95
  </th>
96
  </tr>
97
+ <tr>
98
+ <td>
99
+ <?php
100
+ echo esc_html__(
101
+ 'Interested in receiving alerts via slack or email? Sign into your Social Optimization Platform account and activate it!
102
+ Enter your email and we\'ll send you an invite',
103
+ 'googleanalytics'
104
+ );
105
+ ?>
106
+ </td>
107
+ </tr>
108
+ <tr>
109
+ <td><?php echo esc_html__( 'Enter your email to receive an invite', 'googleanalytics' ); ?>
110
+ <input name="sharethis_invite_email" type="email" value=""
111
+ <?php echo disabled( false === Ga_Helper::are_features_enabled() ); ?>
112
+ placeholder="Your email address">
113
+ <button <?php echo disabled( false === Ga_Helper::are_features_enabled() ); ?>
114
+ type="submit" class="button button-primary"><?php echo esc_html__( 'Send' ); ?></button>
115
+ </td>
116
+ </tr>
117
+ </table>
118
+ </form>
119
+ </div>
120
+ </div>
121
  </div>
122
 
123
  <script type="text/javascript">
124
+ <?php if ( Ga_Helper::are_features_enabled() ) : ?>
125
+ ga_trending_loader.show();
126
  <?php endif; ?>
127
  </script>