PluginProbe
Media Cloud Sync / trunk
Media Cloud Sync vtrunk
1.4.0 1.3.12 1.3.11 1.3.10 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.1.0 1.1.1 1.2.0 1.2.10 1.2.11 1.2.12 1.2.13 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 1.3.0 All 34 releases
← All changes | includes/admin.php +93 -30 1.2.4trunk View file →
@@ -35,8 +35,9 @@
35 35 // Admin Init
36 36 add_action('admin_init', [$this, 'adminInit']);
37 37
38 38 add_action('admin_menu', [$this, 'add_menu'], 10);
39 + add_action('admin_notices', [$this, 'storage_credentials_admin_notice']);
39 40
40 41 add_action('admin_enqueue_scripts', [$this, 'admin_enqueue_scripts'], 10, 1);
41 42 add_action('admin_enqueue_scripts', [$this, 'admin_enqueue_styles'], 10, 1);
42 43 // Load media scripts
@@ -56,17 +57,35 @@
56 57 * Method that is used on plugin initialization time
57 58 * @since 1.0.0
58 59 */
59 60 public function adminInit() {
60 - if(get_option( $this->token.'_db_version' ) !== WPMCS_DB_VERSION) {
61 + $current_db_version = get_option( $this->token . '_db_version', false );
62 + /**
63 + * Run DB upgrades only if:
64 + * - DB version exists
65 + * - DB version is lower than plugin DB version
66 + */
67 + if (
68 + $current_db_version === false ||
69 + version_compare( $current_db_version, WPMCS_DB_VERSION, '<' )
70 + ) {
61 71 Db::instance()->do_database_upgrade();
62 72 }
63 73
64 - if (get_option($this->token.'_do_activation_redirect', false) && !Utils::get_service()) {
65 - delete_option($this->token.'_do_activation_redirect');
66 - wp_redirect(admin_url('admin.php?page=' . $this->token . '-admin-ui#/configure'));
67 - } else {
68 - delete_option($this->token.'_do_activation_redirect');
74 + /**
75 + * One-time activation redirect
76 + */
77 + $do_redirect = get_option( $this->token . '_do_activation_redirect', false );
78 +
79 + if ( $do_redirect ) {
80 + delete_option( $this->token . '_do_activation_redirect' );
81 +
82 + if ( ! Utils::get_service() ) {
83 + wp_redirect(
84 + admin_url( 'admin.php?page=' . $this->token . '-admin-ui#/configure' )
85 + );
86 + exit;
87 + }
69 88 }
70 89 }
71 90
72 91 /**
@@ -75,16 +94,16 @@
75 94 * @access public
76 95 * @return void
77 96 * @since 1.0.0
78 97 */
79 - public function install($network_wide = false) {
98 + public static function install($network_wide = false) {
80 99 Db::handle_tables($network_wide);
81 -
100 +
82 101 // Redirection on activation
83 - add_option($this->token.'_do_activation_redirect', true);
102 + add_option(WPMCS_TOKEN . '_do_activation_redirect', true);
84 103
85 104 //Protect directories
86 - $this->_protect_upload_dir();
105 + self::_protect_upload_dir();
87 106 }
88 107
89 108 /**
90 109 * Create plugin specific upload directory
@@ -91,9 +110,9 @@
91 110 * @since 1.0.0
92 111 */
93 112 public function create_plugin_dir() {
94 113 //Protect directories
95 - $this->_protect_upload_dir();
114 + self::_protect_upload_dir();
96 115 }
97 116
98 117 /**
99 118 * Protect Directory from external access.
@@ -99,27 +118,26 @@
99 118 * Protect Directory from external access.
100 119 *
101 120 * @access private
102 121 * @return void
103 - * @since 1.0.0
122 + * @since 1.3.0
123 + * @see \Dudlewebs\WPMCS\Admin::_protect_upload_dir
104 124 */
105 - private function _protect_upload_dir(){
125 + private static function _protect_upload_dir(){
106 126 $upload_dir = wp_upload_dir();
107 127
128 + $upload_base = $upload_dir['basedir'] . '/' . Schema::getConstant('UPLOADS');
129 +
108 130 $files = array(
109 131 array(
110 - 'base' => $upload_dir['basedir'] . '/' . Schema::getConstant('UPLOADS'),
132 + 'base' => $upload_base,
111 133 'file' => '.htaccess',
112 - 'content' => 'Options -Indexes' . "\n"
113 - . '<Files *.php>' . "\n"
114 - . 'deny from all' . "\n"
115 - . '</Files>'
134 + 'content' => "Options -Indexes\nDeny from all"
116 135 ),
117 136 array(
118 - 'base' => $upload_dir['basedir'] . '/' . Schema::getConstant('UPLOADS'),
137 + 'base' => $upload_base,
119 138 'file' => 'index.php',
120 - 'content' => '<?php ' . "\n"
121 - . '// Silence is golden.'
139 + 'content' => "<?php\n// Silence is golden."
122 140 )
123 141 );
124 142
125 143 foreach ($files as $file) {
@@ -135,9 +153,9 @@
135 153
136 154 /**
137 155 * Deactivation hook
138 156 */
139 - public function deactivation(){
157 + public static function deactivation(){
140 158 }
141 159
142 160
143 161 /**
@@ -191,9 +209,15 @@
191 209 $this->token . '_object',
192 210 array(
193 211 'api_nonce' => wp_create_nonce('wp_rest'),
194 212 'root' => rest_url($this->token . '/v1/'),
213 + 'pro_root' => rest_url($this->token . '/pro/v1/'),
195 214 'assets_url' => $this->assets_url,
215 + 'admin_url' => admin_url(),
216 + 'is_db_upgrade_required' => Upgrade::instance()->is_upgrade_needed(),
217 + 'is_cron_disabled' => defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON,
218 + 'is_pro_active' => defined('WPMCS_PRO_VERSION'),
219 + 'license_status' => defined('WPMCS_PRO_VERSION') ? Utils::get_safe_license_data() : [],
196 220 )
197 221 );
198 222 }
199 223 }
@@ -234,8 +258,12 @@
234 258 'getstarted' => '<a href="' . admin_url('admin.php?page=' . $this->token . '-admin-ui#/configure') . '">' . esc_html__('Get Started', 'media-cloud-sync') . '</a>',
235 259 'settings' => '<a href="' . admin_url('admin.php?page=' . $this->token . '-admin-ui/') . '">' . esc_html__('Settings', 'media-cloud-sync') . '</a>',
236 260 );
237 261
262 + if (!Utils::is_pro_licensed()) {
263 + $action_links['upgrade'] = '<a href="https://dudlewebs.com/product/media-cloud-sync/" target="_blank" style="color:#d54e21;font-weight:600;">' . esc_html__('Upgrade', 'media-cloud-sync') . '</a>';
264 + }
265 +
238 266 return array_merge($action_links, $links);
239 267 }
240 268
241 269
@@ -250,10 +278,10 @@
250 278 esc_html__('Media Cloud Sync', 'media-cloud-sync'),
251 279 'manage_options',
252 280 $this->token.'-admin-ui',
253 281 array($this, 'adminUi'),
254 - 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1MCIgaGVpZ2h0PSI1MCIgdmlld0JveD0iMCAwIDUwIDUwIiBmaWxsPSJub25lIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzEwNDRfNzQ4KSI+CjxwYXRoIGQ9Ik0xNC4yNDg0IDIxLjQyNDdDMTQuNjcxMiAxOC44Nzc2IDE1Ljk4NDMgMTYuNTYzMiAxNy45NTM4IDE0Ljg5MzZDMTkuOTIzNCAxMy4yMjQgMjIuNDIxNiAxMi4zMDc2IDI1LjAwMzUgMTIuMzA3NkMyNy41ODU1IDEyLjMwNzYgMzAuMDgzNyAxMy4yMjQgMzIuMDUzMyAxNC44OTM2QzM0LjAyMjggMTYuNTYzMiAzNS4zMzU5IDE4Ljg3NzYgMzUuNzU4NyAyMS40MjQ3QzM3Ljg1MDMgMjEuNjIyNiAzOS43ODU0IDIyLjYxOCA0MS4xNjI3IDI0LjIwNDZDNDIuNTM5OSAyNS43OTEyIDQzLjI1MzQgMjcuODQ3MSA0My4xNTUzIDI5Ljk0NTdDNDMuMDU3MSAzMi4wNDQzIDQyLjE1NDggMzQuMDI0NiA0MC42MzU1IDM1LjQ3NTdDMzkuMTE2MiAzNi45MjY4IDM3LjA5NjYgMzcuNzM3MyAzNC45OTU3IDM3LjczOTFIMTUuMDExNEMxMi45MTA1IDM3LjczNzMgMTAuODkwOSAzNi45MjY4IDkuMzcxNTkgMzUuNDc1N0M3Ljg1MjMxIDM0LjAyNDYgNi45NDk5OSAzMi4wNDQzIDYuODUxODMgMjkuOTQ1N0M2Ljc1MzY4IDI3Ljg0NzEgNy40NjcyMiAyNS43OTEyIDguODQ0NDMgMjQuMjA0NkMxMC4yMjE2IDIyLjYxOCAxMi4xNTY4IDIxLjYyMjYgMTQuMjQ4NCAyMS40MjQ3WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzEwNDRfNzQ4KSIvPgo8cGF0aCBkPSJNMjMuMTg2NyAyOS41NjRDMjMuMTg2NyAzMC42Mzc3IDIyLjk3NTIgMzEuNzAwNyAyMi41NjQ0IDMyLjY5MjZDMjIuMTUzNSAzMy42ODQ1IDIxLjU1MTMgMzQuNTg1OCAyMC43OTIyIDM1LjM0NDlDMjAuMDMzIDM2LjEwNDEgMTkuMTMxOCAzNi43MDYzIDE4LjEzOTkgMzcuMTE3MUMxNy4xNDggMzcuNTI4IDE2LjA4NDkgMzcuNzM5NCAxNS4wMTEzIDM3LjczOTRDMTMuOTM3NyAzNy43Mzk0IDEyLjg3NDYgMzcuNTI4IDExLjg4MjcgMzcuMTE3MUMxMC44OTA4IDM2LjcwNjMgOS45ODk2IDM2LjEwNDEgOS4yMzA0NSAzNS4zNDQ5QzguNDcxMjkgMzQuNTg1OCA3Ljg2OTEgMzMuNjg0NSA3LjQ1ODI1IDMyLjY5MjZDNy4wNDc0IDMxLjcwMDcgNi44MzU5NCAzMC42Mzc3IDYuODM1OTQgMjkuNTY0QzYuODM1OTQgMjcuMzk1OCA3LjY5NzI3IDI1LjMxNjQgOS4yMzA0NSAyMy43ODMyQzEwLjc2MzYgMjIuMjUgMTIuODQzMSAyMS4zODg3IDE1LjAxMTMgMjEuMzg4N0MxNy4xNzk2IDIxLjM4ODcgMTkuMjU5IDIyLjI1IDIwLjc5MjIgMjMuNzgzMkMyMi4zMjUzIDI1LjMxNjQgMjMuMTg2NyAyNy4zOTU4IDIzLjE4NjcgMjkuNTY0WiIgZmlsbD0idXJsKCNwYWludDFfbGluZWFyXzEwNDRfNzQ4KSIgZmlsbC1vcGFjaXR5PSIwLjMiLz4KPHBhdGggZD0iTTI1LjAwMzQgMzQuMTA1N0MyNy4wODMyIDM0LjEwNTUgMjkuMTE5NSAzMy41MTAzIDMwLjg3MiAzMi4zOTA0QzMyLjYyNDUgMzEuMjcwNSAzNC4wMjAxIDI5LjY3MjYgMzQuODk0IDI3Ljc4NTRDMzUuNzY3OCAyNS44OTgxIDM2LjA4MzYgMjMuODAwMiAzNS44MDM5IDIxLjczOTNDMzUuNTI0MiAxOS42Nzg1IDM0LjY2MDggMTcuNzQwNiAzMy4zMTU2IDE2LjE1NDVDMzEuOTcwMyAxNC41Njg0IDMwLjE5OTQgMTMuNDAwMiAyOC4yMTE4IDEyLjc4NzlDMjYuMjI0MiAxMi4xNzU1IDI0LjEwMyAxMi4xNDQ2IDIyLjA5ODMgMTIuNjk4NkMyMC4wOTM3IDEzLjI1MjcgMTguMjg5NSAxNC4zNjg3IDE2Ljg5ODUgMTUuOTE0OUMxNS41MDc2IDE3LjQ2MTEgMTQuNTg4IDE5LjM3MjkgMTQuMjQ4MyAyMS40MjQ4QzE0LjQ5OSAyMS40MDA2IDE0Ljc1MzMgMjEuMzg4NCAxNS4wMTEzIDIxLjM4ODRDMTYuNDUxNyAyMS4zODgyIDE3Ljg2NjYgMjEuNzY4NSAxOS4xMTI3IDIyLjQ5MDhDMjAuMzU4OCAyMy4yMTMyIDIxLjM5MiAyNC4yNTE5IDIyLjEwNzcgMjUuNTAxOUMyMi44MjMzIDI2Ljc1MiAyMy4xOTYgMjguMTY4OCAyMy4xODggMjkuNjA5MkMyMy4xOCAzMS4wNDk1IDIyLjc5MTYgMzIuNDYyMiAyMi4wNjIxIDMzLjcwNDJDMjMuMDE5NyAzMy45NzE1IDI0LjAwOTMgMzQuMTA2NiAyNS4wMDM0IDM0LjEwNTdaIiBmaWxsPSJ1cmwoI3BhaW50Ml9saW5lYXJfMTA0NF83NDgpIiBmaWxsLW9wYWNpdHk9IjAuMyIvPgo8cGF0aCBkPSJNMjUuMDAzNCAzNC4xMDU3QzI3LjA4MzIgMzQuMTA1NSAyOS4xMTk1IDMzLjUxMDMgMzAuODcyIDMyLjM5MDRDMzIuNjI0NSAzMS4yNzA1IDM0LjAyMDEgMjkuNjcyNiAzNC44OTQgMjcuNzg1NEMzNS43Njc4IDI1Ljg5ODEgMzYuMDgzNiAyMy44MDAyIDM1LjgwMzkgMjEuNzM5M0MzNS41MjQyIDE5LjY3ODUgMzQuNjYwOCAxNy43NDA2IDMzLjMxNTYgMTYuMTU0NUMzMS45NzAzIDE0LjU2ODQgMzAuMTk5NCAxMy40MDAyIDI4LjIxMTggMTIuNzg3OUMyNi4yMjQyIDEyLjE3NTUgMjQuMTAzIDEyLjE0NDYgMjIuMDk4MyAxMi42OTg2QzIwLjA5MzcgMTMuMjUyNyAxOC4yODk1IDE0LjM2ODcgMTYuODk4NSAxNS45MTQ5QzE1LjUwNzYgMTcuNDYxMSAxNC41ODggMTkuMzcyOSAxNC4yNDgzIDIxLjQyNDhDMTQuNDk5IDIxLjQwMDYgMTQuNzUzMyAyMS4zODg0IDE1LjAxMTMgMjEuMzg4NEMxNi40NTE3IDIxLjM4ODIgMTcuODY2NiAyMS43Njg1IDE5LjExMjcgMjIuNDkwOEMyMC4zNTg4IDIzLjIxMzIgMjEuMzkyIDI0LjI1MTkgMjIuMTA3NyAyNS41MDE5QzIyLjgyMzMgMjYuNzUyIDIzLjE5NiAyOC4xNjg4IDIzLjE4OCAyOS42MDkyQzIzLjE4IDMxLjA0OTUgMjIuNzkxNiAzMi40NjIyIDIyLjA2MjEgMzMuNzA0MkMyMy4wMTk3IDMzLjk3MTUgMjQuMDA5MyAzNC4xMDY2IDI1LjAwMzQgMzQuMTA1N1oiIGZpbGw9InVybCgjcGFpbnQzX3JhZGlhbF8xMDQ0Xzc0OCkiLz4KPHBhdGggZD0iTTE0LjI0ODQgMjEuNDI0N0MxNC42NzEyIDE4Ljg3NzYgMTUuOTg0MyAxNi41NjMyIDE3Ljk1MzggMTQuODkzNkMxOS45MjM0IDEzLjIyNCAyMi40MjE2IDEyLjMwNzYgMjUuMDAzNSAxMi4zMDc2QzI3LjU4NTUgMTIuMzA3NiAzMC4wODM3IDEzLjIyNCAzMi4wNTMzIDE0Ljg5MzZDMzQuMDIyOCAxNi41NjMyIDM1LjMzNTkgMTguODc3NiAzNS43NTg3IDIxLjQyNDdDMzcuODUwMyAyMS42MjI2IDM5Ljc4NTQgMjIuNjE4IDQxLjE2MjcgMjQuMjA0NkM0Mi41Mzk5IDI1Ljc5MTIgNDMuMjUzNCAyNy44NDcxIDQzLjE1NTMgMjkuOTQ1N0M0My4wNTcxIDMyLjA0NDMgNDIuMTU0OCAzNC4wMjQ2IDQwLjYzNTUgMzUuNDc1N0MzOS4xMTYyIDM2LjkyNjggMzcuMDk2NiAzNy43MzczIDM0Ljk5NTcgMzcuNzM5MUgxNS4wMTE0QzEyLjkxMDUgMzcuNzM3MyAxMC44OTA5IDM2LjkyNjggOS4zNzE1OSAzNS40NzU3QzcuODUyMzEgMzQuMDI0NiA2Ljk0OTk5IDMyLjA0NDMgNi44NTE4MyAyOS45NDU3QzYuNzUzNjggMjcuODQ3MSA3LjQ2NzIyIDI1Ljc5MTIgOC44NDQ0MyAyNC4yMDQ2QzEwLjIyMTYgMjIuNjE4IDEyLjE1NjggMjEuNjIyNiAxNC4yNDg0IDIxLjQyNDdaIiBmaWxsPSJ1cmwoI3BhaW50NF9yYWRpYWxfMTA0NF83NDgpIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZyBmaWx0ZXI9InVybCgjZmlsdGVyMF9kXzEwNDRfNzQ4KSI+CjxyZWN0IHg9IjM1LjkzNzUiIHk9IjQuNjg3NSIgd2lkdGg9IjkuMzc1IiBoZWlnaHQ9IjkuMzc1IiByeD0iNC42ODc1IiBmaWxsPSJ3aGl0ZSIvPgo8L2c+CjxwYXRoIGQ9Ik00Mi41ODA5IDEwLjcyQzQyLjM2MTYgMTEuMzY3NSA0MS45Nzg3IDExLjYwODYgNDEuNzc2OCAxMS43MTE3QzQxLjk2MTMgMTEuNzE2MiA0Mi4zMTk4IDExLjc2NTEgNDIuNzI3MSAxMS41MjQyQzQzLjMxMTkgMTEuMTM3OCA0My40MjQ0IDEwLjY0MzYgNDMuNDM3MiAxMC41MTEyQzQzLjQ0NzcgMTAuNDAzNiA0My40MzcyIDEwLjI4MDcgNDMuNDM3MiA5Ljg2MzcxQzQzLjQwNTkgOS43OTQyMSA0My4zNDMyIDkuNTcxMzEgNDMuMDA5IDkuNTcxMzFDNDIuNzQxNyA5LjU3MTMxIDQyLjYxMjIgOS43OTA2MSA0Mi42MTIyIDkuOTA1NDhDNDIuNjEyMiAxMC4xOTc5IDQyLjYyMjcgMTAuNDI3NiA0Mi41ODA5IDEwLjcyWiIgZmlsbD0idXJsKCNwYWludDVfbGluZWFyXzEwNDRfNzQ4KSIvPgo8cGF0aCBkPSJNNDEuMjIzMyAxMC41ODQzQzQxLjE4MTUgMTEuMTAyMyA0MC43NjczIDExLjU1MiA0MC41NjU0IDExLjcxMjFDNDAuNzQ5OSAxMS43MTkxIDQxLjE5ODIgMTEuNjcwNCA0MS41MTU3IDExLjQxOTdDNDEuOTEyNSAxMS4xMDY0IDQyLjA2NjggMTAuNjk1OSA0Mi4wNzk2IDEwLjQ5MDNDNDIuMDkwMSAxMC4zMjMyIDQyLjA5MDEgOS4yNzg5IDQyLjA5MDEgOC42MzE0M0M0Mi4wNTg3IDguNTIzNTIgNDEuOTI5MiA4LjMwNzY5IDQxLjY2MTkgOC4zMDc2OUM0MS4zOTQ1IDguMzA3NjkgNDEuMjc5IDguNTIzNTIgNDEuMjU0NiA4LjYzMTQzQzQxLjI2MTYgOS4wNjY1NiA0MS4yNjUxIDEwLjA2NjMgNDEuMjIzMyAxMC41ODQzWiIgZmlsbD0idXJsKCNwYWludDZfbGluZWFyXzEwNDRfNzQ4KSIvPgo8cGF0aCBkPSJNMzkuNzcxNyAxMC4zOTYzVjcuNDkzMTNDMzkuNzcxNyA3LjMyNjA0IDM5Ljg1OTQgNy4wMDAyMiA0MC4yMTAzIDcuMDMzNjRDNDAuNTYxMiA3LjA2NzA1IDQwLjYwMzIgNy4zMjYwNCA0MC42MDcxIDcuNDkzMTNDNDAuNjIxMSA4LjA4ODM5IDQwLjY0MDYgOS41MDIzOCA0MC42MDcxIDEwLjM5NjNDNDAuNDgxOCAxMS4zMDQ5IDM5Ljc1MDggMTEuNjIxNiAzOS4zNTQgMTEuNjkxMkMzOC43Mzc4IDExLjc5OTMgMzcuODcyMiAxMS40MTk3IDM3LjcyNDggMTAuNTczOEMzNy40ODQ3IDkuMTk1MzUgMzguNzc5NiA4Ljc0NjMgMzkuMDcyIDguNzc3NjNDMzkuMzAxOCA4Ljc2ODc5IDM5LjM1MDUgOC44OTI1IDM5LjM1NCA4Ljk1NTE2VjkuNjQ0NDFDMzguOTc4IDkuNTM5OTggMzguNDAzNyA5LjgyMTk0IDM4LjU0OTkgMTAuMzk2M0MzOC43Nzk2IDExLjEwNjQgMzkuNjI1NSAxMC45MzkzIDM5Ljc3MTcgMTAuMzk2M1oiIGZpbGw9InVybCgjcGFpbnQ3X2xpbmVhcl8xMDQ0Xzc0OCkiLz4KPGNpcmNsZSBjeD0iMzQuOTYwOSIgY3k9IjMzLjM5ODQiIHI9IjYuMjk2ODgiIHN0cm9rZT0iIzMxNjRFNCIgc3Ryb2tlLXdpZHRoPSI0Ii8+CjxwYXRoIGQ9Ik0zMy44MTQzIDMwLjU2NTJMMzIuNzE1IDMxLjY1MDVDMzIuNjY4MyAzMS42OTY2IDMyLjYzNjUgMzEuNzU1MyAzMi42MjM2IDMxLjgxOTNDMzIuNjEwNyAzMS44ODMyIDMyLjYxNzMgMzEuOTQ5NSAzMi42NDI2IDMyLjAwOThMMzIuNjUzOSAzMi4wMzM2QzMyLjY4MTkgMzIuMDg3NyAzMi43MjQ1IDMyLjEzMyAzMi43NzY5IDMyLjE2NDdDMzIuODI5MyAzMi4xOTYzIDMyLjg4OTYgMzIuMjEzMSAzMi45NTExIDMyLjIxMzFIMzMuMzgyN0wzMy4zODI1IDM0LjYzMTZDMzMuMzgyNSAzNC43MTkgMzMuNDE3NyAzNC44MDI5IDMzLjQ4MDMgMzQuODY0N0MzMy41NDI5IDM0LjkyNjUgMzMuNjI3OCAzNC45NjEyIDMzLjcxNjQgMzQuOTYxMkgzNC4zODRMMzQuNDA5MSAzNC45NjA0QzM0LjQ5MyAzNC45NTQxIDM0LjU3MTUgMzQuOTE2OCAzNC42Mjg4IDM0Ljg1NThDMzQuNjg2MSAzNC43OTQ5IDM0LjcxNzkgMzQuNzE0OCAzNC43MTc5IDM0LjYzMTZWMzIuMjEzMUgzNS4xNDk3QzM1LjIxNTcgMzIuMjEzMSAzNS4yODAyIDMyLjE5MzggMzUuMzM1MSAzMi4xNTc1QzM1LjM5IDMyLjEyMTMgMzUuNDMyOCAzMi4wNjk5IDM1LjQ1OCAzMi4wMDk2QzM1LjQ4MzMgMzEuOTQ5NCAzNS40ODk5IDMxLjg4MzIgMzUuNDc3IDMxLjgxOTNDMzUuNDY0MSAzMS43NTUzIDM1LjQzMjQgMzEuNjk2NiAzNS4zODU3IDMxLjY1MDVMMzQuMjg2NCAzMC41NjUyQzM0LjIyMzggMzAuNTAzNSAzNC4xMzg5IDMwLjQ2ODggMzQuMDUwNCAzMC40Njg4QzMzLjk2MTggMzAuNDY4OCAzMy44NzY5IDMwLjUwMzUgMzMuODE0MyAzMC41NjUyWiIgZmlsbD0iIzMxNjRFNCIvPgo8cGF0aCBkPSJNMzYuNDM3OSAzNi4zNzMyTDM3LjMzNjkgMzUuNDc0M0MzNy4zNzUxIDM1LjQzNjEgMzcuNDAxMSAzNS4zODc1IDM3LjQxMTYgMzUuMzM0NUMzNy40MjIyIDM1LjI4MTUgMzcuNDE2OCAzNS4yMjY2IDM3LjM5NjEgMzUuMTc2N0wzNy4zODY4IDM1LjE1N0MzNy4zNjM5IDM1LjExMjIgMzcuMzI5MSAzNS4wNzQ3IDM3LjI4NjMgMzUuMDQ4NEMzNy4yNDM0IDM1LjAyMjIgMzcuMTk0MSAzNS4wMDgzIDM3LjE0MzkgMzUuMDA4M0gzNi43OTA5TDM2Ljc5MDkgMzMuNTE4NkMzNi43OTA5IDMzLjQ0NjIgMzYuNzYyMSAzMy4zNzY4IDM2LjcxMSAzMy4zMjU2QzM2LjY1OTggMzMuMjc0NCAzNi41OTAzIDMzLjI0NTcgMzYuNTE3OSAzMy4yNDU3SDM1Ljk3MkwzNS45NTE1IDMzLjI0NjNDMzUuODgyOCAzMy4yNTE1IDM1LjgxODYgMzMuMjgyNCAzNS43NzE4IDMzLjMzMjlDMzUuNzI1IDMzLjM4MzQgMzUuNjk5IDMzLjQ0OTggMzUuNjk5IDMzLjUxODZMMzUuNjk5MSAzNS4wMDgzSDM1LjM0NkMzNS4yOTIxIDM1LjAwODMgMzUuMjM5MyAzNS4wMjQ0IDM1LjE5NDQgMzUuMDU0M0MzNS4xNDk1IDM1LjA4NDMgMzUuMTE0NiAzNS4xMjcgMzUuMDkzOSAzNS4xNzY4QzM1LjA3MzIgMzUuMjI2NyAzNS4wNjc4IDM1LjI4MTYgMzUuMDc4NCAzNS4zMzQ1QzM1LjA4ODkgMzUuMzg3NSAzNS4xMTQ5IDM1LjQzNjEgMzUuMTUzMSAzNS40NzQzTDM2LjA1MiAzNi4zNzMyQzM2LjEwMzIgMzYuNDI0NCAzNi4xNzI2IDM2LjQ1MzEgMzYuMjQ1IDM2LjQ1MzFDMzYuMzE3MyAzNi40NTMxIDM2LjM4NjggMzYuNDI0NCAzNi40Mzc5IDM2LjM3MzJaIiBmaWxsPSIjMzE2NEU0Ii8+CjwvZz4KPGRlZnM+CjxmaWx0ZXIgaWQ9ImZpbHRlcjBfZF8xMDQ0Xzc0OCIgeD0iMjUuOTM3NSIgeT0iLTUuMzEyNSIgd2lkdGg9IjI5LjM3NSIgaGVpZ2h0PSIyOS4zNzUiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiIHJlc3VsdD0iaGFyZEFscGhhIi8+CjxmZU1vcnBob2xvZ3kgcmFkaXVzPSIyIiBvcGVyYXRvcj0iZGlsYXRlIiBpbj0iU291cmNlQWxwaGEiIHJlc3VsdD0iZWZmZWN0MV9kcm9wU2hhZG93XzEwNDRfNzQ4Ii8+CjxmZU9mZnNldC8+CjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjQiLz4KPGZlQ29tcG9zaXRlIGluMj0iaGFyZEFscGhhIiBvcGVyYXRvcj0ib3V0Ii8+CjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwIDAgMCAwIDEgMCAwIDAgMCAxIDAgMCAwIDAgMSAwIDAgMCAwLjI1IDAiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJlZmZlY3QxX2Ryb3BTaGFkb3dfMTA0NF83NDgiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJlZmZlY3QxX2Ryb3BTaGFkb3dfMTA0NF83NDgiIHJlc3VsdD0ic2hhcGUiLz4KPC9maWx0ZXI+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8xMDQ0Xzc0OCIgeDE9IjguMTMzMiIgeTE9IjE3LjA3MzYiIHgyPSIyNC40MTMxIiB5Mj0iNDEuMjM2NCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSJ3aGl0ZSIgc3RvcC1vcGFjaXR5PSIwIi8+CjxzdG9wIG9mZnNldD0iMC42OSIgc3RvcC1jb2xvcj0id2hpdGUiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDFfbGluZWFyXzEwNDRfNzQ4IiB4MT0iNi44MzU5NCIgeTE9IjI0LjE5MDEiIHgyPSIxNy44NTgyIiB5Mj0iMzMuOTQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IndoaXRlIi8+CjxzdG9wIG9mZnNldD0iMC43ODUiIHN0b3AtY29sb3I9IndoaXRlIiBzdG9wLW9wYWNpdHk9IjAuOCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50Ml9saW5lYXJfMTA0NF83NDgiIHgxPSIxOC4wMDE3IiB5MT0iMTMuNTMxIiB4Mj0iMjAuODk1OCIgeTI9IjI4LjU1NzMiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agb2Zmc2V0PSIwLjIzNSIgc3RvcC1jb2xvcj0id2hpdGUiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSJ3aGl0ZSIgc3RvcC1vcGFjaXR5PSIwIi8+CjwvbGluZWFyR3JhZGllbnQ+CjxyYWRpYWxHcmFkaWVudCBpZD0icGFpbnQzX3JhZGlhbF8xMDQ0Xzc0OCIgY3g9IjAiIGN5PSIwIiByPSIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgxNS4wOTQ5IDMwLjE1NDMpIHJvdGF0ZSgtMjIuOTg1Nikgc2NhbGUoMTMuMjU5MiAxMS44NzY4KSI+CjxzdG9wIG9mZnNldD0iMC4zOSIgc3RvcC1jb2xvcj0id2hpdGUiLz4KPHN0b3Agb2Zmc2V0PSIwLjkzIiBzdG9wLWNvbG9yPSJ3aGl0ZSIgc3RvcC1vcGFjaXR5PSIwLjQyIi8+CjwvcmFkaWFsR3JhZGllbnQ+CjxyYWRpYWxHcmFkaWVudCBpZD0icGFpbnQ0X3JhZGlhbF8xMDQ0Xzc0OCIgY3g9IjAiIGN5PSIwIiByPSIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgyMy40OTAyIDEwLjcxNSkgcm90YXRlKDYzLjU3NTEpIHNjYWxlKDMxLjQ2ODEgMjI3LjE3NSkiPgo8c3RvcCBvZmZzZXQ9IjAuNDQ1IiBzdG9wLWNvbG9yPSIjMThCQUE3IiBzdG9wLW9wYWNpdHk9IjAiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMThCQUE3Ii8+CjwvcmFkaWFsR3JhZGllbnQ+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQ1X2xpbmVhcl8xMDQ0Xzc0OCIgeDE9IjM3LjY5NTMiIHkxPSI4Ljk5NzM1IiB4Mj0iNDMuNDQxOSIgeTI9IjguOTk3MzQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzM0QkI3QSIvPgo8c3RvcCBvZmZzZXQ9IjAuMjU1MjA4IiBzdG9wLWNvbG9yPSIjMThCQUE3Ii8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzMxNjRFNCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50Nl9saW5lYXJfMTA0NF83NDgiIHgxPSIzNy42OTUzIiB5MT0iOC45OTczNSIgeDI9IjQzLjQ0MTkiIHkyPSI4Ljk5NzM0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiMzNEJCN0EiLz4KPHN0b3Agb2Zmc2V0PSIwLjI1NTIwOCIgc3RvcC1jb2xvcj0iIzE4QkFBNyIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMzMTY0RTQiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDdfbGluZWFyXzEwNDRfNzQ4IiB4MT0iMzcuNjk1MyIgeTE9IjguOTk3MzUiIHgyPSI0My40NDE5IiB5Mj0iOC45OTczNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMzRCQjdBIi8+CjxzdG9wIG9mZnNldD0iMC4yNTUyMDgiIHN0b3AtY29sb3I9IiMxOEJBQTciLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMzE2NEU0Ii8+CjwvbGluZWFyR3JhZGllbnQ+CjxjbGlwUGF0aCBpZD0iY2xpcDBfMTA0NF83NDgiPgo8cmVjdCB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+',
255 - 25
282 + 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTczIiBoZWlnaHQ9IjEyMiIgdmlld0JveD0iMCAwIDE3MyAxMjIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik0xMzkuNTggNzYuMDA4MkMxNDYuNDQxIDc1LjgyMyAxNTEuOTAyIDc4LjgxNTggMTU2LjE3OSA4My44NzkzQzE2MS42OTUgOTAuNDA5OCAxNjEuMzQ5IDk4LjY5MjEgMTU1LjkyMyAxMDUuMzI0QzE1Mi40ODUgMTA5LjUyNiAxNDYuOTI5IDExMC42OTMgMTQyLjIwNyAxMDguMTZDMTM5LjU4OSAxMDYuNzU1IDEzNy45NDIgMTA0LjUxIDEzNy4wMzEgMTAxLjcwMUMxMzYuNzc0IDEwMC45MDYgMTM3LjA3MiAxMDAuNjE1IDEzNy44NSAxMDAuNjMxQzEzOC41OTggMTAwLjY0NyAxMzkuMzQ3IDEwMC42MzUgMTQwLjQ0NCAxMDAuNjM1QzE0MS43MDkgMTAwLjUyMSAxNDMuMTc4IDEwMC44MTggMTQ0LjY3MiAxMDEuNThDMTQ3Ljc2NyAxMDMuMTU5IDE1Mi4xNTcgMTAxLjY1OCAxNTMuOTY1IDk4LjYwNTlDMTU2LjA3OSA5NS4wMzcgMTU1LjQxMSA5MS4wMDY3IDE1Mi4zMjkgODguNzM2N0MxNDguNTkgODUuOTgyOSAxNDQuNDg0IDg2LjQzNzggMTQxLjM0NyA4OS44OTg4QzEzOS41NzUgOTEuODUzNyAxMzcuMzYzIDkzLjAwNDMgMTM0LjcwMiA5My4yMDk0QzEzMC4zNjUgOTMuNTQzNiAxMjcuMzE1IDg5Ljk3OTIgMTI4LjEzMyA4NS41Mzg1QzEyOS4xMjUgODAuMTU4NSAxMzMuOTE2IDc2LjE2MTEgMTM5LjU4IDc2LjAwODJaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNMTQyLjIxNyA5NC4xMzMyQzE0Mi42MjQgOTQuMTMzMiAxNDIuOTU1IDk0LjQ2MzMgMTQyLjk1NSA5NC44NzA1Vjk5LjY3OTFDMTQyLjk1NSAxMDAuMDg2IDE0Mi42MjQgMTAwLjQxNSAxNDIuMjE3IDEwMC40MTVIMTM3LjU1OEMxMzcuMTUxIDEwMC40MTUgMTM2LjgyMSAxMDAuMDg2IDEzNi44MiA5OS42NzkxVjk0Ljg3MDVDMTM2LjgyIDk0LjQ2MzMgMTM3LjE1IDk0LjEzMzIgMTM3LjU1OCA5NC4xMzMySDE0Mi4yMTdaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNMTQ5LjE5NyA5NC4xMzQyQzE0OS42MDUgOTQuMTM0MiAxNDkuOTM2IDk0LjQ2NDMgMTQ5LjkzNiA5NC44NzE1Vjk2LjU3NTZDMTQ5LjkzNiA5Ni45ODI4IDE0OS42MDUgOTcuMzEyOSAxNDkuMTk3IDk3LjMxMjlIMTQ3LjU2OUMxNDcuMTYxIDk3LjMxMjkgMTQ2LjgzMSA5Ni45ODI4IDE0Ni44MzEgOTYuNTc1NlY5NC44NzE1QzE0Ni44MzEgOTQuNDY0MyAxNDcuMTYxIDk0LjEzNDIgMTQ3LjU2OSA5NC4xMzQySDE0OS4xOTdaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNMTQ1LjMzMiA5NC4xMzMyQzE0NS43MzkgOTQuMTMzNSAxNDYuMDcgOTQuNDYzNSAxNDYuMDcgOTQuODcwNVY5NS44MDUxQzE0Ni4wNyA5Ni4yMTIxIDE0NS43MzkgOTYuNTQyMSAxNDUuMzMyIDk2LjU0MjRIMTQ0LjQ1NEMxNDQuMDQ3IDk2LjU0MjQgMTQzLjcxNyA5Ni4yMTIzIDE0My43MTcgOTUuODA1MVY5NC44NzA1QzE0My43MTcgOTQuNDYzMyAxNDQuMDQ3IDk0LjEzMzIgMTQ0LjQ1NCA5NC4xMzMySDE0NS4zMzJaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTE3MyA5Mi41MDAxQzE3MyAxMDguMjQgMTYwLjI0IDEyMSAxNDQuNSAxMjFDMTI4Ljc2IDEyMSAxMTYgMTA4LjI0IDExNiA5Mi41MDAxQzExNiA3Ni43NiAxMjguNzYgNjQuMDAwMSAxNDQuNSA2NC4wMDAxQzE2MC4yNCA2NC4wMDAxIDE3MyA3Ni43NiAxNzMgOTIuNTAwMVpNMTQ0LjUgMTE0QzE1Ni4zNzQgMTE0IDE2NiAxMDQuMzc0IDE2NiA5Mi41MDAxQzE2NiA4Ni43MDIyIDE2My43MDUgODEuNDQwMyAxNTkuOTc0IDc3LjU3MzNDMTU2LjA2NCA3My41MjA3IDE1MC41NzYgNzEuMDAwMSAxNDQuNSA3MS4wMDAxQzEzMi42MjYgNzEuMDAwMSAxMjMgODAuNjI2IDEyMyA5Mi41MDAxQzEyMyAxMDAuNTQzIDEyNy40MTYgMTA3LjU1NCAxMzMuOTU2IDExMS4yNDFDMTM3LjA3MSAxMTIuOTk4IDE0MC42NjkgMTE0IDE0NC41IDExNFoiIGZpbGw9ImJsYWNrIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMzUuMjY1OSA0My40MTY4QzM3LjI3OTMgMzEuMjg3IDQzLjUzMjQgMjAuMjY1NSA1Mi45MTE3IDEyLjMxNDdDNjIuMjkxIDQuMzYzOTEgNzQuMTg3NyAwIDg2LjQ4MzUgMEM5OC43NzkzIDAgMTEwLjY3NiA0LjM2MzkxIDEyMC4wNTUgMTIuMzE0N0MxMjkuNDM1IDIwLjI2NTUgMTM1LjY4OCAzMS4yODcgMTM3LjcwMSA0My40MTY4QzE0Ny42NjIgNDQuMzU5IDE1Ni44NzcgNDkuMDk5NiAxNjMuNDM1IDU2LjY1NTFDMTY5Ljk5NCA2NC4yMTA2IDE3My4zOTIgNzQuMDAwOSAxNzIuOTI0IDgzLjk5NDlDMTcyLjQ1NyA5My45ODg5IDE2OC4xNiAxMDMuNDE5IDE2MC45MjUgMTEwLjMzQzE1My42OSAxMTcuMjQgMTQ0LjA3MiAxMjEuMSAxMzQuMDY3IDEyMS4xMDhIMzguODk5NkMyOC44OTQ3IDEyMS4xIDE5LjI3NyAxMTcuMjQgMTIuMDQyIDExMC4zM0M0LjgwNjk1IDEwMy40MTkgMC41MDk5NzUgOTMuOTg4OSAwLjA0MjU0OTUgODMuOTk0OUMtMC40MjQ4NzYgNzQuMDAwOSAyLjk3MzEzIDY0LjIxMDYgOS41MzE1OSA1Ni42NTUxQzE2LjA5IDQ5LjA5OTYgMjUuMzA1NSA0NC4zNTkgMzUuMjY1OSA0My40MTY4Wk00Mi45NzE1IDQ1LjkyNTJDNDQuNjgyNyAzNS42MDkgNDkuOTk3IDI2LjIzNTQgNTcuOTY4MiAxOS40NzM1QzY1LjkzOTQgMTIuNzExNSA3Ni4wNTAxIDkuMDAwMSA4Ni40OTk5IDkuMDAwMUM5Ni45NDk4IDkuMDAwMSAxMDcuMDYgMTIuNzExNSAxMTUuMDMyIDE5LjQ3MzVDMTIzLjAwMyAyNi4yMzU0IDEyOC4zMTcgMzUuNjA5IDEzMC4wMjggNDUuOTI1MkMxMzguNDkzIDQ2LjcyNjUgMTQ2LjMyNSA1MC43NTgzIDE1MS44OTkgNTcuMTg0QzE1Ni44NDUgNjIuODg2MSAxNTkuNjc2IDcwLjA4NDkgMTU5Ljk3NCA3Ny41NzMzQzE2My43MDUgODEuNDQwMyAxNjYgODYuNzAyMiAxNjYgOTIuNTAwMUMxNjYgMTA0LjM3NCAxNTYuMzc0IDExNCAxNDQuNSAxMTRDMTQwLjY2OSAxMTQgMTM3LjA3MSAxMTIuOTk4IDEzMy45NTYgMTExLjI0MUMxMzEuNjY4IDExMS43NCAxMjkuMzE3IDExMS45OTggMTI2Ljk0IDExMkg0Ni4wNTk3QzM3LjU1NjggMTExLjk5MyAyOS4zODI5IDEwOC43MSAyMy4yMzQxIDEwMi44MzNDMTcuMDg1MiA5Ni45NTYxIDEzLjQzMzMgODguOTM1NyAxMy4wMzYxIDgwLjQzNkMxMi42Mzg4IDcxLjkzNjMgMTUuNTI2NyA2My42MDk4IDIxLjEwMDYgNTcuMTg0QzI2LjY3NDQgNTAuNzU4MyAzNC41MDY0IDQ2LjcyNjUgNDIuOTcxNSA0NS45MjUyWiIgZmlsbD0iYmxhY2siLz4KPHBhdGggZD0iTTkzLjUyMTEgNDEuMTc0OEw3Ny4xNDE3IDE4LjY1MDJDNzYuOTk1MyAxOC40NDk1IDc2LjgwMjUgMTguMjg1OCA3Ni41NzkyIDE4LjE3MjhDNzYuMzU1OSAxOC4wNTk4IDc2LjEwODUgMTguMDAwNiA3NS44NTc0IDE4LjAwMDJINzUuODUzNkM3NS42MDE1IDE4LjAwMDcgNzUuMzUzMiAxOC4wNjA0IDc1LjEyOTMgMTguMTc0M0M3NC45MDU0IDE4LjI4ODIgNzQuNzEyMyAxOC40NTMxIDc0LjU2NjEgMTguNjU1Mkw1OC4yOTI0IDQxLjE3OTdDNTguMTI0IDQxLjQxMjUgNTguMDI0MSA0MS42ODY1IDU4LjAwMzggNDEuOTcxNUM1Ny45ODM1IDQyLjI1NjYgNTguMDQzNSA0Mi41NDE2IDU4LjE3NzMgNDIuNzk1MkM1OC4zMTAzIDQzLjA0OTIgNTguNTExOCA0My4yNjIxIDU4Ljc1OTggNDMuNDEwN0M1OS4wMDc4IDQzLjU1OTIgNTkuMjkyNyA0My42Mzc1IDU5LjU4MyA0My42MzdINjcuMjQxOEw2Ny4yNDEyIDc2LjE0MUM2Ny4yNDExIDc2LjM0NTQgNjcuMjgxOSA3Ni41NDc3IDY3LjM2MTQgNzYuNzM2NUM2Ny40NDA5IDc2LjkyNTMgNjcuNTU3NCA3Ny4wOTY5IDY3LjcwNDMgNzcuMjQxM0M2Ny44NTEyIDc3LjM4NTggNjguMDI1NiA3Ny41MDA0IDY4LjIxNzUgNzcuNTc4NUM2OC40MDk0IDc3LjY1NjYgNjguNjE1MSA3Ny42OTY3IDY4LjgyMjggNzcuNjk2Nkw4Mi45OTMxIDc3LjY5NTlDODMuMjAwOSA3Ny42OTYgODMuNDA2NyA3Ny42NTU4IDgzLjU5ODcgNzcuNTc3NkM4My43OTA2IDc3LjQ5OTQgODMuOTY1MSA3Ny4zODQ3IDg0LjExMiA3Ny4yNDAxQzg0LjI1ODkgNzcuMDk1NSA4NC4zNzUzIDc2LjkyMzkgODQuNDU0OCA3Ni43MzVDODQuNTM0MiA3Ni41NDYxIDg0LjU3NSA3Ni4zNDM2IDg0LjU3NDggNzYuMTM5MlY0My42Mzc2SDkyLjIzNjFDOTIuODI3IDQzLjYzNzYgOTMuMzY5NiA0My4zMDk4IDkzLjY0MjQgNDIuNzkyMUM5My43NzU3IDQyLjUzNzcgOTMuODM0OSA0Mi4yNTIgOTMuODEzNSA0MS45NjY2QzkzLjc5MjEgNDEuNjgxMiA5My42OTA5IDQxLjQwNzEgOTMuNTIxMSA0MS4xNzQ4WiIgZmlsbD0iYmxhY2siLz4KPHBhdGggZD0iTTgyLjE0NDkgODUuNDcxNUw5Ni44MzM4IDEwMi4xMzZDOTYuOTY1IDEwMi4yODUgOTcuMTM3OSAxMDIuNDA2IDk3LjMzODIgMTAyLjQ5Qzk3LjUzODQgMTAyLjU3MyA5Ny43NjAzIDEwMi42MTcgOTcuOTg1NSAxMDIuNjE3Qzk4LjIxMTYgMTAyLjYxNyA5OC40Mzc3IDEwMi41NzMgOTguNjM4NSAxMDIuNDg4Qzk4LjgzOTMgMTAyLjQwNCA5OS4wMTI0IDEwMi4yODIgOTkuMTQzNSAxMDIuMTMzTDExMy43MzggODUuNDY3OUMxMTMuODg5IDg1LjI5NTYgMTEzLjk3OCA4NS4wOTI5IDExMy45OTYgODQuODgyQzExNC4wMTUgODQuNjcxMSAxMTMuOTYxIDg0LjQ2MDMgMTEzLjg0MSA4NC4yNzI2QzExMy43MjIgODQuMDg0NyAxMTMuNTQxIDgzLjkyNzIgMTEzLjMxOCA4My44MTczQzExMy4wOTYgODMuNzA3NCAxMTIuODQxIDgzLjY0OTUgMTEyLjU4IDgzLjY0OThIMTA1LjcxMkwxMDUuNzEyIDU5LjYwMTZDMTA1LjcxMyA1OS40NTA1IDEwNS42NzYgNTkuMzAwNyAxMDUuNjA1IDU5LjE2MTFDMTA1LjUzMyA1OS4wMjE0IDEwNS40MjkgNTguODk0NSAxMDUuMjk3IDU4Ljc4NzZDMTA1LjE2NSA1OC42ODA3IDEwNS4wMDkgNTguNTk1OSAxMDQuODM3IDU4LjUzODFDMTA0LjY2NSA1OC40ODAzIDEwNC40OCA1OC40NTA3IDEwNC4yOTQgNTguNDUwOEw5MS41ODYyIDU4LjQ1MTJDOTEuMzk5OSA1OC40NTEyIDkxLjIxNTQgNTguNDgwOSA5MS4wNDMyIDU4LjUzODhDOTAuODcxMSA1OC41OTY3IDkwLjcxNDYgNTguNjgxNSA5MC41ODI5IDU4Ljc4ODVDOTAuNDUxMiA1OC44OTU1IDkwLjM0NjcgNTkuMDIyNCA5MC4yNzU1IDU5LjE2MjJDOTAuMjA0MiA1OS4zMDIgOTAuMTY3NyA1OS40NTE4IDkwLjE2NzggNTkuNjAzVjgzLjY0OTRIODMuMjk3MkM4Mi43NjczIDgzLjY0OTQgODIuMjgwOCA4My44OTE5IDgyLjAzNjEgODQuMjc0OUM4MS45MTY2IDg0LjQ2MzEgODEuODYzNSA4NC42NzQ1IDgxLjg4MjcgODQuODg1N0M4MS45MDE5IDg1LjA5NjggODEuOTkyNiA4NS4yOTk2IDgyLjE0NDkgODUuNDcxNVoiIGZpbGw9ImJsYWNrIi8+Cjwvc3ZnPgo=',
283 + 999
256 284 );
257 285
258 286 $this->hook_suffix[] = add_submenu_page(
259 287 $this->token . '-admin-ui',
@@ -263,9 +291,9 @@
263 291 $this->token . '-admin-ui' ,
264 292 array($this, 'adminUi')
265 293 );
266 294
267 - if(Utils::is_service_enabled()) {
295 + if(Utils::get_service()) {
268 296 $this->hook_suffix[] = add_submenu_page(
269 297 $this->token . '-admin-ui',
270 298 esc_html__('Settings', 'media-cloud-sync'),
271 299 esc_html__('Settings', 'media-cloud-sync'),
@@ -285,8 +313,32 @@
285 313 }
286 314 }
287 315
288 316 /**
317 + * Admin notice when storage credentials are incomplete.
318 + * @since 1.3.11
319 + */
320 + public function storage_credentials_admin_notice() {
321 + if(!current_user_can('manage_options') || !Utils::get_service() || Utils::is_service_enabled()) {
322 + return;
323 + }
324 +
325 + $error = Utils::get_service_configuration_error();
326 + if(empty($error)) {
327 + return;
328 + }
329 +
330 + $settings_url = admin_url('admin.php?page=' . $this->token . '-admin-ui#/settings');
331 + $message = esc_html($error) . ' ' . sprintf(
332 + '<a href="%1$s">%2$s</a>',
333 + esc_url($settings_url),
334 + esc_html__('Open Media Cloud Sync settings', 'media-cloud-sync')
335 + );
336 +
337 + echo wp_kses_post(sprintf('<div class="notice notice-error is-dismissible"><p>%s</p></div>', $message));
338 + }
339 +
340 + /**
289 341 * Calling view function for admin page components
290 342 */
291 343 public function adminUi() {
292 344 echo wp_kses_post(sprintf(
@@ -308,8 +360,12 @@
308 360 /**
309 361 * Load the media assets
310 362 */
311 363 public function load_media_assets() {
364 + if(!Utils::is_service_enabled()) {
365 + return;
366 + }
367 +
312 368 /** CSS */
313 369 wp_enqueue_style($this->token . '-media', esc_url($this->assets_url) . 'css/media.css', array(), $this->version);
314 370
315 371 /** JS */
@@ -358,12 +414,12 @@
358 414 <div id="dw-wpmcs-survey-form">
359 415 <h2>We Value Your Feedback</h2>
360 416 <p>We're sorry to see you go! Please let us know why you are deactivating this plugin. Your feedback is anonymous and will help us improve.</p>
361 417 <form method="POST">
362 - <input name="plugin_name" type="hidden" value="<?= $this->token ?>" required>
363 - <input name="website" type="hidden" value="<?= get_site_url(); ?>" required>
364 - <input name="title" type="hidden" value="<?= get_bloginfo('name'); ?>" required>
365 - <input name="version" type="hidden" value="<?= $this->version; ?>" required>
418 + <input name="plugin_name" type="hidden" value="<?= esc_attr($this->token); ?>" required>
419 + <input name="website" type="hidden" value="<?= esc_url(get_site_url()); ?>" required>
420 + <input name="title" type="hidden" value="<?= esc_attr(get_bloginfo('name')); ?>" required>
421 + <input name="version" type="hidden" value="<?= esc_attr($this->version); ?>" required>
366 422
367 423 <div class="dw-wpmcs-reason">
368 424 <label><input type="radio" name="reason" value="I\'m only deactivating temporarily"> I'm only deactivating temporarily</label>
369 425 <label><input type="radio" name="reason" value="I no longer need the plugin"> I no longer need the plugin</label>
@@ -381,9 +437,16 @@
381 437 <textarea name="comments" placeholder="Please specify" rows="3"></textarea>
382 438 <p>Need help? <a href="https://dudlewebs.com/" target="_blank">Use live chat support</a></p>
383 439 </div>
384 440
385 - <p id="dw-wpmcs-error" class="dw-wpmcs-error"></p>
441 + <p id="dw-wpmcs-error" class="dw-wpmcs-error">
442 + <svg viewBox="0 0 16 16" fill="none" aria-hidden="true">
443 + <path d="M8 2.2L14.6 13.3H1.4L8 2.2Z" stroke="currentColor" stroke-width="1.3" stroke-linejoin="round"/>
444 + <path d="M8 6.7V9.7" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/>
445 + <circle cx="8" cy="11.4" r="0.85" fill="currentColor"/>
446 + </svg>
447 + <span id="dw-wpmcs-error-text"></span>
448 + </p>
386 449 <div class="dw-wpmcs-actions">
387 450 <button type="button" class="dw-button dw-skip" id="dw-wpmcs-skip">Skip & Deactivate</button>
388 451 <button type="button" class="dw-button dw-secondary" id="dw-wpmcs-cancel">Cancel</button>
389 452 <button type="submit" class="dw-button dw-primary" id="dw-wpmcs-deactivate">Submit & Deactivate</button>