PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.9.2
Independent Analytics – WordPress Analytics Plugin v2.9.2
2.15.5 2.15.4 2.15.3 2.15.2 2.15.1 2.15.0 2.14.10 trunk 1.1 1.10 1.10.1 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.17.1 1.17.2 1.17.3 1.17.4 1.18 1.18.1 1.19.0 1.19.1 1.2 1.20.0 1.21.0 1.22.0 1.22.1 1.23.0 1.23.1 1.24.0 1.24.1 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.28.1 1.28.2 1.28.3 1.29.0 1.3 1.30.0 1.30.1 1.4 1.5 1.6 1.7 1.8 1.9 2.0.0 2.0.1 2.1.4 2.1.5 2.1.6 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.10 2.11.2 2.11.3 2.11.4 2.11.5 2.11.6 2.11.7 2.11.8 2.11.9 2.12.0 2.12.1 2.12.2 2.13.1 2.13.2 2.13.5 2.13.6 2.14.0 2.14.1 2.14.2 2.14.4 2.14.6 2.14.7 2.14.8 2.14.9 2.2.0 2.2.1 2.3.1 2.3.2 2.4.2 2.4.3 2.5.0 2.5.1 2.6.0 2.6.1 2.6.2 2.6.3 2.6.4 2.7.0 2.7.1 2.7.2 2.7.3 2.8.2 2.8.3 2.8.4 2.8.5 2.8.6 2.8.7 2.8.8 2.8.9 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7
independent-analytics / IAWP / Independent_Analytics.php
independent-analytics / IAWP Last commit date
AJAX 1 year ago Admin_Page 1 year ago Click_Tracking 1 year ago Custom_WordPress_Columns 2 years ago Data_Pruning 1 year ago Date_Picker 1 year ago Date_Range 1 year ago Ecommerce 1 year ago Email_Reports 1 year ago Filter_Lists 1 year ago Form_Submissions 1 year ago Interval 1 year ago Menu_Bar_Stats 1 year ago Migrations 1 year ago Models 1 year ago Public_API 1 year ago Rows 1 year ago Statistics 1 year ago Tables 1 year ago Utils 1 year ago Campaign_Builder.php 1 year ago Capability_Manager.php 1 year ago Chart.php 1 year ago Chart_Geo.php 1 year ago Click_Tracking.php 1 year ago Cron_Job.php 1 year ago Cron_Manager.php 1 year ago Current_Traffic_Finder.php 1 year ago Dashboard_Options.php 1 year ago Dashboard_Widget.php 2 years ago Database.php 1 year ago Database_Manager.php 2 years ago Empty_Report_Option.php 2 years ago Env.php 1 year ago Filters.php 1 year ago Geo_Database_Background_Job.php 2 years ago Geo_Database_Manager.php 1 year ago Geoposition.php 2 years ago Icon_Directory.php 2 years ago Icon_Directory_Factory.php 2 years ago Illuminate_Builder.php 1 year ago Independent_Analytics.php 1 year ago Interrupt.php 1 year ago Known_Referrers.php 2 years ago Patch.php 1 year ago Payload_Validator.php 1 year ago Plugin_Conflict_Detector.php 1 year ago Plugin_Group.php 1 year ago Plugin_Group_Option.php 2 years ago Query.php 1 year ago Query_Taps.php 1 year ago Quick_Stats.php 2 years ago REST_API.php 1 year ago Real_Time.php 1 year ago Report.php 1 year ago Report_Finder.php 1 year ago Report_Options_Parser.php 2 years ago Resource_Identifier.php 1 year ago Settings.php 1 year ago Sort_Configuration.php 1 year ago Tables.php 1 year ago Track_Resource_Changes.php 1 year ago View.php 1 year ago View_Counter.php 1 year ago Visitors_Over_Time_Finder.php 2 years ago WP_Option_Cache_Bust.php 2 years ago
Independent_Analytics.php
367 lines
1 <?php
2
3 namespace IAWP;
4
5 use IAWP\Admin_Page\Analytics_Page;
6 use IAWP\Admin_Page\Campaign_Builder_Page;
7 use IAWP\Admin_Page\Click_Tracking_Page;
8 use IAWP\Admin_Page\Settings_Page;
9 use IAWP\Admin_Page\Support_Page;
10 use IAWP\Admin_Page\Updates_Page;
11 use IAWP\AJAX\AJAX_Manager;
12 use IAWP\Click_Tracking\Click_Processing_Job;
13 use IAWP\Data_Pruning\Pruner;
14 use IAWP\Ecommerce\SureCart_Event_Sync_Job;
15 use IAWP\Ecommerce\SureCart_Order;
16 use IAWP\Ecommerce\WooCommerce_Order;
17 use IAWP\Ecommerce\WooCommerce_Referrer_Meta_Box;
18 use IAWP\Email_Reports\Email_Reports;
19 use IAWP\Form_Submissions\Form;
20 use IAWP\Form_Submissions\Submission_Listener;
21 use IAWP\Menu_Bar_Stats\Menu_Bar_Stats;
22 use IAWP\Migrations\Migrations;
23 use IAWP\Utils\Plugin;
24 use IAWP\Utils\Singleton;
25 use IAWP\Utils\Timezone;
26 /** @internal */
27 class Independent_Analytics
28 {
29 use Singleton;
30 public $settings;
31 public $email_reports;
32 public $cron_manager;
33 private $is_woocommerce_support_enabled;
34 private $is_surecart_support_enabled;
35 private $is_form_submission_support_enabled;
36 // This is where we attach functions to WP hooks
37 private function __construct()
38 {
39 $this->settings = new \IAWP\Settings();
40 new \IAWP\REST_API();
41 new \IAWP\Dashboard_Widget();
42 new \IAWP\View_Counter();
43 new Submission_Listener();
44 Pruner::register_hook();
45 AJAX_Manager::getInstance();
46 if (!Migrations::is_migrating()) {
47 new \IAWP\Track_Resource_Changes();
48 Menu_Bar_Stats::register();
49 WooCommerce_Order::register_hooks();
50 SureCart_Order::register_hooks();
51 }
52 \IAWP\Cron_Job::register_custom_intervals();
53 $this->cron_manager = new \IAWP\Cron_Manager();
54 (new SureCart_Event_Sync_Job())->register_handler();
55 (new Click_Processing_Job())->register_handler();
56 if (\IAWPSCOPED\iawp_is_pro()) {
57 $this->email_reports = new Email_Reports();
58 new \IAWP\Campaign_Builder();
59 new WooCommerce_Referrer_Meta_Box();
60 }
61 \add_action('admin_enqueue_scripts', [$this, 'enqueue_scripts_and_styles'], 110);
62 // Called at 110 to dequeue other scripts
63 \add_action('wp_enqueue_scripts', [$this, 'enqueue_scripts_and_styles_front_end']);
64 \add_action('admin_menu', [$this, 'add_admin_menu_pages']);
65 \add_action('admin_init', [$this, 'remove_freemius_pricing_menu']);
66 \add_filter('plugin_action_links_independent-analytics/iawp.php', [$this, 'plugin_action_links']);
67 \add_action('init', [$this, 'polylang_translations']);
68 \add_action('init', [$this, 'load_textdomain']);
69 \IAWP_FS()->add_filter('pricing_url', [$this, 'change_freemius_pricing_url'], 10);
70 \IAWP_FS()->add_filter('show_deactivation_feedback_form', function () {
71 return \false;
72 });
73 \add_action('admin_init', [$this, 'maybe_delete_mu_plugin']);
74 \add_action('admin_body_class', [$this, 'add_body_class']);
75 }
76 public function add_body_class($classes)
77 {
78 if (\get_option('iawp_dark_mode')) {
79 $classes .= ' iawp-dark-mode ';
80 }
81 $page = \IAWP\Env::get_page();
82 if (\is_string($page)) {
83 $classes .= " {$page} ";
84 }
85 return $classes;
86 }
87 /**
88 * At one point in time, there was a must-use plugin that was created. The plugin file and the
89 * option need to get cleaned up.
90 * @return void
91 */
92 public function maybe_delete_mu_plugin()
93 {
94 $already_attempted = \get_option('iawp_attempted_to_delete_mu_plugin', '0');
95 if ($already_attempted === '1') {
96 return;
97 }
98 if (\get_option('iawp_must_use_directory_not_writable', '0') === '1') {
99 \delete_option('iawp_must_use_directory_not_writable');
100 }
101 $mu_plugin_file = \trailingslashit(\WPMU_PLUGIN_DIR) . 'iawp-performance-boost.php';
102 if (\file_exists($mu_plugin_file)) {
103 \unlink($mu_plugin_file);
104 }
105 \update_option('iawp_attempted_to_delete_mu_plugin', '1', \true);
106 }
107 public function load_textdomain()
108 {
109 \load_plugin_textdomain('independent-analytics', \false, \IAWP_LANGUAGES_DIRECTORY);
110 }
111 public function polylang_translations()
112 {
113 if (\function_exists('IAWPSCOPED\\pll_register_string')) {
114 pll_register_string('view_counter', 'Views:', 'Independent Analytics');
115 }
116 }
117 // Changes the URL for the "Upgrade" tab in the Account menu
118 public function change_freemius_pricing_url()
119 {
120 return 'https://independentwp.com/pricing/?utm_source=User+Dashboard&utm_medium=WP+Admin&utm_campaign=Upgrade+to+Pro&utm_content=Account';
121 }
122 public function add_admin_menu_pages()
123 {
124 $title = \IAWP\Capability_Manager::show_white_labeled_ui() ? \esc_html__('Analytics', 'independent-analytics') : 'Independent Analytics';
125 \add_menu_page($title, \esc_html__('Analytics', 'independent-analytics'), \IAWP\Capability_Manager::menu_page_capability_string(), 'independent-analytics', function () {
126 $analytics_page = new Analytics_Page();
127 $analytics_page->render();
128 }, $this->get_menu_icon(), 3);
129 if (\IAWP\Capability_Manager::can_edit()) {
130 \add_submenu_page('independent-analytics', \esc_html__('Settings', 'independent-analytics'), \esc_html__('Settings', 'independent-analytics'), \IAWP\Capability_Manager::menu_page_capability_string(), 'independent-analytics-settings', function () {
131 $settings_page = new Settings_Page();
132 $settings_page->render(\false);
133 });
134 }
135 if (\IAWPSCOPED\iawp_is_pro()) {
136 \add_submenu_page('independent-analytics', \esc_html__('Campaign Builder', 'independent-analytics'), \esc_html__('Campaign Builder', 'independent-analytics'), \IAWP\Capability_Manager::menu_page_capability_string(), 'independent-analytics-campaign-builder', function () {
137 $campaign_builder_page = new Campaign_Builder_Page();
138 $campaign_builder_page->render(\false);
139 });
140 if (\IAWP\Capability_Manager::can_edit()) {
141 \add_submenu_page('independent-analytics', \esc_html__('Click Tracking', 'independent-analytics'), \esc_html__('Click Tracking', 'independent-analytics'), \IAWP\Capability_Manager::menu_page_capability_string(), 'independent-analytics-click-tracking', function () {
142 $click_tracking_page = new Click_Tracking_Page();
143 $click_tracking_page->render(\false);
144 });
145 }
146 }
147 if (\IAWP\Capability_Manager::show_branded_ui()) {
148 \add_submenu_page('independent-analytics', \esc_html__('Help & Support', 'independent-analytics'), \esc_html__('Help & Support', 'independent-analytics'), \IAWP\Capability_Manager::menu_page_capability_string(), 'independent-analytics-support-center', function () {
149 $support_page = new Support_Page();
150 $support_page->render(\false);
151 });
152 }
153 if (\IAWP\Capability_Manager::show_branded_ui()) {
154 $menu_html = '<span class="menu-name">' . \esc_html__('Changelog', 'independent-analytics') . '</span>';
155 $menu_html = $this->changelog_viewed_since_update() ? $menu_html . ' <span class="menu-counter">' . \esc_html__('New', 'independent-analytics') . '</span>' : $menu_html;
156 \add_submenu_page('independent-analytics', \esc_html__('Changelog', 'independent-analytics'), $menu_html, \IAWP\Capability_Manager::menu_page_capability_string(), 'independent-analytics-updates', function () {
157 $updates_page = new Updates_Page();
158 $updates_page->render(\false);
159 });
160 }
161 if (\IAWPSCOPED\iawp_is_free() && \IAWP\Capability_Manager::show_branded_ui()) {
162 \add_submenu_page('independent-analytics', \esc_html__('Upgrade to Pro &rarr;', 'independent-analytics'), '<span style="color: #F69D0A;">' . \esc_html__('Upgrade to Pro &rarr;', 'independent-analytics') . '</span>', \IAWP\Capability_Manager::menu_page_capability_string(), \esc_url('https://independentwp.com/pricing/?utm_source=User+Dashboard&utm_medium=WP+Admin&utm_campaign=Upgrade+to+Pro&utm_content=Sidebar'));
163 }
164 }
165 // The menu link is removed in the SDK setup, but this makes it completely inaccessible
166 public function remove_freemius_pricing_menu()
167 {
168 \remove_submenu_page('independent-analytics', 'independent-analytics-pricing');
169 }
170 public function register_scripts_and_styles() : void
171 {
172 \wp_register_style('iawp-styles', \IAWPSCOPED\iawp_url_to('dist/styles/style.css'), [], \IAWP_VERSION);
173 \wp_register_style('iawp-dashboard-widget-styles', \IAWPSCOPED\iawp_url_to('dist/styles/dashboard_widget.css'), [], \IAWP_VERSION);
174 \wp_register_style('iawp-freemius-notice-styles', \IAWPSCOPED\iawp_url_to('dist/styles/freemius_notice_styles.css'), [], \IAWP_VERSION);
175 \wp_register_style('iawp-posts-menu-styles', \IAWPSCOPED\iawp_url_to('dist/styles/posts_menu.css'), [], \IAWP_VERSION);
176 \wp_register_script('iawp-javascript', \IAWPSCOPED\iawp_url_to('dist/js/index.js'), ['wp-i18n'], \IAWP_VERSION);
177 \wp_set_script_translations('iawp-javascript', 'independent-analytics');
178 \wp_register_script('iawp-dashboard-widget-javascript', \IAWPSCOPED\iawp_url_to('dist/js/dashboard_widget.js'), ['wp-i18n'], \IAWP_VERSION);
179 \wp_set_script_translations('iawp-dashboard-widget-javascript', 'independent-analytics');
180 \wp_register_script('iawp-layout-javascript', \IAWPSCOPED\iawp_url_to('dist/js/layout.js'), ['wp-i18n'], \IAWP_VERSION);
181 \wp_set_script_translations('iawp-layout-javascript', 'independent-analytics');
182 \wp_register_script('iawp-settings-javascript', \IAWPSCOPED\iawp_url_to('dist/js/settings.js'), ['wp-color-picker', 'wp-i18n'], \IAWP_VERSION);
183 \wp_set_script_translations('iawp-settings-javascript', 'independent-analytics');
184 \wp_register_script('iawp-click-tracking-menu-javascript', \IAWPSCOPED\iawp_url_to('dist/js/click-tracking-menu.js'), ['wp-i18n'], \IAWP_VERSION);
185 \wp_set_script_translations('iawp-click-tracking-menu-javascript', 'independent-analytics');
186 if (Menu_Bar_Stats::is_option_enabled()) {
187 \wp_register_style('iawp-front-end-styles', \IAWPSCOPED\iawp_url_to('dist/styles/menu_bar_stats.css'), [], \IAWP_VERSION);
188 }
189 if (\is_rtl()) {
190 \wp_register_style('iawp-styles-rtl', \IAWPSCOPED\iawp_url_to('dist/styles/rtl.css'), [], \IAWP_VERSION);
191 }
192 }
193 public function register_scripts_and_styles_front_end() : void
194 {
195 if (Menu_Bar_Stats::is_option_enabled()) {
196 \wp_register_style('iawp-front-end-styles', \IAWPSCOPED\iawp_url_to('dist/styles/menu_bar_stats.css'), [], \IAWP_VERSION);
197 }
198 }
199 public function enqueue_scripts_and_styles($hook)
200 {
201 $this->register_scripts_and_styles();
202 $page = \IAWP\Env::get_page();
203 $this->enqueue_translations();
204 $this->enqueue_nonces();
205 \wp_enqueue_style('iawp-freemius-notice-styles');
206 if (\is_string($page)) {
207 \wp_enqueue_style('iawp-styles');
208 \wp_enqueue_script('iawp-javascript');
209 \wp_enqueue_script('iawp-layout-javascript');
210 $this->dequeue_bad_actors();
211 $this->maybe_override_adminify_styles();
212 if (\is_rtl()) {
213 \wp_enqueue_style('iawp-styles-rtl');
214 }
215 }
216 if ($page === 'independent-analytics-settings') {
217 \wp_enqueue_style('wp-color-picker');
218 \wp_enqueue_script('iawp-settings-javascript');
219 } elseif ($page === 'independent-analytics-click-tracking') {
220 \wp_enqueue_script('iawp-click-tracking-menu-javascript');
221 } elseif ($hook === 'index.php') {
222 \wp_enqueue_script('iawp-dashboard-widget-javascript');
223 \wp_enqueue_style('iawp-dashboard-widget-styles');
224 } elseif ($hook === 'edit.php') {
225 \wp_enqueue_style('iawp-posts-menu-styles');
226 }
227 if (Menu_Bar_Stats::is_option_enabled()) {
228 \wp_enqueue_style('iawp-front-end-styles');
229 }
230 }
231 public function enqueue_scripts_and_styles_front_end()
232 {
233 if (Menu_Bar_Stats::is_option_enabled()) {
234 $this->register_scripts_and_styles_front_end();
235 \wp_enqueue_style('iawp-front-end-styles');
236 }
237 }
238 public function enqueue_translations()
239 {
240 \wp_register_script('iawp-translations', '');
241 \wp_enqueue_script('iawp-translations');
242 \wp_add_inline_script('iawp-translations', 'const iawpText = ' . \json_encode(['views' => \__('Views', 'independent-analytics'), 'exactDates' => \__('Apply Exact Dates', 'independent-analytics'), 'relativeDates' => \__('Apply Relative Dates', 'independent-analytics'), 'copied' => \__('Copied', 'independent-analytics'), 'exportingPages' => \__('Exporting Pages...', 'independent-analytics'), 'exportPages' => \__('Export Pages', 'independent-analytics'), 'exportingReferrers' => \__('Exporting Referrers...', 'independent-analytics'), 'exportReferrers' => \__('Export Referrers', 'independent-analytics'), 'exportingGeolocations' => \__('Exporting Geolocations...', 'independent-analytics'), 'exportGeolocations' => \__('Export Geolocations', 'independent-analytics'), 'exportingDevices' => \__('Exporting Devices...', 'independent-analytics'), 'exportDevices' => \__('Export Devices', 'independent-analytics'), 'exportingCampaigns' => \__('Exporting Campaigns...', 'independent-analytics'), 'exportCampaigns' => \__('Export Campaigns', 'independent-analytics'), 'exportingClicks' => \__('Exporting Clicks', 'independent-analytics'), 'exportClicks' => \__('Export Clicks', 'independent-analytics'), 'invalidReportArchive' => \__('This report archive is invalid. Please export your reports and try again.', 'independent-analytics'), 'openMobileMenu' => \__('Open menu', 'independent-analytics'), 'closeMobileMenu' => \__('Close menu', 'independent-analytics')]), 'before');
243 }
244 public function enqueue_nonces()
245 {
246 \wp_register_script('iawp-nonces', '');
247 \wp_enqueue_script('iawp-nonces');
248 \wp_add_inline_script('iawp-nonces', 'const iawpActions = ' . \json_encode(AJAX_Manager::getInstance()->get_action_signatures()), 'before');
249 }
250 public function get_option($name, $default)
251 {
252 $option = \get_option($name, $default);
253 return $option === '' ? $default : $option;
254 }
255 public function date_i18n(string $format, \DateTime $date) : string
256 {
257 return \date_i18n($format, $date->setTimezone(Timezone::site_timezone())->getTimestamp() + Timezone::site_offset_in_seconds($date));
258 }
259 public function plugin_action_links($links)
260 {
261 // Create the link
262 $settings_link = '<a class="calendar-link" href="' . \esc_url(\IAWPSCOPED\iawp_dashboard_url()) . '">' . \esc_html__('Analytics Dashboard', 'independent-analytics') . '</a>';
263 // Add the link to the start of the array
264 \array_unshift($links, $settings_link);
265 return $links;
266 }
267 public function pagination_page_size()
268 {
269 return 50;
270 }
271 public function dequeue_bad_actors()
272 {
273 // https://wordpress.org/plugins/comment-link-remove/
274 \wp_dequeue_style('qc_clr_admin_style_css');
275 // https://wordpress.org/plugins/webappick-pdf-invoice-for-woocommerce/
276 \wp_dequeue_style('woo-invoice');
277 // https://wordpress.org/plugins/wp-media-files-name-rename/
278 \wp_dequeue_style('wpcmp_bootstrap_css');
279 // https://wordpress.org/plugins/morepuzzles/
280 \wp_dequeue_style('bscss');
281 \wp_dequeue_style('mypluginstyle');
282 }
283 public function maybe_override_adminify_styles()
284 {
285 if (\is_plugin_active('adminify/adminify.php')) {
286 $settings = \get_option('_wpadminify');
287 if ($settings) {
288 if (\array_key_exists('admin_ui', $settings)) {
289 if ($settings['admin_ui']) {
290 \wp_register_style('iawp-adminify-styles', \IAWPSCOPED\iawp_url_to('dist/styles/adminify.css'), [], \IAWP_VERSION);
291 \wp_enqueue_style('iawp-adminify-styles');
292 }
293 }
294 }
295 }
296 }
297 public function changelog_viewed_since_update() : bool
298 {
299 if (\number_format(\floatval(\IAWP_VERSION), 1) > \floatval($this->get_option('iawp_last_update_viewed', '0'))) {
300 return \true;
301 }
302 return \false;
303 }
304 public function is_form_submission_support_enabled() : bool
305 {
306 if (!\is_bool($this->is_form_submission_support_enabled)) {
307 $this->is_form_submission_support_enabled = \IAWPSCOPED\iawp_is_pro() && Form::has_active_form_plugin() && \IAWP\Capability_Manager::can_view_all_analytics();
308 }
309 return $this->is_form_submission_support_enabled;
310 }
311 public function is_woocommerce_support_enabled() : bool
312 {
313 if (!\is_bool($this->is_woocommerce_support_enabled)) {
314 $this->is_woocommerce_support_enabled = $this->actually_check_if_woocommerce_support_is_enabled();
315 }
316 return $this->is_woocommerce_support_enabled;
317 }
318 public function is_surecart_support_enabled() : bool
319 {
320 if (!\is_bool($this->is_surecart_support_enabled)) {
321 $this->is_surecart_support_enabled = $this->actually_check_if_surecart_support_is_enabled();
322 }
323 return $this->is_surecart_support_enabled;
324 }
325 public function is_ecommerce_support_enabled() : bool
326 {
327 return $this->is_woocommerce_support_enabled() || $this->is_surecart_support_enabled();
328 }
329 private function actually_check_if_woocommerce_support_is_enabled() : bool
330 {
331 global $wpdb;
332 if (\IAWPSCOPED\iawp_is_free()) {
333 return \false;
334 }
335 if (\IAWP\Capability_Manager::can_only_view_authored_analytics()) {
336 return \false;
337 }
338 if (!\is_plugin_active('woocommerce/woocommerce.php')) {
339 return \false;
340 }
341 $table_name = $wpdb->prefix . 'wc_order_stats';
342 $order_stats_table = $wpdb->get_row($wpdb->prepare('
343 SELECT * FROM INFORMATION_SCHEMA.TABLES
344 WHERE TABLE_SCHEMA = %s AND TABLE_NAME = %s
345 ', $wpdb->dbname, $table_name));
346 if (\is_null($order_stats_table)) {
347 return \false;
348 }
349 return \true;
350 }
351 private function actually_check_if_surecart_support_is_enabled() : bool
352 {
353 if (\IAWPSCOPED\iawp_is_free()) {
354 return \false;
355 }
356 return \is_plugin_active('surecart/surecart.php');
357 }
358 private function get_menu_icon()
359 {
360 if (\is_null(\IAWP\Env::get_page())) {
361 return 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNTEzcHgiIGhlaWdodD0iMjU0cHgiIHZpZXdCb3g9IjAgMCA1MTMgMjU0IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPHRpdGxlPkljb248L3RpdGxlPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9Ik1lbnUtSWNvbiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEyNiwgLTIyOCkiIGZpbGw9IiNBN0FBQUQiPgogICAgICAgICAgICA8ZyBpZD0iV2hpdGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDgyLCA1NSkiPgogICAgICAgICAgICAgICAgPGcgaWQ9Ikljb24iIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ0LjUsIDE3MykiPgogICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJOZWNrLTMiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQwMi44MDU3LCAxMDguNjEyNSkgcm90YXRlKDQ1KSB0cmFuc2xhdGUoLTQwMi44MDU3LCAtMTA4LjYxMjUpIiBwb2ludHM9IjM5MS4xNjkzNTYgNTYuMjQ4ODI1OSA0MTQuNDQyMDgzIDU2LjI0ODgyNTkgNDE0LjQ0MjA4MyAxNjAuOTc2MDk5IDM5MS4xNjkzNTYgMTYwLjk3NjA5OSI+PC9wb2x5Z29uPgogICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJOZWNrLTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI1NiwgMTI1LjY3MjcpIHJvdGF0ZSgtNjApIHRyYW5zbGF0ZSgtMjU2LCAtMTI1LjY3MjcpIiBwb2ludHM9IjI0NC4zNjM2MzYgNzMuMzA5MDkwOSAyNjcuNjM2MzY0IDczLjMwOTA5MDkgMjY3LjYzNjM2NCAxNzguMDM2MzY0IDI0NC4zNjM2MzYgMTc4LjAzNjM2NCI+PC9wb2x5Z29uPgogICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJOZWNrLTEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEwOS41Njk0LCAxNDQuNjg1Mikgcm90YXRlKDQ1KSB0cmFuc2xhdGUoLTEwOS41Njk0LCAtMTQ0LjY4NTIpIiBwb2ludHM9Ijk3LjkzMjk5MjMgOTIuMzIxNTUzMiAxMjEuMjA1NzIgOTIuMzIxNTUzMiAxMjEuMjA1NzIgMTk3LjA0ODgyNiA5Ny45MzI5OTIzIDE5Ny4wNDg4MjYiPjwvcG9seWdvbj4KICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJQb2ludC00IiBjeD0iNDY4Ljk0NTQ1NSIgY3k9IjQzLjA1NDU0NTUiIHI9IjQzLjA1NDU0NTUiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9IlBvaW50LTMiIGN4PSIzMzYuMjkwOTA5IiBjeT0iMTczLjM4MTgxOCIgcj0iNDMuMDU0NTQ1NSI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBpZD0iUG9pbnQtMiIgY3g9IjE3NS43MDkwOTEiIGN5PSI3OS4xMjcyNzI3IiByPSI0My4wNTQ1NDU1Ij48L2NpcmNsZT4KICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJQb2ludC0xIiBjeD0iNDMuMDU0NTQ1NSIgY3k9IjIxMC42MTgxODIiIHI9IjQzLjA1NDU0NTUiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=';
362 } else {
363 return 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNTEzcHgiIGhlaWdodD0iMjU0cHgiIHZpZXdCb3g9IjAgMCA1MTMgMjU0IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPHRpdGxlPkljb248L3RpdGxlPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9Ik1lbnUtSWNvbiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTc3NSwgLTIyOSkiIGZpbGw9IiNGRkZGRkYiPgogICAgICAgICAgICA8ZyBpZD0iV2hpdGUtQ29weSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzMxLCA1NikiPgogICAgICAgICAgICAgICAgPGcgaWQ9Ikljb24iIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ0LjUsIDE3MykiPgogICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJOZWNrLTMiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQwMi44MDU3LCAxMDguNjEyNSkgcm90YXRlKDQ1KSB0cmFuc2xhdGUoLTQwMi44MDU3LCAtMTA4LjYxMjUpIiBwb2ludHM9IjM5MS4xNjkzNTYgNTYuMjQ4ODI1OSA0MTQuNDQyMDgzIDU2LjI0ODgyNTkgNDE0LjQ0MjA4MyAxNjAuOTc2MDk5IDM5MS4xNjkzNTYgMTYwLjk3NjA5OSI+PC9wb2x5Z29uPgogICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJOZWNrLTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI1NiwgMTI1LjY3MjcpIHJvdGF0ZSgtNjApIHRyYW5zbGF0ZSgtMjU2LCAtMTI1LjY3MjcpIiBwb2ludHM9IjI0NC4zNjM2MzYgNzMuMzA5MDkwOSAyNjcuNjM2MzY0IDczLjMwOTA5MDkgMjY3LjYzNjM2NCAxNzguMDM2MzY0IDI0NC4zNjM2MzYgMTc4LjAzNjM2NCI+PC9wb2x5Z29uPgogICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJOZWNrLTEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEwOS41Njk0LCAxNDQuNjg1Mikgcm90YXRlKDQ1KSB0cmFuc2xhdGUoLTEwOS41Njk0LCAtMTQ0LjY4NTIpIiBwb2ludHM9Ijk3LjkzMjk5MjMgOTIuMzIxNTUzMiAxMjEuMjA1NzIgOTIuMzIxNTUzMiAxMjEuMjA1NzIgMTk3LjA0ODgyNiA5Ny45MzI5OTIzIDE5Ny4wNDg4MjYiPjwvcG9seWdvbj4KICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJQb2ludC00IiBjeD0iNDY4Ljk0NTQ1NSIgY3k9IjQzLjA1NDU0NTUiIHI9IjQzLjA1NDU0NTUiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9IlBvaW50LTMiIGN4PSIzMzYuMjkwOTA5IiBjeT0iMTczLjM4MTgxOCIgcj0iNDMuMDU0NTQ1NSI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBpZD0iUG9pbnQtMiIgY3g9IjE3NS43MDkwOTEiIGN5PSI3OS4xMjcyNzI3IiByPSI0My4wNTQ1NDU1Ij48L2NpcmNsZT4KICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJQb2ludC0xIiBjeD0iNDMuMDU0NTQ1NSIgY3k9IjIxMC42MTgxODIiIHI9IjQzLjA1NDU0NTUiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=';
364 }
365 }
366 }
367