Imagify Image Optimizer - Version 1.6.7

Version Description

  • Improvement: Compatibility with the plugin WP Offload S3 Pro, and fixed a few things for both Lite and Pro versions.
  • Improvement: Improved performance on the bulk optimization page for huge image libraries.
  • Improvement: When performing a bulk optimization, moved the attachments with the "WELL DONE" message at the end of the queue, it helps to speed up things.
  • Improvement: Use cURL directly only to optimize an image. It helps when cURL is not available: less things will break in that case.
  • Bug Fix: Fixed a bug with the plugin Screets Live Chat, prior to version 2.2.8.
  • Regression fix: Fixed the buffer size on the bulk optimization page.
  • Dev stuff: Added a hook allowing to filter arguments when doing a request to our API. It can be used to increase the timeout value for example.
Download this release

Release Info

Developer wp_media
Plugin Icon 128x128 Imagify Image Optimizer
Version 1.6.7
Comparing to
See all releases

Code changes from version 1.6.6 to 1.6.7

Files changed (54) hide show
  1. assets/css/admin.css +23 -23
  2. assets/css/admin.min.css +1 -1
  3. assets/css/sweetalert2.css +0 -0
  4. assets/css/sweetalert2.min.css +0 -0
  5. assets/images/big-blue-check.png +0 -0
  6. assets/images/icon-arrow-choice.png +0 -0
  7. assets/images/icon-arrow-choice.svg +0 -0
  8. assets/images/icon-lock.png +0 -0
  9. assets/images/icon-lock.svg +0 -0
  10. assets/images/icon-pack.png +0 -0
  11. assets/images/icon-pack.svg +0 -0
  12. assets/images/pic-ericwaltr.jpg +0 -0
  13. assets/images/pic-srhdesign.jpg +0 -0
  14. assets/js/es6-promise.auto.js +0 -0
  15. assets/js/es6-promise.auto.min.js +0 -0
  16. assets/js/imagify.js +4 -2
  17. assets/js/imagify.min.js +1 -1
  18. assets/js/sweetalert2.js +0 -0
  19. assets/js/sweetalert2.min.js +0 -0
  20. imagify.php +2 -2
  21. inc/3rd-party/3rd-party.php +1 -0
  22. inc/3rd-party/amazon-s3-and-cloudfront/amazon-s3-and-cloudfront.php +1 -1
  23. inc/3rd-party/amazon-s3-and-cloudfront/inc/classes/class-imagify-as3cf-attachment.php +6 -12
  24. inc/3rd-party/amazon-s3-and-cloudfront/inc/classes/class-imagify-as3cf.php +145 -1
  25. inc/3rd-party/enable-media-replace.php +0 -0
  26. inc/3rd-party/hosting/wpengine.php +7 -3
  27. inc/3rd-party/nextgen-gallery/inc/admin/ajax.php +4 -3
  28. inc/3rd-party/nextgen-gallery/inc/admin/bulk.php +1 -1
  29. inc/3rd-party/nextgen-gallery/inc/admin/db.php +0 -0
  30. inc/3rd-party/nextgen-gallery/inc/admin/enqueue.php +0 -0
  31. inc/3rd-party/nextgen-gallery/inc/admin/gallery.php +0 -0
  32. inc/3rd-party/nextgen-gallery/inc/admin/heartbeat.php +1 -1
  33. inc/3rd-party/nextgen-gallery/inc/admin/menu.php +0 -0
  34. inc/3rd-party/nextgen-gallery/inc/classes/class-imagify-ngg-attachment.php +2 -1
  35. inc/3rd-party/nextgen-gallery/inc/classes/class-imagify-ngg-db.php +0 -0
  36. inc/3rd-party/nextgen-gallery/inc/common/attachments.php +0 -0
  37. inc/3rd-party/nextgen-gallery/inc/functions/admin-stats.php +93 -6
  38. inc/3rd-party/screets-lc.php +31 -0
  39. inc/admin/ajax.php +108 -114
  40. inc/admin/heartbeat.php +0 -0
  41. inc/admin/options.php +1 -1
  42. inc/api/imagify.php +2 -0
  43. inc/classes/abstracts/class-imagify-abstract-attachment.php +16 -2
  44. inc/classes/abstracts/class-imagify-abstract-db.php +0 -0
  45. inc/classes/class-imagify-attachment.php +0 -18
  46. inc/classes/class-imagify.php +132 -18
  47. inc/compat.php +34 -5
  48. inc/functions/admin-stats.php +198 -116
  49. inc/functions/admin-ui.php +0 -0
  50. inc/functions/admin.php +62 -5
  51. inc/functions/attachments.php +108 -38
  52. inc/functions/deprecated.php +19 -0
  53. inc/functions/process.php +1 -1
  54. readme.txt +11 -2
assets/css/admin.css CHANGED
@@ -164,7 +164,7 @@ body.imagify-modal-is-open {
164
  width: 100%;
165
  padding: 0 !important;
166
  }
167
- .imagify-sweet-alert .sa-input-error:before,
168
  .imagify-sweet-alert .sa-input-error:after,
169
  .imagify-sweet-alert .la-ball-fall {
170
  top: 25% !important;
@@ -189,7 +189,7 @@ body.imagify-modal-is-open {
189
  }
190
 
191
  #imagify-check-api-container {
192
- font-weight: bold;
193
  }
194
 
195
  #imagify-check-api-container .dashicons {
@@ -245,7 +245,7 @@ body.imagify-modal-is-open {
245
  height: 25px;
246
  border-radius: 50%;
247
  }
248
-
249
  .imagify-chart {
250
  float: left;
251
  margin-bottom: 20px;
@@ -345,10 +345,10 @@ body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress .bar {
345
  }
346
 
347
 
348
- /*
349
  *
350
  * == Settings page
351
- *
352
  */
353
 
354
 
@@ -425,7 +425,7 @@ body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress .bar {
425
  padding: 3px 6px 5px;
426
  font-size: 12px;
427
  box-shadow: none!important;
428
- line-height: 1.2;
429
  }
430
  .imagify-settings .button.button-mini-flat:hover,
431
  .imagify-settings .button.button-mini-flat:focus {
@@ -479,7 +479,7 @@ body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress .bar {
479
  background: #8BC34A;
480
  color: #FFF;
481
  box-shadow: 0 3px 0 #6F9C3B;
482
- text-shadow: 0 -1px 1px #6F9C3B, 1px 0 1px #6F9C3B, 0 1px 1px #6F9C3B!important;
483
  }
484
  .imagify-settings .button-primary:hover,
485
  .imagify-settings .button-primary:focus,
@@ -1166,7 +1166,7 @@ input[id^="imagify_sizes_"]:checked + label {
1166
  margin-top: 2em;
1167
  }
1168
  @media (max-width: 820px) {
1169
- .imagify-settings {
1170
  display: -webkit-box;
1171
  display: -ms-flexbox;
1172
  display: flex;
@@ -1293,7 +1293,7 @@ a.btn-rocket:focus {
1293
  }
1294
 
1295
 
1296
- /*
1297
  * == Welcome section
1298
  */
1299
 
@@ -1383,8 +1383,8 @@ a.btn-rocket:focus {
1383
  }
1384
 
1385
 
1386
- /*
1387
- * == Imagify Notices
1388
  */
1389
  .imagify-notice.imagify-notice {
1390
  position: relative;
@@ -1459,7 +1459,7 @@ a.btn-rocket:focus {
1459
  background: rgba(0, 0, 0, 0.4) none repeat scroll 0 0;
1460
  }
1461
 
1462
- /*
1463
  * == Custom column & Metabox
1464
  */
1465
  .column-imagify_optimized_file.column-imagify_optimized_file {
@@ -1631,7 +1631,7 @@ ul.imagify-datas-details.imagify-datas-details {
1631
  font-size: 11px;
1632
  }
1633
 
1634
- /*
1635
  * == Bulk page
1636
  */
1637
 
@@ -1756,7 +1756,7 @@ ul.imagify-datas-details.imagify-datas-details {
1756
  [class^="imagify-bar-"],
1757
  #wp-admin-bar-imagify-profile [class^="imagify-bar-"] {
1758
  position: relative;
1759
- height: 15px;
1760
  width: 100%;
1761
  background: #60758D;
1762
  color: #FFF;
@@ -1768,14 +1768,14 @@ ul.imagify-datas-details.imagify-datas-details {
1768
  [class^="imagify-bar-"].right-outside-number {
1769
  -webkit-box-sizing: border-box;
1770
  box-sizing: border-box;
1771
- padding-right: 45px;
1772
  }
1773
  .right-outside-number .imagify-barnb {
1774
  display: block;
1775
- margin-right: -45px;
1776
  text-align: right;
1777
  font-weight: bold;
1778
- line-height: 15px;
1779
  }
1780
  .imagify-progress-value,
1781
  #wp-admin-bar-imagify-profile .imagify-progress-value {
@@ -1787,7 +1787,7 @@ ul.imagify-datas-details.imagify-datas-details {
1787
  }
1788
  .imagify-progress,
1789
  #wp-admin-bar-imagify-profile .imagify-progress {
1790
- height: 15px;
1791
  }
1792
  .imagify-progress {
1793
  transition: width .3s;
@@ -2084,7 +2084,7 @@ ul.imagify-datas-details.imagify-datas-details {
2084
  display: table;
2085
  width: 100%;
2086
  }
2087
- .tooltip-content.tooltip-table > * {
2088
  display: table-cell;
2089
  vertical-align: middle;
2090
  }
@@ -2153,7 +2153,7 @@ ul.imagify-datas-details.imagify-datas-details {
2153
  color: #46b1ce;
2154
  }
2155
 
2156
- /*
2157
  * == Bulk table
2158
  */
2159
  .imagify-bulk-table {
@@ -2251,7 +2251,7 @@ ul.imagify-datas-details.imagify-datas-details {
2251
  opacity: 1;
2252
  }
2253
  }
2254
-
2255
  @keyframes congrate {
2256
  0% {
2257
  opacity: 0;
@@ -2791,7 +2791,7 @@ td.imagify-cell-filename {
2791
  .imagify-analyzing .imagify-numbers-notcalc,
2792
  .imagify-modal-section.imagify-analyzing .imagify-loader {
2793
  display: block;
2794
- }
2795
  .imagify-modal-section .imagify-loader {
2796
  margin: 2em auto;
2797
  }
@@ -3786,4 +3786,4 @@ p.imagify-modal-sidebar-title {
3786
  color: #40b1d0;
3787
  float: right;
3788
  font-weight: bold;
3789
- }
164
  width: 100%;
165
  padding: 0 !important;
166
  }
167
+ .imagify-sweet-alert .sa-input-error:before,
168
  .imagify-sweet-alert .sa-input-error:after,
169
  .imagify-sweet-alert .la-ball-fall {
170
  top: 25% !important;
189
  }
190
 
191
  #imagify-check-api-container {
192
+ font-weight: bold;
193
  }
194
 
195
  #imagify-check-api-container .dashicons {
245
  height: 25px;
246
  border-radius: 50%;
247
  }
248
+
249
  .imagify-chart {
250
  float: left;
251
  margin-bottom: 20px;
345
  }
346
 
347
 
348
+ /**
349
  *
350
  * == Settings page
351
+ *
352
  */
353
 
354
 
425
  padding: 3px 6px 5px;
426
  font-size: 12px;
427
  box-shadow: none!important;
428
+ line-height: 1.2;
429
  }
430
  .imagify-settings .button.button-mini-flat:hover,
431
  .imagify-settings .button.button-mini-flat:focus {
479
  background: #8BC34A;
480
  color: #FFF;
481
  box-shadow: 0 3px 0 #6F9C3B;
482
+ text-shadow: 0 -1px 1px #6F9C3B, 1px 0 1px #6F9C3B, 0 1px 1px #6F9C3B!important;
483
  }
484
  .imagify-settings .button-primary:hover,
485
  .imagify-settings .button-primary:focus,
1166
  margin-top: 2em;
1167
  }
1168
  @media (max-width: 820px) {
1169
+ .imagify-settings {
1170
  display: -webkit-box;
1171
  display: -ms-flexbox;
1172
  display: flex;
1293
  }
1294
 
1295
 
1296
+ /**
1297
  * == Welcome section
1298
  */
1299
 
1383
  }
1384
 
1385
 
1386
+ /**
1387
+ * == Imagify Notices
1388
  */
1389
  .imagify-notice.imagify-notice {
1390
  position: relative;
1459
  background: rgba(0, 0, 0, 0.4) none repeat scroll 0 0;
1460
  }
1461
 
1462
+ /**
1463
  * == Custom column & Metabox
1464
  */
1465
  .column-imagify_optimized_file.column-imagify_optimized_file {
1631
  font-size: 11px;
1632
  }
1633
 
1634
+ /**
1635
  * == Bulk page
1636
  */
1637
 
1756
  [class^="imagify-bar-"],
1757
  #wp-admin-bar-imagify-profile [class^="imagify-bar-"] {
1758
  position: relative;
1759
+ height: 1.5em;
1760
  width: 100%;
1761
  background: #60758D;
1762
  color: #FFF;
1768
  [class^="imagify-bar-"].right-outside-number {
1769
  -webkit-box-sizing: border-box;
1770
  box-sizing: border-box;
1771
+ padding-right: 4.5em;
1772
  }
1773
  .right-outside-number .imagify-barnb {
1774
  display: block;
1775
+ margin-right: -4.5em;
1776
  text-align: right;
1777
  font-weight: bold;
1778
+ line-height: 1.5;
1779
  }
1780
  .imagify-progress-value,
1781
  #wp-admin-bar-imagify-profile .imagify-progress-value {
1787
  }
1788
  .imagify-progress,
1789
  #wp-admin-bar-imagify-profile .imagify-progress {
1790
+ height: 1.5em;
1791
  }
1792
  .imagify-progress {
1793
  transition: width .3s;
2084
  display: table;
2085
  width: 100%;
2086
  }
2087
+ .tooltip-content.tooltip-table > * {
2088
  display: table-cell;
2089
  vertical-align: middle;
2090
  }
2153
  color: #46b1ce;
2154
  }
2155
 
2156
+ /**
2157
  * == Bulk table
2158
  */
2159
  .imagify-bulk-table {
2251
  opacity: 1;
2252
  }
2253
  }
2254
+
2255
  @keyframes congrate {
2256
  0% {
2257
  opacity: 0;
2791
  .imagify-analyzing .imagify-numbers-notcalc,
2792
  .imagify-modal-section.imagify-analyzing .imagify-loader {
2793
  display: block;
2794
+ }
2795
  .imagify-modal-section .imagify-loader {
2796
  margin: 2em auto;
2797
  }
3786
  color: #40b1d0;
3787
  float: right;
3788
  font-weight: bold;
3789
+ }
assets/css/admin.min.css CHANGED
@@ -1 +1 @@
1
- .imagify-cell,.imagify-cell.va-top,.va-top .imagify-cell{vertical-align:top}#imagify-overview-chart-legend,.imagify-oh,body.imagify-modal-is-open{overflow:hidden}.imagify-start{float:left}.imagify-end{float:right}.imagify-txt-start.imagify-txt-start.imagify-txt-start{text-align:left}.imagify-txt-center.imagify-txt-center.imagify-txt-center{text-align:center}.imagify-txt-end.imagify-txt-end.imagify-txt-end{text-align:right}.imagify-mt1.imagify-mt1{margin-top:1em}.imagify-mb1.imagify-mb1{margin-bottom:1em}.imagify-mr1.imagify-mr1{margin-right:1em}.imagify-ml2.imagify-ml2{margin-left:2em}.imagify-mr2.imagify-mr2{margin-right:2em}.imagify-pl0.imagify-pl0.imagify-pl0{padding-left:0}.imagify-pr1.imagify-pr1{padding-right:1em}.imagify-clear{clear:both}.imagify-clearfix:after,.imagify-inline-options:after{content:"";display:table;clear:both}.imagify-count.imagify-count{counter-reset:num}.imagify-count .imagify-count-title{font-weight:700}.imagify-default-settings{color:#73818c;font-weight:400}.imagify-count .imagify-count-title:before{counter-increment:num 1;content:counter(num) ". "}.imagify-table{display:table;width:100%}.imagify-cell{display:table-cell;padding:10px}.imagify-bulk-submit .imagify-cell{padding-top:0}.imagify-plugins-error{overflow:hidden;padding-left:20px;list-style-type:disc}.imagify-plugins-error li{width:300px;line-height:30px}@media (max-width:570px){.imagify-plugins-error li{width:auto}}.imagify-notice-dismiss.notice-dismiss{text-decoration:none}.imagify-spinner{display:inline-block;width:20px;height:20px;margin-right:5px;vertical-align:middle;background:url(../images/spinner.gif) 0 0/20px 20px no-repeat rgba(0,0,0,0);opacity:.7}.spinner.imagify-hidden{width:0;margin:4px 0 0}.misc-pub-section.misc-pub-imagify h4{font-size:14px;margin-top:5px;margin-bottom:0}.imagify-sweet-alert button{margin-top:17px!important;height:45px!important;letter-spacing:3px;text-transform:uppercase!important;border-radius:3px!important;background-color:#40b1d0!important;-webkit-box-shadow:0 3px 0 #338ea6!important;box-shadow:0 3px 0 #338ea6!important}.imagify-sweet-alert button.loading{border-radius:100%!important;height:40px!important;padding:0!important;-webkit-box-shadow:none!important;box-shadow:none!important}.imagify-sweet-alert button.swal2-cancel{background:#777!important;-webkit-box-shadow:0 3px 0 #444!important;box-shadow:0 3px 0 #444!important}.imagify-sweet-alert-signup .sa-confirm-button-container{width:40%}.imagify-sweet-alert-signup button{width:100%;padding:0!important}.imagify-sweet-alert .la-ball-fall,.imagify-sweet-alert .sa-input-error:after,.imagify-sweet-alert .sa-input-error:before{top:25%!important}#wpwrap{-webkit-transition:all .4s;-o-transition:all .4s;transition:all .4s}.stop-scrolling #wpwrap{-webkit-filter:blur(2px);filter:blur(2px)}.stop-scrolling #wpwrap #wpadminbar{top:-32px}.imagify-primary.imagify-primary.imagify-primary{color:#40b1d0}.imagify-secondary.imagify-secondary.imagify-secondary{color:#8cc152}#imagify-check-api-container{font-weight:700}#imagify-check-api-container .dashicons{font-size:25px}#imagify-check-api-container .dashicons-no:before{color:#f06e57;vertical-align:-1px}#imagify-check-api-container .dashicons-yes:before{color:#8BC34A;vertical-align:-1px}.imagify-valid{color:#8BC34A}.imagify-chart{width:33.33%;position:relative}.imagify-doughnut-legend{margin-top:38px;list-style:none}.imagify-doughnut-legend li{display:block;padding-left:30px;position:relative;margin-bottom:15px;border-radius:5px;padding:3px 8px 2px 31px;font-size:14px;font-weight:600;cursor:default;-webkit-transition:background-color .2s ease-in-out;-o-transition:background-color .2s ease-in-out;transition:background-color .2s ease-in-out}.imagify-doughnut-legend li span{display:block;position:absolute;left:0;top:0;width:25px;height:25px;border-radius:50%}.button-text,.imagify-bulk-info p{display:inline-block}.imagify-chart{float:left;margin-bottom:20px}td .imagify-chart{float:none;margin-bottom:0;top:4px}.imagify-chart-container{position:relative;width:180px;float:left;margin-right:20px}.imagify-global-optim-phrase{width:180px;padding-top:20px;font-size:14px;font-weight:700;text-align:center}.imagify-total-percent{color:#46b1ce}td .imagify-chart-container{width:18px;height:18px;float:none;margin-right:10px}.imagify-chart-percent{position:absolute;left:0;right:0;top:50%;margin-top:-14px;text-align:center;font-size:55px;font-weight:700;color:#46B1CE}.imagify-chart-percent span{font-size:20px;vertical-align:super}.media_page_imagify-bulk-optimization .notice,.settings_page_imagify .notice,body[class*="_imagify-ngg-bulk-optimization"] .notice{margin-right:20px;margin-left:2px}.media_page_imagify-bulk-optimization .media-item,body[class*="_imagify-ngg-bulk-optimization"] .media-item{margin:0}.media_page_imagify-bulk-optimization .media-item .progress,body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress{float:none;width:100%;margin:0;background:#1F2331;-webkit-box-shadow:0;box-shadow:0;border-radius:0}.media_page_imagify-bulk-optimization .media-item .percent,body[class*="_imagify-ngg-bulk-optimization"] .media-item .percent{width:auto;padding:0 5px;line-height:1.85;font-size:12px}.media_page_imagify-bulk-optimization .media-item .percent,.media_page_imagify-bulk-optimization .media-item .progress,body[class*="_imagify-ngg-bulk-optimization"] .media-item .percent,body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress{text-align:right}.media_page_imagify-bulk-optimization .media-item .progress .bar,body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress .bar{width:1px;height:22px;margin-top:0;background:#46B1CE;border-radius:0;overflow:visible;-webkit-transition:width .5s;-o-transition:width .5s;transition:width .5s}.imagify-settings .button,.imagify-settings a,.imagify-settings input,.imagify-welcome .button,.imagify-welcome a,.imagify-weolcome input{-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-settings a{color:#40b1d0}.imagify-options-title{padding-bottom:.5em;border-bottom:3px solid #F2F2F2;font-size:13px;font-weight:500;text-transform:uppercase;letter-spacing:.025em;color:#40b1d0}.imagify-settings,.imagify-settings p,.imagify-settings th{color:#5F758E}@media (max-width:782px){.imagify-settings .form-table th{padding-top:2em;padding-bottom:.5em}}.imagify-settings .form-table td{vertical-align:top}.button .dashicons,.button-text,.imagify-button-primary.imagify-button-primary .dashicons,.imagify-button-secondary.imagify-button-secondary .dashicons,.imagify-button.imagify-button .dashicons,.imagify-notice .button .dashicons,.imagify-settings .button .dashicons,.imagify-welcome .button .dashicons{vertical-align:middle}.imagify-settings .form-table th span{cursor:pointer}.imagify-middle th{padding-top:35px}.imagify-button-primary.imagify-button-primary,.imagify-button-secondary.imagify-button-secondary,.imagify-button.imagify-button,.imagify-notice .button,.imagify-settings .button,.imagify-welcome .button{height:auto;padding:8px 20px;border:0;font-size:14px;font-weight:600;-webkit-box-shadow:0 3px 0 rgba(0,0,0,.15);box-shadow:0 3px 0 rgba(0,0,0,.15);border-radius:3px;cursor:pointer;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-notice .button-mini{padding:2px 10px;font-size:13px}.button-primary.button-mini{padding:2px 10px}.imagify-settings .button.button-mini-flat{padding:3px 6px 5px;font-size:12px;-webkit-box-shadow:none!important;box-shadow:none!important;line-height:1.2}.imagify-settings .button.button-mini-flat:focus,.imagify-settings .button.button-mini-flat:hover{-webkit-box-shadow:none!important;box-shadow:none!important}.imagify-button-ghost.imagify-button-ghost,.imagify-title .button-ghost.button-ghost{padding:2px 9px;border:1px solid #40B1D0;font-size:12px;font-weight:400;color:#40B1D0;background:0 0;-webkit-box-shadow:none;box-shadow:none}.imagify-button-ghost.imagify-button-ghost:focus,.imagify-button-ghost.imagify-button-ghost:hover,.imagify-title .button-ghost.button-ghost:focus,.imagify-title .button-ghost.button-ghost:hover{border-color:transparent;color:#000;background:#40B1D0}.imagify-button-ghost.imagify-button-ghost:focus,.imagify-button-ghost.imagify-button-ghost:hover{color:#FFF}.imagify-button-medium.imagify-button-medium{text-transform:uppercase;letter-spacing:.1em;padding:3px 10px;font-weight:700}.imagify-button-medium.imagify-button-ghost{border-width:2px}.button .dashicons{margin-right:5px}.imagify-button-primary.imagify-button-primary,.imagify-settings .button-primary.button-primary,.imagify-welcome .button-primary.button-primary{background:#40B1D0;color:#FFF;-webkit-box-shadow:0 3px 0 rgba(51,142,166,1);box-shadow:0 3px 0 rgba(51,142,166,1);text-shadow:0 -1px 1px #006799,1px 0 1px #006799,0 1px 1px #006799!important}.imagify-button-secondary.imagify-button-secondary{background:#8BC34A;color:#FFF;-webkit-box-shadow:0 3px 0 #6F9C3B;box-shadow:0 3px 0 #6F9C3B;text-shadow:0 -1px 1px #6F9C3B,1px 0 1px #6F9C3B,0 1px 1px #6F9C3B!important}.imagify-button-primary.imagify-button-primary:focus,.imagify-button-primary.imagify-button-primary:hover,.imagify-settings .button-primary:focus,.imagify-settings .button-primary:hover,.imagify-welcome .button-primary:focus,.imagify-welcome .button-primary:hover{background:#338ea6;-webkit-box-shadow:0 3px 0 #1f7a92;box-shadow:0 3px 0 #1f7a92}.imagify-button-secondary.imagify-button-secondary:focus,.imagify-button-secondary.imagify-button-secondary:hover{background:#6F9C3B;color:#FFF}.imagify-button-light.imagify-button-light{background:#FFF;color:#4a4a4a;-webkit-box-shadow:0 2px 0 rgba(0,0,0,.2);box-shadow:0 2px 0 rgba(0,0,0,.2)}.imagify-button-light.imagify-button-light:focus,.imagify-button-light.imagify-button-light:hover{color:#FFF;background:rgba(0,0,0,.2)}.imagify-section-positive .imagify-button-light{color:#709A41}.imagify-button.imagify-button-big{font-size:15px;padding:11px 30px}.imagify-button-big .dashicons{font-size:1.45em;margin-right:6px;margin-left:-4px}.imagify-info,.imagify-logo{vertical-align:top}#imagify-bulk-action{padding:11px 20px}.media-frame-content .imagify-button-primary,.wp_attachment_image .imagify-button-primary{float:left;padding:0 10px 1px;margin:0 5px 2px 0;font-size:13px;line-height:26px;-webkit-box-shadow:0 3px 0 rgba(51,142,166,1);box-shadow:0 3px 0 rgba(51,142,166,1)}.imagify-settings input[type=text]{color:#4A4A4A;font-weight:600;-webkit-box-shadow:none;box-shadow:none}.imagify-settings div.submit.submit{padding-left:235px;padding-top:40px}.imagify-settings p.submit{float:left;margin-top:0}.imagify-settings p.submit .button{margin:0 5px}@media (max-width:850px){.imagify-settings div.submit{padding-left:0}.imagify-settings p.submit{text-align:center}}.imagify-title.imagify-title{position:relative;padding:30px 50px;font-size:23px;background:#2E3243;color:#FFF}.imagify-settings .imagify-title+.imagify-notice{margin:0;border-right:1px solid #D9D9D9;padding-top:15px;padding-bottom:15px}.imagify-section,.imagify-settings div.submit,.imagify-sub-header,.imagify-sub-title.imagify-sub-title{margin:0;padding:20px;background:#F2F5F7}.imagify-section-positive,.imagify-sub-title.imagify-sub-title{padding-left:40px}.imagify-section-positive{background:#8cc152;color:#FFF}.imagify-section-positive p{color:#FFF}.imagify-section-gray{background:#D9E4EB}.imagify-section-gray .imagify-count-title{color:#4a4a4a}.imagify-section p:first-child{margin-top:0}.imagify-section p:last-child{margin-bottom:0}p.imagify-section-title.imagify-section-title{font-size:20px;margin-top:-.3em;margin-bottom:-.6em}.imagify-bulk-info{margin:1em 1em 1em 5px;-webkit-transition:margin .3s;-o-transition:margin .3s;transition:margin .3s}@media (max-width:850px){.imagify-bulk-info{margin:1em}}.imagify-bulk-info p{text-align:left;width:400px;max-width:100%;font-weight:700}@media (min-width:1500px){.imagify-settings div.submit{display:table;width:100%}.imagify-settings div.submit>*{display:table-cell;vertical-align:middle}.imagify-bulk-info{padding:0 25px;text-align:right}}.imagify-settings div.submit{margin-top:2em;padding:20px 0}.imagify-notice .imagify-rate-us .stars,.imagify-sub-header .form-table{margin:0}.imagify-sub-header th{text-align:right}.imagify-sub-header td,.imagify-sub-header th{padding-top:0;padding-bottom:0}[for=api_key]{padding-top:5px}.imagify-notice .imagify-rate-us.imagify-rate-us{position:relative;bottom:0;right:0;text-align:left}.imagify-rate-us.imagify-rate-us{position:absolute;bottom:50%;right:20px;text-align:right;margin-bottom:-2.4em;color:#FFF}.imagify-rate-us a{color:#40B1D0}.imagify-rate-us .stars{display:inline-block;margin:2px 0 0 10px;text-decoration:none;letter-spacing:.2em;vertical-align:-1px}.imagify-rate-us .stars .dashicons:before{font-size:18px}.imagify-rate-us a:focus,.imagify-rate-us a:hover{color:#FEE102}@media (max-width:1220px){.imagify-rate-us.imagify-rate-us{position:static;margin-bottom:0;text-align:left}.imagify-rate-us.imagify-rate-us br{display:none}.imagify-rate-us .stars{display:block;margin-left:0}}.imagify-rkt-notice.imagify-rkt-notice{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;-ms-grid-row-align:center;align-items:center;padding:10px 45px 10px 0;border:0;-webkit-box-shadow:none;box-shadow:none;color:#FFF;background:#412355}.media_page_imagify-bulk-optimization .imagify-rkt-notice{margin-left:2px;margin-right:20px}@media (max-width:782px){.media_page_imagify-bulk-optimization .imagify-rkt-notice{margin-left:0;margin-right:12px}}.imagify-rkt-notice .imagify-cross{position:absolute;right:8px;top:50%;width:22px;height:22px;padding:0;margin-top:-11px;background:0 0;color:#FD7300;border-radius:50%;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-rkt-notice .imagify-cross .dashicons{position:relative;top:2px;left:1px;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-rkt-notice .imagify-cross:hover{background:#FFF}.imagify-rkt-notice .imagify-cross:hover .dashicons{color:#412355}.imagify-rkt-notice .imagify-rkt-coupon,.imagify-rkt-notice .imagify-rkt-cta,.imagify-rkt-notice .imagify-rkt-logo{-ms-flex-negative:0;flex-shrink:0}.imagify-rkt-notice .imagify-rkt-logo{width:150px!important;text-align:center;padding:0 25px 0 30px;line-height:.8}.imagify-rkt-notice .imagify-rkt-msg{width:100%!important;padding:0 15px;font-size:14px;line-height:1.6}.imagify-rkt-notice .imagify-rkt-coupon{width:150px!important;padding:0 15px}.imagify-rkt-notice .imagify-rkt-coupon-code{padding:5px 10px;font-size:23px;font-weight:700;border:1px dashed #F7A933;color:#F7A933}.imagify-rkt-notice .imagify-rkt-cta{width:250px!important;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-preferred-size:200px;flex-basis:200px}.imagify-rkt-notice .button.button{position:relative;top:-1px;height:auto;font-weight:600;font-size:14px;-webkit-box-shadow:0 4px 0 #B27A27;box-shadow:0 4px 0 #B27A27;border:0;padding:9px 18px;background:#F7A933;text-shadow:1px 1px 1px rgba(0,0,0,.2)}@media (max-width:880px){.imagify-rkt-notice{-ms-flex-wrap:wrap;flex-wrap:wrap}.imagify-rkt-notice .imagify-rkt-cta,.imagify-rkt-notice .imagify-rkt-logo,.imagify-rkt-notice .imagify-rkt-msg{text-align:left;padding:5px 15px}.imagify-cross.imagify-cross{top:8px;margin-top:0}.imagify-rkt-notice .imagify-cross .dashicons{top:1px}}.imagify-settings-section{padding:10px 20px}.imagify-welcome .imagify-settings-section,[id=imagify-settings]{border:1px solid #D9D9D9;border-top:0 none;background:#FFF}.imagify-br{line-height:2}.imagify-important{color:#F5A623}.imagify-info,.imagify-info a{color:#40B1D0;font-size:12px}.imagify-info{position:relative;display:inline-block;padding-left:25px}.imagify-info .dashicons{position:absolute;left:0;top:-1px}.imagify-visual-label,label+.imagify-info,label+.imagify-options-line{display:inline-block;max-width:70%;margin-left:15px;margin-top:2px!important;-webkit-transition:opacity .3s;-o-transition:opacity .3s;transition:opacity .3s}.imagify-visual-label{vertical-align:-5px}label[for=imagify_sizes_full]+.imagify-info{vertical-align:middle}.imagify-settings.imagify-settings [type=checkbox]:not(:checked)+label .imagify-visual-label,.imagify-settings.imagify-settings [type=checkbox]:not(:checked)+label+.imagify-options-line{opacity:.5}.imagify-settings.imagify-settings [type=checkbox]:checked+label .imagify-visual-label,.imagify-settings.imagify-settings [type=checkbox]:checked+label+.imagify-options-line{opacity:1}.imagify-checkbox-marged{max-width:500px;margin-left:45px}.imagify-checkbox.imagify-checkbox:checked,.imagify-checkbox.imagify-checkbox:not(:checked),.imagify-settings.imagify-settings [type=checkbox]:checked,.imagify-settings.imagify-settings [type=checkbox]:not(:checked){opacity:.01}.imagify-checkbox.imagify-checkbox:checked:focus,.imagify-checkbox.imagify-checkbox:not(:checked):focus,.imagify-settings.imagify-settings [type=checkbox]:checked:focus,.imagify-settings.imagify-settings [type=checkbox]:not(:checked):focus{-webkit-box-shadow:none!important;box-shadow:none!important;outline:0!important;border:0!important}.imagify-checkbox.imagify-checkbox:checked+label,.imagify-checkbox.imagify-checkbox:not(:checked)+label,.imagify-settings [type=checkbox]:checked+label,.imagify-settings [type=checkbox]:not(:checked)+label{position:relative;padding-left:6px;cursor:pointer;vertical-align:top}.imagify-checkbox.imagify-checkbox:checked+label:before,.imagify-checkbox.imagify-checkbox:not(:checked)+label:before,.imagify-settings [type=checkbox]:checked+label:before,.imagify-settings [type=checkbox]:not(:checked)+label:before{content:'';position:absolute;left:0;top:0;width:28px;height:28px;margin:0 0 0 -24px;border:2px solid #8BA6B4;background:#FFF;border-radius:4px}.imagify-checkbox.imagify-checkbox:checked+label:after,.imagify-checkbox.imagify-checkbox:not(:checked)+label:after,.imagify-settings [type=checkbox]:checked+label:after,.imagify-settings [type=checkbox]:not(:checked)+label:after{content:"✓";position:absolute;font-size:1.4em;top:3px;left:-16px;-webkit-transition:all .2s;-o-transition:all .2s;transition:all .2s}.imagify-checkbox.imagify-checkbox[disabled]:checked+label:before,.imagify-checkbox.imagify-checkbox[disabled]:not(:checked)+label:before,.imagify-settings [type=checkbox][disabled]:checked+label:before,.imagify-settings [type=checkbox][disabled]:not(:checked)+label:before{border-color:#ccc;background:#ddd}.imagify-checkbox.imagify-checkbox:not(:checked)+label:after,.imagify-settings [type=checkbox]:not(:checked)+label:after{opacity:0;-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0)}.imagify-checkbox.imagify-checkbox:checked+label:after,.imagify-settings [type=checkbox]:checked+label:after{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}input[id^=imagify_sizes_]:checked+label{font-weight:700}.medium.imagify-checkbox:checked+label:before,.medium.imagify-checkbox:not(:checked)+label:before{width:22px;height:22px;border-width:1.5px;border-radius:2px;margin-top:0}.medium.imagify-checkbox:checked+label:after,.medium.imagify-checkbox:not(:checked)+label:after{font-size:1.1em;left:-17px;top:3px}.imagify-settings .mini[type=checkbox]:checked+label:before,.imagify-settings .mini[type=checkbox]:not(:checked)+label:before,.mini.imagify-checkbox:checked+label:before,.mini.imagify-checkbox:not(:checked)+label:before{width:15px;height:15px;border-width:1px;border-radius:2px;margin-top:0}.imagify-settings .mini[type=checkbox]:checked+label:after,.imagify-settings .mini[type=checkbox]:not(:checked)+label:after,.mini.imagify-checkbox:checked+label:after,.mini.imagify-checkbox:not(:checked)+label:after{font-size:.9em;left:-21px;top:1px}.imagify-checkbox.imagify-checkbox:checked:focus+label:before,.imagify-checkbox.imagify-checkbox:not(:checked):focus+label:before,.imagify-settings [type=checkbox]:checked:focus+label:before,.imagify-settings [type=checkbox]:not(:checked):focus+label:before{border-style:dotted;border-color:#40b1d0}.imagify-inline-options{position:relative;display:table;width:100%;max-width:600px;border-collapse:collapse}.imagify-small-options{width:300px;margin:1em auto .5em;background:#338EA6;border-radius:4px}.imagify-inline-options input[type=radio]:checked,.imagify-inline-options input[type=radio]:not(:checked){position:absolute;left:5px;top:5px;display:none}.imagify-inline-options input[type=radio]:checked+label,.imagify-inline-options input[type=radio]:not(:checked)+label{position:relative;display:table-cell;padding:13px 10px;text-align:center;font-weight:600;font-size:16px;text-transform:uppercase;letter-spacing:.1em;color:#FFF;background:#2E3243;border-left:1px solid rgba(255,255,255,.2);-webkit-box-shadow:0 -3px 0 rgba(0,0,0,.1) inset,inset -1px 0 0 rgba(255,255,255,.2);box-shadow:0 -3px 0 rgba(0,0,0,.1) inset,inset -1px 0 0 rgba(255,255,255,.2);z-index:2;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-small-options input[type=radio]:checked+label,.imagify-small-options input[type=radio]:not(:checked)+label{padding:8px 10px;font-size:13px;color:#FFF;-webkit-box-shadow:none;box-shadow:none;border-left:0}.imagify-bulk-submit .imagify-inline-options input[type=radio]:checked+label,.imagify-bulk-submit .imagify-inline-options input[type=radio]:not(:checked)+label{margin-bottom:1.75em}.imagify-inline-options input[type=radio]:checked+label:first-of-type,.imagify-inline-options input[type=radio]:not(:checked)+label:first-of-type{border-radius:3px 0 0 3px}.imagify-inline-options input[type=radio]:checked+label:last-of-type,.imagify-inline-options input[type=radio]:not(:checked)+label:last-of-type{border-radius:0 3px 3px 0}.imagify-inline-options input[type=radio]:checked+label{background:#8BC34A}.imagify-small-options input[type=radio]:not(:checked)+label{background:#338EA6;color:rgba(255,255,255,.4)}.imagify-small-options input[type=radio]:checked+label{background:#40B1D0}.imagify-inline-options .imagify-info{margin-top:15px}.imagify-btn-info{display:block;font-size:.7em;letter-spacing:0;line-height:1;text-transform:none}.imagify-datas-more-action a,a.btn-rocket{text-transform:uppercase;text-decoration:none}#describe-resize-larger input{width:5em}.imagify-cols:after{content:"";display:table;clear:both}.imagify-col{float:left;width:50%}.imagify-main{float:left;width:70%}.imagify-sidebar{float:right;width:28%;max-width:300px}.imagify-sidebar-section{border:1px solid #BBB;background:#FFF}.imagify-sidebar-section+.imagify-sidebar-section{margin-top:2em}@media (max-width:820px){.imagify-main,.imagify-sidebar{float:none;width:auto}.imagify-settings{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.imagify-sidebar{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;max-width:none;margin-left:0;margin-top:25px}.wp-media-products{text-align:center}.wp-media-products li{display:inline-block;width:100%;max-width:276px}}@media (min-width:1400px){.imagify-main{width:74%}}.imagify-sidebar-title{display:block;padding:20px 15px;border-bottom:1px solid #BBB;font-size:14px;font-weight:700;color:#23282d;background:#F2F5F7}.imagify-sidebar-title img{vertical-align:top;margin-right:5px}.imagify-sidebar .wp-media-products{margin-top:0;margin-bottom:-.5em}.imagify-sidebar .wp-media-products .links{display:block;padding:85px 25px 24px;text-align:center;background-color:#2E3243;background-size:contain;background-repeat:no-repeat;background-position:50% 0;text-decoration:none}.imagify-sidebar .wp-media-products .links p{margin:1.5em auto;color:#FFF}.imagify-sidebar .wp-media-products .wprocket-link{background-image:-o-linear-gradient(top,rgba(59,30,78 ,0),rgba(59,30,78 ,0) 130px,rgba(59 ,30 ,78 ,1) 210px),url(../images/sidebar-wp-rocket.jpg);background-image:linear-gradient(to bottom,rgba(59,30,78 ,0),rgba(59,30,78 ,0) 130px,rgba(59 ,30 ,78 ,1) 210px),url(../images/sidebar-wp-rocket.jpg);background-color:#3B1E4E;background-repeat:repeat-x,no-repeat}.imagify-sidebar-content{padding:10px 20px}.imagify-mark-styled{display:inline-block;padding:1px 2px 1px 4px;line-height:1.3;font-weight:700;background:#F7A933;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotateZ(-2deg) rotateX(-10deg) skewX(-2deg) skewY(-3deg);transform:rotateZ(-2deg) rotateX(-10deg) skewX(-2deg) skewY(-3deg);text-shadow:1px 1px 0 rgba(0,0,0,.2)}.imagify-mark-styled span{display:inline-block;-webkit-transform:rotateZ(2deg) rotateX(10deg) skewX(2deg) skewY(3deg);transform:rotateZ(2deg) rotateX(10deg) skewX(2deg) skewY(3deg)}.imagify-discount-code,a.btn-rocket{display:block;text-shadow:1px 1px 0 rgba(0,0,0,.2);font-weight:700}.imagify-discount-code{margin:.35em 0 .5em;font-size:2em;letter-spacing:.05em;text-align:center}.imagify-big-text{font-size:15px;font-weight:700}.imagify-big-text strong{font-size:20px}a.btn-rocket{font-size:1.15em;padding:12px;background:#F7A933;-webkit-box-shadow:0 3px 0 #D69626;box-shadow:0 3px 0 #D69626;border-radius:3px;color:#FFF}a.btn-rocket:focus,a.btn-rocket:hover{background:#ff8c00;-webkit-box-shadow:0 3px 0 #ff8c00;box-shadow:0 3px 0 #ff8c00}.imagify-welcome{margin:30px 20px 0 0}.imagify-welcome .baseline{display:inline-block;margin:.2em 0 0 2em;font-size:17px}.imagify-welcome .imagify-logo{vertical-align:middle}.imagify-welcome-remove{position:absolute;top:50%;right:15px;margin-top:-8px;color:#FFF;text-decoration:none}.imagify-columns{overflow:hidden;padding:15px 0;counter-reset:cols}.imagify-columns [class^=col-]{float:left;-webkit-box-sizing:border-box;box-sizing:border-box}.imagify-columns .col-1-3{width:33.333%;padding-left:28px}.imagify-columns .col-2-3{width:66.666%;padding-left:28px}.imagify-columns .col-1-2{width:50%;padding:0 20px}.imagify-columns .col-overview{padding-left:20px}.imagify-columns .col-informations{width:36.6%;padding-right:30px}.imagify-columns .col-statistics{width:30%}@media (max-width:830px){.imagify-columns [class^=col-]{float:none;margin-bottom:1.5em}.imagify-columns .col-1-2,.imagify-columns .col-1-3{width:auto;padding:0 28px;clear:both;padding-top:1em}}.imagify-columns [class^=col-] img{float:left;margin-right:18px}.imagify-col-content{overflow:hidden}.imagify-col-title{margin:0 0 15px;font-size:23px}.counter .imagify-col-title:before{counter-increment:cols;content:counter(cols) ". ";color:#40B1D0}.imagify-col-desc{color:#5F758E;margin-bottom:2em}.imagify-notice.imagify-notice{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;padding:0;margin:10px 20px 10px 2px;border:0;background:#2E3243;-webkit-box-shadow:none;box-shadow:none;color:#FFF}@media (max-width:782px){.imagify-notice.imagify-notice,.imagify-welcome{margin-right:12px}}@media (max-width:450px){.imagify-notice.imagify-notice{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}.wrap .imagify-notice{margin:5px 15px 2px;position:relative}.imagify-notice-logo{padding:18px 23px;background:#40B1D0}.updated .imagify-notice-logo{background:#8BC34A}.error .imagify-notice-logo{background:#D0021B}.imagify-popin-message{padding:5px 15px;text-align:left}.imagify-popin-message.imagify-error p{color:#FFF}.imagify-notice-title{font-size:15px}.imagify-notice-content{padding:5px 23px}.imagify-notice-content.imagify-notice-content p{margin:.65em 0}.imagify-notice a{color:#40B1D0}.imagify-notice a:focus,.imagify-notice a:hover{color:#FEE102}.imagify-notice code{background:rgba(0,0,0,.4)}.column-imagify_optimized_file.column-imagify_optimized_file{width:300px;text-align:center;vertical-align:middle}.column-imagify_optimized_file>*{max-width:235px;margin:0 auto}ul.imagify-datas-list.imagify-datas-list{margin:0 auto;color:#555;font-size:10px}.compat-field-imagify .label{vertical-align:top}.compat-field-imagify ul.imagify-datas-list{margin-top:7px;font-size:11px}ul.imagify-datas-list .big{font-size:12px;color:#40B1D0}.imagify-data-item{overflow:hidden}.imagify-data-item .imagify-chart{display:inline-block;top:1px;width:20px;vertical-align:middle;margin-bottom:0}li.imagify-data-item{clear:both;margin-bottom:2px}ul.imagify-datas-list .imagify-data-item span.data,ul.imagify-datas-list .imagify-data-item strong{float:left;width:50%;-webkit-box-sizing:border-box;box-sizing:border-box}ul.imagify-datas-list .imagify-data-item span.data{text-align:left;padding-right:5px}.compat-field-imagify .imagify-datas-list .imagify-data-item .data{width:130px;text-align:left;font-weight:700}.media-sidebar .imagify-datas-list .imagify-data-item .data,.media-sidebar .imagify-datas-list .imagify-data-item strong{width:auto;float:none}ul.imagify-datas-list .imagify-data-item strong{text-align:left;padding-left:5px}.imagify-datas-more-action.imagify-datas-more-action{margin:.4em auto;background:-webkit-gradient(linear,left top,left bottom,from(transparent),color-stop(49%,transparent),color-stop(50%,rgba(0,0,0,.075)),color-stop(58%,rgba(0,0,0,.075)),color-stop(58%,transparent),to(transparent));background:-o-linear-gradient(top,transparent,transparent 49%,rgba(0,0,0,.075) 50%,rgba(0,0,0,.075) 58%,transparent 58%,transparent);background:linear-gradient(to bottom,transparent,transparent 49%,rgba(0,0,0,.075) 50%,rgba(0,0,0,.075) 58%,transparent 58%,transparent)}.imagify-datas-more-action a{display:inline-block;padding:0 5px;background:#40B1D0;color:#FFF;font-size:9px;font-weight:700;line-height:1.9}.imagify-datas-more-action a.is-open{background:#555}.imagify-datas-more-action a.is-open .dashicons{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.imagify-datas-more-action a .dashicons{font-size:14px;vertical-align:middle;line-height:.8}.imagify-datas-more-action .the-text,.imagify-datas-more-action a .dashicons:before{line-height:20px;vertical-align:middle}.imagify-datas-more-action .the-text{display:inline-block;height:20px}ul.imagify-datas-details.imagify-datas-details{margin:.7em auto}.imagify-datas-details strong{color:#40B1D0}.imagify-datas-details .original{color:#555}.imagify-datas-actions-links{overflow:hidden;border-top:2px solid transparent;padding-top:5px;font-size:8px}.imagify-datas-actions-links a{position:relative;display:inline-block;padding-left:17px;text-decoration:none;font-weight:600}.compat-field-imagify .imagify-datas-actions-links{max-width:300px}.misc-pub-imagify .imagify-datas-actions-links{border-top:2px solid #f2f2f2;padding-bottom:5px}.compat-field-imagify .imagify-datas-actions-links a,.misc-pub-imagify .imagify-datas-actions-links a{font-size:10px;float:left;width:50%}.media-sidebar .compat-field-imagify .imagify-datas-actions-links a,.submitbox .misc-pub-imagify .imagify-datas-actions-links a{display:block;width:auto;float:none}.column-imagify_optimized_file .imagify-datas-actions-links a{margin:0 .7em;padding-left:15px}.imagify-datas-actions-links a:only-child{float:none;width:auto}.imagify-datas-details.is-open+.imagify-datas-actions-links{border-top-color:rgba(0,0,0,.075)}.imagify-datas-actions-links .dashicons{position:absolute;left:0;top:4px;width:12px;margin-right:2px;font-size:11px}.imagify-title>h1{padding:0}.imagify-title-right{display:table;float:right;margin-top:-10px}.imagify-title-right p{margin:0}.imagify-title-right a{font-weight:700;text-decoration:none}.imagify-title-right>div{display:table-cell;vertical-align:middle}.imagify-title-right .dashicons-arrow-down-alt2{vertical-align:-4px;margin-left:2px}@media (max-width:1200px){.imagify-bulk .imagify-title{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.imagify-title-right{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;margin-top:20px}}.imagify-account,.imagify-account-link{padding-right:15px}.imagify-sep-v{width:1px;background:rgba(255,255,255,.2)}.imagify-credit-left{position:relative;min-width:280px;padding-left:15px}.imagify-meteo-icon{display:inline-block;height:38px;vertical-align:middle;margin-right:10px}.imagify-user-plan{color:#40b1d0}@media (max-width:630px){.imagify-title-right,.imagify-title-right>div{display:block;width:auto}.imagify-title-right>div{margin-top:10px;max-width:100%}.imagify-credit-left{padding-left:0}}.imagify-meteo-title.imagify-meteo-title{color:#FFF;font-size:17px}.imagify-space-left{display:inline-block;min-height:38px;min-width:245px;vertical-align:middle}.imagify-space-left>p{color:#FFF}#wp-admin-bar-imagify-profile [class^=imagify-bar-],[class^=imagify-bar-]{position:relative;height:15px;width:100%;background:#60758D;color:#FFF;font-size:10px}.base-transparent{background:0 0}[class^=imagify-bar-].right-outside-number{-webkit-box-sizing:border-box;box-sizing:border-box;padding-right:45px}.right-outside-number .imagify-barnb{display:block;margin-right:-45px;text-align:right;font-weight:700;line-height:15px}#wp-admin-bar-imagify-profile .imagify-progress-value,.imagify-progress-value{position:absolute;top:0;right:0;left:0;bottom:0;text-align:center;line-height:13px;font-weight:700}#wp-admin-bar-imagify-profile .imagify-progress,.imagify-progress{height:15px}.imagify-progress{-webkit-transition:width .3s;-o-transition:width .3s;transition:width .3s}.imagify-bar-positive .imagify-progress{background:#8CC152}.imagify-bar-positive .imagify-barnb{color:#8CC152}.imagify-bar-negative .imagify-progress{background:#73818C}.imagify-bar-negative .imagify-barnb{color:#73818C}.imagify-bar-neutral .imagify-progress{background:#F5A623}.imagify-space-left .imagify-bar-negative .imagify-progress{background:#D0021B}#wpadminbar #wp-admin-bar-imagify-profile *{line-height:1.5;white-space:initial}#wpadminbar #wp-admin-bar-imagify .ab-submenu{padding-bottom:0}#wpadminbar #wp-admin-bar-imagify-profile .ab-item{height:auto;padding:0 13px}#wpadminbar #wp-admin-bar-imagify-profile{min-width:200px;padding:15px 0 10px;margin-top:.7em;background:#222}#wp-admin-bar-imagify .dashicons{font-family:dashicons;font-size:18px;vertical-align:middle;margin:0 5px 0 0}#wp-admin-bar-imagify .button-text{display:inline-block;vertical-align:middle}#wp-admin-bar-imagify .imagify-abq-row{display:table;width:100%}#wp-admin-bar-imagify .imagify-abq-row+.imagify-abq-row{margin-top:.75em}#wp-admin-bar-imagify .imagify-abq-row>*{display:table-cell}#wp-admin-bar-imagify-profile .imagify-meteo-icon{padding-right:7px}#wp-admin-bar-imagify-profile .imagify-meteo-icon img{width:37px}#wp-admin-bar-imagify-profile .imagify-meteo-title{font-size:17px}#wp-admin-bar-imagify-profile .imagify-meteo-subs{color:#72889F}#wpadminbar #wp-admin-bar-imagify-profile strong{font-weight:700}#wpadminbar #wp-admin-bar-imagify-profile .imagify-user-plan,#wpadminbar #wp-admin-bar-imagify-profile a{padding:0;color:#40B1D0}#wpadminbar #wp-admin-bar-imagify-profile .imagify-account-link{display:table}#wpadminbar #wp-admin-bar-imagify-profile .imagify-account-link>*{display:table-cell}#wpadminbar #wp-admin-bar-imagify-profile .imagify-space-left{max-width:210px;min-width:210px;width:210px}#wpadminbar #wp-admin-bar-imagify-profile .imagify-space-left p{font-size:12px}#wp-admin-bar-imagify-profile .imagify-error,#wp-admin-bar-imagify-profile .imagify-warning{padding:10px;margin:0 -13px -13px}#wp-admin-bar-imagify-profile .imagify-error p+p,#wp-admin-bar-imagify-profile .imagify-warning p+p{margin-top:.5em}#wp-admin-bar-imagify-profile .imagify-error p+p+p,#wp-admin-bar-imagify-profile .imagify-warning p+p+p,.imagify-list-infos li+li{margin-top:1em}#wpadminbar #wp-admin-bar-imagify-profile .btn-ghost,.btn-ghost{display:inline-block;height:auto;padding:7px 10px;border:1px solid #FFF;text-align:center;background:0 0;color:#FFF;border-radius:3px;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}#wpadminbar #wp-admin-bar-imagify-profile .btn-ghost:focus,#wpadminbar #wp-admin-bar-imagify-profile .btn-ghost:hover,.btn-ghost:focus,.btn-ghost:hover{background:#FFF;color:#888}.imagify-list-infos{max-width:100%;width:415px}.imagify-info-block,.imagify-list-infos li{position:relative;padding:10px;padding-left:42px;background:#D9E4EB;border-radius:4px;line-height:1.6}.imagify-list-infos .imagify-alt.imagify-alt{background:#8BA7B5;color:#FFF;font-weight:700}.imagify-info-block:before,.imagify-list-infos li:before{content:"";position:absolute;left:13px;top:14px;height:16px;width:16px;border:1px solid #46b1ce;border-radius:10px}.imagify-info-block:after,.imagify-list-infos li:after{content:"i";position:absolute;left:20px;top:13px;font-style:italic;color:#46b1ce}.imagify-cell .imagify-info-block{padding-top:0}.imagify-cell .imagify-info-block:after{top:6px}.imagify-cell .imagify-info-block:before{top:7px}.imagify-list-infos .imagify-alt:after,.imagify-list-infos .imagify-alt:before{color:#fff;border-color:#fff}.imagify-sub-title.imagify-sub-title{font-size:23px;background:#FFF;color:#2E3243;border-left:1px solid #D9D9D9;border-right:1px solid #D9D9D9;font-weight:lighter}.imagify-sub-title .icon-bulk{margin-right:10px;vertical-align:middle}.imagify-sub-title .title-text{display:inline-block;line-height:1;vertical-align:middle}.imagify-bulk .imagify-settings-section{border:1px solid #D9D9D9;border-top:0;background:#F2F5F7;color:#4A4A4A}.imagify-bulk .imagify-settings-section h3,.imagify-bulk .imagify-settings-section li,.imagify-bulk .imagify-settings-section p{color:#4A4A4A}.imagify-bulk .imagify-settings-section h3{margin-bottom:2em}.imagify-title .imagify-tooltips{position:absolute;top:100%;left:0}.imagify-tooltips .icon-round{float:left;display:inline-block;width:28px;height:28px;border:1px solid #FFF;margin-right:8px;margin-bottom:8px;font-size:17px;font-style:italic;line-height:29px;font-weight:700;text-align:center;border-radius:50%}.imagify-tooltips .tooltip-content{display:block;position:relative;max-width:250px;padding:7px 15px 8px;background:#2e3242;color:#FFF;font-size:10px;border-radius:3px}.imagify-tooltips.right .tooltip-content{margin-left:12px}.imagify-tooltips.bottom .tooltip-content{margin-top:4px}.imagify-inline-options label .tooltip-content{position:absolute;left:0;right:0;top:100%;text-transform:none;font-size:10px;letter-spacing:0;text-align:center}.imagify-ac-rt-big,.imagistatus{text-transform:uppercase;font-weight:700}.imagify-tooltips .tooltip-content:after{content:"";position:absolute}.imagify-tooltips.right .tooltip-content:after{top:16px;left:-6px;border-right:8px solid #2e3242;border-top:6px solid transparent;border-bottom:6px solid transparent}.imagify-tooltips.bottom .tooltip-content:after{top:-5px;left:50%;margin-left:-3px;border-bottom:6px solid #2e3242;border-left:6px solid transparent;border-right:6px solid transparent}.imagify-space-tooltips .tooltip-content{max-width:280px;margin-top:20px;margin-left:0;padding:5px 15px;font-size:13px;background:#40B1D0;-webkit-box-shadow:0 3px 0 #338EA6;box-shadow:0 3px 0 #338EA6}.imagify-space-tooltips .tooltip-content:after{top:-14px;left:50%;margin-left:-7px;border:0;border-bottom:15px solid #40B1D0;border-left:15px solid transparent;border-right:15px solid transparent}.tooltip-content.tooltip-table{display:table;width:100%}.tooltip-content.tooltip-table>*{display:table-cell;vertical-align:middle}.tooltip-content .cell-icon{width:28px}.tooltip-content .cell-icon .icon{margin-bottom:0}.tooltip-content .cell-text{padding:5px 10px 5px 0;line-height:1.3}.tooltip-content .cell-sep{width:1px;background:rgba(255,255,255,.4)}.tooltip-content .cell-cta{padding-left:10px}.tooltip-content .cell-cta a{display:block;color:#FFF;width:100%;height:100%;white-space:nowrap}.imagify-number-you-optimized .number{display:table-cell;padding-right:15px;font-size:36px;font-weight:700;line-height:1.1;vertical-align:middle;white-space:nowrap}.imagify-number-you-optimized .text{display:table-cell;vertical-align:middle;overflow:hidden;font-size:12px}.imagify-number-you-optimized .text br{display:none}.imagify-number-you-optimized>p{display:table}.imagify-number-you-optimized{padding-bottom:.85em;margin-bottom:1.35em;overflow:hidden;border-bottom:1px solid rgba(0,0,0,.05)}.imagify-bars p{font-weight:700;font-size:12px;margin-bottom:0}.imagify-bars+.imagify-number-you-optimized{border-bottom:0;padding-top:.85em}.imagify-bars+.imagify-number-you-optimized p{color:#46b1ce}.imagify-bulk-table{margin-top:2em;max-height:600px;max-height:60vh;overflow:auto}.imagify-ac-report-text,.imagiuploaded{overflow:hidden}.imagify-bulk-table table{width:100%;border-spacing:0;border-collapse:collapse;border:1px solid #D3D3D3}.imagify-bulk-table td{padding:8px 15px}.imagify-bulk-table thead th,.imagify-bulk-table thead tr{background:#2E3242}.imagify-bulk-table tfoot th,.imagify-bulk-table tfoot tr{background:#73818C}.imagify-bulk-table thead th{padding:14px 15px;text-align:left;color:#F2F5F7;font-weight:700;font-size:14px}.imagify-bulk-table tfoot td{padding:14px 15px;color:#F9FAFA}.imagify-bulk-table tbody td,.imagify-bulk-table tbody tr{background:#FFF}.imagify-bulk-table tbody tr:nth-child(odd),.imagify-bulk-table tbody tr:nth-child(odd) td{background:#F2F5F7}.imagify-bulk-table .imagify-row-progress{display:none}.imagify-bulk-table .imagify-row-progress,.imagify-bulk-table .imagify-row-progress td{height:15px;padding:0}.imagify-bulk-table .imagify-no-uploaded-yet td{height:200px;font-size:17px;letter-spacing:.1em;word-spacing:.12em;vertical-align:middle;text-transform:uppercase;font-weight:700;text-align:center;color:#999;background-color:#FFF}.imagify-row-complete{padding:35px 20px;margin-top:2em;background:#8BC34A;color:#FFF;text-shadow:0 0 2px rgba(0,0,0,.1)}.imagify-row-complete .imagify-ac-chart{margin-top:3px}.imagify-row-complete p{color:#FFF;margin:0}@-webkit-keyframes congrate{0%{opacity:0;-webkit-transform:scale(1)}50%{-webkit-transform:scale(1.05);opacity:1}100%{-webkit-transform:scale(1);opacity:1}}​ @keyframes congrate{0%{opacity:0;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05);opacity:1}100%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);opacity:1}}.imagify-row-complete.done{-webkit-animation:congrate .5s ease-in-out;animation:congrate .5s ease-in-out}.imagify-all-complete{margin:1.5em 0}.imagify-all-complete>div{display:inline-block;vertical-align:middle}.imagify-ac-report{min-width:310px}.imagify-ac-chart{width:46px;height:46px;float:left;margin:0 20px 0 10px}.imagify-ac-report-text p{line-height:1.3}.imagify-ac-rt-big{font-size:24px;letter-spacing:.15em;word-spacing:.15em}.imagify-ac-share{text-align:right}.imagify-ac-share-content{display:inline-block;padding:10px 15px;background:rgba(255,255,255,.2)}.imagify-ac-share-content>*{display:inline-block;vertical-align:middle}.imagify-bulk-table .imagify-ac-share-content p{margin-right:5px}.imagify-share-networks,.imagify-share-networks li{margin:0}.imagify-share-networks li{display:inline-block}.imagify-share-networks a{display:inline-block;vertical-align:-7px;margin:0 5px;text-decoration:none;color:#FFF}.imagify-cell-filename{max-width:200px}.imagify-cell-status{max-width:145px}.imagify-cell-status .dashicons-warning{margin-right:2px}.imagify-cell-thumbnails{max-width:120px}td.imagify-cell-filename{-o-text-overflow:clip;text-overflow:clip;white-space:nowrap;overflow:hidden}.imagify-bulk-table td.imagify-cell-totaloriginal{padding-right:78px}.imagifilename,.imagiuploaded{display:inline-block;vertical-align:middle}.imagifilename{font-size:12px}.imagiuploaded{width:33px;height:33px;margin-right:5px;margin-left:-8px;background:url(../images/upload-image.png) no-repeat;background-size:cover}.imagiuploaded img{max-widht:100%;height:auto}.imagistatus{color:#8CA6B3}.status-compressing{color:#46B1CE}.status-error{color:#CE0B24}.status-warning{color:#f5a623}.status-complete{color:#8CC152}.imagify-error{background:#D0021B;color:#FFF}#wpadminbar .imagify-warning *,.imagify-warning{background:#f5a623;color:#FFF;text-shadow:0 0 2px rgba(0,0,0,.2)}.imagify-bulk-table .imagify-cell-thumbnails{text-align:center}.imagify-cell-percentage,.imagify-cell-savings{color:#46B1CE;font-weight:700}.imagify-cell-optimized{font-weight:700}.imagify-cell-totaloriginal{text-align:right}.imagify-modal .h2,.imagify-modal .h3{font-weight:400;letter-spacing:.075em;text-align:center}.dashicons.rotate{-webkit-animation:icon-rotate 2.6s infinite linear;animation:icon-rotate 2.6s infinite linear}.dashicons-admin-generic{-webkit-transform-origin:48.75% 51.75%;-ms-transform-origin:48.75% 51.75%;transform-origin:48.75% 51.75%}.imagify-modal{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.js .imagify-modal{display:none;position:fixed;top:0;right:0;bottom:0;left:0;background-color:#1F2332;background-color:rgba(31,35,50,.95);z-index:99999}.imagify-modal-content{-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;width:800px;max-width:95%;max-height:90vw;overflow:auto;padding:20px 25px;margin:1em auto;background:#FFF;-webkit-box-shadow:1px 1px 4px rgba(0,0,0,.7);box-shadow:1px 1px 4px rgba(0,0,0,.7);border-radius:3px}#imagify-visual-comparison .imagify-modal-content,.imagify-visual-comparison .imagify-modal-content{max-width:1400px;background:0 0;padding:5px;-webkit-box-shadow:none;box-shadow:none;border-radius:0}.imagify-modal .h2{margin:.5em 0;color:#8ba6b4;font-size:24px}.imagify-modal .h3{color:#40b1d0;font-size:18px}.text-justify{text-align:justify}.imagify-modal .close-btn{display:none;visibility:hidden;position:absolute;right:20px;top:20px;font-size:1.2em;border:0;background:0 0;border-radius:0;cursor:pointer}.imagify-modal .close-btn i{margin-left:-2px}.imagify-modal .close-btn:focus,.imagify-modal .close-btn:hover{color:#40b1d0}.js .imagify-modal .close-btn{display:block;visibility:visible}.js .imagify-iframe-viewing .close-btn{display:none}#imagify-visual-comparison .close-btn,.imagify-visual-comparison .close-btn{top:50px;right:5px;width:33px;height:33px;padding:1px 0 0 2px;border:1px solid #F2F2F2;color:#F2F2F2;line-height:19px;text-align:center;border-radius:50%}.imagify-visual-comparison .close-btn,.wp_attachment_image #imagify-visual-comparison .close-btn{top:0}.imagify-visual-comparison .imagify-modal-content,.wp_attachment_image #imagify-visual-comparison .imagify-modal-content{padding-top:40px}.imagify-modal .imagify-comparison-title{font-size:28px;margin-bottom:1em;color:#F2F2F2;text-align:left}.imagify-modal .imagify-comparison-title .twentytwenty-duo-buttons{position:static;margin:0 10px 0 15px}.imagify-comparison-title .twentytwenty-duo-buttons button{float:none;padding:6px 12px;font-size:16px;text-transform:none;border:1px solid #40B1D0;color:#889;letter-spacing:0}.imagify-comparison-title .twentytwenty-duo-buttons button:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}.imagify-comparison-title .twentytwenty-duo-buttons .selected{border:1px solid #40B1D0;color:#FFF;background:#40B1D0}.imagify-comparison-levels{margin:15px 0;overflow:hidden}.imagify-comparison-levels div{display:none;min-width:175px;font-size:11px}.imagify-comparison-levels .imagify-chart,.imagify-comparison-levels .imagify-chart-container{width:25px;float:none;margin:0}.imagify-visual-comparison .imagify-chart-container canvas{width:15px!important;height:15px!important;margin-right:5px}.imagify-c-level.go-left{float:left}.imagify-c-level.go-right{float:right}.imagify-c-level.go-left,.imagify-c-level.go-right{display:table}.imagify-c-level .imagify-c-level-row{display:table-row;margin:0;color:#FFF}.imagify-c-level-row>span{display:table-cell;padding:2px 0}.imagify-c-level-row .value{text-align:right;padding-left:5px}.imagify-c-level-row .value.level{color:#40b1d0}.imagify-c-level-row .value.size{color:#8bc34a;font-weight:700}.imagify-c-level-row .value .imagify-chart{top:1px}@-webkit-keyframes icon-rotate{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes icon-rotate{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.imagify-menu-bar-img{margin-top:1em}.imagify-modal .loader{position:absolute;top:50%;left:50%;margin:-32px 0 0 -32px;opacity:0;visibility:hidden;-webkit-transition:opacity .4s;-o-transition:opacity .4s;transition:opacity .4s}.imagify-modal .loading .loader{visibility:visible;opacity:1}.imagify-settings .imagify-visual-comparison-text{margin-top:1em;color:#40b1d0;font-weight:700}.imagify-border-styled,.imagify-flex-table,.imagify-modal-cols,.imagify-offer-header,.imagify-payment-modal .imagify-modal-content,.imagify-tabs{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.imagify-analyzing .imagify-numbers-calc,.imagify-modal-content.imagify-iframe-viewing .imagify-modal-sidebar,.imagify-modal-content.imagify-success-viewing .imagify-modal-sidebar,.imagify-modal-section .imagify-loader,.imagify-modal-section.imagify-analyzing .imagify-modal-cols,.imagify-numbers-notcalc{display:none}.imagify-border-styled,.imagify-modal-cols{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.imagify-payment-modal{text-align:center;color:#7A8996}.imagify-payment-modal *{-webkit-box-sizing:border-box;box-sizing:border-box}.imagify-modal-loader{position:absolute;top:0;left:0;right:0;bottom:0;background:url(../images/loader-balls.svg) center no-repeat #fff;z-index:10}.imagify-payment-modal .imagify-modal-content{width:980px;max-width:100%;min-width:925px;padding:0}.imagify-modal-content.imagify-iframe-viewing{width:980px;height:672px;overflow:hidden}.imagify-iframe-viewing #imagify-payment-process-view{width:980px;height:668px}.imagify-payment-modal .imagify-modal-main{width:70%}.imagify-iframe-viewing .imagify-modal-main{width:auto}.imagify-payment-modal .imagify-modal-content.imagify-success-viewing{min-width:auto;width:450px;min-height:300px}.imagify-success-viewing .imagify-modal-main{width:100%}.imagify-payment-modal .imagify-modal-sidebar{width:30%;padding:15px 20px;background:#1F2332;color:#FFF}.imagify-modal-section{padding:0 25px}.imagify-modal-section.section-gray{margin:0 0 1em;padding:10px 25px 15px;background:#F6F7FB}.imagify-tabs-contents .section-gray{padding:8px 25px 10px}.imagify-modal-section .imagify-modal-title:first-child{margin-top:1em;margin-bottom:1.5em}.imagify-modal-section.section-gray .imagify-modal-title{margin-top:.5em;margin-bottom:.5em}.imagify-modal-title{font-size:1.8em}.imagify-analyzing .imagify-numbers-notcalc,.imagify-modal-section.imagify-analyzing .imagify-loader{display:block}.imagify-modal-section .imagify-loader{margin:2em auto}.imagify-border-styled{width:200px;margin:0 auto;color:#8BC34A;font-weight:700;font-size:.925em}.imagify-big-number,.imagify-payment-modal strong{font-weight:700;color:#4A4A4A}.imagify-big-number{font-size:3.7em;margin:-3px 0;line-height:1}.imagify-border-styled:after,.imagify-border-styled:before{content:"";height:1px;background:rgba(0,0,0,.1);-ms-flex-preferred-size:40px;flex-basis:40px}.imagify-border-styled:before{margin-right:5px}.imagify-border-styled:after{margin-left:5px}.imagify-col{-ms-flex-preferred-size:50%;flex-basis:50%}.imagify-modal .imagify-cols{padding:0 20px}.imagify-payment-modal .imagify-iconed{margin:1.5em 5em 1.5em 0}.imagify-iconed{position:relative;text-align:left;padding-left:42px;margin-right:15px;font-weight:500}.imagify-iconed .dashicons,.imagify-iconed .icon{position:absolute;font-size:2em;left:0;top:2px;color:#40B1D0}.imagify-payment-modal .close-btn{top:10px;right:10px;width:24px;height:24px;padding:2px 0 0 4.5px;color:#FFF;background:#40B1D0;border-radius:50%;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-payment-modal .close-btn i{margin-left:-3.5px;margin-top:-.5px}.imagify-payment-modal .close-btn:hover{background:#F6F7FB}.imagify-offer-line{margin-top:1.5em}.imagify-offer-line+.imagify-offer-line{margin-top:.75em}.imagify-offer-header{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0 0 0 15px;border-radius:4px 4px 0 0;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-offer-header.imagify-offer-header.imagify-offer-header .imagify-inline-options label:last-child{border-radius:0 4px 0 0}.imagify-offer-header .imagify-inline-options{width:auto}.imagify-offer-title{font-weight:700;margin:0}.imagify-offer-header,.imagify-offer-header .imagify-inline-options input[type=radio]:not(:checked)+label{background:#E5EBEF}.imagify-offer-onetime .imagify-offer-header{padding-top:8px;padding-bottom:8px}.imagify-offer-onetimes>div{padding-top:15px;padding-bottom:15px}.imagify-offer-header .imagify-inline-options input[type=radio]:checked+label,.imagify-offer-header .imagify-inline-options input[type=radio]:not(:checked)+label{position:relative;padding:7px 30px;font-size:1em;letter-spacing:.05em;color:inherit;-webkit-box-shadow:0 0 0;box-shadow:0 0 0;border-radius:0}.imagify-offer-header .imagify-inline-options input[type=radio]:checked+label{background:#F6F7FB}.imagify-2-free{position:absolute;bottom:100%;left:0;right:0;padding:2px 10px;margin-bottom:8px;font-size:.8em;letter-spacing:0;text-transform:none;text-align:center;color:#FFF;background:#10121A;border-radius:2px}.imagify-2-free:after{content:"";position:absolute;left:50%;bottom:-3px;margin-left:-3px;border-top:3px solid #10121A;border-left:3px solid transparent;border-right:3px solid transparent}.imagify-2-free.imagify-b-right{bottom:auto;left:100%;right:-100%;margin-bottom:0;margin-left:8px}.imagify-2-free.imagify-b-right:after{left:-3px;bottom:auto;top:50%;margin-top:-3px;margin-left:0;border-right:3px solid #10121A;border-top:3px solid transparent;border-bottom:3px solid transparent;border-left:0}.imagify-2-free.imagify-b-bottom{bottom:-100%;left:0;right:0;margin-top:8px}.imagify-2-free.imagify-b-bottom:after{top:-3px;bottom:auto;border-bottom:3px solid #10121A;border-left:3px solid transparent;border-right:3px solid transparent;border-top:0}.imagify-offer-content{text-align:left;background:#F6F7FB;border-radius:0 0 4px 4px;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-offer-onetime .imagify-offer-content{padding:10px 0}div.imagify-col-checkbox{position:relative;width:25.5%;padding-top:10px;padding-bottom:7px}.imagify-col-checkbox label{display:block;padding-left:55px!important}.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:checked,.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:not(:checked){position:absolute;top:50%;left:6px;margin:-8px 0 0}.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:checked+label:before,.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:not(:checked)+label:before{margin:0;top:-2px;left:6px;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-offer-by,.imagify-offer-size{-webkit-transition:all .275s;-o-transition:all .275s}.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:checked+label:after,.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:not(:checked)+label:after{top:1px;left:13px}.imagify-offer-size{font-size:30px;color:#2E3243;font-weight:700;transition:all .275s}.imagify-offer-by{font-size:10px;transition:all .275s}.imagify-approx{display:none;font-size:11px;line-height:1.2;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}div.imagify-col-price{width:35%}.imagify-flex-table .imagify-price-block{padding-left:0;padding-right:0}.imagify-offer-monthlies .imagify-price-block,.imagify-offer-monthly .imagify-flex-table .imagify-price-block{padding-top:0}.imagify-flex-table .imagify-price-complement{padding-right:0;font-size:10px;font-weight:700}.imagify-price-block,.imagify-price-discount{white-space:nowrap}.imagify-price-block span,.imagify-price-discount span{display:inline-block;vertical-align:middle}.imagify-price-discount.imagify-price-discount{position:relative;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;padding-top:15px;font-weight:700;width:70px}.imagify-price-discount:before{content:"";position:absolute;top:25px;width:62%;height:2px;background:#2E3243;-webkit-transform:rotate(-15deg);-ms-transform:rotate(-15deg);transform:rotate(-15deg)}.imagify-offer-onetimes .imagify-price-discount:before{width:100%}.imagify-price-discount-dollar{color:#2E3243}.imagify-price-discount-number{color:#8BA6B4}.imagify-offer-selected .imagify-price-discount-number{color:#FFF}span.imagify-dollars{color:#1F2332;font-size:18px;font-weight:700;vertical-align:-2px}.imagify-offer-onetime .imagify-col-price{padding-top:0}.imagify-offer-onetime .imagify-dollars{vertical-align:-1px}.imagify-price-big,.imagify-price-mini{color:#40B1D0;font-weight:700}.imagify-price-big{font-size:36px}span.imagify-price-mini{font-size:18px;vertical-align:2px}span.imagify-price-by{font-size:10px;color:#1F2332;vertical-align:-13px;text-indent:-27px}.imagify-col-other-actions{width:18.5%;text-align:right}.imagify-col-other-actions a{font-size:11px}.imagify-offer-selected,.imagify-offer-selected .imagify-col-other-actions a,.imagify-offer-selected .imagify-offer-size,.imagify-offer-selected .imagify-offer-title,.imagify-offer-selected .imagify-price-big,.imagify-offer-selected .imagify-price-complement,.imagify-offer-selected .imagify-price-mini{color:#FFF}.imagify-offer-selected .imagify-offer-header,.imagify-offer-selected .imagify-offer-header .imagify-inline-options input[type=radio]:not(:checked)+label{background:#338EA6}.imagify-offer-selected .imagify-offer-content,.imagify-offer-selected .imagify-offer-header .imagify-inline-options input[type=radio]:checked+label{background:#40B1D0}.imagify-offer-selected .imagify-checkbox.imagify-checkbox:checked+label:before,.imagify-offer-selected .imagify-checkbox.imagify-checkbox:not(:checked)+label:before{border-color:#FFF;background:#40B1D0}.imagify-offer-selected .imagify-offer-by{color:#2E3243}.imagify-enough-free .imagify-not-enough-title,.imagify-enough-title{display:none}.imagify-enough-free .imagify-enough-title{display:block}.imagify-submit-line{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:2em 0;text-align:left}.imagify-coupon-section{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.imagify-coupon-section p{margin:0;line-height:1.3}.imagify-coupon-text{width:200px;max-width:100%;padding-right:15px}.imagify-coupon-loader{display:none}.imagify-coupon-text.checking{text-align:right}.imagify-coupon-text.checking .imagify-coupon-loader{display:inline}.imagify-coupon-text.checking label{display:none}.imagify-coupon-input{position:relative}.imagify-coupon-input input{position:relative;z-index:1}[id=imagify-coupon-validate].button-secondary{position:absolute;top:1px;right:3px;bottom:2px;-webkit-box-shadow:none;box-shadow:none;padding:4px 10px;z-index:0;-webkit-transition:-webkit-transform .275s;-o-transition:transform .275s;transition:transform .275s;transition:transform .275s,-webkit-transform .275s}.imagify-canbe-validate [id=imagify-coupon-validate]{-webkit-transform:translateX(45px);-ms-transform:translateX(45px);transform:translateX(45px)}.imagify-modal-section+.imagify-modal-promotion{margin-top:-1em}.imagify-modal-promotion{position:relative;overflow:hidden;display:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:15px 25px;background:#604D90;text-shadow:0 0 3px rgba(0,0,0,.3)}.imagify-modal-promotion.active{display:-webkit-box;display:-ms-flexbox;display:flex}[id=imagify-pricing-tab-onetime] .imagify-modal-promotion{margin-bottom:4em}.imagify-modal-promotion:before{content:"\f488";position:absolute;top:28px;left:8%;font-family:dashicons;font-size:90px;color:#8476A9;text-shadow:none}.imagify-modal-promotion p{position:relative;margin:.2em 0;color:#FFF}.imagify-promo-title{-ms-flex-preferred-size:100%;flex-basis:100%;text-transform:uppercase;font-size:20px;font-weight:700;letter-spacing:.125em}.imagify-until-date{-ms-flex-preferred-size:200px;flex-basis:200px;text-align:right}.imagify-until-date strong{color:#FFF}.imagify-submit-line button{font-size:16px}input.imagify-coupon-code{padding:10px;border:2px solid #7A8996;font-size:.875em;font-weight:700;border-radius:3px}.validated.imagify-coupon-section .imagify-coupon-text,.validated.imagify-coupon-section strong{color:#8BC34A}.validated.imagify-coupon-section .imagify-coupon-code{color:#8BC34A;border-color:#8BC34A}.invalid.imagify-coupon-section .imagify-coupon-text,.invalid.imagify-coupon-section strong{color:#d0021b}.invalid.imagify-coupon-section .imagify-coupon-code{color:#d0021b;border-color:#d0021b}.imagify-footer-lines{width:500px;max-width:100%;margin:2em auto 2.5em;font-size:.85em;line-height:1.5}.imagify-year-selected .imagify-switch-my .imagify-yearly{display:block}.imagify-month-selected .imagify-switch-my .imagify-yearly,.imagify-year-selected .imagify-switch-my .imagify-monthly{display:none}.imagify-month-selected .imagify-switch-my .imagify-monthly{display:block}.imagify-flex-table{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.imagify-flex-table>*{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;padding:7px 15px}div.imagify-col-details{width:22%;padding-left:25px}.imagify-col-details p{margin:0}.imagify-pricing-table{margin:0 20px}.imagify-pricing-table .imagify-offer-line{padding:.6em 0;border:2px solid #E8EEF0;text-align:left;border-radius:3px}.imagify-pricing-table .imagify-offer-line:first-child{margin-top:.75em}.imagify-pricing-table .imagify-offer-line.imagify-offer-selected:first-child{margin-top:1.75em}.imagify-pricing-table .imagify-offer-line+.imagify-offer-line{margin-top:-2px}.imagify-pricing-table .imagify-col-other-actions{width:20.5%}.imagify-pricing-table .imagify-approx{margin-left:0;line-height:.5;margin-bottom:1em}.imagify-pricing-table .imagify-offer-selected{-webkit-transform:scale(1.03);-ms-transform:scale(1.03);transform:scale(1.03);background:#40B1D0;border-width:0}.imagify-pricing-table .imagify-offer-selected .imagify-approx{color:#FFF}.imagify-pricing-table .imagify-button-secondary{padding:3px 20px;-webkit-box-shadow:none;box-shadow:none;text-transform:uppercase;font-size:12px;letter-spacing:.025em}.imagify-offer-selected.imagify-offer-selected .imagify-button-secondary{border:2px solid #FFF;background:#40B1D0;-webkit-box-shadow:none;box-shadow:none;text-shadow:none!important}.imagify-offer-selected.imagify-offer-selected .imagify-button-secondary:focus,.imagify-offer-selected.imagify-offer-selected .imagify-button-secondary:hover{background:#FFF;color:#40B1D0}.imagify-col .imagify-special-needs{margin-left:25px}.imagify-special-needs strong{font-size:25px;font-weight:700;color:#40B1D0}.imagify-special-needs span{display:block;font-size:12px;margin-top:-.5em}div.imagify-col-price{position:relative}.imagify-recommend{display:none;position:absolute;left:-20px;bottom:100%;padding:0;margin-bottom:8px;color:#1F2332;font-weight:700;font-style:italic}.imagify-offer-selected .imagify-recommend,.imagify-tab-content.imagify-current{display:block}[class*=imagify-onetime-] .imagify-recommend{left:65px;margin-bottom:20px}.imagify-recommend:before{content:"";position:absolute;top:7px;left:-35px;width:29px;height:30px;background:url(../images/icon-arrow-choice.png) 0 no-repeat;background-size:contain}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2/1),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.imagify-recommend:before{background-image:url(../images/icon-arrow-choice.svg)}}.imagify-offer-line[class*=imagify-onetime-]{padding:0;margin:.3em 0 0}.imagify-offer-line.imagify-offer-line[class*=imagify-onetime-]:first-child{margin-top:2em}.imagify-offer-line[class*=imagify-onetime-]+.imagify-offer-line{margin-top:.5em}.imagify-offer-selected.imagify-offer-line[class*=imagify-onetime-]{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);border-width:2px}.imagify-offer-line[class*=imagify-onetime-] .imagify-col-details{position:relative;overflow:hidden;width:21%;background:#1F2332;color:#FFF}.imagify-offer-selected.imagify-offer-line[class*=imagify-onetime-] .imagify-col-details{background:#338EA6}.imagify-offer-line[class*=imagify-onetime-] .imagify-col-details:before{content:"";position:absolute;bottom:0;right:25px;width:75px;height:54px;background:url(../images/icon-pack.png)}.imagify-offer-line[class*=imagify-onetime-] .imagify-col-other-actions{width:30%}.imagify-offer-line[class*=imagify-onetime-] .imagify-approx,.imagify-offer-line[class*=imagify-onetime-] .imagify-offer-size{color:#FFF}.imagify-offer-line[class*=imagify-onetime-] .imagify-offer-size{font-size:24px}.imagify-offer-line[class*=imagify-onetime-] .imagify-approx{font-size:12px}.imagify-offer-line[class*=imagify-onetime-] .imagify-price-block{padding-left:10px}.imagify-offer-line[class*=imagify-onetime-] .imagify-dollars{vertical-align:middle}.imagify-offer-line[class*=imagify-onetime-] .imagify-price-big{vertical-align:-5px}.imagify-offer-line[class*=imagify-onetime-] .imagify-price-mini{vertical-align:7px}.imagify-tabs{margin-bottom:0;list-style:none;background:#E5EBEF}.imagify-modal-content .imagify-tabs{margin:1em 0 0}.imagify-tab{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;width:50%;margin:0;font-size:23px}.imagify-tab a{display:block;padding:15px 10px;color:inherit;text-decoration:none}.imagify-tab a:focus{-webkit-box-shadow:none;box-shadow:none;outline:0;color:#40B1D8}.imagify-tab.imagify-current a{background:#F6F7FB}.imagify-tab-content{display:none}.imagify-tab-content .imagify-modal-section:first-child{margin-top:0}.imagify-modal-sidebar-content,.imagify-payment-modal .imagify-modal-sidebar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.imagify-modal-sidebar-content{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}p.imagify-modal-sidebar-title{margin-top:5px;padding-right:40px;font-size:18px;color:#FFF}.imagify-modal-testimony{margin-top:1em}.imagify-modal-testimony+.imagify-modal-testimony{margin-top:2em}@media (max-height:620px){.imagify-modal-testimony+.imagify-modal-testimony{display:none}}.imagify-modal-testimony-person{display:table;width:100%}.imagify-modal-testimony-person>*{display:table-cell;vertical-align:middle}.imagify-modal-avatar{width:114px;line-height:0}.imagify-modal-avatar img{border:2px solid #FFF;border-radius:50%;width:96px;height:96px}.imagify-modal-identity a{text-decoration:none;font-weight:700}.imagify-modal-identity a:first-child{font-size:13px}.imagify-modal-identity a:first-child+a{display:block;font-size:10px;color:#7A8996}.imagify-modal-testimony-content p{font-size:13px;font-style:italic;line-height:1.7;color:#7A8996}.imagify-modal-sidebar-trust{margin-top:auto;padding-top:1.5em}.imagify-modal-sidebar-trust p{margin:0;font-weight:700;font-size:12px;line-height:1.7}.imagify-modal-sidebar-trust p img{margin-right:3px;vertical-align:-2px}.imagify-modal-sidebar-trust p+p{font-size:11px}.imagify-cart{text-align:left}.imagify-cart .imagify-cart-list{border-top:1px solid rgba(122,137,150,.2);border-bottom:1px solid rgba(122,137,150,.2)}.imagify-cart .imagify-cart-label{margin-bottom:.5em;font-size:10px;color:#2E3243}.imagify-cart-list p{margin:0;font-weight:700}.imagify-cart-item{margin:.4em 0}.imagify-cart .imagify-cart-suggestion{margin-top:-.3em}.imagify-cart-suggestion a,.imagify-cl-description p{font-size:10px}.imagify-remove-from-cart{border:0;padding:0;width:14px;height:14px;line-height:13px;border-radius:50%;background:#40B1D0;cursor:pointer;-webkit-transition:background .3s;-o-transition:background .3s;transition:background .3s}.imagify-remove-from-cart i:before{position:relative;top:-6px;left:-3px;font-size:13px;color:#FFF}.imagify-remove-from-cart:focus,.imagify-remove-from-cart:hover{background:#D0021B}.imagify-cart .imagify-cl-remove{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;width:45px}.imagify-cart .imagify-cl-name{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;width:200px}.imagify-cart .imagify-cl-description{-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start;padding-top:10px}.imagify-cart .imagify-cl-price{text-align:right}#imagify-payment-iframe{width:980px;height:672px;background:url(../images/loader-balls.svg) 50% 50% no-repeat #f6f7fb}.imagify-success-view{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%}.imagify-success-view p{font-weight:700;font-size:16px}.imagify-cart-emptied-item{margin:.3em auto;padding:6px 20px;background:#E6EBEF;border-radius:20px}.imagify-cart-emptied-item.imagify-cart-emptied-item p{font-weight:700}.imagify-cart-emptied-item a{color:#40b1d0;float:right;font-weight:700}
1
+ .imagify-cell,.imagify-cell.va-top,.va-top .imagify-cell{vertical-align:top}#imagify-overview-chart-legend,.imagify-oh,body.imagify-modal-is-open{overflow:hidden}.imagify-start{float:left}.imagify-end{float:right}.imagify-txt-start.imagify-txt-start.imagify-txt-start{text-align:left}.imagify-txt-center.imagify-txt-center.imagify-txt-center{text-align:center}.imagify-txt-end.imagify-txt-end.imagify-txt-end{text-align:right}.imagify-mt1.imagify-mt1{margin-top:1em}.imagify-mb1.imagify-mb1{margin-bottom:1em}.imagify-mr1.imagify-mr1{margin-right:1em}.imagify-ml2.imagify-ml2{margin-left:2em}.imagify-mr2.imagify-mr2{margin-right:2em}.imagify-pl0.imagify-pl0.imagify-pl0{padding-left:0}.imagify-pr1.imagify-pr1{padding-right:1em}.imagify-clear{clear:both}.imagify-clearfix:after,.imagify-inline-options:after{content:"";display:table;clear:both}.imagify-count.imagify-count{counter-reset:num}.imagify-count .imagify-count-title{font-weight:700}.imagify-default-settings{color:#73818c;font-weight:400}.imagify-count .imagify-count-title:before{counter-increment:num 1;content:counter(num) ". "}.imagify-table{display:table;width:100%}.imagify-cell{display:table-cell;padding:10px}.imagify-bulk-submit .imagify-cell{padding-top:0}.imagify-plugins-error{overflow:hidden;padding-left:20px;list-style-type:disc}.imagify-plugins-error li{width:300px;line-height:30px}@media (max-width:570px){.imagify-plugins-error li{width:auto}}.imagify-notice-dismiss.notice-dismiss{text-decoration:none}.imagify-spinner{display:inline-block;width:20px;height:20px;margin-right:5px;vertical-align:middle;background:url(../images/spinner.gif) 0 0/20px 20px no-repeat rgba(0,0,0,0);opacity:.7}.spinner.imagify-hidden{width:0;margin:4px 0 0}.misc-pub-section.misc-pub-imagify h4{font-size:14px;margin-top:5px;margin-bottom:0}.imagify-sweet-alert button{margin-top:17px!important;height:45px!important;letter-spacing:3px;text-transform:uppercase!important;border-radius:3px!important;background-color:#40b1d0!important;-webkit-box-shadow:0 3px 0 #338ea6!important;box-shadow:0 3px 0 #338ea6!important}.imagify-sweet-alert button.loading{border-radius:100%!important;height:40px!important;padding:0!important;-webkit-box-shadow:none!important;box-shadow:none!important}.imagify-sweet-alert button.swal2-cancel{background:#777!important;-webkit-box-shadow:0 3px 0 #444!important;box-shadow:0 3px 0 #444!important}.imagify-sweet-alert-signup .sa-confirm-button-container{width:40%}.imagify-sweet-alert-signup button{width:100%;padding:0!important}.imagify-sweet-alert .la-ball-fall,.imagify-sweet-alert .sa-input-error:after,.imagify-sweet-alert .sa-input-error:before{top:25%!important}#wpwrap{-webkit-transition:all .4s;-o-transition:all .4s;transition:all .4s}.stop-scrolling #wpwrap{-webkit-filter:blur(2px);filter:blur(2px)}.stop-scrolling #wpwrap #wpadminbar{top:-32px}.imagify-primary.imagify-primary.imagify-primary{color:#40b1d0}.imagify-secondary.imagify-secondary.imagify-secondary{color:#8cc152}#imagify-check-api-container{font-weight:700}#imagify-check-api-container .dashicons{font-size:25px}#imagify-check-api-container .dashicons-no:before{color:#f06e57;vertical-align:-1px}#imagify-check-api-container .dashicons-yes:before{color:#8BC34A;vertical-align:-1px}.imagify-valid{color:#8BC34A}.imagify-chart{width:33.33%;position:relative}.imagify-doughnut-legend{margin-top:38px;list-style:none}.imagify-doughnut-legend li{display:block;padding-left:30px;position:relative;margin-bottom:15px;border-radius:5px;padding:3px 8px 2px 31px;font-size:14px;font-weight:600;cursor:default;-webkit-transition:background-color .2s ease-in-out;-o-transition:background-color .2s ease-in-out;transition:background-color .2s ease-in-out}.imagify-doughnut-legend li span{display:block;position:absolute;left:0;top:0;width:25px;height:25px;border-radius:50%}.button-text,.imagify-bulk-info p{display:inline-block}.imagify-chart{float:left;margin-bottom:20px}td .imagify-chart{float:none;margin-bottom:0;top:4px}.imagify-chart-container{position:relative;width:180px;float:left;margin-right:20px}.imagify-global-optim-phrase{width:180px;padding-top:20px;font-size:14px;font-weight:700;text-align:center}.imagify-total-percent{color:#46b1ce}td .imagify-chart-container{width:18px;height:18px;float:none;margin-right:10px}.imagify-chart-percent{position:absolute;left:0;right:0;top:50%;margin-top:-14px;text-align:center;font-size:55px;font-weight:700;color:#46B1CE}.imagify-chart-percent span{font-size:20px;vertical-align:super}.media_page_imagify-bulk-optimization .notice,.settings_page_imagify .notice,body[class*="_imagify-ngg-bulk-optimization"] .notice{margin-right:20px;margin-left:2px}.media_page_imagify-bulk-optimization .media-item,body[class*="_imagify-ngg-bulk-optimization"] .media-item{margin:0}.media_page_imagify-bulk-optimization .media-item .progress,body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress{float:none;width:100%;margin:0;background:#1F2331;-webkit-box-shadow:0;box-shadow:0;border-radius:0}.media_page_imagify-bulk-optimization .media-item .percent,body[class*="_imagify-ngg-bulk-optimization"] .media-item .percent{width:auto;padding:0 5px;line-height:1.85;font-size:12px}.media_page_imagify-bulk-optimization .media-item .percent,.media_page_imagify-bulk-optimization .media-item .progress,body[class*="_imagify-ngg-bulk-optimization"] .media-item .percent,body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress{text-align:right}.media_page_imagify-bulk-optimization .media-item .progress .bar,body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress .bar{width:1px;height:22px;margin-top:0;background:#46B1CE;border-radius:0;overflow:visible;-webkit-transition:width .5s;-o-transition:width .5s;transition:width .5s}.imagify-settings .button,.imagify-settings a,.imagify-settings input,.imagify-welcome .button,.imagify-welcome a,.imagify-weolcome input{-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-settings a{color:#40b1d0}.imagify-options-title{padding-bottom:.5em;border-bottom:3px solid #F2F2F2;font-size:13px;font-weight:500;text-transform:uppercase;letter-spacing:.025em;color:#40b1d0}.imagify-settings,.imagify-settings p,.imagify-settings th{color:#5F758E}@media (max-width:782px){.imagify-settings .form-table th{padding-top:2em;padding-bottom:.5em}}.imagify-settings .form-table td{vertical-align:top}.button .dashicons,.button-text,.imagify-button-primary.imagify-button-primary .dashicons,.imagify-button-secondary.imagify-button-secondary .dashicons,.imagify-button.imagify-button .dashicons,.imagify-notice .button .dashicons,.imagify-settings .button .dashicons,.imagify-welcome .button .dashicons{vertical-align:middle}.imagify-settings .form-table th span{cursor:pointer}.imagify-middle th{padding-top:35px}.imagify-button-primary.imagify-button-primary,.imagify-button-secondary.imagify-button-secondary,.imagify-button.imagify-button,.imagify-notice .button,.imagify-settings .button,.imagify-welcome .button{height:auto;padding:8px 20px;border:0;font-size:14px;font-weight:600;-webkit-box-shadow:0 3px 0 rgba(0,0,0,.15);box-shadow:0 3px 0 rgba(0,0,0,.15);border-radius:3px;cursor:pointer;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-notice .button-mini{padding:2px 10px;font-size:13px}.button-primary.button-mini{padding:2px 10px}.imagify-settings .button.button-mini-flat{padding:3px 6px 5px;font-size:12px;-webkit-box-shadow:none!important;box-shadow:none!important;line-height:1.2}.imagify-settings .button.button-mini-flat:focus,.imagify-settings .button.button-mini-flat:hover{-webkit-box-shadow:none!important;box-shadow:none!important}.imagify-button-ghost.imagify-button-ghost,.imagify-title .button-ghost.button-ghost{padding:2px 9px;border:1px solid #40B1D0;font-size:12px;font-weight:400;color:#40B1D0;background:0 0;-webkit-box-shadow:none;box-shadow:none}.imagify-button-ghost.imagify-button-ghost:focus,.imagify-button-ghost.imagify-button-ghost:hover,.imagify-title .button-ghost.button-ghost:focus,.imagify-title .button-ghost.button-ghost:hover{border-color:transparent;color:#000;background:#40B1D0}.imagify-button-ghost.imagify-button-ghost:focus,.imagify-button-ghost.imagify-button-ghost:hover{color:#FFF}.imagify-button-medium.imagify-button-medium{text-transform:uppercase;letter-spacing:.1em;padding:3px 10px;font-weight:700}.imagify-button-medium.imagify-button-ghost{border-width:2px}.button .dashicons{margin-right:5px}.imagify-button-primary.imagify-button-primary,.imagify-settings .button-primary.button-primary,.imagify-welcome .button-primary.button-primary{background:#40B1D0;color:#FFF;-webkit-box-shadow:0 3px 0 rgba(51,142,166,1);box-shadow:0 3px 0 rgba(51,142,166,1);text-shadow:0 -1px 1px #006799,1px 0 1px #006799,0 1px 1px #006799!important}.imagify-button-secondary.imagify-button-secondary{background:#8BC34A;color:#FFF;-webkit-box-shadow:0 3px 0 #6F9C3B;box-shadow:0 3px 0 #6F9C3B;text-shadow:0 -1px 1px #6F9C3B,1px 0 1px #6F9C3B,0 1px 1px #6F9C3B!important}.imagify-button-primary.imagify-button-primary:focus,.imagify-button-primary.imagify-button-primary:hover,.imagify-settings .button-primary:focus,.imagify-settings .button-primary:hover,.imagify-welcome .button-primary:focus,.imagify-welcome .button-primary:hover{background:#338ea6;-webkit-box-shadow:0 3px 0 #1f7a92;box-shadow:0 3px 0 #1f7a92}.imagify-button-secondary.imagify-button-secondary:focus,.imagify-button-secondary.imagify-button-secondary:hover{background:#6F9C3B;color:#FFF}.imagify-button-light.imagify-button-light{background:#FFF;color:#4a4a4a;-webkit-box-shadow:0 2px 0 rgba(0,0,0,.2);box-shadow:0 2px 0 rgba(0,0,0,.2)}.imagify-button-light.imagify-button-light:focus,.imagify-button-light.imagify-button-light:hover{color:#FFF;background:rgba(0,0,0,.2)}.imagify-section-positive .imagify-button-light{color:#709A41}.imagify-button.imagify-button-big{font-size:15px;padding:11px 30px}.imagify-button-big .dashicons{font-size:1.45em;margin-right:6px;margin-left:-4px}.imagify-info,.imagify-logo{vertical-align:top}#imagify-bulk-action{padding:11px 20px}.media-frame-content .imagify-button-primary,.wp_attachment_image .imagify-button-primary{float:left;padding:0 10px 1px;margin:0 5px 2px 0;font-size:13px;line-height:26px;-webkit-box-shadow:0 3px 0 rgba(51,142,166,1);box-shadow:0 3px 0 rgba(51,142,166,1)}.imagify-settings input[type=text]{color:#4A4A4A;font-weight:600;-webkit-box-shadow:none;box-shadow:none}.imagify-settings div.submit.submit{padding-left:235px;padding-top:40px}.imagify-settings p.submit{float:left;margin-top:0}.imagify-settings p.submit .button{margin:0 5px}@media (max-width:850px){.imagify-settings div.submit{padding-left:0}.imagify-settings p.submit{text-align:center}}.imagify-title.imagify-title{position:relative;padding:30px 50px;font-size:23px;background:#2E3243;color:#FFF}.imagify-settings .imagify-title+.imagify-notice{margin:0;border-right:1px solid #D9D9D9;padding-top:15px;padding-bottom:15px}.imagify-section,.imagify-settings div.submit,.imagify-sub-header,.imagify-sub-title.imagify-sub-title{margin:0;padding:20px;background:#F2F5F7}.imagify-section-positive,.imagify-sub-title.imagify-sub-title{padding-left:40px}.imagify-section-positive{background:#8cc152;color:#FFF}.imagify-section-positive p{color:#FFF}.imagify-section-gray{background:#D9E4EB}.imagify-section-gray .imagify-count-title{color:#4a4a4a}.imagify-section p:first-child{margin-top:0}.imagify-section p:last-child{margin-bottom:0}p.imagify-section-title.imagify-section-title{font-size:20px;margin-top:-.3em;margin-bottom:-.6em}.imagify-bulk-info{margin:1em 1em 1em 5px;-webkit-transition:margin .3s;-o-transition:margin .3s;transition:margin .3s}@media (max-width:850px){.imagify-bulk-info{margin:1em}}.imagify-bulk-info p{text-align:left;width:400px;max-width:100%;font-weight:700}@media (min-width:1500px){.imagify-settings div.submit{display:table;width:100%}.imagify-settings div.submit>*{display:table-cell;vertical-align:middle}.imagify-bulk-info{padding:0 25px;text-align:right}}.imagify-settings div.submit{margin-top:2em;padding:20px 0}.imagify-notice .imagify-rate-us .stars,.imagify-sub-header .form-table{margin:0}.imagify-sub-header th{text-align:right}.imagify-sub-header td,.imagify-sub-header th{padding-top:0;padding-bottom:0}[for=api_key]{padding-top:5px}.imagify-notice .imagify-rate-us.imagify-rate-us{position:relative;bottom:0;right:0;text-align:left}.imagify-rate-us.imagify-rate-us{position:absolute;bottom:50%;right:20px;text-align:right;margin-bottom:-2.4em;color:#FFF}.imagify-rate-us a{color:#40B1D0}.imagify-rate-us .stars{display:inline-block;margin:2px 0 0 10px;text-decoration:none;letter-spacing:.2em;vertical-align:-1px}.imagify-rate-us .stars .dashicons:before{font-size:18px}.imagify-rate-us a:focus,.imagify-rate-us a:hover{color:#FEE102}@media (max-width:1220px){.imagify-rate-us.imagify-rate-us{position:static;margin-bottom:0;text-align:left}.imagify-rate-us.imagify-rate-us br{display:none}.imagify-rate-us .stars{display:block;margin-left:0}}.imagify-rkt-notice.imagify-rkt-notice{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;-ms-grid-row-align:center;align-items:center;padding:10px 45px 10px 0;border:0;-webkit-box-shadow:none;box-shadow:none;color:#FFF;background:#412355}.media_page_imagify-bulk-optimization .imagify-rkt-notice{margin-left:2px;margin-right:20px}@media (max-width:782px){.media_page_imagify-bulk-optimization .imagify-rkt-notice{margin-left:0;margin-right:12px}}.imagify-rkt-notice .imagify-cross{position:absolute;right:8px;top:50%;width:22px;height:22px;padding:0;margin-top:-11px;background:0 0;color:#FD7300;border-radius:50%;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-rkt-notice .imagify-cross .dashicons{position:relative;top:2px;left:1px;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-rkt-notice .imagify-cross:hover{background:#FFF}.imagify-rkt-notice .imagify-cross:hover .dashicons{color:#412355}.imagify-rkt-notice .imagify-rkt-coupon,.imagify-rkt-notice .imagify-rkt-cta,.imagify-rkt-notice .imagify-rkt-logo{-ms-flex-negative:0;flex-shrink:0}.imagify-rkt-notice .imagify-rkt-logo{width:150px!important;text-align:center;padding:0 25px 0 30px;line-height:.8}.imagify-rkt-notice .imagify-rkt-msg{width:100%!important;padding:0 15px;font-size:14px;line-height:1.6}.imagify-rkt-notice .imagify-rkt-coupon{width:150px!important;padding:0 15px}.imagify-rkt-notice .imagify-rkt-coupon-code{padding:5px 10px;font-size:23px;font-weight:700;border:1px dashed #F7A933;color:#F7A933}.imagify-rkt-notice .imagify-rkt-cta{width:250px!important;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-preferred-size:200px;flex-basis:200px}.imagify-rkt-notice .button.button{position:relative;top:-1px;height:auto;font-weight:600;font-size:14px;-webkit-box-shadow:0 4px 0 #B27A27;box-shadow:0 4px 0 #B27A27;border:0;padding:9px 18px;background:#F7A933;text-shadow:1px 1px 1px rgba(0,0,0,.2)}@media (max-width:880px){.imagify-rkt-notice{-ms-flex-wrap:wrap;flex-wrap:wrap}.imagify-rkt-notice .imagify-rkt-cta,.imagify-rkt-notice .imagify-rkt-logo,.imagify-rkt-notice .imagify-rkt-msg{text-align:left;padding:5px 15px}.imagify-cross.imagify-cross{top:8px;margin-top:0}.imagify-rkt-notice .imagify-cross .dashicons{top:1px}}.imagify-settings-section{padding:10px 20px}.imagify-welcome .imagify-settings-section,[id=imagify-settings]{border:1px solid #D9D9D9;border-top:0 none;background:#FFF}.imagify-br{line-height:2}.imagify-important{color:#F5A623}.imagify-info,.imagify-info a{color:#40B1D0;font-size:12px}.imagify-info{position:relative;display:inline-block;padding-left:25px}.imagify-info .dashicons{position:absolute;left:0;top:-1px}.imagify-visual-label,label+.imagify-info,label+.imagify-options-line{display:inline-block;max-width:70%;margin-left:15px;margin-top:2px!important;-webkit-transition:opacity .3s;-o-transition:opacity .3s;transition:opacity .3s}.imagify-visual-label{vertical-align:-5px}label[for=imagify_sizes_full]+.imagify-info{vertical-align:middle}.imagify-settings.imagify-settings [type=checkbox]:not(:checked)+label .imagify-visual-label,.imagify-settings.imagify-settings [type=checkbox]:not(:checked)+label+.imagify-options-line{opacity:.5}.imagify-settings.imagify-settings [type=checkbox]:checked+label .imagify-visual-label,.imagify-settings.imagify-settings [type=checkbox]:checked+label+.imagify-options-line{opacity:1}.imagify-checkbox-marged{max-width:500px;margin-left:45px}.imagify-checkbox.imagify-checkbox:checked,.imagify-checkbox.imagify-checkbox:not(:checked),.imagify-settings.imagify-settings [type=checkbox]:checked,.imagify-settings.imagify-settings [type=checkbox]:not(:checked){opacity:.01}.imagify-checkbox.imagify-checkbox:checked:focus,.imagify-checkbox.imagify-checkbox:not(:checked):focus,.imagify-settings.imagify-settings [type=checkbox]:checked:focus,.imagify-settings.imagify-settings [type=checkbox]:not(:checked):focus{-webkit-box-shadow:none!important;box-shadow:none!important;outline:0!important;border:0!important}.imagify-checkbox.imagify-checkbox:checked+label,.imagify-checkbox.imagify-checkbox:not(:checked)+label,.imagify-settings [type=checkbox]:checked+label,.imagify-settings [type=checkbox]:not(:checked)+label{position:relative;padding-left:6px;cursor:pointer;vertical-align:top}.imagify-checkbox.imagify-checkbox:checked+label:before,.imagify-checkbox.imagify-checkbox:not(:checked)+label:before,.imagify-settings [type=checkbox]:checked+label:before,.imagify-settings [type=checkbox]:not(:checked)+label:before{content:'';position:absolute;left:0;top:0;width:28px;height:28px;margin:0 0 0 -24px;border:2px solid #8BA6B4;background:#FFF;border-radius:4px}.imagify-checkbox.imagify-checkbox:checked+label:after,.imagify-checkbox.imagify-checkbox:not(:checked)+label:after,.imagify-settings [type=checkbox]:checked+label:after,.imagify-settings [type=checkbox]:not(:checked)+label:after{content:"✓";position:absolute;font-size:1.4em;top:3px;left:-16px;-webkit-transition:all .2s;-o-transition:all .2s;transition:all .2s}.imagify-checkbox.imagify-checkbox[disabled]:checked+label:before,.imagify-checkbox.imagify-checkbox[disabled]:not(:checked)+label:before,.imagify-settings [type=checkbox][disabled]:checked+label:before,.imagify-settings [type=checkbox][disabled]:not(:checked)+label:before{border-color:#ccc;background:#ddd}.imagify-checkbox.imagify-checkbox:not(:checked)+label:after,.imagify-settings [type=checkbox]:not(:checked)+label:after{opacity:0;-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0)}.imagify-checkbox.imagify-checkbox:checked+label:after,.imagify-settings [type=checkbox]:checked+label:after{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}input[id^=imagify_sizes_]:checked+label{font-weight:700}.medium.imagify-checkbox:checked+label:before,.medium.imagify-checkbox:not(:checked)+label:before{width:22px;height:22px;border-width:1.5px;border-radius:2px;margin-top:0}.medium.imagify-checkbox:checked+label:after,.medium.imagify-checkbox:not(:checked)+label:after{font-size:1.1em;left:-17px;top:3px}.imagify-settings .mini[type=checkbox]:checked+label:before,.imagify-settings .mini[type=checkbox]:not(:checked)+label:before,.mini.imagify-checkbox:checked+label:before,.mini.imagify-checkbox:not(:checked)+label:before{width:15px;height:15px;border-width:1px;border-radius:2px;margin-top:0}.imagify-settings .mini[type=checkbox]:checked+label:after,.imagify-settings .mini[type=checkbox]:not(:checked)+label:after,.mini.imagify-checkbox:checked+label:after,.mini.imagify-checkbox:not(:checked)+label:after{font-size:.9em;left:-21px;top:1px}.imagify-checkbox.imagify-checkbox:checked:focus+label:before,.imagify-checkbox.imagify-checkbox:not(:checked):focus+label:before,.imagify-settings [type=checkbox]:checked:focus+label:before,.imagify-settings [type=checkbox]:not(:checked):focus+label:before{border-style:dotted;border-color:#40b1d0}.imagify-inline-options{position:relative;display:table;width:100%;max-width:600px;border-collapse:collapse}.imagify-small-options{width:300px;margin:1em auto .5em;background:#338EA6;border-radius:4px}.imagify-inline-options input[type=radio]:checked,.imagify-inline-options input[type=radio]:not(:checked){position:absolute;left:5px;top:5px;display:none}.imagify-inline-options input[type=radio]:checked+label,.imagify-inline-options input[type=radio]:not(:checked)+label{position:relative;display:table-cell;padding:13px 10px;text-align:center;font-weight:600;font-size:16px;text-transform:uppercase;letter-spacing:.1em;color:#FFF;background:#2E3243;border-left:1px solid rgba(255,255,255,.2);-webkit-box-shadow:0 -3px 0 rgba(0,0,0,.1) inset,inset -1px 0 0 rgba(255,255,255,.2);box-shadow:0 -3px 0 rgba(0,0,0,.1) inset,inset -1px 0 0 rgba(255,255,255,.2);z-index:2;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-small-options input[type=radio]:checked+label,.imagify-small-options input[type=radio]:not(:checked)+label{padding:8px 10px;font-size:13px;color:#FFF;-webkit-box-shadow:none;box-shadow:none;border-left:0}.imagify-bulk-submit .imagify-inline-options input[type=radio]:checked+label,.imagify-bulk-submit .imagify-inline-options input[type=radio]:not(:checked)+label{margin-bottom:1.75em}.imagify-inline-options input[type=radio]:checked+label:first-of-type,.imagify-inline-options input[type=radio]:not(:checked)+label:first-of-type{border-radius:3px 0 0 3px}.imagify-inline-options input[type=radio]:checked+label:last-of-type,.imagify-inline-options input[type=radio]:not(:checked)+label:last-of-type{border-radius:0 3px 3px 0}.imagify-inline-options input[type=radio]:checked+label{background:#8BC34A}.imagify-small-options input[type=radio]:not(:checked)+label{background:#338EA6;color:rgba(255,255,255,.4)}.imagify-small-options input[type=radio]:checked+label{background:#40B1D0}.imagify-inline-options .imagify-info{margin-top:15px}.imagify-btn-info{display:block;font-size:.7em;letter-spacing:0;line-height:1;text-transform:none}.imagify-datas-more-action a,a.btn-rocket{text-transform:uppercase;text-decoration:none}#describe-resize-larger input{width:5em}.imagify-cols:after{content:"";display:table;clear:both}.imagify-col{float:left;width:50%}.imagify-main{float:left;width:70%}.imagify-sidebar{float:right;width:28%;max-width:300px}.imagify-sidebar-section{border:1px solid #BBB;background:#FFF}.imagify-sidebar-section+.imagify-sidebar-section{margin-top:2em}@media (max-width:820px){.imagify-main,.imagify-sidebar{float:none;width:auto}.imagify-settings{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.imagify-sidebar{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;max-width:none;margin-left:0;margin-top:25px}.wp-media-products{text-align:center}.wp-media-products li{display:inline-block;width:100%;max-width:276px}}@media (min-width:1400px){.imagify-main{width:74%}}.imagify-sidebar-title{display:block;padding:20px 15px;border-bottom:1px solid #BBB;font-size:14px;font-weight:700;color:#23282d;background:#F2F5F7}.imagify-sidebar-title img{vertical-align:top;margin-right:5px}.imagify-sidebar .wp-media-products{margin-top:0;margin-bottom:-.5em}.imagify-sidebar .wp-media-products .links{display:block;padding:85px 25px 24px;text-align:center;background-color:#2E3243;background-size:contain;background-repeat:no-repeat;background-position:50% 0;text-decoration:none}.imagify-sidebar .wp-media-products .links p{margin:1.5em auto;color:#FFF}.imagify-sidebar .wp-media-products .wprocket-link{background-image:-o-linear-gradient(top,rgba(59,30,78 ,0),rgba(59,30,78 ,0) 130px,rgba(59 ,30 ,78 ,1) 210px),url(../images/sidebar-wp-rocket.jpg);background-image:linear-gradient(to bottom,rgba(59,30,78 ,0),rgba(59,30,78 ,0) 130px,rgba(59 ,30 ,78 ,1) 210px),url(../images/sidebar-wp-rocket.jpg);background-color:#3B1E4E;background-repeat:repeat-x,no-repeat}.imagify-sidebar-content{padding:10px 20px}.imagify-mark-styled{display:inline-block;padding:1px 2px 1px 4px;line-height:1.3;font-weight:700;background:#F7A933;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotateZ(-2deg) rotateX(-10deg) skewX(-2deg) skewY(-3deg);transform:rotateZ(-2deg) rotateX(-10deg) skewX(-2deg) skewY(-3deg);text-shadow:1px 1px 0 rgba(0,0,0,.2)}.imagify-mark-styled span{display:inline-block;-webkit-transform:rotateZ(2deg) rotateX(10deg) skewX(2deg) skewY(3deg);transform:rotateZ(2deg) rotateX(10deg) skewX(2deg) skewY(3deg)}.imagify-discount-code,a.btn-rocket{display:block;text-shadow:1px 1px 0 rgba(0,0,0,.2);font-weight:700}.imagify-discount-code{margin:.35em 0 .5em;font-size:2em;letter-spacing:.05em;text-align:center}.imagify-big-text{font-size:15px;font-weight:700}.imagify-big-text strong{font-size:20px}a.btn-rocket{font-size:1.15em;padding:12px;background:#F7A933;-webkit-box-shadow:0 3px 0 #D69626;box-shadow:0 3px 0 #D69626;border-radius:3px;color:#FFF}a.btn-rocket:focus,a.btn-rocket:hover{background:#ff8c00;-webkit-box-shadow:0 3px 0 #ff8c00;box-shadow:0 3px 0 #ff8c00}.imagify-welcome{margin:30px 20px 0 0}.imagify-welcome .baseline{display:inline-block;margin:.2em 0 0 2em;font-size:17px}.imagify-welcome .imagify-logo{vertical-align:middle}.imagify-welcome-remove{position:absolute;top:50%;right:15px;margin-top:-8px;color:#FFF;text-decoration:none}.imagify-columns{overflow:hidden;padding:15px 0;counter-reset:cols}.imagify-columns [class^=col-]{float:left;-webkit-box-sizing:border-box;box-sizing:border-box}.imagify-columns .col-1-3{width:33.333%;padding-left:28px}.imagify-columns .col-2-3{width:66.666%;padding-left:28px}.imagify-columns .col-1-2{width:50%;padding:0 20px}.imagify-columns .col-overview{padding-left:20px}.imagify-columns .col-informations{width:36.6%;padding-right:30px}.imagify-columns .col-statistics{width:30%}@media (max-width:830px){.imagify-columns [class^=col-]{float:none;margin-bottom:1.5em}.imagify-columns .col-1-2,.imagify-columns .col-1-3{width:auto;padding:0 28px;clear:both;padding-top:1em}}.imagify-columns [class^=col-] img{float:left;margin-right:18px}.imagify-col-content{overflow:hidden}.imagify-col-title{margin:0 0 15px;font-size:23px}.counter .imagify-col-title:before{counter-increment:cols;content:counter(cols) ". ";color:#40B1D0}.imagify-col-desc{color:#5F758E;margin-bottom:2em}.imagify-notice.imagify-notice{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;padding:0;margin:10px 20px 10px 2px;border:0;background:#2E3243;-webkit-box-shadow:none;box-shadow:none;color:#FFF}@media (max-width:782px){.imagify-notice.imagify-notice,.imagify-welcome{margin-right:12px}}@media (max-width:450px){.imagify-notice.imagify-notice{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}.wrap .imagify-notice{margin:5px 15px 2px;position:relative}.imagify-notice-logo{padding:18px 23px;background:#40B1D0}.updated .imagify-notice-logo{background:#8BC34A}.error .imagify-notice-logo{background:#D0021B}.imagify-popin-message{padding:5px 15px;text-align:left}.imagify-popin-message.imagify-error p{color:#FFF}.imagify-notice-title{font-size:15px}.imagify-notice-content{padding:5px 23px}.imagify-notice-content.imagify-notice-content p{margin:.65em 0}.imagify-notice a{color:#40B1D0}.imagify-notice a:focus,.imagify-notice a:hover{color:#FEE102}.imagify-notice code{background:rgba(0,0,0,.4)}.column-imagify_optimized_file.column-imagify_optimized_file{width:300px;text-align:center;vertical-align:middle}.column-imagify_optimized_file>*{max-width:235px;margin:0 auto}ul.imagify-datas-list.imagify-datas-list{margin:0 auto;color:#555;font-size:10px}.compat-field-imagify .label{vertical-align:top}.compat-field-imagify ul.imagify-datas-list{margin-top:7px;font-size:11px}ul.imagify-datas-list .big{font-size:12px;color:#40B1D0}.imagify-data-item{overflow:hidden}.imagify-data-item .imagify-chart{display:inline-block;top:1px;width:20px;vertical-align:middle;margin-bottom:0}li.imagify-data-item{clear:both;margin-bottom:2px}ul.imagify-datas-list .imagify-data-item span.data,ul.imagify-datas-list .imagify-data-item strong{float:left;width:50%;-webkit-box-sizing:border-box;box-sizing:border-box}ul.imagify-datas-list .imagify-data-item span.data{text-align:left;padding-right:5px}.compat-field-imagify .imagify-datas-list .imagify-data-item .data{width:130px;text-align:left;font-weight:700}.media-sidebar .imagify-datas-list .imagify-data-item .data,.media-sidebar .imagify-datas-list .imagify-data-item strong{width:auto;float:none}ul.imagify-datas-list .imagify-data-item strong{text-align:left;padding-left:5px}.imagify-datas-more-action.imagify-datas-more-action{margin:.4em auto;background:-webkit-gradient(linear,left top,left bottom,from(transparent),color-stop(49%,transparent),color-stop(50%,rgba(0,0,0,.075)),color-stop(58%,rgba(0,0,0,.075)),color-stop(58%,transparent),to(transparent));background:-o-linear-gradient(top,transparent,transparent 49%,rgba(0,0,0,.075) 50%,rgba(0,0,0,.075) 58%,transparent 58%,transparent);background:linear-gradient(to bottom,transparent,transparent 49%,rgba(0,0,0,.075) 50%,rgba(0,0,0,.075) 58%,transparent 58%,transparent)}.imagify-datas-more-action a{display:inline-block;padding:0 5px;background:#40B1D0;color:#FFF;font-size:9px;font-weight:700;line-height:1.9}.imagify-datas-more-action a.is-open{background:#555}.imagify-datas-more-action a.is-open .dashicons{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.imagify-datas-more-action a .dashicons{font-size:14px;vertical-align:middle;line-height:.8}.imagify-datas-more-action .the-text,.imagify-datas-more-action a .dashicons:before{line-height:20px;vertical-align:middle}.imagify-datas-more-action .the-text{display:inline-block;height:20px}ul.imagify-datas-details.imagify-datas-details{margin:.7em auto}.imagify-datas-details strong{color:#40B1D0}.imagify-datas-details .original{color:#555}.imagify-datas-actions-links{overflow:hidden;border-top:2px solid transparent;padding-top:5px;font-size:8px}.imagify-datas-actions-links a{position:relative;display:inline-block;padding-left:17px;text-decoration:none;font-weight:600}.compat-field-imagify .imagify-datas-actions-links{max-width:300px}.misc-pub-imagify .imagify-datas-actions-links{border-top:2px solid #f2f2f2;padding-bottom:5px}.compat-field-imagify .imagify-datas-actions-links a,.misc-pub-imagify .imagify-datas-actions-links a{font-size:10px;float:left;width:50%}.media-sidebar .compat-field-imagify .imagify-datas-actions-links a,.submitbox .misc-pub-imagify .imagify-datas-actions-links a{display:block;width:auto;float:none}.column-imagify_optimized_file .imagify-datas-actions-links a{margin:0 .7em;padding-left:15px}.imagify-datas-actions-links a:only-child{float:none;width:auto}.imagify-datas-details.is-open+.imagify-datas-actions-links{border-top-color:rgba(0,0,0,.075)}.imagify-datas-actions-links .dashicons{position:absolute;left:0;top:4px;width:12px;margin-right:2px;font-size:11px}.imagify-title>h1{padding:0}.imagify-title-right{display:table;float:right;margin-top:-10px}.imagify-title-right p{margin:0}.imagify-title-right a{font-weight:700;text-decoration:none}.imagify-title-right>div{display:table-cell;vertical-align:middle}.imagify-title-right .dashicons-arrow-down-alt2{vertical-align:-4px;margin-left:2px}@media (max-width:1200px){.imagify-bulk .imagify-title{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.imagify-title-right{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;margin-top:20px}}.imagify-account,.imagify-account-link{padding-right:15px}.imagify-sep-v{width:1px;background:rgba(255,255,255,.2)}.imagify-credit-left{position:relative;min-width:280px;padding-left:15px}.imagify-meteo-icon{display:inline-block;height:38px;vertical-align:middle;margin-right:10px}.imagify-user-plan{color:#40b1d0}@media (max-width:630px){.imagify-title-right,.imagify-title-right>div{display:block;width:auto}.imagify-title-right>div{margin-top:10px;max-width:100%}.imagify-credit-left{padding-left:0}}.imagify-meteo-title.imagify-meteo-title{color:#FFF;font-size:17px}.imagify-space-left{display:inline-block;min-height:38px;min-width:245px;vertical-align:middle}.imagify-space-left>p{color:#FFF}#wp-admin-bar-imagify-profile [class^=imagify-bar-],[class^=imagify-bar-]{position:relative;height:1.5em;width:100%;background:#60758D;color:#FFF;font-size:10px}.base-transparent{background:0 0}[class^=imagify-bar-].right-outside-number{-webkit-box-sizing:border-box;box-sizing:border-box;padding-right:4.5em}.right-outside-number .imagify-barnb{display:block;margin-right:-4.5em;text-align:right;font-weight:700;line-height:1.5}#wp-admin-bar-imagify-profile .imagify-progress-value,.imagify-progress-value{position:absolute;top:0;right:0;left:0;bottom:0;text-align:center;line-height:13px;font-weight:700}#wp-admin-bar-imagify-profile .imagify-progress,.imagify-progress{height:1.5em}.imagify-progress{-webkit-transition:width .3s;-o-transition:width .3s;transition:width .3s}.imagify-bar-positive .imagify-progress{background:#8CC152}.imagify-bar-positive .imagify-barnb{color:#8CC152}.imagify-bar-negative .imagify-progress{background:#73818C}.imagify-bar-negative .imagify-barnb{color:#73818C}.imagify-bar-neutral .imagify-progress{background:#F5A623}.imagify-space-left .imagify-bar-negative .imagify-progress{background:#D0021B}#wpadminbar #wp-admin-bar-imagify-profile *{line-height:1.5;white-space:initial}#wpadminbar #wp-admin-bar-imagify .ab-submenu{padding-bottom:0}#wpadminbar #wp-admin-bar-imagify-profile .ab-item{height:auto;padding:0 13px}#wpadminbar #wp-admin-bar-imagify-profile{min-width:200px;padding:15px 0 10px;margin-top:.7em;background:#222}#wp-admin-bar-imagify .dashicons{font-family:dashicons;font-size:18px;vertical-align:middle;margin:0 5px 0 0}#wp-admin-bar-imagify .button-text{display:inline-block;vertical-align:middle}#wp-admin-bar-imagify .imagify-abq-row{display:table;width:100%}#wp-admin-bar-imagify .imagify-abq-row+.imagify-abq-row{margin-top:.75em}#wp-admin-bar-imagify .imagify-abq-row>*{display:table-cell}#wp-admin-bar-imagify-profile .imagify-meteo-icon{padding-right:7px}#wp-admin-bar-imagify-profile .imagify-meteo-icon img{width:37px}#wp-admin-bar-imagify-profile .imagify-meteo-title{font-size:17px}#wp-admin-bar-imagify-profile .imagify-meteo-subs{color:#72889F}#wpadminbar #wp-admin-bar-imagify-profile strong{font-weight:700}#wpadminbar #wp-admin-bar-imagify-profile .imagify-user-plan,#wpadminbar #wp-admin-bar-imagify-profile a{padding:0;color:#40B1D0}#wpadminbar #wp-admin-bar-imagify-profile .imagify-account-link{display:table}#wpadminbar #wp-admin-bar-imagify-profile .imagify-account-link>*{display:table-cell}#wpadminbar #wp-admin-bar-imagify-profile .imagify-space-left{max-width:210px;min-width:210px;width:210px}#wpadminbar #wp-admin-bar-imagify-profile .imagify-space-left p{font-size:12px}#wp-admin-bar-imagify-profile .imagify-error,#wp-admin-bar-imagify-profile .imagify-warning{padding:10px;margin:0 -13px -13px}#wp-admin-bar-imagify-profile .imagify-error p+p,#wp-admin-bar-imagify-profile .imagify-warning p+p{margin-top:.5em}#wp-admin-bar-imagify-profile .imagify-error p+p+p,#wp-admin-bar-imagify-profile .imagify-warning p+p+p,.imagify-list-infos li+li{margin-top:1em}#wpadminbar #wp-admin-bar-imagify-profile .btn-ghost,.btn-ghost{display:inline-block;height:auto;padding:7px 10px;border:1px solid #FFF;text-align:center;background:0 0;color:#FFF;border-radius:3px;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}#wpadminbar #wp-admin-bar-imagify-profile .btn-ghost:focus,#wpadminbar #wp-admin-bar-imagify-profile .btn-ghost:hover,.btn-ghost:focus,.btn-ghost:hover{background:#FFF;color:#888}.imagify-list-infos{max-width:100%;width:415px}.imagify-info-block,.imagify-list-infos li{position:relative;padding:10px;padding-left:42px;background:#D9E4EB;border-radius:4px;line-height:1.6}.imagify-list-infos .imagify-alt.imagify-alt{background:#8BA7B5;color:#FFF;font-weight:700}.imagify-info-block:before,.imagify-list-infos li:before{content:"";position:absolute;left:13px;top:14px;height:16px;width:16px;border:1px solid #46b1ce;border-radius:10px}.imagify-info-block:after,.imagify-list-infos li:after{content:"i";position:absolute;left:20px;top:13px;font-style:italic;color:#46b1ce}.imagify-cell .imagify-info-block{padding-top:0}.imagify-cell .imagify-info-block:after{top:6px}.imagify-cell .imagify-info-block:before{top:7px}.imagify-list-infos .imagify-alt:after,.imagify-list-infos .imagify-alt:before{color:#fff;border-color:#fff}.imagify-sub-title.imagify-sub-title{font-size:23px;background:#FFF;color:#2E3243;border-left:1px solid #D9D9D9;border-right:1px solid #D9D9D9;font-weight:lighter}.imagify-sub-title .icon-bulk{margin-right:10px;vertical-align:middle}.imagify-sub-title .title-text{display:inline-block;line-height:1;vertical-align:middle}.imagify-bulk .imagify-settings-section{border:1px solid #D9D9D9;border-top:0;background:#F2F5F7;color:#4A4A4A}.imagify-bulk .imagify-settings-section h3,.imagify-bulk .imagify-settings-section li,.imagify-bulk .imagify-settings-section p{color:#4A4A4A}.imagify-bulk .imagify-settings-section h3{margin-bottom:2em}.imagify-title .imagify-tooltips{position:absolute;top:100%;left:0}.imagify-tooltips .icon-round{float:left;display:inline-block;width:28px;height:28px;border:1px solid #FFF;margin-right:8px;margin-bottom:8px;font-size:17px;font-style:italic;line-height:29px;font-weight:700;text-align:center;border-radius:50%}.imagify-tooltips .tooltip-content{display:block;position:relative;max-width:250px;padding:7px 15px 8px;background:#2e3242;color:#FFF;font-size:10px;border-radius:3px}.imagify-tooltips.right .tooltip-content{margin-left:12px}.imagify-tooltips.bottom .tooltip-content{margin-top:4px}.imagify-inline-options label .tooltip-content{position:absolute;left:0;right:0;top:100%;text-transform:none;font-size:10px;letter-spacing:0;text-align:center}.imagify-ac-rt-big,.imagistatus{text-transform:uppercase;font-weight:700}.imagify-tooltips .tooltip-content:after{content:"";position:absolute}.imagify-tooltips.right .tooltip-content:after{top:16px;left:-6px;border-right:8px solid #2e3242;border-top:6px solid transparent;border-bottom:6px solid transparent}.imagify-tooltips.bottom .tooltip-content:after{top:-5px;left:50%;margin-left:-3px;border-bottom:6px solid #2e3242;border-left:6px solid transparent;border-right:6px solid transparent}.imagify-space-tooltips .tooltip-content{max-width:280px;margin-top:20px;margin-left:0;padding:5px 15px;font-size:13px;background:#40B1D0;-webkit-box-shadow:0 3px 0 #338EA6;box-shadow:0 3px 0 #338EA6}.imagify-space-tooltips .tooltip-content:after{top:-14px;left:50%;margin-left:-7px;border:0;border-bottom:15px solid #40B1D0;border-left:15px solid transparent;border-right:15px solid transparent}.tooltip-content.tooltip-table{display:table;width:100%}.tooltip-content.tooltip-table>*{display:table-cell;vertical-align:middle}.tooltip-content .cell-icon{width:28px}.tooltip-content .cell-icon .icon{margin-bottom:0}.tooltip-content .cell-text{padding:5px 10px 5px 0;line-height:1.3}.tooltip-content .cell-sep{width:1px;background:rgba(255,255,255,.4)}.tooltip-content .cell-cta{padding-left:10px}.tooltip-content .cell-cta a{display:block;color:#FFF;width:100%;height:100%;white-space:nowrap}.imagify-number-you-optimized .number{display:table-cell;padding-right:15px;font-size:36px;font-weight:700;line-height:1.1;vertical-align:middle;white-space:nowrap}.imagify-number-you-optimized .text{display:table-cell;vertical-align:middle;overflow:hidden;font-size:12px}.imagify-number-you-optimized .text br{display:none}.imagify-number-you-optimized>p{display:table}.imagify-number-you-optimized{padding-bottom:.85em;margin-bottom:1.35em;overflow:hidden;border-bottom:1px solid rgba(0,0,0,.05)}.imagify-bars p{font-weight:700;font-size:12px;margin-bottom:0}.imagify-bars+.imagify-number-you-optimized{border-bottom:0;padding-top:.85em}.imagify-bars+.imagify-number-you-optimized p{color:#46b1ce}.imagify-bulk-table{margin-top:2em;max-height:600px;max-height:60vh;overflow:auto}.imagify-ac-report-text,.imagiuploaded{overflow:hidden}.imagify-bulk-table table{width:100%;border-spacing:0;border-collapse:collapse;border:1px solid #D3D3D3}.imagify-bulk-table td{padding:8px 15px}.imagify-bulk-table thead th,.imagify-bulk-table thead tr{background:#2E3242}.imagify-bulk-table tfoot th,.imagify-bulk-table tfoot tr{background:#73818C}.imagify-bulk-table thead th{padding:14px 15px;text-align:left;color:#F2F5F7;font-weight:700;font-size:14px}.imagify-bulk-table tfoot td{padding:14px 15px;color:#F9FAFA}.imagify-bulk-table tbody td,.imagify-bulk-table tbody tr{background:#FFF}.imagify-bulk-table tbody tr:nth-child(odd),.imagify-bulk-table tbody tr:nth-child(odd) td{background:#F2F5F7}.imagify-bulk-table .imagify-row-progress{display:none}.imagify-bulk-table .imagify-row-progress,.imagify-bulk-table .imagify-row-progress td{height:15px;padding:0}.imagify-bulk-table .imagify-no-uploaded-yet td{height:200px;font-size:17px;letter-spacing:.1em;word-spacing:.12em;vertical-align:middle;text-transform:uppercase;font-weight:700;text-align:center;color:#999;background-color:#FFF}.imagify-row-complete{padding:35px 20px;margin-top:2em;background:#8BC34A;color:#FFF;text-shadow:0 0 2px rgba(0,0,0,.1)}.imagify-row-complete .imagify-ac-chart{margin-top:3px}.imagify-row-complete p{color:#FFF;margin:0}@-webkit-keyframes congrate{0%{opacity:0;-webkit-transform:scale(1)}50%{-webkit-transform:scale(1.05);opacity:1}100%{-webkit-transform:scale(1);opacity:1}}@keyframes congrate{0%{opacity:0;-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.05);transform:scale(1.05);opacity:1}100%{-webkit-transform:scale(1);transform:scale(1);opacity:1}}.imagify-row-complete.done{-webkit-animation:congrate .5s ease-in-out;animation:congrate .5s ease-in-out}.imagify-all-complete{margin:1.5em 0}.imagify-all-complete>div{display:inline-block;vertical-align:middle}.imagify-ac-report{min-width:310px}.imagify-ac-chart{width:46px;height:46px;float:left;margin:0 20px 0 10px}.imagify-ac-report-text p{line-height:1.3}.imagify-ac-rt-big{font-size:24px;letter-spacing:.15em;word-spacing:.15em}.imagify-ac-share{text-align:right}.imagify-ac-share-content{display:inline-block;padding:10px 15px;background:rgba(255,255,255,.2)}.imagify-ac-share-content>*{display:inline-block;vertical-align:middle}.imagify-bulk-table .imagify-ac-share-content p{margin-right:5px}.imagify-share-networks,.imagify-share-networks li{margin:0}.imagify-share-networks li{display:inline-block}.imagify-share-networks a{display:inline-block;vertical-align:-7px;margin:0 5px;text-decoration:none;color:#FFF}.imagify-cell-filename{max-width:200px}.imagify-cell-status{max-width:145px}.imagify-cell-status .dashicons-warning{margin-right:2px}.imagify-cell-thumbnails{max-width:120px}td.imagify-cell-filename{-o-text-overflow:clip;text-overflow:clip;white-space:nowrap;overflow:hidden}.imagify-bulk-table td.imagify-cell-totaloriginal{padding-right:78px}.imagifilename,.imagiuploaded{display:inline-block;vertical-align:middle}.imagifilename{font-size:12px}.imagiuploaded{width:33px;height:33px;margin-right:5px;margin-left:-8px;background:url(../images/upload-image.png) no-repeat;background-size:cover}.imagiuploaded img{max-widht:100%;height:auto}.imagistatus{color:#8CA6B3}.status-compressing{color:#46B1CE}.status-error{color:#CE0B24}.status-warning{color:#f5a623}.status-complete{color:#8CC152}.imagify-error{background:#D0021B;color:#FFF}#wpadminbar .imagify-warning *,.imagify-warning{background:#f5a623;color:#FFF;text-shadow:0 0 2px rgba(0,0,0,.2)}.imagify-bulk-table .imagify-cell-thumbnails{text-align:center}.imagify-cell-percentage,.imagify-cell-savings{color:#46B1CE;font-weight:700}.imagify-cell-optimized{font-weight:700}.imagify-cell-totaloriginal{text-align:right}.imagify-modal .h2,.imagify-modal .h3{font-weight:400;letter-spacing:.075em;text-align:center}.dashicons.rotate{-webkit-animation:icon-rotate 2.6s infinite linear;animation:icon-rotate 2.6s infinite linear}.dashicons-admin-generic{-webkit-transform-origin:48.75% 51.75%;-ms-transform-origin:48.75% 51.75%;transform-origin:48.75% 51.75%}.imagify-modal{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.js .imagify-modal{display:none;position:fixed;top:0;right:0;bottom:0;left:0;background-color:#1F2332;background-color:rgba(31,35,50,.95);z-index:99999}.imagify-modal-content{-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;width:800px;max-width:95%;max-height:90vw;overflow:auto;padding:20px 25px;margin:1em auto;background:#FFF;-webkit-box-shadow:1px 1px 4px rgba(0,0,0,.7);box-shadow:1px 1px 4px rgba(0,0,0,.7);border-radius:3px}#imagify-visual-comparison .imagify-modal-content,.imagify-visual-comparison .imagify-modal-content{max-width:1400px;background:0 0;padding:5px;-webkit-box-shadow:none;box-shadow:none;border-radius:0}.imagify-modal .h2{margin:.5em 0;color:#8ba6b4;font-size:24px}.imagify-modal .h3{color:#40b1d0;font-size:18px}.text-justify{text-align:justify}.imagify-modal .close-btn{display:none;visibility:hidden;position:absolute;right:20px;top:20px;font-size:1.2em;border:0;background:0 0;border-radius:0;cursor:pointer}.imagify-modal .close-btn i{margin-left:-2px}.imagify-modal .close-btn:focus,.imagify-modal .close-btn:hover{color:#40b1d0}.js .imagify-modal .close-btn{display:block;visibility:visible}.js .imagify-iframe-viewing .close-btn{display:none}#imagify-visual-comparison .close-btn,.imagify-visual-comparison .close-btn{top:50px;right:5px;width:33px;height:33px;padding:1px 0 0 2px;border:1px solid #F2F2F2;color:#F2F2F2;line-height:19px;text-align:center;border-radius:50%}.imagify-visual-comparison .close-btn,.wp_attachment_image #imagify-visual-comparison .close-btn{top:0}.imagify-visual-comparison .imagify-modal-content,.wp_attachment_image #imagify-visual-comparison .imagify-modal-content{padding-top:40px}.imagify-modal .imagify-comparison-title{font-size:28px;margin-bottom:1em;color:#F2F2F2;text-align:left}.imagify-modal .imagify-comparison-title .twentytwenty-duo-buttons{position:static;margin:0 10px 0 15px}.imagify-comparison-title .twentytwenty-duo-buttons button{float:none;padding:6px 12px;font-size:16px;text-transform:none;border:1px solid #40B1D0;color:#889;letter-spacing:0}.imagify-comparison-title .twentytwenty-duo-buttons button:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}.imagify-comparison-title .twentytwenty-duo-buttons .selected{border:1px solid #40B1D0;color:#FFF;background:#40B1D0}.imagify-comparison-levels{margin:15px 0;overflow:hidden}.imagify-comparison-levels div{display:none;min-width:175px;font-size:11px}.imagify-comparison-levels .imagify-chart,.imagify-comparison-levels .imagify-chart-container{width:25px;float:none;margin:0}.imagify-visual-comparison .imagify-chart-container canvas{width:15px!important;height:15px!important;margin-right:5px}.imagify-c-level.go-left{float:left}.imagify-c-level.go-right{float:right}.imagify-c-level.go-left,.imagify-c-level.go-right{display:table}.imagify-c-level .imagify-c-level-row{display:table-row;margin:0;color:#FFF}.imagify-c-level-row>span{display:table-cell;padding:2px 0}.imagify-c-level-row .value{text-align:right;padding-left:5px}.imagify-c-level-row .value.level{color:#40b1d0}.imagify-c-level-row .value.size{color:#8bc34a;font-weight:700}.imagify-c-level-row .value .imagify-chart{top:1px}@-webkit-keyframes icon-rotate{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes icon-rotate{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.imagify-menu-bar-img{margin-top:1em}.imagify-modal .loader{position:absolute;top:50%;left:50%;margin:-32px 0 0 -32px;opacity:0;visibility:hidden;-webkit-transition:opacity .4s;-o-transition:opacity .4s;transition:opacity .4s}.imagify-modal .loading .loader{visibility:visible;opacity:1}.imagify-settings .imagify-visual-comparison-text{margin-top:1em;color:#40b1d0;font-weight:700}.imagify-border-styled,.imagify-flex-table,.imagify-modal-cols,.imagify-offer-header,.imagify-payment-modal .imagify-modal-content,.imagify-tabs{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.imagify-analyzing .imagify-numbers-calc,.imagify-modal-content.imagify-iframe-viewing .imagify-modal-sidebar,.imagify-modal-content.imagify-success-viewing .imagify-modal-sidebar,.imagify-modal-section .imagify-loader,.imagify-modal-section.imagify-analyzing .imagify-modal-cols,.imagify-numbers-notcalc{display:none}.imagify-border-styled,.imagify-modal-cols{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.imagify-payment-modal{text-align:center;color:#7A8996}.imagify-payment-modal *{-webkit-box-sizing:border-box;box-sizing:border-box}.imagify-modal-loader{position:absolute;top:0;left:0;right:0;bottom:0;background:url(../images/loader-balls.svg) center no-repeat #fff;z-index:10}.imagify-payment-modal .imagify-modal-content{width:980px;max-width:100%;min-width:925px;padding:0}.imagify-modal-content.imagify-iframe-viewing{width:980px;height:672px;overflow:hidden}.imagify-iframe-viewing #imagify-payment-process-view{width:980px;height:668px}.imagify-payment-modal .imagify-modal-main{width:70%}.imagify-iframe-viewing .imagify-modal-main{width:auto}.imagify-payment-modal .imagify-modal-content.imagify-success-viewing{min-width:auto;width:450px;min-height:300px}.imagify-success-viewing .imagify-modal-main{width:100%}.imagify-payment-modal .imagify-modal-sidebar{width:30%;padding:15px 20px;background:#1F2332;color:#FFF}.imagify-modal-section{padding:0 25px}.imagify-modal-section.section-gray{margin:0 0 1em;padding:10px 25px 15px;background:#F6F7FB}.imagify-tabs-contents .section-gray{padding:8px 25px 10px}.imagify-modal-section .imagify-modal-title:first-child{margin-top:1em;margin-bottom:1.5em}.imagify-modal-section.section-gray .imagify-modal-title{margin-top:.5em;margin-bottom:.5em}.imagify-modal-title{font-size:1.8em}.imagify-analyzing .imagify-numbers-notcalc,.imagify-modal-section.imagify-analyzing .imagify-loader{display:block}.imagify-modal-section .imagify-loader{margin:2em auto}.imagify-border-styled{width:200px;margin:0 auto;color:#8BC34A;font-weight:700;font-size:.925em}.imagify-big-number,.imagify-payment-modal strong{font-weight:700;color:#4A4A4A}.imagify-big-number{font-size:3.7em;margin:-3px 0;line-height:1}.imagify-border-styled:after,.imagify-border-styled:before{content:"";height:1px;background:rgba(0,0,0,.1);-ms-flex-preferred-size:40px;flex-basis:40px}.imagify-border-styled:before{margin-right:5px}.imagify-border-styled:after{margin-left:5px}.imagify-col{-ms-flex-preferred-size:50%;flex-basis:50%}.imagify-modal .imagify-cols{padding:0 20px}.imagify-payment-modal .imagify-iconed{margin:1.5em 5em 1.5em 0}.imagify-iconed{position:relative;text-align:left;padding-left:42px;margin-right:15px;font-weight:500}.imagify-iconed .dashicons,.imagify-iconed .icon{position:absolute;font-size:2em;left:0;top:2px;color:#40B1D0}.imagify-payment-modal .close-btn{top:10px;right:10px;width:24px;height:24px;padding:2px 0 0 4.5px;color:#FFF;background:#40B1D0;border-radius:50%;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-payment-modal .close-btn i{margin-left:-3.5px;margin-top:-.5px}.imagify-payment-modal .close-btn:hover{background:#F6F7FB}.imagify-offer-line{margin-top:1.5em}.imagify-offer-line+.imagify-offer-line{margin-top:.75em}.imagify-offer-header{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0 0 0 15px;border-radius:4px 4px 0 0;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-offer-header.imagify-offer-header.imagify-offer-header .imagify-inline-options label:last-child{border-radius:0 4px 0 0}.imagify-offer-header .imagify-inline-options{width:auto}.imagify-offer-title{font-weight:700;margin:0}.imagify-offer-header,.imagify-offer-header .imagify-inline-options input[type=radio]:not(:checked)+label{background:#E5EBEF}.imagify-offer-onetime .imagify-offer-header{padding-top:8px;padding-bottom:8px}.imagify-offer-onetimes>div{padding-top:15px;padding-bottom:15px}.imagify-offer-header .imagify-inline-options input[type=radio]:checked+label,.imagify-offer-header .imagify-inline-options input[type=radio]:not(:checked)+label{position:relative;padding:7px 30px;font-size:1em;letter-spacing:.05em;color:inherit;-webkit-box-shadow:0 0 0;box-shadow:0 0 0;border-radius:0}.imagify-offer-header .imagify-inline-options input[type=radio]:checked+label{background:#F6F7FB}.imagify-2-free{position:absolute;bottom:100%;left:0;right:0;padding:2px 10px;margin-bottom:8px;font-size:.8em;letter-spacing:0;text-transform:none;text-align:center;color:#FFF;background:#10121A;border-radius:2px}.imagify-2-free:after{content:"";position:absolute;left:50%;bottom:-3px;margin-left:-3px;border-top:3px solid #10121A;border-left:3px solid transparent;border-right:3px solid transparent}.imagify-2-free.imagify-b-right{bottom:auto;left:100%;right:-100%;margin-bottom:0;margin-left:8px}.imagify-2-free.imagify-b-right:after{left:-3px;bottom:auto;top:50%;margin-top:-3px;margin-left:0;border-right:3px solid #10121A;border-top:3px solid transparent;border-bottom:3px solid transparent;border-left:0}.imagify-2-free.imagify-b-bottom{bottom:-100%;left:0;right:0;margin-top:8px}.imagify-2-free.imagify-b-bottom:after{top:-3px;bottom:auto;border-bottom:3px solid #10121A;border-left:3px solid transparent;border-right:3px solid transparent;border-top:0}.imagify-offer-content{text-align:left;background:#F6F7FB;border-radius:0 0 4px 4px;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-offer-onetime .imagify-offer-content{padding:10px 0}div.imagify-col-checkbox{position:relative;width:25.5%;padding-top:10px;padding-bottom:7px}.imagify-col-checkbox label{display:block;padding-left:55px!important}.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:checked,.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:not(:checked){position:absolute;top:50%;left:6px;margin:-8px 0 0}.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:checked+label:before,.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:not(:checked)+label:before{margin:0;top:-2px;left:6px;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-offer-by,.imagify-offer-size{-webkit-transition:all .275s;-o-transition:all .275s}.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:checked+label:after,.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:not(:checked)+label:after{top:1px;left:13px}.imagify-offer-size{font-size:30px;color:#2E3243;font-weight:700;transition:all .275s}.imagify-offer-by{font-size:10px;transition:all .275s}.imagify-approx{display:none;font-size:11px;line-height:1.2;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}div.imagify-col-price{width:35%}.imagify-flex-table .imagify-price-block{padding-left:0;padding-right:0}.imagify-offer-monthlies .imagify-price-block,.imagify-offer-monthly .imagify-flex-table .imagify-price-block{padding-top:0}.imagify-flex-table .imagify-price-complement{padding-right:0;font-size:10px;font-weight:700}.imagify-price-block,.imagify-price-discount{white-space:nowrap}.imagify-price-block span,.imagify-price-discount span{display:inline-block;vertical-align:middle}.imagify-price-discount.imagify-price-discount{position:relative;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;padding-top:15px;font-weight:700;width:70px}.imagify-price-discount:before{content:"";position:absolute;top:25px;width:62%;height:2px;background:#2E3243;-webkit-transform:rotate(-15deg);-ms-transform:rotate(-15deg);transform:rotate(-15deg)}.imagify-offer-onetimes .imagify-price-discount:before{width:100%}.imagify-price-discount-dollar{color:#2E3243}.imagify-price-discount-number{color:#8BA6B4}.imagify-offer-selected .imagify-price-discount-number{color:#FFF}span.imagify-dollars{color:#1F2332;font-size:18px;font-weight:700;vertical-align:-2px}.imagify-offer-onetime .imagify-col-price{padding-top:0}.imagify-offer-onetime .imagify-dollars{vertical-align:-1px}.imagify-price-big,.imagify-price-mini{color:#40B1D0;font-weight:700}.imagify-price-big{font-size:36px}span.imagify-price-mini{font-size:18px;vertical-align:2px}span.imagify-price-by{font-size:10px;color:#1F2332;vertical-align:-13px;text-indent:-27px}.imagify-col-other-actions{width:18.5%;text-align:right}.imagify-col-other-actions a{font-size:11px}.imagify-offer-selected,.imagify-offer-selected .imagify-col-other-actions a,.imagify-offer-selected .imagify-offer-size,.imagify-offer-selected .imagify-offer-title,.imagify-offer-selected .imagify-price-big,.imagify-offer-selected .imagify-price-complement,.imagify-offer-selected .imagify-price-mini{color:#FFF}.imagify-offer-selected .imagify-offer-header,.imagify-offer-selected .imagify-offer-header .imagify-inline-options input[type=radio]:not(:checked)+label{background:#338EA6}.imagify-offer-selected .imagify-offer-content,.imagify-offer-selected .imagify-offer-header .imagify-inline-options input[type=radio]:checked+label{background:#40B1D0}.imagify-offer-selected .imagify-checkbox.imagify-checkbox:checked+label:before,.imagify-offer-selected .imagify-checkbox.imagify-checkbox:not(:checked)+label:before{border-color:#FFF;background:#40B1D0}.imagify-offer-selected .imagify-offer-by{color:#2E3243}.imagify-enough-free .imagify-not-enough-title,.imagify-enough-title{display:none}.imagify-enough-free .imagify-enough-title{display:block}.imagify-submit-line{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:2em 0;text-align:left}.imagify-coupon-section{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.imagify-coupon-section p{margin:0;line-height:1.3}.imagify-coupon-text{width:200px;max-width:100%;padding-right:15px}.imagify-coupon-loader{display:none}.imagify-coupon-text.checking{text-align:right}.imagify-coupon-text.checking .imagify-coupon-loader{display:inline}.imagify-coupon-text.checking label{display:none}.imagify-coupon-input{position:relative}.imagify-coupon-input input{position:relative;z-index:1}[id=imagify-coupon-validate].button-secondary{position:absolute;top:1px;right:3px;bottom:2px;-webkit-box-shadow:none;box-shadow:none;padding:4px 10px;z-index:0;-webkit-transition:-webkit-transform .275s;-o-transition:transform .275s;transition:transform .275s;transition:transform .275s,-webkit-transform .275s}.imagify-canbe-validate [id=imagify-coupon-validate]{-webkit-transform:translateX(45px);-ms-transform:translateX(45px);transform:translateX(45px)}.imagify-modal-section+.imagify-modal-promotion{margin-top:-1em}.imagify-modal-promotion{position:relative;overflow:hidden;display:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:15px 25px;background:#604D90;text-shadow:0 0 3px rgba(0,0,0,.3)}.imagify-modal-promotion.active{display:-webkit-box;display:-ms-flexbox;display:flex}[id=imagify-pricing-tab-onetime] .imagify-modal-promotion{margin-bottom:4em}.imagify-modal-promotion:before{content:"\f488";position:absolute;top:28px;left:8%;font-family:dashicons;font-size:90px;color:#8476A9;text-shadow:none}.imagify-modal-promotion p{position:relative;margin:.2em 0;color:#FFF}.imagify-promo-title{-ms-flex-preferred-size:100%;flex-basis:100%;text-transform:uppercase;font-size:20px;font-weight:700;letter-spacing:.125em}.imagify-until-date{-ms-flex-preferred-size:200px;flex-basis:200px;text-align:right}.imagify-until-date strong{color:#FFF}.imagify-submit-line button{font-size:16px}input.imagify-coupon-code{padding:10px;border:2px solid #7A8996;font-size:.875em;font-weight:700;border-radius:3px}.validated.imagify-coupon-section .imagify-coupon-text,.validated.imagify-coupon-section strong{color:#8BC34A}.validated.imagify-coupon-section .imagify-coupon-code{color:#8BC34A;border-color:#8BC34A}.invalid.imagify-coupon-section .imagify-coupon-text,.invalid.imagify-coupon-section strong{color:#d0021b}.invalid.imagify-coupon-section .imagify-coupon-code{color:#d0021b;border-color:#d0021b}.imagify-footer-lines{width:500px;max-width:100%;margin:2em auto 2.5em;font-size:.85em;line-height:1.5}.imagify-year-selected .imagify-switch-my .imagify-yearly{display:block}.imagify-month-selected .imagify-switch-my .imagify-yearly,.imagify-year-selected .imagify-switch-my .imagify-monthly{display:none}.imagify-month-selected .imagify-switch-my .imagify-monthly{display:block}.imagify-flex-table{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.imagify-flex-table>*{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;padding:7px 15px}div.imagify-col-details{width:22%;padding-left:25px}.imagify-col-details p{margin:0}.imagify-pricing-table{margin:0 20px}.imagify-pricing-table .imagify-offer-line{padding:.6em 0;border:2px solid #E8EEF0;text-align:left;border-radius:3px}.imagify-pricing-table .imagify-offer-line:first-child{margin-top:.75em}.imagify-pricing-table .imagify-offer-line.imagify-offer-selected:first-child{margin-top:1.75em}.imagify-pricing-table .imagify-offer-line+.imagify-offer-line{margin-top:-2px}.imagify-pricing-table .imagify-col-other-actions{width:20.5%}.imagify-pricing-table .imagify-approx{margin-left:0;line-height:.5;margin-bottom:1em}.imagify-pricing-table .imagify-offer-selected{-webkit-transform:scale(1.03);-ms-transform:scale(1.03);transform:scale(1.03);background:#40B1D0;border-width:0}.imagify-pricing-table .imagify-offer-selected .imagify-approx{color:#FFF}.imagify-pricing-table .imagify-button-secondary{padding:3px 20px;-webkit-box-shadow:none;box-shadow:none;text-transform:uppercase;font-size:12px;letter-spacing:.025em}.imagify-offer-selected.imagify-offer-selected .imagify-button-secondary{border:2px solid #FFF;background:#40B1D0;-webkit-box-shadow:none;box-shadow:none;text-shadow:none!important}.imagify-offer-selected.imagify-offer-selected .imagify-button-secondary:focus,.imagify-offer-selected.imagify-offer-selected .imagify-button-secondary:hover{background:#FFF;color:#40B1D0}.imagify-col .imagify-special-needs{margin-left:25px}.imagify-special-needs strong{font-size:25px;font-weight:700;color:#40B1D0}.imagify-special-needs span{display:block;font-size:12px;margin-top:-.5em}div.imagify-col-price{position:relative}.imagify-recommend{display:none;position:absolute;left:-20px;bottom:100%;padding:0;margin-bottom:8px;color:#1F2332;font-weight:700;font-style:italic}.imagify-offer-selected .imagify-recommend,.imagify-tab-content.imagify-current{display:block}[class*=imagify-onetime-] .imagify-recommend{left:65px;margin-bottom:20px}.imagify-recommend:before{content:"";position:absolute;top:7px;left:-35px;width:29px;height:30px;background:url(../images/icon-arrow-choice.png) 0 no-repeat;background-size:contain}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2/1),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.imagify-recommend:before{background-image:url(../images/icon-arrow-choice.svg)}}.imagify-offer-line[class*=imagify-onetime-]{padding:0;margin:.3em 0 0}.imagify-offer-line.imagify-offer-line[class*=imagify-onetime-]:first-child{margin-top:2em}.imagify-offer-line[class*=imagify-onetime-]+.imagify-offer-line{margin-top:.5em}.imagify-offer-selected.imagify-offer-line[class*=imagify-onetime-]{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);border-width:2px}.imagify-offer-line[class*=imagify-onetime-] .imagify-col-details{position:relative;overflow:hidden;width:21%;background:#1F2332;color:#FFF}.imagify-offer-selected.imagify-offer-line[class*=imagify-onetime-] .imagify-col-details{background:#338EA6}.imagify-offer-line[class*=imagify-onetime-] .imagify-col-details:before{content:"";position:absolute;bottom:0;right:25px;width:75px;height:54px;background:url(../images/icon-pack.png)}.imagify-offer-line[class*=imagify-onetime-] .imagify-col-other-actions{width:30%}.imagify-offer-line[class*=imagify-onetime-] .imagify-approx,.imagify-offer-line[class*=imagify-onetime-] .imagify-offer-size{color:#FFF}.imagify-offer-line[class*=imagify-onetime-] .imagify-offer-size{font-size:24px}.imagify-offer-line[class*=imagify-onetime-] .imagify-approx{font-size:12px}.imagify-offer-line[class*=imagify-onetime-] .imagify-price-block{padding-left:10px}.imagify-offer-line[class*=imagify-onetime-] .imagify-dollars{vertical-align:middle}.imagify-offer-line[class*=imagify-onetime-] .imagify-price-big{vertical-align:-5px}.imagify-offer-line[class*=imagify-onetime-] .imagify-price-mini{vertical-align:7px}.imagify-tabs{margin-bottom:0;list-style:none;background:#E5EBEF}.imagify-modal-content .imagify-tabs{margin:1em 0 0}.imagify-tab{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;width:50%;margin:0;font-size:23px}.imagify-tab a{display:block;padding:15px 10px;color:inherit;text-decoration:none}.imagify-tab a:focus{-webkit-box-shadow:none;box-shadow:none;outline:0;color:#40B1D8}.imagify-tab.imagify-current a{background:#F6F7FB}.imagify-tab-content{display:none}.imagify-tab-content .imagify-modal-section:first-child{margin-top:0}.imagify-modal-sidebar-content,.imagify-payment-modal .imagify-modal-sidebar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.imagify-modal-sidebar-content{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}p.imagify-modal-sidebar-title{margin-top:5px;padding-right:40px;font-size:18px;color:#FFF}.imagify-modal-testimony{margin-top:1em}.imagify-modal-testimony+.imagify-modal-testimony{margin-top:2em}@media (max-height:620px){.imagify-modal-testimony+.imagify-modal-testimony{display:none}}.imagify-modal-testimony-person{display:table;width:100%}.imagify-modal-testimony-person>*{display:table-cell;vertical-align:middle}.imagify-modal-avatar{width:114px;line-height:0}.imagify-modal-avatar img{border:2px solid #FFF;border-radius:50%;width:96px;height:96px}.imagify-modal-identity a{text-decoration:none;font-weight:700}.imagify-modal-identity a:first-child{font-size:13px}.imagify-modal-identity a:first-child+a{display:block;font-size:10px;color:#7A8996}.imagify-modal-testimony-content p{font-size:13px;font-style:italic;line-height:1.7;color:#7A8996}.imagify-modal-sidebar-trust{margin-top:auto;padding-top:1.5em}.imagify-modal-sidebar-trust p{margin:0;font-weight:700;font-size:12px;line-height:1.7}.imagify-modal-sidebar-trust p img{margin-right:3px;vertical-align:-2px}.imagify-modal-sidebar-trust p+p{font-size:11px}.imagify-cart{text-align:left}.imagify-cart .imagify-cart-list{border-top:1px solid rgba(122,137,150,.2);border-bottom:1px solid rgba(122,137,150,.2)}.imagify-cart .imagify-cart-label{margin-bottom:.5em;font-size:10px;color:#2E3243}.imagify-cart-list p{margin:0;font-weight:700}.imagify-cart-item{margin:.4em 0}.imagify-cart .imagify-cart-suggestion{margin-top:-.3em}.imagify-cart-suggestion a,.imagify-cl-description p{font-size:10px}.imagify-remove-from-cart{border:0;padding:0;width:14px;height:14px;line-height:13px;border-radius:50%;background:#40B1D0;cursor:pointer;-webkit-transition:background .3s;-o-transition:background .3s;transition:background .3s}.imagify-remove-from-cart i:before{position:relative;top:-6px;left:-3px;font-size:13px;color:#FFF}.imagify-remove-from-cart:focus,.imagify-remove-from-cart:hover{background:#D0021B}.imagify-cart .imagify-cl-remove{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;width:45px}.imagify-cart .imagify-cl-name{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;width:200px}.imagify-cart .imagify-cl-description{-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start;padding-top:10px}.imagify-cart .imagify-cl-price{text-align:right}#imagify-payment-iframe{width:980px;height:672px;background:url(../images/loader-balls.svg) 50% 50% no-repeat #f6f7fb}.imagify-success-view{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%}.imagify-success-view p{font-weight:700;font-size:16px}.imagify-cart-emptied-item{margin:.3em auto;padding:6px 20px;background:#E6EBEF;border-radius:20px}.imagify-cart-emptied-item.imagify-cart-emptied-item p{font-weight:700}.imagify-cart-emptied-item a{color:#40b1d0;float:right;font-weight:700}
assets/css/sweetalert2.css CHANGED
File without changes
assets/css/sweetalert2.min.css CHANGED
File without changes
assets/images/big-blue-check.png CHANGED
File without changes
assets/images/icon-arrow-choice.png CHANGED
File without changes
assets/images/icon-arrow-choice.svg CHANGED
File without changes
assets/images/icon-lock.png CHANGED
File without changes
assets/images/icon-lock.svg CHANGED
File without changes
assets/images/icon-pack.png CHANGED
File without changes
assets/images/icon-pack.svg CHANGED
File without changes
assets/images/pic-ericwaltr.jpg CHANGED
File without changes
assets/images/pic-srhdesign.jpg CHANGED
File without changes
assets/js/es6-promise.auto.js CHANGED
File without changes
assets/js/es6-promise.auto.min.js CHANGED
File without changes
assets/js/imagify.js CHANGED
@@ -1,6 +1,8 @@
1
- /*
2
  * imagify-gulpjs - version 0.0.1 - 2016-04-07
3
  * WP Media <contact@wp-media.me>
 
 
4
  */
5
  (function () {
6
  'use strict';
@@ -41,7 +43,7 @@ window.ImagifyGulp = function () {
41
  function ImagifyGulp( settings ) {
42
  _classCallCheck( this, ImagifyGulp );
43
 
44
- this.buffer_size = 1;
45
  this.lib_url = settings.lib;
46
  this.default_thumb = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAIAAACRuyQOAAACy0lEQVRIx+1XS1PTUBTuT/MB1NGF3bhyhys3Pv+Ai8pCF6Bb3bsWq8xAh8441I2TSlKwPIKQJsI40IbSV0pJ6qe3OeZ1b9PaYViQyaJzc+757j3nO985TVx5v3o+b+IS6XyQUgtrj/NqWtJmZf3lavnpl53bC2vjRLqRUV4pxqbZcnrBx3F6G2ZzTjFg879IMwWtanV7g56K1Z2RtBGRpj7IWb0a8HhqOz9O2rjHfrOD34GvWcPEruGQkhmlcFgnF7bjABVJmvA4uj4vY2VJr545/yClw/okBywaadF/m63j1gT/sNO5DbXW8t4sLtJzSQtnAme/ys/BrU9FpdIgY2R3MBLidtQ+ZRt2T9qZvQrtf/N9X5BwbEQKmSVIFGZjEGlWNojB93KbCBolDNl49nVPAIYwUs5QGAOQwCtmuuyGG5ExGhZbtM7s+5+3BGC5nyazhB8RElSAePRwRaX1u9nScadfVYjtncV1HtKDlW0KQMqvID4kCAydHST2fgKhu24B7dTaSY4oYBf2MjN44yK9+FZmRnrdCnuhr3jyB7Vr89G8L9f7oU77VSPhp4POjNarzUgv77Z/ERh+R9oUXbqDXFyktFtJ5ag74cU9cBsCwy3DNoht5Fcf0pO8ysuTt27IFzKH/Hm/Qopi5ekP99zzgkU8goF7VN21ThfM9BKHylHEPbzoQ8wUlSGoG1QVnR3Vhppj66hCtgg/Ayr3tdLXCFQ7al4ABr2gAEBHoCbQFDu+RkCvqPVBx5LCZvq2dEDsgELuDqV7rM/SfvmocfNjkYcEdV8Kdcu4Wh6QLzzoPQKtQ9DQvQL9ZYhOiCYteXougo/9UEIv9YHxKK+iZ9qenouE8QIunCMMMzxHYIIomU2ksBOaI5ZHmCO8OavEnI0K2hjmvTnevPe3bjBlTvKvMsoMi4kVAgO/qBXMGvidGu8Me/lf4yIg/QYbLcmjDg4bKwAAAABJRU5ErkJggg==";
47
  this.images = settings.images;
1
+ /**
2
  * imagify-gulpjs - version 0.0.1 - 2016-04-07
3
  * WP Media <contact@wp-media.me>
4
+ *
5
+ * Note: when updating this file, don't forget to replace `this.buffer_size = 1;` by `this.buffer_size = imagifyBulk.buffer_size;`.
6
  */
7
  (function () {
8
  'use strict';
43
  function ImagifyGulp( settings ) {
44
  _classCallCheck( this, ImagifyGulp );
45
 
46
+ this.buffer_size = imagifyBulk.buffer_size;
47
  this.lib_url = settings.lib;
48
  this.default_thumb = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAIAAACRuyQOAAACy0lEQVRIx+1XS1PTUBTuT/MB1NGF3bhyhys3Pv+Ai8pCF6Bb3bsWq8xAh8441I2TSlKwPIKQJsI40IbSV0pJ6qe3OeZ1b9PaYViQyaJzc+757j3nO985TVx5v3o+b+IS6XyQUgtrj/NqWtJmZf3lavnpl53bC2vjRLqRUV4pxqbZcnrBx3F6G2ZzTjFg879IMwWtanV7g56K1Z2RtBGRpj7IWb0a8HhqOz9O2rjHfrOD34GvWcPEruGQkhmlcFgnF7bjABVJmvA4uj4vY2VJr545/yClw/okBywaadF/m63j1gT/sNO5DbXW8t4sLtJzSQtnAme/ys/BrU9FpdIgY2R3MBLidtQ+ZRt2T9qZvQrtf/N9X5BwbEQKmSVIFGZjEGlWNojB93KbCBolDNl49nVPAIYwUs5QGAOQwCtmuuyGG5ExGhZbtM7s+5+3BGC5nyazhB8RElSAePRwRaX1u9nScadfVYjtncV1HtKDlW0KQMqvID4kCAydHST2fgKhu24B7dTaSY4oYBf2MjN44yK9+FZmRnrdCnuhr3jyB7Vr89G8L9f7oU77VSPhp4POjNarzUgv77Z/ERh+R9oUXbqDXFyktFtJ5ag74cU9cBsCwy3DNoht5Fcf0pO8ysuTt27IFzKH/Hm/Qopi5ekP99zzgkU8goF7VN21ThfM9BKHylHEPbzoQ8wUlSGoG1QVnR3Vhppj66hCtgg/Ayr3tdLXCFQ7al4ABr2gAEBHoCbQFDu+RkCvqPVBx5LCZvq2dEDsgELuDqV7rM/SfvmocfNjkYcEdV8Kdcu4Wh6QLzzoPQKtQ9DQvQL9ZYhOiCYteXougo/9UEIv9YHxKK+iZ9qenouE8QIunCMMMzxHYIIomU2ksBOaI5ZHmCO8OavEnI0K2hjmvTnevPe3bjBlTvKvMsoMi4kVAgO/qBXMGvidGu8Me/lf4yIg/QYbLcmjDg4bKwAAAABJRU5ErkJggg==";
49
  this.images = settings.images;
assets/js/imagify.min.js CHANGED
@@ -1 +1 @@
1
- !function(){"use strict";function a(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}var b=function(){function a(a,b){for(var c=0;c<b.length;c++){var d=b[c];d.enumerable=d.enumerable||!1,d.configurable=!0,"value"in d&&(d.writable=!0),Object.defineProperty(a,d.key,d)}}return function(b,c,d){return c&&a(b.prototype,c),d&&a(b,d),b}}();window.ImagifyGulp=function(){function c(b){a(this,c),this.buffer_size=1,this.lib_url=b.lib,this.default_thumb="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAIAAACRuyQOAAACy0lEQVRIx+1XS1PTUBTuT/MB1NGF3bhyhys3Pv+Ai8pCF6Bb3bsWq8xAh8441I2TSlKwPIKQJsI40IbSV0pJ6qe3OeZ1b9PaYViQyaJzc+757j3nO985TVx5v3o+b+IS6XyQUgtrj/NqWtJmZf3lavnpl53bC2vjRLqRUV4pxqbZcnrBx3F6G2ZzTjFg879IMwWtanV7g56K1Z2RtBGRpj7IWb0a8HhqOz9O2rjHfrOD34GvWcPEruGQkhmlcFgnF7bjABVJmvA4uj4vY2VJr545/yClw/okBywaadF/m63j1gT/sNO5DbXW8t4sLtJzSQtnAme/ys/BrU9FpdIgY2R3MBLidtQ+ZRt2T9qZvQrtf/N9X5BwbEQKmSVIFGZjEGlWNojB93KbCBolDNl49nVPAIYwUs5QGAOQwCtmuuyGG5ExGhZbtM7s+5+3BGC5nyazhB8RElSAePRwRaX1u9nScadfVYjtncV1HtKDlW0KQMqvID4kCAydHST2fgKhu24B7dTaSY4oYBf2MjN44yK9+FZmRnrdCnuhr3jyB7Vr89G8L9f7oU77VSPhp4POjNarzUgv77Z/ERh+R9oUXbqDXFyktFtJ5ag74cU9cBsCwy3DNoht5Fcf0pO8ysuTt27IFzKH/Hm/Qopi5ekP99zzgkU8goF7VN21ThfM9BKHylHEPbzoQ8wUlSGoG1QVnR3Vhppj66hCtgg/Ayr3tdLXCFQ7al4ABr2gAEBHoCbQFDu+RkCvqPVBx5LCZvq2dEDsgELuDqV7rM/SfvmocfNjkYcEdV8Kdcu4Wh6QLzzoPQKtQ9DQvQL9ZYhOiCYteXougo/9UEIv9YHxKK+iZ9qenouE8QIunCMMMzxHYIIomU2ksBOaI5ZHmCO8OavEnI0K2hjmvTnevPe3bjBlTvKvMsoMi4kVAgO/qBXMGvidGu8Me/lf4yIg/QYbLcmjDg4bKwAAAABJRU5ErkJggg==",this.images=b.images,this.images_ids=Object.keys(b.images),this.total_images=this.images_ids.length,this.processed_images=0,this.inprocess_images=0,this._before=function(){},this._each=function(){},this._done=function(){},this._error=function(){},this.total_original_size=0,this.total_optimized_size=0,this.total_gain=0,this.total_percent=0,this.global_original_size=0,this.global_optimized_size=0,this.global_gain=0,this.global_percent=0,this.context=b.context||"wp"}return b(c,[{key:"before",value:function(a){return this._before=a,this}},{key:"each",value:function(a){return this._each=a,this}},{key:"done",value:function(a){return this._done=a,this}},{key:"error",value:function(a){return this._error=a,this}},{key:"humanSize",value:function(a){if(0===a)return"0kb";var b=["b","kb","mb"],c=parseInt(Math.floor(Math.log(a)/Math.log(1024)));return(a/Math.pow(1024,c)).toFixed(2)+b[c]}},{key:"run",value:function(){for(var a=this.images_ids.length>this.buffer_size?this.buffer_size:this.images_ids.length,b=0;b<a;b++){var c=this.images_ids.shift();this.process(c)}return this}},{key:"process",value:function(a){this.inprocess_images++;var b={id:a,image_id:parseInt(a.toString().substr(1),10),image_src:this.images[a],filename:this.images[a].split("/").pop(),thumbnail:this.default_thumb,error:""};this.createThumb(b)}},{key:"createThumb",value:function(a){var b=this,c=new Image;c.onerror=function(){var c=a;c.id=a.image_id,b._before(c),b.send(a)},c.onload=function(){var d=c.width,e=c.height,f=1,g=0,h=0,i=null,j=null;d<e?(f=33/d,h=33,g=e*f):(f=33/e,g=33,h=d*f),i=document.createElement("canvas"),i.width=h,i.height=g,c.width=h,c.height=g,j=i.getContext("2d"),j.drawImage(this,0,0,h,g);try{a.thumbnail=i.toDataURL("image/jpeg")}catch(c){a.thumbnail=b.default_thumb}var k=a;k.id=a.image_id,b._before(k),b.send(a),i=null},c.src=a.image_src}},{key:"send",value:function(a){var b=this,c=new XMLHttpRequest,d=!1,e={},f={filename:a.filename,image:a.image_id,error:""};c.onreadystatechange=function(){if(4===this.readyState){b.processed_images++;try{e=JSON.parse(this.responseText),d=!1}catch(a){f.success=!1,f.error="Unknown error occured",d=!0}if(f.progress=Math.floor(b.processed_images/b.total_images*100),!d){var a=e.data;f.success=e.success,!0===e.success?(b.total_original_size+=a.original_size,b.total_optimized_size+=a.new_size,b.total_gain+=a.original_size-a.new_size,b.total_percent=(b.total_optimized_size/b.total_original_size*100).toFixed(2),b.global_original_size+=a.original_overall_size,b.global_optimized_size+=a.new_overall_size,b.global_gain+=a.overall_saving,b.global_percent=(100-b.global_optimized_size/b.global_optimized_size*100).toFixed(2),f.original_size=a.original_size,f.original_size_human=b.humanSize(a.original_size),f.new_size=a.new_size,f.new_size_human=b.humanSize(a.new_size),f.percent=a.percent,f.thumbnails=a.thumbnails,f.overall_saving=a.overall_saving,f.overall_saving_human=b.humanSize(a.overall_saving),f.original_overall_size=a.original_overall_size,f.original_overall_size_human=b.humanSize(a.original_overall_size)):f.error=a.error}if(b._each(f),b.inprocess_images<b.total_images&&b.process(b.images_ids.shift()),b.processed_images===b.total_images){var c=0;0!==b.global_original_size&&(c=(100-b.global_optimized_size/b.global_original_size*100).toFixed(2)),b._done({global_original_size_human:b.humanSize(b.global_original_size),global_gain_human:b.humanSize(b.global_gain),global_percent:c})}}},c.open("POST",this.lib_url,!0),c.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),c.send("image="+a.image_id+"&context="+this.context)}}]),c}()}();
1
+ !function(){"use strict";function a(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}var b=function(){function a(a,b){for(var c=0;c<b.length;c++){var d=b[c];d.enumerable=d.enumerable||!1,d.configurable=!0,"value"in d&&(d.writable=!0),Object.defineProperty(a,d.key,d)}}return function(b,c,d){return c&&a(b.prototype,c),d&&a(b,d),b}}();window.ImagifyGulp=function(){function c(b){a(this,c),this.buffer_size=imagifyBulk.buffer_size,this.lib_url=b.lib,this.default_thumb="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAIAAACRuyQOAAACy0lEQVRIx+1XS1PTUBTuT/MB1NGF3bhyhys3Pv+Ai8pCF6Bb3bsWq8xAh8441I2TSlKwPIKQJsI40IbSV0pJ6qe3OeZ1b9PaYViQyaJzc+757j3nO985TVx5v3o+b+IS6XyQUgtrj/NqWtJmZf3lavnpl53bC2vjRLqRUV4pxqbZcnrBx3F6G2ZzTjFg879IMwWtanV7g56K1Z2RtBGRpj7IWb0a8HhqOz9O2rjHfrOD34GvWcPEruGQkhmlcFgnF7bjABVJmvA4uj4vY2VJr545/yClw/okBywaadF/m63j1gT/sNO5DbXW8t4sLtJzSQtnAme/ys/BrU9FpdIgY2R3MBLidtQ+ZRt2T9qZvQrtf/N9X5BwbEQKmSVIFGZjEGlWNojB93KbCBolDNl49nVPAIYwUs5QGAOQwCtmuuyGG5ExGhZbtM7s+5+3BGC5nyazhB8RElSAePRwRaX1u9nScadfVYjtncV1HtKDlW0KQMqvID4kCAydHST2fgKhu24B7dTaSY4oYBf2MjN44yK9+FZmRnrdCnuhr3jyB7Vr89G8L9f7oU77VSPhp4POjNarzUgv77Z/ERh+R9oUXbqDXFyktFtJ5ag74cU9cBsCwy3DNoht5Fcf0pO8ysuTt27IFzKH/Hm/Qopi5ekP99zzgkU8goF7VN21ThfM9BKHylHEPbzoQ8wUlSGoG1QVnR3Vhppj66hCtgg/Ayr3tdLXCFQ7al4ABr2gAEBHoCbQFDu+RkCvqPVBx5LCZvq2dEDsgELuDqV7rM/SfvmocfNjkYcEdV8Kdcu4Wh6QLzzoPQKtQ9DQvQL9ZYhOiCYteXougo/9UEIv9YHxKK+iZ9qenouE8QIunCMMMzxHYIIomU2ksBOaI5ZHmCO8OavEnI0K2hjmvTnevPe3bjBlTvKvMsoMi4kVAgO/qBXMGvidGu8Me/lf4yIg/QYbLcmjDg4bKwAAAABJRU5ErkJggg==",this.images=b.images,this.images_ids=Object.keys(b.images),this.total_images=this.images_ids.length,this.processed_images=0,this.inprocess_images=0,this._before=function(){},this._each=function(){},this._done=function(){},this._error=function(){},this.total_original_size=0,this.total_optimized_size=0,this.total_gain=0,this.total_percent=0,this.global_original_size=0,this.global_optimized_size=0,this.global_gain=0,this.global_percent=0,this.context=b.context||"wp"}return b(c,[{key:"before",value:function(a){return this._before=a,this}},{key:"each",value:function(a){return this._each=a,this}},{key:"done",value:function(a){return this._done=a,this}},{key:"error",value:function(a){return this._error=a,this}},{key:"humanSize",value:function(a){if(0===a)return"0kb";var b=["b","kb","mb"],c=parseInt(Math.floor(Math.log(a)/Math.log(1024)));return(a/Math.pow(1024,c)).toFixed(2)+b[c]}},{key:"run",value:function(){for(var a=this.images_ids.length>this.buffer_size?this.buffer_size:this.images_ids.length,b=0;b<a;b++){var c=this.images_ids.shift();this.process(c)}return this}},{key:"process",value:function(a){this.inprocess_images++;var b={id:a,image_id:parseInt(a.toString().substr(1),10),image_src:this.images[a],filename:this.images[a].split("/").pop(),thumbnail:this.default_thumb,error:""};this.createThumb(b)}},{key:"createThumb",value:function(a){var b=this,c=new Image;c.onerror=function(){var c=a;c.id=a.image_id,b._before(c),b.send(a)},c.onload=function(){var d=c.width,e=c.height,f=1,g=0,h=0,i=null,j=null;d<e?(f=33/d,h=33,g=e*f):(f=33/e,g=33,h=d*f),i=document.createElement("canvas"),i.width=h,i.height=g,c.width=h,c.height=g,j=i.getContext("2d"),j.drawImage(this,0,0,h,g);try{a.thumbnail=i.toDataURL("image/jpeg")}catch(c){a.thumbnail=b.default_thumb}var k=a;k.id=a.image_id,b._before(k),b.send(a),i=null},c.src=a.image_src}},{key:"send",value:function(a){var b=this,c=new XMLHttpRequest,d=!1,e={},f={filename:a.filename,image:a.image_id,error:""};c.onreadystatechange=function(){if(4===this.readyState){b.processed_images++;try{e=JSON.parse(this.responseText),d=!1}catch(a){f.success=!1,f.error="Unknown error occured",d=!0}if(f.progress=Math.floor(b.processed_images/b.total_images*100),!d){var a=e.data;f.success=e.success,!0===e.success?(b.total_original_size+=a.original_size,b.total_optimized_size+=a.new_size,b.total_gain+=a.original_size-a.new_size,b.total_percent=(b.total_optimized_size/b.total_original_size*100).toFixed(2),b.global_original_size+=a.original_overall_size,b.global_optimized_size+=a.new_overall_size,b.global_gain+=a.overall_saving,b.global_percent=(100-b.global_optimized_size/b.global_optimized_size*100).toFixed(2),f.original_size=a.original_size,f.original_size_human=b.humanSize(a.original_size),f.new_size=a.new_size,f.new_size_human=b.humanSize(a.new_size),f.percent=a.percent,f.thumbnails=a.thumbnails,f.overall_saving=a.overall_saving,f.overall_saving_human=b.humanSize(a.overall_saving),f.original_overall_size=a.original_overall_size,f.original_overall_size_human=b.humanSize(a.original_overall_size)):f.error=a.error}if(b._each(f),b.inprocess_images<b.total_images&&b.process(b.images_ids.shift()),b.processed_images===b.total_images){var c=0;0!==b.global_original_size&&(c=(100-b.global_optimized_size/b.global_original_size*100).toFixed(2)),b._done({global_original_size_human:b.humanSize(b.global_original_size),global_gain_human:b.humanSize(b.global_gain),global_percent:c})}}},c.open("POST",this.lib_url,!0),c.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),c.send("image="+a.image_id+"&context="+this.context)}}]),c}()}();
assets/js/sweetalert2.js CHANGED
File without changes
assets/js/sweetalert2.min.js CHANGED
File without changes
imagify.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: Imagify
4
  * Plugin URI: https://wordpress.org/plugins/imagify/
5
  * Description: Dramaticaly reduce image file sizes without losing quality, make your website load faster, boost your SEO and save money on your bandwidth using Imagify, the new most advanced image optimization tool.
6
- * Version: 1.6.6
7
  * Author: WP Media
8
  * Author URI: http://wp-media.me
9
  * Licence: GPLv2
@@ -17,7 +17,7 @@
17
  defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
18
 
19
  // Imagify defines.
20
- define( 'IMAGIFY_VERSION' , '1.6.6' );
21
  define( 'IMAGIFY_SLUG' , 'imagify' );
22
  define( 'IMAGIFY_SETTINGS_SLUG' , IMAGIFY_SLUG . '_settings' );
23
  define( 'IMAGIFY_WEB_MAIN' , 'https://imagify.io' );
3
  * Plugin Name: Imagify
4
  * Plugin URI: https://wordpress.org/plugins/imagify/
5
  * Description: Dramaticaly reduce image file sizes without losing quality, make your website load faster, boost your SEO and save money on your bandwidth using Imagify, the new most advanced image optimization tool.
6
+ * Version: 1.6.7
7
  * Author: WP Media
8
  * Author URI: http://wp-media.me
9
  * Licence: GPLv2
17
  defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
18
 
19
  // Imagify defines.
20
+ define( 'IMAGIFY_VERSION' , '1.6.7' );
21
  define( 'IMAGIFY_SLUG' , 'imagify' );
22
  define( 'IMAGIFY_SETTINGS_SLUG' , IMAGIFY_SLUG . '_settings' );
23
  define( 'IMAGIFY_WEB_MAIN' , 'https://imagify.io' );
inc/3rd-party/3rd-party.php CHANGED
@@ -4,6 +4,7 @@ defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
4
  require( IMAGIFY_3RD_PARTY_PATH . 'amazon-s3-and-cloudfront/amazon-s3-and-cloudfront.php' );
5
  require( IMAGIFY_3RD_PARTY_PATH . 'enable-media-replace.php' );
6
  require( IMAGIFY_3RD_PARTY_PATH . 'nextgen-gallery/nextgen-gallery.php' );
 
7
  require( IMAGIFY_3RD_PARTY_PATH . 'wp-retina-2x.php' );
8
 
9
  // Hosting.
4
  require( IMAGIFY_3RD_PARTY_PATH . 'amazon-s3-and-cloudfront/amazon-s3-and-cloudfront.php' );
5
  require( IMAGIFY_3RD_PARTY_PATH . 'enable-media-replace.php' );
6
  require( IMAGIFY_3RD_PARTY_PATH . 'nextgen-gallery/nextgen-gallery.php' );
7
+ require( IMAGIFY_3RD_PARTY_PATH . 'screets-lc.php' );
8
  require( IMAGIFY_3RD_PARTY_PATH . 'wp-retina-2x.php' );
9
 
10
  // Hosting.
inc/3rd-party/amazon-s3-and-cloudfront/amazon-s3-and-cloudfront.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
3
 
4
- if ( function_exists( 'as3cf_init' ) && is_admin() ) :
5
 
6
  require( dirname( __FILE__ ) . '/inc/classes/class-imagify-as3cf.php' );
7
  require( dirname( __FILE__ ) . '/inc/classes/class-imagify-as3cf-attachment.php' );
1
  <?php
2
  defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
3
 
4
+ if ( is_admin() && ( function_exists( 'as3cf_init' ) || function_exists( 'as3cf_pro_init' ) ) ) :
5
 
6
  require( dirname( __FILE__ ) . '/inc/classes/class-imagify-as3cf.php' );
7
  require( dirname( __FILE__ ) . '/inc/classes/class-imagify-as3cf-attachment.php' );
inc/3rd-party/amazon-s3-and-cloudfront/inc/classes/class-imagify-as3cf-attachment.php CHANGED
@@ -46,15 +46,7 @@ class Imagify_AS3CF_Attachment extends Imagify_Attachment {
46
  * @param int $id The attachment ID.
47
  */
48
  public function __construct( $id = 0 ) {
49
- global $post;
50
-
51
- if ( $id && is_a( $id, 'WP_Post' ) ) {
52
- $id = $id->ID;
53
- } elseif ( ! $id && is_object( $post ) ) {
54
- $this->id = $post->ID;
55
- } else {
56
- $this->id = absint( $id );
57
- }
58
 
59
  $this->optimization_state_transient = 'imagify-async-in-progress-' . $this->id;
60
  }
@@ -592,7 +584,7 @@ class Imagify_AS3CF_Attachment extends Imagify_Attachment {
592
  * This means we'll follow AS3CF settings to know if the local files must be sent to S3 and/or deleted.
593
  */
594
  $this->use_s3_settings = true;
595
- $this->delete_files = $as3cf->get_setting( 'copy-to-s3' ) && $as3cf->get_setting( 'remove-local-file' );
596
 
597
  return $metadata;
598
  }
@@ -605,7 +597,7 @@ class Imagify_AS3CF_Attachment extends Imagify_Attachment {
605
  */
606
  $metadata = wp_get_attachment_metadata( $this->id, true );
607
  $this->use_s3_settings = false;
608
- $this->delete_files = isset( $metadata['filesize'] );
609
 
610
  return $metadata;
611
  }
@@ -675,7 +667,9 @@ class Imagify_AS3CF_Attachment extends Imagify_Attachment {
675
  }
676
 
677
  $filesystem = imagify_get_filesystem();
678
- $s3_object['key'] = dirname( $s3_object['key'] ) . '/' . basename( $file_path );
 
 
679
 
680
  // Retrieve file from S3.
681
  $as3cf->plugin_compat->copy_s3_file_to_server( $s3_object, $file_path );
46
  * @param int $id The attachment ID.
47
  */
48
  public function __construct( $id = 0 ) {
49
+ parent::__construct( $id );
 
 
 
 
 
 
 
 
50
 
51
  $this->optimization_state_transient = 'imagify-async-in-progress-' . $this->id;
52
  }
584
  * This means we'll follow AS3CF settings to know if the local files must be sent to S3 and/or deleted.
585
  */
586
  $this->use_s3_settings = true;
587
+ $this->delete_files = $as3cf->get_setting( 'remove-local-file' ) && $this->can_send_to_s3();
588
 
589
  return $metadata;
590
  }
597
  */
598
  $metadata = wp_get_attachment_metadata( $this->id, true );
599
  $this->use_s3_settings = false;
600
+ $this->delete_files = isset( $metadata['filesize'] ) && $this->can_send_to_s3();
601
 
602
  return $metadata;
603
  }
667
  }
668
 
669
  $filesystem = imagify_get_filesystem();
670
+ $directory = dirname( $s3_object['key'] );
671
+ $directory = '.' === $directory || '' === $directory ? '' : $directory . '/';
672
+ $s3_object['key'] = $directory . wp_basename( $file_path );
673
 
674
  // Retrieve file from S3.
675
  $as3cf->plugin_compat->copy_s3_file_to_server( $s3_object, $file_path );
inc/3rd-party/amazon-s3-and-cloudfront/inc/classes/class-imagify-as3cf.php CHANGED
@@ -83,6 +83,16 @@ class Imagify_AS3CF {
83
  */
84
  add_filter( 'imagify_optimize_attachment_context', array( $this, 'optimize_attachment_context' ), 10, 2 );
85
 
 
 
 
 
 
 
 
 
 
 
86
  /**
87
  * Automatic optimisation.
88
  */
@@ -123,6 +133,140 @@ class Imagify_AS3CF {
123
  return $context;
124
  }
125
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
126
 
127
  /** ----------------------------------------------------------------------------------------- */
128
  /** AUTOMATIC OPTIMIZATION: OPTIMIZE AFTER S3 HAS DONE ITS WORK ============================= */
@@ -235,7 +379,7 @@ class Imagify_AS3CF {
235
 
236
  // Some specifics for the image editor.
237
  if ( ! empty( $_POST['data']['do'] ) ) {
238
- $optimization_level = (int) get_post_meta( $attachment_id, '_imagify_optimization_level', true );
239
 
240
  // Remove old optimization data.
241
  $attachment->delete_imagify_data();
83
  */
84
  add_filter( 'imagify_optimize_attachment_context', array( $this, 'optimize_attachment_context' ), 10, 2 );
85
 
86
+ /**
87
+ * Bulk optimization.
88
+ */
89
+ add_action( 'imagify_bulk_optimize_before_file_existence_tests', array( $this, 'maybe_copy_files_from_s3' ), 8, 3 );
90
+
91
+ /**
92
+ * Stats.
93
+ */
94
+ add_filter( 'imagify_total_attachment_filesize', array( $this, 'add_stats_for_s3_files' ), 8, 4 );
95
+
96
  /**
97
  * Automatic optimisation.
98
  */
133
  return $context;
134
  }
135
 
136
+ /**
137
+ * When getting all unoptimized attachment ids before performing a bulk optimization, download the missing files from S3.
138
+ *
139
+ * @since 1.6.7
140
+ * @author Grégory Viguier
141
+ *
142
+ * @param array $ids An array of attachment IDs.
143
+ * @param array $results An array of the data fetched from the database.
144
+ * @param int $optimization_level The optimization level that will be used for the optimization.
145
+ */
146
+ public function maybe_copy_files_from_s3( $ids, $results, $optimization_level ) {
147
+ global $wpdb, $as3cf;
148
+
149
+ if ( ! $as3cf->is_plugin_setup() ) {
150
+ return;
151
+ }
152
+
153
+ // Remove from the list files that exist.
154
+ $ids = array_flip( $ids );
155
+
156
+ foreach ( $ids as $id => $i ) {
157
+ $file_path = get_imagify_attached_file( $results['filenames'][ $id ] );
158
+
159
+ /** This filter is documented in inc/functions/process.php. */
160
+ $file_path = apply_filters( 'imagify_file_path', $file_path, $id, 'as3cf_maybe_copy_files_from_s3' );
161
+
162
+ if ( ! $file_path || file_exists( $file_path ) ) {
163
+ // The file exists, no need to retrieve it from S3.
164
+ unset( $ids[ $id ] );
165
+ } else {
166
+ $ids[ $id ] = $file_path;
167
+ }
168
+ }
169
+
170
+ if ( ! $ids ) {
171
+ // All files are already on the server.
172
+ return;
173
+ }
174
+
175
+ // Determine which files are on S3.
176
+ $ids = array_flip( $ids );
177
+ $sql_ids = implode( ',', $ids );
178
+
179
+ $s3_data = $wpdb->get_results( // WPCS: unprepared SQL ok.
180
+ "SELECT pm.post_id as id, pm.meta_value as value
181
+ FROM $wpdb->postmeta as pm
182
+ WHERE pm.meta_key = 'amazonS3_info'
183
+ AND pm.post_id IN ( $sql_ids )
184
+ ORDER BY pm.post_id DESC",
185
+ ARRAY_A
186
+ );
187
+
188
+ $wpdb->flush();
189
+
190
+ if ( ! $s3_data ) {
191
+ return;
192
+ }
193
+
194
+ unset( $sql_ids );
195
+ $s3_data = imagify_query_results_combine( $ids, $s3_data, true );
196
+
197
+ // Retrieve the missing files from S3.
198
+ $ids = array_flip( $ids );
199
+
200
+ foreach ( $s3_data as $id => $s3_object ) {
201
+ $s3_object = maybe_unserialize( $s3_object );
202
+ $file_path = $ids[ $id ];
203
+
204
+ $attachment_backup_path = get_imagify_attachment_backup_path( $file_path );
205
+ $attachment_status = isset( $results['statuses'][ $id ] ) ? $results['statuses'][ $id ] : false;
206
+ $attachment_optimization_level = isset( $results['optimization_levels'][ $id ] ) ? $results['optimization_levels'][ $id ] : false;
207
+
208
+ // Don't try to re-optimize if there is no backup file.
209
+ if ( 'success' === $attachment_status && $optimization_level !== $attachment_optimization_level && ! file_exists( $attachment_backup_path ) ) {
210
+ unset( $s3_data[ $id ], $ids[ $id ] );
211
+ continue;
212
+ }
213
+
214
+ $directory = dirname( $s3_object['key'] );
215
+ $directory = '.' === $directory || '' === $directory ? '' : $directory . '/';
216
+ $s3_object['key'] = $directory . wp_basename( $file_path );
217
+
218
+ // Retrieve file from S3.
219
+ $as3cf->plugin_compat->copy_s3_file_to_server( $s3_object, $file_path );
220
+
221
+ unset( $s3_data[ $id ], $ids[ $id ] );
222
+ }
223
+ }
224
+
225
+ /**
226
+ * Provide the file sizes and the number of thumbnails for files that are only on S3.
227
+ *
228
+ * @since 1.6.7
229
+ * @author Grégory Viguier
230
+ *
231
+ * @param bool $size_and_count False by default.
232
+ * @param int $image_id The attachment ID.
233
+ * @param array $files An array of file paths with thumbnail sizes as keys.
234
+ * @param array $image_ids An array of all attachment IDs.
235
+ * @return bool|array False by default. Provide an array with the keys 'filesize' (containing the total filesize) and 'thumbnails' (containing the number of thumbnails).
236
+ */
237
+ function add_stats_for_s3_files( $size_and_count, $image_id, $files, $image_ids ) {
238
+ static $data;
239
+
240
+ if ( is_array( $size_and_count ) ) {
241
+ return $size_and_count;
242
+ }
243
+
244
+ if ( file_exists( $files['full'] ) ) {
245
+ // If the full size is on the server, that probably means all files are on the server too.
246
+ return $size_and_count;
247
+ }
248
+
249
+ if ( ! isset( $data ) ) {
250
+ $data = imagify_get_wpdb_metas( array(
251
+ // Get the filesizes.
252
+ 's3_filesize' => 'wpos3_filesize_total',
253
+ ), $image_ids );
254
+
255
+ $data = array_map( 'absint', $data['s3_filesize'] );
256
+ }
257
+
258
+ if ( empty( $data[ $image_id ] ) ) {
259
+ // The file is not on S3.
260
+ return $size_and_count;
261
+ }
262
+
263
+ // We can't take the disallowed sizes into account here.
264
+ return array(
265
+ 'filesize' => (int) $data[ $image_id ],
266
+ 'thumbnails' => count( $files ) - 1,
267
+ );
268
+ }
269
+
270
 
271
  /** ----------------------------------------------------------------------------------------- */
272
  /** AUTOMATIC OPTIMIZATION: OPTIMIZE AFTER S3 HAS DONE ITS WORK ============================= */
379
 
380
  // Some specifics for the image editor.
381
  if ( ! empty( $_POST['data']['do'] ) ) {
382
+ $optimization_level = $attachment->get_optimization_level();
383
 
384
  // Remove old optimization data.
385
  $attachment->delete_imagify_data();
inc/3rd-party/enable-media-replace.php CHANGED
File without changes
inc/3rd-party/hosting/wpengine.php CHANGED
@@ -3,14 +3,18 @@ defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
3
 
4
  if ( class_exists( 'WpeCommon' ) ) :
5
 
6
- add_filter( 'imagify_unoptimized_attachment_limit', '_imagify_wengine_unoptimized_attachment_limit' );
 
7
  /**
8
- * Conflict with WP Engine: it seems that WP Engine limits SQL queries size.
9
  *
10
  * @since 1.4.7
 
11
  * @author Jonathan Buttigieg
 
 
12
  */
13
- function _imagify_wengine_unoptimized_attachment_limit() {
14
  return 2500;
15
  }
16
 
3
 
4
  if ( class_exists( 'WpeCommon' ) ) :
5
 
6
+ add_filter( 'imagify_unoptimized_attachment_limit', '_imagify_wpengine_unoptimized_attachment_limit' );
7
+ add_filter( 'imagify_count_saving_data_limit', '_imagify_wpengine_unoptimized_attachment_limit' );
8
  /**
9
+ * Change the limit for the number of posts: WP Engine limits SQL queries size to 2048 octets (16384 characters).
10
  *
11
  * @since 1.4.7
12
+ * @since 1.6.7 Renamed (and deprecated) _imagify_wengine_unoptimized_attachment_limit() into _imagify_wpengine_unoptimized_attachment_limit().
13
  * @author Jonathan Buttigieg
14
+ *
15
+ * @return int
16
  */
17
+ function _imagify_wpengine_unoptimized_attachment_limit() {
18
  return 2500;
19
  }
20
 
inc/3rd-party/nextgen-gallery/inc/admin/ajax.php CHANGED
@@ -58,12 +58,13 @@ function _do_wp_ajax_imagify_ngg_get_unoptimized_attachment_ids() {
58
  set_transient( 'imagify_bulk_optimization_level', $optimization_level );
59
 
60
  foreach ( $images as $image ) {
61
- $id = $image['id'];
 
62
 
63
  /** This filter is documented in inc/functions/process.php. */
64
- $file_path = apply_filters( 'imagify_file_path', $storage->get_image_abspath( $id ) );
65
 
66
- if ( ! file_exists( $file_path ) ) {
67
  continue;
68
  }
69
 
58
  set_transient( 'imagify_bulk_optimization_level', $optimization_level );
59
 
60
  foreach ( $images as $image ) {
61
+ $id = absint( $image['id'] );
62
+ $file_path = $storage->get_image_abspath( $id );
63
 
64
  /** This filter is documented in inc/functions/process.php. */
65
+ $file_path = apply_filters( 'imagify_file_path', $file_path );
66
 
67
+ if ( ! $file_path || ! file_exists( $file_path ) ) {
68
  continue;
69
  }
70
 
inc/3rd-party/nextgen-gallery/inc/admin/bulk.php CHANGED
@@ -18,5 +18,5 @@ function _imagify_ngg_update_bulk_stats() {
18
  add_filter( 'imagify_count_error_attachments' , 'imagify_ngg_count_error_attachments' );
19
  add_filter( 'imagify_count_unoptimized_attachments' , 'imagify_ngg_count_unoptimized_attachments' );
20
  add_filter( 'imagify_percent_optimized_attachments' , 'imagify_ngg_percent_optimized_attachments' );
21
- add_filter( 'imagify_count_saving_data' , 'imagify_ngg_count_saving_data' );
22
  }
18
  add_filter( 'imagify_count_error_attachments' , 'imagify_ngg_count_error_attachments' );
19
  add_filter( 'imagify_count_unoptimized_attachments' , 'imagify_ngg_count_unoptimized_attachments' );
20
  add_filter( 'imagify_percent_optimized_attachments' , 'imagify_ngg_percent_optimized_attachments' );
21
+ add_filter( 'imagify_count_saving_data' , 'imagify_ngg_count_saving_data', 8 );
22
  }
inc/3rd-party/nextgen-gallery/inc/admin/db.php CHANGED
File without changes
inc/3rd-party/nextgen-gallery/inc/admin/enqueue.php CHANGED
File without changes
inc/3rd-party/nextgen-gallery/inc/admin/gallery.php CHANGED
File without changes
inc/3rd-party/nextgen-gallery/inc/admin/heartbeat.php CHANGED
@@ -18,7 +18,7 @@ function _imagify_ngg_heartbeat_received( $response, $data ) {
18
  return $response;
19
  }
20
 
21
- add_filter( 'imagify_count_saving_data', 'imagify_ngg_count_saving_data' );
22
  $saving_data = imagify_count_saving_data();
23
  $user = new Imagify_User();
24
 
18
  return $response;
19
  }
20
 
21
+ add_filter( 'imagify_count_saving_data', 'imagify_ngg_count_saving_data', 8 );
22
  $saving_data = imagify_count_saving_data();
23
  $user = new Imagify_User();
24
 
inc/3rd-party/nextgen-gallery/inc/admin/menu.php CHANGED
File without changes
inc/3rd-party/nextgen-gallery/inc/classes/class-imagify-ngg-attachment.php CHANGED
@@ -50,10 +50,11 @@ class Imagify_NGG_Attachment extends Imagify_Attachment {
50
  $this->image = $id;
51
  $this->id = $id->pid;
52
  } else {
53
- $this->image = nggdb::find_image( (int) $id );
54
  $this->id = $this->image->pid;
55
  }
56
 
 
57
  $this->row = $this->get_row();
58
 
59
  // Load nggAdmin class.
50
  $this->image = $id;
51
  $this->id = $id->pid;
52
  } else {
53
+ $this->image = nggdb::find_image( absint( $id ) );
54
  $this->id = $this->image->pid;
55
  }
56
 
57
+ $this->id = absint( $this->id );
58
  $this->row = $this->get_row();
59
 
60
  // Load nggAdmin class.
inc/3rd-party/nextgen-gallery/inc/classes/class-imagify-ngg-db.php CHANGED
File without changes
inc/3rd-party/nextgen-gallery/inc/common/attachments.php CHANGED
File without changes
inc/3rd-party/nextgen-gallery/inc/functions/admin-stats.php CHANGED
@@ -87,21 +87,108 @@ function imagify_ngg_percent_optimized_attachments() {
87
  $total_attachments = imagify_ngg_count_attachments();
88
  $total_optimized_attachments = imagify_ngg_count_optimized_attachments();
89
 
90
- return ( 0 !== $total_attachments ) ? round( 100 - ( ( $total_attachments - $total_optimized_attachments ) / $total_attachments ) * 100 ) : 0;
91
  }
92
 
93
  /**
94
  * Count percent, original & optimized size of all images optimized by Imagify.
95
  *
96
- * @since 1.5
 
97
  * @author Jonathan Buttigieg
98
  *
99
- * @return array An array containing the optimization data.
 
100
  */
101
- function imagify_ngg_count_saving_data() {
102
  global $wpdb;
103
 
104
- $table_name = $wpdb->ngg_imagify_data;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
105
 
106
- return $wpdb->get_col( "SELECT $table_name.data FROM {$wpdb->ngg_imagify_data} WHERE status = 'success'" ); // WPCS: unprepared SQL ok.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
107
  }
87
  $total_attachments = imagify_ngg_count_attachments();
88
  $total_optimized_attachments = imagify_ngg_count_optimized_attachments();
89
 
90
+ return $total_attachments && $total_optimized_attachments ? round( 100 - ( ( $total_attachments - $total_optimized_attachments ) / $total_attachments ) * 100 ) : 0;
91
  }
92
 
93
  /**
94
  * Count percent, original & optimized size of all images optimized by Imagify.
95
  *
96
+ * @since 1.5
97
+ * @since 1.6.7 Revamped to handle huge libraries.
98
  * @author Jonathan Buttigieg
99
  *
100
+ * @param bool|array $attachments An array containing the keys 'count', 'original_size', and 'optimized_size', or an array of attachments (back compat', deprecated), or false.
101
+ * @return array An array containing the keys 'count', 'original_size', and 'optimized_size'.
102
  */
103
+ function imagify_ngg_count_saving_data( $attachments ) {
104
  global $wpdb;
105
 
106
+ if ( is_array( $attachments ) ) {
107
+ return $attachments;
108
+ }
109
+
110
+ /**
111
+ * Filter the query to get all optimized NGG attachments.
112
+ * 3rd party will be able to override the result.
113
+ *
114
+ * @since 1.6.7
115
+ *
116
+ * @param bool|array $attachments An array containing the keys ('count', 'original_size', and 'optimized_size'), or false.
117
+ */
118
+ $attachments = apply_filters( 'imagify_ngg_count_saving_data', false );
119
+
120
+ if ( is_array( $attachments ) ) {
121
+ return $attachments;
122
+ }
123
 
124
+ $table_name = $wpdb->ngg_imagify_data;
125
+ $original_size = 0;
126
+ $optimized_size = 0;
127
+ $count = 0;
128
+
129
+ /** This filter is documented in /inc/functions/admin-stats.php */
130
+ $limit = apply_filters( 'imagify_count_saving_data_limit', 15000 );
131
+ $limit = absint( $limit );
132
+ $offset = 0;
133
+
134
+ $attachments = $wpdb->get_col( // WPCS: unprepared SQL ok.
135
+ "SELECT $table_name.data
136
+ FROM {$wpdb->ngg_imagify_data}
137
+ WHERE status = 'success'
138
+ LIMIT $offset, $limit"
139
+ );
140
+ $wpdb->flush();
141
+
142
+ while ( $attachments ) {
143
+ $attachments = array_map( 'maybe_unserialize', $attachments );
144
+
145
+ foreach ( $attachments as $attachment_data ) {
146
+ if ( ! $attachment_data ) {
147
+ continue;
148
+ }
149
+
150
+ ++$count;
151
+ $original_data = $attachment_data['sizes']['full'];
152
+
153
+ // Increment the original sizes.
154
+ $original_size += $original_data['original_size'] ? $original_data['original_size'] : 0;
155
+ $optimized_size += $original_data['optimized_size'] ? $original_data['optimized_size'] : 0;
156
+
157
+ unset( $attachment_data['sizes']['full'], $original_data );
158
+
159
+ // Increment the thumbnails sizes.
160
+ foreach ( $attachment_data['sizes'] as $size_data ) {
161
+ if ( ! empty( $size_data['success'] ) ) {
162
+ $original_size += $size_data['original_size'] ? $size_data['original_size'] : 0;
163
+ $optimized_size += $size_data['optimized_size'] ? $size_data['optimized_size'] : 0;
164
+ }
165
+ }
166
+
167
+ unset( $size_data );
168
+ }
169
+
170
+ unset( $attachment_data );
171
+
172
+ if ( count( $attachments ) === $limit ) {
173
+ // Unless we are really unlucky, we still have attachments to fetch.
174
+ $offset += $limit;
175
+
176
+ $attachments = $wpdb->get_col( // WPCS: unprepared SQL ok.
177
+ "SELECT $table_name.data
178
+ FROM {$wpdb->ngg_imagify_data}
179
+ WHERE status = 'success'
180
+ LIMIT $offset, $limit"
181
+ );
182
+ $wpdb->flush();
183
+ } else {
184
+ // Save one request, don't go back to the beginning of the loop.
185
+ $attachments = array();
186
+ }
187
+ } // End while().
188
+
189
+ return array(
190
+ 'count' => $count,
191
+ 'original_size' => $original_size,
192
+ 'optimized_size' => $optimized_size,
193
+ );
194
  }
inc/3rd-party/screets-lc.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
3
+
4
+ if ( function_exists( 'fn_lc_fix_ssl_upload_url' ) && defined( 'SLC_VERSION' ) && version_compare( SLC_VERSION, '2.2.8' ) < 0 ) :
5
+
6
+ /**
7
+ * Fixes a bug in Screets Live Chat plugin (prior version 2.2.8), preventing wp_get_upload_dir() to work properly.
8
+ */
9
+ remove_filter( 'upload_dir', 'fn_lc_fix_ssl_upload_url' );
10
+ add_filter( 'upload_dir', 'imagify_screets_lc_fix_ssl_upload_url' );
11
+ /**
12
+ * Filters the uploads directory data to force https URLs.
13
+ *
14
+ * @since 1.6.7
15
+ * @author Grégory Viguier
16
+ *
17
+ * @param array $uploads Array of upload directory data with keys of 'path', 'url', 'subdir, 'basedir', 'baseurl', and 'error'.
18
+ * @return array
19
+ */
20
+ function imagify_screets_lc_fix_ssl_upload_url( $uploads ) {
21
+ if ( false !== $uploads['error'] || ! is_ssl() ) {
22
+ return $uploads;
23
+ }
24
+
25
+ $uploads['url'] = str_replace( 'http://', 'https://', $uploads['url'] );
26
+ $uploads['baseurl'] = str_replace( 'http://', 'https://', $uploads['baseurl'] );
27
+
28
+ return $uploads;
29
+ }
30
+
31
+ endif;
inc/admin/ajax.php CHANGED
@@ -292,27 +292,9 @@ function _do_wp_ajax_imagify_get_unoptimized_attachment_ids() {
292
 
293
  @set_time_limit( 0 );
294
 
 
295
  $optimization_level = (int) $_GET['optimization_level'];
296
- $optimization_level = ( -1 !== $optimization_level ) ? $optimization_level : get_imagify_option( 'optimization_level', 1 );
297
- $optimization_level = (int) $optimization_level;
298
-
299
- $meta_query = array(
300
- 'relation' => 'OR',
301
- array(
302
- 'key' => '_imagify_optimization_level',
303
- 'value' => $optimization_level,
304
- 'compare' => '!=',
305
- ),
306
- array(
307
- 'key' => '_imagify_optimization_level',
308
- 'compare' => 'NOT EXISTS',
309
- ),
310
- array(
311
- 'key' => '_imagify_status',
312
- 'value' => 'error',
313
- 'compare' => '=',
314
- ),
315
- );
316
 
317
  /**
318
  * Filter the unoptimized attachments limit query.
@@ -321,131 +303,143 @@ function _do_wp_ajax_imagify_get_unoptimized_attachment_ids() {
321
  *
322
  * @param int The limit (-1 for unlimited).
323
  */
324
- $unoptimized_attachment_limit = apply_filters( 'imagify_unoptimized_attachment_limit', 10000 );
325
-
326
- $args = array(
327
- 'fields' => 'ids',
328
- 'post_type' => 'attachment',
329
- 'post_status' => 'any',
330
- 'post_mime_type' => get_imagify_mime_type(),
331
- 'meta_query' => $meta_query,
332
- 'posts_per_page' => $unoptimized_attachment_limit,
333
- 'orderby' => 'ID',
334
- 'order' => 'DESC',
335
- 'no_found_rows' => true,
336
- 'update_post_term_cache' => false,
337
- );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
338
 
339
- $data = array();
340
- $attachments = new WP_Query( $args );
341
- $ids = $attachments->posts;
342
- $ids = array_filter( (array) $ids );
343
- $sql_ids = implode( ',', $ids );
344
 
345
- if ( empty( $sql_ids ) ) {
346
  wp_send_json_error( array( 'message' => 'no-images' ) );
347
  }
348
 
349
- // Get attachments filename.
350
- $attachments_filename = $wpdb->get_results( // WPCS: unprepared SQL ok.
351
- "SELECT pm.post_id as id, pm.meta_value as value
352
- FROM $wpdb->postmeta as pm
353
- WHERE pm.meta_key = '_wp_attached_file'
354
- AND pm.post_id IN ($sql_ids)
355
- ORDER BY pm.post_id DESC",
356
- ARRAY_A
357
- );
358
-
359
- $attachments_filename = imagify_query_results_combine( $ids, $attachments_filename );
360
-
361
- // Get attachments data.
362
- $attachments_data = $wpdb->get_results( // WPCS: unprepared SQL ok.
363
- "SELECT pm.post_id as id, pm.meta_value as value
364
- FROM $wpdb->postmeta as pm
365
- WHERE pm.meta_key = '_imagify_data'
366
- AND pm.post_id IN ($sql_ids)
367
- ORDER BY pm.post_id DESC",
368
- ARRAY_A
369
- );
370
-
371
- $attachments_data = imagify_query_results_combine( $ids, $attachments_data );
372
- $attachments_data = array_map( 'maybe_unserialize', $attachments_data );
373
-
374
- // Get attachments optimization level.
375
- $attachments_optimization_level = $wpdb->get_results( // WPCS: unprepared SQL ok.
376
- "SELECT pm.post_id as id, pm.meta_value as value
377
- FROM $wpdb->postmeta as pm
378
- WHERE pm.meta_key = '_imagify_optimization_level'
379
- AND pm.post_id IN ($sql_ids)
380
- ORDER BY pm.post_id DESC",
381
- ARRAY_A
382
- );
383
-
384
- $attachments_optimization_level = imagify_query_results_combine( $ids, $attachments_optimization_level );
385
-
386
- // Get attachments status.
387
- $attachments_status = $wpdb->get_results( // WPCS: unprepared SQL ok.
388
- "SELECT pm.post_id as id, pm.meta_value as value
389
- FROM $wpdb->postmeta as pm
390
- WHERE pm.meta_key = '_imagify_status'
391
- AND pm.post_id IN ($sql_ids)
392
- ORDER BY pm.post_id DESC",
393
- ARRAY_A
394
- );
395
-
396
- $attachments_status = imagify_query_results_combine( $ids, $attachments_status );
397
 
398
  // Save the optimization level in a transient to retrieve it later during the process.
399
  set_transient( 'imagify_bulk_optimization_level', $optimization_level );
400
 
401
- foreach ( $ids as $id ) {
402
- /** This filter is documented in inc/functions/process.php. */
403
- $file_path = apply_filters( 'imagify_file_path', get_imagify_attached_file( $attachments_filename[ $id ] ) );
 
 
404
 
405
- if ( ! file_exists( $file_path ) ) {
406
- continue;
407
  }
408
 
409
- $attachment_data = isset( $attachments_data[ $id ] ) ? $attachments_data[ $id ] : false;
410
- $attachment_error = '';
411
-
412
- if ( isset( $attachment_data['sizes']['full']['error'] ) ) {
413
- $attachment_error = $attachment_data['sizes']['full']['error'];
414
- }
415
-
416
- $attachment_error = trim( $attachment_error );
417
- $attachment_status = isset( $attachments_status[ $id ] ) ? $attachments_status[ $id ] : false;
418
- $attachment_optimization_level = isset( $attachments_optimization_level[ $id ] ) ? $attachments_optimization_level[ $id ] : false;
419
- $attachment_backup_path = get_imagify_attachment_backup_path( $file_path );
420
-
421
  // Don't try to re-optimize if the optimization level is still the same.
422
  if ( $optimization_level === $attachment_optimization_level && is_string( $attachment_error ) ) {
423
- continue;
424
- }
425
-
426
- // Don't try to re-optimize if there is no backup file.
427
- if ( 'success' === $attachment_status && $optimization_level !== $attachment_optimization_level && ! file_exists( $attachment_backup_path ) ) {
428
  continue;
429
  }
430
 
431
  // Don't try to re-optimize images already compressed.
432
  if ( 'already_optimized' === $attachment_status && $attachment_optimization_level >= $optimization_level ) {
 
433
  continue;
434
  }
435
 
 
 
436
  // Don't try to re-optimize images with an empty error message.
437
  if ( 'error' === $attachment_status && empty( $attachment_error ) ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
438
  continue;
439
  }
440
 
441
- $data[ '_' . $id ] = get_imagify_attachment_url( $attachments_filename[ $id ] );
442
  } // End foreach().
443
 
444
- if ( $data ) {
445
- wp_send_json_success( $data );
446
  }
447
 
448
- wp_send_json_error( array( 'message' => 'no-images' ) );
449
  }
450
 
451
  /** --------------------------------------------------------------------------------------------- */
292
 
293
  @set_time_limit( 0 );
294
 
295
+ // Get (ordered) IDs.
296
  $optimization_level = (int) $_GET['optimization_level'];
297
+ $optimization_level = ( -1 !== $optimization_level ) ? $optimization_level : (int) get_imagify_option( 'optimization_level', 1 );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
298
 
299
  /**
300
  * Filter the unoptimized attachments limit query.
303
  *
304
  * @param int The limit (-1 for unlimited).
305
  */
306
+ $unoptimized_attachment_limit = (int) apply_filters( 'imagify_unoptimized_attachment_limit', 10000 );
307
+ $unoptimized_attachment_limit = -1 === $unoptimized_attachment_limit ? PHP_INT_MAX : $unoptimized_attachment_limit;
308
+
309
+ $mime_types = get_imagify_mime_type();
310
+ $mime_types = esc_sql( $mime_types );
311
+ $mime_types = "'" . implode( "','", $mime_types ) . "'";
312
+
313
+ $ids = $wpdb->get_col( $wpdb->prepare( // WPCS: unprepared SQL ok.
314
+ "SELECT $wpdb->posts.ID
315
+ FROM $wpdb->posts
316
+ LEFT JOIN $wpdb->postmeta
317
+ ON ( $wpdb->posts.ID = $wpdb->postmeta.post_id AND $wpdb->postmeta.meta_key = '_imagify_optimization_level' )
318
+ LEFT JOIN $wpdb->postmeta AS mt1
319
+ ON ( $wpdb->posts.ID = mt1.post_id AND mt1.meta_key = '_imagify_status' )
320
+ WHERE
321
+ $wpdb->posts.post_mime_type IN ( $mime_types )
322
+ AND (
323
+ $wpdb->postmeta.meta_value != '%d'
324
+ OR
325
+ $wpdb->postmeta.post_id IS NULL
326
+ OR
327
+ mt1.meta_value = 'error'
328
+ )
329
+ AND $wpdb->posts.post_type = 'attachment'
330
+ AND $wpdb->posts.post_status <> 'trash'
331
+ AND $wpdb->posts.post_status <> 'auto-draft'
332
+ GROUP BY $wpdb->posts.ID
333
+ ORDER BY
334
+ CASE mt1.meta_value
335
+ WHEN 'already_optimized' THEN 2
336
+ ELSE 1
337
+ END ASC,
338
+ $wpdb->posts.ID DESC
339
+ LIMIT 0, %d",
340
+ $optimization_level,
341
+ $unoptimized_attachment_limit
342
+ ) );
343
 
344
+ $wpdb->flush();
345
+ unset( $unoptimized_attachment_limit, $mime_types );
346
+ $ids = array_filter( array_map( 'absint', $ids ) );
 
 
347
 
348
+ if ( ! $ids ) {
349
  wp_send_json_error( array( 'message' => 'no-images' ) );
350
  }
351
 
352
+ $results = imagify_get_wpdb_metas( array(
353
+ // Get attachments filename.
354
+ 'filenames' => '_wp_attached_file',
355
+ // Get attachments data.
356
+ 'data' => '_imagify_data',
357
+ // Get attachments optimization level.
358
+ 'optimization_levels' => '_imagify_optimization_level',
359
+ // Get attachments status.
360
+ 'statuses' => '_imagify_status',
361
+ ), $ids );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
362
 
363
  // Save the optimization level in a transient to retrieve it later during the process.
364
  set_transient( 'imagify_bulk_optimization_level', $optimization_level );
365
 
366
+ // First run.
367
+ foreach ( $ids as $i => $id ) {
368
+ $attachment_status = isset( $results['statuses'][ $id ] ) ? $results['statuses'][ $id ] : false;
369
+ $attachment_optimization_level = isset( $results['optimization_levels'][ $id ] ) ? $results['optimization_levels'][ $id ] : false;
370
+ $attachment_error = '';
371
 
372
+ if ( isset( $results['data'][ $id ]['sizes']['full']['error'] ) ) {
373
+ $attachment_error = $results['data'][ $id ]['sizes']['full']['error'];
374
  }
375
 
 
 
 
 
 
 
 
 
 
 
 
 
376
  // Don't try to re-optimize if the optimization level is still the same.
377
  if ( $optimization_level === $attachment_optimization_level && is_string( $attachment_error ) ) {
378
+ unset( $ids[ $i ] );
 
 
 
 
379
  continue;
380
  }
381
 
382
  // Don't try to re-optimize images already compressed.
383
  if ( 'already_optimized' === $attachment_status && $attachment_optimization_level >= $optimization_level ) {
384
+ unset( $ids[ $i ] );
385
  continue;
386
  }
387
 
388
+ $attachment_error = trim( $attachment_error );
389
+
390
  // Don't try to re-optimize images with an empty error message.
391
  if ( 'error' === $attachment_status && empty( $attachment_error ) ) {
392
+ unset( $ids[ $i ] );
393
+ }
394
+ }
395
+
396
+ if ( ! $ids ) {
397
+ wp_send_json_error( array( 'message' => 'no-images' ) );
398
+ }
399
+
400
+ $ids = array_values( $ids );
401
+
402
+ /**
403
+ * Triggered before testing for file existence.
404
+ *
405
+ * @since 1.6.7
406
+ * @author Grégory Viguier
407
+ *
408
+ * @param array $ids An array of attachment IDs.
409
+ * @param array $results An array of the data fetched from the database.
410
+ * @param int $optimization_level The optimization level that will be used for the optimization.
411
+ */
412
+ do_action( 'imagify_bulk_optimize_before_file_existence_tests', $ids, $results, $optimization_level );
413
+
414
+ $data = array();
415
+
416
+ foreach ( $ids as $i => $id ) {
417
+ $file_path = get_imagify_attached_file( $results['filenames'][ $id ] );
418
+
419
+ /** This filter is documented in inc/functions/process.php. */
420
+ $file_path = apply_filters( 'imagify_file_path', $file_path );
421
+
422
+ if ( ! $file_path || ! file_exists( $file_path ) ) {
423
+ continue;
424
+ }
425
+
426
+ $attachment_backup_path = get_imagify_attachment_backup_path( $file_path );
427
+ $attachment_status = isset( $results['statuses'][ $id ] ) ? $results['statuses'][ $id ] : false;
428
+ $attachment_optimization_level = isset( $results['optimization_levels'][ $id ] ) ? $results['optimization_levels'][ $id ] : false;
429
+
430
+ // Don't try to re-optimize if there is no backup file.
431
+ if ( 'success' === $attachment_status && $optimization_level !== $attachment_optimization_level && ! file_exists( $attachment_backup_path ) ) {
432
  continue;
433
  }
434
 
435
+ $data[ '_' . $id ] = get_imagify_attachment_url( $results['filenames'][ $id ] );
436
  } // End foreach().
437
 
438
+ if ( ! $data ) {
439
+ wp_send_json_error( array( 'message' => 'no-images' ) );
440
  }
441
 
442
+ wp_send_json_success( $data );
443
  }
444
 
445
  /** --------------------------------------------------------------------------------------------- */
inc/admin/heartbeat.php CHANGED
File without changes
inc/admin/options.php CHANGED
@@ -107,7 +107,7 @@ add_action( 'update_option_' . IMAGIFY_SETTINGS_SLUG, '_imagify_after_save_optio
107
  function _imagify_after_save_options( $old_value, $value ) {
108
 
109
  if ( $old_value && $value && ( ! isset( $old_value['api_key'] ) || $old_value['api_key'] !== $value['api_key'] ) ) {
110
- if ( is_wp_error( imagify()->get_user() ) ) {
111
  imagify_renew_notice( 'wrong-api-key' );
112
  delete_site_transient( 'imagify_check_licence_1' );
113
  } else {
107
  function _imagify_after_save_options( $old_value, $value ) {
108
 
109
  if ( $old_value && $value && ( ! isset( $old_value['api_key'] ) || $old_value['api_key'] !== $value['api_key'] ) ) {
110
+ if ( is_wp_error( get_imagify_user() ) ) {
111
  imagify_renew_notice( 'wrong-api-key' );
112
  delete_site_transient( 'imagify_check_licence_1' );
113
  } else {
inc/api/imagify.php CHANGED
@@ -62,6 +62,8 @@ function fetch_imagify_image( $data ) {
62
  /**
63
  * Optimize an image by sharing its URL on Imagify.
64
  *
 
 
65
  * @param array $data All image data.
66
  * @return object
67
  */
62
  /**
63
  * Optimize an image by sharing its URL on Imagify.
64
  *
65
+ * @since 1.6.7 $data['image'] can contain the file path (prefered) or the result of `curl_file_create()`.
66
+ *
67
  * @param array $data All image data.
68
  * @return object
69
  */
inc/classes/abstracts/class-imagify-abstract-attachment.php CHANGED
@@ -23,7 +23,7 @@ class Imagify_Abstract_Attachment {
23
  * @var int
24
  * @access public
25
  */
26
- public $id;
27
 
28
  /**
29
  * The constructor.
@@ -33,7 +33,21 @@ class Imagify_Abstract_Attachment {
33
  * @param int $id The attachment ID.
34
  * @return void
35
  */
36
- public function __construct( $id = 0 ) {}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
 
38
  /**
39
  * Get the attachment backup filepath.
23
  * @var int
24
  * @access public
25
  */
26
+ public $id = 0;
27
 
28
  /**
29
  * The constructor.
33
  * @param int $id The attachment ID.
34
  * @return void
35
  */
36
+ public function __construct( $id = 0 ) {
37
+ global $post;
38
+
39
+ if ( $id ) {
40
+ if ( is_a( $id, 'WP_Post' ) ) {
41
+ $this->id = $id->ID;
42
+ } elseif ( is_numeric( $id ) ) {
43
+ $this->id = $id;
44
+ }
45
+ } elseif ( $post && is_a( $post, 'WP_Post' ) ) {
46
+ $this->id = $post->ID;
47
+ }
48
+
49
+ $this->id = absint( $this->id );
50
+ }
51
 
52
  /**
53
  * Get the attachment backup filepath.
inc/classes/abstracts/class-imagify-abstract-db.php CHANGED
File without changes
inc/classes/class-imagify-attachment.php CHANGED
@@ -15,24 +15,6 @@ class Imagify_Attachment extends Imagify_Abstract_Attachment {
15
  */
16
  const VERSION = '1.0.2';
17
 
18
- /**
19
- * The constructor
20
- *
21
- * @since 1.0
22
- *
23
- * @param int $id The attachment ID.
24
- * @return void
25
- */
26
- public function __construct( $id = 0 ) {
27
- global $post;
28
-
29
- if ( is_object( $post ) && ! $id ) {
30
- $this->id = $post->ID;
31
- } else {
32
- $this->id = (int) $id;
33
- }
34
- }
35
-
36
  /**
37
  * Get the attachment backup filepath.
38
  *
15
  */
16
  const VERSION = '1.0.2';
17
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
  /**
19
  * Get the attachment backup filepath.
20
  *
inc/classes/class-imagify.php CHANGED
@@ -11,7 +11,7 @@ class Imagify extends Imagify_Deprecated {
11
  *
12
  * @var string
13
  */
14
- const VERSION = '1.0.1';
15
  /**
16
  * The Imagify API endpoint.
17
  *
@@ -27,12 +27,19 @@ class Imagify extends Imagify_Deprecated {
27
  private $api_key = '';
28
 
29
  /**
30
- * HTTP headers.
31
  *
32
  * @var array
33
  */
34
  private $headers = array();
35
 
 
 
 
 
 
 
 
36
  /**
37
  * The single instance of the class.
38
  *
@@ -59,9 +66,9 @@ class Imagify extends Imagify_Deprecated {
59
  $this->api_key = IMAGIFY_API_KEY;
60
  }
61
 
62
- $this->headers['Accept'] = 'Accept: application/json';
63
- $this->headers['Content-Type'] = 'Content-Type: application/json';
64
- $this->headers['Authorization'] = 'Authorization: token ' . $this->api_key;
65
  }
66
 
67
  /**
@@ -93,6 +100,8 @@ class Imagify extends Imagify_Deprecated {
93
  static $user;
94
 
95
  if ( ! isset( $user ) ) {
 
 
96
  $user = $this->http_call( 'users/me/', array(
97
  'timeout' => 10,
98
  ) );
@@ -111,8 +120,7 @@ class Imagify extends Imagify_Deprecated {
111
  * @return object
112
  */
113
  public function create_user( $data ) {
114
- unset( $this->headers['Authorization'], $this->headers['Accept'], $this->headers['Content-Type'] );
115
-
116
  $data['from_plugin'] = true;
117
 
118
  return $this->http_call( 'users/', array(
@@ -131,6 +139,8 @@ class Imagify extends Imagify_Deprecated {
131
  * @return object
132
  */
133
  public function update_user( $data ) {
 
 
134
  return $this->http_call( 'users/me/', array(
135
  'method' => 'PUT',
136
  'post_data' => $data,
@@ -151,8 +161,9 @@ class Imagify extends Imagify_Deprecated {
151
  static $status = array();
152
 
153
  if ( ! isset( $status[ $data ] ) ) {
154
- unset( $this->headers['Accept'], $this->headers['Content-Type'] );
155
- $this->headers['Authorization'] = 'Authorization: token ' . $data;
 
156
 
157
  $status[ $data ] = $this->http_call( 'status/', array(
158
  'timeout' => 10,
@@ -174,7 +185,9 @@ class Imagify extends Imagify_Deprecated {
174
  static $api_version;
175
 
176
  if ( ! isset( $api_version ) ) {
177
- unset( $this->headers['Accept'], $this->headers['Content-Type'] );
 
 
178
 
179
  $api_version = $this->http_call( 'version/', array(
180
  'timeout' => 5,
@@ -193,20 +206,25 @@ class Imagify extends Imagify_Deprecated {
193
  * @return object
194
  */
195
  public function get_public_info() {
 
 
196
  return $this->http_call( 'public-info' );
197
  }
198
 
199
  /**
200
  * Optimize an image from its binary content.
201
  *
202
- * @access public
203
- * @since 1.6.5
 
204
  *
205
- * @param string $data All options. Details here: --.
206
  * @return object
207
  */
208
  public function upload_image( $data ) {
209
- unset( $this->headers['Accept'], $this->headers['Content-Type'] );
 
 
210
 
211
  return $this->http_call( 'upload/', array(
212
  'method' => 'POST',
@@ -224,6 +242,8 @@ class Imagify extends Imagify_Deprecated {
224
  * @return object
225
  */
226
  public function fetch_image( $data ) {
 
 
227
  return $this->http_call( 'fetch/', array(
228
  'method' => 'POST',
229
  'post_data' => wp_json_encode( $data ),
@@ -239,6 +259,8 @@ class Imagify extends Imagify_Deprecated {
239
  * @return object
240
  */
241
  public function get_plans_prices() {
 
 
242
  return $this->http_call( 'pricing/plan/' );
243
  }
244
 
@@ -251,6 +273,8 @@ class Imagify extends Imagify_Deprecated {
251
  * @return object
252
  */
253
  public function get_packs_prices() {
 
 
254
  return $this->http_call( 'pricing/pack/' );
255
  }
256
 
@@ -263,6 +287,8 @@ class Imagify extends Imagify_Deprecated {
263
  * @return object
264
  */
265
  public function get_all_prices() {
 
 
266
  return $this->http_call( 'pricing/all/' );
267
  }
268
 
@@ -276,6 +302,8 @@ class Imagify extends Imagify_Deprecated {
276
  * @return object
277
  */
278
  public function check_coupon_code( $coupon ) {
 
 
279
  return $this->http_call( 'coupons/' . $coupon . '/' );
280
  }
281
 
@@ -288,14 +316,17 @@ class Imagify extends Imagify_Deprecated {
288
  * @return object
289
  */
290
  public function check_discount() {
 
 
291
  return $this->http_call( 'pricing/discount/' );
292
  }
293
 
294
  /**
295
  * Make an HTTP call using curl.
296
  *
297
- * @access public
298
- * @since 1.6.5
 
299
  *
300
  * @param string $url The URL to call.
301
  * @param array $args The request args.
@@ -308,6 +339,64 @@ class Imagify extends Imagify_Deprecated {
308
  'timeout' => 45,
309
  ), $args );
310
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
311
  // Check if php-curl is enabled.
312
  if ( ! function_exists( 'curl_init' ) || ! function_exists( 'curl_exec' ) ) {
313
  return new WP_Error( 'curl', 'cURL isn\'t installed on the server.' );
@@ -316,9 +405,16 @@ class Imagify extends Imagify_Deprecated {
316
  try {
317
  $ch = curl_init();
318
 
 
 
 
 
319
  if ( 'POST' === $args['method'] ) {
320
  curl_setopt( $ch, CURLOPT_POST, true );
321
  curl_setopt( $ch, CURLOPT_POSTFIELDS, $args['post_data'] );
 
 
 
322
  }
323
 
324
  curl_setopt( $ch, CURLOPT_URL, self::API_ENDPOINT . $url );
@@ -329,7 +425,7 @@ class Imagify extends Imagify_Deprecated {
329
  curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 );
330
  curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 );
331
 
332
- $response = json_decode( curl_exec( $ch ) );
333
  $error = curl_error( $ch );
334
  $http_code = (int) curl_getinfo( $ch, CURLINFO_HTTP_CODE );
335
 
@@ -338,6 +434,24 @@ class Imagify extends Imagify_Deprecated {
338
  return new WP_Error( 'curl', 'Unknown error occurred' );
339
  }
340
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
341
  if ( 200 !== $http_code && isset( $response->code, $response->detail ) ) {
342
  return new WP_Error( $http_code, $response->detail );
343
  }
@@ -348,7 +462,7 @@ class Imagify extends Imagify_Deprecated {
348
 
349
  if ( 200 !== $http_code ) {
350
  $error = '' !== $error ? ' - ' . htmlentities( $error ) : '';
351
- return new WP_Error( $http_code, "Unknown error occurred ({$http_code}{$error}) " );
352
  }
353
 
354
  return $response;
11
  *
12
  * @var string
13
  */
14
+ const VERSION = '1.0.6';
15
  /**
16
  * The Imagify API endpoint.
17
  *
27
  private $api_key = '';
28
 
29
  /**
30
+ * HTTP headers. Each http call must fill it (even if it's with an empty array).
31
  *
32
  * @var array
33
  */
34
  private $headers = array();
35
 
36
+ /**
37
+ * All (default) HTTP headers. They must not be modified once the class is instanciated, or it will affect any following HTTP calls.
38
+ *
39
+ * @var array
40
+ */
41
+ private $all_headers = array();
42
+
43
  /**
44
  * The single instance of the class.
45
  *
66
  $this->api_key = IMAGIFY_API_KEY;
67
  }
68
 
69
+ $this->all_headers['Accept'] = 'Accept: application/json';
70
+ $this->all_headers['Content-Type'] = 'Content-Type: application/json';
71
+ $this->all_headers['Authorization'] = 'Authorization: token ' . $this->api_key;
72
  }
73
 
74
  /**
100
  static $user;
101
 
102
  if ( ! isset( $user ) ) {
103
+ $this->headers = $this->all_headers;
104
+
105
  $user = $this->http_call( 'users/me/', array(
106
  'timeout' => 10,
107
  ) );
120
  * @return object
121
  */
122
  public function create_user( $data ) {
123
+ $this->headers = array();
 
124
  $data['from_plugin'] = true;
125
 
126
  return $this->http_call( 'users/', array(
139
  * @return object
140
  */
141
  public function update_user( $data ) {
142
+ $this->headers = $this->all_headers;
143
+
144
  return $this->http_call( 'users/me/', array(
145
  'method' => 'PUT',
146
  'post_data' => $data,
161
  static $status = array();
162
 
163
  if ( ! isset( $status[ $data ] ) ) {
164
+ $this->headers = array(
165
+ 'Authorization' => 'Authorization: token ' . $data,
166
+ );
167
 
168
  $status[ $data ] = $this->http_call( 'status/', array(
169
  'timeout' => 10,
185
  static $api_version;
186
 
187
  if ( ! isset( $api_version ) ) {
188
+ $this->headers = array(
189
+ 'Authorization' => $this->all_headers['Authorization'],
190
+ );
191
 
192
  $api_version = $this->http_call( 'version/', array(
193
  'timeout' => 5,
206
  * @return object
207
  */
208
  public function get_public_info() {
209
+ $this->headers = $this->all_headers;
210
+
211
  return $this->http_call( 'public-info' );
212
  }
213
 
214
  /**
215
  * Optimize an image from its binary content.
216
  *
217
+ * @access public
218
+ * @since 1.6.5
219
+ * @since 1.6.7 $data['image'] can contain the file path (prefered) or the result of `curl_file_create()`.
220
  *
221
+ * @param string $data All options.
222
  * @return object
223
  */
224
  public function upload_image( $data ) {
225
+ $this->headers = array(
226
+ 'Authorization' => $this->all_headers['Authorization'],
227
+ );
228
 
229
  return $this->http_call( 'upload/', array(
230
  'method' => 'POST',
242
  * @return object
243
  */
244
  public function fetch_image( $data ) {
245
+ $this->headers = $this->all_headers;
246
+
247
  return $this->http_call( 'fetch/', array(
248
  'method' => 'POST',
249
  'post_data' => wp_json_encode( $data ),
259
  * @return object
260
  */
261
  public function get_plans_prices() {
262
+ $this->headers = $this->all_headers;
263
+
264
  return $this->http_call( 'pricing/plan/' );
265
  }
266
 
273
  * @return object
274
  */
275
  public function get_packs_prices() {
276
+ $this->headers = $this->all_headers;
277
+
278
  return $this->http_call( 'pricing/pack/' );
279
  }
280
 
287
  * @return object
288
  */
289
  public function get_all_prices() {
290
+ $this->headers = $this->all_headers;
291
+
292
  return $this->http_call( 'pricing/all/' );
293
  }
294
 
302
  * @return object
303
  */
304
  public function check_coupon_code( $coupon ) {
305
+ $this->headers = $this->all_headers;
306
+
307
  return $this->http_call( 'coupons/' . $coupon . '/' );
308
  }
309
 
316
  * @return object
317
  */
318
  public function check_discount() {
319
+ $this->headers = $this->all_headers;
320
+
321
  return $this->http_call( 'pricing/discount/' );
322
  }
323
 
324
  /**
325
  * Make an HTTP call using curl.
326
  *
327
+ * @access private
328
+ * @since 1.6.5
329
+ * @since 1.6.7 Use `wp_remote_request()` when possible (when we don't need to send an image).
330
  *
331
  * @param string $url The URL to call.
332
  * @param array $args The request args.
339
  'timeout' => 45,
340
  ), $args );
341
 
342
+ $endpoint = trim( $url, '/' );
343
+ /**
344
+ * Filter the timeout value for any request to the API.
345
+ *
346
+ * @since 1.6.7
347
+ * @author Grégory Viguier
348
+ *
349
+ * @param int $timeout Timeout value in seconds.
350
+ * @param string $endpoint The targetted endpoint. It's basically URI without heading nor trailing slash.
351
+ */
352
+ $args['timeout'] = apply_filters( 'imagify_api_http_request_timeout', $args['timeout'], $endpoint );
353
+
354
+ // We need to send an image: we must use cURL directly.
355
+ if ( isset( $args['post_data']['image'] ) ) {
356
+ return $this->curl_http_call( $url, $args );
357
+ }
358
+
359
+ $args = array_merge( array(
360
+ 'headers' => array(),
361
+ 'body' => $args['post_data'],
362
+ 'sslverify' => apply_filters( 'https_ssl_verify', false ),
363
+ ), $args );
364
+
365
+ unset( $args['post_data'] );
366
+
367
+ if ( $this->headers ) {
368
+ foreach ( $this->headers as $name => $value ) {
369
+ $value = explode( ':', $value, 2 );
370
+ $value = end( $value );
371
+
372
+ $args['headers'][ $name ] = trim( $value );
373
+ }
374
+ }
375
+
376
+ $response = wp_remote_request( self::API_ENDPOINT . $url, $args );
377
+
378
+ if ( is_wp_error( $response ) ) {
379
+ return $response;
380
+ }
381
+
382
+ $http_code = wp_remote_retrieve_response_code( $response );
383
+ $response = wp_remote_retrieve_body( $response );
384
+
385
+ return $this->handle_response( $response, $http_code );
386
+ }
387
+
388
+ /**
389
+ * Make an HTTP call using curl.
390
+ *
391
+ * @access private
392
+ * @since 1.6.7
393
+ * @author Grégory Viguier
394
+ *
395
+ * @param string $url The URL to call.
396
+ * @param array $args The request args.
397
+ * @return object
398
+ */
399
+ private function curl_http_call( $url, $args = array() ) {
400
  // Check if php-curl is enabled.
401
  if ( ! function_exists( 'curl_init' ) || ! function_exists( 'curl_exec' ) ) {
402
  return new WP_Error( 'curl', 'cURL isn\'t installed on the server.' );
405
  try {
406
  $ch = curl_init();
407
 
408
+ if ( isset( $args['post_data']['image'] ) && is_string( $args['post_data']['image'] ) && file_exists( $args['post_data']['image'] ) ) {
409
+ $args['post_data']['image'] = curl_file_create( $args['post_data']['image'] );
410
+ }
411
+
412
  if ( 'POST' === $args['method'] ) {
413
  curl_setopt( $ch, CURLOPT_POST, true );
414
  curl_setopt( $ch, CURLOPT_POSTFIELDS, $args['post_data'] );
415
+ } elseif ( 'PUT' === $args['method'] ) {
416
+ curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, 'PUT' );
417
+ curl_setopt( $ch, CURLOPT_POSTFIELDS, $args['post_data'] );
418
  }
419
 
420
  curl_setopt( $ch, CURLOPT_URL, self::API_ENDPOINT . $url );
425
  curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 );
426
  curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 );
427
 
428
+ $response = curl_exec( $ch );
429
  $error = curl_error( $ch );
430
  $http_code = (int) curl_getinfo( $ch, CURLINFO_HTTP_CODE );
431
 
434
  return new WP_Error( 'curl', 'Unknown error occurred' );
435
  }
436
 
437
+ return $this->handle_response( $response, $http_code, $error );
438
+ }
439
+
440
+ /**
441
+ * Handle the request response and maybe trigger an error.
442
+ *
443
+ * @access private
444
+ * @since 1.6.7
445
+ * @author Grégory Viguier
446
+ *
447
+ * @param string $response The request response.
448
+ * @param int $http_code The request HTTP code.
449
+ * @param string $error An error message.
450
+ * @return object
451
+ */
452
+ private function handle_response( $response, $http_code, $error = '' ) {
453
+ $response = json_decode( $response );
454
+
455
  if ( 200 !== $http_code && isset( $response->code, $response->detail ) ) {
456
  return new WP_Error( $http_code, $response->detail );
457
  }
462
 
463
  if ( 200 !== $http_code ) {
464
  $error = '' !== $error ? ' - ' . htmlentities( $error ) : '';
465
+ return new WP_Error( $http_code, "Unknown error occurred ({$http_code} {$error})" );
466
  }
467
 
468
  return $response;
inc/compat.php CHANGED
@@ -30,9 +30,9 @@ if ( ! function_exists( 'wp_json_encode' ) ) :
30
  * @since 1.6.5
31
  * @since WP 4.1.0
32
  *
33
- * @param mixed $data Variable (usually an array or object) to encode as JSON.
34
- * @param int $options Optional. Options to be passed to json_encode(). Default 0.
35
- * @param int $depth Optional. Maximum depth to walk through $data. Must be greater than 0. Default 512.
36
  * @return string|false The JSON encoded string, or false if it cannot be encoded.
37
  */
38
  function wp_json_encode( $data, $options = 0, $depth = 512 ) {
@@ -83,7 +83,7 @@ if ( ! function_exists( '_wp_json_prepare_data' ) ) :
83
  * @since WP 4.4.0
84
  * @access private
85
  *
86
- * @param mixed $data Native representation.
87
  * @return bool|int|float|null|string|array Data ready for `json_encode()`.
88
  */
89
  function _wp_json_prepare_data( $data ) {
@@ -207,7 +207,7 @@ if ( ! function_exists( '_wp_json_convert_string' ) ) :
207
  *
208
  * @staticvar bool $use_mb
209
  *
210
- * @param string $string The string which is to be converted.
211
  * @return string The checked string.
212
  */
213
  function _wp_json_convert_string( $string ) {
@@ -229,3 +229,32 @@ if ( ! function_exists( '_wp_json_convert_string' ) ) :
229
  }
230
 
231
  endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  * @since 1.6.5
31
  * @since WP 4.1.0
32
  *
33
+ * @param mixed $data Variable (usually an array or object) to encode as JSON.
34
+ * @param int $options Optional. Options to be passed to json_encode(). Default 0.
35
+ * @param int $depth Optional. Maximum depth to walk through $data. Must be greater than 0. Default 512.
36
  * @return string|false The JSON encoded string, or false if it cannot be encoded.
37
  */
38
  function wp_json_encode( $data, $options = 0, $depth = 512 ) {
83
  * @since WP 4.4.0
84
  * @access private
85
  *
86
+ * @param mixed $data Native representation.
87
  * @return bool|int|float|null|string|array Data ready for `json_encode()`.
88
  */
89
  function _wp_json_prepare_data( $data ) {
207
  *
208
  * @staticvar bool $use_mb
209
  *
210
+ * @param string $string The string which is to be converted.
211
  * @return string The checked string.
212
  */
213
  function _wp_json_convert_string( $string ) {
229
  }
230
 
231
  endif;
232
+
233
+ if ( ! function_exists( 'wp_normalize_path' ) ) :
234
+
235
+ /**
236
+ * Normalize a filesystem path.
237
+ *
238
+ * On windows systems, replaces backslashes with forward slashes
239
+ * and forces upper-case drive letters.
240
+ * Allows for two leading slashes for Windows network shares, but
241
+ * ensures that all other duplicate slashes are reduced to a single.
242
+ *
243
+ * @since 1.6.7
244
+ * @since WP 3.9.0
245
+ * @since WP 4.4.0 Ensures upper-case drive letters on Windows systems.
246
+ * @since WP 4.5.0 Allows for Windows network shares.
247
+ *
248
+ * @param string $path Path to normalize.
249
+ * @return string Normalized path.
250
+ */
251
+ function wp_normalize_path( $path ) {
252
+ $path = str_replace( '\\', '/', $path );
253
+ $path = preg_replace( '|(?<=.)/+|', '/', $path );
254
+ if ( ':' === substr( $path, 1, 1 ) ) {
255
+ $path = ucfirst( $path );
256
+ }
257
+ return $path;
258
+ }
259
+
260
+ endif;
inc/functions/admin-stats.php CHANGED
@@ -186,13 +186,14 @@ function imagify_percent_optimized_attachments() {
186
  $total_attachments = imagify_count_attachments();
187
  $total_optimized_attachments = imagify_count_optimized_attachments();
188
 
189
- return ( 0 !== $total_attachments ) ? round( ( 100 - ( ( $total_attachments - $total_optimized_attachments ) / $total_attachments ) * 100 ) ) : 0;
190
  }
191
 
192
  /**
193
  * Count percent, original & optimized size of all images optimized by Imagify.
194
  *
195
- * @since 1.0
 
196
  * @author Jonathan Buttigieg
197
  *
198
  * @param string $key What data to return. Choices are between 'count', 'original_size', 'optimized_size', and 'percent'. If left empty, the whole array is returned.
@@ -206,54 +207,137 @@ function imagify_count_saving_data( $key = '' ) {
206
  * 3rd party will be able to override the result.
207
  *
208
  * @since 1.5
 
 
 
209
  */
210
  $attachments = apply_filters( 'imagify_count_saving_data', false );
211
 
212
- if ( false === $attachments ) {
213
- $attachments = $wpdb->get_col( "
214
- SELECT pm1.meta_value
215
- FROM $wpdb->postmeta as pm1
216
- INNER JOIN $wpdb->postmeta as pm2
217
- ON pm1.post_id = pm2.post_id
218
- WHERE pm1.meta_key = '_imagify_data'
219
- AND ( pm2.meta_key = '_imagify_status' AND pm2.meta_value = 'success' )"
220
- );
221
- }
222
-
223
- $attachments = array_map( 'maybe_unserialize', (array) $attachments );
224
-
225
  $original_size = 0;
226
  $optimized_size = 0;
227
  $count = 0;
228
 
229
- foreach ( $attachments as $attachment_data ) {
230
- if ( ! $attachment_data ) {
231
- continue;
 
 
 
 
 
 
 
 
232
  }
233
 
234
- ++$count;
235
- $original_data = $attachment_data['sizes']['full'];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
236
 
237
- // Increment the original sizes.
238
- $original_size += $original_data['original_size'];
239
- $optimized_size += $original_data['optimized_size'];
240
 
241
- unset( $attachment_data['sizes']['full'] );
 
 
 
 
 
 
242
 
243
- // Increment the thumbnails sizes.
244
- foreach ( $attachment_data['sizes'] as $size_data ) {
245
- if ( ! empty( $size_data['success'] ) ) {
246
- $original_size += $size_data['original_size'];
247
- $optimized_size += $size_data['optimized_size'];
248
  }
249
- }
250
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
251
 
252
  $data = array(
253
  'count' => $count,
254
  'original_size' => $original_size,
255
  'optimized_size' => $optimized_size,
256
- 'percent' => $optimized_size ? ceil( ( ( $original_size - $optimized_size ) / $original_size ) * 100 ) : 0,
257
  );
258
 
259
  if ( ! empty( $key ) ) {
@@ -277,22 +361,22 @@ function imagify_count_saving_data( $key = '' ) {
277
  function imagify_calculate_total_size_images_library() {
278
  global $wpdb;
279
 
280
- $images_id = $wpdb->get_results( "
281
  SELECT ID FROM $wpdb->posts
282
  WHERE ( post_mime_type LIKE 'image/%' )
283
  AND post_type = 'attachment' AND ( post_status = 'inherit' )
284
  LIMIT 250
285
  ", ARRAY_A );
286
 
287
- $images_id = wp_list_pluck( $images_id, 'ID' );
288
 
289
- if ( ! $images_id ) {
290
  return 0;
291
  }
292
 
293
- $partial_total_images = count( $images_id );
294
  $total_images = imagify_count_attachments();
295
- $total_size_images = imagify_calculate_total_image_size( $images_id, $partial_total_images, $total_images );
296
 
297
  return $total_size_images;
298
  }
@@ -390,105 +474,103 @@ function imagify_calculate_average_size_images_per_month() {
390
  * @since 1.6
391
  * @author Remy Perona
392
  *
393
- * @param array $images_id Array of images ID.
394
  * @param int $partial_total_images The number of images we're doing the calculation with.
395
  * @param int $total_images The total number of images.
396
  * @return int The estimated total size of images.
397
  */
398
- function imagify_calculate_total_image_size( $images_id, $partial_total_images, $total_images ) {
399
  global $wpdb;
400
- $partial_size_images = '';
401
- $partial_total_intermediate_images = '';
402
- $sql_ids = implode( ',', $images_id );
403
-
404
- // Get attachments filename.
405
- $attachments_filename = $wpdb->get_results( // WPCS: unprepared SQL ok.
406
- "
407
- SELECT pm.post_id as id, pm.meta_value as value
408
- FROM $wpdb->postmeta as pm
409
- WHERE pm.meta_key = '_wp_attached_file'
410
- AND pm.post_id IN ($sql_ids)
411
- ORDER BY pm.post_id DESC
412
- ", ARRAY_A
413
- );
414
 
415
- $attachments_filename = imagify_query_results_combine( $images_id, $attachments_filename );
416
-
417
- // Get attachments data.
418
- $attachments_data = $wpdb->get_results( // WPCS: unprepared SQL ok.
419
- "
420
- SELECT pm.post_id as id, pm.meta_value as value
421
- FROM $wpdb->postmeta as pm
422
- WHERE pm.meta_key = '_wp_attachment_metadata'
423
- AND pm.post_id IN ($sql_ids)
424
- ORDER BY pm.post_id DESC
425
- ", ARRAY_A
426
- );
427
-
428
- $attachments_data = imagify_query_results_combine( $images_id, $attachments_data );
429
- $attachments_data = array_map( 'maybe_unserialize', $attachments_data );
430
-
431
- // Get imagify data.
432
- $imagify_data = $wpdb->get_results( // WPCS: unprepared SQL ok.
433
- "
434
- SELECT pm.post_id as id, pm.meta_value as value
435
- FROM $wpdb->postmeta as pm
436
- WHERE pm.meta_key = '_imagify_data'
437
- AND pm.post_id IN ($sql_ids)
438
- ORDER BY pm.post_id DESC
439
- ", ARRAY_A
440
- );
441
 
442
- $imagify_data = imagify_query_results_combine( $images_id, $imagify_data );
443
- $imagify_data = array_map( 'maybe_unserialize', $imagify_data );
444
-
445
- // Get attachments status.
446
- $attachments_status = $wpdb->get_results( // WPCS: unprepared SQL ok.
447
- "
448
- SELECT pm.post_id as id, pm.meta_value as value
449
- FROM $wpdb->postmeta as pm
450
- WHERE pm.meta_key = '_imagify_status'
451
- AND pm.post_id IN ($sql_ids)
452
- ORDER BY pm.post_id DESC
453
- ", ARRAY_A
454
- );
455
-
456
- $attachments_status = imagify_query_results_combine( $images_id, $attachments_status );
457
-
458
- foreach ( $images_id as $image_id ) {
459
- $attachment_status = isset( $attachments_status[ $image_id ] ) ? $attachments_status[ $image_id ] : false;
460
 
461
- if ( 'success' === $attachments_status ) {
462
- $imagify_data = isset( $imagify_data[ $image_id ] ) ? $imagify_data[ $image_id ] : false;
463
- $partial_size_images += $imagify_data['stats']['original_size'];
464
- $partial_total_intermediate_images += count( $attachment_data['sizes'] );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
465
  continue;
466
  }
467
 
468
- $attachment_metadata = isset( $attachments_data[ $image_id ] ) ? $attachments_data[ $image_id ] : false;
469
- $sizes = isset( $attachment_metadata['sizes'] ) ? (array) $attachment_metadata['sizes'] : array();
 
 
470
 
471
  /** This filter is documented in inc/functions/process.php. */
472
- $full_image = apply_filters( 'imagify_file_path', get_imagify_attached_file( $attachments_filename[ $image_id ] ) );
473
- $partial_size_images += filesize( $full_image );
474
 
475
- if ( ! $sizes ) {
476
- continue;
477
- }
478
 
479
- foreach ( $sizes as $size_key => $size_data ) {
480
- if ( array_key_exists( $size_key, get_imagify_option( 'disallowed-sizes', array() ) ) && ! imagify_is_active_for_network() ) {
481
- continue;
 
 
482
  }
483
 
484
- $thumbnail_path = trailingslashit( dirname( $full_image ) ) . $size_data['file'];
 
 
 
 
 
485
 
486
- if ( file_exists( $thumbnail_path ) ) {
487
- $partial_size_images += filesize( $thumbnail_path );
488
- $partial_total_intermediate_images++;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
489
  }
 
 
 
490
  }
491
- }
 
 
492
 
493
  $intermediate_images_per_image = $partial_total_intermediate_images / $partial_total_images;
494
  $average_size_images = $partial_size_images / ( $partial_total_images + $partial_total_intermediate_images );
186
  $total_attachments = imagify_count_attachments();
187
  $total_optimized_attachments = imagify_count_optimized_attachments();
188
 
189
+ return $total_attachments && $total_optimized_attachments ? round( 100 - ( ( $total_attachments - $total_optimized_attachments ) / $total_attachments ) * 100 ) : 0;
190
  }
191
 
192
  /**
193
  * Count percent, original & optimized size of all images optimized by Imagify.
194
  *
195
+ * @since 1.0
196
+ * @since 1.6.7 Revamped to handle huge libraries.
197
  * @author Jonathan Buttigieg
198
  *
199
  * @param string $key What data to return. Choices are between 'count', 'original_size', 'optimized_size', and 'percent'. If left empty, the whole array is returned.
207
  * 3rd party will be able to override the result.
208
  *
209
  * @since 1.5
210
+ * @since 1.6.7 This filter should return an array containing the following keys: 'count', 'original_size', and 'optimized_size'.
211
+ *
212
+ * @param bool|array $attachments An array containing the keys ('count', 'original_size', and 'optimized_size'), or an array of attachments (back compat', deprecated), or false.
213
  */
214
  $attachments = apply_filters( 'imagify_count_saving_data', false );
215
 
 
 
 
 
 
 
 
 
 
 
 
 
 
216
  $original_size = 0;
217
  $optimized_size = 0;
218
  $count = 0;
219
 
220
+ if ( is_array( $attachments ) ) {
221
+ /**
222
+ * Bypass.
223
+ */
224
+ if ( isset( $attachments['count'], $attachments['original_size'], $attachments['optimized_size'] ) ) {
225
+ /**
226
+ * We have the results we need.
227
+ */
228
+ $attachments['percent'] = $attachments['optimized_size'] && $attachments['original_size'] ? ceil( ( ( $attachments['original_size'] - $attachments['optimized_size'] ) / $attachments['original_size'] ) * 100 ) : 0;
229
+
230
+ return $attachments;
231
  }
232
 
233
+ /**
234
+ * Back compat'.
235
+ * The following shouldn't be used. Sites with a huge library won't like it.
236
+ */
237
+ $attachments = array_map( 'maybe_unserialize', (array) $attachments );
238
+
239
+ if ( $attachments ) {
240
+ foreach ( $attachments as $attachment_data ) {
241
+ if ( ! $attachment_data ) {
242
+ continue;
243
+ }
244
+
245
+ ++$count;
246
+ $original_data = $attachment_data['sizes']['full'];
247
+
248
+ // Increment the original sizes.
249
+ $original_size += $original_data['original_size'] ? $original_data['original_size'] : 0;
250
+ $optimized_size += $original_data['optimized_size'] ? $original_data['optimized_size'] : 0;
251
+
252
+ unset( $attachment_data['sizes']['full'] );
253
+
254
+ // Increment the thumbnails sizes.
255
+ foreach ( $attachment_data['sizes'] as $size_data ) {
256
+ if ( ! empty( $size_data['success'] ) ) {
257
+ $original_size += $size_data['original_size'] ? $size_data['original_size'] : 0;
258
+ $optimized_size += $size_data['optimized_size'] ? $size_data['optimized_size'] : 0;
259
+ }
260
+ }
261
+ }
262
+ }
263
+ } else {
264
+
265
+ /**
266
+ * Filter the chunk size of the requests fetching the data.
267
+ * 15,000 seems to be a good balance between memory used, speed, and number of DB hits.
268
+ *
269
+ * @param int $limit The maximum number of elements per chunk.
270
+ */
271
+ $limit = apply_filters( 'imagify_count_saving_data_limit', 15000 );
272
+ $limit = absint( $limit );
273
+
274
+ $attachment_ids = $wpdb->get_col(
275
+ "SELECT post_id
276
+ FROM $wpdb->postmeta
277
+ WHERE meta_key = '_imagify_status'
278
+ AND meta_value = 'success'
279
+ ORDER BY CAST( post_id AS UNSIGNED )"
280
+ );
281
+ $wpdb->flush();
282
+
283
+ $attachment_ids = array_map( 'absint', $attachment_ids );
284
+ $attachment_ids = array_chunk( $attachment_ids, $limit );
285
 
286
+ while ( $attachment_ids ) {
287
+ $limit_ids = array_shift( $attachment_ids );
288
+ $limit_ids = implode( ',', $limit_ids );
289
 
290
+ $attachments = $wpdb->get_col( // WPCS: unprepared SQL ok.
291
+ "SELECT meta_value
292
+ FROM $wpdb->postmeta
293
+ WHERE post_id IN ( $limit_ids )
294
+ AND meta_key = '_imagify_data'"
295
+ );
296
+ $wpdb->flush();
297
 
298
+ unset( $limit_ids );
299
+
300
+ if ( ! $attachments ) {
301
+ // Uh?!
302
+ continue;
303
  }
304
+
305
+ $attachments = array_map( 'maybe_unserialize', $attachments );
306
+
307
+ foreach ( $attachments as $attachment_data ) {
308
+ if ( ! $attachment_data ) {
309
+ continue;
310
+ }
311
+
312
+ ++$count;
313
+ $original_data = $attachment_data['sizes']['full'];
314
+
315
+ // Increment the original sizes.
316
+ $original_size += $original_data['original_size'] ? $original_data['original_size'] : 0;
317
+ $optimized_size += $original_data['optimized_size'] ? $original_data['optimized_size'] : 0;
318
+
319
+ unset( $attachment_data['sizes']['full'], $original_data );
320
+
321
+ // Increment the thumbnails sizes.
322
+ foreach ( $attachment_data['sizes'] as $size_data ) {
323
+ if ( ! empty( $size_data['success'] ) ) {
324
+ $original_size += $size_data['original_size'] ? $size_data['original_size'] : 0;
325
+ $optimized_size += $size_data['optimized_size'] ? $size_data['optimized_size'] : 0;
326
+ }
327
+ }
328
+
329
+ unset( $size_data );
330
+ }
331
+
332
+ unset( $attachments, $attachment_data );
333
+ } // End while().
334
+ } // End if().
335
 
336
  $data = array(
337
  'count' => $count,
338
  'original_size' => $original_size,
339
  'optimized_size' => $optimized_size,
340
+ 'percent' => $original_size && $optimized_size ? ceil( ( ( $original_size - $optimized_size ) / $original_size ) * 100 ) : 0,
341
  );
342
 
343
  if ( ! empty( $key ) ) {
361
  function imagify_calculate_total_size_images_library() {
362
  global $wpdb;
363
 
364
+ $image_ids = $wpdb->get_results( "
365
  SELECT ID FROM $wpdb->posts
366
  WHERE ( post_mime_type LIKE 'image/%' )
367
  AND post_type = 'attachment' AND ( post_status = 'inherit' )
368
  LIMIT 250
369
  ", ARRAY_A );
370
 
371
+ $image_ids = wp_list_pluck( $image_ids, 'ID' );
372
 
373
+ if ( ! $image_ids ) {
374
  return 0;
375
  }
376
 
377
+ $partial_total_images = count( $image_ids );
378
  $total_images = imagify_count_attachments();
379
+ $total_size_images = imagify_calculate_total_image_size( $image_ids, $partial_total_images, $total_images );
380
 
381
  return $total_size_images;
382
  }
474
  * @since 1.6
475
  * @author Remy Perona
476
  *
477
+ * @param array $image_ids Array of image IDs.
478
  * @param int $partial_total_images The number of images we're doing the calculation with.
479
  * @param int $total_images The total number of images.
480
  * @return int The estimated total size of images.
481
  */
482
+ function imagify_calculate_total_image_size( $image_ids, $partial_total_images, $total_images ) {
483
  global $wpdb;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
484
 
485
+ $image_ids = array_filter( array_map( 'absint', $image_ids ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
486
 
487
+ if ( ! $image_ids ) {
488
+ return 0;
489
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
490
 
491
+ $results = imagify_get_wpdb_metas( array(
492
+ // Get attachments filename.
493
+ 'filenames' => '_wp_attached_file',
494
+ // Get attachments data.
495
+ 'data' => '_wp_attachment_metadata',
496
+ // Get Imagify data.
497
+ 'imagify_data' => '_imagify_data',
498
+ // Get attachments status.
499
+ 'statuses' => '_imagify_status',
500
+ ), $image_ids );
501
+
502
+ // Total unoptimized size.
503
+ $partial_size_images = 0;
504
+ // Total number of thumbnails.
505
+ $partial_total_intermediate_images = 0;
506
+
507
+ $is_active_for_network = imagify_is_active_for_network();
508
+ $disallowed_sizes = array_filter( (array) get_imagify_option( 'disallowed-sizes', array() ) );
509
+
510
+ foreach ( $image_ids as $i => $image_id ) {
511
+ $attachment_status = isset( $results['statuses'][ $image_id ] ) ? $results['statuses'][ $image_id ] : false;
512
+
513
+ if ( 'success' === $attachment_status ) {
514
+ $partial_size_images += isset( $results['imagify_data'][ $image_id ]['stats']['original_size'] ) ? $results['imagify_data'][ $image_id ]['stats']['original_size'] : 0;
515
+ $partial_total_intermediate_images += count( $results['imagify_data'][ $image_id ]['sizes'] );
516
+ unset( $image_ids[ $i ], $results['filenames'][ $image_id ], $results['data'][ $image_id ], $results['imagify_data'][ $image_id ], $results['statuses'][ $image_id ] );
517
  continue;
518
  }
519
 
520
+ // Create an array containing all this attachment files.
521
+ $files = array(
522
+ 'full' => get_imagify_attached_file( $results['filenames'][ $image_id ] ),
523
+ );
524
 
525
  /** This filter is documented in inc/functions/process.php. */
526
+ $files['full'] = apply_filters( 'imagify_file_path', $files['full'] );
 
527
 
528
+ $sizes = isset( $results['data'][ $image_id ]['sizes'] ) ? $results['data'][ $image_id ]['sizes'] : array();
 
 
529
 
530
+ if ( $sizes && is_array( $sizes ) ) {
531
+ $full_dirname = trailingslashit( dirname( $files['full'] ) );
532
+
533
+ if ( ! $is_active_for_network ) {
534
+ $sizes = array_intersect_key( $sizes, $disallowed_sizes );
535
  }
536
 
537
+ if ( $sizes ) {
538
+ foreach ( $sizes as $size_key => $size_data ) {
539
+ $files[ $size_key ] = $full_dirname . $size_data['file'];
540
+ }
541
+ }
542
+ }
543
 
544
+ /**
545
+ * Allow to provide all files size and the number of thumbnails.
546
+ *
547
+ * @since 1.6.7
548
+ * @author Grégory Viguier
549
+ *
550
+ * @param bool $size_and_count False by default.
551
+ * @param int $image_id The attachment ID.
552
+ * @param array $files An array of file paths with thumbnail sizes as keys.
553
+ * @param array $image_ids An array of all attachment IDs.
554
+ * @return bool|array False by default. Provide an array with the keys 'filesize' (containing the total filesize) and 'thumbnails' (containing the number of thumbnails).
555
+ */
556
+ $size_and_count = apply_filters( 'imagify_total_attachment_filesize', false, $image_id, $files, $image_ids );
557
+
558
+ if ( is_array( $size_and_count ) ) {
559
+ $partial_size_images += $size_and_count['filesize'];
560
+ $partial_total_intermediate_images += $size_and_count['thumbnails'];
561
+ } else {
562
+ foreach ( $files as $file ) {
563
+ if ( file_exists( $file ) ) {
564
+ $partial_size_images += filesize( $file );
565
+ }
566
  }
567
+
568
+ unset( $files['full'] );
569
+ $partial_total_intermediate_images += count( $files );
570
  }
571
+
572
+ unset( $image_ids[ $i ], $results['filenames'][ $image_id ], $results['data'][ $image_id ], $results['imagify_data'][ $image_id ], $results['statuses'][ $image_id ] );
573
+ } // End foreach().
574
 
575
  $intermediate_images_per_image = $partial_total_intermediate_images / $partial_total_images;
576
  $average_size_images = $partial_size_images / ( $partial_total_images + $partial_total_intermediate_images );
inc/functions/admin-ui.php CHANGED
File without changes
inc/functions/admin.php CHANGED
@@ -180,12 +180,14 @@ function imagify_notice_is_dismissed( $notice, $user_id = 0 ) {
180
  * We use this function to combine the result of 2 SQL queries.
181
  *
182
  * @since 1.4.5
 
183
  *
184
- * @param array $keys An array of keys.
185
- * @param array $values An array of arrays like array( 'id' => id, 'value' => value ).
186
- * @return array $result The combined arrays.
 
187
  */
188
- function imagify_query_results_combine( $keys, $values ) {
189
  if ( ! $keys || ! $values ) {
190
  return array();
191
  }
@@ -199,6 +201,11 @@ function imagify_query_results_combine( $keys, $values ) {
199
  }
200
  }
201
 
 
 
 
 
 
202
  return $result;
203
  }
204
 
@@ -214,7 +221,7 @@ function get_imagify_bulk_buffer_size() {
214
  $sizes = count( get_imagify_thumbnail_sizes() );
215
 
216
  switch ( true ) {
217
- case ( $sizes >= 10 ) :
218
  return 1;
219
 
220
  case ( $sizes >= 8 ) :
@@ -227,3 +234,53 @@ function get_imagify_bulk_buffer_size() {
227
  return 4;
228
  }
229
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
180
  * We use this function to combine the result of 2 SQL queries.
181
  *
182
  * @since 1.4.5
183
+ * @since 1.6.7 Added the $keep_keys_order parameter.
184
  *
185
+ * @param array $keys An array of keys.
186
+ * @param array $values An array of arrays like array( 'id' => id, 'value' => value ).
187
+ * @param int $keep_keys_order Set to true to return an array ordered like $keys instead of $values.
188
+ * @return array The combined arrays.
189
  */
190
+ function imagify_query_results_combine( $keys, $values, $keep_keys_order = false ) {
191
  if ( ! $keys || ! $values ) {
192
  return array();
193
  }
201
  }
202
  }
203
 
204
+ if ( $keep_keys_order ) {
205
+ $keys = array_intersect_key( $keys, $result );
206
+ return array_replace( $keys, $result );
207
+ }
208
+
209
  return $result;
210
  }
211
 
221
  $sizes = count( get_imagify_thumbnail_sizes() );
222
 
223
  switch ( true ) {
224
+ case ( $sizes >= 10 ) :
225
  return 1;
226
 
227
  case ( $sizes >= 8 ) :
234
  return 4;
235
  }
236
  }
237
+
238
+ /**
239
+ * A helper to retrieve all values from one or several post metas, given a list of post IDs.
240
+ * The $wpdb cache is flushed to save memory.
241
+ *
242
+ * @since 1.6.7
243
+ * @author Grégory Viguier
244
+ *
245
+ * @param array $metas An array of meta names like:
246
+ * array(
247
+ * 'key1' => 'meta_name_1',
248
+ * 'key2' => 'meta_name_2',
249
+ * 'key3' => 'meta_name_3',
250
+ * )
251
+ * If a key contains 'data', the results will be unserialized.
252
+ * @param array $ids An array of post IDs.
253
+ * @return array An array of arrays of results like:
254
+ * array(
255
+ * 'key1' => array( post_id_1 => 'result_1', post_id_2 => 'result_2', post_id_3 => 'result_3' ),
256
+ * 'key2' => array( post_id_1 => 'result_4', post_id_3 => 'result_5' ),
257
+ * 'key3' => array( post_id_1 => 'result_6', post_id_2 => 'result_7' ),
258
+ * )
259
+ */
260
+ function imagify_get_wpdb_metas( $metas, $ids ) {
261
+ if ( ! $ids ) {
262
+ return array_fill_keys( array_keys( $metas ), array() );
263
+ }
264
+
265
+ $sql_ids = implode( ',', $ids );
266
+
267
+ foreach ( $metas as $result_name => $meta_name ) {
268
+ $metas[ $result_name ] = $wpdb->get_results( // WPCS: unprepared SQL ok.
269
+ "SELECT pm.post_id as id, pm.meta_value as value
270
+ FROM $wpdb->postmeta as pm
271
+ WHERE pm.meta_key = '$meta_name'
272
+ AND pm.post_id IN ( $sql_ids )
273
+ ORDER BY pm.post_id DESC",
274
+ ARRAY_A
275
+ );
276
+
277
+ $wpdb->flush();
278
+ $metas[ $result_name ] = imagify_query_results_combine( $ids, $metas[ $result_name ], true );
279
+
280
+ if ( strpos( $result_name, 'data' ) !== false ) {
281
+ $metas[ $result_name ] = array_map( 'maybe_unserialize', $metas[ $result_name ] );
282
+ }
283
+ }
284
+
285
+ return $metas;
286
+ }
inc/functions/attachments.php CHANGED
@@ -21,23 +21,32 @@ function get_imagify_mime_type() {
21
  *
22
  * @since 1.0
23
  *
24
- * @param int $file_path The attachment path.
25
- * @return string The backup path.
26
  */
27
  function get_imagify_attachment_backup_path( $file_path ) {
28
- $upload_dir = wp_upload_dir();
29
- $upload_basedir = trailingslashit( $upload_dir['basedir'] );
30
- $backup_dir = $upload_basedir . 'backup/';
31
-
32
- /**
33
- * Filter the backup directory path.
34
- *
35
- * @since 1.0
36
- *
37
- * @param string $backup_dir The backup directory path.
38
- */
39
- $backup_dir = apply_filters( 'imagify_backup_directory', $backup_dir );
40
- $backup_dir = trailingslashit( $backup_dir );
 
 
 
 
 
 
 
 
 
41
 
42
  return str_replace( $upload_basedir, $backup_dir, $file_path );
43
  }
@@ -47,50 +56,57 @@ function get_imagify_attachment_backup_path( $file_path ) {
47
  *
48
  * @since 1.4.5
49
  *
50
- * @param int $filename The filename.
51
- * @return string|false The file path to where the attached file should be, false otherwise.
52
  */
53
- function get_imagify_attached_file( $filename ) {
54
- // If the file is relative, prepend upload dir.
55
- if ( $filename && 0 !== strpos( $filename, '/' ) && ! preg_match( '|^.:\\\|', $filename ) ) {
56
- $uploads = wp_upload_dir();
57
 
58
- if ( false === $uploads['error'] ) {
59
- return $uploads['basedir'] . "/$filename";
60
- }
61
  }
62
 
63
- return false;
 
 
 
 
 
 
64
  }
65
 
66
  /**
67
- * Retrieve the URL for an attachment based on filename.
68
  *
69
  * @since 1.4.5
70
  *
71
- * @param int $filename The filename.
72
- * @return string|bool Attachment URL, otherwise false.
73
  */
74
- function get_imagify_attachment_url( $filename ) {
75
- $uploads = wp_upload_dir();
 
76
 
77
- if ( false !== $uploads['error'] ) {
78
- return '';
79
  }
80
 
81
- // Check that the upload base exists in the file location.
82
- if ( 0 === strpos( $filename, $uploads['basedir'] ) ) {
 
 
83
  // Replace file location with url location.
84
- return str_replace( $uploads['basedir'], $uploads['baseurl'], $filename );
85
  }
86
 
87
- if ( false !== strpos( $filename, 'wp-content/uploads' ) ) {
88
  // Get the directory name relative to the basedir (back compat for pre-2.7 uploads).
89
- return trailingslashit( $uploads['baseurl'] . '/' . _wp_get_attachment_relative_path( $filename ) ) . basename( $filename );
90
  }
91
 
92
  // It's a newly-uploaded file, therefore $file is relative to the basedir.
93
- return $uploads['baseurl'] . "/$filename";
94
  }
95
 
96
  /**
@@ -134,3 +150,57 @@ function get_imagify_thumbnail_sizes() {
134
 
135
  return $sizes;
136
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
  *
22
  * @since 1.0
23
  *
24
+ * @param int $file_path The file path.
25
+ * @return string|bool The backup path. False on failure.
26
  */
27
  function get_imagify_attachment_backup_path( $file_path ) {
28
+ static $backup_dir;
29
+
30
+ $file_path = wp_normalize_path( (string) $file_path );
31
+ $upload_basedir = get_imagify_upload_basedir();
32
+
33
+ if ( ! $file_path || ! $upload_basedir ) {
34
+ return false;
35
+ }
36
+
37
+ if ( ! isset( $backup_dir ) ) {
38
+ $backup_dir = $upload_basedir . 'backup/';
39
+
40
+ /**
41
+ * Filter the backup directory path.
42
+ *
43
+ * @since 1.0
44
+ *
45
+ * @param string $backup_dir The backup directory path.
46
+ */
47
+ $backup_dir = apply_filters( 'imagify_backup_directory', $backup_dir );
48
+ $backup_dir = trailingslashit( wp_normalize_path( $backup_dir ) );
49
+ }
50
 
51
  return str_replace( $upload_basedir, $backup_dir, $file_path );
52
  }
56
  *
57
  * @since 1.4.5
58
  *
59
+ * @param int $file_path The file path.
60
+ * @return string|false The file path to where the attached file should be, false otherwise.
61
  */
62
+ function get_imagify_attached_file( $file_path ) {
63
+ $file_path = wp_normalize_path( (string) $file_path );
64
+ $upload_basedir = get_imagify_upload_basedir();
 
65
 
66
+ if ( ! $file_path || ! $upload_basedir ) {
67
+ return false;
 
68
  }
69
 
70
+ // The file path is absolute.
71
+ if ( strpos( $file_path, '/' ) === 0 || preg_match( '|^.:\\\|', $file_path ) ) {
72
+ return false;
73
+ }
74
+
75
+ // Prepend upload dir.
76
+ return $upload_basedir . $file_path;
77
  }
78
 
79
  /**
80
+ * Retrieve the URL for an attachment based on file path.
81
  *
82
  * @since 1.4.5
83
  *
84
+ * @param string $file_path A relative of absolute file path.
85
+ * @return string|bool File URL, otherwise false.
86
  */
87
+ function get_imagify_attachment_url( $file_path ) {
88
+ $file_path = wp_normalize_path( (string) $file_path );
89
+ $upload_basedir = get_imagify_upload_basedir();
90
 
91
+ if ( ! $file_path || ! $upload_basedir ) {
92
+ return false;
93
  }
94
 
95
+ $upload_baseurl = get_imagify_upload_baseurl();
96
+
97
+ // Check that the upload base exists in the (absolute) file location.
98
+ if ( 0 === strpos( $file_path, $upload_basedir ) ) {
99
  // Replace file location with url location.
100
+ return str_replace( $upload_basedir, $upload_baseurl, $file_path );
101
  }
102
 
103
+ if ( false !== strpos( '/' . $file_path, '/wp-content/uploads/' ) ) {
104
  // Get the directory name relative to the basedir (back compat for pre-2.7 uploads).
105
+ return trailingslashit( $upload_baseurl . _wp_get_attachment_relative_path( $file_path ) ) . basename( $file_path );
106
  }
107
 
108
  // It's a newly-uploaded file, therefore $file is relative to the basedir.
109
+ return $upload_baseurl . $file_path;
110
  }
111
 
112
  /**
150
 
151
  return $sizes;
152
  }
153
+
154
+ /**
155
+ * A simple helper to get the upload basedir.
156
+ *
157
+ * @since 1.6.7
158
+ * @author Grégory Viguier
159
+ *
160
+ * @return string|bool The path. False on failure.
161
+ */
162
+ function get_imagify_upload_basedir() {
163
+ static $upload_basedir;
164
+
165
+ if ( isset( $upload_basedir ) ) {
166
+ return $upload_basedir;
167
+ }
168
+
169
+ $uploads = wp_upload_dir();
170
+
171
+ if ( false !== $uploads['error'] ) {
172
+ $upload_basedir = false;
173
+ return $upload_basedir;
174
+ }
175
+
176
+ $upload_basedir = trailingslashit( wp_normalize_path( $uploads['basedir'] ) );
177
+
178
+ return $upload_basedir;
179
+ }
180
+
181
+ /**
182
+ * A simple helper to get the upload baseurl.
183
+ *
184
+ * @since 1.6.7
185
+ * @author Grégory Viguier
186
+ *
187
+ * @return string|bool The path. False on failure.
188
+ */
189
+ function get_imagify_upload_baseurl() {
190
+ static $upload_baseurl;
191
+
192
+ if ( isset( $upload_baseurl ) ) {
193
+ return $upload_baseurl;
194
+ }
195
+
196
+ $uploads = wp_upload_dir();
197
+
198
+ if ( false !== $uploads['error'] ) {
199
+ $upload_baseurl = false;
200
+ return $upload_baseurl;
201
+ }
202
+
203
+ $upload_baseurl = trailingslashit( $uploads['baseurl'] );
204
+
205
+ return $upload_baseurl;
206
+ }
inc/functions/deprecated.php CHANGED
@@ -183,3 +183,22 @@ class Imagify_Deprecated {
183
  return $this->http_call( $url, $args );
184
  }
185
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
183
  return $this->http_call( $url, $args );
184
  }
185
  }
186
+
187
+
188
+ if ( class_exists( 'WpeCommon' ) ) :
189
+
190
+ /**
191
+ * Change the limit for the number of posts: WP Engine limits SQL queries size to 2048 octets (16384 characters).
192
+ *
193
+ * @since 1.4.7
194
+ * @since 1.6.7 Deprecated.
195
+ * @author Jonathan Buttigieg
196
+ *
197
+ * @return int
198
+ */
199
+ function _imagify_wengine_unoptimized_attachment_limit() {
200
+ _deprecated_function( __FUNCTION__ . '()', '1.6.7', '_imagify_wpengine_unoptimized_attachment_limit()' );
201
+ return _imagify_wpengine_unoptimized_attachment_limit();
202
+ }
203
+
204
+ endif;
inc/functions/process.php CHANGED
@@ -89,7 +89,7 @@ function do_imagify( $file_path, $args = array() ) {
89
 
90
  // Send image for optimization and fetch the response.
91
  $response = upload_imagify_image( array(
92
- 'image' => curl_file_create( $file_path ),
93
  'data' => wp_json_encode( array(
94
  'aggressive' => ( 1 === (int) $args['optimization_level'] ),
95
  'ultra' => ( 2 === (int) $args['optimization_level'] ),
89
 
90
  // Send image for optimization and fetch the response.
91
  $response = upload_imagify_image( array(
92
+ 'image' => $file_path,
93
  'data' => wp_json_encode( array(
94
  'aggressive' => ( 1 === (int) $args['optimization_level'] ),
95
  'ultra' => ( 2 === (int) $args['optimization_level'] ),
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: wp_media, GregLone
3
  Tags: compress image, images, performance, optimization, photos, upload, resize, gif, png, jpg, reduce image size, retina
4
  Requires at least: 3.7.0
5
  Tested up to: 4.8.0
6
- Stable tag: 1.6.6
7
 
8
  Dramatically reduce image file sizes without losing quality, make your website load faster, boost your SEO and save money on your bandwidth.
9
 
@@ -136,6 +136,15 @@ When the plugin is disabled, your existing images remain optimized. Backups of t
136
  3. Media Page
137
 
138
  == Changelog ==
 
 
 
 
 
 
 
 
 
139
  = 1.6.6 =
140
  * New: Compatibility with the plugin WP Offload S3 Lite. Your images now will be sent to Amazon S3 after being optimized. Also works when you store your images only on S3, not locally.
141
  * Improvement: Added a filter to the asynchronous job arguments.
@@ -155,7 +164,7 @@ When the plugin is disabled, your existing images remain optimized. Backups of t
155
  * Improvement: The discount is now automatically applied in when you buy from the plugin and a promotion is active
156
 
157
  = 1.6.2 =
158
- * Bug Fix: Correctly display the modal when clicking on the plan suggestion button on bulk optimisation page
159
 
160
  = 1.6.1 =
161
  * Bug Fix: Better offer suggestion when your medias library is bigger than 3GB
3
  Tags: compress image, images, performance, optimization, photos, upload, resize, gif, png, jpg, reduce image size, retina
4
  Requires at least: 3.7.0
5
  Tested up to: 4.8.0
6
+ Stable tag: 1.6.7
7
 
8
  Dramatically reduce image file sizes without losing quality, make your website load faster, boost your SEO and save money on your bandwidth.
9
 
136
  3. Media Page
137
 
138
  == Changelog ==
139
+ = 1.6.7 =
140
+ * Improvement: Compatibility with the plugin WP Offload S3 Pro, and fixed a few things for both Lite and Pro versions.
141
+ * Improvement: Improved performance on the bulk optimization page for huge image libraries.
142
+ * Improvement: When performing a bulk optimization, moved the attachments with the "WELL DONE" message at the end of the queue, it helps to speed up things.
143
+ * Improvement: Use cURL directly only to optimize an image. It helps when cURL is not available: less things will break in that case.
144
+ * Bug Fix: Fixed a bug with the plugin Screets Live Chat, prior to version 2.2.8.
145
+ * Regression fix: Fixed the buffer size on the bulk optimization page.
146
+ * Dev stuff: Added a hook allowing to filter arguments when doing a request to our API. It can be used to increase the timeout value for example.
147
+
148
  = 1.6.6 =
149
  * New: Compatibility with the plugin WP Offload S3 Lite. Your images now will be sent to Amazon S3 after being optimized. Also works when you store your images only on S3, not locally.
150
  * Improvement: Added a filter to the asynchronous job arguments.
164
  * Improvement: The discount is now automatically applied in when you buy from the plugin and a promotion is active
165
 
166
  = 1.6.2 =
167
+ * Bug Fix: Correctly display the modal when clicking on the plan suggestion button on bulk optimization page
168
 
169
  = 1.6.1 =
170
  * Bug Fix: Better offer suggestion when your medias library is bigger than 3GB