Ecwid Ecommerce Shopping Cart - Version 6.8.7

Version Description

  • Sep 30, 2019 =
  • New "Online store" widget in the Elementor page builder. Ecwid works fine with all popular page builders in WordPress: Gutenberg, Elementor, Divi, Beaver builder and others. We constantly improve and add the compatibility features. In this update, we added a new "Online store" widget to Elementor editor toolbox. It allows you to add storefront to your ecommerce website pages easier in Elementor.
  • Meta tags improvement for products and categories ecommerce pages created with Divi builder.
  • Fix for the "Cannot use object of type WP_Error as array" PHP warning message appearing on some sites.
  • Minor fixes and improvements.
Download this release

Release Info

Developer Ecwid
Plugin Icon 128x128 Ecwid Ecommerce Shopping Cart
Version 6.8.7
Comparing to
See all releases

Code changes from version 6.8.6 to 6.8.7

css/widget-stub.css CHANGED
@@ -14,6 +14,10 @@
14
  color: #32373c;
15
  }
16
 
 
 
 
 
17
  .ecwid-widget-stub > div {
18
  display: flex;
19
  justify-content: center;
14
  color: #32373c;
15
  }
16
 
17
+ .ecwid-widget-stub.widget_ecwid_product_browser {
18
+ min-height: 200px;
19
+ }
20
+
21
  .ecwid-widget-stub > div {
22
  display: flex;
23
  justify-content: center;
ecwid-shopping-cart.php CHANGED
@@ -5,7 +5,7 @@ Plugin URI: http://www.ecwid.com?source=wporg
5
  Description: Ecwid is a free full-featured shopping cart. It can be easily integrated with any Wordpress blog and takes less than 5 minutes to set up.
6
  Text Domain: ecwid-shopping-cart
7
  Author: Ecwid Ecommerce
8
- Version: 6.8.6
9
  Author URI: https://ecwid.to/ecwid-site
10
  */
11
 
@@ -1931,7 +1931,7 @@ function ecwid_update_plugin_params()
1931
  $options4update = array();
1932
 
1933
  foreach ( $options as $key => $option ) {
1934
- if ( $option['type'] == 'html' ) {
1935
  $options4update[$key] = html_entity_decode( @$_POST['option'][$key] );
1936
  } else {
1937
  $options4update[$key] = @$_POST['option'][$key];
@@ -2901,8 +2901,11 @@ function ecwid_add_headers() {
2901
  }
2902
 
2903
  function ecwid_sso() {
 
2904
 
2905
- if (!ecwid_is_sso_enabled()) return;
 
 
2906
 
2907
  $current_user = wp_get_current_user();
2908
 
@@ -2957,7 +2960,7 @@ JS;
2957
  }
2958
 
2959
 
2960
- return <<<HTML
2961
  <script data-cfasync="false" type="text/javascript">
2962
 
2963
  var ecwid_sso_profile='$ecwid_sso_profile';
@@ -2975,6 +2978,8 @@ JS;
2975
  );
2976
  </script>
2977
  HTML;
 
 
2978
  }
2979
 
2980
  // from: http://www.php.net/manual/en/function.sha1.php#39492
5
  Description: Ecwid is a free full-featured shopping cart. It can be easily integrated with any Wordpress blog and takes less than 5 minutes to set up.
6
  Text Domain: ecwid-shopping-cart
7
  Author: Ecwid Ecommerce
8
+ Version: 6.8.7
9
  Author URI: https://ecwid.to/ecwid-site
10
  */
11
 
1931
  $options4update = array();
1932
 
1933
  foreach ( $options as $key => $option ) {
1934
+ if ( isset($option['type']) && $option['type'] == 'html' ) {
1935
  $options4update[$key] = html_entity_decode( @$_POST['option'][$key] );
1936
  } else {
1937
  $options4update[$key] = @$_POST['option'][$key];
2901
  }
2902
 
2903
  function ecwid_sso() {
2904
+ global $ecwid_sso_script;
2905
 
2906
+ if ( !ecwid_is_sso_enabled() ) return;
2907
+
2908
+ if ( !empty($ecwid_sso_script) ) return;
2909
 
2910
  $current_user = wp_get_current_user();
2911
 
2960
  }
2961
 
2962
 
2963
+ $ecwid_sso_script = <<<HTML
2964
  <script data-cfasync="false" type="text/javascript">
2965
 
2966
  var ecwid_sso_profile='$ecwid_sso_profile';
2978
  );
2979
  </script>
2980
  HTML;
2981
+
2982
+ return $ecwid_sso_script;
2983
  }
2984
 
2985
  // from: http://www.php.net/manual/en/function.sha1.php#39492
includes/class-ecwid-store-page.php CHANGED
@@ -466,6 +466,10 @@ class Ecwid_Store_Page {
466
  $api = new Ecwid_Api_V3();
467
  $profile = $api->get_store_profile();
468
 
 
 
 
 
469
  if ( ecwid_is_demo_store() ) {
470
  return;
471
  }
466
  $api = new Ecwid_Api_V3();
467
  $profile = $api->get_store_profile();
468
 
469
+ if ( empty($profile) ) {
470
+ return;
471
+ }
472
+
473
  if ( ecwid_is_demo_store() ) {
474
  return;
475
  }
includes/class-ecwid-stub-renderer.php CHANGED
@@ -53,7 +53,14 @@ abstract class Ecwid_Stub_Renderer {
53
  if ( is_array( $args ) ) {
54
  ob_start();
55
 
56
- $message = $widget->name;
 
 
 
 
 
 
 
57
  require ECWID_TEMPLATES_DIR . '/widget-stub.tpl.php';
58
 
59
  $contents = ob_get_contents();
53
  if ( is_array( $args ) ) {
54
  ob_start();
55
 
56
+ if ( $widget instanceof Ecwid_Widget_Product_Browser ) {
57
+ $message = $widget->widget_options['description'];
58
+ } else {
59
+ $message = $widget->name;
60
+ }
61
+
62
+ $classname = $widget->widget_options['classname'];
63
+
64
  require ECWID_TEMPLATES_DIR . '/widget-stub.tpl.php';
65
 
66
  $contents = ob_get_contents();
includes/gutenberg/class-ecwid-gutenberg-block-store.php CHANGED
@@ -176,9 +176,11 @@ window.ec.config.chameleon.colors = $chameleon[colors];
176
  JS;
177
  }
178
  $result .= <<<HTML
179
- Ecwid.OnAPILoaded.add(function() {
180
- Ecwid.refreshConfig();
181
- });
 
 
182
  </script>
183
  HTML;
184
 
176
  JS;
177
  }
178
  $result .= <<<HTML
179
+ if ( typeof Ecwid != 'undefined' ) {
180
+ Ecwid.OnAPILoaded.add(function() {
181
+ Ecwid.refreshConfig();
182
+ });
183
+ }
184
  </script>
185
  HTML;
186
 
includes/integrations/class-ecwid-integration-elementor.php CHANGED
@@ -3,6 +3,13 @@
3
  require_once ECWID_PLUGIN_DIR . '/includes/class-ecwid-stub-renderer.php';
4
 
5
  class Ecwid_Integration_Elementor extends Ecwid_Stub_Renderer {
 
 
 
 
 
 
 
6
  protected function _should_apply() {
7
  return @$_REQUEST['action'] == 'elementor_ajax' || @$_REQUEST['action'] == 'elementor' || isset( $_GET['elementor-preview'] );
8
  }
@@ -12,4 +19,25 @@ class Ecwid_Integration_Elementor extends Ecwid_Stub_Renderer {
12
  }
13
  }
14
 
15
- $__ecwid_integration_elementor = new Ecwid_Integration_Elementor();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  require_once ECWID_PLUGIN_DIR . '/includes/class-ecwid-stub-renderer.php';
4
 
5
  class Ecwid_Integration_Elementor extends Ecwid_Stub_Renderer {
6
+
7
+ public function __construct() {
8
+ parent::__construct();
9
+
10
+ $__ecwid_integration_elementor_widgets = new Ecwid_Integration_Elementor_Widgets();
11
+ }
12
+
13
  protected function _should_apply() {
14
  return @$_REQUEST['action'] == 'elementor_ajax' || @$_REQUEST['action'] == 'elementor' || isset( $_GET['elementor-preview'] );
15
  }
19
  }
20
  }
21
 
22
+ $__ecwid_integration_elementor = new Ecwid_Integration_Elementor();
23
+
24
+ class Ecwid_Integration_Elementor_Widgets {
25
+
26
+ public function __construct() {
27
+
28
+ if( $this->_should_apply() ) {
29
+ add_action( 'widgets_init', array( $this, 'sidebar_widgets_init') );
30
+ }
31
+ }
32
+
33
+ public function sidebar_widgets_init() {
34
+ if( class_exists( 'Ecwid_Widget_Product_Browser' ) ) {
35
+ register_widget('Ecwid_Widget_Product_Browser');
36
+ }
37
+ }
38
+
39
+ protected function _should_apply() {
40
+ global $pagenow;
41
+ return !(is_admin() && $pagenow == 'widgets.php');
42
+ }
43
+ }
includes/integrations/class-ecwid-integration-gutenberg.php CHANGED
@@ -312,9 +312,11 @@ window.ec.config.chameleon.colors = $chameleon[colors];
312
  JS;
313
  }
314
  $result .= "
315
- Ecwid.OnAPILoaded.add(function() {
316
- Ecwid.refreshConfig();
317
- });
 
 
318
  </script>";
319
 
320
  return $result;
312
  JS;
313
  }
314
  $result .= "
315
+ if ( typeof Ecwid != 'undefined' ) {
316
+ Ecwid.OnAPILoaded.add(function() {
317
+ Ecwid.refreshConfig();
318
+ });
319
+ }
320
  </script>";
321
 
322
  return $result;
includes/themes/class-ecwid-theme-base.php CHANGED
@@ -42,27 +42,27 @@ class Ecwid_Theme_Base {
42
  $theme->create_scroller( $props );
43
  }
44
 
45
- if ( in_array( 'js', $props ) ) {
46
  $theme->add_js();
47
  }
48
 
49
- if ( in_array( 'css', $props ) ) {
50
  $theme->add_css();
51
  }
52
 
53
- if ( in_array( 'css-no-parent', $props ) ) {
54
  $theme->add_css( '' );
55
  }
56
 
57
- if (in_array( 'historyjs_html4mode', $props ) ) {
58
  $theme->historyjs_html4mode = true;
59
  }
60
 
61
- if (in_array( self::PROP_USE_JS_API_FOR_CATS_NAV_MENU, $props ) ) {
62
  add_filter( Ecwid_Nav_Menus::FILTER_USE_JS_API_FOR_CATS_MENU, array( $theme, 'filter_use_js_api_for_cats_menu' ) );
63
  }
64
 
65
- if ( in_array( self::PROP_AJAX_DEFER_RENDERING, $props ) ) {
66
  add_filter( Ecwid_Ajax_Defer_Renderer::FILTER_ENABLED, '__return_true' );
67
  }
68
 
42
  $theme->create_scroller( $props );
43
  }
44
 
45
+ if ( in_array( 'js', $props, true ) ) {
46
  $theme->add_js();
47
  }
48
 
49
+ if ( in_array( 'css', $props, true ) ) {
50
  $theme->add_css();
51
  }
52
 
53
+ if ( in_array( 'css-no-parent', $props, true ) ) {
54
  $theme->add_css( '' );
55
  }
56
 
57
+ if (in_array( 'historyjs_html4mode', $props, true ) ) {
58
  $theme->historyjs_html4mode = true;
59
  }
60
 
61
+ if (in_array( self::PROP_USE_JS_API_FOR_CATS_NAV_MENU, $props, true ) ) {
62
  add_filter( Ecwid_Nav_Menus::FILTER_USE_JS_API_FOR_CATS_MENU, array( $theme, 'filter_use_js_api_for_cats_menu' ) );
63
  }
64
 
65
+ if ( in_array( self::PROP_AJAX_DEFER_RENDERING, $props, true ) ) {
66
  add_filter( Ecwid_Ajax_Defer_Renderer::FILTER_ENABLED, '__return_true' );
67
  }
68
 
includes/themes/class-ecwid-theme-divi.php CHANGED
@@ -22,6 +22,8 @@ class Ecwid_Divi extends Ecwid_Theme_Base
22
  if( isset( $_REQUEST['page_id'] ) && $this->is_visual_view() ) {
23
  add_action( 'wp_footer', array( $this, 'add_scriptjs_code' ) );
24
  }
 
 
25
  }
26
 
27
  public function is_wireframe_view() {
@@ -35,6 +37,15 @@ class Ecwid_Divi extends Ecwid_Theme_Base
35
  public function add_scriptjs_code() {
36
  echo ecwid_get_scriptjs_code();
37
  }
 
 
 
 
 
 
 
 
 
38
  }
39
 
40
  return new Ecwid_Divi();
22
  if( isset( $_REQUEST['page_id'] ) && $this->is_visual_view() ) {
23
  add_action( 'wp_footer', array( $this, 'add_scriptjs_code' ) );
24
  }
25
+
26
+ add_filter( 'single_post_title', array( $this, 'single_post_title' ) , 10000, 2 );
27
  }
28
 
29
  public function is_wireframe_view() {
37
  public function add_scriptjs_code() {
38
  echo ecwid_get_scriptjs_code();
39
  }
40
+
41
+ public function single_post_title( $post_title, $post ) {
42
+ $ecwid_title = _ecwid_get_seo_title();
43
+ if( !empty( $ecwid_title ) ) {
44
+ return $ecwid_title;
45
+ }
46
+
47
+ return $post_title;
48
+ }
49
  }
50
 
51
  return new Ecwid_Divi();
includes/widgets.php CHANGED
@@ -12,6 +12,7 @@ include_once "widgets/class-ecwid-widget-vertical-categories-list.php";
12
  include_once "widgets/class-ecwid-widget-random-product.php";
13
 
14
  include_once "widgets/class-ecwid-widget-nsf-minicart.php";
 
15
 
16
 
17
  if (ecwid_migrations_is_original_plugin_version_older_than('4.3')) {
12
  include_once "widgets/class-ecwid-widget-random-product.php";
13
 
14
  include_once "widgets/class-ecwid-widget-nsf-minicart.php";
15
+ include_once "widgets/class-ecwid-widget-product-browser.php";
16
 
17
 
18
  if (ecwid_migrations_is_original_plugin_version_older_than('4.3')) {
includes/widgets/class-ecwid-widget-product-browser.php ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+ require_once ECWID_PLUGIN_DIR . '/includes/widgets/class-ecwid-widget-base.php';
5
+
6
+ class Ecwid_Widget_Product_Browser extends Ecwid_Widget_Base {
7
+
8
+ protected $_hide_title = true;
9
+
10
+ function __construct() {
11
+ $widget_ops = array('classname' => 'widget_ecwid_product_browser', 'description' => __("Your store will be shown here", 'ecwid-shopping-cart') );
12
+ parent::__construct('ecwidproductbrowser', __('Online store', 'ecwid-shopping-cart'), $widget_ops);
13
+
14
+ }
15
+
16
+ function _render_widget_content( $args, $instance ) {
17
+
18
+ $html = '[ecwid widgets="productbrowser" default_category_id="0"]';
19
+
20
+ return $html;
21
+ }
22
+
23
+ }
js/admin-bar.js CHANGED
@@ -21,7 +21,11 @@ jQuery(document).ready(function() {
21
  is_subcategory = ( page.type == 'CATEGORY' && page.categoryId > 0 ),
22
  new_url = url;
23
 
24
- if( typeof text != 'undefined' ) new_text = text;
 
 
 
 
25
 
26
  if( is_product || is_subcategory ) {
27
  if( typeof $bar != 'undefined' ) {
21
  is_subcategory = ( page.type == 'CATEGORY' && page.categoryId > 0 ),
22
  new_url = url;
23
 
24
+ if( page.entryPage ) {
25
+ is_subcategory = false;
26
+ }
27
+
28
+ if( typeof text != 'undefined' ) new_text = text;
29
 
30
  if( is_product || is_subcategory ) {
31
  if( typeof $bar != 'undefined' ) {
lib/ecwid_api_v3.php CHANGED
@@ -10,6 +10,7 @@ class Ecwid_Api_V3
10
  const TOKEN_OPTION_NAME = 'ecwid_oauth_token';
11
 
12
  const PROFILE_CACHE_NAME = 'apiv3_store_profile';
 
13
 
14
  const OPTION_API_STATUS = 'ecwid_api_status';
15
  const API_STATUS_OK = 'ok';
@@ -64,9 +65,9 @@ class Ecwid_Api_V3
64
  {
65
  $status = self::get_api_status();
66
 
67
- if ( $status == self::API_STATUS_UNDEFINED ) {
68
  return self::check_api_status();
69
- }
70
 
71
  return $status == self::API_STATUS_OK;
72
  }
@@ -107,11 +108,16 @@ class Ecwid_Api_V3
107
  return self::set_api_status( self::API_STATUS_ERROR_TOKEN );
108
  }
109
 
110
- $profile = $api->get_store_profile();
111
-
112
- if ( $profile ) {
 
 
 
 
 
113
  return self::set_api_status( self::API_STATUS_OK );
114
- }
115
 
116
  $transports = stream_get_transports();
117
 
@@ -572,7 +578,7 @@ class Ecwid_Api_V3
572
 
573
  $result = $this->_do_put( $url, $params );
574
 
575
- if ( @$result['response']['code'] == '200' ) {
576
  return $result;
577
  }
578
 
10
  const TOKEN_OPTION_NAME = 'ecwid_oauth_token';
11
 
12
  const PROFILE_CACHE_NAME = 'apiv3_store_profile';
13
+ const UPDATE_STATS_CACHE_NAME = 'apiv3_store_latest_stats';
14
 
15
  const OPTION_API_STATUS = 'ecwid_api_status';
16
  const API_STATUS_OK = 'ok';
65
  {
66
  $status = self::get_api_status();
67
 
68
+ // if ( $status == self::API_STATUS_UNDEFINED ) {
69
  return self::check_api_status();
70
+ // }
71
 
72
  return $status == self::API_STATUS_OK;
73
  }
108
  return self::set_api_status( self::API_STATUS_ERROR_TOKEN );
109
  }
110
 
111
+ $update_stats = EcwidPlatform::cache_get( self::UPDATE_STATS_CACHE_NAME );
112
+
113
+ if( !$update_stats ) {
114
+ $update_stats = $api->get_store_update_stats();
115
+ EcwidPlatform::cache_set( self::UPDATE_STATS_CACHE_NAME, $update_stats, 60 * 5 );
116
+ }
117
+
118
+ if ( $update_stats ) {
119
  return self::set_api_status( self::API_STATUS_OK );
120
+ }
121
 
122
  $transports = stream_get_transports();
123
 
578
 
579
  $result = $this->_do_put( $url, $params );
580
 
581
+ if( !is_wp_error($result) && @$result['response']['code'] == '200' ) {
582
  return $result;
583
  }
584
 
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: Ecwid
3
  Tags: ecommerce, e-commerce, storefront, online store, sell
4
  Requires at least: 3.7
5
  Tested up to: 5.2
6
- Stable tag: 6.8.6
7
 
8
  Powerful, easy to use ecommerce shopping cart. Sell on Facebook and Instagram. iPhone & Android apps. Superb support. Free plan available.
9
 
@@ -153,6 +153,12 @@ You can use Ecwid’s built-in import tools to copy your store products from any
153
  * [Ecwid eCommerce Forums](https://www.ecwid.com/forums/forumdisplay.php?f=19)
154
 
155
  == Changelog ==
 
 
 
 
 
 
156
  = 6.8.6 - Sep 11, 2019 =
157
  - Improvements for the "Store page speedup" feature.
158
  - Fixed update date synchronization of goods for the "Integrate with the site search" tool.
3
  Tags: ecommerce, e-commerce, storefront, online store, sell
4
  Requires at least: 3.7
5
  Tested up to: 5.2
6
+ Stable tag: 6.8.7
7
 
8
  Powerful, easy to use ecommerce shopping cart. Sell on Facebook and Instagram. iPhone & Android apps. Superb support. Free plan available.
9
 
153
  * [Ecwid eCommerce Forums](https://www.ecwid.com/forums/forumdisplay.php?f=19)
154
 
155
  == Changelog ==
156
+ = 6.8.7 - Sep 30, 2019 =
157
+ - **New "Online store" widget in the Elementor page builder.** Ecwid works fine with all popular page builders in WordPress: Gutenberg, Elementor, Divi, Beaver builder and others. We constantly improve and add the compatibility features. In this update, we added a new "Online store" widget to Elementor editor toolbox. It allows you to add storefront to your ecommerce website pages easier in Elementor.
158
+ - Meta tags improvement for products and categories ecommerce pages created with Divi builder.
159
+ - Fix for the "Cannot use object of type WP_Error as array" PHP warning message appearing on some sites.
160
+ - Minor fixes and improvements.
161
+
162
  = 6.8.6 - Sep 11, 2019 =
163
  - Improvements for the "Store page speedup" feature.
164
  - Fixed update date synchronization of goods for the "Integrate with the site search" tool.
templates/cache_log.php CHANGED
@@ -89,6 +89,10 @@ update_option('ecwid_cache_log', $cache );
89
 
90
  $cache = get_option('ecwid_cache_log');
91
 
 
 
 
 
92
  foreach ($cache as $item) {
93
  echo '<div class="cache_log">';
94
  $ts = strftime( '%H:%M:%S %D', $item['timestamp'] );
89
 
90
  $cache = get_option('ecwid_cache_log');
91
 
92
+ if( !$cache ){
93
+ $cache = array();
94
+ }
95
+
96
  foreach ($cache as $item) {
97
  echo '<div class="cache_log">';
98
  $ts = strftime( '%H:%M:%S %D', $item['timestamp'] );
templates/debug.php CHANGED
@@ -48,11 +48,16 @@
48
  <div><?php echo $theme->get('ThemeURI'); ?></div>
49
  </div>
50
 
51
- <h2>Remote get test</h2>
52
- <div><?php var_export(@$remote_get_results); ?></div>
53
-
54
  <h2>Api V3 profile test</h2>
55
- <div><?php var_export($api_v3_profile_results); ?></div>
 
 
 
 
 
 
 
 
56
 
57
  <h2>Error log</h2>
58
  <div>
48
  <div><?php echo $theme->get('ThemeURI'); ?></div>
49
  </div>
50
 
 
 
 
51
  <h2>Api V3 profile test</h2>
52
+ <div>
53
+ <?php
54
+ if( is_wp_error($api_v3_profile_results) ) {
55
+ echo 'WP_Error: ' . $api_v3_profile_results->get_error_message();
56
+ } else {
57
+ echo 'Response status: ' . implode(' ', $api_v3_profile_results['response']);
58
+ }
59
+ ?>
60
+ </div>
61
 
62
  <h2>Error log</h2>
63
  <div>
templates/widget-stub.tpl.php CHANGED
@@ -1,4 +1,4 @@
1
- <div class="ecwid-widget-stub">
2
  <div class="ecwid-widget-stub-header"><svg aria-hidden="true" role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" class="dashicon" width="20" height="20" viewBox="0 0 20 20"><path d="M15.32,15.58c-0.37,0-0.66,0.3-0.66,0.67c0,0.37,0.3,0.67,0.66,0.67c0.37,0,0.67-0.3,0.67-0.67
3
  C15.98,15.88,15.69,15.58,15.32,15.58z M15.45,0H4.55C2.04,0,0,2.04,0,4.55v10.91C0,17.97,2.04,20,4.55,20h10.91c2.51,0,4.55-2.04,4.55-4.55V4.55
4
  C20,2.04,17.96,0,15.45,0z M12.97,4.94C13.54,4.94,14,5.4,14,5.96s-0.46,1.03-1.03,1.03c-0.57,0-1.03-0.46-1.03-1.03
1
+ <div class="ecwid-widget-stub <?php echo $classname;?>">
2
  <div class="ecwid-widget-stub-header"><svg aria-hidden="true" role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" class="dashicon" width="20" height="20" viewBox="0 0 20 20"><path d="M15.32,15.58c-0.37,0-0.66,0.3-0.66,0.67c0,0.37,0.3,0.67,0.66,0.67c0.37,0,0.67-0.3,0.67-0.67
3
  C15.98,15.88,15.69,15.58,15.32,15.58z M15.45,0H4.55C2.04,0,0,2.04,0,4.55v10.91C0,17.97,2.04,20,4.55,20h10.91c2.51,0,4.55-2.04,4.55-4.55V4.55
4
  C20,2.04,17.96,0,15.45,0z M12.97,4.94C13.54,4.94,14,5.4,14,5.96s-0.46,1.03-1.03,1.03c-0.57,0-1.03-0.46-1.03-1.03